2006年6月アーカイブ

ほへと数秘占術



ぴょん子のところでみたので。結果は・・・ほ、ほう・・・


1977年 7月 13日生まれのあなた
 生まれてこのかた10579日目です
今日は 良い事がありますように。
  
今年の誕生日はまだですね、あと13日 前回の誕生日から352日目です。
 年齢28歳は ドタバタは去り、安定した時期ですが、今までを振り返り反省分析し、来年度の計画をしっかりして下さい。 
 ・基本性格
こだわる性格を持ち、物事は狭く深くである。
頑固な職人気質であり、妥協や安易な考えは嫌う。
ものの価値観を決めつけずに柔軟に対応すること。

・人間関係
真面目でやさしい。
人見知りしますが馴れればグループで必要な人。
自信家で頑固、間違っていると思っても他人の話に耳を傾けて下さい。
異文化の人とコミュニケーションをとって煮詰まった考えを捨てて下さい。

・生活
肩こりや自律神経失調症に注意
身体を動かして、頭と身体のバランスを

・金運
妥協無し完全主義の性格はそれなりの支出が必要です。
しかも他人から理解されない所にコストをかけます。
職人気質の仕事が吉。


BSが来た



ワールドカップのためにBSに入ろうということで、準々決勝になってようやくうちにBSはいりました。今初めてBS経由でワールドカップ見てます。


PPerl




http://mizzy.org/program/pperl.html


http://d.hatena.ne.jp/odz/20060524/1148529647



PPerlはHろゆきに薦められて使ったが、速くなるのは納得できるものの常駐させておくアプリがたまーにI/Oでこける事があった模様。ちょっと今すぐに再現はできないのだけど、ひと月くらいpperlで使っていたSTDOUTに定期的にURLリストを出力するアプリである日突然なにも出力されなくなった。原因は不明。


別にPPerlが悪いってわけではないのかもしれんけど、このレイヤーを足す事によって得られるメリットはレイヤーそのものの謎に比べるとバランスが取れないので俺はパスだなぁ。もっとも、プロダクション環境じゃなければまた使ってもいいけど。


ちなみにちょっと脱線するが俺は常駐プログラムは基本的に好きじゃない。というか、Perlをそこまで信用してないってのもある。Daemonにはするけれども、いわゆる「自殺機能」を入れておくのが多い。ApacheのMaxRequestsPerChildみたいなもんやね。Perlみたいなリークがある場合はひどい事になる言語の場合はある一定の処理数もしくは時間が経過すると自動的にプロセスを終了して、自分のコピーを再度立ち上げ直す、みたいなシステムで書く。


超ショック。



何気なく鼻毛を抜いた。白髪だった。脱力。今日何となく調子悪いのはこのせいか?!


この身を礎とします



id:tasukuchanとDBIx::Classでほげほげしてるわけですが、これがまたもう難問の連続ですな。とにかくエラーメッセージがひどすぎる。


Web上の情報も少なすぎるのでなるたけ書き残して行こうと思う。


今回はDBIx::Class::Schema::Loaderを使って作ったクラスでエラーの連続だったのでデバッグ。Hoge::SchemaでDBIx::Class::Schema::Loaderを使ってクラスを定義したのち、Hoge::Schema::*でちょっとずつ設定を行いたいのだが、わけわからんhierarchyがどうのこうのとエラーがでる。ソースを見てみると



package Hoge::Schema::Foo;
use strict;
use base qw(DBIx::Class::Schema);

__PACKAGE__->has_many('bar', 'Hoge::Schema::Bar', 'foo_id');

1;


みたいになってる。どうも怪しいと思ったのでuse baseを取ると無事動くらしい。とりあえずこれで一件落着。


やっちまった



多分生まれて初めてくらいな超寝坊。寝たのが4時くらいで、コレ書いてるのが13時。起きたの10分前。ミーティングぶっちしちゃったよ・・・。


Brasil x Ghana



バーで観戦。最後はもうバーテンさんも一緒に座って。ブラジル、いいぞいいぞー。そろそろ実家にユニフォーム取りに行かないと。


Fallen In Love



コレ



http://img.store.yahoo.co.jp/I/key_1899_80978702



この間久しぶりに楽器屋に行って(本当はマルチペダルでも見ようかと思ってた)手に取って弾いてみたら1時間近く弾き続けてしまった。


もう久しぶりに楽器にめろめろですよ。この手に収まる感じ。この10フレット前後のあまーい音。欲しい欲しい欲しい欲しい。でも19万円強。せめて12万くらいにしてくれ・・・


また近いうちに弾きに行こう。


Soundgarden



職場でSoundgardenがかかるとなんか嬉しい。GN'Rの前座で一回だけ見たのだが、ブーイングされてステージを降りて行った。俺もGN'R見たかったから正直Soundgardenはどうでもよかったのだが、今から考えるとちょっと惜しい事した。ただ当時はまだBadmotorfingerの時代だったからなぁ。SoundgardenはなんといってもSuperunknownだぜ。


Spoonmanは今でも時々弾いたりします。


すべらない話



ネコがぐるぐる。


あの人はいまどこ



もうなんでこのページにたどり着いたのか覚えてさえいないが、読みふけってしまった。特に漫画家の部分:



http://www.threeweb.ad.jp/~elephant/tuiseki/tuiseki.htm



このページ、正直コンテンツの質はイマイチだけど、結構へぇ~というような情報も色々。まつもと泉はそんな大変な事になってたのか・・・


そういえばこれも時間を忘れてみてしまったよ:



http://www.youtube.com/results?search=%E3%82%B2%E3%83%BC%E3%83%A0%E3%82%BB%E3%83%B3%E3%82%BF%E3%83%BCCX&search_type=search_videos&search=Search



アトランティスの謎、正直やりすぎ。


わかった



こうだな。Hoge::Schemaを作ってあるのだが、Hoge::Schema::Tableに定義すればいいのね。これ、もっと自動的にできるといいんだが、Developerバージョンで入ってたInflateColumn::DateTimeは問題があって入ってないみたいだなぁ。


それとは別に、DBIx::Class->search()で普通にSQL::Abstract使えるのはなかなか使い勝手が良い。


DBIx::Class::Schema x Catalyst x InflateColumns



どのタイミングでInflateColumns使うのかわからんぞー。way too much magic, I say...


徹夜続き



遊びだ仕事だで徹夜を三日。


NetCache



あ~あ、俺の古巣が・・・



http://biz.yahoo.com/bw/060623/20060623005106.html?.v=1



やっと次のステップ。



Catalystのそれぞれのactionの前に実行されるようなフェーズを検索中・・・Data::FormValidatorをprepareの段階じゃなくて、$c->forwardしても実行されるようにしたい。


Catalyst - やっとわかった



