メタプログラミングでEXCEL仕様書よ、さらば! – 第一回 Center CLR勉強会

BlogImage

新しいコミュニティ「Center CLR」を立ち上げました。今回はその第一弾となる勉強会で、登壇してきました!
当日は、生憎の雨模様でしたが、エントリーいただいた全ての方が出席いただいて感謝しています。

centerclr-p1

この勉強会は、中部圏での.NET Framework中核技術であるCLRをネタに展開して行こうと思っています。一応セッション形式の進行ですが、セミナーではなく勉強会なので、随時質問やところどころの脱線など、Welcomeでやっていく予定です。初めての方もお気軽にどうぞ!

centerclr-p4

次回勉強会の開催はまだ未定ですが、ご興味ある方は、Center CLR公式サイト(Facebookページ)や、DoorKeeperをチェックしてみて下さい。また、私のtwitterや公式twitterアカウント「@centerclr」でもつぶやきます。


さて、私のセッションは、「メタプログラミングでEXCEL仕様書よ、さらば!」という題目で、仕様書に対してEXCELを使用することの是非と、CLRで何が改善できるのか?という事をテーマに解説しました。出席者からもいろいろな質問を上げて頂き、良い勉強会になったかなと思います。

普段、あまりなじみが無いと思われる技術を掘り下げたため、セッション時間が2時間越えとなってしまいましたが、どうにか形になってほっとしています。

解説中のサンプルコードは、私のGitHubから参照可能です(セッション中に発見したコメントは、このブログ掲載時にはまだ修正していませんが、すぐに修正します)。また、セッションのプレゼンは、以下に置いておきます。

メタプログラミングでEXCEL仕様書よさらば10.pptx

それでは、また!

「async/await ダークサイド is 何」 – 第10回まどべんよっかいち

「async/await ダークサイド is 何」というお題で、登壇しました。
第10回まどべんよっかいち

このセッションは、前回の「いまさら恥ずかしくてasyncをawaitした – 第9回まどべんよっかいち」や、「これからの「async/await」の話をしよう – 名古屋GeekBar」の続きで、前回話しきれなかった、よりエンハンスした内容となっています。

ちょっと巻きましたが、非同期処理のエッセンスを伝える事が出来たかなと思います。
プレゼンは以下に置いておきます。

async-awaitダークサイドis何

ご清聴ありがとうございました。多分、GeekBarでも再編集版をやると思いますので、今回参加できなかった方は、次回是非参加してください!
それでは。

趣味のAzure Websitesでパケ死必定?!・自腹課金の現実 – JAZUG名古屋@3碧目 ~ツナガレJAZUG 4周年!~

「趣味のAzure Websitesでパケ死必定?!・自腹課金の現実」というお題で登壇してきました。

イベントはこちら:DoorKeeper: JAZUG名古屋@3碧目 ~ツナガレJAZUG 4周年!~

先日のWebSitesへのブログ移行(つまり、今見ているこのブログ)のお話です。

プレゼンはこちら:趣味のAzure Websitesでパケ死必定?!_2.pptx

ご清聴ありがとうございました。またよろしくお願いします m(_ _)m

継承とインターフェイス

おはようございます。毎度質問ばかりで申し訳ないのですが。以前後輩に、継承はインターフェースみたいな使い方もできるけどどう使い分ければいいですか?って質問された時にうまく答えられなくて。上で言ってる使い方っていうのは親のクラスやインターフェースを引数に持って子のクラスや実装クラスを渡すみたいな使い方です。僕は上のような書き方はどちらでも書けるけど継承はそういう使い方がそもそも目的ではなく、同じような処理や構造を使い回すために利用するのかなと思っていて、そういう考えで使うならインターフェースを使うべきなのかなと思っていたのですが、まったく自信がなくて答えられなくて、今度コンタクトとれたら教えて頂きたいと思ってました。構文的な違いは一応調べてみて、差異はいろいろあったのですが、同じような使い方ができる時の使い分けの考え方について教えて頂きたいです。

…ネタが降ってきたw

物理的(言語的)な制約としては、その理解で良いと思います。C#をちょっと外れてC++の場合、C++にはインターフェイスという直接的な概念が無いのですが、純粋仮想関数(つまり、実装を持たない、表面的な構造だけを示したメソッド)の集合をクラスで表現した時、それがインターフェイスとなります。つまるところ、普通のクラスのメソッド群から「実装」を取り除き、表面的な見た目(メソッドシグネチャ)だけにしたものが、インターフェイスです。

