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をだましだまし使うことにする。

2006年8月30日水曜日

TortoiseSVN 1.4RCの続き

 変わったのはリポジトリではなく作業ディレクトリのファイルフォーマットだった。なのでsvnadmin dumpもimportも可。同じ作業ディレクトリではcygwinのSubversion 1.3でsvn moveできないが、この問題は別な場所にsvn checkoutすれば解決する。

2006年8月24日木曜日

PowerShellのExecution Policy

 PowerShellをインストールした直後はPolicyが厳しいため、

The file C:\DOCUME~1\000012~1\LOCALS~1\Temp\temp.ps1 cannot be loaded. The execution of scripts
disabled on this system. Please see "get-help about_signing" for more details.
At line:1 char:43
+ C:\DOCUME~1\000012~1\LOCALS~1\Temp\temp.ps1 <<<<

とかいうメッセージを見ることになる。メッセージの指示に従って、"Get-Help about_signing"を読み、そこに書いてあるように、

Set-ExecutionPolicy RemoteSigned

で変更したら以後問題なし。

2006年8月10日木曜日

TortoiseSVN 1.4RC

 TortoiseSVNを1.4RC1にバージョンアップしたら、cygwinのSubversion 1.3.2からリポジトリを操作できなくなった。人柱モード全開。orz

svn: This client is too old to work with working copy '.'; please get a newer Subversion client

cygwinにnewer Subversion clientなんて無いよ。sed と /bin/shで一括renameしようとしたけど、TortoiseSVNで一個ずつやるしかないか。

2006年7月26日水曜日

やっぱりString.Formatは遅かった

 log4netに渡すログメッセージを用意するために、あまり考えずにString.Formatを使いまくってたら、本来の機能に支障をきたすほどに遅くなってしまった。Cでもprintfは重い関数の代表みたいなもんだから、当たり前といえば当たり前。数10msの遅れが致命的になる部分で問題が発覚したので、とりあえず文字列の埋め込みしかやってない部分をCapacity指定付きのStringBuilderに置き換えてみた。プロファイラを使って測定したわけではないが、効果は上がっている模様。期待通りの動作をしてくれている。一行で済んだ部分がAppendの連続で見苦しくなったけど、実行時間には代えられない。
 Classをsealedにするとプロパティのアクセスが速くなると言う話も見かけたので、実装が枯れてきたらそっちも試してみよう。

2006年7月21日金曜日

eAccelerator入れた

 PHPが速くなるというeAcceleratorを入れてみた。遅くは無いようだが、前からこんなもんだっけ?元々遅いと感じていたわけではないので、速くなった実感が無い。

2006年7月11日火曜日

Relaxerのバグ修正

まだ作者には未報告。無くさないようにメモ。
.origのバージョンはbeta20050810.zipだったと思う。


--- org/relaxer/Relaxer/xsd/XsdGenerator.java.orig 2005-05-04 08:27:06.000000000 +0900
+++ org/relaxer/Relaxer/xsd/XsdGenerator.java 2006-06-02 13:37:05.422488100 +0900
@@ -276,7 +276,7 @@
Element element = _makeElement(doc, "attribute");
element.setAttribute("name", aSlot.getAttrName());
if (!choice && aSlot.isRequired()) {
- element.setAttribute("use", "true");
+ element.setAttribute("use", "required");
}
_makeDatatype(element, aSlot.getDatatype());
parent.appendChild(element);
@@ -299,7 +299,7 @@
Element element = _makeElement(doc, "attribute");
element.setAttribute("name", aNode.getAttrName());
if (!choice && isRequired_(aRef)) {
- element.setAttribute("use", "true");
+ element.setAttribute("use", "required");
}
_makeDatatype(element, aNode.getDatatype());
parent.appendChild(element);

2006年7月5日水曜日

partial classで失敗

 C#のpartial classべんりと喜んでたら失敗した。
 スキーマコンパイラのxsdが吐いたコードに「ちょこちょこっ」とメソッドを追加するのにpartial classを使っている。今日はメソッドと同じようにして引数ありのコンストラクタを一個追加したのだが、これがいけなかった。暗黙のうちに利用できるデフォルトコンストラクタが無効化されてしまい、デシリアライズでコケるようになってしまった。
 自分のやったことは棚に上げて「スキーマを変えてないのに、なぜコケる?」と原因に気が付くのに手間取り、これで小一時間はまってしまった。引数無しコンストラクタを明示的に定義して解決。

C#のpartial class

 XML Schemaから変換したクラスにメソッドを追加する際に便利。フォームデザイナだけに使わせておくのはもったいない。クラスビューでメンバーを一望できるので、実装が分散してしまうデメリットは感じられない。

2006年6月19日月曜日

AutoIt 3

 Windowsの操作をスクリプト化して自動実行するAutoIt。WSHのVBScriptにマウス操作まで付けたような感じ。VBScriptでは不可能な痒い所に手を伸ばしたくなったら使うべき。目の前でマウスカーソルが勝手に動いていくのがナカナカ面白い。日本語のドキュメントは無いけれど、VBScriptを使ったことがあれば、すぐに慣れると思う。Excel VBAの真似事をしたくなったら、betaバージョンを使うべし。

2006年6月13日火曜日

Paint.NET

 OSMで紹介されてたPaint.NETを入れてみた。まだ使ってないけど、featuresとかscreenshot見るとなかなか良さげ。今の仕事では使う機会はほとんど無いけど、GIMP以外にも選択肢があるのはいい事だ。

2006年6月9日金曜日

VS用のsvn:global-ignore

 現在のglobal-ignore

*.o *.lo *.la #*# .*.rej *.rej .*~ *~ .#* .DS_Store *.exe *.obj *.pdb *.suo *.GenerateResource.Cache *.resources

 Visual StudioのプロジェクトをSubversionに入れるために、デフォルトのglobal-ignoreに対して、

*.exe *.obj *.pdb *.suo *.GenerateResource.Cache *.resources

を追加した。