Archive for 2月, 2009

Genesis Lightning Talks #13 に行って…

木曜日, 2月 26th, 2009

Genesis Lightning Talks #13 (通称GLT)に行ってきました。
…と、本当は書きたかったのだけれど、諸事情により懇親会のみの参加となってしまった。
初参加にして懇親会だけとか何様よ…。
さらにその懇親会にすら遅刻してしまいましたが。。。

と、今回思うように参加できなかったのですが、懇親会だけでも色んな人とお話しできて良かったなぁと思ってます。
デブサミ以降、あちこちのこうしたイベントには積極的に参加していきたいなと言う意識は、以前に比べて格段に増えたなぁ。
今までの自分は色んな意味で引きこもってたけど、やっぱりこういうイベントや勉強会、交流への参加って大事だなと改めて感じてます。
(といってもデブサミからはまだ日は全然経ってないけど。)

やっぱり職種が同じにしろ違うにしろ、普段の自分の環境とは違う人たちと話しをしたり、情報を交換し合うってすごく大事だし、むしろ楽しいなと思ってくるようになった。
会社や家に引きこもってても、得られる情報はせいぜいネットか書籍だけ。でもそれ以外の場所から様々な情報を仕入れたり、また話の流れで話題が広がって元の話題からはちょっとずれた話をし合うのもなかなか良い。

こうして外の人と触れ合っていくと、自然と自分の中にあるものが刺激されて、自分ももっと情報を出していこうと思うようになる。

と、言うのはたやすいが、普段の自分は高確率で聞き手側でしかないので、もっと自分から情報を出して話していけるようにはなりたい。
そこが今後の課題。
その代わり…にはならないけど、最近になってようやくこのブログを活用したりして、外に情報を出すようにしているつもりではある。

今はまだうまくできないけど、本当に、社内とかの狭い範囲の中ではなく、多くの人に向けて、いつかは何らかの形でスピーカーとして人の前で何かを発表できるような形にしていきたい。これは本当に。自己成長のためにも。

…とまぁ、タイトルからは全く関係ないネタになってしまったけれど、来月こそは最初から参加できるようにしたい。出来ることなら最初は聴講者からスタートでw

簡易クラスローダ

月曜日, 2月 23rd, 2009

車輪の再発明になっている可能性な気がしますが、PHP4で動作する、動的な簡易クラスローダを作成してみました。

大まかにはZend FrameworkのZend_Loaderを参考にしていますが、基本的に1から書き直していています。

PHP:
  1. <?php
  2. /**
  3. * 簡易クラスローダ
  4. * for PHP4
  5. *
  6. * @author anon <anon@anoncom.net>
  7. */
  8. class ClassLoader
  9. {
  10.     function ClassLoader() {}
  11.    
  12.     /**
  13.      * 指定されたクラスを読み込み、インスタンスを返します。
  14.      *
  15.      * @param string $class クラス名
  16.      * @param string|NULL クラスディレクトリ
  17.      * @param boolean $once requireでファイルを読み込む際に、require_onceで読み込むか否か
  18.      * @param array|NULL $param インスタンス生成時に引き渡す引数
  19.      * @param string|NULL $loaderMethod インスタンス生成時に呼び出される、コンストラクタ以外のメソッド名(Singletonパターンでの呼び出しの場合など)
  20.      */
  21.     function loadClass($class, $dir = NULL, $once = TRUE, $params = NULL, $loaderMethod = NULL)
  22.     {
  23.         if(is_null($dir)){
  24.             $dirs = explode(':', ini_get('include_path'));
  25.             $classfile_exists = false;
  26.             foreach($dirs as $dir){
  27.                 $filepath = $dir . '/' . $class . '.php';
  28.                 if(Froute_Loader::isFileAvailable($filepath)){
  29.                     $classfile_exists = true;
  30.                     break;
  31.                 }
  32.            
  33.             }
  34.             if(!$classfile_exists){
  35.                 trigger_error('could not load class, causes class file"' . $class . '" is not found.', E_USER_WARNING);
  36.             }
  37.         }else{
  38.             $filepath = $dir . '/' . $class . '.php';
  39.             if(!ClassLoader::isFileAvailable($filepath)){
  40.                 trigger_error('could not load class, causes class file "' . $filepath . '" is not found.', E_USER_ERROR);
  41.             }
  42.         }
  43.        
  44.         if($once){
  45.             require_once $filepath;
  46.         }else{
  47.             require $filepath;
  48.         }
  49.        
  50.         if(!class_exists($class)){
  51.             trigger_error('could not load class, causes undefined class name "' . $class . '".', E_USER_ERROR);
  52.         }
  53.        
  54.         if(!is_null($loaderMethod)){
  55.             if(!method_exists($loaderMethod)){
  56.                 trigger_error('could not load class, causes undefined function name "' . $class . '".', E_USER_ERROR);
  57.             }
  58.             if(is_null($params)){
  59.                 $instance = call_user_func(array($class, $loaderMethod));
  60.             }else{
  61.                 $instance = call_user_func(array($class, $loaderMethod), $params);
  62.             }
  63.         }else{
  64.             /*
  65.             if(!function_exists($class)){
  66.                 trigger_error('could not load class, \'causes undefined function name "' . $class . '".', E_USER_ERROR);
  67.             }
  68.             */
  69.             if(is_null($params)){
  70.                 $instance = new $class;
  71.             }else{
  72.                 //$instance = new call_user_func($class, $params);  // to use php5
  73.                 $instance = new $class($params);    // to use php4
  74.             }
  75.         }
  76.         return $instance;
  77.     }
  78.    
  79.     /**
  80.      * ファイルが存在するか確認します
  81.      *
  82.      * @param string $filename
  83.      * @return bool
  84.      */
  85.     function isFileAvailable($filename)
  86.     {
  87.         if(file_exists($filename) && is_readable($filename)){
  88.             return true;
  89.         }else{
  90.             return false;
  91.         }
  92.     }
  93. }



