ページ

2004年9月22日水曜日

タイムアウトつきのメッセージボックス (C# による実装)

AILight さんとこの掲示板 で出ていたので公開。


指定した時間がたつと勝手に閉じるようにしたメッセージボックスです。
たとえば、こんな風に使います。





MessageBoxTimeout.Show("テスト", 5000);



こうすると 5秒(5000ミリ秒)たつとボタンを押さなくても勝手にメッセージボックスが閉じます。もちろん、ボタンを押したときは普通のメッセージボックスと同じように即座に閉じます。


仕組みは、別スレッドでタイムアウトを監視していて、時間がきたらメッセージボックスに PostMessage して 「キャンセルしたことにしちゃう」 というものです。PostMessage すべきメッセージボックスを探すときに、そのメッセージボックスを開いたスレッドと同じスレッドのみを対象としているので別プロセス or 別スレッドが表示しているメッセージボックスを間違って閉じちゃうということはないはずです。
ただ、以下のソースを見てもらうとわかるとおり Win32 API を使いまくりです。というか、このクラスってずいぶん前に Win32 API / C++ で作ったものを C# に置き換えただけだったりします。ほんとは、.NET らしい実現方法があるのかもしれませんが、とりあえずこれで良しとしています(^^;





using System;

using System.Runtime.InteropServices;

using System.Threading;

using System.Windows.Forms;

using System.Text;

 

/// <summary>

/// タイムアウトつきのメッセージボックスを表示するクラスです。

/// </summary>

public class MessageBoxTimeout

{

    [DllImport("kernel32.dll")]

    private static extern uint GetCurrentThreadId();

 

    private delegate int EnumWindowsProc(IntPtr hWnd, IntPtr lParam);

 

    [DllImport("user32.dll")]

    private static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam);

 

    [DllImport("user32.dll", SetLastError=true)]

    private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

 

    [DllImport("user32.dll")]

    private static extern int GetClassName(IntPtr hWnd, [Out] StringBuilder lpClassName, int nMaxCount);

 

    [DllImport("user32.dll")]

    private static extern bool IsWindowEnabled(IntPtr hWnd);

 

    [DllImport("user32.dll", SetLastError = true)]

    [return: MarshalAs(UnmanagedType.Bool)]

    private static extern bool PostMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);

 

    /// <summary>

    /// 別スレッドでタイムアウトを監視するためのクラスです。

    /// </summary>

    private class TimerThread

    {

        private DateTime timeoutTime;

        private uint currentThreadId;

        private bool terminateFlag;

        private Thread thread;

 

        /// <summary>

        /// コンストラクタです。

        /// メッセージボックスのタイムアウト監視を開始します。

        /// </summary>

        /// <param name="timeoutMillisec">タイムアウト値(ミリ秒)。</param>

        public TimerThread(int timeoutMillisec)

        {

            this.timeoutTime = DateTime.Now.AddMilliseconds(timeoutMillisec);

            this.currentThreadId = GetCurrentThreadId();

            this.terminateFlag = false;

            this.thread = new Thread(new ThreadStart(this.ThreadProc));

            this.thread.Start();

        }

 

        /// <summary>

        /// スレッド関数です。

        /// </summary>

        private void ThreadProc()

        {

            while (!this.terminateFlag)

            {

                Thread.Sleep(100);

                if (DateTime.Now > this.timeoutTime)

                {

                    // タイムアウトが発生

                    // EnumWindows API を使ってメッセージボックスウインドウを探す

                    EnumWindows(new EnumWindowsProc(this.EnumWindowsProc), new IntPtr(0));

                    return;

                }

            }

        }

 

        /// <summary>

        /// メッセージボックスウインドウを探して、見つかった場合は閉じます。

        /// </summary>

        /// <param name="hWnd"></param>

        /// <param name="lParam"></param>

        /// <returns></returns>

        private int EnumWindowsProc(IntPtr hWnd, IntPtr lParam)

        {

            uint processId;

            uint threadId;

            threadId = GetWindowThreadProcessId(hWnd, out processId);

            if (threadId == this.currentThreadId)

            {

                StringBuilder className = new StringBuilder("", 256);

                GetClassName(hWnd, className, 256);

                if (className.ToString() == "#32770" && IsWindowEnabled(hWnd))

                {

                    const int WM_COMMAND = 0x111;

                    PostMessage(hWnd, WM_COMMAND, new IntPtr(2), new IntPtr(0));

                    return 0;

                }

            }

            return 1;

        }

 

        /// <summary>

        /// タイムアウト監視用スレッドを終了させます。

        /// </summary>

        public void Terminate()

        {

            this.terminateFlag = true;

            this.thread.Join();

        }

    }

 

    /// <summary>

    /// 指定したテキストのボタンを表示するメッセージ ボックスを表示します。

    /// </summary>

    /// <param name="text">メッセージ ボックスに表示するテキスト。</param>

    /// <returns><see cref="DialogResult"/> 値の 1 つ。</returns>

    public static DialogResult Show(string text, int timeoutMillsec)

    {

        TimerThread tt = new TimerThread(timeoutMillsec);

        try

        {

            return MessageBox.Show(text);

        }

        finally

        {

            tt.Terminate();

        }

    }

 

    /// <summary>

    /// 指定したテキスト、およびキャプションのボタンを表示するメッセージ ボックスを表示します。

    /// </summary>

    /// <param name="text">メッセージ ボックスに表示するテキスト。</param>

    /// <param name="caption">メッセージ ボックスのタイトル バーに表示するテキスト。</param>

    /// <returns><see cref="DialogResult"/> 値の 1 つ。</returns>

    public static DialogResult Show(string text, string caption, int timeoutMillsec)

    {

        TimerThread tt = new TimerThread(timeoutMillsec);

        try

        {

            return MessageBox.Show(text, caption);

        }

        finally

        {

            tt.Terminate();

        }

    }

 

    /// <summary>

    /// 指定したテキスト、キャプション、およびボタンのボタンを表示するメッセージ ボックスを表示します。

    /// </summary>

    /// <param name="text">メッセージ ボックスに表示するテキスト。</param>

    /// <param name="caption">メッセージ ボックスのタイトル バーに表示するテキスト。</param>

    /// <param name="buttons">メッセージ ボックスに表示されるボタンを指定する <see cref="MessageBoxButtons"/> 値の 1 つ。</param>

    /// <returns><see cref="DialogResult"/> 値の 1 つ。</returns>

    public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, int timeoutMillsec)

    {

        TimerThread tt = new TimerThread(timeoutMillsec);

        try

        {

            return MessageBox.Show(text, caption, buttons);

        }

        finally

        {

            tt.Terminate();

        }

    }

 

    /// <summary>

    /// 指定したテキスト、キャプション、ボタン、およびアイコンのボタンを表示するメッセージ ボックスを表示します。

    /// </summary>

    /// <param name="text">メッセージ ボックスに表示するテキスト。</param>

    /// <param name="caption">メッセージ ボックスのタイトル バーに表示するテキスト。</param>

    /// <param name="buttons">メッセージ ボックスに表示されるボタンを指定する <see cref="MessageBoxButtons"/> 値の 1 つ。</param>

    /// <param name="icon">メッセージ ボックスに表示されるアイコンを指定する <see cref="MessageBoxIcon"/> 値の 1 つ。</param>

    /// <returns><see cref="DialogResult"/> 値の 1 つ。</returns>

    public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, int timeoutMillsec)

    {

        TimerThread tt = new TimerThread(timeoutMillsec);

        try

        {

            return MessageBox.Show(text, caption, buttons, icon);

        }

        finally

        {

            tt.Terminate();

        }

    }

 

    /// <summary>

    /// 指定したテキスト、キャプション、ボタン、アイコン、および既定のボタンを表示するメッセージ ボックスを表示します。

    /// </summary>

    /// <param name="text">メッセージ ボックスに表示するテキスト。</param>

    /// <param name="caption">メッセージ ボックスのタイトル バーに表示するテキスト。</param>

    /// <param name="buttons">メッセージ ボックスに表示されるボタンを指定する <see cref="MessageBoxButtons"/> 値の 1 つ。</param>

    /// <param name="icon">メッセージ ボックスに表示されるアイコンを指定する <see cref="MessageBoxIcon"/> 値の 1 つ。</param>

    /// <param name="defaultButton">メッセージ ボックスの既定のボタンを指定する <see cref="MessageBoxDefaultButton"/> 値の 1 つ。</param>

    /// <returns><see cref="DialogResult"/> 値の 1 つ。</returns>

    public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton, int timeoutMillsec)

    {

        TimerThread tt = new TimerThread(timeoutMillsec);

        try

        {

            return MessageBox.Show(text, caption, buttons, icon, defaultButton);

        }

        finally

        {

            tt.Terminate();

        }

    }

 

    /// <summary>

    /// 指定したテキスト、キャプション、ボタン、アイコン、既定のボタン、およびオプションを表示するメッセージ ボックスを表示します。

    /// </summary>

    /// <param name="text">メッセージ ボックスに表示するテキスト。</param>

    /// <param name="caption">メッセージ ボックスのタイトル バーに表示するテキスト。</param>

    /// <param name="buttons">メッセージ ボックスに表示されるボタンを指定する <see cref="MessageBoxButtons"/> 値の 1 つ。</param>

    /// <param name="icon">メッセージ ボックスに表示されるアイコンを指定する <see cref="MessageBoxIcon"/> 値の 1 つ。</param>

    /// <param name="defaultButton">メッセージ ボックスの既定のボタンを指定する <see cref="MessageBoxDefaultButton"/> 値の 1 つ。</param>

    /// <param name="options">メッセージ ボックスで使用する表示オプションと関連付けオプションを指定する <see cref="MessageBoxOptions"/> 値の 1 つ。</param>

    /// <returns><see cref="DialogResult"/> 値の 1 つ。</returns>

    public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton, MessageBoxOptions options, int timeoutMillsec)

    {

        TimerThread tt = new TimerThread(timeoutMillsec);

        try

        {

            return MessageBox.Show(text, caption, buttons, icon, defaultButton, options);

        }

        finally

        {

            tt.Terminate();

        }

    }

}

