« February 2004 | Main | April 2004 »

2004.03.31

XP SP2

英語とドイツ語だけかと思っていたら、日本語版の XP SP2 RC1 がいつの間にか出ていますね。

| | Comments (2) | TrackBack (0)

2004.03.28

HTTP.SYS in XP SP2

Windows XP SP2 に HTTP.SYS が入る、という話が Blog であった。MS の記事は、Breaking Changes (下位互換性がなくなる部分の変更) についてフォーカスして書いてあるので、説明が見当たらず真偽のほどが定かでないが、事実であればこれはうれしい。
今の Windows XP でサーバー機能を実現しようとすると、ソケットベースで作るか、IIS に依存するかがもっとも考えられる選択肢となる。将来の拡張のため HTTP プロトコルの上に載せたい、と思ったら IIS に依存するしかないが、IIS は標準ではインストールされないし、「使わないものは入れない」というセキュリティポリシーにも引っかかる。
HTTP.SYS はこれを解決する。HTTP.SYS は Windows Server 2003 で追加された HTTP 用のドライバで、カーネルドライバとして動作する。これを使うと、IIS に頼ることなく、API ベースでソケットを作るように HTTP サーバーを作れる。Winodws Server 2003 の IIS 6.0 もこれに依存しており、IIS の一部が API として切り出された、と言ってもいいだろう。
MS としてもこれは重要だったのだと思われる。IIS 6.0 では、パフォーマンス向上のためにカーネルドライバとして切り出した、と説明していたが、今後の SQL Server 2005 (Yukon) や Indigo など、HTTP / Web Service として動作するソフトが増えるに従い、それらのソフトが IIS に依存することを避けなくてはならない。Web Service の実現のために IIS を入れるというのは抵抗が大きい。SOA ベースの疎結合サービスを考えると、ソケットベースでなく HTTP の上に載せて行きたいが、自身が出しているセキュリティポリシーに背反していることを HTTP.SYS で解決するわけだ。
IIS に依存することはもう一つ、開発コスト上大きな問題となる。IIS のサブシステムとしてプロトコルハンドラが動作するため、こちらのアプリとは別プロセスになってしまう。アプリの持っているデータを HTTP で出すために、IIS 上で動作するプロトコルハンドラとプロセス間通信をしなければならない。
その HTTP.SYS が Windows Server 2003 にしかないことはその利用価値を大きく下げていたが、XP SP2 に入れば利用できるアプリは大きく増える。うちでもつい先日クライアントに小さいサーバー機能を載せたくて、しかし IIS を入れたくないのでソケットベースで作ったところだった。HTTP.SYS があれば、HTTP ベースで作ることができる。
XP SP2 はセキュリティも大きく強化されるので、今まで作っていたソフトも対応を余儀なくされそうだが、それでも楽しみなソフトの一つだ。

| | Comments (1) | TrackBack (0)

2004.03.27

VS 2005 Technology Preview

英語の開発者Blogの間ではかなり書かれているが、MSDN Universal Subscription を持っている人向けに Visual Studio 2005 (Whidbey) Technology Preview のダウンロードが始まった。今ダウンロード中。。。VS 2005 Developer Center に情報が出始めているし、IDE Enhancements for C# Developers なんてビデオもあるようで、これまたダウンロード中。。。
VS 2005 の強化項目は多いのでとても紹介しきれないが、PDC 版に入っていなかった Windows CE 用の .NET Compact Framework の強化が入っている模様。画面ショット が掲載されている。
VS 2002/2003 の .NET CF はかなりがっかりするものだった。特に

  • COM との Interop がない
  • Handle など Interop で必須になるプロパティが公開されていない
  • C++ は使えない(従来どおり Embedded Visual C++ を使う必要がある)
