JupyterLabをローカルとリモートで使い始める方法。git拡張もできる。

##始めに

JupyterLabを導入した時の個人的なメモ。環境構築は忘れやすいので。

####参考資料

* Installation — JupyterLab 2.2.6 documentation
https://jupyterlab.readthedocs.io/en/stable/getting_started/installation.html

* JupyterLabのすゝめ - Qiita
https://qiita.com/kirikei/items/a1639954ce5ccaf7ac3c

####実行環境

Anacondaユーザーはpipと競合するので、この記事の対象外です。

* macOS Catalina 10.15.6
* pip 20.2.2
* python 3.8.5

##インストール

```
$ pip install jupyterlab
```
これだけです。ただし、Jupyter Notebook 4.3以上が必要なので

```
$ jupyter notebook --version
```
で確認しておきます。この時は6.1.3でした。

##起動

```
$ jupyter lab
```

これでSafariが自動で起動し、JupyterLabが使えるようになりました。この時のURLが `http://localhost:8888/lab` となっていると思います。


####リモートでJupyterLabを使いたい時

参考：
 
* https://qiita.com/shinochin/items/23e78499bc78b90fbc62
* https://blog.amedama.jp/entry/jupyter-nb-ssh-port-forwarding

まずリモートサーバーにjupyterをインストールします。sshでリモートサーバーにアクセスして

```
$ pip install jupyter
$ pip install jupyterlab
```
を実行。ちなみに導入した時のバージョンは jupyter-notebook : 6.0.3 でした。
次にJupyterLab (Jupyter Notebook)のパスワードを設定します。xxxxxの部分は適宜自分で決めて下さい。

```
$ python3
>>> from notebook.auth import passwd
>>> passwd('xxxxx', algorithm='sha512')
>>> exit()
```

すると `'sha512:...:...'`という長い英数字の羅列が出てくるので、これをコピーしておきます。
次にJupyterの設定ファイルを生成して中身を書き換えます。エディタはvi以外でも良いし、`jupyter_notebook_config.py`の置いてある場所は人によって違うかもしれません。

```
$ jupyter notebook --generate-config
$ vi ~/.jupyter/jupyter_notebook_config.py
```

色々と設定できますが、最低限以下を書き換えます。sha512...はさっき見たやつです。8889の部分は何でも良いですが、ローカルでJupyterを立ち上げた時の自動設定と競合するので8888は避けています。

```linux:jupyter_notebook_config.py
   c.NotebookApp.ip = 'localhost'
   c.NotebookApp.open_browser = False
   c.NotebookApp.password_required = True
   c.NotebookApp.password = 'sha512:...:...'
   c.NotebookApp.port = 8889
```

場合によってはJupyterのPATHの設定が必要です。エラーに遭遇したら`~./bashrc`に書き加えましょう。`source ~/.bashrc`も忘れずに。

```linux:~/.bashrc
 export JUPYTER_CONFIG_DIR=/(absolute_path)/(to)/.jupyter
 export JUPYTER_DATA_DIR=/(absolute_path)/(to)/share/jupyter
 export JUPYTER_RUNTIME_DIR=/(absolute_path)/(to)/share/jupyter/runtime
```

これでリモート側の設定が完了しました。Jupyter Notebookを使いたい場合は

```
$ jupyter notebook
````
JupyterLabを使いたい場合は

```
$ jupyter lab
```
と打ちます。

ここで、別のターミナルを立ち上げてローカルでの操作を行います。（開発中に一旦ログアウトして以下のsshをやり直すのが面倒で、ssh port forwarding専用のターミナルを開いている）

```
$ ssh -NL 8889:localhost:8889 <ssh先の名前>
```
1つ目の8889は次のURLに対応していて、２つ目の8889はリモートでJupyterの設定ファイルに書いた４桁の数字です。そしてブラウザで `http://localhost:8889/`を開きます。パスワードが求められるので、ここではxxxxxを入力します。実際にはもう少し真面目なパスワードを設定しましょう。

以上、リモート環境でJupyterLabが使えるようになりました。この後に書く設定は、サーバーごとにやる必要がありそうです。


##カスタマイズ

カスタマイズについては徐々に追加して行こうと思うのですが、例えば

* `Settings` → `JupyterLab Theme` → `JupyterLab Dark`

とすると、長時間作業しても目に優しいダークモードになります。

####拡張機能の追加（Gitの例）

例えばGitの拡張機能を入れたいとしましょう。JupyterLabの左端にあるアイコンの中に、パズルのピースみたいなのがあります。ここから`git`と検索すると、`@jupyterlab/git`というJupyterLab公式のGitHubページ（ https://github.com/jupyterlab/jupyterlab-git ）が出てきました。それによると、以下の２行でインストールできるそうです。

```
$ pip install --upgrade jupyterlab-git
$ jupyter lab build
```

ところが、

>
An error occured.
ValueError: Please install Node.js and npm before continuing installation. You may be able to install Node.js from your package manager, from conda, or directly from the Node.js website (https://nodejs.org).

というエラーメッセージが出てしまいました。Node.jsがインストールされていないとbuildできないよ、ということです。確かに、JupyterLabの公式ドキュメントには

>
In order to install JupyterLab extensions, you need to have Node.js installed.

と書いてありました。ここでは、Homebrewを用いてNode.jsを入れることにします。

結論として、以下の３つの手順でGitの拡張機能を導入できます。

```
$ brew install node
$ pip install --upgrade jupyterlab-git
$ jupyter lab build
```

どうでしょう？上のメニューの中に`Git`というのが現れるはずです。もし無ければ、JupyterLabを再起動してみましょう。

ちなみにGit初心者ですが、`git add`, `git commit`とかは簡単だけど`git merge`, `git log`はパッとできなかったので別の場所でコマンド叩こうかなと思いました。


##基本操作

ここは雑記です。

* JupyterLabを使う動機の一つでもあった、複数ファイルの一覧表示をするには、一度編集したいファイルを全て開いた上でドラッグで配置を変えます。すると、今まではタブをクリックしないと見えなかったファイルが同時に見られるようになります。直感的で使いやすいです。

* .ipynbファイルの扱い方は従来のJupyter Notebookと同じです。しかしJupyterLabでは、同じ.ipynbファイルを横に並べて同期させながら編集することもできます。手順としては、コピーしたいタブの上で右クリックから`New View for Notebook`を選択します。

* また別の.ipynbファイルにセルごとコピーすることもドラッグで可能です。「ここで書いたコードをあっちでも使いたい」という時に、今までは上から下からスクロールしまくっていたので、これで楽になります。（ https://jupyterlab.readthedocs.io/en/stable/user/notebook.html ）

* セルの上で右クリックをして`Create New View for Output`を選択すると、`Output View`というモードのタブが出てきます。これはそのセルの実行結果だけを表示するもののようです。例えば長い表などを出力した時に別のタブで見られると作業しやすい？

* `File` → `New Console for Notebook`とするとIPython風のタブが出てきて、対話的にコマンドを実行することができます。簡単な挙動を確かめてからコードに盛り込む時に使えそう。

##終わりに

今後も記事執筆を頑張ります。