Ubuntu 20.04でElixirの最短手順（Nx＋EXLA／Phoenix＋PostgreSQLのインストール、Elixir最新版へのアップグレード、WSL2対応のオマケ付き）

この記事は、[Elixir Advent Calendar 2022](https://qiita.com/advent-calendar/2022/elixir) 10の2日目です

昨日は、 @RyoWakabayashi さんで[「Elixir Explorer 0.4.0 で追加された Query を使うと、データ分析が更に捗る」](https://qiita.com/RyoWakabayashi/items/053296b36d8744aca9ca)でした

---

[ElixirImp／fukuoka.ex／kokura.ex](https://fukuokaex.connpass.com)と[LiveView JP](https://liveviewjp.connpass.com/)の [piacere](https://twitter.com/piacere_ex) です、ご覧いただいてありがとございます :bow:

Erlang/OTP 25がaptでインストール可能なUbuntu 20.04で、Elixir／Phoenixを導入し、DB（PostgreSQL）とNxも使えるにするための最短手順をメモします

<h3>:ocean::ocean::ocean: Elixir Advent Calendar 総勢13本、熱い冬ヽ(=´▽`=)ﾉ :ocean::ocean::ocean:</h3>

例年に無い盛り上がりを見せています … 応援／購読よろしくお願いします :bow:

https://qiita.com/advent-calendar/2022/elixir
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/2965fc3b-ff27-4cb9-f924-9e5db67603fc.png)](https://qiita.com/advent-calendar/2022/elixir)

# 本コラムの検証環境

本コラムは、以下環境で検証しています

## 環境①：実機

- Ubuntu 20.04

## 環境②：WSL2上

- Windows 10＋WSL2＋Ubuntu 20.04

# （Windowsのみ）WSL2のインストール前（要再起動）

```
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
```

# （Windowsのみ）WSL2とUbuntu 20.04のインストール

下記をダウンロードして、WSL2をインストールします

[x64 マシン用 WSL2 Linux カーネル更新プログラム パッケージ](https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi)

<font color="red">なお、ココのインストールを忘れがちで、入れないとUbuntuインストール時に下記エラーが出るので、ご注意ください</font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/1588ce1a-b1a9-aa5c-97f5-73b0c5fba4a4.png)

WSLのバージョンを「2」に設定します

```
wsl --set-default-version 2
```

下記で「入手」ボタンをクリックして、Ubuntu 20.04をインストールします

[Ubuntu 20.04 LTS（Windows Store）](https://apps.microsoft.com/store/detail/ubuntu-20045-lts/9MTTCL66CPXJ?hl=ja-jp&gl=jp)

Ubuntuが立ち上がったら、下記のようにアカウント作成を行い、Ubuntuのインストールを完了させてください

```
Enter new UNIX username: hoge
Enter new UNIX password: *********
Retype new UNIX password: *********
passwd: password updated successfully
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

hoge@XXXXXXXXXXXXXXX:~$
```

なお、再度Ubuntuを入れ直したときは、下記のようなエラーが出ることがあります（もしくは、Windows Storeで「サーバー側に問題が発生しました」というエラーが出て、Ubuntuインストールが止まることがあります）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/1d7e3a41-b2d7-5486-0f57-bf135b821ba8.png)

その際は、下記コマンドを実行してから、Ubuntuを開き直せば回復します

```
wslconfig /u Ubuntu-20.04
wsreset
```

# ElixirとPhoenixのインストール

```
wget https://packages.erlang-solutions.com/erlang-solutions_2.0_all.deb
sudo dpkg -i erlang-solutions_2.0_all.deb
sudo apt update -y
sudo apt install erlang -y
sudo apt install inotify-tools -y
sudo apt install erlang-xmerl -y
sudo apt install erlang-os-mon -y
sudo apt install elixir -y
mix archive.install hex phx_new 1.6.15
```

下記でElixirとPhoenixが入ったことを確認してください

```
$ elixir --version
Erlang/OTP 25 [erts-13.0.4] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]

Elixir 1.13.4 (compiled with Erlang/OTP 25)
```

```
$ mix archive

* hex-2.0.0
* phx_new-1.6.15
Archives installed at: /home/hogehoge/.mix/archives
```

# PostgreSQL（DB）のインストール

```
sudo apt update
sudo apt install postgresql -y
sudo service postgresql start
sudo su - postgres -c psql
postgres=# alter role postgres with password 'postgres';
postgres=# \q
```

なお、PostgreSQLの「認証キー認証」を使う場合は、下記を先に実行してください

```
sudo apt install curl ca-certificates gnupg -y
curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
```

# DB付きPhoenix PJを動かす

```
mix phx.new basic
cd basic
mix ecto.create
iex -S mix phx.server
```

ブラウザで、``http://localhost:4000`` を見て、下記のようなページが表示されるのを確認してください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/148ff88d-b146-79bc-e27d-c7e4e9b9c661.png)

# Elixirを最新版（2023年9月現在は1.15.5）に上げる

PreCompiledパッケージを使えば、Elixirの最新版もカンタンに入ります

PreCompiledパッケージのURLは、下記で拾えます
https://elixir-lang.org/install.html#precompiled-package

```
sudo apt install unzip -y
sudo apt remove elixir -y
wget https://github.com/elixir-lang/elixir/releases/download/v1.15.5/elixir-otp-25.zip
unzip elixir-otp-25.zip -d elixir-1.15.5
sudo cp -a elixir-1.15.5/bin/ /usr/local/
sudo cp -a elixir-1.15.5/lib/ /usr/local/
```

Ubuntuターミナルを立ち上げ直し、下記で最新版に上がったことを確認してください

```
elixir --version
Erlang/OTP 25 [erts-13.0.4] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]

Elixir 1.14.3 (compiled with Erlang/OTP 25)
```

# Phoenixを最新版に上げる

Elixir最新版が入っていれば、Phoenixも最新版が入れられるので、下記でインストールしてください

```
mix archive.install hex phx_new
```

インストール後にPhoenix PJを ``mix phx.new`` で作る（手順は上記）と、Phoenix 1.7でPJ作成され、下記のような見た目に変わります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/35299cb0-9151-d673-e680-ec74814e849b.png)

# Livebookの最新版をインストールする

Phoenix最新版が入っていれば、Livebook最新版もインストールできます … 下記コラムをご覧ください

https://qiita.com/piacerex/items/0871b54b41128d426da5#livebook%E3%82%92%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%ABpc%E3%81%A7%E8%B5%B7%E5%8B%95

# Nxをインストール／テスト

Nxを動かすためのElixir PJを作ります

```
mix new basic
cd basic
```

mix.exsのdepsにnxを追記します

```elixir:mix.exs
…
  defp deps do
    [
      {:nx, "~> 0.4"},
      …
```

下記でNxをインストールして、iexで実行すると、Nxによる行列処理が上手く動きました

```elixir:
mix deps.get
iex -S mix
iex> t = Nx.tensor([[1, 2], [3, 4]])
#Nx.Tensor<
  s64[2][2]
  [
    [1, 2],
    [3, 4]
  ]
>
iex> Nx.divide(Nx.exp(t), Nx.sum(Nx.exp(t)))
#Nx.Tensor<
  f32[2][2]
  [
    [0.032058604061603546, 0.08714432269334793],
    [0.23688282072544098, 0.6439142227172852]
  ]
>
```

# EXLAでNx実行をスピードアップ

EXLAをビルドできるよう、build-essentialをインストールします

```
sudo apt install build-essential -y
```

mix.exsのdepsにexlaを追記します

```elixir:mix.exs
…
  defp deps do
    [
      {:nx, "~> 0.4"},
      {:exla, "~> 0.4"},
      …
```

下記でEXLAをインストールして、iexで実行すると、先ほどと同じNx行列処理が、EXLA.Backendで動いていることが確認できました

```elixir
mix deps.get
iex -S mix
iex> Nx.global_default_backend(EXLA.Backend)
iex> t = Nx.tensor([[1, 2], [3, 4]])
#Nx.Tensor<
  s64[2][2]
  EXLA.Backend<host:0, 0.1397726458.238157846.32579>
  [
    [1, 2],
    [3, 4]
  ]
>
iex> Nx.divide(Nx.exp(t), Nx.sum(Nx.exp(t)))
#Nx.Tensor<
  f32[2][2]
  EXLA.Backend<host:0, 0.1397726458.238157840.32275>
  [
    [0.032058604061603546, 0.08714432269334793],
    [0.23688282072544098, 0.6439142227172852]
  ]
>
```

# （Windowsのみ）Ubuntuを次回起動する際

以下コマンドでWSL2のUbuntu 20.04が起動でき、Elixir／Phoenixが利用できます

```
ubuntu2004
```

なお、VisualStudio Codeをお使いの方であれば、「Remote - WSL」というエクステンションを入れておくと、ターミナルで、上記でセットアップしたWSL2が使えて便利です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/5c95759a-9b21-c394-8ba5-770674039fd3.png)

# p.s.このコラムが、面白かったり、役に立ったら…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/67568d54-6584-ad33-77c7-b3b3afe70287.png) や ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/f5b819ef-d655-ef72-294c-b1a9d2c5b563.png) にて、どうぞ応援よろしくお願いします:bow:

# 主催／運営しているElixirコミュニティ紹介

[**1. ElixirImp** : A place to LOVE the buds in Elixir (Elixir実装の芽を愛でる場)
**2. fukuoka.ex** : Fukuoka local Elixir Community (福岡Elixirコミュニティ)
**3. kokura.ex** : Kokura local Elixir Community (小倉Elixirコミュニティ)](https://fukuokaex.connpass.com)

https://fukuokaex.connpass.com

[**4. LiveView JP** : A place to mob-program in LiveView, LiveBook+Nx+Axon, and elixir-desktop](https://liveviewjp.connpass.com)

https://liveviewjp.connpass.com

[**5. Neos.ex** : A place to connecting Elixir and NeosVR to create a new world](https://elixirjp.slack.com/archives/C02J9C12VMF)

---

<h3>:ocean::ocean::ocean: Elixir生誕10周年を一緒にお祝いしませんか？ :ocean::ocean::ocean:</h3>

12/21（水）19:30～21:00、「過去LTいただいた方々への感謝祭」をテーマに、リモート忘年会を開催

「Elixir生誕10周年」に対するコメントや、今／昔のElixirの進化を聞けるチャンスですので、お見逃し無くッ

https://fukuokaex.connpass.com/event/263809/

<font color="#f020a0"><b>※カンパイスタートの会ですので、お酒 or ソフトドリンク、お菓子 or ご飯をお忘れなく</b></font>

<font color="#a020f0"><b>※Zoom接続できれば、本人でも、2Dアバター／3D（VR）アバターでも、お好きな姿でご参加OK</b></font>

---

明日も私で[「Elixir生誕10周年祭■第1弾：Elixir／Phoenixで会員制サイト構築は瞬殺」](https://qiita.com/piacerex/items/e5590fa287d3c89eeebf)です