Jifty::Manual::Tutorial - あっという間にゼロからJifty
このチュートリアルを読めば、Jiftyではじめてのアプリケーションを構築するにあたって知っておくべきことはすべてわかるはずです。
ここでは――少なくともこのチュートリアルの執筆時点で――インストールしておくべきものを紹介します。
そんなに構えなくても大丈夫。私たちはDRY (Don't Repeat Yourself) の原則をとても大事に思っていますし、だからこそPerlやCPANを愛しているのですから。JiftyはCPANのすばらしいコードをたくさん利用しています。直接依存しているCPANパッケージは全部あわせて60にもなりましたが、そのほとんどはクロス・プラットフォームなピュアPerlパッケージですから、Perlを利用できるプラットフォームならインストールするだけでばっちり動くはずです。
それだけではありません。次から次へとライブラリをダウンロードするだけで一日が終わってしまわないよう、バンドルできるライブラリはすべてJiftyパッケージのなかにまとめるようにしています。運がよければ、(Perlのデータベース・インタフェースやJiftyがデフォルトで利用する組み込みSQLiteのように)実際にOSにあわせてコンパイルしなければならないトリッキーなライブラリをいくつかインストールするだけですみます。
http://download.jifty.org/pub/jifty/から完全版をダウンロードするのでも、CPANからインストールするのでも結構ですが、CPANから「スリム」版を入手する場合は、依存パッケージは自分でインストールする必要があります(その場合でもできる限り簡単にインストールできるようにはしてありますが)。すぐに始めたいのであれば、以下のURLからどうぞ。
http://download.jifty.org/pub/jifty/
いずれにしても、インストールの手順は同じです。
# tar xzvf jifty-<version>.tgz # cd jifty-<version> # perl Makefile.PL # make # make test # make install
テストが通らないようでしたら、お話を聞きたいので、jifty-devel@lists.jifty.orgに参加して失敗したことを報告してください(メーリング・リストへの参加方法については以下の「困ったときは」をご覧ください)。
Jiftyをうまくインストールできたら、準備完了。はじめてのアプリケーションをつくってみましょう。
Jiftyはわざと少々ミニマリスト的につくってあります。アプリケーションを走らせるにあたって、「本当に」必要なのはjiftyというコマンドラインツールのみなのです(新しくつくったアプリケーションのbin/ディレクトリに入っています)。
もちろん往々にしてもう少し仕掛けを用意しておいた方が作業は楽になるものですから、そのような仕掛けを構築するツールも用意してあります。
どこか、新しいJiftyアプリケーションをつくってもかまわないディレクトリに移動してください(Jiftyはサブディレクトリをつくります)。
# jifty app --name MyWeblog Can't guess application root from current path (/your/current/directory) or bin path (/usr/bin) Creating new application MyWebLog Creating directory lib Creating directory lib/MyWebLog Creating directory bin Creating directory etc Creating directory doc Creating directory log Creating directory web Creating directory web/templates Creating directory web/static Creating directory lib/MyWebLog/Model Creating directory lib/MyWebLog/Action Creating directory t Creating configuration file MyWeblog/etc/config.yml
では、ひとつひとつ見ていきましょう。
bin/のなかにはjiftyというコマンド・ディスパッチャが入っています。特に重要なコマンドとしては、データベースのスキーマを設定したり更新したりするschemaと、スタンドアロンのウェブサーバを起動するserverがあります。jiftyにどのようなコマンドがあるか知りたい場合は次のようにタイプしてください。
jifty help
etc/には設定ファイルが入ります。設定ファイルがない場合はJiftyが適切なデフォルト値を用意します。
Jiftyの魔法もドキュメントまでは書いてはくれませんが、「みなさんが」ドキュメントを書くときはdoc/に入れてください。
JiftyはLog::Log4perlを使ってログの設定を行います。デフォルトではlogディレクトリにserver.logとerror.logというログを吐き出します。
JiftyはHTML::Masonをメインのテンプレート・システムとしています。アプリケーションのテンプレートはweb/templates/に入れてください。Jiftyには最初からアプリケーションの「スケルトン」が用意されています(share/web/templates/にインストールされています)。このデフォルト・アプリケーションは、基本的なアプリケーションを急いで準備したいときには便利です。ただし、もっと複雑なアプリケーションを構築するときにはなにがしかのカスタマイズを行う必要があるでしょう。
PerlがどこにJiftyのデフォルト・テンプレートをインストールしたか知りたい場合は次のようにします。
perl -MJifty::Util -e 'print Jifty::Util->share_root'
ウェブ・アプリケーションが提供する「素材」のなかには、テンプレート・エンジンを通す必要のない(あるいは「通すべきでない」)ものも少なからずあります。
そのような静的ファイルについては、web/static/に入れておいてください。 適切な名前のテンプレートが見つからない場合はそこからサーブされます。
また、Jiftyには最初からCSSのスタイルシート、Javascriptライブラリ、Ponyも用意されています。/usr/local/share/jifty/web/staticのなかをご覧ください。
Jiftyのオブジェクト・モデルの詳細についてはJifty::Manual::ObjectModelをご覧ください。
基本的なJiftyアプリケーションを構築するだけなら、気にかける必要があるのは「モデル」と「アクション」という二種類のクラスのみです。
アプリケーションの本当の基礎となるものはlib/アプリケーション名/Modelに入っています。ここに入っているクラスはアプリケーションのデータ構造とそれらの相関関係を定義するものです。Jiftyはこのモデル・クラスを利用して必要なときにデータベースのスキーマを設定・更新します。
先ほどは「モデル」と「アクション」さえ気にかけていればいいと言いましたが、それは真実の一面でしかありません。たしかにJiftyは「モデル」となるデータベースに対する基本的なやりとり(CREATE、READ、UPDATE、DELETE) をする「アクション」を用意してくれるのですが、なにがしかの変更を加えたければ、変更すべきものはここにあります。
Jiftyはアプリケーションの土台を一式用意しますが、まだあらゆるテストを用意することまではできません(もっとも、生成したモデル・クラスに対する簡単なテストは用意します)。
このチュートリアル・アプリケーションの名前がMyWebLogであることからも想像がつくかと思いますが、ここでは例題として簡単なウェブログ・アプリケーションをとりあげます。今後のチュートリアルでは、認証、コメント、RSSやAtomフィードの機能を追加する予定です。
ウェブログの中心はふつう記事です。だから、当然最初につくるモデルはpostになります。
# cd MyWeblog # jifty model --name Post Writing file /tmp/MyWeblog/t/00-model-Post.t Writing file /tmp/MyWeblog/lib/MyWeblog/Model/Post.pm
すごいですね! これでPostというモデルができたのです(もっとも、いまのところモデルらしいことはしませんけれどね)。
お好きなエディタでlib/MyWeblog/Model/Post.pmを開いてください。
このような画面になるはずです。
package MyWeblog::Model::Post::Schema; use Jifty::DBI::Schema; # Your column definitions go here. See L<Jifty::DBI::Schema> for # documentation about how to write column definitions. package MyWeblog::Model::Post; use base qw/MyWeblog::Record/; # Your model-specific methods go here. 1;
では、このモデル・クラスに記事の構造を教えましょう。まずは記事にbodyとtitle、categoryを用意します(将来的にはこのcategoryをtagsテーブルにアップグレードして完全なフォークソノミー対応にする予定です)。
カーソルを以下の行のすぐ下に移動してください。
# Your column definitions go here. See L<Jifty::DBI::Schema> for # documentation about how to write column definitions.
以下の行を加えます。
column title =>
type is 'text',
label is 'Title',
default is 'Untitled post';
column body =>
type is 'text',
label is 'Content',
render_as 'Textarea';
モデル・クラスを保存しましょう。
OK。今度はMyWeblogのデータベースを初期化します。デフォルトではSQLiteデータベース・エンジンを使うようにセットアップされますので、PostgreSQLやMySQLを使いたい場合は、etc/jifty.ymlに何行か付け足す必要があります(Jifty::Configにもう少し詳しい説明があります)。
# jifty schema --setup INFO - Generating SQL for application MyWeblog... INFO - Using MyWeblog::Model::Post INFO - Using Jifty::Model::Schema INFO - Set up version v0.0.1
OK。これで簡単ながら動作するアプリケーションができました。ウェブサーバを起動して見てみましょう。AJAXのきいた管理UIやオンライン・ドキュメント・ブラウザ、Ponyを確かめてみてください。
# ./bin/jifty server INFO - You can connect to your server at http://localhost:8888/
管理画面を使えばアプリケーションのデータを管理するのに必要なものはすべて手に入りますが、それではあまりウェブログらしくはありません。
新しいエントリを投稿するページをつくりましょう。
# cd web/templates/
postという新規ファイルをテキスト・エディタで開いて、このようにしてください。
<%init>
my $action = Jifty->web->new_action(class =>'CreatePost');
</%init>
<&|/_elements/wrapper, title => "Post to your weblog" &>
<% Jifty->web->form->start() %>
<% Jifty->web->form->next_page( url => '/') %>
<% $action->form_field('title') %>
<% $action->form_field('body') %>
<% Jifty->web->form->submit( label => 'Post' ) %>
<% Jifty->web->form->end() %>
</&>
「基本的な」エントリ一覧をつくるのは本当に簡単です。AJAXでページングするきれいな一覧の方はもう少し複雑ですが、ここでは両方のやり方を紹介します。お好みの方を選んでください。
web/templatesディレクトリでindex.htmlという新規ファイルをテキスト・エディタで開き(ウェブサーバは/index.htmlというURLをサイトの「デフォルト」ページとしてくれるはずです)、このようにしてください。
<%init>
my $posts = MyWeblog::Model::PostCollection->new();
$posts->unlimit();
</%init>
<&|/_elements/wrapper, title => Jifty->config->framework('ApplicationName') &>
<dl>
% while (my $post = $posts->next) {
<dt><%$post->title%></dt>
<dd><%$post->body%></dd>
% }
</dl>
</&>
「複雑な方法」ではJiftyの上級機能のひとつである「ページ領域(Page regions)」というものを使います。領域を指定しておくと、最近の高性能ブラウザならAJAXで、lynxやw3m、携帯電話のブラウザのように機能が限定されたブラウザでも通常のGETリクエストを使って、ページの一部だけを独立してリロードすることができるのです。
このアプローチの欠点は、指定する領域ごとに固有の「部品」ファイルを用意しなければならないことです。
複雑な方法も、最初は簡単な方法とほとんど同じです。テキスト・エディタでweb/templates/index.htmlという新規ファイルを開いて、以下のように書き込んでください。
<&|/_elements/wrapper, title => Jifty->config->framework('ApplicationName') &>
<% Jifty->web->region(name => "myweblog-posts",
path => "/fragments/page_of_posts") %>
</&>
勘のいい方ならたぶんもうおわかりでしょうが、今度はweb/templates/fragments/page_of_postsというファイルをつくって、以下のようにする必要があります。
<%args>
$page => 1
</%args>
<%init>
my $posts = MyWeblog::Model::PostCollection->new();
$posts->unlimit();
$posts->set_page_info( current_page => $page,
per_page => 25
);
$m->out("No items found.") if ($posts->pager->total_entries == 0);
</%init>
% if ($posts->pager->last_page > 1) {
Page <% $page %> of <% $posts->pager->last_page %>
% }
<dl class="list">
% while (my $post = $posts->next) {
<dt><%$post->title%></dt>
<dd><%$post->body%></dd>
% }
</dl>
% if ($posts->pager->previous_page) {
<% Jifty->web->link( label => "Previous Page", onclick => { args => { page => $posts->pager->previous_page } } ) %>
% }
% if ($posts->pager->next_page) {
<% Jifty->web->link( label => "Next Page", onclick => { args => { page => $posts->pager->next_page } } ) %>
% }
さて、もう一度Jiftyのウェブサーバを起動してみましょう。ブラウザで/postを表示して、記事を作成してみてください。
当然のことながら、投稿ページのURLを覚えていなければならないというのはいささか面倒なことです。ただし、メニューに「投稿」ボタンを用意するには、デフォルトのメニューをオーバーライドしなければなりません。
Jiftyの「デフォルト」メニューは(Ponyともども)アプリケーションのデフォルト・テンプレートのなかの_elements/navにあります。さしあたっては、_elements/navをオーバーライドしましょう(ここは改善中です)。
アプリケーションのweb/templatesディレクトリのなかに、_elementsというディレクトリをつくります。
_elementsディレクトリのなかにテキスト・エディタでnavという新規ファイルをつくり、以下を挿入してください。
<%init>
my $top = Jifty->web->navigation;
$top->child( Home => url => "/");
$top->child( Post => url => "/post",
label => "Post Article");
</%init>
メニュー・システムについての詳細はJifty::Web::Menuをご覧ください。
おおよそこれだけ知っていればJiftyアプリケーションの構築は始められるはずです。私たちもJiftyをもっと使いやすく、またこのチュートリアルの「手強い部分」をなくすべく鋭意努力しています。
ぜひjifty-develメーリング・リストに参加して、Jiftyをどう使っているか、使ってみて難しいとか使いづらいと思った点をお知らせください。
jifty-devel@lists.jifty.orgではJiftyをどのように構築するか、何に困っているか等が話し合われています。
メーリング・リストに参加したい方はjifty-devel-subscribe@lists.jifty.orgにメールを送ってください。
wikiもあります!(というか、このwikiがJiftyのメイン・サイトなのです)
http://jifty.org/に来て、書き込みしてみてください。
このwikiは、WiftyというJiftyベースのwikiで運用されています。ソースコードはjiftyのsubversionリポジトリから自由に入手可能です。
Jiftyは信じられないほど初期の段階にありますので、バグが見つかったらjifty-devel@lists.jifty.orgに報告してください。
将来的には以下のチュートリアルが予定されています。
石垣憲一(ishigaki_at_tcool.org) http://www.tcool.org/