2009年3月29日日曜日

/NODEFAULTLIB:msvcmrt.lib

どこかでVS2008のC++/CLIだと.NET Frameworkを使用しているのにVC++ランタイムライブラリとの依存関係が切れなくて、結局VC++ランタイムライブラリもインストール必要になってしまう&x86とx64で共存できない、というような記述を見かけた…気がしました。
後になって探したのですがどこで見かけたのやら。

で、方法 : CRT ライブラリ DLL との依存関係を削除して部分信頼アプリケーションを作成するによると/NODEFAULTLIB:msvcmrt.libを指定することにより依存関係を切れるとのこと。ただしこれでは必要な処理が足りていないのでptrustm.libかptrustmd.libのどちらかとリンクすること。

えっとこの.libによってx86かx64のどちらかに固定されてしまうのか。でも.NET Frameworkだけで動作できるようになる、VC++ランタイムライブラリのインストール不要となるならそれはそれで大きいかな。

あ、ちなみに結果がどうなるか試してません。

2009年3月28日土曜日

zh-Hansとzh-CHS

カルチャには特定カルチャとニュートラルカルチャとインバリアントカルチャがある。
特定カルチャはja-JPとかen-USとか、言語+地域情報を持つもの。
ニュートラルカルチャはjaとかenとか、言語だけで地域情報を持たないもの。特定カルチャで完全一致できなかった場合にニュートラルカルチャにフォールバックします。
インバリアントカルチャは言語も地域も表さないもの。「要するに、体系を体系たらしめるために要請される意味の不在を否定する記号なんだよ。そのアナログなのが神で、デジタルなのがゼロ。どうかな?」

で、ニュートラルカルチャには唯一の例外としてzh-CHSとzh-CHTがある。中国語には簡体字と繁体字があるから。そしてこのカルチャ名はWindows Vistaからzh-Hansとzh-Hantに変更されてたりする。

  • Windows XP上の.NET Framework 2.0 SPなしだとzh-Hansを認識しない
  • Windows XP上の.NET Framework 2.0 SP1以降だとzh-Hansを認識し、zh-CHS→zh-Hansの順でフォールバックする
  • Windows Vista上の.NET Framework 2.0 SPなし(SP1以降も)zh-CHSを認識し、zh-CHS→zh-Hansの順でフォールバックする
結局の所、Windows XPを意識するならzh-CHSを使うことになるが、例えば.NET Framework 3.5 SP1 Client Profileだと.NET Framework 2.0 SP2を含むのでzh-Hansでもいいかもしれない。

2009年3月22日日曜日

自作ツールのWindows 7対応

対応に向けて調査を始めました。途中で飽きたらそのまま放置になりますが…。
まず今のツールはUIを設計する気がないため設定項目は全てiniを使い、タスクトレイに置いたアイコンのメニューから最低限の操作ができるようになっています。
Windows 7ではタスクトレイはデフォルトで非表示なので困ってしまうため抜本的な見直しを行うことにしました。

Windows Live Messengerがtaskbarを使いこなしているためこれを参考に調査を進めます。まずWindows 7環境ではこんな感じ。

タスクトレイにはアイコンが出なくなります。メインウィンドウの他にもう一つウィンドウが存在するような。そしてタスクバーを右クリックするとこんな感じ。
プログラムから好きなメニューを登録できます。ちなみにこのメニューはスタートメニューにも表示されてこんな感じ。

さてメインウィンドウを閉じるとこんな感じ。

やはり何かいるようです。spyで見ると


とんでもない座標に隠しWindowがいました。これを参考にしてみようと思います。

2009年3月19日木曜日

二項係数

どこかの影響を受けて書いてみました。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>二項係数</title>
<base href="http://ajax.googleapis.com/ajax/libs/dojo/1.2.3/" />
<link rel="stylesheet" type="text/css" href="dojo/resources/dojo.css" />
<link rel="stylesheet" type="text/css" href="dijit/themes/soria/soria.css" />
<script type="text/javascript" src="dojo/dojo.xd.js" djconfig="parseOnLoad: true"></script>
<script type="text/javascript">
// <![CDATA[
dojo.require("dijit.form.NumberTextBox");
var MAX = 10000000;
function onChange() {
var n = N.attr('value');
var k = K.attr('value');
if (isNaN(n) || isNaN(k) || k > n)
return;
k = Math.min(k, n - k);
if(k == 0)
k = 1;
else {
var numerator = [];
for(var i = 0; i < k; i++)
numerator.push(n - i);

for(var i = 2; i <= k; i++) {
var j = i;
for(var p = 2; j > 1; p++) {
while(j % p == 0) {
j /= p;
for(var l = 0; l < numerator.length; l++) {
if(numerator[l] % p == 0) {
numerator[l] /= p;
break;
}
}
}
}
}
var result = [1];
dojo.forEach(numerator, function(i) {
var rest = 0;
for(var j = 0; j < result.length; j++) {
var k = result[j] * i + rest;
result[j] = k % MAX;
rest = (k - result[j]) / MAX;
}
if(rest > 0)
result.push(rest);
});
k = result.pop().toFixed();
dojo.forEach(result.reverse(), function(i) {
k += (i + MAX).toFixed().substr(1);
});
}
dojo.byId('result').innerHTML = k;
}
// ]]>
</script>
</head>
<body class="soria">
<h1><sub>n</sub>C<sub>k</sub></h1>
n = <input type="text" dojotype="dijit.form.NumberTextBox" jsid="N" value="0"
required="true" constraints="{fractional: false, min: 0}" intermediatechanges="true" onchange="onChange" /><br />
k = <input type="text" dojotype="dijit.form.NumberTextBox" jsid="K" value="0"
required="true" constraints="{fractional: false, min: 0}" intermediatechanges="true" onchange="onChange" /><br />
<span id="result"></span>
</body>
</html>

2009年3月13日金曜日

Windows Server 2008 R2 build 7048

そろそろ2008 R2に環境を移そうとしています。ベータテストと、自作アプリのWindows 7対応のために。
Windows 7ではタスクバーが新しくなり、右下の通知領域がデフォルトで非表示になってしまうので、
アプリケーションの設計を見直す必要が。
で、どうせならHyper-Vとか使いたいので2008 R2です。

build 7048ですがところどころ不安定でした。まだ翻訳がおかしいですし、機能の追加の後の再起動に
失敗したりVirtual Clone Driveのインストールの直後はシャットダウンできなかったり。
ただ、RadeonのバグいドライバでWindows Vistaだとblue screenなのが、2008 R2だとドライバの
再起動を繰り返しつつも耐えてました。(耐えてる間に正常に再起動がかけれた。)
まぁRadeonがわるいんですが。