まず最初の"can't find method search()..."は、DBIx::Class::Schema::Loaderがロードに失敗してるにも関わらずに普通にサーバーが開始しているのでわからない。今DBIx::Class::Schema::Loaderのドキュメントを読んだのだが、とりあえずcroak on errorみたいのはないみたい。まぁ要はクラス定義に問題があったらcroakするオプションを作って、./script/hoge_create.pl modelするときにデフォルトで



package Hoge::Model::Hage;

use strict;
use base qw/DBIx::Class::Schema::Loader/;

__PACKAGE__->loader_options(
relationships => 1,
on_error => 'fatal', # こんなオプション存在しないけどな
# debug => 1,
);


ってしておけばいいんだよ。なんかエラーが起こってる時に無視しちゃうのって気持ち悪い。


で、もう一つの問題はid:typesterさんが言ってた通り。Hoge::Model以下にSchema入れちゃいけないらしい。これもせめて警告くらい出てほしいなぁ。


あー、メディアうぜぇ。



負けて本気で悔しがってる選手によってたかってインタビューとかすんなよ。しかもほめながら。きれいごと言われたって反応できるわけねーだろ。バカ。


Brasil x Japan



さすがに日本相手だとちょっと微妙な気分の応援なんですが・・・サッカーに関しては俺は完全にブラジル人です。非国民ですまんのう。・・・ってことで・・・



  • ロナウドキタ━━━━(°∀°)━━━━ッ!!っつーか、ノーマークじゃん・・・いくら調子悪いとは言え・・・。しかしアナウンサー、日本応援したいのはいいけど、今のはなかったことにならんのでちゃんと叱責しろよ。

  • ジュニーニョキタ━━━━(°∀°)━━━━ッ!!このゴールはちょっとラッキー。さすがにちょっと川口かわいそうだ。

  • ジルベルトキタ━━━━(°∀°)━━━━ッ!!ロナウジーニョのパス、美しい!

  • うーん、日本チームは本当に勝ちたいんだったら中田が一人で切り込んで行ってる時に誰かがオープンエリアに走り込んでないと駄目だよ。倒されても倒されなくても、そこに人が詰めている事が重要なのに・・・

  • なんだ、そのパス>日本。人が今いるところじゃなくて、そこにいるべき場所に流すんだろおおお。ふがいないなぁ。

  • ロナウドまたキタ━━━━(°∀°)━━━━ッ!!これで2点だから、ひょっとして得点数で記録樹立か?


・・・ってところで終了。正直言って、完膚無きまで叩きのめされたな。がんばった!なんて言ってる場合じゃないよ。強くなりたいならここは褒め言葉じゃなくて現実を言い渡すべきだろ。日本は弱い。前の試合はともかく、この試合に勝てるかも、とか言ってたメディアは本当にバカだ。


ってことで、相変わらずジーコの通訳はめちゃくちゃだな・・・と思いつつそろそろ撤収用意。


トップランナー - 宇多田ヒカル



いいぞ、帰国子女。もっと言ってくれ。


本当にCatalystがわかりません



Schema::LoaderでどうやってModel定義するのか全然わからん。定義したところでどうやって使うのかわからん。



$c->model('Hoge')->search(...);

しようとするとsearch() なんてないって言われるし。./scripts/hoge_create.plのヘルプ情報は嘘ばっかだし。


Catalyst sucks sucks sucks




http://unknownplace.org/memo/2006/06/21#e002



id:typesterさんの書き込みとかを見て、再度挑戦。



./scripts/hoge_create.pl model Foo DBIC::Schema Hoge::Model::Schema \
create=dynamic 'dbi:Pg:dbname=hoge;host=1.1.1.1' hoge
<snip>

-bash-2.05b$ ./script/hoge_server.pl -r
Couldn't load "Hoge::Model::Foo", "Can't locate object method "config" via package "Hoge::Model::Foo" at /home/daisuke/svn/Hoge/script/../lib/Hoge/Model/Foo.pm line 6.
Compilation failed in require at /usr/local/lib/perl5/site_perl/5.8.8/Module/Pluggable/Fast.pm line 82.
" at /usr/local/lib/perl5/site_perl/5.8.8/Module/Pluggable/Fast.pm line 84.
Compilation failed in require at ./script/hoge_server.pl line 49.
-bash-2.05b$


ハァ?!Foo.pmを見ると



package Hoge::Model::Foo;

use strict;
use base 'Catalyst::Model::DBIC::Schema';


Catalyst::Model::DBIC::Schema は Catalyst::Model、Catalyst::Componentから継承しているのでconfig()はあって当たり前なんだが。どういうことよ・・・


ああああああ、もう、ストレス。


ハンバーグ三昧



恵比寿「俺のハンバーグ」で昼食。夜、豆腐と豚肉で作ったハンバーグ。


100人



id:toyaさんとこで見たのでちょいとやってみたよ。



http://u-maker.com/o/100nin/



「辰巳琢郎」が出てきたのって、絶対「アスパラガス」を選んだからだと思う。


100人に聞きました。
「ズバリ、牧大輔さんといえば?」
 面白い	…40人
 趣味が社交ダンス	…36人
 お金にうるさい	…17人
 物まねがうまい	…5人
 早口	…2人 	

100人に聞きました。
「牧大輔さんは誰に似てる?」
 辰巳琢郎 …40人
 岡村隆史 …36人
 田原俊彦 …17人
 緒形拳 …5人
 きよ彦 …2人

100人に聞きました。
「最後に、牧大輔さんに一言!」
 例の件よろしく …40人
 愛してます …36人
 帰ってこい …17人
 握手して下さい …5人
 知らね~! …2人


XS Modules On Win32




Module::Build cant upgrade anything XS it uses (or couldnt/cant without a modern EU::I) on Win32. So since Pathtools is a dual build module, the only way you can install it on Win32 is to install it from a clean shell with nothing running, and then to use the EU::MM install infrastructure as it avoids locking the files (by not using Perl to do the install).



Holy shit.まじかい。


何回も言うが



MEGUMIは好きだ。


松濤爆発

そういえば、8周年目です。



Web上でモノを書き始めたのがワールドカップフランス大会のあった年だった。あの年はまだSt. Louisの寮に住んでて、男二人の所帯で好き勝手に色々遊んでた。毎週のようにボウリングしてた。ワールドカップ決勝をブラジルで見るためにわざわざ帰ったのに3-0で負けるなんて事があった年だったなぁ。


近所のやすーいピザ(一枚150円)と、たまにお金があると食べれる怪しい中華食堂の肉うどんばっかり食ってた。自炊したかったけどルームメイトが「魚の出汁は臭い」とか言うのでなかなか作れなかった。700kmの道のりを何回も何回も往復した。あの夏は暑かった。摂氏45度の中だった。


