<< 12月 2007 | Home | 2月 2008 >>
PR: 転職    葬式    マンスリーマンション 神戸    北海道    環境    FX    不動産担保融資    桐ヶ谷斎場    海外旅行    専門学校   

次の明るさまで暗くする



意味が分からず、悩んだ。

どうやらAC電源の時の明るさから、どれだけ暗くするかということらしい。0%ならAC電源の時と同じ。10%なら、AC電源の時より10%暗くする。

Celeron 540って速いのね。

T8300は玉砕。R61がPenryn対応したら、そのうちBIOSが上がるかなと気長に待つことにする。

T42はPentiumM 1.8GHz、R61はCerelon 540(1.84GHz)、正直、体感は、ほとんど変わらんだろうと思っていたら、なんだか、まるで違う。いやこれはCPUというより、ビデオチップの性能差なんだろうな。しかしCerelon、いつのまに64bit化していたんだ? というわけでUbuntu 64bit版を導入。

無線がつながらず、往生する。どうやらiwp3945にはバグがあるらしい。iwp3945 iwl3945で検索すると、いっぱいひっかかるんで、それらに書いてある通りiwp3945をブラックリストに乗せて、かわりにiwl3945を導入。

で、全然つながらないじゃん、と思ったら、iwl3945の場合、無線のインジケータが点灯しない模様。それ以外は普通に使えているようだ。

[備忘録] Daredevil skkをUbuntuのxft版Emacsに導入

最初にガイドに従って、apelを入れるんだけど、apelが/usr/local/share/emacs/site-lispの下に、emuが/usr/local/share/emacs/23.0.60/site-lispの下に入ってしまう。で、

shanai@shanai-laptop:~/ddskk-13.1$ make
emacs -batch -q -no-site-file -l SKK-MK -f SKK-MK-compile
Loading /home/shanai/ddskk-13.1/SKK-CFG...
Cannot open load file: install
make: *** [elc] エラー 255

とか、

shanai@shanai-laptop:~/ddskk-13.1$ make
emacs -batch -q -no-site-file -l SKK-MK -f SKK-MK-compile
Loading /home/shanai/ddskk-13.1/SKK-CFG...
Cannot open load file: poe
make: *** [elc] エラー 255

とか、文句を言われてしまう。/usr/share/emacs-snapshot/site-lispの下に、シンボリックリンクを張ってやればok。でddskkをインストールすると、これまた/usr/local/share/emacs/23.0.60/site-lispの下に入ってしまうんで、これも/usr/lshare/emacs-snapshot/site-lispの下にシンボシンクリンクを張っておく。

R61捕獲

いよいよLenovoのページは、R61もワイドばかりになってヤバくなってきたので、秋葉原に行って8943A12を捕獲。SXGA+ 15inchが入って、ニッシンパルで77800円。安いよねぇ。とても見やすいし、明るさも申し分なし。

無線LANのドータカード入れて、メモリもGreen Houseの2GBを2枚で4GB搭載。ここまでは順調。CPUもT8300に入れかえてみたら、立ち上がらず。ダメかなぁ。とりあえずBIOSを最新に上げてリトライの予定。

いやぁ、しかしR61、なかなか好印象。重いとはいえ3kgは切っているし。キーボード打ち易いし。ドライブベイはホットスワップできるようになっているし、多分無いだろうと思っていた無線on/offスイッチもついているし。

猫ページ

猫ページ更新完了。

冬の風物詩

みっちりすりきり一杯


うっとんは、割と余裕。

継承とインナークラスとクラスローダ

なんか、わけ分からないことに巻き込まれた。

まず継承関係のBaseとSubクラス。

abstract public class Base {
    protected void baseMethod() {
        System.err.println("Base.baseMethod()");
    }

    abstract protected void perform();
}
public class Sub extends Base {
    class Foo {
        void foo() {
            baseMethod();
//            Sub.super.baseMethod();
//            Sub.this.baseMethod();
        }
    }

    public void perform() {
        new Foo().foo();
//        baseMethod();
    }
}

ちょっと変わっているのは、SubからはインナクラスであるFoo経由でBaseを呼び出している点。Subだけ、別のクラスローダでロードする。

