日付:2006/3/31
さて、ここで話はJavaから離れるが、気にしない。元はJavaの話だからだ。
きっ かけはいくつかあった。まず2007年一月のiPhoneの発売である。驚かされたことはいくつもあるが、プログラミングという観点で見るとOS Xが動いているというのが最大の驚きだった。日本の携帯電話、携帯情報端末というものは「ものすごーく原始的」な方法で開発されている。とにかく人間を集 めてきて、奴隷部屋に放り込み二四時間監視付きで働かせる。物が出来なければ一週間でも一年でも連続で働かせる。モデルチェンジがあれば今ある物を適当に いじる。もちろんドキュメントなんてものはない。それでも絶妙なバランスの元動いているから納品してしまう。そんなことを繰りかえしているうちに
「新しい物を一から作る」
力は全く退化してしまう。仕事のやり方を変えるなどとても無理。とにかく今の方法でひたすら人月をつぎこみ突き進むことしかできなくなってしまうのだ。
しかしこのiPhoneはまさしくそ うした「弓矢での戦い」とは次元の異なるものだ。おそらくはソフトウェアの天才が作り、そこから何年もかけ洗練されてきたNextStep->OS Xを搭載しているのだ。ということは表示やらなにやらを全部一から作ったり、ゴミのような既存モジュールをいじくったりする必要はないわけだ。
こ のニュースを聞いて以来、しばらく遠ざかっていたOS X上でのプログラミングに対する意欲がメラメラと復活してきた。おまけに次期OS LeopardになるとObjective-Cにガベージコレクションがついたり、便利そうなCore Animationが利用可能になるというではないか。というわけで今まで何度か挫折したObjective-CによるCocoaプログラ ミングに取り組み始める。まずやったことはApple主催のCocoaセミナーへの参加である。初級から上級まで体験してみるとなんだか自分でもできるよ うな気がしてくる。Objective-Cというのは文章の書き方がC/C++/Javaとはだいぶ変わっている。なんだか[]がやたらとでてくるし、 Javaならば
public void printString(String str)
と関数だかメソッドの先頭にかかれているものがObjective-Cだと
- (void) printString:(NSString*) str
とかなるわけだ。というわけで最初に心理的抵抗は大きいのだが、セミナー中で
「[]をみたらその中はObjective-Cの世界だと思ってください」
という一言で[]を気にしなくなり、順序が違う宣言文もなれればなんということはない。やはり座学であれこれ読んでいるだけではなく、いくばくかの時間を投資してセミナーに行くことって有益だなあ、などと勉強ばかりしていてもしょうがないので、まず何を作ろうかと考える。
な どと考えるまもなく、目の前に問題は存在している。LeopardからはCocoa-Javaインタフェースがサポートされなくなるというアナウンスがさ れていた。というわけで、今まで私がCocoa-Javaで作ってきたものははなはだ心細い状況になるわけだ。作ってはみたものの自分でも使っていないも のはまあ気にしない。しかしLog解析プログラムとかGMailは毎日使っている。これらが動かなくなったりするととても困る。
というわけで、ま ずは「簡単」と思えたLog解析プログラムのほうに取りかかる。しかし話は簡単ではなかった。Javaはやはり偉大なプログラミング環境だと思い知らされ る。使っている人間が多いということは、使えるライブラリも多いということなのだ。FTPのライブラリはやはりJavaのものを使いたいし、今までごりご り書いてきたログ解析の部分も使いたい。となるとObjective-CからJavaを呼びたくなるわけだ。しかしこれが簡単にはいかない。逆にJava からObjective-Cを使う方法はたくさん例があるし、私も使ったことがある。JNIというやつだ。問題は逆にObjective-CからJava を使う方法は「ある」と書かれているがその方法がよくわからないこと。あれこれやったが途中で放り投げる。ええい、もうこの際別プログラムとして呼び出 してしまえ、と開き直る。次 のChallengeはCocoa-Bindingというものだ。どうやら最近あちこちで使われている手法のようなのだが、これを使うと(難しい話はすっ とばして)目に見える画面上の部品(ボタンとかリストとか)とプログラムを結びつけるところのコーディング量がごそっと減る。今まで
「これ必要なのはわかるけど、なんだかわかりきったことを書いているような気がするなあ」
と思っていたところがあらかた不要になる。これは便利。
と いうわけであれこれのサンプルプログラムを丸写ししたりしながらなんとかプログラムはできあがる。プログラムの起動はCocoa-Java を使った場合よりも劇的に早い。その代わりといってはなんだがJava部分を起動するたびに時間がかかる。しかしそんなに早さを求めるプログラムでもない しいいだろう。というわけで思ったよりも順調にObjective-C版LogAnalyzerは動き始める。
というわけで今度はもう一つ「動か なくなると困る」Cocoa-Javaプログラム、OME_GMailの方にとりかかる。このプログラムずいぶんと長い時間をかけ、あちこち試行錯誤しな がら作ったものなのだが、今自分が使っている機能だけに限れば、作り直してもそれほどひどいことにはならぬように思う。おまけに今のバージョン立ち上げて おくと不意に終了する、という問題を抱えているし。
というわけでごそごそ作り始める。そもそもOutlineViewをCocoa-Bindingで表示するのってどうやるのか、から始まってしばしの格闘の後なんとかプログラムは動き始める。ここでは、Gmail開発時から変更したこと、変わったことを中心に記述する。ま ず変更したのはプログラムの名前。そもそも私がGMailという名前を考えた時点でもいくつか"Gmail"は存在していた。しかしその後Googleが GMailを発表して一気にこちらはマイナーに成ってしまった。最近Macのフリーソフトを紹介するページを見たのだが、
OME_GMail:OMEからGMailを使うプログラムではありません。
とかなんとか書いてある。制作者である私が見ても、なんだかその文章が自然に受け取れてしまうのがいやだ。
と いうわけで名前を考える。とはいっても真面目に悩んでもしょうがないから、もう一文字自分の名前を入れてGOMailにしてしまう。これを決めないとプロ グラムが作り出せないのだ。次に考えるのは画面構成である。Gmailの時は、とにかくウィンドウを開くものか、と引き出しを多用したが、あれは疲れた。 そのたびに全体の画面配置を計算して 部品の大きさを設定し直していたのである。若いうちならああいうこともできるが、年老いた今となってはつらい。というわけであっさりウインドウをぱかぱか 開くようにする。(実はそれほどぱかぱかでもないけど)次に題名一覧を縦長にしたり、横長にしたり、といった選択もできないようにする。どうせ自分しか使 わないのだから、そんな凝ったことはやめる。するとコードはとても少なくなる。このように現実に合わせて妥協をしていっても避けられない問題 というのは迫ってくる。フォルダ一覧と題名一覧とテキストをNSSplitViewというものに入れている。これを使うとそれぞれの区切り線の位置を自由 に変えられるから便利である。問題は、一度プログラムを終了すると、どの位置に区切り線があったかを綺麗さっぱり忘れてしまうことだ。
なぜこんな仕様が未だに残っているか理解に苦しむ。例えばWindowなどは、開発環境の画面上で一カ所チェックするだけでちゃんと場所も大きさも覚えてくれるというのに。
い や、そんなことは以前から分かっていた。だからGmailでは(今から考えれば想像を絶する苦労をして)どこに区切り線があったか覚えておき、起動時にそ の配置を再現していたのだ。しかし今からあれをもう一度やれ、といわれてもとてもできない。何かよい方法はないものか。
とあれこれ探す内、同じ問 題につきあたった人が多数いることを知る。そしてなんと「何段にも区切れます。それぞれの配置覚えています」という部品をフリーで公開している人がいるこ とを知る。ああ、ありがとう、インターネット。感謝の念とともにその部品を使わせて貰う。すると区切り線を持たせる処理がとても簡単に書ける。終了 して起動してもちゃんと配置は保存されている。ああ、ありがたや。
これと同じように、フォルダ一覧の各項目を開いておくか閉じておくかも保存した い。あれこれ検索してみるとそうしたコードを公開している人がいる。これもさっそく借用する。とかあれこれやっていると、GMailを作っていた頃より、 検索してコードを探すことが増えたことに気がつく。常時接続環境になったせいか、あるいは公開されているコードが増えたせいかはわからないが。
そ のうち避けては通れない「メモリ管理」の問題が浮上する。もともと「そのうちでるLeopardになればガベージコレクションがつく から、メモリ管理気にしなくていいし」とか思っていた。ところがいきなり「春に発売」と言われていたLeopardは10月に伸びてしまった。となるとそ の間なんとかしのがねばならぬではないか。えーっとautoreleaseってどういう意味かな?とかやっていると、いきなりプログラムが終了し、デバッ ガが立ち上がる。しばらくjavaしかさわっていなかったから、メモリ管理の必要性などすっかり忘れていた。えーっとその昔どうやっていたっけ、とかかす れた記憶を呼び戻しながらあれこれやる。やりたい放題あたらしいオブジェクトを作るとメモリがとんでもないサイズになる。泡くってreleaseとか入れ 出すと今度は妙なメモリにアクセスしましたぜ、というメッセージとともにデバッガが立ち上がる。それの繰り返しである。最近少し落ち着いてきたけど。
作り始めたのが4月の7日。3週間ほどでなんとか機能が 一通り動き出す。いや、本当の事を言えば、これを書いている5月中頃になってもまだ「おわっ。送信メールを書いたはずなのに文章が消えている」とかいろん なことが起こるのだが、まあなんとかそれなりに使えている。幸いなことにOMEも時々新バージョンがリリースされる。使い勝手はApple製Mailのほ うがいいのだろうが、やはり「一メール、一ファイル」というのは安心感がある。バックアップも楽だし。というわけで、これからもぼちぼち改良しながらこの メーラーを使っていくことになるのだろう。