Top > Programmingとか > VB / VB.NET > 2008

2008年08月27日

.NET Reflectorが商用化

今朝方、Lutz Roederさんから「.NET Reflector(以下.NR)をRed Gate社(以下RG社)に移譲しちゃったよー」というメールが来ました。
たぶんダウンロード時に入力を促されたメールアドレスへの機械的な配信なんだと思います。

SQL Server tools, .NET developer tools - Red Gate Software
.NET Reflector, class browser, analyzer and decompiler for .NET

私の英語力はかなり怪しいので、移譲しちゃったのかこれからしちゃうのか、そもそも移譲なのか移管なのか売却なのか、ってあたりのニュアンスまでは読み取れていないんですが、とりあえず
  • 今後.NRの開発/提供主体はRed Gate社になる。
  • RG社は従来通りフリー版(コミュニティ版)を提供し続けるが、同時により多機能な商用版の開発にも着手、販売を開始する予定。
てな感じになるようです。

LutzさんとRG社のJames MooreさんへのこのへんのインタビューThe Future of Reflectorでは、移譲の経緯や今後の方向性などについて言及されています。
細かい話は実際に読んでいただくとして、大雑把な訴求点は
  • これからもコミュニティとの協同路線を図っていく、ないがしろにはしない。
  • RG社は数年前に購入したSQL Server Central(SQL Serverのコミュニティサイト)の運営でもコミュニティに信頼してもらえて実績があるので安心してくれ。
  • Lutzさんは開発からは手を引く。今後はユーザーとしてアイデアを出していく。
  • アドインは否定しない、今後も積極的に受け入れていく。

みたいな感じでしょうか。

Lutzさんのサイトから.NET Reflectorはもう完全になくなっているようで、Red Gate社サイトの.NET Reflectorページへリダイレクトされます。
LutzさんのサイトLutz Roeder自体はまだ存続しているようですね。
.NET Reflector用アドインはcodeplex.NET Reflector Add-Insでまとめられています。

この移譲は8/20に発表されたようで、当日付でRG社サイト内に専用のフォーラムが開設されています。

すでにいくつかの提案/バグ報告/議論が上がっているようです。
私がちょっと惹かれたのは、FREE THE CODE!のスレッド。

「ソースコードを公開してくれよー」から始まる、難読化(出所がわからなかったんですが、どうもそういうアナウンスがあったようです)に対する反対表明が。
アドインの開発がしにくくなる、いっそオープンソースにしてしまえ/いやむしろなんでしないんだ、とかけっこうおもしろい議論になっています。

個人的には、オープンソースにしてしまうと企業側からの舵取りが難しくなるあたりで可能性は低そうです。難読化は商用版のみに行えばいいような気もしますが、商用版の機能を前提とするアドインが作りにくいとかコミュニティ版では動作するが商用版では動作しないなんてこともありそうなので、アドインの作り手からすれば完全な可読ILの公開、できればソースの公開を望む気持ちにも共感できます。
RG社がどこまで譲ってくれるかがカギでしょうか。

時代がまたひとつ前進しちゃったなあ…。

2008年08月12日

Visual Studio 2008 & .NET Framework 3.5 SP1

出ましたねー。
今回のは単なるバグフィックス集ではなく、けっこう新しい機能等が入っているので、期待してたんですよ。

とりあえずどんなふうに変わったかは、Somasegar's WebLog : Service Pack 1 for VS 2008 and .NET FX 3.5 released! あたりでさらっと書かれてますね。
詳しい説明はこれから出てくるんだと思うんですが(私が見つけられていないだけかも)、βレベルでは Visual Studio 2008 and .NET Framework 3.5 Service Pack 1 Beta - ScottGu's Blog なへんで。日本語訳はVisual Studio 2008 SP1 β - ++C++; // 管理人の日記 でufcppさんが荒訳してくれてます。


日本語版のダウンロード先はダウンロードの詳細 : Visual Studio 2008 Service Pack 1、インストール前にHotFixとかを外さなきゃならないらしいんですけど、そこらへんをチェックだかアンインストだかしてくれるはずのVisual Studio 2008 Service Pack 準備ツールが今んとこリンク切れ起こしています。ので、手動で何らかのHotFixをかけている方は、事前にアンインストかけておいた方がいいかもしれません。

で、上記リンクからのダウンロードサイズは551KB。どうもローダってゅうかWebインストーラのようです。
実際にやってみると、インストールウィザードの最初の画面で[次へ]ボタンが押せなかったりウィンドウがっ白になったりしてちょっとビビりますが、落ち着いてしばらくほっとくと先に進みます。
Office2007とかなんかそのへんまでパッチ対象になるのにもちょっとびっくりですが、毒食わば皿までな気もします。SP1入れた後でOffice2007とかSQLServerとか入れたらどうなっちゃうんだろう。

私のマシンでは特に不具合もなく45分ほどで完了、要再起動。
って個別設定の読み込みに失敗したよ!なんかデスクトップのすべてが初期値に戻ってしまったよ!
あわてて自分の設定フォルダを見たら、ファイル自体は全部残っていたので一安心。「後インスト」用に一時的に個別設定を停止した可能性があるなあと、もう一度再起動→今度は正常に起動。
秀丸の拡張子関連付けが初期値に戻ったままになっちゃったけど、まぁそのくらいであれば気が付くごとに再設定かければいいのでさほどの問題ではありませんね。

VSの起動はそんなに時間もかからずふつーに行えるような感じです。なんか操作するたびにちょっと考え込むような気がしますけど、初回JITが走っているんであれば使い込んでいくうちになじんでいくんではないかと。

バージョン情報ダイアログでは、VSが「Microsoft Visual Studio 2008 Version 9.0.30729.1 SP」、.NETが「Microsoft .NET Framework Version 3.5 SP1」な表記になりました。

Express EditionのSP1は、パッチではなくフルインストーラで提供されています。ので、VB 2008 Express SP1をインストールするためには、事前に無印VB 2008 Expressをアンインストしておく必要があるらしいです。

Express Editionは、特にSP1用のインストーラ配布ページはありません。従来通り、Visual Studio 2008 Express EditionsでそのままVB2008 Express Editionがインストールできます。ページ内の説明文が「Visual Basic 2008 Express Edition with Service Pack 1 は~」になっているので、まぁそのまま信じていいんではないかと。

こちらも、実際にやってみました。
VB2008 Express EdidionはWebインストーラ2.61MB、Silverlight Runtimeは込み、SQLServer2008Expressは抜きでざっと25分くらい。
こちらは再起動の必要もなく、さくっと起動可能。

msdn Library(ヘルプ)がまだ間に合っていなく、SP1で追加された機能を引っ張ると英文ページに飛んでくのもまあ提供直後の御愛嬌。これから基本環境も整っていくでしょうし、ノウハウもあちこちから提供され始めると思います。

マシンパワーがある程度必要なのがちょっとアレですが、これからが楽しみです。

2008年02月21日

SystemColorsではシステムカラーにならない

VB2005・VB2008 共通の現象なので、たぶん.NET Framework 2.0 に起因するんだと思うんですが。

TextBox とかの背景色を特定の状況に対して固定色を割り当てた場合、その特定の状況が解除された時にシステムデフォルトな状態に戻したいわけです。

で私、こーいう場合は SystemColors なんだと。何の疑いもなく覚えていたんですね。

TextBox1.BackColor = Drawing.SystemColors.Window

みたいな感じで。

したっけこの設定では、Enabled = False にした時にも、Enabled = True の時と同じ配色のままであることが判明。

いやそれじゃ半分しか意味ねぇだろうよ。

どうも Enabled の状態まで含めて元に戻したい場合は、

TextBox1.ResetBackColor()

で初期化してやらないばいかんらしいです。

でもそれでは、別のシステムカラーに差し替えることができないではないですか。

ResetBackColor なんか msdnLibでこのクラスでは、このメソッドは使用されません。とか書かれちゃってるじゃないですか。何でそんなことを書いてあるのかと思ったら、EditorBrowsableAttributeとかでエディタから非参照にしているからじゃないですか。

てことは、公式にはコントロールにシステムカラーをセットする手段がない、ってことになっちゃうんですかね。

