Visual Studio 2012/2013 の拡張機能を紹介 (2)

何だか反響があるようなので、急いで書かなければ (;´Д`)
のっけからゆるい紹介です。

Visual Studio拡張機能については、以下の記事もどうぞ:
Visual Studio 2012/2013 の拡張機能を紹介 (1)
Visual Studio 2012/2013 の拡張機能を紹介 (2)
OzCodeでかゆいところに手が届くデバッグを


「Claudia IDE」

ClaudiaIDEClaudiaIDE_Settingsクラウディア窓辺さん、とは、…. いや、もう説明不要でしょう。殺伐としたIT業界の戦士たちを奮い立たせるため、Visual Studioのエディタ背景に舞い降ります。

エディタ内で活躍してもらうために、いくつかの設定が可能です。

クラウディアさん以外にも、プロ生ちゃんこと「暮井 慧」に舞い降りてもらう拡張機能もあります。こっちはアニメーションもしますよ。


「DevArt T4 Editor」

DevArtT4EditorpngVisual StudioでT4テキストテンプレート(ビルド時にソースコードを生成できる、プリプロセッサベースのコード)を編集する場合の、コードハイライトやIntelliSenseっぽい補完機能が使えます。

T4を補助する拡張機能は他にもいろいろありますが、VSの濃色テーマ(スクリーンショットのような背景が暗いテーマ)選択時に、色が破綻していなかったので、これを使っています。もちろん、拡張機能が何もないと、とてもT4でコードを書く気になれません。


「Git Source Control Provider」

GitSourceControlProviderGitはソースコード管理システムの一種で、最近ではGitHubが知られるようになったので、ご存じの方も多いと思います。この拡張機能は、Visual Studio上でGitの操作が出来るようにするものです。

とは言っても、マイクロソフトもまたGitの拡張機能を公開していますし、ほかにも数種ありそうですが、謹製も含めてどれも今一つの出来です。ここで紹介した拡張機能は、その中でもまともな方かなと思います。

#この辺りは、こっちの記事でも紹介しましたので参考にどうぞ。私のお勧めは、残念ながら拡張機能ではなくSourceTreeです。


「Highlight all occurrences of selected word」

HighlightAllOccurrencesOfSelectedWordもう、これが無いと生きていけない系です。

エディタで選択した単語と同じ単語を見つけ出し、リアルタイムで色を付けます。上の例では「value_」をダブルクリックしたところですが、エディタ上のすべての「values_」に緑色が付きます。

「単語なの?構文解析して意味的に同一なものじゃないのか?」と思う人も居るかもしれません。そういう機能もあればうれしいのですが、とにかく文字列一致でハイライトしてくれると良い点として:

  • C#に限らず、VBやXAML、C++など、テキストエディタ全てで有効なので、いつでも使える安心感がある。
  • 純粋に文字列を検索したい場合も、ままある。コメント上の単語や、リテラル文字列の単語など。

ということがあります。何よりイージーで効果が高いので、これが使えないとかなり痛いです。


「Java Language Support」

JavaLanguageSupport基本、必要に迫られない限り、Javaでコードを書くことはあり得ないので、この拡張機能はスクリーンショットも取れなかったです。どうしてもソースコードを読みたい場合に備えて、ハイライト表示が出来るので入れてあります。

機能的にはデバッガも含まれているらしい(もちろん、Visual J++やJ#のようなモドキではなく、JVMで)ので、拡張機能としては気合が入っています。

今は、少なくともビルドやソースコード管理などを含めた、トータルでの開発環境として評価しなければ、真の価値は分からないと思うので、ここまでにしておきます。こう言う物もあるんだ的に捉えてもらえれば良いかなと。


「Productivity Power Tools」

ProductivityPowerToolsMS謹製のVS拡張機能です。VSの隙間を埋めます。この拡張機能、もうVSに取り込んでも良いんじゃないかと思うのですが…

かなり沢山の機能拡張が盛り込まれています。私のお気に入りとしては:

  • ソースコード保存時に、自動的にソースコード整形してくれる。また、C# usingの整理もやってくれる。まぁ、後者はやりすぎ感もあるので、オンにすべきかどうかは迷う所です。
  • ドキュメントタブを色分けして、ピン止め出来たりする。
  • スクロールバーに、編集箇所を色表示してくれる。
  • カラムタブ位置にガイドラインとなる線を引いてくれる。
  • 印刷時にソースコードの色付けをしてくれる。

などなどあります。勿論、人によって要不要は様々だと思うので、設定ダイアログから機能をオンにしたりオフにしたりして、自分なりにカスタマイズして下さい。

なお、リンクはVS2013用です。2012や2010用は同じ名前で別に存在するので、検索してください。


「RockMargin」

RockMarginテキストエディタの縦スクロールバーが巨大になり、スクロールバーにテキストのサムネイル(?)が表示されます。青っぽく強調されている部分が、ビューに表示されているテキストの範囲です。

このブロードなバーはドラッグできて、それに合わせてビューがスクロールします。編集時には何となくソースコードの位置を「イメージ」で覚えておいて、ささっとスクロールさせる事ができます。

テキストエディタで如何に目的の場所に移動するかという事に注目した拡張機能はいくつかありますが、私はこれが一番直感的で素早く移動出来て良いと思います。

この拡張機能、ギャラリーではまだまだマイナー順位だったので、見つけたときには「掘り出し物みっけ!」と喜んでいたのですが、de:codeに参加したらエバンジェリストの方々がデモで皆使っていて、別の意味でがっくりしましたw


「SQL Server Compact Toolbox」

SQLServerCompactToolBoxVisual Studio 2012までは、SQL Server Compact Editionのデータベースファイル(*.sdf)を直接オープン出来、SQL Serverと遜色のない編集が可能だったのですが、2013になってオミットされてしまいました。

この拡張機能は、VS内でSQL Server Compactのデータベースを編集可能にします。ただ、まだ発展途上で機能も網羅されていないため、どうしても2012の編集可能である事と比較して、個人的には不満があります。

とはいえ、作者は結構頻繁にバージョンアップを繰り返しているので、徐々に問題も減ると思います。

余談ですが、面白い事に、Visual Studio User Voiceでも結構なvote数でCompact Editionの続投が入っています。

Support Sql Server Compact in Visual Studio 2013
Sql Server Compact 5


「Unit Test Generator」

UnitTestGeneratorVisual Studio 2010までは、MSTestを使用するユニットテストコードの生成が簡単に行える機能が内蔵されていたのですが、これまたVSから切り離されてしまった機能です。

今は、TFS ALM Rangersというプロジェクトでこの拡張機能がリリースされているのですが、VSから分離したというより、同じようなものを一から書き直しているようで、かなり機能が不足しています。

UnitTestGenerator_SettingsInternalsVisibleTo属性の自動適用や、プライメートメソッドへのアクセサコードの自動生成などがなく、非常にシンプルなテストコードの生成だけが出来る状態です。

本来、TDDではテストコードから記述するため、こういった機能は馴染まないという事も背景にあるのかもしれません。ただ、私的にはフレームワークの設計をやるので構築&破棄が多く、採用したいコードが出来た時点でテストコード書きたいという欲求もあり… 難しいところです。


「VSColorOutput」

VSColorOutputこれも、無いと生きていけない系です。ビルド時のログなどが表示される「出力」ウインドウの行に色を自動的に適用します。

法則などはあまり把握していませんが、warningとかerrorとかが行内に含まれていると、黄色や赤色で強調してくれます。

VSColorOutput_PreSettingsVisual Studioのデフォルトでは、ビルド経過はプログレスバーでしか表示されず、エラーが発生した場合は「エラー一覧」に表示されます。しかし、このエラー一覧は、表示の順序が発生した順序となっておらず、見ても関連性が全く把握出来ないため、とても残念な機能になってしまっています。

結局、エラー一覧を自動的に表示するというオプションを外し、必ず「出力」ウインドウを表示させるのですが、今度はログからエラーが発生している箇所を探すのが困難。

そんな時にこの拡張機能があれば、スクリーンショットのように一目瞭然です。ログの上から見ていって、最初の赤い行に注目すれば良いので、とても楽です。

標準のルール設定では、「Error」のような単語が含まれていると赤く表示されてしまってアレなので、以下のような順序に変更しています。

vscoloroutput2


私的な定番としては、このぐらいです。

ReSharper_CodeAnalysis2近日ではとうとう「ReSharper」を使い始めました。これも解説はほとんど不要かと思います。というより、自分もまだ導入したてでレビュー出来ないと言う事もありますがww

上に含めなかったのは、この拡張機能が有償なためです。しかし、きちんとリファクタリングする文化があるのなら、きっと力になる拡張機能かなと期待しています。

Visual Studio 2012/2013 の拡張機能を紹介 (1)

Visual Studio 2010より、IDEの拡張機能を簡単に導入できるようになりました。

VSExtensions現在の拡張機能についておさらいしておきましょう。

Visual Studio拡張機能については、以下の記事もどうぞ:
Visual Studio 2012/2013 の拡張機能を紹介 (1)
Visual Studio 2012/2013 の拡張機能を紹介 (2)
OzCodeでかゆいところに手が届くデバッグを


Visual Studio拡張機能とは

VS2010以降では、「ツール」メニューの「拡張機能と更新プログラム」を選択することで、拡張機能を管理するダイアログを呼び出す事ができます。このダイアログから、オンラインで拡張機能を検索したり、インストール済の拡張機能の更新やアンインストールを行う事ができます。

VS2008までは自力でセットアップコード(WixやInstall Shieldを使って)を用意し、独自の配布形態をとる必要があったのですが、VS2010からは「*.vsix」という形式の専用セットアップパッケージがサポートされ、負担が軽減した事が大きいと思います。拡張機能がvsix形式となっていれば、上記ダイアログから、ダブルクリック→インストールで、簡単に機能を拡張することができます。

※余談ですが、ツールメニュー内には「アドインマネージャ」という項目もありますが、これは拡張機能とは関係ありません。というより、ここに項目が追加されていることを見た事がない… 私も詳細は分かりません。

VSGResharperまた、vsixはユーザー毎にインストールすることが前提となるため、インストール時に管理者権限を要求しないことも、インストールの負担軽減に良いようです。
とは言っても、拡張機能の内容によっては、システムレジストリ(HKLM)を変更する必要があったりするため、インストール方法がvsixに統一されたわけでもありません。この辺りは、非常に扱いやすくなったNuGetと異なり、まだまだ洗練の余地があるように思います。

オンラインでの検索は、Visual Studio Galleryに登録されているソフトウェアが対象です。このサイトには個人で作った拡張機能でも登録できます。現在、約5000タイトルが収録されており、有償無償に限らず、こんな拡張機能があるのかという発見があります。


NuGetとの違い

NuGet拡張機能やNuGetを殆ど使わない文化の所もあると思うので、その違いについても。

拡張機能はVSの機能を拡張します。たとえば、ソースコードエディタの機能を強化したり、デバッガの拡張を行ったり、Git/Subversionのようなソースコード管理ツールを統合したり、といった内容です。

NuGetはそうではなく、C#などのプロジェクトを開始後、そのプロジェクトのビルドに必要なサードパーティのライブラリを簡単に導入出来る仕組みです。

これまではこの部分も拡張機能が担っていたのですが、その場合は「参照設定」から、使用するライブラリを自分で探し出して、プロジェクトに追加する必要がありました。しかし、システムにインストールされた大量のライブラリから、目的のアセンブリ(DLL)を探し出すのは容易ではなく、また、大抵は組み合わせて使用するため、これを毎回行うのは頭痛の種です。

TooManyDependentLibraries2ため息が出る、端的な例。

更に、サードパーティ(特にオープンソースプロジェクト)のライブラリは更新頻度が高く、新しいバージョンがリリースされても、ライブラリの依存関係を把握するのが困難で、いつまでも古いバージョンのライブラリを使い続けるという「あるある」状態になってしまいます。

そこで、プロジェクトへのライブラリの導入を簡単にするために生み出されたのが「NuGet」拡張機能です。そう、NuGetもまた、VSの拡張機能の一つとなっています。

NuGetはプロジェクトで「これを使う」のように指定する・されることが多いため、少し探せば目的のパッケージが見つかりますが、拡張機能は使ってみないと分からないこともあるため、私の使っている拡張機能を紹介してみようと思いました。

Visual Studio 2012/2013 の拡張機能を紹介 (2) へ続きます。

いまさら恥ずかしくてasyncをawaitした – 第9回まどべんよっかいち

本日、まどべんよっかいちで「いまさら恥ずかしくてasyncをawaitした」というお題目で登壇してきました。DoorKeeperはココです
ちょっとまくる進行の予定だったのですが、時間が長くとれたので、詳しく解説しました。

ご清聴ありがとうございました。

非同期処理はここで解説した事を押さえておけば、大体OKと思って良いと思います。
他にもポイントはあるのですが、とても一回のセッションでは解説できないので省きました。次回にでも続きをやろうかと思います。

デモプログラムはGitHubに上げてあります。

スライドはこちら:いまさら恥ずかしくてasyncをawaitした_2.pptx

追記:忘れてました。ストアアプリの場合は、TaskクラスではなくIAsyncInfoというインターフェイスでawaitする事ができます。この話も次回出来たら良いなと思います。

このネタはリクエストがあったので、GeekBarでも再登壇する事になりそうです。決まったらまたtweetします。

Async訪ねて3000里 (6) : I/O完了ポートによるワーカースレッドの運用

前回、TaskCompletionSourceによるタスクの継続に、APCコールバックを使用した場合の欠点を示しました。

APCコールバックはユーザーモードから見た場合の挙動がわかりやすい(コールバックが実行される)のですが、MsgWaitForMultipleObjectsEx APIなどのAPCコールバック対応APIで待機する必要があり、待機したスレッド(通常はメインスレッド)からコールバックが呼び出されるため、そのスレッドだけでI/Oの完了を捌く必要があります。

仮にシステムに多くのCPUコアが存在する場合でも、I/Oの完了による継続処理(翻ってawait後の処理)が、単一のスレッドだけで処理されることになり、パフォーマンスが上がりません。


手が遅いので指摘されてしまいました (;´Д`) 最後のピースを埋めましょう。

