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
なぜ私たちのSREプラクティスはなかなか機能しないのか 〜システムより先に組織を見る〜 / Why our SRE practices aren't really working
vtryo
3
3.4k
金融の未来を考える / Thinking About the Future of Finance
ks91
PRO
0
180
AIレビューはどこまで任せられるのか?自動化と人が背負うレビューの境界
sansantech
PRO
2
370
「ちゃんとやっている」は独りよがりだった ― 不安に寄り添うインシデント対応へ / Towards incident response that addresses anxieties
chmikata
1
4.6k
プロダクトだけじゃない、社内プロセスにおける自動化・省力化ノススメ
kakehashi
PRO
1
3.5k
End-to-Endで考える信頼性 —LINEアプリにおけるクライアント開発×SRE連携の実践
maruloop
4
3.9k
オブザーバビリティ、本当に活用できてる? 〜API連携×生成AIで成熟度を自動評価〜
dmmsre
1
2.7k
Keeping applications secure by evolving OAuth 2.0 and OpenID Connect
ahus1
PRO
1
160
生成AIの活用/high_school2026
okana2ki
0
120
最近評価が難しくなった
maroon8021
0
300
Control Planeで育てるBtoB SaaSの認証基盤 - SRE NEXT 2026
pokohide
1
2.1k
DatabricksにおけるMCPソリューション
taka_aki
1
200
Featured
See All Featured
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Embracing the Ebb and Flow
colly
88
5.1k
Building Adaptive Systems
keathley
44
3.1k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
500
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.7k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
180
Speed Design
sergeychernyshev
33
1.9k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Site-Speed That Sticks
csswizardry
13
1.2k
Ruling the World: When Life Gets Gamed
codingconduct
0
280
Evolving SEO for Evolving Search Engines
ryanjones
0
240
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
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 本家サイト)
ご清聴ありがとうございます。