β1の公開2006/07/08(土)Satsuki-system技術情報adiary2::内部構造Satsuki-systemの文法等はこちら参照はてな技術者のnaoyaさんのPerl技術記事見てたんですがadiary関連の技術情報=マニュアルも本格的にまとめ始めたほうかいいなぁーと思ったりしたりしました。数日中にもβ版公開しましすが、ソースみただけではわからないところが多々ありますし。比較的短期間かつ少人数(一人か)でこれだけのシステムになったのかってのは訳があって、生産性を担保するシステム構成によるところがとても大きいのです。Satsukiシステム自体も、adiary開発の過程で大きく進化したわけですが、基本コンセプトは何ら変わっていません。Toolkitの比較スケルトンシステムというのは何度も申し上げているとおりで、Perlの変数埋め込みを一歩進めて簡単な命令を書けるようにしたものです。Toolkitがあります。Toolkitは変数置換の他、簡単な条件構文やループなどをHTMLテンプレート中に記述できます。Toolkitでは読み込まれたHTMLファイルを、Perlで実行可能なプログラムとしてテンポラリに吐き出します。次以降は、そのコンパイルされたファイルを実行するわけです(mod_perlのときはキャッシュされるのかな?)。Satsuki-systemも紆余曲折の上、現在はその形に落ち着いています。Toolkitは決定的に違うところがあります。Toolkitのキャッシュはperlプログラムとして実行することでそのまま出力HTMLが得られますが、Satsuki-systemのそれは、そのまま実行することは不可能なプログラムになっています。Satsuki-system本体とコンパイル済のプログラムの2つが合わさって初めて意味を持つわけです。なんだ「使いにくいだけじゃないか......」と言われるかもしれませんが、実はそこが最大のミソなのです。Satsuki-systemはスケルトンシステムでありフレームワークでもあります。スケルトンシステムから参照する必要なルーチン(ライブラリ)は、システム本体に納められており、そのライブラリ部分を自由に拡張できることこそが最大の特徴です。以下はスケルトンのコメント表示部分を抜き出したものです。t2.tm)>)</span></p>強調表示のところが埋め込みです。大半はただの変数置換だと思って問題ありません。関数呼び出しとなっていて、この実体はSatsuki-system本体(Base.pm)に含まれます。この関数に相当するものを増やしていくことで、システム全体を構築します。Toolkitキットでは「Perlプログラムの付属品としてのHTMLテンプレート」であったわけですが、Satsuki-systemでは「スケルトン(HTML)の付属品がPerlプログラム」なのです。厳密にはちと違いますSatsuki-systemとPHPの比較そこまで、スケルトン万歳ならはじめからPHPみたいな埋め込み言語を使えばいいじゃないかという話になります。PHPは使ったことはないのですが、一つそして決定的にPHPを使いたくない理由があります。プログラムとHTMLのソースが一緒になっててメンテしずらい。書かれた(?)PHPのソースならばそうはならないのかもしれませんが、1画面=1HTML=1プログラム主義のように感じます。いうわけで、もちろんSatsuki-systemだって同じだろうというツッコミもあります。adiaryの日記一覧のような部分は、実際にHTML内にPHPのようにプログラム的動作を記述してページ送りなどを実装していますから、同じといえば同じです。それは推奨される形ではなく、ほとんどの場合1ページに対して1つのPerlのサブルーチンが付属しています。RoRのモデル・ビュー・コントローラー的な考えからいえば、Viewがスケルトンで、ControllerがPerlのコードということになります。PHPとの大きな違いはここですが、PHPのプログラム部を外部ファイルとして追い出したとしたら(本体には呼び出しのみ残る)、似たようなものだと思います。比較も何も......似たもの同士です*4。これは別にRoR的思想を取り込んだわけではなくて、Satsuki-systemの「変数埋め込みHTMLの拡張」を突き進めた結果、似たようなものにたどり着いたというわけです*5。最初の思想からMVCなRoRとはスタート地点で負けているわけですが、そこを敢えて比較するとSatsuki-systemはPerl用である。YARVが登場すると立場逆転しそうです(汗RoRの方が思想的にOO(オブジェクト指向)として綺麗である。そもそもPerlのOOはやっつけなので、これもスタート地点で負けてます。今この時点においては、Perlの方が速く動作する。*6Perlの方が普及してるし、ユーザーも多い*7必ずしも「データ(データベース)」対応でなくてもよい分、Satsuki-systemの方が汎用的かもしれない。(prefork/worker)でもcgiでもSatuki-systemが差を吸収してくれる(ただし若干気を遣って書く必要はあり)ですけども。簡単なフレームワークスクリプトを後々作成するといいかなぁ。午後8時07分MTで使われているのはHTML::Templateぢゃないかな。単なるTemplateですか......。ソースみたことないですけど、たしかにそうかも。