ページ

ラベル Visual Studio の投稿を表示しています。 すべての投稿を表示
ラベル Visual Studio の投稿を表示しています。 すべての投稿を表示

2011-01-17

拾い読み:簡単!Visual Studio 2010入門

VSの入門編、過去の(旧バージョン)VSの入門記事をVS2010対応に直したものだそうです。初心者向けとのことですが、きっと見逃している機能なんかもあると思うのでひと通り目を通してみました。




リンク先に2003年当時の.NETの話題がありましたが、今とは全くと言っていい程別物でしたね。あの当時MSはそれこそ何でも.NET付けて意味不明のBUZZWORD化してしました。今では単純にフレームワークというかランタイムといったものに収まっています。これであれば実体を伴ったものと言えるでしょう。



ソリューションとプロジェクト、普通に使っているといつもセットで作成されてしまうので、違いを意識したことがありませんでした。この記事を読んで、新規作成したソリューション(はプロジェクトとセットでしか作れませんが)のコンテキストメニューを見ると「追加」メニューがあって、既存ソリューションに新規、既存プロジェクトを追加できるようになっているのですね。これは知りませんでした。

実際に試してみましたが、これは便利です。システムのサブモジュールをプロジェクトに割り付けることによって、サブモジュール単位での単体テストが可能になりますし(個別に実行モジュールが作れますので)、ソリューション内であれば他のサブモジュール(プロジェクト)のコードに対して参照設定追加で(コピーを作ることなく)取り込んでいくことができます。

ただ難点は、複数プロジェクトが含まれる場合には、プロジェクト単位の操作は基本、ソリューションエクスプローラからプロジェクト指定のコンテキストメニューで起動する形態になるところぐらいですかね。メニューバーからの操作は全体(というか最初に作ったプロジェクト)への操作となり、操作対象のプロジェクトを特定することができないようです。まあ、それでも便利さに比べればどうということもないです。

初心者向けであっても無視せず読んでみてよかったです。



この部分はまさに入門レベルで特記することもありません。

 

ここは入門レベルよりは上ですが、ほとんどVSの自動設定に関する内容で、特記するほどのものではないでしょう。

 

時計アプリケーションの作成例です。全く初めてWinFormアプリを書くならいい例でしょう。ですが、既にWinFormアプリを書いたことがある人にとっては、タイマーイベントを扱う以外はごく普通のコードで、ここも特記するようなものはありません。このアプリを発展させて、グラフィック表示を使ったアナログ時計や、LEDセグメント風の表示の時計とかを作ってみると面白いでしょうね。GUIシステムの入門に良くこの手のアプリを書きました。



この回の内容もVS一度でも使ったことがあれば皆さん知ってますよね、のレベルですね。リリースと配布でインストーラの話でも出てくるかと期待したのですが、それは別ページへのリンクでそちらを御覧くださいになっていました。残念。しかし、ここまでひと通り読んで実際にVSを操作すればWinFormアプリを作成する粗筋が判るはずです。新人向けなんかにはよさそうです。


2011-01-16

.NET勉強中:ADO.NET Entity Framework入門 第4回 データベースからのEntity Data Model生成




VS2010 Expressの場合、論理モデルからのDB定義がうまくいかない(一部手動での処理が必要)ので、結果としてDB定義からオブジェクトマップして使わざるを得なくなっています。


既存DBからのEDM作成手順は、プロジェクト→新しい項目の追加→ADO.NET Entity Data Model選択で、この先で「データベースから生成」を選択します。これによってDB上の定義が一覧されますので、そこからO/Rマップする対象をピックアップ(チェック)していきます。記事の例ではアソシエーションが自動的に取り込まれていますが、これは中間テーブルの名前によって判断されるのでしょうか。この部分の扱いは不明確です。


この記事ではテーブル定義だけでなく、ストアドプロシジャも取り込んでいます。が、1節の段階では取り込んだといっているだけで内容も何も確認されていません。取り込まれた内容(およびマッピング)を確認するにはモデルブラウザを開きます。記事では右上とか書かれていますが、設定やオープン順序依存でどこに表示されるかは固定ではありません。モデルブラウザを確実に開くにはモデルデザイナ画面(edmxの編集画面)のコンテキストメニューから「モデルブラウザ」を指示します。私の環境では(DB)サーバブラウザのところに重なって表示されました。

