HTML::Widgetでgoogle suggestっぽいことをやるとき

HTML::Widgetをつかってるフォームでタグ入力の部分をgoogle suggestっぽくやりたかったので、widgetに空のdivタグを突っ込むひつようがあった。

が、結局fieldsetタグの外側に押し出されてしまって思ったようにdivを突っ込めなかった。

my $w = $c->widget('bookmark_form')->method('post');
$w->element_container_class('Cheer::Container');

my $com_area = $w->element('Textarea', 'comment' )
    ->label('comment: ');
$com_area->cols(60)
    ->rows(5)        ->value($comment);
my $t = $w->element('Textfield', 'tag' )->size(50)->label('tag(word): ');
$t->value($joined_tag) if $joined_tag;
$t->attributes( autocomplete => "off" );
my $e = $w->element( 'Upload', 'pdf' )->size(20)->label('pdf_file  : ');
$e->accept('text/html');
$e->maxlength(1000);
$w->element('Submit',    'submit' )->value('submit');
$w->element('Block')->attributes( id => "suggest" );

しょうがないので最後にBlockを突っ込んでからmargin指定してDivの位置をそれっぽく合わせた。

TTでRFC822 Date Format

CatalystでTT使ってRSS2.0のフィードを吐き出したかったんだけど、datetimeのあたりでRFC822のフォーマットで時刻を出力しないといけないらしい。

都合のいいプラグインがみつからなかったので、Template::Plugin::DtFormatterを使って。

[% USE DtFormatter(patterns => { 
    'rfc822' => '%a, %d %b %Y %H:%M:%S %z',
     time_zone => 'Asia/Tokyo' }) -%]
...
<pubDate>[% DtFormatter.format(ub.clip_time, 'rfc822') %]</pubDate>

フォーマットはDateTime::Format::Mailを参考に。

TT使わないでXML::Feedを使ったほうが良いのかな?

わからん。

TheSchwartzのこと

気になる~とかいってたTheSchwartzがjobを投入できないという問題に悩まされたけど、単にdocの下のschema.sql発行してないからだったという、、、、あほすぎ。なんかぼけまくってた。

TheSchwartzは30分から1時間ぐらいかかりそうな複数の種類のジョブをクラスタ環境の中で非同期に実行する汎用的な枠組みがほしいという僕のニーズにマッチしてて、これでバリバリ書けばうまくいきそう。で、計算結果はXML-RPC使ってWikiに吐き出せばよろしいかと。

バッチのシステムだとBatchSystem::SBSってのも見つけた。 Geneva Bioinformaticsの人が開発しているらしく、いかにもバイオインフォ的な匂いが。自分でバッチを投入する場合にはこれでもいいかも。XML編集しないといけなさそうなのでちょっと躊躇するけど。

あとは、Catalyst Advent CalendarでCatalystでcronみたいな定期実行をやる方法も見つけたんだけど、これはどういう時にいい感じに使えるのかいまいち良くわからなかった。

Gearman と TheSchwartz

仕事で非同期なジョブ管理システムが必要で、やはりここはTheSchwartzを使ってみようかなと。

LiveJournal: Behind The Scenes

Gearmanとの違いはなんとなく。

あと、YAPCでは見逃したので、Google videoをこれからみる。

FizzBuzzワンライナー

フッ君の日常

Perl で

perl -e 'print join "\n", map {!($_%15) ? "FizzBuzz" : \
!($_%5) ? "Buzz" : !($_%3) ? "Fizz" : $_} (1..100)'

書いてみた。

newするときにデフォルト値をもたせるというか、perlのハッシュのこと

404 Blog Not Found:perl - 万能なnewの書き方

しかし、デフォルト値を持たせたければどうすればよいか、こうすればよい。

bless { %default, @_ }, $class;

これでなんでうまくいくのかよくわからなかったのでperlshでいろいろ動かしてみた。

main[61]$ %a = (name => 'anon', pet => 'none')
name
anon
pet
none
main[62]$ %b = (name => 'kzfm', pet => 'hana')
name
kzfm
pet
hana
main[63]$ %c = (name => 'yuki')
name
yuki
main[64]$ $d = bless {%a,%b}
main=HASH(0xa123ce8)
main[65]$ print Dumper($d)
$VAR1 = bless( {
                 'pet' => 'hana',
                 'name' => 'kzfm'
               }, 'main' );
