BLOG
Blog
技術ノート
- 2026-05-09Unity Domain 層を dotnet 姉弟 .csproj で CI に乗せる移植 playbook (30 分)Unity Personal license の CI activation が死んだので、Domain 層を Unity ランタイム抜きで dotnet test に流す姉弟 .csproj パターンを別プロジェクトに移植するための手順書。前提診断 3 項目 + 7 ステップチェックリスト + つまずき 5 個。条件が揃っていれば 30 分から 1 時間で乗る。unitycidotnetgithub-actionsplaybooktesting
- 2026-05-09dpp.vim の DppMakestate が "Not found ext" で落ちたときの復旧`:DppUpdate` のあと `:DppMakestate` が `Not found ext: "toml"` で落ちて plugin が読まれなくなる事象。ext のディレクトリ構造移行 + キャッシュ symlink 破損 + denops のランタイム要件不足の合成で起きるので、state.vim 削除だけでは直らない。`.dpp` ごと消して、ランタイムを上げてから headless で makestate を回す。neovimdppdenopstroubleshooting
- 2026-05-09MCP for Unity を入れた直後の動作検証フローと、踏んだ 3 つのハマりどころ新規 Unity プロジェクトに MCP for Unity 9.6.8 を入れた直後の動作検証 (Cube + Rigidbody 落下 + Play モード往復の 1 分スモークテスト) と、その過程で踏んだ 3 つの落とし穴 (親フォルダ未存在で create が黙ってコケる、Play モード遷移と並列の renderer 操作で instanceID 解決失敗、editor_state URI が推測で当たらない) をまとめる。MCP サーバ「生きてるのにツールが出ない」問題の確定診断 4 ステップも。unitymcpclaude-codeverificationtroubleshooting
- 2026-05-09Unity Personal license の CI activation が完全廃止された (2026-05): dotnet 姉弟 .csproj に逃がすUnity Personal を使った GitHub Actions の自動テストが、game-ci の deprecation と Unity 公式 manual activation の Personal 拒否で二重に死んでいた。Pro 移行 ($2,200/年~) も self-hosted runner も避けたかったので、Domain 層の noEngineReferences を活かして姉弟 .csproj を立て、dotnet test に逃がした。ubuntu-latest で 43 秒 6/6 pass。unitycidotnetgithub-actionstesting
- 2026-05-08X / LINE の内蔵ブラウザで Google OAuth が詰む問題と「動かないボタンを隠す」設計kokannikki.app に X / Instagram の内蔵ブラウザから飛んでくるユーザーが Google OAuth で 403 disallowed_useragent を踏んで詰むという報告が来た。Google policy はクライアント側で回避不能なので、(a) 動かない provider のボタンを env × policy の両方で gate して隠す、(b) 何が隠れたかを動的 banner で明示する、(c) 外部ブラウザに逃がす導線を platform 別に用意する、の 3 点で対応した。oauthauthin-app-browseruxkokan-nikkiauth-js
- 2026-05-07dependabot 11 本の triage で踏んだ 6 つの罠kokan-nikki の repo に dependabot を入れた瞬間、初回バーストで 7 本、途中追加で 4 本、計 11 本の PR が立った。GitHub Actions 5 本 + npm patch/minor 6 本を merge する過程で、初回バースト・conflict cascade・rebase コマンド無反応・lockfile 手解き・--auto 即時 merge・LSP と tsc のズレの 6 パターンを踏んだ。各パターンと対処を残す。dependabotgithubcipnpmgithub-actions
- 2026-05-07flex-col 親で子の max-width が効かない: auto margin が stretch を打ち消す<body class="flex flex-col"> の下に max-width: 980px; margin: 0 auto; だけ指定した <main> を置くと、viewport 1280px で main が 776px に潰れた。CSS Flexbox の cross-axis auto margin が stretch より先に解決される仕様で、子は intrinsic 幅に shrink する。width: 100% を一行足すと直る。cssflexboxtailwindlayout
- 2026-05-07kokan-nikki の CI/CD とテスト運用を解説するY2K カワイイ系の交換日記アプリ kokan-nikki (Next.js 16 + Auth.js v5 + Prisma 6 + Postgres 16) の運用を、要件 ID 駆動のテスト戦略、Testcontainers と Playwright のピラミッド、5 ジョブの GitHub Actions、coverage gate、dependabot の運用ポリシー、Playwright MCP の二層運用、Vercel の cron 設定までまとめて解説する。kokan-nikkicigithub-actionsvitestplaywrighttestcontainersdependabotvercel
- 2026-05-07kokan-nikki の技術スタック選定理由を全部書くkokan-nikki (Next.js 16 / Auth.js v5 / Prisma 6 / Postgres 16 / zod 4 / Tailwind v4 / Vitest + Testcontainers / Playwright / Resend / Vercel + Neon) は、要件と制約から逆算してツールを選んだ。次に新しい Web アプリを 1 人で組むときに同じ判断をするか確認できるよう、各層で『何を求めて、何を捨てて、何を選んだか』を全部書き残す。nextjsstackauthprismavitestplaywrightverceldesign-handoff
- 2026-05-07夜間 cron が 3 日連続発火していなかった: LaunchAgent + pmset wake で sleep 中の窓を開ける毎晩 23:30 に動かしているはずの LaunchAgent が 3 日連続で一度も走っていなかった。macOS の LaunchAgent はスリープ中に発火窓が来ると skip し、起きた後も補完しない。pmset repeat wakeorpoweron で発火直前に dark wake させて窓を開けておく。macoslaunchdcronautomation
- 2026-05-07Next.js 16 のエラーページ三層を別物として扱うNext.js 16 App Router の not-found / error / global-error は、Server/Client 境界も root layout 依存可否もテスト容易性も全部違う。一枚岩で書こうとして詰まったので、三層を別物として扱う前提で整理し直した。global-error は孤島で、layout の便利機能が一切効かない。nextjsapp-routererror-handlingfrontend
- 2026-05-04E2E が content 更新で毎回壊れるのを frontmatter から導出して直したPlaywright spec に hardcode した "5 selected works" や Now パネルの key 名が、コンテンツ更新のたびに drift して CI red になる問題。spec の setup で gray-matter + readdirSync を呼んで content/ から導出すると、spec が source-of-truth と無条件に同期する。testingplaywrightnextmdxe2e
- 2026-05-04OAuth 3 プロバイダ繋いだ日: User merge を signed cookie で安全にkokan-nikki に Google / LINE / X の OAuth を入れた過程の設計メモ。同一メアドの自動 link と、別 OAuth account の merge を 2 段階確認 (HMAC signed cookie + 10min TTL) で安全にした。authoauthnextprismaauthjs