Amon2を試そう

Amon2を試そう

最近iPhoneの開発に挑戦しています。結果、異なるフレームワークに触れる事によっていろいろな発見がある事を発見。

というわけで他人のフレームワークを試そう。

とりあえずドキュメントが豊富なものを試す。今日はこれにする。

http://amon.64p.org/bbs_tutorial.html

はじめる

えい。

% cpanm Amon2                                                     [~/project]
--> Working on Amon2
Fetching http://search.cpan.org/CPAN/authors/id/T/TO/TOKUHIROM/Amon2-2.29.tar.gz ... OK
Configuring Amon2-2.29 ... OK
Building and testing Amon2-2.29 ... FAIL
! Installing Amon2 failed. See /Users/okamura/.cpanm/build.log for details.

おふ。FAILになった。最終行に書いてあるとおりログを見ましょう。

% cat /Users/okamura/.cpanm/build.log                      [~/project]
...
Error while loading DeepNamespace.psgi: Can't locate Tiffany.pm in @INC (@INC contains: /Users/okamura/.cpanm/work/1299473245.4343/Amon2-2.29/t/apps/DeepNamespace/lib /Users/okamura/.cpanm/work/1299473245.4343/Amon2-2.29/t/../lib /Users/okamura/.cpanm/work/1299473245.4343/Amon2-2.29/inc /Users/okamura/.cpanm/work/1299473245.4343/Amon2-2.29/blib/lib /Users/okamura/.cpanm/work/1299473245.4343/Amon2-2.29/blib/arch /Users/okamura/project/Shaq/lib /Users/okamura/project/Sid/lib /Users/okamura/project/CI/lib /Users/okamura/project/Acme-Porn-JP/lib /Users/okamura/project/Foxy/lib /Users/okamura/project/Groonga-Client/lib /Users/okamura/project/Test-Groonga/lib /Users/okamura/project/Shaq/lib /Users/okamura/project/Sid/lib /Users/okamura/project/CI/lib /Users/okamura/project/Acme-Porn-JP/lib /Users/okamura/project/Foxy/lib /Users/okamura/project/Groonga-Client/lib /Users/okamura/project/Test-Groonga/lib /Users/okamura/perl5/perlbrew/perls/perl-5.12.2/lib/site_perl/5.12.2/darwin-2level /Users/okamura/perl5/perlbrew/perls/perl-5.12.2/lib/site_perl/5.12.2 /Users/okamura/perl5/perlbrew/perls/perl-5.12.2/lib/5.12.2/darwin-2level /Users/okamura/perl5/perlbrew/perls/perl-5.12.2/lib/5.12.2 .) at /Users/okamura/.cpanm/work/1299473245.4343/Amon2-2.29/t/apps/DeepNamespace/lib/DeepNamespace/Web/User.pm line 4.
...

とりあえず、上記のログを発見。Tiffany.pmがみつからないらしい。
さっそくinstallしておきましょう。

% cpanm Tiffany                                                                                    [~/project]
--> Working on Tiffany
Fetching http://search.cpan.org/CPAN/authors/id/T/TO/TOKUHIROM/Tiffany-0.04.tar.gz ... OK
Configuring Tiffany-0.04 ... OK
Building and testing Tiffany-0.04 ... OK
Successfully installed Tiffany-0.04

Tiffanyって何?

インターフェースのごちゃごちゃをすっきりさせた人がいるからみんなもそれを使えばいい、という事らしい。

http://d.hatena.ne.jp/tokuhirom/20100807/1281164960

もういちどAmonをinstall

% cpanm Amon2                                                     [~/project]
--> Working on Amon2
Fetching http://search.cpan.org/CPAN/authors/id/T/TO/TOKUHIROM/Amon2-2.29.tar.gz ... OK
Configuring Amon2-2.29 ... OK
Building and testing Amon2-2.29 ... FAIL
! Installing Amon2 failed. See /Users/okamura/.cpanm/build.log for details.

あらやだ。もう一度ログを見ましょう。

% cat /Users/okamura/.cpanm/build.log
...
t/300_setup/01_minimum.t ................... ok
Complex regular subexpression recursion limit (32766) exceeded at /Users/okamura/perl5/perlbrew/perls/perl-5.12.2/lib/site_perl/5.12.2/darwin-2level/Text/Xslate/Parser.pm line 635.
Text::Xslate::Syntax::Kolon: Unknown operator '"', near print_raw, while parsing templates (<string>:16) at /Users/okamura/.cpanm/work/1299475209.5388/Amon2-2.29/blib/lib/Amon2/Setup/Flavor.pm line 58
----------------------------------------------------------------------------
 */

