なになれ

IT系のことを記録していきます

Trelloに登録したタスクの内容を知るAlexaスキルを作った

Amazon Echo Dotが我が家にも届いたので、Alexaスキルを作ってみました。
作ったのは、Trelloに登録したタスクの内容を知るスキルです。
なお、Alexaスキルは他ユーザに利用してもらうためにスキルを公開することもできますが、今回は個人用途で使用できればよかったので、Amazon Echo Dotでのテストまでを行なっています。

Alexaスキルを作成する

Amazonの開発者コンソールでAlexaスキルを作成する必要があります。
https://developer.amazon.com/home.html

ALEXA > Alexa Skills Kit > 新しいスキルを追加する を選びます。

スキル情報

まずは、スキル情報を設定します。

  • スキルの種類:カスタム対話モデル
  • 言語:Japanese
  • スキル名:スキルを特定する名称 ※ここではTrello
  • 呼び出し名:スキルを呼び出すときの名称 ※ここではトレロ
  • グローバルフィールドは全ていいえ

f:id:hi1280:20171209234029p:plain

対話モデル

次に対話モデルを設定します。

今回はスキルビルダーを使います。

f:id:hi1280:20171209234858p:plain

キルビルダーでは、作成するスキルで実行したい処理を呼び出す際にインテントという形で定義します。
インテントはブラウザ上で作成することができます。
一度インテントを作成すれば、JSON形式で記録されるので、再利用が可能です。
今回のインテントの定義は以下です。
https://github.com/hi1280/skill-sample-nodejs-trello/blob/master/InteractionModel.json

Code EditorのメニューからJSONファイルをインポートすることができます。

インテントを作成したら、保存及びビルドします。

f:id:hi1280:20171209235411p:plain

設定

次に設定画面が表示されます。

スキルが実行された時に呼び出すAWS Lambdaの関数を指定します。AWS Lambdaの関数の内容については後述します。

エンドポイントとして、AWS Lambda の ARN (Amazonリソースネーム)を指定します。

Lambda関数のトリガーとして、「Alexa Skills Kit」が指定されていないと、エラーになってしまいます。

f:id:hi1280:20171210000536p:plain

AWS Lambdaを作成する

Node.jsで下記のLambda関数を作りました。
GitHub - hi1280/skill-sample-nodejs-trello: AlexaスキルでTrelloのAPIを実行するサンプル

process.env.ALEXA_APP_IDはAlexaスキルのIDになります。
スキル情報のメニューで確認できます。

TrelloのAPI呼び出しにはnode-trelloというnpmモジュールを利用しています。
https://github.com/adunkman/node-trello

コードの解説

Alexaスキルを制御するコードの部分です。

const handlers = {
  'LaunchRequest': function() {
    this.emit('GetTrello');
  },
  'GetTrello': function() {
    callDoingTasks().then((result) => {
      this.response.speak(result);
      this.emit(':responseReady');
    }).catch((err) => {
      this.response.speak('失敗しました');
      this.emit(':responseReady');
    });
  },
  'AMAZON.HelpIntent': function() {
    const speechOutput = '利用するには、「トレロのタスクを教えて」と言ってください';
    const reprompt = 'どうしますか?';
    this.response.speak(speechOutput).listen(reprompt);
    this.emit(':responseReady');
  },
  'AMAZON.CancelIntent': function() {
    this.response.speak('終了します');
    this.emit(':responseReady');
  },
  'AMAZON.StopIntent': function() {
    this.response.speak('終了します');
    this.emit(':responseReady');
  },
};

GetTrelloがスキルビルダーで新たに作成したインテントの名前に対応しています。
該当のインテントのコマンドが呼ばれた場合に対応したJavaScriptの関数の処理が呼ばれます。

LaunchRequestはコマンドを指定しないでスキルを起動した場合のリクエストになります。
ここでは、GetTrelloと同じ処理を行なっています。

以下のインテントはビルトインのインテントです。

  • AMAZON.HelpIntent
  • AMAZON.CancelIntent
  • AMAZON.StopIntent

スキルの使い方を教えたり、スキルの実行を止めたりするインテントはあらかじめ定義されてます。
該当のインテントに対応する処理を記述します。

Amazon Echo Dotでのテスト

youtu.be

参考情報

公式ドキュメント
Alexa Skills Kitによるスキルの作成 | ASK

Node.js向けAlexaスキル作成用SDK
https://github.com/alexa/alexa-skills-kit-sdk-for-nodejs

注意事項

作成したスキルがAlexaアプリのスキル画面に表示されない場合、以下を疑った方が良いです。

開発したAlexa Skillが日本語版に出てこない場合 - Qiita

感想

今回のような単純にLambda関数を声で呼び出すのであれば簡単です。
対話を考慮したスキルになると難しそうです。
タイミングとかで声をうまく認識しないことが多々あります。

Amazon Echo Dot (Newモデル)、ブラック

Amazon Echo Dot (Newモデル)、ブラック

AngularFireでRealtime DatabaseからCloud Firestoreに変更した

