前回の続きです。
どうも、のほほんとWin32 + Strawberry Perl環境で試した所為か、前回のスクリプトでアクションキャッシュが初回生成出来ない場合があることに気が付きました。
また、/css/*.cssなどのファイルを読めていないことも気が付きました。
さらに、$c->uri_forの問題もまだ追えていません。
なんだかもうちょっとArkの中身を見る必要がありそうですが、ともあれ、CGIで試すときの気をつける点などを合わせてどうぞ。
最初に模範解答を:Arc Document Browser
そもそも、よくサンプルアプリケーションのArk Document Browserを見てみると、ちゃんと/script/arkdoc.cgiにCGI版スクリプトがありました。なので基本的にはその通りではあるのですが、いくつか気をつける点もあります。
アクションキャッシュを作れない
症状
Win32環境だからかそれとも私の環境がおかしいからなのか、アプリケーションルートに作られるアクションキャッシュファイル(/action.cache)を作れずに死ぬという、怪しげな問題があります。
というのも、一旦アクションキャッシュを消してCGI実行すると、$app->setup_minimal内で読んでいる、アクションキャッシュを作るメソッドArk::Core::setup_storeで、Storable::storeの書き込みに失敗してしまうのです。
Apacheの稼働ユーザーがアプリケーションルートディレクトリにキャッシュファイルaction.cacheを書き込む権限がないと当然のことながら死にますが、適切に権限を与えても、以下のようなエラーが出ます。
Can't store CODE items at blib\lib\Storable.pm (autosplit into blib\lib\auto\Storable\_store.al) line 264, at D:/strawberry/perl/site/lib/Ark/Core.pm line 266
余談ですが、Arkのデフォルトログ出力先は標準エラー出力なので、分からなかったら素直にevalで括るかコマンドラインで直接perl ./bin/amikeco_cgi.plするのが良いでしょう。
環境についてもうちょっとちゃんと記すと、
- Windows XP Professional SP3
- Strawberry Perl 5.10.0.5
- Apache 2.2.11 (for Win32)
- Ark 0.001000_002 (と、2009/06/29の夕方にコミットされた分)
- Mouse 0.25
- Any::Moose 0.09 (と、0.10も然り)
それと、use Any::Moose;でMooseが呼ばれないことを確認しているので不要とは思いますが、念のため掲げると
- Class::MOP 0.84
- Moose 0.79
という環境です。
取り敢えずの暫定回避策
閑話休題、悪いのはこちらの環境なのだろうと思うのですが、一番最初にsetup_minimalを動かしたのがCGIスクリプトでないというケチも付けられるので、何が悪いのかすぐには追えません。ということで、エラーメッセージに従ってStorableのドキュメントを読んで、以下のように回避しました。
{
no warnings 'once';
local $Storable::Deparse = 1; # Storable対策
$app->setup_minimal;
}
です。
静的ファイルを読めていない
$mw->install('HTTP::Engine::Middleware::Static' => {
docroot => $app->path_to('root'),
regexp => '/(?:(?:css|js|img|images?|swf|static|tmp|)/.*|[^/]+\.[^/]+)',
});
などとして静的ファイルを指定しています。Ark内部で処理可能な/root/*.mtなどのテンプレートファイルは問題なく読めていますが、一旦ページを作成した後、ユーザーエージェントから(Apacheを介して)読みに行く/root/css/*.cssなどのファイルが読めないという問題が分かりました。
これは$c->uri_for('/css/foobar.css')としたときに/bin/amikeco_cgi.bin/css/foobar.cssを返すのが直接の理由なので、$c->uri_for問題が解決すれば自動的に解決するとは思う......と書いていて気が付きましたが、httpd.confなり.htaccessの指定と衝突してもいました。うっかりぽん。
....
RewriteEngine On
# RewriteCond %{REQUEST_URI} !^/?bin/amikeco_cgi.pl
RewriteCond %{REQUEST_URI} !^/?(bin/amikeco_cgi.pl|css/|js/) # and so on
RewriteRule ^(.*)$ /bin/amikeco_cgi.pl/$1 [PT,L]
....
などとして、Arkに食われないようにしておく必要がありますね。
$c->uri_forについては、Win32が悪いのか、私の環境やが悪いのか、私の使い方がそもそも間違っているのか、もうちょっと調べてみようと思います。症状とエラーメッセージから類推して、Cwd関係のFile::Spec::Win32辺りに原因があるような気がしています。
その他
模範解答との差異はまだあります。
use FindBin::lib instead of FindBin
FindBin::libは、標準モジュールではありませんが、
use FindBin;
use lib $FindBin::RealBin . '../lib'; # /bin/myapp_cgi.plに対する/lib/を指定
を
use FindBin::lib; # 上に同じ
と書けます。この方が移植性に優れているので、FindBin:libをCPANからインストール出来る環境なら(そもそもArkをインストール出来る環境なら、当然出来るはずですが)、こちらを試した方が良かったですね。
HTTP::Middleware::Staticの要否
Ark Document Browserによると、ServerSimpe(組み込みサーバー)とCGIで、HTTP::Middlewareの使用に差異があります。間違いなくArk Document Browserの方が正しいので、上記の静的ファイルが読めない問題と合わせて、最適解を調べてみることにします。
全体を通して......use UNIX instead of Win32
まあ、Win32環境で試すのが悪いのは明白で、素直にUNIX系環境で試せよ、という話ですね。
取り敢えず気軽に試せるように(VMWare or VirtualPC) + (Ubuntu or Debian)辺りの環境を、普段使いの環境に用意しておくことにします。
コメントする