題名:Java Diary-2章

五郎の入り口に戻る

日付:1998/1/29

目次に戻る


Powerbook2400+jDK1.0.2:

さて1997年の12月6日。私は這々の体でデトロイトから逃げ出し、日本の土を踏むことができた。職を失ったがとにかくあのいまいましいデトロイトから逃げ出すことができたのである。

一週間はそれこそ何もできなかった。ただひたすらぼんやりとすごしたのである。本来ならば仕事を探さなければならないのだが、それもおっくうだ。

うらうらと日をすごしていある間に私はコンピュータを買い換えた。今度はPowerbookの2400である。

さて2400に買い換えてから、ふとホームページを作ってみたい、という願望が頭をもたげ始めた。なぜだろう?一つには1997年の12月からniftyserveがインターネット関係のサポートを強化しだした一環として、メンバーは誰でもホームページをもてるようになったことがあげられる。それまでは自前のホームページを持とうと思えば、Nifty以外のプロバイダに加入する必要があったのだが、生まれつき無精な私は、そうまでしてホームページを持ちたい、などとは夢にも考えなかったのだ。

とはいっても、それより以前に自分のホームページを持ってみようかな、と考えたことは何度かあった。あちこちのサイトを巡っているうちに「アドベンチャーゲーム兼自己紹介」など良いかもしれない、と考えたのである。もっともこの構想を人に話したら「そういう懲りすぎたページはよくない」と言われて、あっさりその考えをひっこめたが。

またあちこちで退職理由を聞かれて同じフレーズを繰り返すのに飽き飽きして、「このページのここに書いてあるから読んでください。質問があったらどーぞ」と言ってみたいものだ。。。とも考えたりした。

OK。ホームページをNiftyで作ることにしよう。ところで、何を載せるのだろう?私は駄文を書くのが好きで、私が書いていた合コンドキュメンタリーは仲間内では結構評判がよかった。これなんか載せるといいかもしれいない。ほかの駄文も載せたいな。。などと考えているうちに、できるだけJAVAで駄文をブラウズするような仕組みができないか?と考え始めた。このページについてにも書いたが、私の駄文にはいくつかのキーワードが繰り返し現れる(はず)であった。そのキーワードとかあるいは作成日付を基に、支離滅裂な駄文をなんとかナビゲートするような仕組みができないか?

これは興味ある課題のように思われた。1984年のころから「ユーザーインタフェースの良いデータベース」があればいいな、と思っていた私にとっては昔年の構想を実現するチャンスかもしれない。。。

もう一つ私の背中を後押しするような偶然があった。以前購入したSymantecC++のVisualCafe(Javaの統合開発環境)へのアップグレードの案内があったのである。渡りに船とはまさにこのこと。12月24日に郵便局に行ってあっさりとアップグレードの申し込みをしたのである。

申し込みはしたが、すぐにソフトウェアが届くわけでもない。しばらくはJDKで、、と思っていたら非常にもっともな問題につきあたった。あやふやなコンセプトはあるが、具体的に何を作ればいいのだろう?まだホームページ制作は始まったばかりで、正直言ってどのような文章がどのように並ぶかわかっていない。どのようなデータがはいるかわからなければそれをナビゲートするようなシステムなどできるわけがない。

おまけにちょこちょこページを作り始めると、HTMLの枠内で大抵のことができることがわかってしまった。というわけで駄文をJavaでナビゲートするのは一時おあづけとなったのである。

しかしまずちゃんとAppletを埋め込んで、実行できるかテストしたい。。というわけで私のホームページの最初のバージョンには、アメリカにいるときに最後に作ったDigital Clockがついていたのである。(もっとも役に立たない割に最初の読み込み時間を長くするのでとってしまったが)


さてページを作っていて、ある日「そういえばリンク集もいるよな」と思い始めた。1998年の1月である。さてここで何がきっかけか知らないが、私の頭の中に「とりあえずリンク集をJAVAで作ってみよう」という考えがうかんだのである。

たいていのホームページのリンク集はだらだらと長くなってしまう。索引とフレームを使えば多少は短くなるが、一つのカテゴリーにはいるリンク先が増えてくれば頻繁にスクロールが必要になるのはさけられない。

