2017年で学んだ技術
今年を振り返る的な投稿です。
今どきのソフトウェア開発ってなんだろうということに取り組んだ2017年でした。とりあえず新しい技術と言われるものを触れば何か見えてくるものがあるかもしれないと考えました。
かの有名な石黒浩先生の講演を聴く機会があり、その影響です。なぜ一線級で研究ができているのかという問いに先生は、今の最先端の技術で何ができるかを知ることからスタートすると言っていました。そうしないと、新しいものは生み出せない。何が新しいか分からないから。自分もそういうところからスタートすべく取り組んでいます。
Azure(クラウド)
- App Serviceでほぼインフラを意識しないアプリの作成
- Visual Studio Team Servicesでプロジェクト管理+バージョン管理+ビルド管理+リリース管理を一式揃えた開発環境のパターン確立
- Azureの試験合格
機械学習
- H2O.aiを使った機械学習モデルの作成
- データ処理関連の講義を受講(データ蓄積、データ分析、データ可視化を広く学習)
IoT
Serverless
- 会話型プラットフォームのエンドポイント作成
- Alexa Skill
- AWS Lambda
- Dialogflow
- Cloud Functions
来年のテクノロジ・トレンドがガートナーから発表されていました。 enterprisezine.jp
ブロックチェーンとか、ARとかも押さえておいた方が良さそうです。来年の宿題にすることにします。
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
- 呼び出し名:スキルを呼び出すときの名称 ※ここでは
トレロ
- グローバルフィールドは全ていいえ
対話モデル
次に対話モデルを設定します。
今回はスキルビルダーを使います。
スキルビルダーでは、作成するスキルで実行したい処理を呼び出す際にインテントという形で定義します。
インテントはブラウザ上で作成することができます。
一度インテントを作成すれば、JSON形式で記録されるので、再利用が可能です。
今回のインテントの定義は以下です。
https://github.com/hi1280/skill-sample-nodejs-trello/blob/master/InteractionModel.json
Code EditorのメニューからJSONファイルをインポートすることができます。
インテントを作成したら、保存及びビルドします。
設定
次に設定画面が表示されます。
スキルが実行された時に呼び出すAWS Lambdaの関数を指定します。AWS Lambdaの関数の内容については後述します。
エンドポイントとして、AWS Lambda の ARN (Amazonリソースネーム)を指定します。
Lambda関数のトリガーとして、「Alexa Skills Kit」が指定されていないと、エラーになってしまいます。
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でのテスト
参考情報
公式ドキュメント
Alexa Skills Kitによるスキルの作成 | ASK
Node.js向けAlexaスキル作成用SDK
https://github.com/alexa/alexa-skills-kit-sdk-for-nodejs
注意事項
作成したスキルがAlexaアプリのスキル画面に表示されない場合、以下を疑った方が良いです。
開発したAlexa Skillが日本語版に出てこない場合 - Qiita
感想
今回のような単純にLambda関数を声で呼び出すのであれば簡単です。
対話を考慮したスキルになると難しそうです。
タイミングとかで声をうまく認識しないことが多々あります。
- 出版社/メーカー: Amazon
- 発売日: 2017/11/15
- メディア: エレクトロニクス
- この商品を含むブログ (2件) を見る
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がスタンダードになりそうな雰囲気なので、今後はこちらを使っていくようにしたいと思います。