netail.net
自作フリーソフトや,ゲームに関する雑記を公開してます.
日記はソフトウェア工学の論文ネタが中心です.
最近のお知らせ (古いものはこちら)
2003-01-01 古い日記からの変換データ [長年日記] ▲
2003-01-03 古い日記からの変換データ [長年日記] ▲
2003-01-04 古い日記からの変換データ [長年日記] ▲
_ LaTeX ▲
Windows で LaTeX コンパイルしようとして,jtygm.sty とかいうのがないと言って怒られたので,google で探してどこかから拾ってきた.jtygm.sty.txt
フォントの対応付けとかをするものらしい./usr/local/share/texmf/ptex/platex/base に置いてみたら読み込まれた.……このやりかたも含めて誰かの日記に書いてあったのだが,URL を忘れてしまった.
2003-01-06 古い日記からの変換データ [長年日記] ▲
_ 論文 ▲
Coordination aspect というのがあるらしい,と言われて渡された資料を読んでみる. Demter/J の人たちがやっている仕事で,COOL: COOrdination Langugage というJava のスレッド同期処理を記述する言語を作ったらしい. たとえば以下のようなコードになる.
coordinator BoundedBuffer /* クラス名と同じ */ { // selfex は,それぞれ,あるスレッドが独占する // 異なるスレッドが実行することはありうる selfex {put, take} // mutex は,あるスレッドがアクセスしている間, // その組にあるメソッドの呼び出しはブロックされる. mutex {put, take}; // put メソッドの終了時に実行される処理を記述 // (@ @) の中に,Java コードが入る put requires (@ !full @) { on exit (@ empty = false; if (usedSlots == array.length) full = true; @) }
こういう記述を与えると,weaver はクラスに synchronized や
while (条件) { try { wait(); } catch (InterruptedException e) {} }
といった記述を追加したコードを生成する. Coordination aspect で検索するとヒットしてくる ppt にけっこう丁寧なサンプルコードが載ってたので,これ以上は省略.
_ 論文 ▲
久しぶりに論文読み.アスペクト干渉の検出と解決問題.
F. Douence, P. Fradet, M. Sudholt:``A framework for the detection and resolution of aspect interactions'', Proceedings of the 27th ACM SIGPLAN/SIGSOFT Conferenceon Generative Programming and Component Engineering (GPCE), October (2002).
形式的検証してるのでいまいちよく分からない.やっぱりここまでするのね,というところ.この辺の検証する人たち,実際にどういうものが検証できるのかを目に見える具体例で用意してくれないので論文がすごく読みにくい気がする.検証系の実用性に関しても何も説明がないのが悲しいところ.一般のコンパイラなどにその成果が反映されるにはまだまだ時間がかかるのだろうか.
_ 電子署名 ▲
電子署名の付けかたについて調べてたら,AL-Mail 用では PGP と連携する簡易メールエディタがあるらしい.http://hp.vector.co.jp/authors/VA007478/almail/kmwrite/kmwrite.html
_ Java ▲
先に書いたコードのように,Exception.getCause や .printStackTrace をいじった Exception オブジェクトをネットワーク上で動作するアプリケーションで投げると色々と攻撃ができそうな気がするのだが…….やっぱりその辺は SecurityManager でカバーするんだろうか.
_ Java ▲
思いつきで例外を悪用したコードを書いてみた. EvaluableAsInt は int getInt() を実装していること.getInt() は成功したか失敗したかを throw する.
void evalSquareRoot(EvaluableAsInt o) { try { o.getInt(); assert(false, "this statement never executed"); } catch (IntResult e) { if (e.getValue() > 0) { throw new FloatResult(sqrt(e.getValue())); } else { throw new IllegalArgumentException(e); } } catch (FunctionFailure failure) { throw failure; } }
使う側はこんな感じ.getMessage をオーバーライドしてる時点でけっこう邪悪.
public static void main() { hoge = new Hoge(100); try { evalSquareRoot(hoge); } catch (FloatResult f) { throw new Exception () { public String getMessage() { return f.getValue().toString(); } } } catch (FunctionFailure f) { throw new RuntimeException(f); } throw new Error(); // ここには来ないはずだが }
chained exception や setStackTrace を使えばさらに怪しいコードが書けそうな予感.
2003-01-07 古い日記からの変換データ [長年日記] ▲
_ AspectJ ▲
Ivan Kiselev: "Aspect-Oriented Programming with AspectJ",Sams Publishing の内容のうち,アスペクトの分類の話をコンテンツとして追加.サンプルコードがたくさん載ってて読みやすい本だなーというのが印象.
2003-01-08 古い日記からの変換データ [長年日記] ▲
2003-01-10 古い日記からの変換データ [長年日記] ▲
_ Ruby ▲
Ruby用の XML Pull Parser を探していたら,REXML が知らない間に XML Pull Parser も実装していたらしい.
REXML は最初のリリース以来(最初はバグだらけだったが)その使いやすさに惹かれて愛用しているが,気づいたら Ruby の中ではほぼ標準の XML パーサ.すごいなぁ.
2003-01-12 古い日記からの変換データ [長年日記] ▲
2003-01-13 古い日記からの変換データ [長年日記] ▲
2003-01-14 古い日記からの変換データ [長年日記] ▲
2003-01-16 古い日記からの変換データ [長年日記] ▲
2003-01-18 古い日記からの変換データ [長年日記] ▲
2003-01-19 古い日記からの変換データ [長年日記] ▲
2003-01-20 古い日記からの変換データ [長年日記] ▲
_ Java ▲
java.util.SortedMap で失敗.a.compareTo(b) で比較してから最後に a.equlas(b) するものだと思ってたら,a.equals(b) == (a.compareTo(b)==0) でないといけなかった.比較してから最後にequalsするのは Hash の実装のほうで,そちらと勘違いしていたらしい.一貫性のない SortedMap の動作は保証されないので,結果としてコレクションに投入した compareTo が 0 だけれどequals でないようなオブジェクトがどんどん消されて,あやしげな動作となっていた.
2003-01-21 古い日記からの変換データ [長年日記] ▲
2003-01-22 古い日記からの変換データ [長年日記] ▲
_ SVG ▲
グラフ表現が JPEG では重いので SVG にしてみた.表示ツールとしては,Adobe SVG Viewer + IE と batik SVG browser を試してみた.SVG を拡大・縮小はできてもパン(スクロール)させて見ることができないなーと思っていたら,IE 上では ALT キーを押しながら,batik では SHIFT 押しながらのマウスのドラッグで行けた.マニュアル見ない限り分からないって.
メモリ使用量はJPEG版で100MBちょっとくらいのものがbatik SVG browser では60MB程度,IEでは20MB弱まで抑えることに成功.
batik の SVG browser は java -jar batik-squiggle.jar で起動できるシンプルなツールの様子.さすがに Adobe SVG Viewer のほうがよかった.ALT + ドラッグで移動,CTRL + クリックで拡大,CTRL+SHIFT+クリックで縮小表示らしい.けっこう再描画も高速だし,いい感じ.
2003-01-23 古い日記からの変換データ [長年日記] ▲
_ Java ▲
Effective Java を読んでいて,java.util.LinkedHashMap などという知らないクラスの名前が出ていたので調べてみた.JDK 1.4 でちょっとだけ増えてたクラスたちだが,IdentityHashMap: Keyがequalsではなく == で比較されるHashMap.地味に static int System.identityHashCode(Object),つまり Object.hashCode の実装で計算されるオブジェクトのハッシュコードを返す関数を使って実装されているらしい.こんなメソッド,普通は存在を知らないって.
WeakIdentityHashMap はさすがにないようなので,弱参照を使いたい人は,素直にキーオブジェクトのequals(Object) を a==b で実装するほうがいいらしい.
LinkedHashMap: エントリが配列ではなく,二重の Linked List で実装されているらしい.マップのエントリが挿入順で保存されるので,コピーしたときなどに順序が予測可能(元と同じ)という利点があるそうな.LinkedHashSet: LinkedHashMapのSet版.
まだまだ Java には知らないライブラリがたくさんあるのだろうか…….