ASP.NET IdentityをF#で。

今回もお仕事でASP.NET MVC + F#を使うことになったので*1ASP.NET Identityを試してみることにしました。


もちろんF#用テンプレートなどは無く、サンプルも皆無。
C#で書かれたサンプルなどを参考に、地道に実装しました。
その際に作ったプログラムをGitHubにプッシュしましたので、ご自由にお使いください。


諸事情により、ASP.NET MVC 4 を使用しています。
極々単純なサンプルですが、ユーザ管理、ロール管理が(一応)できます。


ASP.NET Identity いいですね。シンプルで。

*1:もとはPHPの案件でしたが、わたくしの圧倒的な魔力によって現実を書き換えました

露出狂

クラス内の、あるメンバをインテリセンスに載せたくない場合、
EditorBrowsableAttributeを使って隠してやることができます。


F#でも


[<EditorBrowsable(EditorBrowsableState.Never)>]
member this.Love() = ()
なんていう風に使えるものだと思っていました。
でもなぜか、僕の愛が相手に見透かされているような気がして、一応確認してみたんです!←
そしたら、普通にインテリセンスに表示されていました。穴があったら埋まりたいです。


早速調べてみると、既知の問題のようでした。
しかし、未だに解決されていないみたい。誰もバグ報告していないのでしょうか。


さらに調べてみると、打開しているようで打開していない、少し打開している打開策を見つけました。

CompilerMessageAttributeを使って、無理やり非表示にする方法です。


[<CompilerMessage("I will give you all my love.", 12345, IsError = false, IsHidden = true)>]
member this.Love() = ()
試してみましたが、確かにインテリセンスには表示されないものの、メンバにアクセスした際に(エラー|警告)が表示されるようになってしまいます(IDE上で波線が表示されるようになる)。
第二引数はメッセージ番号ですが、10000未満の値は予約済みであるため使用できません。


現在、FsAdventJPのネタであるType Provider DSLを作っているのですが(遅くなってごめんなさい)、コンピューテーション・ビルダーのメンバ(Return, Zero, Yield など)を隠蔽しようとしてこの問題に遭遇しました。
結局だめでしたので、すべて露出します。もうこの際どんどん見てください!
ちなみにこのDSL、コードネームは"TypeProviderMagic"です(多分そのまま採用します)。
理由は、実装の大半が黒魔術だからです。数回心が折れそうになりました。

まとめ

Advent Calendarのネタは慎重に選びましょう!!!

はてなユーザのためのシンタックスハイライタ

はてなシンタックスハイライタは多くの言語をサポートしていますが、F#だけは未対応です。


少し前に FSLight というWebサービスが登場したものの、
残念ながらはてなダイアリーとはあまり相性が良くないみたい。
そんなわけで、はてなダイアリー/はてなブログに特化したシンタックスハイライタを作ってみました。*1


http://irodori.azurewebsites.net/


例えば以下のようになります:


#if INTERACTIVE
printfn "fsi"
#endif

// class
type FSharp() =
member val Property = 0 with get, set
member this.Method() = printfn "F#!F#!"

let x = maybe {
let! x = f ()
let! y = g ()
return x + y
}

let y = """
fsharp
"""


はてなスタイルシートに合わせて出力するようになっています。
今までOCamlモードで我慢していた皆さんにお使い頂けたらなと思います。
本当はもうちょっとオプション的な機能を追加する予定でしたが、一身上の都合(!)により未完成の状態でリリースすることにしました。


ちなみに、F# + ASP.NET MVC で作りました。
Enjoy F#!

*1:多分はてなブログでも大丈夫だと思います

HTMLヘルパーを自作してみる

見様見真似でHTMLヘルパーを書いてみました。
F#で書かれた例を見かけなかったので、参考までに投稿しておきます。


ひとつ注意点があります。
F#で定義する際に、型拡張ではなく拡張メソッドとして記述します。*1
System.Runtime.CompilerServices.ExtensionAttribute を付与してあげてください。
そして、関数の第一引数はHtmlHelper型であることを明示します。

namespace FsWeb.Helpers

open System
open System.Web
open System.Web.Mvc
open System.Runtime.CompilerServices

[<Extension>]
module SampleHelper =

    [<Extension; CompiledName("CodeBlock")>]
    let createCodeBlock(_:HtmlHelper, code) =
        let builder = TagBuilder("pre")
        builder.MergeAttribute("style", "border: 1px black solid;"
                                      + "background-color: #eeeeee;"
                                      + "padding: 10px;"
                                      + "font: 1.2em Consolas;")
        builder.InnerHtml <- code
        builder.ToString() |> MvcHtmlString.Create

スタイルを直に指定していますが、サンプルということで大目に見てください・・・。


ビューのほうは、こんな感じです。

@using FsWeb.Helpers
(中略)
@Html.CodeBlock("let inline (|>) x f = f x")


ブラウザでは以下のように出力されます。


おしまい。

*1:別クラスとして定義する場合はその限りではない

Markdownを処理する

Markdown形式のデータを読み込み、HTMLを出力するサンプルです。
MarkdownSharpF# Formatting を利用した例をそれぞれ以下に示します。
Markdownの文法は http://blog.2310.net/archives/6 などでご確認ください。


各ライブラリはNuGetからインストール可能です。

// F# Formatting
let transform1 str =
    FSharp.Markdown.Markdown.TransformHtml(str)

// MarkdownSharp
let transform2 str =
    MarkdownSharp.Markdown().Transform(str)


let sample = """
Markdown
--------
- one
- two
- three

> quotation...

- - -

    let a = "fsharp"
    printfn "%s" a
"""

[<EntryPoint>]
let main argv =
    transform1 sample |> printfn "%s"
    transform2 sample |> printfn "%s"
    0


このプログラムを実行すると、以下のようなHTMLが得られます。

<h2>Markdown</h2>

<ul>
<li>one</li>
<li>two</li>
<li>three</li>
</ul>

<blockquote>
  <p>quotation...</p>
</blockquote>

<hr />

<pre><code>let a = "fsharp"
printfn "%s" a
</code></pre>


どちらも同じ結果になりますが、MarkdownSharpは処理速度も考慮した実装になっているそうです。風の便りによると*1、MarkdownSharpはStack Overflowでも使われているとか。

*1:時には風に身を任せるのも いいじゃない Oh Miss yourself - innocent world, Mr.Children

F# Formattingでドキュメントを生成してみる

Tomas Petricekさんが開発されている、F# Formatting を試してみました。
GitHub : https://github.com/tpetricek/FSharp.Formatting
Documents : http://tpetricek.github.com/FSharp.Formatting/index.html


このツールはF# Snippetsでも使われていますので、F#erにはお馴染みですね。
シンタックス・ハイライトのみならず、マウスオーバーでメンバの情報まで表示される優れものです。


またこのツールは、文芸的プログラミング(Literate programming)にも対応しています。
http://tpetricek.github.com/FSharp.Formatting/demo.html
使ってみた感想ですが、とても良い感じです。
OSSの開発にはかなり便利なのではないでしょうか。
みなさんにも使ってみて頂きたいので、簡単なサンプルをご用意しました。

続きを読む