Kyoto Cabinet + Starmanで住所検索 ...を試してみた
miyagawaさんプロダクトのPerl製高速Webサーバ、「Starman」について調べていると、これまた高速な、しかも国産 KVS(キーと値でのみ表現される単純なデータベース)である「Tokyo Cabinet」なるものを発見。そしてなんと以下で Ajax を使った簡単な住所検索アプリを紹介してくれてるので、Mac で早速試してみました。
Tokyo Cabinet のサイトにいくと書いてありますが、現在では Tokyo Cabinet を凌駕するという「Kyoto Cabinet」が推奨らしいので実際にはそちらで試しました。基本的にはリンク先にある通りに試しているだけなのでそちらを見た方が早いかもです。自分へのメモも兼ねて。あしからず。
準備
まずは cpanm で Plack と Starman を入れときます。
$ cpanm Plack
$ cpanm Starman
次に kyotocabinet と kyotocabinet-perl をダウンロード。Mac なら $ sudo port install kyotocabinet でもインストールできますが、ここではサイトから最新版をダウンロード。ダウンロードしてきたら、
# kyotocabinet
$ tar xzvf kyotocabinet-1.2.51.tar.gz
$ cd kyotocabinet-1.2.51
$ ./configure
$ make
$ sudo make install
# kyotocabinet-perl
$ tar xzvf kyotocabinet-perl-1.16.tar.gz
$ cd kyotocabinet-perl-1.16
$ perl Makefile.pl
$ make
$ sudo make install
元となる郵便番号データは、日本郵便のサイトからzip形式をダウンロード。
アプリ作成
Tamashiro.orgさんのところにあるコードをもとに、アプリ本体である ken_all.psgi と、郵便番号データを読み込んで KEN_ALL.kch というデータベースに格納するための ken_all.pl を作成します。Mac なら …/darwin-2level 以下に KyotoCabinet.pm と一緒に入る KyotoCabinet.pod も参照しながらやるといいと思います。以下は元のものから Kyoto Cabinet 用に変えた部分だけ。
ken_all.pl
use KyotoCabinet;
tie(my %ken_all, 'KyotoCabinet::DB', 'KEN_ALL.kch')
or die 'tie error';
while ( my ($zip_code, $addresses) = each %ken_all_tmp ) {
$ken_all{$zip_code} = join q{<br />}, @$addresses;
}
ken_all.psgi
use KyotoCabinet;
my $html = do { local $/; };
my $app = sub {
my ($env) = @_;
return [ 200, [ 'Content-Type' => 'text/html' ], [ $html ] ]
if $env->{REQUEST_URI} !~ m{\A /search\?zip_code=(.*) }xms;
my $zip_code = $1;
tie(my %ken_all, 'KyotoCabinet::DB', 'KEN_ALL.kch')
or die 'tie error';
my $address = $ken_all{$zip_code} || q{};
return [ 200, [ 'Content-Type' => 'text/html' ], [ $address ] ];
};
はい、ほとんど変わってないですね。
実行
最初に ken_all.pl を実行して同じディレクトリに KEN_ALL.kch が作成されたのを確認します。
$ perl ken_all.pl
あとは Starman でアプリを動かすだけ。
$ starman ken_all.psgi
無事起動したっぽかったら、ブラウザから http://localhost:5000/ (ポートを指定していないのでデフォルトのポート5000になる)にアクセス!

速っ!!!感動。そして Starman も Kyoto Cabinet も国産。すげー!
みなさんもぜひ試してみてください!