VSCode+Jupyter拡張機能でJulia1.5の開発環境を構築する

# 1. はじめに
- 科学技術計算指向のプログラム言語として、Julia(ジュリア)が注目を集めている。
- 本ページでは、Visual Studio Code(以下VSCode)でJuliaの開発環境を構築する。
- また、VSCodeに[Jupyter拡張機能](https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter)を導入することで、VS CodeからJupyter Notebookを利用する。
- 対象OSは Windows 10 Home 64bit とする。
- 本ドキュメントの記載内容まとめ
  - VSCodeからREPLモード(対話型)のJuliaを実行する。
  - VSCodeでJuliaファイル(`.jl`)の編集、および実行する。
  - VSCodeでJulia用のJupyter Notebookを実行する。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306047/c337788c-c6a8-48b2-482e-2046d8eaae9a.png)

# 2. インストール
- 以下のパッケージをダウンロードおよびインストールする(執筆時点の最新版)。

- Python以外の言語でJupyterをVSCodeで実行したい場合、Stable版ではなく、<font color=red>Insiders</font>版を利用する必要がある点に注意。
 
| 項目 | バージョン| URL |
| --- | --- | --- |
| Julia | 1.5.3 installer (windows-64bit) | https://julialang.org/downloads |
| Visual Studio Code Insiders| 1.53.0-insider (x64)| https://code.visualstudio.com/insiders/ |
| Julia (VSCode Extension) | v1.0.10 | https://marketplace.visualstudio.com/items?itemName=julialang.language-julia |
| Jupyter (VSCode Extension) | 2020.12.414227025 | https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter |

## 2.1. 環境変数の設定
- ユーザ環境変数 Path に Julia の実行ファイルのパスを追加する。
  - [コントロールパネル] > [システム] > [システムの詳細設定] > [環境変数] > [ユーザ環境変数] > [Path]

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306047/c94cf1b5-0ec4-bec6-6aa8-9253e11f3a94.png" width=50%>

## 2.2. インストール確認
1. Visual Studioを起動し、Terminalウインドウを開く(CTRL+@)
2. Terminalウィンドウで `julia --version` を入力し、インストールされたJuliaのバージョンを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306047/2c56ff20-8862-a726-8ead-d3a8809451a4.png)

