題名:Java Diary-6章

五郎の入り口に戻る

日付:1998/4/2

目次に戻る


二つの小さなプログラム

さて、前の章を書いたのが5月の11日。記録によれば、Site Browserと命名したページに迷い込んでしまった人はおよそ57名。(たぶん一度見れば2度と見ようと思わなかっただろうから、ヒット数=見た人の数、として間違いないだろう)そのなかで一人だけが「感動しました」と感想を聞かせてくれた。そういえば「みれませんでした」という感想を送ってきてくれた人も一人いたか。

その人の「みれませでした」というメールを見て、泡食って自分でアクセスしてみるとやはり動かない。class not foundとかいって彼はさぼったままである。私はあれやこれやの手を試みた後に、なんとSite Browserを呼び出している元のページのHTMLが変わっていることに気がついた。ちょうどこのとき使っていたホームページ作成プログラムをアップデートしたのだが、それが影響したようだ。よくよく考えてみると確かに新しいバージョンから作成されるhtmlのほうが文法的には正しいのかもしれないが、私としては大慌てである。このときはとりあえず「正しく」なったページから読み出せるようにして事なきを得た。

さて、それから3ヶ月後、私はあるコンピュータ屋の店頭で、Windowsマシンを使ってインターネットにアクセスしていた。このマシンがどういう目的でおかれているのか今ひとつ理解できなかったが、まあ隣でも使っているお兄さんがいるし、文句を言われたらやめればいいのである。そう思って、普段自宅からではMacintoshの環境でしか試験ができないので、ちょっくらWindowsでどう見えるか見てみるべ、、と思いSite Browserを立ち上げた。

さてブランクのページが表示されて、わくわく待っているとページの下に見慣れた文字がでてきて止まったままである。曰く"class not found"。。。なんてこった。確かに動いていたはずのプログラムは何もいじっていないのに再びお亡くなりになりやがった。家に帰ると私のマシンからアクセスしてみるが、やはり"class not found"がでてぴくりとも動かない。

しばし呆然とした私はまたもやあれこれを始めた。最初は「アクセス解析コードをページに仕込んだのが悪かったか」と思い、それらを取ってみたり、変更してみたり戻してみたりしたが状況は変わらない。しかしどう考えても一度動いたはずのものがさわらないのに動かなくなるってのはへんだよな、とつぶやいたところで状況は変わらないのである。頭にきてすべてのjarファイルをやめてclassファイルにすることにした。とりあえずこうやると動くことは動くのである。しかし起動にやたらと時間がかかる。

このSite Browserは「五郎の部」というページから直接リンクされている。そこにはJavaで書いた「バグの山だけど、使ってみようという人が私は大好きです」と書いたバナーがあって、そこをクリックするとこのページに飛んでくるようになっている。私はそこに表示される文句に次の言葉を付け加えた。「たちあがりに時間がかかるけど/許してね」

さてそれからというものSite Browserをさわった人間が本当に起動し終わるまで待ったかどうかは簡単にわかるようになった。Site Browserのページにアクセスしてそこから1分以内に別のページに移動していればその人はプログラムが立ち上がるまで待っていなかったわけだ。実際なんだかわからないプログラムが延々とロードされるのをおとなしく待っているような寛容な人は世の中そう多くあるまい。

 

さて話はちょっと戻る。私は1998年の6月15日からこのホームページのあちこちにアクセス解析のコードをつけはじめた。それまでは表紙のカウンタが日に多くて二つ、たいていの場合は一つ動いて行く(動いて行けば幸運で動かない日も多いのだが)のを根気よく眺めていた。しかしそのうち「いったいみんなどこを読んでいるのだろう」と不思議に思いだしたのである。

世の中同じ事を考える人は結構いるようで、広告のついたバナーを表示することを条件に無料でアクセス解析をやってくれるサイトをみつけた。そこにさっそく申し込んで、アクセス解析を始めたのである。

