2009年1月31日土曜日

Java 拡張for

Java 1.4のプロジェクトを、Java 6.0に移行するにあたり激しくリファクタリング中。その中で気になったのが、拡張for (JSR-201 enhanced for statement)。気になったのは、拡張forがnullチェックをしてくれるのかどうかということ。

というわけで、Specを見てみた。

The Expression must either have type Iterable or else it must be of an array type (§10.1), or a compile-time error occurs.

とあり、特にnullがOKなのかどうかは書いていない。ただし、続きを読むと、拡張forは通常のforと変わらないようなことが書いてある。
つまり、
for ( VariableModifiers Type Identifier: Expression) Statement

は、
for (I #i = Expression.iterator(); #i.hasNext(); ) {
VariableModifiers Type Identifier = #i.next();
Statement
}


T[] a = Expression;
L1: L2: ... Lm:
for (int i = 0; i < a.length; i++) {
VariableModifiers Type Identifier = a[i];
Statement
}

と同等とのこと。
こうなると、nullチェックはしてくれなさそう。

実際に、試してみた。
 public static void main(String[] args) {
String[] values = {"abc", "def"};
for (String val : values) System.out.println(val);
String[] values2 = null;
for (String val : values2) System.out.println(val);
}

すると、実行するまでもなく、Warningがはかれた。当然無理矢理実行したら、NullPointerException。

というわけで、拡張forでも面倒なnullチェックは必要。

EclipseからTomcatが起動できなくなった

lipse + WPTでTomcat上のWebアプリを開発していたところ、久しぶりにデバッグしようと思い、Tomcatを起動させようとしたら、Consoleに下のようなエラーがでて起動できなくなった。

重大な障害メッセージ: Null component Catalina:type=JspMonitor,name=jsp,WebModule=//localhost/webappli,J2EEApplication=none,J2EEServer=none
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:615)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
Caused by: java.lang.UnsupportedClassVersionError: (jp/dachi/SetEncodingFilter) bad major version at offset=6
at java.lang.ClassLoader.defineClassImpl(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:228)


原因は、コンパイルに使用していたJDKが6だったのに、Tomcat起動用に使用していたJDKが5だったこと。Eclipseのメニューから[Window] -- [Preference]を選択肢、[Server] -- [Installed Runtime]でTomcatを選択。[Edit...]で詳細画面を開き[JRE]で、[Workbench default JRE]からコンパイル時に使用していたものと同じものに変更。これで問題なく起動するようになった。

しかし、一番の問題点は、エラーメッセージがわかりにくいことだな。

2009年1月28日水曜日

英語Windowsで日本語キーボードを使う

開発用にいろいろ試すため、VMWareに英語版のWindows XPを導入。特に問題もなく動作したのでいざ開発を始め、キーボードをばしばし叩いていたところ、問題が発生。キー配列が英語になっていた。
頭を英語キーボードに切り替えれば良いのだが、問題は他の環境が全て日本語キーボードで統一されてしまっていること。ちょっとした作業程度なら、その都度、頭を切り換えれば良いが、開発のようにキーボードをバシバシ叩く作業の場合、結構間違えてしまう。いちいちキー配列に配慮している暇はない。

いろいろ調べてみたところ、逆のパターン、すなわち日本語Windowsで英語キーボードを使うというのは結構見つかるのだが、英語Windowsで日本語キーボードを使うというのはなかなか見つからない。

ようやく見つけた、デバイスマネージャでドライバを更新する方法も失敗。レジストリエディタで確認したところ、確かに変更は反映されているのだが、キー配列は英語のまま。

いろいろと試行錯誤のうえ、最終的に判明したのは、言語設定を変える必要があるということ。こちらで解説されているように、Control PanelのRegionから、いろいろなサービスを全てJapaneseにしたところ、ようやく日本語キーボードが使えるようになりました。いっぺんに変更したため、何がトリガーになったのかはわかりませんが、とりあえず使えるようになったので良かったです。

2009年1月24日土曜日

Pioneer DV-AX5AVi

1,2年前からCDプレーヤーの調子が悪く、音飛びがしたり、トレイが出てこなくなったり、逆に入らなくなったりといった状態でした。いちおう音は鳴っているものの、音飛びされるとやる気をそがれるというか、せっかくリラックスしてCDを聞いていてもストレスになるだけという状態でした。
去年(2007年)の年末に一度買い換えようとも思って、いろいろ候補を物色しました。

