題名:Java Diary-12章

五郎の入り口に戻る

日付:1999/8/30

目次に戻る


SETI@Support-part6(Ver0.4)

さて、しばらくの間私はご機嫌だった。このデータのファイル書き出し機能は、かなり早期からつけようつけようと思っていて「まあいいや」と思ってさぼっていたものである。確かに最初解析したデータが少なかった頃はあまり意味はなかっただろうが、最近ワークユニット数は50を越えようとしている。こうなると一覧でずらっと並べてみたり、あるいは並べ替えをしたりいろいろしたくなってくる。解析時間はどれくらい差があるものであろうか。PowerとかGaussianのScoreはどれくらいであろうか。。

さて、出力形式はTab区切りとカンマ区切り(CVS)が選べるようになっている。普通はCSVだけのようだ。何故私がTab 区切りをつけたかにはちゃんとわけがある。私がMacintosh上で愛用している表計算(もできる)プログラムはClaris WorksのVer4だ。そしてあろうことかあるいまいことか私はまだこのプログラムをつかってカンマ区切りのデータをちゃんと読み込むことができないでいる。ところがTAB区切りなら読めるのである。自分が作ったプログラムはなんといっても自分が使えることが第一に重要だ。

さて、こうしてご機嫌だった私だが、そのうちにいろいろな「雑念」が頭に浮かびだしてきた。これは大きく分けると二つに分類される。まず高尚なほうから述べよう。

 

今回このファイル出力機能を付けたのは「データを一覧で見たり、並べ替えたりしたい人は、それ用の機能をたくさんもっている表計算ソフトでご自由に」と開き直ったからでもある。実際こうした一覧表示というのは自分で作ろうと思うと何かと大変だ。それに何事によらずプロの仕事は尊重しなければならない。私のような日曜プログラマが逆立ちしたって彼らをだしぬくことはできないのだ。

しかしここでちょっと考えてみよう。このSETI@homeのクライアントを動かしている人は、最初にberkeleyのサイトにアクセスして登録をしたはずだから、まあInternetに接続できる環境とブラウザは持っている、と仮定してもそう傲慢、というそしりは受けないであろう。しかし表計算ソフトについてはどうであろうか?「すべてのコンピュータは表計算ソフトをそなえている」と仮定してもいいものであろうか?

世の中にはすべてのコンピュータにはWordとExcelが備えられている、と信じ込んで堂々と私宛にそれらで作られた(もちろんWord, Excelでしか読み込めない)文章を送ってくる人たちが存在する。冷静に考えれば、生まれて始めてさわったコンピュータが会社のもので、まわりがみんなWord, Excelを持っていれば、そう信じ込んでも無理はない。しかし私はそうしたファイルを受け取ると反射的にかっとなり、そして冷静に考えてみる前に、怒りに満ちた返信を投げ返す。曰く、

「君はBill Gatesの回し者か?この世の中にはMicrosoftしか存在しないと思っているのか?」

しかしながらある日、私は自分で書いた「トピック一覧」を眺めていて、ふとあるフレーズに目を留めたのである。「人への批判はまず自分に向けること」というのがそれだ。わたしはちょっと考えた。ここで今自分が行ったばかりの行動を振り返ってみよう。

私は「相手はWord,Excelを持っているもの」と仮定した人間に対して、血も凍るばかりの罵声を(罵メールを)返した。しかしVer0.36では

「SETI@Supportを使い、データを一覧で見たい人はなんらかの表計算ソフト(Tab区切り、または CSV形式が読み込めるもの)を持っている」

と勝手に仮定しているではないか?私の仮定はどの程度妥当なものだろう?そしてそれは私が言うところの「Bill Gatesの回し者」とどの程度へだったているのであろう?そしてこのことについてあまり思いをはせると、他人に向けた罵メールの一言一句が自分に帰ってくる気がして大変厳しい状況になる。

 

仮にこの自己嫌悪から目をそらしたとしても、もう一つもっと現実的な問題が存在していた。私はデータを書き出しては、表計算ソフトで表にして喜んでみている。しかしそのうち自分がデータが更新されるたびに同じ操作を繰り返していることに気がつきだした。具体的に書くと以下の通りである。

1)ファイルをかき出す。

2)表計算ソフトでそれを読み込む

3)たいてい長すぎて表示できない行があるから、列の幅(複数)を適当に設定する。

4)場合によっては解析途中のデータを非表示にする。(たとえばかかった時間でソートしようと思うときには解析が終了していないデータは不要だ)

5)だいたい同じような条件でソートする。設定する条件はだいたい決まっているが、組み合わせはあれこれ変わる。

 