なんか納得いかーん。

ということで、ちょっと調べてみました。


まず、てきとーに動作検証用のプログラムを組みます。こんな感じで。

Image1.png

このプログラムは、[ Disabled ]ボタンを押したら TextBox の Enabled を False にし、

Image2.png

[ Enabled ]ボタンを押したら TextBox の Enabled を True にする

Image3.png

というものです。

あと、TextBox の BackColor を「 Red 」「 Window ( Set )」に設定する機能も付けてみました。「 Window ( Reset )」とあるのは、SystemColors.Window の設定ではなく、ResetBackColor メソッドで再初期化するようにしてあります。

「 Red 」を選択して [ Set ] ボタンを押すと、

Image4.png

こんな感じで TextBox の背景色が変わります。
この状態でTextBox の Enabled を False にしてみると、

Image5.png

背景色は変わらず、文字色だけがグレーアウトします。
Enabled を True に戻すと、元の色合いに戻ります。

次、SystemColors.Window を設定してみます。

Image6.png

この時点では、見た目は起動時と変わらないわけですが、

Image7.png

Enabled を False にすると、背景色がグレーアウトしなくなってしまいます。

Image8.png

ResetBackColor で初期状態に戻してやると、

Image9.png

また Enabled = False で背景色もグレーアウトするようになります。

さてこれで状況はおさらいできたとして、

  • こんな動作になるのはなぜなのか
  • 非推奨な ResetBackColor メソッドではない方法で初期状態にする方法はあるのか
  • コントロールデフォルトではない他のシステムカラーにするにはどう設定すればいいのか

ってことを知りたいんですよね。

先日.NET Frameworkの中身を見てみる.NET Frameworkの中身を見てみたでご紹介しましたが、.NET Framework Library のソースが公開されるようになりました。

こんな時のためにこそ!というわけで、今回は BackColor の内側で実際に何をやっているのかを覗いてみることにします。

ちなみに、ライブラリソースの扱いについての説明は、今回はさらりと流します。
詳しく知りたい方は、上述のエントリをご参照ください。

まず、[ Set ] ボタンのClickイベントにブレークポイントを置きます。
で、「 Red 」RadioButton を選択して[ Set ] ボタンを押します。

ここまででこんな感じ。

Image011.png

TextBox は System.Windows.Forms 名前空間下のオブジェクトですので、この時点で System.Windows.Forms.dll のシンボルを読み込んでから F8 でライブラリソースに潜ります。

おおっ、TextBox の BackColor プロパティのソースが表示されましたよ。
BackColor プロパティは TextBoxBase.cs にあるんですね。

Image012.png

…なるほど、こんな仕組みになっていたんだ。

代入する時はとにかくそのまま受け取りますが、参照する時にちょろちょろやって、って

単に 2 つのシステムカラーを振り分けているだけかい!

ReadOnly プロパティで振り分けているってことは、ここは Enabled のTrue / False がその基準になっているってことです。
ReadOnly = True、つまり Enabled = False の時には SystemColors.Control を使っているだけなんですね。

このロジックにたどり着く前提として、ShouldSerializeBackColor による振り分けを行っていますね。これは何だろう。

という時は、ここにもブレークポイントを置きます。

Image019.png

左端のブレークポイントマークが中抜け赤丸になっているのは、設定したブレークポイントが有効になっていないという印です。

このマークをマウスでポイントすると、有効にするためのアドバイスが表示されます。

Image020.png

つことで説明されたとおりに、ブレークポイントマークを右クリック → [ 場所 ] を選択。

Image022.png

「ファイルのブレークポイント」ダイアログが表示されますので、[ 元のバージョンと異なるソースコードを許可する ] にチェックをつけて OK。

Image016.png

実際ソースとシンボルにずれは見つけられないんですが、なんか細かくバージョンが合わないみたいで、こんな手順を踏まなければならない ( 時もある ) ようですね。

で、めでたく ShouldSerializeBackColor においたブレークポイントを有効にできました。

Image023.png

あとは F5 で ShouldSerializeBackColor まで処理を流して、再度ストップかかったら、F8 押してさらに潜ります。

ShouldSerializeBackColor メソッドは Control.cs にあるんですね。

Image024.png

うーんと、これは BackColor が Empty かどうかを調べて、その結果の逆の Boolean 値を返しているだけですね。Empty でなければ True を返すという。

で、さっきの BackColor プロパティのソースと見合わせると、「Empty でなければ BackColor をそのまま返す」「Empty であれば、Enabled の状態に合わせて SystemColors.Control か SystemColors.Window のどちらかを返す」ということなのがわかります。

では、ResetBackColor メソッドを実行した場合は、どのように初期化しているのか。

これは、「Windows ( Reset )」を選択して [ Set ] ボタンを Click したところにブレークポイントをかけ、

Image025.png

F8 で潜る!

Image026.png

Empty 代入しているだけですかい!

わかりやすー。


つことで、結論。

  • BackColor をコントロールの初期値に戻すには、Color.Empty の代入が正しい。
    ResetBackColor メソッドでも同じこと。
  • 他のシステムカラーを設定するなら、Enabled の値に応じて振り分ける BackColor プロパティを独自に作って OverRide でOK。
    なんか泥臭いような気もしますが、ライブラリ自体がそもそもそうやっていることですし。

なんか意外と簡単に納得できちゃったなー。

2008年02月11日

VS2005 のソリューションは VS2008 では作れない

というわけではないのですが、ちょっと意識的に嘘をついてみましたすいません。

VS2008 のウリのひとつに「.NET Framework 2.0 / 3.0 / 3.5 を切り替えてソリューションを作成できる」ってのがありまして。
これを根拠として、「VS2005 のソリューションを VS2008 で作成できる」と言いきっちゃっている人をまま見かけるんですが、これが私にはミスリードだと思えてならんのです。

以下、「.NET Framework」を「.NF」と略します。長すぎる。

確かに VS2008 で .NF2.0 のソリューションを作成すると、できあがった .exe は .NF2.0 のみインストールされているマシンでも動作するようにみえます。
たぶん実用的な範囲では「動作する」と理解しておいても弊害はあまりないと思います。

しかし、特に商品としてのプログラムを作成する場合。

「VS2008 での VS2005 ソリューションの作成」を採用するかどうかは、単純に動くの動かないのとは別に、以下の 2 点を考慮する必要があります。

  1. VS2008 に同梱される .NF2.0 は SP1 であり、無印ではない。

    各種テストをVS2008IDE上で行った場合、テスト結果が保証するのは.NF2.0SP1に対してであり、.NF2.0無印に対するものではない。
     
  2. VS2008 での .NF2.0 指定の本質はアセンブリの限定であり、コンパイラは3.5のものがそのまま動作する。

    VS2008 で VS2005 ソリューションを作成した場合、.NF3.0以降でアセンブリベースで提供された機能は抑制されるが、「コンパイラベースで.NF2.0の機能のみに落とし込まれる」VS2008での新機能についてはコンパイルも通り、動作もしてしまう。

(1)については、テストメンバのマシンで VS2005 環境・VS2008 環境が混在している場合に結果がブレかねない、という恐れがあります。
また、エンドユーザの動作環境を無印 / SP1 どちらの環境で縛るかという話にもつながります。

(2)については、VS2008 環境で作成した VS2005 ソリューションは、VB2005 環境での修正 / 再ビルド / メンテナンスができなくなる可能性があるということです。

もちろん、

  • すべての開発環境 / メンテ環境を一気に VS2008 にアップグレードする
  • .NF2.0 無印 / SP1 の両方で同じテストを通す
  • エンドユーザの動作環境を一斉に SP1 にアップデートする
  • 具体的な不具合が発生するまでは無印 / SP1 の違いを気にしない

などの回避策はあります。

しかし、これらは無視していい事柄だとは私には思えませんし、よって「VS2005 ソリューションを VS2008で作ってもまったく同じ、むしろ VS2008 の方が作業環境として優れている」と単純に言いきってしまっていいとも思えないんです。

知らずにたかをくくるのではなく、知った上で判断していただきたいと思います。

