Jupyter notebookのススメ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101445/e93ee4a3-de94-4b66-b105-36a3b643962a.png)

こんにちは。この記事では開発を含めた「作業環境」の１つである「Jupyter Notebook」を紹介します。以下、Jupyterのページ。

https://jupyter.org/

おそらく、Jupyter Notebookに関する「環境設定」や「TIPS」といった個別のことは既にQiitaの記事として山ほどあると思いますので、この記事は「読み物」として興味ある人が読んでもらえれば良いかなと思います。

ただ、やはり実際に手を動かさないと、という人のために、導入と実行までの方法も「一例」紹介します。

# 1. はじめに

Jupyter Notebookはpythonで書かれた、主にpythonの実行環境です。「コマンドの実行環境」という意味では、Shellやインタープリタ上の操作と同様の機能をもつものですが、その「Notebook」という名前にもあるように、一部「ドキュメンテーション」という意味合いももっています。

特に、pythonは非常に多くの便利なライブラリが提供されており様々な問題解決の仕事を「pythonだけで」で行うことができます。また、pythonは、近頃は機械学習をはじめとしたAI開発・実行を行うためのスタンダードな環境になっています。

そういう意味で、Jupyter Notebookは単にpythonのインタープリタという枠を超えて、「知的な作業のプラットフォーム」または「実行可能な教育コンテンツ」として機能します。

尚、Googleの「Colab」というサービスも、同様の仕組みを使ったものです。


# 2. Notebookの基本要素Cellとその基本操作

Jupyter Notebookは、Webサーバとして起動し、GUIはWebページとして、ChromeなどのWebブラウザ上で動きます。

## 2.1 Cell

Notebookの基本要素は「Cell(セル)」と呼ばれるものです。

Cellは、Notebook上での１つの実行単位です。このCellに記述するテキストには「Code」「Markdown」「Raw」という種類があります。これらに対して「実行操作」(shift-enter)をすると、それぞれ以下のような動作を行います。

- Code : Codeが実行され、結果が返される
- Markdown : マークダウンの記述とみなされ、レンダリング(例：セクションな強調される、等）される
- Raw : 書かれたまま。なにも起きない

## 2.2 Cellの実行コード

Cellの種類が「Code」のとき、そこに書かれるのは、「基本的には」pythonの命令です。

```python
print("Hello Jupyter")
```

このようにpythonの命令を書けばそのまま実行されます。もちろん、その命令が特定のパッケージに依存している場合には、そのパッケージをimportしておく必要があります。

```python
import math
print(math.radians(180))
```
といったように。

また、Jupyterサーバを起動したOS側の環境で動かすことのできる「コマンド」に関しては、先頭に「！」を付けることで動かせます。

```python
!DIR
```
pythonのコードを起動するにも、同様に、
```python
!python <pythonfile>
```
とすれば動作します。ただし、pythonコードに限っては、（そもそもJupyterがpython環境であるため）以下の用な特別な書き方で実行できます。
```python
%run <pythonfile>
```
この２つの主な違いは、pythonの出力データの扱いになります。後者ならpythonから使えるmatplotの出力するグラフなどは、直接Notebook上に表示することができます。

# 3. Jupyterの導入方法（１例：ローカルPC、python venv環境上）
Jupyterの導入から起動までの方法を１例示します（他にもいろいろあると思いますので他の記事をご覧ください）。ここでは、pythonの仮想環境の上にjupyterをインストールし、サーバを起動、chromeで作業という方法を説明します。

## 3.1 python仮想環境(venv)の導入
pythonの新しいパッケージを試す場合、既存の環境を壊してしまい、今まで動いていたpythonのプログラムが動かなくなることがあります。このようなことを避けるために、独立したpythonの環境を作成し、そこで作業を完結させるというやりかたが有効です。ただし、このvenv環境を作成するにはpythonが必要なので、その環境には既にpythonが動かせる環境にあるとします。

### 3.1.1 適当なフォルダを選び、venvのインストール先とする
例えば、「C:\venv」というフォルダがあるとして、PowerShellを起動し、カレントディレクトリとします。
```powershell
PS> cd C:\venv
```
### 3.1.2 venvを作成する
次に、その場所にpythonの仮想環境を作成します。Jupyter用なので「Jupyter」とします。
```powershell
PS> python -m venv Jupyter
```
これでC:\venv\Jupyterというフォルダが作成され、その中にpythonの環境が一式作成されます。
### 3.1.3 仮想環境に入る

Jupyter\Scriptsフォルダに移動(cd)し、Activate.ps1を起動します。これで、仮想環境に入り、ここから使うpythonやpipなどのコマンドやパッケージの場所は仮想環境内のものとなります。

```powershell
(Jupyter) PS C:\venv\Jupyter\Scripts> .\Activate.ps1
```

### 3.1.3 Jupyterのインストール

導入した仮想環境内のpythonを使って、Jupyterのパッケージをインストールします。
```powershell
(Jupyter) PS C:\venv\Jupyter\Scripts> python -m pip install Jupyter
```

### 3.1.4 Jupyterサーバを起動
適当な作業フォルダ(例：C:\work)を作成し、その場所をカレントフォルダとした後、Jupyterサーバを起動します。
```powershell
(Jupyter) PS C:\work> Jupyter　lab
> cd C:\work
```
これで、Jupyterのページが開きます。ブラウザは自動的に起動します。もし、ブラウザの自動起動をしたくなければ、「--no browser」オプションを指定してください。この場合には、Jupyterのページを開くためのURIが起動時のメッセージとして表示されますので、URIを適当なブラウザでそのURIを開いてください。
URIとしては、以下のようなものが提示されます：

```cmd        
http://localhost:8889/lab?token=3fae410c45afaa1458aec46fa51b5f36e3b9cdfb02baec81
http://127.0.0.1:8889/lab?token=3fae410c45afaa1458aec46fa51b5f36e3b9cdfb02baec81
```

# 4. GUI(Web UI)概要

## 4.1 起動画面

Jupyterのサーバ起動時に「Jupyter notebook」と「Jupyter lab」の２種類の起動の仕方があります。「notebook」の方は従来から提供されていたもので、「lab」の方はさらに便利になったUI環境を提供します。

### [jupyter notebookの場合]
ファイルブラウザが画面全体に現れ、既に存在するか、ここで作成したファイルを開くとエディタ画面に切り替わります。Notebookの場合(拡張子ipynbのファイル) はNotebookの環境に切り替わります。
ちょうど、コンソール画面でDIRやlsでファイルを確認していて、ファイルをスクリーンエディタ(vimなど）で開くと画面全体を使ってエディタが開くのに似ています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101445/9bd11c49-9080-4d00-ae6d-d38cc22ca4c3.png)

### [jupyter labの場合]

一方、Jupyter labの場合は、ファイルブラウザは左側のエリアにずっと表示され続けており、特定のファイルを開くとメイン（真ん中）のエリアにそのファイルのエディタ画面が表示されます。こちらの場合も、ファイルがNotebookの場合はNotebookの環境が開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101445/59ed2c2d-9db1-4609-a82b-c93a4ba31c3d.png)

