Julia 0.7.0でつまずいたことメモ【20.05.15更新】

#はじめに
ついにv0.7.0が出ました（そして、今はv1.4.1）。色々変化があるようで、たくさんのWARNINGが出されるだろうということを聞いています。WARNINGの対処方法が分かったりしたら、忘れないようにここにメモして行こうと思います。本記事は何度も何度も更新していくことになるかと思います（気軽な個人用メモの感覚で行きます）。何かおかしな点がありましたら、ご指摘いただければと思います。

#困ったことや解決したこと

##①`Pkg.add("云々")`すると、Base.Pkg is deprecated, run `using Pkg` instead”とWARNING出される

REPL上で`]`を押すと、pkg管理のための専用モード（？）のような状態になります。この時、REPLの入力受付部の文言には、見た目上の変化が起きて、青字の`(v0.7) pkg>`になります。その状態で、`add Plots`と入力すれば、パッケージ（追加機能）が追加（ダウンロード・インストール）されます。
※pkg管理のモードを解除するには、`Ctrl+C`を入力すれば良いようです。他，バックスぺースキーでも解除できました。
※他のpkg管理のモード中でのコマンドも、少しだけ紹介しておきます。`st`または`status`では、追加されたパッケージの一覧（バージョン付）の表示ができる、`up`または`update`では、追加されたパッケージのアップデートができるようです。この辺りは頻繁に使うかもしれませんね。

【参考】Getting Starteの章←URL: https://docs.julialang.org/en/latest/stdlib/Pkg/#Garbage-collecting-old,-unused-packages-1

##②IJulia ~~は8/9現在は、Windows環境では動作しない~~ の状況
【2018.10頃～】今は普通に使えます！
~~①に示した手順で、`add IJulia`としてパッケージを追加し、その後、`notebook()`を打つことで、起動することはできました。しかし、`1+1`のような簡単なコードの実行をしても、応答がまったく帰っきませんでした。現在いろいろな関連するパッケージで対応中なのだと思われます。
★8/12追記：pkg管理のモードで`add Conda#master`しておいたり、それでも駄目なら、`add PyCall#master`もしておいたりすると、ちゃんとIJuliaが動作するかもしれません。私はこれで動くようになりました。これは、下記参考1、2で分かりました。他にも応用が利きそうです。~~
【参考1】https://twitter.com/cometscome_phys/status/1027789617632669696
【参考1】https://twitter.com/cometscome_phys/status/1027790617152090112


##③`eye()`がdeprecatedだとWarning出される
例えて説明します。Julia 0.6.4までの`eye(3)`であれば、代わりに、`Matrix(1.0I, 3, 3)`等とすることで従来と同じ結果が得られるようです。ただし、その前に`using LinearAlgebra`としておく必要があるようです（`Matrix()`で登場した`I`はLinearAlgebraの中にあるから）。このようにすれば、deprecatedの警告がでなくなります。eyeがdeprecatedになったのかについての議論は下記参考1で見ることができます。
でも、それだけではなく、次のことも知っておくと良いでしょう。きっと、より便利になったと感じられると思います。幾つかの例で説明します。

```julia
zeros(3, 3) + I
```

とすると、結果は、

```
3×3 Array{Float64,2}:
 1.0  0.0  0.0
 0.0  1.0  0.0
 0.0  0.0  1.0
```

```julia
zeros(5, 5) + I
```

とすると、結果は、

```
5×5 Array{Float64,2}:
 1.0  0.0  0.0  0.0  0.0
 0.0  1.0  0.0  0.0  0.0
 0.0  0.0  1.0  0.0  0.0
 0.0  0.0  0.0  1.0  0.0
 0.0  0.0  0.0  0.0  1.0
```

もう少し応用で、

```julia
[zeros(3, 3) I
 ones(3, 3)  2*ones(3, 3)]
```

とすると、結果は、

```
6×6 Array{Float64,2}:
 0.0  0.0  0.0  1.0  0.0  0.0
 0.0  0.0  0.0  0.0  1.0  0.0
 0.0  0.0  0.0  0.0  0.0  1.0
 1.0  1.0  1.0  2.0  2.0  2.0
 1.0  1.0  1.0  2.0  2.0  2.0
 1.0  1.0  1.0  2.0  2.0  2.0
```

この挙動はかなり嬉しい気がします！LinearAlgebraの`I`は、色々応用が利きそうですね。詳しくは、下記参考2のdocumentationを参照すると良いでしょう。

【参考1】URL: https://discourse.julialang.org/t/why-eye-has-been-deprecated/12824/86
【参考2】URL: https://docs.julialang.org/en/latest/stdlib/LinearAlgebra/

##④~~パッケージPlotsは`using Plots`でERRORが出る~~
【2018.10頃～】今は普通に使えます！
~~今のところ解決不明です。きっと対応中なのだと思います。
私はWindows7環境ですが、他の方はどうなのでしょうか？
ちなみに、pkg管理のモードの`st`で見られる情報は以下の通りでした（自分の手で`add`したパッケージの情報だけ表示される模様。依存して勝手に追加されるパッケージの情報は表示されないみたいです）。~~

```
[7073ff75] IJulia v1.9.1
[91a5bcdd] Plots v0.17.4
[92933f4c] ProgressMeter v0.5.6
[438e738f] PyCall v1.17.1
[24249f21] SymPy v0.7.0
```

##⑤関数名の変化【18.11.09更新】
例えば、`endof()`はdeprecadedとなり、代りに`lastindex()`を使うように、となりました（似ている`length()`は変化なし）。
過去のコードを直す場合、関数名すべて置換することを考えるかもしれませんが、そうしなくても、コードの頭の方に、`古い関数名 = 新しい関数名`を書いておけば、正しく動作するようにできます。
他、関数名が変化していることに気づいたものは以下の通りです。

```julia
#古い方 = 新しい方
endof = lastindex
ismatch = occursin
linspace(st, en, N) = range(st, en, length=N)
flipdim(A, d) = reverse(A, dims=d) #reverseではAが1次元配列ならばdimsの指定は省略できる
find = findall
find(なんとか)[1] = findfirst(なんとか)
find(なんとか)[end] = findlast(なんとか)
```

##⑥using 〇〇が必要になった関数
```julia
#readdlm（csv等のファイルの読み込み）
using DelimitedFiles
readdlm("filename.csv", ',')

#det（行列式の計算）
using LinearAlgebra
det(A)
```

##⑦丸め関数`round()`、床関数`floor()`、天井関数`ceil()`について

例えば、

```julia
round(123.456, digits = 1)  #v0.6.4まではround(123.456,1)と書いた
round(123.456, digits = 0)
round(123.456, digits = -1)
```

とすると、結果はそれぞれ、0.1刻み、1刻み、10刻みに丸められたもの、すなわち、

```
123.5
123.0
120.0
```

となります。`floor()`や`ceil`も同様のようです。関数に`digits=整数`というキーワード引数を追加することで、端数処理の桁位置が設定できるようです。

さらに`base=整数`というキーワード引数も追加すると、もう少し難しい刻みの端数処理が行えます。例えば、

```julia
round(123.26, digits=1, base=2)
round(123.26, digits=1, base=3)
round(123.26, digits=1, base=4)
```
とすると、結果はそれぞれ、0.5刻み、0.3333333333333333刻み、0.25刻みに丸められたもの、すなわち、

```
123.5
123.33333333333333
123.25
```

となります。このような端数処理が簡単にできるようになったようです。