カーネルモードからユーザーモードに、I/Oの完了を通知する方法は、APCコールバック以外にも方法があります。

ファイルハンドルやイベントオブジェクトなどのWin32カーネルオブジェクトは、「シグナル状態」と呼ばれる一種のフラグを持っています。このフラグは、それぞれ決められたタイミングで「非シグナル状態」から「シグナル状態」と変化します。たとえば、ファイルハンドルであれば、直前のI/O操作が完了した(IoCompleteRequest)タイミングで、ファイルハンドルがシグナル状態となります。

APCコールバックを使用する場合は、I/Oが完了した事をプロセス毎のAPCキューに挿入することで通知しましたが、シグナル状態による通知であれば、キューを操作するコストを削減出来、さらにAPCコールバック対応のAPIで待機することなく、完了した事を通知することができます。但し、シグナル状態による通知は、前述のとおり一種のフラグであるため、コールバックとは異なり、この契機で能動的に処理を行うことができません。

このシグナル状態は、WaitForSingleObjectWaitForMultipleObject APIで監視することができます。つまり、これらのAPIを使用すると、I/O処理が完了するタイミングまで、スレッドを効率よく待機(ハードブロック)することができます。

WaitForSingleObjectでは単一のスレッドがシグナル状態となるまで待機しますが、これをワーカースレッドによる複数のスレッドにまで拡張したものが「I/O完了ポート」です。I/O完了ポートを使用すると、複数のワーカースレッドをあらかじめ待機させておき、シグナル状態となる通知によって、次々とワーカースレッドを使って完了後の処理を実行することができます。

