Julia v1.1.0 の Windows 8.1 へのインストール

このファイルは次の研究集会での講演後に追加の資料として作成された:

このファイルはnbviewerで読める.

Julia+Jupyterを最も楽に使う方法は

を使うことである. ブラウザを使える環境ならどこでも使える. JuliaBox内にJulia言語のチュートリアルがある.

しかし, 自分のパソコン内でJulia+Jupyterの環境が構築されていると非常に便利である. このノートでは私が Windows 8.1 に Julia+Jupyter を入れたときの操作の仕方を解説する.

次のファイルも参照せよ:

Julia言語については公式ドキュメントが結構懇切丁寧でわかりやすい. 次のチュートリアルもおすすめである:

Julia+Jupyterの環境整備

Julia + Jupyter の組み合わせで,

  • Julia言語で書かれたプログラムのコード
  • その計算結果 (グラフのプロットや動画などを含む)
  • MathJaxで整形された数式を含むmarkdownで書かれた文書

の3つを1つのファイルの中に詰め込むことができる. これは非常に便利である. Jupyter では Python, R, Ruby なども使用可能である.

Windows 8.1 にJuliaとJupyterを入れる. 使用するブラウザはChromeである.

Juliaの公式バイナリのダウンロード

(1) Julia Downloads から Windows Self-Extracting Archive 64 bit をダウンロードしてインストール. インストール先は C:\Julia-1.1.0

Juliaのパッケージモードへの入り方

(2) julia.exe を起動.

julia>

というプロンプトが出る. パッケージモードに移動するには ] を押す. プロンプトは

(v1.1) pkg>

に変わる. 以下 pkg> と略記する. パッケージモードからもとに戻るには行頭でバックスペースを押す.

IJuliaのインストール

(3) IJulia.jlのインストール

IJulia.jl は Julia を Jupyter notebook で使用するためのパッケージである.

julia> ENV["JUPYTER"] = ""  # Juliaでインストールしたminiconda内のJupyterを使う設定
pkg> add IJulia
pkg> build IJulia
julia> using IJulia
julia> notebook(detached=true)
install Jupyter via Conda, y/n? [y]: y

これでJupyterの環境がJulia内から管理できるminiconda(Python環境)内にインストールされる.

私の環境ではChromeにlocalhost:8888/treeの空白のタブが開くというトラブルが発生した.

この空白タブ発生の問題を下の方ではminiconda内のnotebookのバージョンダウンで解決する.

追記(2019-03-26): 別のWindows 8.1機で上と同じ作業を繰り返したら, 空白タブ発生が起こらなかった. そのような場合には次の(4)のステップをとばしてよい.

Juliaでインストールしたminiconda内のjupyter.exeではなく, 外部の例えば C:\Anaconda3\Scripts\jupyter.exe を使用するならば最初の行を次のように変える.

julia> ENV["JUPYTER"] = "C:\\Anaconda3\\Scripts\\jupyter.exe"

私の環境では, Jupyterの設定ファイル群は /Users/genkuroki/AppData/Roaming/jupyter 以下に置かれている.

ブラウザに空白タブが開いた場合の対処の仕方

(4) Conda.jlでnotebookをバージョンダウンする.

Conda.jl を使えば Julia で ~/.julia/conda/3 以下にインストールした miniconda (Python) のライブラリを管理できる.

miniconda の notebook のバージョンダウンをする理由は上の「Chromeにおける空白タブ」の問題の解決と, Nbextensions の導入を確実にするためにである. もしもその2つの問題が解決済みならばバージョンダウンを実行する必要はない.

pkg> add Conda
julia> using Conda
julia> Conda.add_channel("defaults") # この行は必ずしも必要ない
julia> Conda.add("notebook=5.6.0")

これでJupyter notebookが普通に使えるようになった.

NbextensionsとRISEのインストール

(5) 続けて, NbextensionsRISEをインストール.