で、インターフェイスとクラス継承の違いですが:

  • クラスの場合は、基底クラスの実装(振る舞い)を「継承」して、新たな振る舞いを付け加えたり、差し替えたりする事が出来る。
  • インターフェイスの場合は、表面的な見た目だけを定義し、実際に使う側からはその「見た目」が同一に見えるように強制出来る。

ぶっちゃけ、よく使う説明は:

仮面ライダーのお面がインターフェイスだと思いねぇ(ライダーマンが良いかも)。お面を誰がかぶっても、はた目にはライダーにしか見えない。ライダーに見せかける事によって、ショッカー軍団が襲ってくる(機能)。ライダーのお面をかぶらないタダの人間は、ショッカーの敵に適合しないので襲われない(本当か?)

「中の人」が誰であれ、お面をかぶると「仮面ライダー機能」に適合する。誰であれ、というのが、「どんな実装のクラスでも」と言い換えられます。極端な話、ゴリラがかぶっても良い。

しかし、基底クラスを継承する場合は、少なくともかぶる人が類似性(具象クラス)を持っている必要があります。中の人は少なくとも人間でなければならず、しかも改造人間でなければならないという制約が生じます。

更に、ウルトラマンのお面をかぶることも出来ます。それも同時に。ウルトラマンのお面に反応する敵は、仮面ライダーのそれとは異なります。違いは、顔の作り、「メソッドシグネチャの異なるメソッドの集合」という事になります。これを同時にかぶった人間は、フィクションでも実在しませんが、ある時はライダーに変身し、ある時はウルトラマンになる、というような、「仮面ライダーvsウルトラマン」的なネタがOKって事です。

#ちょっと嘘があります。お面を動的に切り替えれる訳ではありません。コンパイル時には決定されている必要があります。

もし、どちらで実装すべきか悩む場合は、インターフェイスを使用する前提にしておく事をお勧めします。その方が自由度が高い為です。多くのメソッドをそのまま派生クラスで流用したい場合に、基底クラスを使用したくなりますが、そもそもそんなに沢山のメソッドが単一のクラス内に定義されていることが問題です。

身近な例ではWPFやWindows Formsのクラス群が思い浮かびますが、あの実装は様々なトレードオフの検討の上で、あのような構造になっている、特殊な例です。

また、インターフェイスで分離を行う事で、副次的な良い効果があります。一つは、実装を明確に分離できる事です。基底クラスの実装に依存していると、派生クラスの実装がどのように基底クラスに依存しているのかを理解することが難しくなります(基底クラスと派生クラスの高度な分離は、オブジェクト指向版gotoだと言う記述をどこかで見た気がしますが、その通り)。インターフェイスで実装を分離していると、別のクラスに実装が分離されるので、正しくカプセル化を施していれば、機能の境界線ははっきりします。

もう一つは、自動化ユニットテストを記述しやすくなる事です。ユニットテストを記述する場合は、ファイルやネットワークやデータベースなどの「外部リソース」を、テストから分離しておかないと、テスト結果が不安定になります(テスト開始時には常にイコールコンディションとなるようにしないと、テスト結果がまちまちになってしまうが、ファイルやデータベースの事前準備を自動化するのは面倒)。

インターフェイスで分離されていることで、これらの外部リソースアクセスを、全く独自の、実際と異なる、しかしながら表面的には同一に見える実装に差し替えてテストすることが出来ます。インターフェイスのお面をかぶる「中の人」が誰でも良い、という特性を簡単に生かす事が出来ます。もし基底クラスを使用すると、基底クラスの機能に縛られ、全く異なる独自実装に置き換えることが難しいかもしれません。

C#の場合、メソッドはデフォルトで非仮想関数です。そのため、オーバーライドは出来ません(newを使用すると、名前が同じでも異なるメソッドとして扱われる)。インターフェイスであれば、最悪はラッパークラス(右から左にメソッド呼び出しを転送)を実装すれば、回避出来ます。

複数のインターフェイスを実装する場合に、たまたまメソッドシグネチャが同一であっても実装を分けたい場合には、インターフェイスの明示実装という手法を使うことで実現出来ます。

