netail.net
自作フリーソフトや,ゲームに関する雑記を公開してます.
日記はソフトウェア工学の論文ネタが中心です.
最近のお知らせ (古いものはこちら)
2004-12-05 古い日記からの変換データ [長年日記] ▲
2004-12-06 古い日記からの変換データ [長年日記] ▲
_ [Java] Subversion ディレクトリ ▲
Eclipse でソースをコンパイルするとき,Build Path の Exclude の中に **/.svn/* を入れておかないと.svn ディレクトリの構造が丸ごとコピーされて,bin ディレクトリ以下が Subversion 管理下にあるとTortoiseSVN に勘違いされてしまうらしい.
ディレクトリの中身がコピーされるわけではないので直接的に被害が出るというわけではないようだが,一部怪しげな振る舞いになってしまうときがあるらしい.
(追記:比較的新しいバージョンの Eclipse では,svn 関連のデータはちゃんと無視してくれている様子)
2004-12-08 古い日記からの変換データ [長年日記] ▲
_ [論文]単体テストをアスペクトで記述 ▲
Guoqing Xu, Zongyuan Yang, Haitao Huang, Qian Chen, Ling Chen and Fengbin Xu:JAOUT: Automated Generation of Aspect-Oriented Unit Test.Proceedings of APSEC 2004, pp.374-381.
単体テストの記述をアスペクトで書こうというお話.単に AspectJ では書きにくいのでAspectJ に translate されるような言語 AOTDL というのを作っている.基本的には JUnit などで記述されたテストケースと並行して,Temporal Logic などで望ましい性質が成り立っているかどうかをテストするアスペクトを付加する.このときに,無視してよいテストケースの条件も別に記述する.(たとえば,スタックのテストであれば,オーバーフローが起きるかどうかのテストの場合,Temporal な性質のほうは無視して良い)
意味のある/なし判定を,自動生成したテストケースの振り分けに使っているらしく,適当なグループ分けされたテストケースのうち,少数ずつサンプリング→実行して,後から大量のテストケースを投入するときに意味のないテストケースがあまり含まれないようにする,らしい.
_ [論文]実行の差分を使ったデバッグ手法 ▲
W. Eric Wong and Yu Qi:An Execution Slice and Inter-Block Data Dependency-based Approach for Fault Localization.Proceedings of APSEC 2004, pp.366-373.
失敗したテストケース1つと成功したテストケース1つ以上が与えられたときを対象としたデバッグ手法.
単純には,失敗したテストケースで実行した文集合から成功したテストケースのどれかで実行した文集合を取り除いてからコードを調べて,原因が見つからなければ成功したテストケースの数を減らして(探索対象コードを増やして)調査を続け,それでも見つからない場合は失敗したテストケースの実行した文集合にデータ依存関係を持っているブロックを探索対象に追加し,それでも見つからない場合は追加されたブロックにデータ依存しているブロックを…というように段階的に探索対象のブロックを増やしていく方法.
これで文集合としては失敗時に実行された文集合の3〜6割程度のサイズに分布するらしい.
スライシングなどで見つけにくい「必要なはずのコードが抜けている」ような場合でも,文集合を段階的に増やしていくときに予期しない文が増えたりすることで気付きやすい,らしい.
_ [論文]インタラクションの分析 ▲
Lei Wu, Houari Sahraoui, Petko Valtchev:Automatic Detecting Code Cooperation.Proceedings of APSEC 2004, pp.204-211.
C などのプログラムの実行履歴からシナリオID,呼び出し階層の深さ,メッセージ送信元・送信先のモジュール,関数名を取り出してきて,基準をユーザが組み合わせることで自動的にパターンを分析してくれるらしい.
で,出てきたパターンに対して,どのような Collaboration パターンか(Supplier-Consumer,Director-Manager-Worker など)役割を当てはめてシステムを理解する,らしい.
1個の「パターン」をどこで認識するのか,何かパターン認識のためのツールキットを作ったとはあったが,それ以上は不明.分割の適切さについても不明.
パターン同士が同じものかどうかの比較基準もあいまい.ケーススタディで一言「メッセージの順序は考慮しない」と書いているので,呼び出し回数付きコールグラフともいえる実行ツリーを作る手法(*1)でのツリー比較っぽい.
あとは,発見されたパターン(粒度としては細かそう)に対して,統計ツールなどを使って性質を調べたり,このパターンでは各ルーチンがどのような役割をしているか,というのを調べていくことになるらしい.
いちおうシーケンス図生成などの話の関連研究なのだが,肝心のアルゴリズム的な部分があいまいなので何とも評価しがたい.オブジェクト指向じゃないので適当な方法でもそれなりにうまくいくのかもしれないが.
*1: Wim De Pauw, David Lorenz:Execution Patterns in Object-Oriented Visualization.Proceedings of COOTS 1998.
_ [論文]Concern Graph ▲
Concern Graphs: Finding and Describing ConcernsUsing Structural Program Dependencies.Martin P. Robillard and Gail C. Murphy.Proceedings of ICSE 2002.
ある Concern についての情報をクラス・メソッド・フィールドを頂点とし,declare, call, read, write, check (instanceof/キャスト),create, superclass を関係としたグラフを作ることで,ソフトウェアの変更を容易にしようという試み.
FEAT は Concern Graph の作成を助けるツールで,メソッドから Fan-Out, Transitive Fan-Out を計算したり,クラスへの参照を取ってきたりする.(ICSE2003でツールデモをやってた)
バイトコードからモデルを作っているのだが,ソフトウェアの変更という観点では,コンパイル時にfinal 宣言された定数が展開されたりメソッドがインライン化されたりといった影響が気になる,と述べている.
制約としては,ある Concern に参加する頂点の集合を取り出したとき,頂点間の依存辺を単にすべて取り出してしまうと,別の Concern 用に作られた Call や Read/Write も含んでしまうかもしれない,というところ.手作業でフィルタする必要がある?
2004-12-13 古い日記からの変換データ [長年日記] ▲
_ [work]データ依存解析 ▲
java.util.Date.parse(String) メソッドでスライスツールが落ちるので調べてみたら,約1000命令のうち,分岐命令が79個.ローカル変数が19個,スタック最大深さが7なので,分岐命令ごとにフレームを複製して合流地点でフレームの同一性をチェックする(解析済みの状態と同じ状態が到着したら捨てる)という現在のアルゴリズムだと,組み合わせ爆発が起きているっぽい.26個も変数の状態が一致することのほうが少ないだろうし….
追記:制御フローを見てみたら,分岐→合流→分岐→合流という感じの流れになっていたので,2のN乗(N=分岐数)にかなり近いような状態になっていた様子.というわけで,アルゴリズム差し替えの予定.
2004-12-21 古い日記からの変換データ [長年日記] ▲
_ [Delphi]コンソールのリダイレクト ▲
Graphviz のコンパイラを特定のファイル右クリックから使いたいので,第一引数にファイル名を取って dot.exe を実行する簡単な実行ファイルを作ってみた.
パイプを使ってリダイレクトする方法は以下のサイトを参考にしてみた.http://hp.vector.co.jp/authors/VA026252/tips/delphi_anonymous_pipe.html
TMemoryStream にデータを一度書き出して,それを読み込んでいる.Stream に書き込んだ後,再読み出しするのにPosition := 0 を忘れて読み込みに失敗したりしたが,それ以外は特に問題なく動作しているみたい.
2004-12-24 古い日記からの変換データ [長年日記] ▲
_ 研究会登録費補助 ▲
情報処理学会の学生会員に対する研究会登録費補助は,平成17年度は1研究会に限って登録費が *無料* になるとのこと.ありがたい.
http://www.ipsj.or.jp/09sig/kenkyukai/student17.html
_ [論文]ルールベースでのスライシングの実装 ▲
Mathieu Verbaere の修士論文,Program Slicing for Refactoring の4章: Slicing using inference rules を読んでみた.
{parsed statements, Context, slicing result} の3つ組を特定ルールに基づいて更新していくことでスライシングを実現している.
使うのは,各命令での Ref 集合と Def 集合で,Context は,各変数がそれ以降で参照される可能性があるか(もしくは上書きされるだけなのか)を保存している.
呼び出し位置ごとに個別に処理を行う Context-sensitive なスライシングの実装となっているみたい.
グラフ上での処理に比べるとアルゴリズムが厳密に記述されている感じはする.計算されるスライスとしては,ほとんど Summary Edge を使った SDG の作成と変わらないようだが,メソッドごとの PDG を全体の SDG として接続する場合に比べて,手続きごとに作られた3つ組を呼び出し文ごとにマージする処理として記述されるので,「メソッド単位での処理結果」が再利用される様子が分かりやすい.
2004-12-25 古い日記からの変換データ [長年日記] ▲
_ tex2text ▲
Tex2Text.rb を地味に更新.Ruby 1.8 になって,文字列リテラル内のダブルクォートのエスケープあたりが微妙に変わって動かなくなっていたのを修正.tex2text 公開ページ
2004-12-29 古い日記からの変換データ [長年日記] ▲
_ [論文]制御フローに基づくアスペクトマイニング ▲
Jens Krinke, Silvia Breu:Control-Flow-Graph-Based Aspect Mining.1st Workshop on Aspect Reverse Engineering.
以前実行トレースからマイニングしていたものを,制御フローグラフから探してみたというもの.で,それなりに候補は出てきたようなのだが,Iterator などコレクションの処理や,あるメソッドを実行した後の後始末など,アスペクトとして抽出しにくいものも一緒に出てきてしまうらしい.アスペクトにできるものもきちんと含んでいるようなので,いかに "refactorable" なものだけを抽出できるようにするかが問題だろうと考えている様子.
_ [論文]重要なクラスを見つける ▲
Andy Zaidman, Toon Calders, Serge Demeyer, Jan Paredans:Selective Introduction of Aspects for Program Comprehension.1st Workshop on Aspect Reverse Engineering.
重要なクラスにだけロギングなどのアスペクトを追加したいが,どうすれば重要なクラスを見つけられるだろうか,ということで通常のプロファイル結果からノードをクラス単位にまとめたコールグラフを作成し,Web で使われる Hub/Authority の識別を行うことを提案している.
Hub は数多くのモジュールを呼び出すモジュールで,Authority は数多くのモジュールに呼び出されるモジュール.で,Authority がいわゆる Utility など再利用可能なクラスであることが多く,Hub はプログラムを駆動する側にあるだろう,ということからHub が重要である,と認識する.ケーススタディとして Ant のプロジェクトに適用していて,Ant 開発者がマーキングしたクラスを正解とみて,評価してみている.CBO による順序付けよりは,人間が重要だとマークしたものを見落とす可能性はかなり少なくなっている.ただ,正解率的には6割程度.また,通常のコールグラフでなくプロファイル結果なので,シナリオによるバイアスがかかる可能性がある.(「そのシナリオで」重要なクラスを見つける,という意味では問題ないが)
あんまりアスペクト限定の話ではないような気もする.
_ [論文]アスペクト導入の効果は? ▲
1st Workshop on Aspect Reverse Engineering より.5ページのショートペーパー群.Aspect Mining/Refactoring がテーマ.http://homepages.cwi.nl/~tourwe/ware/submissions.html
_ Mariano Ceccato and Paolo Tonella:Measuring the Effects of Software Aspectization. ▲
アスペクト導入によるメトリクス値の変化を調べることでアスペクト導入の効果を測りましょうという論文.
Observer パターンの Java 実装と AspectJ 実装を比べていて,AspectJ バージョンのほうが1モジュールあたりの機能数である Weighted Operations in Module (WOM) が低くなりそのモジュールが呼び出す他のモジュール数 Coupling on Method Calls (CMC) や\呼び出されうるメソッドの数 RFM (Response For a Module) は減少している.
で,逆に悪くなっているのは,AbstractObserverProtocol の導入によって継承階層が増加すること.あと,アスペクトがどれだけのモジュールを横断しているかという指数だけは増える(当然ながら).
これだけだと,AOP アプローチのほうが有利に見えているのだが,使っているメトリクスで「アスペクトが横断しているモジュールの数」などはJava 実装との比較評価には使っても意味がなさそうなので,まだ何とも言えないような気がする.
_ [論文]クラス構造の分類に基づくパターンの調査 ▲
Gabriela Arevalo, Frank Buchli, Oscar Nierstrasz:Detecting Implicit Collaboration Patterns.Proceedings of 11th Working Conference on Reverse Engineering (WCRE'04), pp.122-131,November 8-12, 2004, Delft, The Netherlands.
クラス図から,A isSubclass B, A access B などのクラス間の関係を取り出し,クラス図から選んだいくつかのクラス(この論文では2〜5個程度)の連結関係を Formal Concept Analysis で分類し,デザインパターンの連結構造と比較することでパターンの実装などを発見しようという試み.
クラス図からクラス群を選ぶときの組み合わせを減らすことや,分類結果から「同じ型」をマージするなど,組み合わせ数を減らすことに気を配っている.
パターンとよく似た形になっているものなども見つけることができるが,逆に,デザインパターンと偶然同じ形になったものというのも登場してしまう.また,分類された結果から,実際に有用かどうかを検査するのは別の問題になっている.
_ [論文]Topic Map によるソフトウェアの可視化 ▲
読んだまま放置していた論文メモをざっくり整理.
Christian Zimmer:Tuna: Ontology-Based Source Code Navigation and Annotation.Workshop on Ontologies as Software Engineering Artifacts.
Topic Map というグラフによる知識表現でソース情報を表現するために,Topic Map の各要素が何をあらわすかを定義している論文.で,実際に Topic Map に対応したビューア&クエリーかけツールを作っている.出力がグラフになったらコードが読みやすいかというとそうでもないと思うのだが.JQuery よりは言語非依存といえるが,提供できるサービス量はどうなのかよくわからない.
_ [hyCalendar]towards 1.0 ▲
メール&掲示板で色々要望は集まってきた.
アプリが開いている単体ファイルに対応していたCalendarDocument クラスが今まで単体だったものが複数インスタンスへ変化するので,暗黙のうちに Singleton を前提としてしまっているコードがだいぶ変更されてしまう.
Singleton に染まったコードをうまく解除する変更パターンのようなものはないものだろうか….
2004-12-31 古い日記からの変換データ [長年日記] ▲
_ [論文]動的アスペクトマイニングへの静的情報の付与 ▲
Silvia Breu:Towards Hybrid Aspect Mining: Static Extension to Dynamic Aspect Mining.1st Workshop on Aspect Reverse Engineering.
実行履歴から呼び出しパターンを解析するアスペクトマイニングでは,メソッド呼び出しが全部具象クラスになってしまって,クラスAとBが継承関係にあるときにA のメソッド実行と B のメソッド実行の関連情報が落ちてしまう.
そこで,呼び出し文で使っている型,あるいは親クラスへクラス情報だけを書き換えた状態でマイニングしたらどうか,と考えているらしい.パターン認識のコストはちょっと上がるだけで済みそうだが,効果は不明.
_ [論文]コードクローンでのアスペクトマイニング ▲
Magiel Bruntink:Aspect Mining using Code Clone Metrics.Workshop on Aspect Reverse Engineering.
エラー処理,動的実行トレース,関数のパラメータチェック,メモリ確保の4つが主な横断的関心事であるとして,コードクローンを取得して,クローンクラス全体のコード量と分散している関数の個数の積でランキングをとって,上位20件を調べるという実験をしている.
結果としては,上位に入ったクローンクラスで上記の4つを含んでいるものは見つけられたらしい.ただ,1個のクローンクラスで特定の Concern に関するコードを全部カバーできるというわけではなく,複数のクローンクラスのを合わせてみないと分からない.
また,エラー処理(エラーコード変数の初期化〜設定など)は他のメイン処理にあたる初期化処理なども含んでしまって,そう簡単にアスペクトとして抽出できるというわけではなかったらしい.
今のところ,それらしいコードを見つけることはできても,分離して役立つコード,分離できるコード,という基準が明確でないところが微妙.
_ [Delphi]RichEdit の Protected 属性 ▲
TRichEdit には一部領域の編集を防ぐ Protected 属性が付加できるのだが,一度 Protected をセットすると解除してよいかどうかを OnProtectChange イベントで許可を出す必要がある.
クリップボードへのコピーなど変更を伴わない作業も保護されてしまうので,いくつかの特定の処理中(e.g. cflowbelow(LoadFromFile), cflowbelow(CopyToClipboard)) だけは許可を出す,というのでモジュールレベルのフラグ管理だらけになりつつある.
cflowbelow などよりももうちょっと抽象的な「今何をしているか」をシステム自身が認識できれば少しはまっとうに解決する?