Pepper SDK入門(25) QiChatVariableで会話内容をメタモルフォーゼする

#※今回はQiChatVariable解体新書の回です🩺
Variableとは変数です。辺陬ではありません。🌾
QiChatVariableは、Topicファイルの内容の一部を後からユーザの入力で変更できるようにしてくれるのです。
同じ言葉を言われても、昨日と今日では返したい言葉が違うかもしれません。昨日は規格水槽に入っていた脳が今日はキューブ水槽に入っているとしたら、脳入りの水槽の種類を第三者から問われた場合に違う返答を行う必要があります。[^1]
[^1]: 水槽の脳という仮説が元ネタ
そんな時のために、Topicファイルに変数を定義して、アプリのコードから動的に返答を変えることができるようになっています。
早速、ハウツー&#x270c;を見ていきましょう。

#QiChatVariableのトリセツ🐓
##Get Variable🧩🌃
QiChatbotのTopicファイルから、QiChatVariableを取得しましょう。

```java
QiChatbot qiChatbot = QiChatbotBuilder.with(qiContext)
                                      .withTopic(sample)
                                      .build();
QiChatVariable nameVariable = qiChatbot.variable("vat");
```

Topicファイルの内容は以下のとおりです。

```
topic: ~sample()
proposal: %read ^first["今 $vat にいます" $vat=$1]
u:(どこ) $vat です
```
%readがBookmarkになります。Bookmarkを設定することで、アプリ側から指定のBookmarkを開始させることができます。🎉
proposalは、配列やHashMapのように発話内容をちょっとだけ構造化するときに使う記述法です。📝詳細は別途説明予定ですが、今回は発話したい内容をproposalで書いておいて、アプリ側からBookmarkを指定して発話を開始する流れになっています。🗣⚾
^firstはその後に続く発話内容の配列を先頭からチェックして、発話できるものが見つかったらそれを返す関数のようなものです。Topicファイル内で変数(今回は$vat)を使っていて、変数が未設定の場合などは発話できないと判定されます。🔇

##変数を読み書きする🗒✒️
取得したQiChatVariableの値は変更可能です。*All change is butterfly*🦋[^2]

```java
QiChatVariable nameVariable = qiChatbot.variable("vat");

nameVariable.setValue("らんちゅう水槽");
String name = nameVariable.getValue();
nameVariable.addOnValueChangedListener(currentValue -> Log.i(TAG, "onValueChanged: " + currentValue));
```
[^2]: butterfly effectという考え方が元ネタ。水槽の種類を変えたことで脳がヒレを獲得したり泳げるようになるかもしれません。

以上の利用法は、<ins>[Git](https://github.com/aldebaran/qisdk-tutorials/tree/master/app/src/main/java/com/softbankrobotics/qisdktutorials/ui/tutorials)</ins>のMastering QiChat Variableで手軽に体験ができます。✋←軽すぎて浮遊する手

下記はサンプルアプリの内容を少し変更したものです。入力欄に単語を記入して黒猫のボタンを押下してみると…
![スクリーンショット 2021-02-22 13.32.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574697/01af77eb-442b-6405-c816-c704a0ac2d9c.png)
![スクリーンショット 2021-02-22 13.33.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574697/b22240e7-c335-a375-523a-7b2555d0b267.png)
入力欄の言葉次第で、今いるところは簡単に変更できます。🚂🎁
![スクリーンショット 2021-02-22 13.34.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574697/55a91950-d712-cc48-3cbe-9ecb28e0069a.png)
![スクリーンショット 2021-02-22 13.35.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574697/19be3769-5ec1-455e-5b2d-25aa3d18b952.png)

上述したようにコードから現在地を書き換えることも可能です。⛅️🗺
![スクリーンショット 2021-02-16 13.30.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574697/18c13ddd-4b3c-dc9f-779a-dc0a06e36ecc.png)


#あとがき
今回も[PepperSDKforAndroid](https://android.aldebaran.com/sdk/doc/pepper-sdk/ch4_api/conversation/reference/qichatvariable.html#)を参考に書かせていただきました。
さらに詳しい情報は[QiChatVariableのAPIリファレンス](https://android.aldebaran.com/sdk/doc/javadoc/qisdk/com.aldebaran.qi.sdk.object.conversation/-qi-chat-variable/index.html)を参照してみてください。

次回はBookmarkとBookmarkStatusのお話です🔖。ラフレシア・アルノルディイ[^3]やハエトリグサ[^4]で押し花の栞[^5]を作りましょう。[^6]
[^3]: 直径90cm程ある世界最大の花として知られている
[^4]: 英語名はVenus Flytrap。The Venus Flytrapsというバンドは実在するが、ハエトリグサというバンドは恐らくいない
[^5]: Bookmark=栞の意。諸星大二郎作『栞と紙魚子』に登場する栞の意ではない
[^6]: 作りません。
それでは〜🔺🟩
<img width="100dp" alt="senkouhanabi.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574697/4d09463f-9330-9d65-36ed-453a674f70d8.gif">