RaspberryPi 3 で 動作する Julia 環境を Docker で構築します。

# 本日は

少しマニアックかもしれませんが、ラズパイ３で Julia を動かしてみましょう。

# 公式サイトからダウンロード（する方法）

https://julialang.org/downloads/　ジャンプして Long-term support release (v1.0.3)　以下にある
32-bit (ARMv7-a hard float) の部分をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/135978/facc866e-2bcd-ba75-cfab-49127cd57226.png)

これを tar で解凍して path/to/julia-1.0.3/bin を PATH に追加する export すると動きます。

# Docker を使う方法

## Dockerの環境構築
[The easy way to set up Docker on a Raspberry Pi](https://medium.freecodecamp.org/the-easy-way-to-set-up-docker-on-a-raspberry-pi-7d24ced073ef) にある方法に従ってやると数行で準備が整います。

```
# terminal on your Raspberry pi
$ curl -fsSL get.docker.com -o get-docker.sh && sh get-docker.sh
# sudo をいちいち打ちたくない場合。。。
$ sudo usermod -aG docker pi
```

## 遊ぶ

あとは遊ぶのみ

```
$ docker run --rm -it julia:1.0.3
```

こちらの [Gist にて](https://gist.github.com/terasakisatoshi/11e76d62b642516ab2788e7bf569688d) 針をいっぱい投げることによる円周率を計算するスクリプトを置いておきましたので試してみてください。　各自で Python や C で書いて速度を比較すると面白いと思います。

# ソースからビルド

すいませんやったことないです。クロスコンパイル勉強してやってみたいですね。

# 環境作るのだるい

デスヨネー、https://hub.docker.com/r/terasakisatoshi/myjulia にてラズパイ用のイメージを公開しています。
よかったら遊んでみてください。　Dockerfile からやりたい人は [こちらにて公開しています](https://gist.github.com/terasakisatoshi/b61bb1228a7b0c7260fc8458cde8e68b)

Desktop 版で遊んでいる場合は下記のように X をマウントしておくと Plots.jl でのグラフ描画を閲覧することができます。

```console
$ cat run_container.sh
xhost +local:docker
docker run --rm -it \
-e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix/:/tmp/.X11-unix \
-v $(pwd):/work \
-w /work \
terasakisatoshi/myjulia:rpi3 bash
xhost -local:docker
$ bash run_container.sh
# 以下JuliaのREPLが見えるようになる
#root@xxxxxxx:/work#julia
               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.0.3 (2018-12-18)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org/ release
|__/     
julia> versioninfo()
Julia Version 1.0.3
Commit 099e826241 (2018-12-18 01:34 UTC)
Platform Info:
  OS: Linux (arm-linux-gnueabihf)
  CPU: ARMv7 Processor rev 4 (v7l)
  WORD_SIZE: 32
  LIBM: libm
  LLVM: libLLVM-6.0.0 (ORCJIT, cortex-a53)
Environment:
  JULIA_PATH = /usr/local/julia
  JULIA_GPG = 3673DF529D9049477F76B37566E3C7DC03D6E495
  JULIA_VERSION = 1.0.3
julia> # this is a sample code
julia> using Plots
julia> using TestImages
julia> plot(testimage("cameraman"))
```

こんな感じになれば成功です。右図は三角関数をプロットしています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/135978/51b68070-4226-714a-e6c1-c9bb27723f24.png)

PyCallと呼び出し元のPythonとして berryconda を使っています。メジャーなライブラリのインストールはこれで快適にできるかなという気がしています。

# 大変だったこと

## 描画系大変
`Plots.jl` が 32 ビットの環境にサポートしていないらしいので依存ライブラリの libGR.so を自前でビルドする必要があります。[Building the GR Runtime](http://gr-framework.org/building.html#source-install-from-git) にあるように依存パッケージを apt install すれば良いです。 （Docker でやろうとするといくつか修正が必要です。）

## ImageView が動かない

Macでもそうなんですが、ImageView.jl の依存する Gtk.jl や Cairo.jl 関係で `using ImageView`  ができないのでちょっと辛いです。`ImageView.imshow` の代わりに `Plots.plot` で代用できるのでこれで運用してみようと思います。

```julia
using Plots, TestImages
plot(testimage("c"))
```

# 初動のJIT コンパイル重い

普通のPCでも悩まされるのでラズパイでも容易に想像できます。

```
julia> using Plots
julia> using TestImages
julia> plot(testimage("cameraman"))
```

最初重いんですよね・・・。一度実行すると後の実行はサクサクできるんですが。

# 最後に

ついに HHKB を買ってしまったのでメイン機として運用できるか考えてみます♫