Catalyst::Manual::Tutorial::Basicsと同じことをTripletailを使ってやったのでその感想とか

Catalyst::Manual::Tutorial::CatalystBasics - Catalyst Tutorial - Part 2: Catalyst Application Development Basics - metacpan.org

チュートリアルの内容は、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

TripletailSQLiteサポートしてないのかな。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

続く(かも)。