カテゴリー
Web開発者向け
Web開発者向けに関する記事を公開しています。
Astro SSR で「404 ページに飛ばす」がソフト404になる問題 — Astro.rewrite と Astro.response.status で正しく 404 を返す
Astro SSR の動的ルートでエントリ未検出時に Astro.redirect("/404") すると 302、Astro.rewrite("/404") にしても HTTP ステータスは 200 になりソフト404になります。Astro が rewrite でステータスを 200 にリセットする機構(astro@7.0.7 のソース)と、404.astro 側で Astro.response.status = 404 を立てて正しく 404 を返す方法をまとめます。
WordPress 移行後に記事内の画像が 404 になる — /wp-content/uploads/ を動的ルート1本で旧 URL のまま救う
WordPress をヘッドレス CMS へ移行したあと、本文が旧 /wp-content/uploads/ を参照したままで記事内の画像が 404 になる問題。404 の 9 割超は実体が移行済みで URL だけが古いので、本文を書き換えずキャッチオール動的ルート 1 本でファイル名からメディアを引いて 301 する設計と、WordPress 命名(-WxH サムネイル・-e 編集版)や .gitignore の落とし穴をまとめます。
無駄なクエリを削ったらクエリが増えた — エッジ SSR のリクエスト内キャッシュ重複排除と、表示不変を A/B で証明する計測
エッジ SSR(Cloudflare Workers + D1)ではレイテンシの支配項は CPU ではなく DB への往復回数です。明らかに無駄なクエリを削ったら本数が 19→22 に増えた——その裏にあるリクエスト内キャッシュの重複排除という機構と、推測で書き換えず「表示が変わっていないこと」を HTML のバイト一致で証明しながら最適化するウォーム A/B 計測の手順をまとめます。
Claude Code のサブエージェント並列で本番サイト群を保守する — 司令塔パターンの運用設計
AI コーディングエージェントを「1 人のアシスタント」ではなく「司令塔 + 並列の実働班」として編成し、本番の複数サイトを日々保守している運用の設計を書きます。git worktree での物理分離、指示書に埋め込む計測プロトコル、権限の非対称、司令塔による二重検証、人間の介入点の切り分け。実際に出荷を止めたガードレールや、報告と実体の乖離といった実例と、この方式の限界まで含めてまとめます。
Google Analytics を入れずにブログ群を運用する — Cloudflare GraphQL Analytics と GitHub Actions による監視設計
ブログ運用の一次監視に欲しいのは「配信が壊れていないか」で、それは GA4(gtag.js)を入れなくても取れます。GA4 のクライアント計測とは別レイヤーの Cloudflare エッジ計測(GraphQL Analytics API の httpRequestsAdaptiveGroups)を GitHub Actions で回し、死活チェック・週次レポート・Issue 自動起票までを組む監視設計を、GA との役割分担つきでまとめます。
AI エージェントを「自走」させるのはプロンプトではなくハーネス — 決定的な検証パイプラインの設計
AI コーディングエージェントの自律性を支えるのは長い指示書ではなく、成果物を機械的・決定的に合否判定する検証系(ハーネス)です。LLM は確率的、ハーネスは決定的というこの非対称を、決定的パイプライン・Claude Code の Hooks・ドメイン固有の検証プロトコル・観測とフィードバック・権限という5つの層に整理し、人間の介入点をどう絞るかを実運用の事実に沿ってまとめます。
Claude Code のチーム機能とサブエージェントはいつ使い分けるのか — 「P2P で連携できるなら常にチームが上位互換」への答え
「チーム機能はエージェント同士が P2P で連携できる。サブエージェントは親に報告するだけ。なら常にチームが上位互換では?」という直感に、両者の機構の違いから答えます。サブエージェント並列を実務で回している立場から、指示書が書けるか否かという一本の判断基準まで整理しました。
DNS が古い環境からドメイン切り替え直後のサイトを検証する — DoH と curl --connect-to
ドメイン切り替え直後、手元の DNS キャッシュやプロキシが古い IP を返して検証にならないとき、DoH(dns.google/resolve)で権威側の現在値を引き、curl --connect-to で名前解決だけ上書きして SNI・証明書検証込みの本番同様の確認をする手順をまとめます。
Tailwind v3 の PostCSS が第三者のビルド済み CSS を壊す — @layer の解釈衝突と v4(@tailwindcss/vite)移行
Tailwind v3 を PostCSS 経由で入れると、node_modules のビルド済み CSS まで処理対象になり、ネイティブの @layer を使う標準準拠の第三者 CSS がエラーになります。管理画面が 500 になった実例から、@tailwindcss/vite(v4)移行による解決と、実際に必要だったクラス名の書き換えをまとめます。
BudouX をサーバー環境で使うと window is not defined になる — DOM 非依存の Parser を直接 import する
日本語の改行位置制御ライブラリ BudouX を Cloudflare Workers など DOM のないサーバー環境で import すると、エントリポイントが巻き込む win.js のトップレベル window 参照で即死します。budoux/module/parser.js の Parser とモデルを直接 import する回避策と、wbr + word-break: keep-all の実装例をまとめます。
日本語 URL の 301 リダイレクトだけが効かない — percent-encoding の大文字・小文字問題
WordPress 移行のリダイレクトで、英語スラッグは動くのに日本語スラッグだけ 404 になる原因は percent-encoding の大文字・小文字でした。ブラウザは大文字(RFC 3986 の正規形)で送り、WordPress は小文字で保存する。URL API が既エンコード文字列を正規化しない仕様と、decode→encode による正規化をまとめます。
サービスアカウントが Search Console に追加できない(email not found)— Google 側バグと gcloud ADC での回避
2026年4月下旬以降、新規作成したサービスアカウントを Search Console / GA4 に追加すると「email not found」で失敗する Google 側のバグが発生しています。ユーザー認証の ADC(gcloud auth application-default login)で回避する手順と、scope・quota project まわりの4つの罠をまとめます。
astro dev がエラーも出さず死ぬ — Astro 7 の AI エージェント検出と ASTRO_DEV_BACKGROUND
Astro 7 は AI エージェントからの起動を検出すると自動でバックグラウンド + JSON モードに切り替わり、起動失敗の本当の原因が「exited before becoming ready」の一行に丸められます。ASTRO_DEV_BACKGROUND=1 での調査方法と、隠れていた Node.js 22.15 未満の registerHooks エラー、dev server 管理の正道をまとめます。
パスキーはドメインに縛られる — 独自ドメイン移行で管理者ログインできなくなる理由と対策(WebAuthn RP ID)
workers.dev などのステージング URL で登録したパスキーは、独自ドメインへ切り替えた瞬間に使えなくなります。WebAuthn の RP ID 束縛という仕様の話と、締め出されたときの復旧経路(メール配送の Slack すげ替え)、切り替え前にやるべき手順をまとめます。
Slack に送ったログインリンクが、人間が踏む前に無効化される — リンクプレビューがワンタイムトークンを消費する問題
マジックリンクを Slack Incoming Webhook に流すと、プレビュー生成クローラーが人間より先にリンクを GET してワンタイムトークンを消費し、invalid link になります。unfurl_links / unfurl_media の無効化による対策と、「GET でトークンを消費する」設計自体の問題点をまとめます。
defineConfig 系ヘルパーは identity とは限らない — 剥がすとビルドは通るのに機能が静かに死ぬ
Vite の defineConfig のような define* ヘルパーを「型のための identity 関数」と思い込んでインライン化すると、実行時の capability 正規化がスキップされ、ビルド・型チェック・デプロイが全部成功したまま通知機能だけが静かに死ぬ——その機構と、静的チェックで検出できない理由、対策をまとめます。
pnpm monorepo で共有パッケージを複数バージョンの peer に対応させる(injected dependencies)
pnpm monorepo で共有パッケージ(内製プラグイン等)が peer のフレームワークを単一バージョンに解決してしまい、異なるメジャーを使うアプリのビルドが壊れる問題を、dependenciesMeta の injected: true で解決する方法と落とし穴をまとめます。
Webhook 署名検証が body パースで壊れる問題と、生リクエストボディの取得(Astro / Cloudflare Workers)
Slack や Stripe の Webhook 署名検証は「生のリクエストボディ」に対する HMAC のため、フレームワークが body を先にパースすると検証が壊れます。原因と、Astro / Cloudflare Workers での生ボディ取得(request.text / clone)方法をまとめます。
WordPressに限界を感じたエンジニアが、EmDashにベットする理由
PHPベースの技術スタック、億劫な管理画面、サーバー保守のコスト。WordPressへの不満を抱えるエンジニアに向けて、CloudflareがAIエージェント中心に設計した新CMS「EmDash」への移行理由と、移行で同時に回収できる4つの価値を解説する。
地方在住フリーランスがオンライン完結で戦うための戦略
地方在住・フルリモート・SES契約という条件は、東京中心の王道キャリア戦略とは噛み合わない。しかし制約を直視すれば、取るべき道はむしろ明確になる。オンライン完結で戦うための3つの戦略軸を整理する。