ディベロッパー製品開発統括部 Blog : .NET Framework 3.5 と、.NET Framework 3.0および2.0 の関係

.NET Framework 2.0 Service Pack 1 で修正される問題

.NET Framework 3.0 Service Pack 1 で修正される問題

Microsoft .NET Framework 2.0 Service Pack 1 および Microsoft .NET Framework 3.0 Service Pack 1

※ コンパイラベースのノーチェックについてはCLR/H 2008ローンチの小野修司さんのセッションから。

2008年02月05日

Microsoft Document Explorerの使い方メモ

皆さんは、Microsoft Document Explorer ってソフトをご存知でしょうか。
何のことはない、VB なんかについてくるヘルプのことなんですが。

もう少しきちんとお話しすると、VB2008 などについてくるヘルプ(これを msdn Library といいます)はhtml ファイル(正確には複数の html ファイルや各種関連ファイルをジャンルごとにひとつのファイルにまとめて圧縮してあります)になっていまして、Web ブラウザでも見られるようになっているわけです。(これも正確には ie で、ということになるでしょうか。FireFox や Opera で見られるかどうか私は知りません。)

で、もちろん Web ブラウザで見てもいいんですが、もうちょいヘルプとして使いやすい操作性にならないものか、と専用のブラウザがあるわけです。

それがMicrosoft Document Explorer。

ヘルプの各ページを表示する領域の実体はieですので、URL を叩いてやれば一般の Web ページも見ることができます。

さて、今回はこの Microsoft Document Explorer (MDE) の使い方についてちょいとメモを。
いや、自分がよくわからなくて調べたので、単に備忘録なわけですが。

1. 検索の高速化と信頼性のトレードオフ

MDE は Ver.9 (VB2008 添付版)になってから、ずいぶん検索にかかる時間が短くなったように感じます。
しかしそれでも、少しでもより速い検索環境がほしい、それがプログラマ魂。

しかしまぁそんな都合のいい高速化手段はありません。
ので、速くしたいなら抽出対象範囲を狭める、というのが一般的な解決策となるわけです。

試しに VB2008Exp 添付版の MDE をインストールデフォルトの設定状態のままで検索をかけてみると、

MSDN オンライン(日本語) Web で提供している msdn ライブラリ(日本語版ヘルプ)。
スタンダード。
MSDN オンライン(英語) Webで提供している msdn Library (英語版ヘルプ)。
日本語に翻訳されていない情報も多いです。
また、訂正情報や追加情報は英語版で書かれてから日本語に翻訳されますので、日本語版のほうが遅い、または訂正部分は追加翻訳されない場合があります。
Codozone コミュニティ(日本語) マイクロソフトと提供契約みたいなのを結んだっぽい協力サイト。
どんな契約なのか、そもそも契約なのかは私は知りませんけれども。
日本からは AILight.jp、@IT、Codezine、Insider.NET、IT Pro が参加しています。
Codozone コミュニティ(英語) マイクロソフトと提供契約みたいなのを結んだっぽい協力サイト。
日本語サイト以外では16サイト(内韓国語サイトが1つ)、私でも知っているようなメジャーサイトがけっこうあります。
質問(日本語) msdn フォーラム(日本語)から。
質問(英語) msdn Forum(英語)から。
ローカルのヘルプ 自分のマシンにインストールされたヘルプファイルから。

と、検索対象ソースが7つも。

ここから、自分が参照しないだろう部分を取り外せばいいわけですね。

私の場合は、「Codozone コミュニティ」をざっくり切ってしまっています。
登録サイト以外にも参考になるサイトや blog はたくさんありますので、こっち方面を調べるなら MDE ではなく Google を使っちゃうので。

あと、「質問」も切っちゃってます。
日本の msdn フォーラムってキーワード提示かリンク提示しかない回答が多く、あまり役に立たないので。
アメリカの msdn Forum は Microsoft の中の人も参加して建設的に、質問者が理解納得できる結論まで編み上がる議論が多くあって読み応えはあるんですが、これも一般の Web 検索で検索対象になっちゃいますし。

MSDN オンラインは…最新情報はここが一番早いです。が、どうも抽出の精度が荒く、あまりキーワードにきちんと引っかかっていないページまで抽出されがちのように思えます(これは Web ブラウザで msdn オンラインの検索欄を使っても同じ)。しかも上位 100 件で切られちゃいますので、目指す情報にたどり着くのはなかなか難しいように思います。
検索時間は、下手するとローカルヘルプの検索よりも速い(通信回線の太さやマシンのスペックにもによりますが)です。

ローカルのヘルプを切っちゃうと、MDE を使う意味はあまりないんではないでしょうか。
自分の使い慣れた Web ブラウザで Web 検索かけちゃった方が速いですから。
ただし、Express Edition をお使いの方は、ローカルヘルプがダイジェストになってしまっており、目指す情報がそもそも存在しないケースがかなりあります。ので、MSDN オンラインとの併用をせざるを得ない状況です。

とまあ各プロバイダ(ソース)によって長所短所がありますので、自分の好みに合わせてなるべく少ない検索対象範囲にするのがいいかなーと思います。

対象の指定は、メニューから[ツール]-[オプション]→[オプション]ダイアログ→[ヘルプ]-[オンライン]-[検索するプロバイダ]で設定できます。

ついでに、日本語のみを対象としたい場合は、[ツール]-[オプション]→[オプション]ダイアログ→[ヘルプ]-[全般]-[英語のトピックも表示する]のチェックを外します。
これで、MSDN オンライン・Codozone コミュニティ・質問のそれぞれ(英語)が検索対象外となります。

2. 検索キーワード

基本的な検索キーワードの書き方は「フルテキスト検索のヒント」(msdn オンラインのページExp 版ローカルヘルプのページ)に記述されています。

が、どういうわけかこのページは msdn オンラインでは左側の目次ツリーと連動しません。周辺のページまでまとめ読みして概念を理解する、ってのはツラいです。
ので、このあたりはローカルヘルプで読むのがいいように思います。

3. デフォルトの抽出条件は OR

例えば「express」で検索してみると、VB2008Exp 添付版のローカルヘルプでの抽出結果は159件、ヒットページの1件目は「SQL Server 2005 Express Edition」となります。

では VB2008Exp に絞り込もうと思って、「visual basic 2008 express」で検索してみます。

…結果500件(上限)。増えちゃうわけです。

VB2005 添付、または msdn サブスクリプションで配布されている msdn ライブラリ / MDE でも同様の結果となります。キーワードを増やすたびに増えていく。

これは、複数のキーワードを列挙した場合は「そのいずれかの単語があればヒットする」、つまり「OR」条件となっているからです。

VB2005 添付 MDE のヘルプでは「AND」となる、と記述されていたので、私は当時かなり混乱しました(;-;)。

で、列挙時に「AND」にするか「OR」にするかは、実はオプションで切り替えることができるということについ最近気づきました。
メニューから[ツール]-[オプション]→[オプション]ダイアログ→[ヘルプ]-[全般]-[ローカルの検索結果での部分的な一致を含める]にチェックがついていれば「OR」、外せば「AND」です。でもってインストールデフォルトはチェックがついていたんでした。

このチェックを外して検索してみると、117件まで絞り込めました。

4. 結合演算子の明示

チェックと無関係に、明示的に AND / OR を設定することもできます。
「visual AND basic AND 2008 AND express」とすると、設定がどうでも「すべての AND」条件となります。
AND / OR は、大文字で記述します。小文字だと演算子として認識されません。

「.」(ドット)は、原則として「 」(スペース)と同様の区切り文字として認識されます。
ので、「部分的な一致を含める」設定で「windows.forms」を抽出すると、「windows」または「forms」のどちらかが含まれているページがヒット、332件の結果となります。

「windows.forms」という複文節で検索したい場合は、キーワード全体を「"」(ダブルクォーテーション)で括ります。
結果66件、ページへのマーキングも「windows.forms」でひとつのマークとなります。

