netail.net
自作フリーソフトや,ゲームに関する雑記を公開してます.
日記はソフトウェア工学の論文ネタが中心です.
最近のお知らせ (古いものはこちら)
2003-01-07 古い日記からの変換データ [長年日記] ▲
_ AspectJ ▲
Ivan Kiselev: "Aspect-Oriented Programming with AspectJ",Sams Publishing の内容のうち,アスペクトの分類の話をコンテンツとして追加.サンプルコードがたくさん載ってて読みやすい本だなーというのが印象.
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-04 古い日記からの変換データ [長年日記] ▲
_ LaTeX ▲
Windows で LaTeX コンパイルしようとして,jtygm.sty とかいうのがないと言って怒られたので,google で探してどこかから拾ってきた.jtygm.sty.txt
フォントの対応付けとかをするものらしい./usr/local/share/texmf/ptex/platex/base に置いてみたら読み込まれた.……このやりかたも含めて誰かの日記に書いてあったのだが,URL を忘れてしまった.
2003-01-03 古い日記からの変換データ [長年日記] ▲
2003-01-01 古い日記からの変換データ [長年日記] ▲
2002-12-30 古い日記からの変換データ [長年日記] ▲
_ 論文 ▲
さっきの論文に関するメモの続き.久しぶりに長い.
アスペクトの結合演算は,Seq, Any, Fst, Cond の4つ.Seq はAspect1 を実行した後に2を実行する.Any はどちでも好きな順序で実行する.Fst は,1,2 の順に実行するが,もし isCrosscutting がセットされたらそこで終了する.たとえば,new Fst( 懸賞当たったら無料アスペクト, 安売りキャンペーンアスペクト );のように左側のアスペクトが効果を発揮したら後者の意味がなくなるような場合に使う.逆に,左側が作動しない限り右側が動作しない Cond というのもある.new Cond( すべての学生に必要なデータ加工, 大学院生専用の追加事項出力 );
pointcut の指定については,regular crosscuts というものを以下の論文で提案しているらしい.F. Douence, P. Fradet, M. Sudholt:``A framework for the detection and resolution of aspect interactions'', Proceedings of the 27th ACM SIGPLAN/SIGSOFT Conference on Generative Programming and Component Engineering (GPCE), October (2002).今度チェックしてみよう.
_ 論文 ▲
実家に帰る途中,新幹線の中,暇なので論文読み.
Remi Douence, Mario Sudholt:``A model and a tool for Event-based Aspect-Oriented Programming (EAOP)''
アスペクト指向プログラミングを,「イベント」を join points として実現しようというもの.実行モニタが,メソッドとコンストラクタの呼び出し・リターンのようなイベントに対して Event オブジェクトを生成し,アスペクトに渡す.(このイベント処理自体はプリプロセッサによって生成される)マルチスレッドに対しては(今のところは)synchronized で対処している様子.
アスペクトは,そのイベントが自分に関係のあるものかどうかを調べ,関係があるなら動作する.この筆者らの実装では,Aspect クラスを継承し,definition メソッドを記述.nextEvent() 呼び出しによって次のイベントを取得する(次のイベントが来るまで nextEvent は実行がブロックされる).event.skip = true; として本来のメソッド呼び出しを飛ばしたりもできるらしい.
アスペクト間の関係,再帰呼び出しについては,アスペクトの中でthis.isRunning = true; とセットすることによってそのアスペクトが起動中であることを示し,再帰呼び出しを防止することができる.
また,アスペクトの設定は,monitor.aspects = new SomeAspect();のように実行時に行うが,ここでaspects = new Seq(new Aspect1(), new Aspect2()); のようにアスペクト間の結合演算を行うオブジェクトを使用できる.動的に結合できるところがえらい.