実はasync/awaitの非同期インフラストラクチャーは、APCコールバックではなく、I/O完了ポートによって実装されています。I/O完了ポートに紐づけられるワーカースレッド群は、ThreadPoolクラスのI/Oスレッドとして内部的に割り当てられています。ThreadPoolクラスのワーカースレッドは、古くはIAsyncResultインターフェイスによる初期の非同期インフラの駆動用として使用されてきました。.NET 3.5以降でThreadPoolの実装が見直され、より効率よく動作するようになり、TaskAwaiterのコールバック駆動用として使用しています。

つまり、APCコールバックではAPC待機APIの呼び出しで待機したスレッドがコールバックを実行していましたが、現在の非同期インフラはThreadPoolクラスが保持するI/Oスレッド群が、TaskAwaiterのコールバックを実行しています。そして管理はI/O完了ポートで行っているため、大量のI/O要求の完了処理も、複数のスレッドで同時に処理できるのです。

MSDNブログに、.NETにおけるI/O完了ポートの使用方法が示されていたので、参考にして下さい。


以上をまとめると、async/awaitによる非同期処理は、ハードウェアからの完了通知としてもっともロスが少ないと考えられ、理想的な環境であれば、余計なワーカースレッドは使われません。但し、I/Oの完了がユーザーモードに通知された際に、TaskAwaiterのコールバック処理(await文以降の処理)を実行するためにスレッドが必要なため、この時に限り、効率的にプールされたワーカースレッドを使います。