VB2008Exp に関する情報を含み、VB6 からのアップグレード系のページは邪魔だから排除したい場合は、「NOT」演算子を使います。
「visual AND basic AND 2008 AND express NOT "6.0"」(「6.0」は「.」を含むので「"」で括ります)とすると結果104件、「Visual Basic 6.0」を含むページが排除されます。

5. 結合演算子の順序の影響

抽出条件の演算子には、優先順位がありません。また、「( )」のような優先順位を指定する文法もありません。(「( )」は、単に検索文字列の一部となります。)

ではどういう順で抽出条件を組み立てているかというと、どうも単純に左から判断しているようなんですね。

てことで、ちょっと確認してみました。

まず、「"visual basic express" AND 2008」で抽出すると40件ヒットします。
「2008」だけだと422件、「2008」を含んで「"visual basic express"」を含まないページは「2008 NOT "visual basic express"で抽出でき、結果は382件。

422 = 40 + 382

で合ってますよね。

同様に、「"visual basic express" AND 2005」で13件、「2005」で90件、「2005 NOT "visual basic express"」で77件。これも、

90 = 13 + 77

でいいですよね。

ついでに、「"visual basic express" AND 2008 AND 2005」だと10件、「2005 AND 2008」だと53件となりました。

さて、ここから。

「"visual basic express" AND 2008 OR 2005」だと、120件となりました。
これは、「"visual basic express" AND 2008」の結果40件に「2005」の90件が追加され、両方にヒットして重複する分「"visual basic express" AND 2008 AND 2005」の10件を引いた件数なわけです。

120 = 40 + 90 - 10

これに対し、「2008 OR 2005 AND "visual basic express"」だと43件となります。
これは「2008」または「2005」でヒットした結果の中からさらに「"visual basic express"」を抽出しますので、「"visual basic express" AND 2008」の40件と「"visual basic express" AND 2005」の13件を足して、重複分「"visual basic express" AND 2008 AND 2005」の10編を引いた件数です。

43 = 40 + 13 - 10

ということで、条件(というか演算子)の記述順がそのまま優先順となります。

6. よくわからない

演算子には、あと NEAR と THRU があります。

NEAR は、「a NEAR b」で「a の8語前後内に b がある」という抽出条件になります。が、英語はともかく日本語で「どこまでを『1語』と数えるか」がなんかわかりにくいです。
ので、まあなんかそんな感じーで使いたい時にはいいかもしれません。

もうひとつ、THRU は全然わかりません。
検索文字列から除外されるキーワードにはなっているらしいんですが、「検索式における論理演算子」(msdn オンラインのページExp 版ローカルヘルプのページ)には記述されていないんですよ。

どうしろってんだい。

2008年01月30日

.NET Frameworkの中身を見てみた

前エントリで.NET Frameworkライブラリソースの参照のしかたがわかりました。
せっかくですので、実際に参照してみましょう。


まずは設定。
元ネタはMicrosoftサイトのReference Source Code Centerから。

VS2008(Express Editionではできません)を起動して。
メニューから[ツール]-[オプション]で[オプション]ダイアログを起動して。
[すべての設定を表示]チェックボックスがあればチェックをつけて。

[デバッグ]-[全般]の、
['マイコードのみ'設定を有効にする]のチェックを外して、
[ソースサーバーサポートを有効にする]にチェックをつけて。

20080129_01.png
(クリックで拡大します)

[デバッグ]-[シンボル]の 20080129_02.png ボタンをクリックして、
[シンボルファイル(.pdb)の場所]に「https://Referencesource.microsoft.com/symbols」と入力して、
[シンボルサーバーからシンボルをキャッシュするディレクトリ]に「C:\Symbols\RSCC」(まあこれはどこでもいいんですけど)と入力して、
[シンボルが手動で読み込まれるときのみ上記の場所を探す]にチェックをつけて。

20080129_03.png
(クリックで拡大します)

「ソースサーバーを有効にしますか?」ダイアログが表示されたら[はい]。

20080129_04.png
(クリックで拡大します)

以上な感じです。


設定が終わったら、実際に参照してみましょう。

ここからの元ネタは、Shawn BurkeさんのblogShawn Burke's Blog : Configuring Visual Studio to Debug .NET Framework Source Codeから。

とりあえずなんか適当にプロジェクトを作成して。

20080129_05.png
(クリックで拡大します)

ソースも適当に書いて、ブレークポイントを設定して、

20080129_06.png
(クリックで拡大します)

実行。→ ブレークポイントで止めて。

20080129_07.png
(クリックで拡大します)

Ctrl+Alt+C(VBの場合はCtrl+Lでもおっけー)を押して[呼び出し履歴]ウィンドウを表示させて。

20080129_08.png
(クリックで拡大します)

参照したいプロシージャ(メソッド)行で右クリック→コンテキストメニューから[シンボルの読み込み]を選択。

20080129_09.png
(クリックで拡大します)

[Microsoft Internet Symbol Store]ダイアログが表示されるので[Yes]と返事して。

20080129_10.png

[呼び出し履歴]ウィンドウの選択行、右端の[言語]列に言語が表示されれば読み込み完了。

20080129_11.png
(クリックで拡大します)

選択行をダブルクリックして、
[End User License Agreement](EULA)ダイアログが表示されるので[Accept]と返事して。

20080129_12.png

おお、表示されましたされました。

20080129_13.png
(クリックで拡大します)

予想はしていたけど、ソースはやっぱC#なんだなー。(;-;)


えー、もひとつ参照のしかたが紹介されてますね。

同じくブレークポイントで実行を中断した状態で。
Ctrl+ALT+Uで[モジュール]ウィンドウを表示させて。

20080129_14.png
(クリックで拡大します)

参照したいDLLで右クリック→コンテキストメニューから[シンボルの読み込み]を選択。

20080129_15.png
(クリックで拡大します)

選択行の[シンボルの状態]が「シンボルが読み込まれました。」と表示されれば読み込み完了。

20080129_17.png
(クリックで拡大します)


さて、ついでなのでもう一丁。

前エントリで言及しましたVisual Studio 2008 QFEをインストールしてみました。

20080129_18.png
(クリックで拡大します)

むかり。やっぱり。

悔しいので、手動でインストールしてみることにします。

ダウンロードした336928_ENU_i386_zip.exeをアーカイバで開くと、以下のような内容になっています。

20080129_19.png
(クリックで拡大します)

この中のVS90-KB944899.exeをさらにアーカイバで開いて、

20080129_20.png
(クリックで拡大します)

この中のVS90-KB944899.mspをさらにアーカイバで開いて、

20080129_21.png
(クリックで拡大します)

この中のpatch.cabをさらにアーカイバで開いて、

20080129_22.png
(クリックで拡大します)

よしっ、出てきました FL_vsdebug_dll_10598_x86_ln.3643236F_FC70_11D3_A536_0090278A1BB8 。

こいつのプロパティを参照すると、VSDebug.dll Ver.9.0.21022.39であることがわかります。

20080129_23.png
(クリックで拡大します)

VS2008インストールでコピーされたvsdebug.dllは C:\Program Files\Microsoft Visual Studio 9.0\Common7\Packages\Debugger(デフォルトインストール時)に格納されているVer.9.0.21022.8ですので、先のファイルをリネームして上書いてやればいいわけですね。

20080129_24.png
(クリックで拡大します)

では先ほどと同じ操作をして、速度を比較してみましょう。

…速くなった…のかなぁ?

まあ、「気は心」レベルで入れといた方が精神衛生的にいいかもしれません、程度でしょうか。
もうちょい詳しいFIX内容が提示されないと、ありがたみがわからないのかもしれません。

2008年01月29日

.NET Frameworkの中身を見てみる

注意:本エントリは、後で自分でやろうと思って収集した情報をまとめたものです。実際に私はまだ作業を行っていませんので、ここでの記述と実際の動作は異なる可能性があります。

まあ、まずはこのへんから。

Microsoft、VB 2008向け.NET Frameworkライブラリソース公開 | エンタープライズ | マイコミジャーナル 

これが何かといいますと、従来アセンブリでのみ提供されていた.NET Frameworkライブラリのソースを公開しますよーということですね。

そんなことされて何が便利かというと、デバッグの精度が上がるよーということになります。

例えば、自分でコード書いてて、どうも動作がおかしいなーとか思ったとします。
こんな時、msdnLibの説明をきちんと読んで書いたつもりなんだけどなーとしょんぼりしたりします。
しょんぼりするだけでは事態は進展しないので、「記述をこう変えたらどう動作が変わる?」などと、必死に外挿法であれこれ試すわけですね。

でも、ライブラリの中身を直接ソースレベルでトレースできるとしたら。

実際にはこう処理されてるんだからmsdnLibの説明がおかしかったんだ!とか、自分が誤解していたぜ!とか、どー考えてもライブラリのコードがおかしいと思うぜ!とかダイレクツにわかってしまうので超便利。

あって困るもんでもなし、私も公開されたライブラリソースを見てみたいと思います。


Microsoftの公式ページとしては

Microsoft Shared Source Initiative Home Page 

になってまして、ライブラリソースはこの中のReference Source Serviceという仕組みで公開されています。
このページでは使用ライセンスのMicrosoft Reference Source License (MS-RSL)へのリンクと、ソースを参照するためのVS2008の設定手順が書かれています。

もう少し詳しい手順と設定後の使い方の説明は、上記Home PageからリンクされているShawn Burkeさんのblog、Shawn Burke's Blog : Configuring Visual Studio to Debug .NET Framework Source Code にあります。

おー、リモートデバッガ使ってMicrosoftのリファレンスソースサーバに接続していく仕組みかー。

てことは、やっぱExpress Editionじゃだめじゃん。Standard以上じゃん。
(→Visual Studio 2008 製品ラインの概要の「デバッグ」の項参照)

でもこれ、公式ページには書いてません。Shawnさんのblogには書いてあります。
いいかげん重要な情報をblogでだけ提供するのやめてもらえないかな。
いちいち非公式ページをチェックしなきゃならないって状況が少し嫌んなってきましたよ。

Shawnさんは「最初にVisual Studio 2008 QFEをインストールしてねー」と言っていますが、ダウンロード先の説明では「ソースコードをダウンロードする際のパフォーマンス問題に対処」みたいなことが書いてありますので、必須ではないっぽい。

ConnectサーバからのダウンロードになりますのでLiveID必須。
KB944899って番号が振られてますが、今日現在でVB情報は提供されていません。ダウンロードページのタイトルも「Visual Studio and .NET Framework」のみってすっごいおざなりで、でも何するものなのかはこのページの「FIX:」って文章でしか説明されていません。

「32/64bit版両用のインストールモジュールだよー」と書かれていますが、日本語版対応になっているかどうかもちょいとアレ。一度試してみて、ダメならダメであきらめてもいいかも。


ちなみに。

「.NET Frameworkのソースを公開しちゃうよー」「しちゃったぜー」と、ご自身のblogで常にいち早く情報を提供してくれているのがScottぐーさん。

このblogで公開されている情報によると、今回公開されたライブラリソースは

  • .NET Base Class Libraries (including System, System.CodeDom, System.Collections, System.ComponentModel, System.Diagnostics, System.Drawing, System.Globalization, System.IO, System.Net, System.Reflection, System.Runtime, System.Security, System.Text, System.Threading, etc).
  • ASP.NET (System.Web, System.Web.Extensions)
  • Windows Forms (System.Windows.Forms)
  • Windows Presentation Foundation (System.Windows)
  • ADO.NET and XML (System.Data and System.Xml)

今後LINQ、WCF、WFも公開すべくがんばってんよー、とのことです。

この方は「製品開発ジェネラル マネージャ」って肩書きを持つMicrosoftの中の人なんですけれども、先日訪日、特別インタビュー(LiveID要、日本語字幕つき、Silverlight要)を公開してくれています。
あ、あと、Ask the Experts!(MSDNオンラインイベント、LiveID要、日本語字幕つき)も公開されています。

中の人トップが何を考えているのか、知るにはいいチャンスかもしれません。

2008年01月22日

VB2008の小さなお宝

米国MicrosoftでVB作ってるチームが、The Visual Basic Teamって社員blogをやっておりまして。

Microsoft系プログラミングの教本ともいえるmsdnLib、公式な発言がきちんと詰まっている公式サイトなどには載っていないような切り口の最新情報やら小ネタやらウンチクやらがもー満載。

このMicrosoft社員blog、いろんな立場やスタンスを持つ人やらチームやらがあっちこっちで書いていますので、開発言語に限らず日頃使っているMicrosoft製品やら技術やらに関わるblogを探して呼んでいると意外な発見がけっこうあったりします。

まあ基本的には英語なのがなんですが、翻訳サービスのお世話になってでも読む価値ありだと思います。

さてそんなVBチームblogですが。
せっかくVB2008が出たってぇのに、やれLINQだWPFだと営業的に大トピックばかり取り上げられるのにちょいと食傷してきまして、作り手としてはどのへんをイバりたいんだい?とざっくり読んでみました。

おおお、あるある。期待にぴったり合ったエントリが書かれていましたよ。

The Visual Basic Team : Hidden Gems in Visual Basic 2008 (Amanda Silver)

「VB2008の隠れたお宝」ですってよ。

つことで以下、そのお宝がそれぞれなんなのか、関連リンクも含めてちょっとご紹介。

2008.01.22 : お断り
本エントリはあくまでも、上記リンク先で取り上げているVB2008の新機能を、日本語としてのキーワードや概要を把握できるリンクを交えてさるべーじが紹介したものです。
元エントリを翻訳したものではなく、またところどころの引用も大変怪しい精度であることをお断りしておきます。


0) .NET Framework 2.0/3.0/3.5 マルチターゲット

