Discuss Scratch
- Discussion Forums
- » 日本語
- » Scratch 3.0 をハック(動作や構造を解析すること)しよう!
- KimiruHamiru
- New to Scratch
500+ posts
Scratch 3.0 をハック(動作や構造を解析すること)しよう!
Scratch3.0は、大雑把に言えば、ほとんどの部分がJavaScript言語で書かれています。 どうやったらScratch3.0をハックできるんですか?
ソースコードが公開されているので、JavaScript周辺の「充分な知識」があれば、
改造版Scratchを作ってWindowsなどの環境で動かすことができます。
改造しないまでも実際の構造を知ることでプロジェクトの作り方を工夫したりもできます。
このトピックで言う「Scratch3.0をハックする」の基本はそれです。
具体的にどうするか
具体的にどうするかというあたりは「質問者回答者の前提知識次第で答えの幅がむちゃくちゃ広くなる」のですが、
ひとつのこたえは、
「JavaScript周辺の充分な知識」があれば、
https://github.com/llk/scratch-gui
というURLを1つ知るだけで「Scratch3.0をハックする」ことができます。
できないなら「JavaScript周辺の充分な知識」が足りません。
となるかと思います。
とはいえ、これはかなり荷が重いです。
「周辺、充分」が曲者(くせもの)です。罠です。量がとんでもないです。
「一介の職業プログラマ」のレベルでは、
「手持ちのスキルセットが余程マッチする」且つ「整合性に関して、時の運がある」
という特殊状況でなければ、githubをスタート地点にすることはお勧めできません。
できなくはないですが、数週間単位の時間や最低数千円単位の書籍代が必要なはずです。
そこで
Open Source Projectsフォーラム
日本語フォーラムの外、
https://scratch.mit.edu/discuss/ のページ
「About Scratchカテゴリ」の中に
・Open Source Projectsフォーラム
・Developing Scratch Extentionsフォーラム
・Bugs and Glitchesフォーラム
といった、
「Scratch3.0をハックする」話題
に関連したフォーラム群があります。
特に、「Open Source Projects」フォーラムには
「Scratch3.0をハックする」の具体的なガイドがまとまっているようです。
「Scratch3.0を改造することに関しては、そこの情報が世界一前提知識の要求が低い」と思っています。
(とかいいつつ、私はちゃんと読んでません!)
また、「事実上の一次情報」となっているという理解です。
(異論はあるでしょうが、「Open Source Projectsフォーラム」の存在なしに日本語のこのトピックや、さらに言えばgithubのLLKリポジトリが機能しているとは想像できません)
などといいつつ、
Hackって何?
「Hackする」という言葉は、広義には「ライフハック」とかいう言葉があるように、
ソースコードのビルド云々を前提としたやり方に限定する言葉ではないので、
別ないろんなやり方でHackしてみるのもいいかもとは思います。
このトピックの指向はどうあれ、
「sb3ファイルを解凍ツールに掛けたらJSONファイルが出てきた!+ちょちょっと書き換えてアーカイブしたらScratchで読めた!=微妙に動作が変わった!」といった、いわゆる「JSONハック」
や、
もっと言えば
「こう使えばフレームレートが上げられる!」、「こうすれば鳴らすブロックで同時発声可能!」
などという、プロジェクトレベルからのアプローチ
も
「Scratch3.0をハックする」という表現をして差し支えないかな、と思うので、結局のところ
好きなようにHackすればよい
自分がHackだと思えばそれはHack
かな?とかも思います。
「ぼくが考えるHackはこれだ!」という具体的な話が出てくると、別な答えが出てくるかもしれません。
- inoking
- Scratcher
1000+ posts
Scratch 3.0 をハック(動作や構造を解析すること)しよう!
何をしたいかという程度にもよりますが
このトピックを最初から見ていくだけで一次情報になると思います。
その中にある Scratch 3.0の拡張機能を作ってみよう などは特に有用です。
JavaScript はまともに扱ったこともない私でさえ
「数週間単位の時間や最低数千円単位の書籍代」もかけることなく、
ポイントを絞ればソースの解析はできています。
このトピックを最初から見ていくだけで一次情報になると思います。
その中にある Scratch 3.0の拡張機能を作ってみよう などは特に有用です。
JavaScript はまともに扱ったこともない私でさえ
「数週間単位の時間や最低数千円単位の書籍代」もかけることなく、
ポイントを絞ればソースの解析はできています。
これは署名と呼ばれるもので投稿本文とは関係ありません。
Scratch は「世界最大の子ども向けコーディングコミュニティーで、シンプルなビジュアルインターフェースを持ったコーディング言語」
つまり「子ども SNS」ではない
・「傾向」とは単に一定の基準で作品を並びかえただけのもので、ランキングでもなんでもない、ナンバーワンよりオンリーワンを目指してみては?
・「フォロー」とは他の Scratcher が何をしているかを簡単に確認するためのもので、「フォロワー」は「ファン」ではない
・「スタジオ」とは特定のテーマに沿って作品をまとめたり、共同制作したりするための場所
・「星」や「ハート」などを何かの見返りとすることは Scratch チームによって禁止されている
- apple502j
- Scratcher
1000+ posts
Scratch 3.0 をハック(動作や構造を解析すること)しよう!
私としては、一次情報は
・ソースコード
・Issue/Pull Request/コミットメッセージ
・STメンバーのプロフィールコメント
・ときどきフォーラム投稿
ですね。
・ソースコード
・Issue/Pull Request/コミットメッセージ
・STメンバーのプロフィールコメント
・ときどきフォーラム投稿
ですね。
署名は、ディスカッションフォーラムの機能である。署名は、その人のすべての投稿の下部に追加される。署名は、BBCodeで記述できる。 署名を追加/変更/削除したい場合は、ディスカッションフォーラムのホームの一番下に行き、「Change your signature」を押す。署名の大きさは150pxまでである。これには、改行、画像を含む。- Japanese Scratch-Wiki 「署名」
- inoking
- Scratcher
1000+ posts
Scratch 3.0 をハック(動作や構造を解析すること)しよう!
質問コーナー3 #7644 より:
スケジューラについて調べました。
33ミリ秒毎にメインループが起動され各スプライトの処理が順番に実行されます。
これが33ミリ秒単位の待ち時間になるという理由と思われます。
※この辺の作りは Scratch 2.0 と同様のようです。
メインループ起動の流れ:
1. 緑旗のクリック時 VirtualMachine::start() が呼ばれます(と思われる)。
https://github.com/LLK/scratch-gui/blob/develop/src/containers/controls.jsx#L17
2. VirtualMachine::start() では Runtime::start() が呼ばれます。
https://github.com/LLK/scratch-vm/blob/develop/src/virtual-machine.js#L171
3. Runtime::start() では 33(1000 / 30)ミリ秒毎に Runtime::_step() を呼び出すよう設定します。
https://github.com/LLK/scratch-vm/blob/develop/src/engine/runtime.js#L700
https://github.com/LLK/scratch-vm/blob/develop/src/engine/runtime.js#L2557
4. Runtime::_step() では Sequencer::stepThreads() が呼ばれます。
https://github.com/LLK/scratch-vm/blob/develop/src/engine/runtime.js#L2019
5. Sequencer::stepThreads() では インターバル(33ミリ秒)の 75% を消費するまでループが実行され、これがメインループです。
https://github.com/LLK/scratch-vm/blob/develop/src/engine/sequencer.js#L70
スケジューラについて調べました。
33ミリ秒毎にメインループが起動され各スプライトの処理が順番に実行されます。
() 秒待つ等では時間が満了していない場合は yield され次回の処理に回されるので
これが33ミリ秒単位の待ち時間になるという理由と思われます。
※この辺の作りは Scratch 2.0 と同様のようです。
メインループ起動の流れ:
1. 緑旗のクリック時 VirtualMachine::start() が呼ばれます(と思われる)。
https://github.com/LLK/scratch-gui/blob/develop/src/containers/controls.jsx#L17
handleGreenFlagClick (e) {
e.preventDefault();
if (e.shiftKey) {
this.props.vm.setTurboMode(!this.props.turbo);
} else {
if (!this.props.isStarted) {
this.props.vm.start();
}
this.props.vm.greenFlag();
}
}
https://github.com/LLK/scratch-vm/blob/develop/src/virtual-machine.js#L171
start () {
this.runtime.start();
}
https://github.com/LLK/scratch-vm/blob/develop/src/engine/runtime.js#L700
static get THREAD_STEP_INTERVAL_COMPATIBILITY () {
return 1000 / 30;
}
start () {
// Do not start if we are already running
if (this._steppingInterval) return;
let interval = Runtime.THREAD_STEP_INTERVAL;
if (this.compatibilityMode) {
interval = Runtime.THREAD_STEP_INTERVAL_COMPATIBILITY;
}
this.currentStepTime = interval;
this._steppingInterval = setInterval(() => {
this._step();
}, interval);
this.emit(Runtime.RUNTIME_STARTED);
}
https://github.com/LLK/scratch-vm/blob/develop/src/engine/runtime.js#L2019
_step () {
...
const doneThreads = this.sequencer.stepThreads();
https://github.com/LLK/scratch-vm/blob/develop/src/engine/sequencer.js#L70
stepThreads () {
// Work time is 75% of the thread stepping interval.
const WORK_TIME = 0.75 * this.runtime.currentStepTime;
...
while (this.runtime.threads.length > 0 &&
numActiveThreads > 0 &&
this.timer.timeElapsed() < WORK_TIME &&
(this.runtime.turboMode || !this.runtime.redrawRequested)) {
() 秒待つhttps://github.com/LLK/scratch-vm/blob/develop/src/blocks/scratch3_control.js#L110
wait (args, util) {
if (util.stackTimerNeedsInit()) {
const duration = Math.max(0, 1000 * Cast.toNumber(args.DURATION));
util.startStackTimer(duration);
this.runtime.requestRedraw();
util.yield();
} else if (!util.stackTimerFinished()) {
util.yield();
}
}
これは署名と呼ばれるもので投稿本文とは関係ありません。
Scratch は「世界最大の子ども向けコーディングコミュニティーで、シンプルなビジュアルインターフェースを持ったコーディング言語」
つまり「子ども SNS」ではない
・「傾向」とは単に一定の基準で作品を並びかえただけのもので、ランキングでもなんでもない、ナンバーワンよりオンリーワンを目指してみては?
・「フォロー」とは他の Scratcher が何をしているかを簡単に確認するためのもので、「フォロワー」は「ファン」ではない
・「スタジオ」とは特定のテーマに沿って作品をまとめたり、共同制作したりするための場所
・「星」や「ハート」などを何かの見返りとすることは Scratch チームによって禁止されている
- inoking
- Scratcher
1000+ posts
Scratch 3.0 をハック(動作や構造を解析すること)しよう!
というわけで Scratch 2.0 のオフラインエディターで編集していた開発版プロジェクトが
(上限の50MBよりは少し小さいのだけれど)いつの間にか保存できなくなってる。。
Scratch 3.0 のオフラインエディタでは読み込んで保存できるものの
.sb2 では 1.2MB だった project.json が
.sb3 では 5.2MB に膨れ上がり
そのせいでオンラインにアップできない。。
Scratch 3.0 は圧縮効率が向上しているはずではなかったのか?
・Scratch 2.0 のサイズ制限を緩和した Mod では保存もできるのでそちらで続けるか、
・Scratch 3.0 のオフラインエディターで編集を続けるか、
思案中。。。
Scratch 3.0 の project.json のサイズがなぜ膨れ上がるかなのですが
targets.blocks にある各ブロック(↓ のような単位)
() 歩動かすにそれぞれ20文字の一意識別子のようなものが付加されていて相互参照しているようです。
使われているブロックの数だけこの識別子は付加されていますから
それだけでも膨れ上がらせるには十分でしょう。
これは署名と呼ばれるもので投稿本文とは関係ありません。
Scratch は「世界最大の子ども向けコーディングコミュニティーで、シンプルなビジュアルインターフェースを持ったコーディング言語」
つまり「子ども SNS」ではない
・「傾向」とは単に一定の基準で作品を並びかえただけのもので、ランキングでもなんでもない、ナンバーワンよりオンリーワンを目指してみては?
・「フォロー」とは他の Scratcher が何をしているかを簡単に確認するためのもので、「フォロワー」は「ファン」ではない
・「スタジオ」とは特定のテーマに沿って作品をまとめたり、共同制作したりするための場所
・「星」や「ハート」などを何かの見返りとすることは Scratch チームによって禁止されている
- inoking
- Scratcher
1000+ posts
Scratch 3.0 をハック(動作や構造を解析すること)しよう!
JSON のビューアとしては「J_and_E」がいい感じです。
Scratch 3.0 の改行なし project.json も放り込んでやれば整形してくれます。
Scratch 3.0 の改行なし project.json も放り込んでやれば整形してくれます。
Last edited by inoking (June 27, 2020 15:56:08)
これは署名と呼ばれるもので投稿本文とは関係ありません。
Scratch は「世界最大の子ども向けコーディングコミュニティーで、シンプルなビジュアルインターフェースを持ったコーディング言語」
つまり「子ども SNS」ではない
・「傾向」とは単に一定の基準で作品を並びかえただけのもので、ランキングでもなんでもない、ナンバーワンよりオンリーワンを目指してみては?
・「フォロー」とは他の Scratcher が何をしているかを簡単に確認するためのもので、「フォロワー」は「ファン」ではない
・「スタジオ」とは特定のテーマに沿って作品をまとめたり、共同制作したりするための場所
・「星」や「ハート」などを何かの見返りとすることは Scratch チームによって禁止されている
- jiroz_2nd
- Scratcher
100+ posts
Scratch 3.0 をハック(動作や構造を解析すること)しよう!
ハックしたプロジェクトは共有してもいいのでしょうか?
こんな宣伝やちょっとした紹介を書く所を署名といいます。手動じゃないです。
ピクシブ小説だけどUNDERTALEの二次創作があります。(少しやべえシーンあるからそこは自己責任で。)
題名は「War after TALE」。よかったら読んでほしいです!
↓↓↓ついでにこれも見てください。(人員不足で困ってる)
UNDERTALE ANOTHER STORY 制作スタジオ
- apple502j
- Scratcher
1000+ posts
Scratch 3.0 をハック(動作や構造を解析すること)しよう!
基本はopcode-type対応表を用意します。(こんなの)とこんなのの違いが書いてあるところはありますか?(json内)
ただし、変数ブロックは別です。(変数ブロックは「入力欄」として扱われています)
署名は、ディスカッションフォーラムの機能である。署名は、その人のすべての投稿の下部に追加される。署名は、BBCodeで記述できる。 署名を追加/変更/削除したい場合は、ディスカッションフォーラムのホームの一番下に行き、「Change your signature」を押す。署名の大きさは150pxまでである。これには、改行、画像を含む。- Japanese Scratch-Wiki 「署名」
- musicmansub
- Scratcher
1 post
Scratch 3.0 をハック(動作や構造を解析すること)しよう!
部外者ですいません。scratch3.0ではハッキングすることってできますか?
- jun50
- Scratcher
1000+ posts
Scratch 3.0 をハック(動作や構造を解析すること)しよう!
可能です。
ちなみに私はUbuntuユーザーです☆
$ sudo discuss send “message”
We trust you have received the usual lecture from the Scratch Team. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
#4) “S” of Scratch is uppercase letter.
アリスはかわいい!!!!!!!!!アリスちゃあああああああああああああああああああああああああああああああああん!!!!!!!!!!!!!ロリスちゃんかわいい!!!
- apple502j
- Scratcher
1000+ posts
Scratch 3.0 をハック(動作や構造を解析すること)しよう!
その場合は、利用規約の4.4(modされたScratchを使ったプロジェクトの共有禁止)にも気を付けてください。
Scratch外での共有は問題ありません。
Scratch外での共有は問題ありません。
署名は、ディスカッションフォーラムの機能である。署名は、その人のすべての投稿の下部に追加される。署名は、BBCodeで記述できる。 署名を追加/変更/削除したい場合は、ディスカッションフォーラムのホームの一番下に行き、「Change your signature」を押す。署名の大きさは150pxまでである。これには、改行、画像を含む。- Japanese Scratch-Wiki 「署名」
- tsumuri3
- Scratcher
1000+ posts
Scratch 3.0 をハック(動作や構造を解析すること)しよう!
展開したやつは、.sb3ではなく、(windowsの場合だが)フォルダごと、右クリックして、送るでzipにしてください。僕もうまくいきませんでした。しかも、sb3に拡張子を変えても、アイコンはzipのままでした。アップロード機能はもう使えるみたいです。 ベータ版はアップロード機能をもうサポートしているのでしょうか?
ダウンロードしただけのファイルでもアップロードできませんか?
すみません、私は試していません。
※この話題なら Scratch3.0について話し合う所 のほうがいいかも
ところで、ふと思ったことがあったので、実験してみました。
zipだったファイルの拡張子をもう一度sb3に戻してアップロードを試してみましたが、うまくいきませんでした。
Last edited by tsumuri3 (Aug. 3, 2020 08:42:05)
- inoking
- Scratcher
1000+ posts
Scratch 3.0 をハック(動作や構造を解析すること)しよう!
それは2年前の投稿でベータ版の話ですよ。展開したやつは、.sb3ではなく、(windowsの場合だが)フォルダごと、右クリックして、送るでzipにしてください。 僕もうまくいきませんでした。しかも、sb3に拡張子を変えても、アイコンはzipのままでした。
投稿前に日付を確認しましょう。
これは署名と呼ばれるもので投稿本文とは関係ありません。
Scratch は「世界最大の子ども向けコーディングコミュニティーで、シンプルなビジュアルインターフェースを持ったコーディング言語」
つまり「子ども SNS」ではない
・「傾向」とは単に一定の基準で作品を並びかえただけのもので、ランキングでもなんでもない、ナンバーワンよりオンリーワンを目指してみては?
・「フォロー」とは他の Scratcher が何をしているかを簡単に確認するためのもので、「フォロワー」は「ファン」ではない
・「スタジオ」とは特定のテーマに沿って作品をまとめたり、共同制作したりするための場所
・「星」や「ハート」などを何かの見返りとすることは Scratch チームによって禁止されている
- MINITOMATO10
- Scratcher
100+ posts
Scratch 3.0 をハック(動作や構造を解析すること)しよう!
変数を後ろに下げる方法ってありますか?質問コーナー4で質問したのですが、このトピックの目的が、っぽかったので投稿させていただきました
Last edited by MINITOMATO10 (Aug. 12, 2020 08:44:10)
おすすめの曲
・https://youtu.be/g7s6-9AwfCc(すとぷり - StrawberryPrinceForever)
・https://youtu.be/Cudfi9AHkeU(莉犬 - ルマ)
おすすめ動画
・https://youtu.be/yTHlAOVVDEA(すとぷり - 椅子取りゲーム)