【アーカイブ: 2023年2月4日時点の情報】Google Colaboratory 上に Elixir と Livebook をインストールする

## はじめに

https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja

この記事は 2023年2月4日時点の記事です

以下の記事が最新になっています

https://qiita.com/RyoWakabayashi/items/113b94866780c7646af1

~~以前、 Google Colaboratory 上で Livebook を動かす方法について記事を書きました~~

~~ただし、上記の記事の方法では apt でインストールできる Elixir のバージョンが現状 1.13 までに限定されます~~

~~その結果、 Livebook のバージョンは 0.6.3 以下になってしまいます~~

~~やはり最新を使いたいですよね~~

~~というわけで今回はできるだけ簡単に最新版をインストールします~~

## 準備

以前と同様、以下の二つのアカウントが必要になります

- Google アカウント
- ngrok アカウント

ngrok はローカルで起動した Web サービスを外部に公開できるサービスです

https://ngrok.com/

ngrok にサインインしたら、左メニューの「Your Authtoken」を開き、
認証トークンを出しておいてください

![スクリーンショット 2022-10-26 18.15.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/ca0b29fc-41b1-0885-d53b-450ea8fdc3fc.png)

## Google Colaboratory への Erlang インストール

Google Colaboratory で「ノートブックを新規作成」をクリックしてください

![スクリーンショット 2022-10-26 18.21.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/c013cbcf-4634-689a-fffb-43eea35ea6d6.png)

GPU を使いたい場合、ラインタイムを変更します

上メニューの「ランタイム」から「ラインタイムのタイプを変更」をクリックしてください

![スクリーンショット 2022-10-26 18.23.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/70334bbf-23db-d9f8-d575-5e3b8c050047.png)

開いたモーダルで「GPU」を選択し、「保存」をクリックします

![スクリーンショット 2022-10-26 18.23.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/040725e7-c303-c6db-be79-469fe2561d8b.png)

再生マークの右にある入力エリア（セル）に以下のコードを貼り付けてください

```
!echo 'debconf debconf/frontend select Noninteractive' | sudo debconf-set-selections
```

再生ボタンをクリック（=セルのコードを実行）して、しばらくすると左側に緑色のチェックマークが表示されます

![スクリーンショット 2022-10-26 18.26.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/d811176d-d876-60df-c3df-e9ee29b1aa62.png)

先ほどのセルの下辺あたりにマウスカーソルを持っていくと、「+コード」というボタンが出てくるのでこれをクリックします

（上に表示されている「+コード」ボタンでも良い）

![スクリーンショット 2022-10-26 18.28.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/adabbcaf-ca6b-3c01-077d-9750d766801c.png)

すると、セルが一つ下に追加されるので、以下のコードを貼り付けてから、新しいセルを実行してください

:::note warn
ここまでは以前の記事と同じです

ここから手順が変わります
:::

`apt-get` で必要なライブラリをインストールします

```
!wget https://packages.erlang-solutions.com/erlang-solutions_2.0_all.deb && sudo dpkg -i erlang-solutions_2.0_all.deb

!sudo apt-get update -y

!sudo apt-get install -y erlang-base
!sudo apt-get install -y build-essential
!sudo apt-get install -y erlang-dev
!sudo apt-get install -y erlang-inets
!sudo apt-get install -y erlang-parsetools
!sudo apt-get install -y erlang-os-mon
!sudo apt-get install -y erlang-ssl
!sudo apt-get install -y erlang-xmerl
```

elixir を `apt-get` でインストールせずに、以下の二つを追加でインストールしています

- erlang-inets
- erlang-ssl

これらは HTTPS 通信に必要なモジュールで、これを入れていないと `mix local.hex --force` 実行時に `ssl.app` が見つからない、というようなエラーが発生します

インストールが完了したら Erlang のバージョンを確認してみましょう

Erlang シェルを起動して即終了させる

```
!erl -run halt
```

実行結果は以下のようになる

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

{"init terminating in do_boot",{undef,[{halt,start,[],[]},{init,start_em,1,[]},{init,do_boot,3,[]}]}}
init terminating in do_boot ({undef,[{halt,start,[],[]},{init,start_em,1,[]},{init,do_boot,3,[]}]})

