netail.net
自作フリーソフトや,ゲームに関する雑記を公開してます.
日記はソフトウェア工学の論文ネタが中心です.
最近のお知らせ (古いものはこちら)
2005-02-02 古い日記からの変換データ [長年日記] ▲
_ [論文]二項関係でのクエリー記述 ▲
Dirk Beyer, Andreas Noack, Claus Lewerentz:Simple and Efficient Relational Querying of Software Structures.Proceedings of 10th Working Conference on Reverse Engineering (WCRE2003), pp.216-225, Victoria, B.C., Canada, November 2003.
クラス間の関係・構造をCALL(A, B), INHERIT(A, B), CONTAIN(A, B) のような形でデータベースに入れておき,論理型言語でクエリーを記述する.
たとえば,x と z は同じメソッド呼び出しを持つことは:IdCall(x, z) := for all y, CALL(x, y) → CALL(z, y) ∧ CALL(z, y) → CALL(x, y)といったようになる.
基本的には言語の提案っぽく,大規模なシステムが相手でも記述の行数が増えないこと,サイクルの検出や,同じクラスを2回以上継承した場合の検出などを題材に,実行時間的に優れていること,などが説明されている.
_ [論文]FCAでのクラス分析 ▲
Uri Dekel, Yossi Gil:Revealing Class Structure with Concept Lattices.Proceedings of 10th Working Conference on Reverse Engineering (WCRE2003), pp.353-363, Victoria, B.C., Canada, November 2003.
どのフィールドがどのメソッドに使われているかをベースにConcept Lattice を構築して,Lattice の Top/Bottom 以外では disjoint であるようなフィールド群は別クラスに分割できる,とかいった分析を行おうという話.まあ,やればできそうという話だけど.
実際には使われてないメソッドやフィールドの除去や,フィールドの役割の分析なんかも必要みたい.また,配列への追加・削除時の growArraySize (配列の領域調整)のような副次的な存在は,クラス内での役割が分かりにくい様子.
2005-02-04 古い日記からの変換データ [長年日記] ▲
_ [論文]暗黙のメソッド呼び出し変換 ▲
だいぶ前に読んだはずの論文だけどメモし忘れていたらしい.
Robert J. Walker, Gail C. Murphy:Implicit Context: Easing Software Evolution and Reuse.Proceedings of FSE2000, pp.69-78, San Diego, CA, USA,November, 2000.
「あるクラスが AbstractFactory パターンを使っている」といったデザイン情報は,コード上では単に new を使わずにmakeInstance のようなメソッド呼び出しとして表現され,ユーザに makeInstance の使用を強制することはできない.
そこで,「new へのメソッド呼び出しが起きたら,かわりに makeInstance を呼んでね」といったContext を生成してオブジェクトにアタッチする.Context 自体の記述は,過去のメソッド呼び出し履歴に対するリフレクション機能を使ったプログラム形式で書けるようにしている.
これを使うと,一部のコンポーネントへの依存関係をオブジェクト本体から切り離しておけるので,Swing ライブラリでの Look and Feel の切り離しという実験をしている.
AspectJ などを使ってできることとほとんど同じだが,AspectJ などよりも実行コンテキストへのアクセスが主体となっていて,過去のメソッド呼び出し履歴に応じてメソッドのディスパッチを変えるといったことができる.AspectJ の around アドバイスに,その種のリフレクションを持たせたら同じになるといえなくもないか.
2005-02-05 古い日記からの変換データ [長年日記] ▲
_ コンテキスト制約記述言語CCL ▲
Context-Based Constraint Language,というのがあるらしいというので調べてみた.
あるコンポーネントにコンテキスト値を付加して,そのコンポーネントが働いているときに属しているコンテキストをリストアップしておく.そして,「コンテキスト 'Controller' のときは 'Personal Data = Yes' の属性を持ったオブジェクトに アクセスしては駄目です」といったように制約を記述する.
使い方としては,設計時に UML などに付加しておいてあとでコードに落とす制約言語なので,OCL と似ている.
単なる表明だけでなくて ENCRYPTED WHEN CALLING とかいった呼び出しまわりの属性付加もあるので,主には CORBA やら EJB なんかでの使用になるみたい.
単に表明を記述する言語としてみると,AspectJ・JBoss AOP などでアトリビュートを付加してdeclare error や実行時のエラーチェックを付加する実装方法とうまく対応しそうな印象がある.
SPLAT2004に出したアサーションをアスペクトで書くと,という話とも絡むけれど,CCLでいうコンテキストはかなり大域的な情報で,「利用コンポーネントに応じて違う表明を書く」というのはコンポーネントとその利用者の間だけのローカルな情報なのかなと思ったりする.技術的には極端な差はないように見えるけれど.
_ [論文]ソフトウェア内部のパターン認識 ▲
Martin Pinzger and Harald Gall:Pattern-Supported Architecture Recovery.Technical Report, TUV-1841-2002-16, Technical University of Vienna.
ソフトウェア・アーキテクチャをソースやドキュメントから復元するために,どんな設計上の決定がシステム内に含まれているかを認識しましょう,という話みたい.
ただ,やってることはちょっと賢い(複数行に渡った情報が扱える)grep のように見えなくもない.マッチした結果を「パターンインスタンス」と呼んで,それらの関係図を出力しましょう,といった感じに見える.
_ [論文]データ項目の自動対応付け ▲
Sebastian Bossung, Hermann Stoeckle, John Grundy, Robert Amor, John Hosking:Automated Data Mapping Specification via Schema Heuristics and User Interaction.Proceedings of ASE 2004, pp.208-217.
XMLスキーマがたくさんあって,データを相互変換したいが,毎回手動で変換ルールを作るのは大変だから,XMLスキーマが2個与えられたとき,なるべく自動でデータのマッピングを生成しましょう,という論文.スキーマだけでなく,インスタンス文書のほうも(もしあれば)入力として受け付けるようにしているみたい.
スキーマ間のデータ項目のマッチが基本になるが,マッチの実装方式としては,色々なヒューリスティックを実装したエージェントを環境に放り込む,という形にしている.
使うヒューリスティックとしては
・項目の名前が同一である
・一方の項目の名前が,他方の項目名の部分列になっている
・文字列同士の Levenshtein 距離(一方を他方に変換する操作列の長さ)が小さい
・要素型が等しい
・要素のセット(あるタグの配下全員)で型が等しい
・一方が他方の略称アルファベット列になっている
・インスタンス文書の,要素の値が同じ…など.
ツールをプロトタイプを作ってみたら,スキーマがそれなりに似ていると事前に分かっているものでは,いい感じに使えた,らしい.
ただ,この時点では,データのマッピングは値のコピーにしか対応してないようなので,複数項目の集計とかに反応しようとすると大変そう.(変換を容易に記述できるスクリプトと組み合わせになる?)
あったら便利そう,という印象はあるけれど,こういう類のツールはどう評価するのがいいのか分からない(せいぜい「正しい対応付け」に対する正解率?)という微妙なところ.どのヒューリスティックがよく効くのかは見てみたい気もするが.
_ [論文]デバッグ操作のプログラム化 ▲
Guillaume Marceau, Gregory H. Cooper, Shriram Krishnamurthi, Steven P. Reiss:A Dataflow Language for Scriptable Debugging.Proceedings of ASE 2004, pp.218-227.
デバッグ用の操作をプログラム(スクリプト)から扱えるようにした,という話.デバッグ時に行う操作はわりと定型的だ,というのが前提.
Lispぽい文法の言語を作っていて,Trace命令で(AspectJの args や this などのように)プログラムの状態のいくつかを変数にバインドして,プログラム実行中に制約違反を起こしたらプログラムを止める,といったスクリプトを作っている.
東工大の千葉先生のところでやってたデバッガにAOPな機能を取り込んでみる,という話が近いのかも.
_ [論文]抽象プログラムによる制約違反の発見 ▲
Mana Taghdiri: Inferring Specifications to Detect Errors in Code.Proceedings of 19th International Conference on Automated Software Engineering (ASE'04), pp.144-153,Linz, Austria, September, 2004.
クラスの各メソッドから簡単な仕様を抽出し(たとえば戻り値が null でないとかフィールドが更新されるとか),プログラム中のメソッド呼び出しをその制約式で単純化し(a = list.contains(element) なら [a = "?"] のように)抽象化されたプログラムが制約を本当に満たすか検査する.満たさない場合,制約違反を起こすような抽象実行列を出力する.
あんまりよく分かっていないが,データ構造コンポーネントの一貫性検査などに使ったりするみたい.
_ [論文]ソフトウェア変更時の横断的関心事 ▲
Elisa L.A. Baniassad, Gail C. Murphy, Christa Schwanninger and Michael Kircher:Managing Crosscutting Concerns During Software Evolution Tasks:An Inquisitive Study.Proceedings of AOSD 2002.
ソフトウェアの変更時に,開発者がどう横断的関心事を意識して対処するかを調べようというケーススタディ.
開発者に後からインタビューしたところ,明示的にドキュメントやモジュールがないと,「何をしているのか」という理解が人によって変わってきて,また対処方法も3つくらいのパターンに分かれたらしい.
また,「このコードを変更するとどこに変更が及ぶのか?」というのが開発者の不安の種となっていることが確認されている.
開発者の作業の監視ではなく終わった後のインタビューなのと,参加者8人でタスクも小さいということからValidity として強いわけではないけれど.
2005-02-06 古い日記からの変換データ [長年日記] ▲
_ DoS ▲
OUCC部室にてFC版DQ3のカートリッジを分解したりして遊んでたら,web にアクセスできなくない(サーバの応答がない)ことが判明.
どうも Inktomi というところから Crawler が大量に(1秒に数回)存在しない URL にアクセスしてた様子.ありそうな CGI を総実行していくらしい.
Yahoo/Crawler/DoS あたりで検索してたらrobots.txt を無視するらしいとか,色々ろくでもない情報だけ見つかった.
ちょうど同じ時刻に cgi 動かしたり大量にデータ転送してたらしき人に嫌疑がかかったりもしたが,どうも Crawler が原因っぽい.1日1回くらい,集中的にアクセスに来るっぽいのであまり性質の良いものではなさそう.
2005-02-07 古い日記からの変換データ [長年日記] ▲
2005-02-08 古い日記からの変換データ [長年日記] ▲
_ 全国大会 ▲
情報処理学会の全国大会のプログラムを見ていて,「ソフトウェアの保守と検証」セッションにある高橋裕康,紫合治: アスペクト指向プログラミングによるシーケンス図の自動生成が少し気になる.
シーケンス図生成ツールを AOP 的に作成したのかなと思わなくもないけど,AOPでのロギングの実装だけが工夫だったらどうしよう….
_ [Delphi]RichEdit ▲
RichEdit コントロールはバージョン 1.0, 3.0 と 2.0 で,同じ API でも引数および戻り値の意味が違うというドキュメントを見つけたはいいけれど,Delphi でどのバージョンを使っているか文書がなかったのでVCL のソースを調べてみた.
結果,LoadLibrary してるところに 'RICHED32.DLL' という定数が埋め込んであるのを発見.
これは 1.0 のライブラリで (2.0〜3.0は RICHED20.DLLらしい),Windows XP SP1 以降も 1.0 Emulator 搭載らしいのであんまり気にせずに 1.0 だと思って使っても良さそう.
2005-02-09 古い日記からの変換データ [長年日記] ▲
_ [Java]Enum にメソッドを関連付ける ▲
Sun が提供する Java Core Technology Tips を読んでたら,enum の話が載ってた.
public enum Coin3 { PENNY { int value(){ return 1;} }, NICKEL { int value(){ return 5;} }, DIME { int value() { return 10;} }, QUARTER { int value() {return 25;} }; abstract int value(); }
上記のように,enum 定数をオブジェクトとみなしつつメソッドを持たせたり,コンストラクタを持たせたりといったことをしていいらしい.こういう使い方は考えてもなかったので,けっこう驚いた.
http://java.sun.com/j2se/1.5.0/docs/guide/language/enums.html
2005-02-18 古い日記からの変換データ [長年日記] ▲
_ [論文]表明のOOPでの利用 ▲
M. Satpathy, N.T. Siebel, D. Rodriguez:Assertions in Object Oriented Software Maintenance: Analysis and a Case Study.Proceedings of the 20th International Conference on Software Maintenance (ICSM 2004), pp.124-133, Chicago, September 2004.
オブジェクト指向プログラムで,アサーションがどのように使われているかを調査し,またアサーションがソフトウェアの変更のときにどのように変わるか(リファクタリング時にコピーされるなど)を調べた論文.
基本的には,クラス内の特性として,
・クラス不変表明
・メソッドの事前条件としての入力値の範囲,複数の入力の一貫性,オブジェクトの状態の検査
・事後条件としての,戻り値の範囲,戻り値と引数の関係,オブジェクトの状態(副作用の禁止など含む)の検査
クラス間の関係として,
・派生クラスに対する Liskov の置換原則
・オブジェクト間の相互参照関係のチェック
そのほか,
・バグ調査での利用
・システム間のインタフェースでの入出力値が正しいか
・設計と実装の対応が取れているかなど.
これらを踏まえた上で,リファクタリング作業時に(できれば自動で)適切な assert 文のコピーや移動をしたいらしい.
2005-02-19 古い日記からの変換データ [長年日記] ▲
2005-02-20 古い日記からの変換データ [長年日記] ▲
_ C# ▲
C# 2.0 の Partial Class が aspectj-users ML で話題になってた.クラス定義の一部だけを別ファイルに書いておいてコンパイル時に足しこめるというもの.http://www-ise2.ise.eng.osaka-u.ac.jp/~iwanaga/programming/csharp/ap_ver2.htmlにC#新機能がまとめられていた.
Partial Type を自動生成すればAspectJ の Inter-Type Declaration に近いことができそうだがcrosscutting の記述ができないから違うんでは,というのは aspectj-users で出ていた意見だが,うまくクラス定義をモジュールに分割して,簡単なプリプロセッサでも書けばAspectJ や Hyper/J でやっていることに近いことができそう,という意味で面白そうではある.
本来の用途は「賢い #ifdef」なのかなと個人的に思っていたら,http://www.ondotnet.com/pub/a/dotnet/2004/04/05/csharpwhidbeypt1.htmlには,これは大きいクラスを分割しておくための仕組みで,デザイナなどで自動生成したコードと,人間が書いたコードとを自動で区分して管理しておくことが本当の目的だ,と書いてあった.
AspectJ で Inter-Type Declaration を使えば同じことはできるけれど,crosscutting もしてないのにコードを分割してていいのか,と怒られそうな気がする.
2005-02-28 古い日記からの変換データ [長年日記] ▲
_ [論文]クラスの階層構造の識別 ▲
Stephane Ducasse and Michele Lanza:The Class Blueprint: Visually Supporting the Understanding of Classes.IEEE Transactions on Software Engineering,Vol.31, No.1, January 2005.
Class Blueprint は,1つのクラスのメンバーを初期化用,インタフェース,内部実装用,アクセサ,属性という5種類のレイヤーに分類して,相互に呼び出し関係を接続したもの.
分類にはヒューリスティックとして,名前に "init" を含んでいたり,そんなメソッドを呼び出しているようなメソッドは初期化用である,private インタフェースだったりクラス内のほかのメソッドから呼ばれているようなメソッドは内部実装用である,というような,わりと経験的に妥当っぽい基準で分類している.
メンバーの種類もスーパークラスの同じメソッドを呼んでいたら Extend でまったく書き換えていたら Override で特定の呼び出しパターンをしていたら Delegate で,といったように経験的に分類し,色づけして配置すると,Blueprint が1枚出来上がるらしい.
Blueprint が複数枚出てくると,特定のレイヤーが大きいとか,小さな機能を実装したクラスだとか,定数を定義するクラスだとかいったように,可視化した内容からクラスの傾向をつかむことができる.また,継承木単位で Blueprints を接続して理解するということも可能になる.
静的解析だけでがんばっていて,さすがにクラス間の接続などは行っていない.単一クラスの傾向をつかむという意味ではけっこう面白い.(あんまりクラス間で Blueprints を接続すると 役に立たない複雑な図が生成されそう)5つのレイヤーへの分類結果をメトリクスとみなしてクラスタリングみたいなことをすると何か出てきたりするかも?