# 3. 動作確認(REPL)
- Juliaには[REPL(read-eval-print loop)](https://docs.julialang.org/en/v1/stdlib/REPL/)と呼ばれる対話的実行環境が存在している。
  - 構文の評価、過去の入力履歴の検索、タブ補完、キーバインド、専用のヘルプモードとシェルモードなどを備えている。
- 本章ではVSCodeでREPLを利用する方法を解説する。
- 以降の作業は、VSCodeのTerminalウィンドウ(CTRL+@)にて実行する前提とする。
  - `Ctrl+L`を押すと、Terminalウィンドウの表示がクリアされる。

## 3.1. REPLの開始／終了
- Terminalウィンドウ(デフォルトはPowerShell)で、`julia`を引数なしで実行すると、REPLが開始される。
- REPL実行中はプロンプトに`julia>`が表示される。
- `CTRL+d`または、`exit()`を実行することで、REPLが終了される。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306047/eae2c95e-1301-cded-5469-7e184561a810.png" width=50%>

## 3.2. REPLプロンプトモード
- REPLには以下の動作モードが存在している。
  - ジュリアモード(The Julian mode)
  - シェルモード(Shell mode)
  - ヘルプモード(Help mode)
  - 検索モード(Search modes)
  - パッケージモード(Pkg mode)
- デフォルトの動作モードはジュリアモードとなる。

### 3.2.1. ジュリアモード
- `julia>`プロンプトに「式」を入力すると、以下の処理が行われる。
  - 入力式が評価され、式の結果が変数`ans`に代入される。
  - プロンプトの応答に式の結果が表示される。
  - 入力する「式」の行末にセミコロン`;`を指定すると、結果が表示されなくなる。
- 実行した関数はキャッシュされる為、同一の関数を複数回実行すると2回目以降の計算速度が早くなる。


```julia:変数の代入
julia> a = 1 + 2
3
julia> a
3
```

```julia:結果表示の抑制／変数ansへの代入
julia> string(3 + 4);
julia> ans
"7"
```

### 3.2.2. ヘルプモード
- `julia>`プロンプトにクエスチョン`?`を入力すると、ヘルプモードとなる。
- ヘルプモード実行中はプロンプトに`help?>`が表示される。
- `help?>`プロンプトに「型」や「関数」「マクロ」などを入力すると、該当するヘルプが表示される。

```julia:型のヘルプ例(UInt64)
help?> UInt64
search: UInt64 UInt16
  UInt64 <: Unsigned
  64-bit unsigned integer type.
```

```julia:関数のヘルプ例(SubString)
help?> SubString
search: SubString SubstitutionString
  SubString(s::AbstractString, i::Integer, j::Integer=lastindex(s))
  SubString(s::AbstractString, r::UnitRange{<:Integer})

  Like getindex, but returns a view into the parent string s within range i:j or r respectively instead of making a copy.

  Examples
  ≡≡≡≡≡≡≡≡≡≡
  julia> SubString("abc", 1, 2)
  "ab"  
  julia> SubString("abc", 1:2)
  "ab"  
  julia> SubString("abc", 2)
  "bc"
```

```julia:マクロのヘルプ例(@elapsed)
help?> @elapsed
  @elapsed

  A macro to evaluate an expression, discarding the resulting value, instead returning the number of seconds it took to   
  execute as a floating-point number.
  See also @time, @timev, @timed, and @allocated.

  julia> @elapsed sleep(0.3)
  0.301391426
```

### 3.2.3. シェルモード
- `julia>`プロンプトにセミコロン`;`を入力すると、シェルモードとなる。
- シェルモード実行中はプロンプトに`shell>`が表示される。
- `shell>`プロンプトにて`powershell`または`cmd`でシェルコマンドを実行できる。<BR><font color=red>Windowsの場合、シェルを指定せずに直接コマンドは実行できない点に注意。</font>
  - `powershell [command]`を入力すると、PowerShellのコマンドを実行できる。
    - `[command]`を入力しない場合、PowerShellが実行される(`PS C:\>`プロンプト)
      - `exit`でPowerShellを終了できる。
  - `cmd`を実行するとコマンドプロンプトのシェルが実行される(`C:\>`プロンプト)
     - `exit`でコマンドプロンプトを終了できる。


```powershell:PowerShellの実行(直接コマンド実行)
shell> powershell date
2021年1月24日 22:00:07

julia>
```

```powershell:PowerShellの実行(シェルの実行)
shell> powershell
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:\> date
2021年1月24日 22:05:05

PS C:\> exit

julia>
```

```powershell:cmdの実行(シェルの実行)
shell> cmd
Microsoft Windows [Version 10.0.18363.1316]
(c) 2019 Microsoft Corporation. All rights reserved.

C:\>date /T 
2021/01/24 

C:\>exit    

julia>
```

### 3.2.4. 履歴モード
- REPLにて実行されたすべてのコマンドは履歴ファイルに保存され、履歴モードでインクリメンタルサーチできる。
- プロンプトにおいて`CTRL+S`(順方向)または`CTRL+R`(逆方向)を入力すると、履歴モードとなる。
- 履歴モード実行中はプロンプトに`(forward-i-search):`または`(reverse-i-search):`が表示される。
  - `(forward-i-search)`： 履歴を順方向で検索する。`CTRL+S`で次の履歴(順方向)に遷移する。
  - `(reverse-i-search)`： 履歴を逆方向で検索する。`CTRL+R`で次の履歴(逆方向)に遷移する。

```powershell:履歴モード(順方向及び逆方向)
(forward-i-search)`p': powershell

(reverse-i-search)`p': powershell
```

### 3.2.5. パッケージモード
- `julia>`プロンプトに`]`を入力すると、パッケージモードに遷移する。
- パッケージモード実行中はプロンプトに`Pkg>`が表示される。
- コマンドにおいて、以下を実行できる。
  - `add`: パッケージの追加
  - `remove`: パッケージの削除
  - `update`: パッケージの更新
  - `status`: インストールしたパッケージの一覧を表示

```julia:パッケージの追加／削除
(@v1.5) Pkg> add <パッケージ名> #パッケージの追加
(@v1.5) Pkg> remove <パッケージ名> #パッケージの削除
```

```julia:パッケージの更新
(@v1.5) pkg> update Plots  # 指定したパッケージのみ更新
 Installing known registries into `C:\Users\nomunomu\.julia`
      Added registry `General` to `C:\Users\nomunomu\.julia\registries\General`
   Updating registry at `C:\Users\nomunomu\.julia\registries\General`
No Changes to `C:\Users\nomunomu\.julia\environments\v1.5\Project.toml`
No Changes to `C:\Users\nomunomu\.julia\environments\v1.5\Manifest.toml`

(@v1.5) Pkg> update # Generalの全パッケージを更新
   Updating registry at `C:\Users\nomunomu\.julia\registries\General`
No Changes to `C:\Users\nomunomu\.julia\environments\v1.5\Project.toml`
No Changes to `C:\Users\nomunomu\.julia\environments\v1.5\Manifest.toml`
```

```julia:パッケージ一覧の確認
(@v1.5) pkg> status
Status `C:\Users\nomunomu\.julia\environments\v1.5\Project.toml`
  [91a5bcdd] Plots v1.10.2
```

### 3.2.6. Tab補完
- ジュリアモードなどで、最初の数文字を入力してから、`[Tab]`キーを押すことで一致するすべてのリストを取得できる。

```julia:Tab補完の例
julia> stri[TAB] # stri から始まる関数が表示されている
stride     strides     string      strip

julia> Stri[TAB] # Stri から始まる型／構造体が表示されている
StridedArray    StridedMatrix    StridedVecOrMat  StridedVector    String
```

- LaTeX数学記号を同等のUnicodeで置き換えたり、LaTeX一致のリストを取得することもできる。

```julia:LaTex数学記号
julia> \pi[TAB]
julia> π
π = 3.1415926535897... # πの定義値が表示される

julia> e\_1[TAB] = [1,0]
julia> e₁ = [1,0] # 変数名が e₁
2-element Array{Int64,1}:
 1
 0

julia> e\^1[TAB] = [1 0]
julia> e¹ = [1 0] # 変数名が e¹ 
1×2 Array{Int64,2}:
 1  0

julia> \sqrt[TAB]2     # √はsqrt関数(平方根)と同等
julia> √2
1.4142135623730951
```

- フィールドや関数の戻り値の補完もタブ補完が可能となる。

```julia:フィールドおよび関数の戻り値のタブ補完
julia> import UUIDs

julia> UUIDs.uuid[TAB] # UUIDs構造体内における uuid から始まるフィールド一覧が表示される
uuid1        uuid4         uuid_version

julia> split("","")[1].[TAB] # split型の戻り値である SubString{String} のフィールド一覧が表示される
lastindex  offset  string
```

# 4. 動作確認(ファイル実行形式)
- 本章ではファイル実行形式でサンプルプログラムを動作させる。
- 以降の作業は、VSCodeのエディタウィンドウでソースを編集・保存・実行する前提とする。

## 4.1. サンプルプログラム
- 以下のようなファイルを作成し、任意の名前(Juliaソースファイルの拡張子は`.jl`)で保存する。

```Julia:sample.jl
using Plots

x = 0: 0.01:2pi
f(x) = x ^ 2
plot(x , f)
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306047/bcca8a7a-24cf-9135-596c-05fb6668c17b.png" width=50%>

### 4.1.1. プログラムの実行
- エディタにおいて `SHIFT + ENTER`を押下することで、Juliaプログラムを実行できる。
- Plotsパッケージが見つからない場合、エラーとなる。

```
ERROR: LoadError: ArgumentError: Package Plots not found in current path:
Run `import Pkg; Pkg.add("Plots")` to install the Plots package.
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306047/c4cdbb48-b4af-9d9b-c6c4-6c96838e904e.png)


