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
360
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
Vite+ Unified Toolchain for the Web
naokihaba
0
320
過去最大のMCPアップデート! 2026-07-28 RC版の謎に迫る
licux
6
360
Inside Stream API
skrb
1
730
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
250
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
150
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
snhryt
0
170
「エンジニアインターン、どうやって取った?」準備のリアルを語るLT会 Progate BAR
akiomatic
0
130
肥大化するレガシーコードに立ち向かうためのインターフェース分離と依存の逆転 / JJUG CCC 2026 Spring
hirokunimaeta
0
570
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
340
Composerを使ったサプライチェーン攻撃の様子を眺めてみる #phpstudy
o0h
PRO
2
250
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
160
TAKTでAI駆動開発の品質を設計する
j5ik2o
7
1.3k
Featured
See All Featured
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
250
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
The Language of Interfaces
destraynor
162
27k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
160
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
590
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.6k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
210
ラッコキーワード サービス紹介資料
rakko
1
3.7M
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
How to make the Groovebox
asonas
2
2.2k
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 ݺͼग़͠