新しいblogに移行しました

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

2009-07-29

[Perl]タイムアウト処理を簡単に実装できるTime::Out

Time::Outというモジュールがあります。コイツはタイムアウト処理を実装するのに非常に重宝します。

以下のような、えらく時間のかかるロジックがあったとします。

sub slow_logic {
sleep int( rand( 40 ) ) + 10;
'OK';
}


で、例えばこのロジックを実行したときに、30秒以内に処理が終わらなければ強制的処理を終わらせundefを返すようにしたい、という場合は

use Data::Dumper;
use Time::Out qw( timeout );
my $logic = timeout 30 => \&slow_logic;
print Dumper $logic;


とします。
実行結果は下記の通り。

# time perl ./hoge.pl
$VAR1 = undef;

real 0m30.142s
user 0m0.130s
sys 0m0.010s

# time perl ./hoge.pl
$VAR1 = 'OK';

real 0m21.153s
user 0m0.130s
sys 0m0.020s

[Perl]List-MoreUtils-0.24はPerl5.8.8以前には入らない

7/27にList-MoreUtils-0.24がリリースされました。
しかしPerl5.8.8だと、testコケます。
Reports for List-MoreUtils

Running make test
PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t
t/0_pod.t .............. ok
t/0_pod_coverage.t ..... skipped: Test::Pod::Coverage not installed
t/List-MoreUtils-pp.t .. ok
t/List-MoreUtils.t ..... Use of uninitialized value in numeric eq (==) at t/List-MoreUtils.t line 45.
Use of uninitialized value in numeric eq (==) at t/List-MoreUtils.t line 45.
Use of uninitialized value in numeric eq (==) at t/List-MoreUtils.t line 45.
t/List-MoreUtils.t ..... Failed 2173/2173 subtests

Test Summary Report
-------------------
t/List-MoreUtils.t (Wstat: 11 Tests: 0 Failed: 0)
Non-zero wait status: 11
Parse errors: Bad plan. You planned 2173 tests but ran 0.
Files=4, Tests=2164, 9 wallclock secs ( 2.58 usr 0.25 sys + 5.56 cusr 0.54 csys = 8.93 CPU)
Result: FAIL
Failed 1/4 test programs. 0/2164 subtests failed.


今のところPerl5.8.8では、0.22を使うしかなさそうです。
ちなみにMooseもこのモジュール使ってます。なので、Moose使うときには予めList-MoreUtils-0.22入れてからMooseを入れないとずっこけます。

2009-09-14 追記
現在、0.24は無かったことになっているようです。
その代わりに Developer Release として0.25_02がリリース済みです。こちらはPerl5.8.8でもテストが通る様ですが、メモリリークしてたりするようなので、もう少々0.22に頑張ってもらうことになりそうです。

2009-07-25

[電波]Bookmarklet「水も汁るいい男」と「穴口さん」

やったもん勝ちなネタ。
body書き換え系のブックマークレットです。

水も汁るいい男(みずもしるるいいおとこ)
水⇔汁変換。
ブックマークして、この辺に行ってから、水も汁るいい男を実行すると、いろんなものを汁だくにできます><

穴口さん(あなぐちさん)
穴⇔口変換。
水も汁るいい男同様、この辺のページでつかうと、ヤラシイ感じになります

2009-07-24

[Perl]MooseX::Types::DateTime::ButMaintained-0.08がテストコケる

MooseX::Types::DateTimeXを入れてるときにコケた。

Running make test
PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'inc', 'blib/lib', 'blib/arch')" t/01_basic.t t/02_olson_abbreviations.t t/03_local_floating.t
t/01_basic.t ................ 12/?
# Failed test 'bad time zone'
# at t/01_basic.t line 89.
# Looks like you failed 1 test of 21.
t/01_basic.t ................ Dubious, test returned 1 (wstat 256, 0x100)
Failed 1/21 subtests
t/02_olson_abbreviations.t .. ok
t/03_local_floating.t ....... ok

