netail.net
自作フリーソフトや,ゲームに関する雑記を公開してます.
日記はソフトウェア工学の論文ネタが中心です.
最近のお知らせ (古いものはこちら)
2003-08-12 古い日記からの変換データ [長年日記] ▲
_ AspectJ ▲
AspectJ-Users ML で,"Any useful examples" というSubject で,Kenworthy, Edward がロギング以外に,AOP でないとできないことはないのだろうか?他のものは,デザインパターンなど,他の技術でもできるような気がする.とかいう感じの投稿をしていた.
「AOPでなければならない」ことというのは難しいと思うのだが.計算可能性という意味では同じなわけだし.
でも,これに対して,使い方の例として,R. Dale Asberry が,プロパティのデフォルト値を設定するのに使っている.before(call(System.getProperty()))をトラップして,もしプロパティが設定されていなければ他のプロパティの値を読み込んだり特定の値をセットしたりして,コンソールに「プロパティの値が設定されていないのでxxxにするよ」と出力する,なんて使い方もできるよーと投稿してた.Property Manager を作ると無駄に依存関係が出てしまう,プロパティの値はデフォルト値を初期化できるタイミングが違うことがあってコードが分散してしまうことがあるが,それを防げる,とか言っていた.
これはこれで,面白い使い方かも.
_ Java ▲
さらにメモ.
(6) JDK 1.2 では,Exception.printStackTrace() の結果は implementation depends である.Java VM の改造以外の方法で,正確な例外発生場所を知ることはできない?……とか言ってたら,スタックトレースがオブジェクトとしてアクセスできるよういなったので,今ならたいていは情報を持っていると考えても良さそうではある.
(7) Java Virtual Machine Profiler Interface (JVMPI) のソースは Visual Studio 6.0 では nmake all でコンパイルできる(環境変数の設定が必須).生成されたjdk/bin ディレクトリに配置しておく必要がある.-Xrunhoge (hoge.dll の場合)オプションをつける.
_ Java ▲
さらにメモを移動.今度は I/O 関連.
(3) BufferedInputStream は,読み込み途中でデータが途切れた場合, in.read(buf, 0, size) で size 分を完全には読み込まないことがある.in.readFully を使うか, in.read(..) の戻り値を使ったほうが安全.
(4) finalize() は終了処理を記述する場所ではない.GC から呼ばれた場合の処理を書く場所.ファイルをフラッシュして閉じる処理などは,Runnable.run() で flush, close を行うようなオブジェクトを用意しておいて,Runtime.getRuntime().addShutdownHook を使う.
(5) 純粋なテキスト入出力処理だけでは,PrintStream での print, println 呼び出しは例外処理を行っている分遅い.ObjectOutputStream の writeObject もわりと遅い.手動で char から byte へのキャストを行ってwrite(buf, 0, len) で書き込んだほうが高速になる.BufferedOutputStream のバッファサイズは 64K くらいまで.
_ Java ▲
古いメモファイルを発見したのでこっちに移動.
(1) javax.swing 系コンストラクタは L&F (Look and Feel) File Loading Thread で動作する.
(2) Class.getName(), Thread.currentThread() は native call を含むため,呼び出しコストが大きい.Class.getName() については,HashMap.put(obj, obj.getClass().getName()) などのように結果をキャッシュして高速化できる場合がある.Thread については,なるべく使わないようにするしかない.