NbextensionsはJupyter notebookを便利に使うためにはほぼ必須の拡張群である. RISEはJupyter notebookでプレゼンも可能にするための拡張である. どちらも必須だと思っておいた方がよい.

julia> using Conda
julia> Conda.add_channel("conda-forge")
julia> Conda.add("jupyter_contrib_nbextensions")
julia> Conda.add("rise")

以上で Jupyter notebook + Nbextensions + RISE を使える環境が完成した.

動作確認のためには julia.exe を立ち上げ直して,

julia> using IJulia
julia> notebook(detached=true)

を実行する.

Jupyter notebook 起動用のバッチファイルの作成

(6) 次の内容のバッチファイルを作成.

C:\Users\genkuroki\.julia\conda\3\python.exe C:\Users\genkuroki\.julia\conda\3\cwp.py C:\Users\genkuroki\.julia\conda\3 "C:/Users/genkuroki/.julia/conda/3/python.exe" "C:/Users/genkuroki/.julia/conda/3/Scripts/jupyter-notebook-script.py" "C:\Users\genkuroki\OneDrive"
pause

このバッチファイルを実行すると, ChromeにJupyter notebookのタブが開く.

上のバッチファイルは私専用なので, 自分に合わせて書き直して使用すること.

PyCall, PyPlot, SymPyをインストール

(1) PyCall.jl

PyCall.jl はJulia言語内で Python を利用するために使われるパッケージである.

julia> ENV["PYTHON"] = "" # minicondaのpython.exeを使うための設定
pkg> add PyCall
pkg> build PyCall
julia> using PyCall
julia> PyCall.python
"C:\\Users\\genkuroki\\.julia\\conda\\3\\python.exe"

Julia でインストールしたminiconda内のPythonではなく, 外部の例えば C:\Anaconda3\python.exe を使うならば, 最初の行を

julia> ENV["PYTHON"] = "C:\\Anaconda3\\python.exe"

に変える.

(2) PyPlot.jl

PyPlot.jl は Python の matplotlib を使って作画するためのパッケージである. 一般に作画パッケージの使い方を覚える学習コストは非常に高い. PyPlot.jl を使えば Python で標準的に使われている matplotlib の使用経験があれば Julia でもほぼ同じコードでグラフをプロットできるようになる. ただし, Julia言語で文字列は Python 風の '文字列' の形式ではなく "文字列" の形式で書き, True, False は true, false と書く. このような書き換えは必要である.

pkg> add PyPlot
julia> using PyPlot

自動的にCondaによってmatplotlib関連のPythonライブラリがインストールされる.

(3) SymPy.jl

SymPy.jl は Python 環境の数式処理系 sympy をJulia言語内から使うためのパッケージである.

pkg> add SymPy
julia> using SymPy

自動的にCondaによってsympy関連がインストールされる.

自分が使いたいパッケージを自由に入れる

追加

pkg> add DifferentialEquations

削除

pkg> rm Distributions

インストールしたパッケージのリスト

pkg> st

プレコンパイル

pkg> precompile

アップデート

pkg> up

ヘルプ

pkg> help

Nbextensionsの設定

Live Markdown Preview

Nbextensions の Live Markdown Preview を使えば, LaTeX方式で書かれた数式やmarkdownによるマークアップをリアルタイムで整形した結果を見ながらmarkdownを変数することができる. 文書を書くときにはほぼ必須の機能である.

Jupyter の Nbextensions のタブで Live Markdown Preview の項目にチェックを入れれば使えるようになる.

RISE

RISEはJupyter notebookでプレゼンするために使える拡張である. 詳しい使い方については

を参照せよ.

Jupyter の Nbextensions のタブで RISE の項目にチェックを入れれば使えるようになる.

Table of Contents (2)

Table of Contents (2) を使えば Jupyter notebook に自動的に更新される目次を付けることができる.

Jupyter の Nbextensions のタブでその項目にチェックを入れれば使えるようになる.

Gist-it

Nbextensions の Gist-it を使えば, 手元のパソコン上で書いたJupyterノートブックをほとんどワンボタンで GitHub Gist に投稿して公開することができる. すでに公開したものの更新も Gist-it によって可能である.

