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
子供向けプログラミング学習サービスQUREOの開発裏話
Search
yasuiro
July 06, 2018
Technology
680
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
子供向けプログラミング学習サービスQUREOの開発裏話
2018/7/6に行われた、Frontrend vol12 で発表したスライドになります。
yasuiro
July 06, 2018
More Decks by yasuiro
See All by yasuiro
子ども向けプログラミング学習サービスQUREOの技術的アプローチ
yasuiro
0
120
Other Decks in Technology
See All in Technology
AI × アーキテクト 第1・2章|生成AIの課題とアーキテクトの素養
daidaidai
0
180
Tofu-Controller lightning talk @ Containerday 2026
gionn
0
120
スプシの手作業からの解脱 ~更新はClaude Codeに、見せ方と使い方はGASアプリに任せる~
kentarofujii
0
160
20261017福岡devIO 「AIは"良いダッシュボード"を作れるか?
jtakeda
0
190
アウトプット初心者、半年間のふりかえり
4o1sobblue
0
450
WasmをRustにする
sansantech
PRO
0
290
Refining Active Record
shugo
0
170
FinOps Agentが生んだ技術負債:コスト自動調査の落とし穴と解消までの道のり
oasis1994liveforever
2
150
⾮構造化データを価値に変える AI エージェント基盤とその組織
ivry_presentationmaterials
0
200
『SAR衛星データ解析入門』のご紹介とその応用
syuchimu
0
120
オントロジーって 結局なにもの? AI エージェントに「意味」を渡す知識設計の話
greenmidori
0
240
USB PDを使ってスマホを労わりたい
raspython3
0
180
Featured
See All Featured
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
940
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.5k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
710
Ten Tips & Tricks for a 🌱 transition
stuffmc
1
270
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
20k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
4
1.2k
Building Adaptive Systems
keathley
44
3.3k
WCS-LA-2024
lcolladotor
0
890
AI Search: Where Are We & What Can We Do About It?
aleyda
0
8.1k
Mobile First: as difficult as doing things right
swwweet
225
10k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
3.4k
Technical Leadership for Architectural Decision Making
baasie
3
600
Transcript
子供向けプログラミング学習サービス の開発裏話 アルゴ
自己紹介 鈴木 康弘(すずき やすひろ)@yasuiro ・Web制作会社を経て2014年Cyberagentグループに入社 ・2016年よりApplibotにてQUREOの立ち上げに携わる ・元Flashエンジニア。現在はFrontend界隈を中心に活動しています。 ・最近の興味はfacebook の instant
gameとか
話すこと ・QUREOってどんなサービス? ・開発体制とシステム構成 ・ブロックプログラミングの実行について ・画像同士の衝突判定について 具体的なコードの説明等は、ほとんどありません 新規開発におけるトライ&エラーを中心にお話させていただきます
QUREOってどんなサービス?
https://youtu.be/zOk9o1fB0e4
・子供向けオンラインプログラミング学習サービス ・ゲームを作りながら、プログラミングの基礎を学んでもらう ・ビジュアルプログラミングによる学習方法を採用 ・現時点で300レッスン程あり、最終500レッスン位になる予定 https://qureo.jp 「簡単で」「おもしろく」「学べる」
None
None
開発体制とシステム構成
フロント2名〜5名 サーバーサイド1名〜2名 デザイナー1名 プロデューサー1名 ディレクター1名 カリキュラマー3名〜4名 開発体制 1年 開発期間
システム構成図
使用ライブラリー React,Redux,webpack,express,pixi.js,tone.jsなどなど
ブロックプログラミングの実行
ビジュアルプログラミング用のブロック表示部分は Google Blocklyというライブラリーを使用していました。 https://developers.google.com/blockly/
・文字列として様々な言語を書き出す仕組みが備わっている ・プログラムを実行する機能は備わっていない ・独自のブロックを定義することも可能 ・表示はSVGで行われている ・ブロックの形をカスタムする機能は備わっていない Blocklyとは Googleが開発している ビジュアルプログラミング用のライブラリ
ブラウザ上で実行できる言語って?
Javascript ブラウザ上で実行できる言語って?
なんとかしてJavascriptを実行できる形にしないといけない。
Try1
生成したJSをscriptタグで差し込む方法 Try1
生成したJSをscriptタグで差し込む方法 差し込んだjsをリセットするのがしんどい Try1
Try1 生成したJSをscriptタグで差し込む方法 差し込んだjsをリセットするのがしんどい
Try2
js-interpreterと呼ばれるライブラリーを使用して実行する https://github.com/NeilFraser/JS-Interpreter Try2
js-interpreterと呼ばれるライブラリーを使用して実行する 実行自体は良い感じ カスタム定義のメソッドの実行ハンドリングがしにくい 数が少なければまだなんとかなりそうですが、 今回の要件では数も多くなりそうなので厳しそう https://github.com/NeilFraser/JS-Interpreter Try2
Try2 js-interpreterと呼ばれるライブラリーを使用して実行する 実行自体は良い感じ カスタム定義のメソッドの実行ハンドリングがしにくい 数が少なければまだなんとかなりそうですが、 今回の要件では数も多くなりそうなので厳しそう https://github.com/NeilFraser/JS-Interpreter
Try3
独自言語を開発する Try3
独自言語を開発する スケジュール的に無理 Try3
Try3 独自言語を開発する スケジュール的に無理
Try4
scratch-blocksとscratch-vmを使用した実行環境 https://github.com/LLK/scratch-blocks https://github.com/LLK/scratch-vm Try4
scratch-blocksとscratch-vmを使用した実行環境 これが一番安定 ・scratchのオープンソースなコードということもあり、 実装したかった基本的なメソッドは、ほぼ定義されている ・ブロックの見た目もわかりやすい https://github.com/LLK/scratch-blocks https://github.com/LLK/scratch-vm Try4
scratch-blocks ・MITがBlocklyをベースに開発している ビジュアルプログラミングライブラリー ・scratch-vmを使用することを前提としている。 scratch-vm ・scratch-blocksと連動してscratch-blocksのブロックコードを 実行するVirtualMachine ・jsで作られているためブラウザ上で実行できる scratch-audio、scratch-rendererなどもありますが、 そこは別のライブラリーに置き換えて使用しています。
Try4
Blockly ↓ Javascript文字列に変換 ↓ 何かしらの方法で 実行できる形にする ↓ 実行 文字列に変換しているフローがないため evalなどを使用する必要がなく
セキュリティ面でも安心 scratch-blocks ↓ AST(内部的には 配列として扱っている) ↓ scratch-vm ↓ 実行 Try4 今までの流れ
導入するにあたって問題点 ・まだ正式リリースしているバージョンがない ・当時、変数・リスト・関数の実装が まだされていなかったので、 自前で実装する必要があった ・自分たちの要件に合わせてチューニングする必要があった Try4
最終的にたどり着いた構成 現時点ではこれらを採用しています block部分 scratch-blocks(Blockly) vm部分 scratch-vm renderer部分 pixi.js audio部分 tone.js
Try4
scratch-blocks pixi scratch-vm
None
画像同士の衝突判定
要件1 透過部分は衝突させたくない 要件2 今後専用のお絵かきエディタを実装する予定があり、 ユーザーが自由に素材を作成できる機能が入る 要件3 画像は縦横比を保ったまま拡大縮小される
↑事前に判定用のパスデータ等を作成しておくことができない 要件1 透過部分は衝突させたくない 要件2 今後専用のお絵かきエディタを実装する予定があり、 ユーザーが自由に素材を作成できる機能が入る 要件3 画像は縦横比を保ったまま拡大縮小される ←やっかい
矩形同士の判定であればすごくシンプル
透過部分が重なっている場合でも 判定されてしまう
案1 事前に判定領域をパス情報として用意する
判定領域用のパスを保持するようにしようと思いましたが “ユーザーが自由に素材を作成できる機能が入る” という要件があったため厳しそう
判定領域用のパスを保持するようにしようと思いましたが “ユーザーが自由に素材を作成できる機能が入る” という要件があったため厳しそう
判定領域用のパスを保持するようにしようと思ったが “ユーザーが自由に素材を作成できる機能が入る” という要件があったため厳しそう
案2 ピクセルレベルでの判定
ブロードフェーズとナローフェーズに分離
ブロードフェーズは矩形領域での判定
ブロードフェーズは矩形領域での判定 当たった
ナローフェーズで重なった領域のみ ピクセル単位で判定
処理が重い ナローフェーズで重なった領域のみ ピクセル単位で判定
処理が重い ナローフェーズで重なった領域のみ ピクセル単位で判定
案3 前処理&判定エリアの簡略化
リアルタイムピクセル判定は厳しい 一度だけ前処理をすることで リアルタイム判定を軽くできないか?
ブロードフェーズの判定はそのままに 一度だけピクセルデータを解析する方法に変更 ピクセルデータはWebGLのreadPixelsで参照可能です
画像をロードしたタイミングで正方領域に分割し 領域内の透過ピクセル数の比率で、 領域を衝突判定領域とするかを決定する この時、分割最大数を決めることで 画像のサイズに応じて分割数が多くならないようにしています。
判定領域としない 判定領域とする 画像をロードしたタイミングで正方領域に分割し 領域内の透過ピクセル数の比率で、 領域を衝突判定領域とするかを決定する この時、分割最大数を決めることで 画像のサイズに応じて分割数が多くならないようにしています。
判定領域を算出
計算しやすいように判定領域を矩形ではなく円にする
隙間を埋める
円同士の衝突判定をする 距離関数(三角関数)で判定できるため、 計算量が少なくなります
判定領域を円にすることで 拡大縮小や回転への計算も対応しやすくなる 行列を使用することで容易に対応できる
こういった場合は衝突とみなさなくなった
この場合は衝突とみなすようになった 良い感じの判定
この場合は衝突とみなすようになった 良い感じの判定
・パフォーマンスと判定のバランスが良い ・精度的には落ちる部分はあるが 問題ないレベル
・パフォーマンスと判定のバランスが良い ・精度的には落ちる部分はあるが 問題ないレベル
最後に
サービスならではの特殊な部分が多かったと思いますが 何か少しでも参考になる点があれば幸いです QUREOの立ち上げは手探りな部分が多く、本当に大変でした。 スケジュールとの戦いで、 何をどこまで力を入れていくかなどの、 取捨選択を迫られる部分も多くありました。
QUREOではこれからのプログラミング教育を共に考え、 未来のスーパーエンジニアを輩出できるようなサービスを 作り上げていく仲間を募集しています! https://www.applibot.co.jp/recruit/
ご静聴ありがとうございました