Archive for 2008 年 12 月 20 日
高速バス
ところで、これまたどうでもいい話が、10月ごろだったか、田舎の友人と年末には田舎に帰るぞーと話をしていたのだが、何かとバタバタですっかりおざなりになっていた。先日、その友人たちから電話があったりしたので、勢いで高速バスの予約を入れた。12/30の朝、博多を出て、正午前には到着する。で、翌31日の朝、田舎を出て、午後2時前には博多に帰ってくる予定。
バス会社はロイヤルエクスプレスというところ。往復で5,400円とかなりのお得感と思ったのだが、高速バスってだいたいこんなものなのだろうか?片道300kmほどを4時間弱で運んで、2,700円とは。タクシーで、ももち・粕屋間だけで3,000円以上払っていたのがうそみたい。まぁ、タクシーでそれも夜中だったからなぁ~、比較してどうなるもんでもないか。
まぁ、約4時間の車中をどう過ごすかの方が問題だな。iPodの充電どうしよう…。USBで充電できるようにしておかないとな。あ、WILCOM 03 も充電手段を忘れないようにしておかないと…。
う~む、カメラはどうするか?E-3か?伸男か?E-420はおそらくお出かけ中だろうし。
などと、まぁ、久しぶりにお出かけ気分だったり。
たまにはプログラミングネタ
かなり、久しぶりだが、プログラミングネタ。
symfonyによるwebアプリで、郵便番号から住所を引いてくるおまけ機能を実装しようと思って、とりあえず郵便ホームページから、いつもの郵便番号と住所の収められているCSVファイルをゲット。都道府県ごとに別になっているファイルもあるのだが、面倒なので、全国版をもらってきた。
んで、これをもとに
Zip:
id:
zip7: varchar(16)
jusyo: varchar(1024)
jusyo_kana: varchar(1024)
ってな感じのテーブルに格納していきたいわけだが。
まぁ、一応 schema.yml とかは出来上がっているので、$data->loadData(以下略)ができればいいわけ。symfony1.1になって、askeetの内容のまんまではうまくいかないが、1.1に合わせていくらかいじれば、これはすんなり動く。っていうか、その他のテストデータをぶっ込むために、この壁は乗り越え済み。
てことで、あとはcsvファイルからZip:
zip_00000:
zip7: 8200701
jusyo: 福岡県飯塚市長尾
jusyo_kana: フクオカケンイイヅカシナガオ
ってな感じのレコードを全国分作成すればいいだけ…。だけなのだが…。
先ず、csvデータの面倒なところなのだが、その1は住所のカタカナ表記がいまどき半角カナとなっていること。
さらに、都道府県と市町村とそれ以降が三つのフィールドに分けられていて、まぁ、それだけだったら別に問題ないのだが、なんと「それ以降」の部分が76バイトを超えると、複数レコードに分割されるという仕様。分割されたフィールド以外は、同じ値が入っている。で、連続行がどうかって、普通に考えて「7桁郵便番号」がプライマリーキーになっていて、それで判断するんだろうと予想したのだが、見事に裏切ってくれる。だいたいは、これでいいのだが、同じ郵便番号であるにも関わらず、住所が明らかに連続ではないデータが入っている部分がいくつかあるようだ。
なんで、こんな解釈が一意にできないデータを平気で公開できるんだろうなぁ~。とか、思ったりするのだが、まぁ、いいや。とりあえず、その辺を「善きにはからい」ながら、perl でせっせと yml ファイルを吐き出させた。途中、multi-byte<=>single-byte の正規化など、いろいろ最近のperlのコード変換事情なども勉強させてもらいながら。しかし、もうお役御免とも思われる jcode.pl の記事や最近のUnicode::Japanese に記事など、かなり混沌としていて、なかなか大変なことになっているなぁ~というのが率直な感想。
で、郵便番号レコードは12万件ほどあって、上記のようにymlでは1レコードが5行ほどになるので60万行以上の巨大なファイルになる。さすがにこれを1レコードずつpropelのオブジェクトモデルに従って、いちいちハイドレートしながらsave()していくと思いきり時間が、そしてリソースが必要となる。
で、windows上のちょっと古めの環境でやっていた時は、時間はかかったが、特に問題なく終わったのに、こんど同じymlをUbuntu8の環境で実行すると、途中からymlの内容を標準出力に吐き出して、さらにはそれも途中で終わってしまう。
当然、commitされないので、dbの中はからっぽ。読み込ませる yml が小さい分には問題なさそうなので、どうも使用リソースで制限がかかっているくさい。ってことで、つらつら見ていると、/etc/php5/cli/php.ini にResource Limits なんてブロックを発見。ここに、memory_limit = 32M なんて記述がある。ymlだけで16Mあるのに、これで足りるわけがない。んで、これを128MにUP。して再実行。おぉ、標準出力へのお漏らしは止まったぞ!が…、結局しばらくすると、勝手に終了してしまう。最初は、おぉ、えらく早く終わったぞと感心したのだが、mysqlでのぞいてみると、やはりcommitはされていないようだ…。しくしく。
で、再度、さっきのResource Limitsのブロックを見てみると、なんと「max_execution_time」なんてのがあって、これが30とかになっている。もちろん、30秒のことなので、これではお話にならない。こんどはこれを3600に書き直して、再チャレンジ。やはり、時間がかかったが、なんとか12万件のレコードを登録することができた。
以外と、いろんなところではまるなぁ~。としみじみ。
Plugin by wpburn.com wordpress themes