Pluto.jlはJuliaのノートブックの一つだ。
ノートブックといえばJupyterのノートブック(拡張子が.ipynb
のやつ)が有名だ。
Jupyterの名が示すとおり、JuliaはJupyterノートブックで扱うことができる(IJuliaを使う)。
ではなぜPluto.jlなどというものがあるのだろうか。
実はPluto.jlはJupyterノートブックとはかなり異なるものであり、いくつかのユニークな性質もあるので、それについて書きたいと思う。
Pluto.jlの特徴
先程載せたウェブサイト(https://plutojl.org)には2つ特徴がまとめられている。 それはREACTIVITYとREPRODUCIBILITYだ。
Reactivity
Reactivityとは、例を挙げると、MS Excelのようにある場所で値を更新すると、それに依存するすべての部分が再評価される性質である。 Pluto.jlは各セルの間の依存関係を自動で把握し、実行を自動で行ってくれる。 ここで更にHTMLのinput要素などを組み合わせることで、HTMLを介して変数を操作し、その計算結果をreactiveに見ることが簡単にできる(eventの管理などいらない!)。
Reproducibility
Reproducibilityは、(もちろん)再現可能性なわけだが、Pluto.jlはノートブック単体でreproducibilityを達成している。
前提として、Pluto.jlノートブックは通常の.jl
フォーマットに従っており、そのファイル自体を実行することもできる。
そしてそのファイルの中に、Project.toml
やManifest.toml
に相当するもの1が入っており(Stringとして書いてある)、
その情報でノートブックごとに環境を自動で作成してくれる。
結果の保存
少々脱線するが、Pluto.jlノートブックはただのテキストファイルであるので、Jupyterノートブックのように結果を保存する機能はない。 (実行の様子をアニメーションで保存する)HTMLやPDFとしてエクスポートする機能はあるので、それらを使えば十分であるとも考えられる。 Reactivityという性質も合わさり、大規模な(i.e. 実行に時間のかかる)コードはあまり向いていないと思っている。
上記の特徴を実現するための/に関連するノートブックの特徴
上記はPluto.jlの説明には必ず出てくるような内容だったが、ここからは上記の性質と関連したPluto.jlノートブックらしい性質を並べてみる。
1. セルとはプログラムの"1行"のまとまりである。
Jupyterノートブックのセルは、単純にスクリプトファイルを分割したものであり、分割場所は(セル自体が妥当なプログラムであれば)任意の場所で区切る(もしくはくっつける)ことができる。 一方Pluto.jlではセルはREPLで実行される単位で必ず区切られてなければならない。 つまり例えば、
x = 1
y = 1
とは書けない。
どうしても1セルで書きたい場合2は、スコープを導入しないブロックbegin ... end
を使えばよい。
2. 同じ変数を2度定義できない
変数の依存関係が自動で解決されるので、同じ変数を複数のセルで定義することができない。 これも通常のスクリプトでは考えられない制約である。
ただもちろん関数定義内やbegin ... end
、let ... end
ブロック内では通常のように変数に上書きできる。
3. セルの順番は実行順番とは関係ない
2.であったように、変数は基本immutableとなる。 そうなるともはやセルの順番は実行順番とは関係なくなる。 したがって、下の方に定義した関数を上のセルで呼び出すことも可能だ。
ではファイルではどのように保存されているのか?
前述の通り、Pluto.jlノートブックは通常の.jl
ファイルとして実行できる。
しかし、セルの順番は実行順とはことなる場合もある。
したがって、Pluto.jlノートブックは.jl
として保存する際、セルをIDを(コメントで)振りつつ実行順で記述した後、
ファイルの最後あたりにセルの順番でIDを並べている。
その他の特徴
以上でおおよそ書きたいことは書いたのだが、ついでなのでその他の特徴を書いておく。
- Live Docパネルがあり、カーソル上のExprや検索でヘルプ(Docstring)を見ることができる。
- HTMLなのでLaTeXはMathJaxで描画される。
- 少々キーバインディングが特殊(Jupyterほど機能が多くない)
- PlutoUI.jlを用いればHTML inputの要素を簡単に、かつJuliaらしくかけるようになる。
- Jupyterのようにmarkdownセルはない。
md"..."
3を使って書けば、HTMLで描画してくれる。 - その他DataFrameなどはきれいに表示される
適した用途
以上の特徴を踏まえ、個人的に適してると考えた用途を以下にかく
- REPLにおけるprototypingの代わりとして
- reactivity故にいちいち更新する手間が省ける
- しかし、ノートブックごとに別環境となるのでprecompileもその分時間がかかる
- 電卓として
- LaTeXが数式として描写されるので、Latexify.jlとの相性が非常に良い
- 数式の誤入力に気づきやすい
- 簡単なアプリケーションのフレームワークとして
- Web関連技術に基づいた高品質なUIを簡単に作れる
- とにかくreactiveなので何も考えなくてもinteractiveなものをつくれる
- reproducibilityが配布時の動作を保証してくれる
- 上の方にUIをまとめて下に内部の関数定義をまとめるといったことも可能だ(セルは結果だけを表示し、コードを隠すことができる)
Notebook(しかも独自の)という情報だけから主にEditorとしての機能の少なさを嫌って食わず嫌いしていたが、 実際に使ってみるとユニークな機能がたくさんあり、虜になってしまった。 皆さんも是非使ってみてはいかがだろうか。
Comments
Reply to this post (mastodon) to leave a comment.
Reply