2007-11-18

software for your mom

あまり早くもない朝, 布団の中で二日酔いに唸っていたら母から電話. 何かと思えばコードを書けという. 割り算の問題ジェネレータ. 小学校教諭である母が教材作りに使うのだ. よくわからんが以前作ったものだと機能が足りないので改良版をよこせとのこと. 以前といっても 2,3 年まえ. もう記憶もないしコードもない.

顔を洗って掃除洗濯, メールをみると仕様の補足が届いていた. ねぼけていたことにしてしらばっくれるつもりだったけれど, そうもいかないらしい. 遠い記憶を呼び戻しながら策を考える. 要件は三桁÷二桁の割り算の中から特別な条件を満たすものを選ぶという簡単な話. このくらいの割り算は総計で 80000 通りしか候補がないから 総当たりで条件をチェックすれば解ける. 前もそんな作りにした気がする.

別にロジックはむずかしくない. 面倒なのは母でも使えるというところ. 自分で使うなら ruby でちょいと書けばおしまいなのだけれど, 母親にコマンドラインを使えとは言えない. それに何かをインストールしろというのも面倒が多い. サポートで家に戻るのはいやだ. 前回は UI のために仕方なく Java で書き, 帰省して動作確認と JRE インストールをした. でも可能ならメールの返信だけで済ませたい. 中年だって忙しいんだよ. すこしは.

そこで今回はランタイムのいらない UI つき実行環境として HTML+JavaScript を選んだ. Java はランタイム以前にまず build.xml を書くのがめんどくさい. 3 年前よりは JavaScript を書けるようになったはずだし, 問題はなかろう. 実行結果はファイルに書き出せないけれど, 画面からコピぺしてねということにする.

ちまちまコードを書き, 条件チェックは動いたので あとは 80000 回ループを回すだけだーと思って回したらブラウザに怒られた. なんてこったい...仕方ないので適当に分割して setTimeout() で連結. 慣れない作業でもたつくうちに日射しが赤みを帯びはじめ, やや気を滅入らせながらもパラメタ入力用の form をつけてできあがり. 開発は Mac+Firefox だったから, あとは IE で動作確認すれば OK.

...と思って IE で動かしたら, うごかねー. ぐぐったところ, IE は table#innerHTML が動かないらしい. なんてこったい... table ごと生成して div に挿すよう修正. 更にスクリプトが遅い. なぜか IE の方が 10 倍くらい遅い. これでは使いものにならないので高速化をためす. ローカル変数への参照キャッシュ, インライン化, 再帰除去など peephole optimization のオンパレード. (純粋な計算が大半で DOM 操作や通信は少い.) もう完全にうんざり. JavaScript なんてやってられんという気分になりながら, でも少しは速くなった. hg push でレポジトリ更新. 外はすっかり暗い.

ようやくできたプログラムの zip を母にメールして一息 ... つく間もなく, 動かないと電話. 危惧したとおり windows の zip フォルダにひっかかっていたので, "全て展開" を選ぶよう念入りに指示. 何度かのやりとりの末, 展開はできたようす. ...が, 動かない. しらねーよ... いわゆるセキュリティソフトに疑惑を向けるが, 私はそんなものを使っていないから再現できない. IE が駄目ならと仕方なく firefox をダウンロードして試してもらうことにする. せっかくチューンしたのに... とにかく無事に狐のアイコンが出たと電話. そして相変らず動かないという. なんでだよ...

ふと HTA のことを思いだす. さすがにこれなら動くだろう. 拡張子を html から hta に変更し, 手元で動作を確認, パッケージして送...れない. Gmail は hta を実行ファイルとみなし, それを含む zip は添付できないらしい. もう hotmail のアカウントはないし, 手元のメーラも設定してないよ... 母親に拡張子を変えるよう指示しようかと考えるも, 拡張子なしの設定でエクスプローラを使っていたと思いだし断念. やれやれ...

仕方ないので最後の手段, このサーバに HTML を配置し, URL をメールした. まさにこれが嫌でローカルで閉じるようがんばってきたのに. サーバが使えるなら CGI で書くし, 前計算も済ませておくよ...

こうして一日が終わり, situated programmer としての腑甲斐なさにうなだれた. でも, Shirkey 先生, 親孝行がしたいです ...30 分くらいで...