netail.net
自作フリーソフトや,ゲームに関する雑記を公開してます.
日記はソフトウェア工学の論文ネタが中心です.
最近のお知らせ (古いものはこちら)
2010-03-07 [長年日記] ▲
_ [hyCalendar][お知らせ] hyCalendar 1.6.6 リリース ▲
掲示板で指摘された通り,印刷プレビューのフォントが印刷時に適用されなかった問題を修正しました.
また,最近のバージョンでは終了に妙に時間がかかることがあったんですが,この問題も修正しました.ただ,設定ファイルを書き出す処理を改変したので,念のためバックアップを取ることをお勧めします.
_ [hyCalendar] 設定ファイルの書き出し速度の改善 ▲
hyCalendar では設定ファイルの書き出しに VCL の TIniFile クラス,実体は WritePrivateProfileString という Windows の API を使っていました.この API は,設定ファイルを項目名と値の組のデータ列として扱い,指定項目だけを選択的に更新するという処理をします.
ところが,設定の全項目を毎回書き出すように実装していたので,設定ファイルが大きくなるに従って,この更新処理に非常に時間がかかるようになっていたようです.私の手元の環境で計測してみたところ,約300項目のデータを出力するために最大で4秒程度使っていました.
1.6.6 の更新では,この処理を一新して,そもそも TIniFile クラスを使わず,テキスト形式で項目と値の組を直接書き出すようにしました.これにより,数十ミリ秒で処理が完了するようになりました.正直なところ,選択した項目だけを更新するなんていう処理がまったく必要なさそうなレベルの高速化です.
2010-02-25 [長年日記] ▲
_ [hyCalendar] Vector にレビューが掲載されました ▲
昨日,hyCalendar 1.6.5 のレビューを掲載していただきました.ありがとうございます.
_ [ツール] 学会の自動ベル押しソフトウェア比較 ▲
卒論の前にちょっとだけ調べていて,いくつか知らないツールも見つけたので整理しておきます.とはいえ,もう卒論も終わっちゃったので使う機会は来年までなさそうですが.
- Autobell.10秒単位でタイマー設定可能な,アラームを鳴らすだけのソフトウェアです.シンプルなツールなんですが,このソフトは,1分あたり1秒ぐらい遅れます.
- 休八の学会タイマー.発表の残り時間を画面に大きく表示するソフトウェアです.かなり有名ですが,1分あたり数秒の計測誤差(タイマーの進行が現実時間よりも遅い)があります.10分ぐらいの発表が連続してるようなスケジュールがきつい場面では,遅れがかなり目立ちます.
- 学会たいま〜 座長の友は,休八の学会タイマーとよく似たソフトウェアで,誤差がありません.ただし,ベルを鳴らす時間が分単位でしか指定できません.ベル鳴らすタイミングを30秒単位で指示されない限りは,使えると思います.
- 座長のjsは,JavaScriptで書かれたツールです.座長の友よりも時刻の設定などがやりやすく,秒単位でのベルのタイミング指定が可能となっており,時間計測の誤差もありません.デフォルトでは音を鳴らさない設定になっている(ダウンロードして中身を書き換える必要がある)ほか,Firefox で動かすと wav ファイル再生するのに QuickTime プラグインが要求されるので,初回使うときには若干の準備が必要です.
上記で「誤差がない」と書いてるのは,とりあえず正確さが必要そうな30分ぐらいの動作でチェックしてます.
2010-02-06 [長年日記] ▲
_ [お知らせ][hyCalendar] hyCalendar 1.6.5 リリース ▲
日付の数字と祝日の名前のフォントに差があるとき,期間予定の横線がずれてしまう問題を修正しました.
そのほか,いただいた要望を反映して機能追加を行っています.設定ダイアログでは,「他の月の日の表示色」として,メインで表示している月以外の日付数字を灰色表示することができましたが,予定のデータまで灰色に表示できるようになりました.
その他,印刷関連のオプションがいくつか増えています.印刷ダイアログの設定自体は,今まで部分的に保存していましたが,今回のリリースで,プリンタ情報と,印刷する区間を除き,すべて保存するようにしました.
まとまった修正時間がほとんど取れず,1時間程度の編集作業を何度かに分けて実施する形での開発となっているため,十分にテストが行き届いてない点があるかもしれません.バージョンを更新するときは,必ずデータファイルのバックアップを取っておいてください.
2010-01-04 [長年日記] ▲
_ [VolumeDeskbar] Volume Deskband ▲
年末年始を挟んでしまって紹介が遅れてしまいましたが,「アドエス小物日記」の Jiro 様から, Volume Deskband を作りましたという非常に嬉しいお知らせをいただきましたので,ここで紹介させていただきます.
Volume Deskband は,Volume Deskbar のクローンで,Deskbar とほぼ同じ機能を,Microsoft Windows Vista および Windows 7 の 64ビット版から利用できるようにしたものです(もちろん32ビット版もあります).
Volume Deskbar の見かけが単なる四角い枠だったものに比べると,枠の角が取れたり,枠の色についてもグラデーションが設定できるようになって,ちょっと格好よくなっています.標準の設定では,バーをシングルクリックしたのち,さらにマウスクリック,あるいはマウスホイール上下で音量を調整することになります.機能が完全に同じというわけではなく,マウスカーソルを重ねただけでホイールが有効になったりはしませんし,また,ホットキーもありません.このような差異が気にならず,かつ,64ビット版OSで Volume Deskbar の機能を利用したいと思っている人は,ぜひ試してみてください.
Volume Deskbar の64ビットOSへの対応はずっと先送りになっていましたし,今回,Visual C++ で独自にコードを書き起こしていただいたことには,本当に感謝しています.
2009-12-27 [長年日記] ▲
_ [研究] Java ソースコード解析 対 バイトコード解析 ▲
メソッド呼び出し関係がほしくて久しぶりに Java のバイトコード解析を試してみたので,ソースコード解析と比べた場合の違いを整理してみました.
ソースコードとバイトコードの解析の違いを特徴づけるコード例は,以下のようなものがあります.
String name = target.getClient().getName();
このソースコード断片を含むファイルを解析してメソッド呼び出し関係を調べようという場合,まず target 変数の宣言を参照してクラス名を解決し,そのクラスのコードから, getClient() メソッドのシグネチャを取得し,その戻り値の型あるいはその親クラスに getName() メソッドが宣言されているかどうかを調べる必要があります.一方,コンパイル後のバイトコード上では,メソッド呼び出しの情報はすべて invokevirtual などの命令に格納されていますので,別ファイルをいちいち参照しなくとも,コンパイル後のクラスファイル単体で,呼び出し先のメソッドの情報を獲得することができます.
当たり前のことと言われればそれまでですが,ソースコードとバイトコードの解析の大きな違いの1つは,ソースコード上での「他のソースファイルへの参照」が,バイトコード上では Java コンパイラによって解決済みの情報となっているという点です.
ソースコードとバイトコードの解析の違いには,以下のようなものが挙げられます.
- コメント
ソースコード上にのみ存在する情報です.バイトコード解析では,参照することができません.
- 制御構文情報
ソースコードに対して構文木を構築することで,制御構文の入れ子関係などにアクセス可能です.バイトコード上では,いわゆる
IFとGOTOからなる簡単な構造に変換されています.制御フローグラフを構築するにはバイトコードのほうが簡単ですが,breakやcontinueなどの出現が,ループの終了条件判定などと区別できない可能性があります. - 厳密なソースコード位置
バイトコードがどのソースコードに対応するかについては,実行可能な命令についてのファイル名と行番号の対応関係しか保存されません.1行に複数の文が並んでいるものを区別したい場合や,宣言(実行可能な命令を伴わない文)の位置情報がほしい場合には,ソースコードの構文解析が必要です.
- メソッド呼び出し
バイトコード上では,1つのクラス単体で,呼び出し対象のメソッドのシグネチャが取得可能です.一方,ソースコードの場合,別ファイルの情報を参照しなくてはなりません.大規模なプログラムを解析するとき,下手に実装するとメモリが不足しがちになるほか,必要なファイルが足りない場合への対応方法も考えておく必要があります.
- 動的束縛の解決
どちらの解析手法の場合も,動的束縛の解決可能性を調査するには,プログラムに含まれるすべてのクラスについて,メソッドシグネチャと階層情報を集める必要があります.バイトコード解析のほうが,JARファイルから列挙すればよいので,実装が容易です.
- 型名の解決
ソースコード上では,参照可能なファイル集合の中から,型名を解決する必要があります.Java の場合,
import文でのワイルドカードの存在や,内部クラスの取り扱いのおかげで,自作するのはかなり大変です.一方,バイトコード上では,コンパイラが解決した完全限定名を利用することができるので,各クラスを個別に解析していくことができます.ただし,ソースコード解析のほうも,正確な結果が得られなくてもかまわない場合には,1クラスだけから可能な限り型推論する手法などの適用を検討する価値があると思います. - 不正なファイルへの対処
ソースコードの場合,Java のバージョンによって文法が変更されているので,それによって生じるコンパイルエラーへの対処が必要ですし,また,誤ってコンパイルエラーのあるファイルが投入される可能性もあります.バイトコードの場合は,異なるJDKバージョン用にコンパイルされているファイルや,デバッグ情報が付与されていないものに対処する必要があります.
- 言語仕様とコンパイラ実装への依存性
バイトコード解析の結果は,言語仕様上規定されていないような式の評価順序について,コンパイラが勝手に選んだ順序を反映していることがあります.また,コンパイル時点で適用された最適化の結果を反映することがあります.
ソースコード解析とバイトコード解析のどちらかが一方的に有利ということはありません.しかし,ソースコード解析のほうが実装の手間が大きく,また構文解析などの処理コストも無視できないので,個人的な好みでいうと,型情報などは事前にライブラリからバイトコード解析で抽出しておき,対象プログラムのソースコード解析は必要最小限に抑えるという方法を採用したいところです.
2009-11-29 [長年日記] ▲
_ [VolumeDeskbar][お知らせ] Volume Deskbar 1.1.2 リリース ▲
ホットキーでミュート切り替えができるようになりました.先月にこの要望出してくださった方,お待たせしておりました.
例によって,32ビット版のみの提供です.64ビットの Explorer には32ビットでコンパイルした DLL はリンクできないので,64ビット版OSでは使えません.Delphi の 64ビットコンパイラが出るのを信じて待っていてください.Visual C++ や C# を使っての COM プログラミングのやり方とかの知識がちょっと足りてませんので,言語またいでの新バージョン開発というのはできてません.
2年ぶりの更新なんですけど,残念ながらそれだけの更新です.いくつか他にもトラブル報告はいただいていますが,手元での状況再現がうまくいかなくて,どこに問題があるのかが把握できていない状態です.そのうちログ記録バージョンとか作るかもしれません.
2009-11-21 [長年日記] ▲
_ [近況] ASEから帰ってきました ▲
主目的はワークショップ開催だったんですが,ASEも全参加してから帰ってきました.
ASEは,形式手法またはツール系,というイメージがあったんですが,今年は,テストと欠陥検出が多かった気がします.2日目の基調講演の人が「Instrumentation-based Verification」という,完全な検証ではなく,モデルのある一定のカバレッジ範囲だけを検証するという方式を説明してました.モデル上でテストしてるだけとも言えなくはないですが,形式的検証よりも現実的なアプローチという印象はありました.
また,欠陥検出のほうは,ライブラリのメソッド呼び出し順序の誤りを検出しようというネタが,静的解析・動的解析それぞれの手法が採録されています.わりと長いこと研究されてるネタではありますが,Tao Xie とか Andreas Zeller のグループが着実に成果を積み重ねている気がします.
今回の収穫:動的解析において,あるオブジェクトの使用方法が "typical" であるかどうか,というのを調べるのに,1プログラムで発見した使用方法が,別のプログラムでも発見できるか,というのを調べている研究がありました.この評価方式は使えそうです.
_ Jiro [わざわざご紹介していただき、本当にありがとうございます。 上でコメントして頂いた機能は、クローンを名乗る以上、実..]
_ ryo [おお! まさか64bit対応版を作っていただけるとは・・・。 ありがたく使わせていただきます! お二方とも、..]