Test Summary Report
-------------------
t/01_basic.t (Wstat: 256 Tests: 21 Failed: 1)
Failed test: 16
Non-zero exit status: 1
Files=3, Tests=28, 5 wallclock secs ( 0.09 usr 0.01 sys + 5.34 cusr 0.17 csys = 5.61 CPU)
Result: FAIL
Failed 1/3 test programs. 1/28 subtests failed.
make: *** [test_dynamic] エラー 255
ECARROLL/MooseX-Types-DateTime-ButMaintained-0.08.tar.gz
/usr/bin/make test -- NOT OK


では、テストコードから該当箇所を抜粋。


{
{
package Bar;
use Moose;

has time_zone => (
isa => "DateTime::TimeZone",
is => "rw",
coerce => 1,
);
}

my $tz = Bar->new( time_zone => "Africa/Timbuktu" )->time_zone;

isa_ok( $tz, "DateTime::TimeZone", "coerced string into time zone object" );

like( $tz->name, qr/^Africa/, "correct time zone" );

dies_ok { Bar->new( time_zone => "Space/TheMoon" ) } "bad time zone";
}


coerceまわりがおかしいっぽい。
では、coerceまわりのロジックをチェック。


our %coercions = (
DateTime => [
from Num, via { 'DateTime'->from_epoch( epoch => $_ ) }
, from HashRef, via { 'DateTime'->new( %$_ ) }
, from Now, via { 'DateTime'->now }
]

, "DateTime::Duration" => [
from Num, via { DateTime::Duration->new( seconds => $_ ) }
, from HashRef, via { DateTime::Duration->new( %$_ ) }
]

, "DateTime::TimeZone" => [
from Str, via {
# No abbreviation - assumed if we don't have a '/'
if ( m,/|floating|local, ) {
return DateTime::TimeZone->new( name => $_ );
}
# Abbreviation - assumed if we do have a '/'
# returns a DateTime::TimeZone::OffsetOnly
else {
my $offset = Olson::Abbreviations->new({ tz_abbreviation => $_ })->get_offset;
return DateTime::TimeZone->new( name => $offset );
}
}
]


, "DateTime::Locale" => [
from Moose::Util::TypeConstraints::find_or_create_isa_type_constraint("Locale::Maketext")
, via { DateTime::Locale->load($_->language_tag) }
, from Str, via { DateTime::Locale->load($_) }
]
);


おかしくね、これ。おかしいよ。
だって、dieするわけないよ。そりゃあテスト通りませんよね...

どうしてこうなった!どうしてこうなった!

しょうがないので、force installしましたとさ。おしまい。

2009-09-14 追記
0.09がリリース済みです。
無事にテストも通りましたよ!
good job!

Running make for E/EC/ECARROLL/MooseX-Types-DateTime-ButMaintained-0.09.tar.gz
Is already unwrapped into directory /home/azuma/.cpan/build/MooseX-Types-DateTime-ButMaintained-0.09

CPAN.pm: Going to build E/EC/ECARROLL/MooseX-Types-DateTime-ButMaintained-0.09.tar.gz

/usr/bin/perl "-Iinc" Makefile.PL --config= --installdeps=DateTime::TimeZone,0.96
Cannot determine perl version info from lib/MooseX/Types/DateTime/ButMaintained.pm
cp lib/MooseX/Types/DateTime/ButMaintained.pm blib/lib/MooseX/Types/DateTime/ButMaintained.pm
Manifying blib/man3/MooseX::Types::DateTime::ButMaintained.3pm
/usr/bin/make -- OK
Running make test
/usr/bin/perl "-Iinc" Makefile.PL --config= --installdeps=DateTime::TimeZone,0.96
Cannot determine perl version info from lib/MooseX/Types/DateTime/ButMaintained.pm
PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'inc', 'blib/lib', 'blib/arch')" t/01_basic.t t/02_olson_abbreviations.t t/03_local_floating.t
t/01_basic.t ................ ok
t/02_olson_abbreviations.t .. ok
t/03_local_floating.t ....... ok
All tests successful.
Files=3, Tests=28, 3 wallclock secs ( 0.02 usr 0.01 sys + 2.23 cusr 0.08 csys = 2.34 CPU)
Result: PASS
/usr/bin/make test -- OK
Running make install
/usr/bin/perl "-Iinc" Makefile.PL --config= --installdeps=DateTime::TimeZone,0.96
Cannot determine perl version info from lib/MooseX/Types/DateTime/ButMaintained.pm
Installing /usr/local/share/perl/5.8.8/MooseX/Types/DateTime/ButMaintained.pm
Installing /usr/local/man/man3/MooseX::Types::DateTime::ButMaintained.3pm
Appending installation info to /usr/lib/perl/5.8/perllocal.pod
/usr/bin/make install -- OK

