Readmeじゃないよ 7

■20020208

ちょっと、いろいろ考えていて、こういうの作りたいね、というのが出てきた。最近、あんまりやってなかったXML関係。面白いかなと思っているタグのセットがいくつかあって。まぁ、他人の作ったタグセットをいじって処理をするっていうのは、なんだか仕様の変更に振り回されそうで、一方で、気の引ける部分もあるんだけど。

Java2の1.4では、XML関連のパッケージは標準になるし、Java XML Packとか、Webサービスのためのをひとまとめにしたのとか、いろいろ出てきて、それはそれで追いきれてないんだけど。1.4でXMLの処理を書いて、ノードのクラスのインスタンスを見てみたらCrimsonだった。Xercesなのかとばっかり思ってた。いずれにしても、Servletとか、XML周りとかのリファレンス実装は、本当、Jakartaに任せたって感じね。

最近、思うことなんだけど、やっぱり、そろそろJavaSoftは、パッケージのバージョン管理の仕組みを入れた方がいいんではないだろうか。XML関係のパッケージなんか特にそうなんだけど、更新が激しい上に、いたるところに違うバージョンがバンドルされてる。バンドルなんてコントロールできないし。1.4に付属のがバージョンが古くなっちゃうと、それこそ、どうしようもないし。

クラスパスに書いてるうちは、まだ問題が少ないんだけど、jre/lib/extなんかに置いちゃうと、バンドルとバージョンが衝突する可能性がある。それでTomcatが動かなかったことがあったんだよね。JavaHouseとか、Jakartaのバグトラックでも質問が出てた。珍しい現象なのか、誰からも回答なかったけど。エクステンション・メカニズム自体、目立たない話だしな。

ところで、以前に、CheckBoxListModelのダウンキャストの心配をしてた。でも、Javaってば、オーバーライドしたら、どんなにキャストしても、外部からはオーバーライドされたスーパークラスのメソッドは呼べないんだよね。基本的なところで知識が抜けてるもんだ。ダウンキャストって言葉もあんまり正確に使ってなかったしな。気をつけることにしよう。

■20020210

MorePasteの1.1。だいたい、基本的なアーキテクチャは出来きてきた。以前より良くなったか、と聞かれるとなんとも言えないんだけどね。それでも、今まで、何となくスマートじゃなくて、気持ち悪かった部分は改善された。と、これは自己満足。

MorePasteのタブは、最終的にプラグインのようにすることを狙っていて、それぞれをオブジェクトとして切り出してある。プラグイン化ってのはまだ時間がかかりそうなんだけど。で、タブごとに、いろいろ動作の違いがあって、タブの表示/非表示が変更出来るかどうか、とか、変更出来るなら初期状態はどうなっているのか、とか、[Combination]で選択できるか、とか他にも。そういうのは、今まで、abstractクラスで変数とそれを取得するメソッドを定義していて、extendsしたクラスの中で、それぞれ初期化してた。これがあんまり気持ちよくなかったんだよね。

これを機能ごとにまとめて、インタフェースにすることにした。動作の違いのチェックは、基本的にinstanceofでやる。これだと、不要なものは実装しなければいいから、気持ち悪いコードは減らすことが出来る。多重継承が出来れば、実装までしておけるから、もう少し楽になるんだろうけどね。大した量のコードじゃないから、コンポジションにしても変わらないし。

それとUIの持ち方も見直し。今まで、プラグインはタブとイコールと考えて、JPanelを継承していたんだよね。これを止めにして、JPanelはフィールドにして、所有するような形態にする。この利点は、あんまり思いつかない。どちらかというと、意味上の問題で、プラグインがJPanelを継承すること自体が変だと思った、てのが一番の理由。UIを持たないプラグインってのは、あり得るのかね。

ところで、JavaSoftのSwing Tutorialで、APIへのリンクが全部、1.4のドキュメントになってるのに気がついた。RCもリリースされたし、APIの変更はもうない、ということなのかね。JSpinnerが、MetalのL&FでもWindowsのになるのは、ちゃんと直してくれないと。

そろそろ、javadocの整備なんかも始めないとな。後でまとめてやるの面倒だし。MorePaste自体は、早めにまとまりそうだけど、ドキュメントの直しは頭の痛い所。うーん。

■20020211

引きこもりがちな今日この頃。ヤバイね。どうもずぼらで。寝食を忘れてコンピュータに向かう、ってのは相変わらず直らなくて。まぁ、直す気もないんだけどさ。で、MorePasteの1.1。プロパティの保存をやることにした、という話。

セキュリティのhotfixのせいか、プログラミングをしている環境だと、改行文字が\nになる、という現象が続いてる。\r\n(CRLF)だと、改行文字2個として扱われちゃうんだよね。それ以外は、動作上の問題はないんだけど、やっぱり気持ち悪い。現在、改行文字はSystem.getProperty( "line.separator" )で取得しているんだけど、それだけじゃなくて、改行文字を明示的に選ぶことが出来るようにUIを用意しましょ、と思ったのがことの発端。Propertiesクラスをラップして使うことにして、じゃ、保存もしちゃいましょ、と。

