プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

2019年度のUDC三重のキックオフイベントに参加してきました

少し前になりますが、去る 2019 年 7 月 27 日(土)に四日市で開催された、2019年度のアーバンデータチャレンジ(UDC)三重のキックオフイベントに参加してきました。 もっとも、参加と書いてますが、主催のUDC三重実行委員会のメンバーでもあるので、主催側の一員としての立場なんですがね。

f:id:junichim:20190804234539j:plain

せっかくなので、イベントの様子のご紹介と個人的に感じたことをつれづれと書いておきます。 ちなみに、イベントサイトはこちらになります。

udcmie.connpass.com

アーバンデータチャレンジについて

さて、いきなり、UDC三重のうんぬんかんぬん、と書かれてもなんのこっちゃ?となると思いますので、アーバンデータチャレンジ(Urban Data Challenge, UDC)というイベントについて、私なりにご紹介しておきます。

公式サイトはこちらですね。

urbandata-challenge.jp

さて、私なりの理解では、UDCというイベントは、

『(オープン)データを利用して、地域の課題を解決しよう』

ということを目的にした活動で、そのための手段として、

  • コミュニティを作りましょう
  • コンテストを開催します

という2つがあるようです。

前者は、各地域(基本的には都道府県)に『地域拠点』というのを作って、そこがあれこれ啓蒙活動をするようなイメージです。 三重の場合は、私も参加している、『UDC三重実行委員会』という任意の団体があり、そこが県や市と連携して活動しているイメージです。他の地域拠点さんの活動を見ていると、 Code for ○○ とかが主体となって動いているところが多いように見受けられます(もちろんそうじゃないところも多数ありますよ)。
ちなみに、UDC三重実行委員会は活動の趣旨のご賛同いただける方であれば、ご参加いただけますので、興味があるという方は是非ご連絡ください。

後者のコンテストは、毎年行っている地域課題の解決を目的としたコンテストで、アプリケーション・データ・アイデア・アクティビティの4部門に分かれているというものです。昨年の受賞作品などはこちらから見ることができます。コンテストの応募はどなたでも可能(詳細は毎年の応募要項をご覧ください)です。

まあ、オープンなデータを使って、身近な問題について考えましょう、という活動といったところでしょうか。

個人的には、この一連のイベントに参加することで、オープンデータそのものやオープンデータを使うための技術、オープンデータを使った事例などをいろいろ知ったり理解できたりsるきっかけにしたいと思って参加しています。

一応、当日私が発表したアーバンデータチャレンジについての説明資料もあるので、リンク張っておきますね。

www.slideshare.net

間違い等あれば、ご指摘ください。

キックオフイベントのタイムスケジュール

イベントのタイムスケジュールは、こんな感じでした。

時刻 内容
13:00 開会
13:00~14:20 参加各団体などのご紹介とご挨拶
14:20~14:35 アーバンデータチャレンジの紹介(2018結果報告ならびに2019のテーマ発表など)
14:35~14:50 休憩
14:50~16:00 講演
・今年度の活動予定
・三重大学「北勢サテライト」「健康福祉システム開発研究会」の紹介
・三重県の少子化対策
など(詳細未定)
16:00 閉会

UDC三重の活動にかかわる各団体さんからのご挨拶に加えて、アーバンデータチャレンジの概要の説明、がありました。

それらに引き続いて、今年の三重拠点の活動テーマが『少子高齢化を斬る!』ということなので、これに関連して、三重大の活動と三重県の少子化対策の担当さんからお話をいただいました。

最後にアーバンデータチャレンジの今年の動きについての話がありました。
去年までで全都道府県からの地域拠点の応募があったそうで、今年から5年をセカンドステージとして位置付けて、より一層の広がりを目指していくそうです。そのための一つの方法として、コンテストの応募部門を、既存の4部門から下記の10部門に変更にするそうです(もちろん、詳細は今年度のコンテストの応募要領が発表になってからそちらをご確認ください)。

変更前 変更後
データ 道路・交通
アプリケーション 河川・港湾・上下水道
アイデア 住宅・土地・公園・公共施設
アクティビティ まちづくり・都市計画
農業・林業・漁業
産業・観光
医療・健康
生活・文化・地域アーカイブ
教育・政治
防犯・防災