## 4.2 Python命令の直接実行

Notebookのセルにpythonの命令を入力し、実行できます。セルの中には複数行をまとめて書くことができます。そして、Shift-Enterで実行されます。当然のことですが、Pythonのコードとして正しいものでなくてはなりません。以下がmatplotでsin曲線をプロットするプログラムです。
```python
import numpy as np
import matplotlib.pyplot as plt

# x軸の値を生成 (-2π から 2π)
x = np.linspace(-2 * np.pi, 2 * np.pi, 400)

# y軸の値 (sin関数)
y = np.sin(x)

# プロット
plt.plot(x, y, label='sin(x)')
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.title('Sine Function')
plt.axhline(0, color='black', linewidth=0.5)  # x軸
plt.axvline(0, color='black', linewidth=0.5)  # y軸
plt.grid(True)  # グリッド表示
plt.legend()

# 表示
plt.show()
```
これをnotebookのCellに入力し、Shift-Enterで実行すると、プロットされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101445/cff8985f-263a-4674-97cd-3924b86e1dd9.png)

## 4.2 外部コマンドとしてpythonプログラムの実行

さきほど、Cellに入力したpythonプログラムをsinplot.pyという名前で保存した上で、以下のようにCellに入力し実行します。

```
!python sinplot.py
```
この方法だと、matplot描画オブジェクトはNotebook上には表示されない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101445/0c8b34f1-bc16-4ab2-9dfb-f91c2081edb1.png)

## 4.3 notebook内でのpythonプログラムの実行
以下のようにCellに入力し実行します。
```
%run sinplot.py
```
この方法だと、matplot描画オブジェクトが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101445/6b84c6da-31ed-4216-b52e-dc34602a7894.png)

## 4.4 Notebookの保存

NotebookはJupyterのメニューから「Save Notebook」「Save Notebook As..」などで保存することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101445/d8be1f4f-0bca-4cc5-b44f-7181667c5da7.png)

拡張子は「.ipynb」であり、内容はJSON形式のテキストになっています。

# 5. Jupyterカーネル

「2.2 Cellの実行コード」で、pythonのコマンド以外の外部コマンドも実行できる事を紹介しましたが、jupyterでは、基本であるpythonインタプリタ以外のインタープリタをそのままCellから実行できるようなNotebookを提供する仕組みを持っています。実際には、そのようなインタープリタ用にカスタマイズされた「カーネル」を作成する事で実現できます。
既にいくつかの(python以外の)カーネルが提供されているため、すぐにでもそれが利用できますし、ユーザが独自のカーネルを作って利用することも可能です。

## 5.1 すでに提供されているカーネル

jupyterのページの「try jupyter」で紹介され、そこから使えるものとして、「C++」、「Julia」、「GNU Octave」、「R」、「Ruby」、「Scheme」などが試せるようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101445/5e8705fd-377e-499f-b4b0-271a961c230c.png)

さらに、以下のページに現在作成されて公開されているカーネルの一覧があります。

https://github.com/jupyter/jupyter/wiki/Jupyter-kernels

是非、興味のあるカーネルを試してみてください。

## 5.2 カスタムカーネルの作成

ユーザが自分でカーネルを作成することもできます。本記事ではこの話題は詳しくは説明しませんが、現状誰も作っていないカーネルを作成して世の中に公開することでJupyterの普及に貢献できるかもしれません。

# 6. まとめ

jupyter Notebookkという環境について自分なりに調べ、概要の説明、（1つの）導入方法、使い方などを整理して紹介しました。

今回は「読み物」としての記事を書きましたが、今後はもっと具体的な利用例や、今回はとりあげなかった「カスタムカーネルの作成」なども、紹介できればと思います。

## 蛇足

私が知っている中で、最も古く「Notebook」という実行環境を採用したソフトウェアは、知る人ぞ知る「Mathematica」です。Mathematicaは、Steven Wolframという天才が開発した「数式処理システム」です(初期バージョン1988年)。数式の処理（式の展開、因数分解、微分、積分、方程式の解法等）を行って、結果を出してくれるだけでなく、結果の数式の表示、グラフ表示、説明文、タイトルなどのドキュメンテーションの機能などもこのNotebook上に統合されており、Jupyter Notebookとほぼ同様の環境を提供していました。私はjupyterを知ったときに「あ、あれと同じかな」と思いました。

以上です。