題名:Java Diary-30章

五郎の入り口に戻る

日付:2002/6/11

目次に戻る


GMail-Part2

1/23 From: Goro Otsubo <PFA01521@nifty.ne.jp>

To: xxx@xxxx

Subject: 今日の日はさようなら

Date: Wed, 23 Jan 2002 20:53:23 +0900 (JST)

 

はたしてこれがどのように解釈されるのでありましょうか。少し興味があります。

 

しかし考えようによってはどうでもいいことなのかもしれません。

----

これは初めてGMailから送ったメールである。宛先はなんだかわかない文字に置き換えてあるが、本来は自分のアカウント。自分から自分に送ったメールだからこういうばかげた物でもいいのである。

年末から年明けにかけて会社で「拘束時間は長いけどあまりやることがない」状態に陥っていた。早い話自分ではなにもしないのだが、人に何かをお願いしてその結果をずっと待っている、という状態である。とても暇だが帰るわけにはいかない。この空いた時間をどうしてくれよう。そうだ。GMailなど作るのはどうだろう。

そう思った私はiBookの電源まで会社に持ち込みひたすらプログラムを書き続ける。通勤電車の中でも書き続ける。そしてある日ふと思い立った。今までこうしてプログラム作成過程を文章にするときは、後から思い出し、まとめなおして書いていた。そのほうが筋道通った記述になるのだろうが、

「どんなことがあったかなあ」

と思い出すのも大変だ。いっそのことその日その日にやったことをリアルタイムで記述してみてはどうだろう。というわけで、1月の終わりから最初のバージョンを公開した3月1日までの間毎日

「今日はこれをやりました」

内容を書いていたのである。それらをどうやってJavaDiaryの一章としてまとめてやろう、と考えたのだが、適度に注釈をつけてそのまま(自分でも意味がわからないところは削除して)載せることとした。読み直してみるとこの期間一体会社では何をしていたのだろうと自分でも疑問に思えてくる。考えてみればここ数年会社で

「拘束時間は長いけどやることがない状態」

に陥る事が多いけどこれはやはり何かの問題を意味しているのかなあ。

などという考察は別として、ここからが日々の記録である。

------

1/26-27:ひたすらアドレス帳を作る。そのうちできたと思うが実際に使ってみると問題だらけでろくに動かないことに気がつく。しかしもう疲れているのでデバッグを放り出す。

[注釈]

アドレス帳というのは今回是非GMailに入れたいと思っていた機能だった。Mac OS Xにはアドレス帳なるプログラムがついてくるのだが、やたらと入力項目が多く、見ているだけでげんなりする。会社名、部署名、役職、電話番号、FAX番号など入力したくもないし、そんなもの関係ない知り合いのほうが多いのである。

ではどんなのを作ろうと思ってあれこれのアドレス帳を調べてみたのだがどれもこれも似たような物であまり参考にならない。結局

・名前、アドレス、コメント(せいぜい一行)を入力できること。

・複数のアドレスをグループにまとめることができること。

・個々の入力はカテゴリー分けできること。

ぐらいを目標にして作り始めた。もう一つ考えたのは

「メールの振り分け設定をアドレス帳に統合しよう」

というものである。市販のプログラムだと大変こったメール振り分け設定が行えるようになっているが、あまり使いたいと思ったことはないし、第一面倒だ。そもそも実際の手紙を区分けする際でも

「誰々からきた手紙はこっち、誰それからのはあっち」

くらいに分けるではないか。というわけで、アドレス帳のデータ毎に「どのフォルダに振り分けるか」という設定を行えるようにした。それ以上に細かい事をやりたい場合は、OMEの設定ファイルを直接いじってね、ということで開き直ることにしたのである。

かようになるべくシンプルで必要最小限の機能にしよう、と考えたにもかかわらずこのアドレス帳作成というのは大変な難物であった。そして本当の事を言えばこれを書いている時点で多々改良点があることは解っているのだが、ほったらかしてあるのである。