最初は「おお。さすがに表計算ソフト。これでいろいろなデータの見方ができるわい」とご機嫌であった。しかしそのうちあまりに同じ操作を繰り返すので面倒になってきた。そして私は相当のなまけものであるから面倒なことは大嫌いである。しかしながら今の方式-つまりSETI@Supportからテキストデータを吐き出し、そして表計算ソフトで読み込む、という方法ではこの手続きを-少なくとも私が知っている限りでは-避けることはできないのである。

 

私はそのころ0.36→0.4のバージョンアップにどんな機能を盛り込もうかとあれこれ思い描いていた。そしていきなり決めたのである。確かに市販の表計算ソフトに匹敵するような並べ替えの機能などをもたせることはできまい。しかしこのデータの見方のうち、それほど凝っていない内容であればそう難しくなくインプリメントできるのではないか?そしてそうした「SETI@home用スペシャル」表計算プログラム機能と限定すれば自分で作ってみるのも少しは意味があるかもしれない。おまけにこの「一覧表表示機能」をつければ自分で書いた「罵メール」の呪縛からも逃れられるというものである。私はこのプログラムを使ってくれる人に「えっ?表計算ソフト持っていないの?じゃあしょうがないね」と冷たく肩をすくめるようなことをしていないと(少なくとも自分には)言うことが出来るのである。

 

さてそうと決めればさっそく行動である。とはいってもいきなりコードを書いたりはしなかった。「クラスライブラリが使える時は、そちらを使え」というのは私が何度も痛い目にあいながら学んだ信条である。人間2度くらい痛い目に遭えば、3度目からは少しは用心しようと思ってみたい。私は全く仕事をしていない状態だったし(別に失業していたわけではないが。いわゆる企業内失業者というやつである)インターネットは使いたい放題の状況だったから「Javaに関する技術調査」と自分で勝手に名目をでっちあげて(本当のところそんな名目を気にする人間もいないのだが)表計算をするためのJava Class Libaryの検索にいそしんだのである。

するといくつかのクラスが見つかる。しめしめと思って調べてみると結構むつかしくできている。そして当たり前のことはいいながら自分の考えていることと比べると「帯に短したすきに長し」ということに気がつく。

そんなことをあれこれ考えていると自分がやりたいことが、普通の表計算とどこが違うかがなんとなくわかってくる。私がやりたいのは表示だけでしかもそのフォーマットは非常に限定されている。対するに表計算ソフトというのは本質的にユーザーからの入力をうけつけることが必要だからその部分で結構大変だ。となれば力点の置き方が違うのである。

つれつれといくつかのライブラリを見た後に私は決心した。自分で作ろう。たぶんそんなに大変ではかろう。

 

そう考えると私はしょこしょことプログラムを作り始めた。そしてこの作成は自分が思ったよりも時間がかかったことを認めなくてはならない。それは仕事が忙しくて時間がとれなかったためではない。時間は再びたくさんあった。問題は私がどのようなプログラム、データの構造をとるのかきちんと考えないままコードを書き出したことにある。

最初はとにかくデータをソートできてそして表示することだけを考えていた。そして考えついたのは最終的に一つの関数と一つの配列にまとまったプログラムを、3っつの配列と4っつの関数で実現することだった。たしかにこのプログラムは動いた。そしてそれは私が想像したよりも早く実現できた。しかしそれを自分で使い始めて少したち「こんな機能がどうしても必要だ」と思うたびにごっそりと構造を変える必要に迫られたのである。つまりきわめて拡張性のない、どうしようもないプログラムであったわけだ。

最初3っつあった配列は二つに減らせることがすぐにわかった。そして最終的には一つになり、プログラムが何をしていうのかもはっきりとわかるようになった。そして結果的にはプログラムの完成までには私が予想したよりも長く時間がかかったのである。かくの通り何事においても事前に計画を考えることを怠ってはいけない。もっともその真理を自分が決断をのばす言い訳に使う人が(私も含めて)多いのはこれまた事実であるが。

 

さて、もう一つこの表示プログラムで最後まで(つまりこれを書いている今でさえ)私を悩ませているのはスクロールである。

何故それがそんなに問題か?JavaにはJDK1.1からちゃんとScrollPaneなるものが準備されており、それを使えばなんでもはりつけてスクロールできることになっている。私は以前MRJでこのScrollPaneの奇妙な動作に悩まされたが、少なくともMRJ2.0からはちゃんと動いている。そして実際SETI@SupportでもSKyMapをスクロールするのに使っているのだ。

