ページ

2004年12月20日月曜日

.netcpu

.netcpu だそうです。
http://www.dotnetcpu.com/


Microsoft のサイト上でも紹介されています。
http://msdn.microsoft.com/mobility/


なんか Microsoft .NET Embedded CLR とかって書いてありますが、Embedded なんてあったんですね。

2004年12月10日金曜日

もうすぐ VS 2005 Team System CTP December 2004 ?

Team System Community Technology Previews (CTPs) より。


この記事自体は 「CTP って何よ?」 っていうような話です(だと思う(^^; ちゃんと読んでません(^^; )


気になったのはこの記事に対して書かれたコメント。


> The Team System December CTP is on final approach. You can expect it before the holidays.


どうやら December が出るみたいですねぇ。
holidays というとクリスマス休暇のことなのかな?


# 大きく変わってるのなら入れてみようとは思いますけど、どうなんだろ?

2004年12月8日水曜日

Oracle 10g Release 2 to support the CLR

Oracle 10g Release 2 to support the CLROrcale and the CLR より。


なんか、Oracle OpenWorld, San Francisco で、



  • Oracle 10g Release 2 を 2005年半ばに予定

  • CLR で実装されたストアドプロシージャのサポートとより進んだ Visual Studio との統合

なんていうアナウンスがされたみたいです。
こりゃびっくり。

2004年12月3日金曜日

MSN Spaces (英語版) スタート

マイクロソフトの無料 blog サイトである MSN Spaces ですが、英語版のベータも始まったそうです。


多くのところで http://spaces.msn.com/ という URL で紹介されているんですが、これって以前からある日本語版とまったく同じなんですよねぇ。どうやったら英語版が見れるのか探しちゃいました。


どうやら



とすればいいようです。
まぁ、言語が違うだけで機能は同じみたいですが。ただ、「最近更新されたスペース」などに表示されるものが言語によって変わります(どこを見て切り替えてるのかは知りません。使用言語とかって設定するところあったっけ?)


# あと、英語版の追加にあわせて背景が変えられるとかいくつか機能が追加されているようです。

2004年11月19日金曜日

Avalon CTP on MSDN Subscriber Downloads

Avalon CTP on MSDN Subscriber Downloads より


明日、MSDN Subscriber Downloads に WinFX SDK Community Technology Preview がリリースされる。。。


えっ?まじ?まじっすか?

2004年11月18日木曜日

Spec# (ちょっと追加)

すぐ下 に書いた Spec# ですが、 名無しさん♯ に教えていただいた(どうもです)
http://research.microsoft.com/projects/T5/ppt/SpecSharpShort.ppt
を見ると確かに VS.NET 2003 らしきもので動いてますね。


それと、よくわからないと書いた object invariant ですが、この PPT を見てなんとなくわかりました。


  class T {
    int[] bufferInt;
    bool[] bufferBool;
    invariant bufferInt.Length == bufferBool.Length;


みたいに整合性のチェックを指定できるようです。
ただ、「いったいどのタイミングでチェックするのよ」 という問題があります。複数スレッドから同時アクセスされる可能性まで考慮すると、自動的に適切なタイミングでチェックすることは非常に難しくなります。そこで、expose (o) { . . . } という構文も追加されているということなようです。


なるほどです。method contracts と object invariants をきちんと使用すれば、インスタンスが正常な状態に保たれているかをかなり正確にチェックすることができそうです。むしろ問題は、正確なチェックをするような method contracts や object invariants を書けるかどうかかなぁ(^^;

2004年11月17日水曜日

Spec#

Spec# for Visual Studio .NET 2003 より。


Spec# っていうのは C# のスーパーセットで、



  • non-null type (参照型だけど null にできない。Hoge! hoge; のように宣言)

  • exception のチェック

  • メソッドの contract (Eiffel の表明みたいなやつ)

  • オブジェクトの invariant (不変性?具体的にどういう機能なのかよくわからない)

を追加したものとのことです。
# Spec# 自体は、すでに 名無しさん#さんのところ で既出です。


これは、まだペーパーだけなのかな?Microsoft Research の Download を見てもそれらしいのはないですし。
けど blog のタイトルが "for Visual Studio .NET 2003" とやけに具体的ですし、記事の中にも 「Visual Studio と統合された Spec# コンパイラ」 とか 「test generation と model-based testing のための SpecExplorer tool へのインターフェース」 とかって書かれています。Cω みたいにそのうち preview リリースとかがでるのかもしれませんね。
あと、この SpecExplorer というのもちょっと気になります。ググってみると、どうやら model-based testing のツールらしいんですが。。。


それと、いちおう書いておきますが、この Spec# は Cω (シーオメガ) と同じように Microsoft Research (Microsoft の研究機関) で研究中のものです。この先 Spec# や Cω がどうなるのかはなんともいえません。個別の言語としてリリースされる可能性もあるでしょうし、Spec# や Cω の機能の一部が将来の C# に取り込まれるという形になるかもしれません。ひょっとすると F# のように MS Research で育って、(Visual Studio とは関係なく) いつのまにか version 1.0 がリリースされたりするかもしれません。Spec# や Cω はそういった代物です。

Koders.com

Beyond Google... Koders.com - Open Source Code Search Engine より。


こちらで紹介されている www.koders.com ってなかなかおもしろいです。
いろいろなオープンソースなコードの中を検索することができます。ただ、残念ながら .NET 系のプロジェクトはまだそんなに多くはなさそうなんですが。

2004年11月16日火曜日

Virtual PC Guy はすごいぞ

Virtual PC Guy's WebLog より。


うーん、実に様々なものを Virtual PC で動作させています。気になったものをいくつか紹介。



The other reason why I love Virtual PC
CP/M-86 と Windows 1.01。
うーん、さすがに Win 1.01 は初めて見ました。


More Operating System Nostalgia
Windows 2.03、3.0。
2.03 も初めてです。3.0 は使ってましたけど。


Windows 3.11 on Virtual PC
日本語版が出ることはなかった Windows 3.11 for Workgroups です。


Win32s under Virtual PC
Windows 3.11 上の Win32s v1.3 は動作せず v1.25 なら問題ないとのことです。Win32s を使う場合は注意が必要ですね(って、そんなやついるのか?)
また、この記事のコメントで 「WinG は動作するか?」 との質問が出ていますが、これも問題ないとのことです(いや、だから。。。 しかし WinG とはなつかしいな)


Microsoft BOB lives!
そういや、こんなのも聞いたことあります。これも日本語版は出なかったんですよね?


OS/2 2.11 under Virtual PC
うむぅ、OS/2 は Warp はちょこっとさわったことくらいはありますが、2.11 はさわっこともありません。


ほんとすごいです(^^;
もちろん、他にも Virtual PC に関するちゃんとした記事もあるみたいです。 (私は読んでませんけど(^^; )

MSN Desktop Search

neowin.net Exclusive: MSN Desktop Search Revealed
なんか、MSN Desktop Search なるもののスクリーンショットがあります。


どうやら
http://blogs.msdn.com/msnsearch/archive/2004/11/15/257377.aspx
internal pre-release ビルドらしいです(^^


# リークものに対して、こんな風に Microsoft の人がコメントつけるのも珍しいな。。。

2004年11月15日月曜日

Safari Visual Studio Help Integration (VSHI) Beta

Safari Visual Studio Help Integration (VSHI) Beta より。


Visual Studio 2005 beta のヘルプに Safari の検索などを統合するためのツールの beta みたいです。


って、Safari って何よ?ということなんですが、プログラマや IT プロフェッショナル向けの書籍 1,300冊程度を検索・閲覧できる有料サービスみたいです。
詳しい説明は How Safari Works こちらにあります。
どうやら、検索は自由にできて、数センテンスをプレビューできる、気に入ったら自分の本棚に移動して読む、本棚がいっぱいになったらアップグレードするか要らない本と交換する、という感じでしょうか?(どのみち洋書しかないですし、あんまり詳しく読んでません(^^; )


日本語でもこういうサービスあったらいいなぁ。

2004年11月12日金曜日

PInvoke する DLL を Load/Unload する方法

PInvoke Library Load/Unload Behavior – Freeing Unmanaged Libraries より。


.NET で レガシーな DLL を使うときは PInvoke して使うことになるわけですが、PInvoke では一度 DLL を Load したら二度と Unload することはできません。これを無理やり Unload してしまう方法のようです。
なるほどぉ、PInvoke なメソッドを呼び出す直前に LoadLibrary しておいて、Unload したくなったら GetModuleHandleExA でハンドルを取ってやって FreeLibrary してしまうわけか。そのときに LoadLibrary と辻褄があうように FreeLibrary がゼロを返すまで繰り返し呼んでやると。


って、これはいくらなんでも強引過ぎやしないか?w
元記事でも 「まったくお勧めできない」 と書かれてますので注意w
詳しくは元記事を。






上記の記事からリンクされている Dynamic PInvoke より。


おぉ、.NET Framework 2.0 では Marshal.GetDelegateForFunctionPointer なんていうのが追加されるんですね。
これを使うと、Win32 API の LoadLibrary、GetProcAddress で取得した関数ポインタを delegate に変換できるみたい。なので、上記のような無茶をせずにごく自然に LoadLibrary、FreeLibrary ができるようになるわけか。
あと、元記事に 「今まで DllImport を使って指定してた PreserveSig だとかはいったいどうやって指定するんだ」 というするどい突っ込みがされていますが、これもきちんと UnmanagedFunctionPointerAttribute が追加されるので問題なしとのこと。

MSN Search (beta)

MSN Search (beta)
http://beta.search.msn.com/


Microsoft 製の新しい検索エンジンの beta リリースみたいです。
msnsearch's WebLog で知りました。


なにげに http://beta.search.msn.co.jp/ にアクセスしてみたら、ちゃんと日本語版もありました。けど、 "C#" で検索するとシャープが無視されて "C" で検索したのと同じ結果になっちゃうとか、.com にはある Images が .co.jp にはないとか、どうも日本語版のほうはバージョンが古いような気がします。ちなみに、日本語の検索はどちらも OK みたいです。


MSN Search (beta) のヘルプを見ていて気付いたんですが MSN Sandbox なんてのがあるんですね。なんかいろいろ紹介されています。



  • MSN Search Beta … 今回のやつ

  • Lookout Email Search Tool … ローカルのファイルやメールなどを検索してくれるツール (Google Desktop Search みたいなもの)

  • Newsbot … MSN Search (beta) と同じ検索エンジンを使って 4,000 のソースから自動的にニュースを作りだすサイト ( http://news.google.com/ とほとんど同じ?)

  • MSN Toolbar … ツールバー

  •  … デスクトップに貼り付けておいて、友達と交流するツール (説明が難しいな。リンク先に日本語での説明もありますから気になる人は見てみてください)。内部で MSN Messanger を使っている?

  • NetScan … news group (NNTP) の情報をいろいろできる

  • TerraServer and TerraService … すごいサーバ(笑)。.NET やら SQL Server 2000 やらで作られた 2テラバイトのデータベースとかで動いている。

へぇ、Newsbot なんてのまであるんですね。

2004年11月10日水曜日

Generic タイプパラメータの命名規則

Design Guidelines Update: Names of Generic Type Parameters
によるとタイプパラメータの命名規則が変更になったようです。


タイプパラメータというのは、たとえば、


public class List<T> { … }


の "T" のことです。
この "T" という名前については、以前の命名規則だと "T"、"U" などのように大文字 1文字とすることになっていました。それが、先頭を "T" でつけたわかりやすい名前をつけること、となりました。ただし、わかりやすい名前にする意味がないものは "T" などのままでも OK です (たとえば、上記の List なんかはもともとあらゆる型を受け入れるわけで、わかりやすい名前なんてつけようがないから "T" で OK)。


また、BCL (Base Class Library。.NET Framework に標準で入っているクラスライブラリだと思ってもらえばいいです) に含まれている Generic なクラスについても新ガイドラインにあわせて命名を変更することを検討中とあります。


いちおう、最初のところに "we decided to modify the generic type parameter naming guidelines." とあるので、ガイドラインがこのように変更されることは確定しているようです。
ただし、ガイドライン自体が確定したわけではないので、今後再変更されることも十分ありえると思います。

Paint.NET の新しい URL

以前取り上げた Paint.NET ですが、新しい URL は http://www.eecs.wsu.edu/paint.net/ こちらのようです。


History のところに Paint.NET は Washington Sate University で 2004年春に作られたのが始まりで (Computer Science senior design project というのはゼミかなんかなのかな?)、開発メンバーの 1人である Rick Brewster 氏は今は Microsoft で働いているなんてありますね。


その Rick Brewster 氏の blog はこちらのようです。
http://blogs.msdn.com/rickbrew/

2004年11月1日月曜日

C:\Windows\Temp のアクセス権

Windows XP Professional (Service Pack 2) での話なんですが、いつの間にか C:\Windows\Temp (正確には %WINDIR%\Temp ) のアクセス権が "aspnet_wp" と "NETWORK SERVICE" だけになっちゃってました(すなわち、Administrator ですら読み書きできない)。いつからこうなっていたのかは定かではありませんし、ひょっとすると最初からこうなっていたのかもしれません(けど、最初からっていうことはないと思う)。ただ、こうなっていることに気付いたのは WinXP SP2 を入れた後なので、やっぱり SP2 が怪しいような。。。


実は WinXP SP2 を入れた直後から Windows Update ができなくなってました。
Windows Update のサイトにアクセスすると 「最新バージョンの Windows Update ソフトウェアを確認しています ...」 というのが表示されて ActiveX コントロールをダウンロード・セットアップしようとするんですが、しばらくまったあと 「申し訳ありません」 というメッセージとともに  0x8DD00004 というエラーが表示されてしまっていました。検索してみるといろいろ 「Windows Update が動かない場合の対処方法」 が公開されてますが、これらを参考にどんな対処をおこなっても Windows Update できるようにはなりませんでした。
けど、自動更新は動いているし 「まっ、そのうちなんとかなるだろ」 とあきらめてました。


次に困ったのは MSDN Subscriber Downloads にある SQL Server 2005 CTP - October 2004 - Developer Edition (English) を入れようとしたときです。
まず、SQL Server 2005 CTP Oct 2004 のセットアップ中に MSXML3 がエラーになってセットアップが先に進めなくなってしまいました。セットアップ CD-ROM (実際は iso イメージですが) の中にある MSXML3.MSI を直に実行してみてもやはりエラーになります。msiexec でログを取ってみたりとかいろいろしたんですが、エラーの原因はわかりませんでした。仕方ないので MSXML3.MSI を他のものに置き換えるという荒業を使ってセットアップを進めました( SQL Server 2005 CTP Oct 2004 に含まれる MSXML3 は MSXML 3.0 SP6 らしいんですが、それを Microsoft からダウンロードしてきた MSXML 3.0 SP5 の MSI に置き換えました。もちろんバージョンが違うのでこんなことをしても正常に動く保証はまったくありません)。
こうやって無理やりセットアップを進めたところ、かなり時間がたってからなにやらメッセージが表示されました。曰く 「C:\Windows\Temp の permission を確認しろ」 とかなんとか。。。


さっそく C:\Windows\Temp を Administrators が読み書きできるようにしてみたところ Windows Update も MSXML3.MSI のセットアップ(SQL Server 2005 CTP Oct 2004 のセットアップ) も問題なくできるようになりました。


うーん、まさかこんなところに原因があるとは。というか、いまどきって "C:\Documents and Settings\USERNAME\Local Settings\Temp" のほうを使うべきなんじゃないのかなぁ?

2004年10月21日木曜日

VS 2005 CTP Oct 2004 full ってないんですね。。。しょぼーん

Visual Studio 2005 Express Editions Community Technical Preview October 2004 は http://lab.msdn.microsoft.com/vs2005/downloads/default.aspx からダウンロードできます。ダウンロードできるようになったのは 10/18 くらいですね。


あと、VS 2005 とは別に SQL Server 2005 でも CTP Oct 2004 が出ています。こちらは MSDN Subscriber Downloads からもダウンロードできます(Server の下です)。また、MSDN Subscriber Downloads には Express だけでなく Developer Edition、Developer Edition 64bit があります。これらがダウンロードできるようになったのが 10/15 くらいです。


それと、この SQL Server 2005 CTP Oct 2004 と並んで Visual Studio 2005 for the SQL Server 2005 CTP - October 2004 というのが MSDN Subscriber Downloads からダウンロードできるようになってます。こちらも 10/15 くらいからです。


で、この Visual Studio 2005 for the SQL Server 2005 CTP - October 2004 というのがダウンロードできるようになっていることには 10/18 くらいには気付いたんですが、ちょうどその頃から 「C# エディット&コンティニューなんかをサポートした VS 2005 CTP Oct 2004 が近々リリースされる」 というニュースが出てきたんですよね。ということは、提供時期から考えてこの Visual Studio 2005 for the SQL Server 2005 CTP - October 2004 というのは VS 2005 CTP Oct 2004 とは別物なのか?それともこれが VS 2005 CTP Oct 2004 なのか?と訳わかんなくなっちゃってました。


で、見つけました。
http://blogs.msdn.com/danielfe/archive/2004/10/18/244275.aspx
こちらのコメントに 「VS 2005 CTP Oct 2004 は Express Edtion のみ。full バージョンは提供しない」 と書かれてます(ついでに 「Express Edtion のフルダウンロード版も提供しない」 と書かれてますね)。
ということは、Visual Studio 2005 for the SQL Server 2005 CTP - October 2004 というのは VS 2005 CTP Oct 2004 とは違うものということになります。


だとすると。。。。
わかる人がいたら教えて欲しいのですが、そうするとこの Visual Studio 2005 for the SQL Server 2005 CTP - October 2004 というのは SQL Server 2005 CTP Oct 2004 と同じマシンにセットアップできるようにした VS 2005 beta 1 ということでしょうか?(使っている .NET Framework 2.0 の細かいバージョンが違うとかの理由で SQL Server 2005 CTP Oct 2004 と VS 2005 beta 1 は共存できないそうなので、その対策をしただけの VS 2005 beta 1?)
それとも、VS 2005 beta 1 と VS 2005 CTP Oct 2004 の中間のビルドなんでしょうか?
はたまた、上記の blog のコメントが間違いで、実は VS 2005 CTP Oct 2004 の full バージョンなんでしょうか?
# って、こんなことは Microsoft の中の人に聞かないとわからないかな?(^^;

2004年10月18日月曜日

.NET Framework 2.0 beta 2 で System.Xml が変わる

どうやら .NET Framework 2.0 beta 2 で System.Xml が変わるようです。
http://blogs.msdn.com/dareobasanjo/archive/2004/10/13/241591.aspx


んで、.NET Framework 2.0 での XQuery サポートは取りやめになってしまったようです。これはちょっとショック。まぁ、確かに Working Draft に沿ったものをあまり普及させちゃうのもどうかと思いますし、recommendation になるのが 2005年後半ということだと VS 2005 のリリースのほうが先になっちゃいますから仕方ないのかなぁ。
(となると SQL Server 2005 の XQuery も今後どうなるのか気になってくるなぁ)

VS 2005 - C# でもエディット&コンティニューをサポート

すでにあちこちで書かれてますが VS 2005 の C# でもエディット&コンティニューをサポートしてくれるらしいです。
おおもとのアナウンスは http://blogs.msdn.com/somasegar/archive/2004/10/15/242853.aspx の模様。


「エディット&コンティニュー(英語だと Eidt & Continue)」 っていうのは、デバッグ実行時にブレークポイントなどでいったん止めてコードを編集、そのまま (ビルドしなおすといったことなしに) 続きを実行するというやつです。
これは VB6 では普通にできることでした。しかし、VS.NET 2002、2003 では C# はもちろん VB.NET でもサポートされなくなりました。必ずいったんデバッグ実行を終了してビルドしなおしてやらないといけなくなったわけです。これが VS 2005 で復活します。というか、.NET Framework 2.0 自体にエディット&コンティニューに必要な機能が追加されます。そして VB2005 ではこのエディット&コンティニューがサポートされることは最初から決まっていたようです。しかし、C# ではサポートされないと言われていました(実際、今出ているベータではサポートされてません)。それが今回 C# でもサポートされるということになったようです。


http://blogs.msdn.com/ericgu/archive/2004/10/15/242931.aspx こちらに簡単にですが経緯が書かれてます。ようするに、リファクタリング機能とエディット&コンティニューを天秤にかけた結果、リファクタリング機能を優先した、けどエディット&コンティニューに対する要望もすごかったので、結局こちらもがんばった、ということのようです。
Daigo Hamura さんのところにもおもしろい裏話が(^^;
http://blogs.users.gr.jp/daigoh/archive/2004/10/16/5412.aspx
http://blogs.users.gr.jp/daigoh/archive/2004/10/16/5417.aspx

2004年10月5日火曜日

Paint.NET

C# / .NET Framework 1.1 で作られたペイント系のソフトです。ものすごく cool です。
http://rbrewster.members.winisp.net/pdn.html


ソースも公開されてるところがさらに cool です。
# MIT ライセンス改だそうです。私はよく知りません(^^;


ところで、この Paint.NET は WindowsXP SP1 以降じゃないとセットアップできません。ソースからビルドした場合も、WindowsXP SP1 以降じゃないと例外が出て起動できないようです。
ちょっと Windows 2000 で動かしてみたかったので(というか、今の私の環境が Windows 2000 なので)ちょっと見てみました。


ソースの PdnLib\PdnBaseForm.cs の



  • SafeNativeMethods.WTSRegisterSessionNotification を呼び出しているところ(1行だけ)。

  • SafeNativeMethods.WTSUnRegisterSessionNotification を呼び出しているところ(こちらも 1行だけ)。

をコメントアウトしてビルドする。


これだけで一応 Windows 2000 でも動くようになりました。といっても、詳細に調べたわけでもありませんし、作者さんに確認したわけでもありませんので、あくまでも自己責任で。

MSMVP に再認定されました

Microsoft Most Valuable Professional (以下、MSMVP) に再認定されました (MSMVP は 1年単位の award ですので)。
私は 2002年に最初に MSMVP に認定していただいたときから Visual Developer - .NET というカテゴリでした。けど、このカテゴリがなくなるということで、今回は Visual Developer - Visual C# というカテゴリになりました。

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 配布ですか。すごいことするなぁ。

2004年8月31日火曜日

Microsoft .NET Framework 1.1 Service Pack 1

Microsoft .NET Framework 1.1 Service Pack 1 のダウンロードが始まったみたいです。


Microsoft .NET Framework 1.1 Service Pack 1 (日本語)
http://www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID=A8F5654F-088E-40B2-BBDB-A83353618B38


Microsoft .NET Framework 1.1 Service Pack 1 for Windows Server 2003 (日本語)
http://www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID=AE7EDEF7-2CB7-4864-8623-A1038563DF23


あと、Microsoft .NET Framework 1.0 Service Pack 3 もありました。ただ、こちらは今の時点ではリストに Japanese がありません(そのうち追加されると思いますけど)。
http://www.microsoft.com/downloads/details.aspx?FamilyId=6978D761-4A92-4106-A9BC-83E78D4ABC5B&displaylang=en

2004年8月30日月曜日

またまた Community Technology Preview が出る模様

Rick LaPlante's WebLog によると、VSLive Orlando (September 11-15) にあわせて次の VS 2005 Community Technology Preview が出る模様。んで、これには Team Fundation Server もついてて Team System が試せるようになる模様(けど、「クオリティはまだまだ」 とかわざわざ書いてあるので、そのつもりでさわる必要はあるんでしょうね)。


# Tech Ed 2004 Yokohama でも配ってくれたらいいのに。。。

2004年8月25日水曜日

mixi に参加。そして .Text の RSS を。。。

最近 mixi という日本語のソーシャル・ネットワークに参加しました。
AILightの石野さんに誘っていただきました)


mixi の日記として外部の RSS を指定することができますが、なぜか .Text だとうまくいきません。どうやら RSS がまったく取り込まれていないように見えます。で、FAQ を見てみたらこんなことが書いてありました。



日時に関する表記が以下の形式になっている必要があります...
<dc:date>2004-01-01T12:34:56+09:00</dc:date>

反映されないケース
・<dc:date>以外のdateタグ
・日時、時間表記の形式が違う


って、ええ?!
.Text の日時の表記は "Wed, 25 Aug 2004 01:55:00 GMT" っていう形式です。
というか、そもそも .Text の RSS は 2.0 なので <pubDate> タグです。<dc:date> タグっていったら RSS 1.0 じゃないですか。うーむ、どうやら RSS 1.0 のみサポートですか。


そこで、とりあえず RSS 2.0 から 1.0 に変換する XSL を書いてみました。これで変換した RSS を mixi に指定してみたらそれなりに読み込んでくれるようです。それならということで、ASP.NET で RSS 2.0 →1.0 変換をするものを作ってみました。といっても、中身は XSL を使って transform してるだけなんですが。
あと、日時が "Wed, 25 Aug 2004 01:55:00 GMT" 形式だと mixi 上ではすべて "0月0日" になってしまいます。なので、これも "2004-08-25T01:55:00Z" 形式に変換するようにしました(といっても、これまた SelectNodes して DateTime.ToString("s") するだけですが。あと、面倒なのでとりあえず GMT にしちゃってます)。


ダウンロード: rss20to10.zip
中身は rss20to10.aspx と rss20to10.xsl の 2ファイルのみです。
これらを ASP.NET が動くフォルダに置いてください。
rss20to10.xsl は ASP.NET が読み取れる必要があります。
あとは、引数に "url=[2.0→1.0したいRSSのURL]" を与えて rss20to10.aspx にアクセスすれば OK です。
たとえば rss20to10.aspx を example.com に置いたとすると、



http://example.com/rss20to10.aspx?url=http://www.divakk.co.jp/blog/aoyagi/Rss.aspx


というような感じです。これを、mixi の 「RSSのURL」 に指定してやれば .Text の RSS でもちゃんと取り込んでくれるようになります。


ただ、ちょっと注意。
rss20to10.aspx は横着な実装なのでリクエストがあると毎回バカ正直に RSS を取得し、2.0→1.0 して返します。たとえば、If-Modified-Since なんかが役に立たなくなると思います。それと RSS には If-None-Match と ETag を使って変更がないときのサイズを減らすっていう仕組みがありますが、これもまったく処理してません。
けど、まぁ、mixi 相手のときくらいしか使い道はないだろうから、特に問題はないでしょ。


そもそも、mixi が RSS 2.0 をサポートしてくれればそれでいいんだし。
(実装すんのはそんなに難しい話とは思えないんだけどなぁ。なんでサポートしないんだろ?)

Xamlon v0.9 Beta 5 リリース

Xamlon の v0.9 Beta 5 がリリースされたそうです。
http://www.xamlon.com/


Xamlon っていうのは VS.NET 2003、.NET Framework 1.1 で XAML と同じことができちゃうというもの(らしい)です。


# まだダウンロードすらしてないんですけどね。自分への覚え書きとして書いときます。

2004年8月24日火曜日

.Text の RSS の時刻を修正しました

.Text も RSS の pubDate がバグってました。


たとえば日本時間の 15:00 にポストした記事の RSS の pubDate が

    <pubDate>Tue, 24 Aug 2004 15:00:00 GMT</pubDate>

なんてなっちゃってます。
時刻は日本時間なのに GMT で書いちゃってますね。


とりあえず、Dottext.Framework\Syndication\BaseRssWriter.cs の pubDate を書き込んでいるところを




// 元は entry.DateCreated.ToString("r") ですが、

// これを ToUniversalTime() で変換してから文字列化

// するようにします。

this.WriteElementString("pubDate",entry.DateCreated.ToUniversalTime().ToString("r"));


という感じにしました。
.Text では web.config にもタイムゾーンの設定がありますし、各ユーザ毎の設定にもタイムゾーンの項目があります。なので、ほんとうならそれらを参照すべきなんでしょうが、とりあえず横着して ToUniversalTime() とだけしています。私の環境だとサーバも日本時間なので問題ないですが、サーバのタイムゾーンが違う場合はもう一工夫必要ですね。
ちなみに、上記の 1ヶ所を修正すれば RSS と CommentRss の両方が直ります。

2004年8月9日月曜日

Power Collections.NET

.NET Framework 2.0 の Generics を使ってコレクション・アルゴリズムを Open Source で実装しようというプロジェクトです。


Power Collections.NET
http://www.wintellect.com/powercollections/


主に Peter Golde 氏が開発しているようですが、この方、元々は Microsoft の C# コンパイラチームの方のようです。


今までは、「作ってるよ」 というアナウンスと Peter Golde 氏の blog くらいしかなかったんですが、8/5 に届いた news letter に 「preview 版をリリースした」 とありました。(この news letter も上記のページから申し込めます)

2004年8月5日木曜日

MSN Web Messenger Beta

なんと、ブラウザ上で MSN Messenger ができるののベータが出てます。
http://webmessenger.msn.com/


ちょっと試してみましたが、とてもよくできています。日本語もとくに問題ありません。
まだどういう仕組みで動いているのかは調べてませんが、かなり興味あります。Applet や ActiveX コントロールは使わずに完全に HTML/HTTP だけで実現してるんでしょうか?

マイクロソフトが提供する blog - MSN Spaces

マイクロソフトが MSN ブランドで提供する無料の blog だそうです。
http://pcweb.mycom.co.jp/news/2004/08/04/001.html


# MSN Spaces よりも Object Spaces のほうが欲しかったりw

2004年8月3日火曜日

Visual Studio 2005 日本語ベータ 1

どこまで日本語化されてるのか、まだまったく確認してませんが、もう Visual Studio 2005 日本語ベータ1 の提供が開始されました。
http://www.microsoft.com/japan/msdn/vstudio/2005/beta/

2004年7月27日火曜日

SQL Server 2005 Beta 2 が MSDN Subscriber Downloads に

MSDN Subscriber Downloads で SQL Server 2005 Beta 2 がダウンロードできるようになってました。("Servers" の下です)
今の時点では、



  • Microsoft SQL Server Migration Test Toolkit version 1.5 (English)

  • SQL Server 2005 Developer Edition - 64 Bit Extended - Beta 2 (English)

  • SQL Server 2005 Developer Edition - 64 Bit Itanium - Beta 2 (English)

  • SQL Server 2005 Developer Edition Beta 2 (English)

  • SQL Server 2005 Express Beta 2 (English)

がダウンロードできるようです。

2004年7月16日金曜日

Microsoft Research から Cω (シー・オメガと読むらしい)の preview 版コンパイラがリリースされました。
ま、このこと自体はすでにいろいろなところで取り上げられてますね。
http://blogs.users.gr.jp/naka/archive/2004/07/15/3760.aspx
http://blogs.sqlpassj.org/yoneda/archive/2004/07/16/3380.aspx
とか。


Cω のまとめページはこちらみたいです。
http://research.microsoft.com/Comega/
これによると、どうやら Polyphonic C# と Xen(もとは X#)の両方を実装したコンパイラのようです。 


ダウンロードは http://research.microsoft.com/research/downloads/default.aspx の "Comega compiler preview" から行うことができます。


で、さっそくこの preview をダウンロードしてセットアップしてみました。
セットアップ後の様子を見てみると、



  • VS.NET 2003 に "Comega Projects" が追加される。(この PC には VS.NET 2002 も入ってますが、そちらには Cω プロジェクトは追加されませんでした。VS 2005 は入ってないのでわかりません)

  • Cω プロジェクトの拡張子は .cwproj。

  • Cω のソースの拡張子は .cw。

  • Cω のコマンドライン版のコンパイラは cwc.exe。

  • GAC に Cω のランタイムがいくつか追加される。

  • とりあえず、現時点では Cω の再配布用ランタイムは見当たらない。(なので、Cω なコードを実行するにはこの preview を入れておく必要があります)

  • この Cω は C# 2.0 コンパイラをベースにしているみたい。

こんな感じでした。
個人的には最後の項目が気になりました。Cω は C# にいくつかの機能を追加したものという位置付けのようです(今のところは)。となると、C# 1.x をベースにしているのか C# 2.0(Beta)をベースにしているのかで C# 自体の機能が違います。そこで、VS.NET 2003 の Cω プロジェクトで Generics や Anonymous Method を使ったコードがコンパイルできるのかどうか試してみました。試してみたのは以下のような単純なコードです。



using System;
 
public delegate void D<T>(T t);
 
public class A<T>
{
    private T val;
    
    public A(T t)
    {
        this.val = t;
    }
    
    public void Func(D<T> d)
    {
        d(this.val);
    }
}
 
public class Test {
    static void Main() {
        A<int> a = new A<int>(999);
        a.Func(delegate(int n) { Console.WriteLine(n.ToString()); });
    }
}


その結果、きちんとコンパイル・実行できました。なので、この Cω compiler preview は C# 2.0 をベースにしているようだ、と言えると思います。


で、よくよく考えてみたらこれってかなりうれしいかも。
この PC には、VS.NET 2002、2003 しか入ってませんし、当然 .NET Framework 自体も 1.0 と 1.1 しか入っていません。VS 2005 も .NET Framework 2.0 も入ってないんですよね。なのに Cω を使えば Generics や Anonymous Method が使えるようになっちゃいました。

TechED Yokohama 2004

9月 7日(火)~9月 10日(金)に開催される TechED Yokohama 2004 のリンクを追加してみました。


# 私も参加する予定

2004年7月7日水曜日

.NET Framework 2.0 の Stopwatch

plog-blog さんの小ネタに反応(^^;
http://s03.2log.net/home/nsharp/archives/blog44.html


.NET Framework 2.0 に追加されている System.Diagnostics.Stopwatch クラス ですが、ドキュメントにも書かれているように内部ではパフォーマンスカウンタ API を使っているようで、分解能が非常に高いです。
お試しあれ。

2004年7月2日金曜日

Visual Studio 2005 Beta 1 がほんとに来たー! (笑)

MSDN Subscriber Downloads に、



  • Amberpoint Express for Visual Studio 2005 Beta 1 (English)

  • MSDN Library for Visual Studio 2005 Beta 1 - CD1 (English)

  • MSDN Library for Visual Studio 2005 Beta 1 - CD2 (English)

  • MSDN Library for Visual Studio 2005 Beta 1 - CD3 (English)

  • Remote Debugger for Visual Studio 2005 Beta 1 (English)

  • Visio Tools for Visual Studio 2005 Beta 1 (English)

  • Visual Studio 2005 Enterprise Architect Beta 1 - CD1 (English)

  • Visual Studio 2005 Enterprise Architect Beta 1 - CD2 (English)

が上がってます。
(今回は DVD じゃなくて CD-ROM の ISO イメージなんですね)


ところで、Amberpoint Express for Visual Studio 2005 って何?


あと、各 Visual Studio 2005 Express も ISO イメージがダウンロードできるようになってます。

Visual Studio 2005 Beta 1 がもう来てたー!

http://lab.msdn.microsoft.com/vs2005/
こちらで Visual Studio 2005 Beta 1 がもうダウンロードできるようになっているようです。


MSDN Lab( http://lab.msdn.microsoft.com/ )も要チェックですね。
VS2005 Beta 1 のドキュメントも見れるようになってますし。







と思ったけど、来てなかったー!(笑)
よく見たら、MSDN Subscribers download から数日内にダウンロードできるようになるって書いてあります。
それと、数週間内に MSDN Subscribers には送るし、MSDN じゃない人もわずかな料金で Beta 1 を入手できるようにするって書いてありました。






(07/02 追記)
MSDN Subscriber downloads からダウンロードできるようになってました。

2004年6月29日火曜日

Visual Studio 2005 Express Beta も来てたー!

下で書いた URL からもリンクされてますが、Visual Studio 2005 Express Beta もアナウンスされてますね。
http://lab.msdn.microsoft.com/express/


「結局、Express Edition って何よ?」 というのは FAQ( http://lab.msdn.microsoft.com/express/faq/default.aspx )を見てみるとちょっとはわかるかも。
っていうか、わかったら教えてください(笑)


ホビーストとか学生とかが気軽に使えるようにした Edition、というのはわかるんですが、それで普通の VS 2005 とは何が違うの?というのがよくわかんない。
ただ、FAQ に "Are the Express Edition products free?" (Express Edition は無料なの?)なんて設問がありますね。それに対する答えは、「値段はまだ決まってないし、来年度まで発表する予定もない。とりあえず、Express Edition はローコストで、容易に入手できるようにするとは言うことはできる」 という感じですね。もし、WebMatrix のように無料ということになったらすごいと思うんですが、どうなるんでしょうね。

2004年6月28日月曜日

VS2005 Beta と Express

今週、開催される TechEd Europe で Visual Studio 2005 Beta がリリースされるっていうのが、ちょこちょこと記事になってきてますね。
http://www.eweek.com/article2/0,1759,1617344,00.asp


ただ、Express Edition というのもちょこちょこと見かけるんですが、いったいなんでしょう?上の eWeek.com の記事には



  • Visual Web Developer 2005 Express Edition (Web サイトや Web サービスを作るため)
  • Visual Basic 2005 Express Edition (プログラムを学ぶビギナー向け)
  • Visual C# 2005 Express Edition (学生やホビーデベロッパー向け)
  • Visual C++ 2005 Express Edition (  〃  )
  • Visual J# 2005 Express Edition (  〃  )
  • SQL Server 2005 Express Edition (学生やホビーデベロッパー向けの SQL Server 軽量バージョン)

なんてのがあがってます。
さて、いったい Express Edition ってなんなんでしょう?

2004年6月1日火曜日

VS 2005 CTP May 2004 に VSS 2005 (らしきもの) を発見。しかし、、、

VS 2005 CTP May 2004 をセットアップしたら "Program Files" に "Microsoft Visual SourceSafe" なんていうフォルダができてました。
中には、ssadmin.exe や ssexp.exe なんかが入ってます。これらのバージョン情報を見ると 8.0 になってます。しかも、このフォルダに "VSSWebService" なんていうフォルダまであります。


これってやっぱり VSS 2005 なんでしょうねぇ。
しかし、ssadmin.exe とかって起動もしないんですよ。ss.exe(VSS のコマンドライン版ツール)なんてアプリケーションエラーで落ちちゃうし。
そもそも、VSS のデータベース(CVS でいうリポジトリ)がどこにも見つかんないし。


皆さんのとこでは動きます?それとも、やっぱりまだ作ってる最中なんだろうか?

Visual Studio Team Foundation のサーバはまだない(泣)

Visual Studio 2005 Team System for Team Development にソースのバージョン管理、トラッキング、レポートなどをしてくれる Visual Studio Team Foundation というのが紹介されています。


VS 2005 CTP May 2004 を見ると 「Tools」-「Connect to Team Foundation Server...」 メニューなんていうのがあります。
「おぉ、で、その Team Foundation Server ってどこよ?」 となるんですが、ないんですね。


上記のページの下のほうに Newsgroup: microsoft.private.whidbey.teamsystem.teamfoundation へのリンクがありますが、ここを見てみたら 「Team Foundation のサーバコンポーネントは CTP には含まれてないし、ベータ1にも含まれない。今年の後半くらいになる」 なんてありました。残念。

VS 2005 CTP May 2004 の FxCop と Performance Tools

Visual Studio 2005 Team System for Developers からリンクされている Visual Studio 2005 Team System: Building Robust and Reliable Software の FxCop についてです。


もともと FxCop は、http://www.gotdotnet.com/team/fxcop/ にあったものなんですが、VS 2005 では統合されるということだそうです。
FxCop って何?という方のために一応書いておくと、「文法的にはあってるけど、直しといたほうがいいよ」 というところを指摘してくれるツールです。わかりやすいとこで言えば 「メソッド名は大文字で始まるべき」 とかそういうことです。


CTP May 2004 にもちゃんとプロジェクトのプロパティの 「Build」 に 「Run FxCop」 がありました。これをオンにしておけばビルド後に FxCop でチェックしてくれます。
また、同じくプロジェクトのプロパティに 「Rules」 があって FxCop でどのルールをチェックするかを設定できます。


といっても私自身くわしく FxCop を知ってるわけじゃないですし、「CTP May 2004」 でも動くよ、というだけです(^^;






上記と同じ  Visual Studio 2005 Team System: Building Robust and Reliable Software の後半にある Performance Tools についてです。


Performance Tools は 「どのメソッドか何回呼ばれたか。どれぐらいの時間が消費されたか」 を測定するツールです。


「Tools」-「Performance Tools」 メニューの 「Performance Wizard...」 あたりで適当に Performance Session を作ってやって、Performance Explorer の実行ボタンやコンテキストメニューで Lunch してやれば実行されてパフォーマンス情報が収集されます(単に F5 で実行したりしてもダメなようです)。
で、Lunch したあとに Performance Explorer で Reports を表示するといろいろな情報を見ることができます。


ただ、ちょっとよくわからないところもあります。
どうも、Performance Explorer のところで 「Instrumentation」 にしとくと Managed なレベルで情報が収集されるような感じです。「Sampling」 にしたままだと _memset やら 16進のアドレスやらで表示されます。一度 Sampling でレポートを表示すると Instrumentation に戻せなくなっちゃうような。ほんとは Instrumentation と Sampling を自由に切り替えて見方を変えられるってことなんじゃないのかなぁ?
まっ、CTP だし、「ベータを待て」 ってところでしょうか。

VS 2005 CTP May 2004 の Class Designer

Visual Studio 2005 Team System for Developers からリンクされている Visual Studio 2005 Class Designer です。


これ、いちおう CTP May 2004 でも動きます(みたいです)。
適当なプロジェクトを作って、Solution Explorer のところの Class View を開いて、適当なクラスを右クリック、「View in Diagram」 すると開くのが Class Designer みたいです。


Toolbox からクラスなんかを追加することはできますね。ただ、Class Details でメソッドとかを追加しようとしても文句を言われて追加できません。これって私のとこだけかなぁ?皆さんできます?既存のメソッドやフィールドの変更は問題なくできるんですが。


Class Designer 側で変更を行うとソースも同時に更新されます。
「Window」 メニューの 「New Vertical Tab Group」 すると縦分割複数のファイルを同時に見ることができます。この状態で片方にソース、片方に Class Designer を表示して、ソースを変更したり Class Designer で変更したりすると両方がちゃんと更新されます。よくできて増すねぇ。


コンテキストメニューにある 「Create Instance」 なんてのもかなりおもしろいです。
これを選ぶと変数名を聞かれて、その変数名のインスタンスが生成されます(さすがにこのときは後ろでコンパイルしているようですが)。このインスタンスに対してメソッドの実行とかができるんですよね。ソースにブレークポイントを仕掛けておけば、ちゃんとブレークします。
ということは、全体をビルドして実行しなくても、メソッド単位でデバッグできちゃったりするわけです。


もちろん、static なメソッドを実行する 「Invoke Static Method」 もあります。


注意
上記のようなことを試していたら何回か貼り付いたり、落ちちゃったりしました。試してみるときはそのおつもりで。

WebMatrixHosting Japan スタート

WebMatrixHosting の日本語版がスタートしました。
http://japan.webmatrixhosting.net/



  • サーバは Windows Server 2003、IIS 6.0、.NET Framework 1.0、1.1

  • ディスクスペースが 20M

  • SQL Server 2000 が 10M

  • SMTP もあり

こんな環境が無料で使用できるそうです。


また、WebMatrix 日本語版 もバージョン 0.6 ビルド 985 がリリースされています。






ちと、ググってみたらすでに WebMatrixHosting Japan のサインアップの手順をまとめてる方もいらっしゃいます。はやっ
http://www.geocities.jp/clay_do2000/ 


さらに、WebMatrixHosting Japan 上に .Text や BlogX を使った blog も発見。
http://ryon2.japan.webmatrixhosting.net/blogs/
(ここに列挙するのもなんなので、他の方のところは Ryon さんとこのリンクをご覧下さい)
ところで、.Text を動かすには IIS の拡張子マッピングを追加する必要があるんだけど(しない方法もあるみたいだけど)、その辺はどうやってるのかな?

2004年5月26日水曜日

よかった。Visual SourceSafe 2005 は提供されるんだ

Visual Studio 2005 Team System for Team Development のところなんかに 「Visual Studio Team Foundation ではソースコントロールやトラッキング、レポーティング、カスタムポリシーといった開発プロジェクトでの変更を効率的に管理するものが統合されて提供される」 なんてことが書かれていて、ここから Visual Studio 2005 Team System: Enterprise-Class Source Control and Work Item Tracking にリンクされています。


で、「Visual SourceSafe はどうなるの?」 というのが気になってました。
もちろん、Visual SourceSafe (以下 VSS と略) にこだわっているわけではないので Team Foundation でもいいっちゃいいんです。けど、わざわざ "Enterprise-Class" なんて銘打ってますし、ちらっと見てみたところ 「バックエンドに SQL Server を使う」 「500人くらいまでのプロジェクトをサポート」 なんてことが書かれています。確かに、これはこれですばらしいんだけど、小規模プロジェクトとか趣味プログラミングとか 「VSS みたいにセットアップすればすぐに使える、お気楽なバージョン管理システムはなくなっちゃうの?」 と。それが気になってたんです。
VS 2005 CTP March 2004 とかにも VSS 2004 とかの謎なバージョンが入ってたとは思いますが、VSS が今後どうなるのかというアナウンスは見たことがなかったので 「Team Foundation に取って代わられちゃって、VSS はなくなるっていうことだったら嫌だなぁ」 と。


けど、見つけました(今まで気付いてなかっただけかも知れませんが)。
Microsoft Visual SourceSafe Roadmap
ちゃんと VSS 2005 のことが書いてあります。
しかも、



  • Remote Web Access over HTTP : HTTP か HTTPS で Web Access できる世界中のどこからでも Visual Studio を使って VSS のデータベースに接続できる(VS 2005、IIS、ASP.NET が必要)。

なんて書いてあります(願わくば、VS 2005 を使わなくても VSS のクライアントで HTTP/HTTPS 経由の接続ができるといいんだけど)。
他にも



  • viewer、marge tool、editor などがプラグイン可能になる(サードパーティ製のツールを使うこともできるようになる)。

  • C#、VB.NET といった Managed Code で機能拡張をすることができるようになる。

  • OnBeforeCheckout、OnAfterCheckIn なんかのイベントが使えるようになる。たとえば、チェックインされたら自動ビルドを実行するなど。

  • Unicode、XML をサポート(今さらではあるけど)。

など。
うーん、こいつぁ、かなりうれしい。


もちろん、VSS 2005 は一人きりとか小規模なチーム向けで、それ以外か小規模でもきっちり管理したいときは Team Foundation ということだそうです(まっ、そりゃそうですね)。

2004年5月25日火曜日

C# 2.0 Specification が更新されているそうです

Eric Gunnerson 氏の blog で発見(Eric Gunnerson's C# Compendium


http://msdn.microsoft.com/vcsharp/team/language/default.aspx にある "C# 2.0 Specification" が更新されているそうです。


24. Nullable type
int? という構文です。int? は Nullable<int> の省略表現です。...なんですが、どうやら (値型、参照型、enum型と同じように) Nullable型というのが増えると思ったほうがいいような感じです。
おぉ、24.3.6 に ?? 演算子なんてものを発見。a ?? b としたとき、a は参照型か Nullable型のみが許され、a が null の場合は b が返り、非 null の場合は a が返る、ということのようです。なるほど、これは結構便利かも。


以下は 25. Other Features の覚え書き。


25.1 Property accessor accessibility
プロパティの set、get それぞれ別々に protected とかが付けれるようになる。


25.2 Static classes
new できないクラス。当然、object 以外からは継承できず、すべてのメンバは static でなくてはいけない。


25.3 Namespace alias qualifiers
新しい namespace の指定方法。
  using A = System.IO;
だと A.Stream とやっても自動的に親も捜してしまうので曖昧になってしまうときがある。しかし、A::Stream とすると 「そこだけ」 の参照になる、ということ?


25.4 Extern aliases
これは 25.3 と似てるけど、さらにアセンブリを指定する方法。そのために extern alias なんて構文が増えてる。extern alias しておいて A::Hoge.Page のように指定。


25.5 Pragma directives
#pragma で warning が制御できるようになったって。


25.6 Conditional attribute classes
今までも ConditionalAttribute はあったけど、これを Attribute に適用できるようになるって。Conditional をつけてある Attribute は、その Attribute をつけている class をコンパイルするときに define されていれば Attribute が付加されるし、されていなければ付加されない。

文字列比較のパフォーマンス

どうやら、一部で流行っているようなので...(^^;



String s1 と String s2 があった場合に、両者が同じかどうかを比較するには



  1. s1.Equals(s2)
  2. String.Equals(s1, s2)
  3. s1 == s2

という 3種類の方法があります。
で、「どれが一番速いのよ?」 という話題ですね。


以下は sscli のソースと .NET Framework 1.1 をちょっと覗き見た内容です。


まず、3 の s1 == s2 は単に 2の String.Equals(s1, s2) を呼び出すだけです。
注意:  VB.NET の s1 = s2 は Microsoft.VisualBasic.CompilerServices.StringType.StrCmp を呼び出すそうですが、C# では単に String.operator ==(s1, s2) を呼び出すだけです。ちなみに、operator== は op_Equality とも表記されます(というか、IL 的には op_Equality のほうが正式名だと思いますが)。


次に、2 の String.Equals(s1, s2) ですが、これは
 a. s1 と s2 が同じオブジェクトなら true を返す。
 b. s1 か s2 が null なら false を返す。
 c. どちらでもないときは 1 の s1.Equals(s2) を呼び出す。
となっています。


で、1 は internalcall といって .NET Framework の内部に実装された関数にマップされています。


というわけで、どれが一番速いかは明らかですね。3 は 2 を呼び、2 は 1 を呼ぶ、という実装なんですから、1 が一番速くて 3 が一番遅いということになります。


ただ、ちょっと注意があります。s1、s2 が同じオブジェクトだった場合、もしくは、どちかが null だった場合は 2 が一番速いという結果になることが多いんじゃないかと思います。
ここで、C# だと同じ文字列定数は自動的に同じオブジェクトになります。それは以下のようにすれば確認できます。


string s1 = "aaa";
string s2 = "aaa";
if ((object)s1 == (object)s2) {
    Console.WriteLine("同じオブジェクト");
}

同じ文字列だけど別のオブジェクトを生成したいときは StringBuilder を使ってやればいいようです。


StringBuilder sb1 = new StringBuilder("aaa");
string s1 = sb1.ToString();
StringBuilder sb2 = new StringBuilder("aaa");
string s2 = sb.ToString();
if ((object)s1 == (object)s2)
{
    Console.WriteLine("同じオブジェクト");
}

# 1つの StringBuilder から 2回 ToString() してやっても別々のオブジェクトに
# なるようではありますが。

やっぱり出てた。VS 2005 CTP May 2004

MSDN の Subscriber Downloads に以下のものがすでにあります。


Visual Studio 2005 Community Technology Preview May 2004 - 32 Bit (English)
Visual Studio 2005 Community Technology Preview May 2004 - 64 Bit (English)


# March じゃなくて May だよ。


ちなみに、32 Bit が 2.53GB の ISO イメージ、64 Bit が3.32GB の ISO イメージです。


64 Bit には当然 .NET Framework 2.0 の 64 Bit 版が入っていると想像してるんですが、こんなにサイズが違うのはなんでなんだろう?
求む、人柱(^^;

Visual Studio 2005 Team System なんてものが登場

こちらのページ。
http://msdn.microsoft.com/vstudio/teamsystem/


まだ読んでないんですが(^^
今まで Visual Studio は開発ツール(コードを書いてコンパイルしてデバッグする)ためのものっていう感じでしたが、Visual Studio 2005 からはだいぶイメージが変わるのかな?



  • for Architects

  • for Developers

  • for Project Managers

  • for Team Development

  • for Testers

のそれぞれが紹介されています。


おそらく TechEd で発表されたんでしょうね。詳細情報求む>現地の人(^^;

2004年5月21日金曜日

C# の Generics

今さらながら .NET Framework 2.0 で搭載される Generics のことです。
といっても解説じゃありません(^^;


基本的には以下のような感じですね。
(以下に書いているコードは VS2005 CTP March 2004 では動きました)



private static void TestGenerics()
{
    List<int> l = new List<int>();
    l.Add(0);
    l.Add(1);
    l.Add(2);
    l.Add(3);
 
    // 普通に Count でループ
    for (int i = 0; i < l.Count; ++i)
    {
        Console.WriteLine(l[i].ToString());
    }
 
    // もちろん foreach でもループできる
    foreach (int n in l)
    {
        Console.WriteLine(n.ToString());
    }
}


通常版では自動拡張する配列は ArrayList クラスでしたが、Generics 版は List クラスになってます(たぶん(^^; リファレンスに List が見つからないんですが)。といっても、Generic なだけで使い方は ArrayList とほとんど同じです。


ただ、ArrayList はほんとに単なる 「自動拡張する配列」 でしたが、List にはいろいろとメソッドが増えてます。たとえば、Find とか。で、おもしろいのは、この Find の引数って Inttelisense で 「Predicate match」 って出てくるんですよ。Predicate ってなにかと言うと、
  public sealed delegate bool Predicate(T obj);
という Generic な delegate なんですね。
ついでに言うと、Find の戻り値は Nullable だそうです。なるほど、たとえ T が値型だったとしても、見つからなかったときに null が返せるように Nullable になってるわけですね。


で、Find を使ったコードはというと以下のような感じ。



private static void TestGenerics()
{
    List<int> l = new List<int>();
    l.Add(0);
    l.Add(1);
    l.Add(2);
    l.Add(3);
 
    // 0 か 2 のものを探して表示
    Console.WriteLine(l.Find(IsZeroOrTwo).Value.ToString());
}
 
private static bool IsZeroOrTwo(int n)
{
    return n == 0 || n == 2;
}


ここでは、static なメソッドである IsZeroOrTwo を delegate のコールバックメソッドとして使ってます。この場合 0 と 2 の 2つが見つかりますが、Find は最初に見つかったほうだけを返すので 0 だけが表示されます。
あぁ、そうそう、検索した結果見つからなくて null が返ってきたときのチェックを省略しちゃってますが、もちろん、ほんとはすべきです。


どうでしょ?すごくイイ!と思いませんか?(私は激しく思います。色を変えたくなるくらい)
ただ、C++ の STL を知らないと Predicate の考え方がわかりにくいかもしれませんね。


もう 1つ。List.FindAll もあります。これは見つかったやつをみんな返すっていうメソッドです。なので、戻り値は List です。引数は Find と同じ。
それと ForEach っていうメソッドもあります。これの引数は 「Action action」 です。Action も、
  public sealed delegate void Action(T obj);
です。Predicate との違いは戻り値が void なところだけですね。


この FindAll と ForEach を使うと、



private static void TestGenerics()
{
    List<int> l = new List<int>();
    l.Add(0);
    l.Add(1);
    l.Add(2);
    l.Add(3);
 
    // 0 か 2 のものを探して表示
    l.FindAll(IsZeroOrTwo).ForEach(WriteLine);
}
 
private static bool IsZeroOrTwo(int n)
{
    return n == 0 || n == 2;
}
 
private static void WriteLine(int n)
{
    Console.WriteLine(n.ToString());
}


こんな感じに書けます。


さらに...
delegate は Anonymous Method として書けるはずです。ということは...



private static void TestGenerics()
{
    List<int> l = new List<int>();
    l.Add(0);
    l.Add(1);
    l.Add(2);
    l.Add(3);
 
    l.FindAll(delegate(int n)
    {
        return n == 1 || n == 3;
    }).ForEach(delegate(int n)
    {
        Console.WriteLine(n.ToString());
    });
}


っていう書き方ができるんです。


イイ!イイ!イイ!激しくイイ!
こりゃ楽しいや。

int? - Nullable

一部でうわさになっていた機能ですが、VS2005 CTP March 2004 で実装されていたんですね。全然気付いてなかったです(^^;


本来、値型は null という状態をとることはできません。C# の int も System.Int32 構造体のエイリアスなので、当然、値型です。なので表現できるのは整数値のみで null というのは表現できません。もし、値型も null を取れるようにすると値型の意味合いがかなり大きく変わってしまいます。しかし、そんなことをしなくても Generics を使えば 「null も表現できる値型」 が作れます。それが Nullable です。そして、C# では int? と型宣言をすると自動的に Nullable とコンパイルしてくれます(なので int? は単なるシンタックスシュガー)。


まぁ、以下のコードを見てもらえばわかるでしょう。


注意:某所の情報によると Nullable はなくなることはないと思いますが、int? が正式採用されるかどうかはまだ微妙みたいです。



int? i = null;
?
// 型名を表示(Nullable!1 とのこと)
Console.WriteLine(i.GetType().Name);
?
// null か確認
if (!i.HasValue)
{
    Console.WriteLine("!HasValue");
}
?
// null が確認
// ちなみになぜこれで動くかというと op_Implicit、すなわち implicit operator T (Nullable) が定義されているから。
if (i == null)
{
    Console.WriteLine("null");
}
?
// たとえ !HasValue であっても参照できる
// これも op_Implicit のおかげ。
if (i != 0)
{
    Console.WriteLine("i != 0");
}
?
// ただし !HasValue のときに Value を参照すると InvalidOperationException
//if (i.Value != 0)
//{
//    Console.WriteLine("i.Value != 0");
//}
?
// 整数を代入
i = 1;
?
// HasValue はもちろん true
Console.WriteLine(i.HasValue);
?
// i だけで参照。これも op_Implicit のおかげ。
Console.WriteLine("{0:d}", i);
Console.WriteLine(i.ToString());
?
// Value で参照
Console.WriteLine("{0:d}", i.Value);
Console.WriteLine(i.Value.ToString());

2004年5月18日火曜日

ASP.NET でクライアントサイドのエンターキーを制御する

IE では、テキストボックスが 1つとボタンが 1つといった場合に、テキストボックスでエンターキー(改行キー)を押すと自動的に submit してしまうため、PostBack が発生してしまいます。
こいつを PostBack させないようにする方法です。


/// <summary>
/// エンターキーを制御するクライアントスクリプトを出力します。
/// </summary>
/// <param name="page">スクリプトを出力する<see cref="System.Web.UI.Page"/>。</param>
public static void RegisterEnterKeyPageScript(System.Web.UI.Page page)
{
    page.RegisterClientScriptBlock("enterkey",
        "<script language='javascript'>\n" +
        "function text_keydown(e, name)\n" +
        "{\n" +
        "  var key = 0;\n" +
        "  if (typeof(e.keyCode) != 'undefined') {\n" +
        "    key = e.keyCode;\n" +
        "  } else if (typeof(e.which) != 'undefined') {\n" +
        "    key = e.which;\n" +
        "  }\n" +
        "  if (key == 0xd) {\n" +
        "    if (typeof(name) != 'undefined' && name != '') {\n" +
        "      document.forms[0].elements[name].click();\n" +
        "    }\n" +
        "    return false;\n" +
        "  }" +
        "  return true;" +
        "}" +
        "</script>");
}
 
 
/// <summary>
/// エンターキー押し下げ時にサブミットするボタンを設定します。
/// name が "" のときはエンターキーを無視します。
/// </summary>
/// <param name="control">設定する<see cref="System.Web.UI.WebControls.WebControl"/>。</param>
/// <param name="name">サブミットするボタンの name。</param>
public static void RegisterEnterKeyScript(System.Web.UI.WebControls.WebControl control, string name)
{
    control.Attributes["onkeydown"] = "return text_keydown(event, '" + name + "');";
}

まずはこんなメソッドをどこかに用意しといてください。
で、テキストボックスが TextBox1、ボタンが Button1 とすると、Page_Load イベントで


RegisterEnterKeyPageScript(this);
RegisterEnterKeyScript(TextBox1, "");

と呼び出してやればエンターキーが無効になるはずです。
また、


RegisterEnterKeyPageScript(this);
RegisterEnterKeyScript(TextBox1, "Button1");

としてやれば、テキストボックスでエンターキーを押すと Button1 をクリックしたことになるはずです。


"はず" なんて書いているのは、これらの動作は ASP.NET は関係なくて完全にクライアントのブラウザに依存するからです。実際、上記のメソッドはクライアントサイドの JavaScript を出力してるだけです。なので、JavaScript がオフにされてると上記のコードは動きません。それと、IE6 とと Netscape6 あたりなら動くと思いますが、他のブラウザはどうかわかりません。
(「こうしたほうがいいよ」 ということがあったらコメントでもつけてください)

2004年5月13日木曜日

.NET でシリアル通信を使う(覚え書き)

Whidbey では標準でサポートされますが、現状の .NET Framework 1.0、1.1 にはシリアル通信(シリアルポート(Serial Port)の RS-232C とかでモデムを繋いだりするやつのことね)のサポートがないんですよね。
といっても、Win32 ではシリアルポートってあまり特別な存在じゃなく、CreateFile して SetCommState でごにょごにょして、あとは WriteFile とか ReadFile とかして...って感じなので DllImport すれば .NET でだって使えるわけです。


と言っても、すでにそれらをラップして便利に使えるようにしてくれたソースがいろいろと公開されています。なので、それの覚え書き。
なお、以下はちょこっとソースを見ただけで、詳しく調べたわけじゃないのでコメントは間違ってるかもしれません。


MSDN Magazine 「Use P/Invoke to Develop a .NET Base Class Library for Serial Device Communications」
http://msdn.microsoft.com/msdnmag/issues/02/10/netserialcomm/

まぁ、標準的な実装なのかな?Win32 API をラップして使いやすくしたクラスが用意されてる。


The Code Project 「Serial Communications : The .NET Way」
http://www.codeproject.com/dotnet/DotNetComPorts.asp

こちらも上のと同じような感じかな?


GotDotNet User Sample 「SerialPort component and CSTerm terminal application」
http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=b06e30f9-1301-4cc6-ac14-dfe325097c69

これは Form に貼り付けて使うという使い方ができるようになってるみたい。お手軽かも。


GotDotNet User Sample 「SerialStream - use the serial port as a Stream」
http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=FCBA7FC5-666E-4EB0-863F-0045B0C79EC7

おっ、これはおもしろいかも。Stream を継承して SerialStream を作ってある。ちゃんと BeginRead/Write などの非同期メソッドもある。

2004年5月7日金曜日

.Text から PING.BLOGGERS.JP さんにも ping を送るようにする

もともと .Text では http://www.weblogs.com/ に ping を送る(※1)ようになっています。(web.config でオフにすることもできます)
ちなみに、http://www.weblogs.com/ を IE6 で見ると日本語が文字化けしてますが、「表示」-「エンコード」 メニューで utf-8 を選択すればそれなりに見えるようになります。


※1 プロトコルの仕様はこちら。Weblogs.Com XML-RPC interface


で、この処理を行っているのは Dottext.Framework\Tracking\WeblogsNotificatinProxy.cs なんですが、実装方法がちょっと変わっています。Attribute で送信先 URL や Method を指定するようになっています。これは XML-RPC.NET の CookComputing.XmlRpc.dll を使って実装しているようです。


というわけで 「WeblogsNotificatinProxy.cs をまねして http://ping.bloggers.jp/rpc/ に ping を送るクラスを作る」 というのが一番楽そうだったのでそうしてみました。


追加・変更したソースを http://www.divakk.co.jp/aoyagi/BloggersJpNotificatinProxy.ZIP においておきます。
BloggersJpNotificatinProxy.cs (と .resx)が WeblogsNotificatinProxy.cs をまねして新規に作ったクラスです。
Notification.cs は 3行だけ追加してあります。
これらの追加・変更を行ってビルドすれば PING.BLOGGERS.JP にも ping を送るようになります。


一応、ビルドした DLL を http://www.divakk.co.jp/aoyagi/dotText_bin.ZIP においておきます。この DLL は、私のところで動いているものと同じですので Trackback ping の utf-8 化などの修正も行ってあるものです。