現在使っているアンプがSONYのTA-DA7000ES。これはi.link端子を搭載しているため、買うとしたらやはりi.link端子付きがよい。ただ、最新のAVアンプはi.link端子が装備されていないことが多く、その座はHDMIに明け渡してしまっている。というわけで、どうせ買うなら将来の拡張性も見越して、HDMI端子付きが欲しい。i.linkとHDMIの両方を搭載したCDプレーヤー、、、は存在しません。

というわけで、もうここは腹をくくって、どちらかにするしかないのだけれど、結局、良いのがなかった。長く使おうと思ったら、i.linkであまり高いものをかっても仕方ないかなぁという気もし、HDMI付きを探したのだけれど、当時はHDMI付きで良いものがなかった。

そんな悶々とした日々を1年過ごした後、年末にまたCDプレーヤーがすこぶる調子悪くなり、SONYからSCD-XA5400ESが発売されたこともあり、もういい加減買ってしまおうかと思っていた頃。どうもXCD5400ESを買う踏ん切りがつかない。i.linkの場合は、非サポートながら、他社製のCDプレーヤーとアンプを接続できたが、HDMIはまだ実績がない。ここで、SCD-XA5400ESを買ってしまうと、次買うアンプもSONYにしばられてしまう可能性がある。逆に、SONYのアンプと組み合わせない限り、SCD-XA5400ESを買う意味はほとんどない。

というわけで、これまた悶々とした年末年始を過ごしていたところ、2chで興味深いレスを発見。i.linkでCDを楽しんでいる人に対して、それはサブシステムとして一生残しておけというもの。曰く、HDMIはまだ安定していない(ジッターレスもSCD-XA5400ESが最初だし)、i.linkはもうほとんど作っていないから手に入らない、そしてi.link接続は音が良い。というわけで、一気にi.link接続対応のCDプレーヤーを買いたくなってしまいました。

そんなこんなで、ヤフオクでPioneerのDV-AX5AViを購入。実は1年前にも買おうか散々迷ったのですが。1年越しの購入です。


家に届いたので、付属のケーブルで、さっそくi.link接続。ついでに同軸(1m1万ぐらいのケーブル)でも接続してみる。最初に聞いたのが、Norah JonesのCome Away with Me。失敗だった。
最初、同軸で聞こうとしたら、全然音が出ない。冷静になって考えてみると、SACDだから出ないのは当たり前。気を取り直して、i.link接続にしてみたら、、、もう普通に違うCDですね。当たり前といえば当たり前ですが、SACDがこんなに違うものだったとは。
それからCDをいろいろ聞いてみましたが、同軸でも普通に今まで使っていたDENONのDCD-1650AZより良いですね。定価が高いとはいえ、DVDプレーヤーなのに。
あと、同軸とi.link接続ですが、まあ、i.linkの方が良いですね。i.linkの方が音がはっきりしている感じがします。ただ、同軸でも結構良いので、ぶっちゃけそんなに気にならないと言えば気にならないかも。

SACDとCD層は完全に別物。まあ、比較しても仕方がないのですが。

福久

わけあって、横浜の福久にて、ふぐ料理を食べてきました。
ふぐは何回か食べたことがあるのですが、まともに食べるのは初めてでした。また、ふぐの刺身も生まれて初めての経験でした。

これでもかっ、というぐらいふぐ料理が出てきたのですが、どれもおいしくいただきました。

味という観点では、珍味というか、少し変わった魚と形容するのが正しいでしょうか。珍味と言うほどくせはありませんので、極端に好き嫌いは分かれないと思いますが、魚として考えると少し変わっている感じです。もちろん、珍しいだけでなく、歯ごたえがありおいしいのですが、単純に(量的に)アップグレードしたというわけではなく、少しベクトルがずれて、といった感じです。ただ、3大珍味のように極端にずれているわけではないので、おいしいと思う。そんな感じです。

2009年1月17日土曜日

最近見た映画・読んだ本(2009/01/13-2009/01/17)



Effective Java (Second Edition)


ようやく読破(1ヶ月弱?)。結構面白かったし、ためになる内容でした。ただ、中級者以上を前提にしているので、難しい内容も多かったです。難しいというよりも、あまり使わない機能の解説は、復習しないとわすれていてわからんかったです。
そもそもの問題は、日本で中級者以上の開発者はSEやマネージャになり、コーディングをしなくなってしまう。。。嘆かわしい。


