メイン


PHP Archives

2005年12月 8日

2.0への挑戦。

2005年は「2.0」の年だったので(XX2.0とか)、今さらながら、2.0へ挑戦してみました。

とりあえず、Perl2.0、NetScape2.0、InternetExploler2.0、Vim2.0あたりを探してみたのですが、見つけることができません。まだ2.0はコモディティ化していないようです。

困っていると、某haltさんにPHP2.0を教えてもらったので、早速インストールしてみました。

インストールは解凍した直下にあるinstallというファイルを実行すると環境について聞かれるので、それに答えていくとsrcディレクトリにMakefileが作成されます。./configureなんてありません。


(%:~/src/php-2.0)- ./install

PHP/FI Installation

If you do not understand any of the following questions,
then the default should be safe - simply hit 'Return'.
(略)


とりあえず、cgiとしてmakeしてできるphp.cgiを引数なしで実行してみると、phpinfo()のような画面になります。
ま、途中でcore dumpしちゃったので、ちゃんと確認してませんが、なるはずです。

とりあえず、これで時代についていけたかなー?
2.0は難しいなぁと感じた年の瀬の現実逃避でした。


2005年12月12日

はてなブックマーク件数取得API PHP版サンプル

とりあえず。



<?php
require "XML/RPC.php";

$params = array(
            new
XML_RPC_Value('http://catbot.net/blog/2005/12/slickrun.html',
                              
'string')
            );
$msg = new XML_RPC_Message('bookmark.getCount', $params);
$cli = new XML_RPC_Client('/xmlrpc', 'b.hatena.ne.jp');
$resp = $cli->send($msg);
if (!
$resp) {
    echo
'Communication error: ' . $cli->errstr;
    exit;
}

if(!
$resp->faultCode()){
    
$val = $resp->value();
    
$data = XML_RPC_decode($val);
    
var_dump($data);
}else{
    
var_dump($resp->faultCode());
    
var_dump($resp->faultString());
}
?>



PEAR XML RPCのマニュアル通りです。
要望ですが、件数だけじゃなく、コメントを取得したいです。コメントをまとめて取得できれば、Blogのコメント機能をはてなブックマークにアウトソースしたりとか、ちょっと楽しげ。


2005年12月16日

Planet PHP Japanについて

PlanetとはRSSのアグリゲーションサービスです。
複数のBlogからRSSを取得し、まとめて、表示しています。性質上、過去ログはありません。

Blogの登録について自薦・他薦も歓迎いたします。苦情や削除依頼もお受けいたします。
いまのところ、ほとんどが勝手に登録させていただいてます。
このエントリーのコメント/トラックバックかshomas at gmail dot comまでお願いします。

1日4回クロールして、更新しています。

ぶっちゃけPythonで書かれてるものを設定して設置しただけです。サーバの関係上、文字コードが一部、うまく扱えていません。PHPユーザのみなさま、Pythonも触ってみてください。

S/N比が多少、高く低くてもいいと思ってます。元々はPlanet PHPがうらやましくて個人的に設置したものです。
MySQLの話題が混じったり、他の言語の話とかもうぇるかむだし、親近感も重要かなぁ?とか。


広告、張ったらおこられるかなぁ?
似たようなのが、できたら、張っちゃおうかなぁ?


2005年12月19日

PHP HacksとPHP Cracks

amazonでPHP Hacksを注文したんだけど、まだ来ない。。。発送予定日は12/5になってるのに。
phphks.s.gif
オライリーのサイトで目次を見ると楽しげなHackが並んでて期待大です。

そういえば、風の噂でPHP Cracksなる本も発売されるとか。
どうやったら入手できるんだろう?


2006年1月 5日

続 PHP HacksとPHP Cracks

奇しくも同日に手に入れました。
PHP Cracksは偶然、会社の人が持ってたのを譲ってもらいました。おもしろかったです。
PHP Hacksはこれから読みます。
75.jpg


2006年2月 4日

★☆Ethnaバトン★☆

寒いのでひきこもってます。
受け取ったというかEthnaバトンを拾ってみた。

Q1. Ethna を使い始めたきっかけは?
まだ使ってないです。初回リリースのころのコードを読んだだけ。

