Edited at

【環境構築】ゼロから始めるElixir on Phoenix (2019)


記事作成の動機(つぶやき)

※スルー可


  • バージョンアップで日本語記事の約半分は古い情報になった件

  • 札幌でElixirコミュニティとかできないかなぁ。面白いことができればそれがベスト→Sapporo.BEAMありました!

  • 今月終わったら新卒じゃなくなるし、なんかやっておきたかった感



用語解説




※スルー可

※筆者はLaravelとSpringしかさわったことありません。

用語
読み方
分類
解説

Erlang
アーラン
PL
並列処理に特化。関数型プログラミング言語

Elixir
エリクサー
PL
ErlangをRubyライクにした言語

Phoenix
フェニックス
FW
Railsライクなフレームワーク

PostgreSQL
ポストグレスキューエル
DB
Phoenixがデフォルトで指定しているデータベース

BEAM
ビーム
VM
ErlangとElixirが動作する仮想マシンの実行環境



環境構築 (※Ubuntu向け)




環境構築は神スライドみながらやってます。

生憎、ローカルLinux汚染されすぎてアルテマウェポン(Docker-Compose)すら死ぬ筆者は

Coderです。昔のCloud9みたいに使えますし、VSCode好きですが、同じ環境なら下記注意!ファイルに文字が打てなくなるバグがある。ファイルを開き直すと治る。コマンドが打てなくなったりしたらF5で画面再読込(こまめにCtrl + Sしましょう)。Ctrl + Cとかそのままつかえない(Ctrl + Shift + C)。TerminalからNew Terminalを押下して準備完了!




いろいろすみません

CoderでやったらCowboy(仮想サーバー)上の実行結果を確認できませんでした。新しいことに挑戦すれば挫折することもありますね。旧アカウント持っているのでCloud9この記事を自分で読んで環境構築しました。当然AWS Cloud9でも同じことができます。

いよいよ、環境構築に入ります。コマンド連打になりますが、Y/N聞かれたら、全てYにしましょう。


Elixirの用意

# これがないとインストールに失敗することがあるらしいので

# (参照:https://qiita.com/kirishima677/items/82198a304d121d201cc2)
sudo touch /etc/init.d/couchdb

# Erlangの依存関係リストを取得・登録・削除・更新
sudo wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb
sudo dpkg -i erlang-solutions_1.0_all.deb
rm -rf erlang-solutions_1.0_all.deb
sudo apt-get update

# Elixirを入れてバージョンの確認
sudo apt-get install elixir
iex -v

最後のiex -vでバージョンを確認できれば大丈夫です。


PostgreSQLの用意

PhoenixがデフォルトでPostgreSQLにするもんで、他のDBでやるのはなかなか大変です。後日別記事で紹介できたらいいなあ(希望)

sudo apt-get update

# PostgreSQLをインストール
sudo apt-get install postgresql
sudo service postgresql start

# 問題なく動作するか確認
sudo -u postgres psql
# Ctrl + D で抜けてください

# ユーザとパスワード設定
sudo -u postgres psql -c "ALTER USER postgres PASSWORD 'postgres';"
sudo service postgresql restart # DB再起動


PostgreSQLのUTF-8設定

筆者はPostgreSQL使ったことないので神記事をもとにUTF-8の設定をしましたが、この記事template0を指定する方法のほうが合理的で楽ですね……。

sudo -u postgres psql # 以下のコマンドはPSQLで実行します

UPDATE pg_database SET datistemplate = FALSE WHERE datname = 'template1';
DROP DATABASE template1;
CREATE DATABASE template1 WITH TEMPLATE = template0 ENCODING = 'UTF8';
UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'template1';

# 確認用コマンド。下記画像のようにtemplate1がUTF8になればOK
# 確認ができたら q を押してから Ctrl + Dで抜けましょう
\l

image.png


Phoenixの用意

※何度も言いますが、デフォルトでPostgreSQLが設定されます。

# 依存解決ツール(hex)を入れておく

mix local.hex
# Phoenixのインストール
mix archive.install hex phx_new 1.4.0

# プロジェクト作成について
# 任意のプロジェクト名に書き換えてください(ハイフンとか使えない文字もあります)
# webって文字があるプロジェクト名は使えません(私はapiにしています)
mix phx.new プロジェクト名
cd プロジェクト名

# いれたらエラーがなおった子たち
# 名前的にはErlangの開発用のプラグイン(調べます)
sudo apt-get install erlang-dev
sudo apt-get install erlang-parsetools

# ファイルやディレクトリの監視ツール。あとでPhoenixに要求される
sudo apt-get install inotify-tools


余談① Node.jsを使いたい場合

神記事を参照して入れられます。必須ではないはず、ですが使いたい人はいるはずです。

# Node.js

cd プロジェクト名/assets
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash
source ~/.nvm/nvm.sh
npm install
nvm install --lts
cd ../


余談② 仮想サーバのポートを変える

筆者はCloud9なので8080に設定にしました。でないと、サーバ上での動作がわかりません。既に4000を使っている場合等の事情があればプロジェクト名/config/dev.exshttp:4000http:8080に変えておきましょう。


依存関係の更新とビルド

ここが一番のハマり要素!! マヂで何時間かけて調べたかわかりません(´・ω・`)

mix deps.get # ここで落ちると厄介

mix ecto.create # コンパイル。なんかここでrevar入れられた

具体的にはDBや仮想サーバに接続するライブラリ等を取得しています。Javaで言うところのjarみたいな認識です。もしも、記事が古くなってきてハマってしまったら、コメントに書いて、筆者に八つ当たりしてくださいね。たぶん調べてどうにかします。だいたいバージョンの指定が古かったりとか、代替のライブラリがあるとか、大人の事情が多いです。



  • hexの公式が参考になります。(参考になる?)


  • Numberとか実用的なライブラリもあるので、DB接続と合わせて別記事で紹介できたらいいなあ(希望)

  • プラグインの導入は救世主である株式会社gumiの記事がわかりやすいです。

  • 上記のコマンドの詳細は仏記事を参考にしました。

※日本語の本がないElixirを習得するなら株式会社gumiの記事は完全網羅すべきです。

公式に許可を取って「見やすく、わかりやすく」日本語訳してくだすってます。普及にかなり本気です!


サーバ、始動

下記のいずれかコマンドでサーバが立ち上がれば環境構築は完了です。

# iex上で実行

iex -S mix phx.server

# 普通に実行
mix phx.server

# 正直違いがわかりません!どう違うのか調べます

ポートを触っていないなら http://localhost:4000 でアクセスできるでしょう。

ポートを触っているなら http://localhost:8080 でアクセスできるでしょう。

ちなみに筆者はプロジェクト作成時に --no-html で指定していますので、index.htmlは作成されておらず、計画通りエラりました。皆さんはちゃんとしたPhoenixの画面が出ているはずです。

image.png

お疲れ様でした!!!!

これで私の会社では、私が一番ElixirとPhoenixに詳しいはずです!(他に誰も触ってないだけ)



今後の話題



次回 WebAPIサーバをつくる


  • プロジェクト作成時の引数

  • ライブラリ

  • 設定ファイル

  • サーバ起動時のコマンドの違い

  • PostgreSQLとMySQL以外でもやってみたい。特にSQLiteは需要あるはず。

  • そもそもElixir言語について、記事に書けてない。

  • herokuがPostgreSQL使えるからデプロイ方法も調べておきたい。