2011年7月31日星期日

Open Perl Modules in Vim

在写程序的时候,用到一些perl模块时,经常需要查看这些模块的源代码。以前用的方法是新开一个screen窗口,module_info Module::Name获得模块的路径,然后再在vim里面打开之

久之感觉这样做颇没效率,于是决定写一个vim的函数来实现":Pme Module::Name"即可打开perl模块的功能。

将以下代码写入 .vimrc即可实现这个功能

function! OpenPerlModule(module) let module_path = system("perldoc -l " . a:module) if v:shell_error == 1 echo module_path return endif execute "e " . module_path endfunction command -nargs=1 Pme call OpenPerlModule()

Posted via email from Tech Blog of Woosley.Xu

2011年7月3日星期日

HTML::FormHandler介绍

  • 使用HTML::FormHandler生成表单

首先尝试创建一个用户登录表单

package Update; use Moose; use HTML::FormHandler::Moose;   #使用has_fields等语法糖 extends {HTML::FormHandler} use namespace::autoclean; use Digest::MD5 qw/md5_hex/;  has '+name' => (default => 'update');  #form的名字 has '+auto_fieldset' => (default => 0); #不在form内添加fieldset #创建表单元素的依赖关系 has '+dependency' => (default => sub{[[qw/password confirm/]]}); has_field 'name' => (type => 'Text', required => 1); has_field 'email' => (type => 'Email', required => 1); #使用apply transform加密密码 has_field 'password' => (type => 'Password', required => 1, apply => [{ transform => sub{ md5_hex(shift)}}], ); has_field 'confirm' => (type => 'Password', required => 1, apply => [{ transform => sub{ md5_hex(shift)}}], );  sub validate { my ($self) = @_; if ($self->field('confirm')->value ne

$self->field(‘password’)–>value) {

$self->field('password')->add_error("password not match"); } }  package Main; my $form = update->new(); $form->process(params => {name => 'woosley'}); print $form->render;     Name:  Email:  Email field is required Password:  Please enter a password in this

field

Confirm:  Please enter a password in this

field

这里定义了一个用户update的form, 表单名为update,由'+name'一行定义,'+‘在moose里面表示这个属性在父对象里面定义,在子对象中可以进行覆盖操作。form里面包含name,password,email,所有的元素都是必须的

使用这个表单只需要像Main包里面一样,调用$form->process(param => {postparams});即可,$form->render获得HTML代码。可以看到上面代码里面只传入了name,因此会得到一堆错误信息.一般来说如果表单验证提交出错,所有的错误信息都放在$form->errors里面,所以一个表单提交过程应该为

