Tuesday, May 30, 2006

Paper

U know I'm lazy, I need to submit my paper to my mentor tomorrow. so I'm struggling with it this night.

o,o Google translator is great. it helps a lot. :)
http://translate.google.com/translate_t

I'm back HangZhou yesterday, I'll be stay here for 2-3 weeks I think. It's my last school time. :)

God bless me.
Saturday, May 27, 2006

WWW::Mechanize++

I should suggest u guys all to have a try of WWW::Mechanize
WWW::Mechanize is damn useful. I use it to fecth all contacts information from mail suppliers such as Yahoo, Hotmail, Gmail, 163, Sina, Sohu and Tom.
ya, many thanks for petdance, it works great! (though all the supplier are using javascript a lot, a pity that WWW::Mechanize don't support javascript)

and TT2 ++, a new version of 2.15 is released. TT is my lovest template system ever.
http://search.cpan.org/src/ABW/Template-Toolkit-2.15/Changes
Sunday, May 21, 2006

Catalyst and FormValidator::Simple

检验用户输入信息的正确性几乎是所有 Web 编程者都需要做的事。有句话是永远不要相信你的用户。每一个用户都可能是骇客。
Catalyst 中我最喜欢的检测插件是 Catalyst::Plugin::FormValidator::Simple
我可以用个简单一点的例子来说明一下。

假设最简单的用户注册。一个用户名 6-12 个字符。密码 6-20 个,输入两次,两次都一样。 email 一个。要求大致正确。用户名和 email 必须与数据库里已有的不冲突。
Controller 大致为这样子:
sub register : Global {
my ( $self, $c ) = @_;

$c->stash->{template} = 'user/register.html';

return unless ($c->req->param('process'));

# execute validation.
$c->form(
username => [[ 'DBIC_UNIQUE', $c->model('DBIC')->resultset('User'), 'username' ], qw/NOT_BLANK ASCII/, [qw/LENGTH 6 20/] ],
password => [qw/NOT_BLANK/, [qw/LENGTH 6 12/] ],
email => [qw/NOT_BLANK EMAIL_LOOSE/, [qw/LENGTH 5 20/], [ 'DBIC_UNIQUE', $c->model('DBIC')->resultset('User'), 'email' ] ],
{ passwords => ['password', 'confirm_password'] } => ['DUPLICATION'],
);

my $result = $c->form;
return if ( $result->has_error );
$c->form 就是 Catalyst::Plugin::FormValidator::Simple 所提供的函数。DBIC_UNIQUE 检验机制是由 FormValidator::Simple::Plugin::DBIC::Unique 所提供的。主要用于检测表中的某一字段是否是 unique 独一的。我们所看到的如 NOT_BLANK LENGTH EMAIL_LOOSE DUPLICATION 都是 FormValidator::Simple 所自带的检测机制。还有 DATE 用于检测输入的日期是否合法,Regex 等。可以查阅 perldoc FormValidator::Simple
上面的是检查,然后如果出错要把错误显示出来。这里我觉得有点不方便。比如说 username 到底是违反了哪一条。 $c->form->error('username') 返回的是一个匿名数组,如 [ 'DBIC_UNIQUE', 'LENGTH' ] 我的习惯是将错误消息显示在 username text 输入框的旁边,而不是把所有的错误消息都放一起。这样判断起来很麻烦。我差不多得这么写:
<input type='text' name='username' length='12' />
[% FOREACH type IN c.form.error('username') %]
[% IF type == 'DBIC_UNIQUE' %]
This username is used by another one.
[% END %]
....
[% END %]
这种是比较愚笨的方法。我对这个也没用过几次,所以可能有好办法还没发现。perldoc 中提到了用 yml 来定义错误信息,或者这个比较可行,但是我不太喜欢,因为我在做多语言版本的 Forum

或许我得再仔细研究下错误怎么显示才是最方便的。:) later~

update
我发现这样子是可行的:
 [% IF c.form.error('username') %]
[% IF IF c.form.error('username', 'DBIC_UNIQUE') %]
This username is used by another one.
[% ELSE %]
username should be 6-20 chars.
[% END %]
[% END %]
Wednesday, May 17, 2006

YAPC::Asia 2006 video download

http://www.archive.org/search.php?query=subject:%22yapc%22

u know it's interesting. It has haskell, Catalyst, JSAN and Ajax, Jemplate and Perl 6.
and Damain Conway, Audrey Tang, Larry Wall and Ingy dot Net are present.

:)
Sunday, May 14, 2006

Mother's Day

today is mother's day, please don't forget it. :)

use Date::Holidays::CN;

my ($year, $month, $day) = (localtime)[ 5, 4, 3 ];
$year += 1900;
$month += 1;
if (my $holidayname = is_cn_holiday( $year, $month, $day )) {
print $holidayname;
}
Thursday, May 11, 2006

$c->forward stuff

Catalyst 的 forward 并不如想象中的那么好。
第一,它不能返回 array, 它只能返回 $scalar
第二,当它返回 undef 的时候,它实际上返回的是一个数值 0

第二是个很奇怪的事,然后我看了看 Catalyst 的代码,发现都是这一句的错。

Catalyst.pm 1121
eval { $c->state( &$code( $class, $c, @{ $c->req->args } ) || 0 ) };

我给他们的 mailing list 发了个消息:http://lists.rawmode.org/pipermail/catalyst/2006-May/007418.html

Yuval Kogman 回复说原因是为了兼容以前的代码。以后会有一个新的 call 方法推出,将支持 array 和返回 undef
而 Perrin Harkins 和 Matt S Trout 建议不要用 forward 而是用普通的 subroutine, 只是将第一个参数 $c 传过去。这也是非常好的一个方法,我可不要钻牛角尖。:)
Thursday, May 04, 2006

sri left Catalyst

诸如通告所说,Sri 离开了 Catalyst 项目。http://lists.rawmode.org/pipermail/catalyst/2006-May/007250.html
该项目的其他主要开发人员都没变。

他将开始一个新的 MVC 项目。名字可能是 Mojo.
不过 CPAN 上有个原型,叫 ReAction, 可以从这下过来看看:http://search.cpan.org/~mstrout/Reaction-0.001000_001/
ReAction 将严重依赖于 Moose.
Moose 是个差不多类似于 Perl 6 OO 的 Perl 5 的实现。由 Pugs 的开发人员 Stevan Little 写的。
在 Win32 下要安装 Moose, 得去下 ActivePerl 5.8.8,因为需要 List::Utils 1.18

据我推测,Mojo 或者 ReAction 将不像 Catalyst 那样支持任意的 Model 而是用了 DBIx::Class. 而且将会采用 Dojo 作为基础的 javascript 库。
虽然没有 Catalyst 那么容易扩展,不过我还是挺期待 sri 的作品的。
当然,目前基于 Catalyst 的项目我也没有打算要迁移到新的 MVC 上。

百花争放,这是个好现象。:)