Amazon EchoからSlackに通知を出してみた(Cognito + API Gateway版)

前回前々回 とAlexaからSlackに通知できる仕組みを試してみましたが、Alexaから呼ばれるLambdaに接続先やメッセージを環境変数で設定する必要があり、ユーザ毎にできるようにしたくなってきました*1

今の仕組みでも、Alexaユーザーとシステムユーザーを関連付けることができます。そこから接続情報やメッセージを引っ張って来れればうまく行きそうです。

  • ユーザ毎に情報を保持するアプリ
  • Alexa SKill

の2本立てで行きたいと思います。

どんな構成にするか?

  • ユーザ管理・認証
  • ログイン済みのユーザに紐付くデータ
    • API Gateway経由でhtmlを返したりAPIを叩いてデータにアクセスする

ユーザに紐付く情報をどこに保持しようか?

最初はCognito Syncで考えていたのですが、各端末間のデータ同期に特化したサービスらしく、Lambda上でユーザに紐付く情報を取得するのは難しそうでした。なので、保存先はDynamoDBで行います。

イメージはこんな感じです。 f:id:nemuzuka:20180120150534p:plain

ユーザ毎に情報を保持するアプリ

API Gateway経由でリクエストを受け取り、レスポンスを返します。AlexaからKickされたLambdaがユーザに紐付く情報を取得するのもこのアプリ経由になります。設定画面は誰からもアクセスされると困るので、API Gateway ではカスタムオーソライザーでTokenの有効性をチェックします。

コード

Alexa Skill

AlexaからKickされたLambdaはAccess Tokenを元にユーザに紐付く情報を取得します(アカウントリンクを有効にします)。そして、その情報を元にSlackに通知を投げます。

コード

まとめ

現在、Alexaからユーザ固有の設定を渡すのは難しいので、外部のシステムに保持させておき、Access Tokenを元に取得するという方法が実現できました。ちょっとスマートスピーカーの使い道も広がるんじゃないかと思います。

*1:流石にユーザに声でメッセージやURLを伝えてもらうのは無理ゲーだと思いました

Amazon EchoからSlackに通知を出してみた(Web API版)

前回Alexa、会社に連絡をしてと話しかけることでSlackに通知するアプリを作成しました。 ですが、このアプリ経由だと「誰からのメッセージなのか」がわからないので、環境変数名前を設定する必要がある為、ユーザ毎にLambdaファンクションを登録する必要がありました。

別に公開するとかそういうのではないのですが、ソースコード上に設定値をハードコードしている感じがして雑な感じです。もう少しいい感じにならないかと探していると、Alexaからアクセストークン取得できるんですね。 SlackでもOAuth使えるので、取得したTokenを元にWeb APIを呼び出すことで認証したユーザとして書き込めます。今回はこっちでやってみましょう。

1. Slackのアプリ登録

  1. SlackのApplication管理画面より、Create New Appをクリックします
  2. App NameWorkspaceを設定して、Create Appをクリックします f:id:nemuzuka:20180109122426p:plain
  3. 機能 - OAuth & 権限 の スコープの設定セクションで、権限スコープの選択に メッセージをユーザーとして送信します chat:write:user を設定し、変更を保存するをクリックします f:id:nemuzuka:20180109122457p:plain
  4. OAuth トークン & 転送 URLセクションで、ワークスペースへのアプリのインストールをクリックします f:id:nemuzuka:20180109122512p:plain
  5. アクセス許可画面にて、許可するをクリックします f:id:nemuzuka:20180109122525p:plain
  6. 基本情報 - アプリの認証情報セクションで、クライアントIDクライアントシークレットが表示されます(後で使用します) f:id:nemuzuka:20180109123248p:plain

2. Lambdaファンクション登録

Skillが呼ばれた時にアクセスtokenが渡されるようになる為、それを使用して環境変数で指定したチャンネルへメッセージを登録します。詳しくはソースコードをご覧ください。

こんな感じで登録してください f:id:nemuzuka:20180109122613p:plain

環境変数として、書き込むChannelのIDやメッセージの設定が必要です f:id:nemuzuka:20180109123402p:plain