VB2008だけで、NET Framework 2.0(VB2005)、3.0(VB2005+Vista)、3.5(VB2008)それぞれに対応したプログラムが作れちゃうぜー、と。

.NET Frameworkは3.5が完全に3.0を内包、3.0が2.0を完全に内包していますので、使える機能に制限をかければそれぞれのバージョン用のプログラムができてしまうんだぜー、というからくりで。

でもVB2008に付属する.NET Framework3.5に含まれる2.0/3.0はSP1なので、今SPなしVB2005で開発しかけのものをそのまま移行させるわけにはいきませんね。

Standard以上のEditionでは「新しいプロジェクト」ダイアログに.NET Frameworkバージョンの選択コンボボックスが表示されるので、バージョンを指定してプロジェクトを作ることができるんですけれども、Express Editionではこのコンボボックスはありません。新規作成したプロジェクトは必ず.NET Framework3.5ようになります。

Express Editionはそうやっていったんプロジェクトを作ってから、そのプロジェクトのプロパティ画面で切り替えるという手順を踏むことになります。

1) 型の推定 (Type Inference)

「プロトタイプなんかがすばやく、簡単に、しかもタイプセーフに作れちゃうんだぜー」

このへんはmsdnマガジンオンライ日本語版2007年10月号の基本的な本能: Visual Basic 2008 における型の推定 -- MSDN Magazine, October 2007あたりがわかりやすいと思います。

2) If演算子 (If Operator)(三項演算子:Ternary operator)

IIfと違ってタイプセーフだし、Falseの方の計算式は計算されないといいこと尽くめ。

「型の変換と組み合わせると、If演算子がどんな型を返すつもりなのかも簡単にわかっちゃうんだぜー」

あまりきちんとした言及はまだどこもしてないっぽいです。のでとりあえずmsdnLibからIf 演算子を。
msdnLibも今回のバージョンから、文体も字面もずいぶんとわかりやすく読みやすくなっています。

3) オブジェクト初期化子 (Object Initializers)

βや先取り情報で学んでいた方なんかは「オブジェクトイニシャライザ」という言い方で耳なじんでいると思うんですが。

オブジェクト初期化子 : 名前付きの型と匿名型によると、どうも正式な日本語での呼称は「オブジェクト初期化子」になったっぽいですね。

考え方はVisual Basic 9.0 概要 - オブジェクトとコレクションの初期化あたりが簡潔。

4) null許容値型 (Nullable)

Nothingな状態を許容するデータ型拡張。
「= Nothing」では正常に判定されなくて「Is/IsNot Nothing」を使ってくれみたいなシバりがあって、「VB Nullable」あたりで検索かけるとそのへんを検証したblogエントリがけっこう出てきます。
が、これはVBなんだぜ?「IsNothing( )」てのも検証したいんですぜ?