バンテージ・ポイント (Blu-ray Disc)



サスペンスもの?同じシーンを、いろいろな視点で見せられるので、失敗すると退屈な映画になってしまいますが、面白かったです。
最初、いきなり大統領が暗殺されたシーンを見せられたときは、「いくらなんでも早すぎるだろ、もうちょっと気持ちを高ぶらせて、映画の世界にのめり込ませてから殺せよ」とも思いましたが。


ブラッド・ダイヤモンド [Blu-ray]



サスペンスもの?同じシーンを、いろいろな視点で見せられるので、失敗すると退屈な映画になってしまいますが、面白かったです。
最初、いきなり大統領が暗殺されたシーンを見せられたときは、「いくらなんでも早すぎるだろ、もうちょっと気持ちを高ぶらせて、映画の世界にのめり込ませてから殺せよ」とも思いましたが。





TSUTAYAのBlu-rayは、あんまりラインナップが増えない。観たい映画で既にBlu-rayで発売されているものが、レンタルできない。ただ、そうは言っても観たことがない映画も多いのは事実。Blu-rayになっているぐらいなんだから、超駄作はないと思って、どんどん借りて観てみるか。

美々卯

少人数でしたが、新年会ということで、渋谷の美々卯に行ってきました。
Webサイトを見てすぐにわかるように、うどんすきのお店です。

やはり冬に鍋は最高というか、味も量もよかったです(ちょっと量が多すぎた感がありましたが)。うどんが煮えすぎて、とりずらくなってしまったところがマイナスですが、それはこちらが悪いということなので、問題ないでしょう。

あと、さすがは渋谷。店員のレベルが(いろいろな意味で)高かった。帰りに店員募集のところを見たら、同じマークシティ内の店に比べ時給が高かった。

2009年1月13日火曜日

最近見た映画・読んだ本(2008/12/21-2009/01/12)



JFK

これは面白かった。長いし、いろいろな人が出てきて、きちんと理解するのは大変でしたが、逆にわかると面白い。まるで実話というか、ケネディ暗殺の真相を見せられているような、そんな力のある作品でした。


マイティ・ハート/愛と絆

最初はふーんと見ていたのですが、実話だと聞くと全然違いますね。一気に感慨深いものになりました。


マイアミ・バイス

派手にドンパチするという、あんまり好きじゃないタイプの映画です。


悩む力

正直よくわからんかった。まあ、あまり共感できなかったということですね。





年末年始は今更ながら幻想水滸伝5をプレイ。発売日に購入したので、実に3年がかり。ストーリーが良く、はまってしまいました。この紋章世界を舞台に、早く6が出てきて欲しいものです。
ちなみに、ちょうど10年前の1998年の年末年始は幻想水滸伝2にはまっていました。月日がたつのは早いもので。

2009年1月2日金曜日

バックアップスクリプト修正

以前、Linuxファイルサーバー用に作成したバックアップスクリプトが、世代管理してくれないので、修正。ログを見る限り、毎回同じディレクトリとSyncしてしまっている。

あやしいのは、/root/backup.shでバックアップ先を取得している以下の部分。
# 最も古いバックアップディレクトリの取得し、そことsyncする
OLDBACKUPDIR=`ls -rt $BACKUPDIR | head -1`
TARGETDIR=$BACKUPDIR/$OLDBACKUPDIR
echo $TARGETDIR
echo "target dir $TARGETBACKUPDIR" >> $BACKUPLOG


ここで、ディレクトリのmtime(修正時刻)を元に、最も古いディレクトリを取得しているが、rsyncで中のファイルを更新してもディレクトリ自体のmtimeは変わらない。他に状態変更時刻(ctime)や、最終アクセス時刻(atime)も同じ。
ディレクトリ内のファイルを1つ1つ調べ、正確な(?)ctimeやmtimeを取得するべきなのだが、それは面倒。というわけで、バックアップ完了時に、ディレクトリに対して強制touch。そうすると、修正時刻がセットされるので、思った通りの結果になる。

というわけで、スクリプトの最後、syncが終わったタイミングで、ディレクトリをtouchするように、以下の処理を追加。
# バックアップディレクトリをtouchし、mtimeを更新する
touch $TARGETDIR

これでうまく動くはず。