3. Alexa Skill登録

3-1. スキル情報

f:id:nemuzuka:20180109122651p:plain グローバルフィールドは全て「いいえ」を設定します

3-2. 対話モデル

インテントスキーマとサンプル発話に設定します。

これとかこちらを参考にしてください

3-3. 設定

  • サービスエンドポイントのタイプ には AWS Lambda の ARN (Amazonリソースネーム)
  • デフォルトにはLambdaファンクションのARN

を設定します。また、アカウントリンクの設定をはいにして、必要な情報を設定します。 f:id:nemuzuka:20180109122706p:plain

  • 認証 URL https://slack.com/oauth/authorize
  • クライアント ID Slackの基本情報 - アプリの認証情報セクション内のクライアントID
  • スコープ 今回はchat:write:user
  • リダイレクトURL この項目は、Slackの設定に必要です
  • 認可の承諾タイプ Auth Code Grant
  • アクセストークンURL https://slack.com/api/oauth.access
  • クライアントシークレット Slackの基本情報 - アプリの認証情報セクション内のクライアントシークレット
  • クライアント認証スキーム リクエストボディの資格情報

4. Slackのリダイレクト先を設定

Slackの 機能 - OAuth & 権限 の リダイレクトURLセクションで、Alexa SkillのリダイレクトURLを全て設定し、URLを保存するをクリックします f:id:nemuzuka:20180109122720p:plain

5. リンクを有効化

f:id:nemuzuka:20180109122735p:plain 管理画面を開いて有効にするをクリックするとアクセスを許可するか確認する画面が表示されるので、許可するをクリックします。 f:id:nemuzuka:20180109122753p:plain

f:id:nemuzuka:20180109122807p:plain

6. 話しかけてみる

Alexa、スラックに通知をしてと話しかけることで、Slackに通知が行く筈です。

f:id:nemuzuka:20180109122821p:plain

有効化した時のアカウントからのメッセージとして登録されていますね!

まとめ

リンクを有効化した時のアカウントからのメッセージとして登録されるので、環境変数で名前を設定することから解放されました。 ですが、まだユーザ毎にカスタマイズできると良いものがありますね。そう、チャンネルIDとメッセージ本文です。個別のパラメータとしてどうにか送れないかな...

Amazon EchoからSlackに通知を出してみた(Incoming Webhooks版)

年末に待望のAmazon Echoが届きました。招待リクエストを送ってから1ヶ月以上待たされ、情熱も失いかけましたが、なんとか気力を振り絞ってアプリ開発をしてみました。

今回の目的

  • Alexa、会社に連絡をして

と話しかけることで、SlackのIncoming Webhooksを使用してメッセージを送信する、というアプリを作ってみようと思います*1

1. Echoから呼び出されるLambdaファンクションを登録

大まかには

  • リクエストを受け取り、Slackにメッセージを送信する
    • Incoming Webhooks 用のWebhook URLはLambda環境変数にて定義(事前に取得しておいてください)
    • メッセージ本文、名前もLambda環境変数にて定義

という流れになります。

トリガーにAlexa Skills Kitを設定してください。 f:id:nemuzuka:20180108151917p:plain

今回作成したLambdaファンクションはこんな感じです。

ARNの値をAlexa Skillと紐付ける必要があるのでメモっておいてください。

2. Alexa Skill の作成

Amazon開発者ポータルよりAlexa Skillを登録します。

2-1. スキル情報

f:id:nemuzuka:20180108151936p:plain

グローバルフィールドは全て「いいえ」を設定します

2-2. 対話モデル

インテントスキーマとサンプル発話に設定します。

これとかこちらを参考にしてください

2-3. 設定

f:id:nemuzuka:20180108151952p:plain

  • サービスエンドポイントのタイプ には AWS Lambda の ARN (Amazonリソースネーム)
  • デフォルトにはLambdaファンクションのARN

を設定します

3. 動作確認

管理画面を開いて登録したSkillを有効化します。

Alexa、会社に連絡をして と話しかけることで、Slackに通知が行く筈です。

