Catalystのアクションの優先度(2)

Catalystのアクションの優先度でまたもはまったのでメモ。

最上位のコントローラー(要するにcatalyst.plでつくられる)にRegexでアクションを定義すると、script/xxxx_create.pl controller test とかでlib/Controllerの下に作成したtest.pmのデフォルトよりも優先されてしまう。

例えば

lib/Test.pm

sub Regex : Regex('^(¥w+)$'){ my ( $self, $c ) = @_; # Hello World $c->response->body($c->req->snippets->[0]); }

lib/Test/Controller/priv.pm

sub default : Private { my ( $self, $c ) = @_; $c->response->body( "Test::Controller::priv" ); }

とかやっておいて、/privにアクセスするとRegexが実行されてしまう。

色々悩んだ挙句、

sub priv : Path('/priv'){ my ( $self, $c ) = @_; $c->response->body( "Test::Controller::priv" ); }

みたいに、Pathでルートからの位置を指定して優先度をあげることで解決。せっかくControllerで別にしてるんだから、

コントローラー内のデフォルトはコントローラー内ではデフォルトの動作をしてほしいナァ

Regexに持ってかれちゃったりすると気持ち悪いなぁと思ったり。

あと試行錯誤してて気づいたんだけど最上位のコントローラーでLocalRegexを指定すると何にもマッチしないようなんだけどこの認識であってるのかな?

Template Method ( デザパタPerl )

naoyaのはてなダイアリー - prototype.js でデザインパターン - Template Method

Iterator と Adapter では interface に相当するものは省略してきましたが、今回は抽象クラスをちゃんと用意します。JavaScript での interface みたいなものは Perl とかと一緒で実質意味を持ちませんが、抽象クラスなら実装がスーパークラスにちょこっとあるので意味があります。

Perlのコードだと、これのことか。

sub display {
    my $self = shift;
    $self->open;
    for my $i (0..4) {
        $self->print;
    }
    $self->close;
}

なるほど。そうすると抽象クラスでopen,print,closeメソッドでdieしておくことに意味があるのかも。でも、javaにはあるfinal修飾子がperlにはないから、オーバーライドされてしまうという危険性は残るよなぁ。

このエントリは結城浩さんの本と、それに載っているサンプルをPerlで書いた例をみながら考えたことをメモってます。あとは、はてなの伊藤さんのjavascriptでの例も参考にしてます。 間違いの指摘とか、もっといいやり方教授してくれたらとても嬉しいゾ。

ProductName 増補改訂版Java言語で学ぶデザインパターン入門
結城 浩
ソフトバンククリエイティブ / 3990円 ( 2004-06-19 )


ウェブ進化論

昨日の大阪出張帰りに買って、そのまま読破。

いっつも、梅田 望夫さんのblog見てたから新鮮な部分はあんまなかったけど、自分の中で色々整理するいい機会にはなった。

製薬系もオープンソースな影響はもろに受けてるし、そういう流れを歓迎する向きもあるヨ。僕もweb2.0な風をふきこんじゃるみたいないきおいで、pubmed用del.icio.usクローン(通称publ.icio.us)を作って、啓蒙中だったりするけど、みんなの知を束ねる必要のあるところは多かれ少なかれ影響を受けているんじゃないかと思うよ。

で、製薬系の中の人として僕がうっかり感じたことを書きなぐり。

  • ケモインフォって便利な言葉だ

特にバイオインフォがオープンソースよりで、従来あったコンピューターケミストリーがケモインフォとか呼ばれることで、オープンソースに引っ張られやすくなっている気がする。で、化合物をいじるためのツールはdaylightとか買わないといけなかったのがPerlMolとかChemrubyとか色々面白いツールは増えてきてるのでいい感じ。特にオープンなケミカルデータは結構増えたので、家で色々試すのに困らなくなった。のと、チープ革命みたいなのはものすごくあって、ケミカルDBのデファクトとして君臨してたあそこが、読み違えたっぽいあたりが印象的。あとは企業が金をつぎ込むのが知をどうするかみたいなツールにシフトしてるかなぁという感じ。

  • ケモインフォとかバイオインフォとかどこで学べばいいの?

なんて聞かれて返答に困ることが多くなった。仕事を通して覚えたいんですとか言われても、、、、みたいな。基本的な事柄はいくらでも学ぶ機会は用意されているしな。アッセイキットとか試薬とかが必要ないぶん、インフォマティクスに限らず、量子化学計算とか統計とかの習得のための障壁は恐ろしく低くなっているような気がする。結局やる気だけなのかも。

教えなきゃわからんやつは教えてもわからん

という状況が真なのかどうなのかはわからないけど、学習するために必要な情報を自分でうまく探し当てることの出来る能力が要求されることはものすごく増えた気がするヨ。

OJTの希薄化なのか、OJTで伝えることそれ自体の陳腐化なのかわからんが、高速道路論を肌身で感じ取れるかどうかはものすごく大きい気はするヨなぁ。

僕も職場は実践オンリーです。現実の問題を解析したりとか議論したりとか。だから、ほとんどコードは書かないヨ。コードは家で書いて、職場では家のsubversionからcoしたのを走らすだけになりつつある。論文も直で仕事と関係あるようなのは職場で読むけど、技術それ自体を指向するようなものは、家で読むことが多い。そういうものに限ってopen accessだったりするし。

うわ、すんげー面白いとかめっちゃクールやんけみたいな新鮮な感覚は、職場からは得られなくなったなぁと思う今日この頃でした。

でも、僕は、最初から意識が高い集団が勝ち逃げできるような未来は描いてなくて、(レガシーな考えの人はある程度淘汰されるにしても、)結局はみんなの意識はweb2.0チックにゆっくりとシフトはするんじゃないかナァと思うんだよね。

取り残されるというよりは、気づかぬうちに引っ張りあげられている

みたいな。というより、そういう貢献をしてみたいなぁというささやかな願望(というか趣味)。

がんがら堂

新大阪駅で。

前回、さいごく路に行ったのでがんがら堂

がんがら堂 ラーメン

ラーメン(硬め)でたのんだら、麺がダマになっていてちょっとがっかり。チャーシューもボソボソしてたし。替え玉する気もおこらんかった。もうちっと麺がしゃきっとしてくれたらなあ。

楼蘭

大阪出張だというのに、忙しくて当日まで何も予定をたてられなか たので、行きの新幹線の中で少しピックアップして行ったのが楼蘭

楼蘭 楼蘭

柚子塩+味玉

柚子はおろしてるので香りがいいが、麺やわめ。麺担当のにいちゃんの、深ざるに菜箸当てて

シャカシャカ振るスタイルが気になった(4,5回だし)。

スープがあっさりしていて普通にうまかった。湯葉のってたけど、インパクトうすい。むしろエグミのある葉っぱのっけたほうが。

Class::DBI::Pager

Catalystでページ処理をしたいということで、Class::DBI::Pagerを使ってみたヨ。

my $pager = CD->pager(20, 1); # ($items_per_page, $current_page)

という感じで書いとけば、あとはよきにはからってくれる。

新しい順に取り出したいときなんかはORDER BY入れたいが、そんなときはこんな感じで。

sub default : Private {
 my ( $self, $c ) = @_;
 $c->stash->{page} = $c->request->param('page');
 my $pager = Publicious::Model::CDBI::Items->pager(
 $c->config->{items_per_page},$c->stash->{page} ||1);

$c->stash->{it} = $pager->retrieve_from_sql(
                      qq( 1 ORDER BY id DESC));

$c->forward('display');
}

search_likeとかもいける。あとでソースをきちんと読んでみよう。

麺屋 吉祥

麺屋 吉祥が、道の駅あらいに移転したみたいなので、夜はココで。あと、よしきゅう(from吉祥寺)っていうラーメン屋も出来てた。

吉祥

海老ワンタン麺(塩)を注文

海老ワンタン(塩)

煮干の香りのするスープに中太の縮れ麺。油がちと多めでくどかったが、スープはなかなか。でも、麺はちょっと柔かったかな。

DateTimeでフォーマット変換

DateTime->todayとかDateTime->nowを知った。今までシコシコ書いてたヨ。しかもDateTime::Format::MySQLでmysqlのDatetime型に変換してくれるので快適

use DateTime; use DateTime::Format::MySQL; my $today = DateTime->now; print DateTime::Format::MySQL->format_datetime($today);

Catalystをmod_perlで使う

Catalystで幾つか書いたし、そろそろ組み込みテストサーバじゃなくてmod_perl触ってみたい!という欲求が。

バイオインフォとかケモインフォ関連でmod_perlで動かさなきゃならんプログラムなんてまずないので、初mod_perlですヨ。以前から気にはなっていたので、RPMなんかは入れていつでも試せる状況にしていたのだけど、、、FC1のmod_perl-1.99はうまく動作しなかった。というわけで、ソースからコンパイルして入れなおした。ちなみに職場のFC2のmod_perlも動かなかったので同様に処理した。

mod_perlのサイトから自分のApacheに対応した最新版(mod_perl-2.0-current.tar.gz)をダウンロード。

tar xvfz してperl Makefile.PLするとapxsの場所をたずねてくるので

/usr/sbin/apxs

あとはmake,make test,makeinstallでOK

で、早速Catalystのコードをmod_perlで動かしてみたんだけど、

リロードするたびに、notfoundとCatalystの画面が交互に出るよ

なぜ?Apacheの設定が悪いのかナァ。とりあえず、動かすのやめて終了。あとでApacheの設定を見直しする。

それから、Practical mod_perlの全文がpdfで公開されているので、読んできちんと理解しよう。

R4にCatalystとPlaggerをインストール

R4のColinuxにCatalystとPlaggerをインストールしようとしたら、Test::Treeあたりで、Weak referencesのエラーが出るので、perlのバージョンあげることにした。

といってもdebなパッケージの作り方良くわからんので、素直にソースからインストール。perl5.8.8のインストール完了。

で、改めてPerlモジュール突っ込み開始(4時間ほど)。途中Expatで躓いたが、libexpat-devでもlibexpat-develでもなく

apt-get install libexpat1-dev

だった。紛らわしい。

PerlMolもこれで動くようになったはず(確認してないけど)。Chemネタ的にはChemrubyも1.0.0がリリースされていましたね。こっちも、暇をみつけていじり倒さねば。