GridBagLayout
ごめんなさい。先日の日記で「Javaのレイアウトマネージャは使えね〜」とか書いてましたが、そんなことは全然ありませんでした。GridBagLayout。これ、最強に便利です。HTML のテーブルを書いていく感じでレイアウトできます。納得。Eclipse + VE の組み合わせの賜物という気もしますが。
使い方は多少クセがあるのですが、簡単に説明すると以下の通り。
これだけで、自動的に配置されていきます。便利。レイアウトマネージャを使っているので、環境が変わってもレイアウトが崩れるということはないはず(未検証)。HTML の colspan rowspan を使って表をレイアウトして、align 等で表示位置を整える、という感覚ですね。
関係無いですが StatusBar に相当するコントロールは Swing には無いんですね(AWT にも無いけど)。jLabel で代用する方法が一般的らしいですが、右下に三角が無いとどうもしっくり来ません。毒されてますか?(^^;
Java
以前の日記で Java の開発が云々と書いたことがありますが、ぼちぼちその仕事に取り掛かる準備を始めないとヤバいので、面倒くせぇなぁと思いながら取り掛かってみてます。
まずは開発ツールを揃える作業からですね。ターゲットとなる JRE のバージョンは良く知らないので、とりあえず 1.4 系の SDK で。開発はやはり Eclipse でしょうかね。他の選択肢もあるんでしょうけど、現状では最良の選択肢でしょうし。
簡単なウィンドウアプリなんかを作ってみましたが、Swing 使いにくー。レイアウトマネージャを使った方が良いんでしょうが(実行される環境が様々なので)、理解せずに使ってる部分もかなりあるとは思いますが、直感的な操作が出来ないのはなんとかならんのか…。Delphi や VS に慣れたヘタレにはキツイよ。
レイアウトさえ出来てしまえば、IDE に助けらながらでもそこそこコードを書いて行けるし、GC 頼りのインスタンス作りっぱも可能なのでなかなか良いかも。
一つびっくりしたこと。Swing を使ったアプリを作る時でもスタートアップコード(ようするに static な main メソッド)を自分で書かないと駄目なんですね。Java の思想(実行する時に実行するクラスを指定する)から言えば当然の仕様なんでしょうが、他の開発環境ではお目にかかれない手法だと思うので、ハマる人は結構いそうな気が。
さて、デザインパターンを勉強しなきゃ!
Apache + PHP の時のプロセスID
ファイル名等重複して欲しくない時に時間とかプロセス ID とかを使ってユニークな文字列を作ったりしますよね。時間だと 1 秒以内に複数のファイルを作る場合に精度(?)が出ないので、プロセス ID を絡ませて、とか。
んで、今運用しているシステムでのそのようなことをやっていたのですが、今見るとやたらと寿命の長い httpd が何個もいるじゃないですか(Apache1.3です)。PHP は無限ループになったりしたときのフェイルセーフ機構が付いているので、ある程度時間が経つと自動的にプログラムを停止して終了するようになっています。ということはプログラムの問題でも無い、と。
ということでいろいろ調査をしていたのですが、どうやら PHP の場合 httpd は使いまわされるらしいです*1。うへー、いつから?って始めからなんだろうけど…。CGI の場合は終了すると思ったので、モジュールだとこういう動作になるということなんですかね。
ということで、同じプロセス ID が連続してヒットする結果になってしまうので、その辺りを考慮しつつプログラムを組む必要がありますね。セッションで連番を使うとか(うちはこれ)。
Apache2.0 だとどうなんでしょうね。スレッドを作って動くはずなので、さらに違う挙動になるんでしょうね。当てにするなってことなんでしょうけど。
*1:デフォルトの動作がこうなっているということらしい
PRIDE
8/28 さいたまスーパーアリーナ行って来ました。生ヒョードルに生ミルコ、生シウバですよ!まぁリングにいる彼らを判別出来るような位置ではありませんでしたが…。
しかし、やっぱ会場にいると違いますね〜。シウバの入場時の盛り上がりとか、最高です。これで勝ってくれてたらもっと盛り上がったと思うんですけどねぇ。残念!
個人的にはやっぱりヒョードル vs ミルコですね。凄かったです。瞬きしてないのに追い切れません。正しく世界最強決定戦!満足です、ええ、満足でしたとも!
で、浮かれすぎてて TV 放送を見逃す始末…。
PRIDE
かな〜り間があいてしまいましたが、再開です。
String 型の値渡し
という内容のスレッドが @IT で燃え上がってます。不思議といえば不思議だし、当たり前と言われれば当たり前ですが、なかなか興味深いです。
ポイントとしては、
public void my_func(string value) { value = "もじれつ"; } string str = "文字列"; my_func(str); MessageBox.Show(str);
この時に何が表示されるのか、ということですね。.NET の String は参照型なんですが、実際には my_func() の中のコードは新たな String 型のインスタンスを生成して代入するだけなので、元のインスタンスは全く変更されません。参照を渡しているのに感覚的には値渡しですね。コメントで「String クラスには値を変更する為のメソッドが無いから・・・」云々という回答がありましたが思わず「なるほど!」と思ってしまいました。
でも変更したい場合もあります。その場合は ref キーワードを使います。
public void my_func(ref string value) { value = "もじれつ"; } string str = "文字列"; my_func(ref str); MessageBox.Show(str);
とはいえ、あまり使わない方が良いですね。String 型でこの方法が必要なケースはあまり無さそうですし。
VB
仕事で VBScript と Java を触ることになりそうな気配が漂ってきてるので、早速言語仕様のお勉強です。
とりあえず VBScript からとりかかってみることに。
代入と比較で同じ = 演算子(なのかどうかも定かではないですが…)を使うってのが新鮮というか驚きというか。BASIC だからなんでしょうけど。なので構文上比較した結果を代入(bool a = (b == c) みたいなの)とかは無理?試してないので分かりませんが。
制御構造のいわゆるぶら下がりは駄目っぽいですね。個人的にはこっちの方が好き。
関数が戻り値の有り、無しで定義が違うのも良いです。が、Function の時の結果用変数名が固定(関数名と同一)なのは多少イヤかも。読みやすそうな変数名にする為に関数名まで変更はしたくないので、勝手な結果用変数(Result とか)を作って、最後に本物の結果用変数に代入するとかしそうな勢いですが、これはやっぱり却下でしょうか。マルッとコピーペーストするのを禁止する為の仕組みとしか考えられません(笑)。まぁ最近のエディタはリファクタリングもちょいちょいで出来るので問題無いんでしょうか。
続いてエラー処理。On Error 〜 という構文があるのでこれを使う訳ですが try 〜 catch と同じように使える訳ではないので注意が必要。goto で制御する場合はラベルの重複も多分駄目だろうから、結構面倒臭いかもしれないです。
関数の後のカッコがいらないってのはちょっとイヤかも。ぱっと見で関数呼び出しなのか構文なのかの判断が出来ない可能性は無いですかね? Integer32 a,b,c とかやるとヤバいですね(^^;
文の後の ; (セミコロン)はいりません。これは好みの分かれる所でしょうか。パースが面倒になりますが、他のところでもかなり面倒なことをやってそうなので、文の終わりの検出なんて些細な問題なのでしょうが。その代わり、次の行に継続させるためには _ を明示的に書いてあげる必要があります。大技として「継続させない」という方法もあります。エディタが適当なところ*1で折り返してくれるモノであればこの大技を繰り出すことも可能。
良さそうなところ、悪そうなところをざっと挙げてみました。まぁそんなに悪い印象は受けなかったです。実際に開発すると変なところでハマったりするんでしょうけど…。
*1:適当なところ:コロンの後とかスペースとか