私がC++でシミュレーションプログラムを作っていた頃には主にMotifを使ったユーザーインタフェース部分を担当していた。あのときと同じ要領でなんとかできるような気がする。とりあえずリンク集だからそんなに凝った作りにしなくてもよかろう。練習問題としてはちょうど良い。。。

 

それからどんな画面配置にしようか考えた。こうやってあれやこれや考えているときが一番楽しい。いろいろ考えたが、だいたいオプションメニュー、リスト、テキストエリアにボタンで間に合いそうである。こうやってだいたいの配置と機能は決まった。さて問題は中身だ。それからひたすら本を片手にまず本当にできるか、と調査を始めた。なんとなく頭に構想は浮かんでいるがいくつかの関門をクリアしないとせっかくとりかかっても、実現にはいたらず、悲しい思いをしてしまうことになる。

まずリンク集が本当にJavaでできるか?というのを確かめるために、指定したurlにジャンプする機能があるか・と調べた。これは問題ないようである。また関連したページをめくっていったら、さすがにWeb関連で発達してきた言語だけあってインターネット関連の機能は大変強力であることがわかった。

次に悩んだのが、データをどこに持たせるかである。一番簡単で確実なのはコードの中にリンク先のデータを書いてしまうことだが、それはあまりにも問題が多い。HTMLの呼び出し側にパラメータとして渡すことも考えたが、パラメータの数が膨大になればとても管理はできまい。

となると最後の選択肢、サーバー側にあるファイルを読み込むしか手がない。JavaのSecurityの制限によりローカルシステムのファイルの入出力は禁止されているが、本をめくってみるとサーバー上のファイルを読む機能はあるようである。サンプルプログラムをみるとこれが異常に簡単だ。世の中のプログラマを大別するとここで2種類にわけることができる。

タイプ1:わーい。こんなに、面倒をみてくれるんだ。いいな。

タイプ2:システム側でこんなにできあがったメソッドを作られちゃ、細かいところの制御ができない。(とぶつぶつ文句を言う)

さらにタイプ2は3種類に分けることができる。

タイプ2-1:一応文句を言いながらも、時と場合によって、よくできたシステムできあいの関数を使い、細かいところが制御したければ自分で関数を作る。

タイプ2-2:一応文句を言いながら、結局自分で細かいところを制御するプログラムを書こうとするが、うまく動かず。。。結局システムできあいの関数だけを使う。

タイプ2-3:何にも目をくれず、ひたすら自分で細かいプログラムを書く。結局できることはシステムで用意された関数以上ではなく、保守性ははるかに劣る。

私の観察によればタイプ1が30%、タイプ2-2が60%、タイプ2-3が10%存在している気がする。それじゃタイプ2-1がいないじゃないかって?事実を尊重するのが私の主義である

さて大分話がそれてしまった。とにかく機能的にサーバー上のファイル読み込みは可能なのだが、それが実際に可能かどうかは別問題である。しかしこればかりは実際にプログラムを作って試験しないことにはわからない。

さて最後でかつ最大の問題だ。私は今までプログラムを書くときは必ず日本語表示の問題を避けて通ってきた。しかし今度ばかりはさけるわけにはいかない。ホームページは人に読んでもらうべき物であり、英語なんかで書いて誰が読んでくれると言うのだろう。(日本語で書いたからと言って誰かが読んでくれると決まったわけではないが)

ものの本を読んでみると、NetscapeNavigatorでは日本語の取り扱いにいろいろと問題があるように書いてある。しかしInternetExplorerならばちゃんと日本語の表示ができるようだ。ふむ。表示ができるというのであればまあいいことにしよう。なんとなく前途に暗雲を感じるがとりあえず前進だ。

なんだかわからないが、Javaは内部的にUnicodeを使用していて、char型であっても2バイトだそうだ。さてここで例によって私は細かいことは避けられなくなるまでふれないのである。なんだかわからないがunicodeは世界中の文字を表示できるそうだから日本語もなんとかなるだろう。

さて。。。というわけでしょこしょことプログラムを書いてはJDKのjavacでコンパイルしてApplet Viewerで確認する作業を続けることになったのだが。。。(ちなみにプログラムの名前はLink Browesrとした。おもしろくもなんともない名前である)


