IBM Watson Conversationサービスの初心者向け講座 (2) Dialog ノードのresponseの実行条件

[IBM Watson Conversation](https://www.ibm.com/watson/jp-ja/developercloud/conversation.html)はチャットボットのようなUIサービスを簡単に作成できるサービスです。

サービス内容も興味深いのですが、実は、プログラミング環境としても面白いものです。また変更がすぐにチャットに反映されわかりやすいので、実はプログラミング初心者にも良い入門教材かもしれません。

## 今回の内容は

前回の [環境設定とDialogの基本](https://qiita.com/yamachan360/items/c47d37cb9317f0328198) はノードの3つの構成要素、condition(実行条件)、respond(実行内容)、finally(実行後の対応)を説明し、また実行の様子を観察する方法も紹介しました。

今回は新規作成したワークプレースに対して、いよいよDialogの開発を始めましょう。まずは初期ノードの設定を変更して試していきます。

## 日時を表示してみる

Dialog の画面って、ノードが四角で表示され接続された、グラフィカルユーザインタフェース(GUI: Graphical User Interface)なので、いわゆるプログラム言語とは関係ないように見えていないですか？

いえいえそんなことはありません！Dialogもちゃんとしたプログラミング環境で、いろんな処理を記述できるんですよ。

とりあえずDialogの最初の「ようこそ」ノードを開き、「いらっしゃいませ。ご用件を入力してください。」のあいさつ文の後に &lt;? now() ?&gt; を追加してください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/4a85d62c-6f87-32f1-2f15-505761ffc502.png)

右上のチャットアイコンをクリックし、チャット用の領域(Try it out)を表示すると、挨拶のあとに日時が追加されています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/ae898d5c-c05c-63e0-bcad-626f892266f3.png)

## 計算してみる

応答文などを表示する際、&lt;? と ?&gt; で囲まれた領域は、内部でプログラムとして実行され、その結果に置き換わります。

当然ながら計算もできます。さきほどの &lt;? now() ?&gt; を  &lt;? (3 + 4) / 2 ?&gt; に変更してみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/560a2657-b82f-09e1-74d2-eb1c6f9cfce9.png)

チャット用の領域(Try it out)を表示すると、挨拶のあとに数値が追加されていますね。さきほどの計算式が実行され、その結果が表示されています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/cc0834fa-dbcc-47a0-1af1-2ecb5a0844d7.png)

※ 計算結果は 3.5 なのですが、小数点以下は切り捨てられ、3 が表示されています

ここで利用している構文は [SpEL: Spring Expression Language (英語)](https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#expressions) という規格ですので、興味ある方は調べてみてください。この講座でも少しずつ説明していきます。

さて、&lt;? XXX ?&gt; 表記を理解したところで、先に進みましょう。さきほどの &lt;? (3 + 4) / 2 ?&gt; は削除しておいてください。

## 日時を利用してみる

さて、この日時を実際に、実用的なサンプルとして利用してみましょう。

会話の最初に表示される「ようこそ」ノードの挨拶文ですが、これを時間にあわせて変えてみましょう。今回は午前中の会話では「いらっしゃいませ」のかわりに「おはようございます」と言わせてみます。

まず「ようこそ」ノードの詳細をひらき「Add response」をクリックしてresponse(応答)を追加します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/932ae645-c894-9611-3efa-590f57c80f4d.png)

そして追加された2つ目のresponseには、1つ目と同じ「いらっしゃいませ。ご用件を入力してください。」という文字列を指定します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/22d14bde-4e93-9617-ff80-deb7909a3727.png)

そして1つ目のresponseの条件の部分に now().before('12:00:00') という式を入力します。またあいさつの文字列を「おはようございます」に書き換えます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/9e2c9a23-ec8e-e365-c0fa-72a0eb4f7b7b.png)

ここまでの修正で、「ようこそ」ノードは以下のようになっているとおもいます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/9022f3e1-bc8b-ac07-10a3-7015dfd6a399.png)

さて！チャット用の領域(Try it out)を表示してみましょう。今が午前中(12:00より前)であれば、次のような最初の挨拶が表示されるはずです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/7c106437-a094-1f66-d8c6-b9cc6117fb4d.png)