Q2. Ethna のどんなところが好き?
実践で役にたつ機能がそろっていること。構造がきれい。

Q3. Ethna を使って何を作りましたか?
いや、まだなにも。なんか作ろうかなぁ。

Q4. これから Ethna を使って作ってみたいものは?
Webメールアプリ(MUA)を0から作ってみたいです。

あと、
アソシエイトで儲かりまくるアサマシWeb。
儲かりまくるデイトレードボット。
的中しまくる競馬予想ソフト。
儲かりまくるあqwせdrftgyふじこ....(壊れた)

ま、MTの管理画面ラッパとかやってみるかも。

Q5. 今後 Ethna に望む機能は?
アプリテンプレートとか。
まじめにエンドユーザプログラミングとか目指してみるのも悪くないかも。
機能じゃないけど、もぞよしさんに会ってみたいなぁ。

Q6. 次にバトンをまわす 5 人は?
とりあえず、拾ってください -> Planet PHP Japanl経由で見てる人。

http://ethna.jp/


2006年2月16日

Services_Hatena - PHPの挑戦

Services_Hatena - PHPの挑戦というBlogを開設された方がいらっしゃるようなので、作りかけのはてなブックマーククラスを寄贈。
下の認証を組み込むとこで、迷って放置しちゃってたやつです。


<?php
require_once 'HTTP/Request.php';

class 
Services_Hatena_Login extends HTTP_Request{
    
// {{{ setWSSEAuth($user, $pass, $sha1 = false)
    
function setWSSEAuth($user$pass$sha1 false){
        if(
$sha1 == true){
            
$passhash base64_encode(sha1($pass));
        }else{
            
$passhash base64_encode($pass);
        }
        
$nonce sha1(time().rand().posix_getpid());
        
// ISO:8601
        
$date strftime("%Y-%m-%dT%H:%i:%mZ");
        
$wsse sprintf('UsernameToken Username="%s", PasswordDigest="%s", Nonce="%s", Created="%s"'
                    
$user$passhash$nonce$date);
        
$this->addHeader('X-WSSE',$wsse);
    }
    
// }}}
}

?>

"Services_Hatena - PHPの挑戦"というタイトルなので、個人的には、はてなツール群のPHP版クローンぐらいまで作ってほしいなぁ。
本家のPEARが難しくてもそのうちできるであろう、JPRSには是非、登録して欲しいです。
期待age。


2006年2月28日

symfony用のzsh補完関数を書いてみたよ

Ruby on Railsを超えるとまでいわれるフレームワークsymfonyの補完関数を書いてみたよ。
symfonyの使い方をまだよくわかってないんで、間違ってるかもしれないよ。
入手はここです。
http://catbot.net/src/_symfony

zshを使っている人は$fpathにこれを設置すれば、動くはず。


echo $fpath

で、確認してね。
symfonyの前にpearコマンドの補完関数を書いたほうが良さそうなことに気づいたよ。

追記
以下を参考にさせていただきました。
zsh補完関数の書き方


2006年5月21日

Ethnaでカイハツ

Ethnaでちょっとそれなりの規模のものを作ってるんですが、その所感。

アクションを指定する変数をデフォルトでPATH_INFOベースにして欲しい。
ManagerとViewのドキュメントがいまいち足りないような。ここが迷いどころかも。
いや、まだドキュメントは足りない。こういうSQLを発行したいとか、setAppNeとか迷った。
Ethna 0.2.0から2.x系へバージョンアップするときはコントラーラのファイル名とクラス名を書いた.ethnaファイルを置いておく。

定石とか定番のやり方みたいなのを公開して欲しい。
Ethnaベースの比較的規模の大きなアプリケーションのソースコードが閲覧できるといろいろ参考になるはず。

でも不満は少ないなぁ。あーしたい、こーしたいっていうのはちょっとがんばれば大抵、楽にできてしまいます。
本体に手を入れて自分仕様に直すってのは全然やってません。

いま作ってるやつはソースコードを公開するつもりなので、いいサンプルになるといいなぁ。でもまだリファクタリングしなきゃ。コメントももっと書かなきゃ。っていうか、機能の実装も終ってないんですけどね。