なお、CLRに限って言えば、仮想関数の呼び出しよりもインターフェイスメソッドの呼び出しの方がコストが高かったと思います。勿論、アプリケーション全体を通して、インターフェイスメソッドの呼び出しのコストがどの程度の割り合いなのかを評価しなければ、一概に悪いとは言えません。むしろ、その問題だけを引き合いに出してインターフェイスによる分離を行わないのは、本末転倒でしょう(そして、改善するなら測定してからにしましょう)。

#で、この項のネタは、先日見てきた「これ」に引っ張られてたりするw
#キャラクターネタにすると、諸般の事情で絵が描けないのが後の祭りだった…

これからの「async/await」の話をしよう – 名古屋GeekBar

「これからの「async/await」の話をしよう」なんて、大それたタイトルで登壇してきました (´Д`)

前回のまどべんよっかいち版に加筆・修正したものですが、時間に自由度があったので、細かく解説させてもらいました。
平日夜という事で、参加された方、長時間のご清聴ありがとうございました。

本編で紹介しましたが、この内容は〆られていないので、続編をやろうと思っています(次回まどべんよっかいちでの登壇になると思います)。ぜひ、ご参加下さい。

プレゼンはこちら:これからの「async-await」の話をしよう.pptx

あと、即興でLTして頂いたせがゆうさんのプレゼンを、代理でリンク張っておきます。せがゆうさん、お疲れ様でした。またよろしく!

それでは、また。

WordPress on Microsoft Azureの料金

wpazure6

フフフ、ネタが降ってきた (;´Д`)

とは言っても、まだ始めたばかりですが、参考にどうぞ。

wpazure7

ちょっと補足すると、トラフィック5GB(送信)までは、課金されません。まだまだ0.15GBですね。それとは別にコンピューティング課金が行われていて、これは「共有」なので従量課金ですが、単純に使用時間で積算されるので、208時間・276円という事です。そして、ここには表示されていませんが、ClearDBは無料の20MB枠なので0円。つまり、これが使用7日目での実績ですね。但し、WordPress.comからトラフィックを転送したのは21日からなので、今後どうなるかな?

トラフィックが予測可能なら、非常に使いやすい便利な計算機があります。

wpazure8

WordPress on Microsoft Azure

というわけで、wordpress.comでホスティングしていたブログを、Microsoft Azure WebSitesに引っ越しました。合わせて、保有しているドメイン名で引けるようにしました。
同じような事を考えている方は参考にどうぞ。

カスタムドメインの導入は完全無料ではありません

カスタムドメインをWebSitesに導入するには、「共有」プラン以上にする必要があります。Azureの有料プランは従量課金であるため、趣味のサイトをAzureでホストすることに抵抗があるかもしれません。もっとも、大してPVが伸びないことが分かっているのであれば、定額ホスティングとさして違いは無いように思います。この辺りは、痛い事があれば別のホスティングに移せばいいや的に、楽観視しています。

カスタムドメインの導入は簡単

やることは2つだけ。一つは自分が所有するDNSサーバーのレコードに、CNAMEで「kekyo.azurewebsites.com」のようなWebSitesへの標準FQDNを追加します。もう一つは、Azureの管理ポータルから「カスタムドメインを管理する」で、ドメインを追加します。
wpazure2
wpazure1

トラブル発生

実は、今回の引っ越しはもっと前に計画していたのですが、Azure上でWebSitesが追加できないというトラブルに見舞われて、遅れていました。大分以前から「kekyo.azurewebsites.com」で何度か構築・破棄のテストを行っていたのですが、どうもその時にAzureデータセンター側で何か問題が発生していたようで、今回の移行の際にこの名前でWebSitesが生成出来なくなってしまいました。

新規に生成しようとすると「プロビジョニングに失敗しました」というエラーが発生して、生成できないというものです。

wpazure3

このエラー、検索すると若干ですが事例があり、「しばらくしたら直った」的な、どうにも煮え切らない回答が。

何しろ、まだ何か行う前段階であり、このアカウントで他のサービスも使っておらず、エラーメッセージもこれだけでトラブルシュートも出来ず、「何をどうすりゃいいんだ?」という状態で困ってしまいました。
仕方が無いので、サポートを依頼しようとするものの、無料枠インシデントの要因にはこのような問題を直接指定するものがなく、何となく暗雲立ち込めつつも、サブスクリプションに対する問い合わせでやってみました。

