netail.net
自作フリーソフトや,ゲームに関する雑記を公開してます.
日記はソフトウェア工学の論文ネタが中心です.
最近のお知らせ (古いものはこちら)
2004-01-29 古い日記からの変換データ ▲
_ Calendar ▲
0.6.6 を目指しての作業が一段落.たいしたこともないバグなのに根は深かった.Windows のスタンバイ/ロック解除を頻繁に使う人間なので直したが,実際には毎回プログラムを終了させるタイプの人には必要のない修正だったりして.
でも,まだリリースまでは時間がかかりそう.いちおうバイナリだけは今月中(あと2日ほどしかないが)に出すつもりだが.
_ Delphi ▲
いろいろ試行錯誤した挙句,次のようにまとまった.・アプリケーションの MainForm としてfrmPlaceHolderを作成.・frmPlaceHolder は,幅0,高さ0. 最小化命令が飛んできたときだけ, 本来のフォームと同じサイズに化けて, アプリ全体を最小化する.・本来のカレンダーフォームは, アプリが最小化されている間は消えている. (表示していると,ビジュアルスタイル変更時に クラッシュするため -- これは VCL のバグだろうか?)・カレンダー画面表示中にビジュアルスタイル変更が来た場合, 一度画面を消してから再表示する. (メッセージは1回ではない場合もあり, その場合は点滅することになる)・最小化中は(ウィンドウが非表示なので)黙って耐える.
2005-01-29 古い日記からの変換データ ▲
_ [Delphi]SetWindowPos ▲
ウィンドウをアクティブにしないで前面に表示しようとしてSetWindowPos の SWP_NOACTIVATE オプションを使ってみたら,どうも SetWindowPos で表示したときにはVCL の TCustomForm.Visible プロパティが True にならず,しかも子ウィンドウ(フォーム上のコントロール)も背面にいるまま移動してこない様子.→子ウィンドウの振る舞いについては,突然ちゃんと動くようになった.謎.
で,一度不一致が起きると,Close や Hide を使ってもウィンドウを閉じられなくなってしまう.結局,ウィンドウを表示するときは SetWindowPos で全部の子ウィンドウも表示してから Visible = True にして,閉じるときは閉じるときでいちおうSetWindowPos(..., SWP_HIDEWINDOW or SWP_NOACTIVATE) としてウィンドウをアクティブにせずにそのまま消してから手動で Visible = false に設定するように実装した.
2007-01-29 ▲
_ [論文] プログラムの自己進化のためのアーキテクチャ ▲
個人的には,プログラムが自己進化する必要は今のところないと思いますが,いちおう夢がある(?)話なので取り上げてみます.
Ming-Yang Hou, Xi-Yang Liu, He-Hui Liu: Fifi: An Architecture to Realize Self-evolving of Java Program. [ACM site]
Proceedings of SEAMS 2006, p.93, Shanghai, China, May 2006.
1ページの Research Summary で,自己進化型プログラムのためのフレームワークを作ってます,というものです.
このフレームワークでは,JVMTI を使って相互通信する2つの JVM を同時実行し,1つをプログラム実行用,1つを監視システムとします.そして,監視システム側は,プログラム実行時のイベント列に応じてプログラム改変が必要かどうかを判定し,改変の指令をプログラム実行用JVMに送ります(改変されるのは実行プログラムのみで,監視用のコード部分は書き換えません).
仕組みとしては,今の Java バイトコード書き換えツールを駆使すればそれなりに実現できそうですし,コードの最適化とか難読化にも使えそうです.実行中のプログラムにパッチを当てるという話に似ていますが,この研究の場合,監視プログラムが,機能改変用のパッチを自動生成するという違いがあります.
自己進化の「コードを書き換えるルールを書く」という観点だけを見ると,静的な操作,たとえばリファクタリング操作をスクリプト言語で書くとか,sed でコードをまとめて変更するいったものであれば,あまり変な気はしません.
プログラムの実行を監視して,随時,動的に書き換える必要がある機能変更ってどんなもの,といって何も思いつかないのが,怪しいと感じる要因かもしれません.原稿では「捕まえられない例外が投げられたらtry-catchブロックの自動追加(エラーを無視して実行を再開する)」というものだけが例として載っています.