コミュ障だから明日が僕らをよんだって返事もろくにしなかった

何かを創る人に憧れたからブログをはじめたんだと思うよ

エリクシル月曜日 カウボーイ編

HelloWorldができたらエンジニアを名乗っていいらしい。

「HelloWorldをWeb画面上に表示できれば、もうWebエンジニアだ!!」とかなんかわけわかんないこと言っているのをどこかで見かけたので今日はそれをやっていきます。んで、今更PHPとかRubyとかPythonとか有名どころ使ってサーバー立ち上げてハロワ作ったよってやるのも誰かがやっているだろうしつまらないのでElixirでやります。

ElixirではErlang製HTTPサーバーとしてCowboyがあります。なのでサーバーにはそれを利用していきたいと思います。

Cowboy
Nine Nines: Cowboy User Guide
cowlibとranchが依存関係にあるので導入時にこれらも勝手に導入されます。どうでもいい話なんですけどイメージキャラ的なやつに謎の萌えキャラが採用されている……。ボーイなんだよね……。ついてるんだよね……。
f:id:andron:20181113000130p:plain


まあ、いいや。御託をごちゃごちゃ並べてもアレですし。早速やっていきましょう。

つくるよー

はい、というわけで早速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上に表示できました。
f:id:andron:20181113010019p:plain

はい、これで僕もエンジニア~(笑)。ハロワ表示できたのでエンジニアです(笑)。



まあ。そんなわけで今日月曜なんですわ。今週も僕と地獄に付き合ってもらう。