2006年5月23日

PEAR HTML_TagCloud Package Draft Proposal!

PerlのHTML::TagCloud::ExtendedのPHP版を作成し、PEARにProposalしてみました。(まだDraft。そしてまだ運用実績はありません。)

CPANにはExtendedじゃないのもあるのですが、Extendedのほうが時間経過を表現できたりして高機能です。

HTML::TagCloud::ExtendedがみごとなPerl OOしてたので、比較的容易に移植することができました。

ただホットタグ機能や設定用変数を渡すとこなど、いくつかの機能は移植しきれてません。
またtimestampの引数をはじめからUnixタイムスタンプにしたり、時間指定しなかった場合、latestとして扱うなど、いくつかの変更を加えています。

もうちょっとコードをきれいにして、コメント書いて、ドキュメント作って、Bugをとって、package.xmlをまとめて、PEARの色表現ルールにも対応して今月中にはPEPrフェーズに進みたいなぁ。package.xmlの書き方、わからん、とか思ってたら、渡りに船で上鍵さんが調査してるみたいだし。なんかいろいろ追い風が吹いているかんじです。

ソースコードはこちら
サンプルコードはこんな感じです。


<?php
// $Id:$

require_once '../TagCloud.php';

$tags =& new HTML_TagCloud();
$tags->addElement('PHP','http://www.php.net'39strtotime(20060315000000));
$tags->addElement('XML','http://www.xml.org'21strtotime(20060515000000));
$tags->addElement('Perl','http://www.xml.org'15strtotime(20060215000000));
$tags->addElement('PEAR','http://pear.php.net'32strtotime(20060415000000));
$tags->addElement('MySQL','http://www.mysql.com'10strtotime(20060501000000));
$tags->addElement('PostgreSQL','http://pgsql.com'6strtotime(20051201000000));

print 
$tags->buildALL();

?>


タイムスタンプを省略したり、まとめて配列をそのまま渡せるようにもしてみた。


<?php
// $Id:$

require_once '../TagCloud.php';

$tags =& new HTML_TagCloud();
$name 'a';
// set a item without timestamp
$tags->addElement($name'#'20);
foreach(
range(0,10) as $i){
    
$arr[$i]['name'] = $name;
    
$arr[$i]['url']  = '#';
    
$arr[$i]['count'] = $i;
    
$name++;
}
// set many item at once
$tags->addElements($arr);
$css $tags->buildCSS();
$taghtml $tags->buildHTML();
?>



いや,勢いって大事ですな。

HTML::TagCloud::ExtendedのAUTHORであるLyo Katoさんに感謝。
これを作る機会になった某プロジェクトに感謝。


2006年6月22日

PHPで素数判定

LL Ring の前哨戦として「キミならどう書く 2.0」の開催です! 今回は読者も参加しての大乱闘!! お題は「100までの整数から素数を列挙せよ」です 今年のLLのネタ「君ならどうかく?」で100までの素数判定のお題で募集中。

これでどう?


<?php
$num 
1;
while(
$num <= 100){
    
$num gmp_nextprime($num);
    print 
$num;
}
?>

どう?この手抜きっぷり。

GNU MP ライブラリの確率的素数判定を呼び出し。
100回もループするのメンドクセ。

コードを書くより、gmpエクステンションをインストールするほうが大変なのは内緒です。


っていうか、ハイライトの色で動かしてないことがバレバレじゃないか。


2006年7月 5日

ドリコムのWebアプリコンテストに応募しました

ドリコムさん主催のWebアプリケーションコンテストに応募しました。

アプリケーション
http://catbot.net/newsing/

レポジトリ
http://svn.labs.drecom.jp/aor/shoma/newsing/

正直、マネージャとかフィルタとかO/Rマッパとかviewとかをうまく使いこなせてません。
つーか、完成度40%ぐらいというか、けっこう笑えるBugがあります。

「ここはこうしたほうがベター」などのコメントをいただけると幸いです。

目新い機能はないんですが、見所っぽいところを強いてあげると...

以前、EthnaのMLで話題になったPATH_INFOベースでのアクション指定ですが、mod_rewiteを使ってやっています。
http://svn.labs.drecom.jp/aor/shoma/newsing/.htaccess

