2013年5月31日金曜日

その後の郵便番号検索

ToDoとしていた項目のうち、URIがイケてない問題は解消。
Apacheの設定弄るとか、普段使ったことのない筋肉だからひどく苦労した。(そもそも最初の時点では、Apacheの設定で解決するのだというところさえ知らなかった)

ついでに、サービスの内容をぼんやりと説明するページを作って、トップに割り当てた。ここ。
http://bagend.sakura.ne.jp/zipcode/


元の住所データが123,400行。

そのうち、330行程は住所が長すぎて書ききれなくって2行以上に分割(!)されていた分。
この郵便番号データ、パっと見カンマ区切りなので、いわゆるcsv型式に見える。が、実際には論理的な1件が物理的な1行になっていない不定型なデータだ。分割された行の中での順序の情報とかも入っていないので、とりあえず上から順番に繋げばいいのだと信じるしかない。これを1行に繋げる処理までは実装済み。

これらを繋いで作った123,100件のうち、1,900件くらいが194-0000みたいな「町田市のその他の地区」の番号。
残りの121,000件が「町田市○○町」みたいな町名とか番地に割り当てられている。

そのうち、800件ほどは「○○町1〜5丁目、△△町」みたいな面倒なことになっている。
全体の1%にも満たない量なんだけどね。

この800件をきれいに整理してみせるのが目標。
自分がこの問題に取りかかった理由であり、一番大きな作業である。

この住所データの整理にとりかかる前に、テストを書こうとしてる。
データベース用のロードデータを作成するバッチ部分だけ。Webでの問合せ部分は、あまり弄る必要性を感じていないので。
肝の部分くらいテストを書いておかなくては……という義務感半分。xUnitやmockの使い方に習熟しておきたいってのが半分。

2013年5月21日火曜日

郵便番号

会社員@事務系です。


FizzBuzz問題華やかかりし頃、一部で「業務プログラマ的には、むしろ郵便番号のcsvで腕試ししたいよね」的な話が持ち上がっておりました。

FizzBuzz 問題どや顔で解くひとなんかよりも "KEN_ALL.csv" をうまく扱える人の方が社会的貢献度高いhttp://togetter.com/li/352382


とはいえ、未だ実際にその実装例を見ることができていません。しょうがないから、自分で作りました!
…とドヤ顔で言ってやろうと思って、既にもう8ヶ月。他の問題に手を出したり、プラットホームをGoogleAppEngineからレンタルサーバに乗り換えたり、ほとんど開発と関係ない時間でしたが。


郵便番号→住所
http://bagend.sakura.ne.jp/zipcode/index.cgi/zip2adr?code=1940015

住所→郵便番号
http://bagend.sakura.ne.jp/zipcode/index.cgi/adr2zip?pref=福島県&muni=福島市&street=置賜町

問合せの結果はJSONフォーマットで返します。他のサーバから利用してもらう想定なので。

streetは実際に登録されている町名とユーザーの入力の、いずれか短い方を基準に、前方一致したものを複数返す仕様としています。
上記の例だと「置…なんだっけ?」とか、「いきおい余って、丁目まで入れてやったぜ」という場合に対応してます。
streetに入力された町名がデータ上存在しない場合は末番00の「○○町(以下に掲載がない場合)」になるはずです。


ソースはこちら。
https://github.com/morinatsu/ZipCode

郵便局のサイトから圧縮ファイルをダウンロードして加工するバッチ部分と、そうして組み上げたデータベースをもとに問合せに答えるWebサービス部分にわかれています。
これに、データベース(sqlite3を利用しています)にデータをアップロードする部分まで作りこめば、完全自動でいけるはず。
ただ、上記のソースの開発はUbuntuでやりましたが、運用サーバはさくらレンタルサーバのFreeBSDなので、そのままでは動きません。辛かった…。


TODO:

  • 「以下に掲載がない場合」とか、問合せ結果として、あまり面白くない文言はそのまま使わないようデータを修正させる。
  • 「○○町、△△町、××町」など、町名などが列挙されているものを分解して扱う。
  • 「○○町1丁目〜6丁目」とか、連続しているものも分解して扱う。
  • テストを書く。
  • 意味もなく、パッケージ化を試してみた結果など、意味のなくなったファイルを消す。
  • 格好悪いURL /zipcode/index.cgi/ の修正。mod_rewriteの使い方が…。


上3つくらいはちゃんと実装しておかないと実用にならないし、下3つをなんとかしないと「作った」とは言えないよなぁ。
あと、ジェネレータ関数を作っておいて、json.dumpsでうまく使えず結局list化しているのも何とかしたい。