唯一このタイミングでのみ、わずかな期間(IoCompleteRequestからI/O完了ポートでスレッドが処理に割り当てられるまで)ですが、スレッドのハードブロックと見なせる空白の時間が存在しますが、その他の手法と比べて無駄がありません。モニタAPIや待機APIによる、余計なハードブロックを起こさないのですから、多数のCPUコアで並列実行する場合でも、コンテキストスイッチによるロスは皆無です。

ケースバイケースですが、従来は自前ワーカースレッドによる複雑な実装しか選択肢が無かったものが、async/awaitの構文だけで効率の高い処理を簡便に実現できるようになったのです。ぜひ、非同期処理を実践して行きましょう。

せがゆうさん、ありがとうございました!

Visual Studio Onlineを始める

以前、Team Foundation Serverのクラウド版とも言うべきTeam Foundation Serviceがベータ版で運用されていましたが、正式にVisual Studio Onlineとなったので、オンプレで使っていたTFSからリポジトリを乗り換える前提で、とりあえず使ってみました。

vso4

Visual Studio Onlineは基本契約は無料で、プライベートなリポジトリを持つことが出来ます。巷では無料のリポジトリサービスがいろいろありますが、ほとんどの場合はリポジトリに格納するプロジェクトをオープンソースとして公開することが前提です。