さてこのサイトではいろいろな集計データを見せてくれる。曰く、ページごとのヒット数。曰くブラウザ別ヒット数などである。そのページごとのヒット数が気に入った私は「大坪家の書庫ランキング」なる感じでヒット数のランキングをホームページに乗せることにした。

最初はアクセス解析のサイトが提供してくれる「ページごとヒット数」をそのままちょこちょこ書き直して載せていた。しかしそのうちある問題に気がついた。このサイトが記録していてくれるのは過去1月のデータだけである。(あたりまえだ)最初はその月のヒット数ランキングしか載せていなかったからこれでもいいのだが、そのうち「通算ランキング」をとりたくなった。しかしそれはこのサイトがやってくれる解析の能力を超えることになる。

もう一つの問題というのは、サイト解析の結果出力されるデータを、htmlの一覧表に書き直すのが結構面倒だ、という事実だ。私は当時失業中だったから時間はたっぷりとあるのだが、なにぶん無精だから面倒なことはしたくない。

7月の終わりにいたって私は決心した。このサイトからは集計値とともに、「アクセス詳細データ」ということで、加工前のデータも参照することができる。こちらのデータをもってきて、自分で集計プログラムを書こう、と考えたのである。さて決心したはいいが今私にとって使えるプログラミングの環境は一つしかない。Javaである。今度作るのはローカルで動くアプリケーションだから、アプレットを作っていたときに悩まされた、やれ「ローカルハードディスクにアクセスできない」とかなんとかいう問題には悩まされずにすむ。そう思った私はさっそくしょこしょこと書き始めた。

最初は「結構面倒かも」と思ったプログラムはあっというまに書き上がった。こういうプログラムを作っていると今更ながらJavaには結構なクラスが用意されている事に気がつく。たとえばこのデータの中には、アクセスしてきた人が使っているIPアドレスも表示される。さてIPアドレスはどうやって保存したもんか、と思っているとちゃんとそれに適したクラスが存在している。実際前々から痛感していることだが、何かしたい、と思ったらまず参考書を参照してみる、というのはJavaの場合特に当てはまることのようだ。多くの場合その仕事をこなしてくれるクラスがぞ存在するからである。

何度かテストを繰り返して動くようになると、彼は加工前のアクセスデータを読み込んで、htmlの表形式にして吐き出してくれる。これでアクセス解析結果をホームページに載せるのは異様に楽になった。もっとも自分だけが使うプログラムであるからエラー処理などは何もやっていない。ちょっとでも元にしているデータが違うと彼はたちまち"exception occured"とかいって止まってくれる。まあしかし原因はすぐ分かるしまあいいか。と思いながらそのまま使っている。

さて時は流れて10月。私は再び働くことになった。ここで私がどういう目にあったかはほかのページにさんざん書いているからここでは繰り返さない。年が明けて3月。私は仕事がなくて大変暇な状態にあった。仕事はほとんどないからとっとと帰りたいのであるが、派遣社員として雇われている手前、あまり勝手なこともできない。幸いなことにコンピュータ関連の書籍はそこらへんにたくさんあるから、それを「勉強」と称して読み散らかしてはなんとか時間をつぶしていた。前にも経験したことがあるがこういう窓際生活、というのは結構つらいものだ。理由はしらないがどっと疲れる。

さて仕事の方で何度か「暗号化、電子透かし」なるキーワードが聞こえたことがあった。今をさること数年前に一度ひょんなんことで暗号にかかわったことがある。(たった一週間だったが)そして例によって例のごとくそのとき何を勉強したかはきれいさっぱり忘れている。しょうがないな、と思ってそこらへんにある暗号の本を読み出した。

するとこれが大変面白いのである。この本はPGPというフリーの暗号化プログラムに関する本だが、暗号の歴史についても書かれていておもしろいったらない。さてそこにでている暗号化のアルゴリズム、あるいは電子署名の方法などを理解するために私はちらっとMicrosoft wordを立ち上げてメモを取り始めた。そのうちふとしたことに気がついた。私は当時派遣社員として働いていたが、この派遣元から「自己啓発に励みなさい」というお達しを受けていたのである。そして妙な本をあてがわれて「これを読んでマニュアルを書くこと」という命令を受けていたが、その本は人のやる気をすいとるようなひどい訳文で書かれていた。私は何度も「原書を読んだ方がいいかもしれん」と思ったほどだ。

