🔧nextjournal/clerk

📝Jupyter Notebookに対抗するようなClojureのツール.

Info

オープンソースだが, Nextjournalという, 📝Reproducible Researchのサービスを出している会社が力をいれて開発をしている.

Basics

  • clerk/serve!: REPLと接続してnamespaceを共有するような内蔵サーバを起動.
  • cleak/show!: notebookのnamesapceをブラウザに表示.
  • clerk/clear-cache!: キャッシャクリア(トラブルシューティング).

組み込み表示関数

  • clerk/table: テーブル表示
  • clerk/vl: 📝Vega-Liteのデータを表示.

💡Clojure: Jupyter Notebook連携でox-babelを使おうとした時の課題は, テーブルデータや画像の表示だった. テキストならよいがメディアをOrg-modeでつかうのはあまり適していない. この点においてはJupyter notebookは優れていた. しかしclerkならば, 組み込みの表示関数がいい感じにデータを可視化してくれる👍

Tips

コードを非表示にするには?

非表示にしたい部分で以下を書く.

  • code
    • hide
    • fold
    • show
  • result
    • hide
    • fold
    • show
^{:nextjournal.clerk/visibility {:code :hide}}

namespace全体に適応もできる.

(ns visibility
  {:nextjournal.clerk/visibility {:code :fold}})

tech.ml.datasetの関数をつかうと監視でエラー

ハマったのでメモしておく, 原因不明.

tech.v3.datatype.functionalに含まれるような関数でデータ処理をしてそれを名前空間に変数束縛ししたとき, clerkの監視でエラーする.

変換処理をしたものはbindしないか変換し直す.

(require '[tech.v3.datatype.functional :as dfn])
 
(clerk/table
 (-> ds
     (tc/add-columns {:test-lv (fn [x] (dfn/shift (:lv x) 1))
                      :test-sv (fn [x] (dfn/shift (:sv x) 1))})))
 
(def test-ds
  (-> ds
      (tc/add-columns {:test-lv (fn [x] (dfn/shift (:lv x) 1))
                       :test-sv (fn [x] (dfn/shift (:sv x) 1))})
      (tc/rows :as-maps)))

さらにupdate.

たぶんdfnで処理するとoutputの型がよくわからないものになる. intoなどでvectorに変換するとか, (tc/convert-type ds :float64)みたいな明示的な型変換が必要.

(def test-ds
  (-> ds
      (tc/add-columns {:test-lv (fn [x] (dfn/shift (:lv x) 1))
                       :test-sv (fn [x] (dfn/shift (:sv x) 1))})
      (tc/convert-types [:test-lv :test-sv] :int64)
      ))
 

htmlにexportするには?

clerk/build!をつかう.

Insights

I don’t like notebooks.- Joel Grusという動画からインスパイヤされたようで, Jupyter Notebookにおけるコードの管理や再利用性の煩雑さを解決しようとするもので, Jupyter Notebookを単にClojureで模倣したものではない.

👨Jeremy Hawardさんに反論していた…

アイデアとしてはClojureのnamespaceごとにnotebookをClojureのコードから生成する. そうすると, そもそもnotebookはコードでしかないから, 他の関数ともREPLを通じてデータも関数もなんでも共有できる, それはつまり📝Clojure REPL駆動開発の流儀でデータサイエンスができる.

References

🔧Clojure: Oz

📝Vega-LiteのClojure Wrapper.

Ozの情報自体は漁ってもあまりでてこないので, Vega Liteの情報でいろいろ調べたほうがいい. もしくは, Python Bindingsの📝Altairの情報は日本語でもそこそこある.

info

org-mode and Oz

Ozの出力をOrg-modeにinline表示するための方法. Ozは画像ファイルとして出力をしないので, 他の方法のように画像を吐き出して表示ができない. その代わりに, vega-cliという外部ツールをつかって画像を吐き出して表示する.

ref. ✅Clojure: 文芸的プログラミング with org-babel

emacs-vega-view

Emacsでvegaの画像を生成してバッファに表示. 内部でvega-cliをつかっている.

https://github.com/applied-science/emacs-vega-view

tips: JSONのkeyはkebab-caseではなくcamelCase

Clojureだとkebab-caseが主流だが, JSONのkeyはcamelCaseで書く.

ex.) timeUnit.