ようこそ。睡眠不足なプログラマのチラ裏です。

すべての F# ユーザーが今すぐ導入すべき拡張機能 F# snippet を導入しよう



twitterfacebook こういった SNS があなたの仕事の邪魔をしている。いつ仕事をするか?その合間でしょ?(逆でしょ!)
そんな今日この頃ですがみなさんいかがお過ごしでしょうか。 F# HACKATHON in sapporo [2013/03/23(土)] は、リモートでの参加も大歓迎らしいので、ドシドシ参加するといいと思います!



最近、「VS 魂 100 連発」とゆー企画をマイクロソフトのエバさんたちがやっていますね。かなりゆるーい感じで超入門的な内容を中心にさまざまな観点から Visual Studio の使い方を解説してくれています。たぶんおそらくめいびー F# に関する話題はご紹介いただけないであろうことは想像に難しくなく。気まぐれではありますが VS魂単発@F# 的な何かです。すべての F# ユーザーが今すぐ導入すべき拡張機能であるところの、F# snippet を紹介したいと思います*1



導入方法や詳細な使い方については、作者である Tao Liu氏(@ttliu2000)のブログ記事を参照されたい。と丸投げするのもアレなので駄文を書いてみます。


F# code snippet + snippet management for Visual Studio 2012 Addon - Apollo 13 - Tao Liu's blog
http://apollo13cn.blogspot.jp/2012/06/f-code-snippet-visual-studio-2012-addon.html



F# snippetを使うモチベーション

ソフトウェアを設計していく中で、定型的なコードというのは可能であれば抽象化してフレームワークやライブラリ内で解決できるのが望ましい。しかし、それができないような場合、あるいはできたとしてもそれが望ましくはない場合がある。同じパターンのコード片の記述を何度も強いられてしまうことがある。たとえば、ライブラリレベルでは実装できない IDisposableパターン。あるいは、INotifyPropertyChanged実装パターンなどはその典型。


解決方法はいくつか考えられます。たとえば、T4テンプレートのようなコード生成のアプローチを検討する場合もあるでしょう。しかしそこまで大げさではない場合。より小さくより手軽な解決方法として、Visual Studioではコードスニペット機能が利用できます。C# あるいは VB.NETコードスニペット機能を使用した経験があるならば、その使い勝手の良さついては説明不要でしょう。定型的な構文や一般的によく利用されるコードパターンについて覚えるのが大変な場合。あるいは、テンプレート化された記述が面倒くさい場合、それらの記述コストを削減してくれます。この機能はとても役に立ちます。苦痛からの開放、そして生産性の向上に一役買ってくれます。


しかし、F# ではこの機能を標準的に利用することができません。F# snippet を導入すればそれができます。これを使わない手はありません。じゃあいつ導入するか?今でしょ!(今出しょう太)




ところで最近、F#ユーザーグループ@ロンドンの登録メンバーが、500名を超えたそうです。流石 F# の聖地。


しかしながら、F# snippet の総ダウンロード数はというと...、たったの500強。あれ?
(つд⊂)ゴシゴシ ( ゚д゚) (つд⊂)ゴシゴシ (;゚д゚)…?! …これは一体どういうことだってばよ!?




F# snippet 導入手順

1. Visual Studio 2012を開きます。

2. Visual Studio の [ツール] -> [拡張機能マネージャー]を選択します。

3. オンラインから「F# snippet」を検索して、インストールします。


なんということでしょう。導入が簡単すぎる!


もちろん、Visual Studio Gallery からも入手することができます。


F# snippet - Visual Studio Gallery
http://visualstudiogallery.msdn.microsoft.com/d19080ad-d44c-46ae-b65c-55cede5f708b



クラウド上のパブリックなストレージにある、F#のコードスニペットたち

Visual Studioより、[表示] -> [その他のウィンドウ] -> F# Snippetを選択すると次の画面が表示されます。



でも、何処にどうやってログインすれば?


クラウド上のパブリックなストレージ(Windows Azureかな?)にログインするには、 fsbugs@microsoft.com へメールをして許可を得る必要があるようです。おいおい...いきなりハードル高いってばよ!ごもっとも。こちらについては華麗にスルーしていただいて結構。とりあえずプライベートで利用できればよいので、ローカル(スタンドアローン)で利用する方法と、データーベース(SQL Server)でコードスニペットを管理して、複数人で F# のコードスニペットを共有する方法について見ていきましょう。



F# のコードスニペットをローカル(スタンドアローン)で利用する

F# snippet でコードスニペットをすぐに利用できるように、F# チームの方たちが作ったコードスニペットCodePlex で配布されています。


CodePlex - F# Code Snippet
http://fsharpcodesnippet.codeplex.com/


F# の構文をサポートするもの。基本的なデータ構造の記述、クエリおよび TypeProvider、Windows Azure など広範囲をカバーする80以上ものスニペットを提供してくれています。Visual Studio 2012のインストールパスを見つけて、次のようなフォルダ階層を作成し、ダウンロードしたスニペットを配置しましょう。


