Scrapboxによる ゆるやかなJupyter Notebook上でのコミュニケーション

# ゆるやかなつながり

唐突ですが、 Death Stranding、良いですよね。オンラインでのゲームの連携プレイは（自分の力量とかを気にしちゃって）どうも敬遠しがちなのですが、この、お互い建設物を融通しあってゆるやかに繋がる世界、とても心地よい感じです。(国道建設素材の収集のため配達依存症コミュニティを殴って回りながら。)

さて、Jupyter Notebookですが、周辺ではだいぶ道具として浸透してきた感があります。
仕事と研究という二足の草鞋生活を(いまだに)続けているわけですが、それぞれ1つのNotebookを2人以上で使いたい場面が結構あります。このようなNotebookの共有の画面では、以下のような障壁があるのではないかなと思います。

- Jupyter Notebook環境の共有をどうするか
- Jupyter Notebookそのものの共有をどうするか

Jupyter Notebook環境の共有は、お仕事は、お仕事させていただいているNIIさんが作っている [LC4RI全部入りイメージ](https://hub.docker.com/r/niicloudoperation/notebook/) を使っているのでそれでOK。研究は Anaconda でインストールしている人が自分の周りでは大半なので、conda前提でライブラリを構成していれば特にトラブルもないかなあという感触です。

**今ひとつなのがJupyter Notebookそのものの共有**で、バージョン管理、共有など規約、ツールにイマイチ決定打がなく(Colabにどっぷり浸かるという選択肢はあるかもしれないが...)、とりあえず.ipynbファイルをメールで送りつけるみたいなのが現状になってしまっています。
例えば送った先でNotebookの問題を見つかって、それが修正された場合に、送信元にフィードバックしてもらうにはそれなりに手間がかかります。それに、フィードバックしてもらっても、自分のところに反映するのは後回しになりがちで(ロジックの変更だと動作確認しないと気持ち悪いし)、次同じものを使うときにはフィードバックを受けたことも忘れてしまう、みたいなのが実情と感じています。

これは、Jupyter Notebook自体が、やりたいこと固有の記述と環境固有の記述をどう分離するかとか、ソフトウェア設計的なことに関する規定をしていないということに由来していると個人的には感じていますが、これはこれでデータとの対話に集中できるというメリットをもたらしていると思っているので、仕方ないのかなと。

そんな問題意識で、今回は国立情報学研究所(NII)さんが作っている [sidestickies](https://github.com/NII-cloud-operation/sidestickies) と [nblineage](https://github.com/NII-cloud-operation/Jupyter-LC_nblineage) についてご紹介。

# セルの由来追跡 - nblineage

[nblineage](https://github.com/NII-cloud-operation/Jupyter-LC_nblineage) は、Jupyter Notebookにインストールすることができる拡張(Extension)で、このExtensionはセルがどこで作られたものかを調べるための手がかりを記録する機能を提供します。

このExtensionをインストールすると、セルに以下のようなメタデータが自動的に付加されるようになります。

```
{
  "lc_cell_meme": {
    "current": "8f5c5fe2-71cc-11e7-9abe-02420aff0008",         ## The meme id for this cell
    "previous": "8f5c5cea-71cc-11e7-9abe-02420aff0008",        ## The context of this cell as reference to the previous and the next cells
    "next": "f2125b84-4669-11e7-958b-02420aff0006",
    ...
  },
...
}
```

この `current` なる項目は、新しいセルが作成された際に一意になるよう付加される識別子で、これをnblineageではMEME(ミーム)と呼びます。以後セルがコピーされる際に引き継がれるため、生まれが同じセルには同じミームが保持されることになるわけです。このExtensionだけだと特にメリットを感じる機会は少ないでしょうが、後述のsidestickiesの実現のためのメカニズムを提供します。

インストールは、 https://github.com/NII-cloud-operation/Jupyter-LC_nblineage#installation にしたがって以下のように実施してください。

```
$ pip install git+https://github.com/NII-cloud-operation/Jupyter-LC_nblineage
$ jupyter nblineage quick-setup
```

これで、nblineageをインストールしたJupyter Notebook環境でNotebookを作成・編集すると、ミームがセルに自動的に付与されるようになります。

# セルへのコメント追加 - sidestickies

[sidestickies](https://github.com/NII-cloud-operation/sidestickies) は、セルに対して付箋を貼り付ける機能を提供します。sidestickiesをインストールすると、以下のようにセル右端に付箋が現れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28770/89d322ad-f9e9-6e52-19e3-2e7502c1749c.png)

付箋右端の吹き出しをクリックすると、以下のようにScrapboxの編集ページが表示されます。このページのタイトルが、付箋のテキストとしてNotebook上に現れるわけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28770/18029ba4-b427-9f57-8441-2b0b8bb9ba56.png)

この付箋機能のポイントは、Scrapboxのハッシュタグとして先述のミームが自動的に埋め込まれ、ミームを手がかりとしてセル上に付箋として付与される点にあります。同一のScrapboxプロジェクトを参照していれば、セルのミームを通じてコピーされたセルにも同じ内容の付箋が表示されるようになります。


## インストール・設定手順

sidestickiesを利用するには、先述のnblineageのインストールに加えて、以下のExtensionをインストールする必要があります。

```
$ pip install git+https://github.com/NII-cloud-operation/sidestickies.git
$ jupyter nbextension install --py nbtags
$ jupyter serverextension enable --py nbtags
$ jupyter nbextension enable --py nbtags
```

インストールしたら、付箋に表示するデータをScrapboxから取得できるよう、jupyter_notebook_config.pyに以下のような項目を追記します。

```
c.ScrapboxAPI.project_id = 'your-scrapbox-project-id'
c.ScrapboxAPI.cookie_connect_sid = 'your-cookie-connect-sid-on-scrapbox'
```

`your-scrapbox-project-id` は付箋データの共有に使うScrapboxプロジェクトのIDで、
特にプロジェクトがprivateなものの場合は、 `your-cookie-connect-sid-on-scrapbox` に、 [ScrapboxのprivateプロジェクトのAPIを叩く](https://scrapbox.io/nishio/Scrapbox%E3%81%AEprivate%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AEAPI%E3%82%92%E5%8F%A9%E3%81%8F) の手順で得たコードを設定する必要があります。

# まとめ

このような感じで、同一の由来を持つセルに付箋を付与する機能を用いることで、例えば昔使ったNotebookをコピーしてちょこちょこ使っていた際に、ちょっと微妙な点が見つかったとしても、セルに付箋を追記しておけば、昔使ったNotebookを流用した別の人にもその付箋が見えるようになります。

これはなんかもう一種のカイラル通信ですね。ビーチを通じて情報がうんぬん(しつこい)

いろいろ今後改修されるところはあるようなので、またアップデートあれば更新したいところ...