検索でヒットするページは「ワカってる前提での記述」が多く、これからワカりたい人のためにはあんまりまとまった説明が見当たりません。

やっぱmsdnLibのnull 許容値型あたりがわかりやすいかと。
あとVisual Basic 9.0 概要 - Nullable 型とか。

5) DataSetへのLINQ

LINQについてはかなり取り上げられているので、特にここで入門ページ提示しなくてもいいですよね。

つかWebページひとつでさくっと把握できるようなシロモノではありませんので、それなりの書籍を1冊読んでおいた方がいいのではないかと。

6) 構文ヒント (Syntax Tooltips)

「クールだろ?」「どう思う?」って(^^;)、まぁ確かに見りゃわかるわけですが。
確かにVB2008ではほしい情報が的確に表示されるように改善されています。

VB2005の時も重宝していましたが、VB2008に慣れると、以前のツールチップがときどき的外れな情報を提示しているなーと思うようになってきます。

7) IntellisenseのXML名前空間サポート (XML Namespace support in Intellisense)

VBコードの中に直接XMLタグを書くようなご時世になってきたので、そこらへんでもIntellisense効くようにしてみたよー、ってとこでしょうか。

msdnLibの説明がほんっといいなぁ、今回。Visual Basic における XML IntelliSense

8) 型定義へ移動 (GoTo Type Definition)

「型の推定」とセットの機能なんですけれども。

従来「Dim i As Integer = 0」なんてのがあって、型の委細を調べたい時には「Integer」上で右クリック→「定義へ移動」とかやっていたんですけれども、今回から「As ~」の部分は記述を省略できるようになってしまったわけで。
そんな時に型を調べたい、定義の記述を参照したいなんて場合には、変数名の上で右クリック→「型定義へ移動」で一発ジャンプ。

宣言行だけでなく、例えば「i = ii + iii」なんて計算式があったら、「i」「ii」「iii」のそれぞれ一気に型定義に飛べます。

9) ループ変数にも型の推定 (Type inference for loop variables)

For~とかFor Each~で使うワーク変数の型を省略できるようになりました。
従来だとStrict Offにした上でみなしVariantだったのが、きちんと型推定でそれなりの型になりますよ、と。

なんてことはない機能ですが、いちいちAs句に指定する型を探さなくいい(特にFor Eachの場合はそれなりにめんどい)とか、記述が短くなる(特にVBは.NET系言語でもっとも記述が長くなりやすい)とか、地味に便利さが沁みてきます。

10) バックグラウンドコンパイラ

えーと、ビルド処理がバックグラウンドで行われるようになったので、ビルド中も作業ができるみたいに読めるんですけど、って理解でいいのかな。

例えば5分かかるビルドで100のエラーが出るとして。
最初の5つのエラーが表示された段階で、残り部分のビルドを実行しつつソースの修正を始められるならこりゃすんごいことですけれども。

実際、そんなにビルドに時間のかかるプロジェクトを今持っていないので試せませんすいません。

そのうち無意味にデカいプロジェクトでも作って試してみたいと思います。


同じくThe Visual Basic Team : Visual Basic 9.0 Language Specification Released (Beth Massi)にも、おもしろいトピックがメモされています。

とりあえずこちらは日本語訳とmsdnLibへのリンクのみ。

つか訳語がずいぶん不統一くさいんですけどどうしましょう。


おまけ。

Visual Studio Magazine Online | Enterprise Solutions for .NET Development

2008年01月10日

IDEの設定をVSマクロで変更する

日本全国のVSマクロファンの皆さん、さるべーじですこんばんは。
そんな方が果たしてどれほどいるのかはさっぱりわかりませんけどこんばんは。

さて、私はVBのコードを書く際によくブックマークを使うんですけれども。
こいつって行の左端にうっすらぼんやりとした 20080110_01.png で表示されるんですよね。

見にくいよ。

ってことで、メニューから[ツール]-[オプション]→「オプション」ダイアログの[テキストエディタ]-[全般]-[表示]-[インジケータマージン]のチェックを外すわけです。

20080110_02.png

こうすると、ブックマークはその行全体の背景色を水色にしてくれるので大変見やすいと。

一方で、私はデバッグする際によくブレークポイントを使うんですけれども。
スマートクライアント作ってる時なんか、サーバ側のコードにブレークポイント置いたりしたくなるときもあるわけです。

これはデフォルトではブレークポイント効かずにスルーされちゃうわけです。その時のブレークポイントマークは左端で 20080110_03.png と表示されているんですけれども。

これをデバッグモードにしてサーバプロジェクトのシンボルファイルをクライアントサイドに取り込んでサーバプロセスにアタッチかけるとふつーの 20080110_04.png になってブレークオッケーなのがわかるようになっているわけです。

でもインジケータマージンを非表示にしちゃうと、ブレークポイントが有効だろうが無効だろうが行背景色が赤くなるだけで、

20080110_05.png

  どうなってんのかわかんねぇよ。

ってことで、メニューから[ツール]-[オプション]→「オプション」ダイアログの[テキストエディタ]-[全般]-[表示]-[インジケータマージン]のチェックをつけるわけです。

つけたり外したりつけたり外したりで、そのたんびに「オプション」ダイアログを起動するのはもーわずらわしくて嫌なんです。
もっとこうなんかワンタッチでどうにかならんものかと。

つことで、そのへんの処理をマクロで組んでみようと思ったわけです。


とか言いながら、どんなコマンドを使えばそんなことができるのかさっぱりわからないわけですよ。

まぁ「オプション」ダイアログなわけですから、[Tools]-[Option]あたりで海外サイトの記述探しまくりですよ。
なんで海外かってぇと、日本でそんなVSマクロをとくとくと語っているサイトとかblogとかフォーラム/掲示板なんかほとんど見ないからですよ。

って泣きながら探していたら、

MBR IT/.NET 247 : Macro for setting Tools/Options on microsoft.public.vsnet.ide 

ってやり取りを発見。

なるほど、DTE.Propertiesですかい。引数は文字列でってことはレイトバインディングですかい。

どんな文字列でどこを引っ張れるかはここを見ろってそこはすでにリンク切れ起こしていて実際にはこっちですかい。

えーと、「オプション」ダイアログで「インジケータマージン」のチェックがあるのは[テキストエディタ]-[全般]-[表示]ですので、たぶん[TextEditor]-[General]の「MarginIndicatorBar」あたりではないかなーと踏んで。

ってことは「DTE.Properties("TextEditor", "General")」のMarginIndicatorBar
プロパティ(Boolean)の値をひっくり返してやればいいんではないかと。

でもふつーに「DTE.Properties("TextEditor", "General").Item("MarginIndicatorBar")」だとレイトバインディングすぎて値のSetなんかできゃしない。

Valueは「Get/Let」なので、どーにかしたら値の格納もできそうなんだけどなー。

とメンバをぼーっと眺めてたら、「let_Value」ってメソッドがありましたよ。
なるほどこいつで値を格納できるんだ。

てことで苦もなく書いたのが以下のコード。

Public Sub ToggleDispMarginIndicatorBar()
     Dim colProp As EnvDTE.Properties
     colProp = DTE.Properties("TextEditor", "General")
     colProp.Item("MarginIndicatorBar").let_Value( _
         Not colProp.Item("MarginIndicatorBar").Value)
End Sub

実際にこれ、インジケータマージンの表示/非表示がさくっと切り替わります。

やったー。


と思ってから、「MarginIndicatorBar」でmsdnLib検索してみたら、しっかりこんなページが提供されているではありませんか。

[テキスト エディタ] ノード プロパティ ([オプション] ページ) 

うわぁここまできちんと書いてくれるようになっていたんだいつのまにか。

ついでに「EnvDTE90」とかVS2008で初お目見えのアセンブリまで提供されているんだ。
なんかデバッグの自動化が今まで以上にきめ細かにできるようなことが書いてあるではありませんか。

地味になかなか奥が深いぞVS2008。

2008年01月02日

あけましておめでとーございます2008

さるべーじです。あけましておめでとーございます。

