新しいblogに移行しました

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

ラベル Hack の投稿を表示しています。 すべての投稿を表示
ラベル Hack の投稿を表示しています。 すべての投稿を表示

2013-07-31

[Perl] 某WAFを書いていたらTravis神が激おこプンプン丸だったので原因と解決案を(若者が)探った

https://travis-ci.org/ytnobody/Voson/jobs/9679903

このTravis-jobsをみてやって欲しい。common::senseがインストールできてないらしく、全然テストどころでは無くなってしまった。

で、某仮想八王子でそんなことをのたまっていたら、若人2名が原因をさぐってくれたりした。

http://blog.papix.net/entry/2013/07/31/153544

http://moznion.hatenadiary.com/entry/2013/07/31/172410

結局のところ、Devel::Cover::Plugin::CoverallsがJSON::XSに依存しており、JSON::XSがcommon::senseに依存していたため、common::senseがぶっ壊れたタイミングでJSON::XSもD::C::P::Coverallsもぶっ壊れてしまった、という状況。

これについては先ほどD::C::P::Coverallsにpullreqを投げてみたので、きっとそのうち何かしらのアクションがあるのではないかと思っております。

[追記]

じきにcommon::senseのfix入る模様なので、すぐに元の平和が訪れるでしょう。

[翌日、追記]

早速common::sense 3.72がリリースされ、元の平和が訪れました。
これをうけ、D::C::P::Coverallsのpullreqはクローズしました。

[さらに追記]

今回の一連の流れをtokuhiromさんがまとめてくれています。

また、今回の件をきっかけに、JSON.pmのメンテナであるmakamakaさんが、JSON関連のモジュールを紹介してくれています。

2009-05-27

[Linux]タイムゾーンの設定方法

トリアタマなので、メモ。

タイムゾーンを JST-9 に設定

# cp /usr/share/zoneinfo/Japan /etc/localtime

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::Simple や Email::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

2008-12-17

[Perl]Email-Simple-2.004はちゃんとFromヘッダ処理できてた

過去の記事で、Email::Simpleである条件下においてFromヘッダをうまく取得できないようなことを書きましたが、数日前に再度動作を確認したところ、問題なく処理できることが判明しました。誤爆してスミマセンデシタ。

ちなみに実証コードを挙げてある方(Email::Filter)は、まだあれから確認していません。
近々に確認したいと思います。

