jupyter_contrib_nbextensionsのスニペット作成で迷ったのでメモ

### 更新：11/12
コマンドラインで

```
jupyter --data-dir
```
と打ったら、一発で

```
/Users/user_name/Library/Jupyter
```

と出てきました！何で思いつかなかったんだ...:japanese_ogre::japanese_ogre::japanese_ogre:

## はじめに
#### **jupyter_contrib_nbextensionsとは？**

Jupyter notebookに拡張機能を追加できるパッケージです。（Jupyter Labは未対応）
できることは全てこの記事にまとまっています。
> [[作業効率化] Jupyterの拡張機能を全部調べてみた](https://qiita.com/simonritchie/items/88161c806197a0b84174#_reference-240930cf9e33681a0636)

少し拡張機能を紹介すると、目次の自動生成やコード補完、スニペットの登録などをできるようになります。

#### インストール手順

[公式のサイト](https://github.com/ipython-contrib/jupyter_contrib_nbextensions)のReadmeにまとまっていますが引用すると、

```
pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install --user
```

このコマンドを実行後にJupyter notebookを起動すると、**nbextensions**というタブが増えていて、そこから拡張機能のON/OFFを切り替えられるようになります。

↓ こんな感じのものが表示されるはず！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/221497/19341cdd-5bfd-fd43-2bea-90c3b054834f.png)

中でも**スニペット登録機能**は、分析の度に書くお決まりのパッケージインポート文や、チーム内で決めているフォーマット（分析の目的、分析者、データ抽出元など）を登録しておくと毎度の手間が減り、とても便利です。

公式のReadmeも参考にしながら設定していたのですが、知識不足でわからない部分があり、土曜日うんうん唸りながら試行錯誤してやっと解決できたのでここでやり方をまとめます。

## ハマったポイント

[公式ページ](https://github.com/ipython-contrib/jupyter_contrib_nbextensions/tree/master/src/jupyter_contrib_nbextensions/nbextensions/snippets)

公式ページの引用をすると、

![snippets-demo.gif](https://qiita-image-store.s3.amazonaws.com/0/221497/1bf8be7d-71a7-62c6-06b5-45cbcd05374e.gif)

こんな感じで登録したスニペットをドロップダウンで選択して入力できるというもので、

`$(jupyter --data-dir)/nbextensions/snippets/`のディレクトリにある`snippets.json`内にjsonを追加することでスニペットを登録できるというものです。

```json:snippets.json
{
    "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 data directory under nbextensions:",
                "# $(jupyter --data-dir)/nbextensions/snippets/snippets.json",
                "import this"
            ]
        },
        {
            "name" : "some imports",
            "code" : [
                "import numpy as np",
                "import matplotlib as mpl",
                "print('spam')"
            ]
        }
    ]
}
```

待て、`(jupyter --data-dir)`って何？ ( ﾟ ω ﾟ )
ここでハマった。
あちこち`ls`しまくって探して、それっぽいのを見つけて変更しても変更が反映されず、途方に暮れました。

## 解決！

```
jupyter --path
```
で、jupyterのデータの読み先を確認。

```
config:
    /Users/user_name/.jupyter
    /usr/local/etc/jupyter
    /etc/jupyter
data:
    /Users/user_name/Library/Jupyter
    /Users/user_name/python/normal_env/share/jupyter
    /usr/local/share/jupyter
    /usr/share/jupyter
runtime:
    /Users/user_name/Library/Jupyter/runtime
```


のように出力されるので、`data:`のところの一番上にあった`/Users/user_name/Library/Jupyter`配下の`./jupyter/nbextensions/snippets/snippets.json`を変更したら無事スニペットが登録されました！

```json:snippets.json
{
    "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" : "always",
			"code" : [
				"# I got the true directry"
			]
		}
    ]
}
```

↓ ちゃんと反映されている！！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/221497/99ec19ef-6bc2-f20b-ac02-7f5733d65f3d.png)

長い道のりでした。。。

#### 補足
自分は環境分離に`virtual_env`を使っているので、Anacondaの方は違う解決方法になるかもしれません。