Hatena::Groupcatalyst

LAPISLAZULI HILL#Catalyst このページをアンテナに追加 RSSフィード

2007-10-10

[][]Catalyst::Model::Adapter調査中のメモ1 Catalyst::Model::Adapter調査中のメモ1 - LAPISLAZULI HILL#Catalyst を含むブックマーク はてなブックマーク - Catalyst::Model::Adapter調査中のメモ1 - LAPISLAZULI HILL#Catalyst Catalyst::Model::Adapter調査中のメモ1 - LAPISLAZULI HILL#Catalyst のブックマークコメント

AdaptorとかFactoryデザインパターンのだろうか.デザインパターン勉強しないとダメ

URL

使い方

SYNOPSISのとおり.

package MyApp::Model::SomeClass;
use strict;
use warnings;
use base 'Catalyst::Model::Adaptor';

__PACKAGE__->config(
    class       => 'MyApp::Backend::SomeClass',
    constructor => 'new',
    args        => 'hoge',
);

1;

Helper

podではcatalyst.plになってるけど,./script/<app_name>_create.plだと思う

ARGUMENTS

./script/myapp_create.pl model <model_name> Adaptor <class> [<constructor>]

自分で作ったクラスならSYNOPSISのようにいままでのModelをMyApp::Backend::*に移動して指定する,あるいはそこに作る.

./script/myapp_create.pl model SomeClass Adaptor MyApp::Backend::SomeClass create

調べ残しとか,わからないこととか,そもそも分かってないこととか

  • classにDateTimeを直接指定してみたんだけど,動かない.ソースを読んでみたので理由も分かる.もう1枚噛まさないと解決しないような気がするし,そっちのほうが使いやすい気がする→やってみる
  • argsで引数が1コしか指定できない.ハッシュリファレンスを渡すクラスなら問題ないけど→まさにDateTimeは引っかかる気が
  • MVCすら正確に理解できていない気がする→とほほ.勉強しる

[][][]Catalyst::Model::Adapterについて調べる Catalyst::Model::Adapterについて調べる - LAPISLAZULI HILL#Catalyst を含むブックマーク はてなブックマーク - Catalyst::Model::Adapterについて調べる - LAPISLAZULI HILL#Catalyst Catalyst::Model::Adapterについて調べる - LAPISLAZULI HILL#Catalyst のブックマークコメント

2007年10月10日 miyagawa catalyst こういうプラグインはもうないほうがいいとおもう。Model::Adapter

Catalyst::Model::Adapterに関してはno titleで,見ていたのだけど利点と用途を理解してなかった

ちゃんと調べること→me

[][]C::P::Datetimeのメモ1(使い方) C::P::Datetimeのメモ1(使い方) - LAPISLAZULI HILL#Catalyst を含むブックマーク はてなブックマーク - C::P::Datetimeのメモ1(使い方) - LAPISLAZULI HILL#Catalyst C::P::Datetimeのメモ1(使い方) - LAPISLAZULI HILL#Catalyst のブックマークコメント

このやり方よりCatalyst::Model::Adaptorを使った方がよいです.やりかたはno titleで,DateTimeでのやり方も分かりますよ

-----

PluginというよりDateTime自体の自分メモその1

ふつうの使い方

use Catalyst qw/ DateTime /;

my $dt_now = $c->datetime; # now   2007-10-10T07:09:54
my $dt_now2 = $c->dt;      # short 2007-10-10T07:09:54
my $dt_today = $c->datetime( year => 2007, month => 10, day => 10); # 2007-10-10T00:00:00

$c->datetime->todayとかないじゃん

C::P::DateTime::Constructorを使う

  • from_epoch, today
  • from_object
  • from_day_of_year
  • last_day_of_month

というメソッドを$cに生やしてくれる

use Catalyst qw/ DateTime::Constructor /;

my $dt_today = $c->today; # 2007-10-10T00:00:00

my $from_day_of_year  = $c->from_day_of_year(  year => 2007, day_of_year => 300 ); # 2007-10-27T00:00:00
my $last_day_of_month = $c->last_day_of_month( year => 2007, month => 10); # 2007-10-31T00:00:00

アプリ用Pluginを作った方がいいかも

