daily-log
2026年1月10日の開発日記
今日は朝7時から14時まで集中的に開発。UIデザイン原則のGood/Badコンポーネント実装が中心で、並行してOGP生成方式の刷新、法人税XTX形式の技術調査も進めた。
今日やったこと
1. UIデザイン原則 Good/Badコンポーネント実装
8カテゴリー・49原則のGood/Bad比較コンポーネントを一気に実装した。複数セッションを並行で動かして非同期で進めた。
カテゴリー構成:
| カテゴリー | 内容 | 原則数 |
|---|---|---|
| A | テキスト変更のみ | 5 |
| B | 単一コンポーネント | 7 |
| C | フォーム系 | 7 |
| D | レイアウト/配置系 | 7 |
| E | ナビゲーション系 | 6 |
| F | インタラクション/アニメーション系 | 6 |
| G | モーダル/確認系 | 5 |
| H | 情報表示系 | 6 |
実装のポイント:
- Tailwind CSSを使わずscoped CSSで自己完結型コンポーネントに統一
- GoodBadWrapper共通コンポーネントでレイアウトを標準化
- 白背景ベースでダークモード依存を排除
- Miller Columns UIで一覧性を確保
詳細: UIデザイン原則
2. agent-memoryスキルの作成
Claude Codeで対話の文脈を保存・再開するためのスキルを作成した。「記憶して」「思い出して」で発火する。
作成したファイル:
.claude/skills/agent-memory/SKILL.md- スキル定義.claude/skills/agent-memory/memories/- 記憶保存先
これでコンテキストがコンパクトされても作業を継続できるようになった。
3. OGP生成方式の刷新
Cloudflare Workerでの動的OGP生成から、Playwrightでスクリーンショットを撮影する静的生成方式に移行した。
移行理由:
- VueコンポーネントのUIをそのままOGPに反映したい
- Satoriの制約(対応CSSが限られる)を回避
- ビルド時間に影響しない
実装内容:
- OGプレビュー用ページ(
/og-preview/design-principles/[category]/[no])を作成 - Playwrightで1200x630のスクリーンショットを撮影
- 49枚の静的PNG画像を
public/og/pages/design-principles/に配置 - OG Workerのdesign-principlesハンドラーを削除
詳細: PlaywrightでVueコンポーネントをOGP画像に変換する
4. OG Workerのモジュール分割
565行のindex.tsを機能別に分割した。
分割後の構造:
apps/workers/og/src/
├── index.ts # 48行(ルーティングのみ)
├── types.ts # 共通型定義
├── handlers/
│ ├── blog.ts
│ ├── japanese-quiz.ts
│ ├── coding-standards.ts
│ ├── jleague.ts
│ └── general.ts
└── utils/
├── signature.ts
├── sanitize.ts
└── font.ts
5. 法人税 e-Tax/eLTAX技術調査
e-TaxのXTX形式(電子申告データ形式)の技術仕様を調査し、実装可能性を評価した。
主な発見:
- XTX形式はXMLベース(UTF-8)
- 国税庁からXMLスキーマが公開されており、TypeScript型への自動変換が可能
- 法人税だけで7153ファイルのスキーマが存在
- 電子署名・直接送信はe-Taxソフトに委譲し、XTX生成に集中するのが現実的
詳細:
6. UIデザイン原則ページのURL同期設計
Miller Columns UIを維持しながら、URLをパスベースで同期させる設計を策定した。
/design-principles → デフォルト(A-11が選択された状態)
/design-principles/f/8 → カテゴリーF・原則8が選択された状態
実装完了した内容:
- Nuxtのダイナミックルーティング(
/design-principles/[[...slug]].vue) - 原則クリック・矢印ナビゲーションでのURL更新
- ローカルストレージによる状態保持
- シェアボタンの追加
詳細: UIデザイン原則ページのURL同期・シェア機能 実装計画
7. トラブルシューティング
いくつかの問題に遭遇して解決した。
pnpm monorepoでwranglerが見つからない:
- シンボリックリンクが壊れていた
- ルートから
pnpm installで解決 - 詳細: pnpm monorepoでwranglerがMODULE_NOT_FOUNDになる問題
Cloudflare Workers Routesと静的ファイルの競合:
- ワイルドカード
/og/pages/*が静的ファイルもWorkerに転送していた - ルートを個別指定に変更して解決
- 詳細: Cloudflare Workers Routesと静的ファイルの罠
スクロールできない問題:
- design-principlesページで
html, body { overflow: hidden }が設定されていた :not(:global(html)):not(:global(body))でグローバル要素を除外して解決
8. コンテンツ管理の改善
非公開ドキュメントの運用ルール策定:
published: falseではなくinternal/ディレクトリに配置する方式に変更- SQLiteデータベースに含まれず、ビルド対象外になる
/update-frontmatterコマンドの作成:
- 既存記事のfrontmatter更新用スラッシュコマンド
todoの進捗状況評価(active→done判定)も含む
今日の学び
- 複数セッション並行開発が有効: カテゴリーA〜Hを並行で実装することで、1人でも高速に進められた
- Playwrightは静的OGP生成に最適: VueコンポーネントをそのままスクリーンショットできるのでUIの再実装が不要
- Workers Routesはワイルドカードを避ける: 静的ファイルまでWorkerを経由してしまうので、必要なパスだけ個別指定すべき
- scoped CSSで自己完結型コンポーネント: コピー&ペーストで再利用可能になり、依存関係が明確になる
関連記事
UIデザイン原則
OGP・インフラ
- PlaywrightでVueコンポーネントをOGP画像に変換する
- OG Worker リファクタリング計画
- Cloudflare Workers Routesと静的ファイルの罠
- pnpm monorepoでwranglerがMODULE_NOT_FOUNDになる問題