2007年05月
阿藤快だ!
ランチ後渋谷の町を歩いていたら、阿藤快が!阿藤快だ!阿藤快だ!・・・なんで俺はこんなに盛り上がってるんだろう・・・
でも彼の出てる時の「ぶらり途中下車の旅」は大好きです。
WebService::Gnavi 0.011
ぐるなびWebサービス、さっそくモジュール化しました。先ほどうp。こんな事できちゃいます:
use strict;
use WebService::Gnavi;
use YAML;
my $gnavi = WebService::Gnavi->new(access_key => ...);
my $res = $gnavi->search({
category_l => 'CTG200', # 洋食
pref => 'PREF13', # 東京
});
print Dump $res->list;
これで東京の洋食が検索できます。検索結果に付随するカテゴリーのパースが面倒くさくてとりあえず後回しにしちゃった。誰かやってくれるなら大歓迎
ぐるなびWebサービス登録フォームがヘタレな件に関して
「有限会社」って入れると文字化けする。
Echo Server
http://d.hatena.ne.jp/tokuhirom/20070509/1178672405
AddOtherFdsじゃなくても、
Danga::Socket->AddOtherFds(
fileno($ssock) => sub {
....
}
);
Danga::Socket::Callbackをここでも使い回すという手もあります。
Danga::Socket::Callback->new(
handle => $ssock,
on_read_ready => sub {
...
}
);
まぁどっちでもいいんですが、なんか細かい差とかありそうで怖いなぁw (そこまでちゃんとDanga::Socketを使いこなしてません)
Catalystベースのアプリケーションのlib構成
"MyApp"というアプリケーションを作りたい場合、Catalystのドキュメントにもそう書いてあるから皆ついついこう始める:
catalyst.pl MyApp
libディレクトリ内で作成されるモジュール類はこんな感じ:
lib/MyApp.pm
lib/MyApp/Controller/Root.pm
lib/MyApp/Model
lib/MyApp/View
でもいくらWebアプリといってもバッチが走ったり、他のシステムとWeb以外のところで結合したりしてほぼ100% Webだけでは完結しない。そういう時にlib/MyApp直下にWeb用のモジュールを入れてしまうと段々おかしくなってきます。
例えばWebから入ってきたなんらかしらのデータをvalidateするコードを入れたいとして、lib/MyApp/Validate.pmに入れるとこれはWeb用なのかそれ以外用なのかがわからない。かといって例えばDBIx::Class経由でデータベースを使うプロジェクトの場合、Webコンポーネント以外のスクリプト等も当然のごとく同じデータベースコードを使うのでそういうのは共通の場所に置いておきたい。
こういう事を踏まえて、Catalystのコンポーネントは最初からMyApp::Webに格納するのが後々便利。
catalyst.pl MyApp::Web
こうするとMyApp::Webの名前空間以下にCatalystコンポーネントが作られる
lib/MyApp/Web.pm
lib/MyApp/Web/Controller/Root.pm
lib/MyApp/Web/Model
lib/MyApp/Web/View
これで共通コンポーネントであるBIx::Classスキーマを足す場合は
lib/MyApp/Schema.pm
に置けるし、先ほどのWeb専用のValidate.pmを置くのであれば
lib/MyApp/Web/Validate.pm
とできる。さらに、CLIインターフェースがあるようなアプリの場合は
lib/MyApp/CLI/Validate.pm
ともできるので便利便利。
# と、偉そうに書いているが、某プロジェクトでは今朝ようやくこう変えた。
Web::Scraper::Config 0.01
また勢いだけで・・・
手が、手が。
手が痛い。酷使してるからか。昨日今日と微妙に握力がないので今日は早めに8時くらいには帰宅。帰りにスーパーに寄ったら豚ロースが半額ですよ、奥さん。嬉しくてついついいっぱい買って、味噌漬けにしておいた。ニンニクと鷹の爪を一杯いれておいたぜ。むふふ。
Gungho 0.07 Released
本日5回目のアップロード。Danga::Socket:Callbackを使ってDanga::Socketエンジンにも非同期DNSを足したのでそこまでをリリース。
Danga::Socket::Calback 0.01
勢いで書いてCPANうp。Gunghoで使う予定。
Gungho With Asychronous DNS Lookups
って事でrev86で非同期DNSを足した。やっぱり他のエンジンを二つばかり作ってた今の時点でやってよかった。大分簡単かつキレイにできたと思う。
追記:rev87でIO::Asyncエンジンも非同期DNS追加。Danga::Socketは面倒くさいので後回し。Danga::Socket::Callback作ろうかなぁ・・・
GunghoのDNS
はてブで言及されてたので。非同期DNSは(特にPOEに於いては)すでに何回か書いているので実はやり方は簡単なんだけど、なんで今までやってなかったかというと、コードがこんがらがるから。ステートダイアグラムにすると一回ループが入る事が分かるとおもう:
1. Send Request
2. Check DNS
2.1 If DNS resolution required, go to 3
2.2 else, go to 4
3. Resolve DNS
3.1 if DNS resolved, go back to 1
3.2 if DNS resolution failed, go to error
4. Send request through socket...
....
で、Gunghoはまず仕組みをキレイに作りたかったのでこの辺りはとりあえずpuntしておいたわけです。でもそろそろ作ってもいいかなぁ。
縞ホッケ。
しじみ汁が飲みたくてチャリで魚力まで行ったのに、10日まで休みだとー。しょうがないのでとってかえして八角へ。今日は縞ホッケ。魚はうまいのは当たり前だが、ここは副菜がとても充実していてよい。魚力ももちろんうまいんだけど、あそこの副菜はいつも一緒だからな。まぁそういうところで使い分けてます。両店とも大好きだ。
Gungho::Engine::IO::Async
Gungho 0.06でIO::Asyncベースのエンジンを足したみました。Danga::Socketより幾分かインターフェースはましかなぁ・・・でもところどころまだ疑問点があるモジュールかも。とりあえず動くよ!
一点ちょっと注意:
cpan[1]> install IO::Async
ではインストールされない。パッケージにAsync.podしか存在しないのでCPANにインデックスされてないから。あとchildmanager-spawn.tがこけてた。とりあえず強制インストールしたけど。
Gungho
Wikiをちょっと書いた。
http://code.google.com/p/gungho-crawler/wiki/Index
あとはHandlerでシンプルなFileWriter::Simpleってのを書いた。これはほとんどデモ用。
Data::Visitor::Encode 0.08 Released
z2h()とh2z()を実装した。
Kayuda - なんだこれは?
中林大樹は・・・
「くりぃむナントカ」を見てたらナントカ・ホーテに伊東美咲と今度「めぞん一刻」で五代君を演じる中林大樹が出演してた。
この人・・・物知らないなぁ・・・めぞん一刻、大丈夫なのかなぁ・・・
Google codeでsvk diffできない。
daisuke@beefcake Gungho$ svk diff -r 71
Unknown target: gungho.
daisuke@beefcake Gungho$
あ、あれ・・・。svnだと大丈夫。
Text::CSV_XS!
http://search.cpan.org/src/HMBRAND/Text-CSV_XS-0.25/ChangeLog
6年ぶりのリリースw UNAUTHORIZED RELEASEって書いてあるけど、これは大丈夫だな。