使い方は以下の通り
(続きを読む...)

接続先のサーバが応答するか判別する

日曜日, 2月 22nd, 2009

PHPのプログラム中で、別のサーバに接続する際、タイムアウトを適切に設定していない場合や、データ取得時にタイムアウトを設定できない場合もあるかと思います。そんなときに、まず先に接続先が生存しているかを確認しておくと、エラー処理の判定もしやすくなると思います。

そこで、接続を開始する前に事前に接続先のサーバに接続を試行してみます。

※PHP5.0以前の環境ではこのまま実行すると、throwの部分で構文エラーになる可能性があります。その場合はバージョン判定部分とthrow new Exceptionの部分を取り除いてください。


PHP:
  1. /**
  2. * $hostname が接続先として接続応答出来る状態かを確認します。
  3. *
  4. * @access public static
  5. * @param string $hostname 接続先ホスト名またはIP
  6. * @param int $port 接続先ポート番号
  7. * @param int $timeout タイムアウトを指定する(秒)
  8. * @return boolean
  9. */
  10. function isAliveHost($hostname, $port = 80, $timeout = 5)
  11. {
  12.     if(empty($hostname)){
  13.         if(version_compare(PHP_VERSION, '5.0.0', '<')){
  14.             trigger_error('Hostname is empty.', E_USER_ERROR);
  15.         }else{
  16.             throw new Exception('Hostname is empty.');
  17.         }
  18.     }
  19.    
  20.     // port番号指定がint型以外、あるいはintの範囲外である場合はfalseを返します。
  21.     if(!is_int($port)){
  22.         if(version_compare(PHP_VERSION, '5.0.0', '<')){
  23.             trigger_error('Invalid port number: ' . $port, E_USER_ERROR);
  24.         }else{
  25.             throw new Exception('Invalid port number: ' . $port);
  26.         }
  27.     }
  28.    
  29.     // port番号が65535を超える場合は、不正な値とみなし、falseを返します。
  30.     if($port <0 || $port> 65535){
  31.         if(version_compare(PHP_VERSION, '5.0.0', '<')){
  32.             trigger_error('Invalid range of port number: ' . $port, E_USER_ERROR);    // for PHP4
  33.         }else{
  34.             throw new Exception('Invalid range of port number: ' . $port);
  35.         }
  36.     }
  37.    
  38.     $fp = fsockopen($hostname, $port, $errno, $errmsg, $timeout);
  39.     if(!$fp){
  40.         error_log('could not connect to ' . $hostname . ':' . $port . ', ' . $errmsg);
  41.         return false;
  42.     }
  43.     fclose($fp);
  44.    
  45.     return true;
  46.    
  47. }



使い方は以下の通り

(続きを読む...)

PHPでの簡易文字列の一致の判定

金曜日, 2月 20th, 2009

PHPで、ある文字列の中に、特定の文字列が含まれているかを判定する際、完全一致なら、比較演算子 === で比較すればすぐですが、それ以外となると通常の比較演算では処理できないので、ereg()関数やpreg()関数などで処理することも多いと思います。

