Google TrendsでPerlを調べてみた。
自分の中では去年のYAPC::Asia 2008くらいから盛り上がってきてる印象だったけど、何この右肩下がり。


ヘヴィメタルプログラマー日記~メロイックサインでコードを書く日々~
Google TrendsでPerlを調べてみた。
自分の中では去年のYAPC::Asia 2008くらいから盛り上がってきてる印象だったけど、何この右肩下がり。


プログラマー面接時の技術的な質問事項(アプレッソ版) – 解答編より。
Perlでfor文のベンチマーク取ってみた。約70MB、32万行くらいのファイルを回すだけ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | use strict; use warnings; use Benchmark; use IO::File; my $file = '/var/log/hoge.log'; my @lines = IO::File->new($file)->getlines; timethese(100, { slow => sub { for (my $i=0; $i<=$#lines; ++$i) {} }, fast => sub { for (my $i=0, my $last = $#lines; $i <= $last; ++$i) {} }, }); |
結果
Benchmark: timing 100 iterations of fast, slow...
fast: 3 wallclock secs ( 2.66 usr + 0.00 sys = 2.66 CPU) @ 37.64/s (n=100)
slow: 6 wallclock secs ( 6.00 usr + 0.00 sys = 6.00 CPU) @ 16.67/s (n=100)
倍以上速いっぽいよこれ・・・
そもそもベンチマークの取り方が正しいのか不安だったので、ベンチマークの処理を除いて、スクリプトが終了するまでの時間を体感で計測してみたけどやっぱ速い。
もっと根本的な事を勉強し直さないと思い知らされました。
自作の携帯サイト用アクセス解析ソフト「Episode」の携帯キャリア判定モジュールをMooseでリファクタリングしてみた。色々改善の余地があるコードだけどとりあえず動くので良しとする。
HashRef[Str]型のdefaultの指定方法にめっちゃ苦労した。default = {a=>’a'}ってできなくて、無名サブルーチン使わなきゃいけないらしい。
MooseX::AttributeHelpersを組み込めば、この辺が楽になるのかね?
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 | package Episode::Request::UserAgent; use Moose; use Perl6::Say; has 'useragent' => ( is => 'rw', isa => 'Str', default => '', required => 1, ); has 'regex' => ( is => 'ro', isa => 'HashRef[Str]', default => sub { { docomo => '^DoCoMo', au => '^(?:KDDI|UP\.Browser\/.+?)-(.+?) ', softbank => '^(?:SoftBank|Semulator)', } }, required => 1, ); __PACKAGE__->meta->make_immutable; no Moose; sub is_mobile { my $self = shift; $self->useragent =~ $self->regex->{docomo} || $self->useragent =~ $self->regex->{au} || $self->useragent =~ $self->regex->{softbank} ? 1 : 0; } sub AUTOLOAD { my $self = shift; our $AUTOLOAD; my $pkg = __PACKAGE__ . '::is_'; $AUTOLOAD =~ s/$pkg//; my $regex = $self->regex->{$AUTOLOAD}; $self->useragent =~ m|$regex| ? 1 : 0; } 1; my $ua = 'KDDI-HI31 UP.Browser/6.2.0.5 (GUI) MMP/2.0'; my $req = new Episode::Request::UserAgent; $req->useragent($ua); say 'mobile? : ', $req->is_mobile; say 'docomo? : ', $req->is_docomo; say 'au? : ', $req->is_au; say 'softbank? : ', $req->is_softbank; |
結果
mobile? : 1 docomo? : 0 au? : 1 softbank? : 0
Strawberry PerlのCPANでDBIx::Classをインストールしてたら以下のようなエラーが出た。
cp lib/JSON/DWIW.pm blib\lib\JSON/DWIW.pm gcc -Ilibjsonevt -s -O2 -DWIN32 -DHAVE_DES_FCRYPT -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -fno-strict-aliasing -DPERL_MSVCRT_READFIX -s -O2 -DVERSION=\"0.29\" -DXS_VERSION=\"0.29\" -o libjsonevt\make_config libjsonevt\make_config.c libjsonevt\make_config.c:6:22: sys/wait.h: No such file or directory libjsonevt\make_config.c: In function `do_system_with_redirect': libjsonevt\make_config.c:42: error: `F_DUPFD' undeclared (first use in this function) libjsonevt\make_config.c:42: error: (Each undeclared identifier is reported only once libjsonevt\make_config.c:42: error: for each function it appears in.) libjsonevt\make_config.c:50: warning: passing arg 2 of `execvp' from incompatible pointer type dmake.EXE: Error code 129, while making 'libjsonevt\make_config' DOWENS/JSON-DWIW-0.29.tar.gz C:\strawberry\c\bin\dmake.EXE -- NOT OK
DBIx::Classが依存しているJSON::DWIWでsys/wait.hというヘッダファイルが必要みたいだが、どうやら存在しないらしい。
Strawberry Perlにはppmも入っていたのでppmからインストールを試したら、すんなりインストールできた。
まだDB自体を構築してないので動作検証コードは書いてないけど多分大丈夫でしょう。
WindowsでPerlと言えばActiveperlかCygwin+Perlでしたが、Strawberry Perlなるものがあるようなのでインストールしてみました。
ActivePerlはコンパイル環境がないので、XSモジュールのインストールにはVC++を別途インストールしないといけないが、それでもコンパイルでこける場合が多々あり、ppmからインストールする手法でした。
しかしStrawberry Perlはgccとdmakeというコンパイル環境込みでインストールされるので、CPANモジュールのインストールでこける事がほとんどありません。
ActivePerl+CPANで依存モジュールの多いMooseのインストールは失敗しましたが、Strawberry Perlだとサクッと入りました。
散々待たされた挙句、make NOT OKとか出ないから最高!