Alexaの基本的なスキル作成3(デバッグ)
2021/6
■ 前回
インテントやらスロットやらで何を発言したのか、それをどうまとめて処理するのかのあたりをやりました。
適当に話すだけのスキルなら、これを拡張していくだけである程度作れそうですが、これ以上やるとなるとDeveloperConsoleで作るのはだれがどう言っていても不可能だと申し上げたい。
何故ならば、とことんデバッグ関係が無い。存在しない。
エラーチェックもほぼ無しなので、デプロイしてテスト実行して「スキルがリクエストに正しく応答できませんでした」を延々と聞き続けることになります。
実際、何度か心が折れました。
■目的と手段
せめてPrintfデバッグっぽいレベルができるまでなんとかしたい。
やることは簡単なことだけで何とかしたい。
欲は出さない。
-
第一段階
言語的な問題のチェックはオフラインで済ませたい。 -
第二段階
問題が起こった個所がわかるようにしたい。 -
第三段階
簡単ならデバッグしたい。
調べると多くの人がいろいろとやってますが、オフラインでサーバー環境を整えるとかハードルが高そうなものがゴロゴロしていて、自分みたいな弱者には心が折れるだけでした。
■とりあえずVSCode
DeveloperConsoleでも推しているぽい「Alexa Skills Toolkit」なんて拡張がVSCodeにはあるようです。
とりあえずこれ入れて、SingInします。
まずは「Download and Edit skill」ですね。
何もないフォルダにダウンロードします。
残骸とかがあると正常に作動してくれませんでしたので、まだまだ駆け出しということなんでしょう。
さて、サーバーにあったファイル群が手に入りました。(よね?) DeveloperConsoleにもダウンロード、インポートなどありますが、ダウンロードは全然進まないし、インポートはZIP化して読ませないといけないみたいだし無視しました。
■Pythonの言語チェックするために
インポート関係、言語関係、ビルド関係などのデバッグをするためにスキルのlambda_function.pyがインポートしているコードが欲しいですね。
ということで、ask-sdkを入れます。 pipでサクッと入れられる。最高だ。
pip install ask-sdk
本来は別環境を作ったうえで、そこにいれて実行できるようにしたりするみたいですが、ソースチェックをとにかく簡単にしたい場合、手っ取り早くソースをimportできる場所に置いてしまいます。
これで、VSCodeを再起動すると、importしてるファイルが見つかってる状態になってるはずです。
定義も右クリックからたどれるので、いろいろNode.jsとの違いでわからないあたりがスッキリします。
この状態で、何も考えずにVSCodeの実行ボタンを押せば実行前処理が走り、問題があればエラーが出るし、何事もなく終わったようなログが出れば言語的なチェックができたことになります。
これで「スキルがリクエストに正しく応答できませんでした」を聴く回数が80%オフぐらいになった。
■問題が起こった場所が知りたい
次は実行時の問題ですが、例外、スタックトレースが見れさえすればほぼデバッグ可能だな。
ということで、ちょっと荒業ですが、CatchAllExceptionHandlerをこんな風に変えてしまいます。
# importしてね
import traceback
# 何か例外が起こりました (すべて受ける)
class CatchAllExceptionHandler(AbstractExceptionHandler):
def can_handle(self, handler_input, exception):
return True
def handle(self, handler_input, exception):
msg = "exception: {}: {}".format(exception, traceback.format_exc())
return handler_input.response_builder.speak(msg).ask(msg).response
これで、実行時に問題が起こればAlexaが全部しゃべります。
かなり鬱陶しいですが、シミュレータ上では文字で確認ができるので、これで問題個所は特定できると思います。
tracebackの中を見ると、ほかの表記もありそうなので表記を整理したい人は調べてみるといいと思います。
とはいえ、完全にすべてraiseしてるわけじゃないので、結局「スキルがリクエストに~」を聴く羽目になるんですが・・・。
■デバッグ?できるの?
さて、少しだけ欲を出して「ASK SDK Local debug」試すだけ試したんですが・・・ダメでした。
VSCodeのAlexaのところにDeployやらOpenSimulatorやら夢のある単語が並んではいるんですが、まともに動いてるようには見えない。
色々な設定が必要そうなので、根気がある人はやってみたらいいんじゃないでしょうか。
そして教えてほしい。
クソ簡単にまとめてほしい。
■これらによる運用
スマートではないですが、オフラインでlambda_function.pyを編集し、丸コピしてDeveloperConsoleではっつけて、デプロイしてテストするです。
ところで、loggerってどこに出てるの??意味あるの?
■雑記
DeveloperConsoleはスキルの制作に触れてもらう初期の初期、ウィザードで作ったものを実行するまでしか想定していないんじゃないかという出来ですね。
コードエディタもUndo、Redoがバグってていつ紛失するかわからないという状態ですし、プログラム部分はオフラインで作るしか選択肢はないなと。
インテント、スロットタイプはDeveloperConsoleでも大して困らないかなという感じではあるんですがね。
■次
オーディオやる。
というか、後はそれしかやる気がない。
そもそも、AlexaでやりたかったのはPCとかで動いてるプログラムから適宜Alexaにしゃべらせるってやつ。
出力先の一つとしてというレベルで。
認証が必要で、なんとも使いづらい。
API_KEYみたいな感じで、自分のデバイスに対してスパッと投げられるといいんですが・・・。
あとは、AmazonMusicだと、自分のプレイリストも再生してくれないので、どっかに置いたファイル再生してほしいなというぐらいで、それはスキルで何とかなりそうなので、この流れのままやります。