netail.net
自作フリーソフトや,ゲームに関する雑記を公開してます.
日記はソフトウェア工学の論文ネタが中心です.
最近のお知らせ (古いものはこちら)
2004-10-05 古い日記からの変換データ [長年日記] ▲
_ [Java]J2SE 5.0 (JDK1.5) ▲
J2SE 5.0 をインストールしてみた.今までは C:/ 直下にディレクトリを作っていたのに,なんと Program Files 以下にインストールされる.とても大きな進化.
_ [論文]アーキテクチャレベルでの情報可視化 ▲
Mohlalefi Sefika, Aamod Sane and Roy H. Campbell:Architecture-Oriented Visualization.Proceedings of OOPSLA96, pp.389-405, CA, USA.
情報をまとめて抽象化して提示するのが大事ですよと主張する論文.メソッド単位,クラス単位ではなくサブシステム単位などで情報を集計した結果を出すためにInstrument という名前の観測ツールをCompositeパターンで合成して使うらしい.どのクラスがどのサブシステムに対応するかは開発者が与えないといけないので手間はそれなりにかかる.
_ [論文]オブジェクトの探索 ▲
Raimondas Lencevicius, Urs Holzle, Ambuj K. Singh:Query-Based Debugging of Object-Oriented Programs.Proceedings of OOPSLA97, pp.304-317, Atlanta, GA, USA.(注: Holzle の o はウムラウトつき)
デバッグ時にオブジェクトの情報を参照したいけど普通のデバッガだと特定のインスタンスしか見れないのでクエリーにマッチするようなオブジェクトのペア(というかtuple)を取り出してきましょうという話.
クエリーかけるのに a == b かどうかの判定ができないといけないとか,属性(フィールド)の参照に副作用があってはいけないとかいう条件は付くが,(a include b) and (c include b) and (a != c) のようにしてオブジェクト b を共有しているオブジェクト a, c のペアを見つけるとか,何か色々な使い方はできる,ということらしい.筆者たちの実装では,オブジェクト集合から該当オブジェクトを探すパフォーマンスもそれほど悪くない(1秒程度で結果が表示され始める)らしい.
いつクエリーを実行して,どうデバッグに使えるのかというところについての言及はあまりなかったりするが…….条件付ブレークポイントに比べてどのくらい便利なのか?というのがいまいち見えてこなかったりする.「あるクエリーにマッチするオブジェクトのメソッドが呼ばれたなら……」という条件付ブレークポイントなんかを作れば便利?
_ [work]動的解析の高速化 ▲
プロファイル結果→イベント列→集計情報→頂点集約→DOTという段階を踏んで処理を進めていくと,各頂点が集約対象かチェック→頂点に接続した辺を操作という処理が O(V*E): Vは頂点数,Eは辺数となってしまって遅くてたまらないことが判明.(辺のつなぎ替えが集合の操作なので実はさらに遅い…)
除去されることになる頂点については,それぞれ source(V) = {V に到達する依存関係の発生頂点の集合}という集合を記憶しておいて,{除去される頂点 V → 除去されない頂点 v }の依存関係が発生したらsource(V) の各頂点 → v の辺を生成するようにした.
こうすると,ログのサイズ n に比例する時間で処理が進むのでだいぶ高速になった.集合の管理の手間があるので,厳密に O(n) とは限らないが.
とはいえ,AspectJ のコードだと,AspectJ がいっぱい依存関係を追加で生成しているようでデータ依存関係が分かりやすいとは到底いえないみたい.
2004-10-04 古い日記からの変換データ [長年日記] ▲
_ [論文][work]モデルベースでのアスペクトの競合の検出 ▲
Francis Tessier, Mourad Badri, Linda Badri:A Model-Based Detection of Conflicts BetweenCrosscutting Concerns: Towards a Formal Approach.Workshop on Aspect-Oriented Software Development 2004.
アスペクトの導入が問題を起こさないかどうか(アスペクト同士が競合しないかどうかなど)を早い段階で(モデルを作ったあたりで)検出しましょう,というもの.
基本的なアイディアとして,アスペクト同士が・同じクラスに作用するが Join Point が異なる→OK・同じクラス,同じ Join Point に作用する→危険 -- アドバイスのタイプ(before/after)が同じ場合は高リスク -- 引数が同じ場合もリスクがある・異なるクラスにしか作用しない,共通部分がない →OKといった感じの分類をして,警告を出しましょうというもの.
この情報は静的解析なので,これをベースに動的解析したりとか,他の手法と組み合わせることも考えているよう.
アプローチとしてはそれなりに単純で分かりやすい.もしソースコード上から解析するのであれば静的に Join Point の共通部分とかをテストするのが(Cflow などを含む場合は)難しそうな気はするが.
モデル記述でテストする場合,モデルの記述に必要なコストがそれなりに低くてモデルとコードの対応付けがきちんとできるのならそれなりに有用そうではある.
ただ,「競合してるかもー」と警告を出すのは簡単だけど,開発者がシステム全体で一貫した解決方法を使っているかとか,その解決方法が正しそうかどうかとかをいかに確認するかも問題になってくるだろうから,その辺で議論できたら面白そう.
_ [論文]合成可能なメタオブジェクトの記述 ▲
Philippe Mulet, Jacques Malenfant, Pierre Cointe: Towards a Methodology for Explicit Composition of Metaobjects.Proceedings of the 10th annual Conference on Object-Oriented Programming Systems, Languages, and Applications(OOPSLA95), pp.316-330, Austin, Texas, United States, 1995.
メタオブジェクトを複数使う場合の問題を解決しましょうという論文.複数のメタオブジェクトは,順番に連結されるものとすると,Trace→Delegate→(Basic) というように順番が決まる.
メソッドの呼び出し・実行を Lookup + Apply ととらえて,メタオブジェクトはそれぞれ自分の Lookup を実装するが,このときに連結先のメタオブジェクトの Lookup を利用して,Lookup 処理や,追加の処理(Delegationなど)を実装する.
メタオブジェクト間の関係の取り扱いにはSpecialization と Aggreagation の二つを考えていて,親メタオブジェクトの Self 参照が自分自身を指すか親メタオブジェクトを指すかを選択する.
Lookup が起きると,連結されたメタオブジェクトの中でメッセージを読み替えや Lookup の連鎖などが起こって,最終的に実際のオブジェクトの動作が決まる.
このアプローチでは,メタオブジェクトは,自分自身が,連結相手に対してどのように振舞うかを記述する.汎用的な Mix-in が書ける人ならちゃんと書けそう.Composition Filter では結合演算自体は外部で定義されて通常はフィルタ生成順序などで implicit に扱われる点が異なる.
2004-10-02 古い日記からの変換データ [長年日記] ▲
2004-10-01 古い日記からの変換データ [長年日記] ▲
_ [work]動的解析のスケーラビリティ ▲
AspectJ プログラムの実行時情報を集計するツールを再構築中.Ruby スクリプトでプロファイル結果→イベント列→集計情報→頂点集約→DOTという段階を踏んで Strategy パターンを適用していくインフラっぽいスクリプトを構築してみた.
生成された DOT ファイルを Graphviz のコマンドでコンパイルするところまでは自動化.コマンドは次の通り.
dot -Tsvg -o outputfile inputfileで,とりあえずメソッド呼び出し関係とメソッド間のデータ依存関係(1個以上の引数を渡しているメソッド呼び出し,void 以外の戻り値,フィールド経由のデータ依存関係)を抽出するするスクリプトを作って動かしてみた.
800行のコードの実行履歴が4MB程度で,データ依存関係は10万くらいの辺数.さすが生データというべきか.効率の良いフィルタを作らないことには何とも使い物にならない.動的スライスの実装とかしている人たちはどうやって実装してたのだろう…….
2004-09-30 古い日記からの変換データ [長年日記] ▲
_ [hyCalendar] 追加機能 ▲
hyCalendar に対する機能提案をいただいた. 1. 月をまたがっても連続して変化していくようなカレンダー表示 特定日を中心に前後1ヶ月のような表示方法.月単位でタブ表示をしているのだが,各タブごとに「表示基準日」を持っているので,うまく新しいタブを生成する方向に持っていけば作れなくはなさそう.本当はスクロールバーやボタンなど,ちょっとした動作でカレンダーが一週間単位でずれる,というのが理想だったりするのだが. 2. 検索ボタンでの前へ移動 実は「次へ移動」しかサポートしてなかったりするので,これは素直に対応したほうがよさそう.ツールバー的にも,前に戻るボタンを付けるだけでいけるので簡単. 3. 期間予定のカレンダーの何日後・何日前が欲しい 開始日を基点に,n 日間 (0日なら当日終わり,負なら過去)で情報を設定する方法.これはユーザインタフェース的には簡単だし妥当な設定.GUIのコンポーネント配置的にも何とかなりそうなので対応してよさそう. 4. フリーメモのポップアップ若しくは表示・非表示 とりあえずフリーメモエリアを消せるようにはなったのだが,別ウィンドウとしての表示(あるいはショートカットでの切り替え)というのには対応してない.テキストの同期が面倒だから.フリーメモの表示・非表示切り替えにショートカットキーでも割り当てておこうか.とりあえず優先度は高くない. 5. 期間予定のカレンダー・表示セレクトカレンダーを月曜スタートに. 日付入力欄が表示するミニカレンダーは,日曜開始で固定されている.月曜開始オプションを有効にしたときは月曜始まりで表示したい,というもの.プロパティがないので無理かなーと思っていたら, http://www.sugi-family.net/papanvb/vbnet_tips.asp?cate=23&tips=23001に方法が書いてあった. DropDown イベント時にカレンダーが生成されるので,DTM_GETMONTHCAL メッセージでカレンダーオブジェクトのハンドルを奪ってきて,MCM_SETFIRSTDAYOFWEEK メッセージで開始日付をセットできる. VB用のものをDelphiに書き換えると次のような感じ.procedure TForm1.DateTimePicker1DropDown (Sender: TObject); var handle: THandle; begin handle := DateTimePicker1. Perform(DTM_GETMONTHCAL, 0, 0); if not (handle = 0) then begin // 火曜日始まりにする例 SendMessage(handle, MCM_SETFIRSTDAYOFWEEK, 0, 1); end; end;
2004-09-28 古い日記からの変換データ [長年日記] ▲
_ [論文] Before/After の合成 ▲
Ira R. Forman, Scott Danforth, Hari Madduri:Composition of Before/After Metaclasses in SOM.Proceedings of OOPSLA 94, pp.427-439, Portland, Oregon, USA, 1994.
Before/After メソッド(AspectJでいう before/after advice)を複数同じクラスにくっつける場合にはどうしたらよいか,というので・メタクラス2個を順序付きで合成したメタクラスを作って, それをインスタンス化したクラスを作る・合成したいメタクラスを個別にインスタンス化した クラスを作って,それらのクラスを多重継承・一方のメタクラスをインスタンス化したクラスを継承して クラスを作り,そのクラスにもう一方のメタクラスをくっつけるという手法があるが,メタクラス2個を順序付きで合成したメタクラスを作るという方法が,関係が明示的で良い,というふうに言っている.
ただ,3個以上のメタクラスを合成するときの結合規則の問題(A(BC)と(AB)Cが等しい振る舞いをする)や,他にどのメタクラスがかかわっているか分からないのでC=AB, D=BA といったメタクラスがあるときにE=CD を作って貼り付けると ABBA と同じメソッドが2回ずつ動いてしまったりする問題がある.また,read-onlyなメソッドに対してのみ動きたいとか,条件付きのメタクラスも存在する上,本来動くべきメソッドを動かしたくないメタクラスも扱っていく必要がある.
クラスが名詞ならメタクラスは形容詞に相当する,とかいう言い方をしているのは面白いところだけど.