Pluto.jl という対話操作が得意な Julia のためのノートブックの紹介

# 本日は

- Julia アドベントカレンダーのために書きました．
- Pluto.jl という Jupyter Notebook っぽいことができるけれど，対話操作が得意なノートブックを作ることができるパッケージです．ここでの対話操作というのは パラメータの変動をスライドで表現してグリグリ動かすと言ったようなことです．Pythonでいうところの ipywidgets や Julia での Interact.jl で提供される機能というイメージを持っていただければOKです．
- Interact.jl で作ってスライドを操作させるよりも Pluto.jl の上で構築した方がスライダーを変化させて得られる結果のレスポンスは良い印象があったので個人的には気に入っているパッケージの一つです．
- 最近では MIT レクチャーで Pluto.jl が使われています．

[Working with images in Julia | Week 1 | 18.S191 MIT Fall 2020 | Grant Sanderson](https://www.youtube.com/watch?v=DGojI9xcCfg)

リポジトリ https://github.com/mitmath/18S191 を見ると Pluto.jl のノートブックが使われていることがわかります．教育用途で用いて積極的に活用しようとする姿勢が伺えます．

# 導入

## Pluto.jl の導入

Pluto.jl は公式パッケージとして登録されているので次のようにして導入ができます．Juliaを起動しREPLで次を実行します．

```julia
$ julia -q # -q で Julia のロゴの出力を抑制できる
julia> using Pkg; Pkg.add("Pluto")
julia> Pkg.status("Pluto") # Pluto のバージョンを確認
Status `~/.julia/environments/v1.5/Project.toml`
  [c3e4b0f8] Pluto v0.12.15 `~/.julia/dev/Pluto`
```

続いて動作確認のために Pluto によるノートブックを起動してみましょう．

```
julia> using Pluto
julia> Pluto.run()
```

http://localhost:1234/ にアクセスします．Jupyter Notebook と同様にタブが開いてフォーカスが向くはずです．下図のような結果が出れば成功です．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135978/b5ff15f6-b9ef-63d2-dfbc-49ff2e6579d7.png)

`Open a sample notebook` を開いてサンプルを眺めることもできますし．`Create a new notebook` で一から作ることもできます．

ポート番号やホストの設定などもキーワード引数を指定することで変更することができます．（下記の docstring を参照）

```julia
  Pluto.run(; kwargs...)

  For the full list, see the Pluto.Configuration module. Some common parameters:

    •    launch_browser: Optional. Whether to launch the system default browser.
        Disable this on SSH and such.

    •    host: Optional. The default host is "127.0.0.1". For wild setups like Docker
        and heroku, you might need to change this to "0.0.0.0".

    •    port: Optional. The default port is 1234.
```


## ぐりぐり動かして楽しめるサンプル

- 自分が作ったサンプルを紹介します． [この gistのリンク先に](https://gist.github.com/terasakisatoshi/e5b5a2dee125a4ab1ae52e97b1a15194) に行って `sample.jl` を自分の作業ディレクトリへダウンロードします．
- サンプルを動かすために依存パッケージの導入をしましょう．
一旦上記で起動した Pluto のセッションを終了しもう一回 Julia を起動しなおします．

```julia
$ julia -q
julia> using Pkg; Pkg.add(["Plots", "PlutoUI", "LaTeXStrings", "Images", "TestImages"])
julia> using Pluto; Pluto.run()
```

`Open from file` の入力欄に `sample.jl` と入力して `Open` ボタンをクリックします．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135978/2b71e838-0603-9f42-929c-20e244c102ce.png)

そうすると [このリンク](https://gistpreview.github.io/?e5b5a2dee125a4ab1ae52e97b1a15194/sample.html) のような結果が得られます．(このリンクは sample.jl を HTML に変換しただけなのでスライドなどを動かしても内容が変更することはできません)

Jupyter Notebook とは異なりセルの結果は上に出力されます．下図の `t` をぐりぐり動かすととても滑らかに `sin` 関数が動いている様子がわかると思います．

![goma.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135978/257cf30c-fd0e-2a62-13ea-9f566ea44c2c.gif)

`@bind t Slider(-pi:0.01:pi)` のようにして変数 `t` と Slider オブジェクトを対応付けることができます．

画像アプリケーションの例を見るとスライダーの他にも指定したファイルを開いてその画像を回転するという操作をすることができることがわかるでしょう．GIFサイズの関係で画像は荒くしてありますが，手元で動かすともっとスムーズに動いていることがわかるはずです．

![goma.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135978/26b39bd0-f6b3-e254-9920-82725242e70b.gif)

# まとめ

Pluto.jl の紹介をしました．

下記のYouTube動画も合わせてみてください．

[JuliaCon 2020 | Interactive notebooks ~ Pluto.jl | Fons van der Plas](https://www.youtube.com/watch?v=IAF8DjrQSSk&t=1240s)