MacにElixir開発環境を構築する
MacへのElixirインストール方法とEmacsのElixir設定手順をまとめてみようと思います。
EmacsにはAlchemistという強力なElixir開発サポートツールがあるので、設定と簡単な使用方法を書きます。
(私は普段Emacsを使っているため、エディタの設定はEmacsについてのみ書きます。ご了承ください。)
Elixirのインストール
homebrewでインストールします。
$ brew install erlang $ brew install elixir
特に複数バージョンのElixirを使う要件がなければこれだけで終わりです。homebrew便利ですね。
version毎のインストール
rubyのrbenvみたいな複数バージョンのElixirを使いたい場合はexenvをinstallします。
$ brew install erlang $ brew install elixir-build $ brew install exenv
インストールできたらパスを通します。使用しているシェルに合わせて書き込むファイルを変えてください。
$ echo 'export PATH="$HOME/.exenv/bin:$PATH"' >> ~/.bash_profile $ echo 'eval "$(exenv init -)"' >> ~/.bash_profile $ exec $SHELL
パスを通したら以下のコマンドでElixirをインストールできます。
$ exenv install -l # installできるversion確認 $ exenv install 1.2.5 $ elixir -v Erlang/OTP 18 [erts-7.2.1] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace] Elixir 1.2.5
REPL
ElixirにはiexというREPLが用意されています。
このiexを使ってRubyのpryのようにデバッグをすることもできます。
以下ように対象のファイルにrequire IEx
と記述してから、ブレイクポイントを貼る場所にIEx.pry
と記述します
そしてiexを起動して対象のプログラムを実行します。pryを許可するか聞かれるので許可します。
新しく立ち上がったiex上では、ブレークポイントを張ったプログラムのコンテキストなので変数の中を確認することができます。
Editorの設定
emacsの設定方法を書きます
シンタックスハイライト
syntax-highlightはelixir modeを入れると実現できます。
M-x package-install [RET] elixir-mode [RET]
でインストールしてください。
インストールしたら.init.elに(require 'elixir-mode)
と書いてください。
自分はcaskを今だに使っているので.emacs.d/Caskファイルに(depends-on "elixir-mode")
と記述してcaskコマンドでインストールしました。
コード補完
alchemistという拡張を入れると、コード補完のほかEmacs上でREPLを起動することができます。
非常に強力なツールなので、Emacsを使っている方は是非インストールしましょう。
elixir-modeと同じようにM-x package-install [RET] alchemist [RET]
でインストールして、.emacs.d/init.elに(require 'alchemist)
と書いてください。
alchemistのコード補完はcompany-modeが使われていますが私はauto-completeを普段使っているので、alchemistでもauto-completeを使用できるようにします。
M-x package-install [RET] ac-alchemist [RET]
でインストールして、.emacs.d/init.elに(add-hook 'elixir-mode-hook 'ac-alchemist-setup)
と記述すればauto-completeが使用できるようになります。
以下のようにコード補完ができるようになります。
Emacs上でREPLを起動
alchemistを入れるとElixirのREPLをエディタ上に起動することができます。
C-c a i i
とemacs上で入力するとこのようにREPLが起動します。
現在の行をREPLで評価することもできます。C-c a i l
と入力します。
マークしているリージョンを評価するにはC-c a i b
と入力してください。
コードを書いている時に少し動作を確認したくなった時に便利な機能ですね。
この他にもたくさんコマンドが用意されています。興味のある方は以下のページを参照してください。
Alchemistのドキュメント
Phoenix開発のサポート
ElixirのWebフレームワークといえばPhoenixが有名ですが、alchemistを入れるとPhoenixプロジェクトの開発をサポートする便利なコマンドが使えるようになります。
例えば、Controllerのファイルを開く場合、C-c a n c
と入力して開くファイルを選択すると
選択したファイルがEmacs上で開かれます
ルーティングの設定を確認したい場合はC-c a n R
と入力します。
その他にもたくさんのコマンドが用意されています。
キーバインド | 内容 |
---|---|
C-c a n c | Controllersディレクトリのファイルを開く |
C-c a n m | Modelsディレクトリのファイルを開く |
C-c a n v | Viewsディレクトリのファイルを開く |
C-c a n w | Webディレクトリのファイルを開く |
C-c a n t | Templateディレクトリのファイルを開く |
C-c a n r | router.exファイルを開く |
サンプルコード
せっかく環境構築したので、プログラムを実行してみましょう。
Elixirは大量リクエストを捌くことのできる並列処理で知られている言語なので複数プロセスを使うプログラムを試します。
以下はPrograming Elixirに書いてあるサンプルコードです。
少し複雑に見えますが、やっていることは100万プロセス立ち上げて、数宇を1インクリメントしてその結果を次のプロセスに渡しインクリメントを繰り返すことを100万プロセスで実行しています。
defmodule Chain do # 各プロセスが実行する関数です、数値をインクリメントして次のプロセスに渡します def counter(next_pid) do receive do n -> send next_pid, n + 1 end end # ここで100万プロセス立ち上げます def create_processes(n) do last = Enum.reduce 1..n, self, fn (_, send_to) -> spawn(Chain, :counter, [send_to]) end # ここから開始します、初期値は0です send last, 0 # and wait for the result to come back to us receive do final_answer when is_integer(final_answer) -> "Result is #{inspect(final_answer)}" end end def run(n) do IO.puts inspect :timer.tc(Chain, :create_processes, [n]) end end
これを私のマシン(MacBookPro 3.1GHz, Core i7, 16GB RAM)で実行すると
$ elixir --erl "+P 1000000" -r chain.exs -e "Chain.run(1_000_000)" {7315073, "Result is 1000000"}
結果は7秒ちょっとですね、さすがです!
まとめ
Elixirはまだ若い言語ですが、開発者コミュニティが非常に活発です。開発環境もたくさんのツールが用意されているので簡単に開発を始められます。
興味がある方は是非Elixirを使ってみてください。