その他、簡単なものですがprototype.jsでAjax、
PEAR プロポーサル中(PHP5で書き直し中)の拙作タグクラウド、
Yahoo UIライブラリのgrid CSSを使ってみました、
フォント指定にメイリオって書いてみた、
ロリポップサーバで動作させている、
っていうあたりです。

ブックマーク型なので、GOES BYの人の真似をしてコンテストの応募作品をまとめてみました。

いまさら気づいたんですが、投票、クリックカウント、コメント等の機能があるので、こういうコンテストの審査に便利かも。


2006年8月 3日

PHPカンファレンス 2006

PHPカンファレンス 2006の開催が告知されています。
なんといっても今年はZeevが来る!
さらに2会場並行トラック、LT(ライトニングトーク)と新しい試みがあって、例年以上に盛り上がりそうです。
僕もLTでちょっとしゃべります。


2006年8月 9日

Proposal finished HTML::HTML_TagCloud!

PEARへproposeしていたHTML::HTML_TagCloudが無事にアクセプトされました。
正式にPEARのライブラリとしてリリースすることがほぼ確定しました。

投票結果としては初日に8票(うち日本から3票),トータルで9票(条件付き1票)。
5票以上でアクセプトなので,初めてにしてはかなり良好な結果かと。
最近の得票数の多かった新PEARパッケージには以下のものがあります。

PHP :: Shell 20, 2 conditional
PHP :: PHP_ParserGenerator 10, 0 conditional
PHP :: PHP_LexerGenerator 11, 0 conditional

PHP :: Shellはpythonの対話インタフェースやRubyのirbに相当する待望されていたPHPの機能強化というものなので,圧倒的です。
PHP_ParserGeneratorとPHP_LexerGeneratorはPEARの創始者によるもの。
0 conditionalで当然ですが、すごいなぁ。カリスマを感じます。

投票結果としては喜ぶべきものだったわけですが、次回は0 conditionalとか提案からリリースまでのスピードアップを目標にしたいなぁ。

残す作業はコーディングスタンダードに準するための修正とアップロードです。
明日、アカウントのフル権限をリクエストして来週前半ぐらいにリリースするつもりです。

応援していただいたみなさま、ありがとうございました。


# PHPカンファレンスのネタにする予定だったので間に合ってよかった。


2006年8月19日

PHPカンファレンス2006で話してきました

KIF_05182.jpg
個人的には夏の風物詩であるPHPカンファレンスが本日、開催でした。
今回、はじめてスピーカになりました。

話した内容と感想については別エントリであとでかく。

今日、お会いした人たちと別の場でもお世話になっていることにあらためて人の縁みたいなことを感じました。次に会うのが明日、今度の月曜日、水曜日、木曜、LL Ringのある土曜日はかなりたくさんだったりの予定とか。逆にあの時、お世話になった方、今回初めて会ったけど、苦労を引きついてもらった方、名前は以前から知っていたものの今回初めてお会いした方、1年前のPHPカンファレンスぶりの方、あの夫婦の子供(笑)、前回どこであったか思い出せない方とか、夜中の1時にうちの近所で飲んでるからって電話してくるミッシーとか、ほんとに色々。

もちろん、今回はWeb開発っていう軸があってPHPという言語がった上の出会いですが、僕の人生の中のいろんな場面の人と同じ場所であうことに不思議さを感じました。

実行委員会の各氏に改めて感謝です。ありがとうございます。

# 写真は会場から写した今日の空。 


2006年9月11日

Mastering Regular Expressions 3rd Edition

Mastering Regular Expressions (MASTERING)
フクロウ本の新しい版がでています。正規表現に関する良書。

PHP.netで知ったのですが、今回の改訂で48ページに渡ってPHPの章が追加されたとのこと。ちょっと欲しいかも。
著者の人はYahoo Incの中の人です。

僕の手元にあるのは日本語の2版ですが、ページも黒くなるほど参考にしたし、まだまだお世話になるので英語版の新しいのを買ってもいいかなぁ、と思ってます。


2006年10月 3日

というわけで、HTML_TagCloud0.1.1(beta)をリリースしました

