Perl 5.10 + Test::WWW::Mechanize::Catalyst
うごかんわけだが、みんなどうしてんの?
5.10 の問題ではなくて、最新版の libwww-perl (5.10に付属)の問題という話だけど、5.8.x でも LWP あげたらおなじことになるのかなー。
Catalyst MVC
Catalyst に関してだけ言えば Model いらなくね?という話もわかるのだが、アプリの複数の箇所で共通で使うオブジェクトはModelを使うと楽だし論理的な実装になるとおもう。
僕のMVCの理解が変かもしれないけど、今はそんな感じで考えている。>共通で使うオブジェクトはModel
そんで、Catalyst::Model
微妙っていうのはやっぱり Catalyst 専用の Model つくってもほかから利用できないしなってのがあるんだけど、それは Catalyst::Model::Adaptor
で解決。jrockway++
なので、単体で動作する何らかのモジュールをまずつくり、それを Model::Adaptor で連結する、というのが今の好きな方法。
Catalystアプリオレオレポリシー
下記camr作った時点での僕のポリシーは
- アプリ名にかかわらず設定ファイルはconfig.yamlとconfig_local.yaml
- でも変更することがないほとんどの設定はyamlには書かない。yamlがごちゃっとするときもい
- ForceUTF8系モジュールは使用しない。内部がきちんとutf8で統一されていれば必要ない。
- MyApp::UtilsとかいうのでいろいろBKなことをまとめてする。uri_forを気に入るように直したり、FillInFormの挙動変えたり
なんか抜けてる気がするけどこんな感じ。
Catalyst::Controller::Resources
かっこいい。
オレオレ規約をもとに雛形を生成するヘルパースクリプトでがんばるよりこういう自分用のコントローラをつくるほうがスマートだなぁ。
Catalystユーザー的にはオールドタイプな自分としては見習おうと思った。
JSON::XS を実戦投入した
いままでずっと JSON::Syck
を使い続けていたのだけど、いまの JSON::Syck
には
/y|Y
|n|N
|yes|Yes|YES
|no|No|NO
|true|True|TRUE
|false|False|FALSE
|on|On|ON
|off|Off|OFF
|null|Null|NULL
|~
/x
の正規表現にマッチする値はシングルクオートでくくられてしまうという仕様があり、これはJSONの仕様に反するのでパーサーによっては正しく処理できないものがある。
これがFlashから使うJSON APIでもろにはまって、adobe の corelib に入っている JSON のパーサーはこれをパースできない。(rubyのyamlパーサーでもエラーになるようだ)
cho45さんがこれを直すパッチを書いてくれたのだけど、いい機会なので JSON::XS
を試してみた。JSON::Syck
のドキュメントからも言及されてるしね。
Catalyst::View::JSON
から使うには以下のような感じで MyApp::View::JSON
をかけばOK。
package MyApp::View::JSON;
use strict;
use base 'Catalyst::View::JSON';
use JSON::XS ();
sub new {
my $self = shift->NEXT::new(@_);
my $dumper = JSON::XS->new->latin1;
$self->json_dumper(sub { $dumper->encode($_[0]) });
$self;
}
1;
JSON::Any
つかってないのは Any だと環境変数で使用ライブラリを上書きできてしまっていやなので XS を直使用している。
一日くらい社内でテストしたけどだいじょうぶっぽかったのでさっき本番投入してみた。どうだろうな。
コード再利用の話
基本自社サービス or 個人サービスしかつくってないので、本当にcatalystを使っているとコピペ地獄になる。
また同じことかいてるなーってのが多すぎるため、むかついてなるべくコピペを減らす工夫をしている。
codereposにあげたcatstarterってのもそうだし、あとはヘルパーを結構書いてる。
Catalystのヘルパーってまぁ要するにコードジェネレータなんだけど、ユーザー登録とかログイン・ログアウトとかほんとにいつもかいてるのでその辺はヘルパー一発で雛形生成するようにしてたりとか、jsのajax apiのサーバーサイドとかもjson形式を決めうちにしちゃってこれも雛形生成している。
いまの Catalyst::Helper
って新しいコード生成には使えるけど既存のクラスにメソッド追加とかそういうのできないのが不満。なんかつくりたい。
この辺の話はちゃんとまとめたいな。catalyst conやりたい!
Catalyst::Plugin::URI::MtimeQueryとCatalyst::Plugin::Assets - dann@catalyst - Catalystグループ
Catalyst::Plugin::AssetsにCatalyst::Plugin::URI::MtimeQueryのアイデアをインスパイアしたものを加えると、Assetsも結構使えるかも知れないなぁ。export_with_mtimequeryみたいなのがあればいいのかも。
これ今まさに仕事で使おうと思ってかいている。
そのうち公開します!
uri_forのやつ
uri_withも同じようにおかしかったのでそっちもなおしてもらった。