なかしょの技術日誌

業務でプログラミングをしなくなったのでプライベートで調査した技術情報を書き留めていきます。

LUISとAzure Bot Serviceを利用してMicrosoft Teamsで在庫管理ボットを動作させる

はじめに

この記事は「Microsoft Cognitive Services & Bot Framework - Qiita」の6日目になります。

概要

自身の前記事のいい加減さに反省して、もう一件記事を書きます。

LUISとAzure Bot Serviceを利用してMicrosoft Teamsで在庫管理ボットを動作させる例を紹介します。

LUISの構築やAzure Bot Serviceの構築はある程度省略しますので、
本記事を読み進める前に以下の記事を読んでいただけると理解が深まります。

beachside.hatenablog.com

beachside.hatenablog.com

LUISの設定

Phrase Listの設定

在庫管理対象となるものをPhrase Listに登録します。
今回はProductという名前で以下のように登録しました。

f:id:nakasho_dev:20161206010143p:plain

Entityの設定

製品のEntityとしてProductを登録します。
実際にはもっと子要素を増やすべきですがサンプルなので割愛します。

f:id:nakasho_dev:20161206010434p:plain

Intentの登録

製品の在庫数を取得するためのIntentをGetZaikoとして作成しました。
Actionパラメータには先ほど作成したPhraseやEntityのProductを指定し、NameもProductとしています。
(※違う名前にしたほうがわかりやすかったです。)

f:id:nakasho_dev:20161206010840p:plain

LUISを学習させる。

GetZaikoとなる文章パターンを覚えさせます。

f:id:nakasho_dev:20161206011212p:plain

f:id:nakasho_dev:20161206011221p:plain

何パターンかSubmitし、Trainで学習させ、Publishします。
「レモンの残りは?」のQueryの結果は以下のようになりました。

f:id:nakasho_dev:20161206013617p:plain

Azure Bot Serviceの実装

LUIS向けのAzure Bot Serviceの初期構築が完了している想定で進めます。

LUIS向けで構築する際に作成されるBasicLuisDialog.csxの末尾に以下のメソッドを登録します。

f:id:nakasho_dev:20161206013654p:plain

記事の可視性のためにメソッド内に処理をすべてまとめています。
実際はDBやWebAPI等からデータを取得することとなります。
今回、Entityが一つである前提のため、result.Entities[0].Entity という取得方法を実施していますが、通常はtypeやscoreの値をみて判断すべきだと思います。

Azure Bot Serviceのチャットウィンドウで動作を確認します。

f:id:nakasho_dev:20161206014211p:plain

期待通り動作しました。

Microsoft Teamsへの登録

https://dev.botframework.com/ にアクセスしてログインします。
Azure Bot Serviceでは作成した時点でMyBotsに登録されているところが便利だと思います。

f:id:nakasho_dev:20161206015126p:plain

Add another channel から Microsoft Teamsの行のAddを選択します。

f:id:nakasho_dev:20161206015144p:plain

Microsoft Teamsとの連携を有効にし、「I'm done configuring Microsoft Teams」のボタンをクリックします。

f:id:nakasho_dev:20161206015756p:plain

ChannelsにMicrosoft Teamsが加わりました。

f:id:nakasho_dev:20161206015803p:plain

Test linkの「Add to Teams」をクリックするとTeamsのアプリケーションが起動し、chatbotとのチャット画面が開きます。

f:id:nakasho_dev:20161206020455p:plain

以上でTeamsとの連携まで完了しました。

まとめ

在庫管理っぽいことをするボットを作成してみました。
例えば製品販売店であれば、実際の在庫管理システムとリンクさせたボットを公開し、顧客の購買部のメンバーが参加するTeamsに登録いただくなんてことも考えられます。
ボットを活用して問い合わせに対する時間が削減できるとよいですよね。

余談

なぜ、今回の記事の連携先にMicrosoft Teamsを選んだかというと、個人でOffice365 Business Premiumを契約しているけど、契約人数が一人のため、Teamsのチャットがつまらなかったからです。
もうこれで1人じゃないよ! このボットは自分自身への最高の誕生日プレゼントです。

