新しいblogに移行しました

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

2009-10-31

[Perl]Gearman::Clientのleaktestでコケちゃうときは

perl-5.8.2という結構古い環境でGearmanを使おうとした際、Gearman::Clientのインストールにつまづいた。

Running make test
PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t
t/00-use.t ............. ok
t/10-all.t ............. 1/33 Job 'fail_die' died: test reason at /root/.cpan/build/Gearman-1.10-PXw76r/t/worker.pl line 28.
t/10-all.t ............. ok
t/20-leaktest.t ........ "import" is not exported by the Exporter module
Can't continue after import errors at /root/.cpan/build/Gearman-1.10-PXw76r/t/lib/GearTestLib.pm line 4
BEGIN failed--compilation aborted at /root/.cpan/build/Gearman-1.10-PXw76r/t/lib/GearTestLib.pm line 4.
Compilation failed in require at t/20-leaktest.t line 14.
BEGIN failed--compilation aborted at t/20-leaktest.t line 14.
t/20-leaktest.t ........ Dubious, test returned 255 (wstat 65280, 0xff00)
No subtests run
t/30-maxqueue.t ........ ok
t/40-prefix.t .......... ok
t/50-wait_timeout.t .... 1/3 # Got result for 1
# Got result for 2
t/50-wait_timeout.t .... ok
t/51-large_args.t ...... ok
t/60-stop-if.t ......... 4/12 # Sleeping for 5 seconds
t/60-stop-if.t ......... ok
t/65-responseparser.t .. ok

Test Summary Report
-------------------
t/20-leaktest.t (Wstat: 65280 Tests: 0 Failed: 0)
Non-zero exit status: 255
Parse errors: No plan found in TAP output
Files=9, Tests=78, 95 wallclock secs ( 0.59 usr 0.10 sys + 10.14 cusr 0.91 csys = 11.74 CPU)
Result: FAIL
Failed 1/9 test programs. 0/78 subtests failed.
make: *** [test_dynamic] エラー 255
DORMANDO/Gearman-1.10.tar.gz
/usr/bin/make test -- NOT OK
Running make install
make test had returned bad status, won't install without force

よく見ると、

t/20-leaktest.t ........ "import" is not exported by the Exporter module
Can't continue after import errors at /root/.cpan/build/Gearman-1.10-PXw76r/t/lib/GearTestLib.pm line 4

と書いてあるので、Exporterモジュールを最新版にしてみる。

# cpan Exporter

で、いま一度Gearman::Clientのインストールにトライ。

Running make test
PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t
t/00-use.t ............. ok
t/10-all.t ............. 1/33 Job 'fail_die' died: test reason at /root/.cpan/build/Gearman-1.10-22xMqA/t/worker.pl line 28.
t/10-all.t ............. ok
t/20-leaktest.t ........ skipped: This test requires Devel::Gladiator
t/30-maxqueue.t ........ ok
t/40-prefix.t .......... ok
t/50-wait_timeout.t .... 1/3 # Got result for 1
# Got result for 2
t/50-wait_timeout.t .... ok
t/51-large_args.t ...... ok
t/60-stop-if.t ......... 2/12 # Sleeping for 5 seconds
t/60-stop-if.t ......... ok
t/65-responseparser.t .. ok
All tests successful.
Files=9, Tests=78, 90 wallclock secs ( 0.51 usr 0.10 sys + 10.01 cusr 0.98 csys = 11.60 CPU)
Result: PASS
DORMANDO/Gearman-1.10.tar.gz
/usr/bin/make test -- OK

すんなりと入っちゃったよ。というお話し。

2009-10-30

[Perl]Mouseでメソッドアトリビュートをいじりたくなったものの

ざっくりMo(o|u)seのドキュメントを見た限り、そんなものは無いようだった。
そのかわり、Sub::Attributeというモジュールが適任っぽいのがわかった。

例によってチラ裏的なコード。


package HogeFuga;
use Data::Dumper;
use Mouse;
use Sub::Attribute;

sub myattr : ATTR_SUB {
print Dumper( { attr => [ @_ ] } );
}

sub hoge : myattr( 'a123', 'xyz' ) {
my $self = shift;
print Dumper( { arg => [ @_ ] } );
}
__PACKAGE__->meta->make_immutable;
no Mouse;

my $c = HogeFuga->new;
$c->hoge( 'aaa', 'bbb' );


結果は以下の通り。