ただ、前方一致や後方一致、部分一致を行いたい場合は、それだけに正規表現を使うのもなんだかコストが高い。もっとシンプルに実装できないものか・・・。

例えば、JavaやC#でいうところのStringクラスのstartsWith()やendsWith()のようなことが出来れば・・・

という訳で、PHPで前方一致、後方一致、部分一致の比較を簡単に行う関数を作ってみました。



PHP:
  1. /**
  2. * 前方一致
  3. * $haystackが$needleから始まるか判定します。
  4. * @param string $haystack
  5. * @param string $needle
  6. * @return boolean
  7. */
  8. function startsWith($haystack, $needle){
  9.     return strpos($haystack, $needle, 0) === 0;
  10. }
  11.  
  12. /**
  13. * 後方一致
  14. * $haystackが$needleで終わるか判定します。
  15. * @param string $haystack
  16. * @param string $needle
  17. * @return boolean
  18. */
  19. function endsWith($haystack, $needle){
  20.     $length = (strlen($haystack) - strlen($needle));
  21.     // 文字列長が足りていない場合はFALSEを返します。
  22.     if($length <0) return FALSE;
  23.     return strpos($haystack, $needle, $length) !== FALSE;
  24. }
  25.  
  26. /**
  27. * 部分一致
  28. * $haystackの中に$needleが含まれているか判定します。
  29. * @param string $haystack
  30. * @param string $needle
  31. * @return boolean
  32. */
  33. function matchesIn($haystack, $needle){
  34.     return strpos($haystack, $needle) !== FALSE;
  35. }



上記コードの検証結果は以下を参照

(続きを読む...)

Developers Summit 2009 (デブサミ)に行ってきた

土曜日, 2月 14th, 2009

今日Developers Summit 2009に行ってきたので、自分が見聞きしてきた講演での内容を、簡単にまとめみる。


モダンPerlプログラミング

Perlは主にウェブ系のプログラミング言語とか簡単なバッチ処理系のときに使う言語というイメージがあるけど、実はテストツールとしても十分優れているし、テストに使える道具は一通りそろってるから便利なんだよというお話。

[テストフレームワークが言語として実装されている]
Makefile.PL makeでテストする際のテスト方法を定義。
make makeコマンドでMakefile.PLに基づくテスト実行準備をする
make test テストの実行

[TAP(Test Anything Protcol)]
→テキストベースのテストプロトコル
→テキストベースなのでPerlに限らず、多言語で対応している。

[Webアプリのテスト]
Apache::Testを使うと便利!
→テスト環境で、Apacheの設定ファイルを変更したいなどとき、他の人がテストを行っていると、それが終わるまで待たなければならない。
→Apache::Testを使うと、Apacheの起動~テスト実行~Apacheの停止までを自動で行ってくれる。
→他の人がテストを行っていたとしても、それぞれ毎にApacheを立ち上げるため、設定ファイルも実行されるポートも全て個別に自動で割り当てて行われる。そのため複数人開発の環境でテストしていてもそれぞれバッティングすることはない。


ひよこクラブ ver.Engineer

主に講演者の経験による学習方法と情報の共有について。
Java、JavaScript、PHP、PerlのそれぞれのWeb系言語を得意とする人たちが、
それぞれの日々の学び方について紹介してくれていました。

4人が共通して言っていたことは、INPUTとOUTPUTをやっていこうということ。
分からないことはググるなり本なり調べるというのも大事だけど、やったことを、自分がいま探してきたインターネットの海へ投げ込んでみるのも良いよということ。
ブログなり掲示板なりWebページでも何でも良いけど、やったこと(覚えたこと)について書いてみる。
それが中途半端な状態であっても分からなくても良い。間違っていても構わないし恥ずかしくもない。
これが後にあとから検索して読んだ人の役にも立つし、自分の履歴にも成果にもなるということ。
あと、にぽたん曰く「ググって情報が出てこない!ならば俺がその情報を出るようにしてやる」ということ。

今回発表した人たちも「output」を実践してきた人たちで、それによって今回このような形で大勢の前で発表しているのだということ。
みんなも間違いも正解も、失敗を恐れず「知」を共有していけば、こうやって発表したりする機会があるかもということ。
むしろ、新しい人たちがこうやってどんどん発表しあって、どんどん技術コミュニティを発展させていけたら良いよね!ということ。

ブログ持ってる割には、今まで書くことすら面倒臭がって書く回数もかなり少なかったけど、もうちょい活用していってみようかなと改めて思った。
なので、これからさっそく実践していこう。

Get Adobe Flash playerPlugin by wpburn.com wordpress themes