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-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にどのようなコマンドがある か知りたい場合は次のようにタイプしてください。
schema
server
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はこのモデル・クラスを利用して必要なときに データベースのスキーマを設定・更新します。
lib/アプリケーション名/Model
先ほどは「モデル」と「アクション」さえ気にかけていればいいと言 いましたが、それは真実の一面でしかありません。たしかにJiftyは 「モデル」となるデータベースに対する基本的なやりとり(CREATE、 READ、UPDATE、DELETE) をする「アクション」を用意してくれるの ですが、なにがしかの変更を加えたければ、変更すべきものはここに あります。
CREATE、 READ、UPDATE、DELETE
Jiftyはアプリケーションの土台を一式用意しますが、まだあらゆる テストを用意することまではできません(もっとも、生成したモデル ・クラスに対する簡単なテストは用意します)。
このチュートリアル・アプリケーションの名前がMyWebLogである ことからも想像がつくかと思いますが、ここでは例題として簡単なウ ェブログ・アプリケーションをとりあげます。今後のチュートリアル では、認証、コメント、RSSやAtomフィードの機能を追加する予定です。
ウェブログの中心はふつう記事です。だから、当然最初につくるモデ ルはpostになります。
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テーブルにアップグレードして完全なフォーク ソノミー対応にする予定です)。
body
title
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::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をサイトの「デフォルト」ページとしてくれるはずです)、この ようにしてください。
/index.html
<%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リクエスト を使って、ページの一部だけを独立してリロードすることが できるのです。
lynx
w3m
このアプローチの欠点は、指定する領域ごとに固有の「部品」ファイ ルを用意しなければならないことです。
複雑な方法も、最初は簡単な方法とほとんど同じです。テキスト・エ ディタで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を表示して、記事を作成してみてください。
/post
当然のことながら、投稿ページのURLを覚えていなければならないと いうのはいささか面倒なことです。ただし、メニューに「投稿」ボタ ンを用意するには、デフォルトのメニューをオーバーライドしなけれ ばなりません。
Jiftyの「デフォルト」メニューは(Ponyともども)アプリケーショ ンのデフォルト・テンプレートのなかの_elements/navにあります。 さしあたっては、_elements/navをオーバーライドしましょう(こ こは改善中です)。
アプリケーションのweb/templatesディレクトリのなかに、 _elementsというディレクトリをつくります。
_elementsディレクトリのなかにテキスト・エディタでnavとい う新規ファイルをつくり、以下を挿入してください。
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
jifty-devel@lists.jifty.orgではJiftyをどのように構築するか、 何に困っているか等が話し合われています。
メーリング・リストに参加したい方は jifty-devel-subscribe@lists.jifty.orgにメールを送ってください。
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/
ishigaki_at_tcool.org
To install Jifty, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Jifty
CPAN shell
perl -MCPAN -e shell install Jifty
For more information on module installation, please visit the detailed CPAN module installation guide.