日記



プール。ざばざば。体格が良くて筋肉もついてて、って人でも泳ぐのは意外と遅くて結構見てておもしろい。泡ばっかりたてて全然前に進まないでやんの。


税理士さんが来て帳簿の帳尻合わせ。


眠気で仕事がはかどらない事が容易に想像できたので長年の懸念事項であった(?)旧PowerBookの修理のために銀座へ。もう何ヶ月も放っておいたのだが、今日はがんばって行ってきたよ。以前渋谷のマックストアにも持って行った事があるんだが、多忙だかなんだかしらんけど、午前中に行ったのに相談できるのが午後5時とか言われてむかついて以来断念したのであった。


ってことで銀座。修理依頼はいたって簡単。20分でおわった。その後木村屋に行っておみやげ用あんパン購入。木村屋本店のあんパンはうまい。


休肝日



うはー、なんと2週間ぶりの休肝日。


きみはペット



毎回ではないのだけれども、再放送でやってる「きみはペット」を今更ながら見てる。なんかおもしろくねーか、これ。今度ちゃんと見よう。っていうか読もう。14冊か・・・文庫でないかな・・・


日本 x クロアチア



しょぼ。しょぼい。しょぼい!


ブラジル x オーストラリア



これですよ、これ。得点シーンもいいけど、ロナウジ-ニョの背面パスとか、ロナウドのカカへのパスとか、そういう細かい技が見てて楽しい。あとロベルトカルロスとか、ゼ・カルロスとかがカバーに入ると、きっと止めてくれるという安心感。サッカーはこうでなくては。


日記



多分後で書く。とりあえず箇条書き



  • バーゲン。日本の服は俺の体型に喧嘩うってる。腹がおさまらんのなら、俺のせいでゆるす。でも腹がおさまるのに、胸囲がおさまらんのはわからん。胸筋がある人はどーせいっちゅうんじゃ。

  • ひさしぶりに銀座をぶらぶら。なぜか午後4時に昼飯。

  • TRICK 2見た。すげー馬鹿馬鹿しかった。大好き。

  • バーに移動、実に6時間近くもワールドカップみながら酒。

晴れ晴れ



俺のバグじゃなかったーーーーーーーー!わーい!


徹夜してしもた



ところで昨日は期せずして徹夜してしまった。まぁ差し迫った問題もあったんだが、正直徹夜するつもりではなくて・・・でも気づいたら明け方。7時過ぎに寝て、11時半くらいに起床。その後メールとかぼちぼちやって、素麺とオクラを食べて今にいたる。


「いいとも」に国生さゆりがでてきた。この人に感じの似た人の事をちと思い出した。


思い出したと言えば、この間2年半ぶりくらいに会った人がいて、ほんの30分くらいなんだけどちょっと胸がいっぱいになった。


しかし眠い。インデックスファイルの再構築はまだ終わらない。


AudioFile-Info

オランダ x コートジボアール



最近オランダ人のAと仲が良いのでこんな事書くのはアレなんだが、この試合ずーっと見ててもう一試合みたい!と思ったのはオランダじゃなくてコートジボアール。ちょっと詰めが甘いけど、パスワーク、ドリブル、どっちもコートジボアールのほうが美しいし楽しい。


勝負は詰め将棋のように必然的に勝つようにして勝つのももちろんありなんだけど、やっぱり瞬間的な閃きから生まれる動きは美しい。コートジボアール、ここで消えてしまうのはちょっともったいないなぁ。


高橋克己と遭遇



代々木上原で飲んでたら高橋克己と遭遇。おもわず、へぇ。


正規表現で/o



ちなみにこれ、皆はまるところなので昨日の続き:



sub match_me
{
my ($regexp, $string) = @_;
return $string =~ /$regexp/o;
}

これは一見速くなりそうだけど、実はNG。/oを使うと、最初に$regexpに渡した値でこの正規表現はコンパイルされてしまうので、次に違う値を$regexpに渡しても前回の正規表現を使用してしまう。以下テスト:



use strict;

sub poop { my($regexp, $string) = @_ ; return $string =~ /$regexp/o };

my $RE1 = "foo";
my $RE2 = "bar";

my $STRING1 = "foo" x 2;
my $STRING2 = "bar" x 2;

if (poop($RE1, $STRING1)) {
print "$RE1 matches $STRING1\n";
}

if (poop($RE2, $STRING1)) {
print "$RE2 matches $STRING1\n";
}

if (poop($RE1, $STRING2)) {
print "$RE1 matches $STRING2\n";
}

if (poop($RE2, $STRING2)) {
print "$RE2 matches $STRING2\n";
}

daisuke@beefcake daisuke$ perl poop.pl
foo matches foofoo
bar matches foofoo


本当は最初のと最後のがあたるはずなのに、最初の二つしかあたらない。これはどういうことかというと、/oが$regexpをコンパイルするのは最初のpoop()呼び出しの時だけだから。だからこうやって動的に正規表現を作成して使用する場合には/oは使っちゃ駄目駄目。


例えばpoop()の中で繰り返し同じ同じ正規表現を使う場合はqr()を使うと吉:



sub poop {
my($regexp, $string) = @_;

my $compiled = qr($regexp);
for (1..10) {
$string =~ /$compiled/;
}
}


PostgreSQLのVACUUM



かなり頻繁にUPDATE/INSERT/DELETEがあるデータベースに対して1時間に一回VACUUMDBをかけるようにしてるのだが、これがうまくいかない。20分から30分くらいデータベースにロックがかかってしまう。いったいどれだけの頻度でvacuumかければいいんだ。というわけで今試行錯誤中。


# とりあえずvacuum20分に1回で、処理が5分止まる感じ。


住所抽出




http://subtech.g.hatena.ne.jp/yappo/20060613/1150209686



