2011年12月7日星期三

[PerlChina] 2011 CN Perl Advent Day 7: Imager::QRCode


=for advent_year 2011

=for advent_day 7

=for advent_title Imager::QRCode

=for advent_author CGI.NET

M<Imager::QRCode> 有趣的二位码生成模块。

随着电子商务的兴起,二维码这种东西越来越多的出现在我们的生活中,想不想给你的用户也拥有一份属于自己网站的二维码呢?那用Imager::QRCode就没错了。

Imager::QRCode是一套基于开源二维码生成库libqrencode的模块,这两个的作者都是日本人。

Imager::QRCode自带了libqrencode的源码,并且在安装的时候会自动编译,所以你不用去专门下载libqrencode而只需要使用CPAN正常安装即可。

需要说明的是Imager::QRCode依赖Imager模块,并且生成的图片格式也是依赖Imager模块能产生的格式。所以如果你希望生成GIF格式的文件却发现没有任何效果不妨先检查下你所装的Imagerm模块是否能正常生成GIF格式的文件。


Imager::QRCode使用的方法非常简单:

=begin code

#!/usr/bin/perl -w
use Imager::QRCode;
my $qrcode = Imager::QRCode->new(
        size          => 2,
        margin        => 2,
        version       => 1,
        level         => 'M',
        casesensitive => 1,
        lightcolor    => Imager::Color->new(255, 255, 255),
        darkcolor     => Imager::Color->new(0, 0, 0),
    );
    my $img = $qrcode->plot("You infomation here!");
       $img->write(file => 'qrcode.gif', type=>'gif')  or die  $img->errstr;
     
=end code

有关Libqrencode的信息可以访问 L<http://fukuchi.org/works/qrencode/index.html.en>
更多的使用方法请参阅 perldoc M<Imager::QRCode>。

谢谢。


--
Fayland Lam // http://www.fayland.org/

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

2011年12月6日星期二

[PerlChina] 2011 CN Perl Advent Day 6: BerkeleyDB

http://perlchina.github.com/advent.perlchina.org/2011/BerkeleyDB.html 

=for advent_year 2011

=for advent_day 6

=for advent_title BerkeleyDB

=for advent_author Fayland Lam

M<BerkeleyDB> 是个高性能的数据库。

当您需要操作一个极其巨大的文件,需要构造一个 super big 的 hash 或者 array 的时候,内存可能就是您最大的烦恼所在。而 BerkeleyDB 可以通过硬盘空间来保存该 hash 或者 array,到时候可以快速定位和 sort 之类,来完成您的需求。

BerkeleyDB 的详细介绍和设计可以参阅 A<http://www.aosabook.org/en/bdb.html|The Architecture of Open Source Applications> 的章节。

在 Ubuntu 之类的系统下可以通过 $ sudo apt-get install libberkeleydb-perl 来安装,FreeBSD 可以到 /usr/ports/databases/p5-BerkeleyDB 来 make install, Win32 下不支持,其它的可以 Google 得到安装指南。

在单线程的情况下,一个简单的例子如下:

=begin code

use FindBin qw/$Bin/;
use BerkeleyDB;

my $berkeleydb_temp_file = "$Bin/tmp.berkeleydb"; # temp file for BerkeleyDB
tie my %data, 'BerkeleyDB::Hash',
    -Filename => $berkeleydb_temp_file,
    -Flags    => DB_CREATE|DB_TRUNCATE
        or die "Cannot create file: $! $BerkeleyDB::Error\n";
open(my $fh, '<', 'RealBigFile.log') or die "Can't open: $!";
while (my $line = <$fh>) {
    ## some code that %data will be a real very big hash
    ## we just need the first line and the last line which matches the $pattern
    my $pattern = get_pattern($line);
    if (exists $data{"start_$pattern"}) {
        $data{"end_$pattern"} = $line;
    } else {
        $data{"start_$pattern"} = $line;
    }
}
close($fh);
# now working on the %data

=end code

你可以不停的 ls -ls 来查看 tmp.berkeleydb 的大小,顺便 monitor 下内存。