import java.io.*;

class MyClassLoader extends ClassLoader {
    MyClassLoader(ClassLoader parent) {
        super (parent);
    }

    protected Class findClass(String name) throws ClassNotFoundException {
        File classFile = new File("subclasses/" + name.replace('.', '/') + ".class");
        byte[] buf = new byte[(int)classFile.length()];
        InputStream is = null;
        try {
            is = new BufferedInputStream(new FileInputStream(classFile));
            int offset = 0;
            int readSize = 0;
            while (offset < buf.length) {
                readSize = is.read(buf, offset, buf.length - offset);
                if (readSize == -1)
                    throw new EOFException(classFile.getAbsolutePath());
                offset += readSize;
            }
            return defineClass(name, buf, 0, buf.length);
        }
        catch (IOException ex) {
            throw new ClassNotFoundException(name, ex);
        }
        finally {
            if (is != null) {
                try {is.close();}
                catch (IOException ex) {ex.printStackTrace();}
            }
        }
    }
}

そしてメインクラス。

public class Main {
    public static void main(String[] args) throws Exception {
        ClassLoader cl = new MyClassLoader(Main.class.getClassLoader());
        Class cls = cl.loadClass("Sub");
        Base base = (Base)cls.newInstance();
        base.perform();
    }
}

baseclassesディレクトリとsubclassesディレクトリを用意して、コンパイル。

$ javac -d baseclasses Main.java Base.java MyClassLoader.java
$ javac -d subclasses -cp baseclasses Sub.java

実行。

$ java -cp baseclasses Main
Exception in thread "main" java.lang.IllegalAccessError: tried to access method
Base.baseMethod()V from class Sub$Foo
        at Sub$Foo.foo(Sub.java:4)
        at Sub.perform(Sub.java:11)
        at Main.main(Main.java:6)

妙なのは、Subの書き方を少し変えると大丈夫になる点(コメントで入っている)。インナクラスを使わずに、perform()から直接baseMethod()を呼ぶと、大丈夫。

    public void perform() {
        baseMethod();
    }

インナクラスから、エンクロージングクラスを明示的に指定してsuper指定で呼び出せば大丈夫。

    class Foo {
        void foo() {
            Sub.super.baseMethod();
        }
    }

でも、this指定だとダメ。

    class Foo {
        void foo() {
            Sub.this.baseMethod();
        }
    }

たしかに、これらはバイトコードが変わっていて、ダメな場合は直接baseMethodがinvokestaticされているけど、大丈夫な場合は、access$001()が呼ばれ、そこ経由でbaseMethod()が呼ばれている。限りなくバグっぽいんだけど、これってこういうもんなんだろうか。環境:WindowsXP SP2 Java 1.6.0_04。ちなみに、各クラスのクラスローダを表示してみると、

public class Sub extends Base {
    class Foo {
        void foo() {
System.err.println("Foo :" + this.getClass());
System.err.println("Foo classloader:" + this.getClass().getClassLoader());
...
            Sub.this.baseMethod();
        }
    }

    public void perform() {
System.err.println("Sub :" + this.getClass());
System.err.println("Sub classloader:" + this.getClass().getClassLoader());
    }
}
Sub :class Sub
Sub classloader:MyClassLoader@1a758cb
Foo :class Sub$Foo
Foo classloader:MyClassLoader@1a758cb

同じものが使われている。

Groovyとクラスローダ

ちょっとツールを作る機会があったんで、さっそくプラグインの設定ファイルをGroovyでDSLしてみた。プラグイン読み込み用に、pluginsディレクトリの下のjarをかたっぱしから読み込んで、jarの中から設定を読んで初期化するクラスローダを作ったんだけど、デバッグしていてびっくり。例えば、FieldAnalyzerPluginクラスをロードしようとすると、

java.lang.FieldAnalyzerPlugin
java.io.FieldAnalyzerPlugin
java.net.FieldAnalyzerPlugin
java.util.FieldAnalyzerPlugin
groovy.lang.FieldAnalyzerPlugin
groovy.util.FieldAnalyzerPlugin

