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にCatalystPlaggerをインストールしようとしたら、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がリリースされていましたね。こっちも、暇をみつけていじり倒さねば。

CDBIでCOUNTするには

まぁ、いまのところ(というか二日目なので)出来るだけset_sqlを使わないゾ週間は守られていますヨ。

いまdel.icio.us.li.keを作っているのだが、あるURLを何人がブックマークしているかカウントする必要が生じた。

CDBIってcountメソッドサポートしてなさげ、ピンチ!

でも大丈夫、しのいだ。Class::DBIのPluginClass::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});

という感じで、カウントできる。

Emacs(Meadow)のTemplate Toolkit modeは便利だ

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)

== キーバインディング一覧 ==

  • C-cs
  • [% %]が挿入される。
  • C-cd
  • [% etc %]が挿入される。一番良く使うかも
  • C-ch
  • [% INCLUDE "" %]
  • C-ci
  • [% IF %][% END %] これも良く使う
  • C-cl
  • [% ELSIF %]
  • C-ce
  • [% ELSE %]
  • C-cf
  • [% FOREACH %][% END %]
  • C-cw
  • [% WHILE %][% END %]
  • C-cm
  • [% SWITCH %][% CASE %][% END %]

すごく便利で手放せなくなったゾ。

Mighty Girl - Lindstrom and Prins Thomas

軽いテケテケ感とバックで流れるピアノがメランコリック感を誘う。ディープだけどドープではなく軽い高揚感に苛まれる感じか。

MightyGirl

ビニョ-ンなシンセが途中から入ってきて、ヲヲ~!ってな具合に盛り上がる。

シスコで試聴

CDBIでORDER BYとかLIMITとか

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は使ってナイゾと。

玄庵

富士のあたりにも幾つか気になる店があるので行きますゾ。 富士ICで降りたら、139を富士宮方面へ。厚原西の交差点を右折して最初の信号を更に右折。

玄庵

外から見ると、ガチャガチャしてるのかな?と思うが、店内は照明暗めで、落ち着いてます。せいろを注文。

せいろ せいろアップ

切りと、水の切れ具合、辛汁のバランスといい好み。特に蕎麦の歯応えというか喉越しがいい。二枚目頼もうかと思ったくらい。

蕎麦湯も白濁していてうまかった。普段薬味を使わないので、蕎麦湯を飲むときに、わさびをつまみながら蕎麦湯を飲むんだけど、これって変かね?

玄庵

支那そば家 毎度!

開店すぐに行ったのに、もう埋まっているとはこれ如何に!?

毎度

醤油です、もうそれオンリーかも。

醤油

周りを見渡すと年配の夫婦とか近所の婆さんとか家族連れとか、こだわってます的なラーメン屋とは客層が異なるネ。というか、包含しているのか?

地元密着型という感じでもないんだろうが、雰囲気が馴染んでいるんだよね。まろやかです。

シンプルに旨いというラーメンだが、何をもってシンプルと定義したいのか、なんとも言えないが、、、、

隣の婆さんもスープまで飲み干してたしなぁ。

支那そば家 毎度!

Catalystのアクションの優先度

del.icio.ushttp://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のバージョン古かったせいなのか、書き方に問題あったのかナァ。来週確かめよう。