$VAR1 = {
'attr' => [
'HogeFuga',
\*HogeFuga::hoge,
sub { "DUMMY" },
'myattr',
'\'a123\', \'xyz\''
]
};
$VAR1 = {
'arg' => [
'aaa',
'bbb'
]
};

2009-10-12

[daemontools]daemontoolsのインストールが手間くさいと感じる貴方へ

daemontools-install.sh version 0.76というものを作ってみました。

スクリプトの作成にあたって、下記のページを参考にさせていただきました。
Slackware 10.0 へ daemontools を組み込んでみる - EZ-NET

internet接続可能なホストであれば、damontools-0.76をある程度簡単にインストールできる。そんなスクリプトです。

使い方は至って簡単。

# ./daemontools-install.sh 


これだけです。

glibc-2.3.2以上の場合は、勝手にパッチもあてます。

2009-10-10

[Perl]balanceのラッパークラスNet::Balance

balanceという名のバランサーがあります。
こいつはシンプルかつ軽量であることが身上のようですが、わりと堅牢なので重宝しています。

で、最近こいつを動的に操作する必要があったので、Perlからコントロールできるように、Net::Balanceというモジュールをこさえてみました。Net-Balance-0.001002.tar.gz [DL]

単純にHTTPをバランシングする場合、

use Net::Balance;
my $balance = Net::Balance->new( listen_port => 80 );
$balance->balance_member( [qw[ 10.0.0.1 10.0.0.2:8080 ] ] );
$balance->run;


とかすればOK。

で、死活監視と組み合わせて、

use LWP::UserAgent;
my $agent = LWP::UserAgent->new;
my @target =
for ( 0 .. $#target ) {
my $node = $target[ $_ ];
my $res = $agent->get( "http://$node/" );
if ( $res->is_success ) {
# 生きてればチャネル有効
$balance->group( 0 )->channel( $_ )->enable;
}
else {
# 死んでればチャネル無効
$balance->group( 0 )->channel( $_ )->disable;
}
}


とかできます。でも、そもそもbalanceにhttpバランシングとかさせると、アクセス元IPが上書きされるのでお勧めできないです。せいぜいミドルウェアサーバやらキャッシュサーバの冗長化に使うくらいのものでしょうか。

2009-10-01

[Perl:テスト]B-OPCheck-0.29

以下の環境でコケました。

# uname -a
Linux cent5server 2.6.18-128.el5 #1 SMP Wed Jan 21 10:41:14 EST 2009 x86_64 x86_64 x86_64 GNU/Linux

# cat /etc/redhat-release
CentOS release 5.3 (Final)


現在の最新版 (0.29)の場合。

cpan[1]> install B::OPCheck

### 中略 ###

CPAN.pm: Going to build F/FL/FLORA/B-OPCheck-0.29.tar.gz

Checking if your kit is complete...
Looks good
Writing Makefile for B::OPCheck
cp lib/B/OPCheck.pm blib/lib/B/OPCheck.pm
/usr/bin/perl "-Iinc" /usr/lib/perl5/5.8.8/ExtUtils/xsubpp -typemap /usr/lib/perl5/5.8.8/ExtUtils/typemap -typemap /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/B/Utils/Install/typemap OPCheck.xs > OPCheck.xsc && mv OPCheck.xsc OPCheck.c
gcc -c -I/usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/B/Utils/Install -D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -Wdeclaration-after-statement -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -DVERSION=\"0.29\" -DXS_VERSION=\"0.29\" -fPIC "-I/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/CORE" OPCheck.c
OPCheck.xs:16: error: redefinition of typedef ‘Perl_check_t’
ppport.h:3976: error: previous declaration of ‘Perl_check_t’ was here
make: *** [OPCheck.o] Error 1
FLORA/B-OPCheck-0.29.tar.gz
/usr/bin/make -- NOT OK
Running make test
Can't test without successful make
Running make install
Make had returned bad status, install seems impossible
Failed during this command:
FLORA/B-OPCheck-0.29.tar.gz : make NO


0.28の場合。

http://search.cpan.org/CPAN/authors/id/F/FL/FLORA/B-OPCheck-0.28.tar.gz
cpan[2]> install F/FL/FLORA/B-OPCheck-0.28.tar.gz

### 中略 ###

CPAN.pm: Going to build F/FL/FLORA/B-OPCheck-0.28.tar.gz

