2011年12月3日星期六

[PerlChina] 2011 CN Perl Advent Day 3: WWW::Mechanize::Firefox

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();

print $_->{innerHTML} . "\n" foreach $mech->selector('div.GEQUXKXGJB span:first-child');

=end code

谢谢。


--
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月2日星期五

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

I don't have the domain info, I think it's still Qiang. and it seems perlchina.org/advent is down too.

Thanks.

2011/12/2 cnhack TNT <cnhacktnt@gmail.com>
 advent.perlchina.org 谁在管理?能否更新上去啊。。。现在居然跳到某个公司的页面去了。。。



2011/12/2 Fayland Lam <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。
要取消订阅此网上论坛,请发送电子邮件至 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 访问此网上论坛。



--
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 访问此网上论坛。

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

 advent.perlchina.org 谁在管理?能否更新上去啊。。。现在居然跳到某个公司的页面去了。。。



2011/12/2 Fayland Lam <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。
要取消订阅此网上论坛,请发送电子邮件至 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 访问此网上论坛。

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

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。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

2011年12月1日星期四

[PerlChina] Re: 2011 CN Perl Advent Day 1: Socks on the fly

附上今年已有的


Thanks.

On Thu, Dec 1, 2011 at 6:58 PM, Fayland Lam <fayland@gmail.com> wrote:
Hi guys.

Call for arm!!!

I'm sure I don't have so much modules/ideas to share with you this year. so anyone who can come up with a simple module/idea, that would be great.

if possible, please add your stuff to  https://github.com/PerlChina/advent.perlchina.org. or else, just send it in email, I'll handle the website.

Thanks.


2011/12/1 Fayland Lam <fayland@gmail.com>
http://perlchina.github.com/advent.perlchina.org/2011/SocksOnTheFly.html 

=for advent_year 2011

=for advent_day 1

=for advent_title Socks on the fly

=for advent_author Fayland Lam

去年的 A<../2010/|Advent> 我们讲过如果在 http/https 上铺上一层 A<../2010/Tor.html|Tor>. 这次我们将更近一步,谈论如果在 Socket 上用上 socks proxy.

此次主角便是 M<IO::Socket::Socks::Wrapper>,无需更改所需模块的源码,轻松简易加套。

如下例子是使用 M<Net::Whois::Raw>。

查看它的源码,可以发现在 sub whois_query 里有 IO::Socket::INET->new 链接。所以在该 Socket 上使用 socks proxy 就变得非常简单。

=begin pre

use strict;
use warnings;
use Net::Whois::Raw;
use IO::Socket::Socks::Wrapper (
    'Net::Whois::Raw::whois_query()' => {
        ProxyAddr => '127.0.0.1',
        ProxyPort => 7070,
    },
);

my $dominfo = whois('perlchina.org');
print $dominfo;

=end pre

如果你有 monitor socks proxy 的工具,你就会发现该 whois query 是通过了本地的 7070 端口。

谢谢。

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



--
Fayland Lam // http://www.fayland.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 访问此网上论坛。

[PerlChina] Re: 2011 CN Perl Advent Day 1: Socks on the fly

Hi guys.

Call for arm!!!

I'm sure I don't have so much modules/ideas to share with you this year. so anyone who can come up with a simple module/idea, that would be great.

if possible, please add your stuff to  https://github.com/PerlChina/advent.perlchina.org. or else, just send it in email, I'll handle the website.

Thanks.

2011/12/1 Fayland Lam <fayland@gmail.com>
http://perlchina.github.com/advent.perlchina.org/2011/SocksOnTheFly.html 

=for advent_year 2011

=for advent_day 1

=for advent_title Socks on the fly

=for advent_author Fayland Lam

去年的 A<../2010/|Advent> 我们讲过如果在 http/https 上铺上一层 A<../2010/Tor.html|Tor>. 这次我们将更近一步,谈论如果在 Socket 上用上 socks proxy.

此次主角便是 M<IO::Socket::Socks::Wrapper>,无需更改所需模块的源码,轻松简易加套。

如下例子是使用 M<Net::Whois::Raw>。

查看它的源码,可以发现在 sub whois_query 里有 IO::Socket::INET->new 链接。所以在该 Socket 上使用 socks proxy 就变得非常简单。

=begin pre

use strict;
use warnings;
use Net::Whois::Raw;
use IO::Socket::Socks::Wrapper (
    'Net::Whois::Raw::whois_query()' => {
        ProxyAddr => '127.0.0.1',
        ProxyPort => 7070,
    },
);

my $dominfo = whois('perlchina.org');
print $dominfo;

=end pre

如果你有 monitor socks proxy 的工具,你就会发现该 whois query 是通过了本地的 7070 端口。

谢谢。

--
Fayland Lam // http://www.fayland.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 访问此网上论坛。

[PerlChina] 2011 CN Perl Advent Day 1: Socks on the fly

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

=for advent_year 2011

=for advent_day 1

=for advent_title Socks on the fly

=for advent_author Fayland Lam

去年的 A<../2010/|Advent> 我们讲过如果在 http/https 上铺上一层 A<../2010/Tor.html|Tor>. 这次我们将更近一步,谈论如果在 Socket 上用上 socks proxy.

此次主角便是 M<IO::Socket::Socks::Wrapper>,无需更改所需模块的源码,轻松简易加套。

如下例子是使用 M<Net::Whois::Raw>。

查看它的源码,可以发现在 sub whois_query 里有 IO::Socket::INET->new 链接。所以在该 Socket 上使用 socks proxy 就变得非常简单。

=begin pre

use strict;
use warnings;
use Net::Whois::Raw;
use IO::Socket::Socks::Wrapper (
    'Net::Whois::Raw::whois_query()' => {
        ProxyAddr => '127.0.0.1',
        ProxyPort => 7070,
    },
);

my $dominfo = whois('perlchina.org');
print $dominfo;

=end pre

如果你有 monitor socks proxy 的工具,你就会发现该 whois query 是通过了本地的 7070 端口。

谢谢。

--
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 访问此网上论坛。