題名:Java Diary-20章

五郎の入り口に戻る

日付:2000/1/3

目次に戻る


SETI@Support-part14(Ver0.64-0.7)

ちょこまかと0.62,0.63をリリースしている間に、私は次のメジャーバージョンアップの構想にとりつかれていた。

0.61から摩天楼と称されるGaussianのパターンを表示するようにしたことは前述した。これは単にstate.sahの中にあるデータをプロットしているだけなのだが、結構それなりに表示がされる。しかし本家のクライアントのほうではそれに加えて

「こうしたガウシアンのカーブを考えて居るんだよ」

というカーブも表示されるのである。当然ことながら次には「これを表示したい」と思うようになる。

ところが私の貧弱な頭ではstate.sahの中の数値をどうひねくりまわすとこのカーブが描けるのであるか見当がつかない。カーブの上底と下底はわかるのだが、その幅がわからないのだ。また本来であれば「これはこの分解能のときに何秒に発生したデータです」という表示もできるはずなのだが、これもどうしたらよいかわからない。

さて、困った時は他人の知恵にすがる、というのがこの世を渡るスタンダードな方法の一つである。世の中にあまた存在しているSETI@homeの表示支援ツールを観てみると、大抵のツールでは私と同じく摩天楼の表示か、あるいはそれに加えて若干のデータを表示しているだけであることがわかった。ところが一種類だけきちんとSETI@homeクライアントと同じデータまで表示しているプログラムが存在しているのである。

SETI Spyと呼ばれるそのプログラムは以前にも一度試したことがあるのだが、「ふーん。こんなものね」という事であまり注意を払わなかった。ところが今こうして自分が問題をかかえて眺めてみると、なんのことはない。ちゃんとこのプログラムは私が悩んでいる問題を解決しているではないか。

それからしばらくの間私はなめるようにそのSETI Spyのページやらドキュメントやらを読んでみた。ところが「CPU性能」の計算方法については実に詳しく書いてあるのに肝心のGaussianの計算の仕方についてはどこにも書いていないのである。こうなればしょうがない。とにかくstate.sahに記録されている数値から(SETISpyであっても結局参照できるのはこれらのデータだけなのだ。。。少なくともそのはずだ)なんとかひねればこのカーブが表示できるに違いない、、と思ってそれから数日間苦闘したが結局徒労に終わった。

さて、同じくGaussianに関することだが、私はもう一つのアイディアにもとりつかれていた。去年のある時点で、SETI@homeのサイトには「我々が捜しているのはGaussianで、今までみつかったGaussianはこんな分布になっている」というページが加えられていた。そこには縦軸にGaussian Fit,横軸にGaussian Powerをとったグラフがしめされ、

「ここが興味をひくGaussianがある領域だよ」と表示されていた。

さて、このグラフが公開された直後、私は大変暇な状況にあった。そこで線をひっぱったりなんとかして「果たしてこの領域を示しているのはいかなる数式であるか」などとやっていたのである。その時点で私は200程度のユニットを計算していたが、その「興味あるGaussian」の領域には一つしかはいっていなかった。

私はその結果に愕然とし、しばらくそのグラフの事を忘れていたのである。しかし考えてみればカーブの表示は難しくてもこのグラフの表示はできそうではないか。おまけにSETI Spyをみれば小さいながらもこのグラフが表示されているのである。

さて、そう思い立つと例によって例のごとくつかれたようにGaussian 分布グラフ画面の作成にいそしみだした。やることはそう難しくないのだが、やたらと手間がかかるのはいつものこと。ただしこれまでに作った部分を適当に切ったり張ったりしていけばだいたいの骨格はできるからそんなに悩んだりするわけではない。あれこれやったのは表示のオプションについてであった。

まず最初は全体の色合いについてあれこれ試行錯誤をやった。黒地に白で表示してみたり、逆にしてみたり、灰色にしてみたり。あれこれやったあげく落ち着いた色合いというのは、SETI Spyと全く同じ配色だった。私としては多少オリジナリティを主張したいとも思ったのだが、まあこれ以上の配色はできなさそうだからまあいいとしよう。

最初のテストは数個のデータだけを使って行っていた。しかしそのうち「たくさんのデータを表示したらどうなるんだろう」と思い出した。さっそくやってみると、これが実に興味深かった。SETI@home client Ver2がリリースされてからというもの「以前とくらべるとどうもGaussian Fitの値が小さくなっている気がする」とは思っていたのである。そしてそれは確かだった。プロットをさせてみると大きく二つのグループに分かれていることがわかる。そしてそれはほぼClient Ver1とVer2の差による物のようだ。

さて、そんなことをあれこれ考えながら作った画面を見ている間、私は奇妙な妄想にとりつかれるようになった。

グラフの地は黒で、そこにブルーの"Interesting Region"が描かれている。このInteresting Regionは本来台形であるはずなのだが、横軸を対数でとっているために斜めの辺がちょっと下向きにカーブして見える。そしてプロットされたデータはほぼその上の方にあり、そして点滅を加えるとまるでちらちら雪が舞っているように見える。そして頭の中には歌が流れ出す。

「富士の高嶺に降る雪も。。。」

