新しいblogに移行しました

新ブログ "All Yout Bugs Are Belong To Ass" に移行しました!

ラベル Catalyst の投稿を表示しています。 すべての投稿を表示
ラベル Catalyst の投稿を表示しています。 すべての投稿を表示

2010-07-08

[Perl]Catalystのフィルタプラグインを書く

フィルタプラグイン

ここで云う「フィルタプラグイン」ってのは、従来の出力結果を書き換えるプラグインのことです。まんまですね。
で、肝となるのは以下3点。

1. Pluginなのでuse Moose::Role
2. フィルタなのでfinalizeで色々するけど、基本はoverride finalize
3. finalizeは$c->next::method( @_ )をreturnする

例えば、水を汁に置き換える

但し、body内のデータはUTF-8であることが前提です。
package WaterToJuice;
use Moose::Role;

override finalize => sub {
    my $c = shift;
    $c->res->{ body } =~ s/水/汁/g;
    return $c->next::method( @_ );
};

1;
__END__

2010-06-28

[Perl]Catalystアプリ配下のロジックを叩きたい

逃げ口上


この記事は、所謂「モダンperl」とは全くもって相反するものと思われます。しかしながら、ユースケースとして記録しておくこと自体に意義の有ることと判断し、ここに掲載する次第です。
この手法を使わざるを得ない時は、設計がぐちゃぐちゃな状態であるか、単に「モダンな」設計ではないものと思われます。今一度、よく設計を見直すことを考慮すべきでしょう。


…この記事があるということは、現に僕自身がぐちゃぐちゃな設計で作ったcatalystアプリケーションを世に出してしまい、そのためにこんな妙な解決策 - バッドノウハウ - を使う必要に迫られたのだということです。これについては、過去の自分を叱咤するとともに、現在の自分の糧とすべしと肝に命じております。
無論、この方法自体はバッドノウハウとはいえ、より研ぎ澄ませば、まさに「モダンな」ノウハウとなり得るものかもしれませんが、僕自身にはそのようなユースケースは思いつきませんでした。

バッドノウハウ?上等!

さて、逃げ口上はこの辺にしときます。色々とキリがないので^^;

このノウハウ自体は、えらくあっさりとしたものです。
例えば、バッチスクリプト./script/batch.plで、アプリケーションMyApp配下のパス/ugly/batch_targetを、引数付きで定期的に叩きたい場合。
./script/batch.plは以下のようになります。
use warnings;
use strict;
use MyApp;
use Catalyst::Stats;
my $app = MyApp->new( stats => Catayst::Stats->new );
my $res = $app->forward( '/ugly/batch_target', [ time() ] );
print $res;

これだけです。あとはこのスクリプトをcronに食わせるなりするだけで、定期的に/ugly/batch_targetをぶっ叩いてくれます。
ちなみに、今回は引数をtime()としました。あくまでサンプルなので。
ポイントは、Catalyst::StatsオブジェクトをMyApp->statsに食わせる所です。

なぜ僕はこの方法を「モダン」じゃないと主張するのか

さっきから勿体ぶった書き方をしてきましたが、そもそもこの方法が「モダン」ではないと僕が主張するのは、

ロジックとコントローラの分離が為されていない故のノウハウである

という、香箱を組む猫すら青ざめる(?)、えらく間接的な理由からです。
コントローラ配下のロジックを叩くということはつまり、「コントローラ」配下に「ロジック」が実装されていることに他ならない。これはこのあたりのスライドにもあるように、コントローラをぐちゃぐちゃにする最短ルートといえます。

2010-06-14

[Perl]最速セットアップ案内 Catalyst on Starman

さすがにタイトルの「最速」は言い過ぎ感たっぷりなんですが、僕でもそのくらい安直にセットアップができたという事です。
ちなみに僕はPlack/PSGIをまともに触ったことがありません。「バカでもわかるPlack/PSGI - JPerl Advent Calendar 2009」を読んで、
「へえ、そういうものがあるんだねえ(棒読み)」
などと曰う程度にしか知らないという状態です。
まあでも今のところ、オレオレWAFをこさえるつもりなど毛頭ありません。
よって、この辺は概念だけ知ってれば良いかな、と高を括っている訳です。

前提条件

これ以降は以下のソフトウェアがインストール済みである前提で書いていきます。

また、既にCatalyst 5.8.xに対応したCatalystアプリが用意できているものとします。
もしなければ、今すぐ作って下さい。NOW!!
# catalyst.pl YellowCat
以降、このCatalystアプリの事をYellowCatと呼びます。

モジュールのインストール

cpanmで以下のモジュールをインストールします。
# cpanm Module::Install::ReadmeMarkdownFromPod Plack Catalyst::Engine::PSGI Starman Server::Starter Net::Server::SS::PreFork
これらのインストールができればOKです。