もし、ちょっとしたプライベートなプロジェクトを格納しておく場所に困っているなら(ローカルで自前でTFS・Git・Subversionなどを立ち上げるなど、いくら簡単にインストール出来ても保守は面倒です)、Visual Studio Onlineを検討する価値はあるでしょう。

また、他のサービスと異なるユニークな点は、Professional契約以上(月額45ドル/人)で、開発環境としてのVisual Studioが使えることです(インストールが必要)。さらにAdvanced契約以上では、アジャイルソフトウェア開発で有用な、プロジェクト管理システムもフルで使えます。これは、従来のTFSで使用している機能が、SaaSとして利用可能になったものです。

vso5

CI(継続インテグレーション)も可能です。但し、ビルド時間に制限があります。時間を超えると課金が必要です。未確認ですが、オンプレミスサーバーにVisual Studio Agentをインストールして、CIだけオンプレミスで実行させる事が可能なようです。これならば、大幅な課金を回避しつつ、サーバー管理の負担を軽減することが出来ます。

オンプレミスのTFSを使えばもちろん課金は不要ですが、TFSの管理にかかるコストの事を考える必要があります。TFS(に限らず、類似システムも含め)プロジェクト管理システムは大掛かりなため、全ての機能を使用して維持するのは、それ相応の準備と計画が必要になります。この点を肩代わりしてくれるサービスだと考えれば、課金をペイ出来る開発チームもあるでしょう。