timezoneとか指定するのがめんどくさい.最初はC::P::DateTimeを継承しようと思ったけど,コピペしてみた.無指定時のtzはAsia/Tokyoで決め打ちにしてみた

package MyApp::Plugin::DateTime;

use strict;
use warnings;

use Catalyst::Exception;
use DateTime;

our $VERSION = "0.01";

sub datetime {
    my $c = shift;
    my %params = @_;

    my $tz = delete $params{time_zone} || 'Asia/Tokyo';

    # use params if argued
    if (%params) {
        return DateTime->new(\%params)->set_time_zone($tz);
    }
    else { # otherwise use now
        return DateTime->now(time_zone => $tz);
    }
}

sub today {
    my $c  = shift;
    my %params = @_;

    my $tz = delete $params{time_zone} || 'Asia/Tokyo';

    # use params if argued
    if (%params) {
        return DateTime->today(\%params)->set_time_zone($tz);
    }
    else { # otherwise use now
        return DateTime->today(time_zone => $tz);
    }
}

1;

これに,必要に応じて他のメソッドも生やしていくとか,timezone指定を設定から読み込むとか

トラックバック - http://catalyst.g.hatena.ne.jp/lapis25/20071010

2007-08-16

[][]Catalyst-Helper-Log-Dispatchでも$c->log->dumper()を使いたい Catalyst-Helper-Log-Dispatchでも$c->log->dumper()を使いたい - LAPISLAZULI HILL#Catalyst を含むブックマーク はてなブックマーク - Catalyst-Helper-Log-Dispatchでも$c->log->dumper()を使いたい - LAPISLAZULI HILL#Catalyst Catalyst-Helper-Log-Dispatchでも$c->log->dumper()を使いたい - LAPISLAZULI HILL#Catalyst のブックマークコメント

いままでCatalyst::Logを使っていたので,C::P::Dumperを使っていた.これはlogに吐くときにData::Dumperを使って出力してくれる.変数にどういう値が入っているかいまだに勘違いしやすいへたれなので,開発やデバッグ時に重宝していた

no titleのhelperを使いはじめた.$c->log->dumper()ができなくなったのでC::P::DumperをコピペしてMyApp::Logger::Backend::Dumperをでっち上げた.最初はMyApp::Loggerに直接書いていたんだけど分離した.ほんとはHelperを作った方がよいかも.機会があれば習作としていずれ

MyApp::Logger::Backend::Dumper

package MyApp::Logger::Backend::Dumper;

use strict;
use warnings;
our $VERSION='0.01';

package MyApp::Logger::Backend;

use Data::Dumper;

$Data::Dumper::Sortkeys = 1;

sub dumper {
  my ($self, $var, $label) = @_;

  if (defined $label) {
      # temporarily change the Varname that D::D uses
      local $Data::Dumper::Varname = $label;
      $self->debug( Dumper($var) );
  }
  else {
      $self->debug( Dumper($var) );
  }
}

1;

このファイルを配置して,プラグインのロードを追加

use Catalyst qw/+MyApp::Logger +MyApp::Logger::Backend::Dumper/;
トラックバック - http://catalyst.g.hatena.ne.jp/lapis25/20070816

2007-08-06

[][]Catalyst::Plugin::Authenticationが変わっている Catalyst::Plugin::Authenticationが変わっている - LAPISLAZULI HILL#Catalyst を含むブックマーク はてなブックマーク - Catalyst::Plugin::Authenticationが変わっている - LAPISLAZULI HILL#Catalyst Catalyst::Plugin::Authenticationが変わっている - LAPISLAZULI HILL#Catalyst のブックマークコメント

ひさしぶりにCatalystをさわっている.id:vkgtaroさんにC::P::Authenticationが少し変更されていることを教えてもらった.自分で作っている分はいままでのようにひとつの認証方法を使っていて,詳しく見ていないのだけどこのあたりの変更がぱっと見える

  • loginメソッドからauthenticateメソッドに変更になっていて,引数にrealmが追加されている
  • 複数の認証方法を設定で書くことで,引数にrealmを設定して複数の認証方法をAuthenticationの仕組みで扱える
  • Authentication::StoreやAuthentication::Credentialはいままで,Pluginで指定をしていたけどconfigで設定するようになっている
  • Authentication::Store::DBICAuthentication::Store::DBIx::Class に変わっている(Authentication::Storeの仕組みが変わっているのか)

