日付:2003/12/25
ここまでは基本的にJavaだけで開発を進めていた。さて、GUIをつけなくてはいけません。どうすればよいでしょう。
選択肢は二つあった。一つはこのままJavaだけでGUIを開発する、というもの。こちらのほうが好ましい選択肢であることは間違いない。将来世間に公開する際にも、多くの人に使ってもらえるだろう。しかし問題もある。私はここしばらくJavaのGUIを作ったことがないのである。またBorder Layoutにもどるか、あるいは新しいSwingとやらを勉強するか。しかしMac上ではSwing地獄のように遅いからなあ。
もう一つの選択肢は今までしょこしょこつくってきたGLBrowserの裏画面として機能を実装する、という方法である。作る側からすればこちらのほうが好ましい。基本部分はかなり流用できるし、ここしばらく慣れ親しんでいるCocoa+Javaの環境で開発できるわけだ。しかしできあがるプログラムは自動的に
Sorry, Mac only
になってしまう。さてどうしよう。
などと考え出したのが10月のはじめ。12月の初めには後述する理由によりこのプログラムはそこそこ動くようになていなければならない。となればここは「とりあえず」動く物を作るのが優先、というわけで後者の方法をとることとした。
検索結果のページをあらかじめダウンロードしておく、という機能をつけた際に、Webページを表示する部分を2画面切り替え式にしておいた。使わなくなった画面のほうに検索語がゆらゆらと移動するような画面を作ろう。そう考えるとさっそくあれこれ調べ始める。そもそもCocoaでアニメーションってどうやって書けばいいんだ。
サンプルを調べたり作ったりすることいくばくか。なんとか入力した文字が表示されるようになった。Site Browserを作った時の経験から、背景を黒にする。こうやるとかっこうよく見えるんだよね、と自分に言い聞かせる。文字は四角の中に書くのだが、四角をMac OSのボタンのように影つきで表示するコマンドを見つける。をを、これはかっこいいではないか、とまたもや自分に言い聞かせる(何故そんなことをするかと言えば、自分であまりその言葉を信じていないからだ)
一つ文字が表示できるようになると、今度は複数個の文字を表示するようにする。文字が重なってはいけないし、お互いあまり離れてもいけない。こうした制御はSite Browserでさんざんやったはずだ、、と思い何年かぶりにソースコードを見れば何のことかさっぱりわからない。しばらく眺めたあげく忘れることにした。このころ私は「局所的な情報だけを持つオブジェクト群が全体として見事な動きをする」という例をいくつか知り、それをやってみたい、という理不尽な要求にとりつかれていた。というわけでその考えをコードにしていく。まず重なっているノードがあればそれとは反対の方向に動こうとする。近くに他のノードがないときは、お互いに近寄るように。ただしぶつかるまで近寄ってはいけないよ。
ちょうどこのころ代々木で行われたヒューマンインタフェースシンポジウムという発表会に参加していた。ところが出席してみてそのレベルの低さに驚いた。大規模な学会というのは玉石混合の事が多く、石の中から玉を見つけるのが楽しみでもあるのだが、この学会は石ころばかりである。しかしめげることはない。私が座った席の近くにはコンセントがある。ということは電源タップを接続して時間を気にせずプログラム開発ができる、ということなのだ。私はひたすら黒い背景上をゆらゆらと動くノードの列を眺めていた。
そのうち「どうやらこれでいいかな」と思えるようになった。次には検索エンジンから返された結果を解析する部分と結合しなくてはならない。今まで全然別個のプログラムとして作ってきた物を結合するのだからいろんなところがぶつかったりあれこれする。山のようなエラーを修正し、プログラムはなんとか動き出す。元々GLBrowserはGoogleに対して検索要求を出し、その内容を解析する機能を持っていたのだが、それと同じようなクラスを重複して作る。もちろん一つにまとめた方がエレガントなのだが、とりあえず今は前に進むことを優先する。一番の根本、すなわち
「自分は何を作っているのか。何かの役にたつのか」
という問題にはまだ答えがでないままなのだ。
文字を入力するとそれが画面上にノードとして現れる。検索をしている間はその像が薄くなったり濃くなったり。(Cocoaをあれこれ調べているうちに、像の濃さをコントロールする機能を見つけ、この後多用することになる)間もなく検索結果が帰ってくるとその内容を解析し、よくでてくる単語を新たなノードとして追加する。ノードはお互いぶつからないよう、離れすぎないようにゆらゆらと動く。その動きはいつまでも収束しないし、動きものろい。そもそも検索に時間がかかりすぎている気がする。
Googleに対する検索は10件単位でしか出せない。だから30件の結果を得ようと思えば要求を3回投げる必要がある。これまでは最初の結果が帰ってきたら次の要求を投げ、と順序よくやっていたのだが、この遅さは耐え難い。プログラムの一部を平行動作させるようにし、なんとかその部分の時間は短縮される。しかしノードの位置がいつまでも決まらない状態はそのままだ。時々
「うまく動いた」
と自己満足に陥ることがあるが、それはあくまでもノードがうまく動いているというだけであり、前述した根本的な問題は何一つ解決していないのである。
そもそもこれは何のプログラムだったのか。一つだけはっきりしているのはノード配置プログラムでないということである。私は思いきった。ノードを追加するときにすべからく他のノードと衝突しない場所に配置し、ひたすらそこに向かって動いていくようにしよう。味気ないかもしれないが今はとにかく進まなくては。
さっそく新しい構想の下プログラムを作ると長さは例によって数分の一になり、そこそこ(これが問題なのだが)満足に動き出した。しかし時々ノードが重なったままになるのはどうしてだろう。いや、ここは前に進まねば。
それと時を前後してだったと思うが「黒い背景+Cocoaボタン風のノード表示」もゴミ箱行きとなった。自分で何度も「これこそ経験の成果。ほらかっこいいだろう」と自分に言い聞かせてみたが己を欺くことすらできなかった。白い背景に素直に黒く文字を書く。これで十分。
さて、そうやってプログラムができあがっていく。検索した結果は画面の右1/3に文字として表示される。Googleは検索結果の「要約」を返してくるが、その要約ですら画面上でへれへれ眺めるには長すぎる。検索語の周囲数語だけあればいいのだあ、と範囲を極端に狭める。ただ単調にスクロールするだけでは面白くないから、あるところまでいくとビヨーンと動くようにしよう、などと頭の中で妄想はふくらむがキーボードを前にするとはたと指がとまる。えーっとえーっとぴょこん、ということは、、、、ええい面倒だ。とにかくスクロールさせてしまえ、ということでその部分のアルゴリズムは今日までそのままである。
さて、かくしてプログラムはそこそこ動き始める。関連語が中央に表示され、要約の要約が左側を流れていく。しばしデバッグをかねてそれを使ってみる。確かに「恐竜」から始まり「福井」を経由し「恐竜博物館」にたどりつくことはできる。しかし私は深いため息をつく。ひらたく言えば全然面白くないのである。
しばらくひどい自己嫌悪に陥る。なんだかんだと偉そうな事を言って結局できるのはこんなものか。人間批判するのと自分でやるのは全く別、と言っているが貴様もそうではないか。ああ、どうしよう。
しばらくプログラムを触らず「何もなかったんだ。そう。何も起こってはいないのだ」と自分に言い聞かせようとしたが、もう遅い。GUIなしバージョンを動かしていた頃結構関連しそうな言葉がわらわらでてくるのに気をよくした私は同じグループの人間に「そのうち私の通勤電車プロジェクトの成果をお見せします」と断言していたのだ。いやまあみんな忘れたことにしてくれるとは思うけど、、、、
などと頭の中でいいわけを組み立てながらあれこれ考える。やっぱりビジュアルにぱっと見てわかるイメージが必要なのではないだろうか。イメージというとGoogleにはイメージ検索という機能がある。検索語を入れるといきなりそれに関連すると思われる写真が表示される機能で面白いし役にも立つのだが、今回のプログラムで使用するわけにはいかない。(Google APIはイメージ機能へのアクセスを提供していないのだ)となればイメージ表示は自分でやるしかない。
どういうわけだか私の手元には指定されたURLのページをダウンロードし、その構成を(適当に)解析するプログラムが存在していた。これを流用すればなんとなくできるのではないか。そんな予想のもとにごりごりプログラムを作り出す。ただ検索語があるページにイメージが複数あった場合どうする。どれが正解だかわからんではないか。ええい、面倒だ。あまり横に長かったり縦に長いイメージはきっとページの装飾に使われているやつだから捨ててしまう。後はみつかった順に3個まで表示しよう。それはそうとして、画像のダウンロードってどうやるんだろう。WebCoreに確かそういう機能があったはず、、ということであれこれ調べてみるがずいぶんといろいろな機能がついている。逆に言うと面倒だ。ええい、ということで考えうる限り一番単純な方法で実装した。作ったプログラムでダウンロードした画像をダブルクリックするとなんだかちゃんと表示される。よくわからんけどこれでいいことにしよう。
でもって画像が画面からはみ出せばスクロールせねばならぬ。どういうロジックでスクロールさせよう。あれこれ考えるがだいぶ気力もつきてきた。これまた考え得る限り2番目に単純な方法でスクロールさせる。
こうして名無しのブラウザはなんとなくできあがっていく。(本当はGLBrowser ver0.3とかすべきなのだろうが、今やどうみてもリストがあるとは言えない状態だ)試験と称してつんつんつついて検索をやり、流れる画像をぼーっと眺める。
注釈