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);
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触ってみたい!という欲求が。
バイオインフォとかケモインフォ関連で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の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がリリースされていましたね。こっちも、暇をみつけていじり倒さねば。
まぁ、いまのところ(というか二日目なので)出来るだけset_sqlを使わないゾ週間は守られていますヨ。
いまdel.icio.us.li.keを作っているのだが、あるURLを何人がブックマークしているかカウントする必要が生じた。
CDBIってcountメソッドサポートしてなさげ、ピンチ!
でも大丈夫、しのいだ。Class::DBIのPluginにClass::DBI::Plugin::AbstractCountってのがあったからな。
catalystのModelに
use Class::DBI::Plugin::AbstractCount;
といれたら、あとは
$c->stash->{itemlist}->[$i]->{sub_users} = Publicious::Model::CDBI::Items->count_search_where( { pubmedid => $col->pubmedid});
という感じで、カウントできる。
Clouder::Blogger: html-tt - emacsのTemplate Toolkit用のmode
自作のemacsでPerlモジュールのTemplate Toolkitの文法を使うためのモードです。これはマイナーモードになっていて、html-helper-modeと一緒に使うようになっています。こちらからダウンロードできます。
Meadowで使うにはファイルを解凍後、html-tt.elをSite-lispフォルダに放り込む。その後.emacsの設定。僕は拡張子にttをつけることが多いので、ttもこのモードで開くようにちょっと追加してます。
;;tt (autoload 'html-helper-mode "html-helper-mode" "Yay HTML" t) (setq auto-mode-alist (cons '("\\.html$" . html-helper-mode) auto-mode-alist)) (setq auto-mode-alist (cons '("\\.tt$" . html-helper-mode) auto-mode-alist)) (require 'html-tt) (add-hook 'html-helper-mode-hook 'html-tt-load-hook)
== キーバインディング一覧 ==
すごく便利で手放せなくなったゾ。
06032006 music
軽いテケテケ感とバックで流れるピアノがメランコリック感を誘う。ディープだけどドープではなく軽い高揚感に苛まれる感じか。
ビニョ-ンなシンセが途中から入ってきて、ヲヲ~!ってな具合に盛り上がる。
06032006 Catalyst
CDBI使っていると、ORDER BYとかLIMITとか副問い合わせなんかで、ついつい安易なset_sqlに走りがちになったりしませんか?
僕はなるヨ。
コレじゃいかんというわけで、今週を出来るだけset_sqlを使わないゾ週間に認定した。
で、ORDER BYに関しては、search のあたりに書いてあるようにorder_byというキーのハッシュを加えてやればいいらしい。
じゃぁ、DESCはどうすればいいんじゃと思ったら、後ろにつければいいみたい
{order_by => 'id DESC'}
みたいに。
ん、もしや文字列連結か?LIMITもそのまま後ろにつければOKなんではなかろうか?
OKだった。
$c->stash->{itemlist} = Publicious::Model::CDBI::Items->search_like( tags => '%test%', uid =>$c->stash->{uname}, {order_by => 'id DESC LIMIT 10'});
こんなんでバチッと動きました。
でも、こんなんやるなら素直にsql書いたほうがいいのかな?
$c->stash->{itemlist} = Publicious::Model::CDBI::Items->retrieve_from_sql( qq( 1 ORDER BY id DESC LIMIT 10) );
set_sqlは使ってナイゾと。
04032006 Catalyst
del.icio.usはhttp://del.icio.us/ユーザー名でそのユーザー名のブックマークを表示できるようになっているが、その他にpostとかtagとかユーザー名以外の情報も存在してます。
そんなわけで、ユーザー名(pathの第一引数?)みて処理を分ける必要がある。
CatalystはPath,Regex.TopLevelというアクションがサポートされていて、
普通PathのほうがRegexより優先度高いだろという認識でコード書いたら、うまく動かなかった、というか職場で使っていたCatalystはRegexのほうが優先度が高かったので、結局Regexのサブルーチンの中でユーザー名が"tag"とか"post"だったらそういう処理にforwardするみたいな条件分岐を書いたのだ。
なんかif文ぐりぐり地獄になっちゃった。
納得いかないので、家のCatalyst(5.65)で次のコードを書いて確認してみた。
sub default : Private { # Private
my ( $self, $c ) = @_;
$c->response->body( $c->welcome_message );
}
sub tag : Path('tag') { # Path
my ( $self, $c ) = @_;
$c->response->body( "Taggggg" );
}
sub pop_path : Path('popular') { # Path
my ( $self, $c ) = @_;
$c->response->body( "Popular" );
}
sub popular : Global {# Top Level
my ( $self, $c ) = @_;
$c->response->body( "!top level!" );
}
sub user : Regex('^(\w+)$') { # Regex
my ( $self, $c ) = @_;
my $user = $c->req->snippets->[0];
$c->response->body( "Tag list: $user" );
}
結果は
TopLevel > Path > Regex > Default
と納得のいく優先度が得られたヨ。職場のCatalystのバージョン古かったせいなのか、書き方に問題あったのかナァ。来週確かめよう。