モデルブラウザに表示されるものを、記事では概念モデル、論理モデルと呼んでいます(注釈で実際には違うと明記されていますが)が、DBモデルのオブジェクト表現ですね。上の方がアプリケーションから見えるオブジェクト(なので≒概念モデル)、下の方がDB定義に対応したオブジェクト(≒論理モデル)になっています。このレベルのオブジェクトを概念モデルと呼ぶにはものすごく抵抗があります(オブジェクト設計的には上のものでやっと論理モデル)。

取り込まれたストアドプロシジャは下のXXX.Store側に出現しています。このままでは使えないそうなので、これをアプリケーションレベル(要はモデルブラウザの上側)に取り込みます。ストアドプロシジャのコンテキストメニューで「関数インポートの追加」でマッピングを指定するダイアログが表示されます。

記事の例ではUpdate系で関数値が数値なので例としてはあまり面白いものではありません。私は、複数の行を返す(要はSELECT文)ストアドプロシジャを取り込んでみました。この場合インポート関数はコレクションを返すことになります。私が使ったストアドプロシジャは複数のテーブルをJOINした結果を返すので、複合型を返すことになります(次の節で解説されるのでしょうが)。ダイアログ下方の「列情報の取得」によってストアドプロシジャの結果の列情報が取り込まれますので、これを元に結果を保持する複合型を生成します。「新しい複合型の生成」によって、複合型が生成され、上の「次のコレクションを返します」のところに出現しますので、名前を適時設定します。OKを押せば、アプリケーションオブジェクトにインポートされた関数が出現します。

結果の行一つが上で定義(生成)された複合型で表現され、SELECTの結果の複数行は、複合型に対して System.Data.Objects.ObjectResult<複合型> として返されます。これはIEnumerable ですので、foreach で全結果にアクセスすることができます。


先走って上で使ってしまった「複合型」について、です。が、記事のこの節で扱っているのはもっと単純な、プログラム言語でいうところの構造体(レコード型)のDBへのマッピングですね。ですが、このレベルのものを概念モデルが使いやすくなるというのは誇大広告でしょう。可変長配列型でも扱えて論理モデルにマッピングできるなら素晴らしいのですがね。記事で扱っている例では、フラットな構造からの複合型の再構成(リファクタリング)ですが、実際には概念モデル(というよりオブジェクト設計)で出てきた構造体(クラス)をDBにマッピングできるなら素晴らしいのですが、そういうことはできないようです。となると、この機能(コラムで挙げられた名前の制限もあるため)、現状ではあまり役に立つとは思えません。

しかし複合型自体は(モデルのリファクタリングとは関係なく)、JOINしたレコードに対して自動的に生成することが可能で(これが上の節で先走って使ったもの)、こちらの方については非常に有用な機能です。むしろ、こちらの方で例示して欲しかったですね。

2011-01-15

.NET勉強中:ADO.NET Entity Framework入門 第3回 Entity Frameworkにおけるクエリと更新



まずは階層構造。まずはオブジェクトそのものを解説して欲しいのですが、そういう発想は無いようです。まともに設計されたオブジェクトは1行で説明できる、はずなんですがね。オブジェクトの説明前に使い方の説明に入るのはオブジェクト指向的にはどうよ、というところです。図と説明から判断すると、EntityClientデータプロバイダが Entity Framework用のデータアクセスクラス(というかほとんどインターフェース階層でしょうね)で、それをドライバとして使う形で Entity FrameworkでのオブジェクトデータマッピングサービスがObject Services という名前(総称)で実装されているという感じでしょう。で、アプリケーションからのインターフェースは、
  • LINQ to Entities - 名前の通りLINQ経由でアクセスするためのインターフェース
  • Entity SQL - これは本来的にはEntityClientデータプロバイダインターフェースでしょう
  • QueryBuilder - は謎ですね。後で解説されるのでしょうが雰囲気的にはEntity SQLを構築するのでしょうね。