Crash dump is being written to: erl_crash.dump...done
```

1行目に出ている通り、 OTP 25 がインストールされている

## asdf のインストール

Elixir をインストールするために asdf をインストールします

asdf は様々な開発言語、開発ツールの多数バージョンを共存したままインストールできるツールです

:::note warn
ただし、 Windows では使えません
:::

https://asdf-vm.com/

`.tool-versions` というファイルに各言語のバージョン番号を書いておけば、 `.tool-versions` の存在するディレクトリー以下では自動的にそのバージョンが使われるため、非常に便利です

私の開発環境には欠かせない存在ですね

そして、 Elixir も asdf を使えば超簡単に任意のバージョンをインストールできます

asdf 自体のインストールも超簡単です

GitHub から `~/.asdf` （実行ユーザーのホームディレクトリー直下の .asdf）にクローンしてきます

```
!git clone https://github.com/asdf-vm/asdf.git ~/.asdf
```

もし asdf のバージョンを指定したい場合は末尾に `--branch v0.11.1` というように指定を入れてください

asdf や asdf によってインストールしたもののパスを通すため、環境変数を設定します

Google Colaboratory 上では Python の力を借りて環境変数を設定します

（通常の環境では[公式サイト](https://asdf-vm.com/guide/getting-started.html#_5-install-a-version)を参考に設定してください）

```python
import os
os.environ['PATH'] = "/root/.asdf/shims:/root/.asdf/bin:" + os.environ['PATH']
```

これで asdf が使えるようになったので、以下のコマンドで asdf に Elixir プラグインを追加します

```
!asdf plugin add elixir
```

以下のコマンドで Elixir の最新版をインストールします

```
!asdf install elixir latest
```

もしバージョン番号を指定したい場合は `latest` の部分を `1.14.3-otp-25` というように指定してください

指定可能なバージョン番号の一覧は `!asdf list all elixir` で取得できます

どこでも Elixir の最新版を使いたい場合、以下のコマンドを実行します

```
!asdf global elixir latest
```

今いるディレクトリーだけ最新版にしたい場合は `!asdf local elixir latest` になります

インストールがうまくいっているか、バージョンを確認してみます

```elixir
!elixir -v
```

実行結果は以下のようになります

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

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

2023年2月5日現在最新版の 1.14.3 がインストールされました

asdf を使えば Elixir 以外にも、思いつく大抵の開発言語、 AWS CLI や Terraform なんかも任意のバージョンがインストール可能なので、まだまだ応用範囲は広そうです

:::note info
それなら Erlang も asdf でインストールすれば良かったのでは？という疑問があるかと思いますが、 Google Colaboratory 上ではうまくいきませんでした

`!asdf install erlang latest` を実行すると Kerl を使った Erlang のビルドが実行されるのですが、これが途中でエラーになってしまいます（しかも Jupyter のメッセージにエラーが表示されず、実行も止まらないのでエラーになったことに気付かず待ち続けてしまう）

https://github.com/kerl/kerl
:::

## Livebook のインストール

以下のコマンドを実行してください

```
!mix local.hex --force
!mix local.rebar --force
!mix escript.install hex livebook --force
```

以前の記事では Elixir のバージョンが低いため `!mix escript.install hex livebook 0.6.3 --force` というように古いバージョンを指定していましたが、今回は最新版なので指定しません

しばらくしてインストールが終わったら、 Livebook にパスを通します

```
!asdf reshim elixir
```

`asdf reshim <言語>` で、対象言語でインストールしたツール群のパスを通します（最初だけでOKです）

この状態で Livebook のバージョンを確認します

```
!livebook -v
```

実行結果は以下のようになります

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

Elixir 1.14.3 (compiled with Erlang/OTP 25)

Livebook 0.8.1
```

Erlang Elixir Livebook それぞれ最新になっています

Livebook 上で evision 等を使う場合、必要なモジュールを追加でインストールしておいてください

## ngrok のインストール

ngrok のクライアントツールをインストールします

```
!curl -O https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip
!unzip ngrok-stable-linux-amd64.zip
```

次のコードで、準備しておいた ngrok の認証トークンを設定します

※ `<ngrokの認証トークン>` の部分を自分の ngrok アカウントで発行した認証トークンに置き換えてください

```
!./ngrok authtoken <ngrokの認証トークン>
```

## Livebook の起動

次のコードを実行し、 ngrok でコンテナ内の `http://localhost:8888` を外部公開します

```
get_ipython().system_raw('./ngrok http 8888 &')
!sleep 5s
```

次のコードを実行すると、公開された URL が表示されます

（ここでエラーが出る場合、 ngrok の認証トークンが誤っています）

```
!curl -s http://localhost:4040/api/tunnels | python3 -c "import sys, json; print(json.load(sys.stdin)['tunnels'][0]['public_url'])"
```

![スクリーンショット 2022-10-26 18.42.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/13f94662-7323-e8ac-8443-bcabb80b7cd4.png)

次のコードを実行し、 Livebook を 8888　ポートで起動します

```
!livebook server --port 8888 --no-token
```

## まとめ

やっぱり asdf は便利ですね

これで最新版の Livebook で GPU が使えます