Haskell を Jupyter Notebookで使用する

関数型プログラミング言語 Haskell を Jupyter Notebook で使えるようにしてみた。 Windows10へインストールをしたが、手間取った点があるので、記録を残しておく。

具体的には、GitHubにある gibiansky/IHaskell を Windows10の Windows Subsystem for Linux (WSL)上のUbuntuにインストールした。

基本的には、IHaskell ( https://github.com/gibiansky/IHaskell )のREADME.md の記載の手順に従えばよい。途中で出会ったトラブルや手間取った点について記述を追加しておく。

それぞれの箇所で示しているように様々なWebの内容を参考にさせてもらっているので、利用しているコマンドなどが不統一でごちゃごちゃである(たとえば、apt と apt-getなど)。

WSLのインストールと再起動

Windows Subsystem for Linux Installation Guide for Windows 10 ( https://docs.microsoft.com/en-us/windows/wsl/install-win10 ) に従ってWSLをインストールする。

WSLのインストール

Windows PowerShellを管理者として起動する。

次のコマンドを実行する。

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

再起動

再起動が求められるので、Windows10を再起動する。

Ubuntuのインストールと初期化

Microsoft Store から Ubuntu をインストールし、初期化をする。すでにWSL上でLinuxがインストールされているなら省略できるはず。

Microsoft Store を開く

Microsoft Storeを開いて、「linux」を検索する。

Ubuntuを選択してインストール

Ubuntu (16.04 LTS) でもUbuntu 18.04 LTSでもよいが、以下ではUbuntu (16.04 LTS)を使った場合のスクリーンショットを示している。

 

インストールが完了したら、起動する。

 

Ubuntuの初期化

Initializing a newly installed distro  ( https://docs.microsoft.com/en-us/windows/wsl/initialize-distro ) に従って、Ubuntuの初期化をする。

Linuxユーザアカウントの設定

起動するとユーザ名とパスワードを設定するように尋ねられるので入力する。以下ではユーザ名として「kunsen」を指定している。パスワードは sudo する際などの必要となる。ユーザ名やパスワードはWindowsとは関係のないものでよい。

Ubuntuのアップデート

シェルに以下のコマンドを入力して Ubuntuのアップデートとアップグレードを行う。

この際に遭遇した接続エラーについては、後で触れる。

sudo apt update && sudo apt upgrade

Linuxパスワードが求められるので入力する。

アップデートもそれなりに時間がかかる。

アップグレードの確認がある。

途中で次のようなアップグレード中に確認なしでサービスの再起動を行うか確認される。「Yes」を選んだほうが手間は少ないと思う。

「No」を選んだら以下のような確認があった。

アップグレードが引き続き行われる。

待っていれば以下のようにアップグレードが終了するはず。

必要なツールやライブラリをインストールする

sudo apt-get install -y python3-pip git libtinfo-dev libzmq3-dev libcairo2-dev libpango1.0-dev libmagic-dev libblas-dev liblapack-dev

Linuxパスワードが求められるので入力する。

時間がかかるがインストールが進められていく。

しばらくしたら終了する。

アップデート時の接続トラブル

職場で apt update を実行したところ Get で接続に失敗することが起きた。

接続できない原因の一つであるパソコンのファイアウォールを調べたが、そこでは特に問題はなかった。職場のファイアウォールやゲートウェアなどで遮断されていると思われた。明確な理由はわからないが、接続先のIPアドレスからみると海外に接続しようとしており、通信相手が良くないと判断されたようだ。

問題の回避方法がよくわからなかったが、出力ログをみると、リポジトリとしてarchive.ubuntu.com にアクセスしている。これを国内にすれば海外のサーバーにアクセスしなくなり、接続できることが考えられたので試した。

/etc/apt/sources.list の内のリポジトリの指定を国内の jp.archive.ubuntu.com にして国内のサーバーにアクセスするようにすることで、通信ができなくてアップデートに失敗することはなくなった。具体的には、「Ubuntu 18.04 LTS【サーバー版】のインストール直後にやっておきたいことまとめ」に記載の次のスクリプトを実行して /etc/apt/sources.list を更新した。

sudo perl -p -i.bak -e 's%https?://(?!security)[^ \t]+%http://jp.archive.ubuntu.com/ubuntu/%g' /etc/apt/sources.list

セキュリティについては国内のミラーサーバーに変更しない方が無難と言うことで、security を名前に含むドメインは変更しないようになっている。

IHaskellのインストール作業

最初 https://github.com/gibiansky/IHaskell に記載されているスクリプトを一括してコピーし、Ubuntuのシェルにペーストしたが、パスワードを求められるところがあり、うまくインストールが終わらなかった。1行ずつ順に実行して、IHaskellのインストールを完了させた。

Stackのインストール

次のコマンドで Haskellプロジェクトを管理するツール Stack をインストールする。

curl -sSL https://get.haskellstack.org/ | sh

GitHubからのIHaskellのclone

次のGitコマンドでGitHubからIHaskellをcloneする。

git clone https://github.com/gibiansky/IHaskell

カレントディレクトリをIHaskellに変更

cd IHaskell

IHaskellに必要なライブラリのインストール

pip3 を使って必要なライブラリをインストールする。

pip3 install -r requirements.txt

Stack を使ってパッケージなどをインストール

次のコマンドを実行する。そこそこ時間がかかる。気長に待つ必要がある。

stack install --fast

IHaskellのインストール

次のコマンドを実行する。すぐに終了した。

ihaskell install --stack

 

Notebook Serverの起動

エラー回避のためにnotebookのアップグレード

次のコマンドで notebook のアップグレードをしておく。

python3 -m pip install --upgrade notebook

jupyter notebook serverのエラー

notebookのアップグレードをしておかないとjupyter notebook serverを起動した後に「[E 00:47:25.954 NotebookApp] Uncaught exception GET /api/kernels/(以下省略)」のようなエラーが出て、正常に動作しない。

アップグレードによって改善されることは、GitHubのIssues の「Jupyter noteboook keep reconnecting to kernels since Nov. 5th, 2018 #462 (https://github.com/jupyter/help/issues/462)」に記載があった。

パスの設定

jupyter は、~/.local/bin にあるので、そこがパスに含まれている必要がある。

パスを手動で設定してもよいが、~/.profile のスクリプトを見ると、 ~/.local/bin があればパスに追加されるようになっているので、Ubuntuのウィンドウを開きなおすか、 source ~/.profile を実行してもよい。

Notebookサーバーの起動

次のコマンドでJupyter notebook サーバーを起動する。 –no-browser で、Ubuntuではブラウザを起動しない。

jupyter notebook --no-browser

起動後に表示されるURLを使ってWindowsのブラウザからJupyter notebook サーバーにアクセスする。

ここのスクリーンショットの例では、「http://localhost:8888/?token=2edca7505a3d22f6570d68b3abfde54453d1b31da55a850d」をコピーし、Windowsのブラウザからアクセスすることになる。当然のことながら、起動するたびにtoken=以降の部分は変化する。

Browserからサーバーへのアクセス

NotebookサーバーのURLを開く

Windowsのブラウザを開いて、Notebookサーバーを起動した際に表示されたURLを開く。

うまく開ければ次のように表示される。

ノートブックを開いてみる

notebooks ディレクトリにある IHaskell.ipynb を開いてみる。

ノートブックの内容が表示される。

この時点で、サーバーは以下のようになっている。

セルを実行する

セルを実行して、結果が表示されるようになれば大丈夫。

サーバー側では、黄色で表示される警告が表示されたりするが、基本的な動作には支障はないようである。警告が出ないようにするには、適宜、必要なファイルをインストールをする必要がある。