シェルスクリプトマガジン

ぼくらがシェルで生きる理由 (Web版独自記事)

動作デモとソース

デモは、 こちら 。ソース一式は、 GitHub に置いておいた。

(下画像はデモ画面のキャプチャーです)

デモ機はIntel Core2Quad Q9450 2.66GHzの1コアだけを使ったVPSで、今どきはライトな部類に入るマシンだと思う。この上で、 14万行(レコード)=地域名12万行+事業所名2万行 ある郵便番号データから目的のデータを検索している(デモページの一番左にあるボタンを押した場合)が……、実感できる速さはいかがなものだろうか?

ちなみに、デモページの右二つのボタンはオマケである。よそのWeb APIをサーバーサイドで叩いて外部サイトに検索してもらい、結果を表示しているだけだ。だが、結果はJSONやXMLテキストで渡ってくるので、 シェルスクリプトでもJSONXMLをパースできるよ という意図を込めて設置している。上記の通り標準的なコマンドだけで書かれているので、ぜひ中身(CSV用JSON用XML用)を見てもらいたい。

 

簡単な構造解説

デモを試したらソースも見てもらいたい。クライアントサイドのプログラムは何の変哲もないJavaScriptなので割愛するが、サーバーサイドのプログラムは次の3種類から構成されている。

1.郵便番号辞書作成mkzipdic_kenall.shmkzipdic_jigyosyo.sh

dataディレクトリーの中にあるシェルスクリプト。これは、日本郵便のサイトから、Zip圧縮されたCSV形式の郵便番号データをダウンロードしてきて、その中から必要な列(郵便番号、都道府県名、市区町村名、町名)だけを取り出して辞書データファイル(サンプル(地域名用),サンプル(事業所用))を作るというもの。

コイツはCGIではなくcronで、毎晩でも毎時間でも実行させるように仕掛けておけばいい。え、「頻繁に実行したら負荷がかかるだろ!」って?大丈夫、HEADメソッドで事前にCSVデータのタイムスタンプを見比べ、新しいものが出てなければ作らないようにしてるから心配なし。これで郵便番号辞書の作成だけでなく、変更があったときには自動的に更新がかかる機能までが実装できた。

ちなみに、CSVのパースは上記の自作コマンドで行っている。(もちろんシェルスクリプト+UNIX標準コマンド製)

2.住所検索CGIzip2addr.ajax.cgi

public_htmlディレクトリーの中にあるシェルスクリプト。上記のmkzipdic.shで作成した辞書ファイルからCGI経由で指定された郵便番号に対応する住所をJSON形式にしてクライアントに返す。要するにデモで動かしているメインのプログラムだ。

ちなみにzip2addr_jsonapi.ajax.cgiとzip2addr_xmlapi.ajax.cgiは、先に記したとおり、よそのWeb APIに検索を任せるオマケである。

3.CSV、JSON、XMLパーサーparsr*.sh

commandsディレクトリーの中にあるシェルスクリプト。役割は題名のとおりだ。コイツらを通すと、CSVやJSONやXMLデータの欲しいところがAWKやgrep等で簡単に取り出せるようになって超便利。

先に記したとおり、これらももちろんシェルスクリプト+UNIX標準コマンドで作られている。

凄いぞぼくらのシェルスクリプト!

というわけで、今回の記事ではシェルプログラミングの魅力を再確認してみた。シンプルで力強く、奥が深いシェルスクリプトの世界。これからもこの世界を共に切り開いていこうではないか。