f:id:nemuzuka:20180108152009p:plain

まとめ

特にサーバを用意する必要もなく、LambdaとAlexa Skillの設定をポチポチすることでお手持ちのAmazon EchoをトリガーにSlackのメッセージを送ることができました。 いちいちスマホを取り出してメッセージを入力することなく、Alexa、会社に連絡をしてと話しかけるだけでお休みすることが通知できるのです。なんだかスマートな感じしませんか?

ぶっちゃけ、Alexa Skill単体で収入を得ようと思ったら難しいと思います。あるサービスの機能の1つとして「Amazon Echoからもできますよ」という形にしないとビジネスにならないと感じました。 ただ、音声だけでやりたいことが実現できるというのは複雑なUIが絡まないので今後広がっていくのではないかと思います。 下手すると電話の音声案内になってしまいそうですよね。アイディアが欲しい...。

*1:ハッチャケた翌朝、連絡するのが億劫だなという時に使用したいなと思いました

読了 IntelliJ IDEA ハンズオン

読みました。いやー、私のようにScalaやりたくてIntelliJ初めたけど、自分で調べながらの独学で雰囲気で使ってるような人にはもってこいの本だと思います。

こういうの に参加できれば良いとは思ってたのですが、地方にいるとタイミングが合わないと気軽に行けないので、こういう本はありがたかったです。

個人的に気になった機能達

1. Postfix completion

体が、

  • if() と入力
  • 左にカーソル移動
  • if内の条件文を書く

に慣れているのですが、いきなり

  • if文の条件文を書いて、その後に .if +Tab を入力

することでif文が書けてしまうという奴です。知らなかった。知っておいて損はなさそうな気がします。使いこなせればカッコイイ。

2. Chronon

IntelliJ IDEAは、実行中に変数の値の移り変わりを記録しておいて巻き戻し再生する機能が組み込まれており

な、なんだってーー。知らんかった。これから絶対使う。

オススメする人

Eclipseを使っていた人がIntelliJに持つ疑問や不満に対してコラムとして回答も記載してくれているので、IntelliJにちょっとでも興味を持った人は読んでみると良いと思います。IntelliJを使っている、使おうとしている開発チーム内で1冊あっても良いと思います。
IntelliJは、「こう書くとイケてるぜ」と指摘してくれるInspectionが秀逸で、Scalaを書き始めた頃は勉強させていただきました。

とくにJava EEサポートは素っ気なさが顕著で、いろんなことをIDEに頼ろうと思うと逆に痛い目に遭います

とあるように、優しくはないところは多いのですが、この本をとっかかりにIntelliJを使うことでストレスないコーディングができるようになるかもしれません。

あとはtableのモデリングができれば最高なんだよな...(いまだにERMaster使い)

ちなみに

私はライセンスを こちら でお世話になっています!これからもよろしくお願いします!

手ぶらキャンプ! in うまみち森林公園 に行ってきた

最近、休みの日には仕事とは直接関係ないことをしてリフレッシュしたい衝動にかられ、キャンプとかアウトドアな体験をしてみたい、と思っていた所、Facebookにこんなのが流れてきました。

『キャンプ』・・・やってみたいけど、なかなかきっかけがないな〜

まさに私の状況を表しています。私のために企画されたものではないだろうか。さっそく申し込みました。 聞く所によると、本当に手ぶらで良いらしく、食べ物や飲み物も用意するけど足りないかもしれないから持ってきてね、とのことでした。

で、当日。

まずはテントの設営です。さすが新潟。テントはスノーピークの奴です。

テントなんて組み立てたことは無いけど、説明書を読みつつ格闘すること1時間くらい。何とか設営することができました。パーツに色がついていて、色が合ってる所にセットすれば良くなっており、気配りされている感じがとても好感が持てました(欲しい)。

f:id:nemuzuka:20170715145101j:plain

他の参加者の方の設営したテントよりも「よれてる感」があったのですが、設置場所がちょっとよくなかったのだと思うことにしました。