しかしながら決定的に欠けているものがあった。「富士」に見える"Interesting Region"に雪が積もっていないことである。それから数日。私はその「つもった雪」をなんとか表現できないかと妙な事をあれこれ考え、そしてプログラムすることになった。

あれこれ試行錯誤の末にできあがった「つもった雪」は頭の中で想像していたものと比べると今ひとつだった。こうして書きながら考えているともうちょっと時間をかけて改良する手もあったのだろうが、私はようやく正気にもどりつつあった。何をやっているんだ、と自問自答することができるようになったのである。

さて、正気に戻るとまだまだやらなくてはいけないことがあることに気がつく。グラフの縦軸、横軸をのばしたり、縮めたりするようにしなくてはいけない。Gaussian Powerを横軸にとっていて、私が解析したユニットでの最高値は3.2あまりだが、本家のサイトをみるととてつもない値のデータもあるようである。となれば表示はちゃんと対応しておかねばなるまい。

さて、私がそんなことを考えてあれこれやっているうちに、またもや自分の間抜けさにへそをかむような思いをすることになった。

そろそろ0.7のリリースが視野に入ってきた頃、私は一通のメールをうけとった。差出人の名前には見覚えがある。以前バグをレポートしてくれた人だ。

そのメールを読んだのは出勤前の寝起きの時間であった。寝ぼけ眼で読み始めたが、読み続けるにつけ私が顔から血が引いていくのを感じていた。

Ver0.5シリーズでかなり後になるまで「新しくユニットの解析を始めると、今終わったばかりのデータを書き換えてしまうバグ」が残ったことは前述した。そして0.6で調子にのってガウシアンのパターン表示をつけたのはいいが、痛い目に遭ったのと同じ間違いをきれいにやってしまっていたのである。ソースを観るとまさしく同じバグだ。なんということだ。あれほど痛い目にあっておきながらその経験を生かせないとは。

即刻あやまりのメールを書くとともに、Ver0.641をリリースした。小数点以下二桁があるやつは、機能追加が待ったくなく、バグフィックスだけを行ったバージョンだ。やれやれ。これで一安心、と思った私はまだまだ自分の愚かさというものに対してあまりにも無知であったのだ。

 

数日後に同じ人からメールを受け取った。今度は特定の条件でプログラムが立ち上がらない、というもっと深刻な問題である。この人はとても詳しく状況をレポートしてくれるので、バグを治す身としては非常に助かる。それを観てみると、0.641で問題になった「クローン」のところでエラーが生じている。なんだこれは?と思ったが次に私は実に馬鹿なことをやった。

「とりあえずこちらの環境で再現しません。あれこれなおしたVer0.7 Betaをアップしますので、そちらで試験してみてください」

と書いたのである。実際Ver0.7の機能はほぼかたまり、リリースも秒読みに入っていたのは確かである。もっと正確な表現を使えば、「秒読みにはいっていたとわたしは楽観的な予想にひたっていた」である。

 

さて、ここで話を少し前にもどす。「私のMacintosh」に書いたことだが、一年ほど前に私はVia Voiceという音声入力プログラムを使うために東芝のLibrettoを購入していた。しばらくの間快適に音声入力をしたのは事実だが、最近はその気力すらうせ、この機械は半年あまりをふたをとじられたままですごしていたのである。

さて、自分で書いた文章を読み返してみるとこの機械には私は13万円あまりも投資しているのである。しかしふたを閉じられてLEDだけを点灯させながらスピーカーの上でほこりにまみれているLibrettoを観ていた私はふとある考えにとりつかれた。これでSETI@homeを実行すればいいじゃないか。小さいとはいえこれは立派なIBM-PCなのである。となればうまくやれば動くかもしれない。

さらに、と私の想像は膨らんだ。今まではバグがあってもPC版を作って検証するのにどうしても会社の機械の力を借りなくてはいけなかったが、これにJavaの環境までインストールしてしまえば、自分のアパートで全部できるようになるではないか。

そう考え出すと私はさっそくあれこれやりだした。まずはこの機械をネットワークに接続するところから考えなくてはならない。幸いにも私が普段PB2400で使っているモデムはちゃんとIBM-PCにも対応ということになっている。ではドライバをダウンロードし、、としばしの苦闘の後、Libretto上でもSETI@homeにSETI@supportが動き出したのである。

最初のユニットを計算してみると、どうやら1ユニットあたり30時間くらいで計算を終えるようだ。もとがそんなに処理能力の高いマシンではないからいたしかたない。そうはいってもこのマシンは24時間通電で、SETI@homeだけに使用できるから、ちょっと長い目でみればMacintoshよりも多くのユニットを解析するかもしれないのだ。

さて、そうやって一週間ほどたんたんと解析をしたが、そのうちまたもや妙な考えにとりつかれた。会社のマシンは専用線接続だから解析が終われば自動的にサーバーに接続、次の解析を始める。ところがこのマシンはモデム接続だから私が家にいるときしか接続できない。たとえば出勤した10分後に解析が終了すれば、家に帰るまでの10時間あまりは無駄になってしまう。

