おはようございます!!
昨日は日曜日でプログラミングの日でした。
幸い、家族が出て行きました(※「実家に帰らせていただきます!」ではありません)ので、自宅でゆっくり作業することができました。
・・・では、ちょこっと書かせていただきます。
目次
8/3(金) Alexa道場 第11回「フラッシュブリーフィングスキルを作ろう」を受講し、記事にまとめました。+ 実際に作ってみました!!
こちらですね。
実は、今回はめずらしく予習として実際に作ってみてました。
当初こちらの記事を参考に始めようとしたのですが、作成場面がほとんど変わっていて面食らいまして、結局公式のこちらのページを参考に始めました。
それはもう10分ほどで簡単にできました!これは素晴らしいです!!
・・・ただ、元のRSSファイルが10記事分の内容を含んでいるので、新着記事とは言えませんし、延々聞くのが大変です。
(このブログを作っているWordpressの)設定で変えられないかと思ったのですが見つからず、1記事分だけ情報を取り出すサイトがあったもののhttps非対応でした。
(※ フラッシュブリーフィングスキルはhttps必須)
IFTTTも探してみたのですが、使えそうなものがありませんでした。
あと、EchoSpotで動作させた場合、このような表示になりました。
記事のタイトルが長いのが悪いのですが、文字が大きすぎて最後まで表示できていません。
とはいえ、文字を小さく修正しようとしても設定欄がありません。
また、スキル作成時に設定したフィードアイコンですが、Alexaアプリでは表示されるものの、EchoSpotでは表示されませんでした。
カスタムスキルでは表示されるだけに、これはちょっと残念でした。
読み上げる記事の内容を表示する前にでも一瞬表示してくれれば良いのですが・・・
日々更新されるRSSやJSONファイルを自動で作る仕組みを作ったり、EchoSpot対応の画面表示を考えたりすると、カスタムスキルの方が楽そうですね。
もちろん、他でハマるのですが・・・
とはいえ、何か面白い使い方ができそうなので、もう少し考えてみたいと思います。
7/29(日) Alexa道場 第8回(6/21分)の復習を行いました。(つづき4)
いや~1ヶ月ですね。トコトン見つけてやろうと思ってたらあっという間でした(泣)
「スキルからの応答に問題があります」の対策で、Lambda関数のログにエラーが出ずに、nullが返ってくるということで、いろいろ確認しました。
「console.logで要所要所で変数の中身を見る」試してみました
おーらん@とにかく作るさんから教えていただいた方法ですね。
Lambdaのjsファイルの中にconsole.logを入れていきました。こんな感じです。
最初は1つ1つ入れていたのですが、キリがないのでできる限り入れて、ログの内容を再確認しました。
なんと正常にレスポンスの生成が終わったところまで通過しています。
なのに値はnullですから、これではわけがわかりません。
「LambdaからDynamoDBのデータを取得しようとして嵌った話」という情報
数日前にTwitterで見つけた情報を思い出しました。
[https://t.co/UBISAKpRK0] 【小ネタ】LambdaからDynamoDBのデータを取得しようとして嵌った話 https://t.co/WwvKbceJLX
— クラスメソッド&Developers.IO (@classmethod) 2018年8月2日
DynamoDBのデータを取得しようとしたらnullしか帰ってこないということで、まさにコレ!!・・・だったのですが、私の頭では理解できませんでした。
それ以前に、Pythonでの話でした。
もうとりあえず、片っ端から削除して、簡単な状態から試していたら・・・
先程のレスポンスのところが気になりました。元の状態はこうなってました。
もう数10回は見直しましたが間違いはありません。そもそもエラーも発生してません。
・・・ですが、念のために全て消して簡単なレスポンスを返すコードを入れたら・・・動きました!!
そこで、もう一度見比べてみたら・・・見つかりました!!
「:」が抜けてました!!
この部分が3箇所とも抜けていたので追加しました。
確認してみたところ・・・
はい!バッチリ動くようになりました。
この後も同じようにアクセスしたところ・・・
はい、ちゃんとDynamoDBが動作して、以降、砂糖は聞いてこなくなりました。
これで完了です。
考察
・・・と言うほどでもないのですが、これまでの経緯をまとめます。
- Lambda関数をDynamoDB対応に全面修正したところ、Alexa開発コンソールでのテストで「スキルからの応答に問題があります」というエラーが表示されるようになった。(JSONレスポンスなし)
。 - ログを確認したところApp_IDのワーニングがあったので修正したものの、他のエラーは一切出ていなかった。
。 - 単体でJSON入力を設定しテストしても正常終了。
ただし、なぜか結果が「null」となっていた。
。 - 結局、レスポンス部分に誤って「:」を入れ忘れ「this.emit(‘tell’,hoge1,hoge2);」のようにしてしまったことが原因だった。
(当然、レスポンスがnullになったというオチ)
こんな感じですね。(※ (濡れ衣を着せられた)DynamoDBの動作状態のチェックは省きました)
元はといえば単なる記述ミスなのですが、それがなぜか「スキルからの応答に問題があります」や「null」としてでしか表示されないんですね。
Lambda関数から‘tell’などとしてパラメータを文字列でAlexa SDKに渡しているだけなので、その時点まではエラーではなく正常なのでしょう。
その先のSDK内でエラーになっているハズなのですが、残念ながら調べ方がよくわかりませんでした。
このカラクリを理解するまで約1ヶ月、本当に疲れました。
(・・・というほど集中してできてませんでしたが(^_^;))
以上です。
ちなみに、この第8回の部分ですが、どうも動きに納得いかない部分があって修正していたものの、なぜか変な挙動が治らず、次回にまで続きます。
(おわり)