新しいblogに移行しました

新ブログ "All Yout Bugs Are Belong To Ass" に移行しました!

2011-01-27

[Perl]evalの中で起こったエラーを検出する

この前、実稼働中のかなり古いコードの不具合対応ということで、そのコードをチェックしていたのですが、その中で
my $dbh = DBI->connect(...);
eval {  
    my $sth = $dbh->prepare(...);
    $sth->execute;
    $sth->finish;
};
みたいな箇所(上のコードは実物じゃないですよ)があったんですね。で、evalで被ってやるのはまあ100歩譲って「仕方ないなあ」で済ませましたけど、よりによって、$@に入ってきた値をキャッチするロジックがなかったんです。
当然エラーとかが起こってもエラーログすら吐かず、何食わぬ顔で突っ走ってしまう。そんなわけで、SQL周りの不具合を見つけるのに数時間を要してしまったわけです。

その場ですぐに修正パッチを作成・適用して事なきを得ましたが、僕は心の奥底で思いました。「evalの中でエラーが起こったら、無理やりにでもエラーログにその内容を吐かせたい!」と。

で、調べてみたら、$SIG{__DIE__}にコードリファレンスを食わせることで、その願いは叶えられるとのことでした。
これを使って、ついでにエラー発生時刻も併せて吐いてやれば、後の不具合調査時に役立つでしょう。

というわけで、試しにコードを書いてみました。
use warnings;
use strict;
use Time::Zone;
use DateTime;
use DBI;

$SIG{__DIE__} = sub {
    my $now = DateTime->from_epoch( epoch => time() + tz_local_offset() )->strftime( '%Y/%m/%d %H:%M:%S' );
    warn join( " - ", $now, "CRITICAL", shift );
};

### DBD::sqrightなんてないので、このコードはエラーとなる。
eval {
    my $dbh = DBI->connect( 'dbi:sqright:hoge.txt' );
};

END {
    print "FINISHED!!!\n";
}

この動作結果は、以下の様になります。
2011/01/27 15:19:20 - CRITICAL - Can't locate DBD/sqright.pm in @INC (@INC contains: /home/yt/perl5/perlbrew/perls/perl-5.12.2/lib/site_perl/5.12.2/x86_64-linux /home/yt/perl5/perlbrew/perls/perl-5.12.2/lib/site_perl/5.12.2 /home/yt/perl5/perlbrew/perls/perl-5.12.2/lib/5.12.2/x86_64-linux /home/yt/perl5/perlbrew/perls/perl-5.12.2/lib/5.12.2 .) at (eval 901) line 3.
2011/01/27 15:19:20 - CRITICAL - install_driver(sqright) failed: Can't locate DBD/sqright.pm in @INC (@INC contains: /home/yt/perl5/perlbrew/perls/perl-5.12.2/lib/site_perl/5.12.2/x86_64-linux /home/yt/perl5/perlbrew/perls/perl-5.12.2/lib/site_perl/5.12.2 /home/yt/perl5/perlbrew/perls/perl-5.12.2/lib/5.12.2/x86_64-linux /home/yt/perl5/perlbrew/perls/perl-5.12.2/lib/5.12.2 .) at (eval 901) line 3.
Perhaps the DBD::sqright perl module hasn't been fully installed,
or perhaps the capitalisation of 'sqright' isn't right.
Available drivers: DBM, ExampleP, File, Gofer, Proxy, SQLite, Sponge.
 at /home/yt/perl/warn.pl line 13

ちなみにこちらの記事によれば、これだけでは処理が不十分のようで、$^Sを使ってeval経由の呼び出しか否か(=本当にdieする時)で処理を分けた方が良い様です。

2011-01-23

[Perl]Hachioji.pm #1

LTしました!

「Perlで杉を伐採しよう」という、タイムリーかつ割とどうでもいい様な話題を扱いました><


まとめについては・・・

hide_o_55さんの記事がまとめとして秀逸です!

酔魔の猛攻を潜り抜けた記憶を書き溜めておきます><

・「寒い」という会場に関する前情報があったものの、「意外とあったかいじゃない!」
・次回は2月開催予定
・サイトを用意しよう!
 >すでにドメインは取ったけど、MTかwikiのどっちを採用するか迷ってる
・サイトのデザインどうしよう。。
 >水色を基調にオレンジをちりばめる感じで
・今後の連絡手法をどうするか
 >Hachioji.pmのついったーアカウントを用意しよう
 >ちなみにIRCも用意してます irc@freenode#hachiojipm ってかおまいらスルーすんな(゚Д゚)ゴルァ!wwww
・uzullaさん「俺以外の人にも幹事任せたいんだよねー」
 >遠征のタイミングで、遠征先在住の方が担当したり・・・?
・次回のLTはPerl以外で
 >Hachioji.pmって何の略か知ってる?
 >>まかまかさん「八王子プログラマー・マウンテン!」
 >>>どこにもPerlって書いてないよね!だからOK!!!

個人的に

ono_pmさんのLTにあったIPv4アドレスの枯渇予想を聞いて、空恐ろしく感じましたね。
だって、今年の2/2には枯渇する見込みですからね。ちょっとコワーって。

そんなこんなで

18:00開始にもかかわらず、23:30まで14名の男たちがクダをまいていましたw
そんなトレンディPerl(?)をこよなく愛するHachioji.pmに、みんなも参加してね~><

2011-01-21

[Perl]Solution for when access to CPAN Meta DB was denied to cpanm

I want to read this topic especially who lives in China --- if you can see this website ---.

If you are waited for cpanm so long long time, maybe, cause is deny of access to CPAN Meta DB.
$ cpanm Data::Model
...
...
### a minute later... ###
...
... omg, too late.
...
### 5 mins later... ###
...
... Ahhhhhhh!! so long! 
...
I was encountered this case on server in Beijin.
I guess, because Google App Engine was denied to access from China, and CPAN Meta DB works on GAE.

A solution.
$ cpanm --mirror http://www.cpan.org/ --mirror-only Data::Model

Clever cpanm! :)

miyagawa++;

2011-01-17

[ネットライフ]githubデビューしました

実はアカウント自体去年からあったのですが、ついにレポジトリを2つ公開し、事実上のgithubデビューと相成りました。

ytnobody's Profile - GitHub

みなさんよろしくお願いしますm(_ _)m

Acme-JapaneseCedar

ytnobody/Acme-JapaneseCedar - GitHub
hachioji.pm #1のLTにてネタとしますw

Zacro

ytnobody/Zacro - GitHub
語源は果物の「柘榴」。memcachedプロトコル対応のジョブキューイングサーバです。
以前に自作「ニートサーバ」でベンチマークをとったMemcached::Server使ってます。