1
main[66]$ $g = bless {%a,%c}
main=HASH(0xa123e94)
main[67]$ print Dumper($g)
$VAR1 = bless( {
                 'pet' => 'none',
                 'name' => 'yuki'
               }, 'main' );
1

別にblessせんでも

main[77]$ $d = {%a,%b}
HASH(0xa123ce8)
main[78]$ print Dumper($d)
$VAR1 = {
          'pet' => 'hana',
          'name' => 'kzfm'
        };
1
main[79]$ $g = {%a,%c}
HASH(0xa123d24)
main[80]$ print Dumper($g)
$VAR1 = {
          'pet' => 'none',
          'name' => 'yuki'
        };
1

うーん、思った通りに動いている。というわけで、一度アレイにしてみる。

main[88]$ $d = [%a,%b]
ARRAY(0xa123fd8)
main[89]$ print Dumper($d)
$VAR1 = [
          'pet',
          'none',
          'name',
          'anon',
          'pet',
          'hana',
          'name',
          'kzfm'
        ];
1

ちゃんとアレイができているので、これをハッシュのリファレンスにしてみる。

main[90]$ $x = {@{$d}}
HASH(0xa124080)
main[91]$ print Dumper($x)
$VAR1 = {
          'pet' => 'hana',
          'name' => 'kzfm'
        };
1

おー、思ったとおり。

アレイからハッシュにするときにインデックス値の小さい順に評価されていって、同じキー値を持つものは上書きされていくのか。

手続きの再帰とプロセスの再帰

SICPのp.19に再帰的プロセスと再帰的手続きを混同しないようにとかいてあるのだけれど、

perl - to goto or not to goto, that's the continuation

と、そこから張られた一連のリンクを読んでいてなんとなく掴みかけてきた感じがした。

あとはコメントの、continuationってgotoの意味論研究の過程で生み出された抽象概念ですよ。っていうあたりとか。

なんでも再帰も僕の理解にお役立ち。

なんでも再帰

末尾再帰がループと同等に実行されるのは、コンパイラによるオプショナルな最適化ではない。 Schemeは、末尾呼び出しでスタックを消費しないことを言語規格上要求している。

ProductName 計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン
ピアソンエデュケーション / 4830円 ( 2000-02 )


SICPおもろい。

Catalystのマニュアルをpdfで

Journal of Yanick (3196)

Catalyst manual into a cute little pdf

200ページ以上あるヨ

TMTOWTDI

最新Pythonエクスプローラ眺めてたら、import thisって打つとpythonistaの心構えみたいなのが出てくることを知った。

>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.

...

Namespaces are one honking great idea -- let's do more of those!

ほう。で、perlでも

perl --slogan

とかで

TMTOWTDI(There's More Than One Way To Do It.)

こういう風にスローガンが出ないもんかと探してみたけど、オプションにもモジュールにも見当たらなかった。

そういえば、最近言語の設計思想とかそんなのがなんとなく感じられるようになってきた。こんなのとか今読むと、タメになるなぁとか。もちろん去年のYAPCのトークも。

WWW::MechanizeとWWW::Selenium

違いってなんだろかって思ってたんだけど。

use WWW::Mechanize

ただ一点注意で、Mech は賢いのですが JavaScript の動作はエミュレートしません。なので、Ajax 部分などクライアント側のテストには向いていません。

クライアント側の挙動のテストを行なうには、実際のブラウザのエンジンを使うのが一番でしょう。これは、Selenium というウェブアプリテストスイートがあります。

Selenium コアは JavaScript によるアプリですが、ドメインをまたげない制限を回避するソリューションとして、プロキシサーバーとして動作する Selenium RC という Java アプリも用意されています。そのプロキシサーバーに対しては各種プログラミング言語から直接テストをたたく API が用意されていますが、Perl 用も WWW::Selenium として CPAN にあります。

AjaxのテストはWWW::Seleniumでと。

TurboGearsだとSelenium4Gears ってのがあるらしい。