免許証ジェネレータ

というのを作った。mm単位で指定してるからディスプレイ上だとちょっと小さい。ブラウザのズーム機能を使ってください。印刷すると、ほぼ本物と同じサイズ、同じ座標に項目が並ぶはず。Windowsのフォントでしか確認してませーん。LinuxMac OSのフォントに詳しい人、誰か直してください ><

ご迷惑おかけしました。とても気分を害されたと思います、申し訳ありません。お時間をとらせてしまったこと、重ねてお詫びします。同じ内容をTwitterにも投稿し、Togetter末尾に追加しました。先頭に持って来たほうがよいかと悩みましたが、時系列を重視しました。装飾し、目立たせるようにしています。
ここ数日の僕の言動で@cho45さんに誤解を抱いてしまった方へ。すべて私の被害妄想でした。どうか認識を改め直していただきたく、お願い致します。お騒がせしましたこと、申し訳ありません。

XSLTProcessorを使い回して何度もtransformToFragmentさせていたらDFが解放されてなかった件

なんか関係なかったかも…… うーん

XULアプリxwitterというtwitterクライアントを個人的に作っていて、まぁユーザは僕一人なんですが、手に馴染んでいるし、ほしい機能は自分で追加できるので愛用しています。
xwitterではtwitterのRESTレスポンスXMLXSLTXHTMLに変換しているのですが、ずっとメモリリークしていて困っていました。クロージャまみれなので、その辺なのかなぁと疑ってはみたものの、なかなか解決しなかったのですが、今朝ふと気づいたのが掲題の件です。
該当部分のコードを抜き出すと、まずXSLTProcessor生成関数。

var xsltproc = function(path) {
	var doc = document.implementation.createDocument('', '', null);
	doc.async = false;
	doc.load(path);
	var proc = new XSLTProcessor();
	proc.importStylesheet(doc);
	return proc;
};

XSLTかける度に毎回newしていてはコストがかかるだろうなぁと思って、最初にプロセッサを作るだけにしていました。

var myXsltproc = xsltproc('chrome://xwitter/content/xwitter.xsl');

XSLT変換をかけて、XHTMLのDOMツリーにinsertBeforeしているところ。

var df = myXsltproc.transformToFragment(xml, document);
_box.insertBefore(df, _box.firstChild);

そして、メモリ圧迫してきたら、そのDOMツリーを空にする処理。

_box.style.display = 'none';
_box.innerHTML = '';
_box.style.display = 'block';

しかし全くガーベジコレクションされていないようです。おかしい。insertBefore後dfは参照しませんし、DOMツリーからも抹消しているのに。どうやらmyXsltprocがずっとDocumentFragmentを掴んでいるみたいでした。解放するメソッドとかないんでしょうか。resetメソッドというのがありましたが、remove all stylesheets and parametersと書かれています。せっかくimportStylesheetしたのを消されても困りますし、もう一度newするコストと比べて軽いのかどうかも怪しい感じです…… 仕方なくXSLT変換の度に毎回newすることにしました…… これでしばらく様子を見ます……

仮想ハードディスクサイズをできるだけ小さくしてバックアップしよう。