t/300_setup/01_minimum.t ................... ok
Complex regular subexpression recursion limit (32766) exceeded at /Users/okamura/perl5/perlbrew/perls/perl-5.12.2/lib/site_perl/5.12.2/darwin-2level/Text/Xslate/Parser.pm line 635.
Text::Xslate::Syntax::Kolon: Unknown operator '"', near print_raw, while parsing templates (<string>:16) at /Users/okamura/.cpanm/work/1299475209.5388/Amon2-2.29/blib/lib/Amon2/Setup/Flavor.pm line 58
----------------------------------------------------------------------------
 */
 ...

t/300_setup/02_basic.tがどうやらこけておるらしい。
エラーの文面からText::Xslate側の問題に見えたのでUpgradeしてみる

% cpanm Text::Xslate                                                                             
--> Working on Text::Xslate
Fetching http://search.cpan.org/CPAN/authors/id/G/GF/GFUJI/Text-Xslate-1.0012.tar.gz ... OK
Configuring Text-Xslate-1.0012 ... OK
Building and testing Text-Xslate-1.0012 ... OK
Successfully installed Text-Xslate-1.0012 (upgraded from 1.0002)

ほんでもって

% cpanm Amon2                                                                                     [~/project]
--> Working on Amon2
Fetching http://search.cpan.org/CPAN/authors/id/T/TO/TOKUHIROM/Amon2-2.29.tar.gz ... OK
Configuring Amon2-2.29 ... OK
Building and testing Amon2-2.29 ... OK
Successfully installed Amon2-2.29

OK。Text::Xslateのバージョンがいつだったのか調べておけばよかったかな?まあいいや。

ケルトンをつくろう

CPANモジュールにはlibだけでなく便利なscriptを同梱しているものが存在します。で、Amonをインストールすると次のようなコマンドがついてきます。

% which amon2-setup.pl                                                                            [~/project]
/Users/okamura/perl5/perlbrew/perls/perl-5.12.2/bin/amon2-setup.pl

PATHがとおっているので次のように実行します。

% cd ~/project
%  amon2-setup.pl --dispatcher=Lite BBS                                                           [~/project]
Unknown option: dispatcher
Usage:
        % amon-setup.pl MyApp

あ、あれ。じゃあこう?

% amon-setup.pl BBS
writing lib/BBS.pm
writing lib/BBS/Web.pm
writing tmpl/index.tt
writing BBS.psgi
writing Makefile.PL
writing t/00_compile.t
writing t/Util.pm
writing t/01_root.t
writing t/02_mech.t
writing xt/03_pod.t
mkpath: htdocs/static/img/
mkpath: htdocs/static/js/
writing lib/BBS.pm
writing lib/BBS/Web.pm
writing lib/BBS/Web/Dispatcher.pm
writing config/development.pl
writing config/test.pl
writing lib/BBS/ConfigLoader.pm
writing sql/my.sql
writing sql/sqlite3.sql
writing tmpl/index.tt
writing tmpl/include/layout.tt
writing htdocs/static/js/jquery-1.5.1.min.js
writing htdocs/static/css/blueprint/screen.css
writing htdocs/static/css/blueprint/print.css
writing htdocs/static/css/blueprint/ie.css
writing htdocs/static/css/main.css
writing t/00_compile.t
writing xt/02_perlcritic.t
writing .gitignore

プロジェクト完成。移動

% cd BBS

ということでなんにもしてないのに大分できました。省略
この仕組みをつくった人の手間は++。でも使う人の手間は--。

ありがとうございます。ごちそうさまです。

DB作成

% echo 'create table entry (                                                                  [~/project/BBS]
    entry_id INTEGER NOT NULL PRIMARY KEY,
    body varchar(255) not null
);' >> sql/sqlite3.sql 
% sqlite3 development.db < sql/sqlite3.sql

development.dbという名前にしているのはデフォルトでそういう命名規則である事を期待しているから。