"C:\Program Files\Microsoft Visual Studio 11.0\FSharp\Snippets\1041\"


1041 というのは、言語IDで 日本語版 を意味しています。英語版の場合は、1033 となります。
これでF# のコードスニペット機能を利用できるようになりました。やったね!


プライベートなデーターベースでコードスニペットを管理。複数人で F# のコードスニペットを共有する

コードスニペットをチーム内で共有したいというニーズはどこにでもあります。ネットワークで共有をする?バージョン管理システムを使う?まぁいろいろとあると思いますが。F# snippet ではデータベース(SQL Server)を介して手軽にコードスニペットを共有する機能が提供されています。今回は、データベースに SQL Server 2012 Expressを使うことにします。



SQL Server 2012 Express には、5つのエディションがありますが、今回は SQL Server Management Studio Express を含む Express with Tools を選びます。ダウンロードやインストール方法、およびリモート接続などについては、SQL Server 2012 Express のインストールを参照されたい。


インストールが完了したら。F# snippet用のデータベースを作成して、こちらのスクリプトを実行して環境を構築しましょう。




必要な構成が作成されました。これで準備完了です。先ほどのログイン画面からログインしてみましょう。




接続成功です。やったね!



自作のF#スニペットを記述する

F# のコードスニペットを作成する方法は、基本的に C#VB.NETコードスニペットを作成する方法と同じです。C#コードスニペットと同じ要領で作成し、コードスニペットスキーマの Code要素 の Language属性 に「fsharp」と設定すればF# のコードスニペットとして機能します。例えば、printf関数を記述するための簡単なコードスニペットは、以下のように記述できます。


printf.snippet

<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
    <CodeSnippet Format="1.0.0">
        <Header>
            <Title>printf</Title>
            <Shortcut>printf</Shortcut>
            <Description>printf に対するコード スニペット</Description>
            <Author>zecl</Author>
            <SnippetTypes>
                <SnippetType>Expansion</SnippetType>
            </SnippetTypes>
        </Header>
        <Snippet>
          <Declarations>
            <Literal Editable="true">
              <ID>param1</ID>
              <ToolTip>format</ToolTip>
              <Default>%A</Default>
              <Function></Function>
            </Literal>
            <Literal Editable="true">
              <ID>param2</ID>
              <ToolTip>value</ToolTip>
              <Default>value</Default>
              <Function></Function>
            </Literal>
          </Declarations>
          <Code Language="fsharp"><![CDATA[printf "$param1$" $param2$ $end$]]>
            </Code>
        </Snippet>
    </CodeSnippet>
</CodeSnippets>


とても簡単ですね。早速データベースに登録してみましょう。




登録したコードスニペットは、Snippetsタブから確認できます。



データベースから、登録したコードスニペットをローカルにダウンロードしてみましょう。



コードスニペットマネージャーを開きます。



"C:\Users\\Documents\Visual Studio 2012\Code Snippets\Visual F#\My Code Snippets" に、データベースで共有しているコードスニペットがダウンロードされていることが確認できます。



自作した printf関数のコードスニペットを共有して使えるようになりましたね。


CodePlex では提供されていないもので独自に用意しておくと便利そうなものとしては、単純にAllowNullLiteralAttribute、AutoOpenAttribute、AutoSerializableAttributeなどを一発で入力できるものを作ってみたり。アクティブパターンや測定単位に関するスニペットを作ったりと、いろいろと考えられますね。それこそGitHubやクラウドなんかでみんなで共有できればそれはそれは素晴らしいことですね。


好みのショートカットを割り当てる



CodePlex で配布されているコードスニペットには、ショートカットが設定されていません。なので、初期設定のままでは「Ctrl + K, Ctrl + X」のシュートカットによる [スニペットの挿入] からしかコードスニペットが利用できません。独自にお好みのショートカットを設定しておくことでより使い易くなります。


コードスニペットファイルを直接編集して スキーマの Shortcut要素にお好みのショートカットを設定するとよいでしょう。例えば、自動実装プロパティのコードスニペットであれば下記のように設定してみましょう。


prop.snippet

<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <Title>auto implementation property</Title>
      <Shortcut>prop</Shortcut>
      ...


お好みにカスタマイズすることで非常に便利になります。
F# はコード補完が弱いとかなんとか言われております。が、これで勝つる!



最後に
なお、F# snippetのバグを発見したら、twitterで直接Tao Liu氏(@ttliu2000)にコンタクトを取ると対応してくれるそうです(あるいは fsbugs@microsoft.com へメール)。


C# 開発者のための F# 本にも期待しちゃいますね。


F# for C# Developers



余談ですが、「Snippet Designer」 が F# に対応してくれたらかなり強力なんですが。それには F# コードスニペット機能の公式化が不可欠なような気がしないこともなく。公式化はよ。


Snippet Designer
http://snippetdesigner.codeplex.com/



それでは、快適でよりよい F# ライフをお楽しみください。

*1:いまさら感あり