そして午後(12:00以降)であれば、次のような最初の挨拶が表示されるはずです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/30bdc4e0-91f6-5d03-0411-d7b9430435bc.png)

小さな修正ですが、これでWatson Conversationの応答が少し自然になりました。

## 使用した命令文について

さて、さきほどconditionに利用した以下の式について、もう少し見てみます。

```
now().before('12:00:00')
```

まず最初の now() および before() 関数ですが、参考文献 [Methods to process values (英語)](https://console.bluemix.net/docs/services/conversation/dialog-methods.html#methods-to-process-values) の [Date and Time](https://console.bluemix.net/docs/services/conversation/dialog-methods.html#date-time) に説明があります。

英語なので簡単に訳しておきますね。

> **Date and Time**
日付と時間と共に動作する幾つかのメソッドを利用できます。
>
**.after(String date/time)**
対象の日時が指定した日時(date/time)より後かどうか確認する。
類似メソッドは .before()
**.before(String date or time)**
例：@sys-time.before('12:00:00')
　　@sys-date.before('2016-11-21')
対象の日時が指定した日時(date/time)より前かどうか確認する。
もしtime 対 date、date 対 time、time 対 dateとtime、など異なったアイテムを比較した場合、このメソッドは偽(false)を返し、JSONログ output.log_messages に例外を記録する。
dateとtime 対 time を比較した場合に限り、このメソッドは date を無視して time だけを比較して結果を返す。
>
**now()**
静的(Static)な関数。
現在の日付と時間を <code>yyyy-MM-dd HH:mm:ss</code> フォーマットの文字列で返す。
この関数が返す日時に、他の日時用の関数を使用することができ、またそれらの引数として使用することもできる。
もしcontext variable(文脈における変数)の $timezone がセットされていれば、この関数はそのクライアント環境におけるタイムゾーンに従った日時を返す。

この説明を読めば理解できるとおもいますが、<code>now()</code>関数で現在の日時を得て、<code>.before('12:00:00')</code> を適用することで12時前かどうかを判断している、わけです。

「ようこそ」ノード全体でみた流れは以下のようになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/0d79c337-0225-ea73-989b-0a6b1bf38e9d.png)

## 自由課題

この講座では朝の「おはようございます」だけ実装しましたが、夕方には「こんばんは」など、更なる拡張の余地があります。深夜にはまた違うメッセージだと更にいいですね。

respond をもうひとつ追加して、<code>now().after('18:00')</code> などを条件に… おっと、ヒント出し過ぎですかね。

あなた自身で実装してみて、ぜひ自分のConversationに組み込んでみてください！

## まとめ

さて今回、はじめて実用的なサンプルが出てきましたが、如何でしょうか？

私自身、いくつかの入門資料を読んだのですが、この最初の挨拶を変更する方法がなかなか説明されていなかったんです。最初に見る文言で、最初にいじってみたい部分なのに勿体ない… ということで、この講座の最初の題材にしてみました。

いきなり [SpEL: Spring Expression Language](https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#expressions) が出てくるのも異質な気もしますが、でも、何かしらのプログラム言語を経験したことある方なら、これも結構、わかりやすい入口だと思うのです。

さて、[次回](https://qiita.com/yamachan360/items/e332e9a9ea5f850bc239) もDialogの設定を試していきましょう！

## ライセンス

今回の講座シリーズに含まれる私の作成したコード・画像・文章などは全て [Creative Commons Zero](https://creativecommons.org/publicdomain/zero/1.0/deed.ja) ライセンスとします。自由にお使いください。

## 参考文献

* [Building a dialog (英語)](https://console.bluemix.net/docs/services/conversation/dialog-build.html#context)
* [SpEL: Spring Expression Language (英語)](https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#expressions)
* [Accessing and evaluating objects (英語)](https://console.bluemix.net/docs/services/conversation/expression-language.html#accessing-and-evaluating-objects)
* [Methods to process values (英語)](https://console.bluemix.net/docs/services/conversation/dialog-methods.html#methods-to-process-values)