こんにちは。技術研究所の910です。

 

私は主にPythonでコードを書くことが多いのですが、その際には一度Jupyter Notebookで短いコードを書いて動かしてみてからモジュールに実装する、というやり方を取っています。
コードを共有するのも楽ですし、Markdownで書いたメモも一緒に共有できるので、好んで使っています。

最近ふつふつと新たな開発言語を学びたい欲が湧いてきたので、Golangを学ぶことにしました。
そこでNotebook用のGoカーネルを探してみたところ幾つか見つかりましたので、試してみました。

本記事はかなり短い記事となっていますので、かるーく読んでいただければ幸いです。

環境

% cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04 LTS"

Jupyter Notebook用Golangカーネル

まずこの要件を満たせるカーネルを探すべく、まずは golang notebook でググってみました。
上位に出てきたのは以下の2つで、どちらも同じ程度のStarが付けられていました。

  • yunabe/lgo: Interactive Go programming with Jupyter
    • Jupyter Notebookの他、Jupyter Consoleにも対応していて、REPL環境としても利用可能
    • 2018/05/12現在、Linux、Docker版が提供されていた
    • GOPATH とは別に LGOPATH という環境変数を定義してそちらでパッケージの管理を行うようで、GOPATHの通っている環境を汚さずに新たなパッケージを試し易いようだ

先述した通り、私はNotebookで短いコードを書いて動かしてみてからモジュールの実装に掛かるというやり方をしているので、パッケージを一箇所でまとめて管理するようになっている方が楽です。
その為、 gophernotes を選びました。

gophernotesの導入と動作確認

こちらに従い、導入を行いました。

1. 依存関係

gophernotesの導入前に、予め以下を導入しておく必要があります。

  • Go 1.9+
    導入済みなので、バージョンのチェックをしました。
% go version
go version go1.10.2 linux/amd64
  • Jupyter Notebook or nteract
    今回はJupyterを使用しますので、 pip3で導入しました。
% pip3 install jupyter --user
Collecting jupyter
...
Installing collected packages: ipython-genutils, decorator, traitlets, python-dateutil, tornado, jupyter-core, pyzmq, jupyter-client, jsonschema, nbformat, ptyprocess, terminado, jinja2, pandocfilters, testpath, webencodings, html5lib, bleach, mistune, entrypoints, pygments, nbconvert, parso, jedi, simplegeneric, pickleshare, backcall, wcwidth, prompt-toolkit, ipython, ipykernel, Send2Trash, notebook, qtconsole, widgetsnbextension, ipywidgets, jupyter-console, jupyter
Successfully installed Send2Trash-1.5.0 backcall-0.1.0 bleach-2.1.3 decorator-4.3.0 entrypoints-0.2.3 html5lib-1.0.1 ipykernel-4.8.2 ipython-6.4.0 ipython-genutils-0.2.0 ipywidgets-7.2.1 jedi-0.12.0 jinja2-2.10 jsonschema-2.6.0 jupyter-1.0.0 jupyter-client-5.2.3 jupyter-console-5.2.0 jupyter-core-4.4.0 mistune-0.8.3 nbconvert-5.3.1 nbformat-4.4.0 notebook-5.5.0 pandocfilters-1.4.2 parso-0.2.0 pickleshare-0.7.4 prompt-toolkit-1.0.15 ptyprocess-0.5.2 pygments-2.2.0 python-dateutil-2.7.3 pyzmq-17.0.0 qtconsole-4.3.1 simplegeneric-0.8.1 terminado-0.8.1 testpath-0.3.1 tornado-5.0.2 traitlets-4.3.2 wcwidth-0.1.7 webencodings-0.5.1 widgetsnbextension-3.2.1
% jupyter --version
4.4.0
  • ZeroMQ 4.X.X
% echo "deb http://download.opensuse.org/repositories/network:/messaging:/zeromq:/release-stable/Debian_9.0/ ./" >> /etc/apt/sources.list
% wget https://download.opensuse.org/repositories/network:/messaging:/zeromq:/release-stable/Debian_9.0/Release.key -O- | sudo apt-key add
--2018-05-12 20:46:55-- https://download.opensuse.org/repositories/network:/messaging:/zeromq:/release-stable/Debian_9.0/Release.key
download.opensuse.org (download.opensuse.org) をDNSに問いあわせています... 2620:113:80c0:8::13, 195.135.221.134
download.opensuse.org (download.opensuse.org)|2620:113:80c0:8::13|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 1080 (1.1K)
'STDOUT' に保存中
100%[=============================================================================>] 1.05K --.-KB/s 時間 0s
2018-05-12 20:46:57 (93.2 MB/s) - stdout へ出力完了 [1080/1080]
OK
% sudo apt update
% sudo apt install libzmq3-dev動作確認
% python3 -c "import zmq; print(zmq.zmq_version())"
4.1.6
  • pkg-config
% pkg-config --version
0.29.1

これで依存関係の導入は完了です。

2. NotebookへのGoカーネルの追加

% go get -u github.com/gopherdata/gophernotes
### Goカーネルの追加
% mkdir -p ~/.local/share/jupyter/kernels/gophernotes
% cp $GOPATH/src/github.com/gopherdata/gophernotes/kernel/* ~/.local/share/jupyter/kernels/gophernotes

動作確認

Jupyter Notebookを起動し直すと、NewボタンからGolangのNotebookを作成できるようになっています。

試しに画像を読み込んで表示してみたところ、問題なく動いているようです。

所感

非常に簡単に、Notebook上でGoが書ける環境を整えることができました。
しかし少し使ってみた結果、ちょっとだけ残念な点も見られました。

  • 関数定義の参照ができない
    Pythonカーネルでは関数名末尾に”?”を付けて実行すると関数定義を参照することができましたが、gophernotesはこれには対応していないようです。
  • Pythonに依存する
    JupyterがPythonを使っている都合上止むを得ないところですが、私はPythonの仮想環境を逐次切り替えて作業していたりするので、環境を切り替え忘れたりしてちょっと混乱しそうな気がします。

上記のように瑣末な不満はありますが、Notebookで実装できるのは物凄く楽だなー。と改めて感じました。