では何が問題か?今回表が画面におさまりきらなければスクロールが必要だ。しかし表示する内容は決まっていてその項目名は常に表示されていてほしい。もちろん本職の表計算プログラムにもこういう機能はそなわっているが(Excelにおいて、その指定方法は実に変であるが)私もこの機能は是非実現したいと思っている。しかしこの機能を実現するためには単にScrollPaneを使って「はいおしまい」というわけにはいかないのだ。ScrollPaneを使えば確かにスクロールはできる。しかしそれとともに項目名もどこかに消えてしまうのだ。

さて、最初私は表の画面をクリックするとその方向にスクロールするようにしようと思った。なんといっても画面が一番クリックしやすいし、今回のプログラムでは入力する必要はないから画面をスクロール用にクリックしたところで問題はない。スクロールの単位は一行、または一列単位である。列の半分スクロールしたところであまり意味はないのだ。

さて、かのように構想だけはできる。そして頭の中に存在している間は結構いけるアイディアのように思える。ところが現実に戻って表計算ソフトのスクロールバーをまじまじと見てみると、これは実によくできたシロモノであることに気がつく。まずスクロールをするのに必要なボタンは常時表示されているし、それはあまり場所もとらない。それだけならば私の「画面をクリックするとスクロール構想」とあまり変わりはないとも言えるのだが大きな違いがある。私の構想では、今見ている画面が全体のどの位置に、どれくらいの割合で存在しているか把握できないが、スクロールバーを使えばそれは一目瞭然である。つまりスクロールバーはスクロールの入力とともに、現状の表示という二つの機能を併せ持っているのだ。そしてそれはあまり場所もとらず実にコンパクトにできている。

思えばこのスクロールバーというのは簡単なように見えて実に偉大な発明だったのだと思う。Appleの2代目CEO,ジョン・スカリーの書いた本に、最初にMacintoshのスクロールバーができた時に誰もがそれを絶賛した、ということが書いてあった気がする。いつも何気なく使っている部品だが自分で作れ、と言われればたぶんどうやってもこれ以上のものはできないだろう。それが今やほとんどのGUIをもったOSが同じスクロールバーを使っている理由なのだはないだろうか。

さてそう考え、先人の知恵に感動した私は素直にそれに従うことに方針を(あっさり)変更した。そしてScrollPaneではなくScroll Barだけを部品として使ってそれを自分で制御しようと考えたのである。

そう決めると私はしょこしょことプログラムを書き始めた。結構手間はかかったがしばらくの格闘ののちになんとかコードは「動く」ようになった。確かに画面はスクロールをしてくれる。しかしその動きはどことなく妙だ。時々自分が考えたようにとびとびにスクロールが行われる。しかし時々そうでない。困ったことにどういう場合にちゃんと動きちゃんと動かないのか今ひとつわからない。

そのうち頭にきてスクロールを繰り返していると実に見慣れた、しかし奇妙な現象にぶつかった。

その現象とは「何もいわずに表が消える」というものである。これはCやC++でプログラムを書いていたときには何度も目にした物だ。そして後にはたいていの場合"segmentation fault"とか書いてあって"core dumped"と妙に冷静なメッセージが表示されている。

こうしたことが何故おこるかといえば、大抵の場合スクロールをするに従い、メモリの妙なところをアクセスするためだ。早い話がプログラムのバグなのだが、まあCやC++ではどこでもアクセスできてしまうからしょうがない。

ところがJavaではこうしたメモリの不正アクセスによるエラーというのは大変起こりにくくなっているはずなのである。少なくともException occuredとか何か言ってくれるはずなのだ。ところが今確かに彼は黙っておなくなりになった。何のメッセージもなしである。「こんなはずはない。今のは嘘だ」と思って何度か繰り返してみたが結果はいつも(だいたい)同じである。なんということだ。何があるのか今ひとつわからないが、彼(または彼女)はそう簡単に私が思った通りに動いてはくれないようだ。

それからもしばらく私はあれこれやってみた。なんといってもこのScroll Barという偉大な発明を見捨てるのがしのび得なかったからだ。しかし「突然画面消失」はその後も何度かおこった。そして私はついに見切りをつけた。当初の予定通り表をクリックすることでスクロールするようにしよう。

そう考えるとプログラムを書き換え始めた。とはいっても所詮入力部分が変わるだけだからそんなに大幅な変更ではない。しかし(例によって例のごとく)ここから「まあこれなら何とか目をつぶってもいいや」と思えるまでにプログラムがちゃんと動くようになるまでには長い時間がかかったのである。