実は某案件で色んなサイトから住所を抽出するスクリプトってのを書きました。80%強くらいの精度で日本の住所は抽出できるようにしてみたのだけれども、これって公開しちゃいけないのかもしれないのでコードだせません。(^^;


ただ、俺の取ったアプローチは存在する住所をを正規表現でRegexp::Assembleするのではなく、もっと包括的な正規表現で番地までを取ってくるもの。パターンをだいたい認識できればそれほど難しくないのだけれども、一部どーーーーーしても文字のエンコーディングのせいでうまく当たらない文字列があるので要注意。


正規表現




http://qootas.org/blog/archives/2006/06/perl_regex_perf.html



をブクマしてるid:naoyaさんのコメント



[perl] あらま、意外。 o つけたら変わるかなとおもったけど同じでした。




/hoge/oは、正規表現に変数が入ってる場合のみに違いがでてくるはず。例えば



my $re = "hoge";
$str =~ /$re/ for (1..100)

よりかは



my $re = "hoge";
$str =~ /$re/o for (1..100)

のほうが早い。以下ベンチマーク:



use strict;
use Benchmark qw(cmpthese);

my $str = "foobarbaz" x 100;
my $re = "bar";

sub with_o
{
$str =~ /$re/og;
}

sub without_o
{
$str =~ /$re/g;
}

cmpthese(1_000_000, {
with_o => \&with_o,
without_o => \&without_o
});

daisuke@beefcake daisuke$ perl benchmark/regexp_o.pl
Rate without_o with_o
without_o 1369863/s -- -15%
with_o 1612903/s 18% --
daisuke@beefcake daisuke$


ちなみに/$re/gを/bar/gにすると



daisuke@beefcake daisuke$ perl benchmark/regexp_o.pl
Rate with_o without_o
with_o 1612903/s -- -16%
without_o 1923077/s 19% --
daisuke@beefcake daisuke$ vi benchmark/regexp_o.pl

あっさり逆転。ちなみにネタもとの|に関しては、|があるとバックトラックをしなくちゃいけないのでその分だけ処理が増えるので遅いのは当然。


軽く日記。



朝11時のミーティングが入るも、バグ取りが間に合わず20分遅刻・・・と思ったら俺以外まだ誰も来てなかった。そのままミーティング。


知り合いから宇多田ヒカルの「ULTRA BLUE」を入手。シングルが半分以上入ってて、正直「これまだアルバムででてなかったの?」って感じ。でもやっぱり宇多田ヒカル好きだ。ミーハーで悪かったな。


なんか久しぶり事務所。もう4時過ぎに眠くて眠くて昼寝。20分くらいで起きたら汗だく。だらだらだらだら。つくづく子供体温。金の話とか、仕事の話とか。


Aと軽く飯食って帰宅。


今の時点で今日は色んなプロジェクトに対してコミット件数ゼロw。フォームとか作ったりしたくらい。いかんいかん。


今日はこれからワールドカップ三昧。ブラジル戦は見れるかどうか微妙だな。


ブラジル勝利



いやー、おもしろかったけど、ブラジルは手抜き試合だったなぁ・・・。


伊勢神宮



そそのかされたので次どこに旅行に行きたいか決まった。ずばり、伊勢神宮。今度の旅行はお伊勢参りにするわ。また来月とかかなぁ。あとは宿が取れれば。


Catalystのここがむかつく



ドキュメントを読んでるとこういうのがでてくるわけだが



my $grtable = $c->model('UserData::Greetings');
my $record = $grtable->find_or_create(user => $c->user->id);

このfind_or_createをいくらsearchに置き換えてもうまくいきゃあしねぇ。よーーーくgrtableがなんのか見ると、これはSchemaオブジェクトっぽいから、多分resultset使うのか?と思ってやってみると



my $table = $c->mode('hoge');
$table->resultset('hoge')->search( .... );

これで動く。っていうか、本当にこれドキュメント最悪だよ。自分達が使いたいだけのおもちゃなら「これがデファクトスタンダードだ!」みたいな豪語をせんでいただきたい。そうじゃないならちゃんとサポートしやがれ、この野郎。DBIx::Classにしたってどのメソッドがどこに入ってるのか全然わかんねーしよおおおおおお。全くもってイライラする。


本(技術系)



そういえばこれも買った。今更だけど、SQL勉強したことねぇや、俺、ってことで。



初めてのSQL

初めてのSQL







村上春樹はもらいもの。あとのはどどーんと買ってみた。町、食、酒。本に限らずだけど、この辺がどうも俺の好きなテーマなのかな。



もし僕らのことばがウィスキーであったなら (新潮文庫)

もし僕らのことばがウィスキーであったなら (新潮文庫)






駅名で読む江戸・東京

駅名で読む江戸・東京






食の世界地図

食の世界地図






志ん朝の落語〈3〉遊び色々 (ちくま文庫)

志ん朝の落語〈3〉遊び色々 (ちくま文庫)






志ん朝の落語〈4〉粗忽奇天烈

志ん朝の落語〈4〉粗忽奇天烈





HTML::ContentScraper



どうも完成度がイマイチ(っていうか、まだどこまで使えるかわからん)なのでリリースするかどうか怪しいモジュール。この間読んだこれ、



http://blog.zuzara.com/2006/06/06/84/



もう少し親divとかにかぶらないようにできないかなぁ、と思ってちょっとほげほげしてみたのが以下のモジュール:



package HTML::ContentScraper;
use strict;
use HTML::TreeBuilder;

sub new
{
my $class = shift;
my $self = bless {
threshold_length => 200,
threshold_tag_rate => 0.05
}, $class;
return $self;
}

sub _elem
{
my $self = shift;
my $field = shift;
my $ret = $self->{$field};
if (@_) {
$self->{$field} = shift;
}
return $ret;
}
sub threshold_length { shift->_elem('threshold_length', @_) }
sub threshold_tag_rate { shift->_elem('threshold_tag_rate', @_) }
sub scrape_uri
{
my $self = shift;
my $uri = shift;

require LWP::Simple;
$self->scrape_content(LWP::Simple::get($uri));
}

sub scrape_content
{
my $self = shift;

my $html = HTML::TreeBuilder->new_from_content($_[0]);

my @elems;

# Look for sections that are either contained in a TD or DIV
foreach my $candidate ($html->look_down(_tag => qr{^(?:td|div)$})) {
# in each section, look for the number of tags
my @tags = $candidate->look_down(_tag => qr(.));
my $text = $candidate->as_text;
my $len = length($text);
if ($len >= $self->{threshold_length}) {
if (scalar(@tags) / $len < $self->{threshold_tag_rate}) {
# make sure that this new element is not inside a previous
# container. if this happens, then we should pick the
# new element and toss the old one
my @l = $candidate->lineage;
my $f = 0;
for (my $i = 0; $i < @elems; $i++) {
foreach my $l (@l) {
if ($l->idf eq $elems[$i]->idf) {
splice(@elems, $i, 1);
$f = 1;
last;
}
}
last if $f;
}

push @elems, $candidate;
}
}
}

my @ret;
foreach my $e (@elems) { push @ret, $e->clone }
$html->delete;
return wantarray ? @ret : \@ret;
}

1;


で、テストスクリプト



#!/usr/bin/perl

use strict;
use lib("lib");
use HTML::ContentScraper;

my $scraper = HTML::ContentScraper->new;

foreach my $uri (@ARGV) {
my @elems = $scraper->scrape_uri($uri);
print "HTML contents: ", scalar(@elems), "\n";
foreach my $e (@elems) {
print "=== START ===\n", $e->as_text, "=== END ===\n";
}
}


で、問題はこれをどう使うかだなぁ。いいアプリケーションあるかしらん。ちなみにMeCabをこれにかますのもどうかなぁ、とか思ってたり。


床に寝る



なんか最近また床にねとる。この間またベッドに戻れたと思ったのだが、まだ床に逆戻り。でも最近ちょっと背中が痛い。


家で一人酒はやっぱりあかん。



一人酒は外だと大丈夫なのに、家だとやっぱり落ち込むなぁ。もう見るもの聞くもの全部あかん。


他人っていやだなぁ。




この日記、ほんと時々知り合いに読まれてるのが嫌だなぁ。昔はなんでも書けたのに。読んでる人が悪い訳でもなんでもないんだけど、時々そういう気持ちにかられる。


結果的には裏日記書くしかねーのかとも思う訳ですが。


実家飯



そういえば今日ものすごく久しぶりに実家で親の作った飯を食った。多分半年ぶりくらい?ちょこちょこ実家には帰ってるのだが、どうもイマイチ親の飯って食った事がない。疲れてるとかあるんだろうが、まぁ・・・


まあ今日はオヤジも一時帰国で帰ってきてるので手を抜くわけにもいかなかったのだろうw。こうしてみるとオヤジが好きなのねー>母親。子供と自分だけの時って結構手抜きなのにw


ともあれ、久しぶりに親が作った唐揚げとか食べた。うま。




さて、ワールドカップが始まってしまいました。4年前もボスにはっきりと「今月は俺午前中に仕事できません」と言い放ってワールドカップ見てました(折角日本でやってるのにアメリカだったから昼夜逆転だったんだよ!だよ!だよ!)


とりあえずブラジルの試合だけは何があってもはずすわけにはいかない。午前4時だろーがなんだろうが、俺は見る!昨日はバーで午前2時くらいまで見てました。その前は麻雀しながら。


ってことで午前中は俺を探さないでください。あとウチで真夜中にサッカー観戦したい方、いるならそれはそれで歓迎w飯くらいつくりますw


全日本最強 CPAN Author ランキング 2006

麻雀



うちで麻雀大会。もう男気あふれるプレイで俺が振込続けるもんだから9時間?の熱闘後に俺に残った物は -92ptとか。くくく・・・。勝負したい年頃なんだよ。


すげー楽しかったのでまたやりましょう。


モルト



月一のお楽しみ。今回はアードベッグとグレンモールの1978年もの。あとは飲み放題2000円。今回は本とか持っていって、ゆっくりぐびぐび。7時過ぎから2時くらいまでずっと居座ってた。サッカーの試合も観戦。一緒にいた人をタクシーで送って、帰宅。


麻雀やったその日にようやるわ、俺。


こうじゃないの?




http://d.hatena.ne.jp/t-akihito/20060609/1149860878




use strict;
use Text::MeCab;

my $mecab = Text::MeCab->new();
for(my $node = $mecab->parse($text);
$node;
$node = $node->nexst
) {
my $yomi = (split(/,/, $node->feature))[7];
next if $yomi eq '*';
print $yomi;
}



  • まず、$node->surfaceはいつもオリジナルのフレーズが入っているので読みにはならない。

  • output_format_typeはあんまり$node->parseレベルでは動作に影響がないっぽ。


これはFAQみたいなもん必要かなぁ。


メモ - Mac OS Xでlddの代わり

daisuke@beefcake Text-MeCab$ otool -L /usr/local/bin/mecab /usr/local/bin/mecab: /usr/local/lib/libmecab.1.dylib (compatibility version 2.0.0, current version 2.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 88.1.5) /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.4.0) /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0) daisuke@beefcake Text-MeCab$
otoolなんてしらんわw