の3点において、なんだか言語設計者の決めた枠からは出れない感じがして、java のようだと感じていた。
製品開発においては、言語がきれいであることよりも、Write Once Run Anywhere という夢のような話よりも、今実現したいことができなければ困る。.NET が java よりも優れた点を1つあげるとするとそこだろう、と常々思っているが、.NET CF に関してはポリシー的に java に似たものを感じていた。
PDC で「We Are Listening to You!」と言ってこの3つをすべて強化する、と言っていたので期待していたが、PDC 版の VS 2005 では見ることができなかったが、この Technology Preview には入っているということらしい。
リリースは来年に延びたが、前述 のように今年後半の Beta 2 にはそれでコンパイルした製品を出荷してもよい、という "live license" が含まれる。秋ごろになったら、CE で何かやってみたいものだ。

| | Comments (0) | TrackBack (0)

2004.03.14

東芝 Dynabook SS M205 Tablet PC

前述 した 東芝 Dynabook SS M200 Tablet PC の WIFI 802.11g 版が米国で発表された模様。M205 という名前になるらしい。PC World (英文) から
遅かった。もう買ってしまった。Gateway みたいに Mini PCI カードのアップグレードしてくれないかな。

| | Comments (1) | TrackBack (1)

.NET GC & Interop クイズ解答編

.NET GC & Interop クイズ の解答。
問題は Work メソッド内にある。Work メソッドが NativeMethod.WorkOnHandle を呼び出す時に

  1. this._handle をスタックに積む
  2. NativeMethod.WorkOnHandle
という手順を踏むが、この2つの手順の間で GC が発生した場合、this がすでにどこからも参照されていない可能性がある。.NET の GC では、メソッド呼び出しは呼び出されたオブジェクトを参照としてカウントしないためだ。
GC がこのオブジェクトを廃棄しようとしてファイナライザの ~Wrapper を呼び出すと、その中で NativeMethod.CloseHandle が呼び出されて this._handle は close されてしまう。その後に NativeMethod.WorkOnHandle が呼び出されるので、そこでエラーになってしまう。
正しい Work メソッドは以下のとおり。
  public void Work() {
    NativeMethod.WorkOnHandle(this._handle);
    GC.KeepAlive(this);
  }
GC.KeepAlive は特殊な IL にコンパイルされ、指定したオブジェクトをその実行時点まで GC に廃棄されないようにしてくれる。これで NativeMethod.WorkOnHandle から帰ってくるまで this が廃棄されないようにできる。
メソッド呼び出しの間にそのオブジェクトを廃棄しないような GC であればこの問題は発生しないが、MS の記事によるとそれをしてみたらパフォーマンスにかなり影響があったためこのような設計になっているらしい。
Interop は割と簡単に使えて .NET のよい部分の一つではあるが、理解が浅いとバグの温床になることを頭に入れておこう。

| | Comments (17) | TrackBack (2)

2004.03.05

.NET GC & Interop クイズ

GC と Memory Leak の件はやはりフレームワークのバグで、KB の処置を施したら直った。以前は一日走らせていると100MB程度までメモリを食っていたのが、すっきりと直った。すっきりと直ったので、一週間ほど休暇をとることにした。
ので今日は休暇の前にちょっとプログラミングのクイズ。Interop で OS から handle を取得してラップするクラスがあるとする。
public class Wrapper : IDisposable {
  IntPtr _handle;
  public Wrapper(IntPtr handle) { this._handle = handle; }
  public ~Wrapper() { this.Dispose(); }
  public void Dispose() {
    GC.SupressFinalize(this);
    if (this._handle != IntPtr.Zero){
      NativeMethod.CloseHandle(this._handle);
      this._handle = IntPtr.Zero;
    }
  }
  public void Work() {
    NativeMethod.WorkOnHandle(this._handle);
  }
}
このクラスはある特定の条件で動作しない。その条件と直し方は?
GC などで言語やランタイムが簡単になると、それより下のレイヤーと強調して動くのはそれまでよりも難しくなる。それは仕方のないことか、それとも GC がもっとこなれてくるまでの移行期間の問題なのか、10 年後にこんな問題を考えて対処していたことをどう思うか楽しみでもある。

| | Comments (53) | TrackBack (3)

« February 2004 | Main | April 2004 »