半分ジョーク、半分マジ ken_allをRubygemsで公開しました

今年の夏、FizzBuzz 問題どや顔で解くひとなんかよりも "KEN_ALL.csv" をうまく扱える人の方が社会的貢献度高いという話題がtwitterで盛り上がったのを覚えていますでしょうか?私もそのときは「そんなんあったなぁ。懐かしい」と思っていたのですが、秋になってから隣の席の人がKEN_ALL.CSVの扱いでキレて頭を悩ませてるのをみて、社会的貢献をしようと思い立ったわけです。

...嘘です。Rails Engineを使ったgemを作りたいなぁと思っていたところにネタが転がってきただけです。手段のためには目的は選ばないのです。

ken_all | RubyGems.org | your community gem host

使い方

Railsで簡単に最新の郵便番号情報をネットから取り込むことができます。
1.Gemfileに追加

gem "ken_all"

2.プロジェクトのディレクトリでrakeタスクを実行

$ rake ken_all:install:migrations #migrationファイルをプロジェクトに作成
$ rake db:migrate #テーブルの作成
$ rake ken_all:import #郵便番号の取込

取り込んだデータはKenAll::PostalCodeモデルで使用することができます。
詳細はGithubのREADMEを見て下さい。

Rails Engineについて

Rails EngineとはRailsで作成したアプリケーションの一部を他のアプリケーションに取り込むことができる機能です。Rails用ページネーションとして有名なKaminariRails Engineを使用して作られているそうです。
Engineで私が気に入った点はテストのしやすさです。
開発中のEngineはdummyディレクトリ以下に作成されているRailsプロジェクトでいつでも実行することができます。rspec(※)も通常のRailsプロジェクトでやってる通りに書くことができます。

Rails Engineでtest unitではなくrspecを使う方法はwhile(false){.net}: Testing Rails Engines With Rspecの手順で行けます

KEN_ALLの不思議な魅力

KEN_ALL.CSVは業務システムを構築する人は一度は通る道だと思います。本家「日本郵便」が配信しているデータにもかかわらず仕様があやふやなまま何度も手直しされて今に至っているのが、データを軽く眺めるだけでも理解できます。具体的には郵便番号データの落とし穴郵便番号データの落とし穴」に落ちてしまいました。に詳しく解説されているとおりです。
おそらくパンチャーの方が汎用機に向かって一つ一つ手入力されているのでしょう。長い住所を途中で改行し複数行のデータを作るのはとても大変な作業だとお察しします。
そう、無機質であるはずのデータの向こうに人のぬくもりを感じるのです!
これって素晴らしいことだと思いませんか?

しかし、現実的には良い感じに手直しした郵便番号データをzipcloudさんが提供してくださってるのでそちらを使うののが正しいです。

ただ、データを眺めるうちに私は何とかしてプログラム処理のみで整形できないか試してみたくなったのです。
具体的にはzipcloudさんのページに書かれている解説の通りの処理を行なっているのですが次の部分だけは処理することができませんでした。

・町域名で、丸括弧で囲まれている部分を除去
 ※町域名の文字数が多いために複数行に分割されてしまっている場合は、1行にマージしておいてから丸括弧を除去します。
 ※括弧内の文字が「地名」や「ビルの階」など、住所として使えそうなものは町域名の末尾に追加します。
 ※括弧内に地名が複数列挙されている場合は複数行に分割します。

郵便番号データの町域名のカッコの扱いは非常に曖昧で、色々な使われ方をしています。何とかルールを見出してプログラムで処理したかったのですがうまくいきませんでした。
なので、ken_allのgemも外部ファイルを取り込む機能を使ってzipcloudさんのデータをimportするのが現実的かなと思っています。

$ rake ken_all:import:file FILE=/path/to/x-ken-all.csv #外部のファイルから取り込みます

まとめ

  • Rails Engine便利。みんなプロジェクトで作ってる部品や仕組みを手軽に公開しよう。
  • 郵便番号データは素直にzipcloudさんで公開されているものを使おう。
  • KEN_ALL.CSV謎深い。でも魅力的。