20210605
約 2 週間分、溜まってしまった。
[その他] 「左に曲がります、ご注意ください」
夏になって窓を開ける機会が増えたから、気になることが増えた。
ドライバーからしたら、左折やバックは死角で気づきにくいから周囲に注意を促したいという気持ちは分かる。だから、「騒音」とまで言うつもりはないけれど、文章を読み上げる必要があるんだろうか?とは思う。文章を読み上げられると、「何を言っているんだろう?」と気になってしまう(それを「騒音」と捉える人もいるんだろう)。
それとも、ピロンピロンと音を鳴らすよりも、文章を読み上げたほうが事故防止に効果的なんだろうか? そういう科学的根拠があるんだろうか?1
と思ったけど、たぶんそもそも実験なんかしてなくて、ただ単に「文章を読み上げたほうが丁寧だ」という発想でやっているんだろうなあ。日本人はとにかく機械に文章を読み上げさせるのが好きだから。風呂の湯が沸いたときに「沸きました」と、一々、言わせるぐらいなんだから。
[AWS] Cognito の公開鍵
AWS Cognito のユーザープールは、秘密鍵で署名して JWT (JSON Web Token)を発行する。トークンを受け取った側は、AWS がユーザープールごとに公開している公開鍵を使って検証する。
公開鍵は、以下の URL からダウンロードできる(ドキュメント)。
https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json
問題は、これを毎回ダウンロードするべきかどうか。いろいろな実装例を見ても、処理のたびに都度ダウンロードしているものもあれば、一度ダウンロードして使いまわしているものもある。どちらが正解なのか?
公開鍵が不変ならば後者でいいかなと思っていたけど、AWS 的には「将来ローテートするように変更するかもしれない」という立場らしい。
Cognito UserPool currently does not rotate keys but this behavior can be changed in future. For example, we may periodically rotate keys or allow a developer to replace the keys. We recommend that you cache each key in jwks uri against kid. Now when you process Id or Access token in your APIs, you should check the kid in JWT header and retrieve the key from cache. When your API sees token with different kid, you should query jwks uri again to check if keys have been changed and update your cache accordingly with new keys.
回答から 5 年経って、いまだにローテート機能が実装されていないんだから、もう実装されることないんじゃないかとも思うけど。
[AWS] AWS SDK for JavaScript v3 のビルドでエラー
AWS SDK for JavaScript v3 を使っているソースコードをビルドしたら、以下のエラーが出た。
node_modules/@aws-sdk/types/dist/cjs/util.d.ts:92:42 - error TS1005: ',' expected.
92 export declare type UserAgentPair = [name: string, version?: string];
~
node_modules/@aws-sdk/types/dist/cjs/util.d.ts:92:60 - error TS1005: ',' expected.
92 export declare type UserAgentPair = [name: string, version?: string];
Issues があった。
TypeScript のバージョンが 4 以降でないとダメらしい。
AWS CDK も使っているソースコードだったけど、CDK でデフォルトで入ってくるのが 3.9.7 だったからエラーになっていたみたい。
[AWS] AWS SDK for JavaScript v3 でクレデンシャルを指定するには
検索しても v2 の情報ばかりヒットしてしまうので、メモしておく。
const {fromIni} = require("@aws-sdk/credential-provider-ini");
const s3Client = new S3.S3Client({
credentials: fromIni({profile: 'work-account'})
});
[TypeScript] 型の拡大
AWS SDK for JavaScript v3 で、Cognito の AdminListGroupsForUserCommand を使おうとしたら、 TypeScript でエラーになった。
TS7022: 'NextToken' implicitly has type 'any' because it does not have a type annotation and is referenced directly or indirectly in its own initializer.
let nextToken;
const groups: string[] = [];
while (true) {
const { Groups, NextToken } = await cognitoClient.send(
new AdminListGroupsForUserCommand({
UserPoolId: userPoolId,
Username: email,
NextToken: nextToken,
}),
);
if (!Groups) {
break;
}
const tmpGroups: string[] = [];
for (const Group of Groups) {
if (!Group.GroupName) {
continue;
}
tmpGroups.push(Group.GroupName);
}
groups.push(...tmpGroups);
if (!NextToken) {
break;
}
nextToken = NextToken;
}
return groups;
なお、 tsconfig.json
で noImplicitAny
が true
になっている。
一番最初の
let nextToken;
が any
になっていることが原因だった。なので、
let nextToken: AdminListGroupsForUserCommandOutput['NextToken'];
という風にしてあげると、エラーは解消する。
これは 『プログラミング TypeScript』 で 型の拡大 と呼ばれている挙動らしい。その 126 ページによると、以下のとおり。
型の拡大(type widening)は、TypeScript の型推論がどのように機能するかを理解するための鍵になるものです。概して、TypeScript は型を推論するときに寛大であり、考えられる最も具体的な型ではなく、より一般的な型を推論する傾向にあります。しかしこれにより、プログラマーの作業はより簡単になり、型チェッカーの不満を抑えるために費やす時間が少なくて済むのです。
要するに「上手いことやってくれるよ」ということらしい。今回の挙動は 127 ページに書かれている。
null または undefined に初期化された変数は、any に拡大されます。
let a = null // any
a = 3 // any
a = 'b' // any
[JavaScript] NODE_ENV=production
前も躓いた。
[iOS] 「サーバにセキュリティ保護された接続を確立できませんでした」
iPhone でのみ、以下のエラーが出て、サイトを表示することができないという事象が発生した。
ページを開けません。Safariはサーバにセキュリティ保護された接続を確立できませんでした。
しかし、macOS や Android では事象が発生しない。
さらに詳しく調べると、iPhone でも事象が発生するのは iOS 14 だけで、13 では普通に表示できるという。なんかその辺のバージョン差異がヒントになりそうだなと思って検索したら、以下の記事が見つかった。
で、これが大当たり。
そもそも RFC 的にはアンダースコアは 使えない のが正しいらしい。なんで Apple が iOS 14 で修正して、macOS で修正していないのかは謎だけれど、「RFC 準拠です!」と言われたら従うしかないので。
本当は RFC のどこに書いてあるかまで調べるべきなんだろうけど、わりと沼っぽい気がしたので、今回はここまでで。
[乃木坂46] 鈴木絢音 x 飯間浩明
私の推しは辞書好きで有名なのですが、『三省堂国語辞典』の編纂者の1人である飯間先生と対談した記事が出ていた。今月の 小説幻冬 にも掲載されていたけれど、分量が少ないなあと思ったら、未公開分がかなりあったみたい。
いろいろ興味深いけれど、飯間先生から見た乃木坂のイメージが興味深い。
我々の作る『三省堂国語辞典』は、できるだけ現代的にしたいので、「どうだろうなぁ、乃木坂が歌っているとおり、着替える(きがえる)にしようかな」なんて思う。そうやってけっこう、乃木坂46を基準にしてるところがあるんです。
それって乃木坂というよりは秋元康じゃないかな?とも思ったけれど、ともかく、秋元康は流行語を取り入れるのに柔軟だとは思う。逆に、小室哲哉は、作詞するときに気をつけている点として、こんなことを言っていたらしい。
流行語を使わない、10〜20年後でも何かに当て嵌めようとすれば誰でも主人公になれるような、あまり時代に寄り添い過ぎない普遍的なワードしか使わない
長く残るようなものを作りたい小室哲哉と、時代に身を任せて瞬間的なヒットを狙う秋元康。2 人とも率直にスゴイと思うけれど、人生観としては秋元康のほうがより楽しく生きられるように思うのは私だけだろうか?2
あまり静かすぎるのも問題で、トヨタのハイブリッド車が静かすぎて危険なので、擬似モーター音を出す装置を付けるようにしたという話が、昔あった。たしかに、ときどき、後ろから、あの擬似モーター音が近づいてきて、ようやく接近に気づくことがある。 ↩︎
自分自身に関して言えば、時代に抗おうとするものの、結局何も為すことができずに、ずっと敗北し続けている感はある。昔、親に「お前はまだ何もしていない。努力が足りない」と言われたことがあるけれど、それは「お前は努力すれば出来るはずだ」という過大評価があったからに過ぎない。数年経って分かったのは、結局、私もまた世間一般の人々と同様に、歴史の海の中に埋没していくだけの平凡な才能しか持ち合わせていない平凡な人間であったということである。 ↩︎