{%hackmd SK1vjm9IQLOH_XRYTfAfkA %} Juliaの 書籍 を 執筆 した話 === <!-- .element: style="font-size: 320%" --> 2023/03/26 JuliaTokai \#14 antimon2(後藤 俊介) Note: Julia の基本Tips? ---- ## お品書き + お前誰よ? + 簡単なJuliaの紹介 + 書籍を執筆しました! + 経緯 + やったこと・やらなかったこと + 苦労したこと・その他 --- # お前誰よ? ---- ## 自己紹介 + 名前:後藤 俊介 + 所属:**[有限会社 来栖川電算](https://www.kurusugawa.jp)** + コミュニティ:**:star2:[JuliaTokai](https://juliatokai.connpass.com/)**, :star2:[NGK2023S](https://ngk2022s.connpass.com/event/265837/), :star2:[機械学習名古屋](https://machine-learning.connpass.com/), :star:[jl.dev](https://jldev.connpass.com/), [Python東海](https://connpass.com/series/292/), … + 言語:**[Julia](https://julialang.org)**, Python, Scala(勉強中), … + SNS等:[![Twitter: @antimon2](https://hackmd.io/_uploads/ry0zZ3Xoj.png "Twitter: @antimon2")<!-- .element: class="plain" style="vertical-align:middle;background:transparent" -->](https://twitter.com/antimon2) [![Facebook: antimon2](https://hackmd.io/_uploads/S11pZnmsi.png "Facebook: antimon2")<!-- .element: class="plain" style="vertical-align:middle;background:transparent" -->](https://www.facebook.com/antimon2) [![Mastodon: @antimon2](https://hackmd.io/_uploads/B1H-f3Xio.png "Mastodon: @antimon2@mathtod.online")<!-- .element: class="plain" style="vertical-align:middle;background:transparent" -->](https://mathtod.online/@antimon2 "@antimon2@mathtod.online") [![Github: antimon2](https://hackmd.io/_uploads/B1uRz27jo.png)<!-- .element: class="plain" style="vertical-align:middle;background:transparent" -->](https://github.com/antimon2/ "Github: antimon2") [![Qiita: @antimon2](https://hackmd.io/_uploads/BJWXmnmsi.png)<!-- .element: class="plain" style="vertical-align:middle;background:transparent" -->](http://qiita.com/antimon2 "Qiita: @antimon2") [![Zenn: @antimon2](https://hackmd.io/_uploads/HJdDQ2Qis.png)<!-- .element: class="plain" style="vertical-align:middle;background:transparent" -->](https://zenn.dev/antimon2 "Zenn: @antimon2") [![HackMD: @antimon2](https://hackmd.io/_uploads/rknRm2moi.png)<!-- .element: class="plain" style="vertical-align:middle;background:transparent" -->](https://hackmd.io/@antimon2 "HackMD: @antimon2") (@antimon2) + **Julia 本 執筆しました!**:new:<!-- .element: style="vertical-align:middle" --> Note: 今日は(も?)大っぴらに Julia の話ができるっ ---- [![有限会社来栖川電算](https://i.imgur.com/8Kuhfel.png) https://www.kurusugawa.jp](https://www.kurusugawa.jp) Note: 普段は Python で仕事してますっ ---- [![Julia の本を書きました!](https://hackmd.io/_uploads/r1GOAhqe3.png) https://twitter.com/antimon2/status/1632998963505938432](https://twitter.com/antimon2/status/1632998963505938432) Note: Julia の本を書きました!『[実践Julia入門](https://gihyo.jp/book/2023/978-4-297-13350-4)』 --- # <small>簡単な</small><br>Julia の紹介 Note: Julia の紹介っ ---- [![Julia](https://raw.githubusercontent.com/JuliaLang/julia-logo-graphics/master/images/julia-logo-color.svg?sanitize=true)<!-- .element: style="background:white;width:80%" -->](https://julialang.org) Note: こんなロゴですっ ---- ## Julia とは?(1) + [The Julia Language](https://julialang.org) + 最新 v1.8.5(2023/01/08) + LTS:v1.6.7(2022/07/19) + 次期版:v1.9.0-rc1(2023/03/07) + 科学技術計算に強い! + 動作が速い!(LLVM JIT コンパイル) Note: ググるときはなるべく [julialang](https://www.google.co.jp/search?q=julialang) で! ---- ## Julia とは?(2) > + Rのように中身がぐちゃぐちゃでなく、 > + Rubyのように遅くなく、 > + Lispのように原始的またはエレファントでなく、 > + Prologのように変態的なところはなく、 > + Javaのように硬すぎることはなく、 > + Haskellのように抽象的すぎない > > ほどよい言語である <!-- .element: style="font-size:66%" --> 引用元:http://www.slideshare.net/Nikoriks/julia-28059489/8 <!-- .element: style="font-size:71%" --> ---- ## Julia とは?(3) > + C のように高速だけど、 Ruby のようなダイナミズムを併せ持っている > + Lisp のような真のマクロを持ちながら、 MATLAB のような直感的な数式表現もできる > + Python のように総合的なプログラミングができて、 R のように統計処理も得意で、 Perl のように文字列処理もできて、 MATLAB のように線形代数もできて、 shell のように複数のプログラムを組み合わせることもできる > + 超初心者にも習得は容易でありながら、 ハッカーの満足にも応えられる > + インタラクティブな動作環境もあって、コンパイルもできる <!-- .element: style="font-size:50%" --> ([Why We Created Julia](http://julialang.org/blog/2012/02/why-we-created-julia) から抜粋・私訳) <!-- .element: style="font-size:71%" --> Note: 何かを諦めない「貪欲な」言語!っ ---- ## 要するに <!-- .element: style="font-size:300%" --> + 動的言語なのに速い! + 文法も覚えやすい! + 数値計算に強い! <!-- .element: style="font-size:180%" --> Note: 機械学習とかにも持って来いっ! ---- ## 主な機能 <!-- .element: style="font-size:280%" --> + [多重ディスパッチ](https://docs.julialang.org/en/v1/manual/methods/) + [動的型システム](https://docs.julialang.org/en/v1/manual/types/) + [並行・並列処理](https://docs.julialang.org/en/v1/manual/parallel-computing/)、コルーチン + [組込パッケージマネージャ](https://docs.julialang.org/en/v1/stdlib/Pkg/) <!-- .element: style="font-size:160%" --> Note: っ ---- ## 文法・関数 Note: 以降、ほぼ過去スライドからのコピペ。すっ飛ばして先へ進んで戴いてもOKっ ---- ### 基本的な演算 ```julia julia> 1 + 2 - 3 * 4 # 四則演算(除算以外) -9 julia> 7 / 5 # `整数 / 整数` の結果は浮動小数 1.4 julia> 7 ÷ 5 # `整数 ÷ 整数` の結果は整数 1 julia> 2 ^ 10 # 冪乗は `^` 1024 julia> 123 & 234 | 345 # 論理積 / 論理和 376 julia> 123 ⊻ 234 # 排他的論理和(==`xor(123, 234)`) 145 ``` <!-- .element: style="font-size:46%" --> Note: 整数同士の除算は実数になりますっ 整数除算演算子 `÷` が別に存在します(Python の `//` 相当)っ また冪乗も(`**` ではなく)`^` ですっ `⊻` は `\xor`+<kbd>Tab</kbd> または `\veebar`+<kbd>Tab</kbd> で変換できますっ ちなみに先ほどの `÷` も `\div`+<kbd>Tab</kbd>で(基本的に ${\rm \TeX}$ の書式)っ ---- ### 配列 ```julia julia> a = [1, 2, 3, 4, 5] 5-element Vector{Int64}: 1 2 3 4 5 julia> a[1] # Julia は 1-origin 1 julia> println(a[2:3]) # 範囲指定は両端含む [2, 3] ``` <!-- .element: style="font-size:50%" --> Note: 1-origin であることに注意すればあとは普通の配列っ あと `a:b` は範囲(`Range`)の記法。両端を含む(Ruby の `a..b` と同じ)っ ---- ### 配列の内包表記 (1) ```julia julia> a = [n^2 for n=1:5] 5-element Vector{Int64}: 1 4 9 16 25 julia> A = [x+10y for y=1:3, x=1:3] 3×3 Matrix{Int64}: 11 12 13 21 22 23 31 32 33 ``` <!-- .element: style="font-size:50%" --> Note: 内包表記の記法は Python に類似っ かつ、`for` にカンマ区切りで複数のイテレータを渡すことで2次元以上の配列も作成可能っ ---- ### 配列の内包表記 (2) ```julia julia> [(a,b,c) for c=1:15,b=1:15,a=1:15 if a^2+a*b+b^2==c^2] 6-element Vector{Tuple{Int64, Int64, Int64}}: (3, 5, 7) (5, 3, 7) (6, 10, 14) (7, 8, 13) (8, 7, 13) (10, 6, 14) ``` Note: Python と同様に `if` で条件を指定することも可能っ あと Python と同様、`[○ for ○=○]` を `(○ for ○=○)` と書くと配列ではなくて `Generator` が返りますっ ---- ### 多次元配列(v1.7以降) ```julia julia> [1;2;;3;4;;;5;6;;7;8] # 2×2×2 の3次元配列 2×2×2 Array{Int64, 3}: [:, :, 1] = 1 3 2 4 [:, :, 2] = 5 7 6 8 julia> [1 2;3 4;;;5 6;7 8] # 従来記法との併用も可能(次元の順番に注意) 2×2×2 Array{Int64, 3}: [:, :, 1] = 1 2 3 4 [:, :, 2] = 5 6 7 8 julia> [1;;;;] # 1×1×1×1 の4次元配列 1×1×1×1 Array{Int64, 4}: [:, :, 1, 1] = 1 ``` <!-- .element: style="font-size:34%" --> Note: `;` の数で次元方向の区切ができるっ これだけでも v1.7 を使うべきと言える仕様拡張っ! ---- ### ベクトル ```julia julia> x = [1., 2., 3.]; y = [3., 1., 2.]; julia> x + y # `x .+ y` と書いても同じ(elementwise operation) [4., 3., 5.] julia> x .* y # これは `x * y` と書くとNG [3., 2., 6.] julia> using LinearAlgebra julia> x ⋅ y # 内積(dot積、`dot(x, y)` と書いても同じ) 11.0 julia> x × y # 外積(cross積、`cross(x, y)` と書いても同じ) [1., 7., -5.] ``` <!-- .element: style="font-size:50%" --> Note: Julia では実は1次元配列がベクトルの扱いっ `⋅` は `\cdot`+<kbd>Tab</kbd>、`×` は `\times`+<kbd>Tab</kbd>(これらを利用するには `using LinearAlgebra` 必要)っ あとこれらや先ほどの `÷` や `⊻` などのように、ASCIIの範囲を超えたUnicode文字の演算子(そのほとんどが ${\rm \TeX}$ 由来)が Julia にはたくさんあります(他には例えば比較演算子の `≤` `≥` や、集合の要素 `∈` や包含関係 `⊆` などなど) ---- ### 行列 ```julia julia> A = [1 2; 3 4] # この記法は MATLAB/Octave 由来 2×2 Matrix{Int64}: 1 2 3 4 julia> A' # `○'` は転置行列(正確には随伴行列)の記法(これも MATLAB/Octave 由来) 2×2 adjoint(::Matrix{Int64}) with eltype Int64: 1 3 2 4 julia> A'ᵀ # ← ≥ v"1.6", v"1.5" までは `transpose(A)` # 正確には転置行列はこっち 2×2 transpose(::Matrix{Int64}) with eltype Int64: 1 3 2 4 ``` <!-- .element: style="font-size:50%" --> Note: Julia では2次元配列が行列の扱いっ v1.6 から転置を表す表記として `○'ᵀ` と書けるようになりましたっ `'\^T` + <kbd>TAB</kbd> で入力できますっ ---- ### 行列の演算 ```julia julia> A = [1 2; 3 4]; B = [3 0; 0 6]; julia> A + B # A .+ B でも同様 2×2 Matrix{Int64}: 4 2 3 10 julia> A * B # matrix multiply 2×2 Matrix{Int64}: 3 12 9 24 julia> A .* B # elementwise multiply 2×2 Matrix{Int64}: 3 0 0 24 ``` <!-- .element: style="font-size:48%" --> Note: 行列は `*` で通常の行列積になりますっこれ便利っ ---- ### ブロードキャスト ```julia julia> sin(0.1) 0.09983341664682815 julia> sin.([0.1, 0.2, 0.3, 0.4]) 4-element Vector{Float64}: 0.0998334 0.198669 0.29552 0.389418 julia> [0.1, 0.2, 0.3, 0.4] .^ 2 # => [0.01, 0.04, 0.09, 0.16] ``` <!-- .element: style="font-size:50%" --> Note: 関数名と `(` の間に `.` を置くと、普通の関数を配列に拡張してくれる(ブロードキャスト)っ `.^` のように演算子の前に `.` を書いても同様(先ほど出た `.+` `.*` もブロードキャスト)っ ---- ### 関数定義 ```julia julia> f(x) = x^2 + 2x - 1 f (generic function with 1 method) julia> f(1) 2 julia> f.(1:5) # => [2, 7, 14, 23, 34] ``` Note: 数学のように直感的な記述で関数を定義可能っ `2x` は `2*x` の省略形、曖昧さがなければリテラルと他の識別子が続く場合などに勝手に乗算と解釈してくれるっ またユーザ定義関数も `.` をつけて自動的にブロードキャスト対応っ ---- ### 有理数・複素数 ```julia julia> 1//2 == 0.5 true julia> 1//2 - 1//3 1//6 julia> 1im ^ 2 == -1 true julia> (1.0 + 0.5im) * (2.0 - 3.0im) 3.5 - 2.0im ``` Note: 有理数・複素数を標準サポート。 `//` は有理数除算(結果は有理数) `im` は虚数単位。 どちらも四則演算も普通に書けますっ --- # 2020/07/10 Note: 発端は、2020/07/01(約3年前)、TwitterのDMにて ---- ![TwitterのDMで技術評論社の編集者の方からコンタクト](https://hackmd.io/_uploads/HkjVQ-sgn.png) Note: 発端は、2020/07/01(約3年前)、TwitterのDMにて。 「おっ!?」と思ってリクエスト許可して話を聞いてみることに。 ---- ![「書籍執筆してみませんか?」キター!](https://hackmd.io/_uploads/SJUjXZjxn.png) Note: 「書籍執筆してみませんか?」。正直「キター!」と思いましたっ --- ## これが発端 + Qiita や Twitter で Julia の記事書いたり質問に答えていたのが目にとまった(らしい) --- ## 企画概要(当初) + Juliaの入門的解説書。日本語でまとまった情報があまり提供されていないJuliaの仕様や特徴を理解してもらう。 + 前半ではリファレンス的に基本的な文法の解説をして、Juliaの仕様やコンセプトを理解してもらう。 + 後半では数値計算や機械学習などをJuliaの長所を活かせる活用例を題材に、効率的・実践的なコードの書き方を解説する。 + 「実は標準関数を使えば一発で解決できる問題に、面倒臭い書き方で対応している」ということがよくあるので、書籍全体を通じてそうした **誤解を解く知識** を随所に織り交ぜていく。 <!-- .element: style="font-size:85%" --> Note: 企画概要 Juliaの入門的解説書。日本語でまとまった情報があまり提供されていないJuliaの仕様や特徴を理解してもらう。 前半ではリファレンス的に基本的な文法の解説をして、Juliaの仕様やコンセプトを理解してもらう(読者はPythonなどを利用している前提で、"ほかの言語とはこういうところが違う"と理解してもらう)。後半では数値計算や機械学習などをJuliaの長所を活かせる活用例を題材に、効率的・実践的なコードの書き方を解説する。 「実は標準関数を使えば一発で解決できる問題に、面倒臭い書き方で対応している」ということがよくあるので、書籍全体を通じてそうした **誤解を解く知識** を随所に織り交ぜていく。 --- ## 結果 + Juliaの入門的解説書。日本語でまとまった情報があまり提供されていないJuliaの仕様や特徴を理解してもらう。 + 3部構成: + 入門編:Juliaの仕様やコンセプトを理解してもらい、基本的な文法の解説をして「Julia を使える」ようになってもらう + 基本編:Julia の標準ライブラリ関数や固有の機能を詳解(>紹介)し、Julia を **Juliaらしく使いこなす** ことを目指す + 実践編:実際の応用として執筆時点でホットな話題に着目し、より具体的で実用的な実践への発展を目標とする <!-- .element: style="font-size:85%" --> Note: これでどうですか? と逆提案して「これで行きましょう!」となった内容。 --- ## Point + 「誤解を解く知識」というのは「小手先ノウハウ」 + Julia のことを理解して Julia らしく書けば、効率的なコードにもなるし、高速性も動的性も活かせたものになる! <!-- .element: style="font-size:160%" --> Note: … --- # これで行きましょう! Note: … --- # 経緯 Note: 改めて ---- ## 経緯 (1) + 2020/07 TwitterのDMでコンタクト(済) + 2020/09 企画正式スタート +  : 執筆(本格開始は 2020/11~) + 2021/06 監修としてごまふあざらしさん参戦!(※1) ---- ## 経緯 (2) + 2021/12 刊行目標を「来年度内に」!(※2) + 2022/03~05 集中執筆期間、一区切り! + 2022/06 大幅修正発生! + 2022/09 修正完了! ---- ## 経緯 (3) + 2022/10~12 ゲラ初校! + 2023/01 刊行予定日決定、amazonにページができる + 2022/01~03 再校・第3~7校 確認修正作業 + 2022/03/15 刊行! --- [![拙著『実践Julia入門』本日発売です!](https://hackmd.io/_uploads/SJe_XSTgh.png =478x506) https://twitter.com/antimon2/status/1635765451220459520](https://twitter.com/antimon2/status/1635765451220459520) Note: 紆余曲折あって無事出版されました! --- # やったこと・やらなかったこと Note: … --- ## 1. 原稿は Markdown + HackMD 利用(オンラインで原稿執筆・そのまま入稿) + 図は埋込のものをDLできるよう調整 Note: … --- ## 2. 他書との差別化 + 「これを読めばJuliaで何ができるか根本から理解できる」 + 入門書ではあるが「内容しっかり、妥協しない」 Note: … ---- ### 参考:所謂『青本』 + 第一印象:「公式ドキュメントの重要な部分を抜き出して日本語で説明した本」 →この本読んでから公式マニュアル読むとより理解できる + マニュアル然とはしているけれどそれで何ができるかが分かるというわけではない →その意味で「入門書」ではない + そもそも公式ドキュメントって分かりにくいですよね?? <!-- .element: style="font-size:48%" --> Note: 2年前時点では「Juliaの和書と言えばほぼこれ一択」だった本 ---- ### 参考:所謂『黄本』 + データサイエンティスト?である著者が自分の理解で「自分の理解できる範囲」を著した1冊 + Python呼んだりR呼んだりして、それも利用してデータサイエンスにJuliaをどう使うかの基本としてはまぁ分かる + Juliaの総合的なプログラミング側面には触れられていないし、「超上級者も満足」できる内容ではない(そのあたり欲張っていない) + プログラミング超初心者向けの「なんとなくJuliaが使えるようになる入門書」 <!-- .element: style="font-size:48%" --> Note: 執筆開始後(割と初期)に出版された本 --- ## 3. 「他言語との比較」はしない! + 「○○という言語では△△というのを、Juliaでは~」という書き方にすると○○言語の仕様に引っ張られる + →Juliaらしさが説明できなくなる Note: 原則として。Julia での仕様の説明がメインになるなら他言語との比較に触れるのはOKとした。 --- ## 4. 「高速化」の章は書かない! + Julia は高速! まずはそれを前面に押し出す! + 例:`@time` や `BenchmarkTools` による「速さ」の提示! + 最初から「Juliaらしい書き方」を勧めればそんなに遅くはならない! + 例:型の理解、Julia独特の記法・API Note: 高速化ノウハウのいくつかは「他言語に引っ張られた書き方をJuliaらしい書き方にすると速くなる」というもの。そうじゃないものもあるけれどね。 それも含めてコード例や章節構成で「Julia はこう書くんだよ」を前面に押し出す! それでも必要な高速化のノウハウは「応用」の範疇(本書はあくまで「入門書」)! --- # 苦労したこと・その他 Note: … --- ## 1. Julia のバージョン問題 + 執筆中にマイナーバージョンが3つ上がった(v1.5.x→v1.8.x) + 当初からターゲットは(LTSとなる)v1.6.x + 刊行までに v1.7.0 が出ることは十分に考えられた + 執筆遅くリリースサイクル思ったより速く、v1.8.0も出てしまった… ⇓<!-- .element: class="fragment" data-fragment-index="1" --> Note: 執筆初期はまだ v1.5.x だったが、当初から v1.6.0-β で動作確認してました。 v1.7.0 で便利な記法やAPI(例:多次元配列リテラル表記、アトミック操作(マルチスレッド))が出たので、それは盛り込んだ ---- ### ⇓ + ベースは原則 v1.6.x(LTS) + v1.7.x 以降でしか動かないコードはその旨明記 + マルチスレッドのみ v1.8.0 での動作を前提にした記述 Note: という感じにしました --- ## 2. 二度の情緒不安定期 + (※1)客観的な目が欲しい… + 「独りよがり」な内容になっていないか不安に陥る + (※2)目標を見失いそうになる… + 自分の書いているものが世に求められているものか不安に陥る ⇓<!-- .element: class="fragment" data-fragment-index="1" --> Note: (※1):編集者さんがプログラミングの専門家ではないため、適切な「第三者の目」で執筆内容やサンプルコードを見てくれない (※2):新しいJulia本どんどん出る、バージョンどんどん上がる、そんな中で ---- ### ⇓ + (※1)監修者をつけてもらうことに! + ごまふあざらしさん感謝! + (※2)編集者さんに刊行目標と本書のスタンスを明示してもらう! + 先のビジョンが見えて少し気が楽に! Note: … --- ## 3. ボリューム + 当初の想定(目標)は320ページ(!) + まずは「書くべきことを書く」を優先 + →書いてるうちにみるみる膨れる! ⇓<!-- .element: class="fragment" data-fragment-index="1" --> Note: 「これも外せない」「これ説明してない追加しなきゃ」とか… あと編集者さんも「中途半端で言葉足らずになるよりは丁寧に説明して分かりやすく」「まずはボリューム考えずに気にせずに書いてみてください」って言うもんだからぁ… ---- ### ⇓ + 一通り執筆した後に編集者から「削ってください!」要請 + いくつかトピックを「割愛」 + その他色々約10%削って最終的に656ページ! Note: … ---- #### ※『割愛』したトピックについて… + この勉強会や Zenn の記事としていくつか紹介していく予定! <!-- .element: style="font-size: 180%" class="fragment" data-fragment-index="1" --> Note: … --- ## 4. その他(トピック) + 2年半もの間全く公に口外できなかった + 勉強会等でも言えず秘密にしてた + 体調が万全ではなかった(≠コロナ) + 頭痛・花粉症・寒暖差等 Note: … --- # まとめ ---- + Julia 楽しい! + 執筆大変だったけど良い経験! + 「割愛したトピック」の紹介お楽しみに! Note: っ --- # リンク ---- ## 『実践Julia入門』情報 + [出版社の書籍情報ページ](https://gihyo.jp/book/2023/978-4-297-13350-4) + [『著者の一言』](https://gihyo.jp/book/2023/978-4-297-13350-4/content/message) + 通販サイト + [Gihyo Direct](https://direct.gihyo.jp/view/item/000000002988)([電子書籍版](https://gihyo.jp/dp/ebook/2023/978-4-297-13351-1)) + [amazon](https://www.amazon.co.jp/dp/4297133504/) + [honto](https://honto.jp/netstore/pd-book_32255788.html) --- ご清聴ありがとうございます。 Note: ご清聴ありがとうございますっ!
{"metaMigratedAt":"2023-06-18T00:17:32.291Z","metaMigratedFrom":"YAML","title":"Juliaの 書籍 を 執筆 した話","breaks":true,"slideOptions":"{\"transition\":\"slide\",\"theme\":\"league\"}","description":"2023/03/26 JuliaTokai #14antimon2(後藤 俊介)","contributors":"[{\"id\":\"80062a4b-8dad-49ac-95bf-848ce0686e9e\",\"add\":7199,\"del\":19652}]"}
    912 views