旧年はいろいろかまっていただけ、大変楽しい1年となりました。
今年もまた仕事に趣味にハシりますので、お付き合いのほどをよろしくお願いいたします。


さて、去年の正月にもあけましておめでとうございます2007で、お年玉と称してVB2005のスニペットリストを公開したんですが。

昨年末に新しくVB2008の提供が開始されてしまいました。

ので、今年もお年玉として

VB2008コードスニペットのリスト

SnippetIndexVB2008.zip VB2008コードスニペットリスト

をお届けします。
内容はVB2008 Express Edition/Team Suiteのリストです。
VB2005のも同梱してありますので、どう変わったかも比較もできて便利です。

なぜExpress EditionとTeam Suiteだけかというと、私がインストールして手元に持っているのがそれだけだからです。
ほかのエディションについてはたぶんTeam Suiteと同等もしくはそのサブセットだと思われますので、そのつもりで読み換えていただければおっけーなのではないかと。


それだけでは寂しいので、気づいた点をいくつか。

1. 増えた

VB2008のスニペットはExpress Editionで286本、Team Suiteで459本あります。
VB2005の時は233/398本でしたので、ざっと5~60本増えたってことになります。

2. 増えたのは主にLINQとWPF

特にLINQ回りはひと通り目を通しておいた方がいいってな感じで今回のオススメです。
使う局面ごとにグルーピングされてざっとセオリーパターンが並んでいます。LINQの実践的な速習の一助になるかもしれません、ってくらいに。

併せて、VBからのxmlパターンがLINQと合わせてデータ取扱いにグルーピングされ、かなりスニペットも模様替えされています。
前回提供されていたものの多くが今回提供されず、より新しい概念に基づいたパターンが追加されています。

このへんは前回から削除されたスニペットを各シート末にまとめ、新しい(あるいは修正のかかった)スニペットはセルに着色してありますので、見比べてみると概念の変化がわかっておもしろいです。

一方、WPFのスニペットラインアップは意外にしょぼいです。
これは、WPFは単にコード単独でどうこうするってパターンではないのが主な原因のように思っています。
コードテンプレートだけ提供してもどーにもならんのではないでしょうか。

3. 増えなかった方面

個人的に期待外れだったのは、Office制御に関するスニペットがほとんど変化していなかったことです。

VB2005が提供された後で2007Officeが提供され、メニューバー/ツールバーからリボンに(見た目の)概念が変わったんですね。
でもってそれに合わせVSTOも2回ほどバージョンアップしながら提供されてきたわけです。

さたに、VB2008の謳い文句の一つに

VSTO/VSTAとVBAのロジック相互利用(双方向)

ってのがありまして。これ、地味ながらかなり期待していた機能なわけですよ。

なんですが、このへんの最新技術へ対応したスニペットなんか何一つ提供されておりゃしません。

けっこう煩雑なロジックパターンをセオリーとして埋め込まなきゃならん部分ですので、このあたりはぜひスニペットとしての提供がほしかったなー。

4. メニューの構成が大きく変わった

今回、各スニペットの分類やグルーピングが大きく変更になっています。

そのため、スニペットをショートカット呼び出しではなくコンテキストメニューからの選択で使い慣れていた方は、今回のメニュー構成にかなり戸惑うかもしれません。

各スニペットのタイトルやショートカット、ファイル名などは変更されていませんもので、そのあたりをキーに上掲のリストで突き合わせていただくと、「アレはどこに行ったのか」がわかりやすいと思います。

5. 編集ミスが目立つ

今回、VB2008の英語版が提供されてから日本語版のリリースまで、予想をはるかに上回る迅速さでした。

そのせいかどうか、今回のスニペットにはぱっと見で首をかしげるような単純な編集ミスが目立っているような気がします。


以上、リスト作成中に感じた私なりの所感でしたー、と言ってしまうのはたやすいんですが。

せっかく気づいたんですから、スニペットに存在する編集ミスの内容と修正手順もご紹介しておきます。

いや大丈夫、スニペットの構成ファイルは全部テキスト(というかxml)ファイルですので、個々人でいくらでも修正できますから。

a. ショートカットが一部カブっている(Express Edition・Team Suite共通)

  • 「コレクションのクエリ」と「配列のクエリ」のショートカットがどちらもqArrayになっている。
  • 「クエリ結果を WebForm グリッドに表示」と「クエリ結果を WinForm グリッドに表示」のショートカットがどちらもqWinFormになっている。

同じショートカットが複数登録されていても、とりあえず動作はします。

例えば「qarray」と打ってTabを押すと、「どっちのqarrayですかい?」ってリストが表示されます。

20080102_01.png

これはそれぞれ「コレクションのクエリ」「配列のクエリ」を指し示しており、

20080102_02.png   20080102_03.png

それぞれちゃんと目的のテンプレートが表示されるわけです。

20080102_04.png

20080102_05.png

けどまあやっぱわずらわしいですし。

VB2005の時にはきちんと「コレクションのクエリ」(qCollection.snippet)のショートカットは「qCollection」、「クエリ結果を WebForm グリッドに表示」(qWebForm.snippet)は「qWebForm」であり、不要に他のスニペットとカブってはいなかったんですから、タダシク直しておいてもいいと思います。

「コレクションのクエリ」(qCollection.snippet)は、Express Editioonのデフォルトインストールでは「C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\VBExpress\Snippets\1041\data\LINQ Queries\Using Different Sources」、Team Suiteでは「C:\Program Files\Microsoft Visual Studio 9.0\VB\Snippets\1041\data\LINQ Queries\Using Different Sources」にあります。

「クエリ結果を WebForm グリッドに表示」(qWebForm.snippet)はExpress Editionデフォルトインストールでは「C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\VBExpress\Snippets\1041\data\LINQ Queries\Using Query Results」、Team Suiteでは「C:\Program Files\Microsoft Visual Studio 9.0\VB\Snippets\1041\data\LINQ Queries\Using Query Results」にあります。

b. 明らかな誤訳(Team Suiteのみ)

Team Suiteのコードスニペットメニューで[Office開発] > [Word] > [書式設定]と進めていくと、「範囲のフォントの色設定」という選択肢が2つ表示されます。

20080102_08.png
(クリックで拡大します)

もうひとつの方の選択肢の説明は「Wordドキュメントで範囲のフォントサイズを設定します。」なわけですから、このスニペットのタイトルは「範囲のフォントのサイズ設定」あたりが正しいんではないかと思われます。

20080102_09.png
(クリックで拡大します)

翻訳作業の際に、色設定スニペットの文章からコピーしたまま修正し忘れたんではないかなーと思っているんですが、これ、VB2005の時からずっとこのままなんですよね。

c. 翻訳されていないスニペットがある(Team Suiteのみ)

同じくTeam Suiteのコードスニペットメニューで[Windowsフォームアプリケーション] > [コントロールとコンポーネント] > [ComboBox]と進めていくと、スニペットの選択肢の中に「Populate a ComboBox from the Column of a Database Table」というのがあります。

20080102_06.png
(クリックで拡大します)

これはExpress Editionでは「データベースの列からのComboBoxの作成」と表記されています。

20080102_07.png
(クリックで拡大します)

これはVB2005 - Team Suiteのスニペットでも「データベースの列からのComboBoxの作成」となっていましたので、VB2008での訳し忘れだと考えられます。

このスニペットの実体は「PopulateComboBoxfromColumnofaDatabaseTable.snippet」であり、「C:\Program Files\Microsoft Visual Studio 9.0\VB\Snippets\1041\windowsforms\Controls\ComboBox」の格納されています。

このファイルを、

  タイトル:データベース テーブルの列からの ComboBox の作成
  説明:DataTable オブジェクトからのデータで ComboBox を埋めます。

と書き直すと、VB2005/VB2008 Express Editionと同じ日本語表記となります。


あと、毒にも薬にもならない情報として。

a. Express EditionとTeam Suiteではメニューの表記が異なる。

Team Suiteではスニペットのメニューを表示する際、「C:\Program Files\Microsoft Visual Studio 9.0\VB\Snippets\1041」にある「SnippetIndex.xml」を参照して表示データを取得しています。

