HelloWorldができたらエンジニアを名乗っていいらしい。
「HelloWorldをWeb画面上に表示できれば、もうWebエンジニアだ!!」とかなんかわけわかんないこと言っているのをどこかで見かけたので今日はそれをやっていきます。んで、今更PHPとかRubyとかPythonとか有名どころ使ってサーバー立ち上げてハロワ作ったよってやるのも誰かがやっているだろうしつまらないのでElixirでやります。
ElixirではErlang製HTTPサーバーとしてCowboyがあります。なのでサーバーにはそれを利用していきたいと思います。
Cowboy
Nine Nines: Cowboy User Guide
cowlibとranchが依存関係にあるので導入時にこれらも勝手に導入されます。どうでもいい話なんですけどイメージキャラ的なやつに謎の萌えキャラが採用されている……。ボーイなんだよね……。ついてるんだよね……。
まあ、いいや。御託をごちゃごちゃ並べてもアレですし。早速やっていきましょう。
つくるよー
はい、というわけで早速Cowboyを導入していきたいところですがまずはプロジェクトを作ります。Elixirにはmix
と呼ばれるRubyでいうBundlerとRubyGems、Rakeが組み合わさったやつがあります。つまりなんなのかよくわかんないですけど、簡易railsみたいなことができるコマンドがあるんですよ。
というわけでmix new --sup プロジェクト名
でサクッと新規プロジェクトを作ります。すると以下のような感じの構成ファイルが生成されます。
構成 | 説明 |
---|---|
config | 設定 |
lib | アプリケーション |
test | テスト |
.formatter.exs | フォーマッタ |
.gitignore | gitの公開範囲を設定するやつ |
mix.exs | 設定ファイル |
README.md | はじめによんでください |
良い感じの説明資料がなかったので雑説明です。configとmix.exsどう違うんだよとかいう突っ込みはやめてね。ちゃんと内部ファイルにアメリカ語でどうやって書いていくか説明あるから詳しくはそっちを見よう。
ということで生成しましたら早速、準備していきます。まずはmix.exsをいじります。
### 略 ### def application do [ extra_applications: [:logger, :cowboy], mod: {【プロジェクト名】.Application, []} ] end defp deps do [ {:cowboy, "~> 2.5"} ] end ### 略 ###
とりあえずCowboyを導入していくよ的なことを書いていきます。
次にメインとなるapplication.exをいじっていきます。
defmodule 【プロジェクト名】.Application do use Application def start(_type, _args) do import Supervisor.Spec, warn: false children = [ worker(__MODULE__, [], function: :run) ] opts = [strategy: :one_for_one, name: 【プロジェクト名】.Supervisor] Supervisor.start_link(children, opts) end def run do routes = [ {"/", 【プロジェクト名】.Handler, []} ] dispatch = :cowboy_router.compile([{:_, routes}]) opts = [{:port, 4000}] env = %{dispatch: dispatch} {:ok, _pid} = :cowboy.start_clear(:http, opts, %{env: env}) end end
そんでHandlerを作ってしまったのでhandler.exファイルも作りこみます。ただ文字列を埋め込んでもアレですし、以前作った月曜判定機を埋め込みます。
defmodule 【プロジェクト名】.Handler do def init(req, opts) do now_date = :calendar.local_time date = Date.from_erl!(elem(now_date,0)) text = if Date.day_of_week(date) === 1, do: "Today is Monday<br>GAME OVER", else: "Not Monday" headers = %{"content-type" => "text/html"} body = "<h1>#{text}</h1>" resp = :cowboy_req.reply(200, headers, body, req) {:ok, resp, opts} end end
準備ができたのでmix deps.get
でmixに書いた設定を流し込みます。そんでmix compile
でコンパイルして完成。ちなみにCowboyとかのバージョンはこんな感じになってます。
cowboy 2.5.0 cowlib 2.6.0 ranch 1.6.2
完成といいつつ、サーバ準備がまだでしたね。mix run --no-halt
で動かすことにします。iex -S mix
を使うって資料もあったんですけど、ウチのPowerShell勝手にエイリアスつかっててiexコマンド叩くと誤爆するんでそっち使います。
んで localhost:4000 に移ると下みたいな感じでWeb上に表示できました。
はい、これで僕もエンジニア~(笑)。ハロワ表示できたのでエンジニアです(笑)。
まあ。そんなわけで今日月曜なんですわ。今週も僕と地獄に付き合ってもらう。