小飼弾」を検索して「空気嫁」って出ないバグについてというネタを振ろうとしたら本当にbugを見つけたというお話。

はてなダイアリー日記 - キーワード連想語API公開について
キーワード連想語API仕様の詳細については、以下キーワードをご参照ください。
はてなダイアリーキーワード連想語API

しかも(21:15現在)、なんかアクセス集中しているのかはてなキーワードがStatus 500で落ちてる(苦笑)(21:45現在直ってます)。

例題にあるPerl Scriptで日本語をぶっこむとなぜか動かない。Ruby版は問題ないのに。これではかゆいし、くやしいので、原因を探してみると、ありましたありました。

XMLRPC::Lite
# 48:sub new {
# 49:  my $self = shift;
# 50:
# 51:  unless (ref $self) {
# 52:    my $class = ref($self) || $self;
# 53:    $self = $class->SUPER::new(
# 54:      typelookup => {
# 55:        base64 => [10, sub {$_[0] =~ /[^\x09\x0a\x0d\x20-\x7f]/}, 'as_base64'],
# 56:        int    => [20, sub {$_[0] =~ /^[+-]?\d+$/}, 'as_int'],
# 57:        double => [30, sub {$_[0] =~ /^(-?(?:\d+(?:\.\d*)?|\.\d+)|([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?)$/}, 'as_double'],
# 58:        dateTime => [35, sub {$_[0] =~ /^\d{8}T\d\d:\d\d:\d\d$/}, 'as_dateTime'],
# 59:        string => [40, sub {1}, 'as_string'],
# 60:      },
# 61:      attr => {},
# 62:      namespaces => {},
# 63:      @_,
# 64:    );
# 65:  }
# 66:  return $self;
# 67:}

そうなのです。XMLRPC::Liteは、Non-ASCIIな文字列はbase64でおくっておったのですね。

mkdir XMLRPC
cp `perldoc -l XMLRPC::Lite` XMLRPC

としてオレlibを"."にAd-Hocにこさえて、太字の55行目をコメントアウトしたら、うまくいきまんた。

#!/usr/bin/perl
use strict;
use warnings;
use lib ".";
use XMLRPC::Lite;
use utf8;
binmode STDOUT => ":utf8";

my $res = XMLRPC::Lite->new->proxy('http://d.hatena.ne.jp/xmlrpc')
    ->call('hatena.getSimilarWord', { wordlist => [ "はてな" ] });
if ( my $fault = $res->fault ) {
    warn "$_ => $fault->{$_}" for ( keys %$fault );
} else {
    print join(", ", map { $_->{word} } @{$res->result->{wordlist}} ), "\n";
}
__END__

実行結果:

ウェブマスターはてな,keyword,クエスチョン,人力検索はてな,はてなダイアリー,株式会社はてな,どんどん,サイト,ウェブサイト,疑問符,はてなアンテナ,マーク,2001年,キーワード,言葉,はてなスタッフ,ユーザー

これ、どちらのバグともいいがたいっちゃあいいがたいのですが、はてなにおかれましてはBase64 Encodeされたキーワードにも対応していただけるとうれPerl。

Dan the (Hatena|Perl) Monger