衛星データプラットフォーム Tellus と Elixir Livebook を使って、植物の分布から田畑の利用状況を推測する（環境構築編）

## はじめに

経済産業省の「衛星データ利用環境整備・ソリューション開発支援事業」において、弊社は衛星データ無料利用事業者として支援を受けています

https://sdu.go.jp/

本事業では日本発の衛星データプラットフォーム「Tellus」のデータの一部を無料利用できます

（一般利用者が無料利用できるデータもあります）

https://www.tellusxdp.com/

「Tellus」から取得できる様々なデータを使って何をどう実装できるのか、現在調査検証中です

今回から連載で「Tellus」の公式メディア「宙畑-sorabatake-」の記事を参考にしながら、 Elixir で衛星データを扱ってみます

https://sorabatake.jp/

連載記事

- 環境構築編 <- ここ
- [データ取得編](https://qiita.com/RyoWakabayashi/items/c87fe1256bcd105d370c)
- [NDVI算出編](https://qiita.com/RyoWakabayashi/items/b4fa2f7efa2a5d249a44)
- [市区町村切り抜き編](https://qiita.com/RyoWakabayashi/items/d65dd3a508284e67c8cd)
- [休耕地探索編](https://qiita.com/RyoWakabayashi/items/4039649daa0d22a3bda0)

今回は Elixir 用の環境構築までを行います

## Livebook

データ加工には Elixir の Livebook を使います

https://livebook.dev/

Livebook はブラウザ上で対話的にコーディング、結果の可視化を行うためのツールです

有体に言えば Python でいうところの Jupyter です

![スクリーンショット 2023-01-04 14.58.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/5bd8b69a-e158-0943-8d42-9706892fecfb.png)

セル（上画像の黒い横長のブロック）にコードを書いて実行すると、その下に実行結果が表示されます

当然、グラフや画像、表、そして地図も表示できます

しかも表示した表や地図を操作することもできます

![visualization.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/b8159740-d9bc-7f7f-36e3-5ad849957d21.png)

![スクリーンショット 2022-12-28 11.27.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/a303ae15-f528-c4e4-0cf0-fcadc1082e83.png)

![search.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/8e316e3b-1458-44bc-31fd-73af43a3cd9a.gif)

![oita.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/b43ab903-4a70-66f0-4bc5-eb019680f7a6.gif)

更に処理の過程を参照したり、変更したりしてデバッグすることもできます

![drag.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/ac91c006-3877-14e4-68ab-3310b8475e50.gif)

![evision.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/0541d7d6-7bab-87d8-4bad-1208bb10fdd1.gif)

表現力では Jupyter を十分超えているのではないでしょうか

## 実行環境

本事業で衛星データを扱うにあたり、「さくらのクラウドサービス」の仮想サーバーを提供されています

https://cloud.sakura.ad.jp/

サーバースペック
- CPU 4コア
- メモリ 16GB
- SSD 1TB
- OS: Ubuntu 20.04.1

まずはこのサーバー上に環境を構築ます

## SSH接続

「さくらのクラウドサービス」から提供された接続情報を使って、 SSH で仮想サーバーに接続します

パスワードを聞かれるので入力すると接続できます

```bash
$ ssh <ユーザー名>@<ホスト名>
<ユーザー名>@<ホスト名>'s password:
```

## Docker のインストール

楽をしたいので Docker コンテナを使います

実行環境に Docker コンテナがオススメな理由

- サーバーの環境を極力汚さない
- サーバーを別のマシンにしても同じ環境で動かせる
- Dockerfile さえ変更すれば簡単にカスタマイズできる

Docker 公式ドキュメントに従って Docker をインストールします

https://docs.docker.com/engine/install/ubuntu/

Docker に必要なパッケージをインストールします

```bash
sudo apt-get update
```

```bash
sudo apt-get install \
  ca-certificates \
  curl \
  gnupg \
  lsb-release
```

Docker 用のリポジトリを追加します

```bash
sudo mkdir -p /etc/apt/keyrings
```

```bash
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
  sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
```

```bash
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```

```bash
sudo apt-get update
```

Docker-CE などをインストールします

```bash
sudo apt-get install \
  docker-ce \
  docker-ce-cli \
  containerd.io \
  docker-compose-plugin
```

動作確認します

```bash
sudo docker run hello-world
```

`Hello from Docker!` というような文言が表示されれば無事インストールされています

## ファイアウォールの設定

Livebook を使ってブラウザ経由でコードを実行するため、 ファイアウォールでポートを解放しておく必要があります

以下のコマンドを実行すると、現在のファイアウォールの設定が確認できます

```bash
sudo ufw status
```

基本的には SSH 用の 22番ポートが空いていると思います

自分のローカルマシンのグローバルIPから特定のポート番号にアクセスできるよう、設定を追加します

```bash
sudo ufw allow proto tcp to <ローカルマシンのグローバルIP>/32 port <使用するポート番号>
```

## コンテナの起動

私の場合は自分で作っている Elixir 学習用コンテナがあるので、 git からクローンしてきて起動するだけで環境構築完了です

パブリックリポジトリーなので誰でも使えます

https://github.com/RyoWakabayashi/elixir-learning

```bash
git clone https://github.com/RyoWakabayashi/elixir-learning.git
```

```bash
cd elixir-learning
```

```bash
$ sudo docker-compose up
...
Attaching to livebook
livebook    | [Livebook] Application running at http://0.0.0.0:<ポート番号>/?token=<認証トークン>
```

`0.0.0.0` の部分を SSH 接続しているホスト名に置き換えてブラウザで開けば Livebook にアクセスできます

![スクリーンショット 2022-09-30 17.40.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/8b51ac5a-f90a-2b99-f8e8-f8bac55f06ff.png)

右上 New notebook をクリックし、新しいノートブックを開けば準備完了です

![スクリーンショット 2022-09-30 17.43.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/85751035-145b-3e14-87af-7f7408069d14.png)

Livebook を停止したい場合は `sudo docker-compose up` を実行したターミナルで `Ctrl + C` を押して中断するか、別のターミナルで以下のコマンドを実行してください

```bash
cd elixir-learning && sudo docker-compose down
```

また、起動したターミナルを閉じてしまって Livebook の認証トークンがわからなくなった場合は以下のコマンドでコンテナのログを取得してください

```bash
sudo docker logs livebook
```

## コンテナの解説

少しだけ使っているコンテナの解説をしておきます

### Dockerfile

コンテナ定義本体です

https://github.com/RyoWakabayashi/elixir-learning/blob/main/Dockerfile

まず先頭行で、 Livebook の 0.8.0　 用公式コンテナを指定しています

```Dockerfile
FROM livebook/livebook:0.8.0
```

Livebook 以外に Phoenix プロジェクトもコンテナ内で作りたいときのために `mix phx.new` の準備をしています

```Dockerfile
RUN mix local.hex --force \
  && mix archive.install hex phx_new --force \
  && mix local.rebar --force
```

この後の作業や Evision (OpenCV) に必要なパッケージをインストールしています

```Dockerfile
RUN apt-get upgrade -y \
  && apt-get update \
  && apt-get install --no-install-recommends -y \
    gnupg2 \
    apt-transport-https \
    ca-certificates \
    lsb-release \
    curl \
    libopencv-dev \
    build-essential \
    erlang-dev \
    sudo \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*
```

Docker コンテナ内から Docker を操作する（DooD）ために Docker の CLI だけをインストールしています

```Dockerfile
RUN mkdir -p /etc/apt/keyrings \
  && curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg \
  && echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null \
  && sudo apt-get update \
  && sudo apt-get install -y docker.io \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*
```

WSL (Windows Subsystem for Linux) でも動かせるように WSL Utilities をインストールし、設定用のシェルを追加しています

```Dockerfile
RUN wget -O - https://pkg.wslutiliti.es/public.key | sudo tee -a /etc/apt/trusted.gpg.d/wslu.asc

RUN echo "deb https://pkg.wslutiliti.es/debian bullseye main" | sudo tee -a /etc/apt/sources.list

RUN apt-get update \
  && apt-get install --no-install-recommends -y \
  wslu \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*

COPY ./setup_for_wsl.sh /home/livebook/

RUN chmod +x /home/livebook/setup_for_wsl.sh
```

`./livebook` 配下のファイルをコンテナ内にコピーしています

これで作っておいたノートブックをコンテナ内で使うことができます

```Dockerfile
COPY ./livebooks /home/livebook
```

### docker-compose.yml

コンテナ起動時のオプションを保持しています

https://github.com/RyoWakabayashi/elixir-learning/blob/main/docker-compose.yml

`ports` で、コンテナ内のポート番号をホストのポート番号に割り当てています

8080 以外のポート番号を使いたい場合はここを変更する必要があります

`volumes` ではホストのディレクトリーをコンテナ内からマウントする設定をしています

例えば `./tmp:/tmp` でホストの `./tmp` （docker-compose.yml からの相対パス）をコンテナ内の `/tmp` にマウントしています

こうすることでコンテナとホストの間で簡単にファイル授受ができます

`//var/run/docker.sock:/var/run/docker.sock` はコンテナ内から Docker を操作する（DooD）のための設定です

## まとめ

Docker コンテナを使うことで、簡単に環境構築できました

次回はデータ取得編です

https://qiita.com/RyoWakabayashi/items/c87fe1256bcd105d370c