20080102_10.png

それに対しExpress Editionでは、どうもレジストリの「HKEY_CURRENT_USER\Software\Microsoft\VBExpress\9.0\Languages\CodeExpansions\Visual Basic\Path」から取得したフォルダ名がむき出しで表示されるようです。

20080102_11.png

Express Editionでもちゃんと「C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\VBExpress\Snippets\1041」に「snippetindexvbexp.xml」って同等の情報を持つファイルが存在しているんですけど、どうもまったく参照していないっぽいんですよね。

実際インストール時点で既にsnippetindexvbexp.xmlとレジストリの登録内容に違いがありますし。

b. Express EditionとTeam Suiteで一部スニペットがカブっている。

ここまで何度もスニペットのファイルの所在を説明する際に、「Express Editionでは~」「Team Suiteでは~」と二重に説明してきました。

Express EditionとTeam Suiteではスニペットの格納フォルダの起点が異なっているんですね。

これは、同一環境にこの2つのエディションの両方をインストールした際に、スニペットを棲み分けさせるための処置なんだと私は解釈していたわけです。

VSTO回りとかcompact Frameworkとか、Express Editionではツカえない機能に対するスニペットもTeam Suiteでは提供されていますので、混ぜこぜにしちゃってExpress Editionでツカえないスニペットを選択できてしまう、なんて状況にならないように考慮されてるんだろうなーと。

ところがどっこい、今回のVB2008ではWPFだけ、Express EditionとTeam Suiteでの配置先がどちらも同じ「C:\Program Files\Microsoft Visual Studio 9.0\VB\Snippets\1041」にあるんです。

ので、今回同一環境にこの2つのエディションをインストールしてしまうと、WPFのスニペットだけ同じファイルを参照するということになります。

いや別に共有したからって現時点で何か困るわけではないんですが。
ただVB2005ではまったく同じスニペットでも別フォルダにインストールし分けていたわけですし、今回もここ以外は同内容のスニペットでもきちんと別々の位置にインストールされていますので、なんだかルールが不徹底になってしまったなあ、と感じています。

今回のリスト作成でどこに何があるのかを探す際に、実はこのあたりでけっこうとまどったりしたんでした。

c. 理解しにくい説明ってのはどうなの。

VB2005の時から感じていたことなんですけれども。

例えば、「アプリケーションの停止」(StopanApplication.snippet)ってスニペットがありまして。

これは、指定したタイトルのウィンドウを持つプロセス(アプリケーション)を停止するロジックのテンプレートなんですね。

しかしこれの説明は、「すべての実行中のメモ帳のインスタンスを終了します。」となっています。

20080102_12.png
(クリックで拡大します)

なんで「メモ帳」なんて説明になってしまっているかといいますと、このスニペットを張り付けた時の可変領域の初期値が「メモ帳」なんだからではないかと推測するわけなんですが。

20080102_13.png
(クリックで拡大します)

でもぱっと見、「アプリケーションの停止」が「メモ帳」を閉じるためのスニペットに読めてしまうではないですか。

しかも日本語Windowsではメモ帳のウィンドウタイトルは「Untitled - Notepad」ではなく「無題 - メモ帳」なわけですから、この初期値ではなにも指し示していないのと同じではないですか。

さらにウィンドウタイトル基準での指定ですので、「Untitled」(未保存)なメモ帳しか対象にはなりません。1度保存してファイル名が表示されるようになったメモ帳は対象外になるわけですから、「すべての実行中のメモ帳~」ってちっとも「すべて」ではないではありませんか。

ついでに、初期値が設定されているので表示されていませんが、可変領域のIDが「processName」ってのも違うんではないかと。

つことで、言いたいことややりたいことはわかるんですが、どーもびみょーにズレているような気がしてなりません。

このケースであれば、説明を「指定したタイトルのウィンドウを持つすべてのアプリケーション(プロセス)を終了します。」とし、可変領域も変に特定プログラムの特定状態を初期値にするのではなく、IDを「MainWindowTitle」などもっと適切なものに変えた上でそれをそのまま表示させた方がよかったんではないかなーと。


おまけ。

スニペットファイルは、xmlファイルとして提供されています。
ので、ここまで説明してきた事柄を自分の手元で修正しようとするなら、テキストエディタやxmlエディタでできるわけです。

しかしxmlのデメリットとして、記述エラーがあった際にただコケる、というのがありまして。

タグをどこか1か所でも書き間違えると読み込んでくれませんし、どこにミスがあるのか、どのようなミスなのかはまず表示してくれません。大変デバッグのしにくい類のデータファイルなわけです。

ので、やはりベーシックなエディタではなく、文法チェック機能等のついた専用エディタがあった方が便利です。

VB2005の提供開始と前後して、Microsoft社は「Snippet Editor for Visual Basic 2005」という専用エディタを公開しました。これは、ベータ2の時点ですが、本blogでもSnippet Editor for Visual Basic 2005 Beta 2で紹介しました。

このエディタは正式公開時点でバージョン1.0.0.0、その後オープンソース化され、GotDotNetというMicrosoft社製SourceForgeのようなサイトを拠点として順調に改良され、1.4.0.0まで改版されていきました。

しかし昨年、GotDotNetは閉鎖されてしまいました。
またMicrosoft社のサイトも再編されてしまい、上記エントリで紹介していたページもリンク切れとなってしまいました。

再編後のMicrosoft社サイトではCode Snippet Editor for Visual Basic 2005として提供されるようになりましたが、これは正式提供開始時の1.0.0.0のまま、しかもバイナリのみ。
最新版である1.4.0.0やそのソースは入手できなくなってしまったんですね。

私はGotDotNetがアクティブだった頃に1.4.0.0のソースもバイナリも保存してあったので実害はありませんでしたが、msdnForumなどでは「最新はどこ?」「ソースはどうやったら入手できるの?」と困っているスレッドなどもあり、困ったもんだなーと思っていたんですが。

GotDotNetを追い出された(?)Snippet Editor開発スタッフ(VB MVPがメインで活動していたようです…初めて知ったよ)は独自のサイトをオープン、.NET Framework3.5上で動作する最新バージョン2.0.0.0の提供を開始しました!

VB Snippet Editor 

ほどなくMicrosoft社のサイトでもCode Snippet Editor for Visual Basic 2008として紹介が開始されましたが、そのリンク先は上記サイトです。

最新Snippet EditorのAboutからボトルメールの中心をマウスでポイントすると、「俺たちはやったぜー」な文章が表示されます。
苦労もしたでしょうし、上記の経緯の中でいろいろ憤りもあっただろうと思うんですが、表示される文章は淡々と客観的に、誇りを持って、再び提供できる喜びが経緯と共に語られています。ちょいとおじさんは泣きましたよ。

Microsoft社のサイトでは「Code Snippet Editor for Visual Basic 2008」と紹介されていますが、これは間違いです。
「VB用」ではなく「VB製」なんですね。Visual Studio 2008で提供されているすべてのスニペットを対象としたエディタですので、C#/J#/XML用のスニペットも編集できます。

また動作には.NET Framework3.5が必須ですが、修正自体はVS2005のスニペットにも対応しています。
2005と2008でスニペットの記述文法自体は変わっていないようですが、このエディタはVS2005のスニペットも対象として選択できるようになっているんですね。

また、Ver.1からUIが変更になっています。
Ver.1の時は要素をタブで表示切り替えしながら表示/修正していたので全体を俯瞰できず、リストを作る際もsnippyと併用していたんですが、今回のUIでは全体表示(項目ごとの折りたたみ)に変更されており、俯瞰しやすくなっています。

つことで、上記で説明した事柄を修正したり、自分で独自のスニペットをこしらえたりしてやろうかなどという方には、この「VB Snippet Editor」を強くお勧めします。


そういや個々のスニペットの解説情報って見たことがないなー。
Webでも書籍でも構いませんが、どこかで提供されていないのかなー。

2007年12月14日

開発完了 → 提供開始!

長らくお待たせしたVisualStudio2008ですが。
いえ別に私がお待たせしたわけではありませんが。

とうとう今日2007.12.14、
日本語版の開発が完了、
提供が開始されました。