親が設置に悪戦苦闘している間に子どもたち同士で仲良くなっていて、トランプしたり翌朝クワガタを採るために木にエサを塗ったりしてました。 f:id:nemuzuka:20170715160228j:plain 家にいる時とは違う顔をみられるので、「うちの子、なんか成長してるなぁ」と感じることもできますよね。

で、夕飯はBBQ。 ご飯を炊き、焼肉の盛り合わせと海鮮の盛り合わせを準備して頂いていました。 1グループ4人までだったのですが、4人とも大人な想定をされていたのでしょうか、量が多い。 今回は子供連れの方たちだけだったのですが、まぁ、余らせちゃいますよね。翌日の朝食にしたり持って帰って美味しく頂いたと思います。用心して持っていった焼きそばの出番はありませんでした。 まぁ、この辺は足りないよりも余るほうが良いというおもてなしの心が働いたのでしょう。利益でるんだろうか、と心配になりました。

さらに業務用のビールサーバーも用意して頂いたのでアルコールの持ち込みも不要でした(ビールは別料金)。こんなに至れり尽くせりでバチが当たりそうな感じでした。

子供たちはやはりテントだと眠りは浅いようで、「4時半にカブトムシ見に行くから起こしてね!」と言ってたのですが、3時くらいに目が覚めて時間までゴロゴロしていたようです(で、カブトムシは居なかったらしい)。

朝は卵やパンを用意してもらっていたので、BBQコンロでトーストです。 f:id:nemuzuka:20170716070459j:plain ガスコンロも用意してもらっていたので、目玉焼きのせトーストを食べられました。幸せ。

食事中に雨が降ってきたので慌ただしくテントを片付けてキャンプ終了でした。

感想

1グループ12,000円という参加費でしたが、今回の内容で言うと「安すぎ」な感じがしました。 スノーピークのテントを初めて使ってみたのですが(テントを設営したのも初めてだった)、いい経験ができたと思います。 スタッフの方々の対応も気持ちよく、「場所と機材を提供したからあとは各自適当にやって下さい」という感じでなかったのが良かったです。 このイベントは続けて欲しいのでもう少しお金をとっても良いと思います。子供たちは「次あったら絶対行く!」と言ってたので本当に楽しかったんでしょうね。

本当に手ぶらで楽チンで楽しめました。保育園や小学生の仲良しグループ(親子)数組で行けるようなイベントがあれば新たな需要が生まれる気もします。

テントの片付けは袋にしまっただけなのですが、あの後干して掃除しないといけないんだろうなぁ、と思うとテントは所有せずに借りられた方が楽だよな、と強く思いました。テントは大きいですしね。

キャンプ用品一式揃えると結構かかりますよねぇ…。さて、これからどうしたもんか。

長岡IT開発者勉強会(NDS)の第51回勉強会に参加してきた #nds51

nagaoka.techtalk.jp


参加して、お題には沿っていなかったと思いますが、ちょっと背伸びしてフロントエンド的な話をさせていただきました。


他のjsフレームワークを知らないので、それらに比べてVue.jsのここがイイ!というのを伝えられなかったのが心残りですが、jQuery+Hogan.jsを使い続けるに比べたら楽になるのはお伝えできた気がします。*1

単一ファイルコンポーネントは自分的にはしっくりくるんですよね。フロントエンド開発に秩序をもたらしてくれる気がしています。責務大好き。

Neo4jをビジネス的に使えないかなぁと思った回でした。知らんことばっかり。

あと、懇親会で振る舞われたパンがおいしかったです。家で作れたら良いですよねぇ。
f:id:nemuzuka:20170325183423j:plain

え、長岡で教えてくれるところがあるの!?行かなきゃ!!

f:id:nemuzuka:20170325183448j:plain

*1:まぁ、元々ReactとかAngularを使ってる人からしたら今更感はあるとは思いますけど...

長岡IT開発者勉強会(NDS)の第50回勉強会に参加してきた #nds50

f:id:nemuzuka:20161212164102p:plain
12/10に長岡市で、長岡IT開発者勉強会(NDS)が開催されました。
NDSとは、

