Jifty > Jifty::Manual::Tutorial

題名

Jifty::Manual::Tutorial - あっという間にゼロからJifty

説明

このチュートリアルを読めば、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

bin/のなかにはjiftyというコマンド・ディスパッチャが入っています。特に重要なコマンドとしては、データベースのスキーマを設定したり更新したりするschemaと、スタンドアロンのウェブサーバを起動するserverがあります。jiftyにどのようなコマンドがあるか知りたい場合は次のようにタイプしてください。

    jifty help
etc

etc/には設定ファイルが入ります。設定ファイルがない場合はJiftyが適切なデフォルト値を用意します。

doc

Jiftyの魔法もドキュメントまでは書いてはくれませんが、「みなさんが」ドキュメントを書くときはdoc/に入れてください。

log

JiftyはLog::Log4perlを使ってログの設定を行います。デフォルトではlogディレクトリにserver.logerror.logというログを吐き出します。

web/templates

JiftyはHTML::Masonをメインのテンプレート・システムとしています。アプリケーションのテンプレートはweb/templates/に入れてください。Jiftyには最初からアプリケーションの「スケルトン」が用意されています(share/web/templates/にインストールされています)。このデフォルト・アプリケーションは、基本的なアプリケーションを急いで準備したいときには便利です。ただし、もっと複雑なアプリケーションを構築するときにはなにがしかのカスタマイズを行う必要があるでしょう。

PerlがどこにJiftyのデフォルト・テンプレートをインストールしたか知りたい場合は次のようにします。

  perl -MJifty::Util -e 'print Jifty::Util->share_root'
web/static

ウェブ・アプリケーションが提供する「素材」のなかには、テンプレート・エンジンを通す必要のない(あるいは「通すべきでない」)ものも少なからずあります。

そのような静的ファイルについては、web/static/に入れておいてください。 適切な名前のテンプレートが見つからない場合はそこからサーブされます。

また、Jiftyには最初からCSSのスタイルシート、Javascriptライブラリ、Ponyも用意されています。/usr/local/share/jifty/web/staticのなかをご覧ください。

lib/MyWebLog

Jiftyのオブジェクト・モデルの詳細についてはJifty::Manual::ObjectModelをご覧ください。

基本的なJiftyアプリケーションを構築するだけなら、気にかける必要があるのは「モデル」と「アクション」という二種類のクラスのみです。

lib/MyWebLog/Model

アプリケーションの本当の基礎となるものはlib/アプリケーション名/Modelに入っています。ここに入っているクラスはアプリケーションのデータ構造とそれらの相関関係を定義するものです。Jiftyはこのモデル・クラスを利用して必要なときにデータベースのスキーマを設定・更新します。

lib/MyWebLog/Action

先ほどは「モデル」と「アクション」さえ気にかけていればいいと言いましたが、それは真実の一面でしかありません。たしかにJiftyは「モデル」となるデータベースに対する基本的なやりとり(CREATE、READ、UPDATE、DELETE) をする「アクション」を用意してくれるのですが、なにがしかの変更を加えたければ、変更すべきものはここにあります。

t

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;

では、このモデル・クラスに記事の構造を教えましょう。まずは記事にbodytitlecategoryを用意します(将来的にはこのcategorytagsテーブルにアップグレードして完全なフォークソノミー対応にする予定です)。

カーソルを以下の行のすぐ下に移動してください。

  # 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

Jiftyのアプリケーション・サーバを起動する

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で、lynxw3m、携帯電話のブラウザのように機能が限定されたブラウザでも通常の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もあります!(というか、この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/