を、えんえんとロードしようとするんだね。たしかに、これらのパッケージのクラスは、importしなくても使える仕様になっているんで、クラスローダ部分で解決しているわけだ。これ、パッケージ無しだから、まだいんんだけど、パッケージありのクラスだと、更に激しい。com.ruimo.FieldAnalyzerなんかは、上記に加えて

com$ruimo$FieldAnalyzerPlugin
com.ruimo$FieldAnalyzerPlugin
com.ruimo.FieldAnalyzerPlugin

を試すようだ。この$付きが、何に使用されているのかは、まだ不明。まぁ、一回ロードしてしまえばキャッシュされてしまうんで、パフォーマンス上の大きな問題にはならないようだけど、でも、これって優先順位を考えると、自分が使っているクラスと同じ名前のクラスが、将来java.utilとかに追加されてしまったら、Groovyでは使えなくなっちゃうってことだよね。それは困るなぁ。

P.S. と思ったけど、明示的にimportしていれば、そちらが使われるみたいだ。

GroovyMarkupでハイフン入りの要素を出力。

GantでdjUnitを使おうとしたら、

djunit-coverage-report(serFile: 'jcoverage.ser', srcdir: Path.SRC_DIR,
                       destdir: Path.COVERAGE_REPORT_DIR) {
    classpath(refid: Path.TEST_CLASSES_DIR)
}

ま、当然だけどハイフン入りはダメだ。要は、これは、引数がハッシュとクロージャのメソッド呼び出しなので、以下のようにすれば良いみたいだ。ちょっと不恰好だけど。

Ant.invokeMethod('djunit-coverage-report', [[
    serFile: 'jcoverage.ser', srcdir: Path.SRC_DIR, destdir: Path.COVERAGE_REPORT_DIR], {
        classpath(refid: 'test.classpath')
    }
])

invokeMethodの引数は、メソッド名と、引数オブジェクトなんで、第二引数には、ハチミツとクローバハッシュとクロージャを格納した配列を渡している。2番目のところを[]で、くくってやらないと、なぜかinvokeMethodという名前の要素が出力される(なんで??)。
メソッド名自体は、ハイフン入りでもいいんだね。

プリンタがやばい。

BTR2 ERRORとか出るようになった。どうも定着ローラの修理が必要のようだ。ん〜、定価の高いプリンタだから修理代かかりそうだな。というか、まだ修理できるんか? これ? とはいえ、このプリンタ、捨てるのにも、やたらとお金かかりそうだし。電源入れ直したら、直ったから、しばらくは、だましだまし使うことにしよう。

Jetty

なんかdownloadのリンク先がSourceForgeで、のきなみファイルが消え去っているなと思ったら、どうやらCodehausに引っ越ししたみたいだな。

猫バリケード

猫バリケード完成。って、キミキミ、頭がたかぁい!


とりあえず、これでF1連打でヘルプ連続攻撃とか、PrintScreen連打で、大量のスクリーンショット生成地獄からは開放されそう。でもマウスカーソル追ってるなぁ。バシっとやってくれるなよ。古い方のディスプレイは、既に猫の爪あと入りだ。

Xあがらず

そういえば昨日、なんかアップデートが入ったなと思って、Synapticから履歴を見ると、xserver-xorg-coreとxserver-xorg-devがubuntu 8.1からubuntu 8.3に上がっている。どうも、これがnvidiaのドライバと合わないみたいだ。nvidiaのサイトに行ってみたけど、まだ古いドライバしかないみたい。とりあえず古いxserverを探し中。

Synapticにバージョンの固定というのがあったので、試してみたらubuntu8かubuntu8.3しか選べない。ubuntu8に戻したら、やっぱりだめ。困ったもんだ。

そういえばNVIDIAのドライバをインストールした時、何やらコンパイルしていたなと思い、xserverを8.3にした上で、もう一度NVIDIAのドライバを上書きでインストールしてみたら、直った。やれやれ。

Gantのパス設定

やっぱり、せっかくFileというクラスがあるんだから、パス設定はFileのインスタンスでやるべきな気がしてきた。これならプラットフォームによるパスセパレータの違いとか気にしなくていいしね。幸いAnt呼び出しの時はFileオブジェクトで渡しても大丈夫みたいだ。ただdirディレクトリの下のfileファイルみたいな時に、

