ListSelectionEvent
なんだこれ、動きがさっぱり読めないぞ。
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frm = new JFrame();
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.setLayout(new FlowLayout());
Container c = frm.getContentPane();
final DefaultListModel model = new DefaultListModel();
final JList list = new JList(model);
list.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
System.out.println(e);
}
});
c.add(list);
list.setPreferredSize(new Dimension(200, 200));
JButton btn1 = new JButton("Add");
c.add(btn1);
btn1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
model.addElement("Hello");
}
});
JButton btn2 = new JButton("Deselect");
c.add(btn2);
btn2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
list.clearSelection();
}
});
frm.pack();
frm.setVisible(true);
}
});
Addボタンを5回ほど押して、要素を5つ追加。1個目をクリック。
firstIndex= 0 lastIndex= 0
2個目をクリック。
firstIndex= 0 lastIndex= 1
ここで、既に良く分からない。firstIndex= 1 lastIndex= 1じゃないんだろうか?
もう一度1個目をクリック。
firstIndex= 0 lastIndex= 1
なんじゃこりゃ。バグ?
あ、そうか、1つ前の状態が格納されているんだよ。きっとつまりfirstIndex= 0 lastIndex= 0は、何も選択されていない状態なわけだ。
1個目をクリックしてから、deselectボタンで選択解除。
firstIndex= 0 lastIndex= 0
違った。やっぱり、さっぱり分からん。
findbugs-1.3.0
知らない内に出ていた。で、アノテーションを含んだソースが軒並みコンパイルできなくなって焦ったが、annotation.jar以外にjsr305.jarというのが同梱されていて、これもクラスパスに入れないと駄目みたいだ。
ピアノソナタ16番
ベートーベン ピアノソナタ 16番
Beethoven Piano Sonata No 16
アルペジオの部分はスラーの最後にスタカートがあり、そこにスフォルツァンドが置かれている。これってどうやって表現すればいいんだろう。楽譜の間違いか?
流れるようなインターフェース
最近は、StringBuffer.append()みたいなのも、流れるようなインターフェースなのか。まぁ本質的に違いはないわけだけど。自分がコンテナクラスのインスタンスを手軽に造りたい時に使っているのは、こんなの。
public class CollectionBuilder {
private Collection collection;
public CollectionBuilder(Collection collection) {
if (collection == null) throw new NullPointerException("collection is null.");
this.collection = collection;
}
public CollectionBuilder add(Object o) {
if (collection == null) throw new IllegalStateException("Create new CollectionBuilder.");
collection.add(o);
return this;
}
public Collection get() {
if (collection == null) throw new IllegalStateException("Create new CollectionBuilder.");
Collection ret = collection;
collection = null;
return ret;
}
public Collection getUnmodifiable() {
return Collections.unmodifiableCollection(get());
}
}
public class TypedCollectionBuilder<T> {
private CollectionBuilder builder;
public TypedCollectionBuilder(Collection<T> collection) {
builder = new CollectionBuilder(collection);
}
public TypedCollectionBuilder<T> add(T o) {
builder.add(o);
return this;
}
@SuppressWarnings("unchecked")
public Collection<T> get() {
return (Collection<T>)builder.get();
}
@SuppressWarnings("unchecked")
public Collection<T> getUnmodifiable() {
return (Collection<T>)builder.getUnmodifiable();
}
}
Collection<String> c = new TypedCollectionBuilder<String>(new LinkedList<String>())
.add("Hello")
.add("World")
.getUnmodifiable();
S2JDBC
IBMでのSeasar2デモで、改ためて見てみた感想。継承マッピングとかdetachedとか複雑な機構を捨てるといういさぎ良さは好感が持てる。水と油を、所詮は水と油だとプログラマが認識して扱うのか(S2JDBC)、それともなんとか、その間を吸収しようと苦闘(JPA)するのかという違いかな。どっちも、その後の進化がどうなるのかを見てみたい。
現状では、Lazy loadとOpen Session In Viewについては、自分は賛成派だ。いったんDTOにfetchしてviewに渡すのは、分かり易いけどDTO層が余計に必要だし、view側で表示項目を追加したくなった時に、結局fetch処理も直さないといけなくなって、ちょっとだけ余分に手間がかかる。今年、仲間うちでStruts2 + Guice + TopLinkでOpen Session Viewを試してみたけど「邪道感は、ちょっとあるけど、やっぱり楽」という感想だった。ただ、作ったのが簡単なショッピングサイトだったんで、もっと複雑なアプリケーションで、やっかいなバグが発生していたりしたら、また感想も変わったかもしれないな。あと、Struts2はviewの処理でbeanにアクセスした時に例外が発生すると、XWorkの中で例外を飲み込んで捨ててしまうので、そのままでは、productionには使えない感じだ。
ATIドライバ更新
ATIのLinuxドライバ(Mobility RADEON 9600)が更新されていたので入れていみた。更新されるごとに、確実に速くなっている気がする。ThinkPadは、仕事用のWindowsと切り替えて使っていて、前は画面の描画速度に明らかな違いを感じたけど、最近は遜色無くなった。ただCompizとの相性が悪く、スタンバイからの復帰では画面が壊れる(操作は出来るんで致命的ではないけど)。もっともこれはドライバのせいじゃないのかもしれないが。
しかし、あれだな。昔、デスクトップ環境をLinuxに移し始めた頃は、アンチエイリアスが気に入らなかったけど、今は無い方(Windows XP)に違和感を感じるんだから、慣れとは恐ろしい。
OpenOffice drawが立ち上がらなくなった。
DrawだけじゃなくてImpressもDatabaseも上がらない。立ち上げようとすると「クラッシュしましたというダイアログ表示」。なぜかWordとCalcは立ち上がる。ためしにホームの.openoffice.org2ディレクトリを削除してみたけど変わらず。SynapticsからDrawを削除して再インストールしてみたけどだめ。仕方無いので、SynapticsからOpenOffice関係をかたっぱしから削除、アプリケーションメニューの中から追加と削除であらためて、インストール。ふうやっと直ったよ。
IMEをuimに変更。
なんか前は、LANG=Cすれば回避できていたのに、7.10では何が悪いのか、Javaでは、これでもキー入力が入らなくなる現象が起きる。IBM JDKでもgcjでもだめなんで、あきらめてuimに変更。
設定は、Ubuntu日記とkubuntu 6.10 memoを参考にさせていただいた。
sudo apt-get install uim uim-xim uim-anthy uim-skk sudo update-alternatives --config xinput-ja_JP
で、uim-systrayを選択してctrl-alt-backspaceで再ログイン。テストプログラムで確認すると、おぉ、ハングしないよ。もっと早く切り替えておけば良かった。しばらくは、これで様子を見てみよう。
@NonNullアノテーション
FindBugsの@NonNullアノテーションを使うと、nullでないと注釈を入れることができる。
public @NonNull DBConnection setUser(@NonNull String user) {
if (user == null) throw new NullPointerException();
this.user = user;
return this;
}
このメソッドにnullを渡しているコードとか、戻り値を無駄にnullチェックしているコードに警告を出してくれる。で、もう一歩進めて、このnullチェック行を自動生成できないもんだろうか。
if (user == null) throw new NullPointerException();
引数1個ならaspectjを使ってweaveすればできそうな気がする。でも複数の引数がある時の指定方法が分からない。無理かな。
GMailでIMAP
GMailでIMAPが使えるようになったんで、Wonderlustに乗り換えた。快適だなぁ。大量のメールをさばく時は、やはり一番効率が良いように思う。結局タスクセントリックなUIって、CUI => GUI => Webで、どんどん退化しているんじゃないだろうか。
Ubuntuでテンキーが効かない件
やっと分かった。テンキーを押すと、微妙にマウスカーソルが動く...
システム -> 設定 -> ユニバーサル・アクセス -> 支援技術の設定 でキーボードのアクセシビリティを押すとマウス・キーがonになってた。
キーが入らなくなる件は、scim-bridgeを入れると直るとのことで、さっき入れてテスト中。
Shift+F10が効かないのは、Compizの設定の"General Options"でアニメーションのスロー再生にShift+F10が割り当てられていたせいだった。これを外したら直った。
UNLHA32.DLLに脆弱性
なんか、このファイル名に懐しさを感じたりするほど、最近全然lhaを使っていないことに気付いた。いつごろから使わなくなったのかな。会社入ったころは、まだ割と使っていたように思う。感覚的にはJavaを使い始めたあたりかなぁ。そういやJava系のミドルウェアはzipで配布が多いよね。antタスクの利便性のせいかな。あとWindows系も自己展開形式とかmsiでの配布が増えたというのが一因かもしれない。最近はUbuntuでapt-get installだから、自分でファイルの解凍すらしないわけだけど。
Ubuntu 7.10でOpenOfficeにキー入力が入らなくなる。
必殺パターンを見つけた。名前を付けて保存で、Alt+Nを押して名前(N)にフォーカスを合わせると、それっきりキー入力が入らなくなる。ただAlt+Cみたいな制御キー系は大丈夫みたいだ。
P.S. と思ったら、ThinkPadに入れた方は大丈夫だなぁ。
大井町のヤマダ
VAIO BXが置いてあったんで、触ってきた。パームレストが軋むという話だったけど、良く分からなかった。キーボードはストロークが、かなり浅い感じ。液晶は、ちょっと暗いな、やっぱり。それ以外は、特に気になるところは無かった。価格聞いてみたけど、値段は通販の方が、2万くらい安いね。
2Fにバーガキングがあって、並んでた。メニューみたらミールセットが800円とかだったんだけど、日本では高級路線なの? まだ、もの珍しいんだろうか。
Berylのアニメーションが突然遅くなる。
どうやら、Shift+F10押すと遅くなるみたい。そういうものなの?
というか、Shift+F10でコンテキストメニューが出ないのって、結構辛いんですけど... みんな、いちいち右クリックしているんだろうか。何か他のキーバインドがあるのかなぁ。
Ubuntu 7.10だと普通のアプリケーションもキーが入らなくなる。
なんかJavaアプリだけじゃなくて、GimpとかOpenOfficeもキー入力できなくなる。他のアプリに切り替えるとキー入力できるから、ドライバ回りではなさそう。やっぱりSCIMが原因かなぁ。uimとか、どうなんだろ。ATOK使ってる人も多いみたいだけど、やっぱり自分はSKKじゃないと辛いし。
Struts2のSessionAwareとaction chaining
Struts2ではactionがSessionAwareを実装していると、HttpSessionをマップインターフェースで注入してくれる。これはいいんだけど、セッションフィクスエーション攻撃の防止のために、HttpSession.invalidate()してから、業務処理アクションにchain、そのアクションもSessionAwareって場合に、古いセッションが注入されてしまうようだ。で、IllegalStateException。アプリケーションレベルでは、いい回避策が思い浮かばない...











































