Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
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
440
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
FactoryBotをやめればRSpecは速くなるのか?
yuta_onishi_97
0
700
[Dev Group Paris Octobre 26] Agentforce, SIforce, Claudeforce, Slackbot… on s'y retrouve ?
nabondance
0
110
C#の現在地 進化の歴史と、AI時代の.NET Everywhere
neuecc
5
5.2k
なぜCTOを降りてFDEを選んだのか?〜なぜプロダクト企業がFDEで顧客の現場に踏み込むのか〜
gonta
1
220
コーディング自動化の次へ。人の介入をゼロにするファクトリーとサポートAIによる実践
timakin
5
3.9k
気持ちぃ〜角丸 Squircle
ryu1013
0
320
エージェントを使い続けるためのメタワーク / Meta-work for keeping using the agent
rkaga
1
180
AWS CDKのカスタムリソースでContinuum(旧Security Agent)を実装した話 | Implementing Continuum (formerly Security Agent) via AWS CDK Custom Resource
akihisaikeda
2
150
Findy - エンジニア向け会社紹介/Findy Company Deck
findyinc
6
400k
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
230
ソニーのクラウド共通基盤の変遷とAI時代の開発スタイルに合わせた進化 / The Journey of Sony’s Common Cloud Platform and Its Evolution for AI-Native Development
kenjiyoneyama
0
280
AIで開発が速くなった先で、開発チームは何を目指すか
shihochan
1
1.6k
Featured
See All Featured
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
203
77k
How GitHub (no longer) Works
holman
316
150k
Designing for humans not robots
tammielis
254
26k
Prompt Engineering for Job Search
mfonobong
0
520
Six Lessons from altMBA
skipperchong
29
4.5k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.6k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
1
280
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
330
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 ݺͼग़͠