Microsoft Bot Framework と docomo Developer Support 雑談対話APIの連携

はじめに

この記事は「Microsoft Cognitive Services & Bot Framework - Qiita」の5日目になります。

概要

Bot Frameworkと連携できるのはCognitive Serviceのみではありません。
本記事ではdocomo Developer Supportで提供されるAPIを使用して、Botアプリケーションを作成することで、チャットボットの可能性を広げて行きたいと考えています。
と大層なことを言っている割に雑談対話APIとの連携のみとなってしまいました。

docomo Developer Supportとは

docomo Developer supportをご存知でしょうか

dev.smt.docomo.ne.jp

サイトには以下のように紹介されています。

docomo Developer supportは、ドコモやパートナー企業が持つ様々なアセットを「API」として汎用化して提供し、開発者へ展開することで、新たな事業の創出を推進する協創プラットフォームです。ドコモは、中期目標に向けた取り組みとして、世の中の様々なパートナーの皆さまとのコラボレーションにより新たな付加価値を創造する「協創」を進めていきます。

どのようなAPIがあるか

| docomo Developer support | NTTドコモ

対話AI向けとして以下を提供しています。

雑談対話APIとの連携

パラメータは以下のページで紹介しています。

dev.smt.docomo.ne.jp

発言したいテキストのみをパラメータに渡しても問題ありませんが、botに話しかけるユーザの属性を付与することで、雑談の内容が変わるようです。

リクエスト

Bot Frameworkを利用したアプリケーションから以下の形式でリクエストを投げるようにしました。

  • リクエストURL

    https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue

  • メソッド : POST
  • 文字コード : UTF-8
  • リクエストヘッダ:Content-Type:application/json
  • リクエストクエリパラメータ
    • APIKEY(ユーザ登録後発行されるキーです)
  • リクエストボディ(JSON形式)

    {
    "utt": "こんばんは",
    "context": "100001",
    "nickname": "なかしょ",
    "nickname_y": "ナカショ",
    "sex": "男",
    "bloodtype": "A",
    "birthdateY": "1978",
    "birthdateM": "12",
    "birthdateD": "6",
    "age": "37",
    "constellations": "射手座",
    "place": "東京",
    "mode": "dialog",
    "t": "20"
    }

utt(発言内容)はBotFrameworkを利用したactivity.Textから取得したものを当てはめています。
contextはレスポンスから取得した値を次の発言時に含めることで意味のある会話を継続できるようです。特にしりとり機能を使用時では必要となります。
今回はuttとcontext以外は固定値を使用しています。

modeは何も選択しなければ「dialog」が適用されて通常の会話になります。「srtr」を指定するとしりとりのモードになります。
tはキャラクタ選択で今回は「20:関西弁キャラ」を選択しています。

レスポンス

以下のようにレスポンスを受け取りました。

{
"utt":"こんありやけど",
"yomi":"こんありやけど",
"mode":"dialog",
"da":"0",
"context":"100001",
}

uttの値を返信テキストとして、ReplyToActivityAsyncに渡してBotから返信させるようにしています。

連携例

エミュレータのキャプチャを以下に示します。

f:id:nakasho_dev:20161204032042p:plain

簡単ですが以上です。

Microsoft Cognitive Servicesでは雑談対話の仕組みはなく、LUISで雑談できるまで学習させるのも大変です。
例えばLUISでintentのscoreが低いものばかりの時は的外れな回答をしてしまう可能性が高いです。そういう場合は条件に該当しないと判断して、この雑談対話APIで返信内容をゲットするのもありかなぁと思っています。
正直雑談対話が成り立っていない時も多々見受けられますが...

.NETラボでConnect();2016についてLTしてきました。

11月26日の.NETラボ勉強会で以下の資料をLTしてきました。

docs.com

5分間のLTで、ガンガン進めていったので、トピック的には以下のような感じ。

