LinuxでOWINアプリケーションを動かす(Debian/F#編)

# 環境

* Debian 8.1
* .NET Framework 4.6
* Visual Studio 2015 RC
* ~~Visual Studio 2013~~

# F#でOWINアプリケーションを作成する

[ソースはここに置いてあります。](https://github.com/hikitest/fsharp-owin-sample)

#### 1. プロジェクト作成
~~[Visual Studio 2015のバグでF#のテンプレートが壊滅している](https://github.com/Microsoft/visualfsharp/issues/411)ので、プロジェクト新規作成だけはVisual Studio 2013で行います。~~
正式版で修正されました。

プロジェクト新規作成ウィザードからF#のコンソール アプリケーションを作成しましょう。
![](http://i.gyazo.com/4ce7b6f75c77f4e73fa7a90f49a38c18.png)

~~作成したプロジェクトをVisual Studio 2015で開き直します。
(新しいのが使いたかっただけなので、2013のまま進めても何も問題ありません)~~

#### 2. 参照の追加
下記のDLLが必要なので、それぞれNuGetから取得します。

* Microsoft.Owin
* Microsoft.Owin.Host.HttpListener
* Microsoft.Owin.Hosting
* Owin

めんどくさいですが、下記のようにパッケージ マネージャー コンソールで一つずつコマンドを叩きます。
(yumとかapt-getみたいに複数まとめてできないのでしょうか・・)
`PM> Install-Package Owin`
![](http://i.gyazo.com/93493b718d3c0ab3c5319859028c1dba.png)

#### 3. ソース作成
F#でOWINアプリケーションを作成する場合、最低限`Program.fs`と`Startup.fs`の2つのファイルが必要です。
なお、`Program.fs`は一番下に配置してください(`Alt`+カーソル上下で動かせます)。
![](http://i.gyazo.com/6da66003af7efa4fc3dfdeb4a170bf17.png)

```fsharp:Program.fs
open System
open Microsoft.Owin.Hosting
open Startup

[<EntryPoint>]
let main _ =
    let baseAddress = "http://*:9000"
    use app = WebApp.Start<Startup>(baseAddress)

    Console.WriteLine("Listening at {0}", baseAddress)
    Console.WriteLine("Press any key to stop")

    Console.ReadLine() |> ignore

    0
```

```fsharp:Startup.fs
module Startup

open System
open global.Owin

    type Startup() =
    
        member this.Configuration(app:IAppBuilder) =

            let os = "<h1>OWIN on " + Environment.OSVersion.ToString() + "</h1>"
            app.Run(fun c -> c.Response.WriteAsync(os))
```

ひとまずローカルで起動してみます。
bin/Debug(Release)の下にexeが生成されているので管理者で実行します。
(baseAddressの所で`*`を指定していると、実行にAdmin権限が必要となります)
![](http://i.gyazo.com/a94fd41ada903faa88de0d11117d896d.png)

ブラウザでhttp://localhost:9000 にアクセスすると、めでたく表示されました。
![](http://i.gyazo.com/d10cf36570bb0abcaeac7d071d1b6128.png)

# サーバー(Debian)にMonoをインストール

http://www.mono-project.com/docs/getting-started/install/linux/
上記の手順に従ってMonoをインストールします。

```sh
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
$ echo "deb http://download.mono-project.com/repo/debian wheezy main" | sudo tee /etc/apt/sources.list.d/mono-xamarin.list
# Debianの場合はこれも必要
$ echo "deb http://download.mono-project.com/repo/debian wheezy-libjpeg62-compat main" | sudo tee -a /etc/apt/sources.list.d/mono-xamarin.list
$ sudo apt-get update
$ sudo apt-get -y install mono-devel
```
インストールできました。

```sh
$ mono -V
Mono JIT compiler version 4.0.2 (Stable 4.0.2.5/c99aa0c Wed Jun 24 10:04:37 UTC 2015)
```

# アプリケーションを起動

Monoがインストールできれば、あとは作成したexeをサーバーに置いてコマンドを叩くだけです。
bin/Debug(Release)フォルダの中身一式をアップロードします。
![](http://i.gyazo.com/354f14e5db07378fc385c9945c4c04db.png)

exeを実行します。

```sh
$ mono fsharp_owin_sample.exe
```

ブラウザで表示できれば成功です。
![](http://i.gyazo.com/d2f6f9b09713703c17e8713aeb49ee63.png)

# 参考資料

[Running ASP.NET on a Raspberry Pi with Mono and OWIN](http://j.tlns.be/2014/11/21/running-asp-net-on-a-raspberry-pi-with-mono-and-owin/)
[swlaschin/Railway-Oriented-Programming-Example](https://github.com/swlaschin/Railway-Oriented-Programming-Example)