諸事情で、モタモタしておりまして、遅くなりました。

betaスタータスのままリリースしているので、今後はテストとかドキュメントとかを同梱するのを目指したいと思います。あと若干の機能追加。


2006年10月13日

www.php.netって

Yahoo Incの提供でお送りしているんだ。
今日、気づいた。

United States United States
us2.php.net Hurricane Electric
us3.php.net VersaServers
www.php.net Yahoo! Inc.

2006年11月28日

PHPによるデザインパターン入門

PHPによるデザインパターン入門
下岡さん(Do You PHP?の中の人)のPHPデザインパターン入門を購入しました。
まだぜんぜん読んでませんが、パラパラめくってみた感じ、改めてPHP5がJavaに似てきたなぁ、と実感してます。
PHP5のデザパタ本は初めてかと思います。

結城さんのデザパタ入門をとかGoFとか(あたりまえか)をかなり参考にしていて良書の予感。


Design Patterns: Elements of Reusable Object-Oriented Software (Addison-Wesley Professional Computing Series)
Erich Gamma Richard Helm Ralph Johnson John Vlissides
Addison-Wesley Pub (Sd)
売り上げランキング: 18738

おすすめ度の平均: 5.0
5 デザインパターンを解説する本家本元

増補改訂版Java言語で学ぶデザインパターン入門
結城 浩
ソフトバンククリエイティブ
売り上げランキング: 6173
おすすめ度の平均: 4.5
5 良い本やと思います
5 最高のDP入門書
3 僭越ながら助言です

Head Firstデザインパターン―頭とからだで覚えるデザインパターンの基本
エリック フリーマン キャシー シエラ エリザベス フリーマン バート ベイツ Eric Freeman Kathy Sierra Elisabeth Freeman Bert Bates 佐藤 直生 木下 哲也
オライリージャパン
売り上げランキング: 23122
おすすめ度の平均: 5.0
5 きっかけが欲しい開発者にオススメ
5 安心と自信を得られます
5 初学者の見方

PHP]Architect's Guide to PHP Design Patterns
J. E. Sweat
Marco Tabini & Associates,
売り上げランキング: 24960

2006年12月 4日

HTML_TagCloudマニュアル追加

HTML_TagCloudパッケージにエンドユーザドキュメントを書いて、commitしました。

もう日本語のマニュアルにアクセスできます。

http://pear.php.net/manual/ja/package.html.html-tagcloud.intro.php



ドキュメントがあるとまるで立派なパッケージのようにみえます。

英語版のマニュアルも書いてますが、かなりおかしな英語になってます(汗)。Weiskeさんが直してくれるらしいので、完成度が低いままcommitしてます。



マニュアルの追加は、基本は翻訳作業と同じで、似たような規模のパッケージのHTML_Formを参考にしつつやりました。



参考

PHPの日本語マニュアル作業メモ wiki.poyo.jp/read/PHP/phpdoc


2007年3月29日

第22回PHP勉強会

ひさびさにPHP勉強会にいってきました。
お題は
  • CakePHPのモデル(ORマッパ)の話
  • HTML2PDFの話
  • PEAR::CodeGen_PECL
でした。
久々に行っていろいろいい刺激を受けました。
次回はなにか、話そうかな。

株式会社ノッキングオン焼き肉のうまいオサレな会社でした。会場提供ありがとうございます。

2007年6月 1日

re: PHPでメールアドレスかどうか調べる方法

はてブotsuneさんやkazuhookuさんがPHPクオリティについて勘違いしていたので、一言申し上げたところ、参考にされた方がいたようで、もうちょっと補足します。

いくつか実装での「正しいメールアドレス」を調べてみました。

phpspot

function is_mail($text) {
if (preg_match('/^[a-zA-Z0-9_\.\-]+?@[A-Za-z0-9_\.\-]+$/',$text)) {
return TRUE;
} else {
return FALSE;
}
}