が、技術的な内容の問い合わせは、有料インシデントとなるという回答… うーん、まだ使用も始まってなく、こちらに落ち度があるとは思えないのですが。もやもやしましたが、Azureでホストするというのは決めた事なので、サポート契約を行いました。

サポート契約と聞いて、仕事でもないので「もう駄目ぽ」と思ったのですが、念のため料金を確認すると「三千円(3,194)」ということで、「あれ?一桁間違っていないか?」と見直すと、更に「一か月間」とあります。これ、従来のテクニカルサポートインシデントと比べると「激安」じゃないのか?!

仮に一回三千円でも、個人では抵抗が大きいかもしれない(「これにて、以上!」とか言われて終了したらガクブルかもw 実際にはそんな事は無いんですが)けど、一か月間何度でもOKとなれば、これはかなり抵抗感が薄いと思います。加えて、MSの有償サポートはとても良い範囲に入ると思います。

と言う事で、調査すること一週間で、どうもデータセンター側のデータに古い情報が残っていて、これが原因でエラーが発生していたとの事(あるあるだ…そして予想通り)。この情報を手動削除するよりも、現在展開中の新しいポータルサイト(プレビュー)からWebSitesを生成すると回避可能との連絡が。プレビューサイトの見た目は洗練されているけど、何をどう操作すれば良いのかいまいち分かりにくいため、まだあまり使っていませんでした。

早速プレビュー版のポータルサイトからWebSitesを作成したところ、今度は問題なく生成完了!やっと先に進むことが出来ました。生成が確認出来たので、インシデントはクローズ。一応担当の方は、MS本社にも問題(これは有償案件なのか?)を掛け合って頂いたそうですが、どうしても覆せなかったこと、改善すべき事として検討しますとの回答だったので、今後に期待する事にしました(確約して頂いた訳ではないので、この件でゴリ押しはしないで下さい)。

WordPress日本語版がテンプレートから簡単に生成出来る

wpazure6
Azure WebSitesの生成時に、「WordPress日本語パッケージ」というテンプレートを使う事ができます。これを指定して、SALTキー文字列を適当に入力するだけで、あっという間にWordPressサイトが生成出来ます。zipで持ってきて展開してFTPでアップロードして云々とか面倒な作業は不要です。
もちろん、独自にコードをいじりたい場合は、FTP/SFTPで接続して直接編集する事も出来ます。

Azure特有のポイント

まず、データベースは「ClearDB」という、サードパーティのMySQL PaaSを使います。無料枠で作る場合は、こちらのサービスも無料枠で20MBを1DBだけ割り当てる事が出来ます(Azure WebSitesが有料枠でも、ClearDB無料枠と組み合わせ可能です)。但し、WebSitesをホストする同じ地域で割り当てないと、地域間通信に課金されてしまいます(確かテンプレートで生成した場合は、自動的に同じ地域になった気がします)。

20MBというのは、ディスク容量に比べると極端に小さいのですが、画像ファイルなどはディスクに格納されてDBには入らないので、すぐに埋まるという事も無いでしょう。

ClearDBへの接続についてもポイントがあります。少し前にリツイートしたのですが、ClearDBへの接続回数が多いと、スロットリングを受けてしまうようです。WordPressの現在の実装(3.9.2)は、MySQLへの接続が非プールらしく、これを改造しないと制限に引っかかってしまいます。

で、ソースコードを手で変更するのも面倒(自動アップデートされると元に戻ってしまう)事もあり、Azure WebJobというジョブ機能で定期的に修正を試みるのを推奨していたのですが、やり方は書いてないw

WebJobについて調べ始めると、これはこれでシンプルで面白い機能だと思ったのですが、ここで「そもそもAzureでWordPressのホストは珍しいわけでもないんだから、WordPressのプラグイン無いだろうか?」と思って検索するとありました!

wpazure4

「Persistent database connection updater」です。しかもMSOT謹製でした。そうだよねぇ。

もう一つの問題は、AzureはSMTPのホスティングをやって無いって事です。これは仕方が無いので、外部のSMTPサーバーに任せます。私はoutlook.comのSMTPに投げさせるために、「WP-Mail-SMTP」というプラグインを使いました。SMTPサーバーを指定するだけです。これで、WordPressからメールを送信する場合でも行けます。

