2010年3月10日水曜日

AutoItのScriptWriterが雲隠れ



 お気に入りの自動実行アプリ AutoItは最近バージョンアップが活発で、そのせいかインストールされるショートカットがちょっと変。AutoIt用にカスタマイズされたエディタSciTEと一緒にインストールされたScriptWriter(au3record.exe)という操作記録ツールがあるのだが、このショートカットがリンク切れ状態になってしまっている。AutoIt初心者はScriptWriterの吐くスクリプトをベースにして座標やウェイト長を調整するのがお勧めなのだが、ScriptWriterが無くては始まらない。

 SciTEのUpdate Historyによると、
  • Removed au3record from the installer as this is now supplied by the Autoit3 installer.
という事なので、AutoIt本体と一緒にインストールされるらしいのだが、スタートメニューはやはりリンク切れ。どこかにあるはずと思って探したら、Extrasフォルダの下に置いてあった。スタートメニューからは、AutoIt v3⇒Extras⇒Browse ExtrasでExtrasフォルダを開いて、そのまた下のAu3Recordフォルダの中。3月7日にバージョンアップされたのに、まだ治って無かったよ。

2006年11月16日木曜日

RichTextBoxでスローダウン

 XMLで書いたスクリプトの指示に従ってシリアルポートを読み書きしつつ、内容をRichTextBoxに表示するC#のアプリを書いた。これを一晩中動かしていたら、見るも無残な劇遅になっていた。3台動かして3台とも劇重。タスクマネージャで見ると、起動時に70MB程度のメモリ使用量が250MBに増えている。
 どこかでメモリリークか?シリアルポート開きっぱなしで.NET Frameworkのバグでも踏んだかと思ったが、原因は表示用のRichTextBoxにあった。最大文字数がデフォルトの2G(21億)字のまま。全てのログを破棄せずに抱えたRichTextBoxが肥大化して、バッファ処理が通信速度について行けなくなったらしい。最大文字数を1M字に変えて解決。通信内容は全てlog4netでファイルに書いているので、表示は短くても構わないのだった。

2006年11月11日土曜日

Relaxerバグ修正

 二カ月前に指摘したW3C XML Schema変換に関するバグがようやく修正された。治るのを待っているわけにも行かず、自分用に俺パッチ作って既に解決済みだったので、もうどうでもいいって感じ。次に使うときは、RelaxerじゃなくてTrangで変換しよう。Relaxerの作者はRelaxer5というのを作ってるらしいけど、 RelaxerとかSmartDocが静かに死んでいく様を見てしまったので、よほど良い物でもない限り、手を出すことは無いだろう。

2006年11月1日水曜日

SmartDocサイト消滅

 成果物のドキュメント執筆にSmartDocを使っているのだが、生成されたドキュメントに挿入されているリンクをクリックしてぶったまげた。ドメイン失効でサイト無くなってるじゃんか。ついに作者にも見放されたか。真剣に乗り換え先を考えないといかんな。

2006年10月27日金曜日

log4netの出力を動的に

 VS2005のClickOnceで配布するアプリでlog4netを使うと、相対パスで指定したログファイルが奥深くに埋もれてしまう。実行時に指定してやればユーザが指定した場所に書けるんじゃないかとググッってみたら、ヒントが見つかった。設定ファイルの大部分をlog4net.cfgという名前で書いておいて、ファイル名だけを実行時に指定したらいいんだな。

 この時、appenderのファイル名を

<appender name="RollingLogFileAppender"
type="log4net.Appender.RollingFileAppender">
<param name="File" value="nul" />

のようにnulにしておけば、log4net.Config.XmlConfigurator.Configureを呼んだ直後の初期状態でログファイルの生成を抑止できる(unixでlog4jなら/dev/nullか?)。nul以外のファイル名を指定しちゃうと、どこかに0バイトのログファイルが生成されてしまうので注意。この後で、ログ出力が有効の場合にのみファイル名を設定してやれば、必要な時だけログを出力することができる。

public MyScriptForm()
{
InitializeComponent();
Properties.Settings appsettings =
new Properties.Settings();
if (appsettings.WriteEnabled)
{
setLogLocation(appsettings.OutputPath);
}
else
{
setLogLocation(null);
}
}

private void setLogLocation(string outputPath)
{
log4net.Config.XmlConfigurator.Configure(
new System.IO.FileInfo("log4net.cfg"));
if (outputPath != null)
{
if (!File.Exists(outputPath))
{
Directory.CreateDirectory(outputPath);
}
log4net.Repository.Hierarchy.Hierarchy hier =
(log4net.Repository.Hierarchy.Hierarchy)
log4net.LogManager.GetRepository();
if (hier != null)
{
log4net.Appender.FileAppender appender;
appender =
(log4net.Appender.FileAppender)
hier.GetLogger("MyScript",
hier.LoggerFactory).GetAppender(
"DebugLogFileAppender");
if (appender != null)
{
appender.File = outputPath +
Path.DirectorySeparatorChar + "debug.log";
appender.ActivateOptions();
}
}
}
...

2006年9月15日金曜日

またSmartDocだよ

 馬鹿の一つ覚えのように、ドキュメント原稿はSmartDoc。開発止まっちゃってて思いっきり下火なので、いいかげん他のに乗り換えたいとも思うのだが、他に乗り換える先が無い。
いまさらLaTeXでもないし、OfficeのWordは論外だし。

2006年9月1日金曜日

Trang : Multi-format schema converter based on RELAX NG

 今頃になって、Relax NG schemaをW3C XML Schemaに変換するJames Clark氏作のTrangというコンバータが存在することを知った。RelaxerでW3C XML Schemaへの変換をしている人は少ないらしく、潰し切れていないバグが散見される。これまでに2件のバグを見つけて報告しているが、Trangでは一発でバグの無い変換ができた。ただし、要素に対する型名の命名方針が違うため、Relaxerを前提にして書いたコードと互換性が無い。次の機会ではTrangを候補に入れる事にして、今回はRelaxerをだましだまし使うことにする。