UIでは、MorePaste全体に共通的な、プロパティの設定ができるようにする。それ自体は、そんなに難しいことじゃなんだけど。設定の変更をしたら、他のタブにどうやって伝えるか、ってのは、ちょっと考える必要がある。結局、Observer-Observableを使うことにした。保存したり共有したりしたいプロパティを持っているタブは、Observerを実装することにする。Observableに登録するかどうかのチェックも、instaneofでやっちゃう。MorePaste自体もObserverってのは、われながら大胆でいいね。その辺りは、PropertyHandlerというクラスに一応、局所化。

Java2は、1.4からPreference APIというのが新たに追加されて、プロパティを外部で管理する方法が新しくなる。これもXMLを使っていて、JavaBeansの長期永続化と合わせて、外部に書き出す場合はXMLに統一、という。JAXPは少なくとも標準にする必要があった、ってことね。

1.3まで標準だった?、プロパティを扱うためのPropertiesクラスは、エンコーディングの関係で、いまいち使いづらかった。以前、不用意にファイルのパスをPropertiesクラスで格納したら、日本語のフォルダ名が使われていて、困ったことになった。いまいち、ダブルバイトの文字をStreamで使ったときの処理がわかってなかったんだよね。でも結局、今回もPropertiesを使っておくことにする。Preference APIになっても、出来る限り変更を少なくできるようにしたいところなんだけど、まぁ、それはおいおい考えることにしましょ。

■20020216

ついに、Java2SEの1.4が正式にリリースされました。でも、結局、JSpinnerのルック&フィールの問題は解決していなかった。あれが、MetalUIのデザインなのかね。勘違いしいるのは、こっちなのかしら。

プロパティ保存などなど。処理は動くようになって、Observer-Observableの処理もちゃんと動いて、変更を通知するようにできた。しかし、プロパティのget/setってのは面倒だね。今回の実装では、Observerがupdateメソッドで、PropertyHandlerのインスタンスと変更があったプロパティの名前を渡してくる。そのプロパティが自分に関係するものだったら、それぞれのプラグインは、PropertyHandlerのインスタンスから名前をキーにして、更新後の値を取り出すわけ。取り出して、セットする、という一連の動作が、全部、プラグイン側に載ってるのが複雑になってる原因ともいえる。JavaBeansなんて、こういうのを延々と書くのかね。うーん。

一つ、大きなバグを発見。1.1で実装しなおす時に、プラグインがJPanelを継承しないようにした。この関係で、MorePasteがディアクティベートされた場合に、ちょっと処理が増えたのを忘れてた。選択されているタブからUIのクラスを引っ張ってきたら、それをキーにして対応するプラグインを取り出すという処理。

このときに、instanceofでいろいろ条件分岐しているんだけど、それをUIのクラスに対して、行っていたものだから、全部falseになっちゃう。そりゃそうだ、UIには、インタフェースなんか、実装していないもの。条件に引っかかるはずがない。instanceofを使った処理ってのは、エンバグしやすいってのを実感したね。注意しないとな。

■20020220

20020220ってのは、妙な対象性があって、いい感じ。

それはさておき、PropertyHandlerで、以前から気にしてたこと。jarで固めて、ダブルクリックで起動すると、プロパティのファイルを読んでくれない。クラスパスには、ちゃんとカレントを入れてあるんだけどね。どうも、getResourceとかからは、見に行ってくれないみたい。JarViewでも同じようなことがあって、正規表現を使うために、Apacheのregexpライブラリを使ってるんだけど、ダブルクリックでjarから起動すると認識してくれなかった。

jarをダブルクリックしたときのクラスパスについては、あんまりよく理解していない。ちゃんと、調べておかないとな。実際に利用するときとか、配布のことを考えると、jarに固めるってのは必須で。それとコマンドラインで起動したときで、動作がどう違うのかってことね。MorePasteが一段落したら、やることにしましょ。でも、やりたいことが、なかなか尽きないんだけど。うーん。

プロパティの保存ファイルは、作る方は起動したjarと同じフォルダになるから、一応、カレントがそういう意味になってる、と理解することにする。で、getResourceAsStreamで取得したストリームがnullだったら、カレントを探すようにするようにしときましょ。とりあえず、ちゃんと動いてるから、よしとする。Documents and Settings/<ユーザ名>フォルダの扱いとか、どうなってるんだろ。Windows環境で、ホームディレクトリの概念なんか、あるんだろうか。やっぱり、知らないことって、本当、多いもんだ。

だいたい、標準と思っているプラグインは直しが終わって。パッケージの構成なんかもすっきりした。でもまだ、やりたいことは、残っているんだよね。何ヶ所かで使っているボタンで、それが押せない場合にはそれが明示的にわかるようにする、とか、引用符のプラグインで履歴リストをクリアした場合に元に戻せるようにする、とか。で、そうすれば、あとはパスのペーストで、次に新しいプラグインがいくつか。まだ先、長い。

明後日は、やっとADSL開通。NTTの局舎からは、ちょい距離があるんだけど、リンクアップしてくれるかどうか。

おしまい
Mail to author Mail to author. Top of this page.

[This page was updated: 2003-03-09 ]

 

 
Copyright © 2001-2003 Takashi KOBAYASHI. All Rights Reserved.