新しいblogに移行しました

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

2009-04-21

[Perl]MooseX::Alienで、なんでもMoose

MooseX::Alienを使うと、非MooseなモジュールもMoose化できるらしい。

package MooseX::Safarize;
use Data::Dumper;
use Moose;
extends 'WWW::Mechanize';
with 'MooseX::Alien';

sub BUILD {
my $self = shift;
my @arg = @_;
$self->agent_alias( 'Mac Safari' );
}

before get => sub {
my ( $self, $uri ) = @_;
warn "GET $uri";
};

after get => sub {
my $self = shift;
warn "Status: ". $self->status. " ". length( $self->content ). " bytes DLed.";
};

no Moose;

my $c = MooseX::Safarize->new( timeout => 2 );
print Dumper $c->agent;
$c->get( 'http://www.cpan.org/' );


結果。

$VAR1 = 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/85 (KHTML, like Gecko) Safari/85';
GET http://www.cpan.org/ at ./safarize.pl line 15.
Status: 200 5810 bytes DLed. at ./safarize.pl line 20.

[Perl]Mooseでコンストラクタの挙動を変える

BUILDメソッドを定義することで対応できる。

package MyCar;
use Data::Dumper;
use Moose;

has 'speed' => ( is => 'rw', isa => 'Int' );

sub BUILD {
my $self = shift;
$self->speed( 50 ) if !$self->speed;
}

no Moose;

my $super_car = MyCar->new( speed => 200 );
my $normal_car = MyCar->new;

print "=== Super Car ===\n". Dumper $super_car;
print "=== Normal Car ===\n". Dumper $normal_car;

結果

=== Super Car ===
$VAR1 = bless( {
'speed' => 200
}, 'MyCar' );
=== Normal Car ===
$VAR1 = bless( {
'speed' => 50
}, 'MyCar' );

2009-04-14

[perl]MIME::LiteのRFC対応に難あり

ステキモジュールなMIME::Liteにおいて、RFC2822の4.5.3.1([Page 53]あたり)に準拠しきれていないと思われる現象に出くわした。

まず、このガサツなテストコードを見てほしい。
このコードでやっていることは非常に単純で、極端に長い文字列(1行)をMIME::Lite::encode_8bit() 及び MIME::Lite::encode_7bit() に渡し、返り値の1行あたりの最大文字列長が990以内であるかを検証している。

で、以下その結果(実行環境はubuntu-8.04LTS-amd64/perl-5.8.8)。


1..5
ok 1 - use MIME::Lite;
ok 2 - 1937 bytes gotten, hugest line 990 bytes.
not ok 3 - 2043 bytes gotten, hugest line 1052 bytes.
# Failed test '2043 bytes gotten, hugest line 1052 bytes.'
# at X001_Huge_Line.t line 19.
ok 4 - 1937 bytes gotten, hugest line 990 bytes.
not ok 5 - 2043 bytes gotten, hugest line 1052 bytes.
# Failed test '2043 bytes gotten, hugest line 1052 bytes.'
# at X001_Huge_Line.t line 19.
# Looks like you failed 2 tests of 5.


文字列長が1980より大きい行を与えた場合、改行を2つ以上補完すべきところが、1つしか補完されない。そのためtest3やtest5では、最大で2043文字もある行が残ってしまっている。

取り急ぎ、メンテナさんに報告しておくか。

2009-04-15 追記
RTにてチケットを発行。
初RTだったので、うまくレポート出来たかは何とも言えないが、'MIME-Lite'でチケット検索すれば出てくるようになった。
間違って、状態を一旦"着手"にしてしまったのはご愛嬌><

さらに追記
既に5年前からあるチケットでも、同様の指摘がされていた。うーむ。。。

2009-5-25 追記
テストコードを置いていたサーバのドメインが移行されたので、テストコードへのリンクを変更。

2010-2-17 追記
もう有名な話でしょうけど、今やMIME::Liteを使うのは「モダン」ではありません。その上、メンテナンスもされていないそうです。
Email::SimpleEmail::Send, Email::Sender を使うことをお勧めします。

2009-04-03

[OpenVZ]Solution for "Unable to open pty ..."

OpenVZ Forumに、ズバリな解決方法がpostされていた。

I have same trouble and this looks very strange. As solution (inside problematic VZ) simply add the line 'ptmx' in file /etc/udev/makedev.d/50-udev.nodes (for CentOS 5) and is works fine after reboot.

つまりVPSがCentOS5なら、

# echo 'ptmx' >> /var/lib/vz/root/[VEID]/etc/udev/makedev.d/50-udev.nodes
# vzctl reboot [VEID]

で解決。
なるほどねぇ。

[OpenVZ]cpanでテストが全コケするのを回避する方法

OpenVZのフォーラムでも回答されているけど、要するにリソースが不足しているからテストがコケる(というか、テストすらしない)わけです。

で試しに、コンテナに対し下記のようなチューニングを施して、コンテナ再起動後にDBIx::Simpleをcpanでインストールしてみたら、無事にテストを通過。インストールに成功しました。
# vzctl set 5001 \
--numproc 192 \
--numfile 3072 \
--shmpages 512M \
--kmemsize 32M:64M \
--save

2010-12-15 追記
今のご時世なら、cpanmを使うことで全て解決します。→[Perl]大抵のPerlerに恩恵を与えるcpanminus