netail.net
自作フリーソフトや,ゲームに関する雑記を公開してます.
日記はソフトウェア工学の論文ネタが中心です.
最近のお知らせ (古いものはこちら)
2006-12-23 [長年日記] ▲
_ [お知らせ][VolumeDeskbar] Volume Deskbar 1.0.13 リリース ▲
設定ダイアログが壊れる問題の対策をしばらく手元でテストしてましたが,どうやらうまくいってるようなのでリリースします.
バージョン番号の表示がない,とのご指摘をいただいたので,設定ダイアログの下端,セットアップツールのタイトルバーにそれぞれバージョン番号を追加しました.
また,「クリックなしでホイールを有効にする」オプションを追加しました.通常はかなり快適に動作するはずですが,CPUが高負荷だと(たとえば他のアプリケーションの起動途中など),ホイールの動きを検知した後,音量を変更するまでのメッセージ処理が遅れるようです.反応が遅いからといって,音量を大きくしすぎないよう,ご注意ください.
ついでに,Web ページの構造も少し見直しました.Volume Deskbar のページのトップにダウンロードリンクが置かれてます.
2006-12-22 [長年日記] ▲
_ [論文] リファクタリングは複雑さを明確にする作業 ▲
Miguel Lopez, Naji Habra: Investigating Refactoring Impact through a Wider View of Software.
Proceedings of QAOOSE 2006, pp.101-108.[Workshop Site]
Document というエンティティの中に含まれていたファイル形式の扱い(PDFとかHTMLとか)を,条件分岐での扱いからクラス多態性での扱いに変更してやったら,プログラムの理解,変更やテストは容易になったのに,依存関係グラフの登場人物数は増えてしまい,辺の数も増えて,設計の複雑度は上がってしまった,という例を出しています.
リファクタリングというのは複雑さを減少させるのではなく,どこかのエンティティに隠れている複雑さを明らかにして,適切なエンティティへ分散させる作業である.そして,複雑さを明確に記述することが保守性に貢献しているのではないか,と指摘しています(保守性への貢献については今後検証が必要だとしています).
……というあたりが,リファクタリング関連で何か書きたいときに使えそうなんで,とりあえずメモしておきます.Proceedings はワークショップのサイトから取れます.
2006-12-19 [長年日記] ▲
_ [論文] 動詞+目的語でコードを検索 ▲
David Shepherd, Zachary P. Fry, Emily Gibson, Lori Pollock, K. Vijay-Shanker: Using Natural Language Program Analysis to Locate and Understand Action-Oriented Concerns. [author's page]
Technical Report No. 2006-334 (U. of Delaware), AOSD 2007, to appear.
ソースコードとコメントから,動詞と目的語のペアからソースコードへの対応を辺としたグラフを作るという話です.On-demand remodularization …というタイトルで AOSD 2006 に出てたネタの発展形です.
基本のクエリとして動詞と目的語と1つずつ与えたら,同義語や co-located word となる動詞を推薦してくれて,選んだ動詞群と目的語群から作られる「動詞+目的語」のペアに対応するソースコードを引っ張り出してくるという手法です.対応関係は,事前に,メソッド宣言のコメントや,メソッド名とオブジェクトの変数名などから抽出しているようです.
結果として提示されるソースコードは,メソッド単位を頂点として,メソッド呼び出し関係やオーバーライド関係を辺としたグラフとしています(ツール上では,そこから実際のソースへ移動できるようです).論文のサンプルでは,かなりしっかり接続されたメソッド群が出てきているので,1つの機能を実装する一群のメソッドは同じような動詞+目的語をメソッド名ないしコメント内に持ってるみたいです.
普通のIR手法なんかだと大量に該当ソースを発見しておいてランキング上位から見ていく形式ですが,これは動詞や目的語を追加していって少数のコードから徐々に探索範囲を広げていくアプローチを取ってるようです.
適用実験では,困った例として,機能名が動詞としても名詞としても使える単語だった場合にクエリをどうするか悩んだとか,IReportCompiler という名前から "compile report" というペアを取り出すルールがなかったとか書いてました.メソッドなどの命名方法と自然言語のギャップは,英語圏の人たちでも問題なのかもしれません.
しかし,英語圏な人たちなので,ソース中のコメントなんかは普通に自然言語解析で解決できていて,ちょっと羨ましいところです.日本語のコメント入りのコードだと,どう日本語情報とソース情報の対応付けをするのか,というあたりが工夫しどころなのかもしれませんが…….
2006-12-16 [長年日記] ▲
_ [VolumeDeskbar] ログオフ後に設定ダイアログが壊れる ▲
Volume Deskbar の設定ダイアログで「OSの機能呼び出しに失敗」と表示されるのは,どうやら,ログオフ時にダイアログが破棄されてしまうのに対し,親のデスクバー自身はその後のログオンで生きたまま再利用されているのが原因という気がしてきました.
次バージョンでは,ダイアログを毎回使う直前に作成し,終わり次第破棄することで対処します.
問題への対処だけでリリースでも良かったんですが,ついでに,「クリックなしでもホイールを有効にする」コードも追加中です.実装はマウスに対するグローバルフックです.フックを仕掛けるのが気持ち悪い人はオプションをオフのままにしておいてもらうということで…….
1〜2月は各種締め切りが待ち構えているので,年内にはリリースするつもりです.
2006-12-11 [長年日記] ▲
_ [論文] メモリアクセス違反を防ぐ ▲
C/C++におけるメモリアクセスに関する耐障害性について,Microsoft Research のBen Zornという人が喋りに来てました.私の研究にはまったく関係ないですが.
プログラムにパッチを当てるというのは管理やテストのコストが高くつくので,できればプログラムがエラーを起こしても自分で回復して実行を継続できるようにしたい,ということで研究をしているそうです.
この手法の対象としては単純にプログラミングエラーだけでなく,ハードウェアエラーによるデータ破壊とか,オンラインゲームのことも引き合いに出していました.特にオンラインゲームについては,キャラクターの所持金やアイテムが現実のお金と交換できるせいで,データ破壊の防止が重要になっていると指摘していました.
基本的なポインタエラーからの保護としては,malloc/free を差し替えて,バッファ領域の前後に余分な空間を持たせ,バッファ群を多重化し,レプリカごとにメモリ配置をランダムに変更する方法を取っていました(多数決でエラーを起こしたレプリカは捨てて,新たに領域を確保しなおすようです).メモリをかなり多めに使うので,適用先はある程度限定されるようですが,プログラムを書き換えずにそのまま実現できるという利点があります.
一方で,重要データの上書きを防止するために,"critical int" のようにソース上で修飾された変数の多重化を行っていました."critical store" という特別な命令によってのみ多重化されたコピー群をまとめて更新できるようにしておき,ポインタの操作ミス(または故意)でのデータ破壊が発生しても,"critical load" 命令によってコピーから値を復帰できるようにしています.
こちらの手法は,重要データの選び方にもよるようですが,実行時オーバーヘッドが10%程度で収まっていて,ランダムなメモリ書き換えが起きるような環境でもデータ破壊を防ぐことができた(最悪でも assertion などで停止した)ようです.
こういった手法は,CPUパワーとメモリを投資するほど安全性が向上するので,「メモリはあればあるだけ使ってしまう」状態が続きそうです.まあ,メモリが余ってても仕方ないので,余分にメモリを積んでいたら勝手に安全性向上,とかいう形になれば,それなりに嬉しいかもしれません.昔,PC-8801MHを使っていた頃は,PC-98シリーズなど,メモリを640kBも何に使うんだろうとか思ってたんですけどね…….