(1) GitHub のアカウントを取得する.

(2) GitHub「Personal access tokens」の設定方法を読んで, GitHub のパーソナルアクセストークンを取得する.

(3) JupyterのNbextensionsタブで, Gist-itにチェックを入れる.

(4) Gist-it の詳細設定の "Github personal access token" に上で取得したトークンを貼り付け, "Gists default to public" にチェックを入れる.

(5) これで各ノートブックの "Create/Edit Gist of notebook" のボタンを使用可能になる. そのボタンを押すことによって GitHub Gist でノートブックを公開し, 簡単なバージョン管理もできるようになる.

(6) インターネット上で公開されたJupyterノートブックのURLを nbviewer に貼り付けることによって, GitHubのサイトよりもきれいに成形されたノートブックを閲覧できるようになる. (キャッシュが生成されるが、そのキャッシュを無視したい場合には最後に ?flushcache=true を付ける.

以上の手続きによって, 非除に気軽に Jupyter 上で書いたノートブックを公開できるようになる.

パッケージの簡単な使用例

PyCall.jl で Python を利用

PyCall.jl を使えばPythonの機能をかなり自由にJuliaでも利用できる.

まだ Julia からインストールした miniconda に scipy をインストールしていない場合には以下のセルを実行する. 私の環境ではすでにインストール済みだと表示される. Anaconda3 の python を利用している場合には scipy などのメジャーなライブラリは最初から入っている.

In [1]:
using Conda
Conda.add("scipy")
┌ Info: Running `conda install -y scipy` in root environment
└ @ Conda C:\Users\genkuroki\.julia\packages\Conda\CpuvI\src\Conda.jl:112
Collecting package metadata: ...working... done
Solving environment: ...working... done

## Package Plan ##

  environment location: C:\Users\genkuroki\.julia\conda\3

  added / updated specs:
    - scipy


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    conda-4.6.11               |           py36_0         1.7 MB
    ------------------------------------------------------------
                                           Total:         1.7 MB

The following packages will be UPDATED:

  conda                                        4.6.8-py36_0 --> 4.6.11-py36_0



Downloading and Extracting Packages
conda-4.6.11         | 1.7 MB    | ########## | 100% 
Preparing transaction: ...working... done
Verifying transaction: ...working... done
Executing transaction: ...working... done
In [2]:
using PyCall
PyCall.python, PyCall.pyversion
Out[2]:
("C:\\Users\\genkuroki\\.julia\\conda\\3\\python.exe", v"3.6.5")

上のセルでは使用する python.exe とそのバージョンを表示させた.

x₀ は x\_0 と入力してTABを押せば入力可能である.

In [3]:
so = pyimport("scipy.optimize")
x₀ = so.newton(x -> cos(x) - x, 1)
Out[3]:
0.7390851332151607
In [4]:
cos(x₀) - x₀
Out[4]:
0.0

pyimport("scipy.optimize") の代わりに, pyimport_conda("scipy.optimize", "scipy") を使えば, 自動的に miniconda 環境に scipy がインストールされる. 詳しくは Using PyCall from Julia Modules を参照.

PyPlot.jl でプロット

In [5]:
@time using PyPlot: PyPlot, plt
  4.680144 seconds (6.21 M allocations: 305.032 MiB, 3.34% gc time)

Code セルにおいて π は \pi の後にタブを押すと入力される.

In [6]:
x = range(-3π, 3π, length=400)
plt.figure(figsize=(4,2))
@time plt.plot(x, sin.(x))
@time plt.plot(x, cos.(x))
plt.grid(ls=":")
  0.562841 seconds (1.33 M allocations: 66.538 MiB, 3.50% gc time)
  0.068644 seconds (171.93 k allocations: 8.509 MiB, 8.86% gc time)

SymPy.jl で数式処理

sympyの詳しい解説についてはPython版のsympyの解説を参照すればよい.

ただし, 'string' → "string" や True, False → true, false などの書き換えは必要になる.

In [7]:
@time using SymPy: SymPy, sympy, Sym, @vars, PI, oo
  6.864220 seconds (10.79 M allocations: 535.044 MiB, 4.20% gc time)
In [8]:
@vars x
@vars a r positive=true
I = sympy.Integral(exp(-a*x^r), (x, 0, oo))
display("text/html", 
    raw"$$" * 
    sympy.latex(I) * "=" * sympy.latex(I.doit().simplify())
    * raw"$$")
$$\int_{0}^{\infty} e^{- a x^{r}}\, dx=a^{- \frac{1}{r}} \Gamma\left(1 + \frac{1}{r}\right)$$

Julia言語では文字列の連結には * を使う.

Plots.jl gr() バックエンドでプロット

Plots.jl は上で紹介した PyPlot.jl と共に, Julia言語でよく使われている作画パッケージである. Plots.jl では複数のバックエンドを切り替えて使うことができる. 以下では gr() バックエンドを使う. 他にも pyplot(), plotlyjs() などがある.

次のセルのように, 先頭が ] のCodeセルではパッケージモードのコマンドが実行される. この機能を使えば, Jupyterノートブックの中でパッケージ管理をある程度できる. 次のセルではもしも Plots パッケージがインストールされていないならばインストールされる.

