とある技術の開発日記

Diary of irregular phrase programmer

Build 2016で発表された、Micorosft Bot Frameworkが楽しそうだったので少し動かしてみた

日本時間の昨夜からBuild 2016が開催されました。

Keynoteの様子や全体のまとめはぶちざっきを見ると良いかと思います。

//build/ 2016 Day 1 Keynote | ブチザッキ

//build/ 2016 Day 1 で発表されたリンクあれこれ | ブチザッキ

色々な発表があったのですが、この中で私が注目したのは「Microsoft Bot Framework

ChatOpsという言葉もありますが、最近はSkypeやSlackなどチャットツールの利用頻度が圧倒的に高くなっていますし、Hubotを利用してSlackのBotを作成している方も少なからず居ると思います。

今回発表されたMicrosoft Bot FrameworkではC#やNode.jsを利用して簡単にBotを作成する事ができます。かつ、作成したBotは登録する事で他のWebサービスと簡単に連携する事ができます。

サンプルを少し触ってみたのでご紹介します。詳細な説明は他の方がやってくれることでしょう・・・。

docs.botframework.com

GitHubにサンプルコードもあるので眺めてみるとBot周りのASP.NET WebAPIクラスが増えているのが確認できます。

github.com

ソリューション構成

ASP.NET WebAPIで開発したことある方ならお馴染みのソリューション構成です。 f:id:airish9:20160331094057p:plain

コントローラーの中身はこんな感じ。

using System;
using System.Linq;
using System.Threading.Tasks;
using System.Web.Http;

using Microsoft.Bot.Builder.Dialogs;
using Microsoft.Bot.Connector;
using Microsoft.Bot.Connector.Utilities;

namespace Microsoft.Bot.Sample.EchoBot
{
    [BotAuthentication]
    public class MessagesController : ApiController
    {
        /// <summary>
        /// POST: api/Messages
        /// receive a message from a user and reply to it
        /// </summary>
        public async Task<Message> Post([FromBody]Message message)
        {
            return await Conversation.SendAsync(message, () => new EchoDialog());
        }
    }
}