Win32 minor fix for Text::MeCab



id:charsbarさんがWin32でText::MeCabをコンパイルする時の問題点とかを指摘してくれたのでレポジトリには反映した。このままアップロードするかなぁ。他に何かフィックスあったかしら。


MeCabでカスタム辞書作成



MeCabの辞書作成をやってみた。



昨日のText::MeCabバグになんで気づいたかというと、デフォルトのdictionaryだとmecabが「トラックバック」を単語として認識してくれないのに気づいたのでそれをどうにかしたかった。それをするにはやっぱり--userdicを指定しないとなぁ、と思って



my $mecab = Text::MeCab->new({userdic => '/Users/daisuke/mecab/foo.dic'});
for (my $node = $mecab->parse($text);
$node;
$node = $node->next
) {
print $node->feature, "\n";
}

みたいにしてみたのですよ。そしたらあーた!Segfaultの嵐じゃないですか。なんだなんだ?と思ってmecab_strerror()とか引っ張りだして検証してみたら"first argument seems to be invalid"みたいなエラーが出てて、なんじゃこらと思ってたらどうも引数を設定している時だけに起こるエラーだという事が発覚。色々やってようやくargvの処理の仕方が間違ってる事に気づいた。


で、これができたので辞書作ろうと思ったらうまくいかなかったので以下はメモとして。まずはここを参照しながらカスタム辞書作成。



http://mecab.sourceforge.jp/dic.html



基本的に書いてある通りであるのだけど、どうもmecab-ipadicをインストールする際にmake installがファイルを一個入れ忘れてるっぽ。



daisuke@beefcake daisuke$ cd /usr/local/lib/mecab/dic/ipadic
daisuke@beefcake ipadic$ sudo /usr/local/libexec/mecab/mecab-dict-index -u foo.csv -f euc-jp -c euc-jp /Users/daisuke/foo.csv
No such file or directory ./matrix.def
daisuke@beefcake ipadic$

ほげー。ってことでこうなる場合は、mecab-ipadic-XXXX.tar.gzを展開、makeして、そこにできるファイルmatrix.defをipadicのディレクトリにコピって来るべし。



daisuke@beefcake ipadic$ sudo cp ~/pkgs/mecab-ipadic-2.7.0-20051110/matrix.def
daisuke@beefcake ipadic$

これでもう万全。



daisuke@beefcake ipadic$ sudo /usr/local/libexec/mecab/mecab-dict-index -u foo.csv -f euc-jp -c euc-jp /Users/daisuke/foo.csv
reading /Users/daisuke/foo.csv ... 1
emitting double-array: 100% |###########################################|

done!
daisuke@beefcake ipadic$


こうしておいて、あとはText::MeCabを呼ぶ時にuserdicオプションを使うか、自分の.mecabrcとかに書くだけ。


INTEROPのぞいてきた



無料パスもらったのでINTEROP最終日にほんの少しだけ顔を出してきた。正直何が楽しいのだかわからん、このイベント。楽しいというか、なんかこうオーディエンスが誰なんだろうと正直困惑気味。


あと、YAPCの人たちは本当にプレゼンが上手なんだな、と確信した。