さて本来あてがわれた本はつまらないのだが、こちらの本は大変面白い。暗号化だって大変重要な分野だからこちらの本の要約本を書いたってそんなに文句は言われないだろう。おまけにちょこちょこっと書き足してホームページに載せるっていう手だってあるじゃないか。

そう考えるととまらない。とにかく私は暇だから時間はやたらとある。おまけにWordで何か書いていれば誰も「あの野郎遊んでやがる」とは思わないだろう。私は自分なりにまとめなおした「暗号について」という文章の執筆に没頭しだしたのである。

さていざ文章を書き出すとあちこちに脱線を始めたのである。まずいざとなれば会社に提出できるように、とい目的があったのだが、私の悪い癖でやたらと関係ない話を書いてみたり、妙な事を書き足したりするので、あまり会社向けの文章ではなくなってしまった。おまけにその本は基本的に暗号化と電子署名について書かれたものだったのだが、関連する情報をインターネットであさっているうちに「電子透かし」なる技術も面白そうだ、と思い始めたのである。

さて暗号については「初歩の暗号」なる例がその本にも載っているし、インターネット上にも結構たくさんある。ところがこの電子透かしについては具体例があまり見つからない。新しい技術にふれるときは、簡単な具体例にあたってみるのが一番手っ取り早いことだと私は思っている。そう思ってなんとか電子透かしの簡単な例を載せたい、と思ったのだがどうしても見つからない。

ここでさらに暇を持て余した私は妙な事に思いついた。自分でつくってみればいいじゃないか、というやつである。当時仕事で画像のフォーマットにちょっと関わってTIFFというフォーマットの内部については結構知る機会があった。圧縮なしのTIFFというのがあり、これは(ヘッダー部分を除けば)画面のドットごとのデータが行儀よくならんでいるようだ。であれば、なんとか自分でいじることもできそうではないか。

 

そう思ってまず私は会社の機械にインストールしてあるFree BSDの上のC++でプログラムを書き始めた。(この前から暇に悩んでいた私はFree BSDのインストールなど、とにかくちょっとは関連のある暇つぶしに余念がなかったのである)するとC++のプログラムの書き方を見事に忘れていることに気がついた。基本的な仕組みは覚えているのだが「えーっと画面に文字を表示するのってどうやるんだっけ。。Cと同じprintfのほかにもなんだか便利な方法があったはずだけど」ってな調子である。これが数年前には課のなかで「C++の使い方講座」を開いていた人間のやることだろうか。

これが世間一般同じ事なのかどうか知らないが、とにかく私はどんな言語でもしばらく使っていないと書き方を忘れる。Cの構造体とtypedefの使い方なんてのは、何度覚えたが知らないが、未だにマニュアルを隣においてでなくては書くことができない。そのうち化石と化した記憶を掘り起こし、、なんとかよちよち書いている私のやる気をうち砕くような事が起こった。

話は簡単で、2重になっているループ文を書いて動かしていたのである。どうも動きがおかしいなと思って、ループ文を制御しているiだのjだのの値をプリントしてみれば(デバッガが使えないのだからしょうがない)途中からとんでもない値になっている。CとかC++を使っている限りのがれることのできない「変数の範囲を逸脱しての、とんでもない部分の書き換え」が起こっているようだ。

その日はもう疲れていたからそのプログラムをほっぽりだして私は帰宅することにした。そして頭に浮かんだことは「ああ。Javaならばこうして勝手にほかの変数を書き換える前に何か言ってくれるものを」という考えであった。私は無精なプログラム書きであるから、きっちりとそうしたチェックを行うなんてことはやらなくちゃいけない、とは思っているのだがとかく抜けがちになる。しかしその場合にも関係ない変数を黙って書き換えていくよりも、多少実行速度が遅くてもはっきりと"exception occured"とか言って止まってくれたほうが私としてはありがたい。