の3系統があるという構造のようです。


Entity SQLを Entity Framework用のSQLライクな言語、といっていますが、本来の目的はEntityClient データプロバイダに対するコマンドのようです。言語からは単なる文字列として扱われるため、シンタックスチェック等が効きません。ですから余程のことがなければ直接使ってはいけない機能のはずです。というわけでここはさくっと飛ばしてしまいましょう。

QueryBuilderは一見 LINQ のメソッド構文風ですが、条件その他に文字列が残っています。目的が判りにくいですね。ひょっとするとLINQ to Entities のメソッドを構成するためのサポートインターフェースかも知れません。これも使う必然性のなさそうなインターフェースですので、サクっと読み飛ばします。


LINQ to Entities の場合には、APIはLINQそのものです。LINQがデータを(条件指定で)列挙するための共通インターフェースになっているので、下位層がなにであろうとインターフェースは変わりません。ということで、LINQ知っていればここもさくっと読み飛ばしてOKということです。考えてみるとLINQへのプロバイダインターフェースが提供されているとアプリケーションからは何も特別視しなくて済むようになるわけですね。しかも各種のシンタックスチェック付きで。こうやってみるとLINQはすごい技術ですね。

と遅延読み込みの話題が出ていますが、きっとLINQからアクセス可能、だけで終わってしまって他に書くネタが無くなったのでいれたんじゃないですかね。確認してみましたが確かに.NET3.5でORマップしたアクセスオブジェクトには無いプロパティでした。ただ実際に使うには色々と問題が多い機能なのでそれなりに注意を、というところです。まあ、実際のデータによりますが、ここのサンプルで扱っているカテゴリデータでしたら遅延アクセスするよりプリロードしておいたほうがいいでしょうね。


データ保存は前の回でも簡単にやっていますが、Entitiesのコレクションへのデータオブジェクトの追加(AddObject)と、コンテキストに対する変更データの保存(SaveChanges)によって行ないます。ただ、SaveChangesは変更された項目毎にSQLを発行するような構成になるので、大量データの操作を行なう場合には性能上の問題が出てくる可能性があります(実際にはバッチ系の操作以外で大量データ更新が行なわれることは少ないはずですが)。

このような状況への対処のためにネイティブSQL文をコンテキスト経由で実行させる機能(ExecuteStoreCommand)が用意されています。なお、記事では.NET 4から導入された機能、と書かれていますが、 .NET 3.5 にもメソッド名は異なっていますが同等機能(ExecuteCommand)が存在しています。

まとめのところでLINQ経由でのアクセスを推奨しています。実際、O/Rマップ自体、LINQのため、と考える方がいいでしょう。検索系のアクセスに関しては便利さからもシンタックスチェックがかかる点からもLINQを使うのがベストでしょう。

2011-01-09

.NET勉強中:ADO.NET Entity Framework入門 第2回 EDMにおける多対多関係とEntity Frameworkでのデータの取得/保存


第2回 EDMにおける多対多関係とEntity Frameworkでのデータの取得/保存


いきなり多対多関係でデモしているところがちょっとずるです。多対多関係は手動で正規化する場合でも中間テーブル(マップテーブル)を使いますから、それが自動生成されるのは便利な機能でしょう。試してみたのですが、1対多、多対1関係の場合でも中間テーブルが生成されてしまいます。1対多、多対1関係については、関係のエンドポイントのテーブルにリンク項目を持たせれば充分で中間テーブルは滅多に使わないでしょう。悪くとればそういう粗を見せないための多対多関係でデモしているように見えます。このあたりも自動化が中途半端な感じです。末尾のコラムでそのあたりに若干ふれていますが、マッピングツールとしてはそこそこの出来なのですが、設計ツールとしてはまだ機能不足の感が否めません。


この部分はVS2008のマッピングツールと同様で、DBコンテキスト(DBについて一つ)とエンティティクラス(テーブル毎)が生成されます。説明はエンティティ、DBコンテキストの順になっていますが、使う立場としてはDBコンテキストを先に解説して欲しいところです。オペレーション的にはDBコンテキストのインスタンス化から始まるわけですから。ただしVS2008とは名称が微妙に異なっています。

