TokuLog!な人にSubjectだけじゃなくて、FromもMIMEエンコードしないと、携帯で返信できないyo!というメールをパッチとともにいただいたので、早速適用して、CPANにアップロードしておきました。
MIME::Lite::TT::Japanese 0.08
どうもありがとうございました。
ところで、SledgeのValidatorのほうですが、FormValidator::Simpleだとアップロードされたファイルについてのバリデーションができないことに気づいて、ちょっとなやんでます。とりあえず、アップロードできるように拡張したモジュールを書いてみているんですが、いまいちしっくりきません。。もうちょい時間がかかりそう。
2006年3月14日火曜日
2006年3月11日土曜日
FormValidator::Simple::ProfileManager::YAML
SledgeのValidatorを作るにあたって、FormValidator::Simple用のプロファイルをYAMLで定義するためのモジュールを書いてみました。
FormValidator::Simple::ProfileManager::YAML
まずは以下のようなYAMLファイルを用意します。
>
group1とかsubgroup1というのはプロファイルをグルーピングするのに使います。
使い方は簡単です。まずオブジェクトを作成します。
>
デフォルトではYAMLをロードするのにYAMLモジュールを使いますが以下のようにloaderをオプションとして渡すと、YAML::Syckを使うこともできます。
>
プロファイルを取得するには、get_profileメソッドを使います。パラメータとして、グループ名を渡せば、そのグループに属するプロファイルを取得することができます。
取得したプロファイルはそのままFormValidato::Simpleに渡すせます。
>
FormValidator::Simple::ProfileManager::YAML
まずは以下のようなYAMLファイルを用意します。
>
<
# sample yaml profile
group1 :
- name
- [ [NOT_BLANK] ]
- [ [NOT_BLANK], [EMAIL_LOOSE] ]
- tel
- [ [NOT_BLANK], [NUMBER_PHONE_JP] ]
- content
- [ [NOT_BLANK] ]
group2 :
subgroup1 :
- userid
- [ [NOT_BLANK]]
- password
- [ [NOT_BLANK]]
- name
- [ [NOT_BLANK] ]
- [ [NOT_BLANK], [EMAIL_LOOSE] ]
subgroup2 :
- tel
- [ [NOT_BLANK], [NUMBER_PHONE_JP] ]
- { zip : [zip1, zip2] }
- [ [ZIP_JP] ]
- address
- [ [NOT_BLANK] ]
group1とかsubgroup1というのはプロファイルをグルーピングするのに使います。
使い方は簡単です。まずオブジェクトを作成します。
>
<
use FormValidator::Simple::ProfileManager::YAML;
my $manager = FormValidator::Simple::ProfileManager::YAML->new('/path/to/profile.yml');
デフォルトではYAMLをロードするのにYAMLモジュールを使いますが以下のようにloaderをオプションとして渡すと、YAML::Syckを使うこともできます。
>
<
my $manager = FormValidator::Simple::ProfileManager::YAML->new(
'/path/to/profile.yml',
{
loader => 'YAML::Syck',
}
);
プロファイルを取得するには、get_profileメソッドを使います。パラメータとして、グループ名を渡せば、そのグループに属するプロファイルを取得することができます。
取得したプロファイルはそのままFormValidato::Simpleに渡すせます。
>
<
# group1のプロファイルを取得
my $profile1 = $manager->get_profile('group1');
# subgroup2のプロファイルを取得
my $profile2 = $manager->get_profile( 'group2', 'subgroup2' );
#取得したgroup1のプロファイルをそのままわたす。
my $result = FormValidator::Simple->check($q , $profile1);
2006年3月10日金曜日
SledgeのValidatorを作ろうと決意するにいたったわけ
Sledgeのバリデータといえば、Sledge::Plugin::Validatorなんですが、このプラグインが出てくる前からSledgeをいじっていたので、バリデータは自前で実装したものを使っていました。
このバリデータの機能はこんな感じのものでした。
- バリデーションのルールはXMLで定義する。
- バリデータをuseするだけで、バリデーションが効くようになり、それを削除してもプログラムは問題なく動く(Pagesクラスにバリデーションに関するコードを書く必要がない)
- バリデーションはPOSTリクエスト時にのみ作動し、BEFORE_DISPATCHのトリガとして動作する
- エラーを見つけるとテンプレートのパラメータにエラーをセットし、post_dispatch_fooをスキップし、dispatch_fooのみ実行する
- バリデータをuseするだけで自動的にバリデーションが効くようにするということをやるために、XMLの設定ファイルでは、Pagesクラスとdispatch名とそれごとのルールを記述できるようになっている
- エラーメッセージはデフォルトのものが用意されており、上記XMLファイルでルールごとに独自のメッセージを定義することもできる。
当時は設定ファイルといえばXMLだ!ってな風潮だったので、それにのっかって設定ファイルをXMLにしたんです。このバリデータ、今も使っているのですが、使っていくうちにいろいろと不満な点も出てきていました。たとえば、
- XMLの可読性が低い!ルールを定義するときも設定ファイルとにらめっこ。
- メッセージの切り替えができない(英語版と日本語版のページを用意する場合にこまる)
- エラーがあった際の動作を独自に定義できない。
- 1つのdispatch内で条件によってルールを変更できない。(できるけどやり方が変態的)
とまぁ結構あったのですが、実際にどうしてもこのバリデータじゃできないってことに直面しなかったので、ちょこちょこ手を加えながらこれを使いつづけてました。
それが、前回の記事、「SledgeでUTF-8なサイトをつくる」の方法で、UTF-8なサイトを作った時のこと、プログラム内で扱うデータがFlagged UTF-8になったため、エラーメッセージが文字化けしてしまうようになってしまったため、重い腰を上げて新たにバリデータを作ることにしました。
まず、Flagged UTF-8を扱えるようにすること、さらに設定ファイルはXMLから可読性が高くて最近流行のYAMLに変更、バリデーションを実行する部分はFormValidator::Simpleを使うことで、FormValidator::Simple用にたくさん用意されたプラグインの恩恵を受けられるようにというような方針で作ろうと思います。
最初、Sledge::Plugin::Validatorを拡張して使おうかとも思ったのですが、設定ファイルにdispatchごとのルールを定義しておくと、自動でバリデーションを実行してくれるという挙動が気に入っているので、自分で作ることにしました。
このバリデータの機能はこんな感じのものでした。
- バリデーションのルールはXMLで定義する。
- バリデータをuseするだけで、バリデーションが効くようになり、それを削除してもプログラムは問題なく動く(Pagesクラスにバリデーションに関するコードを書く必要がない)
- バリデーションはPOSTリクエスト時にのみ作動し、BEFORE_DISPATCHのトリガとして動作する
- エラーを見つけるとテンプレートのパラメータにエラーをセットし、post_dispatch_fooをスキップし、dispatch_fooのみ実行する
- バリデータをuseするだけで自動的にバリデーションが効くようにするということをやるために、XMLの設定ファイルでは、Pagesクラスとdispatch名とそれごとのルールを記述できるようになっている
- エラーメッセージはデフォルトのものが用意されており、上記XMLファイルでルールごとに独自のメッセージを定義することもできる。
当時は設定ファイルといえばXMLだ!ってな風潮だったので、それにのっかって設定ファイルをXMLにしたんです。このバリデータ、今も使っているのですが、使っていくうちにいろいろと不満な点も出てきていました。たとえば、
- XMLの可読性が低い!ルールを定義するときも設定ファイルとにらめっこ。
- メッセージの切り替えができない(英語版と日本語版のページを用意する場合にこまる)
- エラーがあった際の動作を独自に定義できない。
- 1つのdispatch内で条件によってルールを変更できない。(できるけどやり方が変態的)
とまぁ結構あったのですが、実際にどうしてもこのバリデータじゃできないってことに直面しなかったので、ちょこちょこ手を加えながらこれを使いつづけてました。
それが、前回の記事、「SledgeでUTF-8なサイトをつくる」の方法で、UTF-8なサイトを作った時のこと、プログラム内で扱うデータがFlagged UTF-8になったため、エラーメッセージが文字化けしてしまうようになってしまったため、重い腰を上げて新たにバリデータを作ることにしました。
まず、Flagged UTF-8を扱えるようにすること、さらに設定ファイルはXMLから可読性が高くて最近流行のYAMLに変更、バリデーションを実行する部分はFormValidator::Simpleを使うことで、FormValidator::Simple用にたくさん用意されたプラグインの恩恵を受けられるようにというような方針で作ろうと思います。
最初、Sledge::Plugin::Validatorを拡張して使おうかとも思ったのですが、設定ファイルにdispatchごとのルールを定義しておくと、自動でバリデーションを実行してくれるという挙動が気に入っているので、自分で作ることにしました。
2006年3月7日火曜日
SledgeでUTF8なサイトを作る。
Sledgeはプログラム内で扱うデータがEUC-JPにエンコードされたバイナリデータを前提としていて、テンプレートもEUC-JPで作成する必要があります。
これだけが原因ではないのですが、UTF-8なサイトを作ろうとすると、結構いろいろなワナがあります。
このことはSledgeのメーリングリストでも、過去にいろいろ議論されています。
http://lists.sourceforge.jp/mailman/archives/sledge-users/2004-March/000281.html
http://lists.sourceforge.jp/mailman/archives/sledge-users/2004-March/000292.html
http://lists.sourceforge.jp/mailman/archives/sledge-users/2004-March/000294.html
これらの議論は2004年の3月に行われているので、もう2年も前。これだけ時間がたっているので、SledgeでUTF-8をガンガン使っている人もたくさんいると思うのですが、最近ふと、SledgeでUTF8なサイトを作ろうと思い、情報集めのためにググッてみた際、「SledgeでUTF-8扱うにはこうすればいい!」というようなそのものずばりな解決法が見つからなかったので、僕がSledgeでUTF8なサイトを作ったその過程と成果物をさらしてみたいと思います。
* 過程
まず、SledgeでUTF-8を扱うにあたって、以下のような暗黙のルールを定義しました。
- プログラム内で扱うデータはFlagged UTF-8
- テンプレートの文字コードはUTF-8
- RequestクラスでインプットデータをFlagged UTF-8にデコード
- アウトプット時にUnflagged UTF-8にエンコード
- mod_perlで運用すること前提。CGIでの動作は無視
次に上記を実現するようなモジュールを書いてみました。
*** Sledge::Pages::Apache::I18N
まずは、インプットデータをFlagged UTF-8にデコードするRequestクラスを作ってみました。これはSledgeに標準でついているSledge::Charset::UTF8を使うとできそうですが、Sledge::Charset::UTF8でインプットデータをFlagged UTF-8にデコードしてもApache::RequestがUnflaggedなデータにしてしまうため、うまくいかないようです。
なので、Apache::Requestをどうにかしないといけないのですが、CPANを眺めていたら、Apache::Request::I18Nというまさにそのものずばりなモジュールがあったのでこいつを使ってみました。
こいつを使って書いたSledge::Pages::Apacheの代替モジュールはこんな感じです。
>
*** Sledge::Charset::UTF8::I18N
次に、Sledge::Pages::Apache::I18Nでインプットデータのデコードをやってくれるようになったので、
アウトプットの際のエンコードのみを行うSledge::Charsetサブクラスを作りました。
>
*** Sledge::Template::TT::I18N
最後に、UTF-8なテンプレートを読み込んで内部ではFlagged UTF-8として扱ってくれるSledge::Template::TTの代替モジュールを作成しました。Sledge::Template::TTだとUTF-8なテンプレートを読み込んでも内部では、UnflaggedなUTF-8として扱われるので、Flagged UTF-8な文字列を埋め込むと文字化けを起こしてしまいます。
>
*** MyProj::Pagesクラスに組み込む
今まで作成したモジュールはこんな感じでPagesクラスに組み込みました。
>
これでとりあえず、SledgeでUTF-8を扱うことができました。
* 成果物
今回作成したモジュールたちです。
- Sledge-Pages-Apache-I18N-0.01
- Sledge-Template-TT-I18N-0.01
- Sledge-Charset-UTF8-I18N-0.01
これだけが原因ではないのですが、UTF-8なサイトを作ろうとすると、結構いろいろなワナがあります。
このことはSledgeのメーリングリストでも、過去にいろいろ議論されています。
http://lists.sourceforge.jp/mailman/archives/sledge-users/2004-March/000281.html
http://lists.sourceforge.jp/mailman/archives/sledge-users/2004-March/000292.html
http://lists.sourceforge.jp/mailman/archives/sledge-users/2004-March/000294.html
これらの議論は2004年の3月に行われているので、もう2年も前。これだけ時間がたっているので、SledgeでUTF-8をガンガン使っている人もたくさんいると思うのですが、最近ふと、SledgeでUTF8なサイトを作ろうと思い、情報集めのためにググッてみた際、「SledgeでUTF-8扱うにはこうすればいい!」というようなそのものずばりな解決法が見つからなかったので、僕がSledgeでUTF8なサイトを作ったその過程と成果物をさらしてみたいと思います。
* 過程
まず、SledgeでUTF-8を扱うにあたって、以下のような暗黙のルールを定義しました。
- プログラム内で扱うデータはFlagged UTF-8
- テンプレートの文字コードはUTF-8
- RequestクラスでインプットデータをFlagged UTF-8にデコード
- アウトプット時にUnflagged UTF-8にエンコード
- mod_perlで運用すること前提。CGIでの動作は無視
次に上記を実現するようなモジュールを書いてみました。
*** Sledge::Pages::Apache::I18N
まずは、インプットデータをFlagged UTF-8にデコードするRequestクラスを作ってみました。これはSledgeに標準でついているSledge::Charset::UTF8を使うとできそうですが、Sledge::Charset::UTF8でインプットデータをFlagged UTF-8にデコードしてもApache::RequestがUnflaggedなデータにしてしまうため、うまくいかないようです。
なので、Apache::Requestをどうにかしないといけないのですが、CPANを眺めていたら、Apache::Request::I18Nというまさにそのものずばりなモジュールがあったのでこいつを使ってみました。
こいつを使って書いたSledge::Pages::Apacheの代替モジュールはこんな感じです。
>
<
package Sledge::Pages::Apache::I18N;
use strict;
use base qw(Sledge::Pages::Base);
use Apache;
use Apache::Request::I18N;
sub create_request {
my ($self, $r) = @_;
my $req = Apache::Request::I18N->new(
$r || Apache->request,
DECODE_PARMS => 'utf-8',
);
# $req->param; do parse here
return $req;
}
1;
*** Sledge::Charset::UTF8::I18N
次に、Sledge::Pages::Apache::I18Nでインプットデータのデコードをやってくれるようになったので、
アウトプットの際のエンコードのみを行うSledge::Charsetサブクラスを作りました。
>
<
package Sledge::Charset::UTF8::I18N;
use strict;
use base qw(Sledge::Charset::Null);
use vars qw($VERSION);
$VERSION = '0.01';
use Encode;
sub content_type {
return 'text/html; charset=UTF-8';
}
sub output_filter {
my($self, $content) = @_;
return Encode::encode("UTF-8", $content);
}
1;
*** Sledge::Template::TT::I18N
最後に、UTF-8なテンプレートを読み込んで内部ではFlagged UTF-8として扱ってくれるSledge::Template::TTの代替モジュールを作成しました。Sledge::Template::TTだとUTF-8なテンプレートを読み込んでも内部では、UnflaggedなUTF-8として扱われるので、Flagged UTF-8な文字列を埋め込むと文字化けを起こしてしまいます。
>
<
package Sledge::Template::TT::I18N;
use strict;
use base qw(Sledge::Template::TT);
use vars qw($VERSION);
$VERSION = '0.01';
sub output {
my $self = shift;
my %config = %{$self->{_options}};
my $input = delete $config{filename};
$config{LOAD_TEMPLATES} = [Sledge::Template::TT::I18N::Provider->new(\%config)];
my $template = Template->new(\%config);
unless (-e $input) {
Sledge::Exception::TemplateNotFound->throw(
"No template file detected. Check your template path.",
);
}
$template->process($input, $self->{_params}, \my $output)
or Sledge::Exception::TemplateParseError->throw($template->error);
return $output;
}
package Sledge::Template::TT::I18N::Provider;
use strict;
use base qw(Template::Provider);
sub _load {
my $self = shift;
my ($data, $error) = $self->SUPER::_load(@_);
if(defined $data) {
$data->{text} = utf8_upgrade($data->{text});
}
return ($data, $error);
}
sub utf8_upgrade {
my @list = map pack('U*', unpack 'U0U*', $_), @_;
return wantarray ? @list : $list[0];
}
1;
*** MyProj::Pagesクラスに組み込む
今まで作成したモジュールはこんな感じでPagesクラスに組み込みました。
>
<
package YourProj::Pages;
use strict;
use base qw(Sledge::Pages::Apache::I18N);
use Sledge::Template::TT::I18N;
use Sledge::Charset::UTF8::I18N;
....
sub create_charset {
my $self = shift;
Sledge::Charset::UTF8::I18N->new($self);
}
これでとりあえず、SledgeでUTF-8を扱うことができました。
* 成果物
今回作成したモジュールたちです。
- Sledge-Pages-Apache-I18N-0.01
- Sledge-Template-TT-I18N-0.01
- Sledge-Charset-UTF8-I18N-0.01
2006年2月3日金曜日
SledgeのPluginをいくつかCPANにアップしました
ちょこちょと作ってこのブログでも紹介していたSledgeのプラグインのうちいくつかをCPANにアップロードしました。
- Sledge::Plugin::Prototype 0.02
- Sledge::Plugin::IfModifiedSince 0.05
Sledge::Plugin::IfModifiedSinceはブログで公開したのからちょっと改良を加えていて、set_last_modifiedメソッドでLast-Modifiedヘッダに更新日をセットすることができるようになったり、if_modified_sincedメソッドにファイルのパスを渡せば、そのファイルの更新日とIf-Modified-Sinceヘッダを比較するようになったりしてます。
- Sledge::Plugin::Prototype 0.02
- Sledge::Plugin::IfModifiedSince 0.05
Sledge::Plugin::IfModifiedSinceはブログで公開したのからちょっと改良を加えていて、set_last_modifiedメソッドでLast-Modifiedヘッダに更新日をセットすることができるようになったり、if_modified_sincedメソッドにファイルのパスを渡せば、そのファイルの更新日とIf-Modified-Sinceヘッダを比較するようになったりしてます。
Template::Plugin::AutoLink
テキスト中のURLやメールアドレスを自動でハイパーリンクに置換してくれるTTフィルターを書いてみました。
Template::Plugin::AutoLink 0.03
こんな感じで使います。
>
こういう機能をもったプラグインて絶対すでにあるだろうと思っていたんですが、CPANで探しても見つからなかったので、書いたんですが、実はあったりするのかな。
追記
miyagawaさんが作ったTemplate::Plugin::Clickableというまったく同じことができるモジュールがすでにありました。やっぱないわけないですよね。。
Template::Plugin::AutoLink 0.03
こんな感じで使います。
>
<
# テンプレート内
[% use AutoLink %]
[% FILTER auto_link target='_blank' %]
hori-uchi.com
http://hori-uchi.com/
[% END %]
# アウトプットはこんな感じ
Search here
http://hori-uchi.com/
こういう機能をもったプラグインて絶対すでにあるだろうと思っていたんですが、CPANで探しても見つからなかったので、書いたんですが、実はあったりするのかな。
追記
miyagawaさんが作ったTemplate::Plugin::Clickableというまったく同じことができるモジュールがすでにありました。やっぱないわけないですよね。。
2006年1月21日土曜日
映画「シムソンズ」完成披露試写会にいってきました。
月曜日のことになりますが、シムソンズムービーブログで協力させていただいた映画「シムソンズ」の完成披露試写会に行ってきました。
生加藤ローサはかわいかった!でも個人的には「妖怪大戦争」にも出ていた高橋真唯が一番でした。
下の動画はマスコミ用の撮影タイムに一緒に撮影したものです。
[映画][カーリング][シムソンズ]
映画「シムソンズ」完成披露試写会にて
by ほりやす
映画の内容も期待以上によかったです。
「ウォーターボーイズ」とか「スウィングガールズ」が好きな方はぜひ見てください。
感動することまちがいなしです。
http://www.sim-sons.com/
生加藤ローサはかわいかった!でも個人的には「妖怪大戦争」にも出ていた高橋真唯が一番でした。
下の動画はマスコミ用の撮影タイムに一緒に撮影したものです。
[映画][カーリング][シムソンズ]
映画「シムソンズ」完成披露試写会にて
by ほりやす
映画の内容も期待以上によかったです。
「ウォーターボーイズ」とか「スウィングガールズ」が好きな方はぜひ見てください。
感動することまちがいなしです。
http://www.sim-sons.com/
登録:
投稿 (Atom)