2008年9月7日日曜日

javaのinitializer

その場で作ってすぐ実行するスレッドをThreadを継承した匿名クラスで実装する。このスレッドをdaemon化するのに、次のようなやり方ではIllegalThreadStateExceptionが発生してしまう。startしたらdaemon化出来ないため。

new Thread() {
    @Override
    public void run() {
        setDaemon(true);
        System.out.println("hello");
    }
}.start();

まあ変数に一度入れてsetDaemonしてやればいいのだが、それでは負けた気がするのでちょっと考えたら、initializer使えばいいのに気付いた。

new Thread() {
    {
        setDaemon(true);
    }
    @Override
    public void run() {
        System.out.println("hello");
    }
}.start();



hardyからintrepidにした

bzrを入れるときにhardy向け以外のaptlineも書いてあるのを見て、8.10=intrepidであることを知った。
試しに既存のhardy用apt-lineをintrepid用にしてみた。

殆ど問題なく、dist-upgradeで済んだ。要らないもの(gcc4.2とか)が結構残ったので削る作業があったぐらい。
そして、うれしいことにemacs-snapshotが、set-default-fontでM+1VM+IPAG circleを指定しても落ちなくなった。すばらしい。フォント指定が一行で済む。



javaのlong定数ではまる

longの下位32bitだけ取り出そうと思って、32bitのマスクを定数で指定したらはまった。

32bitだからintでいいだろう→longと演算する時点で拡張されるから駄目。
さらに、Lつけないとlongにならないのをすっかり忘れてた。

こんなかんじ

long v = -1;
System.out.println(Long.toHexString(v&0xffffffff));
System.out.println(Long.toHexString(v&(long)0xffffffff));
System.out.println(Long.toHexString(v&0xffffffffL));

出力

ffffffffffffffff
ffffffffffffffff
ffffffff