Checking if your kit is complete...
Looks good
Writing Makefile for B::OPCheck
cp lib/B/OPCheck.pm blib/lib/B/OPCheck.pm
/usr/bin/perl "-Iinc" /usr/lib/perl5/5.8.8/ExtUtils/xsubpp -typemap /usr/lib/perl5/5.8.8/ExtUtils/typemap -typemap /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/B/Utils/Install/typemap OPCheck.xs > OPCheck.xsc && mv OPCheck.xsc OPCheck.c
gcc -c -I/usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/B/Utils/Install -D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -Wdeclaration-after-statement -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -DVERSION=\"0.28\" -DXS_VERSION=\"0.28\" -fPIC "-I/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/CORE" OPCheck.c
OPCheck.xs:16: error: redefinition of typedef ‘Perl_check_t’
ppport.h:3976: error: previous declaration of ‘Perl_check_t’ was here
make: *** [OPCheck.o] Error 1
FLORA/B-OPCheck-0.28.tar.gz
/usr/bin/make -- NOT OK
Running make test
Can't test without successful make
Running make install
Make had returned bad status, install seems impossible
Failed during this command:
FLORA/B-OPCheck-0.28.tar.gz : make NO


0.27だと入ります。

http://search.cpan.org/CPAN/authors/id/N/NU/NUFFIN/B-OPCheck-0.27.tar.gz
cpan[3]> install N/NU/NUFFIN/B-OPCheck-0.27.tar.gz

### 中略 ###

CPAN.pm: Going to build N/NU/NUFFIN/B-OPCheck-0.27.tar.gz

Checking if your kit is complete...
Looks good
Writing Makefile for B::OPCheck
cp lib/B/OPCheck.pm blib/lib/B/OPCheck.pm
/usr/bin/perl "-Iinc" /usr/lib/perl5/5.8.8/ExtUtils/xsubpp -typemap /usr/lib/perl5/5.8.8/ExtUtils/typemap OPCheck.xs > OPCheck.xsc && mv OPCheck.xsc OPCheck.c
gcc -c -D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -Wdeclaration-after-statement -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -DVERSION=\"0.27\" -DXS_VERSION=\"0.27\" -fPIC "-I/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/CORE" OPCheck.c
OPCheck.c: In function ‘XS_B__OPCheck_enterscope’:
OPCheck.c:210: warning: unused variable ‘mode’
OPCheck.xs: In function ‘XS_B__OPCheck_leavescope’:
OPCheck.xs:231: warning: suggest parentheses around assignment used as truth value
OPCheck.c:241: warning: unused variable ‘mode’
Running Mkbootstrap for B::OPCheck ()
chmod 644 OPCheck.bs
rm -f blib/arch/auto/B/OPCheck/OPCheck.so
gcc -shared -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic OPCheck.o -o blib/arch/auto/B/OPCheck/OPCheck.so \
\

chmod 755 blib/arch/auto/B/OPCheck/OPCheck.so
cp OPCheck.bs blib/arch/auto/B/OPCheck/OPCheck.bs
chmod 644 blib/arch/auto/B/OPCheck/OPCheck.bs
Manifying blib/man3/B::OPCheck.3pm
NUFFIN/B-OPCheck-0.27.tar.gz
/usr/bin/make -- OK
Running make test
PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'inc', 'blib/lib', 'blib/arch')" t/*.t
t/entersub.t .. ok
All tests successful.
Files=1, Tests=1, 1 wallclock secs ( 0.02 usr 0.02 sys + 0.03 cusr 0.02 csys = 0.09 CPU)
Result: PASS
NUFFIN/B-OPCheck-0.27.tar.gz
/usr/bin/make test -- OK
Running make install
Prepending /root/.cpan/build/B-OPCheck-0.27-jY3Jix/blib/arch /root/.cpan/build/B-OPCheck-0.27-jY3Jix/blib/lib to PERL5LIB for 'install'
Files found in blib/arch: installing files in blib/lib into architecture dependent library tree
Installing /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/auto/B/OPCheck/OPCheck.bs
Installing /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/auto/B/OPCheck/OPCheck.so
Installing /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/B/OPCheck.pm
Installing /usr/share/man/man3/B::OPCheck.3pm
Appending installation info to /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/perllocal.pod
NUFFIN/B-OPCheck-0.27.tar.gz
/usr/bin/make install -- OK


2010-01-13 追記
現在も上記の状況が続いております。