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
子供向けプログラミング学習サービスQUREOの開発裏話
Search
yasuiro
July 06, 2018
Technology
0
620
子供向けプログラミング学習サービスQUREOの開発裏話
2018/7/6に行われた、Frontrend vol12 で発表したスライドになります。
yasuiro
July 06, 2018
Tweet
Share
More Decks by yasuiro
See All by yasuiro
子ども向けプログラミング学習サービスQUREOの技術的アプローチ
yasuiro
0
110
Other Decks in Technology
See All in Technology
セキュアな社内Dify運用と外部連携の両立 ~AIによるAPIリスク評価~
zozotech
PRO
0
140
Transformerを用いたアイテム間の 相互影響を考慮したレコメンドリスト生成
recruitengineers
PRO
2
520
“日本一のM&A企業”を支える、少人数SREの効率化戦略 / SRE NEXT 2025
genda
1
290
QuickSight SPICE の効果的な運用戦略~S3 + Athena 構成での実践ノウハウ~/quicksight-spice-s3-athena-best-practices
emiki
0
300
ClaudeCodeにキレない技術
gtnao
1
890
Four Keysから始める信頼性の改善 - SRE NEXT 2025
ozakikota
0
430
cdk initで生成されるあのファイル達は何なのか/cdk-init-generated-files
tomoki10
1
700
データ戦略部門 紹介資料
sansan33
PRO
1
3.3k
ロールが細分化された組織でSREは何をするか?
tgidgd
1
450
CDK Vibe Coding Fes
tomoki10
1
650
QAを早期に巻き込む”って どうやるの? モヤモヤから抜け出す実践知
moritamasami
2
120
無理しない AI 活用サービス / #jazug
koudaiii
0
110
Featured
See All Featured
Testing 201, or: Great Expectations
jmmastey
43
7.6k
The Invisible Side of Design
smashingmag
301
51k
GraphQLとの向き合い方2022年版
quramy
49
14k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
50
5.5k
Designing Experiences People Love
moore
142
24k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
331
22k
A designer walks into a library…
pauljervisheath
207
24k
Automating Front-end Workflow
addyosmani
1370
200k
Visualization
eitanlees
146
16k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
21
1.3k
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/
ご静聴ありがとうございました