Jupyter NotebookのSnippetを作成してライブラリのimportを楽にする試み(Jupyter @ Dockerでの方法)

:warning: 以下の方法は最新のJupyterでは実行できなくなってしまっています．(Jupyter バージョン 4.9.2)

日頃からJupyter Notebookを活用しています。GPU搭載マシーン(Linux)上でDockerを実行してJupyter Notebook(Tensor Flow Notebook)のコンテナを立てて利用しています。Notebook利用時にimportするライブラリはいつも似通っており、毎度毎度記載するのが煩雑であり、面倒くさい行程と感じていました。そこで、Notebookのテンプレート(Snippet)を設定して、import文の記載を楽にする試みをやってみることにしました。Jupyterにインターフェースが似ているGoogle Colaboratoryには設定メニューからSnippetの設定が可能ですが、Jupyterには専用のextensionをインストールする必要が有ります。本記事ではJupyter @ Docker環境を対象にしています。筆者が設定時に情報を探しましたが、Jupyter @ Dockerの情報は見つかりませんでした。。。 :scream: 同様の環境構築を考えておられている方のお役に立てれば幸いです。

# Jupyter Nbextensions Configuratorのインストール
まずJupyter Nbextensions Configuratorをインストールします。筆者は`pip`コマンドでインストールを実施しました。

```bash
pip install jupyter_nbextensions_configurator
```

pipインストール完了後に`jupyter`コマンドを用いて有効化するために、以下のコマンドを実行します。

```bash
jupyter contrib nbextension install --user
```

# コンテナの再起動
Jupyterを実行しているコンテナの再起動を行います。利用しているコンテナ仮想化環境に合ったコマンドを実行して下さい。

```bash:Dockerの場合
docker container restart <CONTAINER_NAME>
```

```bash:Docker Composeの場合
docker-compose restart <CONTAINER_NAME>
```

# Snippetsの有効化
コンテナ再起動後に、JupyterのＵＲＬ(`<base_url>/tree`例えば`http://<ServerIP>:8080/tree`)にアクセスすると下図の様に`Nbextensions`タブが追加[^tab]されています。タブをクリックしてページを表示します。

![tab.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/2ad2eb1e-d621-539e-27e0-cefa843428e3.png)

## Nbextensionsの有効化
`disable configuration for nbextensions without explicit compatibility (they may break your notebook environment, but can be useful to show for nbextension development)`のチェックボックスを下図の様にオフにます。また、`Snippets`のチェックボックスをオンにして有効化します。

![config](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/c7b72eb6-0cd6-633a-1441-118a32d8041f.png)

[^tab]: Web上の情報や公式docでは`<base_url>/nbextensions`でアクセスすると表示される旨の説明が記載されていますが、筆者の環境では上手くアクセス出来ませんでした。

# Snippetsが有効化されていることの確認
新規Notebookを作成してSnippetsが有効化されているか確認します。下図の赤丸の部分に示すドロップダウンメニューが表示されていれば成功です。これでsnippetは使える様になりましたが、このままではサンプルsnippetしか利用出来ません。(因みにサンプルsnippetはZen of Pythonを表示させる`import this`コマンドが記載されているだけです。)

![notebook](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/287433f3-e8f1-fa98-989f-6eb439a98bac.png)

# 自作snippetの登録
自作snippetを登録する場合、`.local/share/jupyter/nbextensions/snippets/snippets.json`に登録したい内容を追記します。筆者はPyTorchの専門書を読みながらNotebookを利用する時に大量にimport文を書きたくないので、必要なライブラリを直ぐにimport出来る状態にしておくためのsnippetを登録しました。

```json:snippetの例
{
    "snippets" : [
        {
            "name" : "example",
            "code" : [
                "# This is an example snippet!",
                "# To create your own, add a new snippet block to the",
                "# snippets.json file in your jupyter nbextensions directory:",
                "# /nbextensions/snippets/snippets.json",
                "import this"
            ]
        },
        {
            "name" : "PyTorch NoteBook",
            "code" : [
                "import xml.etree.ElementTree as ET",
                "import glob",
                "import json",
                "import os.path as osp",
                "import random",
                "",
                "import cv2",
                "import numpy as np",
                "import matplotlib.pyplot as plt",
                "import torch",
                "import torch.nn as nn",
                "import torch.optim as optim",
                "import torch.utils.data as data",
                "import torchvision",
                "",
                "from PIL import Image",
                "from tqdm import tqdm",
                "from torchvision import models, transforms",
                "",
                "%matplotlib inline",
                "",
                "torch.manual_seed(1234)",
                "np.random.seed(1234)",
                "random.seed(1234)"
            ]
        }
    ]
}
```

# まとめ
以前から気になっていたJupyter Notebookのsnippet登録が漸く出来ました。今後よく使うNotebookはテンプレート化して直ぐに利用出来る様に活用していこうと思います。

# Reference

https://chayarokurokuro.hatenablog.com/entry/2019/11/02/015051

https://jupyter-contrib-nbextensions.readthedocs.io/en/latest/nbextensions/snippets/README.html

https://jupyter-contrib-nbextensions.readthedocs.io/en/latest/install.html

https://github.com/Jupyter-contrib/jupyter_nbextensions_configurator

https://qiita.com/_snow_narcissus/items/647a6d3cec0a9bdb8980