Home > 仕事のこと > Re:Catalystアプリオレオレポリシー

Re:Catalystアプリオレオレポリシー

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 のポリシーをもっと聞かせてください。

Comments:0

Comment Form

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...

Home > 仕事のこと > Re:Catalystアプリオレオレポリシー

Search
Feeds

Return to page top