LoginSignup
3
3

More than 5 years have passed since last update.

Phoenixをやってみる

Last updated at Posted at 2016-09-20

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
をポチ。すると(まだインストール前なのに)、プロジェクトの初めから(up-and-running)から説明が始まる。

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

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

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

インストール

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

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

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

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
:observer.start

とすると楽しいものが表示される。
phoenix_observer.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://www.youtube.com/watch?v=OxhTQdcieQE
phoenix3.png

https://www.youtube.com/watch?v=_wD25uHx_Sw
phoenix4.png

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3