公平の為、このようなクラウドサービスとしてAtlassianも推しておきます

また、Visual Studio Onlineは、従来のTeam Foundation Server方式のソースコード管理に加え、分散バージョン管理システムのGitを使用することもできます。これは、オンプレミスのTFS2013では実現出来ないため、Visual Studio Onlineのみのアドバンテージです(将来は改善されるか?)。


vso1

物は試しということで、Visual Studio OnlineでGitを使用してリポジトリを作り、Visual Studioを「使わずに」接続してみました。この図のように、あらかじめアカウントのProfile画面からCredentialタブを選択し、Basic認証を有効化しておきます。Gitクライアントからはhttpsで接続しますが、この時に使用するパスワードをここで入力して下さい。私はLive IDのパスワードを入力し続けて、暫く嵌っていました。

この操作は面倒ですが、恐らくはセキュリティ上の措置(Basic認証では平文パスワードを保持する必要がある)の為と思われます。念のため、Live IDのパスワードとは変えるようにします。

Windows環境のGitクライアントはいくつか選択肢があります。Git開発者の公式なパッケージはbashを含むMSYSベースのCLI環境です。どのクライアントを使うにしても、このパッケージはインストールしておいたほうが良いでしょう。何故なら、他のクライアントがこのパッケージ内のバイナリを使う事があり、かつすべてのクライアントがGitのすべてのオペレーションをサポートしているとは限らないためです。

vso2

Visual Studio内で使用できるプラグインGitクライアントも数種類あります。問題は、どれもまだ品質が一歩劣るという所でしょう。マイクロソフトも純正のGitクライアントプラグインをリリースしています。これはVS2012用で、VS2013には初めから搭載されています。しかし、Gitで使用する頻度の高いコマンドがサポートされていない・複数のリポートリポジトリに接続出来ないなどの問題があります。石坂さんのブログに詳しいので参考にして下さい。ボチボチ使えるのがGit Source Control Providerです。窓の杜の記事も参考にどうぞ

プラグインではないクライアントとして有名処ではTortoiseGitがあります。が、Tortoiseシリーズは思う所があり、私的にはSourceTreeをお勧めします。このクライアントは独立型(いわゆるVSSクライアントのような)で、Mercurialもサポートします。

操作感についてはそこそここなれている印象です。バックエンドを普通のCLIベースのGitクライアントで賄っているため、スムーズさは今一つですが、どのクライアントもこの方式なので仕方が無いでしょう。それ以外の点では、自分が何をやろうとしているのかが把握しやすいのが良い点です。そして、SourceTreeは前段で紹介したAtlassianが開発しているというのも、説得力があります。

vso3

SourceTreeを使用して、Visual Studio Online上のGitリモートリポジトリに接続し、ローカルリポジトリにコミットしたコードをpushしてみました。当然のことながら、全く問題ありません。一点、Visual Studio Online上のリポジトリURLがどこから取得出来るのか分かりにくいという問題があります。以下の図を参考にして下さい。

vso6

ソースコードエクスプローラーで、ツリーのリポジトリをクリックしたときに表示されているURLが、Gitクライアントで入力すべきURLです。URL末尾のリポジトリ名の手前に「_git」という識別子が入るので、確認してください。


これからGitを始めるという方は、VSS・TFS・Subversionと同じと思って掛かると挫折します(笑) Gitは同じバージョン管理システムでも全く異なる仕組みを持ちます。必ず知識をつけておきましょう。

Gitポケットリファレンスを、お勧めします。