----

1/28:JavaからNSMutableArrayを呼ぶと遅い、というメールを読み、VectorとArrayに変えてみる。いまやJavaのArrayでもソートができるのだねえと感動するのもそこそこ。結局まだ遅い。

[注釈]

このソート-並べ替えというのはGBPutでも苦労したところである。ソートのアルゴリズムはいろいろあるのだが、今や一般的となったそれらを自分で書く、とうのはばかげている。調べてみるとNSMutableArrayというCocoaが提供してくれる行列クラスにはソートの機能がついているではないか。これを使えば万事解決、というのがこの文章を書くまでに考えていたこと。

このころからGMailで管理するメールの数が増えてきて、フォルダを選択してからメール一覧が表示されるまでの時間が長くなってきたのである。それはこのプログラムに対しておそらく世界で一番寛容であろう私にとっても耐え難いほどになりつつあった。

最初は

「そういえば、Outlookとかでもメールの数が増えると”ふるいメールをバックアップして性能を向上させますか?”とかなんとか聞いてくるよな。よし。フォルダの中のメール数が一定以上になったら、バックアップ用のディレクトリを作ってそこに移動させるような機能をつけよう」

などと考えていたのである。ところがある日同じメールブラウザのOME_BrowserXCoSを使って驚いた。こちらでは、フォルダを選ぶと「瞬時」にメール一覧が表示されるではないか。この性能差は一体いかなることか。

このフォルダを選んでから一覧が表示されるまでの間の処理というのは

・選択されたフォルダの中にあるメールの題名、宛先、日にちなどの情報を読み込む。

・日にちのデータを使って並べ替える。

調べてみると両方とも結構な時間がかかっているようだ。これはなんとかならんものか、、と思っていたときMac OS Xの開発者メーリングリストにあるメールが流れた。それは

「Cocoa上でのJavaというのはObjective-Cで書いたときそう遜色がなく早いけど、JavaからCocoaを呼び出すとべらぼうに遅い」

という内容のものだった。

データを配列に格納しよう、と思うことはままある。そうした用途に使えるものとしてJavaにはVectorというクラスがあるし、CocoaにはNSArray,NSMutableArrayというクラスがある。Cocoaが用意している関数が直接扱えるのはNSArrayのほうだから私は特別な理由がなくてもNSArrayの方を使うようになっていたのである。

そこに登場したのがこのメールだ。なんということだ。大した理由もなくJavaからNSArrayを呼び出していては遅いのも当然ではないか。そう思った私はなんとかJavaのクラスでソートができないか、とあれこれ情報をあさる。するとちゃんとあることがわかった。考えてみたら今私のパソコン上にあるJavaのドキュメントって、SETI@Supportを作り始めた時のやつだからもう4年も前のだよなあ。

よし、これは使えばきっと万事解決、と思いしょこしょこなおしてみたのがこの日の作業。しかし結果は私を落胆させるものだった。確かに改善はなされたもののまだまだ遅かったのだ。この問題の解決には結局もっともっと長い時間を要することになる。

----

1/30:ボタンを押したらメニューをポップアップさせるのに悩む。Interface Builderでなぜ設定できないかと思えばJavaでできないのであった。おまけに前に一度読んだことがあったのであった。

次にはボタンがサイズを変えるたびに移動してしまうことに悩む。問題はスクロールテキストのサイズをスクロール全体で測っていることにあった。

[注釈]

ここではメールについてくることがある「添付書類」というやつをどうやって選択させよう、かと苦闘しているのである。

最初は添付書類をボタンで表し、引き出しにでもいれてメールの内容表示の隣に並べてみようかと思った。実はこの

「引き出しにボタンを並べる」