前半

  • MicrosoftLinux Foundationに加わり、Googleが.NET Foundationに加わり、どんどんオープンになっていくMSに期待できますね。
  • Azure Functionsはサーバレスアーキテクチャとして期待しています。
  • Visual Studio for MacWindows版に慣れている人は同じ操作感でコーディングできるので助かります。
  • Visual Studio Mobile CenterはHockyAppやXamarinTestCloudなどモバイル開発に必要なものが統合されて使いやすくなりますね。
  • Xamarin for VisualStudioで紹介されたものはEnterpriseエディションのみなのでComunity版で使用できなくて残念です。

後半

  • このマークは何か知っていますよね?
  • Congratulations Samsung
  • Tizen.netのPreview版がリリースされました。
  • 発表前まではフロントエンドはWebアプリケーションかNativeアプリケーションしかありませんでした。
  • 今はXamarin.Formsで開発が可能になりました。
  • Xamarin.Formsは99%対応しているとはいえ、WebViewがないのでハイブリッドアプリは作れません。ListViewはあるけど使えない機能が多いです。
  • Tizen固有のAPIはUI周りが未対応でXamarin.Forms頼り。そのため、Xamarin.Formsで表現できないことをNativeに頼れません。
  • これからブログ等で継続的にTizenネタを発信しますのでご期待ください。

以上。

Tizen.NETにおけるXamarin.Formsの制限事項

Xamarin.Tizenチョットデキルのなかしょです。

前回の記事ではプラットフォーム固有APIの制限事項について説明しました。
今回はTizen.NETにおけるXamarin.Formsの制限事項について説明します。

Tizen.NETではXamarin.Formsへの対応状況を以下のように説明しています。

『Tizen .NET supports 99% of Xamarin.Forms.』

99%か、Preview版にしてはなかなかのものです。(と実際の制限事項を見るまでは思っていました...)
では、具体的にどのような機能が制限されているかは以下のページで説明しています。

developer.tizen.org

Ignored, No Action, Never triggered など、様々な制限が記載されています。
中でもListViewの制限が多い印象です。
特にGroupDisplayBindingでListViewをグループ化して表示できないとか、IsPullToRefreshEnabledで引っ張って画面更新などのスマフォっぽい動作ができないとか、色々とつらそうです。

デザインを調整するための要素が使えず、プラットフォーム固有のAPIにはUI系が存在せず、Custom Rendrerを実装できないとなると、デザインを重視したTizenアプリにはまだまだXamarin.Formsは使えないのではと懸念しています。

今日はここまで。

2016/11/24 追記

前述の制限は対応しているクラスに対してのものです。クラスそのものが非対応なものは以下になります。

  • AppLinkEntry
  • PinchGestureRecognizer
  • PanGestureRecognizer
  • OpenGLView
  • WebView
  • OnPlatform
  • PlatformEffect<TContainer, TControl>

WebViewがないとか、ちょっとしたWebサイトをアプリ内で表示したいときに困りますね。

Tizen .NETのプラットフォーム固有APIの制限事項

Xamarin.Tizenチョットデキルのなかしょです。

以前も紹介しましたが、Tizen .NET Architectureは以下のようになっています。

f:id:nakasho_dev:20161118015607p:plain

これだけ見ると、「Platform specific API」使えば、Xamarin.Forms使わずにTizen用アプリ作れるんじゃね、という印象があります。

でも、Tizen.NETでは「The C# APIs provide support for 60% of Tizen Mobile APIs.」と説明があり、Nativeで使用できる60%しか.NETのAPIを用意していないようです。では、対応しているものは何かというと以下が列挙されています。

  • Tizen.Applications
    • Provides the Tizen application framework, including, for example, application state change events, inter-application messaging, and notification services.
  • Tizen.Content
    • Provides content management services, such as file and media downloads, storing and indexing audio and video content, and associating content types with helper applications.
  • Tizen.Location
    • Manages geographical location services and geofencing.
  • Tizen.Multimedia
    • Interacts with media services, including audio playback, recording, and device policy.
  • Tizen.Network
    • Provides APIs to control connectivity devices, as well as providing various network information.
  • Tizen.Security
    • Provides access to secure storage for passwords, keys, certificates, and other sensitive data.
  • Tizen.System
    • Provides device-specific services, including status, system information and settings, feedback, and sensor control and access.

