２０１９年クリスマスシーズンからプログラミング言語 Julia を始めるため，第１歩からN(>=1)歩進む手引き

# 本日は

- カレンダーが空いていたので書きます．
- １日目だし プログラミング言語の Julia やってみようかなーな人向けに書きます．
- あまりソフトウェアの開発の経験がない人向けに書いています．

# Julia の魅力的なところ(数学的表現がしやすい)

- 筆者は純粋数学系出身なのでプログラムに縁がなく幸か不幸か社会人になって初めて本格的にコードを書くことになりました．このとき不満だったのは教科書に書いてあるような数学記号やギリシャ語を表現する手段が許されておらず $\alpha$, $\beta$ をしょうがなく `alpha`, `beta` と書いていました．PCは LaTeX を書くためというもんだと思ってたので，なんでそういうのサポートされてないんだとプンスコしていたのを思い出します．
- Juliaでは数学的な記法を素直にプログラムの変数として表現することができます．例えば円周率 $\pi$ を `\pi` で表記することができます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135978/ace56c7b-566f-38a5-af9d-8a440eaa4b0e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135978/2d59e737-c5be-01ac-d192-2806640d6bc9.png)

- もちろん $\alpha$, $\beta$, $\zeta$ もできます．機械学習系のJuliaパッケージでは勾配を表すために $\nabla$　を使ってたりします．これは数学的なバックグラウンドを持たないプログラマーにとって違和感を覚えるかもしれませんが，理学系の人間にとってはとても魅力的な機能です．他にも `sqrt(2)` を $\sqrt{2}$ として表記できます．REPLモードで`?`を入力してやると 思ってたよりも多くの数学記号をサポートしていることがわかると思います．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135978/e80989b3-9864-a1bc-b19c-762e73c81c56.png)

- 一部制限がありますが $x_1$, $X^N$ のように添字をつけることもできこれは一つの新しい変数として使うことができます．

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135978/298c6872-794f-d9d8-a59b-cf4bd15a58b2.png)

- ソフトウェアにおける可読性という概念がありますが，添字が使えることで数学的対象の視認性が良くなります．一部の人が $X^N$ という記号を使うと（文字の入力の関係で）保守しにくいと感じる人はいます．これはプログラミングに慣れている人にほどいう傾向があります．それは確認の仕方を知らないだけであって，Juliaのhelpモードを使うと書いているわけです．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135978/21c4c4cf-6f3d-b612-e410-5617dc94f79f.png)
- このヘルプモードは結構役に立つようになっていて，関数や変数を投げておけばよしなに結果出力させプログラムを書く人を助けます．ちなみに $\mathbb{Q}$ $\mathbb{R}$ なども変数として使うことができます．
- また Julia はカラムメジャーな言語で配列，ベクトルは縦ベクトルになります．


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135978/11929f4f-30fa-8bf8-d921-ded4f2651c8c.png)

- これは非常に都合が良くて行列，線形代数を扱うプログラムをPython/NumPyで実装する場合仕様の関係で横ベクトルのように振舞わせるために行列を転置する操作をすることになります．実際の数式と実装に解離ができてしまうというのは自分の考えていることを素直に表現するという欲求をかなえることができず，それが思考のノイズになってしまうことがあります．
- とはいえ，深層学習のタスクだと NumPy の形式の配列形式の方が特徴ベクトル，多次元配列の解釈・ハンドリングがしやすいことが多いので，目的・用途に応じて適切さは異なってきます．
- 追記：上では ; を多用していますが，実際には行列の行毎に `;` を書く必要はありません．

# Julia を学ぶ方法の一つとして

## 公式ドキュメントを読む

- プログラムの上達は例を触れていくのが効果的です．一方でどこかのタイミングで体系的に学ぶ必要性がでてきます．大体のわからないことは [Julia の Documentation](https://docs.julialang.org/en/v1/) を見ると載っていますので，意思決定の際に参考する情報としてまずは公式ドキュメントを抑えるのが良いでしょう．
- そうですね．`https://docs.julialang.org/en/v1/` をブックマークにしておく方法もありますし．Google検索で julia と打ち込んでリンクを探すというのもありです．

## 検索エンジンの設定を変える．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135978/4099449f-722a-05f4-ddf2-b37d12c27eb9.png)

- そうそう忘れてました言語設定を日本語にしておくとプログラミング言語の方でないカテゴリーが出現してしまいます，そういうノイズを消すために検索エンジンの設定を変えましょう．下図のように

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135978/a93979e9-90d5-4419-ae87-8bfdc4b32b3a.png)

`設定`->`言語(Languages)` に飛びます．そうすると次の図のように画面が遷移します．使用する言語を `English` に変更します．そして保存ボタンをクリック．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135978/49f9a655-f89e-42ec-c436-3179191db287.png)

