catalyst メモ

テンプレートの作成方法〜サーバー実行まで

% catalyst.pl Bookmark
% cd Bookmark
% export DBIC_TRACE=1 #SQLを目視できる
% ./script/bookmark_server.pl
% ./script/bookmark_server.pl -r
※-rを付けるとファイルの変更で読み直す
http://localhost:3000/

テーブルの設計

create table bookmark (
bookmark_id integer auto_increment primary key,
url varchar(255) ,
title varchar(255) ,
record_time timestamp ,
comment text
);

ライブラリの構造

Bookmark
	lib
	
	Bookmark
		Model
		View
		Controller
			Root.pm --------ルートクラス

	root
		static	--------静的ファイル
	script
		bookmark_server.pl
		bookmark_create.pl
		bookmark_test.pl
	t		--------テストスクリプト
bookmark.yml		--------設定ファイル

必要なモジュール類のインストール

「出力」
cpan install Catalyst::View::TT テンプレートツールキット
cpan install Catalyst::View::JSON
cpan install Catalyst::View::Email
cpan install Catalyst::View::Download::CSV

「データ」
cpan install Catalyst::Model::DBIC::Schema //DBIx::Class::Schemaによるデータベースアクセス

アトリビュートのルール

※1Localアトリビュート
ファイルパス /bar/foo
クラス Bar
メソッド foo

※2Privateアトリビュート
sub hogehoge:Private
とすると外部から読まれなくなる。
変わりにdefaultクラスが呼ばれる。

※3Globalアトリビュート
package Bookmark::Controller::Bar::Buz;
sub hogehoge :Global{}
とするとファイルパスは/hogehogeで読まれる

メソッドの書き方

request
$c->req->param('key');

response
$c->res->status(404);
$c->res->body('body');

log
$c->log->info('info message');
$c->log->debug('debug message');

stash
テンプレートなどへの値の受け渡しなど。
ハッシュリファレンスを返す
$c->stash('aaaaaa');

forward
$c->forward('/action');
$c->forward('Bookmark::View::TT', 'process');
$c->forward('Bookmark::View::TT');

===================================================================
(参考)http://d.hatena.ne.jp/perlcodesample/20100210/1264257759
※ハッシュリファレンスとは。。
スカラ、配列、ハッシュの他に、perl独自にリファレンスという変数がある。
$ スカラー変数
@配列変数
連想配列(ハッシュ変数)

「リファレンス」は値を記録する代わりに、値を格納しているアドレスを記録する
$wrod = "A";
$ref_word = \$word; //wordへのリファレンス
$ref_array = \@list;//配列のリファレンス
$ref_hash = \%hash;//ハッシュのリファレンス
$ref_sub = \⊂//関数のリファレンス

print $$ref_word;
print @ref_array;
print \%hash;

そんで、
引っ掛けのようなプログラムがこちら。

my $array = [1,2,3] #配列なのにスカラ変数に代入?
my @array = (1,2,3) #本来はこうあるべき

↑はこういう意味。
my @array = (1, 2, 3);
my $array = \@array;

とのこと。
===================================================================

モデルの作成

use Catalyst qw/-Debug ConfigLoader Static::Simple
FillInForm Charsets::Japanese Prototype/;

lib/Bookmark/Mode/Schema.pmに記載

                                                    • -

package Bookmark::Schema;

use strict;

use base qw/DBIx::Class::Schema::Loader/;

__PACKAGE__->loader_options
(
relationships => 1,
# debug => 1,
);

1;

                                                    • -


(参考)http://logic.moo.jp/memo.php/archive/491
#モジュールのインストール
cpan install Catalyst::Helper::Model::DBIC::Schema

#DBD-mysqlのインストール
yum install perl-DBD-MySQL
cpan install DBD::mysql
yum install mysql-devel


#スキーマクラスの作成
./script/bookmark_create.pl model DBIC DBIC::Schema Bookmark::Schema
(結果)
exists "/var/catalysttest/Bookmark/script/../lib/Bookmark/Model"
exists "/var/catalysttest/Bookmark/script/../t"
created "/var/catalysttest/Bookmark/script/../lib/Bookmark/Model/DBIC.pm"
created "/var/catalysttest/Bookmark/script/../t/model_DBIC.t"


#結果

/lib/Bookmark/Model/DBIC.pm

                                                                • -

use strict;
use base 'Catalyst::Model::DBIC::Schema';

__PACKAGE__->config(
schema_class => 'Bookmark::Schema',


);

                                                                • -

スキーマクラスの作成

$ _create.pl model モデル名 DBIC::Schema スキーマクラス名 create=static | dynamic 接続情報
./script/bookmark_create.pl model MyDB DBIC::Schema \
Bookmark::Schema create=static \
dbi:mysql:test:xxx.xxx.xxx.xxx:3306 IDDD PASSSS

SQLの書き方

※SELECT文

select distinct カラム名 from table1 where カラム名 = 条件

DBICで書くと・・

my $rs = $c->model('DBIC::table1')->search(
{カラム名=>'条件値',},
{select => [{distinct => ['カラム名']}],
as => ['カラム名2'],
]
);

my $rs = $c->model('DBIC::table1')->search(
{カラム名 => '条件式',},
{countt=>[{distinct=>['カラム名']}],
as => ['カラム名2'],
}
);

※.pmがないときの対処法

failed: Can't locate DBD/mysql.pmとでる。。

DBI Connection failed: install_driver(mysql) failed: Can't locate DBD/mysql.pm in @INC (@INC contains: /var/catalysttest/Bookmark/script/../lib /usr/local/lib/perl5/5.10.1/x86_64-linux /usr/local/lib/perl5/5.10.1 /usr/local/lib/perl5/site_perl/5.10.1/x86_64-linux /usr/local/lib/perl5/site_perl/5.10.1 .) at (eval 377) line 3.
Perhaps the DBD::mysql perl module hasn't been fully installed,


(参考)
http://ash.roova.jp/cipher/2010/07/locallib---perl.html

#mysql.pmを探す
find / -name mysql.pm
(結果)
/usr/local/lib/perl5/site_perl/5.10.1/DBIx/Skinny/DBD/mysql.pm

use lib '/usr/local/lib/perl5/site_perl/5.10.1/DBIx/Skinny/DBD/mysql.pm';

読込み先のデータはどのようにして、読み込むか!?
2.特殊変数「@INC」とは?下記のワンライナーを実行してみる。

#perl -e 'print $i++ . ":" . "$_\n" foreach @INC'

(結果)
0:/usr/local/lib/perl5/5.10.1/x86_64-linux
1:/usr/local/lib/perl5/5.10.1
2:/usr/local/lib/perl5/site_perl/5.10.1/x86_64-linux
3:/usr/local/lib/perl5/site_perl/5.10.1
4:.

解決策

@INCを拡張
1.libプラグマ
use FindBin;
use lib "$FindBin::Bin/../lib";

2.BEGIN { unshift(@INC, LIST) }

3.local::libを使う

4.パスの場所の.pmをコピーする
cp -i /usr/local/lib/perl5/site_perl/5.10.1/DBIx/Skinny/DBD/mysql.pm /usr/local/lib/perl5/5.10.1/x86_64-linux/mysql.pm
cp -r /usr/local/lib/perl5/site_perl/5.10.1/DBIx/Skinny/DBD/ /usr/local/lib/perl5/5.10.1/x86_64-linux/DBD/
cpan install DBD::mysql

capn install Catalyst::Model::DBI
capn install Catalyst::Model::DBIC::Schema