Hatena::ブログ(Diary)

Yet Another Hackadelic

2009-12-09

探索パスにあるコンポーネントを読まないようにする

訂正 (2009-12-09T12:55:19+09:00)

id:charsbar さんに教えて貰ったんですが依存してる Module::Pluggable::Object の except, only とかを使えば普通に出来た罠。

__PACKAGE__->config(
  setup_components => ['MyApp::Web::Model::Damepo',]
);

とかで同様の事が出来ます。

詳しくは Module::Pluggable の Advanced Usage に書いてあります。

以下、元のエントリ

以下は、上の奴で出来るから要らない知識です!!!

d:id:ZIGOROu:20061105:1162755013 に昔書いた通り、Catalyst の setup_components は config で探索パスを追加する事は出来ます。これは現在のバージョンでも変わってなくて、MyApp::Web だとすると、

__PACKAGE__->config(
  setup_components => +{
    search_extra => [
      '/path/to/dir'
    ],
  }
);

みたいに追加すればいい。ドキュメントにも書いてある。

が、ちょっと自己都合で外したいみたいのは出来ないみたい。setup_components で対象となるモジュールのロードは load_components に依存してるみたいなので、とりあえずやっつけでこんな風にしといた。

sub locate_components {
    my $class = shift;
    my @comps = $class->next::method(shift);

    my $config = $class->config->{locate_components};
    my %ignore_comp_map;
    my $ignore_comp_regex = '';

    if ( ref $config ) {
        if ( exists $config->{ignore_components} ) {
            %ignore_comp_map =
              map { ( $_ => undef ) } @{ $config->{ignore_components} };
        }

        if ( exists $config->{ignore_components_regex} ) {
            $ignore_comp_regex = $config->{ignore_components_regex};
        }
    }

    $ignore_comp_regex = qr|$ignore_comp_regex| if ($ignore_comp_regex);

    if ($ignore_comp_regex) {
        @comps =
          grep { $_ !~ m/$ignore_comp_regex/; }
          grep { not exists $ignore_comp_map{$_} } @comps;
    }
    else {
        @comps =
          grep { not exists $ignore_comp_map{$_} } @comps;
    }

    return @comps;
}

としておくと、

__PACKAGE__->config(
  load_components => +{
    ignore_components => [
      'MyApp::Web::Model::Damepo',
    ],
    ignore_components_regex => [
      'Foo|Bar'
    ],
  }
);

みたいな感じ。

同じソースツリーだけどデプロイ先をクラスタ化して、読み込むコンポーネントを変えてメモリ消費量がホゲホゲとか考えるなんてシーンも無きにしもあらずって気がするんだけど*1、そういう場合こういう枠組みがあると良いなと思うんですが、実は既にあったりするんですかね。

とりあえず next 嫌いです。

*1:ちなみに今回はそういうニーズではなく必要になった

2009-02-05

Catalyst + FastCGI + Apache (mod_fastcgi) の設定

すっごい久しぶりにやった件。

FastCgiExternalServer /home/zigorou/myapp/MyApp/script/myapp_fastcgi.pl -socket /tmp/myapp.socket

<VirtualHost *:80>
    ServerName myapp.local
    DocumentRoot /home/zigorou/myapp/MyApp/root

    Alias /static /home/zigorou/myapp/MyApp/root/static
    AliasMatch ^/([^./]+\.[^./]+)$ /home/zigorou/myapp/MyApp/root/$1
    ScriptAlias / /home/zigorou/myapp/MyApp/script/myapp_fastcgi.pl

    ErrorLog /var/log/httpd/myapp-error_log
    CustomLog /var/log/httpd/myapp-access_log common
</VirtualHost>

mod_rewrite はあんまり自信が無い><

そういえば昔、id:nipotan さんに mod_rewrite の RewriteCond の影響範囲がホゲホゲ〜って言われたけど完全に忘れました。もうだめぽ。

2009-01-24

Catalyst::Controller::Resources でオーバーロード POST を使いたい

id:ikasam_a にわがまま言ったら Catalyst::Request::REST::ForBrowsers ってのを教えて貰ったよ。

オーバーロード POST って何だよって方は、

とか読むと幸せになれると思います。

使い方

MyApp にて、こんな感じにしときます。

package MyApp;

use strict;
use warnings;

use Catalyst::Runtime '5.70';
use Catalyst::Request::REST::ForBrowsers;

### 中略

__PACKAGE__->request_class('Catalyst::Request::REST::ForBrowsers');

みたいな感じ。そうすると Catalyst::Request の代わりに Catalyst::Request::REST::ForBrowsers が使われるようになります。

