題名:Java Diary-48章

五郎の入り口に戻る

日付:2004/8/4

目次に戻る


Goromi-Part1(Ver0.1)

などとご機嫌のうちにWISSは終わった。帰ってくるとさっそく会社の仕事が戻ってくる。細かくは書かないが

ああ、WISSは楽しかったなあ。日常の仕事というの違うよなあ」

とため息をつくこと数回。とにかくまたいつもの日々がすぎていく。そんな中でも私は今回WISSでデモしたプログラムをJavaだけで動くように移植する作業に取り組みだした。とにかくMacintoshのシェアは小さく、人様に使ってもらおうとすればWindows「でも」動くようにする必要があるのだ(Macintoshで動くのは必要条件である)今回のプログラムはCocoa+Javaで作ってあるから、Cocoaに依存している部分だけJavaに書き換えればいい。理論上はそうなのだがこれは例によって例の如く簡単にはいかない。

まずはJavaでの開発環境を整える必要がある。Project Builderを使ってPure Javaの開発も行えるはずなのだが、やはりここはマルチプラットフォーム&フリーのJava開発環境であるEclipseを使おう。以前Mac版をインストールし、そのあまりの遅さに驚愕して使わなくなっていたのだが今や贅沢は言えない。それとともに今まで極力避けて通ってきたSwingなるJavaのGUI開発環境もとうとう避けて通れなくなった。まずは勉強だ。

会社の本棚を漁ると一冊だけSwingの本が見つかる。あたかも仕事に使うかのような顔をしてざーっと読む。JavaとCocoaというのはどこかしら似ているので(確かJavaがNextStepを参考にしたのだと思ったが)感じはなんとなくつかめる。これは使うかもしれない、と思った部品にタグをはってはい、読み終わりました。次に調べるのが

「Swingでのアニメーションのやり方」

である。その昔Site Browserを作った時はJDK1.0についてきたGraphLayoutというデモプログラムにあれこれつけたしつけたしでやっていたけど、さすがにJDK1.4になった今では別の方法もあるだろう、、とインターネットを漁るとあれこれ情報が見つかる。サンプル作ると画面上を赤い玉が動き出した。これで一安心。

などと思ったことを数分後に後悔することになる。検索文字列をいれるフィールドを作り、Autoのボタンを作り、などと考えるのはいいがさて問題です。どうやったら画面上に部品を配置できるでしょう。慣れ親しんだInterface Builderはもう使えないのだ。となるとその昔悪夢のように感じたなんとかLayoutと格闘する日々がまたやってくることになる。

GridBagLayout, SpringLayoutなどとあれこれ試してみるが何故かまともに動かない。(いや、もちろん私の作り方がタコなのだと思うけど)比較的最近導入されたSpringLayoutなど指定の仕方はInterface Builderにそっくりなのだけど、とにかく動かない。そのうちはっときがつく。私がやろうとしているのはJavaのLayoutを極めることではないはずだ。見栄えは後でなんとかするとして今はとにかく進まなくては。というわけで昔懐かしのBorderLayoutに戻ってしまいました。できた画面を見るたびため息が漏れる。ああ、あのかっこいいCocoaのTexture Windowと比べてこの情けない外観。まあ後でなんとかしよう。(もちろんこんなことを言っても後で何もしないのだが)

というわけでこしょこしょ作り始める。開発に使ったEclipseは、行を書き終えたところでエラーが表示されるから、こういう時は便利である。GLBrowserの方から少しずつソースを移し、とにかく動くようにする。エラーがでる。該当する部分を作る。ああ、またNSPointなんか使っている。(頭にNSとついているのはCocoa固有のクラスである)ええっとええっとJavaのPointってどうなってるんだっけ。などと考えながら少しずつ動き始める。Javaでプログラムを作るのはいつものことなのだが、今回は少し変えたことがあった。可変長の配列を表すのにVectorをいうのを使っていたのだが、ArrayListに統一したのである。また要素をずらっと取り出すのにiteratorを使うようにした。

