«前の日(09-29) 最新 次の日(10-01)» 追記

netail.net

自作フリーソフトや,ゲームに関する雑記を公開してます.
日記はソフトウェア工学の論文ネタが中心です.

最近のお知らせ (古いものはこちら)


2003-09-30 古い日記からの変換データ

_ 論文

Hanenberg, S., Oberschulte, C., Unland, R.: Refactoring of Aspect-Oriented Software, Net.ObjectDays 2003, Erfurt, Germany, September 22-25, 2003

Aspect-aware Refactorings をしましょう,という論文.

call(class_name.set(*)) でアスペクトを貼り付けても,「メソッドの引き上げ」などのリファクタリングをしてしまうとアスペクトが効果を発揮しなくなってしまう.

メソッドの名前変更 (Rename Method):

C.foo から C.bar に変更した場合,pointcut も変更する必要がある.call(*.foo()) → call(*.foo()) || call(C.bar()); とか,call(*.bar()) → call(*.bar()) && !call(C.bar()); とか.

メソッドの抽出:

C.foo の一部を C.bar に抽出した場合,withincode を等価変換するには,次のように変更する必要がある.withincode(void *.foo(..)) → (withincode(void *.foo(..)) && !call(void C.bar(..))) ||(withincode(void C.bar(..)) && !execution(void C.bar(..)) && cflow(withincode(void C.foo(..))));

メソッドの移動:

C.foo から D.foo に移動した場合,target や this を変更する必要がある.pointcut x(C c): execution(void *.foo()) && this(c) → pointcut new_x(C c): execution(void *.foo()) && this(c);pointcut new_y(D d): execution(void D.foo()) && this(d);

アドバイスの抽出(Extract Advice):

this, target, args, などを使って元のメソッドを厳密に指定する.また,advice 自体は around を使って,メソッドの実装をコピーして,元のメソッドに残した部分だけをproceed に変えて,なるべく元の制御構造を維持するようにすると簡単.

Introduction の抽出(Extract Introduction):

こっちは,普通にメソッド定義をコピーし,頭に型名をつけるだけでよい.

Pointcut の分解 (Separate Pointcut):

pointcut 定義の共通部分だけをくくりだして別の pointcut にする.

で,この人たちは,Aspect-aware なリファクタリングをするためのツールを Eclipse プラグインとして作ったらしい.

主に名前と型情報関係だけで,cflow などは(実際に呼ばれるコンテキストが変わらない限り)影響を受けないので気にしなくてよいらしい.

_ 論文

Pascal Costanza:Dynamically Scoped Functions as the Essence of AOP

を読んでみた.Lexical Scope (定義位置に依存して変数の binding が決まる)と Dynamic Scope (実行時点に依存して変数の binding が決まる)の違いをCommon Lisp 的記述を使って説明している.

で,アスペクトの役割をdflet という述語を使ってdflet (関数などの再定義) (評価したい関数)という形で書いている.「評価したい関数」というのが変換元のプログラムのことで,「関数などの再定義」 がアドバイスに相当し,「評価したい関数」の中で呼んでいる関数を実行時バインディングで置き換える.

「関数などの再定義」をする dflet をどこに配置するかというのが,Pointcut の役割をしている.

「特定のポイントで関数のバインディングを変える」とみなすか「イベントに連動してまったく処理を行う」と考えるか,という違いのような気がするけれど,関数のバインディングと制限してるほうがちょっと範囲が狭くて,それで十分な範囲をカバーしているのか謎.

_ 論文

aosd-discuss で,次の記事のことが話題に上がっていた.

Pascal Costanza:Dynamically Scoped Functions as the Essence of AOPACM SIGPLAN Notices,Volume 38 , Issue 8, pp.29-36 (August 2003)http://portal.acm.org/citation.cfm?doid=944579.944587

この記事に対して,Kiczales が,「cflow を dynamically scoped functionとしてとらえるにしても,AOP はそれだけじゃないでしょ,たとえばメソッド呼び出し以外の join points だってあるんだから,云々」と言ってた.ということで,後で読んでみることにする.


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;

2005-09-30

_ 朝も早くから

Let's Note を机から落とした.

机→椅子の上→床と,開いた状態でがこがこっと落ちたので本気で焦ったが,幸運にも液晶は無傷.ふー.

頑丈な製品を作ってくれた人たちに感謝,かな.