SVK - 続き



昨日の続き。Text-MeCabでバグがあったので、その修正。



まず昨日のXangoと同じ要領でsync



svk http://svn.razil.jp/Text-MeCab //mirror/Text-MeCab
svk sync
cd svk
svk co //mirror/Text-MeCab/trunk Text-MeCab
cd Text-MeCab

昨日id:miyagawaさんが//localは特に必要ないような事をメッセで教えてくれたので今回は//localは無し。で、とりあえずsvn上で修正を行ってしまったのでそれパッチにして適用:



patch -p0 < ~/svn/Text-MeCab/mecab-arg.patch

コミットすると、



daisuke@beefcake Text-MeCab$ svk commit
Commit into mirrored path: merging back directly.
Waiting for editor...
Merging back to mirror source http://svn.razil.jp/Text-MeCab.
Merge back committed as revision 12.
Syncing http://svn.razil.jp/Text-MeCab
Retrieving log information from 12 to 12
Committed revision 124 from revision 12.
daisuke@beefcake Text-MeCab$

説明を読むと//mirrorのパスにコミットするとすぐに元のsvnレポジトリにコミットするようだ。これでSVKの説明とid:miyagawaさんの説明にようやく納得がいった。ネットワークに接続してない場合はさくさくっと//mirror -> //localにローカルコピーを作っておいて、それに対して作業すればネットワーク接続無しでもサクサク仕事できる、ってことだね。


そんなわけでsvk入門完了。あとは少しずつsvkに移行しようっと。


Text::MeCabでバグ発見



うわーん。今日初めてuserdicとか使ってみててきづいたんだけど、



mecab_new(argc, argv)

のargvって、本当にmain()のargvのままなんだって!ということはどういうことかというと、argv[0]はプログラム名が入ってなくちゃいけないんだって!うわーーーん。


ってことで、SVKで初めて作業してみるものはText::MeCabになりそうです。でもごめん、今すぐできない!明日から週末にかけてやる!


SVK



ほほほ~うう。



http://use.perl.org/articles/06/06/08/0351200.shtml



っていうことでSVK始めて見ました。まずインストールはCPANから。SVN::Coreだけうまくsubversionのディストロから入れられればあとは比較的簡単。Clone::cloneがねーとかテストで言われるけど、無視。


セットアップ。まずミラーのルートを作成。



daisuke@beefcake daisuke$ svk mkdir //mirror
Repository /Users/daisuke/.svk/local does not exist, create? (y/n)y
Waiting for editor...
Committed revision 1.

じゃあまずXangoをミラーしましょう。



daisuke@beefcake daisuke$ svk mirror http://svn.razil.jp/Xango //mirror/Xango
Committed revision 2.

daisuke@beefcake daisuke$ svk sync //mirror/Xango
Syncing http://svn.razil.jp/Xango
Retrieving log information from 1 to 107
Committed revision 3 from revision 1.
[snip]
Committed revision 108 from revision 106.
Committed revision 109 from revision 107.
daisuke@beefcake daisuke$


まだよくわからないけど、察するに//mirrorのリビジョンが↑の左側のカラムで、右側はミラーもとのリビジョン番号だな。


今度はこの//mirrorから//localにコピーを作る。このステップがなんで必要なのかよくわからんが、マニュアルに書いてあるのでとりあえずやる:



daisuke@beefcake daisuke$ svk mkdir //local
daisuke@beefcake daisuke$ svk copy //mirror/Xango //local/Xango
Waiting for editor...
Committed revision 111.
daisuke@beefcake daisuke$

で、それをチェックアウト



daisuke@beefcake daisuke$ cd svk
daisuke@beefcake svk$ svk co //local/Xango/trunk Xango
Syncing //local/Xango/trunk(/local/Xango/trunk) in /Users/daisuke/svk/Xango to 111.
A Xango/tools
[snip]
A Xango/Changes
A Xango/Build.PL
daisuke@beefcake svk$

おけおけ。ってところで今特にチェックインしたいパッチがあるわけではなかったことに気づいた。ということで今日はここまで残りはまた次号!(笑)


ヒゲとボイン



UNICORNの「ヒゲとボイン」に結構あてはまるらしいです、僕。実は聞いたの今日が初めてですが!


参考→なるほど(笑)てはだしてねぇよ!(笑)


開拓



そういえば最近家の近所開拓中。バーを一軒、シェリー酒を出す店一軒。バーのほうはちょっと高い。シェリー酒を出す店のほうは今日ようやく場所を確認したので(前回は酔っぱらっててもう道を忘れてたw)今度からちょくちょく顔だそう~っと。


ギャーーーーーース!



なんだか最近受け流すとかの意味がわかりかけてきているdaisukeです、こんにちは。


先ほどですね、gmailにたまったメールの整理をしてたんですよ。私はですね、まぁスパムとか定期報告のようなそんなメール以外は基本的に残す人なので、あきらかにそれとわかるものを探しては削除 したり迷惑メールフラグをたてたりしてたんですよ。そしたらですね、つい間違って一番古いメールを見るというリンクを押してしまったんですね。そうしたら奥さん、あれですよ、「ギャーーース!」ですよ。1年前のメールとか出てきましたよ。いやー、油断していたのでまさかそんな古いメールを見るとは思わずブラウザを閉じかけましたよ。ああ、心臓に悪い。


さて、今日の予定です。自分で忘れないように:



  • sftpサーバーアップする。

  • mysqlのダンプを取ったので、ちょっと現物データで構成を考え直してみる

  • JANコードも入れられるようにする


それぞれ全然違うプロジェクト。


Perl Source



最近少しずつPerlより低レイヤーのものも関心を持ち始めてるのだが、とうとうPerlのソースをrsyncしてもってきた。



http://dev.perl.org/perl5/source.html



PerlはPerforceで管理されてるらしいが、俺もp4使いたかったなぁ。某前職でp4使ってたので懐かしい(でもたしかperforceはリビジョンが増えると性能が落ちてくるような、そんな問題があったよーな)


。しかしsource controlツールではないので、diffができないんだなぁ。それは面倒・・・


まぁええわ。ちとこれからはソースもちらちら見る事にしよう。ちなみにp5pも遅ればせながら2週間程前から購読中。


睡魔に勝てない男



結構重要な話を携帯メールでしてたのに、途中で完全に撃沈。今起きた俺がびっくりだよ。いつのまに寝てたんだ・・・。ぷっすまの録画も最初の5分しか見た記憶がない・・・。アホや、俺。


例のバトン



ごめん、おいらはルール無視で内容聞いたのに答えてなかったよ。でもちぇりさんがQ28に俺を載せてくれたのがすごい嬉しい!相棒のQ28は俺じゃなかった。微妙に不満。