Microsoft.Botの名前空間にBot周りのクラスが定義されています。 BotAuthentication属性やMessageクラス、Microsoft.Bot.Builder.Dialogs.IDialogを実装しているクラス(ここではEchoDialog

Botの主な動作はMicrosoft.Bot.Builder.Dialogs.IDialogStartAsyncを実装してIDialogContext.Wait(ResumeAfter<Message> resume)を呼び出すことで動作します。

ResumeAfterはジェネリクスで指定されている型の引数とIDialogContextのデリゲートです。

public delegate Task ResumeAfter<in T>(IDialogContext context, IAwaitable<T> result);

サンプルソースを参考にして実装するとこんな感じです

        public async Task StartAsync(IDialogContext context)
        {
            context.Wait(MessageReceivedAsync);
        }

        public async Task MessageReceivedAsync(IDialogContext context, IAwaitable<Message> argument)
        {
            var message = await argument;

            // << ここで入力された内容を処理する >>

            // メッセージを返却する
            await context.PostAsync(string.Format("入力したメッセージは {0} ねっ?", message.Text));

            // 入力待ち状態で入力を受け付ける
            context.Wait(MessageReceivedAsync);

        }

デバック方法

BotのEmulatorツールが公開されています。

docs.botframework.com

作成したWeb APIをビルド&デバック状態にしてEmulatorからBotと会話する事が出来ます。(単純に指定したエンドポイントにPOSTリクエストを投げているだけっぽい?)

f:id:airish9:20160331101641p:plain

公開&連携

今回は以下のページを参考にしてAzure WebAppで作ったAPIをホストして、Bot FrameworkのページからBotの登録を行いました。

docs.botframework.com

登録するとAPIIDとKeyが発行されるのでWeb.configを書き換えましょう。

<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=301879
  -->
<configuration>
  <appSettings>
    <!-- update these with your appid and one of your appsecret keys-->
    <add key="AppId" value="hanayobot" />
    <add key="AppSecret" value="YourAppSecret" />
  </appSettings>

後は管理画面右側の連携したいサービスからADDすれば追加できます。Web Hook対応のサービスからなら登録できるはずなのでBotライフを楽しみましょう

f:id:airish9:20160331104915p:plain

うまくできなかった事

  • 管理画面の「Test connection to your bot」で会話できるはずなのですが、sendボタンを押しても無反応だった・・・
  • Web Chatで作成されたタグを仕込んでもbotが無反応だった。

認証系っぽい…。

DevOpsハッカソンに参加して、自分の考え方がハックされた

Microsoftと何かと縁のあるブログですが、今回もMicrosoftさん主催のイベントに参加してきました。

参加してきたイベントはこちらです。

devopsjp.connpass.com

土日の二日間を利用して行われるハッカソンイベントでした。

エンジニアという職業を生業にしてもう8年近く経ちますが"ハッカソン"というものに参加するのは初めてです。

kotobank.jp

私は思うハッカソンのイメージは概ねこんな感じでした。

  • できる人のあつまり
  • とあるプロダクトを使いこなしてる闇の集まり
  • すげー人がいっぱいいる
  • 初心者にはツライ

まぁ、この2日間でこの印象は覆ることになるのですが…。

今回の開催はDevOpsハッカソンということで、DevOpsを題材にしています。DevOpsに関しては特に大きく取り扱いませんが、Micorosftの牛尾さんが作成しているスライドがとても参考になるので一度、目を通しておくと良いでしょう。

二日間の流れ

2日間の構成はざっくりこんな感じでした。

  • 1日目
    • DevOps概要セッション
    • チーム作成
    • 昼食&ハッカソン
  • 2日目
    • 朝から昼過ぎまでハッカソン
    • 発表会
    • 表彰&クロージング

1日目

概要セッション

福岡では珍しくエヴァンジェリストの方が3人登壇されてのセッションでした。内容は以下の3構成になっていました。

  • DevOps概要
  • Azure Resource Manager(ARM)
  • Dockerデモ
  • その他、もろもろのおまけデモ

チーム分け

前半のセッション中に今回のハッカソン中にやりたいことを付箋に記入しておき、みんなで壁に貼っていきます。

付箋が出そろったタイミングでやりたい付箋に指名を記入して、票が多く集まった内容でチームを作成して、2日間で実践するという内容でした。

ただし何をやっても良いわけではなく、DevOpsのプラクティスを実践しなければならないという制約は入ります。

DevOpsのプラクティスというのはCI/CD、テスト自動化、Infrastructure as Codeなどを指しますが比較的緩い制約かと思います。

私が所属したチーム

@yukiusagi2052 さんが提案した「Minecraftサーバーを簡単に作ろう!」というプロダクトに参加させて頂きました。

メンバーと簡単な自己紹介はこんな感じ(あくまで私の主観です)

  • yukiusagiさん(@yukiusagi2052)
    • 今回はOps側で参加したMinecraftをこよなく愛するお子さんのためにサーバーを構築する素敵なお父さん
  • ルシフさん(@sinofseven)
    • チームで一番若手のDeveloper、今回の2日間でchef guyへと転生する
  • のりじさん(@nori790822)
    • Webデザイナーさん。DevOpsハッカソンでできる事は無いとビビりまくっていた
    • ただのラブライバー。

役割分担

偶然だったのですが、初対面ではなく、顔を知っているメンバーで構成されたので比較的チームのまとまりは良かったと思います。それぞれのスキルセットが異なるのでまずはインフラ・デザイン・開発で分離して作業を分担することから始めました。

  • インフラ担当
    • ARMでMinecraft用の仮想マシンを作成&chef-soloのインストール
  • Minefraftサーバーインストール担当
    • chef-soloを利用してMinecraftサーバーとして必要なものをインストール
  • WebApi担当
    • WebからARMの仮想マシンを取り扱うためのAPIを作成する
  • フロント担当
    • ユーザーが仮想マシンを作ったり、削除したりするポータル画面の作成

ハッカソン中

焦る!とにかく焦る!

時間に余裕がない中で最大のチームに最大のインパクトを残す事に尽力を尽くしました!

Azureに詳しくないメンバーもいたので少しサポートしたりみんなで助け合いながら開発を進めていきました。

やる事多すぎ、問題多すぎですが、Microsoftの運営の方々のサポートも頂きながら少しずつクリアしていく感覚が楽しかったですね。(アドレナリン結構出てたとは思う)

私のチームは他のチームよりも人数が少ない事もあってモクモクと作業を進めている時間も多かったように思います。

ハッカソンの醍醐味はこの時間なんだろうなと終わってみてから思います。

成果物

ポータル画面とARMの作成は完了したのですが、WebAPIを組み込むところでタイムアップ! 作成したARMはchefのcookbookはゆきうさぎさんや、ルシフさんから公開されると思うので気長に待ちましょう。

ハッカソンを終えて

2日間を終えてからのイメージ

  • ハッカソン楽しい
  • 一人じゃなくてみんなで助け合いながらの開発
  • 和気あいあいとやってる(ただし時間は短いので忙しい)

初めて参加したハッカソンでしたが、楽しすぎてあっという間の2日間でした。

みんなもっとハッカソンに参加したら良いと思います!

手を動かして色々な方と相談するのでとても知識が深まりますし、身になると思います。
自分の周りでもハッカソンイベント増やしていきたいものです。

また、DevOpsを題材にしてARM/chef/CIなどをの便利さも解りましたし、導入も難しくない事が身をもって体験できたのは大きいですね。

表彰結果でも、まさかの一番良い賞を頂けてチーム一同で喜ばせて頂きました。

どのチームが優勝してもおかしくなかったので本当に今回は運が良かったと思います。

みんなも行くと良いよ!!

どうやら、このめちゃ糞楽しいイベントですが、福岡の後も何ヶ所かで行われるようなので興味がある方は参加してみると良いかと思います。

おまけ

今回のイベントで配布されたTシャツが割とイケイケなデザインで気に入ってますw

f:id:airish9:20160228201725p:plain

TwilioをASP.NET MVCで試しに使ってみた(導入編)

もう7月ですね一年の半分が終わったらしいですよ(白目

なかじ(@nakaji)さんを見習ってブログにも力を注いでいこうかと思っています。 一発目はTwilioネタです。

nakaji.hatenablog.com

先日はMicrosoftさんの「Microsoft Innovation Award 2015」に参加する機会があったので参加してきました。
当日の様子はレポート記事は人見知りな方のBlogを見てもらえれば良いと思います。

ascii.jp

zuvuyalink.net

実はこの会場でTwilioを使ったユーザー投票が行われたのですが、私的に今後の勉強会で使ってみたいとも思ったのでTwilioを使用してみました。

1.Twilioのユーザー登録

f:id:airish9:20150701163541p:plain

Twilio for KDDI Web Communications | クラウド電話API
Twilioのサイトからユーザー登録を行います。
ユーザー登録を行うと自動的にトライアルアカウントとなり一定期間(一定金額?)は支払いをすることなく使用する事ができます。

トライアルアカウントの制限や使用金額等に関しては以下の公式ドキュメントを参照

twilioforkwc.zendesk.com

なお、ユーザー登録時に使用した電話番号は検証済み電話番号扱いとなり、Twilioの電話番号と合わせて通話等に使用する事ができます。

2.Twilio電話番号の取得

アカウントを登録した状態ではTwilio電話番号が存在しないのでダッシュボードの画面や"Twilio電話番号"のタブから電話番号を購入します。

TwilioではAPIを使用して、このTwilio電話番号から発信したり、Twilio電話番号の着信後の処理をプログラミングする事ができます。(Inovation Awardで行ったようなアンケートは後者の受信を処理するパターン)

3.ASP.NET MVCにTwilio SDKを導入

Twilioは様々なプログラミング言語に対応していますが今回はC#で実装します。
まずはVisual Studioを使用してASP.NET MVCのテンプレートを作成します。(詳細は割愛)

TwilioのSDKはgithubで公開されており手順通りにNugetでプロジェクトに導入します。

github.com

1) Twilio.Apiの参照を追加
Install-Package Twilio
2) Twilio.MvcとTwilio.Twimlの参照を追加
Install-Package Twilio.Mvc