2010/11/1 追記
Module::Install::ReadmeMarkdownFromPodも必要になった(か、元々必要だった?)様ですね。
一緒にインストールしないと、Starmanのインストール時にコケてしまいます。
Fetching http://search.cpan.org/CPAN/authors/id/M/MI/MIYAGAWA/Starman-0.2007.tar.gz ... OK
Configuring Starman-0.2007 ... OK
==> Found dependencies: HTTP::Parser::XS
Fetching http://search.cpan.org/CPAN/authors/id/K/KA/KAZUHO/HTTP-Parser-XS-0.10.tar.gz ... OK
Configuring HTTP-Parser-XS-0.10 ... N/A
! Configure failed for HTTP-Parser-XS-0.10. See /root/.cpanm/build.log for details.
! Bailing out the installation for Starman-0.2007. Retry with --prompt or --force.

起動ファイル「./script/yellowcat.psgi」を作る

いきなりpsgiという拡張子のファイルが出てきますが、これはPSGI用の起動ファイルというところでしょうか。
まあ今はあまり気にせず、「起動に必要なファイル」とだけ覚えておけば良いと思います。
# cd YellowCat
# ./script/yellowcat_create.pl PSGI
これで./script/yellowcat.psgiができました。

YellowCatをStarmanで起動する

Server::Starterに付属のスクリプトstart_serverを使ってstarmanを起動します。
起動には、「./script/yellowcat.psgi」が必要になります。
# start_server --port 4000 -- starman --workers 8 ./script/yellowcat.psgi

あとはブラウザで4000番ポートにアクセスすれば、YellowCatからのレスポンスを得ることができます。

2010-07-05 追記 うまく動かない時

こんなエラーが出てうまく起動出来ない場合があるようでして。
Error while loading ./script/myapp.psgi: Can't locate YellowCat.pm in @INC (@INC contains: /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/5.8.8 .) at ./script/yellowcat.psgi line 4.
BEGIN failed--compilation aborted at ./script/yellowcat.psgi line 4.
要するに、目の前にあるYellowCat.pmが見つけられない、そんなド近眼系女子のような振る舞いをしているんですね。
そんな時は一手間かけて./script/yellowcat.psgiを編集し、YellowCat.pmの在り処を教えてあげましょう。
#!/usr/bin/env perl
use strict;
use warnings;
use lib ( "/path/to/YellowCat/lib" );
use YellowCat;

YellowCat->setup_engine('PSGI');
my $app = sub { YellowCat->run(@_) };
ちなみに、FindBinを使って以下の様に書こうとしたところ、FindBinに怒られました。
#!/usr/bin/env perl
use strict;
use warnings;
use FindBin;
use lib ( "$FindBin::Bin/../lib" );
use YellowCat;

YellowCat->setup_engine('PSGI');
my $app = sub { YellowCat->run(@_) };
たぶん、指定先パスが異なるためと思われますが、深くツッこんで調べていないので、今のところ原因は不明です。

2008-05-26

[Catalyst]5.7013おかしくね?

beginメソッド使ったら、

********************************************************************************
Invalid CODE attribute: Private at /foo/bar/HogeHoge/lib/HogeHoge.pm line 52
BEGIN failed--compilation aborted at /foo/bar/HogeHoge/lib/HogeHoge.pm line 84, line 855.
Compilation failed in require at (eval 171) line 1, line 855.
********************************************************************************

と言われた。
アプリケーションクラスを見てみたら、

use parent qw/Catalyst/;

our $VERSION = '0.01';

__PACKAGE__->config( name => 'HogeHoge' );

__PACKAGE__->setup(qw/-Debug ConfigLoader Static::Simple/);


とかになってる。
どういうことだ?先週の金曜日にセットアップしたのだが。バージョンアップでもしたか?

と思い、cpanみてみたら、17日に更新されてる。
うは。Ver.5.7013涙目。

しょうがないので、5.7012と同じように

### use parent qw/Catalyst/;
use Catalyst qw/-Debug ConfigLoader Static::Simple/;

our $VERSION = '0.01';

__PACKAGE__->config( name => 'HogeHoge' );

### __PACKAGE__->setup(qw/-Debug ConfigLoader Static::Simple/);
__PACKAGE__->setup;

としてエラーを回避。

どうやらその後、5.7014がリリースされているようだけど、まだ試していない。

2008-05-07

[Perl]Catalystの素朴な疑問

どうしようもない程イカレポンチな疑問なんですが、Catalystで作られたアプリを継承して、拡張する際のやりかたがわからない。。。orz

例えば、


### Catアプリ
package MyApp;


としておいて、


package MyNewApp;
use base 'MyApp';


みたいにすると、MyAppのアクションが全て継承されるってことはないんだろうなあ。
そもそもそんなことは前提に無いのかな。。。

コレできるとありがたいんですが、ご存じの方教えてください><