EDMからのDB生成はExpress版では手作業になってしまったので、今回は(以前に構築した)DBからオブジェクトへのマップを行ないます。手順は、プロジェクト→新しい項目の追加→ADO.NET Entity Data Model選択/追加→データベースから生成→データ接続選択→データベースオブジェクト選択→完了、で(指定したテーブルを取り込んだ)デザイナ画面が表示されます。この時にバックエンドでDBアクセス用のクラスが(edmxモジュール内に)生成されています。

ORマップによって生成されるクラスですが、VS2008ではデータコンテキスト、データオブジェクトとなっていたものが、VS2010ではそれぞれコンテキスト(クラス名としてはEntities付加)、エンティティ(クラス名はテーブル名から)と改名されています。それぞれの役割とかは同じで、名前だけ変更されたようです。まあ、MS,改名が大好きですからね。あと、マイナーな機能追加で、複数データを扱うものについては名称が複数形にできるようになっています。LINQ使うとテーブルからの選択なんかでコンテキスト.テーブル名複数形、といった形でテーブルに参照することになるので、複数形になっているだけでも気持ちのいいものです。

記事の方ではコンテキストにはContainer付加となっていますが、私が試したみたところEntitiesが付加された名前になっていました。記事の方はモデルからのDB定義、私が試したのは(諸般の事情により)DB定義からのオブジェクトマップ、なので、生成する方式によって付加される名前が異なるのでしょう。


基本的にはVS2008でのORマップされたクラスの使い方と同じです。ただし名前が微妙に異なっていますし、定義されているメソッドも微妙に異なっていました。記事のサンプルコードではコンテキスト(コンテナ)のAddToEntriesメソッドでデータを追加していますが、生成されたファイル(あるいはインテリセンス)ではこのメソッドは非推奨メソッドとされています。正しい追加手法は DBEntities.XXXEntries.AddObject(XXXEntry)のようです。

.NET勉強中:ADO.NET Entity Framework入門 第1回 最新DBアクセス・フレームワークの基本的な考え方


第1回 最新DBアクセス・フレームワークの基本的な考え方


概念モデルがDBに依存してしまっているように思えますが。アプリケーション視点というより、かなり論理モデルに近いレベルになってしまっているように思えます。DBのエキスパートはDBの論理モデルでアプリケーションを検討してしまうことがあります。この記事もそういう影響下にあるのかもしれません。

アプリケーションを(DBとは独立に)考えるのであればこの段階でDBの概念モデルが出てくること自体、考え方がDBに依存してしまっている証拠です。本来であればここはDBとは無関係な、オブジェクトモデリング使って欲しいところですね。でもって、このオブジェクトモデルをDBにマッピングするためにO/Rマップを行ないたいところですが、知っている限りではそのような高機能のO/Rマッパーは存在してません。このレベルのインピーダンスミスマッチは手作業で解決するしかないようです。

オブジェクトモデル/RDBモデルのインピーダンスミスマッチについてはこの記事よりも、関連情報を探していて見つけたこちらの「O/R インピーダンスミスマッチ」の方が本質を突いていると思います。オブジェクトモデリングから見たO/Rマップ(LINQ向け、ただし手動)の話も出ています。RDB概念モデルからではなく、このようにオブジェクトモデルからスタートした方がインピーダンスミスマッチがより理解し易くなります(が、これも私にとってはRDBモデルよりオブジェクトモデルの方が馴染みが深い所為だからでしょう)。


当初は「別のもの」といいながら、O/R Mapping ベースで説明が進んでいますね。

概念モデリングについて、DBに慣れた人はいきなり論理モデルから、とかいっていますが、それ以前に考え方自体がRDBベースになってしまっている点については無自覚のようです。人間だれしも使い慣れた考え方で設計してしまいますから。RDB一筋の人は、本当になんでもRDBとSQLで考えてしまうようです。すごいというか(多段SQL平気で扱いますから)まぬけというか(通常コードの方がよほど簡単、高速に処理できるものでもSQL化してしまいます)、専門家だからといって変に信頼すると泣きを見ることになりますよ(実際そういう目に会いました)。

