- 2008年3月 4日 00:23
- 仕事のこと
Catalystアプリオレオレポリシー - unknownplace.org
1. アプリ名にかかわらず設定ファイルはconfig.yamlとconfig_local.yaml 2. でも変更することがないほとんどの設定はyamlには書かない。yamlがごちゃっとするときもい 3. ForceUTF8系モジュールは使用しない。内部がきちんとutf8で統一されていれば必要ない。 4. MyApp::UtilsとかいうのでいろいろBKなことをまとめてする。uri_forを気に入るように直したり、FillInFormの挙動変えたり
仕事では Sledge。個人では Catalyst。
仕事で使っていれば社内のコーディングルールだったり暗黙の了解だったりで均一的なポリシーっていうものができあがってくるけど、個人で使ってるとそういうものがなかなか作れないのが困る。
「はて、みんなは Catalyst ではどんなコーディングをしているのだろうか?」なんて。
僕自身、いまだに Catalyst のポリシーっていうものが明文化できずにいる。
まぁ、多少はあるけれどね。それでも気分だったり、何となくだったりで恣意的なものだ。
なので、Re:Catalystアプリオレオレポリシー。
1. アプリ名にかかわらず設定ファイルはconfig.yamlとconfig_local.yaml
プロジェクトを立ち上げたら必ず MyApp/etc を作る。
MyApp/
+ etc/
+ conf/
myapp.yml ## 開発、本番環境の共通設定
myapp_local.yml ## 開発環境の設定
myapp_service.yml ## 本番環境の設定
+ httpd/
app.myapp.conf ## 本番環境のバックエンド用 modperl
startup.pl ## 言わずと知れた startup.pl
www.myapp.conf ## 本番環境のフロントの apache
www.myapp_local.conf ## 開発環境のフロントの apache
+ validation
profile.yml ## Catalyst::Plugin::FormValidator::Simple::Auto
開発環境のバックエンドは myapp_server.pl を daemontools で起動しているので app.myapp_local.conf 的なものは用意していない。今のところ不自由はないけれど、app.myapp_local.conf を読み込ませた modperl が必要になるかもしれない。とも思っている。
2. でも変更することがないほとんどの設定はyamlには書かない。yamlがごちゃっとするときもい
変更の予定がないものもことごとく yaml に書いている。「設定」であれば何でも。
Model の connect_info, crawler の UA, イテレータでデフォルトで使う rows などなど。
本番、開発環境で同じ内容のものは myapp.yml へ。本番、開発環境で違うものはそれぞれ myapp_service.yml, myapp_local.yml で上書き。
バッチとかでハードコードしたくないので yaml にどんどん書いちゃう。
例えば、
#!/usr/bin/perl
use strict;
use warnings;
use FindBin;
use lib "$FindBin::Bin/../lib";
use lib "$FindBin::Bin/../Mina/lib";
use lib "/home/public/cgi/lib";
use Shiori; ## これが Catalyst プロジェクト
use Mina; ## 他の Catalyst プロジェクト
use LWP::UserAgent;
use DateTime;
my $config = Shiori->config;
my $dt = DateTime->now->set_time_zone( $config->{time_zone} );
my $ua = LWP::UserAgent->new(
agent => $config->{user_agent}->{agent},
from => $config->{user_agent}->{from},
timeout => $config->{user_agent}->{timeout},
);
$ua->default_header( Accept => [ qw(text/html text/plain image/*) ] );
my $schema = Shiori::Schema->connect( @{$config->{'Model::Shiori'}->{connect_info}} );
my $itr_page = $schema->resultset('Shiori::Schema::Page')->hot_pages( {}, { rows => $config->{default_rows} } );
while ( my $page = $itr_page->next ) {
my $res = $ua->get( $page->url );
if ( $res->is_success ) {
## do something
} else {
## do something
}
}
こんな感じに。
だから、yaml にどんどん書いちゃう。確かに yaml がごちゃっとしてきもいかも。
3. ForceUTF8系モジュールは使用しない。内部がきちんとutf8で統一されていれば必要ない。
おっしゃる通り。
ソースも DB も文字コードは UTF8。まぁ、僕は個人で開発しているのでサクッと EUC から UTF8 に乗り換えちゃったんですけどね。職場ではその乗り換えもなかなか難しいですよね。
4. MyApp::UtilsとかいうのでいろいろBKなことをまとめてする。uri_forを気に入るように直したり、FillInFormの挙動変えたり
MyApp::Utils は作ったことがない。
いったん MyApp::Utils を作り出すとまさに BK のまとまりになって Utils ではなくなってしまうので。なるべく CPAN を使って済ます。
それでも使いずらいようであれば lib/Myapp/Plugin/Nanchara.pm を作ってプラグインとしての使い方を考える。できれば、/home/public/cgi/lib/Catalyst/Plugin/Nanchara.pm として全サービスで使えるプラグインにしちゃう。欲を言えば、/usr/lib/perl5/site_perl/5.8.8/Catalyst/Plugin/Nanchara.pm を作って CPAN にあげちゃう心意気で。
それがダメなら、もう知らない。寝る。
とにかく、Utils とか Manager 系のモジュールは作らない。たぶんそれは Utils でも Manager でもなくなってしまうから。
好みの問題。とも言える。
Re:Catalystアプリオレオレポリシーはこんな感じ。
おまけとして、僕の Catalyst のプロジェクトの構成。
MyApp/
+ bin/ ## バッチ処理用のスクリプト
...
...
+ etc/ ## conf, httpd, validation などアプリの設定ファイル
...
...
+ lib/
+ MyApp/
Myapp.pm ## 言わずと知れた MyApp.pm
+ Controller/ ## Controller だよ
...
...
+ AjaxRequest/ ## AJAX リクエスト用の Controller は別に作る
...
...
DBIC.pm ## deflate, inflate させたり
Errors.pm ## Catalyst::Plugin::FormValidator::Simple::OwnCheck
+ Model/
+ DBIC/
Mina.pm ## 他プロジェクト(Mina はいわゆる Member)の Model
MyApp.pm ## MyApp の Model
+ Plugin/ ## MyApp でしか使えない Plugin
...
...
+ Schema/ ## 言わずと知れた Schema
...
...
Schema.pm
+ View/
File.pm ## div タグだけの HTML や画像を返す場合の View
JSON.pm ## JSON を返す View
TT.pm ## 通常の process を行う TTSite base な View
+ root/
+ lib/ ## View::TTSite を使うと lib/config/, lib/site/, site/ が作成される
+ config/ ## テンプレート内で使用する TT のタグの定義
col ## 色(site.rgb = {red = '#CC4444'} とか)を定義(結構使う)
main ## title とか copyright とかを定義(あまり使わない)
url ## URL(site.url = {base = c.req.base} とか) を定義(あまり使わない)
+ site/ ## テンプレートの部品
footer ## フッタ
header ## ヘッダ
html ## layout を内包する一番外側の部品
layout ## footer, header を内包する二番目に外側の部品
wrapper ## ラッパ
+ src/ ## いわゆるテンプレート
ttsite.css ## TTSite::View を使用すると作成される ここで col で定義した [% site.rgb.red %] なんかを使う
...
...
+ static/ ## フロントで返すようないわゆる静的ファイル(性的なファイルは別のディレクトリ)
+ css/
...
...
+ images/
...
...
+ js/
...
...
+ script/
...
...
+ sql/ ## DB 関係のファイル置き場
+ data/ ## アプリが動くにあたって必要最低限なデータ
...
...
+ dmp/ ## dump ファイル置き場
...
...
+ schema/ ## テーブルのスキーマ(DDL って言うやつ?)
...
...
+ t/ ## テス㌧
...
...
いつもだいたいこんな感じの構成になります。
みなさんの Catalyst のポリシーをもっと聞かせてください。
- Newer: Re:Re:Re:Catalystアプリオレオレポリシー
- Older: Philharmonic or die
Comments:0
Trackbacks:1
- TrackBack URL for this entry
- http://hibinokoto.jp/mt/mt-tb.cgi/256
- Listed below are links to weblogs that reference
- Re:Catalystアプリオレオレポリシー from 日々のこと
- Re:Re:Catalystアプリオレオレポリシー from よく帰れない人のブログ 2008-03-04 (火) 16:52
- 久しぶりのえんとりー めがねのひとに触発されてオレオレポリシー。 Re:Cata...