以上で基本的な準備は完了になります。

おまけ:サンプルプログラムでTwilioから電話をかける

Twilioを試しに使ってみるために、コンソールプログラムから登録時に使用した電話番号に電話をかけてみましょう。

  1. C#のコンソールプログラムテンプレートを選択
  2. パッケージマネージャーコンソールで"Install-Package Twilio"を行う。
  3. Mainメソッド内のコードに以下の内容を記述して実行
using System;
using Twilio;
class TwilioSample 
{
  static void Main(string[] args) 
  {
    // 認証情報
    string AccountSid = "{{ACCOUNT SID}}";
    string AuthToken = "{{ AUTH TOKEN }}";
    var twilio = new TwilioRestClient(AccountSid, AuthToken);
 
    var options = new CallOptions();
    options.Url = "http://demo.twilio.com/docs/voice.xml";
    options.To = "+819012345675";
    options.From = "+815011112222";
    var call = twilio.InitiateOutboundCall(options);
     
    Console.WriteLine(call.Sid);
  }
}

この例ではTwilio電話番号(050-1111-2222)から登録時電話番号(090-1234-5678)に対して電話をかける例です。 実行すると自分の携帯に電話がかかってきて、英語のメッセージが行われた後に電話が切れると思います。

次回はASP.NET MVCを使用して電話の受信プログラムを行いたいと思います。