Phoenixをやってみる

Ruby on Railsも知らないが、、、せっかくElixirを入れたのでWebフレームワークPhoenixに触ってみる。

# インストールガイドまで

まずはPhoenixのインストールしたい。のだが、その説明まで到達するのが長かった。いろいろ引っ掻き回されるが、結局以下のようにするとたどり着ける。

github

> https://github.com/phoenixframework/phoenix

を見る、

> Getting started
> See the official site at http://www.phoenixframework.org/

というので

> http://www.phoenixframework.org/

にいく、どこにもGetting startedは見当たらない。。が、とりあえず真ん中![phoenix_button.png](https://qiita-image-store.s3.amazonaws.com/0/93734/e984ecbe-6522-6e07-7b2b-3484b3b7fc63.png)
をポチ。すると（まだインストール前なのに）、プロジェクトの初めから（up-and-running）から説明が始まる。

> http://www.phoenixframework.org/docs/up-and-running

プロジェクトの開始前に、まずはインストール！。したいので、左上のリンクInstallationを押すと、ハイ。やっとインストールガイドに到着！

> http://www.phoenixframework.org/docs/installation

# インストール

以下のようにすれば、webというプロジェクト名で、ウェブサーバ環境がインストールされる。`mix --help`と打つと、コマンド名が表示される。

```bash:terminal
mix local.hex
mix phoenix.new web --no-brunch --no-ecto
```

なお後述のチュートリアルではHelloPhoenixという名前のプロジェクト（モジュール名）が期待されている。チュートリアルをやるつもりなら、プロジェクト作成時に名前をwebとせず以下のようにhello_phoenixとしてmixを実行した方が良い。

```bash:terminal
mix phoenix.new hello_phoenix --no-brunch --no-ecto
```

注意：Elixirではsnake name（例えばxxx_yyy）でプロジェクトを作るのが普通らしい（`mix new xxx_yyy`、phoenixではmix phoenix.new xxx_yyy）。フォルダ名などはsnake nameで作られ、モジュル名などは対応するCamelName(ここではXxxYyy)になる。

以下で実行(elixirでは、mixというコマンドがインストールとビルド、実行、テストを管理する。npm, bundlerなどを混ぜたようなもの)

```
cd web
iex -S mix phoenix.server # or mix phoenix.server
```

phoenixは**最小限の依存関係**を目指しているようである。昔に比べて依存ファイルが大幅に減っているらしい。説明ページには、ectoやらpostgresqlが必要なことが書いてるが、そんなものは入れてないのに普通に動く（注、--no-brunch --no-ectoオプションを追加したときだけ不要でした。普通にmix phoenix.new hello_phoenixするとDBが必要と怒られます。なお、postgresqlの代わりにmysqlを使う場合は、mixの際、--database mysqlのオプションが必要）。以下は依存関係のあるライブラリの控え（mix.lock）。

```mix.lock
%{"cowboy": {:hex, :cowboy, "1.0.4", "a324a8df9f2316c833a470d918aaf73ae894278b8aa6226ce7a9bf699388f878", [:rebar, :make], [{:cowlib, "~> 1.0.0", [hex: :cowlib, optional: false]}, {:ranch, "~> 1.0", [hex: :ranch, optional: false]}]},
  "cowlib": {:hex, :cowlib, "1.0.2", "9d769a1d062c9c3ac753096f868ca121e2730b9a377de23dec0f7e08b1df84ee", [:make], []},
  "fs": {:hex, :fs, "0.9.2", "ed17036c26c3f70ac49781ed9220a50c36775c6ca2cf8182d123b6566e49ec59", [:rebar], []},
  "gettext": {:hex, :gettext, "0.11.0", "80c1dd42d270482418fa158ec5ba073d2980e3718bacad86f3d4ad71d5667679", [:mix], []},
  "mime": {:hex, :mime, "1.0.1", "05c393850524767d13a53627df71beeebb016205eb43bfbd92d14d24ec7a1b51", [:mix], []},
  "phoenix": {:hex, :phoenix, "1.2.1", "6dc592249ab73c67575769765b66ad164ad25d83defa3492dc6ae269bd2a68ab", [:mix], [{:cowboy, "~> 1.0", [hex: :cowboy, optional: true]}, {:phoenix_pubsub, "~> 1.0", [hex: :phoenix_pubsub, optional: false]}, {:plug, "~> 1.1", [hex: :plug, optional: false]}, {:poison, "~> 1.5 or ~> 2.0", [hex: :poison, optional: false]}]},
  "phoenix_html": {:hex, :phoenix_html, "2.6.2", "944a5e581b0d899e4f4c838a69503ebd05300fe35ba228a74439e6253e10e0c0", [:mix], [{:plug, "~> 1.0", [hex: :plug, optional: false]}]},
  "phoenix_live_reload": {:hex, :phoenix_live_reload, "1.0.5", "829218c4152ba1e9848e2bf8e161fcde6b4ec679a516259442561d21fde68d0b", [:mix], [{:fs, "~> 0.9.1", [hex: :fs, optional: false]}, {:phoenix, "~> 1.0 or ~> 1.2-rc", [hex: :phoenix, optional: false]}]},
  "phoenix_pubsub": {:hex, :phoenix_pubsub, "1.0.0", "c31af4be22afeeebfaf246592778c8c840e5a1ddc7ca87610c41ccfb160c2c57", [:mix], []},
  "plug": {:hex, :plug, "1.2.0", "496bef96634a49d7803ab2671482f0c5ce9ce0b7b9bc25bc0ae8e09859dd2004", [:mix], [{:cowboy, "~> 1.0", [hex: :cowboy, optional: true]}, {:mime, "~> 1.0", [hex: :mime, optional: false]}]},
  "poison": {:hex, :poison, "2.2.0", "4763b69a8a77bd77d26f477d196428b741261a761257ff1cf92753a0d4d24a63", [:mix], []},
  "ranch": {:hex, :ranch, "1.2.1", "a6fb992c10f2187b46ffd17ce398ddf8a54f691b81768f9ef5f461ea7e28c762", [:make], []}}
```


# ウェブページ拡張（Adding Pages）

以下に良いチュートリアルがあるので、これに沿ってページを追加してみる。

> http://www.phoenixframework.org/docs/adding-pages

上記の通りやると、HelloPhoenixがない！、とコンパイルエラーになるので、プロジェクト名（HelloPhoenix）は適当なもの（ここではWeb）に置き換えること。

**驚いたのは**、router.exなどを書き換えて、localhost:4000にアクセスすると**自動で再ビルドされて表示される**点である。ウェブフレームワークとはそういうもの、かもしれないが、停止することなくコンパイルまでして動的ページを追加できる、というのは面白い（が少しでも間違っていると、ビルドエラー等がユーザに表示される。実環境でhot reloadをするのはそうは簡単ではないだろう）。チュートリアルを見ても*We didn't need to stop and re-start the server while we made these changes. Yes, Phoenix has hot code reloading!*と言っている。この点は、Phoenixの売りらしい。

ちなみに、ルータの定義はこんな感じ、

```router.ex
 scope "/", Web do
    pipe_through :browser # Use the default browser stack

    get "/", PageController, :index
    get "/hello", HelloController, :index
 end
```

備考：iexで動かしておいて、

```iex:iex
:observer.start
```

とすると楽しいものが表示される。
![phoenix_observer.png](https://qiita-image-store.s3.amazonaws.com/0/93734/4bcc52eb-b8b8-7230-9540-92846dd41348.png)

# その後

読み直してみると、インストールが分からんと、ボヤいているだけだったので、もう少しだけやってみる。

> http://qiita.com/darui_kara/items/6c87486a070492f46bf0

を参考にマークダウンを試してみる。コードをハイライトするhighlight.js（https://highlightjs.org）
なんてあるんだ。勉強になる。

次、

> http://qiita.com/mserizawa/items/32c6ff17a7cdd51b1975

を参考に、oauth2での認証（ここではgithubの認証を利用）をやってみる。phoenixやoauth2モジュールのバージョンが上がっているためか、いろいろやってみたが動かず（Githubページでのログインまでは行くのだが、callback以降でこけてしまう。コードを直してはブラウザのキャッシュをクリアして接続しなおし、を繰り返したがやはりダメ）。が、oauth2自体やったことがなかったので勉強になった。

# 最後に

* crystalをやった後だったので、crystalの方が速くて簡潔だろう！。と思ったが、elixirもコミュニティーが広がっており実績では先行している。フィボナッチ数などのベンチマークは振るわないが、ウェブサイトやデータベースアクセス(ecto)などは、以下のYoutubeページを見る限りすごい処理能力らしい（注：時間がないので全部は見てない）。

* 所感として、2005-2015の10年はRuby、Python、Javaの時代だったが、2015-2025は次の言語の時代になる！ような。＞Ruby, Pythonのファンの方、もちろん言語は消えないし、遺産は次に活かされるので悪しからず。

https://www.youtube.com/watch?v=MD3P7Qan3pw
![phoenix2.png](https://qiita-image-store.s3.amazonaws.com/0/93734/04e42e00-f38c-2363-cd08-ba2422d9b07f.png)


https://www.youtube.com/watch?v=OxhTQdcieQE
![phoenix3.png](https://qiita-image-store.s3.amazonaws.com/0/93734/9ec0cbf0-159c-60e8-21a8-32e5a4efccc8.png)

https://www.youtube.com/watch?v=_wD25uHx_Sw
![phoenix4.png](https://qiita-image-store.s3.amazonaws.com/0/93734/aacf7f50-8430-5f2e-79fc-519a7e00309d.png)