以上です。Nativeには他にどのようなAPIがあるというと前述のアーキテクチャ図から以下だと見て取れます。

  • Base
  • Messaging
  • Social
  • Telephony
  • UI
  • Web

なんということでしょう。

UIがTizen.NETにはないです。
ということはXamarin.FormsでTizenの画面が乱れたときに、Custom Rendrerなどで解決したくてもできません。
Xamarin.Forms標準のUIでできることしかUIが表現できないようです。

闇が深そうだと分かったところで今日はここまで。

TizenでXamarinForms(XAML)を実行してみた。

Xamarin.Tizenチョットデキルのなかしょです。

前回は「Visual Studio Tools for Tizen」で用意されたテンプレートからサンプルを起動してみました。
そのテンプレートではXAMLが利用されていなかったので、今回はXAMLを使ったプログラムを動かしてみましょう。

でも、ただXAMLで動かすよりかはクロスプラットフォームで動作することがわかるプログラムを動かしたいですよね。
そこで、今回はJXUG主催者の田淵さんが公開されているテンプレートから作成したXamarinForms(XAML)のプロジェクトにTizenの環境を加えることを試してみました。

ここからテンプレートを取得します。
テンプレートの適用方法も同ページに記述されているので参考にしてください。 github.com

テンプレート適用後、新規プロジェクトで「Xamarin.Forms App(JXUG)」を選択し、ソリューションを作成します。
ここでは「XFApp3」としています。

f:id:nakasho_dev:20161119024351p:plain

ここで、「ファイル→追加→既存のプロジェクト」で、前回の記事で作成したプログラムのPortableでないTizen側のプロジェクトを選択します。
この時はXamarinApplicationTizenというソリューションを作成し、PortableがXamarinApplicationTizen、Tizen側がXamarinApplicationTizen.Tizenというプロジェクトでした。

nakasho-dev.hatenablog.jp

取り込むと以下のように表示されます。Nugetパッケージの復元も忘れずに。
「参照」を開くと元のソリューションで参照していた「XamarinApplicationTizen」が見つからないので右クリックして削除します。

f:id:nakasho_dev:20161119025029p:plain

そこで、「参照→参照の追加」で「XFApp3」をチェックしOKを選択します。

f:id:nakasho_dev:20161119025457p:plain

そして、「XamarinApplicationTizen.Tizen.cs」を開き、namespaceを「XamarinApplicationTizen.Tizen」から「XFApp3.Tizen」に変更します。
この変更により、ポータブルであるXFApp3のAppクラスを参照するようになります。

f:id:nakasho_dev:20161119025856p:plain

あとは「XamarinApplicationTizen.Tizen」をスタートアッププロジェクトに設定し、「Launch Tizen Emulator」でエミュレータ起動、「Emulator (tizen-3.0_mobile_x86_64_hd)」でプログラムを起動します。

f:id:nakasho_dev:20161119030320p:plain

いかがでしたでしょうか。
これで、今回利用したテンプレートで対応しているAndroidiOS、UWP、Windows8.1、Windows Phone8.1に加え、Tizenにも対応するソリューションができました。

クロスプラットフォーム開発の幅が広がりますね。

Xamarin.FormsでTizenアプリの開発

Connect(); // 2016 初日にTizenがXamarin.Formsに対応したことが発表されました。 スマートフォン後発のTizenにとって、クロスプラットフォーム環境に参入することで、アプリ開発者を増やしTizenのシェアを上げたいのだと思います。
(それはUWPアプリを作ってほしいMSも同じだろうけど。)

そんなわけでTizenアプリのテンプレートからプロジェクトを作成し、Emulatorでの実行まで試してみました。
基本的にはこのページから読み進めていけばサンプルアプリが実行できます。

developer.tizen.org

Tizenの.NET Architectureは以下のようになっているようです。
Xamarin.Formsでのコードの共通化とプラットフォーム固有のAPIを使い分けてアプリが開発できることが見て取れます。 f:id:nakasho_dev:20161118015607p:plain

では、さっそく、インストールから進めていきます。

Visual Studio Tools for Tizen Previewのダウンロード

以下のサイトから「VisualStudioToolsforTizen-preview.exe」をダウンロードします。

