ひだなん

ARAIで滑ればいつものように、ホテルのお風呂でマッタリしてから、ひだなんで蕎麦食って帰る。ARAIの風呂は結構とるだけあって、タオルもついてるし、ミストサウナ(キモチイイ)もあるしで、リフレッシュ度は高い。

ひだなんでは、天ざる。

天ざる 天ざる

水のきりがあまかったせいで、ちょっと水っぽかったのと、天ぷらに(ついているだろうと勝手に)期待していたふきのとうがなかったので、ちょっとガックシ。蕨はついてたけど。

店の外で売ってたキノコがうまそうだったのでなやんだが結局買わず。代わりに松代PAで雪ノ下ほうれん草買った。

今週末ははなと一緒に蕨でも摘みにいくかな。

ひだなん

Factory Method ( デザパタPerl )

Factory Methodはちゃんと理解するのにちょっと時間がかかった。

  • インスタンスの生成がTemplate Methodで抽象化されている
  • つまりインスタンス化をサブクラスに任せる

というところがポイントだが、ここの部分は抽象メソッドでなくても、デフォルトのメソッドを用意してもいいし、エラー吐くようにしてもいいらしい。ココなど詳しいが、

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

クライアントで利用する主人公であるところのインスタンスの生成ロジックを Factory の中に抽象化してやって、具体的な new によるインスタンス生成の束縛からクラスを解放してやりましょう、ということになります。

つまり、コンストラクトするメソッドを適当な方法で実際のクラスと切り離すという理解でいいのかな。

CPAN探してみたらClass::Factory というモジュールを見つけたので、これを使ってデザパタ本のサンプルを書いてみた。

まず、FactoryクラスはClass::Factoryを使うので特に書く必要はない(モジュールのインストールだけ)。で、IDCardFactoryクラスはこんな風に書くだけでラクチン。

package IDCardFactory;
use strict;
use base qw(Class::Factory);

__PACKAGE__->register_factory_type( IDCard => 'IDCard' );

1;

Productクラスもサンプルの通り、何はともあれuse出来るもの

package Product;
use strict;

sub use { die; }

1;

で、実際のプロダクトの生成メソッドはinitなのでここをちょっと書く(といってもサンプルのnewとほとんど変わらんが)

package IDCard;
use strict;
use base qw(Product);

sub init {
    my ( $self, $owner) = @_;
    $self->{owner} = $owner;
    print "$self->{owner}のカードを作ります。\n";
    return $self;
}

sub use {
    my $self = shift;
    print "$self->{owner}のカードを使います。\n";
}

sub getowner {
    my $self = shift;
    return $self->{owner};
}

1;

さてメイン

#!/usr/bin/perl
BEGIN { unshift(@INC, "./"); }

use strict;
use IDCardFactory;

my $card1 = IDCardFactory->new('IDCard','kzfm');
my $card2 = IDCardFactory->new('IDCard','愛犬はな');
my $card3 = IDCardFactory->new('IDCard','U隊長');
my $card4 = IDCardFactory->new('IDCard','新入りゆき');

$card1->use;
$card2->use;
$card3->use;
$card4->use;

で、実行結果

$./main.pl 
kzfmのカードを作ります。
愛犬はなのカードを作ります。
U隊長のカードを作ります。
新入りゆきのカードを作ります。
kzfmのカードを使います。
愛犬はなのカードを使います。
U隊長のカードを使います。
新入りゆきのカードを使います。

これだと、ファクトリーのインスタンスが作られないのがサンプルと違うとこかな。あとはClass::Factoryのメソッドregister_factory_typeで幾つかのプロダクトを登録できるので、IDCardFactoryではなくてCardFactoryにして、VISA,Master,Nojima,Kojima,Yamadaカードみたいに複数のカードを登録しとくのが正しい使い方なのかな。

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

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


閉まる電車に飛び乗ったら女性専用車両だった!

大阪-新大阪の一駅だけだったけど、結構耐えがたい雰囲気だったね!

っていうか3両目って微妙な位置じゃないか?今度から無意味に飛び乗るのやめよう。

ん?!、、、

これもまた、JRの陰謀なのか(飛び乗り防止の為の)

もしかして常識?

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吉祥寺)っていうラーメン屋も出来てた。

吉祥

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

海老ワンタン(塩)

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