Readmeじゃないよ 2

■990712

永きに渡る眠りかさめ、MorePaste復帰。でも、今度はJava。文字列をいじるルーチンは、DelphiのよりJavaの方が、やっぱりよくできているねぇ。まぁ、どちらも文字列の操作は得意とは言えないんだけど。しかし、Delphiでは古臭い書き方をしてたね。発想の転換というか、Javaのライブラリを使って、どう実装するか考えていくと、全然違う処理に行きつくもんね。ということで、Streamってば便利だ。

■990731

そろそろ、7月も終わり。結構暑くって、体調を崩しがちな今日この頃、すぐに鼻水の嵐に見舞われちゃう。うーん。

Streamというか、Reader/WriterとStringBufferを組み合わせて、読んだ端から中身を調べて必要に応じて置き換えて行くんだけど。非常に面白いなと思ったのは、やっぱり、Unicodeだね。Reader/Writerは、Unicodeに変換してくれるんだけど、これだと、半角も全角も無くなっちゃう。おいおい、日本語は2バイトとして、カウントしてくれていいんだよ。タブを空白文字に置き換える処理なんて、全角文字は2文字分の空白文字に置き換えるんだから。ああぁ、便利過ぎる。結局、Stringをちまちま読んでいくことになってしまった。かなり、Delphiで書いたのに近い処理だな。

Delphiの時の経験を生かして?、処理の部分だけでオブジェクト化してたりするんだけど。動作チェックはやっぱり、それなりのガワが無いとダメだから、まぁ、適当に部品を配置しておくと。ありゃりゃ、改行文字のハンドリングが変だぞ。SystemのgetPropartyで改行文字を取得して、それで文字列のマッチングを行うと。そのマッチングが変。

ということで、悩んで時間をかけるもなんなので、必殺、Javaソース読み。BufferedStreamのreadLineでも参考にしてやれ。こんな書き方をしてるのね。まねしちゃいましょ。うーん、なんか、シリアライズとかの周辺で問題ありそうな。

まぁ、とりあえず、処理ルーチンのオブジェクトはできたから、ちょっと、GUIを考えましょうかね。

■990822

さすがに一月近くも立つと、大体ガワもできていて、それなりにDelphiで作っていたレベルに追いついてきたと言える。ちょっとした機能を実装しようとしただけで、それこそ、Javaのクラスライブラリをあらかたひっくり返すことになって、良くも悪くも、Javaのいろいろな面が見えてきたし。

しかし、GUIについては、そろそろスクラッチでコードを書くのは限界だね。GridBagLayoutを手で書いてみて実感。うーん、なんか手ごろなIDEでも探すかな。

作りのほうは、基本的な機能として、引用符の挿入とタブ文字の変換に加えて、行の長さを一定にそろえる機能BoxFillを用意することにした。最後のはDelphiで作ってたときにもプランには入れていて、でも作っていなかった。Delphiは文字列操作がJavaよりさらに下手だからね。しかし、これも作ってみたけど、結局全角文字と半角文字の問題に悩まされることになって。これまた、文字のカウントを地道にやるしかないということかね。困った、こまった。

それと大きな問題。引用符の挿入でコンボボックスをDelphiの時と同様使用しているんだけど、致命的な仕様が。コンボですでに登録されている引用符を選んで、選択項目の内容を変更したときだけ、ウインドウ全体のDeactivateイベントが発生するんだよねぇ。おいおい、MorePasteは、そのイベントで文字列の変換を行ってるんだよ。そんなところでそんな重要なイベントが起きちゃぁ、一回変換が行われちゃうじゃないか。期待したように変換させるには、コンボのイベントとウインドウのイベントを組み合わせて、なんとか回避しないといけないようで。まぁ、こっちは処理自体は見えているし、そんなに難しくは無いか。うーん。

ああぁ、基本機能以外は、動的に機能を追加できるようにしようかな、と。プラグイン的。

■990825

BoxFillを考えていて、とにかくUnicodeで全角半角文字を区別するにはどうするか、というところに頭を悩まさせられてる。結局、Unicodeができた時点で、フォントの幅と文字データの幅はイコールじゃなくなった。つまりはこれは、突き詰めると文字コードからはフォントの幅が分からなくなった、ということさ。さぁ、こまった、困った。

さりとて、悩んでばかりではどうしようもないので、やっぱり、Java2のライブラリをのぞいてみると。java.langの下あたりに、isHankaku()とかisZenkaku()なんていうへんてこなメソッドを持っているクラスはないかね。ライブラリを作っているのが、半角だけの世界で生きている人たちだからなぁ。

しかし、面白いクラスを見つけた。java.lang.UnicodeBlock。Unicodeってのは、内部的にカテゴリ分けがされていて、日本語なんかは漢字が冷遇されてるみたいなことを言われつつも、HIRAGANA、KATAKANAなんてブロックを漢字のほかに持っている。これだけでも100文字以上なんだよね。で、of()なんてメソッドを使うと、文字単位でどのブロックに属しているか分かるわけだ。使えるじゃん。

ひらがな、カタカナは明白として、漢字はカテゴリが分かりにくい。toString()して調べてみると、運良くカテゴリ名が帰ってきた。CJKなんてアルファベットから始まるカテゴリに属しているのね、漢字って。中国と日本と韓国で、CJKかね。UnicodeBlock.HIRAGANAとかがそれぞれオブジェクトなのを利用して、Vectorを使ったら、コードが非常にすっきりした。久しぶりにヒットなコードだ。気分がいいね。

半角カタカナとか、全角のビックリ!とかドル$とかが不安だけど、それはおいおい試してみることにしよう。結構あっさり行くもんだ。

■990831

今日で、夏休みも終わりで、明日からは通勤電車に学生が乗りこんでくることになる。まだ、結構暑いってのに困ったこまった。通勤電車の乗客じゃないけど、詰めこめばいい、ってもんでもなくて、場合によってはぶら下げたり追い出したりする必要があるのが禁則処理で(なんのこっちゃ)、BoxFillでの実装に頭を悩ませている。

禁則処理ってば、日本語以外だとどうなるんだろうね。英語だとワードラップってことか。とにもかくにも、日本語のロケール特有の機能にならざるを得ないねぇ。少なくとも日本語と欧米語で同様に効果のある禁則処理ってのは実装できないだろうか。

日本語は分かち書きをしないので、基本的に禁則処理ってのは文字単位で実装すれば良くて、しかし、それでも追い出しとぶら下がりの両方を実装しようとするとやっぱり一筋縄じゃ無理だね。
やり方としては、禁則処理バッファみたいなのを用意して、そのなかで改行文字の位置を決める、というもの。単純に1文字先読みでは処理できないところがうれしくない。欧米語のワードラップとかハイフネーションなんて、実装は考えないことにしておこう。

おしまい
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.