今回行も列も条件設定やらメニュー選択で表示・非表示を切り替えられるようにしてある。それでもってスクロールは列・行ごとに行うわけだから、つねに「次の行(もしくは列)は表示されているかな」ということをチェックしていなければならない。そうでないとプログラムはスクロールしているつもりでも画面が何も変化しないなんてことが起こるからだ。

これは理屈から言えば簡単なはずなのだが、どうもうまく動いてくれない。はてしなく非表示行が続いていたらどうする、とかなんやかんやの条件を考えると話はややこしくなる。おまけに各列と行のタイトルは必ず表示するようにしているからこれについては例外扱いしなくてはならない。

そんなこんなの条件に加えて、自分でテストをかねて使い出すとあれやこれやの機能追加が必要であることに気がつく。最初はデータ名を表示すればいいやと思っていたが、そのうち各データに一連番号をふると大変都合がいいことに気がつく。それをインプリメントしてやれやれと思っていると、そのうち並べ替えの順番にかかわらず一から番号を振っていく行がどうしても必要なことに気がつく。たとえば新しく解析したデータは自分が今までに解析したデータのなかで何番に位置するのか、とかを知りたくなるからだ。やれやれ、これでいままでと別の行を常時表示にしなくちゃいけない。

また各行には簡単な条件設定ができるようにした。トップ10を表示とか、ある値が0の行は表示しないとかの設定をしたかったからである。この条件設定を考えるとまたもや「ユーザーのキーボードからの入力」という誠にやっかいなシロモノとつきあう必要がでてくる。最初よほど「キーボードからの入力は受け付けず、メニューからの選択にしてしまおう」と思ったかわからないが、それはあまりに傲慢な態度であることに気がついた。これでまた入力チェックをきびしくしないと。。

かのようにやっていくとなんやかんやとコードは複雑化し、そのうち自分でも理解ができなくなったところで「構想から考え直し」になる。となるとまた2歩後退。こんなことをしているとなにかとリリースはのびていく。

 

実はこのころリリースがのびている間に一つ面白いことがあった。

 

私が大変参考にさせていただいたプログラムにI4WUというのがある。Ver2.21にアップグレードされるときに、作者の方はメーリングリスト上で「日本語表示をふやしたバージョンも作ってみました」と慎重にみんなの意見を聞いて、そして最終的に日本語表示が多いバージョンをリリースした。私もさっそくダウンロードして使ってみたが、なるほど大変に見やすい。何のかんの言っても我々は日本語が母国語なのだ。しかし私は相変わらずSETI@Supportの表示を英語のままにしていた。このプログラムの開発当初からある目的があったからである。

今回のプロジェクトには世界中から色々な人が参加している。そして今や英語は世界共通語となっているのだ。もし将来日本以外の国の人にも使ってもらう事を考えるのであれば、英語ですべてを書いておくのが妥当というものだ。(私は日本語と英語を切り替えられるようにするほどの律儀さは持っていない)

さて、その高尚な考えはいいとして、どうやったら他の国の人にも使ってもらえるのだろう?そのためにはまず英語のダウンロードページを用意し、次にそれを何らかの方法で色々な国の人に知らしめる必要がある。しかし前者はなんとかなるとしても後者の方はどうやったらいいのか見当もつかない。日本国内だって、もしメーリングリストの存在を知らなければ、SETI@Supportをこれだけ多くの人に使ってもらえたかどうかも定かではない。他の国にもメーリングリストはあるのだろうが、はたしてそれはどうやったらアクセスできるのか?

さて、Ver0.36のリリース間際、私は本家本元のWeb Siteに"Related links"なるページが付け加えられたのに気がついた。見ればユーザーグループのWeb Siteとかはてまた色々なサポートツールが載せられている。私はなんとなく「世界中でこうしたサポートツールというのは山ほど存在しているのだろう」と思っていたがそのページを見る限りそんなにたくさん数があるわけでもなさそうだ。

さて、こうしたページがあるならば、英語のページをなんとかでっちあげて、その上でBerkeleyにメールをだせば、うまくすればリンクしてもらえるかもしれない。そう思うと私は英語のページをしょこしょと作り出した。

別の文章にも書いたが、いろいろな経緯を経て私は「いやー、英語は苦手ですから、かわりにお願いしますよー」とは言えない立場にある。しかし昔から書くのは大の苦手なのである。あれこれ考えて書くのだが、「どうしてこんな妙な文章になってしまうのだろう」という英文しかでてこない。

