Upload
hayabusa333
View
2.369
Download
0
Embed Size (px)
Citation preview
ElixirでCowboyを 使ってみる
自己紹介名前:橘田 隼一 TwitterID:hayabusa333 興味:カーネル、GC、Erlang、Elixir お仕事:派遣ウェッブプログラマ 所属:Joel教、翔鶴瑞鶴仲良し姉妹同盟
やっていること・ElixirChanges - Elixirの日々の変更点まとめ ・PhoenixChanges - Phoenixの日々の変更点まとめ ・週刊Elixirライブラリ - Elixirのライブラリの紹介 ・CowboyのUserGuideの翻訳 - Coboyのことはじめ記事翻訳
Cowboyとは・Erlangで書かれた高速なモジュラー形式のHTTPサーバ ・HTTP1.1/Websocke 対応 ・ErlangVMで動かすHTTPサーバだとCowboyが一強 ・Plugを使えば、もっと簡単にできるけど、今日は直接さわるよー
Cowboyで静的ページを表示
http://d.hatena.ne.jp/hayabusa333/20150813/cowboy_elixir_static_pages
新規プロジェクトを作成$ mix new static_hello_world ̶sup
# mix new Elixirの新規プロジェクトを作成します # ̶sup をつけることによって supervision treeを含んだOTPアプリケーションで作成されます # 通常のmix newではsupervisorがない状態なので注意が必要です
mix.exsを記載def application do [applications: [:logger, :cowboy, :ranch], mod: {StaticHelloWorld, []}] end # mod: {StaticHelloWorld, []} にてアプリケーションのコールバックモジュールとして指定してます # StaticHelloWorldはsupervison treeとして起動します
defp deps do [{ :cowboy, "1.0.0" }] end
supervisor.exを記載defmodule StaticHelloWorld.Supervisor do use Supervisor # supervisiorモジュールを起動するため def start_link(_) do {:ok, sup} = Supervisor.start_link(__MODULE__, [], name: :supervisor) end # supervisorモジュールを起動する際に init/1 を渡す必要がある def init(_) do processes = [] # one_for_oneは自分自身がダメになったら他人に影響されず # 自分自身を再起動するという戦略です。 {:ok, {{:one_for_one, 10, 10}, processes}} end end
static_hello_world.exを記載defmodule StaticHelloWorld do def start(_type, _args) do dispatch = :cowboy_router.compile([ { :_, [ # http://localhost:8080/ でアクセスされた場合はstatic_hello_world を使うと指定 {"/", :cowboy_static, {:priv_file, :static_hello_world, “index.html"}} ] } ]) # http通信にて使用する起動環境を設定します { :ok, _ } = :cowboy.start_http(:http, 100, [{:port, 8080}], [{ :env, [{:dispatch, dispatch}]}]) end end
priv/index.html を記載
適当に静的ページを記載
Cowboyを起動
$ mix deps.get $ mix run --no-halt
デモ
Cowboyで動的ページを表示
新規プロジェクト作成から supervisor.exを記載までは ほぼ同じなためカット
dynamic_hello_world.exを記載defmodule DynamicHelloWorld do def start(_type, _args) do dispatch = :cowboy_router.compile([ { :_, [ {"/", DynamicPageHandler, []} ]} ]) { :ok, _ } = :cowboy.start_http(:http, 100, [{:port, 8080}], [{ :env, [{:dispatch, dispatch}]}] )
end end
dynamic_page_handler.exを記載defmodule DynamicPageHandler do def init(_type, req, []) do {:ok, req, :no_state} end
def handle(request, state) do # Http通信にて返信する内容を自作する dynamic = “Dynamic" { :ok, reply } = :cowboy_req.reply( 200, [{"content-type", "text/html"}], "#{dynamic} Hello World", request) {:ok, reply, state} end
def terminate(reason, request, state) do :ok end end
デモ
ソースコード
https://github.com/hayabusa333/cowboy-elixir-example
今後・動的ページを表示する方法をまとめる ・COOKIE情報を送信する方法を記載 ・WebSocket通信を行う方法を記載 ・HTTP2に対応したら記事を記載
ご静聴ありがとうございました