このIteratorというのは、その昔C++でプログラムを作っていた頃「なるほど、これは便利だ」と思い使ったいた。それからJavaにうつって長いこと忘れていたのだが、復活である。ほれほれ、と目につくところかたっぱしから書き直す。

そのうちそこそこプログラムが動き出し、検索などができるようになる。すると今まで観たことがないエラーがでるようになった。入り組んだメッセージだが読んでみると

「ArrayListを操作している間に、誰かが同じArrayListを変更しました」

とかなんとかそういうことを言っている。うげげと思いあれこれ調べる。確かに身に覚えはある、というか複数Threadを使ったプログラムでこういうことが起こるのはわかるのだが。「この処理している間はこのArrayListさわっちゃだめよ」という札のようなものをそこら中に追加する。物の本を読むとこれをやるとパフォーマンスの低下が発生する可能性がある、ということなのだがこの際動かないことにはパフォーマンスも何もないのである。

そのうちプログラムはほれほれと動き始める。となるとそろそろ避けて通れなくなるのが「設定パネル」というやつだ。つまりいろいろな設定をするための画面である。

なぜこれをそんなに問題視するか。Javaで画面部品を配置するのがとても難しく、面倒だからだ。であるからしてSETI@Supportを作ったときは意地でも設定パネルをつくらず、全てメニュー中から直接設定するようにしている。使いにくかろうが見にくかろうがとにかくJavaの画面配置はいやだ。当時はそう思っていた。

しかしいくらなんでも今回はそれを避けることはできない。どうあがいてもメニューに埋め込むことができないデータもあるのだ。というわけでしくしく泣きながらあれこれやりはじめる。あるLayoutを試してみる。動かない。別のLayoutを試す。動くことはわかるが見栄えが悲惨に悪い。以下同文である。途中「フリーの画面配置ツールはないのか」と思いJBuilderとかいうのをインストールする。使ってみると、、使ってみると、、Mac OS XについてくるInterface Builderとのあまりの差に愕然とする。愕然としてもなんとかものができればいいのだが、結局しばらくトライしたあげくに放棄する。

結局設定パネルがそこそこ動くようになるまでに丸一日を要した。Interface Builderを使えば20分でできるような作業に丸一日である。そして画面上にはやたら長いコードが並んでいる。ああ、誰かInterface BuilderをJavaOnlyの環境で使えるようしてもらえぬものかなあ、、などというのが無茶な事であるとわかっていてもそれを望んでしまうほどJavaでの画面配置は難事であったのだ。

などといつまで文句を言っていてもはじまらない。とにかくできあがったパネルを本体に組み込みさらにあれやこれやの処理を追加する。そのうち「入力した単語の周りに関連単語がわらわら表示される」というのはできるようになった。次にはこの単語をつつけるようにしないといけないのだが、Javaでマウスクリックを検出するのってどうするんだっけ、、と新しい環境にくると何かとひっかかるのである。

単語がそれなりに表示されるようになると今度は画面の左に表示される「要約文」の表示である。などとやりながら自分が作ったプログラムを見直してみると「まあ、なんて馬鹿な事をしているのかしら」と思うほど妙な事をやっている。まあしょうがないよなあ。WISSでデモするために「とりあえず動けばいい」の連続だったから。

話を戻す。要約文の表示である。しょこしょこやるといったんはなんとか動き始めたのだがこの時点で私はまた失望を味わうことになる。とても動きがのろいのだ。この時点までCocoaでの表示よりJava Onlyの表示の方が速い、わーいと喜んでいたのだ。ところが要約文を表示し始めた途端亀のようなスピードになってしまった。いや、きっとこれでも前よりはましに違いない、となんども自分に言い聞かせようとするが(それまでに何度もやった同類の試みと同じく)失敗に終わる。しょうがない。それまでは文字を直接画面に書き込んでいたのを改め、最初に手元の紙のようなものに文字を書き込み、その紙を表示するようにする。文字を書くというのはどうも大変なことらしいので、こうすると以前は早くなった。そして幸運なことに今回もそこそこのスピードで動き出してくれたのである。

