Genesis Lightning Talks #13 に行って…

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

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

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

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

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

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

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

簡易クラスローダ

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

大まかにはZend FrameworkのZend_Loaderを参考にしていますが、基本的に1から書き直していています。
<?php
/**
* 簡易クラスローダ
* for PHP4
*
* @author anon &lt;anon@anoncom.net&gt;
*/
class ClassLoader
{
function ClassLoader() {}

/**
* 指定されたクラスを読み込み、インスタンスを返します。
*
* @param string $class クラス名
* @param string|NULL クラスディレクトリ
* @param boolean $once requireでファイルを読み込む際に、require_onceで読み込むか否か
* @param array|NULL $param インスタンス生成時に引き渡す引数
* @param string|NULL $loaderMethod インスタンス生成時に呼び出される、コンストラクタ以外のメソッド名(Singletonパターンでの呼び出しの場合など)
*/
function loadClass($class, $dir = NULL, $once = TRUE, $params = NULL, $loaderMethod = NULL)
{
if(is_null($dir)){
$dirs = explode(':', ini_get('include_path'));
$classfile_exists = false;
foreach($dirs as $dir){
$filepath = $dir . '/' . $class . '.php';
if(Froute_Loader::isFileAvailable($filepath)){
$classfile_exists = true;
break;
}

}
if(!$classfile_exists){
trigger_error('could not load class, causes class file"' . $class . '" is not found.', E_USER_WARNING);
}
}else{
$filepath = $dir . '/' . $class . '.php';
if(!ClassLoader::isFileAvailable($filepath)){
trigger_error('could not load class, causes class file "' . $filepath . '" is not found.', E_USER_ERROR);
}
}

if($once){
require_once $filepath;
}else{
require $filepath;
}

if(!class_exists($class)){
trigger_error('could not load class, causes undefined class name "' . $class . '".', E_USER_ERROR);
}

if(!is_null($loaderMethod)){
if(!method_exists($loaderMethod)){
trigger_error('could not load class, causes undefined function name "' . $class . '".', E_USER_ERROR);
}
if(is_null($params)){
$instance = call_user_func(array($class, $loaderMethod));
}else{
$instance = call_user_func(array($class, $loaderMethod), $params);
}
}else{
/*
if(!function_exists($class)){
trigger_error('could not load class, \'causes undefined function name "' . $class . '".', E_USER_ERROR);
}
*/
if(is_null($params)){
$instance = new $class;
}else{
$instance = new call_user_func($class, $params);
}
}
return $instance;
}

/**
* ファイルが存在するか確認します
*
* @param string $filename
* @return bool
*/
function isFileAvailable($filename)
{
if(file_exists($filename) &amp;&amp; is_readable($filename)){
return true;
}else{
return false;
}
}
}



使い方は以下の通り

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

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

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

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



使い方は以下の通り

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

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

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

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

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




実行結果

$ php -q test.php

SIMPLE STRING PATTERN MATCHING TEST
***********************************
mfsmax.docomo.ne.jp
startsWith: false
endsWith: true
matchesIn: true
-----------------------
lsean.ezweb.ne.jp
startsWith: false
endsWith: true
matchesIn: true
-----------------------
mx.softbank.ne.jp
startsWith: false
endsWith: true
matchesIn: true
-----------------------
mail.disney.ne.jp
startsWith: false
endsWith: true
matchesIn: true
-----------------------
mx.mailsv.softbank.jp
startsWith: false
endsWith: false
matchesIn: false
-----------------------
mail2.pdx.ne.jp
startsWith: false
endsWith: true
matchesIn: true
-----------------------
mailmlb.emnet.ne.jp
startsWith: false
endsWith: true
matchesIn: true
-----------------------
ne.jp
startsWith: false
endsWith: false
matchesIn: false
-----------------------
.ne.jp
startsWith: true
endsWith: true
matchesIn: true
-----------------------
ne.jp.ne.jp
startsWith: false
endsWith: true
matchesIn: true
-----------------------
foo.ne.jp.bar.net
startsWith: false
endsWith: false
matchesIn: true
-----------------------

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

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

最近作ったアプリの話

先日、コナミ社の提供している コナステ のダウンロードコンテンツゲームを1クリックで起動できるアプリを作り、公開した。 Ks Game Launcher  ( Github ) 作った理由として、インストール時に作成されたショートカットをクリックするとブラウザが起動し、ログインし...