BerkeleyDB 对多线程的支持也很不错,支持数千并发线程,最大 256TB 数据。在多线程的情况下,需要使用 BerkeleyDB::Env cds_lock 保证数据安全。简单的例子如下:

=begin code

my $env = new BerkeleyDB::Env
    -Home   => $tmp_dir,
    -Flags  => DB_CREATE|DB_INIT_CDB|DB_INIT_MPOOL
        or die "cannot open environment: $BerkeleyDB::Error\n";
my $db = tie my %data, 'BerkeleyDB::Hash',
    -Filename => $berkeleydb_temp_file,
    -Flags    => DB_CREATE,
    -Env      => $env
        or die "Cannot create file: $! $BerkeleyDB::Error\n";

my $pm = new Parallel::ForkManager(4);
foreach my $i (1 .. 1000) {
    $pm->start and next; # do the fork
    
    my $lock = $db->cds_lock();
    $data{$i} = $i * 2;
    $db->db_sync();
    $lock->cds_unlock();
    
    $pm->finish; # Terminates the child process
}

$pm->wait_all_children;

=end code

更多的使用方法请参阅 perldoc M<BerkeleyDB>。

谢谢。


--
Fayland Lam // http://www.fayland.org/

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

2011年12月5日星期一

[PerlChina] 2011 CN Perl Advent Day 5: Data::MessagePack

http://perlchina.github.com/advent.perlchina.org/2011/MessagePack.html 

=for advent_year 2011

=for advent_day 5

=for advent_title Data::MessagePack

=for advent_author Fayland Lam

很多时候我们经常会碰到,要将某个对象或者变量保存起来,然后在另外的时间或者地点重新使用它。这种用途非常广泛,但是您可能没有发现。比如当您用 Cache 模块的时候,我们都需要将要保存的东西先转化成 binary 或者文本格式,然后再保存到缓存里。

在计算机世界,这种做法叫做 B<serialize>。

Perl 里最常见的是 M<Storable>。Storable 很古老但却最常用。它的缺点之一是不垮语言的。你无法用其他语言来 deserialize 出保存的东西。但是它很强大,可以 serialize 复杂的模块实例。

另外常用的有 M<JSON> 甚至 M<YAML>。JSON 更流行一些。它们的优点在于不 deserialize 也可以直接看到内容。

而今天我们要介绍的是 M<Data::MessagePack>。它相对 JSON 的优点在于小(节省内存)而且快速。它也是跨语言的,大部分流行的语言支持都可以在 A<http://msgpack.org/> 里找到。

它的 RPC 实现是 M<AnyEvent::MPRPC>。

使用例子摘抄 perldoc:

=begin code

use Data::MessagePack;

my $mp = Data::MessagePack->new();
$mp->canonical->utf8->prefer_integer if $needed;

my $packed   = $mp->pack($dat);
my $unpacked = $mp->unpack($dat);

=end code

更多更详细的可以查阅模块文档和 msgpack.org 网站。

谢谢。

--
Fayland Lam // http://www.fayland.org/

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

2011年12月4日星期日

Re: [PerlChina] 2011 CN Perl Advent Day 2 - qr/Moo?/

小牧今晚会把老的导上去。

在 2011年12月4日 下午4:47,Qiang (James) <shijialee@gmail.com>写道:
On 12/02/2011 07:07 PM, cnhack TNT wrote:
> advent.perlchina.org <http://advent.perlchina.org> 谁在管理?能否更新上
> 去啊。。。现在居然跳到某个公司的页面去了。。。
>

现在服务器由 Achilles 提供,我把这个问题和他说了,修复好后就可以看到以前
的 advent 了。

Qiang

