Cloud DatalabでもJuliaを触りたい

# はじめに

この記事は[データサイエンスに関して By データミックスコミュニティ Advent Calendar 2019](https://qiita.com/advent-calendar/2019/datamix)の15日目の記事です。
毎週お世話になっているデータミックスのカレンダーということで参加。

# Cloud Datalabとは

最近、業務で[Cloud Datalab](https://cloud.google.com/datalab/?hl=ja)を使い始めた。
Cloud Datalabとは、

> データの探索、分析、可視化と機械学習のための使いやすいインタラクティブなツール

> Cloud Datalab は、Google Cloud Platform でデータを探索、分析、変換、可視化し、機械学習モデルを構築するために作成された、高度なインタラクティブ ツールです。Compute Engine 上で動作し、さまざまなクラウド サービスに簡単に接続できるため、データ サイエンティストが本来の仕事に専念することを可能にします。

とのこと。
Compute Engine上にJupyter NotebookのDockerコンテナを立ててくれて、ローカルマシンから簡単にアクセスできる。
Compute Engineのインスタンスなので、~~お金で殴れば~~メモリやCPUを自由に変えられるところもいいところ。

始め方もすごく簡単で以下を打つとすぐにアクセスできる。

```bash
$ gcloud components install datalab

$ datalab create datalab-instance-name
```

すると

<img width="1680" alt="スクリーンショット 2019-12-13 14.40.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251929/d3776284-fa73-c61f-486c-d5f617731435.png">

こんな感じの画面が開かれる。

ノートブックはこんな感じ

<img width="1680" alt="スクリーンショット 2019-12-13 14.42.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251929/1f7ebe47-9389-fe07-7379-517371016658.png">


# Juliaを使う

このノートブックは

> Cloud Datalab は、豊富なモジュール エコシステムと強固なナレッジベースを誇る Jupyter（旧 IPython）上に構築されています。Cloud Datalab を活用することにより、Python、SQL、JavaScript（BigQuery のユーザー定義関数用）を使った BigQuery、Cloud Machine Learning Engine、Compute Engine、Cloud Storage のデータ分析が可能になります。

つまり、Juliaは使えない！
kernelから選べる言語を見てもpythonしか対応していない。

<img width="463" alt="スクリーンショット 2019-12-13 14.52.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251929/0f7e4135-c4db-0176-7347-82af990e8605.png">

最近[1日目の立川先生の記事](https://qiita.com/HiroyukiTachikawa/items/f4c7a620987a45b0429b)でもあったのを見てJuliaを使ってみたいな〜と思っていたので入れてみる。

## やること

- Datalabのインスタンスに入る
- それっぽいDockerfileを探す
- コンテナに入る
- JuliaをインストールしてJuputerで使えるパッケージを入れる

まずSSHしてインスタンスに入り、rootユーザになりDockerfileを探す。

```bash
$ sudo su

$ cd /

$ find ./ -name Dockerfile

./usr/share/docker/contrib/nnp-test/Dockerfile
./usr/share/docker/contrib/httpserver/Dockerfile
./usr/share/docker/contrib/syscall-test/Dockerfile
./usr/share/docker/contrib/desktop-integration/gparted/Dockerfile
./usr/share/docker/contrib/desktop-integration/chromium/Dockerfile
./mnt/stateful_partition/var/lib/docker/overlay2/0a2eef30ccfab906380374ebfe640fe5e9da75796598baecb20b041ce7a518fc/diff/tools/google-cloud-sdk/.install/.backup/platform/ext-runtime/nodejs/data/Dockerfile
./mnt/stateful_partition/var/lib/docker/overlay2/0a2eef30ccfab906380374ebfe640fe5e9da75796598baecb20b041ce7a518fc/diff/tools/google-cloud-sdk/.install/.backup/platform/ext-runtime/go/data/Dockerfile
./mnt/stateful_partition/var/lib/docker/overlay2/0a2eef30ccfab906380374ebfe640fe5e9da75796598baecb20b041ce7a518fc/diff/tools/google-cloud-sdk/platform/ext-runtime/nodejs/data/Dockerfile
./mnt/stateful_partition/var/lib/docker/overlay2/0a2eef30ccfab906380374ebfe640fe5e9da75796598baecb20b041ce7a518fc/diff/tools/google-cloud-sdk/platform/ext-runtime/go/data/Dockerfile
./var/lib/docker/overlay2/0a2eef30ccfab906380374ebfe640fe5e9da75796598baecb20b041ce7a518fc/diff/tools/google-cloud-sdk/.install/.backup/platform/ext-runtime/nodejs/data/Dockerfile
./var/lib/docker/overlay2/0a2eef30ccfab906380374ebfe640fe5e9da75796598baecb20b041ce7a518fc/diff/tools/google-cloud-sdk/.install/.backup/platform/ext-runtime/go/data/Dockerfile
./var/lib/docker/overlay2/0a2eef30ccfab906380374ebfe640fe5e9da75796598baecb20b041ce7a518fc/diff/tools/google-cloud-sdk/platform/ext-runtime/nodejs/data/Dockerfile
./var/lib/docker/overlay2/0a2eef30ccfab906380374ebfe640fe5e9da75796598baecb20b041ce7a518fc/diff/tools/google-cloud-sdk/platform/ext-runtime/go/data/Dockerfile
./var/lib/docker/overlay2/e7104b73a79e5676bd3e91fe8211a7bdf16d662be55b2344700abafd222dfbb1/merged/tools/google-cloud-sdk/.install/.backup/platform/ext-runtime/nodejs/data/Dockerfile
./var/lib/docker/overlay2/e7104b73a79e5676bd3e91fe8211a7bdf16d662be55b2344700abafd222dfbb1/merged/tools/google-cloud-sdk/.install/.backup/platform/ext-runtime/go/data/Dockerfile
./var/lib/docker/overlay2/e7104b73a79e5676bd3e91fe8211a7bdf16d662be55b2344700abafd222dfbb1/merged/tools/google-cloud-sdk/platform/ext-runtime/nodejs/data/Dockerfile
./var/lib/docker/overlay2/e7104b73a79e5676bd3e91fe8211a7bdf16d662be55b2344700abafd222dfbb1/merged/tools/google-cloud-sdk/platform/ext-runtime/go/data/Dockerfile
```

怪しそうな`./usr/share/docker/contrib/httpserver/Dockerfile`を見に行ってコンテナを確かめる

```bash
$ cd /usr/share/docker/contrib/httpserver/

$ docker ps -a

CONTAINER ID        IMAGE                                         COMMAND                  CREATED             STATUS              PORTS                      NAMES
7852ff2c96ac        gcr.io/google-containers/fluentd-gcp:2.0.17   "/bin/sh -c '/run.sh…"   12 minutes ago      Up 11 minutes       80/tcp                     logger
916f949d7331        gcr.io/cloud-datalab/datalab:latest           "/datalab/run.sh"        12 minutes ago      Up 11 minutes       127.0.0.1:8080->8080/tcp   datalab
```

まさにそれっぽいコンテナ発見！
そのコンテナに入ってJuliaを入れる。

```bash
$ docker exec -it datalab bash

# ここからコンテナ内

# Juliaの公式サイトから落としてくる
$ wget https://julialang-s3.julialang.org/bin/linux/x64/1.3/julia-1.3.0-linux-x86_64.tar.gz

# 解凍
$ tar -zxvf julia-1.3.0-linux-x86_64.tar.gz

$ ls julia*

julia-1.3.0-linux-x86_64.tar.gz

julia-1.3.0:
bin  etc  include  lib  libexec  LICENSE.md  share
```

無事juliaが入ったので、pathを通して呼び出せるようにする

```bash
# pathを通す
$ echo "alias julia='/julia-1.3.0/bin/julia'" >> ~/.bashrc

# shell実行
$ exec $SHELL

# 呼び出し
$ julia

               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.3.0 (2019-11-26)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org/ release
|__/                   |
julia> 
```

無事呼び出せた!

ここにIJuliaを入れてJupyter Notebookで使えるようにしていく。

```bash
julia> ]

(v1.3) pkg> add IJulia

# パッケージモードを抜けます
^C

julia> using IJulia
[ Info: Precompiling IJulia [7073ff75-c697-5162-941a-fcdaad2a7d2a]

julia> notebook(detached=true)
install Jupyter via Conda, y/n? [y]: y

# 色々あってちょっと長い

> julia
```

これで完了したらノートブックを読み込み直す。

<img width="347" alt="スクリーンショット 2019-12-13 15.21.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251929/b4af971e-a7c6-dde1-1d4b-58301a51519e.png">

ここにjuliaが追加されて入れば成功！

<img width="1680" alt="スクリーンショット 2019-12-13 15.29.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251929/4f86f964-f6f7-c92e-9bf3-42bf754e9c56.png">

juliaが使えるようになった！