MojoliciousのControllerをDumpしてみたらbefore_dispathとかもうあからさまにhookなものを見つけてしまった。調べてみたらちゃんとドキュメントにも書いてあった…。ということで、デフォルトのstashに何かを突っ込むのは、以下のようにも書けた。
package MyApp; use Mojo::Base 'Mojoicious'; use DateTime; sub startup { my $self = shift; $self->hook( before_dispatch => sub { shift->stash( now => DateTime->now ); }); my $r = $self->routes; $r->route('/:controller/:action')->to('default#default'); } 1;
コード的にもほとんど変わらないけれど、こっちのほうが素直な感じがする。
要するに now => DateTime->now をstashに設定しておきたい話。デフォルトのテンプレートエンジン(Mojo::Template)を使っている場合は、helperに設定すればいいだけなのだが、Text::Xslateを使っているときは、どうもそうは行かないらしい。
dispatchやrenderをオーバーライトしてしまおうかとも考えたが、そこまでしなくてもなんとかなる。
package MyApp; use Mojo::Base 'Mojolicious'; use DateTime; sub startup { my $self = shift; my $r = $self->routes; $r = $r->under( sub { shift->stash( now => DateTime->now ) } ); $r->route('/:controller/:action')->to('default#default'); } 1;
チュートリアルに認証の例があるが、それを全体に適用している。underは新しいroutesを返すので、そこに対してルールを設定する。
リクエストごとに更新して欲しいので、下記ではうまく行かないらしい。
# :
$self->defaults( now => DateTime->now );
# :
helperに入れるだけ。
# :
$self->helper( now => sub { DateTime->now } );
# :
<%= now->ymd %>
hookも見つけたので次のエントリに書いた。hookのほうが素直な感じがする…。
render_jsonで日本語を使いたくて、別にutf8で出てるんだから良いっちゃ良いんだけど、何となくJavaScript-UCSに変換したくなる件。
なんかもっと良い方法がありそうでならないんだけど…。
つまるところ最大の問題点は、「結局Mojoliciousのコード読んだから上記のコードが書ける」って話で、まぁ薄いフレームワークなんてモノはコードが簡単に読めるから良いんだと思うけれど、何かこう釈然としない。
Photoshop Elements 10の試用版を入れようと思ったら、Case sensitiveなファイルシステムではダメと言われた。8の時も同様だったのであきらめたのだけれど、10でもダメらしい。確かLightroomでは大丈夫だったので、新バージョンは期待していたのだけれど、とても残念。これからもPixelmatorで頑張る。
とはいえ、PSEであれば、Pixelmatorでもだいぶ追いついてきたと思う。起動は速いし、文句は無い。
小さな子たちの学習過程を見ていると、後付けの学習努力は、本来備わっている学習アルゴリズムに太刀打ち出来るのだろうかという点について疑問に思う。まぁ、とはいえ、この歳になってしまったら他に方法は無いのだけれど。
いや、本当に無いのだろうか。そもそも、「本来備わっている学習アルゴリズム」は、別に消去されるようなものではなく、一定の手順で活用可能なのでは無いだろうか。
# 忙しいので余計なことを考えている件について
良ーく考えてみると、なんか能力的には衰えたりはせず、あまり変わらないのではという気もしてきた。
赤ん坊は最初言語を喋れないが、徐々に学習した後1〜2年後に喋れるようになる。これは凄い事のようだが、じゃあ大人を、言葉の分からない国に1〜2年くらい放り込んでおけば、まぁおそらく喋れるようになっているだろう。もちろん、赤ん坊はほとんどゼロベース、大人はそうではない、という違いはあるけれど、どちらにしても凄い事ではあって、大きく見たら大差はない気がする。
# と数ヶ月後に追記してみる。忙しいので。
開発中なので、ちゃんとしたスキーマ定義は省略したい(変わりそうだし)のだけれど、いちおうモデルクラスは作りたくて、プロダクトでもモデルクラスだけ直せば大丈夫と言うことがやりたい。
http://search.cpan.org/perldoc/Teng::Schema::Loaderの例は、スクリプト一本で何とかするときに使えそうだが、モデルクラスは定義しつつLoaderも使うというような、中間辺りをやりたい。
ついでに*_atのinflate/deflateを仕込みたい。
use My::Model; my $m = My::Model->new; my $item = $m->single( 'table', { id => 1 } );