CentOS6にJupyterLabをインストール

知り合いから[JupyterLab](https://github.com/jupyterlab/jupyterlab) という素晴らしいものがあるという話を聞いたので、さっそく当方の環境にインストールしようとしたのですが、Extensionsのインストールで少々躓いてしまったので、メモを残しておこうと思います。

JupyterLab については、[JupyterLabのすゝめ](https://qiita.com/kirikei/items/a1639954ce5ccaf7ac3c) に詳しくまとまっていると思いますので、そちらをご覧いただければよいと思います。


# インストール環境

当方のインストール環境は、タイトルにある通り、CentoOS6です。（少し古いですね。。。）  
また、インストール先のPythonバージョンはPython3.6です。
Python2系にインストールする場合でも、ほぼ同様の手順になるんじゃないかと思います。

また、当方環境は、プライベートネットワーク上にあるサーバーです。
そのため、CentoOSサーバーとは別のPCからSSH接続してインストール作業を行うで、そのあたりはMacやWindowsとは少し作業イメージが異なるかもしれません。

# JupyterLab のインストール

これは、[Githubのページ](https://github.com/jupyterlab/jupyterlab) にある通りでスムーズにインストールできました。

```console
$ sudo pip3 install jupyterlab
```


# Extensions のインストール

[JupyterLabのすゝめ](https://qiita.com/kirikei/items/a1639954ce5ccaf7ac3c) では、JupyterLabを使うなら、Extensionsもインストールすることをお勧めされていたので、私もそのようにしてみたいと思います。


## Node.js のインストール

Extensionsを使用するには、Node.jsをインストールする必要があるようです。
2019年6月19日現在では、v6.11.5以上のバージョンを要求されました。

Node.js のインストールはnvmを使ってインストールすることが多いようなのですが、これは開発環境を構築するのには便利だけども、サーバーにグローバルインストールするには不便らしいです。
実際、私も一度nvm を使ってグローバルインストールに試みましたが、非常にややこしいことになりそうになったので中止しました。

サーバーにグローバルインストールするなら、nコマンド経由でインストールする方が便利なようなので、そのようにしてみようと思います（[結局のところ node.js をサーバーにインストールするにはどうやればいいのか？](https://moro-archive.hatenablog.com/entry/2015/07/27/225747)）。

```console
$ sudo yum install nodejs npm --enablerepo=epel
$ sudo npm config set strict-ssl false
$ sudo npm install -g n
$ sudo npm config set strict-ssl true
$ sudo n stable
```

これで、CentoOS6でも利用可能なv10.16.0をインストールできました。

（最新バージョンをnvmからインストールしようとすると、古いCentoOSを使用しているゆえに、GCCバージョン問題にぶつかります。）


## jupyterlab-gitをインストール

試しにExtensionsの一つである[jupyterlab-git](https://github.com/jupyterlab/jupyterlab-git) をインストールしてみたいと思います。

```console
$ sudo jupyter3 labextension install @jupyterlab/git
$ sudo pip3 install --upgrade jupyterlab-git
$ sudo jupyter3 serverextension enable --py jupyterlab_git
```

これで、一般ユーザーからJupyterLabを立ち上げてもgit機能が使えるようになりました。


## jupyterlab-toc のインストール

もう一つ、お勧めのExtensionである[jupyterlab-toc](https://github.com/jupyterlab/jupyterlab-toc)インストールしてみます。
これは、Mardown の見出しに沿って、目次を自動作成してくれるExtensionです。

```console
$ sudo jupyter3 labextension install @jupyterlab/toc
```

# JupyterLab の立ち上げ

あとは、一般ユーザーからJupyterLabを立ち上げれば良いのです。
普通は、立ち上げるには、

```console
$ jupyter3 lab
```

で自動的にブラウザが立ち上がり、JupyterLabにアクセスできます。
しかし、このやり方だと、当方環境のようにサーバーにSSHで接続するような使い方だと、サーバー上のブラウザが立ち上がり、XWindowがローカルに飛んでくるため、非常に遅い動作になります。
そこで、SSHポートフォワーディングを使用して、ローカルのブラウザからリモートサーバーに立ち上がっているJupyterLabにアクセスするという方法をとります。

まずは、ブラウザ表示なしでJupyterLabを立ち上げます。

```console
$ jupyter3 lab --no-browser
```

すると、以下のようなメッセージが表示されると思います。

```
[I 15:44:26.602 LabApp] [jupyter_nbextensions_configurator] enabled 0.4.1
[I 15:44:26.620 LabApp] JupyterLab extension loaded from XXXXXX
[I 15:44:26.620 LabApp] JupyterLab application directory is XXXXXXXXXXXXXX
[W 15:44:26.622 LabApp] JupyterLab server extension not enabled, manually loading...
[I 15:44:26.638 LabApp] JupyterLab extension loaded from XXXXXXXXXXXXXXXXXX
[I 15:44:26.638 LabApp] JupyterLab application directory is XXXXXXXXXXXXXXXXXXX
[I 15:44:26.639 LabApp] Serving notebooks from local directory: XXXXXXXXXXXXXXXX
[I 15:44:26.639 LabApp] The Jupyter Notebook is running at:
[I 15:44:26.639 LabApp] http://localhost:8880/?token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
[I 15:44:26.639 LabApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 15:44:26.643 LabApp]

    To access the notebook, open this file in a browser:
        file:///XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    Or copy and paste one of these URLs:
        http://localhost:8880/?token=XXXXXXXXXXXXXXXXXXXXX
```

この場合は、リモートサーバーの8880番ポートにJupyterLabサーバーを立ち上げたという意味になります。

次に、新しいターミナルをローカルPCで立ち上げ、以下のように8880番ポートをポートフォワーディングして接続します。

```console
$ ssh -L 8880:localhost:8880 [ユーザー名]@[リモートサーバーのIPアドレス] -i [SSHの鍵]
```

これで、あとは、ローカルPCのブラウザを立ち上げて、JupyterLabを立ち上げたときに表示されたメッセージにあるように`http://localhost:8880/?token=XXXXXXXXXXXXXXXXXXXXX` にアクセスすれば、JupyterLabに入れます。


# 余談

今回は、rootユーザーでインストールを行っているので、何かExtensionsをインストールしようとしても、上記ような調子でroot権限を使ってExtensionsをインストールする必要があります。

一般ユーザーでJupyterLabを立ち上げて、そこからExtension Mannager を使ってインストールしようとすることはできるのですが、以下のようなエラーが表示されてインストールできませんでした。

```
Error communicating with server extension. Consult the documentation for how to ensure that it is enabled.
Reason given:
Error: 500 (Internal Server Error)
```

症状からして、恐らくroot権限がないことが原因なんじゃないかと思います。

また、root権限でコンソールからインストールして、その時にExtensionsを有効化してしまっているためか、一般ユーザーはExtensionsの有効化をやらなくてもよいようです。