日向夏特殊応援部隊

俺様向けメモ

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)

ROACatalystの話。ブログ読んでるので大体分かってたけど網羅的に書かれているので、今までのg:gatalyst:id:ikasam_aROA+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さん辺りがもっと調べてくれそうな予感。

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

いいじゃないすか、僕なんて資料作ったのにプロジェクタの不調と全体的な時間配分からプレゼンすら出来なかったんだし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円のお釣りがあります。

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

DBIC::Schema::Loaderのカスタマイズと言うネタでプレゼンするはずだった件

話してないけど、資料はあるので公開しまっする。

概要

開発中にスキーマに変更が発生して、make_schema_at()を何度も叩く際に困ることと、Schema::Loaderで比較的意図した通りにSchema, Tableクラスを生成する為に、こんな風にするといいおって内容です。

せっかちな人向け

こんな感じ。
内容の解説はプレゼン資料を見てくだしあ。

#!/usr/bin/perl

use strict;
use warnings;

use FindBin;
use File::Spec;
use lib (
    File::Spec->catfile( $FindBin::Bin, qw/.. lib/ ),
    File::Spec->catfile( $FindBin::Bin, qw/.. schema/ )
);
use DBIx::Class::Schema::Loader qw(make_schema_at);

die unless @ARGV;

my $schema_class = 'MyClass::DBIC::Schema';

unlink(
    glob(
        File::Spec->catdir( $FindBin::Bin, '..', 'lib',
            split( /::/, $schema_class ) )
            . '/*.pm'
    )
);

use DBIx::Class::Schema::Loader::Base;
package DBIx::Class::Schema::Loader::Base;

use String::CamelCase qw(decamelize);

{
    no warnings 'redefine';

    sub _load_relationships {
        my ( $self, $table ) = @_;

        my $tbl_fk_info = $self->_table_fk_info($table);
        foreach my $fkdef (@$tbl_fk_info) {
            $fkdef->{remote_source}
                = $self->monikers->{ delete $fkdef->{remote_table} };
        }

        my $local_moniker = $self->monikers->{$table};
        my $rel_stmts     = $self->{relbuilder}
            ->generate_code( $local_moniker, $tbl_fk_info );

        foreach my $src_class ( sort keys %$rel_stmts ) {
            my $src_stmts = $rel_stmts->{$src_class};
            foreach my $stmt (@$src_stmts) {
                if ($stmt->{method} eq 'belongs_to') {
                    my $table_class_suffix = [split /::/ => $stmt->{args}->[1]]->[-1];
                    $stmt->{args}->[0] = decamelize($table_class_suffix);
                }

                $self->_dbic_stmt( $src_class, $stmt->{method},
                    @{ $stmt->{args} } );
            }
        }
    }
}

package main;

make_schema_at(
    $schema_class,
    {   components => [
            qw/ResultSetManager UTF8Columns InflateColumn::DateTime TimeStamp /
        ],
        dump_directory => File::Spec->catfile( $FindBin::Bin, qw/.. lib/ ),
        debug          => 0,
        really_erase_my_files => 0,
        exclude               => qr/Base$/,
    },
    \@ARGV,
);

まぁ、俺様Loader作るないしはDBICを使わないのがベストプラクティスな気がします。(冗談だけど)