2004年9月15日水曜日

TechEd 2004 Yokohama レポート - 9/10(金) TechEd 4日目

9/10(金) TechEd 4日目


■ T2-367 SQL Server 2005 : SQLCLR - .NET Framework ベースのデータベースプログラミング -
スピーカーはマイクロソフトの梅津さん。Room B。


うーん、やっぱり面白いです、SQLCLR。


テーブル値ファンクションを SQLCLR で作るといろんなことに使えそうですよねぇ(具体的になにに使えるかはすぐには思いつかないですが(^^; )。


SQLCLR と直接関係あるわけじゃありませんが、パフォーマンスログを取っておけば、プロファイラでプロファイルといっしょに表示されるそうです。どこで負荷が高くなっているのかなんかを追いかけるときに便利ですね。


SQLCLR でもユーザ定義関数の場合はデータアクセスは読み込みのみ可だそうです(T-SQL も同じだっけかな)。ただ、その際は DataAccessAttribute で明示してあげる必要があるそうです。


[SqlProcedure] の場合、引数を ref にすると T-SQL の output になるそうです。また、戻り値がデフォルトで void ですが SqlInt32 に変えることはできるそうです。


System.Web.Mail は SQLCLR からは使えないけど、Web Service は普通に呼べるという話がありました。どちらも TCP を使った通信という意味では似たようだと思うんですけど、なんでこういう違いがあるんでしょう?こういったセキュリティ回りのことは要調査でしょうね。


最後のほうで、「データアクセスには T-SQL を使うべき」 「ビジネスロジックは論理的にわけるべき(すべてを SQLCLR で済ましたりしない)」 という話がありました。
やっぱりそうですよねぇ。
T-SQL ではなく SQLCLR を使うべきところとしては、



  • テーブル値関数はぜひ使う(T-SQL に比べて 3倍くらいのパフォーマンスが出ることも)

  • 集計関数もサーバカーソル、クライアントカーソルより高速になる可能性が高い。

  • スカラー値関数、ユーザ定義型も SQLCLR のほうがいい場合が多い。

ということでした。


■ T5-418 Web Service Enhancements 2.0 を利用したメッセージングアプリケーションの構築
スピーカーはアマゾンジャパンの吉松さん(MVP でもある)。Room B。


とてもおもしろいセッションでした。実はアンケートの 「一番よかったセッション」 で私はこのセッションを上げました。


そうかぁ、Web サービスは RPC over Web ではなかったんですねぇ。
目から鱗という感じでした。
# けど、便利で楽チンだからという理由で WebMethod を使っちゃダメですか?
# あれ?けど、.NET Remoting over HTTP にすれば済んじゃう場合がほとんどで、
# WebMethod を使ったほうがいい場合なんてほとんどないかも。


■ Peer Talk Lunch
スピーカーの方やエバンジェリストの方などと話をしながら食事(立食)ができるランチです。
私も何人かの方とお話させていただきました。
# しかし、こういう場になると必ず文字コード認識とタイムゾーン、
# MSHTML の話をしているような気がする>某その筋の方(^^


■ T5-409 上級者のための ASP.NET プログラミング
スピーカーは NEC の山崎さん(MVP でもある)。Room A。


正直言って、このセッションはちょっと残念なセッションでした。
いや、別に内容自体がどうこうというわけじゃないんですよ。ただ、このセッションの内容が上級者向けとはとても思えないというか。この内容で喜ぶのは初心者レベルの人で、中級者くらいの人にはちょっとした復習くらいじゃないのかなぁ。


それと、途中で出てきた設定ファイルの読み込みについては、IConfigurationSectionHandler だけじゃなく XmlSerializer と組み合わせて使ったほうがいいんじゃないかと思うんですが。


■ T2-368 SQL Server 2005 : XML テクノロジー
スピーカーはマイクロソフトの高橋さん。Room B。


いやー、やっぱり SQL Server 2005 の XML はおもしろいなぁ。


SQL Server 2005 では XML データ型が増えてるわけですが、XML データ型は Uniqe 制約、キー制約はつけることはできないそうです(そりゃそうだ)。


XML データ型は 「実際には XML インスタンスを格納する」 とのことでした。んで、ここで疑問。
格納されている XML インスタンスって具体的には何なんでしょう?まさか XML を文字列で保存してるってわけじゃないんですよね?ひょっとして CLR の XmlDocument をシリアライズしたものなんでしょうか?それとも独自の DOM だったりするんでしょうか?
それから XML データ型のサイズは 2G までってことだったんですが、何が 2G までなんでしょう?XML を文字列で表現したときの上限が 2G なんでしょうか?(その場合、utf-8 か utf-16 かでずいぶん違うな) それとも DOM をシリアライズした結果が 2G なんでしょうか?(でも、それじゃ入れてみないことにはどれくらいのサイズになるのかわかんないな)
うーむ。


XML Schema を指定したほうがあらかじめ解釈の準備ができるため速いというようなことも言っていたような。これもちょっと気になるところですね。
ただ、スキーマの取り扱いにはちょっと面倒なところもありますね。慣れが必要そう。


そういえば、XML データ型内のノードなどに対してインデックスを作れるそうです(XML インデックス)。ただ、プライマリ XML インデックスが必要で、これはルートノードなどに作るそうです。するとセカンダリ(というかプライマリ以外)のインデックスが作れるようになり、これはタグ、値、パスに対して作成できるそうです。
ちょっとタグとパスがどう違うのかとか属性は?とかよくわかんないところもありますが、なんにしろ 「いろいろとインデックスが作れる」 ということのようです。


そういや、SQL の select にあたるのが XQuery で、select 以外のところは XML-DML と言うそうです。ほんとは XQuery に更新系も含まれてくれるといいんですけどね。


■ T5-407 Windows フォームにおけるパフォーマンス向上の実現
スピーカーはマイクロソフトの平井さん。Room B。


基本的なことだと思えるような部分もありましたけど、なかなかおもしろいセッションでした。


言われてみればそりゃそうなんですが、



  • DrawImage は Width と Height を指定しないと画面 DPI にあわせてスケーリングされてしまう。

  • 水平・垂直なら DrawLine より FillRectangle のほうが速い(ペンよりブラシのほうが速い。ペンは端の処理などがあるため)。

  • グラフィックのときは SmoothingMode。アンチエイリアスがなければ当然速い。

  • テキストのときは TextRenderingMode。アンチエイリアスがなければ当然速い。

なんてのは忘れがちなところですね。


マルチスレッディングのところで Form.Invoke を指して 「ここは必ず Invoke です。ここを BeginInvoke にすると、また、別のスレッドにいっちゃいますからうまく動きません」 みたいなことを言ってましたがそんなことないですね。Form.BeginInvoke は別のスレッドになんていきません。非同期 delegate の Invoke、BeginInvoke と Form(Control)の Invoke、BeginInvoke とでごっちゃになっちゃってたものと思われます。


Windows.Forms の場合 ngen も効果があるかも、というのは 「へぇ~」 でした。


あと、最後のほうでさらっと 「Class よりも Structure」 みたいなのがあったんですが、これはちょっと危ないですね。ArrayList に出し入れしたい場合などは Structure だと Boxing が発生するためかえって遅くなる可能性があると思います。もちろん、そうじゃないときはヒープを確保する必要がないので Structure のほうが速いはずなんですが。


■ (やっぱり) 飲み会
MVP な方、コミュニティな方、マイクロソフトな方など(27人くらい)でお疲れさま会。
その後、11名ほどで二次会。

TechEd 2004 Yokohama レポート - 9/9(木) TechEd 3日目

9/9(木) TechEd 3日目


■ T5-348 ASP.NET 2.0 概説
スピーカーはマイクロソフトの近藤さん。Room A。


どれも聞いたことはある内容だったんですが、あらためて聞くとやっぱりすごいですねぇ。



  • マスターページ

  • テーマ

  • データアクセスコントロール(GridView と SqlDataSource)

  • ナビゲーション(TreeView、SiteMapPath、Menu と web.sitemap など)

  • メンバーシップ

  • パーソナライズとプロファイル

  • Web パーツ

  • データベースキャッシング

などなど。
実は ASP.NET 2.0 は (あまり) 追いかけてなかったんですが、やっぱりおもしろそうです。


■ T5-337 Visual Studio 2005 における ADO.NET 2.0 の新機能
スピーカーはマイクロソフトの高橋さん。Room A。


ADO.NET 2.0 の新機能は山盛りだそうです(^^;
その中の一部を取り上げたセッションだったわけですが、ここではさらにその一部を。


DataSet.RemotingFormat で binary Remoting にすればパフォーマンスが改善する(かも)だそうです。もちろん、デフォルトではオフ(XML ベースのシリアライズ)。これは互換性のため。んで、バイナリフォーマットと言っても、データの中身(数値とか) は文字列のままで、タグの部分とかがバイナリになるそうです。また、データの量が少ない場合やフィールドが 1つしかないような場合などはバイナリにしたほうがサイズが大きくなってしまう場合もあるそうです。なので 「常にバイナリにしたほうがいい」 というような種類のものではないみたい。


DataTable が機能拡張されて DataSet と同等なメソッドが追加されるそうです。なので、リレーションとかが必要ない場合は DataSet ではなく DataTable を使えばよりシンプルになると。


抽象化されたデータプロバイダが追加されるそうです(DbXXX クラスたち)。
それに DbProviderFactories なんかも追加されるので、これを使って


DbProviderFactory factory = DbProviderFactories.GetFactory(provider-name);
DbConnection con = factory.CreateConnection();
DbCommand cmd = factory.CreateCommand();


なんて感じにプロバイダ非依存なコードが書きやすくなるとのこと。


MDAC は 2.8 でおしまい。以後は Windows プラットホームの一部としてリリースされて、SQL Server に関する部分のみが SQL Server のリリースにあわせて SNAC としてリリースされるそうです。


SqlDependency はおもしろそうでした。相手は SQL Server 2005 に限られるようですが、SqlCommand を指定して SqlDependency を作りイベントハンドラを登録しておくと、更新があったときにそのイベントハンドラが呼び出されるというものです。SQL Server 2005 の Query Notification をベースに実装されているそうです。ただ、(現状では) SQL 文に制約があり、詳細は SQL Server 2005 の BooksOnline を Notification などで検索すると書いてあるらしいです。
とりあえず、わかっている範囲では



  • select * は不可。必ずインデックスのあるフィールドである必要がある。

  • select aaa from dbo.tablename という風にする必要あり(from tablename は不可)。

だそうです。
似たようなものに SQL Server 2005 の Notification Service とか Service Broker とかがあるとのこと(この辺はあんまり押さえてないなぁ)。


あと、Multiple Active ResultSet(MARS) といって、1つのコネクションだけを使って複数の SqlDataReader で読み込むことができるようになるそうです。つか、今までできなかったことに気付いてませんでした(^^; 基本的にコネクションプーリングに任せて、1コネクション 1クエリと思ってましたので。


■ お昼ごはん
ロイホにて。


■ T5-339 Visual Studio 2005 Team System の概要
■ T5-365 Visual Studio 2005 Team System が提供する革新的開発プラットフォーム

Team System の話です(そりゃそうだが)。
内容自体は盛りだくさんでした(というか Team System 自体が盛りだくさんなのか)。
けど、盛りだくさんすぎて自分の中でも整理できてないので、ここではこれだけ。


■ T5-417 N 階層アプリケーションにおけるステート管理
スピーカーはオムニドメインの古山さん。Room B。


実は楽しみにしていたセッション。んで、実際おもしろかった。
私もかなり気になってる部分なんですよね。
もちろん、セッションの内容は 「こうすればステート管理は万事 OK」 というものじゃなかったです(そんなものがあれば誰も苦労しないんですけどね)。基本的には 「要件にあわせてうまいこと考える」 ということになっちゃうみたいです。セッションの中でも 「ぜんぜん考えてなくて無茶苦茶なシステムもある。あとで修正しようとしても作り直しに近いくらい大変になることもある」 なんていう話も出てました。初めからちゃんと考えましょうね。


■ Welcome to INETA Japan Events!
Room E で行われたパネルディスカッション「次期開発環境を語ろう」 にパネラーとして参加させていただきました。
http://www.ineta.jp/activity/event/teched04/teched04.htm
河端さん司会のもと、パネラーとして渋木さん、生形さん、堀田さん、私、そしてゲストのキャメロンさんが参加して Cω を語るというものです。


基本的には、河端さんがサンプル (セットアップすると自動的に入るもの) を示しながらいろいろとデモってくれて、それを見ながらみんなで突っ込みを入れるという構成でした。いやぁ、あらためて見るとやっぱり Cω っておもしろいですねぇ。これがそのまま C# 3.0 になるとはとても思えませんが、プログラミング言語の一つの方向性ではあると思います。


んで、スケジュール上は Cω 以外の話題もするはずだったんですが、結局 Cω の話題だけで時間を使い切っちゃいました(^^;


パネラーとして参加させていただくことができ、とても楽しかったです。
INETA Japan のみなさん、パネラーのみなさん、また、セッションに参加してくださったみなさんに感謝致します。


■ (やっぱり今日も) 飲み会
MVP 10人ほどで中華屋さんに行きました。
その後、4人ほどで二次会 (居酒屋) へ。

TechEd 2004 Yokohama レポート - 9/8(水) TechEd 2日目

9/8(水) TechEd 2日目


■ キーノートスピーチ
あちこちで紹介されてますし、内容はばっさり省略(^^;
いや、昨日 (というか今朝か?) ちと飲みすぎたらしく、ヘロヘロだったんでぜんぜんメモってなかったんです(^^;
一応、聞いてはいたんですけどね。


■ Visual Studio 2005 Team System テクニカルラウンドテーブル
これは通常のセッションではありません。MVP 向けの特別セッションです。
ただ、機密事項とかではなく、内容自体はすでにリリースされている 「Visual Studio 2005 Beta 1 Refresh with Visual Studio 2005 Team System」 をベースにしたものです。
Team System の部分は今まで Microsoft の製品としては存在しなかったジャンルですし、実際に見てみるといろいろと要望が出てきますね。で、Visual Studio 2005 はすでに Beta の段階ですが、Team System の部分はまだ Community Technology Preview の段階です。なので、まだ間に合うかもしれません。皆さんも何か気付いたところがあったらじゃんじゃん要望を出しましょう。
# といっても、試すための環境を作るのが大変なんだけどね(^^;


■ お昼ごはん
中華屋さんでラーメンとチャーハンのセットを食べました。


■ T5-336 Visual Basic 2005 における言語の強化点
スピーカーは NEC の山崎さん(MVP でもある)。Room B。


個人的には一応押さえていたところばかりだったので、特に目新しいことはなかったです。
ただ、MyApplication の Startup イベント、Shutdown イベントなどなどといったものがあるんですね。これって C# にもあるんだろうか?


セッション終了後に キャメロンさん と出会いました。キャメロンさんは、今年の春くらいまでは Microsoft で VB.NET/VB2005 の開発をしていた方で、Microsoft を退職後、今は日本にいらっしゃいます(日本語を勉強中だそうです)。
で、キャメロンさんから 「VB は好きですか?」 と聞かれたんですが、、、「ごめんなさい。私は C# が好きです」(いや、別に謝る必要はないんだけどね(^^; )
次の C# のセッションも聞きたかったので、休憩時間が終わったところでお別れしました。もっとお話したかったんけどね。


■ T5-335 Visual C# 2005 における言語の強化点
スピーカーは NRI の矢嶋さん(MVP でもある)。Room B。


個人的にはすべてガイシュツだったため、ばっさり省略(^^;


■ T5-347 Win32 / MFC アプリケーションにおける .NET Framework の利用
スピーカーは NRI の矢嶋さん(MVP でもある)。Room B。


てっきり、C++/CLI ベースの話なのかと思っていたら、現行の VS.NET 2003 の Managed C++ の話でした。
けど、かなーり面白かったです。どうやら Windows.Forms なコントロールは、ActiveX コントロールとして必要なインターフェースを意外と揃えていて、うまく使ってやればそれなりに MFC に組み込める(MFC のビューとして使える) ということらしい。(と、こんだけじゃ何のことやらわかんないでしょうけど)


実際、そこまでして MFC を使うことがあるかどうか怪しいけど、技術的な話としてはほんとに面白かったです。


■ らっぷあらうんど TechEd -Day2-
吉松さん、溝淵さん、山崎さん、テクニカルエバンジェリストの西谷さんによるらっぷあらうんど。


みんなでわいわいがやがや質問コーナーって感じです。こういうのって面白いですねぇ。
後ろにはエバンジェリストな皆さんがずらっと控えてました。


■ TechEd & MSDN 10th Anniversary Party
豪華景品のウルトラクイズあり、セグウエイの試乗会あり、ラジコンカー大会ありのなかなか盛大なパーティでした。ただ、音響がうるさすぎてちょっと話をするのに困りましたね。
そこで、そこそこで切り上げて、その後 4人ほどで飲み屋さんに行きました(まぁ、うるさくなくても飲みに行っただろうけど)。

TechEd 2004 Yokohama レポート - 9/7(火) TechEd 初日

うーむ、セッションを聞きながらノート PC を立ち上げてリアルタイムに書いてはいたんですが...
blog に POST するのがすっかり遅くなってしまいました。


9/7(火) TechEd 初日(Learning Day)
AM9:30 ごろ会場であるパシフィコ横浜に到着。広島以西は台風 18号のために新幹線が止まっているとのことでしたが、特に遅れもなく着きました。
で、さっそく受付を済ませて、とりあえず MVP Lounge へ。
MVP Lounge っていうのは MVP や MS の関係者の人のみが入れる部屋。といっても、荷物置き場兼休憩室という感じで、特に何があるというわけではないんですけどね(そんなこと言ったら怒られるか?(^^; )。
すでに最初のセッションは始まってしまっている時間だったのでここで次のセッションが始まる時間までまったりと待ってました。


以下は私が受けたセッションの記録です。
ちゃんとした内容はポストカンファレンス DVD なんかを見てもらうとして、あくまでも個人的な感想です。


■ L3-224 300秒 30分でズバリ - ".NET アプリケーションの動作"
MVP for C# の小野修司さんのセッション。Room E。


席はほぼ満席でした。キーノートスピーチがある明日からの 3日間がメインで、今日はもっと人が少ないのかと思ってたのでちょっと以外でした。


んで、セッションの内容ですが、.NET なアプリケーションはどうやって動いているかという基本的な部分のお話。
コンソールアプリを例に exe には MSIL やメタ情報が含まれている、Win アプリだと Application.Run でメッセージループが動く、ASP.NET では aspx からコードが自動生成されてそれが動く、、、といった内容です。
このセッションで取り上げられていたことって、たぶん 「知らなくてもプログラムは書ける」 部分なんだと思います。けど、こういう基本的な部分はぜひ押えておきたいところですね。
こういうのは決してトリビア(無駄知識)なんかじゃなくて、実際に役に立つと思いますし。


ただ、ちょっと 30分に収めるには盛りだくさんすぎたかなぁ。


■ L3-225 300秒 30分でズバリ - "Visual Studio.NET 概要"
上記に引き続きのセッション。スピーカーは MVP for C# のこだかかおるさん。Room E。


諸事情により予定した内容と変更してお送りしますとのこと(笑)
「なぜ統合開発環境なのか?」、「統合開発環境だと何が便利になるのか?」、そして当然 「Visual Studio.NET はなにが便利なのか?」 という話でした。
個人的には VS.NET の紹介のところよりも、最初のほうの 「統合開発環境とは」 みたいな部分が妙におもしろかったです(^^


途中からは実際に VS.NET を動かしながらのデモ。
こだかさんお気に入りというリソースによるマルチランゲージは確かに便利そうですね(使ったことないです)。


■ お昼ごはん
別にお弁当やランチがあるというわけではありませんでした。
ただ、受付時に 1500円/日のチケットをもらってますので、近所にあるほとんどのお店でそれが使えます。
んで、MVP な人たちといっしょにおそばを食べてきました。


■ L4-S01 マイクロソフトのコンポーネント技術はどう変わってきたか?
スピーカーはマイクロソフトのテクニカルエバンジェリストである荻原さん。Room F。


TechEd 10周年記念の番外編的なセッションということで、かなり広範囲なお話。
おもしろかったです。


(コンポーネントを取り巻く)フレームワーク実装の話の中で


IoC コンテナ、Hollywood principle、Plug-in アーキテクチャ(Dependency Injection。マーチンファウラーはこの用語を使っていたとも)


なんていう用語が出てきました。うーん、知らん(^^;


あと、CLR ホストの解説で、


「Win32 ホストプロセスの中のアンマネージドな main が動き、COM のレイヤを通って、マネージドなアプリケーションドメインが動く。今の CLR ホストのインターフェースはとてもプア。しかし、SQL Server 2005 が出ると大きく変わる。」


という話があったのがかなり気になったりして。やっぱり、SQL Server 2005 が CLR をホストするためには、かなりの拡張が必要だったんですね。


んで、コンポーネント技術の話が自然とアスペクト指向の話になるわけですが、このあたりのお話もかなり面白かったです。


最後に IMDB とか Strage+ とかって覚えてますか?なんていうネタもありましたが(^^


■ L4-S02 マイクロソフトのデータアクセス戦略
スピーカーはマイクロソフトのアーキテクトエバンジェリストの野村さん。Room F。


こちらも、TechEd 10周年記念番外編的セッション。
メインは、Windows DNA アーキテクチャ(笑)。いやー、懐かしい。
けど、Windows DNA という言葉自体は使わなくなりましたけど (それ以前にこの言葉って普及したのかなぁ?)、考え方とかをあらためて聞いてみるとかなりちゃんとしているというか、今言っていることとたいして変わらないんですね。


Windows DNA の構成要素として出てきたデータオブジェクトの話は自分的にはちょっとホットな部分。


データオブジェクトはデータのエンティティを表現する。
ビジネスオブジェクトはステートレスに設計すべき。
ビジネスオブジェクトのステートはデータオブジェクトに入れる。
データオブジェクトには作成・更新・取得・削除(CRUD)のメソッドをもたすべき。


なんて話が出てました。


そういや、O-R マッピングの話で 「Object Spaces は SQL Server 2005 と同時期に出る」 とスピーカーの野村さんが言ってたように思うけど延期になったんじゃなかったっけ?


あと、ビジネスロジック定義の場所として



  • ビジネスオブジェクトにおく。

  • ストアドプロシージャにおく。

の両方があり得るという話も。この議論ってやっぱりあったんですね。あんまり聞かないんだけど、自分的にはかなり気になってたところだったりします。
で、「結論がでてるわけじゃないけど、J2EE は前者より、マイクロソフトは後者よりと言っていいかも」 とのことでした。


あと、データ範囲の確認(validation)は基本的には UI 層で、という話もあったんですが、ここも気になってたりします。
うーん、どうなのかなぁ。基本的にはビジネスロジック側で validation すべきという気がするんですけど。ちょっと調べてみる必要あり。


■ L4-S03 マイクロソフトにおけるユーザインターフェイステクノロジの今昔
スピーカーはマイクロソフトのデベロッパーエバンジェリストの西谷さん。Room F。


これまた、TechEd 10周年記念番外編的セッション。
1999年の PPT をほとんどそのまま使ったセッションでした(笑)
Scripting Technology 概論として ActiveX Scripting Engine なんかが解説されていたんですが、この辺は今も変わってないですね。VBScript とか Windows Scripting Host とかって今も現役ですし。


面白かったのは


「実は 1999年当時にも Web だけではなく Win32 アプリや ActiveX コントロールをうまく組み合わせるようにしましょう、と言っていた。というのもブラウザベースの Web アプリの操作性が悪いのは明らかだったから。けど、マーケティング戦略的にあまりこれは全面にでず、ブラウザベースの Web アプリばかりが強調されていた」


という話。
今ではスマートクライアントとかって呼ばれてますけど、言ってることは同じですね。


いかにも ASP (Active Server Pages) という、ソース上でクライアントサイドスクリプトとサーバサイドスクリプトが混ざり合ったもののデモがあったんですが、当然 「ASP だとこれはこれでよかったんですが、今はちゃんと UI 処理とビジネスロジックを分離しましょう。別にこれは ASP に限った話ではありません。ASP.NET だって同じです。コードビハインドのおかげで分かれているように見えるときもありますが、ボタンクリックのイベントハンドラに DB に接続してデータを取得して、、、なんてコードを書いちゃうと完全にロジックが埋め込まれた形になってしまいます。デモなんかだとこういうコードを書いちゃういますし、ちょっとしたサンプルだとこういうコードになってることが多いですが、ちゃんとコンポーネントとして分離しましょう」 という話がありました。
まったくもってそのとおりですね。


最後に、Virtual PC 上の Win 3.1 で VB2 を動かすなんていうデモもありました(^^;
おぉ、デスクトップの左下にプログラムマネージャがいるぞ(^^;


■ MVP & Community Party
初日の最後はマイクロソフトの方々、MVP な方々、INETA Japan などのコミュニティの方々なんかといっしょにパーティがありました。
んで、なぜかジャンケン大会で優勝してしまい、Creative Media の 30G の MP3 Player を頂いたりしちゃいました。ありがとうございました。
その後、二次会に突入。30名くらいでしたでしょうか?
さらに、ホテルの部屋で 3時くらいまで飲みながら数名の方と話してました。

2004年9月14日火曜日

Visual Studio 2005 Product Line Overview

Visual Studio 2005 Product Line Overview
http://lab.msdn.microsoft.com/vs2005/productinfo/productline/default.aspx


Express、Standard、Professional、Team System の違いがわかりやすく表になってますので紹介。これを見ると Standard は Professional にかなり近いですね。


ちょっと追記。
もちろん、上記の表は最終決定とかではないと思います。内容が変わることもあるでしょうし、そもそも 「Team System って、Team Architect、Team Developer、Team Test があったんじゃないの?それらはどうなるの?」 とかって疑問もありますし。

MSDN Online 更新情報 RSS 配信開始

日本語の MSDN Online でも更新情報 RSS 配信が始まっています。
http://www.microsoft.com/japan/msdn/rss.xml


ちなみにこれは http://www.divakk.co.jp/blog/aoyagi/archive/2003/07/08/347.aspx に中村晃一さんがコメントを付けてくれたので知りました。


 

2004年9月6日月曜日

.Text のバグ 「値を Null にすることはできません。パラメータ名 : value」

今まで、トップページ (たとえば http://www.divakk.co.jp/blog/aoyagi/ ) は見れるのに個別の記事 (たとえば http://www.divakk.co.jp/blog/aoyagi/archive/2004/09/01/571.aspx ) を見ようとすると 「値を Null にすることはできません。パラメータ名 : value」 なんてエラーが出て見れない、ということがたまに発生してました。(このエラーは一度発生すると、以後 IIS を再起動してやるとかしてやらないと復旧しません)


このエラーの原因がわかりました。
今日も起こってたのでスタックトレースを見てみたら Dottext.Framework.Stats.AddQuedStats(EntryView ev) なんてところが怪しそう。で、とりあえずググってみたら、そのものずばりの以下のページを発見。


K. Scott Allen's Blog より
.Text Threading Bug


こちらに書かれているようにソースを修正してビルドしなおすか、web.config の <Tracking> にある queueStats を queueStats = "false" にすれば OK です。


.Text では各記事ごとのアクセス数やどこから参照されたか(Referral)を見ることができますが、ここはその記録を取っているところです。これは当然アクセスがあるたびに処理する必要がありますが、負荷を減らせるようにキューイングできるようになっています。queueStats = "true" の場合、queueStatsCount の数に達するまではメモリ上においておき、達した時点でデータベースに書きにいきます。Stats.AddQuedStats() メソッドがそのキューイングの処理をしているところなんですが、lock のかけ方に問題があるため、同時に複数アクセスがあるとデータが壊れてしまい、エラーが発生するようになってしまいます。また、queueStats = "false" にすればこのキューイングを行わないようになり、毎回アクセスがあるたびにデータベースに登録するようになります。この場合は Stats.AddQuedStats() メソッドが使われることはないため、エラーが発生することはありません。

2004年9月1日水曜日

Visual Studio 2005 Beta 1 Refresh with Visual Studio 2005 Team System - Full DVD Install - (English)

下に書いた 「またまた Community Technology Preview が出る模様」 ですが、MSDN Subscriber Downloads に


Visual Studio 2005 Beta 1 Refresh with Visual Studio 2005 Team System - Full DVD Install - (English)


が 8/31 付けで載ってました。


ダウンロードページの説明には、


Visual Studio 2005 Beta 1 Refresh は、今までのベータに Visual Studio 2005 Team System の Community Technology Preview(CTP) を追加したもの。ベータは多くの高水準なテストをしたものだけど、CTP は最新ビルドをデベロッパに見せるのが目的。それゆえ、Visual Studio 2005 Beta 1 Refresh はまだアンサポートなブレリリースソフトで、(使用者が) しなくちゃいけない注意点がいくつかある。プレリリースソフトをインストールする前にリリースノートを見て確認してくれ。
完全なシステム要求(必要とするシステム)とインストールノートは、Microsoft Visual Studio 2005 Team Foundation Server Installation Guide と Microsoft Visual Studio 2005 Read Me を見て欲しい。これらのドキュメントに指示されていることをやらないとインストールが失敗するという結果になるかも。


なんて感じのことが書かれています(かなり適当な訳です。正確なところは必ず原文を参照してください)。


とりあえずはダウンロードしてみないことには始まりませんね。(けど、ものすごく遅い)

Windows XP Service Pack 2 日本語版 正式リリース

少し前からダウンロードできるようになっていた Windows XP SP2 ですが、正式に発表されたようです。
http://www.microsoft.com/japan/presspass/detail.aspx?newsid=2016


Windows Update だけでなく、全国主要PCショップ、家電量販店店頭、全国約2万5千局の郵便局で CD-ROM 配布ですか。すごいことするなぁ。