AngularFIreを使用してアプリを作っていたのですが、最近のAngularFireのアップデートでRealtime DatabaseからCloud Firestore推しな雰囲気を感じたので、Cloud Firestoreに変更してみました。
AngularFireを使用する上でのRealtime DatabaseとFirestoreとの違いについて書きます。

データ構造

Choose a Database: Cloud Firestore or Realtime Database  |  Firebase

Cloud Firestore Data Model  |  Firebase

Firebaseのページに比較とFirestoreのデータモデルについての情報があります。
開発の際の注意点としては、データ構造を変更しないといけない可能性があります。
Realtime DatabaseではJSONに乗っ取っていれば、データを保存できました。
Firestoreになるとコレクション、ドキュメントという構造に合わせてデータを保存する必要があります。

例えば、以下のような例です。

FireStore

db.collection('objects').doc('object').set(data);

コレクション、ドキュメントという構造に準拠しないといけないです。

Realtime Database

db.object('object').update(data);

Realtime Databaseだと、JSONであればそのまま保存可能でした。

クエリ

angularfire2/querying-collections.md at master · angular/angularfire2 · GitHub

FIrestoreでは、クエリ表現が変わっています。
ページングのためにorderByを使用していたのですが、影響がありました。
Realtime DatabaseではorderByKeyというメソッドでkey順で並べ替えることができました。
Firestoreだと、それに相当するメソッドはなく、orderByというメソッドに並べ替えの機能は集約されています。
orderByメソッドでkey順(Firestoreだとid順)に並べるには特殊な指定が必要でした。

以下の通りです。

Firestoreでkey順に並べ替えるやり方

import { firestore } from 'firebase';
// 中略
db.collection('items', ref => ref.orderBy(firestore.FieldPath.documentId()));

firebaseのnpmモジュールにあるFieldPathクラスを利用をする必要があります。

ただし、keyの命名方法が変わっているので、どのように並び替えたいかによってはそもそもやり方を変える必要がありそうです。
Realtime Databaseの場合、データの作成順に順番に命名されるような形でした。
なので、key順で並べ替えれば、結果として、データを作成した順番に並べ替えができました。
Firestoreの場合、keyの命名は順番に関係なくランダムなようなので、データを作成した順番に並べ替えが必要であれば、データ内に作成日時を付与して、そのフィールドで並べ替えるといった工夫が必要と思われます。

まとめ

上記につまづいたくらいで、そのほかはメソッド名を変更するくらいで比較的簡単にRealtime DatabaseからCloud Firestoreに変更できました。
Firebaseのドキュメントを見てみると、今後はCloud Firestoreがスタンダードになりそうな雰囲気なので、今後はこちらを使っていくようにしたいと思います。

MCP70-532:「Microsoft Azure ソリューションの開発」の試験に合格しました

試験 70-532: Microsoft Azure ソリューションの開発に833点で合格しました。備忘録的に合格までの過程を残したいと思います。
問題や解答は持ち帰れないので、記憶にあるうちにです。

試験の内容

試験時間:150分
問題数:30問
合格点:700点以上
試験問題の形式:

※問題数はうろ覚えなので、若干異なる可能性があります

ケーススタディ形式は、ある企業のシステム開発の状況が問題の条件として与えられていて、各問題に答える形式です。C#のコードの穴埋めを択一問題形式で答える問題が多かったです。

二者択一形式は、前提条件は共通で、各問題でYESかNOかで答える形式です。

C#のコードの問題がケーススタディ形式でほぼ出題されて、そのほかはAzureのサービスに関しての知識を答える問題というような感じでした。workerロールとか、Service Busとかマイナーなイメージがある問題が結構出たりして、試験内容が古いのかなと思いました。

全体的に、択一問題形式でも二択になっているものもあり、まぐれで当たる可能性が大いにある試験だと思いました。
試験時間は150分ありますが、問題数が30問しかないので時間はかなり余ると思います。
私の場合、100分くらいで試験を終えました。

試験勉強の方法

以下のコンテンツを活用しました。

Udemyのコンテンツは試験の範囲を網羅しているので、初学には向いていると思います。英語なのが難点ですが、動画なので、Azureを実際に使いながら見てみると分かりやすいかと思います。
注意点として、この講座自体は最新の試験を反映していて、日本版の試験は遅れています。なので、古い内容で勉強しておく必要があります。具体的にはネットワーク関連の問題は最新だと省かれているようですが、日本版の試験だと出題されていました。

MeasureUpの練習テストは公式の練習テストということですが、本番では練習テストにはない二者択一形式の問題が出題されたり、本番よりも難易度が高いと思われる問題があるなど、ちょっと微妙かもしれません。
練習テストの問題が分かるレベルが必要と思ってしまうと、実はそんなことなかったというのが実際のところです。
練習テストが難しいと思っても、案外なんとかなるような気がします。
PowerShellのコードの穴埋め問題が結構あったのですが、本番では、ほぼ出題されませんでした。

最終的にはAzureの公式ドキュメントのチュートリアルを実践しながら学習しました。実際にAzureを触りながら学習すると理解が深まると思います。