In [9]:
]add Plots
  Updating registry at `C:\Users\genkuroki\.julia\registries\General`
  Updating git-repo `https://github.com/JuliaRegistries/General.git`
 Resolving package versions...
  Updating `C:\Users\genkuroki\.julia\environments\v1.1\Project.toml`
 [no changes]
  Updating `C:\Users\genkuroki\.julia\environments\v1.1\Manifest.toml`
 [no changes]
In [10]:
@time using Plots
  8.599652 seconds (15.73 M allocations: 800.354 MiB, 5.03% gc time)
In [11]:
gr(legend=:bottomright, size=(600,200))
## cutted(f) = f # safefuncを無効にすると縦に余計な線が入る
cutted(f; M=5) = (x -> (y = f(x); abs(y) > M ? typeof(y)(NaN) : y))
interval = range(-5π, 5π, length=400)
funcs = [sin, cos, tan, cot]
@time plot(cutted.(funcs), interval, ylim=(-2, 2), label=["sin", "cos", "tan", "cot"])
 17.279587 seconds (41.83 M allocations: 2.038 GiB, 8.41% gc time)
Out[11]:
-15 -10 -5 0 5 10 15 -2 -1 0 1 2 sin cos tan cot

上のセルでのプロットに長大な時間がかかっているように見えるのは, プロット関係の函数群のコンパイルが just-in-time で実行されているからである. 実行したいプログラムのコードの入力を始める前に plot(sin) などを実行しておけば, コードの入力が終わる頃にはプロット関係の函数がコンパイルされており, すぐにプロットできるようになっていて便利である.

以下のようにアニメーションの作成も容易である.

In [12]:
using Base64
showgif(fn) = open(fn) do f
    b = base64encode(f)
    display("text/html", """<img src="data:image/gif;base64,$b">""")
end

gr(size=(600, 200), legend=:bottomright)
ENV["PLOTS_TEST"] = "true"

interval = range(1, 20, length=100)
@time anim = @animate for a in 2π*[interval; reverse(interval)] 
    x = range(0, a, length=400)
    plot(x, [sin.(x), cos.(x)], label=["sin", "cos"], ylim=(-1.1, 1.1))
end

gifname = "sin-cos.gif"
gif(anim, gifname, fps = 15)
sleep(0.1)
showgif(gifname)
  8.146110 seconds (43.53 M allocations: 1.154 GiB, 4.06% gc time)
┌ Info: Saved animation to 
│   fn = C:\Users\genkuroki\OneDrive\msfd28\sin-cos.gif
└ @ Plots C:\Users\genkuroki\.julia\packages\Plots\47Tik\src\animation.jl:90