デモは、 こちら 。ソース一式は、 GitHub上 に置いておいた。
(下画像はデモ画面のキャプチャーです)
デモ機はIntel Core2Quad Q9450 2.66GHzの1コアだけを使ったVPSで、今どきはライトな部類に入るマシンだと思う。この上で、 約14万行(レコード)=地域名12万行+事業所名2万行 ある郵便番号データから目的のデータを検索している(デモページの一番左にあるボタンを押した場合)が……、実感できる速さはいかがなものだろうか?
ちなみに、デモページの右二つのボタンはオマケである。よそのWeb APIをサーバーサイドで叩いて外部サイトに検索してもらい、結果を表示しているだけだ。だが、結果はJSONやXMLテキストで渡ってくるので、 シェルスクリプトでもJSONやXMLをパースできるよ という意図を込めて設置している。上記の通り標準的なコマンドだけで書かれているので、ぜひ中身(CSV用、JSON用、XML用)を見てもらいたい。
デモを試したらソースも見てもらいたい。クライアントサイドのプログラムは何の変哲もないJavaScriptなので割愛するが、サーバーサイドのプログラムは次の3種類から構成されている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
. |-- README.md ................ このファイル | |-- data .................... 郵便番号辞書ファイル関連ディレクトリー | | | |-- mkzipdic_kenall.sh ... 郵便番号辞書を作成するシェルスクリプト(地域名用) | |-- mkzipdic_jigyosyo.sh . 郵便番号辞書を作成するシェルスクリプト(事業所用) | | ・要 zipコマンド、curlコマンド、及び iconv または nkf コマンド | | ・crontabなどから実行させるとよい | | | `-- jigyosyo.txt.sample .. 辞書ファイルのサンプル(地域名用、最初の30行を抜き出し) | | | `-- jigyosyo.txt.sample .. 辞書ファイルのサンプル(事業所用、最初の30行を抜き出し) | | |-- public_html .............. Webディレクトリー(httpdでこの中を公開する) | | | |-- index.html .......... 入力フォーム(Webブラウザーでこのファイルを開く) | | | |-- zip2addr.js .......... 郵便番号→住所 変換用クライアントサイドプログラム | | | |-- zip2addr.ajax.cgi .... 郵便番号→住所 変換用サーバーサイドプログラム | | (もちろんシェルスクリプト) | | | |-- zip2addr_xmlapi.ajax.cgi ... 郵便番号→住所 変換用サーバーサイドプログラム | | (よそのXML形式APIを叩いて検索するバージョン) | | | `-- zip2addr_jsonapi.ajax.cgi .. 郵便番号→住所 変換用サーバーサイドプログラム | (よそのJSON形式APIを叩いて検索するバージョン) | `-- commands ................. 自作コマンド置き場 | |-- parsrc.sh ............ CSVをシェルスクリプト向けに正規化するコマンド"PARSeR-Csv" | |-- parsrj.sh ............ JSONをシェルスクリプト向けに正規化するコマンド"PARSeR-Json" | `-- parsrx.sh ............ XMLをシェルスクリプト向けに正規化するコマンド"PARSeR-Xml" 参考:https://gist.github.com/richmikan/3251311 |
dataディレクトリーの中にあるシェルスクリプト。これは、日本郵便のサイトから、Zip圧縮されたCSV形式の郵便番号データをダウンロードしてきて、その中から必要な列(郵便番号、都道府県名、市区町村名、町名)だけを取り出して辞書データファイル(サンプル(地域名用),サンプル(事業所用))を作るというもの。
コイツはCGIではなくcronで、毎晩でも毎時間でも実行させるように仕掛けておけばいい。え、「頻繁に実行したら負荷がかかるだろ!」って?大丈夫、HEADメソッドで事前にCSVデータのタイムスタンプを見比べ、新しいものが出てなければ作らないようにしてるから心配なし。これで郵便番号辞書の作成だけでなく、変更があったときには自動的に更新がかかる機能までが実装できた。
ちなみに、CSVのパースは上記の自作コマンドで行っている。(もちろんシェルスクリプト+UNIX標準コマンド製)
public_htmlディレクトリーの中にあるシェルスクリプト。上記のmkzipdic.shで作成した辞書ファイルからCGI経由で指定された郵便番号に対応する住所をJSON形式にしてクライアントに返す。要するにデモで動かしているメインのプログラムだ。
ちなみにzip2addr_jsonapi.ajax.cgiとzip2addr_xmlapi.ajax.cgiは、先に記したとおり、よそのWeb APIに検索を任せるオマケである。
commandsディレクトリーの中にあるシェルスクリプト。役割は題名のとおりだ。コイツらを通すと、CSVやJSONやXMLデータの欲しいところがAWKやgrep等で簡単に取り出せるようになって超便利。
先に記したとおり、これらももちろんシェルスクリプト+UNIX標準コマンドで作られている。
というわけで、今回の記事ではシェルプログラミングの魅力を再確認してみた。シンプルで力強く、奥が深いシェルスクリプトの世界。これからもこの世界を共に切り開いていこうではないか。