WindowsでJuliaをJupyter notebookから使えるようにするまで

# はじめに
　Windows環境において、Julia言語をインストールし、Jupyter notebookで使用可能にする方法については、様々な場所で解説記事が見られるが、思いのほか苦戦したので備忘録としてまとめた。
# 導入環境
* OS：Windows7 Home Premium 64bit
* Anaconda3をインストール済みであり、Jupyter notebookは使用可能な状態

# 導入方法
## Juliaのインストール
　最新版のJuliaを[公式サイト](https://julialang.org/downloads/)からダウンロードし、インストールする。現時点では`v0.6.2`が最新である。インストールしたディレクトリを`JuliaDir`とする。

## 環境変数設定
　コントロールパネル/システム/システムの詳細設定/環境変数から設定を行う。ユーザー変数とシステム変数の2つがあり、全ユーザーに対して設定したいのであれば、システム変数に対して設定を行う。以下、システム変数に対する設定を記載する。

- 新規の変数として以下の2つを作成する。

>変数名：JUPYTER　変数値：`AnacondaDir\Scripts\jupyter.exe`
>変数名：JULIA_PKGDIR　変数値：`JuliaPkgDir`

- システム変数に既に設定されている`Path`の最後尾に、新規作成した変数名を`%`で囲んで追加する。なお、変数は`;`で区切ること。

>%追加済みのPath%; %JUPYTER%; %JULIA_PKGDIR%

ここで、`AnacondaDir`はAnaconda3がインストールされたディレクトリ、`JuliaPkgDir`はJuliaのパッケージをインストールするディレクトリである。`JuliaPkgDir`は予め作成しておくとよい。
　私が主に参照した記事では、変数を新規作成せずとも`Path`に追加するだけで良いとの内容が多かったが、私の場合は上記のようにしなければ設定がうまくできなかった。
　また、Juliaをコマンドプロンプトから呼び出せるようにするためには、システム変数の`Path`の最後に`JuliaDir`を追記すればよい。これに関しては、上記のように新規に変数を作成しなくても動作確認ができた。


## パッケージの初期インストール
　Juliaを管理者権限で起動し、`Pkg.init()`を実行する。このコマンドは、`JuliaPkgDir`にパッケージデータをダウンロードし、Pkg系コマンドを使用可能な状態にするためのものである。この作業は最初の一回で良い。

```
julia> Pkg.init()
INFO: Initializing package repository JuliaPkgDir\v0.6
INFO: Cloning METADATA from https://github.com/JuliaLang/METADATA.jl
```

上記の表示で終了すればOK。環境変数で設定した`JuliaPkgDir`内に、`v0.6`というディレクトリが作成され、パッケージがインストールされている。なお、以下のエラー

```
ERROR: GitError(Code:ECERTIFICATE, Class:OS, user cancelled certificate check: )
```

が生じた場合は、[リンク先](https://support.microsoft.com/en-us/help/3140245/update-to-enable-tls-1-1-and-tls-1-2-as-a-default-secure-protocols-in)の`Easy fix`の`Download`ボタンから修復ツールをインストールし、実行する必要がある。この問題は、[julia-git-error](https://stackoverflow.com/questions/48950748/julia-git-error)に挙げられている。TLS 1.1またはTLS 1.2の修復が必要である模様。修復を行った後、`Pkg.init()`を実行すればよい。
　また、環境変数設定がうまくいっていない場合、以下のように表示され、ユーザーディレクトリ直下に`.julia\v0.6`というパッケージ用ディレクトリが作成される。

```
INFO: Initializing package repository C:\Users\username\.julia\v0.6`
```


## パッケージIJuliaのインストール
　Jupyter notebookでJuliaを使用するために、`IJulia`をインストールする。Juliaで`Pkg.add("IJulia")`を実行する。以下は私のPCでの実行例である。

```
julia> Pkg.add("IJulia")
INFO: Cloning cache of BinDeps from https://github.com/JuliaLang/BinDeps.jl.git
INFO: Cloning cache of BinaryProvider from https://github.com/JuliaPackaging/BinaryProvider.jl.git
INFO: Cloning cache of Compat from https://github.com/JuliaLang/Compat.jl.git
INFO: Cloning cache of Conda from https://github.com/JuliaPy/Conda.jl.git
INFO: Cloning cache of IJulia from https://github.com/JuliaLang/IJulia.jl.git
INFO: Cloning cache of JSON from https://github.com/JuliaIO/JSON.jl.git
INFO: Cloning cache of MbedTLS from https://github.com/JuliaWeb/MbedTLS.jl.git
INFO: Cloning cache of Nullables from https://github.com/JuliaArchive/Nullables.jl.git
INFO: Cloning cache of SHA from https://github.com/staticfloat/SHA.jl.git
INFO: Cloning cache of URIParser from https://github.com/JuliaWeb/URIParser.jl.git
INFO: Cloning cache of ZMQ from https://github.com/JuliaInterop/ZMQ.jl.git
INFO: Installing BinDeps v0.8.8
INFO: Installing BinaryProvider v0.3.0
INFO: Installing Compat v0.64.0
INFO: Installing Conda v0.7.1
INFO: Installing IJulia v1.8.0
INFO: Installing JSON v0.17.2
INFO: Installing MbedTLS v0.5.8
INFO: Installing Nullables v0.0.5
INFO: Installing SHA v0.5.7
INFO: Installing URIParser v0.3.1
INFO: Installing ZMQ v0.6.0
INFO: Building Conda
INFO: Building MbedTLS
Info: Downloading https://github.com/quinnj/MbedTLSBuilder/releases/download/v0.6/MbedTLS.x86_64-w64-mingw32.tar.gz to JuliaPkgDir\v0.6\MbedTLS\deps\usr\downloads\MbedTLS.x86_64-w64-mingw32.tar.gz...
Info: using prebuilt binaries
INFO: Building ZMQ
Info: Downloading https://github.com/JuliaInterop/ZMQBuilder/releases/download/v4.2.5+2/ZMQ.x86_64-w64-mingw32.tar.gz to JuliaPkgDir\v0.6\ZMQ\deps\usr\downloads\ZMQ.x86_64-w64-mingw32.tar.gz...
INFO: Building IJulia
INFO: Found Jupyter version 4.4.0: AnacondaDir\Scripts\jupyter.exe
INFO: Installing Julia kernelspec julia-0.6
Error executing Jupyter command 'kernelspec': [Errno 'jupyter-kernelspec' not found] 2
[InstallKernelSpec] Removing existing kernelspec in C:\Users\username\AppData\Roaming\jupyter\kernels\julia-0.6
[InstallKernelSpec] Installed kernelspec julia-0.6 in C:\Users\username\AppData\Roaming\jupyter\kernels\julia-0.6
INFO: Package database updated
```

`kernelspec`でエラーが生じているものの、その後の作業に特に影響はなかった。ここで重要なのは、

```
INFO: Found Jupyter version 4.4.0: AnacondaDir\Scripts\jupyter.exe
```

の表示である。環境変数`JUPYTER`を作成したことにより、すでにAnaconda3でインストールされていたJupyter notebookが使用されるようになっている。この環境変数設定を行っていない場合、Juliaは自動的にminiconda(Anaconda2相当)をインストールして、Jupyter notebookの設定を行ってしまう。また、環境変数設定がうまくいっていない場合も、同様にAnaconda2がインストールされ、以下のような表示になる。

```
INFO: Found Jupyter version 4.4.0: C:\Users\username\.julia\v0.6\Conda\deps\usr\Scripts\jupyter
```

　また、私の場合は、最初に`Pkg.add("IJulia")`を実行した際、以下のようにエラーが生じた。<br/>

```
INFO: Building MbedTLS
Info: Downloading https://github.com/quinnj/MbedTLSBuilder/releases/download/v0.6/MbedTLS.x86_64-w64-mingw32.tar.gz to JuliaPkgDir\v0.6\MbedTLS\deps\usr\downloads\MbedTLS.x86_64-w64-mingw32.tar.gz...
・
・
・

===============================[ ERROR: MbedTLS ]===============================
LoadError: Could not download https://github.com/quinnj/MbedTLSBuilder/releases/
download/v0.6/MbedTLS.x86_64-w64-mingw32.tar.gz to JuliaPkgDir\v0.6\MbedTLS\
deps\usr\downloads\MbedTLS.x86_64-w64-mingw32.tar.gz while loading JuliaPkgDir\
v0.6\MbedTLS\deps\build.jl, in expression starting on line 40
================================================================================
INFO: Building ZMQ
Info: Downloading https://github.com/JuliaInterop/ZMQBuilder/releases/download/v4.2.5+2/ZMQ.x86_64-w64-mingw32.tar.gz to JuliaPkgDir\v0.6\ZMQ\deps\usr\downloads\ZMQ.x86_64-w64-mingw32.tar.gz...
・
・
・

=================================[ ERROR: ZMQ ]=================================
LoadError: Could not download https://github.com/JuliaInterop/ZMQBuilder/
releases/download/v4.2.5+2/ZMQ.x86_64-w64-mingw32.tar.gz to JuliaPkgDir\v0.6\
ZMQ\deps\usr\downloads\ZMQ.x86_64-w64-mingw32.tar.gz while loading JuliaPkgDir\
v0.6\ZMQ\deps\build.jl, in expression starting on line 30
================================================================================

INFO: Building IJulia
INFO: Found Jupyter version 4.4.0: AnacondaDir\Scripts\jupyter.exe
INFO: Installing Julia kernelspec julia-0.6
Error executing Jupyter command 'kernelspec': [Errno 'jupyter-kernelspec' not found] 2
[InstallKernelSpec] Removing existing kernelspec in C:\Users\username\AppData\Roaming\jupyter\kernels\julia-0.6
[InstallKernelSpec] Installed kernelspec julia-0.6 in C:\Users\username\AppData\Roaming\jupyter\kernels\julia-0.6

================================[ BUILD ERRORS ]================================
WARNING: MbedTLS and ZMQ had build errors.

 - packages with build errors remain installed in JuliaPkgDir\v0.6
 - build the package(s) and all dependencies with `Pkg.build("MbedTLS", "ZMQ")`
 - build a single package by running its `deps/build.jl` script
================================================================================
```

　パッケージ`MbedTLS`および`ZMQ`のダウンロードでエラーが生じている。メッセージを確認すると、`MbedTLS.x86_64-w64-mingw32.tar.gz`および`ZMQ.x86_64-w64-mingw32.tar.gz`をダウンロードできず、それぞれをビルドする箇所でエラーが発生しているようであった。
　この2つについて調べた結果、[Build error on Windows 7 #133](https://github.com/JuliaWeb/MbedTLS.jl/issues/133)で同様のissueが挙げられており、`Windows Management Framework 3`をインストールしていないことが原因だと記載されていた。具体的には、`Windows Management Framework 3`のインストールで得られる`Windows PowerShell`と、`Microsoft .Net Framework 4.5`以上が必要であるとのこと。
　私は`Microsoft .Net Framework 4.5`はインストール済みであったため、最新版の[Windows Management Framework 4](https://www.microsoft.com/ja-jp/download/details.aspx?id=40855)のインストールを行った。ダウンロードボタンをクリック後、`Windows6.1-KB2819745-x64-MultiPkg.msu(64bit版)`(32bit版の場合は`Windows6.1-KB2819745-x86.msu`)を選択してダウンロードおよびインストールを行った。
　インストール完了後に再起動すると、アクセサリの中に`Windows PowerShell`がインストールされていた。この状態で、`JuliaPkgDir`の中身をいったん削除し、`Pkg.init()`および`Pkg.add("IJulia")`を再度実行したところ、エラーを生じることなくインストールが完了した。

## Juliaの動作確認
　Juliaが使用できるか確認するために、以下のコマンドを実行する。

```julia

ENV["PYTHON"]="AnacondaDir\\python.exe"
Pkg.add("PyPlot")
```

これにより、JuliaからAnaconda3のpython.exeを呼び出せるようになった。また、環境変数で設定したJuliaPkgDirに`PyPlot`等のパッケージがインストールされ、PyPlotでグラフをプロットできるようになった。なお、pythonのパスを指定する際は、**バックスラッシュは二重にすること**。
　グラフのプロットができるか、以下のコマンドで確認する。
 
```julia

using PyPlot
plot(rand(10), rand(10))
```

プロットが別ウィンドウで表示された。

## Jupyter notebookからJuliaを使用する
Juliaから以下を実行する。

```julia

using IJulia
notebook()
```

するとJupyterが起動し、ウェブブラウザが呼びだされてJupyterのホーム画面が出てくる。あとは、Julia v0.6.2のカーネルを選択して、notebookを作成すればよい。
　なお、私は通常Jupyterを起動する際、スタートメニューのAnaconda3内に登録されているショートカットから行っているのだが、ショートカットから起動したJupyterでは、**Juliaカーネルを選択して数秒後にnotebookが落ちてしまう**。ターミナルには、`ZMQ.jl`および`IJulia`のプリコンパイルに失敗した旨が表示されていた。今のところ原因は不明。


## 【追記】Julia 1.0.0でJupyterを起動するときのメモ
　Juliaの最新版1.0.0をインストールし、REPLからJupyter notebookを立ち上げたところ、カーネルが死んでしまう状態となった。これについて、[Doesn't work on windows + Julia 0.7 #693](https://github.com/JuliaLang/IJulia.jl/issues/693)を参考に以下を試したところ、Jupyter notebookでJulia 1.0.0が使用可能になった。

```julia

pkg> free IJulia
pkg> up
```


## 【追記2】Windows10+Julia 1.0.0でJupyterを起動するときのメモ
　Windows10では、公式のJulia 1.0.0ダウンロードページにも記述してあるように、上記で述べたような最新版Windows Management Frameworkのインストールや、TLS "Easy Fix" updateが必要ない。しかしながら、`add IJulia`でパッケージを追加したのち、`build IJulia`でパッケージのビルドを試みたところ、以下のようにエラーが生じた。

```julia

(v1.0) pkg> add IJulia
  Updating registry at `C:\Users\username\.julia\registries\General`
  Updating git-repo `https://github.com/JuliaRegistries/General.git`
 Resolving package versions...
・
・
・
(v1.0) pkg> free IJulia
・
・
・
(v1.0) pkg> up
・
・
・
(v1.0) pkg> build IJulia
  Building Conda ──→ `C:\Users\username\.julia\packages\Conda\hsaaN\deps\build.log`
  Building ZMQ ────→ `C:\Users\username\.julia\packages\ZMQ\ABGOx\deps\build.log`
  Building MbedTLS → `C:\Users\username\.julia\packages\MbedTLS\mkHpa\deps\build.log`
  Building IJulia ─→ `C:\Users\username\.julia\packages\IJulia\4VL8h\deps\build.log`
┌ Error: Error building `IJulia`:
│ Traceback (most recent call last):
│   File "C:\Users\username\Anaconda3\Scripts\jupyter-kernelspec-script.py", line 6, in <module>
│     from jupyter_client.kernelspecapp import KernelSpecApp
・
・
・
│ ImportError: DLL load failed: 指定されたモジュールが見つかりません。
│ Traceback (most recent call last):
│   File "C:\Users\username\Anaconda3\Scripts\jupyter-kernelspec-script.py", line 6, in <module>
│     from jupyter_client.kernelspecapp import KernelSpecApp
・
・
・
│ ImportError: DLL load failed: 指定されたモジュールが見つかりません。
│ [ Info: Found Jupyter version 4.4.0: C:\Users\username\Anaconda3\Scripts\jupyter.exe
│ [ Info: Installing Julia kernelspec julia-1.0
│ ERROR: LoadError: failed process: Process(`'C:\Users\username\Anaconda3\Scripts\jupyter-kernelspec.exe' install --replace --user 'C:\Users\TENTOU~1\AppData\Local\Temp\julia-1.0'`, ProcessExited(1)) [1]
│ Stacktrace:
│  [1] error(::String, ::Base.Process, ::String, ::Int64, ::String) at .\error.jl:42
│  [2] pipeline_error at .\process.jl:705 [inlined]
│  [3] #run#504(::Bool, ::Function, ::Cmd) at .\process.jl:663
│  [4] run at .\process.jl:661 [inlined]
│  [5] #installkernel#4(::String, ::Function, ::String) at C:\Users\username\.julia\packages\IJulia\4VL8h\deps\kspec.jl:78
│  [6] installkernel(::String) at C:\Users\username\.julia\packages\IJulia\4VL8h\deps\kspec.jl:36
│  [7] top-level scope at logging.jl:310
│  [8] top-level scope at logging.jl:309
│  [9] top-level scope at C:\Users\username\.julia\packages\IJulia\4VL8h\deps\build.jl:38
│  [10] include at .\boot.jl:317 [inlined]
│  [11] include_relative(::Module, ::String) at .\loading.jl:1041
│  [12] include(::Module, ::String) at .\sysimg.jl:29
│  [13] include(::String) at .\client.jl:388
│  [14] top-level scope at none:0
│ in expression starting at C:\Users\username\.julia\packages\IJulia\4VL8h\deps\build.jl:9
└ @ Pkg.Operations C:\cygwin\home\Administrator\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.0\Pkg\src\Operations.jl:1069
```

そこで、[Problem installing IJulia on Windows 10 #674](https://github.com/JuliaLang/IJulia.jl/issues/674)を参考にして、以下のようにコマンドを入力したところ、`IJulia`をビルドできた。なお、念のため、Juliaを管理者権限で起動し、さらにファイアウォールは無効にした。

```julia
julia> using Conda
julia> Conda.add("jupyter")
julia> Conda.update()
julia> ENV["JUPYTER"]="C:\\path\\to\\Anaconda3\\share\\jupyter"
pkg> build IJulia
```

以下、コマンド実行の記録である。

```julia

julia> using Conda
julia> Conda.add("jupyter")
[ Info: Downloading miniconda installer ...
[ Info: Installing miniconda ...
[ Info: Running `conda config --add channels defaults --force` in root environment
Warning: 'defaults' already in 'channels' list, moving to the top
[ Info: Running `conda update -y conda` in root environment
Solving environment: done
・
・
・
julia> Conda.update()
[ Info: Running `conda update -y --all conda` in root environment
Solving environment: done
・
・
・
julia> ENV["JUPYTER"]="C:\\Users\\username\\Anaconda3\\share\\jupyter"
"C:\\Users\\username\\Anaconda3\\share\\jupyter"

(v1.0) pkg> add IJulia Resolving package versions...
  Updating `C:\Users\username\.julia\environments\v1.0\Project.toml`
 [no changes]
  Updating `C:\Users\username\.julia\environments\v1.0\Manifest.toml`
 [no changes]

(v1.0) pkg> build IJulia
  Building Conda ──→ `C:\Users\username\.julia\packages\Conda\hsaaN\deps\build.log`
  Building ZMQ ────→ `C:\Users\username\.julia\packages\ZMQ\ABGOx\deps\build.log`
  Building MbedTLS → `C:\Users\username\.julia\packages\MbedTLS\mkHpa\deps\build.log`
  Building IJulia ─→ `C:\Users\username\.julia\packages\IJulia\nBp96\deps\build.log`
```


# 参考
* [WindowsへのJulia言語のインストール](http://nbviewer.jupyter.org/gist/genkuroki/81de23edcae631a995e19a2ecf946a4f/Windows%E3%81%B8%E3%81%AEJulia%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB.ipynb#%E3%83%AA%E3%83%B3%E3%82%AF)
* [Windowsにpythonをインストールする時、PATHを通すのに手こずった話](http://7z.blog.jp/archives/1016951408.html)
* [Windows PowerShell 4.0をWindows7にインストールする手順](https://qiita.com/busonx/items/969d6656be0086e9242b)
* [自分の PC にインストール](http://www.cas.cmc.osaka-u.ac.jp/~paoon/misc/julia/post/install/)