JupyterLab + Poetry + Docker環境で、Elixirを実行する（Elixirライブラリも使える）

この記事は、「[fukuoka.ex Elixir／Phoenix Advent Calendar 2020](https://qiita.com/advent-calendar/2020/fukuokaex)」22日目の記事です。
きのうは@GKBRさんの「[Hello! After World!! Serverless - (第0章)](https://qiita.com/GKBR/items/da76cb5a81f9c63f3a37)」でした！

# 概要

__JupyterLab__で、Python __以外__の開発言語も実行できるようにする。

- 実行環境の構築は__Docker__で行い、Pythonバージョン及びライブラリ管理は__[Poetry](https://python-poetry.org/)__で行います。
- Poetryでは仮想環境の構築はスキップします。（Dockerコンテナの構築やってるので）
- 本記事では、__Elixir__の対話型実行環境__「IEx」__をJupyterLabで実行します。
  - Jupyterカーネルの[IElixir](https://github.com/pprzetacznik/IElixir)を使います。

後述もしますが、JupyterLabではコマンドの実行結果をそのままファイル形式で保存できます。
そのため、例えばElixirならIEx実行コマンドのコード管理にも役立てられる、ということがJupyterLabを実行するメリットのひとつです。

## 実行環境

- MacOS
- Docker (docker-compose)

# 環境構築 & コード

- 任意のプロジェクト名でディレクトリを作ります
- ディレクトリ直下に、以下の3ファイルを用意します

### Dockerfile

```docker:Dockerfile
FROM python:3.8.6-slim

COPY pyproject.toml ./

ENV PYTHONUNBUFFERED=1 \
  ERLANG_PACKAGER_VERSION=2.0

RUN apt-get update -y && \
  apt-get upgrade -y && \
  apt-get install -y \
  build-essential \
  curl \
  git \
  inotify-tools \
  libsqlite3-dev \
  libzmq3-dev \
  sudo \
  vim \
  wget

# Install: pip & poetry
RUN pip install --upgrade pip
RUN pip install poetry
RUN poetry config virtualenvs.create false && \
  poetry install

# Install: Erlang
RUN wget https://packages.erlang-solutions.com/erlang-solutions_${ERLANG_PACKAGER_VERSION}_all.deb
RUN dpkg -i erlang-solutions_${ERLANG_PACKAGER_VERSION}_all.deb
RUN apt-get update && apt-get install -y esl-erlang
RUN rm erlang-solutions_${ERLANG_PACKAGER_VERSION}_all.deb
RUN which erl

# Install: Elixir
RUN apt-get update && apt-get install elixir
RUN which elixir
RUN mix --version && which mix

RUN mix local.hex --force
RUN mix local.rebar --force

RUN apt-get clean

# Install: IElixir
RUN git clone https://github.com/pprzetacznik/IElixir.git
WORKDIR IElixir
RUN mix deps.get
RUN mix test
RUN MIX_ENV=prod mix compile
RUN ./install_script.sh

CMD ["iex"]
```

### docker-compose.yml

```yml:docker-compose.yml
version: "3"
services:
  eda:
    build: ./
    user: root
    volumes:
      - ./:/app
    working_dir: /app
    tty: true
    ports:
      - "8890:8890"
    command:
      jupyter lab
        --port=8890
        --ip=0.0.0.0
        --allow-root
        --NotebookApp.token=''
        --no-browser
```

- ポート番号`8890`の部分はお好みでどうぞ
  - 本記事では`8890`で進めていますが、JupyterLabのデフォルトは`8888`ポート

### pyproject.toml

```toml:pyproject.toml
[tool.poetry]
name = "jupyterlab_docker"
version = "0.2.0"
description = "Environment JupyterLab Poetry docker-compose"

authors = ["im"]

[tool.poetry.dependencies]
python = "^3.8"

jupyterlab = "*"
numpy = "*"
matplotlib = "*"
japanize-matplotlib = "*"

[tool.poetry.dev-dependencies]
pytest = "*"

[build-system]
requires = ["poetry_core>=1.0.10"]
build-backend = "poetry.masonry.api"
```

- Pythonのライブラリ追加や削除は、`[tool.poetry.dependencies]`内の設定でお好みでどうぞ（本記事では説明対象のスコープ外とします）


# 実行

```terminal:terminal
$ cd hogehoge（ファイルを用意したディレクトリ）

$ docker-compose build

$ docker-compose up
```

コンテナが起動したら、ブラウザで`http://localhost:8890`を確認します。

![jupyter_ex1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211052/c5ee994d-1a8d-0887-85e1-72cfecc126c2.png)

Elixirカーネルを追加することができました。

![jupyter_ex2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211052/8a272b96-244b-5948-9bcf-696d2f088faa.png)

Elixirのコマンド実行もできています。

JupyterLabでの実行結果をファイルで保存できるので便利ですね！（`.ipynb`）

## （追記）ElixirのライブラリをJupyterLabで使う

`Boyle.install({:math, "~> 0.5.0"})`のようにコードを書くことで、ライブラリの使用が可能となります。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">JupyterLab＋Poetry＋Docker環境で、Elixirの数値計算ライブラリ「Math」も使えますよー📗<br><br>`Boyle.install({所望のライブラリ})` したら、<br>（mixファイルの準備とかimport hogeとかしなくても）よしなにやってくれるので便利です<a href="https://t.co/hPzaBn8O3H">https://t.co/hPzaBn8O3H</a><a href="https://twitter.com/hashtag/kokuraex?src=hash&amp;ref_src=twsrc%5Etfw">#kokuraex</a> <a href="https://twitter.com/hashtag/Elixir?src=hash&amp;ref_src=twsrc%5Etfw">#Elixir</a> <a href="https://twitter.com/hashtag/JupyterLab?src=hash&amp;ref_src=twsrc%5Etfw">#JupyterLab</a> <a href="https://twitter.com/hashtag/Python?src=hash&amp;ref_src=twsrc%5Etfw">#Python</a> <a href="https://t.co/78dlAC21rr">pic.twitter.com/78dlAC21rr</a></p>&mdash; im (@im_miolab) <a href="https://twitter.com/im_miolab/status/1341330821391605761?ref_src=twsrc%5Etfw">December 22, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

![math_ex.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211052/ae94f41a-f455-9571-f4e4-e6a9a5e04c6d.png)

- [hex / Math](https://hex.pm/packages/math)

# おわりに

JupyterLab + Poetry + Docker環境でElixirを実行する環境を構築して、実際にElixirのコマンドを実行しました。

なお、本記事ではElixir言語を取り上げていますが、他言語でのJupyterLab実行環境構築もおなじようなノリでできるので、本記事でもし参考になる部分などがあれば参考にされて、試してみられるとよいと思います！

- [Jupyter kernels](https://github.com/jupyter/jupyter/wiki/Jupyter-kernels) ・・・各言語のJupyterカーネル一覧

また、今回構築したJupyterLab + Poetry + Docker環境は、ふつうにPython用として使うことももちろん可能ですので、そちらのコンテキストでもよろしかったらどうぞ。

明日の「fukuoka.ex Elixir／Phoenix Advent Calendar 2020」は、@emadurandalさんです。お楽しみに！

## お知らせ

### kokura.ex

北九州小倉のElixirコミュニティ__「kokura.ex」__は、福岡市で2017年から人気を博しているElixirコミュニティ「fukuoka.ex」が小倉にブランチした、__新生Elixir__コミュニティです。

fukuoka.ex同様、

- __「高速処理性能」と「高い開発効率性」を両立できるプログラミング言語「Elixir」__
- __そのWebアプリケーションフレームワーク「Phoenix」__

を、北九州を起点として広め、ワイワイ盛り上げていくコミュニティです。
これから先端技術をやりたい方や、最新のプログラミングを学びたい方、未来に向けてITに強くなりたい方など、技術への興味レベルが高い方や、プログラミングに関心が高い方のご参加を歓迎します。
__オンラインでのもくもく勉強会__を、__毎月ペース__で開催しておりますのでぜひどうぞ。
（はじめてElixirに触れる方も、お気軽にご参加ください！）

- イベントページ　__[fukuoka.ex](https://fukuokaex.connpass.com/)__  
  - connpassイベント一覧より、kokura.exのページをご覧いただけます

### Elixirアドベントカレンダー

「[Elixir Advent Calendar 2020](https://qiita.com/advent-calendar/2020/elixir)」もありますので、こちらもぜひどうぞ。

- 12月8日の枠に自分も執筆参加してますので、よろしかったらご覧ください！  
  [【Elixir 1.11】Phoenix Framework + DB開発をDockerでやる #1（コンテナ開発環境構築~CRUD実装~テスト）](https://qiita.com/im_miolab/items/84d9d71d109d689d267d)