## 4.2. パッケージのインストール
- Plotsパッケージをインストールする。
  - REPL ジュリアモードにおいて、`Pkg.add`を行うことで、対象パッケージをインストールできる。
                                                  
```julia
julia> import Pkg
julia> Pkg.add("Plots")
 Installing known registries into `C:\Users\nomunomu\.julia`
 C:\Users\nomunomu\.julia`
      Added registry `General` to `C:\Users\nomunomu\.julia\registries\General`
```

### 4.2.1. プログラムの実行
- エディタにおいて `SHIFT + ENTER`を押下することで、Juliaプログラムを実行できる。
- Plotsパッケージがインストールされた状態で実行すると、以下のように実行される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306047/86a797f5-c58e-d7ea-4613-7ac9fda2420b.png)


# 5. 動作確認(Jupyter)
- 本章ではVS Codeにおいて Jupyter Notebookを動作させる。
- 以降の作業は、VSCodedeで作業を行う前提とする。

## 5.1. インストール
- JupyterをVSCodeで実行するためには、Jupyterのカーネルがインストールされている必要がある。
- 以下のパッケージをREPLのパッケージモードでインストールする(執筆時点の最新版)。
  - `CTRL+@`でターミナルを開き、コマンドラインから`julia`を実行することでREPLを実行できる。

| 項目 | バージョン| URL |
| --- | --- | --- |
| IJulia | 1.23.1 | https://github.com/JuliaLang/IJulia.jl |

```julia:IJuliaのパッケージのインストール
julia> import Pkg; Pkg.add("IJulia")
 Installing known registries into `C:\Users\nomunomu\.julia`
      Added registry `General` to `C:\Users\nomunomu\.julia\registries\General`
