C::P::FormValidator::Simple のバグ

久々に環境を再構築してたところ Catalyst アプリへ全くアクセスできなくて焦った。

$ ./myapp_server.pl
〜中略〜
[info] MyApp powered by Catalyst 5.80024
You can connect to your server at http://xerxes-linux:3000
[info] *** Request 1 (0.062/s) [30044] [Thu Jun 17 18:50:08 2010] ***
[debug] "GET" request for "/" from "192.168.30.60"
[debug] Path is "/"
[error] Caught exception in engine "Can't use string ("MyApp") as a HASH ref while "strict refs" in use at /usr/local/lib/perl5/site_perl/5.12.1/Catalyst/Plugin/FormValidator/Simple.pm line 36."

何これ……? エラーメッセージを色々切り分けてググったり、果ては Apache や mod_perl の問題かと思ってコンパイルしまくったけど全然関係なかった。

Bug #58363 for Catalyst-Plugin-FormValidator-Simple: typo at line 36
https://rt.cpan.org/Public/Bug/Display.html?id=58363

C::P::FormValidator::SImple の 36 行目を、

$c->maybe::next::method(@_);

$c = $c->maybe::next::method(@_);

このように書き換えるだけで万事 ok。こんなことに時間を費やしたのかorz

【Catalyst】HTML::Tidyを使って出力を整形する

いろんなテンプレートをインクルードしまくったせいか生成されるHTMLが非常に汚かったので、HTML::Tidyを使って整形してみた。

HTML::Tidyのインストール

これは前の記事を参照。

【MovableType】Tidy を使って HTML を整形するプラグイン | blog.delphinus.dev
https://blog.delphinus.dev/2010/03/tiding-movabletype.html

簡単に手順だけ書いておく1

$ sudo yum install tidy libtidy libtidy-devel
$ sudo cpan -i P/PE/PETDANCE/HTML-Tidy-1.08.tar.gz

Continue reading

Catalyst::Model::Adaptor + TheSchwartz

TheSchwartz.pmCatalyst::Model::AdaptorでModel化して扱う時のメモ。次のURLを参考にして設定を行ったのだが問題発生。

Catalyst::Model::AdaptorでTheSchwartzをModel化 – hide-k.net#blog

http://blog.hide-k.net/archives/2008/02/catalystmodelad_1.php

MyApp::Model::TheSchwartz

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

1;

myapp.yml(部分)

Model::TheSchwartz:
    class: "TheSchwartz"
    constructor: "new"
    args:
        databases:
            -
                dsn: "dbi:mysql:myapp_db:localhost:3306"
                user: "ユーザー名"
                pass: "パスワード"

実行しようとすると、

$ sudo /etc/rc.d/init.d/httpd start
httpd を起動中: Syntax error on line 54 of /etc/httpd/conf.d/perl.conf:
Couldn't instantiate component "MyApp::Model::TheSchwartz", "unknown options HASH(0xae3ee38) at /usr/local/lib/perl5/site_perl/5.10.1/Catalyst/Model/Adaptor/Base.pm line 27"Compilation failed in require at (eval 2) line 3.\n
                                                           [失敗]

などというエラーが出てうまくいかないのだ。調べてみると、TheSchwartz->new()に渡す引数で怒られてるらしい。とりあえずTheSchwartz.pmを次のように修正して解決した。

*** /tmp/TheSchwartz.pm.orig    2010-02-18 10:06:45.000000000 +0900
--- /usr/local/lib/perl5/site_perl/5.10.1/TheSchwartz.pm        2010-02-18 10:17:20.000000000 +0900
***************
*** 27,33 ****

  sub new {
      my TheSchwartz $client = shift;
!     my %args = @_;
      $client = fields::new($client) unless ref $client;

      croak "databases must be an arrayref if specified"
--- 27,33 ----

  sub new {
      my TheSchwartz $client = shift;
!     my %args = ref $_[0] ? %{ $_[0] } : @_;
      $client = fields::new($client) unless ref $client;

      croak "databases must be an arrayref if specified"

CentOSでperl 5.10.1 + Catalyst + mod_perl

CentOS 5.4は未だにperl-5.8.8なので、perl-5.10.1をソースからインストールした。この作業は簡単なので詳細は省く。

$ tar jxvf perl-5.10.1.tar.bz2
$ cd perl-5.10.1
$ ./Configure -de
$ make
$ make test
$ sudo make install

しかし標準でインストールされるmod_perlはあくまでperl-5.8.8用にビルドされている。本当ならSRPMを落としてきてリビルドするのがいいのだが、面倒なのでmod_perlのソースからインストールする。

mod_perlのインストールにはapxsが必要だ。これはhttpd-develパッケージに入っている。

$ sudo yum install httpd-devel

後はいつもの手順通り、mod_perlのインストールだ。

Continue reading

Catalyst + Lighttpd + FastCGI なテスト

CatalystのテストサーバをLighttpdで立ててくれるヘルパースクリプト。

Catalyst::Helper::Lighty にリスタート機能つけた – masaki@catalyst – Catalystグループ
http://catalyst.g.hatena.ne.jp/ikasam_a/20080318/1205778147

ヘルパーがあるおかげで操作は簡単。

// 事前にLighttpdとFastCGIをインストールしておく必要がある
// アプリを作成
$ catalyst.pl MyApp

// ヘルパーを実行
$ cd MyApp/script
$ ./myapp_create.pl Lighty

// テストサーバを起動......アレ?
$ ./myapp_lighty.pl
Type of arg 1 to Parallel::SubFork::sub_fork must be block or sub {} (not null operation) at ./myapp_lighty.pl line 75, near "&spawn_fastcgi )"
Execution of ./myapp_lighty.pl aborted due to compilation errors.

と言うわけでちょっとバグがある。ヘルパーモジュールLighty.pmを次のように編集する。

Continue reading

Static::SimpleとFormValidator::Simple::Auto

Catalyst::Plugin::Static::Simple
と、
Catalyst::Plugin::FormValidator::Simple::Auto
は同時に使えない……?(つーかモジュール名長すぎ)
エラーの意味が全然わかりませぬ(‘A`)

$ ./myapp_server.pl 
[debug] Debug messages enabled
[debug] Statistics enabled
[debug] Loaded plugins:
.----------------------------------------------------------------------------.
| Catalyst::Plugin::ConfigLoader  0.27                                       |
| Catalyst::Plugin::FormValidator::Simple  0.13                              |
| Catalyst::Plugin::FormValidator::Simple::Auto  0.18                        |
'----------------------------------------------------------------------------'

  〜中略〜

[info] MyApp powered by Catalyst 5.80007
Couldn't load class (MyApp) because: Inconsistent hierarchy during C3 merge of class 'MyApp': merging failed on parent 'Catalyst::Plugin::FormValidator::Simple::Auto' at /opt/local/lib/perl5/5.10.1/darwin-2level/mro.pm line 27.
Compilation failed in require at /opt/local/lib/perl5/site_perl/5.10.1/darwin-2level/Class/MOP.pm line 98.
 at /opt/local/lib/perl5/site_perl/5.10.1/darwin-2level/Class/MOP.pm line 102

  〜以下略〜

Continue reading

$c->uri_for_actionの引数

やっと理解できたのでメモ。uri_for_actionはドキュメントによると次のような構文になる。

$c->uri_for_action( $path, \@captures?, @args?, \%query_values? )

この“\@captures”と“@args”がそれぞれアトリビュートの“CaptureArgs”、“Args”に対応する。

例として、次のようなチェーンドアクションを考える。ユーザー情報を編集するようなページを想定している。

Continue reading