Scratchとenebularを連携させようとしてみた過程と結果・・・

こちらは、[enebular Advent Calendar](https://qiita.com/advent-calendar/2018/enebular) の 9日目 **"だったはず"** の記事になります。
（当初、[enebular](https://enebular.com/) のアドベントカレンダー用に書いたのに、それを利用するまでの過程ではまり、Scratch の話がメインになってしまいました・・・）

最終的に、**本記事があまりに  enebular 要素が少ないので、別記事を書いて、そちらをアドベントカレンダー用記事として差し替えました。**
　⇒ [enebular editor をMacで試してみる](https://qiita.com/youtoy/private/58f2f69e4e561842fd73)

そして、**本記事は、[Scratch Advent Calendar](https://qiita.com/advent-calendar/2018/scratch) の記事**として利用することにしました。
以下、Scratch と enebular を連携させようとして、試行錯誤した結果についてです。


# enebular を初めて使ったときの話

まず、アドベントカレンダーのテーマになっている[「enebular」](https://enebular.com/)を、初めて使ったときの話について触れたいと思います。

enebular を初めて使ったのは、[LINE BOOT AWARDS 2018](https://www.line-community.me/awards/) の期間中に実施された[「Clova × enebularハンズオン」](https://linedev.connpass.com/event/96084/)に参加したときでした。
このイベントは、LINE社が提供するAIアシスタント「Clova」のスキル開発を行うハンズオンで、enebular を使ったノンプログラミングでの開発を行いました。

ハンズオンの内容が気になる方は、その時の流れなどが記載された記事がありますので、ご覧ください。
　[LINE Clova Extensions Kitとenebularを連携して会話させてみよう | enebular blog](https://blog.enebular.com/line/line-cek-meets-enebular/)

この時は、enebularのフローを取り込む仕組みを活用することで、短時間でClovaスキルを作ることができました。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">取り込んだフローの確認。<a href="https://twitter.com/hashtag/linebootawards?src=hash&amp;ref_src=twsrc%5Etfw">#linebootawards</a> <a href="https://twitter.com/hashtag/clova_cek?src=hash&amp;ref_src=twsrc%5Etfw">#clova_cek</a> <a href="https://twitter.com/hashtag/enebular?src=hash&amp;ref_src=twsrc%5Etfw">#enebular</a> <a href="https://t.co/ULhmjLnRvc">pic.twitter.com/ULhmjLnRvc</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1032586195421675521?ref_src=twsrc%5Etfw">2018年8月23日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

上記のフローで、Clovaスキルを起動したときに応答を返し、さらにユーザの呼びかけに答える仕組みが実装されています。

<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr">本日の成果です。<br>同時に反応して、両方とも話してくれます。<a href="https://twitter.com/hashtag/linebootawards?src=hash&amp;ref_src=twsrc%5Etfw">#linebootawards</a> <a href="https://twitter.com/hashtag/clova_cek?src=hash&amp;ref_src=twsrc%5Etfw">#clova_cek</a> <a href="https://twitter.com/hashtag/enebular?src=hash&amp;ref_src=twsrc%5Etfw">#enebular</a> <a href="https://t.co/ujvjvnJLMX">pic.twitter.com/ujvjvnJLMX</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1032611238436462593?ref_src=twsrc%5Etfw">2018年8月23日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# Scratchについて

次に、enebularと連携させようとした[「Scratch」](https://scratch.mit.edu/)について記載します。

最近、子どものためのプログラミング道場である[「CoderDojo」](https://coderdojo.jp/)に関わるようになり、ビジュアルプログラミングを行うことが可能な Scratch をよく利用するようになりました。
（過去、4〜5年ほど前に、子ども向けのプログラミングイベントのサポーターをした際などに、限定的な部分のみ覚えて、参加者の子ども達のサポートをしたことはあったのですが）

この Scratch は、子ども向けのプログラミングイベントなどで良く使われていていることもあり、目にされたことがある方もいらっしゃるのではないでしょうか。
また、最近では2020年のプログラミング教育必修化の流れで、さらに目にする機会が増えていると思います。

なお Scratch は、MITメディアラボのライフロングキンダーガーテングループのプロジェクトで、無償で提供されているものです。
詳細は、[公式サイトの説明](https://scratch.mit.edu/about)をご覧ください。

## Scratchの拡張性

Scratchは子ども向けのプログラミングという文脈で登場することが多いですが、使ってみると奥が深く、大人でも楽しめたりします。
また、機能拡張を行う仕組みもあり（※利用環境の制限があったりもしますが）、
例えば、[小型ドローンの「Tello」](https://store.dji.com/jp/product/tello)を制御する際のフロントエンドなどにも使えたりします。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">宿泊中の仙台のホテルで、石巻で思うように動作させられてなかった、<br>「小型ドローンのTello ＋ ビジュアルプログラミングのScratch」<br>に再挑戦。<br><br>回転動作がプログラム通りに動かなかった件は、ウェイトをかければ大丈夫そう？ <a href="https://t.co/2jNs3MZSRg">pic.twitter.com/2jNs3MZSRg</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1018596414924808194?ref_src=twsrc%5Etfw">2018年7月15日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr">Scratchで組んだプログラムはこちら。<br>今の状態は、ウェイト1秒の後の、反時計回りの命令が動いてない感じです。 <a href="https://t.co/HoprhVCgWH">pic.twitter.com/HoprhVCgWH</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1018596827568922625?ref_src=twsrc%5Etfw">2018年7月15日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

現在β版の [Scratch 3.0](https://beta.scratch.mit.edu/) では、複数の言語での音声合成や、言語の翻訳機能なども簡単に扱えるようになっていたりします。
さらに、個人的に最近はまっているマイコンボード [「micro:bit」](https://microbit.org/ja/guide/) とも簡単に連携できるようになっていて、マイコンボード内蔵のセンサー・LED・ボタンスイッチなどを組み合わせられたりします。

# 今回やろうとしたこと

この「Scratch と enebular をつなげること」が1つのゴールでした。
それが実現できれば、Scratch で今よりさらに様々なもの・サービスと連携させられて楽しいのではないか、と考えたためです。

# 今回できたこと

先に結論を書くと、今回実現できた内容は
Scratch の実験的拡張機能をテストするためのプラットフォーム[「ScratchX」](https://scratchx.org/)の[「IFTTT拡張」](https://github.com/savaka2/scratch-extensions/wiki/IFTTT)を利用して、Webhook によるやりとりをした、
というところまででした・・・。

調査や検証の仮定で、Scratch と外部オンラインサービスとをつなぐ部分で、思いのほか時間を要してしまったのが原因です。

# 試行錯誤の過程

## Scratch と外部のオンラインサービスとの接続

Scratch は、いくつかのバージョン（1.4、2．0、現時点でβ版である3.0）や、オンライン版／オフライン版があります。
当初は、上記の小型ドローン Tello の話のときに利用した、Scratch 2．0 のオフライン版を利用しようとしましたが、どうやら、外部のオンラインサービスと直接やりとりができないことが分かり・・・。

ローカルに [Node.js](https://nodejs.org/ja/) などを利用して、仲介役のサーバを用意すれば良さそうでしたが、何か他にやり方がないか、さらに調査をしました。
その中で、ふと、サービス間連携でよく利用される[「IFTTT」](https://ifttt.com/) を活用できないだろうかと思い、『Scratch IFTTT』というキーワードで検索そして、下記の情報にたどり着きました。
　[IFTTT · savaka2/scratch-extensions Wiki · GitHub](https://github.com/savaka2/scratch-extensions/wiki/IFTTT)

内容を見ていくと、どうやら Scratch の実験的拡張機能をテストするためのプラットフォーム ScratchX のIFTTT拡張のようでした。
このページに書かれた説明や、[拡張のJavaScriptのソース](http://savaka2.github.io/scratch-extensions/ifttt.js#scratch)を読みつつ、ページ内にあった[デモへのリンク](http://scratchx.org/?url=http://savaka2.github.io/scratch-extensions/demos/ifttt.sbx)を触ってみたりして、とりあえずScratchからの情報送信が行えるかをテスト。

「ScratchX でキーが押されたことを検出して、IFTTT経由でスマホに通知を送る＋通知のメッセージ内にパラメータ3つの値を含める」ということが実現できました（出力側をスマホへの通知にしたのは、簡単に試したり確認したりできるためです）。
なお、ScratchX と IFTTT のそれぞれで行ったことは、主に以下の内容でした。
　IFTTT：
　　A-1）Webhookでリクエスト・パラメータを受け取ることができるよう設定（アプレットを作成1）
　　A-2）リクエストを受け取ったときに、スマホにパラメータを含んだメッセージを送るよう設定（アプレットを作成2）
　　A-3）Webhookでリクエストを送るときに必要になるキーの情報を確認
　ScratchX： 
　　特定のキーが押されたことを検知したブロック、上記のA-3）の情報を設定するブロック、Webhookのリクエストを送るブロックをつなげる

## IFTTTとenebularの接続

ひとまず、IFTTTで「スマホに通知を送る」と仮に設定した部分は、最終的には「enebularへリクエストを送る」という内容にしなければなりません。
そこで、そのやり方が書かれた下記の記事を検索して参照しました。
　[Google Homeで家の照明制御をするときのログを見てみたいのでenebularで可視化 | enebular blog](https://blog.enebular.com/infomotion/google-home-meets-enebular/)

上記の記事を参考に、enebular と IFTTT のそれぞれを、以下のようにします。
　enebular：
　　B-1）上記の記事の「IFTTTのenebularへ送るしくみ」を参考に、IFTTTからの値を受ける入り口を作成
　　B-2）上記のB-1）の出力を、とりあえずデバッグにつなぎ、デバッグウィンドウに表示するよう設定
　IFTTT：
　　C-1）Webhookでリクエスト・パラメータを受け取ることができるよう設定（アプレットを作成1）
　　C-2）上記B-1）のリクエストを受け取ったときに、Webhookでリクエスト・パラメータを送るよう設定（アプレットを作成2）
　　C-3）Webhookでリクエストを送るときに必要になるキーの情報を確認

これで試したところ、ScratchX で送ったパラメータの値が enebular のデバッグウィンドウに表示されるのが確認できました。

# まとめ

今回、Scratch（ScratchX） と enebular の間でのやりとりを、IFTTT を使うことで実現できました。

本来は、さらにここから Scratch側の作り込みや、enebular の出力先をカスタマイズをしたかったのですが、ここまでで想定以上に時間がかかってしまったので、それはまた別の機会に。
（ひとまず書き終わって内容を振り返ると、ScratchX の拡張に手を入れて enebular に直接リクエストを送るようにすれば、それらの間のIFTTT が不要になる気がする・・・）

# その後の追記
本記事での、あまりの enebular 要素が少なかったので、以下の内容を別記事で書きました。
　[enebular editor をMacで試してみる](https://qiita.com/youtoy/private/58f2f69e4e561842fd73)