法令データ提供システムのデータを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は面白そうなので、自分が何かできそうなことがあれば協力していきたいと思いました。