% cat config/development.pl                                                                   [~/project/BBS]
+{
    'DBI' => [
        'dbi:SQLite:dbname=development.db',
        '',
        '',
        +{
            sqlite_unicode => 1,
        }
    ],
    'Text::Xslate' => +{
    },
};

動かす

% cd ~/project/BBS
% plackup BBS.psgi
HTTP::Server::PSGI: Accepting connections at http://0:5000/

hello, Amon2 world!って表示されると思います。

headerタグの記述がされつつドキュメント宣言がXHTML1.0移行型なのはCSS hackの一種?最近のCSS良く知らない。

Can't locate Amon2/Plugin/DBI.pm

マニュアル通りに進んでみてもう一度plackup

% plackup -r BBS.psgi                                                                         [~/project/BBS]
Watching ./lib BBS.psgi for file updates.
Error while loading BBS.psgi: Can't locate Amon2/Plugin/DBI.pm in @INC (@INC contains: lib extlib/lib/perl5 /Users/okamura/project/Shaq/lib /Users/okamura/project/Sid/lib /Users/okamura/project/CI/lib /Users/okamura/project/Acme-Porn-JP/lib /Users/okamura/project/Foxy/lib /Users/okamura/project/Groonga-Client/lib /Users/okamura/project/Test-Groonga/lib /Users/okamura/perl5/perlbrew/perls/perl-5.12.2/lib/site_perl/5.12.2/darwin-2level /Users/okamura/perl5/perlbrew/perls/perl-5.12.2/lib/site_perl/5.12.2 /Users/okamura/perl5/perlbrew/perls/perl-5.12.2/lib/5.12.2/darwin-2level /Users/okamura/perl5/perlbrew/perls/perl-5.12.2/lib/5.12.2 .) at /Users/okamura/perl5/perlbrew/perls/perl-5.12.2/lib/site_perl/5.12.2/Plack/Util.pm line 22.
Compilation failed in require at /Users/okamura/perl5/perlbrew/perls/perl-5.12.2/lib/5.12.2/parent.pm line 20.
BEGIN failed--compilation aborted at lib/BBS/Web.pm line 4.
Compilation failed in require at BBS.psgi line 5.
BEGIN failed--compilation aborted at BBS.psgi line 5.

おっと、 Amon2/Plugin/DBI.pmは別パーツ?

% cpanm Amon2/Plugin/DBI.pm                                                                   [~/project/BBS]
--> Working on Amon2::Plugin::DBI
Fetching http://search.cpan.org/CPAN/authors/id/T/TO/TOKUHIROM/Amon2-DBI-0.03.tar.gz ... OK
Configuring Amon2-DBI-0.03 ... OK
==> Found dependencies: SQL::Interp, DBIx::TransactionManager, Carp::Clan
--> Working on SQL::Interp
Fetching http://search.cpan.org/CPAN/authors/id/M/MA/MARKSTOS/SQL-Interp-1.10.tar.gz ... OK
Configuring SQL-Interp-1.10 ... OK
Building and testing SQL-Interp-1.10 ... OK
Successfully installed SQL-Interp-1.10
--> Working on DBIx::TransactionManager
Fetching http://search.cpan.org/CPAN/authors/id/D/DM/DMAKI/DBIx-TransactionManager-1.09.tar.gz ... OK
Configuring DBIx-TransactionManager-1.09 ... OK
Building and testing DBIx-TransactionManager-1.09 ... OK
Successfully installed DBIx-TransactionManager-1.09
--> Working on Carp::Clan
Fetching http://search.cpan.org/CPAN/authors/id/S/ST/STBEY/Carp-Clan-6.04.tar.gz ... OK
Configuring Carp-Clan-6.04 ... OK
Building and testing Carp-Clan-6.04 ... OK
Successfully installed Carp-Clan-6.04
Building and testing Amon2-DBI-0.03 ... OK
Successfully installed Amon2-DBI-0.03

もう一度再起動させる

 plackup -r BBS.psgi                                                                         [~/project/BBS]
Watching ./lib BBS.psgi for file updates.
HTTP::Server::PSGI: Accepting connections at http://0:5000/

できた。

感想

チュートリアルしかやってないのですが、ここではBBS::Web::DispatcherでWeb::Controller的な処理を済ませてしまってるのが印象的。
CLIの処理を書くのにAmon2::Plugin::*はいっぱい参考になるところがある予感。

つぎはRuby on Railsとか他の言語も試してみよう。