<< 5月 2009 | Home | 7月 2009 >>
PR: 転職    ドメイン    電子機器    インプラント    転職サイト    ダイエット 食事    転職    コンタクトレンズ    流行キーワード    英会話   

アノテーションとequals()

JSR-299で、アノテーションを比較する概念が出てくるので、ちょっと色々テストしてみる。

--- Foo.java ---
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

@Target({METHOD, CONSTRUCTOR, FIELD})
@Retention(RUNTIME)
public @interface Foo {
}

--- Bar.java ---
import java.lang.annotation.Annotation;

public class Bar {
@Foo int foo1;
@Foo int foo2;

public static void main(String[] args) throws Exception {
Annotation foo1 = Bar.class.getDeclaredField("foo1").getAnnotation(Foo.class);
Annotation foo2 = Bar.class.getDeclaredField("foo2").getAnnotation(Foo.class);

System.err.println("foo1 = " + foo1);
System.err.println("foo2 = " + foo2);

System.err.println(foo1 == foo2);
System.err.println(foo1.equals(foo2));
}
}

結果

shanai@shanai-laptop:/tmp$ java -cp . Bar
foo1 = @Foo()
foo2 = @Foo()
false
true

別インスタンスのようだけど、equals()をオーバーライドしてないのに、equals()比較はtrueになっている。メンバを持たせていると、

--- Foo2.java ---
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

@Target({METHOD, CONSTRUCTOR, FIELD})
@Retention(RUNTIME)
public @interface Foo2 {
String[] value();
}

--- Bar2.java ---
import java.lang.annotation.Annotation;

public class Bar2 {
@Foo2({"Hello", "World"}) int foo1;
@Foo2({"Hello", "World"}) int foo2;
@Foo2({"Hello"}) int foo3;

public static void main(String[] args) throws Exception {
Annotation foo1 = Bar2.class.getDeclaredField("foo1").getAnnotation(Foo2.class);
Annotation foo2 = Bar2.class.getDeclaredField("foo2").getAnnotation(Foo2.class);
Annotation foo3 = Bar2.class.getDeclaredField("foo3").getAnnotation(Foo2.class);

System.err.println("foo1 = " + foo1);
System.err.println("foo2 = " + foo2);
System.err.println("foo3 = " + foo3);

System.err.println("foo1 == foo2: " + (foo1 == foo2));
System.err.println("foo1 == foo3: " + (foo1 == foo3));
System.err.println("foo1.equals(foo2): " + foo1.equals(foo2));
System.err.println("foo1.equals(foo3): " + foo1.equals(foo3));
}
}

結果

shanai@shanai-laptop:/tmp$ java Bar2
foo1 = @Foo2(value=[Hello, World])
foo2 = @Foo2(value=[Hello, World])
foo3 = @Foo2(value=[Hello])
foo1 == foo2: false
foo1 == foo3: false
foo1.equals(foo2): true
foo1.equals(foo3): false

ふ〜ん、やっぱりメンバの一致まで見てくれるんだ。おもしろいな。この挙動は、Annotation.equals()のAPI仕様書に記載されている。

サーバ移行

LGA775の環境が余ったので、サーバを、Core2 duoに乗り換えた。OSはUbuntu 9.04に変更。

ちょっと、これで様子見。

8009ポート

なんか、JBoss-5.1.0が動かなくて、8009ポートが既に使われているよとエラーになる。

sudo netstat -nplしてみると、webAccessなるなぞのプロセスがつかんでいる。で、調べてみると、VMWareのWebAccess用のプロセスのようだ。/usr/lib/vmware/webAccess/tomcat/apache-tomcat-6.0.16/conf/server.xmlを開いて(chmod +wする必要あり)、8009、8005を8809、8805に変えて再起動したところ直った(webAccessは、/etc/init.d/vmware start/stopしても、影響を受けない)。

しかし、VMWareがTomcatを抱えこんでいたとはね。でもポート設定をデフォルトのまま出すってのは、ちょっといただけないな。

箱根の湯

昨日は、会社の創立記念日で休みだったので、箱根の湯に行ってきた。
といいつつ、行きがけに中華街。

あさりそばがウマい。

この、あわびのクリーム煮を、チャーハンにかけて食べるのが、ひそかな楽しみ。うーむティルトしたはいいけど、アイピースファインダ持っていかなかったから、ピントが外れてしまった。



なんだかんだで、横浜を出たのは3時近く。そのまま温泉に直行。

本当に温泉だけ、1時間ほどゆっくり楽しんで、帰ってきました。

パターンマッチは関数リテラルなのか。

scala> val func: Option[Int] => Int = { case Some(x) => x; case None => 0 }
func: (Option[Int]) => Int = <function>

