本文へ移動
myowchick

Blog

考えたこと、調べたことの置き場。

公開鍵をHMACの鍵にするとJWTの署名が通る

  • 実装ノート
  • JWT
  • セキュリティ

ヘッダのalgを信じる検証器は、RS256の公開鍵をHMACの鍵に流用した偽トークンを通す。alg混同の実演と、Web Cryptoだけで検証を書くときのbase64urlとUint8Arrayの穴。

JPEGのEXIFは再圧縮せずに消せる — 残すものを繋ぎ直すだけ

  • 実装ノート
  • 画像
  • TypeScript

JPEGのメタデータは画像を開き直さなくても、残すセグメントを繋ぎ直すだけで落とせる。TIFF構造をII/MM両対応で読む勘所と、消したと言ったあとに何が残るのか。

白の色相が89.88度になる — OKLCH変換の検算

  • 実装ノート
  • 色
  • アクセシビリティ

彩度0の白に色相は無いはずなのに、実装は89.8756度を返す。CSS Color 4の経路で期待値を作る検算と、コントラスト比を四捨五入すると不適合なのに4.50と出る色の話。

絞り込みUIのrole=statusが150msだけ嘘をつく

  • 実装ノート
  • アクセシビリティ
  • React

デバウンスを挟むlive regionは、切り替えた直後の150msだけ前の条件の件数を読む。Tailwind v4のaria-pressed:変種が[aria-pressed=true]にしか当たらない話も。

Pagefindのfiltersに空文字を渡すと0件になる

  • 実装ノート
  • Pagefind
  • JavaScript

絞り込みなしを空文字で表すと、検索結果が全部消える。pagefind 1.5.2で渡し方を4通り試した結果と、data-pagefind-filterの置き場所、pf_fragmentを開いて索引を直接読む手順。

SubtleCryptoにMD5は無い — 穴は定数ではなくパディング

  • 実装ノート
  • Web API
  • 暗号

ブラウザ標準のSubtleCryptoはMD5を受け付けない。RFC 1321を依存なしで書くと、64個の定数は写さなくてよくて、代わりにパディングが落とし穴になる。付属のテストベクタ7本は境界を1本も通らない。

日本の祝日はデータなしで計算できる — 導けないのは3年分だけ

  • 実装ノート
  • JavaScript
  • 日時

祝日法の規則をコードに写すと、年ごとの表を持たなくて済む。固定日・ハッピーマンデー・春分秋分の近似式・振替休日・国民の休日の重ね方と、近似式が2100年でずれる理由。

Intlの和暦は1年目を「元」で返す

  • 実装ノート
  • JavaScript
  • 日時

改元日の表はIntlに任せられる。ただしformatToPartsのyearは1年目だけ「元」で返り、Number()に通すとNaNになる。明治より前の元号、逆変換の非対称さ、干支の剰余まで。

cronの*,13と13,*は年52回と年365回になる

  • 実装ノート
  • cron
  • 日時

日と曜日を両方書いたときのOR判定は、フィールドの先頭1文字が*かどうかだけで決まる。展開すれば同じ値になる2つが52回と365回に割れる理由を、cronieの実装と突き合わせた。

BPM 120だけまともに鳴るメトロノーム — 先読み予約と丸め誤差

  • 実装ノート
  • 音声
  • JavaScript

拍の予約位置を時刻で持ったら、同じ拍を5回予約していた。BPM 120では起きず、startTime 0のテストも素通りする。先読みスケジューリングの組み方と、丸め誤差が整数に落ちるところで牙をむく話。

タグから探す →