Helper::Lighttpd #4
MIME::Types
が入ってたらそっからがーって mimetype.assign をはくようにした。
てけとう。
でも、mime-typeが指定されてなくて困るのは、FirefoxでCSSが適用されないってぐらいな気がするというかそんな感じなのでとりあえずこれで。
Helper::Lighttpd #3
-d
オプションもつけた。-Debug
してなくてもデバッグ出力できるやつ。まぁserver.pl
と同じ。
$ ./script/myapp_lighttpd.pl -l /usr/sbin/lighttpd -d
2006-09-09 15:45:39: (log.c.75) server started
[debug] Debug messages enabled
[debug] Loaded plugins:
.----------------------------------------------------------------------------.
| Catalyst::Plugin::ConfigLoader 0.13 |
| Catalyst::Plugin::Static::Simple 0.14 |
'----------------------------------------------------------------------------'
[debug] Loaded dispatcher "Catalyst::Dispatcher"
[debug] Loaded engine "Catalyst::Engine::FastCGI"
[debug] Found home "/home/typester/tmp/MyApp"
[debug] Loaded Config "/home/typester/tmp/MyApp/myapp.yml"
[debug] Loaded components:
.-----------------------------------------------------------------+----------.
| Class | Type |
+-----------------------------------------------------------------+----------+
| MyApp::Controller::Root | instance |
'-----------------------------------------------------------------+----------'
[debug] Loaded Private actions:
.----------------------+--------------------------------------+--------------.
| Private | Class | Method |
+----------------------+--------------------------------------+--------------+
| /default | MyApp::Controller::Root | default |
| /end | MyApp::Controller::Root | end |
'----------------------+--------------------------------------+--------------'
[info] MyApp powered by Catalyst 5.7001
Yes! YEs!
あとは静的ファイルの mime-types をちゃんとサポートすれば、server.plいらない気がする。
perl -d するとき以外は。
Helper::Lighttpd #2
昨日のやつ、
このパッチ当てないとうまく動かんよ、って書くの忘れてた。
あと、myapp_lighttpd.pl に -p オプションつけるとlighttpdの設定を標準出力に出すようにしてみた。
これで、lighttpd.confで
include_shell "/path/to/myapp_lighttpd.pl -p -approot /myapp/"
とか書くだけで設定完了みたいな。
まだオプション足りなくて設定きめうちで微妙だけど、なんかいいアイデアな気がする。
Catalyst::Helper::Lighttpd
とか作った。
http://svn.unknownplace.org/public/library/perl/trunk/Catalyst-Helper-Lighttpd/
これいれると、
./script/myapp_create.pl Lighttpd
でscriptディレクトリにmyapp_lighttpd.plができる。これがlighty使ったテストサーバー。
lighttpdにPath通ってれば
./script/myapp_lighttpd.pl
叩くだけでOK。デフォポートは3000。他オプションは-h
で。
FastCGIでテストサーバーしたい!
$ CATALYST_DEBUG=1 ./script/myapp_fastcgi.pl -l :3001 [debug] Debug messages enabled [debug] Loaded plugins: .----------------------------------------------------------------------------. | Catalyst::Plugin::ConfigLoader 0.13 | | Catalyst::Plugin::Static::Simple 0.14 | '----------------------------------------------------------------------------'
[debug] Loaded dispatcher "Catalyst::Dispatcher"
[debug] Loaded engine "Catalyst::Engine::FastCGI"
[debug] Found home "/home/typester/tmp/MyApp"
[debug] Loaded Config "/home/typester/tmp/MyApp/myapp.yml"
[debug] Loaded components:
.-----------------------------------------------------------------+----------.
| Class | Type |
+-----------------------------------------------------------------+----------+
| MyApp::Controller::Root | instance |
'-----------------------------------------------------------------+----------'
[debug] Loaded Private actions:
.----------------------+--------------------------------------+--------------.
| Private | Class | Method |
+----------------------+--------------------------------------+--------------+
| /default | MyApp::Controller::Root | default |
| /end | MyApp::Controller::Root | end |
'----------------------+--------------------------------------+--------------'
[info] MyApp powered by Catalyst 5.7001
FastCGI: manager (pid 3003): initialized
FastCGI: server (pid 3004): initialized
FastCGI: manager (pid 3003): server (pid 3004) started
こんな感じで、CatalystのFastCGIプロセスをDebugモードでかつデーモンじゃなく起動して、組み込みのテストサーバー代わりにしたいのだけど、上記以降の出力は全部lighttpdのログのほうに吐き出されてしまうのでびみょい。
なんとかなんないかなぁと、田中さんに相談中。
Chained
Chainedアクションを使って、/ユーザー名/...
だとそのユーザーのエントリを表示。
/...
だと全員のエントリを表示するアプリケーションの例。
最後にはてなっぽく /ユーザー名/profile
もつけてある。
package MyApp::Controller::UserView;
use strict;
use warnings;
use base 'Catalyst::Controller';
sub user_detect :Chained('/') :PathPart('') :CaptureArgs(1) {
my ($self, $c, $user) = @_;
$c->stash->{user} = $c->model('DBIC::User')->find({ username => $user })
or $c->detach('/default');
}
sub user_root :Chained('user_detect') :PathPart('') :Args(0) {
my ($self, $c) = @_;
$c->forward('/view/index');
}
sub user_tag :Chained('user_detect') :PathPart('tag') :Args(1) {
my ($self, $c, $tags) = @_;
$c->forward('/view/tag');
}
sub user_year :Chained('user_detect') :PathPart('') :Args(1) {
my ($self, $c, $year) = @_;
$c->forward('/view/year');
}
sub user_month :Chained('user_detect') :PathPart('') :Args(2) {
my ($self, $c, $year, $month) = @_;
$c->forward('/view/month');
}
sub user_day :Chained('user_detect') :PathPart('') :Args(3) {
my ($self, $c, $year, $month, $day) = @_;
$c->forward('/view/day');
}
sub user_permalink :Chained('user_detect') :PathPart('') :Args(4) {
my ($self, $c, $year, $month, $day, $id) = @_;
$c->forward('/view/permalink');
}
sub user_profile :Chained('user_detect') :PathPart('profile') :Args(0) {
my ($self, $c) = @_;
$c->stash->{template} = 'user/profile.tt';
}
1;
うーん、微妙w
:Chained('/') :PathPart('')
はあんまりやらないほうがよさげ。
Chainedアクションを覚えた
便利ねー。これで Plugin::Flavour の半分はいらなくなったから削ってシンプルにしようかと思う。
CaptureArgsやArgsをRegexで指定できたらもっとあついなぁ。
引数の数は同じだけど振り分けられる的な。
SubRequest #2
今のCatalystだとうまく動かんね。localまくってるところに
local $c->{action};
local $c->{namespace};
追加いりそう。あんまり見てないんですが。
Catalyst::Plugin::SubRequest
初めてソース見たけど、いいじゃんこれ。
なぜか名前から連想で内部でLWP::UserAgent
とかもってて普通にHTTPアクセスしてるとか勝手に思い込んでたけど、そうじゃなかった。
食わず嫌いはよくないなぁ。
自分自身が提供してるAPIを使う場合とかかなり便利そう。
my $json = $c->subreq('/json/blahapi');
Simple tip for text parsers with Catalyst
for my $parser (qw/Markdown Textile Trac Hatena/) {
__PACKAGE__->plugin( lc $parser, "Text::$parser" );
}
__PACKAGE__->textile->charset('utf-8');
とかで一括セットアップ。
$c->trac->parse($text)
とか使える。