ElixirからCowboy 2.0を使ってみる Part 1

# はじめに
ElixirにてCowboyの1.0.4を動かすサンプルコードの記事を[こちら](http://qiita.com/hayabusa333/items/17be5e95510141f52c47)に記載しましたが、こちらの記事ではCowboy 2.0.0-pre4 にて動かすさいのサンプルになります。

[サンプルコードはこちらになります](https://github.com/hayabusa333/elixir_cowboy_example/tree/static_page_cowboy_two_pre4)

# バージョン
使用した言語やライブラリのバージョンは下記となります。

|  | Version |
|:-----------|--------:|
| Elixir | 1.3.2 |
| Erlang | 19.2 |
| Cowboy | 2.0.0-pre4 |

# プロジェクト作成

まずは、今回作成するプロジェクトの作成を行います。
今回はスーパーバイザの設定も行うため `--sup`のオプションをつけてプロジェクトの作成を行います。

``` cmd
$ mix new elixir_cowboy_example --sup
```

# コード
`mix new`にてプロジェクトの作成が終わりましたら移動して、コードの記述を行っていきます。
まずは、 `mix.exs`に今回使用する cowboy のバージョンと cowboy をアプリケーションで使用するむねの記載を追加します。

``` elixir:mix.exs
  def application do
    [applications: [:logger, :cowboy],
     mod: {ElixirCowboyExample, []}]
  end

  defp deps do
    [
      {:cowboy, git: "https://github.com/ninenines/cowboy.git", tag: "2.0.0-pre.4"}
    ]
  end
```

それでは続きましてメインの処理を記載していきましょう
`elixir_cowboy_example.ex` にはスーパーバイザの設定とアクセスするURLなどの設定を行っていきます。

``` elixir:lib/elixir_cowboy_example.ex
defmodule ElixirCowboyExample do
  use Application

  def start(_type, _args) do
    import Supervisor.Spec, warn: false

    # スーパーバイザの設定
    children = [
      worker(__MODULE__, [], function: :run)
    ]

    opts = [strategy: :one_for_one, name: ElixirCowboyExample.Supervisor]
    Supervisor.start_link(children, opts)
  end

  def run do
    # ルーティングの設定
    routes = [
      {"/", ElixirCowboyExample.Handler, []}
    ]

    # http アクセスする箇所の記載
    dispatch = :cowboy_router.compile([{:_, routes}])

    # opts と env の設定が cowboy1.0.4とは違っています
    opts = [{:port, 4000}]
    env = %{dispatch: dispatch}

    {:ok, _pid} = :cowboy.start_clear(:http, 100, opts, %{env: env})
  end
end
```

最後に `routes` にて `ElixirCowboyExample.Handler` の記載を行っていますので、Handlerの記載を行っていきます。
Handlerでは実際にアクセスが行われた際に、どのような応答を行うかの記載を行っていきます。
`init` ですが `cowboy 1.0.4` では、`init/3` で定義するようになっていましたが、 `cowboy 2.0` では、`init/2` となったようです。
[Cowboy 2.0.0 に向けて](http://qiita.com/voluntas/items/e0559c56bf8926ccc2a0#init3-%E3%81%8C-init2-%E3%81%B8%E3%81%9D%E3%81%97%E3%81%A6-terminate-%E3%81%AF%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%B8)

``` elixir:lib/elixir_cowboy_example/handler.ex
defmodule ElixirCowboyExample.Handler do
  def init(req, opts) do
    headers = %{"content-type" => "text/plain"}
    body = "Hello Cowboy!"
    {:ok, resp} = :cowboy_req.reply(200, headers, body, req)
    {:ok, resp, opts}
  end
end
```

コードの記述に関しましては、上記で以上となります。

# 実行
さて、それでは実行していきましょう。
まずは `mix deps.get` にて cowboyのダウンロードを行います。
その後に `iex -S mix` で起動を行います。

``` cmd
$ mix deps.get
* Getting cowboy (https://github.com/ninenines/cowboy.git)
Cloning into '/elixir_cowboy_example/deps/cowboy'...
remote: Counting objects: 9017, done.        
remote: Compressing objects: 100% (24/24), done.        
remote: Total 9017 (delta 7), reused 0 (delta 0), pack-reused 8992        
Receiving objects: 100% (9017/9017), 5.19 MiB | 886.00 KiB/s, done.
Resolving deltas: 100% (5850/5850), done.
Checking connectivity... done.
* Getting cowlib (https://github.com/ninenines/cowlib)
Cloning into '/elixir_cowboy_example/deps/cowlib'...
remote: Counting objects: 915, done.        
remote: Total 915 (delta 0), reused 0 (delta 0), pack-reused 915        
Receiving objects: 100% (915/915), 455.51 KiB | 206.00 KiB/s, done.
Resolving deltas: 100% (599/599), done.
Checking connectivity... done.
* Getting ranch (https://github.com/ninenines/ranch)
Cloning into '/elixir_cowboy_example/deps/ranch'...
remote: Counting objects: 1434, done.        
remote: Total 1434 (delta 0), reused 0 (delta 0), pack-reused 1434        
Receiving objects: 100% (1434/1434), 493.51 KiB | 316.00 KiB/s, done.
Resolving deltas: 100% (890/890), done.
Checking connectivity... done.

$ iex -S mix
Erlang/OTP 19 [erts-8.2] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]

==> ranch (compile)
Compiled src/ranch_transport.erl
Compiled src/ranch_sup.erl
Compiled src/ranch_ssl.erl
Compiled src/ranch_tcp.erl
Compiled src/ranch_server.erl
Compiled src/ranch_protocol.erl
Compiled src/ranch_listener_sup.erl
Compiled src/ranch_app.erl
Compiled src/ranch_acceptors_sup.erl
Compiled src/ranch_acceptor.erl
Compiled src/ranch_conns_sup.erl
Compiled src/ranch.erl
==> cowlib (compile)
Compiled src/cow_uri.erl
Compiled src/cow_spdy.erl
Compiled src/cow_ws.erl
Compiled src/cow_qs.erl
Compiled src/cow_http_te.erl
Compiled src/cow_multipart.erl
Compiled src/cow_http2.erl
Compiled src/cow_http.erl
Compiled src/cow_mimetypes.erl
Compiled src/cow_date.erl
Compiled src/cow_hpack.erl
Compiled src/cow_cookie.erl
Compiled src/cow_http_hd.erl
==> cowboy (compile)
Compiled src/cowboy_middleware.erl
Compiled src/cowboy_sub_protocol.erl
Compiled src/cowboy_sup.erl
Compiled src/cowboy_tls.erl
Compiled src/cowboy_stream.erl
Compiled src/cowboy_stream_h.erl
Compiled src/cowboy_static.erl
Compiled src/cowboy_websocket.erl
Compiled src/cowboy_router.erl
Compiled src/cowboy_loop.erl
Compiled src/cowboy_req.erl
Compiled src/cowboy_http2.erl
Compiled src/cowboy_rest.erl
Compiled src/cowboy_constraints.erl
Compiled src/cowboy_handler.erl
Compiled src/cowboy_clear.erl
Compiled src/cowboy_bstr.erl
Compiled src/cowboy_clock.erl
Compiled src/cowboy_app.erl
Compiled src/cowboy.erl
Compiled src/cowboy_http.erl
Compiling 2 files (.ex)
Generated elixir_cowboy_example app
Interactive Elixir (1.3.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> 

```

さて起動が完了しましたら、ブラウザからアクセスしてみましょう
`http://localhost:4000`にブラウザからアクセスし、`Hello Cowboy!`と表示されれば成功です。

<img width="1265" alt="スクリーンショット 2017-01-06 10.30.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/3014/9ccbf3e2-3b96-0f6e-83ea-5e3fc3134133.png">

# 最後に
いかがだったでしょうか？
cowboy2.0でも、単純なbodyの内容を出すだけならば、それほどコードの変更はなく記載できているようです。
それではCowboy1.0の方と合わせて、次回はもう少し進んだ内容を記載したいと思いますので、よろしくお願いいたします。

# 参考サイト
[Cowboy User Guide](https://ninenines.eu/docs/en/cowboy/2.0/guide/)
[Cowboy 2.0.0 に向けて](http://qiita.com/voluntas/items/e0559c56bf8926ccc2a0)