File dir = new File('dir')
File file = new File(dir, 'file')

というのは、なんとも煩雑で、イケてない感じだなぁと思ったんだけど、あ、そうか、これはGroovyだった。

File.metaClass.plus = {String child -> new File(delegate, child)}

File dir = new File('dir')
File file = dir + 'file'

println file
$ groovy test.groovy 
dir/file

うん、うまくいった。

Inkscape

なんかパーツのドラッグが、恐しく遅いな。カーソルキーで移動する分には、別に遅く無いんだけど。なんであんなに遅いんだろう。

SunがMySQL買収?

ちょっと意外だ。買ってどうするんだろ。RDBからアプリケーションサーバ、Solarisまでをセットにした、設定簡単なオープンソーススイートを提供とかかな。あ、ちょっと魅力的に思えてきた。

今日はTwitterFoxの調子が悪い。

findbugsのGUIが遅い。

久しぶりにFindBugs-1.3.1を落としてきて、GUIモードで立ち上げようとしたら、えらく遅い。CPUが100%に張り付いている。Java5だと大丈夫でJava6だと遅い。NetBeans profilerで見てみると、sun.awt.shell.Win32ShellFolder2で、やたらと時間をとられている。

で、Bug paradeを見ると、この辺とか、この辺が関係しているみたいだ。どうやらディレクトリを見に行った時、WindowsXPのzipフォルダ機能が働いて、そこにあるzipファイルを展開しようとするので、やたらと遅いらしい。で、デスクトップにあるファイルを掃除するか、

regsvr32 /u %windir%\system32\zipfldr.dll

で、zipフォルダ機能を殺せば、回避できるようだ。

Ubuntuとサウンドカード

結構有名らしいけど、Linuxで複数のサウンドカードをつないでいると、認識の順番がコロコロと変わる。うちのマシンはマザーボードに積まれているやつ、USB Audio(音楽鑑賞用)、USB Midiが認識されていて、/proc/asound/modulesは3つ表示される。

 0 snd_hda_intel
 1 snd_usb_audio
 2 snd_usb_audio

で、この順番がコロコロ変わるのだ。mplayerなどでの演奏なら、番号が変わっても、大した問題ではない。aplay -lでデバイスの名前を見て、