>
>
> 2011/12/2 Fayland Lam <fayland@gmail.com <mailto:fayland@gmail.com>>
>
>     http://perlchina.github.com/advent.perlchina.org/2011/Moooo.html
>
>     =for advent_year 2011
>
>     =for advent_day 2
>
>     =for advent_title qr/Moo?/
>
>     =for advent_author Woosley Xu
>
>     每个人都喜欢面向对象编程,于是每个人都喜欢L<Moose>。但是有些时候,Moose
>     的加载速度成为了我们应用的瓶颈。这时候L<Mouse>出现了,L<Class::Accessor>
>     出现了。但这还不够,L<Mouse>仍然过于沉重,L<Class::Accessor>仍然只能提供
>     有限的特性。这时候,L<Moo>和L<Mo>出现了。
>
>     L<Moo>与L<Mouse>最大的区别是:它完全不提供任何B<meta object protocol>,
>     因此它的速度更快,体积更小。在将来的1.0版本,它计划可以和L<Any::Moose>一
>     起使用。
>
>     如果你仍然觉得L<Moo>太过重量级,那么L<Mo>是你的下一个选择。L<Mo>核心只提
>     供B<new>,B<extends>,B<has>这些功能,但你可以按照需求加载你所需要的功能
>     。
>
>     =begin code
>
>     use Mo qw'build default builder coerce is required';
>
>     sub BUILD {
>     my $self = shift;
>     ...
>     }
>
>     =end code
>
>     你还可以轻松的将L<Mo>压缩,然后包括到你的模块中去。
>
>     =begin code
>
>      >cat A.pm
>
>     package A;
>     # use Mo qw 'build default';
>
>      >mo-inline A.pm
>
>      >cat A.pm
>
>     package A;
>     # use Mo qw 'build default';
>     # The following line of code was produced from the previous line by
>     # Mo::Inline version 0.27
>     no
>     warnings;my$M=__PACKAGE__.::;*{$M.Object::new}=sub{bless{@_[1..$#_]},$_[0]};*{$M.import}=sub{import
>     warnings;$^H|=1538;my($P,%e,%o)=caller.::;shift;eval"no
>     Mo::$_",&{$M.$_.::e}($P,\%e,\%o,\@_)for@_;return
>     if$e{M};%e=(extends,sub{eval"no
>     $_[0]()";@{$P.ISA}=$_[0]},has,sub{my$n=shift;my$m=sub{$#_?$_[0]{$n}=$_[1]:$_[0]{$n}};$m=$o{$_}->($m,$n,@_)for
>     sort keys%o;*{$P.$n}=$m},%e,);*{$P.$_}=$e{$_}for
>     keys%e;@{$P.ISA}=$M.Object};*{$M.'build::e'}=sub{my($P,$e)=@_;$e->{new}=sub{$c=shift;my$s=bless{@_},$c;my@B;do{@B=($c.::BUILD,@B)}while($c)=@{$c.::ISA};exists&$_&&&$_($s)for@B;$s}};*{$M.'default::e'}=sub{my($P,$e,$o)=@_;$o->{default}=sub{my($m,$n,%a)=@_;$a{default}or
>     return$m;sub{$#_?$m->(@_):!exists$_[0]{$n}?$_[0]{$n}=$a{default}->(@_):$m->(@_)}}};@f=qw[build
>     default];use strict;use warnings;
>
>     =end code
>
>     从 Moose 到 Moo 到 Mo,下一个会是 M ? :)
>
>     谢谢
>
>
>     --
>     Fayland Lam // http://www.fayland.org/
>
>     --
>     您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论
>     组”论坛。
>     要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
>     <mailto:perlchina@googlegroups.com>。
>     要取消订阅此网上论坛,请发送电子邮件至
>     perlchina+unsubscribe@googlegroups.com
>     <mailto:perlchina%2Bunsubscribe@googlegroups.com>。
>     若有更多问题,请通过
>     http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。
>
>
> --
> 您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
> 要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
> 要取消订阅此网上论坛,请发送电子邮件至
> perlchina+unsubscribe@googlegroups.com。
> 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN
> 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。




--
---------------------------
Achilles Xu

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

Re: [PerlChina] perlchina@googlegroups.com 的摘要 - “1 个主题”有 2 个帖子

不错,赞一个!
 
 
2011-12-05

罗学

发件人: perlchina
发送时间: 2011-12-04  16:38:11
收件人: 摘要收件人
抄送:
主题: [PerlChina] perlchina@googlegroups.com 的摘要 - "1 个主题"有 2 个帖子

网上论坛: http://groups.google.com/group/perlchina/topics

    Fayland Lam <fayland@gmail.com> Dec 03 08:24PM +0800  

    http://perlchina.github.com/advent.perlchina.org/2011/Firefox.html
     
    =for advent_year 2011
     
    =for advent_day 3
     
    =for advent_title WWW::Mechanize::Firefox
     
    =for advent_author Fayland Lam
     
    M<WWW::Mechanize::Firefox> 是个非常强大的工具。
     
    第一步是安装。安装该模块之前,需要安装一个 firefox 的 A<
    https://addons.mozilla.org/en-US/firefox/addon/mozrepl/|mozrepl> addon.
    Install 完毕后,重启然后启动 MozRepl (Tools -> MozRepl -> Start), 然后 cpan
    WWW::Mechanize::Firefox, 在安装的过程中,你可以看着 firefox, 你会发现它不停的打开 tab 然后做些测试,关掉
    tab。如果某些 tests fail, 你可以 force install 该模块。
     
    接下来做什么呢?大部分你用 firefox 加你双手能完成的任务,该模块都可以帮你自动化。
     
    简单的比如登录,填写表单,提交然后解析 HTML。对比 M<WWW::Mechanize>, 它可以无视 JavaScript 的阻拦。
     
    复杂的如运行 JavaScript, 模拟鼠标点击,触发 JavaScript 事件,截屏,保存文件,更改 firefox 配置等等。详细的可以参阅
    M<WWW::Mechanize::Firefox::Examples>
     
    下面是一个非常无聊的例子。但是除了该模块,你很难用其他模块来实现它。
     
    =begin code
     
    use strict;
    use warnings;
    use WWW::Mechanize::Firefox;
     
    my $mech = WWW::Mechanize::Firefox->new();
     
    $mech->get('
    http://www.google.com/codesearch#search/&q=WWW::Mechanize::Firefox&type=cs'
    );
    print $_->{innerHTML} . "\n" foreach $mech->selector('div.GEQUXKXGJB
    span:first-child');
     
    =end code
     
    谢谢。
     
     
    --
    Fayland Lam // http://www.fayland.org/

     

    Michael Zeng <galaxy2004@gmail.com> Dec 04 08:19AM +0800  

    厉害啊 , 能控制firefox
     
     
     
     
    2011/12/3 Fayland Lam <fayland@gmail.com>
     
     
    --
    Yours Sincerely
    Zeng Hong

     

您收到此邮件是因为您订阅了 Google 网上论坛 perlchina。
您可以通过电子邮件发帖。
要取消订阅此网上论坛,请发送一封空邮件。
有关更多选项,请访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

Re: [PerlChina] Re: 写完 Advent Day 4 后,悲剧了。

谢谢!
很好用

在 2011年12月4日 下午6:48,joe jiang <lamp.purl@gmail.com>写道:
Hi I have made one for the 4th day:)

=for advent_year 2011

=for advent_day 4

=for advent_title Getopt::Euclid

=for advent_author Joe Jiang

写脚本的时候,最麻烦的两件事,无非是写文档和设计用户接口。有了 Getopt::Euclid,这两件事情居然开始变得十分有趣了。应该说,文档驱>动的程序,这样的创意并不少见,可是用来作为用户接口,这真的还是让人觉得十分恰当。

相比其他的脚本参数分析模块,这个模块的知名度比较低,不过它的作者 Damian Conway 还是十分知名的。现在的维护者 Florent Angly 看起来
也是参数模块这方面的爱好者,一同被他收纳的还有 Getopt::Declare。

具体的使用方法可以参考以下的测试代码:

=begin code

    #!/usr/bin/perl -wl

    use Getopt::Euclid;
    print for @{$ARGV{-i}};

    =head1 NAME

    demo-euclid - testing of module Getopt::Euclid

    =head1 VERSION

    This documentation refers to demo-euclid version 0.0.1

    =head1 USAGE

        demo-euclid [options]  -i[n][file] <file>

    =head1 REQUIRED ARGUMENTS

    =over

    =item  -i[n][file] <file>

    Specify input file

    =for Euclid:
        repeatable
        file.type:    readable
        file.default: '-'

    =back

=end code

有了以上的代码,你就可以这样测试一下了:

=begin code

    $ perl demo-euclid.pl --version
    This is demo-euclid.pl version 0.0.1

=end code

看上去还不错,这个工具脚本已经可以自动汇报版本号了!然后再测试一下正式的功能:

=begin code

    $ perl demo-euclid.pl -i /etc/passwd -i /etc/group
    /etc/passwd
    /etc/group

=end code

这正是我们的工具需要的功能,也就是分行(因为 #! 行的末尾有个 l 选项)打印文件名。另外,文件不存在,或者不可读的时候,脚本还会自>动报错:

=begin code


    $ perl demo-euclid.pl -i /etc/pass
    Invalid "-i[n][file] <file>" argument.
    <file> must be readable but the supplied value ("/etc/pass") isn't.
    (Try: demo-euclid.pl --help)

    $ perl demo-euclid.pl --help
    Usage:

    demo-euclid.pl -i <file>
    ...

=end code

看上去还挺专业的,连相应的帮助信息也有了。衷心希望你会喜欢上这个小模块!






2011/12/4 Michael Zeng <galaxy2004@gmail.com>
//comfort 重要的东西注意备份啊,


 
2011/12/4 cnhack TNT <cnhacktnt@gmail.com>
准备生成 html 后再 commit 的。。。。


2011/12/4 Fayland Lam <fayland@gmail.com>
童鞋要注意经常 git commit or svn ci。

Thanks

2011/12/4 cnhack TNT <cnhacktnt@gmail.com>
原文是《使用 AnyEvent::HTTP 的高速代理验证程序》

55555....


2011/12/4 cnhack TNT <cnhacktnt@gmail.com>
欲哭无泪啊,写了一下午的 Day 4, 最后生成 html 的时候直接按 tab 做了这么个操作:

cnhacktnt@Apollo:proxy$ pod2advent ae_proxy.pod  > ae_proxy.pod


愣了一下,直接就悲剧了啊,还没 ci 到 git 里, 写的东西都没了。。。vim也退出了,连临时文件都没了。。。555,我敲了好几个小时啊。。。!

原文是《使用 AnyEvent::HTTP 的告诉代理验证程序》,现在只剩下代码了,算了,附上代码吧(见附件).

使用方式是,收集一部分待验证的 HTTP 代理地址,按如下格式存成 proxy.txt 文件:


201.75.96.153:3128

76.111.254.51:1111

211.139.10.183:80

78.154.146.173:80

200.52.133.188:8080

85.26.197.206:3128

86.110.154.82:3128

122.72.12.90:80

203.114.146.116:3128

190.201.126.171:8080

202.108.5.114:80

209.115.188.53:80

90.182.144.34:3128

204.188.215.51:3128

69.247.158.186:1586

202.154.4.23:8080

190.5.199.18:3128

123.127.98.170:80

109.75.64.30:3128

64.37.51.144:3128


然后使用如下命令:

cat proxy.txt | perl ae_proxy.pl | tee ,result


就可以看到结果了,验证8000多个代理,耗时28秒。(如果待验证代理数量不足最大并发数,至少也要5秒,因为超时时间为5秒)


哭死!哭死!哭死!

血泪的教训,同学们打命令别太快了。。。。。


--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。



--
Fayland Lam // http://www.fayland.org/

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。



--
            Yours Sincerely
                    Zeng Hong

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

Re: [PerlChina] Re: 写完 Advent Day 4 后,悲剧了。

Hi I have made one for the 4th day:)

=for advent_year 2011

=for advent_day 4

=for advent_title Getopt::Euclid

=for advent_author Joe Jiang

写脚本的时候,最麻烦的两件事,无非是写文档和设计用户接口。有了 Getopt::Euclid,这两件事情居然开始变得十分有趣了。应该说,文档驱>动的程序,这样的创意并不少见,可是用来作为用户接口,这真的还是让人觉得十分恰当。

相比其他的脚本参数分析模块,这个模块的知名度比较低,不过它的作者 Damian Conway 还是十分知名的。现在的维护者 Florent Angly 看起来
也是参数模块这方面的爱好者,一同被他收纳的还有 Getopt::Declare。

具体的使用方法可以参考以下的测试代码:

=begin code

    #!/usr/bin/perl -wl

    use Getopt::Euclid;
    print for @{$ARGV{-i}};

    =head1 NAME

    demo-euclid - testing of module Getopt::Euclid

    =head1 VERSION

    This documentation refers to demo-euclid version 0.0.1

    =head1 USAGE

        demo-euclid [options]  -i[n][file] <file>

    =head1 REQUIRED ARGUMENTS

    =over

    =item  -i[n][file] <file>

    Specify input file

    =for Euclid:
        repeatable
        file.type:    readable
        file.default: '-'

    =back

=end code

有了以上的代码,你就可以这样测试一下了:

=begin code

    $ perl demo-euclid.pl --version
    This is demo-euclid.pl version 0.0.1

=end code

看上去还不错,这个工具脚本已经可以自动汇报版本号了!然后再测试一下正式的功能:

=begin code

    $ perl demo-euclid.pl -i /etc/passwd -i /etc/group
    /etc/passwd
    /etc/group

=end code

这正是我们的工具需要的功能,也就是分行(因为 #! 行的末尾有个 l 选项)打印文件名。另外,文件不存在,或者不可读的时候,脚本还会自>动报错:

=begin code


    $ perl demo-euclid.pl -i /etc/pass
    Invalid "-i[n][file] <file>" argument.
    <file> must be readable but the supplied value ("/etc/pass") isn't.
    (Try: demo-euclid.pl --help)

    $ perl demo-euclid.pl --help
    Usage:

    demo-euclid.pl -i <file>
    ...

=end code

看上去还挺专业的,连相应的帮助信息也有了。衷心希望你会喜欢上这个小模块!





2011/12/4 Michael Zeng <galaxy2004@gmail.com>
//comfort 重要的东西注意备份啊,


 
2011/12/4 cnhack TNT <cnhacktnt@gmail.com>
准备生成 html 后再 commit 的。。。。


2011/12/4 Fayland Lam <fayland@gmail.com>
童鞋要注意经常 git commit or svn ci。

Thanks

2011/12/4 cnhack TNT <cnhacktnt@gmail.com>
原文是《使用 AnyEvent::HTTP 的高速代理验证程序》

55555....


2011/12/4 cnhack TNT <cnhacktnt@gmail.com>
欲哭无泪啊,写了一下午的 Day 4, 最后生成 html 的时候直接按 tab 做了这么个操作:

cnhacktnt@Apollo:proxy$ pod2advent ae_proxy.pod  > ae_proxy.pod


愣了一下,直接就悲剧了啊,还没 ci 到 git 里, 写的东西都没了。。。vim也退出了,连临时文件都没了。。。555,我敲了好几个小时啊。。。!

原文是《使用 AnyEvent::HTTP 的告诉代理验证程序》,现在只剩下代码了,算了,附上代码吧(见附件).

使用方式是,收集一部分待验证的 HTTP 代理地址,按如下格式存成 proxy.txt 文件:


201.75.96.153:3128

76.111.254.51:1111

211.139.10.183:80

78.154.146.173:80

200.52.133.188:8080

85.26.197.206:3128

86.110.154.82:3128

122.72.12.90:80

203.114.146.116:3128

190.201.126.171:8080

202.108.5.114:80

209.115.188.53:80

90.182.144.34:3128

204.188.215.51:3128

69.247.158.186:1586

202.154.4.23:8080

190.5.199.18:3128

123.127.98.170:80

109.75.64.30:3128

64.37.51.144:3128


然后使用如下命令:

cat proxy.txt | perl ae_proxy.pl | tee ,result


就可以看到结果了,验证8000多个代理,耗时28秒。(如果待验证代理数量不足最大并发数,至少也要5秒,因为超时时间为5秒)


哭死!哭死!哭死!

血泪的教训,同学们打命令别太快了。。。。。


--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。



--
Fayland Lam // http://www.fayland.org/

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。



--
            Yours Sincerely
                    Zeng Hong

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。