Catalyst::Manual::Tutorial::Basicsと同じことをTripletailを使ってやったのでその感想とか
チュートリアルの内容は、Catalystのプロジェクトを自動生成して、SQLiteにデータベースを作って、DBIx::Classを使ったモデルクラスを作って、コントローラを作って、Template-Toolkitを使ったビュークラスを作るというもの。ほとんどが自動生成。テスト用サーバーもあるしラクチン。実際にかかった時間も少ない。で、このチュートリアルはもっと続いていくんだけど、ふと思い立ったのでTripletailを使って同等のものを作ってみました。
動いてるもの
Catalyst
http://takatoshi.dyndns.org/misc/myapp/basics/myapp.cgi/books/list/
Tripletail
http://takatoshi.dyndns.org/misc/tlapp/basics/books.cgi?cmd=list
両方ともCGIで動かしてます。Tripletailの方はデバッグモードで動かしてるのでポップアップウィンドウが出ると思います。
ソース
Catalyst
http://svn.takatoshi.dyndns.org/public/misc/MyApp/tags/catalyst_basics/
Tripletail
http://svn.takatoshi.dyndns.org/public/misc/TLApp/tags/tripletail_basics/
Catalystではほとんどのソースをヘルパースクリプトが作ってくれるけどTripletailではほとんど手書きです。実装方法はいろいろあるだろうけど、とりあえずCGIファイルにべた書きするのはやめておきました。テストとか書いてめんどくさいやり方にしました。
-
- -
あといろいろ感想とか。
Template
CSSで色を指定するのにテーブルを作ってて「おっ」と思いました。
[% site.rgb = { black = '#000000' white = '#ffffff' grey1 = '#46494c' grey2 = '#c6c9cc' grey3 = '#e3e6ea' red = '#CC4444' green = '#66AA66' blue = '#89b8df' orange = '#f08900' }; site.col = { page = site.rgb.white text = site.rgb.grey1 head = site.rgb.grey3 line = site.rgb.orange message = site.rgb.green error = site.rgb.red }; %]
こうしておいて、CSSでは、
background-color: [% site.col.head %];
こうやる。CSSのidやclassではフォローできない部分をこれで補っている感じでしょうか?
あと、Tripletail::Templateはロジックをテンプレートに書くことができないし、オブジェクトやハッシュを参照することもできないので、ループとか値の展開とかは全部自前で書く必要があります。
これに対応するテンプレートが、
<table> <tr><th>Title</th><th>Rating</th><th>Author(s)</th></tr> [% FOREACH book IN books -%] <tr> <td>[% book.title %]</td> <td>[% book.rating %]</td> <td> [% tt_authors = []; unused = tt_authors.push(author.last_name) FOREACH author = book.authors %] ([% tt_authors.size %]) [% tt_authors.join(', ') %] </td> </tr> [% END -%] </table>
Tripletailではこうなり、
<table> <tr><th>Title</th><th>Rating</th><th>Author(s)</th></tr> <!begin:books> <tr> <td><&title></td> <td><&rating></td> <td><&authors></td> </tr> <!end:books> </table>
さらにループを回して値を展開するコードがこんな感じになります。
foreach my $book (@$books) { # array ref -> string. my $authors = delete $book->{authors}; $book->{authors} = sprintf('(%d) %s', scalar(@$authors), join q{, }, map { $_->{last_name} } @$authors ); $content->node('books')->add($book); }
デバッグとか
Catalystにはテストサーバーが付いているので、ローカル環境でサーバーがなくても実際に動かしてブラウザから確認することができていいよねーみたいな感じです。アクセスがあるとコンソールにデバッグメッセージみたいのも出るしいいよネーみたいな感じです。
$ export DBIX_CLASS_STORAGE_DBI_DEBUG=1
こんなことしておくと発行したSQLまで表示されていいよネーみたいな感じです。
カッコいい。
けど、なくてもだいじょうぶ。開発用サーバーとかvmwareとかcolinuxとかのLinuxで開発すればいいし。Tripletailはデバッグモードにするとポップアップウィンドウにデバッグ情報をどっさりと出力してくれるし。発行したSQLも見れるし。
CGIじゃない場合
Catalystはキホンmod_perlで、scriptディレクトリにFastCGIスクリプトとかCGIスクリプトとか付いてるのでそれを使用する。
Tripletailでは、CGIを単にFastCGIスクリプトとして起動してやればいい。こんな感じで。
AddHander fastcgi-script .cgi
あとは実行モードを勝手に判断して動いてくれる。
ログ
Tripletailはiniファイルで指定したディレクトリにログをはいてくれる。currentっていうシンボリックリンクが便利げなんだけどパスが間違ってます。
|-- error | |-- 200611 | | |-- 03-17.log | | `-- 03-18.log | `-- current -> error/200611/03-18.log
Tripletail.pmの以下のソース。
my $path = $this->{logdir} . '/' . sprintf('%04d%02d/%02d-%02d.log', @localtime[5,4,3,2]); (中略) my $cur_linkfile = File::Spec->catfile($this->{logdir}, "current"); unlink($cur_linkfile); symlink($path, $cur_linkfile);
バグ?
パッチの作り方とか知らないので作れません。
追記(2006/11/08):0.20で修正されました。
Tripletail-0.20 - Tripletail, Framework for Japanese Web Application - metacpan.org
エラーメール
Tripletailはiniファイルで指定しておくとエラーをメールで通知してくれるんだけど、LogError(権限がなくてログを書き込めなかったとか)だけタイトルが違う。
他のは
Tripletail: Error:
で始まるんだけど、LogErrorのときは
TL LogError
で始まる。
O/Rマッピング
Tripletail::DBはDBIのラッパーで、O/Rマッピングとかはしないので、SQLを発行するコードは自分で書く必要があります。今回はDAOクラスを自前で書きました(テストも書きながら)。今回一番時間を使ったのがこれで、記述量が一気に増えました。
DB
TripletailはSQLiteサポートしてないのかな。MySQLを使いました。
-
- -
バージョンはCatalystが5.7003、Tripletailが0.19を使用しました。
Catalyst-Runtime-5.7003 - Catalyst Runtime version - metacpan.org
Tripletail-0.19 - Tripletail, Framework for Japanese Web Application - metacpan.org
続く(かも)。