2009-01-01 追記
再度確認したところ、Email::Filterについても当方の誤認でした。申し訳ありませんでした。
こちらで実証もしました(´・ω・`)

2008-12-14

[ネットライフ]45% Geekだそうな。

GIGAZINEに載っていたので、やってみた。

I am 45% Geek.
Geek? Yes, but at least I got social skills.
You probably work in computers, or a history deptartment at a college. You never really fit in with the "normal" crowd. But you have friends, and this is a good thing.

オイラ、45% Geekなんだって。

# どうでもいいけど、ネットライフのことをネットワイフと打ち間違えることが多いorz

2008-12-08

[Perl]コンストラクタを拡張する場合の書き方

よく忘れるし、調べてもそのものズバリな例がなかったので、メモ。

例えば、WWW::Mechanizeを継承したChildというクラスで、newした時点で必ずagentを'Mojimoji/1.0'にしたい場合。


### lib/Child.pm

package Child;
use warnings;
use strict;
use base qw/ WWW::Mechanize /;
use SUPER;

sub new {
my $class = shift;
my $self = $class->SUPER::new( @_ );
$self->agent( 'Mojimoji/1.0' );
$self;
}

1;


で、実際に使うときには

#!/usr/bin/perl

use lib qw( ./lib );
use Child;
use Data::Dumper;

my $c = Child->new;

print Dumper $c;


これを実行すると、


$VAR1 = bless( {
'headers' => {},
'forms' => [],
'page_stack' => [],
'requests_redirectable' => [
'GET',
'HEAD',
'POST'
],
'from' => undef,
'timeout' => 180,
'onerror' => sub { "DUMMY" },
'parse_head' => 1,
'_extracted_images' => 0,
'links' => [],
'max_redirect' => 7,
'quiet' => 0,
'images' => [],
'_extracted_links' => 0,
'stack_depth' => 8675309,
'protocols_forbidden' => undef,
'no_proxy' => [],
'onwarn' => sub { "DUMMY" },
'protocols_allowed' => undef,
'use_eval' => 1,
'autocheck' => 0,
'agent' => 'Mojimoji/1.0',
'def_headers' => undef,
'cookie_jar' => bless( {
'COOKIES' => {}
}, 'HTTP::Cookies' ),
'proxy' => {},
'max_size' => undef
}, 'Child' );

2008-12-05

[OpenVZ]仮想環境のダークホース

OpenVZ+Ubuntuがすごすぎてわけわからん状態の今日この頃。

唐突にVEをライブクローン(ライブマイグレートではない)するツールを書いたので、貼り付ける。


#!/bin/sh

src=$1
dst=$2
confdir=/etc/vz/conf
imgdir=/var/lib/vz/private
rootdir=/var/lib/vz/root
if [ $src ] && [ $dst ]; then
echo 'copying config...'
cp $confdir/$src.conf $confdir/$dst.conf
echo 'copying image...'
rsync -az $imgdir/$src/* $imgdir/$dst
echo 'copying root...'
mkdir $rootdir/$dst
chmod 755 $rootdir/$dst
echo 'clone complete.'
else
echo 'usage:'
echo 'vzclone [Source-VEID] [Destination-VEID]'
fi

2008-10-24

[Perl]Email::FilterとかEmail::Simpleでheaderメソッド使ってFromを取得するときの注意

2009-01-01 追記
この記事は盛大に誤爆しております。実際には、Email::FilterもEmail::SimpleもきちんとFromヘッダを取り回してくれますので、ご安心ください。
詳細は、この記事および、この実証記事をご確認ください。m(_ _)m


メールに自動返信するプログラムを書く際、Email::Filter-1.032やEmail::Simple-2.004を使ったりするんだけど、こいつらではうまく取得できないFrom値が存在するみたい。

例えば、SoftBankの705SHから送信されたメールのFrom欄。

<****************@softbank.ne.jp>


こういう風に、<〜>で囲われていて、かつ表示名称(※)が無いものは、これらのモジュールだとうまく取得できない。

以下、実証コード。


#!/usr/bin/perl
use Email::Filter;
use Data:Dumper;
my $email = Email::Filter->new;
my $log = '/tmp/email_filter.log';
open my $LOG, '>>', $log;
print $LOG Dumper $email->header( 'From' );
close $LOG;


これをpostfixで受けれるように、/etc/aliasesを編集。
test: "|/path/to/script.pl"


で、実際にメールを食わせてログ見てみると、
$VAR1 = '';


あまり暇が無いので、取り敢えずメモに止めておく。

※表示名称ってのはこういうのです。
山田 三郎 <****************@softbank.ne.jp>

(正式名称じゃないです。きっと。)

2008-10-16

[Linux]VMware Management InterfaceにSSHトンネル経由でアクセスできたよ!

遠隔地にVMware Server2がインストールされているマシンがあって、そこで稼働しているVMware Management Interfaceにアクセスしたい場合のメモ。

VMware Server2をデフォルトでセットアップしている場合であれば、80/TCP, 902/TCP, 8333/TCPの、3つのTCPポートをトンネリングする必要があります。

つまり。ターミナルを3つ開く必要があるみたいですね。
例えば、以下のAAみたいな状況。
[VMwareServer]
| 192.168.10.200
|
| 192.168.10.254
[Router]
| 123.45.67.89
==+=========
| Internet
==+=========
| xxx.xxx.xxx.xxx(Global-IP)
[Router]
| 192.168.0.254
|
| 192.168.0.100
[MyLinuxBox]


MyLinuxBoxから、
# ssh -L 80:192.168.10.200:80 user@123.45.67.89

# ssh -L 902:192.168.10.200:902 user@123.45.67.89

# ssh -L 8333:192.168.10.200:8333 user@123.45.67.89

の3つを実行してやって、https://127.0.0.1:8333/にブラウザでアクセスしてやると、VMware Infrastructure Web Accessのログイン画面になる。はず。(少なくともFirefox3ではそうなった)

追記
3つのコンソールを開かなくとも、以下のコマンドで代用可能。
※このコマンドではうまくつながらないです。この下に追記されているコマンドを試してください。
# ssh -N -f \
-L 80:192.168.10.200:80 \
-L 902:192.168.10.200:902 \
-L 8333:192.168.10.200:8333 \
user@123.45.67.89
後はLAN接続時と同様にVMの新規作成なりconsole開いてみるなり、ご自由にどうぞ。

2011-01-11 追記
上記コマンドではうまくつながらない模様。8222ポートが不足していた様です。以下のコマンドで接続できました。
# ssh -N -f \
-L 80:192.168.10.200:80 \
-L 902:192.168.10.200:902 \
-L 8222:192.168.10.200:8222 \
-L 8333:192.168.10.200:8333 \
user@123.45.67.89
が、認証が通らない模様。。。ぐぬぬ。。。

2008-09-10

[Lua]Luaに可能性を見出した

http://luaforge.net/を見て、Luaに可能性を見出した。
http://class.luaforge.net/とか、美しい。
日本ではメジャーではないスクリプト言語だが、やがて化けるように思う。
実はLua版のModule::Pluggable的なライブラリを作りたいと思っているが、Luaの習熟度が今ひとつ。必死こいて学ばないと。。。

2008-08-29

[Linux]subversionをconfigureする際に「no suitable neon」と言われたときの対策

例えばneon-0.28.3を使ってsubversionをconfigureする際、

no suitable neon

と言われるケースがある。

この場合、Your own riskではあるけど、./conigureのNEON_ALLOWED_LISTに0.28.3を追加すればconfigureが通る。

2008-08-19

[Linux]特定ディレクトリ以下のPerlスクリプトを動かす上で不足しているモジュールをリストアップする技

awk/find/grep/sort/uniqを駆使。

find /path/to/dir |
awk '{print("perl -wc "$1);}' |
sh 2>&1 |
grep "Can't locate" |
awk '{ gsub(/\//,"::",$3);sub(/\.pm/,"",$3);print($3); }' |
sort |
uniq


見やすくするため改行してるけど、実際は「一行野郎」。
環境ややり方次第では、勝手にcpan使ってインストールもできます。

2008-04-11

[Perl]Tritonn(MySQL5.0.45)のmysqlhotcopyのおかしな挙動


[root@hackathon backupdir]# mysqlhotcopy hogedb ./
Invalid db.table name 'hogedb.hogedb`.`some_table' at /usr/local/bin/mysqlhotcopy line 855.


あ〜、これじゃあmysqlhotcopyできないよ〜><

mysqlhotcopyは前からbugだらけなのは知っていたけど、オイラもついに被害者に。
/(^o^)\ナンテコッタイ

とりあえずPerlで書かれているので、/usr/local/bin/mysqlhotcopyをHacking。

書き換えた箇所は、以下の通り。

336c337,343
< my @hc_tables = map { quote_names("$db.$_") } @dbh_tables;
---
>
> ### hacked by yellowturtle
> ### my @hc_tables = map { quote_names("$db.$_") } @dbh_tables;
>
> my @hc_tables = map { quote_names("$_") } @dbh_tables;
> ### /hacked by yellowturtle
>

837a861,863
> ### hacked by yellowturtle
>
> $name =~ s/\`\.\`/./g;



で、改めて実行。

[root@hackathon backupdir]# mysqlhotcopy hogedb ./

    (中略)

Copying 192 files...
Copying indices for 0 files...
Unlocked tables.
mysqlhotcopy copied 57 tables (192 files) in 16 seconds (16 seconds overall).


バッチリhotcopy完了!

たぶんTritonnじゃなく、MySQL側の問題なんだろうね。