どんな環境であってもとりあえず画面が動くとなんとなくプログラムができてしまったような気になる物である。というわけでAWTを使用してとりあえず画面を作るところから始めた。

どんな環境でも(またもやこの表現だ)最初は大変だ。いったん動くプログラムができてしまえば感じがわかるが、最初は一つ一つ手探りで作っていくことになる。AWTはMotifよりも大分作りやすいことはわかった。特にMotifのオプションメニューの面倒さ加減からすれば、AWTのはとても楽だ。

問題は全体の配置であった。なんだかレイアウトというものを使用して、そのうえにオブジェクトを配置していくと配置してくれるようである。最初にBorderLayoutを使って配置ができるかな、と思ったがなんとなく無理そうだ。(しかしこういうレイアウトがわざわざ用意していあるのだからきっとこの配置で間に合うアプリケーションは多い違いない。)しょうがないから一番自由度が大きく、かつ面倒だというGridBagLayoutを使用することにした。

サンプルプログラムをみてみると、いくつかのパラメータをGridBagConstraintsというのに指定していくようである。どことなくMotifuのargsに似ているが、こちらのほうが一つのオブジェクトになっているだけ,XmSetArg(.....);n++;などというどことなく野蛮な行を書かなくてすむだけいいような気がする。しかしここからの道は例によって長かった。

サンプルプログラムはなんとなくわかるがなんとなくわからないようにできている。確かにこの通り打ち込めばその通り表示されるのかもしれないが、応用するには少し無理がある。どうもいまだにweightx,weightyとfillフィールドの関係が今ひとつよくわからない。従って3-4時間ばかり以下のサイクルを繰り返していたのである。

1)しょこしょこプログラムをエディタを使って記述する。

2)javacでコンパイルする。(前述したとおりとても長い時間がかかる。もっともDuo280にくらべて2400は数倍早いので楽にはなったが)

3)Applet Viewerでもって表示をする。意図したとおりに表示されずに、また本を読んだり、別のフィールドを変更したりする。

4)goto 1) or 2)

はっきり言って苦痛である。考えてみればMotifの時も結構苦労したな、、、えーい最初はいつもこういうもんだ。と自分に言い聞かせながら、なんとか意図したような画面ができあがった。

さて。そこでそれまで結果確認用に使っていたApplet ViewerをNetscape Navigatorに切り替えようとした。。。なんといっても最終的にはブラウザ上に表示されるのであるから。

その結果はとてもうれしくないものだった。指定されたURLにジャンプするボタンの角のRが大きすぎるのはまあいいとしよう(画面はとても間抜けに見えるけども)問題はオプションメニューだった。

今回作った画面は一番上に左右にわたってオプションメニューがつけてある。私は右から左までちゃんとオプションメニューが表示されるようにずいぶん苦労したのである。ところがAppletViewerではちゃんと表示されていたオプションメニューがNavigatorで表示されたとたんに左端によった小さい物になってしまったのである。

しばらくの間私は唖然とした。この半日にわたる苦労はなんだったんだ。。。そして直ちに布団をかぶって寝ることにしたのである。どっちにしたって今日はもう何もする気がおきない。行き詰まった時には仕事を止めて休む、というのが鉄則だ。

 

さて翌朝目が覚めてみたが、別によい解決方法が浮かぶわけでもない。うん。そうだ。Navigatorユーザにはごめんなさいの表示をしておこう。いいんだ。どうせ私はアマチュアだし。これで金をもらってるわけでもないし。。

というわけでこの日は主にデータの読み込みの部分を作ることにした。昔作ったMotifのプログラムと同じようなことをしていても、StringやVecotrが標準で実装されているので、とても楽である。読み込むファイルであるが、ずーっとリンク集はjavaの画面だけで提供するつもりだったので、とにかく読み込みやすい形式とした。ファイルの区切り記号には”!”や”!!”を使う。これもオブジェクト指向言語であれば当然だ。

さてInputStreamシリーズの助けもあって、データ読み込み部分は結構簡単にできた。さてここでここまで避けてきた日本語表示のテストをしてみよう。試験用データファイルに日本語を書き込んでテストすることにした。

