WindowsへJulia(IJulia)をインストールする＋Powershellでファイルをダウンロードする

**追記(19/10/06)**
この記事は古いです。Julia v1.2がリリースされています。
v1.0では以下の記述を`C:\Users\YourUserName\.julia\packages\BinaryProvider\xxxxx\src\PlatformEngines.jl`に書かれているWindows用のPowerShellを使ったダウンロードコマンドの部分に読み替える。(`xxxxx`は英数字)
v1.2では別途curlをインストールするほうが早いです。`ENV["BINARYPROVIDER_DOWNLOAD_ENGINE"]`に`"curl"`を設定すればインストールされているcurlを使用するようになります。([参考1](https://twitter.com/sgryjp/status/1149328754281287681), [参考2](https://qiita.com/sugasaki/items/ba9737d13db33d2cd71f),  [参考3](https://qiita.com/ch7821/items/9f526985c8ff1b90e426))

## はじめに
この記事は前回からの続きである。
`Pkg.add("IJulia")`をする際に認証プロキシ環境下のWindowsだといろいろ大変だったということをまとめた。

[前編](https://qiita.com/JKirisaka/items/c0736a9e2838710e8aaa) / 後編(本記事)


### 環境
- マシン - Windows10(64bit)
- Anaconda3 - ver 5.0.1
- Julia - ver 0.6.1
- 外部ネットワークへの接続に認証プロキシサーバを経由する

## 手順
### Step3 : パッケージを書き換える
前回までの方法でWinRPMパッケージのビルドに失敗した状態で、Juliaのパッケージを置くように指定したディレクトリを覗くと、`v0.6\WinPRM\src\WinRPM.jl`というファイルが置かれていた。
このファイルのWindows用のdownload関数を丸々以下のように書き換えた。

```julia
download_engine = "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell"
dest = tempname()
info("Download to: $dest") # @info for v1.0
server = "http://hardcode-proxyserver:8080/"
credential = "\$cr=get-credential"
proxy = "\$pr=new-object net.webproxy \"$server\""
webclient = "\$wc=new-object net.webclient"
setting = "\$pr.credentials=\$cr; \$wc.proxy=\$pr; \$wc.downloadfile(\"$source\", \"$dest\")"
ps_cmd = "$credential; $proxy; $webclient; $setting"
run_cmd = `$download_engine -NoProfile -Command "$ps_cmd"`
try
    res = run(run_cmd)
    if res == nothing
        return read(dest, String), 200
    else
        warn("Download failure: $res") # @warn for v1.0
    end
catch e
    warn(e, prefix="WARNING(ErrorException): ") # @warn for v1.0
end
return "", 0
```

これは、コマンド実行の中でPowerShellを利用して以下のことをやっている。
まずはPowerShellを立ち上げてこれでダウンロードできるか確かめるとストレスがないと思う。

```powershell:powershell
$source = "target.url"
$dest = "file.name"
$cr=get-credential
$pr=new-object net.webproxy "http://hardcode-proxyserver:8080/"
$wc=new-object net.webclient
$pr.credentials=$cr
$wc.proxy=$pr
$wc.downloadfile($source, $dest)
```

実行してみると以下のように資格情報を要求されるので、プロキシサーバに対して入力されたユーザ名とパスワードでユーザ認証を行う。
いちいち入力するのが煩わしい場合は、環境変数の`HTTP_PROXY`にこれらの情報を設定していると思うので、そこから取り出すようにコードを変更するといいだろう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/201984/c73ddf7f-c0dd-da92-234d-6ba87644d0de.png)

現状Juliaはファイルをダウンロードするのに、Windowsでは`URLDownloadToCacheFile`というAPIを叩いている。
しかし、このAPIはインターネットエクスプローラの設定からプロキシサーバの情報を取得しているため、会社の規則などで資格情報を保存しないようにしていると認証の段階で資格情報が利用できずにファイルをダウンロードすることができない。
（私の環境では`HTTP_PROXY`も保存していない（！））

### Step4 : 再度`Pkg.add("IJulia")`を実行する
以下のコードを実行する。

```julia:julia
Pkg.add("IJulia")
```

ビルドが成功すると、以下のようにJupyter NotebookでJuliaが扱えるようになった。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/201984/9ff53ee9-e442-a3bc-40c4-8f19b0e31987.png)

## おわりに
色々参考にしてPowerShellのコマンドを並べてみた。
あと、[Chocolatey](https://chocolatey.org/)というWindows用のパッケージマネージャがあって、それの`install.ps1`というファイルにPowerShellでファイルをダウンロードする手順が詳しく書かれているらしい。
ともあれ、Juliaの正式版リリースが楽しみだ。

## 参考
- guitarrapc_tech / [PowerShell で Get-Credential を利用する](http://tech.guitarrapc.com/entry/2014/01/14/101056)
- kkdd / [認証proxyを使う環境設定（PowerShell）](https://qiita.com/kkdd/items/ac6e65f6e2e8fc32e7ca)