アレクサに電車の時刻をしゃべらせる 4月12日, 2023
これまで試用してきた「近くの駅の電車発車時刻をアレクサに尋ねる」マイプロジェクトもかなりこなれてきた。「○○(駅名)で次の(上り|下り)の電車は」と聞くと直近の時刻を応えてくれる。色々な時刻の電車を利用する場合には結構便利。
春のダイヤ改正も済んで、時刻表も更新した。アレクサに関連した具体的方法には記事も多いので、ここでは作業全体を見渡すためのポイントと思われる点と、AWS上に設置する短いpythonのコードの例に焦点を絞ってまとめてみた。自分でも、久しぶりにコードなどを更新しようとした時に、「あれれ、これどうするんだっけ?」とちょっととまどうことも多い。── 開発者コンソールにログインしたら英語表記で、日本語に変更するのは? とか。左下の「English(US)」を「Japanese(日本語)」にすればよいだけなのに──。それで、後日のメモになればという思いもあってのことだ。
アレクサに時刻表をしゃべらせるためには、大きく2つのことをしなければならない。
1. アレクサスキルを作成する
2. AWSにlambda関数を作成する
■ アレクサスキル
設定方法の詳細はあちらこちらに記事も多いので省略するとして、ポイントと思われる点を箇条書きで書き出せば、以下の通り。
○スキルを作成する
- ・「呼び出し>スキルの呼び出し名」を設定する ── 例: 「チャオの時刻表」
- ・「対話モデル>インテント」を追加する ── 例: 「SelectTableIntent」
- 「{St_Name}で次の{UpDown}の電車は」などを登録する。
- インテントスロット ── この「スロット」の値がlambda関数に渡されて処理対象となる。
- 例:{St_Name}
- 「ダイアログ」タグ
- 「このインテントを完了させるために、このスロットは必須です」を設定する。
- Alexaの音声プロンプト例 ── 例:{St_Name}はどこですか
- ユーザーの発話 ── 例:「{St_Name}」「{St_Name}です」「{St_Name}駅です」
- 「検証」タグ
- 「検証ルールを作成」 ── 「値セットのみを受け付ける」を選択する。
- ※例:{UpDown}も同様に作成する
- 例:{St_Name}
・アセット
- 「スロットタイプ」 ── ここに「値セット」を作成する。
- EkinoNamae 該当する駅名リスト
- NoboriKudari 「上り」「下り」
・エンドポイント
- スキルID ── こちら側のID(後の手順でlambda関数側に入力が必要なのでCopyしておく)
- デフォルトの地域 ── あちら側のID(lambda関数側の接続個所。AWSからコピーしてくる)
- 例: arn:aws:lambda:ap-northeast-….:function:NAME_OF_LAMBDA関数
- ※ この両IDを設定することでスキルとlambda関数が接続され、問い合わせに対して声で応答がある。
■ AWSにlambda関数を用意する
AWSマネジメントコンソール にアカウントを作成する。(lambda関数を利用するための詳細は省略)
設定する関数の例は github に置いてある。並んでいる mkTimeTableData.py
は時刻表データを取得しファイルするためのコード。
- lambda関数の「関数の概要」に「トリガーを追加」ボタンがあり、ここにAlexaの「スキルID」を登録する。
- lambda関数のARNが表示されている筈なので、これをアレクサスキルの「エンドポイント」にCopyする。
■ 「テスト」
アレクサスキルに戻ってテストする。
エンドポイントにAWS lambdaのARNを入力する。ここで、想定通りに応えが得られるか十分にテストする。設定に問題があると、スキルに対するlambda関数の応答をテストする手順が混乱するだろう。応答が想定外の場合、右欄「スキルの呼び出し」JSONに表示されるものがヒントになる場合が多く、この欄に何も表示されないタイプのNGは、対話モデルなどに問題があるだろう。また、「スキルが正しく応答できませんでした」という場合は、AWSのlambda関数に問題がある場合が多い。
AWSマネジメントコンソールで、「モニタリング」タブに「View CloudWatch logs」があって、応答のログを確認することができる。そこに「Error」となっている場合、解決のヒントになることがある。
■ 関連ファイルのupload方法
- ・lambda_function.py
- ・mg_timetable.txt
- ・jpholiday folder
これらをフォルダーに置き、zipに固める。- ※ jpholidayパッケージをこのフォルダーに用意するためには、(末尾のドットに注意)
- $ pip install jpholiday —target .
- ※ jpholidayパッケージをこのフォルダーに用意するためには、(末尾のドットに注意)
$ zip -r function.zip .
AWSのコードソース編集画面の右上の「アップロード元」セレクターから「.zファイル」を選び、このファイルをアップロードする。
GPXのスリム化 3月31日, 2023
山のルートデータはGarminのForeAthlete230Jで残している。これをTrailNote上に反映して山行記録としているのだ。
ただこのところ例によって電池がか細くなってきた。夕方までもたないこともある。そこで保険にGNS3000というドイツ製のGPSレシーバーも持ち歩くようになった。毎秒プロットしている。Garminの腕時計は10秒毎なので、かなり細かいと言える。地図に表示するとギザギザが目立つ。
このデータを間引くことができるのか日本の販売サイトに質問のメールを書いてみたのだが、音沙汰無し。まあできないのだろうなあ、とあきらめつつ、ドイツのメーカーのサイトを見てみると、1Hzのデータ取得を(わが希望とは逆に)4Hzで取得するコードのupdate候補が置かれているのを発見した。これからすると、ソフト的な方法で頻度を調節できるようになっているのかもしれない。
まあ、とにかく、目下は毎秒位置データを取得するのを変更することはできない。そこで、せめてでき上がったgpxファイルを間引くくらいはしてみようと考えた。
遥か昔、当時ルート記録を保管していた「ルートラボ」にポイント数の上限があったため、それに合わせることを考えてperlでスクリプトを書いて遊んだことがあった。1分に1ポイントデータにしたと思う。今回は、古いものを手直しすることは捨てて、pythonで書いてみることにした。
pythonには、XMLでもGPXでも解析用のパッケージがあるのだけど、ここでは、以前のperlのやり方だけは踏襲して、正規表現でトラック・ポイント・ブロックを抜き出した上で、INTERVAL間隔(ここでは20秒にしてみている)毎にブロックを書き出している。
コードはgithubの ここ に置いてある。
Notionの2週間表示 12月15日, 2022
予定や行動の記録をNotionのカレンダーにまかせるようになってかなり経った。出先ではAndroidで見るわけだけど、カレンダー表示は役にたたない。画面が小さいので。テーブル表示するが、どうも使いづらい。まずは試しに、先週と今週の予定・記録だけ「2週間分表示」してみようと、isLast2Weeksというformulaを工夫してみた。リスト表示しているが、きれいにカレンダー表示するにはたぶんシステムのバージョンアップを待つしかなかろう。
オリジナルなものは何もない。(TKS hkob , Sのノート )
formatDate(prop(“日付”), “YYYY-WW”) == formatDate(now(), “YYYY-WW”)
or
formatDate(prop(“日付”), “YYYY-” + format(add(toNumber(formatDate(prop(“日付”), “WW”)), 1))) == formatDate(now(), “YYYY-WW”)
※「今週のもの」or「先週のもの」。週が月曜始まりの場合。日曜始まりなら”WW”を”ww”にするのだと思う。たぶん。
【追記】時がやってきて、年末年初の表示が想定外となることに気づいた。if文のかたまり以外にエレガントな解法を見つけられずにいるので放置している。どうしてもやるなら、次のようなものになるか。「今週」は、「直前の日曜日の後で、次の日曜日以前」なわけだ。(tks Jamie )
Current Week:
if(prop(“日付”) > dateSubtract(dateSubtract(dateSubtract(now(), if(formatDate(now(), “d”) == “0”,7,toNumber(formatDate(now(), “d”))), “days”), toNumber(formatDate(now(), “H”)), “hours”), toNumber(formatDate(now(), “m”)), “minutes”) and prop(“日付”) <= dateAdd(dateSubtract(dateSubtract(dateSubtract(now(), toNumber(formatDate(now(), “d”)), “days”), toNumber(formatDate(now(), “H”)), “hours”), toNumber(formatDate(now(), “m”)), “minutes”), 7, “days”), true, false)
Last Week:
if(prop(“日付”) <= dateSubtract(dateSubtract(dateSubtract(now(), if(formatDate(now(), “d”) == “0”,7,toNumber(formatDate(now(), “d”))), “days”), toNumber(formatDate(now(), “H”)), “hours”), toNumber(formatDate(now(), “m”)), “minutes”) and prop(“日付”) > dateSubtract(dateSubtract(dateSubtract(now(), if(formatDate(now(), “d”) == “0”,7,toNumber(formatDate(now(), “d”))) + 7, “days”), toNumber(formatDate(now(), “H”)), “hours”), toNumber(formatDate(now(), “m”)), “minutes”), true, false)
【再追記】2023-01-02 同じ方針でこんな方法もあるのに気づいた。これでも問題ないか。
My isCurrentWeek:
if(prop(“日付”) > dateSubtract(now(), if(day(now()) == 0, 7, day(now())), “days”) and prop(“日付”) <= dateAdd(now(), 7 – day(now()),“days”), true, false)
My isPrevWeek:
if(prop(“日付”) > dateSubtract(now(), 7 + if(day(now()) == 0, 7, day(now())), “days”) and prop(“日付”) <= dateSubtract(now(), if(day(now()) == 0, 7, day(now())), “days”), true, false)
My isNextWeek:
if(prop(“日付”) > dateAdd(now(), 7 – day(now()), “days”) and prop(“日付”) <= dateAdd(now(), 14 – day(now()), “days”), true, false)
Gmailに接続できなくなったら 6月8日, 2022
1 Googleの2段階認証をオンにする
2 アプリ パスワードを設定する
3 Mail.appのpopアカウントを作成し直す
4 smtpサーバーに認証を設定する
gmailが「突然」Mail.appで受けとれなくなった。「アカウント名またはパスワードを確認できません」と繰り返し言われて解決方法がわからない。そんな時、Mail.appにGoogleのアプリ パスワードでの接続を設定するとうまくいくかもしれない。
Googleアカウント>セキュリティ>Googleへのログイン>2段階認証プロセス
ここでまず、Googleの2段階認証を設定する。
続けて、同じ場所にある「アプリ パスワード」を選択して、「メール(Mac)」にアプリ パスワードを登録する。
そして、Mail.appのpopアカウントを与えられたアプリ パスワードを使用して作成する。なお、smtpサーバーにもこのパスワードでの認証を忘れずに設定する。
以上で解決することもある。私は解決した。
【追記】 6月14日, 2024 Googleのサービスは頻繁に変更が行なわれる。アプリ パスワードの変更も、目下は、上記方法ではなく、次のURLにアクセスすることで可能だ。 myaccount.google.com
ufw習熟運転中 11月30日, 2021
1 日本に割り振られたIPアドレスを得る
2 利用し易いように変形する
3 ufwに渡すための拒否iPデータを作成する
長らくieserverのお世話になってきていたのだけど、乗り換えざるを得なくなりサイトのURLも変更となった。
これを機に、DebianもBullseyeにあげ、前URLからの転送も敢えてせずに心機一転始めることにした。さあいよいよufwを設定しなければ。これまではiptablesとfail2banでやってきていたので、なかなか慣れない。
そんなこんなで、あちらこちらから襲来する迷惑な「覗き魔」に対して、目下はufwの習熟運転中。
まず、使用する「日本に割り当てられているiPのリスト」(jp.txt)を最新のものに更新した。
https://ipv4.fetus.jp/jpからCIDRリストを入手し、
1.0.16.0/20
1.0.64.0/18
1.1.64.0/18
…
自分で利用するのに便利な形にする(jpwork.txtはjp.txtの注釈行を削除したもの)。cidr2rangeとconvipはかなり昔作った小さなものだけどまだ充分便利。
$ xargs -L1 cidr2range < jpwork.txt | convip > jpiplist_new.txt
001.000.016.000-001.000.031.255
001.000.064.000-001.000.127.255
001.001.064.000-001.001.127.255
…
これまでは上記の表を勘案してiptablesに入力していたが、表から隙間をみつけるのが面倒なので、拒否したいiPを日本割り当てリストの隙間にみつけ、ついでに隙間をすべて拒否するためのデータをプログラムで挙げてもらうことにした。<下記「from_to」参照>
示されるデータ
$ from_to DENYIP
DENYIP
CIDR1
CIDR2
…
ここに示されるCIDRsを適宜「# ufw insert N deny from CIDR to any」のように手動で入力することにしている。これもfrom_toに組み込めるけど、まあ目下は手動でいいだろう。慣れてきたらまた考えよう。
-
-