Scratchの用語とか裏技とか

# この記事について
この記事では前半にScratchの用語、後半にちょっとした裏技を紹介します。

# Scratchの用語

## New Scratcher（ニュースクラッチャー）
Scratchを始めたのユーザーのこと。

> New Scratcherはプロフィールのアバター画像の右側に`New Scratcher`と表示される。
> ![スクリーンショット 2019-04-02 10.59.59.png](https://qiita-image-store.s3.amazonaws.com/0/154299/3a3927a1-962c-1aaf-9a9c-3ce7323838b1.png)


## Scratcher（スクラッチャー）
Scratchのコミュニティなどで一定の条件を満たすとなれる。

> ScratcherはNew Scratcherのようにアバター画像の右側に`Scratcher`と表示される
> ![スクリーンショット 2019-04-02 10.59.59.png](https://qiita-image-store.s3.amazonaws.com/0/154299/77afa483-a241-9813-dbee-f7e4bea4e7dd.png)

またScratcherになるとクラウド変数の仕様が可能になる。

## クラウド変数
Scratcherになると使用可能になる変数。
その名の通りクラウド（サーバー上）に保存される変数。

> クラウド変数はブロックパレットから[変数] -> [変数を作る]で通常の変数作成画面を開き、下部の「クラウド変数（サーバーに保存）」にチェックを付け[OK]を押すと作成できる。
> ![スクリーンショット 2019-04-02 11.17.01.png](https://qiita-image-store.s3.amazonaws.com/0/154299/f48301c2-db6b-df71-0286-d757c6998ee9.png)

クラウド変数の規約として「**数値**しか代入ができない」というものがある。
これは「Scratchでチャットを作ってはいけない」のルールを守るためだと思われる。

> クラウド変数を作成した際に表示されるアラート。
> ![スクリーンショット 2019-04-02 11.16.36.png](https://qiita-image-store.s3.amazonaws.com/0/154299/776070f1-62f5-82e0-3a4d-e56faef51e0a.png)

なおこの変数を使った機能はScratcherしか利用するとこができない。

> Scratcherではない状態でクラウド変数を使ったプロジェクトを開こうとするとアラートが表示される。
> <img width="492" alt="スクリーンショット 2019-04-02 11.14.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/154299/00a8e29b-c2b8-7f25-10fd-2d4b67360630.png">

詳しいクラウド変数の情報は公式の「よくある質問」を参照してください。

<https://scratch.mit.edu/info/faq/#clouddata>

# クラウドリスト
クラウド変数を使ってサーバーにリストのデータを保存できるもの。
詳しい情報は裏技で紹介します。

# 定義ブロック
他のプログラミング言語の「関数」のようのなもの。

> ログインしているユーザーに挨拶をする定義ブロックの例。
> このように自分のオリジナルのブロックを作成できる。
> ブロックの処理内容は下の方の「定義・・・」というブロックで定義する。
> ![スクリーンショット 2019-04-02 11.27.25.png](https://qiita-image-store.s3.amazonaws.com/0/154299/79eefe3f-194a-5d3b-1a55-562ae1a13c11.png)

> 定義ブロックはブロックパレットから[ブロック定義] -> [ブロックを作る]を押して作成画面を開けます。
> 引数やラベルの追加で直感的にブロックの表示を編集することができます。
> 下部の「画面を再描画せずに実行する」にチェックを入れるとブロックの処理中に再描画が行われなくなり（多少は行われている？）処理が高速化される。
> ![スクリーンショット 2019-04-02 11.26.51.png](https://qiita-image-store.s3.amazonaws.com/0/154299/5518599b-d620-eb3d-7479-4aae93a294e8.png)

# Scratchの裏技？
子供向けプログラミング環境であるScratchにはちょっとした裏技がいくつかあります。
この記事でいくつかご紹介します。

# ハッキング
Scratchのプロジェクトの保存形式は`sb2`もしくは`sb3`です。

> sb3ファイルの画像
> <img width="89" alt="スクリーンショット 2019-04-02 10.45.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/154299/28c603bd-35dc-212b-febf-5b402536c8c5.png">

そしてこの形式の招待は`zip`ファイルです。
なので、拡張子を`zip`に変えて展開するとプロジェクトの中身を見ることができます。

> 拡張子を`sb3`から`zip`に変えて展開したフォルダの中身。
> <img width="284" alt="スクリーンショット 2019-04-02 10.46.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/154299/e741b854-e6f7-fe3b-6e91-98bec8e27d42.png">

いくつかの音声ファイルと画像ファイルとjsonが入っているのがわかります。

| 種類 | 説明 | 拡張子の例 |
|:-:|:-:|:-:|
|  画像ファイル  |  Scratchのスプライトや背景のコスチュームの画像です。  |  png,jpg,svg  |
|  音声ファイル  |  Scratchのスプライトや背景の音のファイルです。  |  wav, mp3  |
|  プロジェクトファイル  |  プロジェクトのブロックの位置やブロックの親子関係、スプライトや背景の音声ファイル、画像ファイルの関係を示したファイルです。  |  json  |

※フォルダの有いつの`json`ファイルである`project.json`はプロジェクトに1つしかありません。

そしてこの`project.json`のブロックの情報などを書き換えることで**通常は存在しない特殊なブロック**を作ったりすることができます。

このように`project.json`の中身を書き換えることを**_ハッキング_**と呼びます。
※ ハッキングで作った特殊なブロックを**_ハッキングブロック_**と読んだりします。

# trueやfalseを表現する
「<>ではない」ブロックは<>に指定する値がない場合はtrueを返します。
![スクリーンショット 2019-04-02 11.57.57.png](https://qiita-image-store.s3.amazonaws.com/0/154299/7c363f28-269e-4a14-1172-0b00e7f9d41c.png)

「<>かつ<>」ブロックは<>に指定する値が両方ない場合はfalseを返します。
![スクリーンショット 2019-04-02 11.58.03.png](https://qiita-image-store.s3.amazonaws.com/0/154299/caa1a0c8-2576-6fed-d179-ea2d2e0f76bd.png)



# 定義ブロックの早期return
早期returnは他のプログラミング言語でも用いられるプログラムを見やすくするための手法。
Scratchでは定義ブロックの定義で「このスクリプトを止める」処理を抜けることができる。

> 早期returnの例。
> ![スクリーンショット 2019-04-02 11.53.32.png](https://qiita-image-store.s3.amazonaws.com/0/154299/bb92d8b2-2893-9cfc-4028-7d51e729fe5c.png)

# 定義ブロックの処理を条件分岐で見やすくする
わざと定義中に実行される条件分岐を作って処理を分けると見やすくなる。
![スクリーンショット 2019-04-02 11.56.21.png](https://qiita-image-store.s3.amazonaws.com/0/154299/a237788d-efcb-0c2d-9683-b94404bc67aa.png)



# 大文字と小文字の比較
Scratchの文字列比較はちょっと特殊で大文字と小文字の判定ができません。
> 文字列`hello`と`HELLO`の比較の様子。
> ![スクリーンショット 2019-04-02 10.56.08.png](https://qiita-image-store.s3.amazonaws.com/0/154299/76b86cb2-1464-07b0-f765-183dbefe3b4b.png)

そのため、大文字と小文字の比較を行うためにちょっとした裏技があります。
![スクリーンショット 2019-04-02 11.43.18.png](https://qiita-image-store.s3.amazonaws.com/0/154299/62280cbb-e259-6d94-07b9-437a910dfcc5.png)
このコスチュームを変えるブロックですが、このように値を指定することができます。
![スクリーンショット 2019-04-02 11.45.46.png](https://qiita-image-store.s3.amazonaws.com/0/154299/bfc5e48a-f1f2-0d34-ab7a-fd4c4309e2f9.png)
この場合、「コスチュームを(a)にする」という解釈になるためコスチュームは「a」になります。
※ なおコスチュームが存在しない場合は現在のコスチュームのまま変化しません。
そしてこのコスチュームを変えるブロックは大文字と小文字を厳密に判定します。
これを応用して大文字と小文字を厳密判定するプログラムを作成することができます。

> 判定を定義ブロックにした例。なおこのスプライトのコスチュームにはcostume1,a,b,c,...zが入っている。
> <https://scratch.mit.edu/projects/299088682>
> ![スクリーンショット 2019-04-02 11.50.25.png](https://qiita-image-store.s3.amazonaws.com/0/154299/590a86ec-89a7-6db4-58f3-36e2d5a473b9.png)

# クラウドリスト
クラウド変数には数値しか入れられないが、数値で文字列を表現することは可能です。
これを応用してリストのデータをクラウドに保存できるプログラムをクラウドリストと呼びます。

数値データの形式としては`001はa`、`002はb`と数字で文字を表現し、それをクラウド変数に保存することで可能になります。

# クラウド変数に16進数（<font color="Red">もう使えません</font>）
Scratch2.0で消されてしまいましたが、クラウド変数には16進数が格納できました。