- すごい．した図のようになり，Juliaというプログラム言語に関するページが並ぶようになりました．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135978/3c31f8ca-6650-dac2-4704-2658f6930a27.png)

- 言語設定がEnglishのままでも日本語の検索もできるので安心ですね．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135978/204f58e7-2bfe-2c2f-0715-3afc39084ae1.png)

- これで他人にもJuliaを勧める環境ができました．

## 雑念を捨てて公式ドキュメントをゆっくり読む

- [Getting Started](https://docs.julialang.org/en/v1/manual/getting-started/)

から順に Modules まで読むとベースとなるシンタックスを追えると思います．Typesからしんどくなってくると思いますが (^^;).

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135978/a051fae6-c919-86b4-7ed0-358b51de6136.png)

## YouTubeをながめる

文字をずーっと見るのは辛いので息抜きに

- [Intro to Julia tutorial (version 1.0)
](https://www.youtube.com/watch?v=8h8rQyEpiZA)
- [Julia Con 2019](https://www.youtube.com/user/JuliaLanguage)

を見るもの良いと思います．YouTubeで動画となると娯楽目的な感じを持ってしまいますが，教育目的として発信している人・組織もいます．こういうのを活用するのもありですね．完全に聞き取れなくても雰囲気はつかめますし．Intro to Julia tutorial は 2時間ほどでできますのでお正月の時にながめるの良いかもです．

## ワタシ，ニホンゴデソウダンシタイデス

- いくつか選択肢があります．

### Slack 

Slack というチャットツールで相談ですね．例えば
[JuliaTokyo #10](https://juliatokyo.connpass.com/event/153435/) がこの前ありましたが，リンク先にSlackの招待リンクがありますのでそこで質問するのも良いでしょう．名古屋 の方でも[JuliaTokai #04](https://juliatokai.connpass.com/event/145293/) グループがあり同様にSlackのワークスペースを持っています．
- もちろん英語版もあります．[Julia Community](https://julialang.org/community/) というところから Chat のセクションに飛んで招待リンクをもらうということで参加できます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135978/f63462d2-cd95-cde6-5c2e-c9c6c89348e9.png)
### Twitter

- Slackよりも Twitter の方が盛んかもしれません(^^;.
- `#Julia言語`　というハッシュタグをつけて呟くと助けてくれるかもしれません．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135978/288f7c1b-58b7-2f50-49db-0d965dad5c28.png)

- ただ，Twitterの文字数制限もあるのでわからないことを簡潔に説明する必要があります. 
 - エラーが起きる現象
 - その現象を再現するための最小限のコード
 - 使ってるOS（MacなのかWindowsなのかLinuxなのかetc...)

の情報があると，あなたの知りたいリプライ情報が来やすいです．


ちなみに Julia の公式ハッシュタグとして `#julialang` もありますので英語で情報を取得・発信する場合はこっちで投稿するのが良いです．念のため[Julia Community](https://julialang.org/community/) を見てください．

## 英語でトライしたい人向け

### Julia Discourse 

- Slack, Twitter の欠点は利用人数が多くなると情報が流れてしまうことです．公式のSlackは一定数の会話が流れると過去の情報消えてしまうんですよね．
- https://discourse.julialang.org/ を使うと昔ながらの掲示板のような雰囲気で質問をしたりアイデアをディスカッションすることができます．

### GitHub の Issue

- パッケージを使うときにエラー・不具合が生じている時はパッケージのコードをホスティングしているリポジトリのIssueに投稿するのが良いでしょう．その時も，エラーの詳細，再現するコード，動作環境を明示すると良いです．必要に応じて Docker のコンテナを作って再現させるのも良いでしょう．

## サンプルコード欲しい？

- ソースを読むのが一番ですが，使い方を知る方法はいろいろあります．
### ヘルプモードを読む

- もちろんヘルプモードでも見つけることができます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135978/ca06f766-ad66-aade-493d-84e670f3c631.png)

### パッケージが提供している関数・メソッドの使い方はテストコードをながめる

- または GitHub のリポジトリにアクセスし `<パッケージ名>/test/runtests.jl` の中身をながめると文章化されていないコードレベルの使い方を閲覧することができます．

# Julia を広めていく一つの方法として

## 解説を書いていく

- インプットだけだとつまらないと思うので発信していくことは重要なことだと思います．
    - Julia のメタプログラミングについて解説
    - Julia を触る人のための機械語/LLVMなどについて
    - Julia でこういうパッケージがあったので使い方を書いて見る
    - Julia で〜〜の実装をした
    - Julia のIDEの使い方

などなんでもありかなと思います．

- 読む側からあると嬉しいのはその記事を書くために参考にした Reference (他の人の記事のURLやJuliaの公式ドキュメントのURLなどなど)ですね．そこに書かれていることがあなたの経験・想像（こうであって欲しい願望）で書いたのか，パッケージのドキュメントや公式ドキュメントといった一次情報に近い情報源に基づいて話をしているのか切り分けられていると尚良いです．

## 便利な機能を Julia のパッケージとして作っていく

- Julia のモジュール・パッケージは結構さくっと作ることができます．パッケージの使い方，作り方は [Pkgの公式ページに](https://docs.julialang.org/en/v1/stdlib/Pkg/index.html) に書いてあります．
- [PkgTemplates.jl](https://github.com/invenia/PkgTemplates.jl) はいくつかの手間を自動化する機能を持っています．
  - [PkgTemplates による Julia パッケージの作り方（前半）](https://qiita.com/SatoshiTerasaki/items/24443f20852ed60968bf)
  - [PkgTemplates による Julia パッケージの作り方（後半）](https://qiita.com/SatoshiTerasaki/items/f43a7730bcf57f4b9572)

の手順を踏むと [Gomah.jl](https://github.com/terasakisatoshi/Gomah.jl) が作れてしまいました．いつか公式パッケージとして昇格できるといいなとは思っています(´・ω・｀)．

## 題材を探す

- 数学を題材にしたプログラムを書く
  - Pythonに慣れている読者であればPythonの本を読んでそれをJuliaに書いてみる
- FortranのコードをJuliaで書く
  - Fortran ユーザーでJuliaに乗り換える人がちらほらいるのでそういう活動をすると幸せになれるかもしれないですね．
  - ちなみにネタが思い浮かばない場合は[Fortran ハンドブック(Amazonのリンク)](https://www.amazon.co.jp/Fortran-%E3%83%8F%E3%83%B3%E3%83%89%E3%83%96%E3%83%83%E3%82%AF-%E7%94%B0%E5%8F%A3-%E4%BF%8A%E5%BC%98/dp/4774175064/ref=sr_1_5?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=Fortran&qid=1575269382&sr=8-5) が一つの選択肢としてあります．

# Tips

## Julia のプログラム開発の回し方

- Julia はJITコンパイルする言語なのでパッケージの読み込みや，関数の実行の初回の実行時のオーバヘッドがどうしてもでてきます．

```console
$ julia yourcode.jl
# 何かの結果が出る．エラーが出たらコードを直す
# yourcode.jl を編集
$ julia yourcode.jl
```

のように Julia のセッションをその都度立ち上げるのではなくとりあえず Julia を起動しておいて

`include("yourcode.jl")` すればいいわけです．

```julia
julia> include("yourcode.jl") # 吾輩は Julia である yourcode.jl というファイルはまだない．
ERROR: could not open file /Users/<youruser>/tmp/yourcode.jl
Stacktrace:
 [1] include at ./boot.jl:328 [inlined]
 [2] include_relative(::Module, ::String) at ./loading.jl:1105
 [3] include(::Module, ::String) at ./Base.jl:31
 [4] include(::String) at ./client.jl:424
 [5] top-level scope at REPL[5]:1

julia> # ; を押してshell モードに入る

shell> nano yourcode.jl
# nano エディタが立ち上がりチョコチョコ編集する
# とりあえずprintln("HelloWorld")を書いてみる
julia> include("yourcode.jl")
HelloWorld # 更新されたコードが反映される
```

REPLによる系統的な実行法は　[Workflow-Tips](https://docs.julialang.org/en/v1/manual/workflow-tips/#man-workflow-tips-1)
 が詳しいです

## Atomベースの Julia の IDE Juno を使う

IDEを使うとこんなことができます．

<img width="1912" alt="Screen Shot 2019-07-12 at 21.47.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135978/8d5d8c9c-dd19-8e90-6420-12e2fe2593a0.png">

- 参考資料:
  - 公式ドキュメント: [The Juno IDE Documentation](http://docs.junolab.org/latest/) 
  - メインテナーの方によるドキュメント: [Juno 楽しいJulia開発](https://docs.google.com/presentation/d/1nazmfMO-7LzjZTSrAhB6pOhPERMPl90ZH1podl0BQyE/edit#slide=id.g7a62709e7f_0_148)
  - 私が書いたもの:[Julia のIDE Juno を使って快適なJuliaとの生活をする手引き(前半）](https://qiita.com/SatoshiTerasaki/items/3dda33ece801b75e248c)
  - 私が書いたもの:[Julia のIDE Juno を使って快適な Julia との生活をする手引き(後半)](https://qiita.com/SatoshiTerasaki/items/ee1ababe39e8ae347ff3)

## もきゅもきゅ会

- 不定期ですが [Julia/数学もきゅもきゅ会](https://gomah.connpass.com/) をしています．リモートでは毎週金曜を予定しています．

# まとめ

- Julia の魅力的なところを書きました．
- 読者の手引きとして学習のスタートする地点を提示しました．
- 必要に応じて質問できるところを紹介しました．
- 活動方法を簡単に紹介しました．
- いくつか参考になるヒントを紹介しました