んでもって、html 中で、

<form action="[% c.uri_for('/path/to') | html %]" method="post">
  <input type="hidden" name="x-tunneled-method" value="delete" />
  <input type="submit" name="submit" value="delete" />
</form>

みたいにやっとくと、Catalyst::Controller::Resources の destroy にうまく dispatch してくれます。

蛇足 - looks_like_browser

C::R::REST::ForBrowsers だけど、looks_like_browser メソッドも同時に提供してくれてて、これはブラウザの画面上から普通にリクエストした物なのか、XHR 経由 *1 なのかを判定してくれるみたいです。

SEE ALSO

*1:x-requested-with リクエストヘッダの値を見てる

2008-04-23 IT幹事疲れ

Catalyst Conference #1 まとめ

昨日は直前にエロギークな人のトラブルもありましたが、何とか無事に終える事が出来ました。

参加者の皆さん、お疲れ様でした。

と言う訳でプレゼンのまとめと個人的な感想です。

プレゼン

CatalystからModelを切り離せ (g:catalyst:id:dann)

今回の基調講演の一つ。g:gatalyst:id:dannさんのプレゼン。エンタープライズアーキテクチャ的にCatalystを分析して、かくあるべきと言う事を言ってる方は少ないので非常に参考になりました。

WAFにおけるModelとは何ぞやと言う事から、Modelにはどのようなパターンが存在し、それらをWAFではなくAFに落とし込む方法論をModelの分類ごとに手法化って感じ。

素晴らしい、また後で資料読みたい。

Catalyst REST Practice #1 (g:catalyst:id:ikasam_a)

ROAとCatalystの話。ブログ読んでるので大体分かってたけど網羅的に書かれているので、今までのg:gatalyst:id:ikasam_aのROA+Catalystな話を知りたい人にはちょうど良いプレゼンでした。

Catalyst::Controller::Resourcesも良さそう。今度ソース読む。

$c < 3C (charsbar)

id:charsbarさんの歴史で分かるCatalystな話。時系列に誰の政権かによってダイナミックに変わって行くCatalystとその使い方について詳しく解説。

この辺りで既にCatalystから全てが無くなった感がwww

個人的にはid:charsbarさんに今回のベストスピーカー賞を挙げたい。

Model::Adaptor (hidek)

hidekさんのModel::Adaptorな話。

あとFactory, Factory::PerRequestとの違いの説明とか。

これからみんなModelはAdaptorでホゲるかDIなのかねー。DI周りはg:catalyst:id:dannさん辺りがもっと調べてくれそうな予感。

ま、そんな思いをして作ったデモも時間切れでスルーだったんですけどね。 CatalystCon#1

いいじゃないすか、僕なんて資料作ったのにプロジェクタの不調と全体的な時間配分からプレゼンすら出来なかったんだしwww

コピペをしないための10の方法 (typester)

typesterさんの10の方法論。

個人的には10個目のメソッドに激しく同意*1

FormValidator::Assetsに激しく期待age

あとKayacで今度Hackathonやりぁーしょー。Yokohama.pmマダー?

HTTP::Server::Wrapper (id:Yappo)

id:Yappoさん。Cisco的なCatalystネタは皆さん余りピンと来なかったようでw

CatalystのEngineだけ切り離してピンで使えるようにしたよって話。

この人一体、いつ開発してんだろ。気づいたら何か出来てるよなー。

Catalyst☆Complex (id:tokuhirom)

Sledge::Engine::Catalyst吹いたwww

DBIC::Schema::Loaderのカスタマイズ (id:ZIGOROu)

残念ながら時間が無かったりプロジェクタがご機嫌斜めで出来なかったんだけど、後で資料公開します。

切ないけど公開しました><

まとめ

気づいてみたらかなりの豪華なスピーカーを集めて面白い話が聞けたなーと思いました。

第1回で皆さん、Catalystの問題点がつまびらかになりつつ、あーすりゃいいとか色んな方法が出て来て、

段々とベストプラクティスが出て来たのかなーとか思いました。

第2回とかも機会があればやりたいすねー。

id:tokuhiromも書いてたけどg:catalyst:id:dannさんと滝内さんがキャラ似過ぎ。

業務連絡

id:lopnorさんに1500円のお釣りがあります。

SEE ALSO

*1:10個目何も無かったんだけどもw

2008-04-20 Identityで酒が呑める時代になりました(ぇ

CatalystCon1は明日です

詳しくはWiKiの方見て下さいです。

皆さん資料は出来ましたでしょうか。僕はまだ作ってません><