アノテーションと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仕様書に記載されている。
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度トレモロが、非常に難しい。