もとが補助のために使い始めたものだから、そこまで神経質になることはないと思うのだが、どこかこのSETI@homeというものには人間をして「しゃかりきに解析せずにはいられない」状況に追い込む作用があるようである。そんなことを悶々と考えながらあちこちのサイトをみてみると、やはり同じ問題に突き当たった人はたくさんいるようである。ワークユニットをいくつかまとめてダウンロードし、順番に解析していくツールがいくつか発表されている。これならばたとえば一つのユニットを解析し終えたら次のユニットに自動的に移ってくれる。結果の送信と新しいユニットの受信はいつでも任意の時点でおこなえばよい。

これだこれだと思い私はそうしたツールの一つ、SETIDoublerをさっそくダウンロードして使い始めた。4っつワークユニットをためこむようにしたから、SETI@supportの画面上でも解析中のユニットが4っつ表示される。(本当に解析されているのはそのうちの一つだが)

 

さて、ここでようやく話は本筋に戻る。私は自分がバグをフィックスした、と信じ込んでいたVer0.641をこの機械にインストールした。そしてSETIDoublerを使いはじめてから最初のユニット解析が終了し、結果を送信し、、とやったところで再度SETI@Supportを立ち上げようとした。

LibrettoにはJRE1.2をインストールしてあるから、ダブルクリックでSETI@Supportはたちあがる、、、と思ってダブルクリックをしたが待てど暮らせどプログラムはたちあがらない。この「ダブルクリックで立ち上がり」というのは大変便利なものだが、本来表示されるはずのエラーメッセージがでてこないままお亡くなりになる、という欠点がある。何が起こったのかわからないまま何度か同じ操作を繰り返したが、結果は同じだ。

しょうがないからコンソールからコマンドを打ち込んで立ち上げてみた。すると表示されたのは「こういうエラーがでて立ち上がりません」とメールで教えてもらった、その通りのエラーメッセージではないか。

私は泡を食って再度メールを書いた「ご指摘いただいたバグが再現しました。少々お待ちください」というやつである。次にはクローンをしているところのソースコードをじっと眺める。わからないから、あちこちにプリント文を仕込んで何が起こっているか追跡する、という実に野蛮なデバッグをちょっとやってみる。。。。などと数分の格闘の末私は

「ぎょえー」

と叫んだ。なるほど。これではプログラムがクラッシュするはずだ、という実に間抜けなバグを発見したのである。

さっそくプログラムを修正すると、アップロードだ。ここで使い始めたばかりのLibrettoがさっそく役にたつ。以前だったら月曜日までアップロードはおあずけだったはずだ。そして週末の間「ああ。私はバグがあると知っているプログラムをWeb Siteで公開してのうのうとしている」と自己嫌悪にさいなまれるところである。

最初にバグを知らせてくれた人に「0.642をアップロードしました」とメールをうってからしばらくすると今度は別の人から「SETI@Supportがクラッシュします」というメールをうけとった。私は再び平謝りモードのメールをうってしばらく待った。果たして今度はちゃんと動いてくれるのであろうか。。

数日後メールがとどき「うまく起動できました」と教えてくれた。私としてはほっと一安心である。しかしそのメールのなかで別の問題を指摘された。実はこの同じ問題は私もSETIDoublerを使い始めてから気がついていたのである。現象としては、新しいワークユニットの解析をはじめても、しばらくの間は解析が終わったばかりのユニットのデータをひきずってしまう、というもので、新しいユニットの解析進捗が97%となかなっているのはさすがに妙な感じがする。

この問題は最初から存在していた。しかしこれまでは、新しいユニットを受け取る、ということはそのまま次の解析をスタートする、ということだからあまり表にはでてこなかったのである。妙な表示は次のデータ更新までしか続かない。しかしSETIDoublerを使うと、新しいユニットを受け取ってからそのユニットの解析がスタートするまで4日間が空いてもおかしくないのである。

さて、と対策を考え、いろいろ試験をやり、、となどとやっているとVer0.7のリリースはだんだん先に延びていく。いったんは3月1日にリリースしよう、と決めたのだが、例によって例のごとく2月29日にはたくさんのバグを発見してしまう。とりあえずVer0.7をリリースし、バグフィックスは0.71で、とも考えたが、発見されたバグのいくつかは、あまりにも間抜けなもので、一つは以前にも経験した「ウィンドウをあけたり閉めたりするたびに、縦の長さがだんだんのびていく」というものである。さすがにこんなものを残したままリリースするわけにはいかない。

さて、この文章を書いている翌日にはVer0.70をリリースする予定だ。Ver0.5,0.6シリーズはバグにつきまとわれていたが、今度のシリーズはいかがなものであろうか。

   次の章


注釈

自問自答する:正気にもどってよく考えた結果、この機能は「隠し機能」とした。だいたい富士山及び富士山を描いた絵を見たことがない人は「何だこれは?」と思うではないか。

とはいっても機能は残してある。この駄文を読んでくれた人だけにそっと教えるが、SETI@Supportと同じフォルダにgoroという名前のファイル(中身はなんでもよい。空でもよい)を作るとGaussian Distribution Graphで"View"というメニューが使えるようになる。本文に戻る