スリープ解除時に起動音を鳴らすプログラム「おかえり」の起動期限が2008年12月31日。毎年、正月直前になってこのプログラムに手を入れている。Mac OS X 10.5Betaの時にXcode 3.0でビルドして大丈夫だったので、10.5.1対応は半日でできるだろーかと思っていた。
……甘かった(涙) 10.5.1+Xcode 3.0の組み合わせは凶悪で、10.5でビルドできていたプロジェクトがビルドできなくなったりして困っている。
そこで、Mac OS X 10.4.11上でXcode 2.5でビルド……10.5で動かないモジュールを取り替えて、まーなんとか(汗)
今回のようなOSの切り替え時期特有の問題でなくても、いままで快調に開発できていたAppleScript Studioのプログラムが、途中で正体不明のエラーに直面し、うまく動かなくなるというケースはある。そんな時には、部品ごとにバラバラに分解して、個別に動くかどうか再度チェックすることになる。ユニットテストのやり直し、というと分かりやすいだろうか。
ただ……最小単位の部品では動くのに、組み合わせてある程度の大きさにすると問題が起こるというケースも存在する。
こんな現象に何度か遭遇すると、トラブルを回避するために「あらかじめ再分解しやすい構造」を意識して書くようになる。個人で作るプログラムは割と複雑な構造にするケースがあるが、仕事で作るプログラムは……ひたすら分解しやすいように意識して作る。
プラグイン構造とまでは行かないが、プロジェクト中の所定の位置にスクリプトを突っ込んでおけば、そのスクリプトをロードして実行するぐらいにはなっている。動かしてみて問題があった場合には、突っ込んだスクリプトを単体でテストすることになる。
AppleScript Studioのプロジェクトで、中に複数のスクリプトのファイルを入れて動かすことはある。昔は、1本のメインスクリプトが他のサブ・スクリプトを変数の中にロードして呼び出す、といった構造にしていた。ファイルは別れているものの、結局ロードしてくるので1つの大きなスクリプトオブジェクトとして存在することになる。
だが、これだとプログラムがある程度以上の規模になったとき、とたんに「動かなくなる」とか「コンパイルが通らなくなる」といった現象に直面する。仕様としては存在してはいないものの、作成できるプログラムの上限みたいなものが存在するようなのだ。
最近では、これを回避するためにスクリプトオブジェクト同士をなるべく分離できるように心がけている。サブ・スクリプトとメイン・スクリプトの間でグローバル変数による値の相互参照は行わないようにしている。そのかわりに、設定内容を変更したらすぐにplistファイルに書き出すようにしているし、サブ側でもplistファイルの内容を読み出して実行するようにしている。
これでようやく原因不明の怪奇現象に直面することが……少なくなった。10.4環境ではほとんどなくなってきたのだが、10.5の環境はまだ盤石とは言いがたい。10.5(とくに10.5.1)上でプログラムを作ることの難しさを感じている。
さて、プログラムの開発の話はともかく、実際に使ってどうなのか。
「おかえり」については、毎日これを使っているユーザーというのは自分以外には知らない。奥方様に見せたら「うっとおしいから入れないでくれ」と言われたし、実家の父親に見せたら「お前に愛を語ってくれるのはコンピュータだけなのか?」とふびんそうな目で見られるし……通勤途中の電車の中で、音量設定が最大になったままの状態でスリープ解除を行って、起動音を派手に鳴らしてしまったことも一度や二度では済まない。
これを常用しているのは、知りうる限りでは自分1人である。だからそれほどバージョンアップの必要性は感じていなかったのだが……とにかく、自分は動作検証のために使い続けなくてはならない。動作内容が妥当であるかどうか、実際に運用し続けないと証明できない。
まあ、その程度のプログラムだと思っているわけなのだが、新バージョンをリリースしたらダウンロードする人がどの程度いるだろうか(ーー;;;