Jifty::Manual::Tutorial - あっという間にゼロからJifty
このチュートリアルを読めば、Jiftyではじめてのアプリケーションを構築するにあたって知っておくべきことはすべてわかるはずです。
ここでは――少なくともこのチュートリアルの執筆時点で――インストールしておくべきものを紹介します。
そんなに構えなくても大丈夫。私たちはDRY (Don't Repeat Yourself) の原則をとても大事に思っていますし、だからこそPerlやCPANを愛しているのですから。JiftyはCPANのすばらしいコードをたくさん利用しています。直接依存しているCPANパッケージは全部あわせて100にもなりましたが、そのほとんどはクロス・プラットフォームなピュアPerlパッケージですから、Perlを利用できるプラットフォームならインストールするだけでばっちり動くはずです。
それだけではありません。次から次へとライブラリをダウンロードするだけで一日が終わってしまわないよう、バンドルできるライブラリはすべてJiftyパッケージのなかにまとめるようにしています。Jiftyのインストーラはシステムに必要なモジュールを調べて一気にダウンロード、インストールできるようになっています。でも、ご心配なく。システムの構成を変更する前にはまずみなさんの確認を取るようになっていますから。
ほとんどのシステムでは、PerlにバンドルされているCPANモジュールを使えばJiftyをダウンロードしてインストールできます。
# perl -MCPAN -e'install Jifty'
Jiftyの.tar.gzをダウンロードしてきた場合は手動でインストールすることもできます。
.tar.gz
# 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というコマンドラインツールのみです(新しくつくったアプリケーションのbin/ディレクトリに入っています)。
もちろんふつうはもう少しディレクトリやファイルを用意しておいた方が作業が楽になります。Jiftyにはそのような構造を構築するツールもついてきます。
どこか、新しいJiftyアプリケーションをつくってもかまわないディレクトリに移動してください(Jiftyはサブディレクトリをつくります)。
# jifty app --name MyWeblog Creating new application MyWeblog Creating directory MyWeblog/lib Creating directory MyWeblog/lib/MyWeblog Creating directory MyWeblog/bin Creating directory MyWeblog/etc Creating directory MyWeblog/doc Creating directory MyWeblog/log Creating directory MyWeblog/var Creating directory MyWeblog/var/mason Creating directory MyWeblog/share Creating directory MyWeblog/share/po Creating directory MyWeblog/share/web Creating directory MyWeblog/share/web/templates Creating directory MyWeblog/share/web/static Creating directory MyWeblog/lib/MyWeblog/Model Creating directory MyWeblog/lib/MyWeblog/Action Creating directory MyWeblog/t Creating configuration file MyWeblog/etc/config.yml
では、ひとつひとつ見ていきましょう。
lib/はみなさんのアプリケーションのコードを入れるところです。アプリケーションはふつういくつかのクラスで構成されます。
bin/のなかにはjiftyというコマンド・ディスパッチャが入っています。特に重要なコマンドとしては、データベースのスキーマを設定したり更新したりするschemaと、スタンドアロンのウェブサーバを起動するserverがあります。jiftyにどのようなコマンドがあるか知りたい場合は次のようにタイプしてください。
schema
server
jifty help
etc/には設定ファイルが入ります。設定ファイルがない場合はJiftyが適切なデフォルト値を用意します。
いかにJiftyの魔法でもドキュメントまでは書いてはくれませんが、「みなさんが」ドキュメントを書くときはdoc/に入れてください。
JiftyはLog::Log4perlを使ってログの設定を行います。デフォルトではlogディレクトリにserver.logとerror.logというログを吐き出します。
Jiftyはサーバが走っている間はここにキャッシュファイルを保管します。このディレクトリにはいっさい手を触れる必要はありません。
Jiftyは国際化にも対応しています。翻訳("portable object templates")はshare/web/po/に入れてください。
モダンなJiftyアプリケーションのテンプレートとしてはTemplate::Declareをおすすめしていますが、HTML::Masonのテンプレートもサポートしています。Masonのテンプレートはshare/web/templates/に入れてください。Jiftyに最初からついてくるアプリケーションの「ひな形」もshare/web/templates/にインストールされます。このデフォルトアプリケーションは、基本的なアプリケーションを手っ取り早くつくるときには便利ですが、アプリケーションが進化していくにつれてカスタマイズが必要になっていくことでしょう。
PerlがどこにJiftyのデフォルト・テンプレートをインストールしたか知りたい場合は次のようにします。
perl -MJifty::Util -e 'print Jifty::Util->share_root'
ウェブ・アプリケーションが提供するコンテンツのなかには、テンプレート・エンジンを通す必要のない(あるいは「通すべきでない」)ものも少なからずあります。
そのような静的ファイルについては、share/web/static/に入れておいてください。適切な名前のテンプレートがない場合は静的ファイルがサーブされます。
また、Jiftyには最初からCSSのスタイルシート、Javascriptライブラリ、Ponyがついてきます。Jiftyディストリビューションのshare/web/staticのなか、あるいはJiftyがデフォルトテンプレートをインストールした場所をご覧ください。
アプリケーションの本当の基礎となるものはlib/MyWeblog/Modelに入っています。ここに入っているクラスはアプリケーションのデータ構造とそれらの相関関係を定義するものです。Jiftyはこのモデル・クラスを利用して必要なときにデータベースのスキーマを設定・更新します。
lib/MyWeblog/Model
Jiftyのオブジェクトモデルの詳細についてはJifty::Manual::ObjectModelをご覧ください。
アクションはモデル・クラスに対するAPIです。ある意味アクションはHTMLフォームだと思われるかもしれませんが、それをもっと一般化したものです。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/lib/MyWeblog/Model/Post.pm Writing file /tmp/MyWeblog/t/00-model-Post.t
すごいですね! これでPostというモデルができたのです(もっとも、いまのところモデルらしいことはしませんけれどね)。
お好きなエディタでlib/MyWeblog/Model/Post.pmを開いてください。
このような画面になるはずです。
use strict; use warnings; package MyWeblog::Model::Post; use Jifty::DBI::Schema; use MyWeblog::Record schema { }; # Your model-specific methods go here. 1;
では、このモデル・クラスに記事の構造を教えましょう。まずは記事にbodyとtitleを用意します(将来的にはcategoryを追加したり、categoryをtagsテーブルにアップグレードして、完全なフォークソノミー対応にする予定です)。
body
title
category
tags
カーソルを以下の行のすぐ下に移動してください。
use MyWeblog::Record schema {
以下の行を加えます。
column title => type is 'text', label is 'Title', default is 'Untitled post'; column body => type is 'text', label is 'Content', render_as 'Textarea';
モデル・クラスを保存しましょう。
これで簡単ながら動作するアプリケーションができました。jifty serverとタイプしてウェブサーバを起動して見てみましょう。
jifty server
最初に目にするのは、Jiftyはデータベースがないことに気がついたので用意します、というメッセージでしょう。Jiftyは、デフォルトではSQLiteデータベースを使ってアプリケーションをセットアップします。PostgreSQLやMySQLを使いたい場合はetc/config.ymlに多少設定を追加する必要があります(Jifty::Configにもう少し詳しい説明があります)。
# jifty server WARN - Application schema has no version in the database. WARN - Automatically creating your database. INFO - Generating SQL for application MyWeblog... INFO - Using MyWeblog::Model::Post, as it appears to be new. INFO - Using Jifty::Model::Session, as it appears to be new. INFO - Using Jifty::Model::Metadata, as it appears to be new. INFO - Set up version 0.0.1, jifty version 0.81208 INFO - You can connect to your server at http://localhost:8888/
最後の行以外はデータベースの設定についての情報です。これはJiftyがデータベースを変更したときにしか表示されません。
最後の行には、ブラウザで表示するときのURLが書いてあります。試しに見てみてください。AJAXのきいた管理UIやオンラインドキュメントブラウザ、Ponyをお見逃しなく。
プラットフォームによっては"./bin/jifty server"とタイプする必要があるかもしれません。
管理画面を使えばアプリケーションのデータを管理するのに必要なものはすべて手に入ります。エントリを追加したり更新したり削除したりもできるのですが、それではあまりウェブログらしくはありません。
まずは新しいエントリを投稿するページをつくりましょう。
エディタで新しくlib/MyWeblog/View.pmというファイルを開いて、このようにしてください。
package MyWeblog::View; use strict; use warnings; use Jifty::View::Declare -base; template post => page { title => 'Post Entry' } content { my $action = new_action(class => 'CreatePost'); form { render_action $action; form_submit(label => 'Post'); } }; 1;
「基本的な」エントリ一覧をつくるのは本当に簡単です。AJAXでページングするきれいな一覧の方はもう少し複雑ですが、ここでは両方のやり方を紹介します。お好みの方を選んでください。
lib/MyWeblog/View.pmを開いて、postテンプレートとファイル末尾の"1;"の間にこのようなコードを追加してください。
template '/' => page { # Get all posts. my $posts = MyWeblog::Model::PostCollection->new; $posts->unlimit; # Display each post in a <dl>. dl { while (my $post = $posts->next) { dt { $post->title } dd { $post->body } } } };
これでhttp://localhost:8888に行くと、すべてのエントリが迎えてくれるようになります。
http://localhost:8888
「複雑な方法」ではJiftyの上級機能のひとつである「ページ領域(Page regions)」というものを使います。領域を指定しておくと、最近の高性能なブラウザならAJAXで、lynxやw3mのように機能が限定されたブラウザでも通常のGETリクエストを使って、ページの一部だけを独立してリロードすることができます。
lynx
w3m
このアプローチの欠点は、指定する領域ごとに固有のテンプレートを用意しなければならないことです。でも、うれしいことに、これは領域の問題を抜きにしてもよいデザインの仕方といえます。
複雑な方法も、最初は簡単な方法と同じです。lib/MyWeblog/View.pmの'/'テンプレートをこのようなコードで置き換えてください(シンプルにしてしまうのが怖ければ追加しても結構です)。
template '/' => page { render_region( name => 'myweblog-posts', path => '/fragments/page_of_posts', ); };
勘のいい方ならたぶんもうおわかりでしょうが、今度はlib/MyWeblog/View.pmの中に/fragments/page_of_postsというテンプレートをつくる必要があります。このようにしてください。
/fragments/page_of_posts
template '/fragments/page_of_posts' => sub { # Retrieve the current page argument, defaulting to 1. my $page = get('page') || 1; # Get all posts. my $posts = MyWeblog::Model::PostCollection->new; $posts->unlimit; # Display up to three posts on the current page. $posts->set_page_info( current_page => $page, per_page => 3, ); # Notify the user what page they're on if there are multiple. if ($posts->pager->last_page > 1) { p { "Page $page of " . $posts->pager->last_page } } # Display the current page of posts. dl { attr { class => 'list' }; while (my $post = $posts->next) { dt { $post->title } dd { $post->body } } }; # Previous page link, the 'page' argument here will set a new value when # this region is invoked again. if ($posts->pager->previous_page) { hyperlink( label => 'Previous Page', onclick => { args => { page => $posts->pager->previous_page, }, }, ); } # Next page link. if ($posts->pager->next_page) { hyperlink( label => 'Next Page', onclick => { args => { page => $posts->pager->next_page, }, }, ); } };
さて、もう一度Jiftyのウェブサーバを起動してみましょう。ブラウザで/postを表示して、3つ以上記事を作成してみてください。トップページに戻って、AJAXの利いたNext PageとPrevious Pageというリンクがあることもチェックしましょう。Javascriptを切るか、lynxで見てみれば、AJAXが自動的にふつうのページの読み込みに変わる様子が確認できます。これだけできて無料なのですから、ありがたいことですね!
/post
Next Page
Previous Page
MyWeblog::Model::PostCollectionというクラスを見て、あれっと思われた方もいるかもしれません。PostCollection.pmというファイルは存在しないからです。JiftyはJifty::ClassLoaderを使ってさまざまなクラスを自動的に生成しています。もちろんお好みとあればこれらの定義をオーバーライドすることもできます。詳しくはJifty::ClassLoaderをご覧ください。
MyWeblog::Model::PostCollection
Jifty::ClassLoader
当然のことながら、投稿ページのURLを覚えていなければならないというのはいささか面倒なことです。メニューに「投稿」ボタンを用意するには、デフォルトのメニューをオーバーライドしなければなりません。
ここではウェブログにディスパッチャを設定しましょう。ディスパッチャは、リクエストされたURLに応じて「なにをするか」を決めるものです。「テンプレートをレンダリングする前」という規則を追加すれば追加のメニューを設定できます。
lib/MyWeblog/Dispatcher.pmというファイルを新たに開いて、この内容を貼り付けてください。
package MyWeblog::Dispatcher; use strict; use warnings; use Jifty::Dispatcher -base; before '*' => run { my $top = Jifty->web->navigation; $top->child(Home => url => '/'); $top->child(Post => url => '/post', label => 'Post Article'); }; 1;
メニューシステムの詳細はJifty::Web::Menuをご覧ください。
おおよそこれだけ知っていればJiftyアプリケーションの構築は始められるはずです。私たちもJiftyをもっと使いやすく、またこのチュートリアルの「手ごわい部分」をなくすべく鋭意努力しています。
ぜひjifty-develメーリング・リストに参加して、Jiftyをどう使っているか、使ってみて難しいとか使いづらいと思った点をお知らせください。
jifty-devel
データベースの管理について
Jifty::Manual::Models
Jiftyに何かをさせる
Jifty::Manual::Actions
ページ領域の使い方
Jifty::Manual::PageRegions
CSSとJS
Jifty::Manual::UsingCSSandJS, Jifty::Manual::JavaScript
ウェブサービス
Jifty::Manual::TutorialRestに簡単な概要があります。
継続 - 「ちょっと行ってきて」
Jifty::Manual::Continuations
アクセス管理とセキュリティ
Jifty::Manual::AccessControl
本番環境へのデプロイ
Jifty::Manual::Deploying
データベースのアップグレード
Jifty::Manual::Upgrading
一般的な作業のレシピ
Jifty::Manual::Cookbook
jiftyのコマンドラインツールにはヘルプ機能が組み込まれています。
jifty
jifty help jifty help <command>
サーバが管理者モードで実行されているときは(設定ファイルにAdminModeがない、または非ゼロになっている場合)、ブラウザで「Online Docs」をクリックすると、モジュールごとの膨大なドキュメント一覧が表示されます。
AdminMode
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_cpan.org)
ishigaki_at_cpan.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.