Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Julia本を書いたら技術顧問になった話 for JuliaTokai #17
Search
GOTOH Shunsuke
December 10, 2023
Technology
700
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Julia本を書いたら技術顧問になった話 for JuliaTokai #17
JuliaTokai #17 LT資料
GOTOH Shunsuke
December 10, 2023
More Decks by GOTOH Shunsuke
See All by GOTOH Shunsuke
JuliaTokaiとしてはこれが最後かもしれない(仮) for NGK2026S
antimon2
0
250
JuliaでApp(仮) for JuliaTokai #23
antimon2
0
170
関数型まつりレポート for JuliaTokai #22
antimon2
0
290
Julia という言語について (FP in Julia « SIDE: F ») for 関数型まつり2025
antimon2
3
1.6k
FP in Julia « SIDE: J » for JuliaTokai #21
antimon2
1
250
JuliaTokaiとJuliaLangJaの紹介 for NGK2025S
antimon2
1
390
あなたの知らない(概ね知らなくても良い)Juliaの世界 for JuliaLangJa 年末 LT 大会 2024
antimon2
0
210
Julia 新 LTS v1.10 解説 for JuliaTokai #20
antimon2
1
450
夏休みの(最後の)宿題 for JuliaTokyo #12
antimon2
1
320
Other Decks in Technology
See All in Technology
AI駆動開発におけるQAエンジニアの役割事例 〜AI駆動開発の現場から〜
kobayashiyorimitsu
0
470
事業価値を⽣み出すSREへ SREが担うべき意思決定の5層
kenta_hi
2
3.2k
Keeping applications secure by evolving OAuth 2.0 and OpenID Connect
ahus1
PRO
1
160
Genie Ontologyは銀の弾丸かを考える / Is Genie Ontology a Silver Bullet?
nttcom
0
130
AWS Blocks を触ってみた/first-tach-aws-blocks
fossamagna
2
160
CIで使うClaude
iwatatomoya
0
230
デジタル・デザイン:次の50年を描く「進化する青写真」
y150saya
0
850
SREとQA 二人三脚で進めるSLO運用/sre-qa-slo
sugitak
0
300
SRE Next 2026 何でも屋からの脱却
bto
0
480
Zoom2Youtube.Claude
kawaguti
PRO
3
490
なぜ人は自分のプロジェクトを 「なんちゃってアジャイル」と 自嘲するのか
kozotaira
0
280
オブザーバビリティ、本当に活用できてる? 〜API連携×生成AIで成熟度を自動評価〜
dmmsre
1
2.7k
Featured
See All Featured
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
380
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
190
Deep Space Network (abreviated)
tonyrice
0
220
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
ラッコキーワード サービス紹介資料
rakko
1
3.9M
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
55k
The Pragmatic Product Professional
lauravandoore
37
7.4k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
67
56k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
340
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.6k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
300
Transcript
Julia本を書いたら 技術顧問になった話 2023/12/10 JuliaTokai #17 antimon2(後藤 俊介)
お品書き • お前誰よ? • 簡単な Julia の紹介 • Julia本 発刊から約9ヶ月
• Juliaでお仕事!
お前誰よ?
自己紹介 • 名前:後藤 俊介 • 所属:有限会社 来栖川電算 • コミュニティ:🌟JuliaTokai, 🌟機械学習名古屋,
⭐Ruby東海, ⭐Python東海, ⭐jl.dev, … • 言語:Julia, Python, Ruby, … • SNS等: (@antimon2) • SNS等(2): (@antimon2.jl) • 著書:実践Julia入門
https://www.kurusugawa.jp
https://twitter.com/antimon2/status/1635765451220459520
簡単な Juliaの紹介
None
Julia とは?(1) • The Julia Language • 最新 v1.9.4(2023/11/14) ◦
LTS:v1.6.7(2022/07/19) ◦ 次期:v1.10.0-RC2(2023/12/03) • 科学技術計算に強い! • 動作が速い!(LLVM JIT コンパイル)
Julia とは?(2) • Rのように中身がぐちゃぐちゃでなく、 • Rubyのように遅くなく、 • Lispのように原始的またはエレファントでなく、 • Prologのように変態的なところはなく、
• Javaのように硬すぎることはなく、 • Haskellのように抽象的すぎない ほどよい言語である 引用元:http://www.slideshare.net/Nikoriks/julia-28059489/8
Julia とは?(3) • C のように高速だけど、 Ruby のようなダイナミズムを併せ持っている • Lisp のような真のマクロを持ちながら、
MATLAB のような直感的な数式表現もできる • Python のように総合的なプログラミングができて、 R のように統計処理も得意で、 Perl のように文字列処理もできて、 MATLAB のように線形代数もできて、 shell のように複数のプログラムを組み合わせることもできる • 超初心者にも習得は容易でありながら、 ハッカーの満足にも応えられる • インタラクティブな動作環境もあって、コンパイルもできる (Why We Created Julia から抜粋・私訳)
要するに • 動的言語なのに速い! • 文法も覚えやすい! • 数値計算に強い!
Julia の主な特徴 • 多重ディスパッチ • 動的型システム • 並行・並列処理、コルーチン • 組込パッケージマネージャ
Julia本 発刊から約9ヶ月
https://www.amazon.co.jp/o/ASIN/4297133504
https://www.amazon.co.jp/product-reviews/4297133504/ref=c m_cr_dp_d_show_all_btm?ie=UTF8&reviewerType=all_reviews
¾年で変わったこと、イベント
研究集会に呼ばれた • 2023/07/10-12 • Juliaチュートリアル講演 2コマ担当 • アーカイブ(動画): ◦ 型と多重ディスパッチ
◦ スレッド並列の基礎 https://joint.imi.kyushu-u.ac.jp/post-9030/
印税 • 2023/06 最初の振込 ◦ 最低保証部数分 ◦ +電子版の売上分 • 2023/12
2回目の振込(まだ) ◦ 電子版の売上分 • ※詳細割愛
Juliaの仕事(10月~) • 会社に案件打診 • 10月から開始 • この後詳しく…
Juliaでお仕事!
Julia の (もしくは一般的なプログラミングの) お仕事 • 受託開発 ◦ 特定の環境で動くシステムのプログラミング、など • 研究開発
◦ 最新技術等を用いて課題を解決する業務、など • (サイエンス) エンジニアリング ◦ 数値計算や各種データ分析手法を用いた分析・提案など • etc… 今回は…
技術顧問
経緯 (0) お客さま側の経緯 (before first contact)… • ある大規模データを扱うプロダクトを Julia で開発中
• 共同開発者 もしくは 技術顧問 的な人員を探していた • 拙著 『実践Julia入門』 を参考書の1つとして読んでいただ いていた • 奥付の著者(私)の所属会社名を ググってコンタクト
経緯 (1) こちら側の経緯 (after first contact)… • 所属会社のお問い合わせフォームにてコンタクトあり • 概要を聞いて
「ぜひ協力したい!」 と返答 : (メール および オンラインミーティングでのやり取り) • 正式に契約!
契約内容 • コンサル(技術顧問) っぽい 契約 ◦ 共同開発という形ではない ◦ 作業内容としては技術面 (およびJulia言語的側面)
でのレビュー およびアドバイス (コンサルティング) • 契約形態としては 請負契約 ◦ (お客さま側の) 都合により コンサル契約(準委任契約) できず ◦ 成果物として指摘内容等をまとめたものを納品すればOK • 期間 ◦ 2023/10~12
レビュー (アドバイス) 基準 的なもの • 見る点 ◦ Julia における 効率の良いコード・悪いコード
◦ 特に マルチスレッド 関連 (あまり経験がない) ◦ その他、一般的なコーディング技術面 (下記を除く) • 見ない点 ◦ コードフォーマット (お客さま独自規約のためスルー) ◦ 命名規則 (お客さま独自規約のためスルー)
指摘・提案例 (1) スレッドの競合 • マルチスレッドで期待 通りに動作しない箇 所の発見 • ⇒「ロック機構 (排他
制御) 使いましょう」 という指摘・修正提案 例→ q = Vector{DataFrame}() count = 0 some_proc(args...) do ts1, t2, t3 t1 = read_table(ts1) push!(q, t1, t2, t3) count += 1 end q = Vector{DataFrame}() count = 0 spinlock = Threads.SpinLock() some_proc(args...) do ts1, t2, t3 t1 = read_table(ts1) @lock spinlock begin push!(q, t1, t2, t3) count += 1 end end
指摘・提案例 (2) スレッドによる非同期動作 • マルチスレッドで非同 期で動作するために テストがこける • ⇒無理矢理にでも同 期を取って順序を保
つテクの提案 例→ q = Vector{DataFrame}() count = 0 spinlock = Threads.SpinLock() some_proc(args...) do ts1, t2, t3 t1 = read_table(ts1) @lock spinlock begin push!(q, t1, t2, t3) count += 1 end end q = Vector{DataFrame}() count = 0 spinlock = Threads.SpinLock() some_proc(args...) do ts1, t2, t3 wait_by_read_air(ts1) # ここで同期を取る t1 = read_table(ts1) @lock spinlock begin push!(q, t1, t2, t3) count += 1 end end
指摘・提案例 (3) ユーザ定義型の等価性 • パフォーマンス面でよ ろしくないコード • ⇒生成関数 を利用し て半自動化かつパ
フォーマンスの良い コードの提案 例→ @generated function _equals(a::T, b::T) where T _cmp(name) = :(getfield(a, $(QuoteNode(name))) == getfield(b, $(QuoteNode(name)))) mapfoldr(_cmp, (x,y) -> :($x && $y), fieldnames(T), init=true) end # 無駄なアロケーション発生しない速い Base.:(==)(a::Hoge, b::Hoge) = _equals(a, b) getfields(obj) = [getfield(obj, name) for name in fieldnames(typeof(obj))] _equals(a,b) = getfields(a) == getfields(b) # ←↑無駄なアロケーション発生するし遅い Base.:(==)(a::Hoge, b::Hoge) = _equals(a, b)
指摘・提案例 (4) マルチスレッド時のメモリ消費問題 • 「スレッド数は増やしたいけれど、闇雲に増やすとその分比 例してメモリ消費するんですよね…」 ◦ ⇒Base.Semaphore() というのがあります! ◦
FoldsThreads.jl の TaskPoolEx を利用すれば、件 数/スレッド (basesize) と スレッド数/処理 (=セマ フォ、ntasks) 両方指定できます • ※コード例なし(提案を受け先方で検討中)
指摘・提案例 (5) その他… • パイプライン演算子(|>)や @chain による「全て計算してから次の計 算に渡す」ような実装になってしまっている箇所の発見・指摘 ◦ ⇒遅延リスト(ジェネレータ)
や any() 関数の適切な使用による パフォーマンス向上案を提案 • ifelse() 関数の問題点の指摘 (第2・第3引数がともに評価(≒実 行)されてしまう) ◦ ⇒普通に 三項演算子 (~ ? ~ : ~) 使いましょう • プロファイリング や @code_warntype とか見た方が良いかも? ◦ 残りの契約時間で可能な限り実施
お客さまの反応 • 上々! ◦ ※詳細割愛
個人の感想 • 超楽しい!! ◦ こういう仕事がしたかった♪
言いたかったこと… • 仕事の形には色々ある。 • 自分の強み・知識が活かせてお客さまにも 喜んでもらえる、そんな仕事ができている 幸せ♪
結論
結論 • 書籍の執筆 ⇒ 夢が一つ叶った♪ • Julia でお仕事 ⇒ もう一つ夢が叶った♪
• Julia 楽しいよ! • Julia でやるお仕事楽しいよ!
参考
参考文献・リンク等 • 実践Julia入門(拙著) • julialang.org(Julia 本家サイト)
ご清聴ありがとうございます。