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
2度もゼロから書き直して、やっとブラウザでぬるぬる動くAIに辿り着いた話
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Tomohiro Inoue
June 05, 2025
Programming
370
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
2度もゼロから書き直して、やっとブラウザでぬるぬる動くAIに辿り着いた話
Tomohiro Inoue
June 05, 2025
Other Decks in Programming
See All in Programming
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
1
480
act1-costs.pdf
sumedhbala
0
210
「なぜそう決めたのか」を残し続ける仕組み ― Notion AI カスタムエージェント × Slack連携による設計判断の自動記録 - NIKKEI Tech Talk #47
niftycorp
PRO
0
260
『コードを書く以外の』エンジニアリング〜課金基盤移行プロジェクト推進のためのTips4選
yuriko1211
0
210
20260623_Loop Engineeringで自分の分身の問い合わせBotを作る
ryugen04
0
200
エンジニアにデザインハーネスを 〜デザインプロセスを規定するためのハーネス〜 / Design harness from an engineer's perspective
rkaga
2
1.3k
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
150
The Bowling Game- From Imperative to Functional Programming - Part 1
philipschwarz
PRO
0
300
Honoでのサプライチェーン侵害対策 〜 3つのライブラリに学ぶ
yusukebe
7
1.8k
ECSアプリログをFireLensでコスト削減しようとしたけど諦めた話 in Fargate×Node.js
akihisaikeda
2
4.2k
Claude Opus 4.6以後の受託開発エンジニアの変化(Claude Code開発ノウハウ大公開スペシャルbyクラスメソッド)
iidatakuma
1
430
LaravelLive Japan の裏方のすべて — 第188回 PHP勉強会@東京 (2026-06-24)
suguruooki
2
150
Featured
See All Featured
sira's awesome portfolio website redesign presentation
elsirapls
0
300
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
220
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
410
Joys of Absence: A Defence of Solitary Play
codingconduct
1
410
Designing for Timeless Needs
cassininazir
1
300
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
370
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
490
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
300
Reality Check: Gamification 10 Years Later
codingconduct
0
2.2k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.2k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Transcript
2θϩ͔Βॻ͖ͯ͠ɺ ͬͱϒϥβͰ͵Δ͵Δಈ͘AIʹḷΓண͍ͨ Χϛφγ StatHackΧϯύχʔ Ҫ্ஐ༟ TechBowl x Χϛφγ ߹ಉษڧձ @20250530
ΧϛφγͰࣗࣾͰAI։ൃΛߦ͍ͬͯ·͢ɻ ࠓAIʹΑΔϦΞϧλΠϜը૾ॲཧΛ ϒϥβͰಈ͔͢ํ๏ʹ͍ͭͯ ࣦഊஊΛަ͓͑ͭͭ͠·͢ɻ
ԿΛ࡞͔ͬͨʁ ৯ϥϕϧͷϦΞϧλΠϜݕࠪΞϓϦ
ۤ࿑ 2θϩ͔ΒίʔυΛॻ͖͢Ίʹ 1ճҙਤత͕ͩͬͨɺ2ճఆ͍ͯ͠ͳ͔ͬͨ 12݄ AI Ҏ֎ͷ Frontend & Backend AI
ʢPythonʣ AI ʢTypeScriptʣ AI ʢC++ʣ 1݄
AI࣮1ճ in Python Python ͰϓϩτλΠϓ࡞ ਫ਼ݕূͷతͰ։ൃɻϥΠϒϥϦ͕ॆ࣮͍ͯ͠ΔͷͰߴʹݕূՄೳɻ ։ൃظؒɿ2िؒ
ͳͥɺPython ίʔυΛࣺ͔ͯͨʁ Server ଆͰͳ͘ɺClient ଆͰॲཧ͔ͨͬͨ͠ ϦΞϧλΠϜͰॲཧ͔ͨͬͨ͠ʢUX໘Ͱਫ਼໘Ͱʣ ௨৴ʹ͕͔͔࣌ؒΔʂ ɹॲཧ͕ߴͳͷͰ ܁Γฦ͠ݕࠪͰ͖Δ Server
ʹ AI ͕͋Δ߹ Client ʹ AI ͕͋Δ߹
AI࣮2ճ in TypeScript TypeScript ͰΞϓϦʹ࣮ OpenCV.js ͱ͍͏ը૾ॲཧϥΠϒϥϦΛ༻ <script src="opencv.js" type="text/javascript"></script>
// cv.Mat ͱ͍͏ܗࣜͰը૾Λѻ͏ function processImage(image: cv.Mat): cv.Mat { // RGB -> നࠇը૾ʹม let grayImage = new cv.Mat(); cv.cvtColor(image, grayImage, cv.COLOR_RGBA2GRAY); // 2ഒʹ֦େ let largeImage = new cv.Mat(); const largeImageSize = new cv.Size(grayImage.cols * 2, grayImage.rows * 2); cv.resize(grayImage, largeImage, largeImageSize, 0, 0, cv.INTER_LINEAR); return largeImage; }
OpenCV.js Ͳ͏ͩͬͨʁ ΊͪΌͪ͘ΌϝϞϦϦʔΫͨ͠ OpenCV.js ϝϞϦΛखಈͰղ์͠ͳ͍ͱ͍͚ͳ͍... // cv.Mat ͱ͍͏ܗࣜͰը૾Λѻ͏ function processImage(image:
cv.Mat): cv.Mat { // RGB -> നࠇը૾ʹม let grayImage = new cv.Mat(); cv.cvtColor(image, grayImage, cv.COLOR_RGBA2GRAY); // 2ഒʹ֦େ let largeImage = new cv.Mat(); const largeImageSize = new cv.Size(grayImage.cols * 2, grayImage.rows * 2); cv.resize(grayImage, largeImage, largeImageSize, 0, 0, cv.INTER_LINEAR); grayImage.delete(); return largeImage; } Delete ΛΕΔͱϝϞϦʹΓଓ͚Δ
OpenCV.jsɺͳΜͰͦΜͳ༷ͳͷ...ʁʢ1/3ʣ OpenCV.js ͕ WebAssembly (Wasm) Λ͍ͬͯΔ͔Β Wasm: C++RustͷίʔυΛίϯύΠϧͨ͠όΠτίʔυɻ ϒϥβ্ͰωΠςΟϒʹ͍ۙߴͳॲཧ͕࣮ݱՄೳɻ
OpenCV.jsɺͳΜͰͦΜͳ༷ͳͷ...ʁʢ2/3ʣ OpenCV.js ͕ WebAssembly (Wasm) Λ͍ͬͯΔ͔Β Wasm Ͱ֬อ͞ΕͨϝϞϦ TS ͷ
GC ͷର֎ let image = new cv.Mat(); cv::Mat* image = new cv::Mat(); TypeScript ଆͷॲཧ Wasm ଆͷॲཧ TypeScript ͷϝϞϦ Wasm ͷϝϞϦ image ͷϙΠϯλ image σʔλ delete ΛݺͼΕͨ߹
OpenCV.jsɺͳΜͰͦΜͳ༷ͳͷ...ʁʢ3/3ʣ OpenCV.js ͕ WebAssembly (Wasm) Λ͍ͬͯΔ͔Β Wasm Ͱ֬อ͞ΕͨϝϞϦ TS ͷ
GC ͷର֎ let image = new cv.Mat(); image.delete(); cv::Mat* image = new cv::Mat(); delete image; TypeScript ଆͷॲཧ Wasm ଆͷॲཧ TypeScript ͷϝϞϦ Wasm ͷϝϞϦ image ͷϙΠϯλ image σʔλ delete ΛݺΜͩ߹
AI࣮3ճɺͲ͏͢Δ͔ʁ Wasm ʹશ෦ͷॲཧΛด͡ࠐΊͪΌ͓͏ C++ ͰAIݕࠪϞδϡʔϧؙ͝ͱ Wasm ʹ͢Δ͜ͱʹ • Wasm ʹΑΔߴͳॲཧΛҡ࣋
• खಈ delete ΛۃྗݮΒ͢
AI࣮3ճ in C++ ͷ݁ Wasm ࡞ͬͯΈͯͲ͏ͩͬͨʁ • ϝϞϦϦʔΫ͕ى͜Γʹ͘͘ͳͬͨ
• େنσʔλͰϝτϦΫεऔΕΔΑ͏ʹͳͬͨͷͰAIਫ਼վળޮԽͨ͠ const labelChecker = new LabelChecker(); const result = labelChecker.check(image); result.delete(); labelChecker.delete();
͍͞͝ʹ ·ͱΊ • Wasm Λ͏࣌ delete ͕ඞཁ͔Ͳ͏͔͔֬ΊΑ͏ • ϒϥβͰಈ͘ AI
Λࣗࣾ։ൃ͢ΔͳΒ Wasm ʹ͢Δͷ݁ߏΞϦͳબࢶ ແࣄͯ͠νʔϜͰϩϒελʔΛ৯ͨ࣌ͷҰຕ
Appendix: ·ͩΕ͍ͯͳ͍͜ͱ ϚϧνεϨουʹΑΔߴԽ wasm ଆͰϚϧνεϨουͷରԠ͕ൺֱత؆୯͕ͩͬͨɺ ΞϓϦଆΛ Cross-origin isolated ͱ͍͏ঢ়ଶʹ͢Δඞཁ͕͋Γɺݱঢ়Ͱ͖͍ͯͳ͍ JSɿϝΠϯεϨου
wasm SharedArrayBuffer JSɿWeb Worker wasm JSɿWeb Worker wasm worker ݺͼग़͠