📝

[Julia]Pluto.jlを導入してみた

2021/04/26に公開

プライベートで書くスクリプトを、PythonからJuliaに移行していくかー、と思い、ライブラリだったりのテスト書きをしていました。
その過程で、インタラクティブなIDE(と言うべきかは怪しいけど、、)もJulia用にPluto.jlと言う物があったので、サクッと入れてみました。

  • Pluto.jlとは一体、、
  • JupyterLabと比べると、、

の2本立てで、Pluto.jlの所感をまとめていきます。

Pluto.jlとは

Julia + React(Preact)製のインタラクティブIDEです。こうしたアプリケーションは割とフロントエンド側の実装・依存が複雑で読むと「うげー」となっちゃいがちなのですが、Pluto.jlはかなり分かりやすい実装をしているイメージです。依存もCDNで紐付けているので、実行にはJuliaさえあれば大丈夫!

READMEにも書かれている売りは3点で

  • reactive - when changing a function or variable, Pluto automatically updates all affected cells.
  • lightweight - Pluto is written in pure Julia and is easy to install.
  • simple - no hidden workspace state; friendly UI.

特に大きいのは機能にダイレクトに関わる reactive のポイントかなー、と思っています。書いてある通りなのですが、セルに書かれている関数や変数が変更されると、Plutoでは自動でその変更に合わせて関連するセルをアップデートしてくれます。なので、JupyterLabでありがちな、セルだったりをいじりまくっていたら、メモリ上には変数が残っているが、宣言部が無くなってしまい、次回起動時に動かなくなっちゃった、、と言う事象がブロックされます。
# 下のGIFはPluto.jlのREADMEと同じ物を貼っています

軽量な上、シンプルなUIの上で、ノートブック内の整合性をキープしつつ、スクリプトを書けるのがPluto.jlの良さと感じます。

導入

lightweight にも書かれている通り、Juliaで書かれているので、難しいことは全く無しにパッケージをインストールすればOKです。

julia> using Pkg; Pkg.add("Pluto")

起動

とても簡単です。

julia> using Pluto; Pluto.run()

これで、ポート 1234 でエディタが立ち上がります。

画面

トップページ

localhost:1234 へ行くと、こんな画面が立ち上がります。

簡素、、笑
新規のノートブックと既存オープン、あとはリモートのファイルを開くサポートもあります。

エディタ

Create すると、こんな画面が立ち上がります。

これもシンプルです。
バーッと書いていくと、こんな具合で埋まっていきます。

実行結果はセルのに入っていくんですねー。

上でGIFを貼った通りなのですが、x の値を変えると、プロットも自動でアップデートされます。

右下の Live Docs は、変数やファンクションを入れると、その変数型やファンクションのドキュメントを参照出来ます。ファンクションを書く途中でサジェストで出てくる、ぐらいなエディタが多い中で、using で書いたパッケージのドキュメントも含めて横串検索が効きます。

これ、結構便利なんですよね、、


JupyterLabとの比較

注意
厳密さは無いです!気付いたベースで、、

インタラクティブIDEのJupyterLabとは、ほぼトレードオフな構図なイメージです。

  • セットアップの容易さ
    • Pluto.jl
  • 軽量
    • Pluto.jl
  • リアクティブ(整合性キープが容易)
    • Pluto.jl
  • データ分析にまつわる周辺機能が充実
    • JupyterLab
  • 多言語対応
    • JupyterLab

サクッと使えるPluto.jlに対して、色々と手が届く範囲が広くて便利なJupyterLabか、、と言う図の中で、Pluto.jlの場合、リアクティブな点でアドバンテージを稼いでいる印象です。

私も使ってみて、リアクティブでノートブックの中身がこわれない(次回開き直した時に、ちゃんと動く)点が良いなー、と心を掴まれてた人種です。安心感を保ちつつ、自由にサクサク書けるのは精神衛生が最高ですね。

まとめ

おいでよ、Pluto.jlの森。

Discussion