ユーザ認証が柔軟に設定できるようになったような気がします.気が向いたらもう少し詳しく調べてみます


新しいやり方への変更

Authentication::Store::DBICとAuthentication::Credential::Passwordを使っていたやり方を新しいやり方に変えてみた.新しい部分はあまり使っていないのでそれほど参考になる訳じゃないけど

0.10からは

lib/MyApp.pm

    use Catalyst qw/
        Authentication
    /;

というようにPlugin設定をして

myapp.yml

---
name: MyApp
authentication:
  default_realm : 'members'
  realms:
    members:
      credential:
        class: Password
        password_field: password
        password_type: hashed
        password_hash_type: SHA-1
      store:
        class: 'DBIx::Class'
        user_class: 'DBIC::User'
        id_field: 'username'

ここでstoreやCredentialなどを設定.storeがAuthentication::Store::DBICからAuthentication::DBIx::Classに変更になっている

lib/MyApp/Controller/login.pm

    if( $c->authenticate( {username => $username,
                           password => $password } )) {
        #login success
    }
    else {
        #login incorrect
    }

メソッドがログインからauthenticateに変わっている.loginもまだ使えるけど非推奨になっている

(追記)

$c->authenticateの第1引数は,実際に認証のために投げるクエリの条件です.いつもusernameとpasswordではなくカラム名にあわせる必要があります.たとえばログインidにメールアドレスが入っているemailというカラムを使うなら,こう書きます

    if( $c->authenticate( {email    => $email,
                           password => $password } )) {
        #login success
    }
    else {
        #login incorrect
    }

2007-06-19

[]libcatalyst-perl libcatalyst-perl - LAPISLAZULI HILL#Catalyst を含むブックマーク はてなブックマーク - libcatalyst-perl - LAPISLAZULI HILL#Catalyst libcatalyst-perl - LAPISLAZULI HILL#Catalyst のブックマークコメント

debianでlibcatalyst-perlというaptパッケージがあるのだけど,どうなんだろうか?試してみればよいのか

トラックバック - http://catalyst.g.hatena.ne.jp/lapis25/20070619

2007-06-01

[][][]lightyテストサーバlightyをテストサーバに - LAPISLAZULI HILL#Catalyst を含むブックマーク はてなブックマーク - lightyをテストサーバに - LAPISLAZULI HILL#Catalyst lightyをテストサーバに - LAPISLAZULI HILL#Catalyst のブックマークコメント

lightyを試すついでに,script/myapp_server.plの代わりにligthyをテストサーバにすることに.

Shibuya Perl Mongers テクニカルトーク #7

Catalyst+Lighttpdテクニック (typester)

http://unknownplace.org/slides/shibuyapm-7/start.html

この資料を見てやってみる

今回はfedoraなのでyumlighty+fastcgiインストール

% sudo yum install lighttpd lighttpd-fastcgi

installが抜けてた(070806修正)

紹介されているhelperをインストール

% svn export http://svn.unknownplace.org/public/library/perl/trunk/Catalyst-Helper-Lighttpd/
% cd Catalyst-Helper-Lighttpd
% perl ./Build.PL
% ./Build
% ./Build test
% sudo ./Build install

アプリディレクトリでヘルパを実行

% ./script/myapp_create.pl Lighttpd

作成されたスクリプトスタンドアロンモードで起動

% ./script/myapp_lighttpd.pl -D

組み込みサーバの時と同じように,http://localhost:3000/などにアクセスすればok

簡単にできて,動作も軽快でいい感じです.typesterさんに感謝です

エラーが出て起動しないとか

最初に起動したときは下記のようなエラーが出ました

% ./script/myapp_lighttpd.pl
2007-06-01 11:11:45: (server.c.521) No configuration available. Try using -f option.
sh: line 1: -v: command not found
lighttpd is not found

自分の環境では(たぶんzshの設定)which lighttpd結果の最後に改行が入るのが原因のようです.それを回避するためにスクリプトに1行追加しました

my $lighttpd = qx{which lighttpd};
chomp $lighttpd;# ←追加行
トラックバック - http://catalyst.g.hatena.ne.jp/lapis25/20070601