雑感

個人的には、いろいろは話が聞けて面白かったです。
特に少子化関連の話では、合計特殊出生率を増やすことだけが少子化対策ではなく、少子化が進んだ時に困らないようにするにはどうすればよいのか?という視点もあるよ、という話は印象的でした。

とはいうものの、参加した方によっては受け取った印象は様々だったようで、いろいろな方とお話をしていると面白いと受け取らなかった方もいらっしゃいました。
そういう意味でも、この手の地域課題などを考えるときは、いろんなバックグラウンドを持つ方が参加することで、様々な考えに触れることができる(そのうえで、面白いアイデアが出てくる)んだろうなと改めて思ったところです。

上記とも絡むのですが、参加者の多くが関係団体の方だったことも改善したいところも一つですね。関係団体の方がいらっしゃるのはそれはそれでうれしいのですが、どうにかして、もっと裾野を広げたコミュニティにしていかないと、活動自体が形骸化したり、単調なものになってしまう恐れがあるように感じています。

イベント会場について

最後にPRも兼ねて、今回のイベント会場について書いておきます。
今回は、近鉄四日市駅の駅ビルの近鉄百貨店の7FにあるSYNTHさんをお借りしました。SYNTHさんには、会場協力の形でイベントを応援していただきました。ありがとうございました。

mie.synth.co.jp

公式サイトの写真でもわかるように、いまどきのおしゃれなスペースですね。こちらは貸会議室の他にも、コワーキングスペースやレンタルオフィスとしての利用も可能です。
近所にあれば、ぜひ使いたいところです。伊勢にも作ってくれませんかね?>近鉄さん

ご興味を持たれた皆様!ぜひ、一度足を運んでみてください!

最後に

今年もUDC三重の活動にかかわっていきますので、少しでもご興味を持たれましたら、ぜひイベント等に足を運んでいただければと思います。 よろしくお願いします。

OSC名古屋 2019 に出展してきました

先日(2019年7月16日)、OSC名古屋が開催されました。

今年もここで、『三重勉強会・コミュニティ共同ブース』として出展してきました。

当日の様子

会場の雰囲気はこんな感じ。

f:id:junichim:20190716100530j:plain

ブースはこちら。

f:id:junichim:20190716100624j:plain

今年は三重で開催されている勉強会や各種コミュニティを紹介する一覧表を作って、それを置いておきました。 チラシを置いておくだけなので人手はいらないのですが、当日は私と Hackers:桑名 の方の二人で対応しました。

ちなみに当日配ったチラシはこんな感じです。

f:id:junichim:20190716100653j:plain

せっかくなので、リンクも貼っておきます。

ご興味を持たれた方、ぜひその団体さんをフォローして、イベント情報などをチェックしてみてください。

今年の印象

去年のOSC名古屋に出たときの記事で、なんでこんなことしているのかについて書いたので、それについては過去記事をご覧ください。

ざっくりした今年の印象だけ書いときます。
今年はなんとなく去年よりも、三重出身者の方で今は別のところに住んでいるという方が多くいらしてたように思えます。ぜひ、帰省のタイミングとかとイベント開催日が合ったときは気軽に顔を出していただければなと思います。

あと、新たにあったパターンとして、『あるイベント等を三重県で開催したいので、既存にどんなコミュニティがあるのか知りたい』というような主旨の方もいらっしゃいました。もともと三重って勉強会やコミュニティの活動が少ないので、なかなか情報が集められないというのがあるんでしょうね。ぜひ、三重でも新しい活動を始めていただけるとありがたいです。

少しでも、三重の勉強会・コミュニティさんの活動が活発になることを願います。

最後に

元々は名古屋の勉強会さんのほうで『名古屋勉強会・コミュニティ協同ブース』という形で出されたいたのをまねて、OSC名古屋2017 からこういった共同ブースでの出展をやってます。
地方だと自分たちの地元で OSC が開催されていなくても、近隣で OSC がある場合は、こういった形で自分たちの地域にもコミュニティがあるよ、とPRするのも一つの方法なんじゃないかと思います。

追記

大事なの書くの忘れてました。

OSC名古屋参加時のアンケートに答えたら、モバイルバッテリー当たりました。