PEAR::Mail_RFC822

    function isValidInetAddress($data, $strict = false)
{
$regex = $strict ? '/^([.0-9a-z_+-]+)@(([0-9a-z-]+¥.)+[0-9a-z]{2,})$/i' : '/^([*+!.&#$|¥'¥¥%¥/0-9a-z^_`{}=?‾:-]+)@(([0-9a-z-]+¥.)+[0-9a-z]{2,})$/i';
if (preg_match($regex, trim($data), $matches)) {
return array($matches[1], $matches[2]);
} else {
return false;
}
}


CakePHP

define('VALID_EMAIL', '/¥¥A(?:^([a-z0-9][a-z0-9_¥¥-¥¥.¥¥+]*)@([a-z0-9][a-z0-9¥¥.¥¥-]{0,63}¥¥.(com|org|net|biz|info|name|net|pro|aero|coop|museum|[a-z]{2,4}))$)¥¥z/i');

Ethna

    function checkMailAddress($mailaddress)
{
if (preg_match('/^([a-z0-9_]|\-|\.|\+)+@(([a-z0-9_]|\-)+\.)+[a-z]{2,6}$/i',
$mailaddress)) {
return true;
}
return false;

symfony

  public function execute(&$value, &$error)
{
$strict = $this->getParameterHolder()->get('strict');
if ($strict == true)
{
$re = '/^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i';
}
else
{
/* Cal Henderson: http://iamcal.com/publish/articles/php/parsing_email/pdf/
* The long regular expression below is made by the following code
* fragment:
*
* $qtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]';
* $dtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]';
* $atom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c'
* . '\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+';
* $quoted_pair = '\\x5c\\x00-\\x7f';
* $domain_literal = "\\x5b($dtext|$quoted_pair)*\\x5d";
* $quoted_string = "\\x22($qtext|$quoted_pair)*\\x22";
* $domain_ref = $atom;
* $sub_domain = "($domain_ref|$domain_literal)";
* $word = "($atom|$quoted_string)";
* $domain = "$sub_domain(\\x2e$sub_domain)*";
* $local_part = "$word(\\x2e$word)*";
* $addr_spec = "$local_part\\x40$domain";
*/

$re = '/^([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-'
.'\\x5d\\x7f-\\xff]+|\\x22([^\\x0d\\x22\\x5c\\x80-\\xff]|\\x5c\\x00-'
.'\\x7f)*\\x22)(\\x2e([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-'
.'\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+|\\x22([^\\x0d\\x22\\x5c\\x80'
.'-\\xff]|\\x5c\\x00-\\x7f)*\\x22))*\\x40([^\\x00-\\x20\\x22\\x28\\x29'
.'\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+|\\x5b([^'
.'\\x0d\\x5b-\\x5d\\x80-\\xff]|\\x5c\\x00-\\x7f)*\\x5d)(\\x2e([^\\x00-'
.'\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-'
.'\\xff]+|\\x5b([^\\x0d\\x5b-\\x5d\\x80-\\xff]|\\x5c\\x00-\\x7f)*'
.'\\x5d))*$/'
;
}

if (!preg_match($re, $value))
{
$error = $this->getParameterHolder()->get('email_error');
return false;
}

$checkDomain = $this->getParameterHolder()->get('check_domain');
if ($checkDomain && function_exists('checkdnsrr'))
{
$tokens = explode('@', $value);
if (!checkdnsrr($tokens[1], 'MX') && !checkdnsrr($tokens[1], 'A'))
{
$error = $this->getParameterHolder()->get('email_error');

return false;
}
}

return true;
}

結論。DNS引いてドメインの有効性チェックまでやるsymfonyはヤリ過ぎ。EthnaかPEAR、symfonyのstrictでないものが現実的な線かと思います。CakePHPはpresident@usa.govがNGになる。NGではありませんでした。ごめんよ、ジョージ。君のメールアドレスもラスベガス産のフレームワークは変な書き方だけど受け入れてくれるよ。

2008年12月28日

Planet PHP Japan(http://catbot.sakura.ne.jp/planetphpjapan/) 終了のお知らせ

2005年12月からやっていたPlanet PHP Japanですが、借りてるサーバの契約を終了するのに伴って、年内ぐらいで終了することとします。
長らくのご愛顧ありがとうございました。

今後はPHPユーザ会のPlanet PHP Japanをご利用ください。

ref. Planet PHP Japanについて (ハズレ日記)













Powered by
Movable Type 4.25