家でMacintoshに向かうと私はしばらく考えた。本来電子透かしを自分でやってみる、なんてのは会社での暇な時間をつぶすための方策だったはずだ。そう考えれば家で自分のMacintoshでやってみる、なんてのは本来の方針からずれている。しかしFree BSDで動くJavaを見つけるなんてのは結構面倒だ。そう思ってしばらくぶりにVisual Cafeを立ち上げてちょこちょこ始めるとこれがまた止まらない。翌日は土曜日だったのだが雨がふっていたし、結構さむかったのでほとんどの時間「お手製簡易電子透かし」プログラムを書いてすごした。

ここで繰り返しになるが、またもや「ああ。クラスが充実している、ということはなんとありがたいことか」と実感したのである。たとえば特定のビットを操作しようとする、と思って本をぱらぱらとめくってみると関連のあるクラスが一つや二つ必ず見つかるのである。やれありがたや。これをC++で書いていればマニュアルをどっかっからひっぱりだして、それでもたりずにインターネット上の情報をあさって、あげくのはてにはまた「変数の書き換え」に悩み、とやっていたころだ。

さてそうして書いたプログラムは見事にできあがった。ここで「見事」というのはとにかく動いた、ということである。自分だけがしかもたぶんこの2−3日しか使わないプログラムだから、適当に作ればいいのだが、「拡張性を考慮しろ」とか「汎用性を考えること」なんてのは私の頭の中に脅迫観念としてしみついている。そのわりにはエラー処理が全く抜けていたりするのだが、とにかく動くことに変わりはない。さっそく電子すかしの例をいくつか作って文章の中に載せた。そしてその直後にこのプログラムは長い眠りにつくことになった。

こうして使っているとJavaは実によくできた言語だ。おまけに動作環境が保証される、という条件下においてプラットフォームが変わっても(あまり)プログラムを変更する必要がないのだ。WindowsのAPIを覚え、Motifを覚え、あげくのはてにはMacintoshのAPIを覚え、とやらなくていいってのは実に精神衛生上よろしい。

さて世間では1年前からJDK1.2として宣伝されていたものが、Java2としてリリースされた。それと同じ時期にMacintosh上のMRJ(Macintosh Runtime for Java)もようやく2.1になった。数字はこちらのほうが上だが、中身はJDK1.1.6である。ユーザーインタフェース部分のSwingは装備しているらしいが、いずれにしても最新バージョンはいつリリースされるかめども立たない。(まだベータにもなっていないのだ)私が愛用しているVisual CafeもMacintosh版はアップデートされないようだし、とはいってもWIndows使うのはやだしな。。まあしばらくは個人でしかプログラムを書かないから適当にやればいいか。

 この日プログラムを書きながら、結構自分がごきげんであることに気がついた。考えてみればこうしたちょっとしたプログラミングというのは、私にとって、模型づくりか、絵を描くようなものなのかもしれない。だいたい作りたい終点の様子は頭に描いている。それに向かってこつこつとコードを書いていく。うまくできあがることもあるし、失敗作になることもある。私は図画工作が2の男だったから、模型や絵ではろくでもないものができあがることが多かった。プログラムもきっとろくなものではないのだが、それでもどうせ素人がやることだからかまうもんか。となるときっと50になっても私はJavaのVer5あたりを使ってごそごそやっているかもしれない。他人からみてどう見えるかしらないが、本人にとって趣味が何かある、ということは結構ありがたいことだ。

次の章


注釈

暗号の本:「PGP-暗号メールと電子署名」(参考文献参照)という本。本文に戻る

暗号について:この文章はホームページに載っている。「暗号について」参照のこと。ここで作った「自家製お手軽電子透かし」は最後の章に載っている。本文に戻る