参考として最後に高機能なO/Rマッパーの話が書かれています。残念ながら私はそのような高機能O/Rマッパーを使ったことがないのですが、オブジェクト設計からRDBのレコードにまでマップ可能なO/Rマッパーがあるのなら使ってみたいですね。この記事では Entity Framework にそのレベルの機能があると示唆していますので、期待して読み続けるとしましょう。


実際に Entity Data Model を作成する解説です。VS2010で解説していますが、試してみるとVS2008 Express でも使えます。ただ、記事の先に出てきますが、VS2008では作成されたEDMを基にORmapすると名前の衝突が起きてしまうそうで、VS2010ではその部分が解決された、とのことです。VS2008には機能はあるものの出来は今一つだったのでしょう。そもそも使っている人があまり居なかったのかもしれません(出来が悪いから使われない、使われないから出来が悪いまま)。まあ、MSの場合、きちんと使えるようになるのはメジャーリリース3回目から、という法則がありますので、こんなものでしょう。

しかしEDMモデラー、低速マシンで使っていると腹が立ってきます。あまりにも動きが鈍い。というか、これが気持よく使える環境となるとどのぐらいのマシンを想定しているのでしょうか?自前でオブジェクト定義したくなってきます。結局、自前でORマップするほうが手っ取り早いのかもしれませんね。

注:後で判明したのですがVS2008のどこかが壊れていたようです。あまりにも操作への反応が悪すぎる(ファイル保存で1時間経っても完了しません)ので、再インストールしてみたら反応がよくなりました。

本ページの後半についてはVS2010で追加された機能で、VS2008では使えません。文字列データについて長さの制限ができないのは痛いですね。ですが、概念モデル設計では文字列の長さなぞは本来不要のはずです。VS2010でそれが追加されたということは自動ORマップの精度、あるいは機能性を向上させるためでしょう。

さて、VS2010を入れましたので、この部分から実際に試してみたいと思います。出来合いの人様のアプリでは面白く無いので、自前のアプリを設計してみるとしましょう。以下は手元のVS2010(Exp)で実行しながらのメモです。

プロジェクトの生成するところから違っています。VS2010Expressだからでしょうか、カテゴリとかはなく直接テンプレート一覧が出てきますね。私の方でもコンソールアプリでやってみましょう。コンソールアプリテンプレートから名前を付けてプロジェクトを生成しました。プログラムエントリ(Mainメソッド)を持ったクラスが用意されます。

ここで項目を追加。EDMモデリングのためには ADO.NET Entity Data Model を追加します(が、その下の ADO.NET EntityObject ジェネレータも気になります。後で調べてみましょう)。追加するとモデルを空から生成するか、既存DBから生成するかを聞いてきます。実は既にVS2008ベースで用意したDBが存在してはいますが、ここはVS2010のEDM機能を調べるものなので、あえて、空の状態から作っていきます。

追加によってEDMのデザイナ画面が表示されて、まずは、そのデザイナレベルでのプロパティ設定、オブジェクトの複数化をtrueにします。これは命名規則的にテーブルは複数形、オブジェクト(レコード)は単数形、を使うことが多いためですね。これはVS2008には無かった機能で、すごくマイナーな機能ですが、割合と有り難い機能でもあります(自動ツールって命名がいいかげんなものが多くて後になって困る事がありますよね)。

この後、ツールボックスからエンティティ、アソシエーション、継承関係、をD&Dしてデザインしていくわけですが、ここで再確認、EDMデザイナでデザインするものはあくまでDBの論理モデルですよね。結局のところ概念モデルから論理モデルへの展開はIDE外で(手動で)行なわれている前提ですね。このあたり記事のあたまに概念モデル云々が出てきていますが、デザイナー的にはそれは関係ない、ということになりますか。であればあえて概念モデルの話、出さなくてもよかったように思えますね。

