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

# はじめに
ElixirにてCowboyを直接動かすサンプルコードの日本語の記事が見つからなかったので、記載していけるだけ記載していこうと思い記事をあげました。
今回は最初のサンプルなのでCowboyにて hello Cowboy を表示していきます。
Cowboy 2.0.0-pre4 のサンプルに関しては、[こちら](http://qiita.com/hayabusa333/items/f5a1ab7a2121579ead25)になります。

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

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

|  | Version |
|:-----------|--------:|
| Elixir | 1.3.2 |
| Erlang | 19.2 |
| Cowboy | 1.0.4 |

# プロジェクト作成

まずは、今回作成するプロジェクトの作成を行います。
今回はスーパーバイザの設定も行うため `--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, "~> 1.0.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, []}
    ]

    dispatch = :cowboy_router.compile([{:_, routes}])

    # http アクセスする箇所の記載
    opts = [port: 4000]
    env = [dispatch: dispatch]

    {:ok, _pid} = :cowboy.start_http(:http, 100, opts, [env: env])
  end
end
```

最後に `routes` にて `ElixirCowboyExample.Handler` の記載を行っていますので、Handlerの記載を行っていきます。
Handlerでは実際にアクセスが行われた際に、どのような応答を行うかの記載を行っていきます。

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

  def handle(req, state) do
    {:ok, req, state}
  end

  def terminate(_reason, _req, _state) do
    :ok
  end
end
```

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

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

``` cmd
$ mix deps.get
Running dependency resolution...
Dependency resolution completed:
  cowboy 1.0.4
  cowlib 1.0.2
  ranch 1.2.1
* Getting cowboy (Hex package)
  Checking package (https://repo.hex.pm/tarballs/cowboy-1.0.4.tar)
  Using locally cached package
* Getting cowlib (Hex package)
  Checking package (https://repo.hex.pm/tarballs/cowlib-1.0.2.tar)
  Using locally cached package
* Getting ranch (Hex package)
  Checking package (https://repo.hex.pm/tarballs/ranch-1.2.1.tar)
  Using locally cached package


$ 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_server.erl
Compiled src/ranch_protocol.erl
Compiled src/ranch_listener_sup.erl
Compiled src/ranch_tcp.erl
Compiled src/ranch_ssl.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_spdy.erl
Compiled src/cow_qs.erl
src/cow_multipart.erl:392: Warning: crypto:rand_bytes/1 is deprecated and will be removed in a future release; use crypto:strong_rand_bytes/1
Compiled src/cow_multipart.erl
Compiled src/cow_http_te.erl
Compiled src/cow_http_hd.erl
Compiled src/cow_date.erl
Compiled src/cow_http.erl
Compiled src/cow_cookie.erl
Compiled src/cow_mimetypes.erl
==> cowboy (compile)
Compiled src/cowboy_middleware.erl
Compiled src/cowboy_sub_protocol.erl
Compiled src/cowboy_sup.erl
Compiled src/cowboy_websocket_handler.erl
Compiled src/cowboy_static.erl
Compiled src/cowboy_router.erl
Compiled src/cowboy_spdy.erl
Compiled src/cowboy_websocket.erl
Compiled src/cowboy_protocol.erl
Compiled src/cowboy_rest.erl
Compiled src/cowboy_loop_handler.erl
Compiled src/cowboy_http_handler.erl
Compiled src/cowboy_handler.erl
Compiled src/cowboy_clock.erl
Compiled src/cowboy_bstr.erl
Compiled src/cowboy_app.erl
Compiled src/cowboy.erl
Compiled src/cowboy_http.erl
Compiled src/cowboy_req.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">

# 最後に
いかがだったでしょうか？
っと言っても、単純に `body` に設定した `Hello Cowboy!` を表示しているだけですので、それほど難しくはなかったのではないでしょうか。
次回からはもう少し進んだ内容を記載していきたいと思いますのでよろしくお願いいたします。

# 参考サイト
[Cowboy User Guide](https://ninenines.eu/docs/en/cowboy/1.0/guide/)
[Cowboy Tutorial Part 2: Creating Flat File Blog](http://www.elixirdose.com/post/elixirdose_flatfileblog)