メインコンテンツへスキップ
ブログサイトのロゴsui Tech Blog

Welcome to the sui Tech Blog!

日々の開発で得た知見や、実験的な実装を記録する技術ブログです。
TypeScript に関する記事が中心です。

ブログを読む About me
7分
GitHubActions

GitHub Actions で APT 依存をキャッシュしてワークフローを高速化する

GitHub Actions で agent-browser を使う際の APT 依存インストールを 4 つのキャッシュ戦略で検証しました。.deb ファイルをキャッシュして dpkg で直接インストールする方式でキャッシュヒット時の apt-get update をスキップでき、ワークフローの実行時間を 36〜45 秒から 16〜19 秒へ 50〜60% 削減できました。本記事では既存ライブラリの Node.js 廃止リスクも含めた各アプローチの比較と、自前実装の composite action を紹介します。

記事を読む
5分
Cloudflareセキュリティ

「Cloudflare を入れていれば安心」は半分正解だった

個人サイトに Cloudflare を入れると、ダッシュボードに攻撃ブロックのログが並びます。WordPress の設定ファイルを狙った攻撃は確実にブロックされますが、認証情報を狙った攻撃は素通りしてしまいます。それでも実害はゼロだった理由は Cloudflare ではなく、サイトの構成にありました。

記事を読む
3分
旅行ポエム

スマホ無し旅行のすゝめ

スマートフォンの制限をかけても自分で突破してしまうから、物理的に持っていかない旅をしました。温泉地である越後湯沢の宿で1泊2日、本を読んでぼんやりしてきた感想です。

記事を読む

Cloudflare Workers Static Assets は not_found_handling 未設定だと 404 レスポンスに Content-Type が付かない。"not_found_handling": "404-page" を明示することで 404.htmltext/html として配信され、iOS のダウンロードダイアログも解消される。

Playwright で特定のセレクタを待つ場合、page.waitForSelector()非推奨 (discouraged) とされており、代わりに locator.waitFor() を使用することが公式に推奨されています。

// 🤔
await page.waitForSelector('#order-sent');
 
// ☺️
const orderSent = page.locator('#order-sent');
await orderSent.waitFor();

Claude Code の出力で、スキル実行時は必ず Skill ツールが存在し、その後続メッセージとして isMeta: true プロパティが付与される。
skills を利用するように指示したのに isMeta プロパティがない場合、処理を停止するような Hooks の作成も検討できる。

Astro v5 のプリレンダリングされたエンドポイントでは、カスタム Response ヘッダーが本番ビルド時に無視される仕様がある。開発環境では以下のコードで正常に動作するが、本番ビルドでは charset=utf-8 が削除され、日本語が文字化けする。

const headers = new Headers({
  'Content-Type': 'text/markdown; charset=utf-8',
});
return new Response(body, {
  status: 200,
  headers, // 開発環境では有効、本番ビルドでは無視される
});