だから今までなんとか英文を書かなくては行けないシチュエーションというのは避けてきた。しかしこの期に及んで贅沢は言っていられない。稚拙だろうがなんだろうがとにかく書かないことにはアクセスしてもらいようもないのである。あっちこっちのページから似たような言い回しをコピーしてきたり、なんやかんだとページはできあがった。

さて、これで安心と、Berkeleyにメールをうった。それからしばらく様子を見てみたが例のページになんの変化もないようだ。考えてみればこのページにリストされているよりもはるかにたくさんのサポートツールがこの地球上には存在していて「俺のも載せろ」というメールの殺到に彼らは音を上げているかもしれない。それでなくても「メールの返事を書くのに50人くらいほしいね」とチャットで言っていたくらいにたくさんのメールが送られてくるらしいのだから、とてもいちいちつきあって居られない、というところか。

 

さて、私は次の手を考えた。米国の検索エンジンに登録するというのはどうだろう。実はそれまでに2度ほどYahoo Japanに登録申請をだしていたのだが、3週間たっても何の変化も無いところを見るときっと却下されたのであろう。「暗号について」が爆発的なヒットになっていらいというもの、調子にのってあれやこれやの文章を何度もYahoo Japanに「推薦」しているが全部没だ。あるグループの人が「うちのグループのサイトがYahooに登録されました」と書いていたが、確かにそのサイトを見ると、テキストオンリーだが内容がすばらしい。なるほど、これくらい内容を充実させねば載せてもらえないのかなと思ったりした。

さて母国である日本でこのざまであるから、あやしげな英文ででっちあげたサイトが載せてもらえる可能性はそう高くあるまい。しかしとにかくTryはしてみるべきだ、と思ってYahoo USAに「推薦」をした。入力する内容は日本のものとほとんど同じだからあまり迷うこともない。それからつれつれと米国の「検索エンジン」を検索し、目に付いたものすべてに登録をした。

 

とはいってもどの程度効果があるのかな、と思っていたある日、アクセス記録を見ていて、自分以外に一人しかアクセスしたことがなかった英語のダウンロードページに誰かがアクセスしていることに気がついた。リンク元も或程度わかるようになっているのだが、どうもAltavistaという米国の検索エンジンから飛んできたようである。あら、これは登録したかいがあったかしら、と思ったらそのうちさらに別の変わったURLからアクセスがあったことに気がついた。Yahooのスタッフというのは、たぶん彼らだけがアクセスできる「推薦されたURLの一覧表」のようなところから飛んできて、載せる載せないのチェックをしているようだ。どうもそれらしき記録が残っている。どうやら米国のYahooは律儀にチェックには来てくれたようだ。まあ、どうせ載せてはもらえないだろうが、とにかく努力はしたわけだから。

そう思って家に帰る。メールをチェックすると英文のものがまじっているのに気がついた。何だこれは?画面に流れる文字を見ているとYahooとかいう文字が見えた。なるほど。不採用の場合でも"Thank you for your submission. We checked your site, but unfortunately we came up to the decision that we can't ..."とかメールを送ってくるわけだな。とにかく私は乗せてもらえるわけがない、と決めてかかっていたのである。

そう思ってちゃんとメールを読み返してみれば登録完了の知らせである。なんということだ。国かわれば掲載・不掲載の基準も異なるのだろうか。かくのごとくすべての望みを捨てたときでなければ良いことは起こらない。

それから数日実にいろいろなIPアドレスからのアクセスがあった。IPアドレスの最後は国名だが、イタリアとか、英国とか他にはなんだか見当がつかないアドレスもある。その数自体はあまり多くはないのだがとにかくこれは結構楽しい経験である。今のところ「なんだおまえのヘボなプログラムは」とか「この英文はなんとかならねえのか」という罵メールも届いていない。Yahooからの登録完了メールには「うちのサイトに登録されたところをねらって変なメールを送り届ける奴がいて迷惑しているんだよね」とかなんとか書いてあったが、今のところそういう楽しいメールも届いていない。これでデバッグに今まで以上に気合いがはいるというもの。Ver0.4もだんだん収束しつつある。また「あわわわわ」を避けるべく試験にいそしむか。

次の章


注釈

人への批判はまず自分に向けること:(トピック一覧)実際この一覧は自分で書いた者でありながら、ときどき自分に痛烈に帰ってくる。本文に戻る 

クラスライブラリが使える時は、そちらを使え:(トピック一覧)経由他の部分を見ると、私がこの信条を忘れたばかりにどういう痛い面にあったかを見ることが出来る。本文に戻る 

別の文章:「何故英語をしゃべらざるを得なくなったか」参照のこと。ただし異常な長文。本文に戻る