2012年03月11日

昨日は起きたら参加申し込みしてたはずの InnoDB Deep Talk #1 が始まってるらしいのに気づいて急いで行ってきました。入館面倒い会場なのに遅刻者対応したりピザとか飲み物調達とか面倒い事をニコニコやってるいちい++だったし、ピザーラのピザじゃなくてサルヴァトーレのピザはやっぱり上手くて沢山くってしまった。

っていう話は置いといて、一通り終わって歓談タイムに突入した時に、もりよしさんが昨夜思いついた inokodb っていう素晴らしいストレージエンジンを、その場で実装してて LT してたのを見て、勉強会に参加して意識が高まる症候群になったのですが、テンプレ的な意識の高まり方で終わってれば良いのに、なんか我慢出来なくなってその場で UDF でも作ろうと思って会場の wifi 探したのですが、電波見つからなくて断念しました。

家帰ってやろうとしたんだけど、僕の mac の brew install した mysql 5.5 だと -lcurl して作ったバイナリを cureate function すると落ちてしまって面倒くさくなって寝てしまって、起きて暫くして linux で環境作って作り始めたら存外簡単に出来てしまったとさ。

で、何を作ったかと言うと金曜日にライブドアって所がやってるロケタッチっていうシャレオツなサービスが住所正規化APIっていう素晴らしいAPIをリリースして下さったので、その API を使って MySQL だけで住所の正規化が出来たら、年賀状作成が捗りそうだったので作ってみました。

https://github.com/yappo/mysql-address_normalize
セットアップの仕方は

$ git clone git://github.com/yappo/mysql-address_normalize.git
$ cd mysql-address_normalize
$ g++ -lcurl -shared -fPIC -Wall -g mysql_address_normalize.cc -o mysql_address_normalize.so
$ sudo cp mysql_address_normalize.so /foo/bar/lib/mysql/plugin/
$ mysql -uroot
mysql> create function address_normalize returns string soname 'mysql_address_normalize.so';
という形でやれば動きます。 5.1.33 で開発しています。

使い方は死ぬ程簡単で普通に address_normalize 関数に返還前の住所を渡せば変換後の住所が帰ってきます。

mysql> SELECT address_normalize('道玄坂二丁目2');
+------------------------------------------+
| address_normalize('道玄坂二丁目2') |
+------------------------------------------+
| 東京都渋谷区道玄坂2-2           | 
+------------------------------------------+
1 row in set (0.09 sec)

既存の address カラムがあるテーブルに normalized_addres みたいなテーブルを増やした上で

UPDATE foo SET normalized_address = address_normalize(address);
のようにすれば、全レコードの住所を元に正規化されたカラムを作成する事が出来ます。

API レベルで正規化処理が出来なかった場合には元々のクエリのアドレスが帰ってきますが、 MySQL レベルのエラー、 HTTP 処理でのエラー、 JSON がなんかおかしかったりする場合には全て NULL を返します。

picojson と libcurl を使えば簡単に作れるとは思ってたのですが、 mac で作ろうとしてハマったのと C++ 力が低くて json parse 後のデータをどうやって取ればいいかって所で少しハマったけどこれみてすぐ解決した。

JSON API 叩く MySQL UDF とかだいぶ書くの楽でビックリしたという休日でした。

Posted by Yappo at 2012年03月11日 17:54 | TrackBack | tech
Comments
Post a comment









Remember personal info?






コメントを投稿する前に↓の場所にnospamと入力してください。