$form = Form->new(); unless($form->process(params => {})){ ##处理 $form->errors } ## 表单提交成功

HTML::FormHandler根据params参数是否为空来确定是否为表单提交,如果params为空,process也会返回失败,从而跳过表单提交后续部分工作。

对于每一个field的验证,可用使用 sub validate_fieldname {} 或者添加在has_field里面添加apply来实现,并定义出错信息

has_field 'email' => ( unique => 1, apply => [ { check => qr/^\w+\.\w+\@gmail\.com$/, message => 'Invalid Email' } ]);

还可以如上添加validate method在最后验证整个表单

如前一篇博文所述,FormHandler使用不同的模块控制如何生成表单HTML,上面例子给出的>是<div&gt形式,我们也可以使用table形式或者在每一个field外面什么都不加

has '+widget_wrapper'   => (default => 'Table'); has '+widget_form' => (default => 'Table');

http://search.cpan.org/~gshank/HTML-FormHandler-0.34001/lib/HTML/FormHandler/... 详细介绍了如何render

to be continued….

Posted via email from Tech Blog of Woosley.Xu

2011年7月2日星期六

HTML::FormHandler介绍

根据Catalyst的胖Model,瘦Controller原则,在controller里面应该使用最少的代码来保持整个逻辑的清爽。 但对于任何一个web app来说,最复杂的逻辑之一就是表单的提交,验证表单,之后再根据需要从做相关 的操作,查询数据库或者返回错误。而这些都是Controller的任务

如果在Controller里面hardcode这部分逻辑,整个代码会变得冗长而丑陋,HTML::FormHandler就是为了简化 表单的处理而编写的模块。HTML::FormHandler使用Moose作为底层的OO库,代码实现比较优雅和干净。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 
package SEA::Forms::User;
use HTML::FormHandler::Moose;
extends 'HTML::FormHandler::Model::DBIC';
use namespace::autoclean;
use Digest::MD5 qw/md5_hex/;

has '+name' => (default => 'user');
has '+auto_fieldset' => (default => 0);
has '+item_class' => (default => 'User');
has '+dependency' => (default => sub { [[qw/password confirm/]] });
has_field 'id' => (
    type => 'Text',
    required => 1,
    accessor => 'username',
    unique => 1,
    apply => [
        { check => qr/^\w{7}$/,
            message => 'Invalid username'
        }
    ],
    messages => {
        required => 'username is required',
        unique => 'This username is already taken'
    },
);

has_field 'email' => (
    unique => 1,
    messages => {unique => 'This email is already taken'},
    apply => [
        { check => qr/^\w+\.\w+\@ericsson\.com$/,
            message => 'Invalid Email'
        }
    ],
);

has_field 'password' => (
    type => 'Password',
    accessor => 'password',
    apply => [
        { transform => sub { md5_hex(shift) }
        }
    ],
);

has_field 'confirm' => (
    type => 'Password',
    apply => [
        { transform => sub { md5_hex(shift) }
        }
    ],
);

has_field 'submit' => (
    value => 'submit',
    type => 'Submit',
    css_class => 'submit'
);

sub validate {
    my ($self) = @_;
    if ($self->field('confirm')->value ne $self->field('password')->value) {
        $self->field('password')->add_error("password not match");
    }
}

__PACKAGE__->meta->make_immutable;

HTML::FormHandler主要分为这么几个部分

  • HTML::FormHandler::Field::*

Field主要用来定义表单单元的类型,对某一种类型,会有相应的验证方法和属性,比如定义一个Text类型单元

has_field 'name'  => (Type => 'Text', maxlength => 30, minlength =>

6);

  • HTML::FormHandler::Widget::*

Widget用来生成Field的HTML代码,查看源代码,每一个widget都有个render方法,用来创建wdiget的HTML code,这里有两个特殊的widget。HTML::FormHandler::Widget::Wrapper::*,用来添加包裹每个表单单元的HTML,比如添加的是div

<input name="name", type="text">

还有一个是Widget::Form,定义…..部分如何生成

  • HTML::FormHandler:Moose

使用Moose定义的语法糖,比如has_field

HTML::FormHandler::Model::

与数据库交互的模块,值得注意的是FormHandler没有添加任何数据库操作的代码,而只是使用Moose Role定义了数据库操作所需要的方法。

to be continued…

Posted via email from Tech Blog of Woosley.Xu

2011年6月14日星期二

关于诗歌

我是个粗人啊粗人啊,平时喜欢读诗歌而已,
精致简洁的语句对我的吸引力很大,
读着这些语句能让人心情愉悦有莫有...
看多了就有点情不自禁,想自己写点什么,
于是有时偶尔会发发骚
扔上来一些不知所云之后看着自己都觉得幼稚的东西
大部分都是从已有的诗中东抄西凑然后改改拼出来的
比如那个子弹,是看了海子的 亚洲铜 后临摹出的句子
忆东港帮是从 水木 poem版里学来
我是个粗人啊粗人,粗糙的纯爷们,
常挂嘴边的是哥们赤条条来去无牵挂
写在这里是发现自己有文艺青年化的趋势
那不对的...要坚决制止

惶然书

胡桑

我迫不及待地完成。从地平线返回,
背负着夜的寂静,那令人渴望的形式,
学习如何再一次进入生活。白昼永不消失,
就这样存在着,像自己一样盲目。

回到这张活下来的床,回到
食物的体内,一只钟在拒绝时间,
我看见日子裂开。但你和我的
痛楚之间,一场风暴被目光熄灭。

各自的宁静在风暴的中心完成。
我入住恐惧,敲开它的缺席,
丧失之风吹开了另一种呼吸。
那些记忆裸露在一个空洞的下午,

它们在用另一个声音说话,
走向野蛮,用借来的步子。
我逐渐变轻,但一个诺言回到我身上,
只要有一条缝隙,时间就不会自行消失。

不要在现实之外,搜寻一个句子。
语言就住在事物的脸上,它不是
藏于自身的杀手,事物在四周懒散地
走动,那些秘密,无异于桌上的点心和茶水。

“世界比我想象的还要突然。”
带着讯息,它失去了自己的影子,
变得短暂而迟缓,破碎在人群中,
使我更加惶惑。但我看见无数个未来。

Posted via email from Stupid Town

2011年5月15日星期日

perl5.14.0发布 ((tags:perl)

perl5.14.0于UTC时间2011年5月14发布了[1,2,3],perl自5.10发布的时间轴如下:

  • 5.10 2007/12/18
  • 5.11 2009/08/02
  • 5.12 2010/04/12
  • 5.13 2010/05/20
  • 5.14 2011/05/14

扫描了一下perldelta,值得注意的更改有

  • unicode6.0的支持
  • IPv6的支持
  • 新的正则表达式修改符/r,可以保持原来变量不变而返回修改的结果

    $perl -E '$a = "perl", say $a =~ s/p/P/r; say $a' Perl perl
  • 数组和hash容器操作现在支持引用,比如现在可以

    push $hashref, $var;
  • 支持 package {}; 语法

更多参见perldelta文档

http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2011-05/msg00621.html

Posted via email from Tech Blog of Woosley.Xu

2011年5月9日星期一

躁动书

阳光徒劳
杨柳的阔叶静寂
时光停滞于树荫以下
面容平寂,目光投向远方

悲伤来袭
啜泣如洪峰泛滥
淹没一条江
断桥之缘
生活静立
停留的依然在身后
远去的早已过眼前

Posted via email from Stupid Town

2011年5月3日星期二

vim-perl@github

如果你使用vim开发perl的话,github上面的vim-perl一定对你有用

https://github.com/petdance/vim-perl

git clone下来make install即可安装上,这个包里面提供了perl,perl6,tt(template toolkit),xs的语法高亮。今天我就是在寻找折行perl模块内建pod的时候找到的这个项目,一些tip如下

"打开perl文件的折行功能 let perl_fold=1 "打开vim的tt文件的filetype au BufNewFile,BufRead *.tt setf tt2

顺便提一下vim插件 http://www.vim.org/scripts/script.php%3Fscript_id%3D556 也是使用vim开发perl的必备工具

Posted via email from Tech Blog of Woosley.Xu

2011年4月23日星期六

web开发

C360_2011-04-24_13-26-43


干了好些年SA类似的工作之后,由于各方面的原因, 最近我把大部分精力都放在web开发上面去了。
作为一个门外汉,直接使用比较成熟的开发框架比较容易上手,Perl社区里应用比较广泛的web开发framework是Catalyst,此外后起之秀还有DancerMojo。Catalyst和后两者有着截然不同的风格,catalyst注重社区代码的重用,使用了Moose这样的重量级模块,因此依赖关系相当复杂,据称安装Catalyst是一件令人头疼的事情,但根据我的经验来看,cpan和cpanm都可以很顺利的完成这项工作。而Dancer和Mojo,前者仅仅依赖少量几个模块,而后者号称只需要perl5.8.7以上版本就可以安装和运行,但这两个模块都在很大程度上重造了一些轮子。这两个框架还在开发当中,使用成熟的catalyst是比较理智的选择。

入手做web开发才发现要学的东西实在太多了,就Catalyst来说,如果不搭配上DBIx::Class那简直是暴殄天物,DBIx::Class号称是所有语言中最好用的ORM,当然我没有用过其他语言中的没有发言权。感觉与Catalyst以及相关模块,就像Vim一样,学习曲线陡峭,但如果你掌握了它,就会觉得很难离开他们了。

此外javascript也是web开发中不可缺少的一环,初接触javascript感觉这个语言设计相当奇怪,比如没有block作用域,奇技淫巧一般的面向对象实现方法(在这点上和perl很像),于是买了上图那本书作为参考。

经过一个多月的自学,我终于成功的把jquery和一些ajax的技术运用到了我的一个小作品上面,这个作品大大方便了我的工作,老板貌似对这个成果也很满意,毕竟在工作中主动创新的人实在不多(至少就本部门而言)。

我得尽快成为一个比较合格的perl web开发人员,为成为一个自由职业者添加底气。

Posted via email from Tech Blog of Woosley.Xu

2011年3月15日星期二

入手新睡袋

由于学车的关系,大半年没有出去进行户外活动,上一次还是去年十一时候在浙江大明山的一次。忍不住再骂那个教车的胡老头一声你大爷的,态度素质差不说,还拖了我们整整5个月时间。

我手上有个羽绒睡袋,08年时候在南京买的,仅仅花了两百块钱,显然不是什么好货,但舒适温度居然也有5度。经过去西藏的折腾,还有之后的数次户外活动,保暖性能大大下降,鹅绒从面料里面跑出来得现象严重,光荣的被我做成了枕头来用

这次希望挑个新睡袋,继续进行户外活动。以前买睡袋的时候随便买,图便宜,这次还真正认真研究了一下睡袋的性能参数

第一个就是温标,舒适低高温,极限低高温,一目了然。需要注意的是进口睡袋温标以西方人身体素质为标准,东方人没有那么好的耐寒能力,估计温标要提高几度。

第二个参数,也很重要的参数显然是填充物。一般睡袋分为羽绒和棉睡袋。羽绒睡袋轻便,保暖性也更好,所以我也没有研究棉睡袋,这里只讨论羽绒睡袋。

羽绒有鸭绒和鹅绒,总的来说鹅绒保暖性能超过鸭绒。鹅绒又有白/灰鹅绒之分,据说对性能没什么影响。影响羽绒性能的参数有三:含绒量,蓬松度和填充重量。填充重量显然指填充物总重量。而含绒量指羽绒中绒毛的百分比,保暖作用主要靠羽绒中的绒毛,据说鹅绒最高含绒量可达90~95%,而我上一个睡袋是60%白鹅绒....蓬松度指绒的膨胀度,膨胀度(Fill power)是指一盎司羽绒在68.4克压力下有多少立方英寸,这玩意知道膨胀度越高越好就行了,蓬松度从400到800,国产600的膨胀度是比较好的睡袋了。

我现在这个睡袋,不到400块钱, 含绒量:85%白鹅绒 充绒量:500g  蓬松度:600, 对比淘宝上的极星睡袋650  80%灰鹅绒,600g (据说shehe从来不标明蓬松度),感觉性价比还行。

第三个是面料,羽绒睡袋比较怕水,因此面料最好是防水透气的,而且还要防止漏绒。网上说最好230T密度以上的尼龙才行,但我在淘宝上转了一圈,基本上都是300T+的面料,没有看到低于290的。至于材质,都是什么尼龙,而我买的这个叫春亚纺,没搞清楚他们有什么区别。

第四个是外形,睡袋有三种类型,mummy式,又叫木乃伊式,信封式和混合式。后面一种见的不多。木乃伊式比较保暖,而信封式比较宽松,一般需求选木乃伊式没错。

据说其他还有很多细小注意得地方,拉链,口袋,胸领啥啥的,据说都可以对保暖性能产生影响,但这个在没有使用经验和对比时,说不出来什么好坏。

Posted via email from Stupid Town

2011年3月2日星期三

物体

话说昨晚我与众JRs相聊甚欢于AIM,只见屏幕右上里弹一窗口,言曰:peter上线。peter乃是多年好友,且常被幽禁闭于不知名小黑屋而不得上线,我自然上前道:p哥,近日可好?
殊不料peter答曰:这日子,可曾有半点好过?!我不由大惊,想peter当年于rdps,可当是“阵法方诸葛,阴谋胜范蠡”之谋略人士,才高八斗,我等JR乃是佩服之极,今日奈何出此言?遂问道:何人好大胆!敢在太岁p哥头上动土?
P哥却是不答,良久方后,方回到:一言难尽。接下来便是难懂的话,我隐约还记得几个词 ,什么“黄”,“搅基”,“电话不合适”,“女生”,“另外一个女生”之类。然而却是没懂其真义,乍看下似p哥在和女生抢女生?于是上前方待安慰几句,p哥却道:你休得要逞精神,将此事说将出去,当心我扁你。
南方散人为可多曰:吾辈岂是怕威胁之人?
遂有此八卦

Posted via email from Stupid Town

2011年2月14日星期一

在某些堆积浪漫的日子

在某些堆积浪漫的日子
我破碎的灵魂散落满地

数年前,
我便将我逝去的一生
高挂于火红的杏树上
如今它仍在那里
仍在那里
安静的成长,成熟,腐烂和死去

我路过数条长裙絮语
如雪莲花一样清澈迷人
盛夏盛开于飞旋的裙梢
掠过我隆冬里的指尖

在某些堆积浪漫的日子
我的灵魂破碎遍地
它们费力的聆听
风吹不透薄墙的声音

Posted via email from Stupid Town

在某些堆积浪漫的日子

在某些堆积浪漫的日子
我破碎的灵魂散落满地

数年前,
我便将我逝去的一生
高挂于火红的杏树上
如今它仍在那里
仍在那里
安静的成长,成熟,腐烂和死去

我路过数条长裙絮语
如雪莲花一样清澈迷人
盛夏盛开于飞旋的裙梢
掠过我隆冬里的指尖

在某些堆积浪漫的日子
我的灵魂破碎遍地
它们费力的聆听
风吹不透薄墙的声音

Posted via email from Stupid Town

2011年2月9日星期三

不爽sony ericsson xperia u20i的地方

我手头上的是索爱国行的机器,公司发下来有一个多月,但最近才刚开始折腾
诸多地方不爽
1:各种软件都不给力
索爱本身的软件,比如timescape,以及pc上的pc companior,功能单一,毫无亮点,不知道为什么成了手机入门里面的王牌软件
系统居然没有自带一个文件管理器
自带的信息功能不能保存信息,不知道是不是andriod的sms 软件都这样,下载了口碑极高的handsentSMS,也没有看到保存短信选项
2:被阉割的google
国行手机里面所有的google软件都被和谐掉了。其中Andriod Market, google talk我试着下载安装,能成功,但运行就立马退出。Google Maps最重要的纵横功能消失。其他Google软件没有测试,估计情况不会好到哪里去。
3:预装n多sb软件
比如开心网,百度,优酷,yahoo等等。全部预装在系统文件夹下面,没有root权限无法删除。
4:蛋疼的升级方式
升级关机之后,按返回键之前不需要开机。我升级多次失败,就是忽略了这一点。系统升级以后一个很无语的现象就是所有那些删除的开心网,百度之类又回来了,于是又要再删一遍。

Posted via email from Stupid Town