法令データ提供システムのデータをgithubに上げてみた話

この記事はCivic Tech Advent Calendar 2013の一つになります。

Civic Tech(シビックテック) とは何か

…市民がテクノロジーを活用して公共サービスなどの地域課題解決を行うことを指しています。…これまで行政だけではサポートできなかった分野でのサービスを行ったり、市民自身がより深く行政のプロセスに参加したり、公共分野でのイノベーションを起こすことができるのではないかと、欧米などで盛り上がりを見せている分野です。

civictech – 地域課題解決の新しい形、Civic Tech と Code for Japan – Qiita

僕自身、特に Civic Tech に対して何か志や熱意があるわけでは今のところ無いですが、別件で API とデータについてふと考えてた時に、日本国の法令データも更新が頻繁じゃないんだから普通に全部ダウンロードできた方がいいよなぁと思いました。

ざっとインターネットを探してみた感じ、そもそも法令の原本がどこにあるのかもよく分からなかったし、法令の専門家はどうやら紙の新旧対照表?を未だに使ってるらしいとかを見て、Tech が有効だなぁと感じました。機械にできることは機械にやらせるべき。

ところでドイツは法律が github にあるとのこと。

というわけで、じゃこれやってみるかと思いました。ただ、原本がどれなのかよく分からなかったので、インターネットで見た感じ良く使われてそうな「法令データ提供システム」を適当にクローリングするスクリプトを一晩で書いてみて、github に上げてみました。

仕組み

web のエンジニアの方ならおなじみかと思いますが、システムに対して人間がブラウザからクリックしてアクセスする代わりに、プログラムが同じことをやって自動的に全データにアクセスして文章を丸ごとダウンロードしているだけになります。プログラミング言語は Ruby を、ライブラリとしては Mechanize というこういう仕事を簡単に書けるライブラリを使っていて、お陰で数行のコードで実現できています。

法令データ提供システムには、五十音索引があったので、このボタンを一つ一つクリックして表示されるリストの法令全てを一つ一つクリックしてはダウンロードというのを繰り返しています。あんまりガシガシいって迷惑かけてもいけないので適当にスリープしていますので、全件ダウンロードするのに 9 時間くらいかかってます。月一回更新されるとのことなので、10 月に一度ダウンロードしておいて 11 月のダウンロード後に差分が面白いことを確認して公開した次第です。

なお、法令データ提供システムの HTML は Shift JIS という日本固有の文字コードで書かれているので、保存している HTML ファイルについては github 上で diff が上手く表示されません。ただし実際表示されるテキストについては Mechanize がいい感じに Unicode という全世界標準の文字コードにしてくれてるので、それを保存してる方(text ディレクトリ以下)は diff が色付きで表示されて素敵な感じになりました。

github/git

github というのは git という文章のバージョン管理システム向けソフトウェアのホスティング(git 用のサーバを無料 or 有料で使わせてくれる)サービスです。今回の様な誰でも見れる権限での利用であれば無料ですし、先の API のエントリで書いたダウンロード集中の問題も github が頑張ってくれます。

バージョン管理システムはテキストファイルの変更履歴を記録できるもので、過去の任意の時点のバージョンを一瞬で取り出せたり、バージョン間の比較をしたりできます。まさに法令にはうってつけではないでしょうか。

さらに、git は過去の履歴も含めた全てのデータを手元にダウンロードして、新規の差分を随時適応していくということも可能です。法令を見たい人は自分のパソコンに僕の github から一度ダウンロード(clone)しておくと、あとは毎月差分だけをダウンロード(pull)するだけでいつでも過去から最新までのデータを手元で(インターネットにつながってなくても)見ることができます。あとは手元の git のデータに対して検索をかけたりするソフトウェアを入れておけば、法令データ提供システムにイチイチアクセスする必要がなくなりますね。

問題点

全部を 1 ディレクトリに保存してるせいで github での表示が遅い

ドイツのやつみたいに頭文字でディレクトリを分けた方がよさそうですね。

HTML は要らない?

HTML はとりあえず保存してますが Shift JIS だし情報が冗長なので要らないかもですね。

名前が重複してるものがある

名前が重複してるものとか実はあって、現状はどれか 1 つだけしか保存されてません。。。法令の Identity ってなんなんでしょう。。。

この辺何かご意見あれば頂けると助かります。整ってきたら自動で毎月更新するような仕組みを入れてしまおうかなとも思ってます(今は自分が手動で更新してます)。

エンジニアじゃない人向け

この程度であれば普通の web のエンジニアなら一瞬〜一日程度でできてしまうので、もしご自分が何か不便を感じているような事案があればどんどん言ってみることが大事だと思います。エンジニアは今回の様に一瞬で実現できる様なものだったらやらない理由がありませんし、タフな案件であってもそれはそれで好奇心をくすぐります。そして自分でやってみたら意外と簡単かもしれません。

まとめ

法令データ提供システムをクローリングして github に全部あげてみました。簡単な割に意外と好評だったのでとても嬉しかったです。コードを書く機会が無くて困っているエンジニアがいたら、こういう形で発散するととてもすがすがしい気分になりますのでやってみましょう。Civic Tech や Code for Japan は面白そうなので、自分が何かできそうなことがあれば協力していきたいと思いました。