«前の日(08-11) 最新 次の日(08-13)» 追記

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 については,なるべく使わないようにするしかない.

_ バージョン

Windows 2000 のシステムCD内にあるsupport/apcompat.exe でプログラム名 + OS を選択するとOSのバージョン情報をごまかせるらしいと聞いて,昔々のプログラムを実験的に動かしてみたが,やっぱり動かなかった.さらに,Win32s など一部の非互換APIを使っていると異常終了するらしい.

_ アルゴリズム

旅行から帰ってきて,部屋の片づけをしていたら,擬似一様乱数を発生させるためのアルゴリズムのメモを発見.紙のメモのほうは捨ててしまうことにする.
  x[0] = 適当な初期値
  x[n] = (A * x[n-1] + C) mod M
  M = 2^N, A MOD 8 = 5, C MOD 2 = 1 のとき一様乱数となる。 
  ex. A = 109, C = 1021, M = 32768

2006-08-12

_ [VolumeDeskbar][お知らせ] VolumeDeskbar 1.0.11 リリース

「1回クリックだけでは音量を変更しない」オプションが,別ウィンドウからフォーカス移動してきたときに働いてくれない問題を修正しました.それから,縦方向にツールバーを表示しているときのポップアップ文字列の表示位置を,ツールバーと重ならないように移動しました.

音量が変わってしまう原因は,ウィンドウのフォーカス移動時など特定のマウス操作において,マウスボタン押下のMouseDownメッセージの直後になぜかカーソル移動のMouseMoveメッセージが発生するためでした.それに対して,座標が変化していないMouseMoveメッセージを無視することで対応しています.