JAVAってやつぁ〜…
最近あるきっかけからJAVAを覚えてみようじゃないかと思い立った。
しかしぐぐってみてもイマイチこういいサイトが見あたらない。というか、これから始めようとする人が見るにしてはどうにも内容が難しいのばかりでどうしたもんやら。
まあ、とは言っても以前C++の本やオブジェクト指向の本を読んだことはあったから、この質問に書いてあるキーワードに関してはなんとなく知っている感じ。C++は結局わかんないけど…Cなら昔ちょっとかじったことがあるから多少は分かるかも。
JAVAの勉強を初めてまず最初に思ったのが「なんでファイル名と同じクラスが必ず必要なんだ?」ということ。Cとかと違ってmain関数がクラス毎に何個も書けるということだから、どれが入り口なのか分かるようにするためなんだろうけれども、そもそもmainを複数置けることにメリットを感じない。オブジェクト指向とかいうのを全然理解していないから、何か別の意味があるかも知れないけど…。
あと、手続き言語、特にPerlに慣れ親しんでいたもんだから、前処理というのか、やりたいことをするまでの準備が面倒だなーと思った。
たとえば、ある文字列から正規表現で文字を取り出そうとした場合。JAVAの場合、
import java.util.regex.*; public class RegTest { public static void main(String[] args) { Pattern pattern; Matcher matcher; pattern = Pattern.compile("No(\\d+)"); matcher = pattern.matcher("No3532No56264No5324No643"); while(matcher.find()) { System.out.println(matcher.group(1)); } } }
こんな感じになるんだろうか。これをPerlで書くと、
my $s = 'No3532No56264No5324No643'; foreach($s =~ /No(\d+)/g) { print "$_\n"; }
たったこれだけで済んでしまう。まあこういったテキスト処理はPerlの得意とするところだから、比較するのはちょっと可愛そうな気もするんだけど…。
最初、JAVAの方だけれども
pattern = Pattern.compile("No(\d+)");
と書いていて、javacかけたら「そんなエスケープコードは無ぇ!」と言われて「は?」と思ったが、よくよく考えたらそれは当然のことだ。
Perlと違ってJAVAでは正規表現は言語仕様としては組み込まれていない。上記のコードではcompileというメソッド(で合ってるよね…)に対して、正規表現で表した文字列を引数として渡しているだけだ。コンパイラにしてみれば、それは単なる文字列なわけだから、エラーが出ても仕方がない。
冗長になるからここは言語仕様に組み込んで欲しいもんだが、やはり無理があるのかなあ。
さて、正規表現についてはこれで解決したが、今のところ解決策を見つけられないでいるのがHTTPに関すること。つまりHTTPでGETやPOSTをしたい。
最初、これはHttpURLConnectionを使えばいいというのでやってみた。POSTによるフォーム送信の実験はうまくいったのだが、さらに調べているとJakartaのCommons Http Clientを使えばいいということが分かった。
現在ここで止まっている。まだHttpClientによる実験は行っていない。何に引っかかっているかというとクッキーだ。
まあクッキーは、特に意識しなくても普通にGETやPOSTをすればHttpClientが自動的に面倒を見てくれると言うことなんだけれども、それの有効期限がどうなっているのかということが分からない。
普通に考えれば、たとえば
GetMethod method = new GetMethod ("/");
と宣言したこのmethodが死んだ時点でクッキーも破棄されてしまうんだろうとは思うんだけれども、マルチスレッドでの利用を考えていて、1回の処理が終わればそのスレッドは終わって次の順番が来るまで待たせる、という風に作ろうと思っているから、これだと毎回クッキーを得る動作をしなくてはいけない。
また、一度プログラムを終了させて次に起動したときも同様だ。
Perlの場合は、こういう処理をするときにはHTTP::Request::Commonと、クッキーを使いたいときはHTTP::Cookiesを使う。
いちいち自分でレスポンスをextract_cookies関数に引き渡してクッキーを取り込まなければならないのは面倒だが、saveという関数でファイルに保存し、loadという関数でファイルから読み込むことが出来る。
これは非常に便利で、上記の目的にぴったりと合う。
一応一通りHttpClientに目を通してみたんだけれども、クッキーを操作するようなメソッドは見あたらなかった。つーか英語だし、見落としてる可能性大。
自動でやってくれるのはいいが、手動で操作できるようなのも付けて欲しかった。
クッキーが記録されたmapだかlinkだかのを取得する方法があるのかもしれんが、それをシリアライズとかいう事をして自前で保存せにゃならんのかなあ?まあ方法があるのなら、それはまだマシなんだけども。・・・。「シリアライズ」って何なのか、実はほとんど理解してなかったりする。ファイルやネットワークに入出力するときにはそんな操作が必要らしい、ということぐらいしか…。
そうそう、最後にswing。こいつはけっこうすんなりと理解出来たんだけども、JTextAreaでは個別にいろんな色を付けることができないし、かといってJTextPaneではJTextAreaでは使えたappendが無い。一体どうすりゃいいんだか…。
コンポーネントの配置にはGridBagLayoutを使った。柔軟な配置が出来る反面、設定がちと面倒だという話だったが、意外と簡単だった。まあGridBagConstraintsのfillフィールドを設定してなかったから、JTextPaneのサイズがものすごーーーーーーく小さくなってしまったときには解決策が分からなくて焦ったが、まあなんとか見つけることができて一安心。まあこのレイアウトマネージャは重みがポイントですな。
とりあえず当面の目標はクッキーということになるだろうか。テキストに関しては、最悪JTextAreaを使ってモノクロで表示するようにすればいいだけだし。まあクッキーも、ほんともう最後の手段としてはスレッド生成の度にクッキーを取得するようにすればいいんだろうけど、それはちょっと現実的ではないですな。
つーわけで今回はおしまい。このシリーズが続くかどうかはわかんないけど、また。