f:id:junichim:20190716161740j:plain

ありがとうございます。

ということで、いいことあるかもしれないので、お近くの OSC に遊びに行きましょう!

Dialogflow のチュートリアルを試してみた : events を使って書き換え (2/2)

Dialogflow のチュートリアルを試した続きです。

blog.mori-soft.com

上の記事で Dialogflow のチュートリアルを試しまして。ここでは、 context と fulfillment を使って、会話の流れを制御しています。

個人的には、このスタイルだと、 context を操作しているのが、 Intent の output context の箇所と fulfillment のコードに分かれていて、ちょっと気持ち悪いなと感じています。

Dialogflow のドキュメントを読むと Events という機能があり、ユーザー定義の Custom Event も扱えるようです。

そこで、この Events 機能を使い、context を直接操作するのではなく、 Event により Intent を切り替えて、 Intent の output context でコンテキストを制御するようなスタイルにしてはどうかと考えました。そうすると、

  • contexts : Intent で制御
  • events : fulfillment で制御

と分けることができるので、すっきりするかな?という目論見です。 ということで、やったことをメモっときます。

Events 機能について

Events 機能そのものについては、公式ドキュメントなどを参照してください。

あと、下記の記事なども参考にさせていただきました。

Dialogflowのeventを使ってみる。 - Qiita

Events を使った場合の処理

元々のチュートリアルでは、下記のところで context を切り替えていました。

  • fulfillment の checkAppintment 関数:予約が埋まっていた場合に context を reservation-followup から reservation-suggestion に切り替え
  • fullfillment の suggestAppintment 関数:『提案』機能をユーザーが了解したのち、 context を reservation-suggestion から reservation-followup に切り替え(元の予約のコンテキストに戻す)

これを Events を使う形にしたいと思います。

checkAppointment 関数でのイベント

