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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
yasuiro
July 06, 2018
Technology
0
660
子供向けプログラミング学習サービス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
AWS Network Firewall Proxyを触ってみた
nagisa53
1
250
こんなところでも(地味に)活躍するImage Modeさんを知ってるかい?- Image Mode for OpenShift -
tsukaman
1
170
顧客との商談議事録をみんなで読んで顧客解像度を上げよう
shibayu36
0
340
Bill One急成長の舞台裏 開発組織が直面した失敗と教訓
sansantech
PRO
2
410
SREが向き合う大規模リアーキテクチャ 〜信頼性とアジリティの両立〜
zepprix
0
480
Greatest Disaster Hits in Web Performance
guaca
0
300
生成AIと余白 〜開発スピードが向上した今、何に向き合う?〜
kakehashi
PRO
0
170
【Oracle Cloud ウェビナー】[Oracle AI Database + AWS] Oracle Database@AWSで広がるクラウドの新たな選択肢とAI時代のデータ戦略
oracle4engineer
PRO
2
190
Amazon Bedrock Knowledge Basesチャンキング解説!
aoinoguchi
0
170
Context Engineeringの取り組み
nutslove
0
380
コンテナセキュリティの最新事情 ~ 2026年版 ~
kyohmizu
7
2.4k
モダンUIでフルサーバーレスなAIエージェントをAmplifyとCDKでサクッとデプロイしよう
minorun365
4
230
Featured
See All Featured
Being A Developer After 40
akosma
91
590k
Build your cross-platform service in a week with App Engine
jlugia
234
18k
Principles of Awesome APIs and How to Build Them.
keavy
128
17k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
290
Skip the Path - Find Your Career Trail
mkilby
0
60
Stop Working from a Prison Cell
hatefulcrawdad
273
21k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
79
Bash Introduction
62gerente
615
210k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
380
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.1k
How to Think Like a Performance Engineer
csswizardry
28
2.5k
GraphQLの誤解/rethinking-graphql
sonatard
74
11k
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/
ご静聴ありがとうございました