enebularでTwitterAPI連携してNoodlに表示する

#ふわもこ部とは
突然ですが、ハッシュタグ「#ふわもこ部」をご存知でしょうか？
猫や犬、鳥、フワフワモコモコした動物たちの写真や動画に付けられる動物好きにはおなじみのハッシュタグです。
ハリネズミも腹部はフワモコなので、このハッシュタグが付けられることがあります。
癒やされるので#ふわもこ部、ぜひチェックしてみてください。

#\#ふわもこ部ツイートがされたらその画像を表示したい！
今日作るのはコレ！
誰かが#ふわもこ部 ツイートを投稿したら、ツイートに添付されてる画像を表示するデジタルフォトフレーム！
<blockquote class="twitter-tweet" data-link-color="#FAB81E"><p lang="ja" dir="ltr">enebular でツイッター連携してNoodlで表示の巻 <a href="https://t.co/J8RZYDiVoc">pic.twitter.com/J8RZYDiVoc</a></p>&mdash; はりねずみ麺 (@hedgehog_noodl) <a href="https://twitter.com/hedgehog_noodl/status/1160180522854653952?ref_src=twsrc%5Etfw">August 10, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

enebularを核としてTwitter API・Noodlをつなぎます。

#【enebular】Twitter APIをつなぐ！
<img width="1499" alt="スクリーンショット 2019-08-10 22.28.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480279/1077d4e6-ccdb-abea-4177-01ea0abe01f8.png">

フローはこんな感じです。バックエンドのコード書かないでTwitter APIが使えるだなんて最高！

##twitterノード
検索条件: \#ふわもこ部
出力: tweet

debugノードの設定「対象」は常に「オブジェクト全体」に設定すると良い！

##functionノード
Twitter APIから受け取ったオブジェクトの中から、ツイートの文章と画像のURLだけを抜き出して返す関数です。
画像はついている場合とついていない場合があるので、
2行目でTwitterオブジェクトに「media」キー（画像URLのプロパティが入っている場所）が含まれているか否かを判定しています。
画像が含まれている場合のみ、メッセージを返します。

```Javascript
var media = "";
if ("media" in msg.tweet.entities) {
    media = msg.tweet.entities.media[0].media_url;

    msg.payload = {tweet: msg.payload,
    media: media
    };

    return msg;
}
```

すごく大事なことなのですが、NoodlとMQTT通信するときは、
**ネスト（入れ子）になっていないJsonまたはJSオブジェクトで送りましょう！**
（ネストされてても受け取れるけど、Noodl側でJavascriptノードを使ってあれやこれやする必要がある。）

- tweet: msg.payloadはツイートの文章
- media: media は画像のURL

##mqttノード（出力）
enebular-Noodl間はMQTTでやり取りをします。
ブローカーは[shiftr.io](https://shiftr.io/)を使っています。

トピック: firstMessage（任意のものでOKです。あとでNoodlでも使用します。）

画像ではJsonノードが入っていますが、別に必要ありませんでした。
functionノードから直接mqttノードでOKです。

#【Noodl】フォトフレームを作る

##enebularからデータの受信

![スクリーンショット 2019-08-10 19.30.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480279/29fc0061-4f65-ddb0-0d3f-978624dced00.png)
Receive Messageノードを使います。
- Topic: /firstMessage （enebularのmqttノードのトピックと同じ設定に）
- Payload: 「tweet」「media」の２つを追加。（enebularのfunctionノードで指定したキーと合わせてください。functionノードの5・6行目参照）

設定ができたら、図のようにReceive MessageのPayload tweetはtextノードに、mediaはimageノードのImage Pathにつなぎます。

うまく表示されていれば成功です！

##ディゾルブ表現を作る
やっぱりフォトフレームといえばディゾルブ表現ですよね。
ジワッと変わるやつ。
![dissolve.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480279/5a1e4793-e638-2e8a-8ae7-1246038f6605.gif)

2枚の写真を重ね、\#ふわもこ部への新規ツイートをトリガーにそれぞれ写真の透明度を変えることで表現します。
使うノードは図の通り。
<img width="1074" alt="スクリーンショット 2019-08-10 23.12.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480279/fbaa57f7-1a88-6054-0c30-263d2349af70.png">

- Counterノード: enebularからツイッター情報を受け取るたびに+1カウントします。
- Expression: ` count%2 == 0` カウンターが2の倍数のときにtrueを返す
- Inverter: Expressionノードと逆のリザルトを出力する（=2の倍数じゃない時にtrueを返す）
- States: 2枚の画像の不透明度を制御します。図のようにプロパティを入力、つないでください。
- Model: 届いたURLを保持する
    - pic1 idをpic1、Properties「img」を追加。counterが**2の倍数のとき**にデータを保存する。
    - pic2 idをpic2、Properties「img」を追加counterが**2の倍数でないとき**にデータを保存する。


###さらにディティールをつめてく

ここまでで、ジワッと画像を変更することはできるのですが、画像が変わる時に白っぽくなるのが気になるので細かい調整をしていきます。
2枚の写真と、その上にスタックされているRectangleノードに注目。
<img width="131" alt="スクリーンショット 2019-08-10 23.29.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480279/82a94e5b-3218-fe2c-22b6-27abe2276746.png">

- Rectangle: Colorを`#000000`に設定
- Image: Blend ModeをAddictiveに設定（2つとも設定してください）

これで理想のディゾルブ表現ができました！
Addictiveは加算。この辺の設定はPhotoshopっぽいですね。

#Noodlのプロジェクトファイル
[Noodlのプロジェクトファイルはこちら](https://github.com/Mizuki07/noodl/tree/master/Enebular/mqtt_rest_enebular)

#本編とあまり関係ない話
enebularのスペルを頻繁に打ち間違えてしまう！！！
ちなみにミスりポイントは以下の通り！辞書に単語登録するか・・・
![IMG_1811.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480279/004cf55d-ba36-5be4-5631-8e746e58bb3a.jpeg)