BOOM BOOM SATELLITESがかっこ良すぎる件について



BOOM BOOM SATELLITES「ON」購入!いや-、実は初めて買ったあるよ。存在は知ってたけどちゃんと聞いたのはこれが初めて。M君によるとこのアルバムは大分ハードロック風味になってるらしいのだが、そのせいか俺の耳にはとてもとても合う。イイ!


(ちなみにアコースティックギターでコード取りだけするとすばらしくつまらなくなるのだが、まぁそれはしょうがないね・・・←ちゃんとアンプ通せ、と)


あとPrimal Scream、EGO-WRAPPIN'、Bent Fabricも購入。


Perl使い - これはひどい



上のバンド列伝書いてる時に、何回やってもwikipediaでPearl Jamがでてこなかったのでおかしい、おかしいと思ってたら"Perl" Jamって書いてた。


・・・Perl。毒されてる。


Wikipedia - バンド列伝



なんか調べたかったのでWikipediaを引いてみたら止まらなくなってしまった:



おまけ。っつーか俺のギターヒーロー


濃密



9時の新幹線で東京へ。昼頃から仕事。4時から激しい?というか濃い営業。8時から酒。


連鶴




http://homepage3.nifty.com/k_iky/turu_body.htm



すごーい。江戸ってイキだねぇ。


で、また岡山



帰りは特急しおかぜに乗って岡山へ。なんとか文明のあるところにたどり着いたぞ。東京着は明日の昼頃。


高松からローカル線の旅(観音寺)



高松を朝出て、ぴょん子に聞いてた丸亀へ。美術館は駅の前だったからとりあえずてくてく歩いて丸亀城跡へゴー。石垣が高い。海抜50メートルくらいの位置にあるそうで。上までてくてく。昨日のタクシーのおっちゃんの言う事によると夏になればまた霧も晴れるそうだから、その頃にはキレイに海が見えるんだろうな。


ぼーっとお堀の亀を見て、移動。駅前の美術館に。猪熊弦一郎という人、名前は全然知らなかったけど経歴と作品を見たらかなり見覚えのある作品ばかりだった。キリンの宣伝とか、三越とかなんかは特に。具象画から抽象画に移る過渡期の作品のモディリアーニっぽいのがかなり好きだった。


もう今日は急いで東京には戻らないと決めてたので岡山にまた宿を取ってあったのだが、お昼頃に丸亀を出ても1時過ぎにはすでに岡山についてしまう。これだと時間の無駄になりそうなので適当に見当をつけて全く逆方向の松山行きの電車に乗ってみた。


途中、明らかに俺が思ってたより強烈な田舎になってきたので正直びびりまくり。心細くなってきて、でてきたのを一瞬後悔。でも海岸寺の辺りは海の真横を電車が通り過ぎるあたりなんかは内心大興奮。海だ、海だああああ!ほんとに瀬戸内海って海が静かだなぁ。あと、無人駅で明らかに渋谷にいそうなギャル姿の女がいて、正直びっくり。風景にほんとに似合わん・・・ドラマ「ギャルサー」の見過ぎか?


勘で決めた割には目的地の観音寺はそれなりにでかめのところだった。きっとお遍路でそれなりに人が来るのだろう。20分程歩いて琴弾八幡宮へ。結構階段が長いので上着のシャツをここでようやく脱ぐ。っつーか、最初から半袖にしておけばよかった。


本殿の脇の休憩所でぼーっと。そこでノーパソを広げてこれを書いてる。明らかに場違い。だって帰りの電車が出るまであと50分近くあるんだもんよ・・・。でも風がいい感じで吹いてきてほんとに気持ちいい。


ここは(残念な事に)音楽がかかっているのだが(琴弾っていうくらいなのでお琴の音楽がずっとかかってる)、四国に来て一番強く思ったのが「都会ってうるさいんだなぁ」って事。ほんとにここは静かだ。鳥のさえずりとかは聞こえるけど、これって実はうるさいとは感じないもんなんだな。渋谷の町で騒音に辟易してる身としてはかなり嬉しい。


今日は自分が都会っ子なんだなぁと改めて実感した。昨日は田舎に住んでもいいって書いたけど、やっぱりあんまり田舎だと多分カルチャーショックで鬱になるな(笑)そんなわけで多分「地方都市」ならいけるはず、ということにしておこう。


さ、そろそろ行こうっと。


ローカル線の旅3



想像以上に田舎で正直びびってます


ローカル線の旅2



わー、さらに先にほうまで行ってみることにした。ドキドキ


ローカル線の旅



今二両編成の電車に乗ってる。なんか楽しい。はまりそうだ。


かねてから考えていた鳥取ローカル線の旅にもそのうちいかんとな


うどん。



うどん、3時に一杯、でさっき一杯食べた。うま。ちゅるちゅるちゅるー。


Weeeeee’ll drink, drink, drink



あれ、午後8時すぎから飲んでなかったけ・・・?気がついたら空が白んで、午前5時なんですけど。・・・な飲み会。っつーか、いつもの渋谷とか自宅じゃなくて岡山だし!


そう、というわけで金曜は午後から岡山。なんかもう勝手知ったる町になりつつある(微妙に知り合いができてきたし)。串カツ→バー→バー。串カツの店に入った時に割烹着のおねーさまが2件目のバーのおねーさまだと気づくのにしばらく時間がかかった。毎度のごとくホテルでお土産渡して解散。ん。あー、うん。


その後8時40分くらいまで3時間ほど爆睡。9時過ぎにチェックアウトして、10時過ぎの電車に乗って瀬戸大橋をこえ、高松入り。駅の前でちょっとうろうろして、ホテルを発見。チェックインするには時間が早すぎるので荷物だけ預けてまたうろうろ。ご多分に漏れず、今回も何も下調べをしてないので高松には何があるのかさえわかってない。


そんな中、フェリーを発見。行き先を見ると小豆島だ!ってことでこれまたオリーブの産地ということと、24の瞳のロケ地っていうこと以外全く知らずに移動。行ってみたら交通手段がねぇえええ!バスは数が少ないし、ツアーはもうでちゃってるし、レンタカーを2、3時間のために借りるのも・・・ということで、とりあえずタクシーの運ちゃんに声をかけてみて、話を聞いてみた。「3000円くらいかかるよ」と言われたのだが、まぁ帰りはバス乗ればいいやーと思ってオリーブ園まで連れて行ってもらう。そしたらこの運ちゃんがまた喋る喋る。そしてこれが意外と面白い。彼が話してくれた内容を断片的に抜き出すと



  • オリーブは儲からない

  • 儲かるのは素麺作り

  • オリーブは小さめの木を50万円で売れる(これは10回くらい言われた)

  • 24の瞳の原作者は、小豆島の人を貧乏に描写したので島民からは相手にされてない

  • 瀬戸内海は雨が少ないから海の塩が濃い→塩作りに適してる→だから醤油の丸金がある

  • 醤油メーカーの丸金はでっかい会社にのっとられた

  • ごま油メーカーの◯◯ものっとられた

  • 自分はバスを30年、タクシーを20年運転してる

  • 息子達は八王子に住んでる