というのは今までにも何度かトライしたことだったのである。今度こそうまくいくもんね、と根拠無く考え引き出しをつける。ボタンも適当に並べてみてしばらくじっと眺める。そのうち私は避けがたい結論に達する。この構想はだめだ。引き出しがやたらと場所をとるわりにあまり実用的ではない。次の手を考えなくては。

次に考えたのは「開く..」とか書いてあるボタンを表示しておき、それを押すと添付書類のファイル名(これは複数に成りうる)を表すメニューをぽこっと出す、というやつだった。このGMailを作るときになるべく「解りづらい」GUI部品は使わないぞ、と心に誓ったのではあるが、この「ぽこっとでてくるメニュー」というのは果たしてわかりやすいのだろうか?しかしもう新しい機構を考えるのも面倒だ。この構想で行こうと考えを固める。

というわけで方針は決まったのだが実現は簡単にはいかない。そもそも

「ボタンを押したら、メニューがぽこっと出る」

というのはどうやるのだ。インターネットで情報をあさることしばらく、ボタンのサブクラスを作り、マウスを押されたぞ、と言う時にメニューをだせばいい、ということはわかる。そうかそうか。では、ということでInterface Builderでボタンを作り、それを新しく作ったMyPopUpButtonというクラスだよん、と指定してみる。ところがこの方法ではエラーがでてコンパイルが通らないのであった。頭をひねることしばらく、

「この方法ではJavaではできません。面倒でも、、」

と書いてあるサイトに行き当たる。おまけに胸に手を当ててみれば少し前に全く同じ事をやっていたのであった。そして付け加えるならば、これを書いた後今日までに2度くらい同じ事をやってしまったのであった。

さて、これでメニューがでるようになったと思いご機嫌にぽこぽこメニューを出してみる。悦に入ることができたのはほんの短い間であった。メールの下のほうを読もうとスクロールした瞬間、ボタンが消えた。文章と一緒にボタンもスクロールしてしまったのである。

うげげげと思いあれやこれやの対策をやる。そのうち苦労の甲斐あってなんとかボタンはスクロールしないようになる。しかし表示が時々消えてしまう。ボタンはそこにあるらしく、マウスで押すとメニューはでるのだが、消えてしまうのはなんともならない。結局この問題は「開く..」ボタンの配置を根本的に変えるまで解決できなかった。

1/31 メーリングリストに「画像だけ公開しましょうか」と書いてみる。メッセージの移動がまだバグだらけであることに気がつく。

[注釈]

ちょうどこの頃メーリングリストの方で「どんな画面構成が良いか」という議論がなされていたように思う。この後のことだが別のメーラーのメーリングリストも読んでみたところ、人によってずいぶんといろいろな使い方、好ましい構成があるようだ。(そのメーラーは画面構成をほとんど無制限に自由に設定できるようになっていた)そこででてきたのがこの台詞。まだ公開はかなり先のはずだったが、とりあえず画面だけでも公開してご意見をいただければ、と思ったのだが反応がなかったのでそのままにしてしまった。今から思えば公開などしないほうが賢明だった気がしてくる。

メールの移動、というのもなかなか私を悩ませてくれたことの一つだった。フォルダ一覧の横にメールの題名一覧が並んでいる。これらをじっと観ていると、メールを他のフォルダに移動させたくなったとき、題名をぐいっとマウスでつかんで目的とするフォルダの上に持っていきたくなる。しかしこれをやろうと思うと結構大変。やれ、題名一覧からドラッグを始めた時に内容をどっかにコピーし、ドラッグが終わったときにその内容を読み出しファイルを移動させ、、

私の悪い癖で作っている機能が一度でも動くと

「ああ、動いた動いた。この機能はできあがり」

として再び省みることがない。しかしプログラムというのは条件の組み合わせによって実にいろいろな動作をしてくれるのであった。そしてそれらをきちんと試験しないと必ずバグの嵐に見舞われるのであった。そしてその嵐はすぐそこに迫っていたのである。

前の章 | 次の章


注釈