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

#### 記事作成の動機（つぶやき）
※スルー可

- バージョンアップで日本語記事の約半分は古い情報になった件
- 札幌でElixirコミュニティとかできないかなぁ。面白いことができればそれがベスト→Sapporo.BEAMありました！
- 今月終わったら新卒じゃなくなるし、なんかやっておきたかった感

<hr>
#### 用語解説
<hr>
※スルー可
※筆者はLaravelとSpringしかさわったことありません。

|用語|読み方|分類|解説|
|:-:|:-:|:-:|---|
|[Erlang](https://www.erlang.org/)|アーラン|PL|並列処理に特化。関数型プログラミング言語|
|[Elixir](https://elixir-lang.org/)|[エリクサー](https://elixir-lang.jp/)|PL|ErlangをRubyライクにした言語|
|[Phoenix](https://phoenixframework.org/)|フェニックス|FW|Railsライクなフレームワーク|
|[PostgreSQL](https://www.postgresql.org/)|ポストグレスキューエル|DB|Phoenixがデフォルトで指定しているデータベース|
|BEAM|ビーム|VM|ErlangとElixirが動作する仮想マシンの実行環境|
<hr>
#### 環境構築 (※Ubuntu向け)
<hr>
環境構築は[神スライド](https://www.slideshare.net/piacere_ex/elixir3phoenix-13web-rest-api-81219622)みながらやってます。
生憎、ローカルLinux汚染されすぎてアルテマウェポン(**Docker-Compose**)**すら死ぬ**筆者は
~~[Coder](https://coder.com/)です。昔のCloud9みたいに使えますし、VSCode好きですが、同じ環境なら下記注意！ファイルに文字が打てなくなるバグがある。ファイルを開き直すと治る。コマンドが打てなくなったりしたらF5で画面再読込(こまめにCtrl + Sしましょう)。Ctrl + Cとかそのままつかえない(Ctrl + Shift + C)。TerminalからNew Terminalを押下して準備完了！~~

<br>
**いろいろすみません**
CoderでやったらCowboy(仮想サーバー)上の実行結果を確認できませんでした。新しいことに挑戦すれば挫折することもありますね。旧アカウント持っているので[Cloud9](https://aws.amazon.com/jp/cloud9/)で**この記事を自分で読んで環境構築しました。**当然AWS Cloud9でも同じことができます。
いよいよ、環境構築に入ります。コマンド連打になりますが、**Y/N聞かれたら、全てYにしましょう。**

### Elixirの用意
```zsh
# これがないとインストールに失敗することがあるらしいので
# (参照：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でやるのはなかなか大変です。後日別記事で紹介できたらいいなあ（希望）

```zsh
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使ったことないので[神記事](https://qiita.com/Homulilly/items/82325dec2ce06600aff0)をもとにUTF-8の設定をしましたが、[この記事](https://qiita.com/subaru-shoji/items/51b86892a2618c84737e)の`template0`を指定する方法のほうが合理的で楽ですね……。


```zsh
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](https://qiita-image-store.s3.amazonaws.com/0/330109/163d5f46-00bd-90c3-2ff9-13734d85d3d1.png)

### Phoenixの用意
※何度も言いますが、デフォルトで`PostgreSQL`が設定されます。

```zsh
# 依存解決ツール(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を使いたい場合
[神記事](https://qiita.com/Homulilly/items/82325dec2ce06600aff0)を参照して入れられます。必須ではないはず、ですが使いたい人はいるはずです。

```zsh
# 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に設定](https://qiita.com/subaru-shoji/items/51b86892a2618c84737e)にしました。でないと、サーバ上での動作がわかりません。既に4000を使っている場合等の事情があれば`プロジェクト名/config/dev.exs`の`http:4000`を`http:8080`に変えておきましょう。

### 依存関係の更新とビルド
**ここが一番のハマり要素！！** マヂで何時間かけて調べたかわかりません(´・ω・\`)

```zsh
mix deps.get # ここで落ちると厄介
mix ecto.create # コンパイル。なんかここでrevar入れられた
```

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

- [hexの公式](https://hex.pm/)が参考になります。（参考になる？）
- [Number](https://github.com/danielberkompas/number)とか実用的なライブラリもあるので、DB接続と合わせて別記事で紹介できたらいいなあ（希望）
- プラグインの導入は救世主である[株式会社gumi](https://dev.to/gumi/elixir-plug-40lb)の記事がわかりやすいです。
- 上記のコマンドの詳細は[仏記事](https://qiita.com/surume/items/6b770abaf1cbcd802922)を参考にしました。

**※日本語の本がないElixirを習得するなら[株式会社gumi](https://dev.to/gumi/elixir-plug-40lb)の記事は完全網羅すべきです。**
**公式に許可を取って「見やすく、わかりやすく」日本語訳してくだすってます。普及にかなり本気です！**


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

```zsh
# iex上で実行
iex -S mix phx.server

# 普通に実行
mix phx.server

# 正直違いがわかりません！どう違うのか調べます
```
ポートを触っていないなら http://localhost:4000 でアクセスできるでしょう。
ポートを触っているなら http://localhost:8080 でアクセスできるでしょう。

ちなみに筆者はプロジェクト作成時に `--no-html` で指定していますので、`index.html`は作成されておらず、計画通りエラりました。皆さんはちゃんとしたPhoenixの画面が出ているはずです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/330109/a58cb31e-54ea-e1c1-7e69-e5891cb94aad.png)


お疲れ様でした!!!!
これで私の会社では、`私が一番ElixirとPhoenixに詳しいはずです！（他に誰も触ってないだけ）`

<hr>
#### 今後の話題
<hr>

### 次回　[**WebAPIサーバをつくる**](https://qiita.com/kanchan-1996/items/06edf10c0d24203d6a35)

- プロジェクト作成時の引数
- ライブラリ
- 設定ファイル
- サーバ起動時のコマンドの違い
- PostgreSQLとMySQL以外でもやってみたい。特にSQLiteは需要あるはず。
- そもそもElixir言語について、記事に書けてない。 
- herokuがPostgreSQL使えるからデプロイ方法も調べておきたい。