ということをべらべらとしゃべりつつ、ところどころいいスポットで車を止めて景色を見せてくれたりする。しかも行きだけお願いしようかと思ったらオリーブ園のところで待っててくれて帰りも乗せてくれて、しかも料金全部で4000円。おっちゃんイカす。


船で高松に帰ってきて、うどんを一杯食べて今に至る。


潮風



さっき夜中の高松の町をちょっとだけ歩いてコンビニに行ってきた。ものすごく、ものすごく気持ちがよかった。ここは海の風が感じられる。なんだかんだ言って海に面した町にいつも住んでた。例えばリスボンとリオデジャネイロ。どちらも夜中ほっつきあるいて、いつもあの潮の風と香りを感じてた。


こんな事言うと一緒に仕事してる人たちに心配されそうだけど、俺は多分また引っ越すと思う。東京は楽しいけど、もっとゆっくりと時が流れる町にそのうち住みたいような気がする。これが外国だとまた話が違うのだけど、日本なら新幹線が通ってればすぐにでも東京には出れるし、コンビニはあるし、ネットショッピングもできるし、テレビは最悪の場合某HDDレコーダーを駆使するとか、色々方法がある。


というわけでいつの日か、俺が毎日東京に出てなくてはいけないという足枷がなくなったら田舎に住みたい。それであとはひと月の半分とかを東京、それ以外を潮風の感じられるところで過ごすのはとても魅力的だ。


正直中国地方、四国は悪くないな。




さて、実際にまじめに使ってみて、Catalystはとてもよく考えられたフレームワークだというのはわかったきた。


だけど、気持ち悪い。Pluginを書いてみるとわかるのだが、なんかimportしただけでContextから使えるようになったりする。これは便利ではあるんだけど、ひじょーに気持ち悪い。勝手に動くってなんか微妙だ。ドキュメントが整備されてない事がやっぱりネックのような。


ちなみに今回書いたのはData::FormValidatorのプラグイン。Catalyst::Plugin::FormValidatorというのもあるんだけど、どうも使いにくいので



  • Controllerごとにenable/disableできるようにする

  • Data::FormValidator->new($file)に対応する

  • ディスパッチされたメソッドに対してどのプロフィールを使うのか指定できる


という命題をクリアする(と思われる)ものを書いた。こんな感じに使う:



package MyApp::Controller::Hoge;
use strict;
use base qw(Catalyst::Controller);

__PACKAGE__->config(
'MyApp::Plugin::FormValidator' => {
enable => 1,
profile_file => MyApp->path_to('misc/profile.pl'),
profile => {
index => 'index_check', # profile name
another_action => { # Data::FormValidator args
...
}
}
}
);

sub index : Local {
my($self, $c) = @_;

# この時点ですでにパース済み。
my $valids = $c->form->valid;
}


プラグイン本体は以下の通り:



package MyApp::Plugin::FormValidator;
use strict;
use Data::FormValidator;

sub prepare
{
my $c = shift;

$c = $c->NEXT::prepare(@_);
my $pkg = __PACKAGE__;
my $config = $c->action->class->config->{$pkg};

if ($config->{enable}) {
if (my $profile = $config->{profiles}->{ $c->action->name }) {
# check if we're instantiating from a file
my $dfv;
if (my $profile_file = $config->{profile_file}) {
$dfv = Data::FormValidator->new("$profile_file");
} else {
$dfv = 'Data::FormValidator';
}

$c->stash->{form} = $dfv->check($c->request->parameters, $profile);
}
}

return $c;
}

sub form
{
my($c) = @_;
return $c->stash->{form};
}

1;




http://subtech.g.hatena.ne.jp/miyagawa/20060531/1149080673


で、id:miyagawaさんと話したりしてたのだけど、PoCo::Client::HTTPは拡張性という点に関しては設計が悪い。オンメモリでデータを詰め込んでくところなんかは実際xangoを使ったシステムではハックしてファイルに書き出すようにしてるんだけど、これが本当に*hack*って感じのハックで、醜いったらありゃしない(気軽にPoCo::Client::HTTPをアップグレードできないし)


で、PoCo::Client::HTTPの基本的な構成としては



POE::Component::Client::HTTP
-> dispatch to POE::Component::Client::HTTP::RequestFactory
<- get POE::Component::Client::HTTP::Request

monitor socket via Driver::RW

while (read_ready) {
request->add_content(data);
}


みたいな感じなんだけど、このadd_contentとかをオーバーライドしたい。そのためには結局RequestFactoryとRequestを継承する必要があるんだけど、問題点としては:



  • PoCo::Client::HTTPの中でPoCo::Client::HTTP::RequestFactoryがハードコードされてる

    • create_factory みたいなステートが欲しい



  • PoCo::Client::HTTP::RequestFactoryの中でPoCo::Client::HTTP::Requestがハードコードされてる

    • create_requestみたいなステートが欲しい



  • PoCo::Client::HTTP::Requestの中でデータを保存するためだけのメソッドが欲しい。

    • それがないのでしょうがなくadd_content()全体をコピってハックしてる。




実はこの辺のRequestやらRequestFactoryもXangoを最初に作り始めた時にはなかったもの。改良されてるのはいいんだけど、拡張してるユーザーがもう少し使いやすいようにしてもらえると嬉しかったり。


で、今発見したんだけどPoCo::Client::Keepaliveは余計な事にPoCo::Client::DNSを勝手にspawnしてやがる。こっちがわざわざDNSキャッシュしてるのに・・・そういうわけでもう一つRFC:



  • PoCo::Client::Keepaliveの中のDNS解決するかどうかをClient::HTTPからのパラメターで指定でいると嬉しい。


そんなもんかなぁ。


休肝日



そういえば昨日は一滴も飲まなかった。さすがに必要としてなかったらしい。(笑)


Author

Daisuke Maki (a.k.a lestrrat): Perl hacker, Director of Japan Perl Association, YAPC::Asia Tokyo Organizer (2009-2012), Fluent in Japanese, English. Ex-Brazilian (sorta)

#perl #c #ruby #java #mysql #english #japanese #opensource #stf #cooking #scotch #cigar


このエントリーをはてなブックマ
ークに追加

翔泳社よりモダンPerl入門(2010)を出版させていただいております。できれば内容をアップデートしたいので是非皆様・・・現在の在庫処理にお力をお貸しください!><

月別アーカイブ