wpazure5

あと、出来れば通信による従量課金を減らしたいですね。WordPressに「JetPack」プラグインを導入すると、「Photon」というCDN機能が使えるようになります。これは、WordPress.comがCDNホストとなって、画像や動画を配信してくれるという嬉しい機能です。ぜひ有効化しておきましょう。

その他

Azureに絡む話はこのぐらいで、あとは単純な引っ越しの問題が残りました。投稿中のコードは、現在も無残な状態です。インポートプラグインが悪いのかもしれません(WordPress推奨なんですががが)。投稿数を考えると、手で直すかどうか迷う所。あとは、テーマの微調整かな。Twenty Fourteenは一見クールなんですが、余白あり過ぎで、テクニカルな記事にはあまりマッチしてない。画像の配置も違和感ありまくり orz
cssをいじって調整中です。

素人の Per-Monitor DPI

先日、開発用のデスクトップPCを新調しました。その際に、話題の4KモニターDell UP2414Qを追加しました。

dell-up2414q-overview1

T221と比較してDisplayPortで接続出来るので、母艦のインターフェイスに悩まなくても済みます(実際は悩んだんですが、それはまた別の機会に)。また、60Hz行けるのが良い点です。

で、これをUXGAのL200Pと縦に並べました。

PerMonitorDPI1

下がUP2414Q、上がL200Pです。ここからが面白い。
Internet Explorerを下から上にドラッグして移動します。

PerMonitorDPI2

2台のモニターは解像度が違い過ぎるため、ドラッグ中のウインドウがL200P側ではみ出てしまっています。また、解像度が低い分、IE上のテキストや画像も物理的に大きく表示されています。ただ、違和感はありません。元々解像度が違う事を分かっているので、大きくなってしまうことは予想出来ます。そして…

PerMonitorDPI3

L200P側に半分以上?移動すると、このようになります。一瞬、「えっ?」と思うのですが、いきなりIE内のコンテンツが縮小され、しかし、ウインドウの外郭のサイズは変わらないため、妙に縮まって見えます。

これは、「Per-Monitor DPI」というやつかな。どれどれ、実測してみるか。

PerMonitorDPI4

UP2414Q

PerMonitorDPI5

L200P

少しサイズが違いますが、おおむね同じサイズとなるように、ピクセルが縮小されているようです。サイズが違うのは、L200PからDPIが供給されていない可能性があると思います。

さて、コンテンツだけを注目すると、非常に良い機能です。が、この「コレジャナイ」的な違和感… ウインドウの外郭も縮小されたらパーフェクトだったかもしれません。

… いやいや、本当にそうだろうか?

ウインドウの外郭クロームは、ずっと固定的なピクセルサイズを基準に運用されてきたので、今更これが変わるのは微妙かもしれません(見れないので分かりませんが)。

ウインドウの外郭に違和感を感じるのなら、ストアアプリならどうかなと思い、テストしてみました。

PerMonitorDPI6

UP2414Q

PerMonitorDPI7

L200P

これは素晴らしい!同じアプリケーションでありながら、極端に異なる解像度のモニターでも、表面的な違いはほとんどありません。そして、4Kモニターであれば、細かい文字も美しく描画されています。

PerMonitorDPI9

UP2414Q

PerMonitorDPI8

L200P

もちろん、デスクトップアプリにおいても「最大化」して使用すれば、ストアアプリとほぼ同じ結果が得られます(Per-Monitor DPIに対応していれば、です)。

このような事もあり、両方のモニターを同じ目的で使うつもりだったのですが、L200P側ではストアアプリ(主にNeuroniaとFacebook)を動かしたままで配置し、4Kの方で通常の作業を行う、という使い方に落ち着きました。2画面(又はそれ以上)のモニターをどれも同じ目的で使おうと考えている場合は、やはり同じモニターで揃えたほうが良さそうですね。

なお、Per-Monitor DPIについては、以下の記事が参考になると思います。

4大(?)ブラウザーの High DPI 対応 (だるやなぎさん)
アプリの高DPI(High DPI)対応について 第1回 ~ 高DPIとは ~ (田中さん)

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) へ続きます。