後のほうで読むと、またMSのドキュメント(KB等)ではEDMでデザインしているものを概念モデルと称していますね。このあたりの用語の使い分け、結構いいかげんなのではないでしょうか。個人的にはEDMデザイナでやっていることが概念モデルとはとても思えないのですが、世間一般ではこのレベルを概念モデルというのでしょうかね。どうみても論理モデル展開したものをデザインしているようにしか見えないのですが。

さて気を取り直して作業継続です。二つの(DB)エンティティを用意します。一つはディレクトリ情報を保持するもの、もう一つはファイル情報を保持するもの、です。概念的に複数のファイル情報が一つのディレクトリ情報に関連付けられます(n:1)。追加したエンティティには自動割付のIDがデフォルトで用意されるようです。私の考えるDBデザイン的にもこれは必須ですので少し楽ができます。ID以外の属性は手動で追加ですね。

デザイナ上で属性(プロパティ)を追加する場合には3種類のプロパティ、スカラー、複合、ナビゲート、を選択する形式になっています。スカラー、複合は一般名称ですから判りますが、ナビゲーションプロパティってなんでしょう?ちょっと調べたらMSDNライブラリに記述がありました「ナビゲーション プロパティ (EDM)」。ただ、これVS2008用の説明なんですね。VS2010のものは見つかりませんでした。まあ、きっと同じものでしょう。ナビゲーションプロパティで指定されたもの(アソシエーションを示します)は、オブジェクトマップされた時にコレクションとしてマップされるそうで。これはある意味便利ですね。ただ、メモリ制約その他を考慮した場合に、そのマップが適切かどうかは別途検討する必要がありそうです。使うかどうかはまた後で検討することにしましょう。差し当たってはナビゲーションプロパティは無しで進めていきます。

ディレクトリ情報の方では、ディレクトリのフルパス名を保持します。ファイル情報の方では、ファイルが属しているディレクトリ(のID)、ベース名、サイズと日付、そして文字列形式でのハッシュ値、を保持します。EDM的にはディレクトリへのリンクは別途定義するものらしいのですが、そのあたりは無視してIDリンクも持たせておきます。


EDMモデルから論理モデルの自動生成です。VS2008ではどこまでできるのでしょうか。

最初にDB接続を作ります。他の実験でC:\TEMPにMDFファイルを作っているので、今回も同様にC:\TEMP下に作ります。なお、以前のトラブルでデフォルトのSQLサーバインスタンス名'SQLEXPRESS'が無効になっていますので、詳細設定でいちいちインスタンス名を変更しなければなりません。面倒です。

エンティティをDBにマップ(今回は自動生成)するのにVS2010ではエントリのコンテキストメニューから「モデルからデータベースを生成」、となっていますが、VS2008にはありませんね。ここで打ち止めでしょうか。VS2008にあるのは「データベースからモデルを更新」です。とりあえずこれを実行してみると、まあ、当然ですがエラーになります。名前からして、これは既存DBとのマッピングを行なうツールでしょうね。あ、最後まで読むとちゃんとそのところが記載されていました。

VS2010ではエンティティ定義からDB定義への展開(VS2008の逆方向)もできるようになっているそうです。やってみましょう。

とはいうもののDB接続だけは先に用意しておかなければならないようです。このあたりはまだ不完全ですね。どうせなら全部エンティティ側からできるようになっていればいいのに。メニューは「モデルからデータベースの生成」ですが、実際にはDBとの接続コンテキストおよびエンティティに対応したテーブルを作成します。最終的にはデータ定義(テーブル定義)のSQL文が生成されて確認用に表示されますので、そこで意図した通りのものができているかどうかチェックすべきです。というわけで結局SQLの知識が必須、SQL知らないでできるというものでは無いようです。どうにも中途半端さの漂うデザイナです。まあ、すべて自前で、よりは遥かに簡単ではありますので、それで良しとしましょう。

注:気持ち悪いことに、プロジェクトを前もって保存しておかないとデータ定義SQL文がテンポラリプロジェクトファイルから生成したことになりますね。先に保存して正しいソースがどこにあるかが判るようにしておくべきです。