**** ハードウェアデバイス PLAYBACK のリスト ****
カード 0: Intel [HDA Intel], デバイス 0: ALC883 Analog [ALC883 Analog]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
カード 0: Intel [HDA Intel], デバイス 1: ALC883 Digital [ALC883 Digital]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
カード 1: Audio [YAMAHA DP-U50 USB Audio], デバイス 0: USB Audio [USB Audio]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
カード 1: Audio [YAMAHA DP-U50 USB Audio], デバイス 1: USB Audio [USB Audio #1]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0

この"Intel"とか"Audio"という名前を使えば良い。

mplayer -ao alsa:device=hw=Intel no08-1.mp3

問題は、YouTubeみたいにブラウザから直接ストリーミングで再生するようなケースで、これはデバイス番号0決め打ちのようで、設定ができない。で、腰を据えてちょっと調べてみた。

このあたりの情報によると、/etc/modprobe.d/soundにデバイスごとにindexを書いてやれば、その順番に認識されるとある。しかし、今回はusb-audioが2つあって、色々試してみたけど、うまくいかなかった。

そういう場合についてはMultipleUSBAudioDevicesに書いてあった。まずlsusbで、USBの情報を表示する。

Bus 001 Device 006: ID 0424:2228 Standard Microsystems Corp. 
Bus 001 Device 005: ID 0424:2503 Standard Microsystems Corp. 
Bus 001 Device 003: ID 0424:2504 Standard Microsystems Corp. 
Bus 001 Device 001: ID 0000:0000  
Bus 008 Device 003: ID 152d:2338  
Bus 008 Device 001: ID 0000:0000  
Bus 007 Device 001: ID 0000:0000  
Bus 002 Device 002: ID 046d:c51a Logitech, Inc. 
Bus 002 Device 001: ID 0000:0000  
Bus 003 Device 002: ID 0499:3102 Yamaha Corp. 
Bus 003 Device 001: ID 0000:0000  
Bus 005 Device 004: ID 0582:0009 Roland Corp. 
Bus 005 Device 001: ID 0000:0000  
Bus 006 Device 001: ID 0000:0000  
Bus 004 Device 001: ID 0000:0000  

IDの後にあるのが、デバイス識別用のベンダIDと、プロダクトIDだ。YamahaがUSBオーディオで、RolandがMIDIなので、0499:3102, 0582:0009がそれになる。

で、USBのドライバの情報をmodinfo snd-usb-audioで表示すると、

最後の方にパラメータの説明が表示される。

parm:           index:Index value for the USB audio adapter. (array of int)
parm:           id:ID string for the USB audio adapter. (array of charp)
parm:           enable:Enable USB audio adapter. (array of bool)
parm:           vid:Vendor ID for the USB audio device. (array of int)
parm:           pid:Product ID for the USB audio device. (array of int)
parm:           nrpacks:Max. number of packets per URB. (int)
parm:           async_unlink:Use async unlink mode. (bool)
parm:           device_setup:Specific device setup (if needed). (array of int)

これまで見た説明はindexを使用したものだったけど、これ以外にもvidとpidでベンダIDとプロダクトIDを指定できることが分かる。そこで、/etc/modprobe.d/soundを以下のように編集。

options snd_hda_intel index=0
options snd_usb_audio index=1,2 vid=0x0499,0x0582 pid=0x3102,0x0009

めでたく、3つのデバイスが思った通りの順序で認識されるようになった... ように見える。今のところ。しばらくは、これで様子見だな。

エビ飴?

先週、おみやげに、飴をいただいた。

え、えび?? ガクブル

意を決っして食べてみたら、中身は普通のピーナツ味の飴だった。

Magicolor 330

うちにあるプリンタは、昔Unoさんとこで買った、コニカ・ミノルタのMagicolor 330というA3まで印刷できるカラーレーザ。あまりに巨大で、電源上げると部屋の電気が暗くなるのと、両面印字機能が無いのが玉に瑕ではあるけど、当時確か3万くらいで買った(というか譲り受けたような)ものなので、十分過ぎる程、元はとれている。まだ最初に装填したトナーも7割ほど残っているしね。で、日本のサイトにはLinuxドライバがないんで、Ubuntuから使用するのは、あきらめていたんだけど、なんかUSのサイトには、ドライバが置いてあったので、Ubuntu 7.10にインストールしてみた。

サイトにあるのは、ppdファイルで、Ubuntuではシステム->システム管理->プリンタで、新規プリンタを選び、LPD/LPR Host or Printerを選択。IPアドレスを入れて、ドライバにppdファイルmqc330j2.ppdを指定してやるだけで、使えるようになった。

ネットワークプリンタなので、VMWare上のWindowsからも、普通にWindows版のドライバを入れれば利用可能だ。

猫ページ

猫ページ更新完了。

gant Execute.shell

なんでexitValue()を返さないんだろう。これじゃ、起動プロセスが正常に終了したのかどうか分からないじゃないか。

Groovyと定数

gantで設定を外に出すとして、antプロパティも使えるんだけど、やっぱりGroovyで設定した方が柔軟だよねぇ。でもGroovyって定数は定義できないんだろうか。

final I = 10
I = 2
println I
$ groovy test.groovy 
2

groovycでコンパイルしてみると、これってrun()メソッドのローカル変数になっているようだ。考えてみると、finalなローカル変数って、クラスファイル上は情報が残ってなくって、javacレベルでのチェックのみなのか。

クラスにすれば大丈夫みたいだ。

class Path {
    static final TMP = '/tmp'
}

Path.TMP = '/home'
println Path.TMP
$ p:/tmp$test.groovy 
Caught: java.lang.IllegalAccessException: Can not set static final java.lang.Object field Path.TMP to java.lang.String
        at test.run(test.groovy:5)
        at test.main(test.groovy)

クラスにしておいて、importというのが無難かな。

OpenOfficeとuim

OpenOfficeとuimの組み合わせ、漢字入力でハングすることが分かった。でも、デスクトップ(Ubuntu 7.10 64bit)では、ちゃんと動いているんだよね。Ubuntu 7.10 32bitの方だけダメみたいだ。

で、困ったなと思って、アプリケーションの追加と削除のところを、つらつらと見ていたら、IncscapeInkscapeというのが目にとまったので、導入してみる。

え? 何、これ、すごくいいね。びっくり。MS Officeとのファイル互換性にこだわらなければ、実は、結構いいソフトがあるのかな。ヘルプも、すごく充実してるし。しばらくはドロー系は、これで行ってみようかな。難点はPDF出力が無いことくらいか。

P.S. と思ったら、PDFも可能のようだ。

Connection.isValid()

Java 6から追加された、Connection.isValid(int)。これでStale状態になったConnectionに対してrollback()とか発行してエラーになるのを防げるので、歓迎なんだけど、

SQLException - if the value supplied for timeout is less then 0

いや、そういうプログラミングエラーは、IllegalArgumentExceptionでしょ。なんでチェック例外にするんだよ。また余計なtry-catch書かなきゃならないじゃん。もう。

%sの幅指定に0は許されない。

階層構造を表示する時、インデントを付けたい時に、今までは、

void print(Node node, int indent) {
    StringBuffer buf = new StringBuffer();
    for (int i = 0; i < indent; ++i)
        buf.append(' ');
    System.err.println
        (buf.toString() + node);
...
}

みたいなことをして、空白文字を連ねて作っていたのだけど、そういえば、printf()があったなぁと思って、

    System.err.printf
        ("%" + indent + "%s%s%n", "", node);

としたら、

Exception in thread "main" java.util.FormatFlagsConversionMismatchException: Conversion = s, Flags = 0
	at java.util.Formatter$FormatSpecifier.failMismatch(Formatter.java:3988)
	at java.util.Formatter$FormatSpecifier.checkBadFlags(Formatter.java:2904)

0は許されないみたいだ。惜しい。

Daredevil SKKとインクリメンタルサーチ

今頃気付いたけど、Daredevil SKK使っていると日本語のインクリメンタルサーチがうまく動かないことに気付いた。う〜む、古いのに戻そうかな。

NetBeansのJSPエディタ

おぉ、HTMLレベルの文法までチェックしてくるのか。

ここまでチェックしてくれるなら、JSPもいいかもな、とも思ったり。

NetBeans6のGlassfishコンソール

どうも、無用に改行が入るみたいだ。

long start = System.currentTimeMillis();
...
System.err.printf
    ("Elapsed %d ms.%n",
     System.currentTimeMillis() - start);

とすると、

Elapsed 
1
 ms.

みたいになる。ためしに、

    System.err.print("Hello");
    System.err.print("World");

とすると、

Hello
World

あぁ、やっぱり改行が入りますな。

RMI

確か、最近はrmicいらなくなったんだよねってことで試すも、Stubが見つからないというエラーで悩む。と思ったら、こんなところに書いてあった。

The static method UnicastRemoteObject.exportObject(Remote) is declared to return java.rmi.server.RemoteStub and therefore cannot be used to export a remote object to use a dynamically generated stub class for its stub. An instance of a dynamically generated stub class is a java.lang.reflect.Proxy instance which is not assignable to RemoteStub.

Stubをダイナミックに作りたい時は、exportObject(Remote)じゃだめよってことらしい。で、正解はexportObject(Remote, 0)のようだ。そういうことは、ちゃんとAPI仕様書に書いておいて欲しいなぁ。

Hypertext Transfer Protocol^2

HTTPプロトコルって結構見つかるね。確かに、なんとなくゴロがいいから、つい口に出てしまいそうだ。ftpプロトコルも負けてない。

Servlet復習

う〜む、NetBeans 6でサーブレット作ると、雛形ではHttpResponse.getWriter()でとったHttpResponseを最後にclose()するんだけど、これってclose()するもんだっけ。

PrintWriter out = response.getWriter();
try {
    out.println("<html>");
    out.println("<head>");
    out.println("<title>Servlet HelloServlet</title>");  
    out.println("</head>");
    out.println("<body>");
    out.println("<h1>Servlet HelloServlet at " + request.getContextPath () + "</h1>");
    out.println("</body>");
    out.println("</html>");
} finally { 
    out.close();
}

というか、あれだ、API仕様書に、どうすべきか明確に書いてないのが悪いんだよな。「flush()するとコミットされますよ」としか書いてない。でも裏を読めばclose()はいらないともとれるか。なんとなくgetXXX()でとったものを、close()するのは抵抗あるんだけど。逆にopenXXX()でとったものはclose()が必要に感じる。

P.S. と思ったけど、java.sql.Connection()は、getConnection()したものをclose()するか。ストリーム系も、基本的にnewしたものをclose()だし、Javaだと、むしろopen() - close()ってパターンは少ないかも。

android

毎回emulatorを立ち上げ直していて「遅いな〜」とか言ってましたよ。プログラム修正した時は、emulator上げっぱなしで、いいのね。なんかlandscapeモードだと、ボタン押しても反応しなかったりすることが多いようだけど、Linux版だけかな。

SQLiteがプラットフォームに組み込みで、RDB前提にしていいのは助かるけど、しかしまぁDBアクセスもJDBCじゃない独自の方法を使うんだね。なんで、ここまで独自にしちまったんだろうか。Symbianとかのプログラミングモデルが、こんな感じで、真似をしたとかなのかな。

携帯端末用だけど、@Overrideとかジェネリクスが普通に使えるのは、なんだか妙な感じで落ち着かない ^^; (いや、もちろん使えた方がいいに決まってるんだけど)。

JDBC4

あれ? BaseQueryって、Java 6には間に合わなかったの? タイプセーフ クエリが無いと、魅力半減だね。

preferredSize

JavaFXでのpreferredSizeの指定はDimensionだから、こうかと思ったら、

    preferredSize: Dimension {width:100, height:20}

Dimensionは省略して書くようだ。

    preferredSize: {width:100, height:20}

なんでだ〜。こういう暗黙のルールは、どこに書いてあるんだろう。

JavaFX

なんかEclipse用のプラグインだと動かないな。Eclipse 3.3だとダメなんだろうか。とりあえずNetBeans 6では問題無く動いた。{...}で、インスタンスのnewと、プロパティ設定をまとめてやるという構文は面白いね。jaxbと組み合わせれて、XHTMLのレンダリングとかさせると、すっきり書けそうな気がする。って、クライアントサイド用の技術でしたな。ただ、for文の

for (i in [0..10], j in [0..10]) {
  // 二重ループ
}

for (i in [0..10] where i % 2 == 0) {
  // 偶数の時だけ
}

みたいなのは、個人的には、気持わるいっす。

まぁ、肝は、モバイルからPCの環境まで、スペックの違いをいかにスクリプト言語で吸収できるかってところなんだろうな。

久しぶりにAppletを復習したり。

一時はOBJECTタグの使用が推奨されていたと思うんだけど(ブラウザ組込みの古いJavaが起動しないように)、知らないうちに、またAPPLETタグが推奨になっていたり。

しかしLinux版のfirefoxは、ちょっとAPPLETタグの設定にミスがあるとブラウザごとハングするのが手に負えない。そういえばLinux版ってJava console無いんだろうか。

APPLETタグのcode属性に何を設定すべきかで、悩む。ここには、

This attribute specifies either the name of the class file that contains the applet's compiled applet subclass or the path to get the class, including the class file itself. It is interpreted with respect to the applet's codebase. One of code or object must be present.

と書いてあるから「クラスファイル名か、クラスファイルへのパス」らしいんだけど、なんだか意味不明な表現だよね。「クラス名か、クラスファイルへのパス」なら分かるんだけどさ。で、firefoxでは、"package/Sample.class"と書いても、"package.Sample"と書いても大丈夫みたいだ。まぁ仕様書の方を尊重して"package/Sample.class"にしておくか。

ねこ鍋

これまで使っていた鍋のヒビが、かなり進行してきたので買い替え。で、試しにストーブ前に設置してみた。

キター! こいつは春から縁起がいいね。

ちょっと窮屈そう?

君は使い方違うから。いやまぁ、それを言ったら、どれも間違ってるわけだが。

あけましておめでとうございます

今年は、がんばってGIMPで作ってみた。

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