さてどきどきしながらAppletViewerであけてみると。。やっぱり文字化けしている。うーん。そんなに簡単にはいかないか。画面を見てみるとなんとなくフォントが英文字フォントになっているようである。ここで私はあっさり楽観的な憶測にしがみついた。きっとAppletViewerが日本語のフォントに対応していないに違いない。ほかのブラウザで試験をしてみれば。。

そこではたと気がついた。今朝Netscape Navigatorを見捨てたばかりではないか。きっとMacintoshユーザには多いと思うのだが、私もNavigatorとExplorerがならんでいれば、MicrosoftのExplorerはとらない主義である。そうした考えから今までブラウザは、MacOS付属のCyberdogとNavigatorを使用していたのである。(本当のことを言えばExplorerのほうがNavigatorよりも機能が多くて使いやすそうだ、ということはうすうす気がついていたのであるが、その事実にも目を背けてきたのである)

しかしこうなってしまってはしょうがない。テストするブラウザとしてはExplorerしかないのである。幸か不幸かMacOSに付属していたので早速インストールした。。ところが今度は画面が一切表示されない。

うげげげげ、と思って初期設定のところをみてみれば、なんとJAVA VMのところのオプションメニューがすべて灰色になっている。何を間違えたかしらないが、JAVAのVirtual Machineがインストールされていないのである。

えーいしょうがない。と思ってこれまたMacOS8に付属のMRJ(Mac OS Runtime for JAVA)1.5をインストールした。再度Explorerを立ち上げてみると、今度は先ほどのオプションメニューのうちApple MRJがちゃんと選択できるようになっている。再びどきどきしながらExplorerでもって作ったアプレットを開いてみた。一応読み込んだ日本語をSystem.out.println関数でJavaメッセージとして出力するようにしていたので、立ち上がった後にJavaメッセージを表示させてみると。。。

なんとちゃんと日本語で読み込んだデータが表示されているではないか。Hey!すごいぞ。unicodeの神様に感謝である。こうなればあとはコールバック関数を作って、ちょこちょことデバッグをすれば完成だ。プログラムを書き始めてからここまで約一日半。なかなかのペースではないか。

さてちょっと気に入らないところをなおして、いつもの通り、コンパイル。。。とソースファイルをjavacの上にドラッグドロップした。

いつもならばjavacが立ち上がって、わらわら何かを表示しながらErrorだのCompile成功だの言うのだが、そうはならなかった。

「Java--SetDItemTextが見つからないのでアプリケーション"Java Compiler"を開くことができません。」とメッセージがでてjavacが立ち上がらないのである。

ちょうどお昼時だったので、とりえあえずコンピュータを再起動して、お昼ゴハンを食べに行った。そう。見なかった振りをしてリセットキーを押せば、きっと何もなかったかのように動いてくれるに違いない。

さて昼食から帰ってくると。。。やっぱり動かないのである。

ここからまた数時間にわたる苦闘が始まった。何がいけないのだ?まずやったのはJDKを再度ダウンロードしてインストールすることである。正直言って日本でこれをやると電話代、接続料金に極めて好ましくない影響を与えるがやむ終えない。ところが再インストールをしてもさっきのメッセージがでてきて動かないのである。

次にはきっとExplorerでJavaを動かすためにMRJをインストールしたのがいけなかったに違いない。一生懸命ReadMeを読んで、MRJがインストールするファイルをすべてはずしてみたが、やはり動かない。あれをやり、これをやり。。一晩あけてまたやってみたががんとして彼は動いてくれないのである。しょうがないから(あまり勧められたことではないけれど)プログラムの動作確認はほったらかしにして、本を片手に必要な関数はすべて定義した。(このときにコールバック関数が妙な形になっていることに気がついたが、これは後述する。)さて準備は全部できたのになぜかコンパイルができないためにとん挫したのである。これほどフラストレーションがたまることはない。

いろいろやって疲れ切った頭に一縷の望みが浮かんだ。去年のうちに申し込んだVisual Cafe for Javaが届けば。。。いろいろな雑誌に載っているレビューをみてみるとそこそこ使えそうである。おまけにMRJ Ver2.0やNetscape Communicatorやらも一緒にCD-ROMにはいってくるようである。きっとこれが来れば問題は解決だ(となるはずはないのだが、当時はそう思ってしまうような状態だったのである)