さて、ここまでで、データ定義のSQL文が生成されますが、テーブルはまだ生成されていません。またDBへの接続文字列が App.config ファイルに記録されます。DBにテーブルを追加するにはデータ定義SQLを実行するのですが、記事では

メニューバーから[データ]-[Transact-SQL エディター]-[SQLの実行]を実行する

となっています。が、メニューバーの[データ]メニューにはそんな項目が出てきません。さあ、困った。ひょっとして、ちゃんと記載されていませんが、このあたりの機能は Expresss版ではサポートされていないとか。こういう解説記事書くような人は皆さん Ultimate版だったりしますからね。しょうがないので、DBエクスプローラからクエリーを開いて、CREATE TABLE 文をコピペして実行させました。本当にこうするしかないのであれば、EDM機能、少なくともDBテーブル生成機能は、Express版ユーザには役立たず、ということになります。こんな面倒掛けるよりDBを先に定義しておいてから、アクセスオブジェクト作るほうが楽そうです。

なお、コピペ実行で作ったテーブルですが、それを元にEDMを追加すると、主キーが無いという警告が出ます。どうも、DBをちゃんと(手動で)定義してからEDMでマップしてやるのが、少なくともExpress版では、無難なようです。

2010-12-13

VS2010 (Express) インストールメモ

VS2008ベースの記事読み終わったところで、いいタイミングなので、VS2010に移行しようと思い立ちました。VS2010 Expressのisoイメージをダウンロードしてあるので、そこからとりあえず、C#だけでもインストールしておきます。

isoイメージにはVS Expressのフルセットが含まれていました。マウントすると、インストール対象の選択画面が出てきますので、そこからC#を選択します。これによってインストーラが起動されます。ディスク食うのは覚悟していましたが、SQL Server Express込みで3.5GB必要とのことでした。インストールに備えて不要ファイル消しておいたのですが、あっという間に空き容量が元に戻ってしまいます。


追記:実際に消費されたのは1GB程度でした。作業用領域を含むのか、全体で、なのかも知れません。

一緒にインストールされる評価版SQL Serverですが、インストーラに表示される名称ではCompact版となっています。一方でそれに対するパッチは SQL Server Express 用と表記されています。表記ぐらい統一できないものですかね。

初回の挑戦はSQL ServerへのSP2インストールのところで失敗。SQL Server関連サービスを停止してからリトライ。2回目は修復インストールで。.NETフレームワークインストールし終わったところで再起動を要求してきます。初回の時にはその先でエラーになったので、再起動要求のポップアップを飛ばしてしまっていたのかもしれません。2回目の挑戦は成功して無事インストールが完了しました。

2010-11-27

拾い読み 連載:Visual Studioデバッグ手法

@ITの連載:Visual Studioデバッグ手法をまとめ読みしましたのでコメントを。

第1回 Visual Studio 2010のデバッグ機能をまとめる

一般的なデバッグ手法というより、IDEの利用、使用方法のガイドといった方向のようです。たしかに知っている人は使っているけど、といった機能は、特に高機能IDEには、多いのでそのあたりが紹介されているといい勉強になります。

デバッグの事前準備:バグ情報の収集方法

ここで、MSエラーコードの構成が記載されています。ちょっと役に立つかも知れません。ただ、良く見るエラーって、「その他」扱いのものばかりなんですが。

Visual Studio 2010を使用したデバッグ作業の基本

ブレークポイントについてはVS2008と変わりありません。まあ、このあたりは普段使いの範囲でしょう。ただ、一部では「特定の条件を満たした場合に停止する」機能があるようです。これは便利といえば便利なのですが、使い勝手は設定可能な条件次第です。いままではこういう特別な条件でログ、トレースを呼び出すようにしていて、そちらのブレークポイントを設定していました。前準備無しでいけるのは便利でしょうが、あらかじめある程度のデバッグサポートを想定したコードを作るのとどちらがいいのか悩むところです。