Webhook からイベントを投げるには、 followupEventInput オブジェクトをレスポンスに追加してあげればOKです。
ここでは、 イベント名 suggest をパラメータ付きで投げます。

  if (flg) {
    response.fulfillmentText = `了解しました。 ${date} 日の ${time} 時の予約でよろしいでしょうか?`;
  } else {
    // event を発行
    response.followupEventInput = {
      name: "suggest",
      languageCode: "ja-JP",
      parameters: {
          date: date,
          time: time,
          suggested_time: "2019-07-22T13:00:00+9:00"
      }
    }

suggest イベントを受け取る Intent の追加

投げられた suggest イベントを受け取る Intent を新規に追加します。この Intent の名前を suggestion とします。

f:id:junichim:20190627143659p:plain

Intent を作成したら、 Events を開いて、『suggest』と入力して、保存すればOKです。これで、 suggest イベントが投げられれば、この Intent が呼ばれます。
また、今回はユーザー入力ではなくイベントにより呼び出すため、 Training phrases は空欄のままとします。

次に、 suggest イベントと共に渡されるパラメータを受け取るために、下記のようにこの Intent に対してパラメータを設定します。

f:id:junichim:20190627114054p:plain

パラメータの設定において、 Value 列に対して #event_name.parmeter_name という形式を指定することで、イベントパラメータで指定されたパラメータを Intent のパラメータとして扱うことが可能になります。このようにすると、この Intent の followup intent を定義した際に、パラメータを参照することが可能になります。

なお、Parameter Value については公式ドキュメントのこちらの記事などに詳しく記載されています。

Response の欄には、 suggest イベント発行により、この Intent が呼ばれた際に表示したい Response テキストを設定しておきます。

f:id:junichim:20190627114137p:plain

『最初に指定した日時が埋まっていたので、別の日程を提案しますよ』、という旨の文章を表示するようにします。

なお、この Intent に対する fullfilment は不要なので、 fulfillment は無効のままとしておきます。

suggestion インテントの followup インテント

上記の suggestion インテントへの応答を受け取るために、yes および no の followup インテントを作成しておきます。

f:id:junichim:20190627114638p:plain

reservation の時と同じく yes の followup インテントについては fulfillment を有効にしておきます。

suggestAppointment 関数でのイベント

この関数は、 suggest 処理で別の予約日時を示して、ユーザーが提案を受け入れる、とした際に呼ばれる処理になります。 イベントを使った場合は、 suggest インテントに対して、ユーザーが肯定の応答をた歳の、 suggestion - yes の Intent に対して呼ばれることになります。

なので、最初に Intent に応じて振り分ける処理を修正します。

    // intent と対応するハンドラ関数のマップを生成
    let intentMap = new Map();
    intentMap.set('reservation', checkAppointment);
    intentMap.set('reservation - yes', makeAppointment);
    intentMap.set('suggestion - yes', suggestAppointment);

chckAppointment 関数と同様に、イベントを投げるには、 followupEventInput オブジェクトをレスポンスに追加します。
今回は、イベント名 suggest-agree をパラメータ付きで投げます。

  // event を発行
  response.followupEventInput = {
    name: "suggest-agree",
    languageCode: "ja-JP",
    parameters: {
        suggested_time: suggested_time
    }
  };

なお、この関数の先頭で context を取得する際は、 suggestion-followup になるので、そこも修正しておきます。

async function suggestAppointment() {

  console.log("suggestAppointment called");

  const context = getContext(response, "suggestion-followup");

suggest-agree イベントを受け取るインテント

最後に、 suggest-agree イベントを受け取るインテント suggestion-agree を定義します。

f:id:junichim:20190627143925p:plain

suggest インテントと同様に、パラメータを定義して、イベントで投げられたパラメータをこの Intent のパラメータに割り当てます。

f:id:junichim:20190627141513p:plain

なお、fulfillment で context を切り替える方式だと、ユーザーに返す応答文も fulfillmentText で一緒に定義していましたが、イベントの場合は呼び出された Intent 側で設定する必要があります。

また、この Intent の output context を reservation-followup とすることで、提案がない場合のコンテキストへ戻すことを行っています。

動作

全体の動きは、チュートリアルと同じなので割愛します。イベントを使った処理の部分だけ、見ておきます。

ユーザーが『予約をしたい』と入力して、日付と時間も指定後、fulfillment 処理の中で、checkAppointment 関数がよばれます。 checkAppointment 関数では、(本来なら予約の有無を確認しますが、ここでは乱数で決めている)予約が取れない場合に、suggest イベントを発行します。

f:id:junichim:20190627142518p:plain

すると、上記のように(suggest イベントが発行されることで) suggestion インテントが呼ばれます(画面からはイベントが発行されたことはわかりません)。画面上では、想定していた Intent および Parameters の欄が想定通りになっていることが確認できます。 また、 context は suggestion-followup になり、返答を受け取る準備ができていることがわかります。

ここで、提案を受け入れるため、『はい』などとユーザーが入力すると、

f:id:junichim:20190627145600p:plain

のように、応答メッセージが表示されます。また、通常の応答処理になるように context が reservation-followup に切り替わっていることがわかります。

これで、fulfillment 内の context 切り替えで行っていた処理を events を用いて代替することができました。

ソース等はリポジトリをご覧ください。

比較

さて、公式チュートリアルを、 context の切り替えと events を用いた方法の2つで同じ処理を実現してみました。

当初のイメージとしては、後者のほうが見通しが良くなるのではないか?というのがあったのですが、実際に両方試した印象としては、どっちもたいして変わらないかな、という感じです (全然参考になってなくて、すいません・・・)。

元々、context と event の用途が違うためかもしれません。

ドキュメント等を読むと、context は文脈を定義し、その文脈を利用することで同じユーザー入力を区別するために用いるとあります。 一方、 event はユーザー入力を介せずに、Intent を呼び出すためにあります。

となると、これは比較するために用いた例が、違いを際立たせないという意味で、あまり良くなかったのかもしれません。 難しいなー。

ちなみに、前者はチュートリアルのタイトルが、『 Build an agent from scratch using best practices 』となっているので、このような例の場合は context の切り替えがベストなんだろうか?という気もしてます。

正直、もうちょっといろいろと組まないと使い分けの勘所は見えなさそうです。

まとめ

まあ、そうはいっても、これで一通り Dialogflow を使ってみることができました。このチュートリアルでは Custom Entities などは試していませんが、そんなにややこしい印象はないので簡単に試せるかと思います。

さて、Dialoflow を使う準備ができてきたので、おいおい LINE WORKS でのボットの改良を進めようかと思います。