となると「最後」の難関であるはずの「取得したページから画像を取り出して表示」機能である。この機能に関してはほとんど書き直したようなものである。第一にJavaとCocoaでは画像ファイルの扱いが全く違う。第二に画像を次々と表示するアルゴリズムがなかなかまとまらなかったからである。

最初の問題は、まあインターネットを漁ってサンプルプログラムやらなにら探してごりごりコードを書けばなんとかなる。(コンパイルしてみると重大なエラーがいくつも出て動かないサンプルコードを載せているサイトがあって、えらいめには合ったが)問題は2点目のアルゴリズムである。WISSのデモプログラムでは、一定時間後に画像が薄くなり画面から消える。するとその上にあった画像が下にどんと落ちてきて、一番上の開いたスペースに新しい画像が表示される、とそんな風にしていた。これもいいのだが、いくつか細かい問題があり、今度は変えようと思っていたのである。スペースを有効利用するために、そこら中ランダムに選んだ位置に表示させればいいだろう。

ところがそれをやってみるとどうに見づらい。何度か自分をだまそうと試みるのだがみづらいものは見づらい。人間の視界というものは広いようで集中できるところは狭い。だからあちこちにぼつぼつ現れる画像を把握しようとするとどうにも目をちろちろ動かさなくてはならない。そのうちすんなり白旗を揚げた。

というわけでまた上から画像が降ってくる方式に戻る。最初は間抜けな方式と思えたが、こうやって比べてみると確かに見やすい。なるほど、いろいろなところに考えるネタというものは有る物だなあと阿呆の如く感心する。ただ一つだけ小さな工夫を入れた。全ての画像を同じスピードで動かすとあたかも画像が貼り付けられた幕が上から下に動いているよう。これは面白くない、ということで個々の画像の速度に少し乱数を加えた。速度の差は少しだが個々の画像がばらばらに落ちてくるように見える。

とここまでできたのが1月の最初。年末には美崎さんが書いた原稿が某サイトに掲載された。「それでは」ということで社内で説明をさせられる。私は1月16日前後海外出張であった。出張なのだが学会出席だから時間はたくさんある。会社の人間に向かって「出張中に仕上げて、帰ってきたら社内で公開します」と大見得を切る。しかし例によって例の如くサイトから配布できる形式にしようとすると困難があるのだった。

いくつも細かい話はあったが、一番の問題は「できたファイルをどうやって一つにまとめるか」だった。JavaにはJarというファイル形式があり、関連するファイルを一つにまとめることができるようになっている。いや、SETI@Supportでも散々使ってはいただのだが、他のJarファイルをどうやって統合したらいいかわからない。その前にEclipseが呼び出しているプログラムをまとめるツールAnt(ファイルには蟻の絵が描いてある)の使い方も覚えなくてはならない。えんえんえん、とやっているといつの間にか日が過ぎていく。結局社内で公開したのは1月の末だったと思う。メールで「こんなもん作りました」と皆に伝える。するとある人から「とうとう公開ですか。ところがファイルがうまく解凍できないんですが」と知らせられる。おかしい、自分でやったときはうまくいったけど、と思いながらメールで直接ファイルを送付する。

その後は誰も何もいってこない。そもそも何故社内で公開したかと言うと、一般公開の前に問題点をつぶそうと思ったからだ。しかしフィードバックがなければなんともならない。しかたがないからグループの人間をつかまえて「あれ動いた?」と聞けば動いたとのこと。

それから公開までにはまたかなりの日が流れた。この間何をしていたわけでもない。単に思い切れなかったからだ。しかしある日「えいや」と思い切る。Goromiと名付けたソフトウェアをサイトで公開したのは2月20日だった。題名 一覧には「これはなんなのでしょうねえ。。。 」と書いた。自分でも未だに何を作っているのかわかっていなかったのだ。

前の章 | 次の章


注釈