トレースポイントはVS2010で追加された新機能ですね(VS2008にはありません)。まあ、実際には状況によりけりですが、printfデバッグが簡単になるのはいいことでしょう。状況によってはログ、トレースコードとして残しておくべき場合もありますので、無条件に、というわけにはいきません。そのあたりは設計方針etcに依存するところです。単純なデバッグ専用の実行トレース程度でしたら、この機能は便利でしょう。

高機能IDE自体は悪いものではないのですが、インテリセンスと強力なデバッガの組み合わせの所為で(といったら失礼かもしれませんが)、理解しやすい(覚えやすい)名前を付けるとか、バグの取りやすさを想定したコーディング、といった技能が失われていく面もあります。単体レベルのテストならともかく、結合、システムテストレベルでは、このあたりを想定しているコードと想定していないコードではデバッグのはかどり方が違ってきますからね。

第2回 Visual Studio 2010の新機能「IntelliTrace」

Ultimate専用の機能ですと試しようがないですね。

最初にIntelliTraceの概要を exception 時のコールスタックトレースで解説していますが、これは変ですね。コールスタックトレース自体は既存の機能で、UI付きになって見やすくなったに過ぎません。この例では有難味が感じられません。

本来の有難味は後半に記述されているような、テストケースの(自動的な)再実行が可能になるところにあるように思えます。イベントベースで実行系列を保存しているというのは、(前半で紹介されたような)単純なトレースバックではなく、それを再実行するとこにあるはずです。ですが、この機能がUltimate+Team Foundation Server必須となると、それこそ滅多なことでは試すことができませんね。残念です。

第3回 Visual Studio 2010による高度なデバッグを極める

今回は特殊なデバッグ技法満載のようです。

(1).dllファイル(=アセンブリ)のデバッグ

dll用のデバッグ情報が付属していれば、ですよね。.NETあたりは確か付属していたと思いますが、サードパーティものだとついていないケースもありますから。基本的には自作(インハウス)DLL限定の話でしょうか。

(2)リモート・デバッグ

へえーこれは知らなかった。リモートデバッガなんかがあったんですね。ですが、「サーバ環境なんかで余計なものを入れることができない」ような環境だと、リモートデバッガ自体も禁止されそうですが、どうなんでしょう。まあ、多くの場合はそこまでうるさいわけではなく、ライセンス上の問題で環境が制限される場合のほうが多いかとおもいます。そういう場合にはリモートデバッガ便利ですね。

(3)別サーバのIIS上で実行されるプロジェクトのデバッグ

Webサービスデバッグはリモートデバッグとは別になるんですか。リモートデバッグといってまず想定したのがこの組み合わせだったので、ちょっとびっくり。以前の仕事の時は簡単なログ機能だけでこなしましたが、どこまでできるんでしょうね?ソースレベルいじることなく対処できるのであれば、色々と都合がいいわけですが。

(4)コードからのデバッガ制御

これはタイトルがミスリーディングですね。コード側で現在デバッガ制御下にいるかどうかを判定できる機能のようです。たしかにデバッガ使用時はユーザインタラクションが入るために通常のタイムアウトでは引っかかって処理が進まなくなることがありますから、そういう場合のみタイムアウト増大(あるいは無効化)できるのは有難い機能です。

(5)Internet Explorer 8の拡張機能デバッグ

これこそ思いっきり特殊例。まあ、こういう技法があるとだけ覚えておきます。

(6)並列プログラムの可視化機能

これはどうでしょう。並列系はデバッガでどうなるものではないですから。それは無いよりはましですよ。しかし並列系の障害って、おそろしく再現性が低く、またタイミング依存するので、デバッガで追っても無駄になることの方が多いものです。むろん、ここで例に挙げられているような障害なら見つけられるでしょうが、これはレベルが低すぎませんかね。並列系についてはひたすら設計時の検証にかかっている、と思っています。

さて、色々な便利な機能が紹介されているのですが、難点は、バージョンによって使えたり使えなかったりする点ですね。個別にそのあたりをまとめてくれていればずいぶんと助かるのに、と思いました。フルバージョンのVSがないと試すことのできないものが含まれているのが残念なところです。あるいは、こう便利なんだからフルセットを手にいれようよ、というお誘いなのかもしれません。