Scratch3.0からmobile backendが使えるブロックを追加してみました

# はじめに
Scratch3.0の拡張機能を使って、[ニフクラ mobile backend](https://mbaas.nifcloud.com/)と連携たプログラミング学習コンテンツを作れないかな？と考えたのがこれを作り始めたきっかけです。一旦拡張が完成（まだ直すべきところはきっとたくさんあるけど…）したので公開したいと思います。

## Scratch3.0とは

> Scratch(スクラッチ)は、Scratch財団がマサチューセッツ工科大学メディアラボ ライフロングキンダーガーデングループ（MIT Media Lab Lifelong Kindergarten Group）と共同開発する、8〜16才のユーザーをメインターゲットにすえた無料の教育プログラミング言語である。
> ◇Scratch \- Japanese Scratch\-Wiki： https://ja.scratch-wiki.info/wiki/Scratch

## ニフクラ mobile backend とは？

> mBaaS（mobile backend as a Service）とは、スマートフォンアプリでよく利用される汎用的な機能をクラウドから提供するサービスです。
> ◇サービスサイト： https://mbaas.nifcloud.com/

色々とある機能の中で今回連携ブロックとして作成したのは、「データストア」という__クラウドデータベース__の部分です。Scratchからクラウドにデータを保存したり、条件を付けて取得したりすることが出来るようにしました。

# 拡張機能としてmobile backendが利用できるScratch3.0

こちらです▼
https://natsumo.github.io/scratch-gui/
※プロジェクトを開くには Google Chrome が必要です。

# 使い方

## 事前準備

### 基本的なScratchの使い方の学習

Scratchの使い方については今回の内容から逸れるので割愛しますが、それほど難しくないので、全くの初心者がいきなり使ってもなんとかなるとは思います👌

### mobile backend の利用登録とアプリの新規作成

ニフクラ mobile backendは無料で利用できます。下記リンク先より会員登録（SNS ID）をしてアカウントを作成してください。
https://console.mbaas.nifcloud.com/signup

会員登録後、ログインをしてアプリの新規作成をしてください。（アプリ名は何でもOKです。）
アプリが新規作成されると__APIキー__（アプリケーションキーとクライアントキー）が発行されます。APIキーは後にScratchでコンテンツを作成する際に使います。（最初の画面を「OK」で閉じた後は、右上の「アプリ設定」から確認できます。）

## Scratchに追加されたブロック一覧

全部で11ブロックあります。

* アプリケーションキー設定（処理ブロック）
* クライアントキー設定（処理ブロック）
* 保存（処理ブロック）
  * 値の設定
  * 保存処理の実行
* 取得（処理ブロック）
  * 検索条件：ソート（昇順・降順）の指定
  * 検索条件：取得件数の指定
  * 検索条件：取得開始位置の指定
  * 検索条件：指定する値と等しい
  * 取得処理の実行
* 取得データ（値ブロック）
  * 取得データの件数
  * 指定した取得データ

## クイックスタート
### ブロックの追加

https://natsumo.github.io/scratch-gui/develop/
プロジェクトを開いて、左下のアイコンをクリックします。

<img width="1440" alt="ブロック追加1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112032/4d0ea8a6-99de-f4bf-5afc-99102530f682.png">

左上にあるNCMBの拡張機能を選びます。

<img width="1440" alt="ブロックの追加2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112032/83765f7a-5dcb-b4d9-1c34-b3a281ff99f0.png">

追加されました。

<img width="377" alt="ブロックの追加3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112032/4066c403-cd7c-249b-bf45-d77554268032.png">

### APIキーの設定

トリガーが必要なので、「イベント」から「スペースキーが押された時」ブロックを取り出しましょう。その下に続けて、NCMBの「アプリケーションキーの設定」ブロックと「クライアントキーの設定」ブロックを配置します。

<img width="320" alt="APIキーの設定1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112032/bc7caef6-83a1-f859-f744-e6f64885b65f.png">

事前準備の[mobile backend の利用登録とアプリの新規作成](#mobile-backend-の利用登録とアプリの新規作成)で取得したAPIキーをここに使用します。mobile backend の管理画面からコピーボタンでコピーして、それぞれ貼り付けてください。

<img width="529" alt="APIキーの設定2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112032/3d14d9c6-e56e-b01e-5fb8-e58fcb2f20e6.png">

これは保存するにも、取得するにも必ず必要な作業ですので、忘れずに実装しましょう。

### 保存する

APIキーの設定の下に次のように繋げます。

<img width="585" alt="スクリーンショット_2019-09-09_17_13_22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112032/8ff9ffbc-b5a2-ee11-48f1-a20c7785afd6.png">

それぞれ値は変更してみてください。（そのまま実行することもできます。）
このまま「スペース」キーを押してプログラムを実行すると、mobile backend には次のようにデータが保存されます。

<img width="819" alt="スクリーンショット 2019-09-09 17.13.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112032/34e6e601-d77c-a451-87d4-05cbf3bd07c2.png">

key（フィールド）はいくつでも増やすことができるので、次のように書くこともできます。

<img width="586" alt="スクリーンショット_2019-09-09_17_16_36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112032/bb21dad1-d68b-bf19-7a48-5df7ef4e7cce.png">

「スペース」キーを押してプログラムを実行すると、mobile backend には次のようにデータが保存されます。

<img width="1000" alt="スクリーンショット 2019-09-09 17.17.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112032/2ebbdede-fdea-2d47-0c30-cebb7507b68a.png">

※１つのデータに同じkeyは使えないので注意☝️

### 取得する

例として、 `Scratch` というクラスに次のようにデータが保存されているとします。[^1]

[^1]: これは「いつ・どこで・誰が・何をした」を想定したデータです。データの用意の仕方はブログ「[【Scratch3\.0】クラウドを活用して「いつ・どこで・誰が・何をした」ゲームを作る \- Qiita](https://qiita.com/natsumo/private/8d5b9d1c3f1db0fed09a)」を参照してください。

<img width="946" alt="スクリーンショット 2019-09-09 17.19.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112032/ac5bf842-6bc2-b1cf-f0b0-036bbfc7fa27.png">

この値を取得してみます。次のようにすると全件取得ができます。取得は非同期処理です。完了までに少しかかるので、１秒待ってから（「制御」の中にブロックがあります）取得データの件数をしゃべらせてみます（「見た目」の中にブロックがあります）。

<img width="586" alt="スクリーンショット_2019-09-09_17_35_44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112032/276863f7-493e-162c-b571-6154042d1be9.png">

こんな感じです。

<img width="213" alt="スクリーンショット 2019-09-09 17.36.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112032/adcbf48b-20b4-b463-d0a6-0f58b2978ec1.png">

今度は条件を付けてデータを取得してみましょう。データの作成日時（`createDate`）の降順（新しい順）で取得して、その一番目（一番新しいデータ）の `who` の値をしゃべらせてみましょう。

<img width="588" alt="スクリーンショット_2019-09-09_17_41_03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112032/6add21f4-92a2-349b-5d01-6a7899bdc47d.png">

こんな感じです。

<img width="228" alt="スクリーンショット 2019-09-09 17.41.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112032/3d7d5af2-b93c-4cca-3cc7-c7214968c032.png">

検索条件は複数組み合わせることができます。データの途中から取得したり、取得する件数を指定したり・・・さて問題です。次の場合何をしゃべるでしょうか？

<img width="571" alt="スクリーンショット_2019-09-09_17_45_48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112032/34d9e546-b78a-ffff-9a7f-0b2b558ef3d6.png">

正解はこちら！

<img width="216" alt="スクリーンショット 2019-09-09 17.48.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112032/166e6bc5-fa56-94a4-8e05-5a6c93b7355d.png">

色々試してみてくださいね。

## ログが見たいとき

一応少しはログが出るように作っているので何で動かないのかな？とか思ったらコンソールを開いてログを見てみてくださいね！参考になるかもしれません。

<img width="700" alt="スクリーンショット_2019-09-09_17_51_48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112032/b2628658-f756-0d57-369c-cb1abd7c526f.png">

# 最後に

スプライトにしていた鳥のキャラクターですが、こちらはニフクラ mobile backend オリジナルキャラクターの「タカノくん」と言います。

![takano.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112032/b38d290a-a531-f65d-82c8-65ee1f3df4a0.png)

タカノくんを是非使いたいという方はこちらからお持ちください。
また、設定は以下のようにできます。サイズは50くらいにするとちょうど良いですね。

<img width="492" alt="スクリーンショット 2019-09-09 15.57.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112032/05d83b01-4b40-c894-448e-561b165659c1.png">