Scalaのinner objectってスレッドセーフじゃない?
class Foo {
Bar.bar
object Bar {
def bar {}
}
}
public Foo();
Code:
Stack=1, Locals=1, Args_size=1
0: aload_0
1: invokespecial #12; //Method java/lang/Object."":()V
4: aload_0
5: invokevirtual #18; //Method Bar:()LFoo$Bar$;
8: invokevirtual #23; //Method Foo$Bar$.bar:()V
11: return
LineNumberTable:
line 1: 0
line 2: 4
public final Foo$Bar$ Bar();
Code:
Stack=4, Locals=1, Args_size=1
0: aload_0
1: getfield #25; //Field Bar$module:LFoo$Bar$;
4: ifnonnull 19
7: aload_0
8: new #20; //class Foo$Bar$
11: dup
12: aload_0
13: invokespecial #28; //Method Foo$Bar$."":(LFoo;)V
16: putfield #25; //Field Bar$module:LFoo$Bar$;
19: aload_0
20: getfield #25; //Field Bar$module:LFoo$Bar$;
23: areturn
LineNumberTable:
line 4: 0
同期化、何もされてないから、マルチスレッドで呼んだら、複数インスタンスできそうだな。
XMLをパースするんじゃなくて、単に読み込む。
XMLをパースするのではなくて、Unicode文字列として読み込む必要が生じて、ハタと困った。そんなAPI無いし。面倒なのは、エンコーディングを判定する部分で、自分で、<?xml ... encoding="xxx"?>をパースするっていうのも、芸が無い。で、staxのAPIを見ていたら、START_DOCUMENTのイベントを拾ってやれば、XMLStreamReader.getEncoding()で取れそう。最初に、簡単なstaxの動作確認プログラムを作成。
public static void main(String[] args) throws Exception {
XMLStreamReader reader = XMLInputFactory.newInstance()
.createXMLStreamReader(new BufferedInputStream(new FileInputStream(args[0])));
try {
while (reader.hasNext()) {
System.err.println("Event: " + reader.next());
}
}
finally {
reader.close();
}
}
こんなファイルで動作を確認すると、
<?xml version="1.0" encoding="Shift_JIS"?>
<hello/>
Event: 1
Event: 2
Event: 8
API仕様書を見ると、START_DOCUMENTは、イベント番号7なんだけど、出力されていない。変だなぁと思って、Googleさんに聞いてみると、あぁ、あった。このサイトに、when XMLStreamReader is created, it is positioned at START_DOCUMENT event.とある。つまり、next()を呼ぶ前が、START_DOCUMENTが出た状態なのね。というわけで、修正
public static void main(String[] args) throws Exception {
XMLStreamReader reader = XMLInputFactory.newInstance()
.createXMLStreamReader(new BufferedInputStream(new FileInputStream(args[0])));
try {
while (true) {
System.err.println("Event: " + reader.getEventType());
if (reader.hasNext()) reader.next();
else break;
}
}
finally {
reader.close();
}
}
今度は、ちゃんとSTART_DOCUMENTも出力された。
Event: 7
Event: 1
Event: 2
Event: 8
しかし、なんともしっくり行かない。Iteratorとソックリのメソッド名でありながら、動きが微妙に違うってのは、良くない設計だ。しょっぱなが、START_DOCUMENTなんで、エンコーディングは、
public static void main(String[] args) throws Exception {
InputStream is = new BufferedInputStream(new FileInputStream(args[0]));
XMLStreamReader reader = null;
try {
reader = XMLInputFactory.newInstance().createXMLStreamReader(is);
System.err.println("Encoding: " + reader.getEncoding());
}
finally {
is.close();
}
}
で取れる。ただ、API仕様書によると、getEncoding()はnullを返すかもしれないそうなんで注意。もっとも、プリアンブル外してみたりしたけど、Sunのjaxp 1.4.2では、getEncoding()がnullを返すことは無かった。
Bluetooth増設。
Thinkpad R61にBluetoothを増設した。目的は、ThinkPad用 Bluetooth マウスを使うため。
Ubuntuからは、Fn + F5でBluetoothをonにし(onになると、パネル(あ、パネルはThinkPad側ではなくて、画面上のパネルの方。どうも非搭載モデルは、ThinkPad側のLEDは点灯しない模様)にBluetoothアイコンが表われる)、マウス背面のBluetoothボタンを押してから(電源ランプが点滅状態に変わる)、以下のコマンドを入れるだけで、使えるようになった。
sudo hidd --search
ネゴシエーションに番号とか入れなくていいのか。このマウスは、触り心地も良いし、電源も単3だから、内蔵充電電池が、へたってマウスごと書い替えなんてことになる心配も無く、なかなか良い感じ。
帰国
中国の社会インフラって、思ったよりも充実しているな。高速道路がタダなのに、ちょっとびっくり。そのうち抜かれるね、こりゃ。
タクシーの乱暴運転は、聞いてはいたものの、すさまじかった。しかし、まぁ住所を見せるだけで、地図も見ないで、目的地に着くのには、驚きだ。なんで分かるんだ?
あと、安いところに行っても、料理は、やたらとウマい。なぜなのかな。工業製品なんかは、あからさまに、手を抜いたのが多いのに。
羽田便だと、時間的に、国内出張と大して変わらないのは助かる。
あ、あとマッサージ。足と全身を3時間、じっくりやってもらっても、200-300元(3000-4000円くらい)。1回しか行けなかったのが残念。
まかないこむすめ
献本いただきました。
まかないこむすめ。ん〜、アマゾンは表紙が登録されていませんな。7&Yには載ってた。
家内の友人の方が描いているコミックです。猫が擬人化されて出てくるんだけど、でも、どうも擬人化じゃないようで、昔は普通の猫だったけど、何かがきっかけで、人間の姿になってしまった?? 第1巻では、そのあたりは、まだナゾのまま。というか、途中で気付いたんだけど、この主人公は犬なのだろうか。今はネコ耳ならぬイヌ耳がはやり?
グーグルさんに聞くと「まかないこすめ」ですかい? と言われる。どうやら、そういう名前の化粧品があるらしい。それにかけてるのかな。
「はねむす」同様、深刻な話は無いので、気楽に読めます。
ん、これアスキー・メディアワークス出版なのか。