新潟県長岡市のIT系開発者が、自主的に勉強会を開催するために2008年11月に結成されたグループです。
長岡市での勉強会の開催や、議論をを主な活動とします。

情報処理技術に関するものであれば、プログラミング技術、IT最新情報、開発手法、ITマネージメント、スーツネタなど幅広い範囲での学習を目指します。

とあるように、情報処理技術に絡んでいれば何でもありの勉強会です。
それが50回目の開催でした。おめでとうございます。
@civicさんの地道な活動と人徳は見習うトコロが多いです。
私も半分めくらいから参加しだしているので、賑やかしにはなっているかな、と思うのですが...



第50回勉強会(2016/12/10) - 長岡 IT開発者 勉強会(NDS)

セッション内容を見て頂ければわかると思うのですが、都内の勉強会とは少し異なり、1つの勉強会の中で幅広い分野の発表がされています。
地方/都内とか関係なく勉強会の質は上げられるんだ、と気づけて、有意義な時間を過ごせました。
@civicさんの地道な活動と人徳は見習うトコロが多いです(2回目)。

ところでみなさんは、勉強会に何を求めてきていますか?

もちろん、勉強会の後の懇親会でお話をするということも楽しいです。
駐車場の出庫時間の制限があるのに気付かず、ある方に試練を与えてしまうとか、程々にしておかないと友人を無くすことになるかもしれませんが...*1

ともあれ、勉強会に参加する理由は大きく分けて2つあると思います。

自分の「ナカマ」探し

行ってみたい勉強会は、技術的に趣味や興味の合う人を見つけたいと思うことがきっかけではないでしょうか。
内容に興味があるとしても、「どんな人が発表するんだろう」も気になりませんか?

趣味や興味が合うことについて会話/相談できる「仲間」を探す場として「勉強会」に参加する人も多いと思います。

客観的な自己評価

発表したり、聞くことで、

  • 自分はこんなこと知ってる / やってる
  • 他の人はこんな技術 / 方法でやってるのか。自分の所でも活かせそうだ
  • ネットの記事だけだとピンと無かったけど、実際に使っている人の話を聞いて合点がいった!

「俺スゴくない?褒めて!」のように承認要求を満たすことから「自分が知らないことの気づき」まで、得ることができます。
ともすれば、所属する会社にとっての「当たり前」が同業他社では「そんなことしない」ことかもしれないので、自分を「客観的に評価できる」場があるのは、人として成長できる「伸びしろ」を作り出すのに良いことだと思います。
自社でエースだったとしても、他でエースになれるのか、気になりませんか?上には上がいるもんです(自戒)

勉強会は人に会いに行くもので、NDSはアットホームで明るい勉強会です

このように、勉強会は自分や他人を知る為に良いコミュニティなのです。

  • ある分野について社内に相談できる人がいない場合、「これで本当に正しいか」判断しづらく、悶々と悩む
  • 「会社からの評価が絶対」の場合、自分が評価されないと自信も無くなり、逃げ道も無くなり追い込まれる
  • 社内に「自分よりできる奴がいない」と思った時点で自己学習も疎かになり、後から追い上げてきた若手の有意義な提案も「年長者の老害パワー」でねじ伏せてしまう


そんなことにならない為に、

勉強会で社外の人と繋がっておく

選択は、人生の中でアリだと思います。


ただ、コミュニティ内でそんな「都合の良い」関係を1回の参加で構築できるか、というと難しいのは皆さんご存知のとおりだと思います*2
なので、何度か足を運んで、発表したり参加者の方たちと話してみるのもいいんじゃないかな、と思います。

新潟のエンジニアに楽しい場を提供してくれるコミュニティ「長岡IT開発者勉強会(NDS)」。
1つの開発言語、フレームワークに特化した勉強会とはまたちょっと違うので、(主に地理的に)気軽に参加できる方には1回行ってみることをオススメします。
それでは次の51回目でもお会いしましょう。

*1:その節はご迷惑をおかけしました

*2:気になっているあの人に何も話もせずに自分の思いを察してもらえる、というのはラノベの主人公くらいですよね