2009-07-15

[Perl]WWW::Mechanize-1.56がリリースされていた

既に昨日付けで1.58が出ているみたいだけど、こちらは1.56から大層な変更が加えられていないみたい

とりあえず気になったのが、Google group WWW::MechanizeでのLesterさんの発言。
http://groups.google.com/group/www-mechanize-users/browse_thread/thread/62772f07edcc17f9

[THINGS THAT MAY BREAK YOUR CODE]
For a while, Mech used HTTP::Response::Encoding to try to suss out
the proper encoding of the page it receives. Now, it lets
LWP::UserAgent do the work, and no longer requires
HTTP::Response::Encoding.


どうも、HTTP::Response::Encodingに頼っていたエンコード形式の検出を、LWP::UserAgentに任せることにしたらしい。
そもそもHTTP::Response::Encodingは、テストが通らない状態なので、この変更は非常にうれしい限り。

2009-09-14 追記
HTTP::Response::Encoding-0.06が2009-07-28にリリースされています。
こちらはきちんとテストが通りますので、ご安心ください^^

2009-07-13

[Perl]MIME::ToolsのテストMisc.tでコケるのは

t/Misc.t ............. 1/14
# Failed test 'bug 970725-DNA: QP use of RFC2049 guideline 8'
# at t/Misc.t line 78.
# got: '=46rom me'
# expected: '=46rom me=
# '

### 中略 ###

Test Summary Report
-------------------
t/Misc.t (Wstat: 1792 Tests: 14 Failed: 7)
Failed tests: 4-5, 7-11
Non-zero exit status: 7
Files=24, Tests=365, 33 wallclock secs ( 1.27 usr 0.36 sys + 29.08 cusr 1.15 csys = 31.86 CPU)
Result: FAIL
Failed 1/24 test programs. 7/365 subtests failed.
make: *** [test_dynamic] エラー 255
DONEILL/MIME-tools-5.427.tar.gz
/usr/bin/make test -- NOT OK

こんな具合でずっこけたので、ググってみる。

その中でも、cpanからMIME::WordDecoderをインストールしようとしてハマったのでメモ - KUMA TYPEをみてみると、
が、しかし、MIME::WordDecoderの最初のインストール時のログを今見てみるとしっかりチェックでMIME::Base64をversion 2.20からversion 3.03にアップグレードしろって出てるwww。
(現在はアップデートでversion 3.07になった)

さて、今回コケた環境をみてみる。
# perl -MMIME::Base64 -le 'print $MIME::Base64::VERSION'
2.21

古すぎ><

結果、MIME::Base64を最新にしたら、すんなりテストが通ってくれた。

2009-07-08

[Linux]postfix2.6 + cyrus-sasl2 で、コンパイル時の注意

Postfix で SMTP Auth(LDAP編)を参照。


ログとその対処方法

構築時に遭遇したログとその対処方法
"-DUSE_CYRUS_SASL" の付け忘れ
ログの内容
/var/log/syslog に

postfix/smtpd[14421]: [ID 947731 mail.warning] warning: unsupported SASL server implementation: cyrus
postfix/smtpd[14421]: [ID 947731 mail.crit] fatal: SASL per-process initialization failed
postfix/master[14405]: [ID 947731 mail.warning] warning: process /usr/libexec/postfix/smtpd pid 14421 exit status 1
postfix/master[14405]: [ID 947731 mail.warning] warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling

原因
Postfix 2.3.* から "-DUSE_CYRUS_SASL" も指定する必要がある。
対処方法
CCARGS に "-DUSE_CYRUS_SASL" も付けて make する。