その間もいつ来るかわからないプログラムを待つよりは、といろいろもがいてみた。最後にはMacintosh上で稼働するIBM-PCのエミュレータ、Virtual PCの上でWindows用のJDKを使ってコンパイルすることまで考えた。バイトコードは機種を選ばず稼働するというのだから、別にコンパイルだけPC上でやたっていいじゃないか。ところがなんとかコンパイラを動かすことはできたのだが、この遅さは筆舌に尽くしがたいものだった。一回コンパイルして山のようなエラーをだしただけでやめてしまった。

このときになって、アメリカで捨ててしまったCD-ROMについて、私はへそをかむような思いの後悔をすることになるのである。今や私はPowerpcのMacintsohのユーザーである。確かにそれは30日のlimitedVersionだったかもしれないが、この状況で30日コンパイラが使えれば、それは私にとってどれほどありがたいことであろうか。。。しかしそのCD-Romはカリフォルニアのどこかのゴミ捨て場に埋もれているか、あるいは煙となって空に登っていってしまっている。

そうしてしばらくはJavaのことを忘れてホームページの内容のほうに注力することになったのである。しかし「あとコンパイルさえできれば。。」というフラストレーションは耐え難いものがある。ソフトのパッケージを売っているところに行って、Javaの開発環境が売っているのをみると、思わず買ってしまおうかとふらふらする。。そんなことをしなかったのは幸いだったが。

 

次の章へ


注釈

ユーザーインタフェースの良いデータベース:トピックス一覧へ)この場合「データ」とは私が書いた駄文であり、「良いユーザインタフェース」とは私が夢想していたJavaを使ったナビゲーション画面のことである。本文に戻る

 

アップグレードの案内:ちなみに同じ時にAtok11の案内も来ていた。こちらも同じ日にアップグレードを申し込んだ。本文に戻る

 

最後に作った:実は作ったというのはうそで、「打ち込んだ」と言った方がいいかもしれない。前述の21daysにのっていたThread関係の実習プログラムである。もともとは常に画面上に表示して時計代わりにしようとしたのだが、なぜかときどきおかしな時間を表示しだすので、結局使用しなかった。本文に戻る

 

そういえばリンク集もいるよな:元は駄文を整理しようと作り始めたホームページなのでリンク集を作る予定がなかった。なぜ作り始めたのか自分では覚えていない。本文に戻る

 

本を片手に:Javaプログラミング1001Tipsという本で、非常に役に立つ。(参考文献参照) 本文に戻る

 

事実を尊重するのが私の主義である:トピックス一覧の「実事求是」参照のこと。本文に戻る

 

行き詰まった時には仕事を止めて休む:(トピック一覧参照)もっとも休んで解決しない問題も多々あるのだが、プログラミングに関してはこの法則は正しいことが多いようだ、というか少なくともこの信念を利用するととっとと帰る自分へのいいわけにはなるのである。本文に戻る

 

”!”や”!!”:Smalltalkの伝統である。とはいっても!!があったかどうか忘れてしまった。最初に読んだSmalltalkのリストはやたら!が並んでいて、さっぱりわからなかった覚えがある。本文に戻る

 

unicodeの神様:トピック一覧へ)これはいったい何の神様だ?とまじめに考えないように。日本には古来から八百万の神がいるのである。当然廃止されてしまう神様もいれば、新しく創設された神様もいるはずだ。本文に戻る

 

コンパイラを動かすことはできた:これは実に大変だった。まずVirtualPCとMacintoshの間で共通のハードドライブを設定することができるのだが、ここを通すためにはなんとDOSの「8文字+3文字」の名称にしなくてはならないのである。おまけに時々〜なんてのがファイル名称に含まれているが、これはファイル名称が長い物を短縮した物だとかなんだとか。。。

おまけにJDKのインストールにしてもやれパスを通すだ、やれAUTOEXEC.BATを編集するだ、PATHを追加しろだ、環境変数HOMEを変更しろだとややこしいことこの上ない。Macintoshだったらインストールプログラムを動かし、あとはドラッグドロップで一発だ。今後仕事ではWindowsを使わざるを得ない局面も多いだろうが、privateではしばらくは絶対Windowなんか使うもんか、と堅く心に誓ったのは言うまでもない。本文に戻る