developer.tizen.org

環境の準備

Visual Studio Tools for Tizenの動作には以下の環境が必要です。

事前にインストールすべきもの

  • Visual Studio 2015 Update 3
  • Xamarin for Visual Studio
    • TizenのページではXamarin v3.1.1と書いてありますが、最新のv4.2.61 で動作します。
  • .NET Core 1.0.0

事前に設定すべきもの

Tizen Emulatorの動作にHAXM(Hardware Accelerated Execution Manager)環境が必要です。
そのため、Hyper-V環境を有効にしている場合は無効にする必要があります。以下のサイトを参考に無効にしてください。

developer.tizen.org

無効に設定後、以下からHAXMのインストーラを取得してください。
AndroidSDK Managerで取得したインストーラでも構いません。

developer.tizen.org

私はTizenのサイトで古いHAXMのインストーラを取得してしまい、エミュレータが正常に動作しませんでした。最新のインストーラを取得するように注意ください。

Visual Studio Tools for Tizen のインストール

以下のサイトを参考に、先ほど取得した「Visual Studio Tools for Tizen」と「HAXM」のインストーラを実行してください。

developer.tizen.org

証明書とToolの設定

開発を始める前にに証明書やNugetの設定をする必要があります。
若干、イケてないなぁとは思いますがPreview版なのでしょうがないかな。

以下のURLを参考にしてください。 developer.tizen.org

証明書の設定

f:id:nakasho_dev:20161118022805p:plain 「ツール > オプション >Tizen > Certification」と進み、Author CertificateのPasswordに「author_test」を入力します。
たぶん、商用を配布する際などは独自の証明書を用意しないといけないと思われます。

ツールの設定

「ツール > オプション >Tizen > Tools」でTizenのツールのパスを設定します。
こちらはデフォルトでは変更する必要はないようです。
念のため設定しているフォルダのパスに「Tools」フォルダが存在し、その「Tools」フォルダ内に「sdb.exe」があることを確認ください。

NuGetパッケージマネージャの設定

「Nugetパッケージマネージャの設定 > パッケージマネージャ設定 > 全般」で「Visual Studioでのビルド中に見つからないパッケージを自動的に確認」のチェック項目を無効にします。 f:id:nakasho_dev:20161118023450p:plain

以上で環境構築は完了です。

プロジェクトの作成&ビルド

プロジェクトの新規作成をおこなうと、「Visual C#」のカテゴリにTizenの項目が表示され、3つのテンプレートが表示されます。

f:id:nakasho_dev:20161118023905p:plain

ここではBlank App (Tizen Xamarin.Forms Portable)を選択しました。
作成されたプロジェクトは以下のようにエラーでいっぱいですが、ソリューションを右クリックし「NuGetパッケージの復元」を実行することでエラーはなくなります。 f:id:nakasho_dev:20161118024241p:plain

そしてビルドを実行すると問題なく成功するはずです。

エミュレータの起動、プログラムの実行

「Launch Tizen Emulator」のボタンをクリックし、Emulatorを起動します。
この時、Hyper-Vの設定が有効でHAXMが実行できない環境のままだと以下のようなエラーが発生します。 f:id:nakasho_dev:20161118024835p:plain

正常に起動すると以下のようにタイトルが出た後、ホーム画面が表示されます。
f:id:nakasho_dev:20161118025308p:plain f:id:nakasho_dev:20161118025315p:plain

Emulator起動後に「Launch Tizen Emulator」だったボタンが「Emulator (tizen-3.0_mobile_x86_64_hd)」というボタンに変わるのでそれをクリックします。 Debuggerが起動し、Emulator上にプログラムが転送・実行され 「Welcome to Xamarin Forms !」が表示されます。
f:id:nakasho_dev:20161118025655p:plain

この時、前述の証明書の設定を怠ると「Tizen Package not found. Please build. Can not start debugger.」というメッセージがコンソールに出力されて、プログラムは実行されないようです。

いかがでしたでしょうか。
どんなプログラムもHello World的なプログラムが初めて動いたときはうれしいですよね。ぜひ、皆さんも試してみてください。