Ruby on Railsも知らないが、、、せっかくElixirを入れたのでWebフレームワークPhoenixに触ってみる。
インストールガイドまで
まずはPhoenixのインストールしたい。のだが、その説明まで到達するのが長かった。いろいろ引っ掻き回されるが、結局以下のようにするとたどり着ける。
github
を見る、
Getting started
See the official site at http://www.phoenixframework.org/
というので
にいく、どこにもGetting startedは見当たらない。。が、とりあえず真ん中
をポチ。すると(まだインストール前なのに)、プロジェクトの初めから(up-and-running)から説明が始まる。
プロジェクトの開始前に、まずはインストール!。したいので、左上のリンクInstallationを押すと、ハイ。やっとインストールガイドに到着!
インストール
以下のようにすれば、webというプロジェクト名で、ウェブサーバ環境がインストールされる。mix --help
と打つと、コマンド名が表示される。
mix local.hex
mix phoenix.new web --no-brunch --no-ecto
なお後述のチュートリアルではHelloPhoenixという名前のプロジェクト(モジュール名)が期待されている。チュートリアルをやるつもりなら、プロジェクト作成時に名前をwebとせず以下のようにhello_phoenixとしてmixを実行した方が良い。
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)。
%{"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)
以下に良いチュートリアルがあるので、これに沿ってページを追加してみる。
上記の通りやると、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の売りらしい。
ちなみに、ルータの定義はこんな感じ、
scope "/", Web do
pipe_through :browser # Use the default browser stack
get "/", PageController, :index
get "/hello", HelloController, :index
end
備考:iexで動かしておいて、
:observer.start
その後
読み直してみると、インストールが分からんと、ボヤいているだけだったので、もう少しだけやってみる。
を参考にマークダウンを試してみる。コードをハイライトするhighlight.js(https://highlightjs.org)
なんてあるんだ。勉強になる。
次、
を参考に、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