```

- `notebook()`を実行すると、デフォルトブラウザ上でJupyter Notebookが起動する。
  - <font color=red>VSCodeのターミナルから`CTRL+C`でJupyter Notebookを終了すること。</font>

```julia:notebook()を実行する。
julia> using IJulia
[ Info: Precompiling IJulia [7073ff75-c697-5162-941a-fcdaad2a7d2a]

julia> notebook()
install Jupyter via Conda, y/n? [y]: y
(以下略)
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306047/73f6bc99-3db5-0175-51e5-ef059e89d256.png" width=80%>

## 5.2. エディタの設定
- コマンドパレット(`CTRL + SHIFT + P`)を実行し、`Preferences: Open Settings (JSON)`を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306047/16a6e514-e40d-11cc-166a-5cfa0348e245.png)

- `settings.json`において、以下を入力する。
  - `jupyter.insidersChannel`は、Jupyter拡張機能のUpdate確認用なので、必要に応じて設定すること。

```json:settings.json
{
    "jupyter.experiments.optOutFrom": ["NativeNotebookEditor"],
    "jupyter.insidersChannel": "daily",
}
```

## 5.3. Jupyter Notebookの設定
- コマンドパレット(`CTRL + SHIFT + P`)を実行し、`Jupyter: Select a Kernel`を選択後、`Julia`を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306047/afcfe9fc-7a0f-a123-29fd-58512bb378ed.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306047/0b4f8aa6-6231-55b7-282c-5b643c812be0.png)

## 5.4. Jupyter Notebookの実行
- コマンドパレット(`CTRL + SHIFT + P`)を実行し、`Jupyter: Create New Blank Jupyter Notebook`を選択する。
  - または任意の`.ipynb`ファイルを作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306047/b3b79db9-bd74-de5f-cc38-0b17235f8fbb.png)

# 6. まとめ
- VSCodeをフロントエンドとしてJuliaの実行環境を構築できることを確認した。
  - REPLモードの実行
  - Juliaファイルの編集、および実行
  - Jupyter Notebookを実行できた。
- Python以外の言語でも、VSCode内でJupyter Notebookが利用できるのは良いことです(*'ω'*)