だから、matchと組み合わせる必要なんて全然無くて、関数の替わりにどこでも利用できるわけだ。とすると、あのmatchってやつも、関数を引数にとる関数なんだろうか。ちょっと探してみたけど、見つからなかった。

 

EmacsからMercurial

Ubuntu 8.10のEmacs-snapshotにdvcを入れてみた。

参考ページ:
http://download.gna.org/dvc/
http://xtalk.msk.su/~ott/en/writings/emacs-vcs/EmacsDVC.html

sudo apt-get install bzr
sudo apt-get install autoconf
sudo apt-get install texinfo

bzr get http://bzr.xsteve.at/dvc/
cd dvc
autoconf
mkdir ++build
cd ++build
../configure
make
sudo make install

これで、/usr/local/share/emacs/site-lisp/dvcに入るんでロードパスにシンボリックリンクを張っておく。

ln -s /usr/local/share/emacs/site-lisp/dvc /usr/share/emacs-snapshot/site-lisp/dvc

あとは、.emacsに、
(require 'dvc-autoloads)

試しに使ってみる。

cd /tmp
mkdir tmp
cd tmp
hg init
ls >a

Emacsで、M-x describe-bindingsして、dvcを探してみると、C-X V ...にバインドされている。
C-x V s dvc-status
を実行。ディレクトリを聞かれるので、上で作った、/tmp/tmpを入力。

追加してみる。aと押せばいいようだ。y/nと聞かれるので、yを入力。diredと同じように、mで選択できるので、大量にaddする時は、選択してからaするといいだろう。画面上、何も変化しないけど、gを押せば更新される。

cを押してコミットする。バッファが開くので、コミットログを入力して、C-c C-cで終了。なんかtipsが表示されるのでqで抜ける。

Scalaのcase

てっきり、matchを使う時の文法要素に過ぎないのかと思っていたんだけど、こんなところにも書けるのか。

object Test {
def main(args: Array[String]) {
val data = Map(1 -> "A", 2 -> "B")
val values = data map {
case (key, value) => value
}
values.foreach(println(_))

val keys = data map {
case (key, value) => key
}
keys.foreach(println(_))
}
}
shanai@shanai-desktop:/tmp$ scala Test
A
B
1
2

奥が深い。というか、_ match {...}を省略して書けるってことなんだろうか。

Wolfram Mathematica

Webで使えるようになっているという情報を聞き、ジエチルエーテルを表示してみた

すごいすなぁ。環状構造まで含めて、全異性体が出てるよ。と思ったけど、もっと分子量の大きい、ショ糖でも、異性体の数が全然少ないので、別に計算で出してるってわけじゃないのかも。

というか結果の1つに、Sodium aluminosilicateとか出てるし。そりゃ全然違うだろう。

アキバへ。

なんかチチブ電気の1Fが変わってた。チチブ電気自身は、3Fで営業中とのこと。ヒートガン買おうかと思ったんだけど、家族の強い反対で断念。丸五、テクノハウス東映、秋月、千石あたりを回ったけど、なんか人が少なかった気がする。

猫ページ

猫ページ更新完了。

今回から現像には、Linux用の、Rawstudoと、UFRawというのを使っている(どちらも、apt-getで簡単に入る)。Rawstudioは、一覧性がいいので、これで選んで、UFRawで現像するのがいい感じ。UFRawは、Gimpのプラグインなので、そのまま拡大縮小とかクロップも簡単にできる。多分細かいところは、Silkypixの方がいいんだろうけど、やっぱりVMWare経由だと面倒なのと、独特のUIの扱いにくさや、全般的な処理の遅さもあって(特にネットワーク上のファイル読み出し)、あまり使わなくなりそう。

ScalaとIDE

ソース入力は、Emacsだからいいとしても、importの補完、リファクタリング(特に名前変更)、未実装メソッドの実装あたりは、IDEでやりたい。

Netbeansは、リファクタリングができない模様。

Eclipseは、クラス名変更のリファクタリングは出来るけど、メソッド名変更はできなかったし、どうにも不安定。

IntelliJは、さすがに良く出来ていて、上記は全てできた。とりあえず試用してみよう。

ベートーベン ピアノソナタ27番

ベートーベン ピアノソナタ27番
Beethoven Piano Sonata No27

27, 28番は「告別」と「ハンマークラフィール」にはさまれて、すっかり無名だけど、この27番はとても好きな曲。自分で弾くとなると、中間部で左手で弾くピアニッシモの10度トレモロが、非常に難しい。

このサイトの掲載内容は私自身の見解であり、必ずしもIBMの立場、戦略、意見を代表するものではありません。
日本アイ・ビー・エム 花井 志生 Since 1997.6.8