[{"data":1,"prerenderedAt":432},["ShallowReactive",2],{"content-/2026-03-27-diary":3,"all-pages-for-dir":430,"og-image-/2026-03-27-diary":431},{"id":4,"title":5,"body":6,"category":410,"description":411,"extension":412,"meta":413,"navigation":414,"path":415,"project_name":416,"published":417,"publishedAt":418,"seo":419,"stem":420,"tags":421,"todo":428,"updatedAt":428,"__hash__":429},"pages/2026-03/2026-03-27/diary-2026-03-27.md","2026年3月27日の開発日記 - Chrome拡張レビュー16件修正・自動仕訳ルール連携・月次推移表実装",{"type":7,"value":8,"toc":396},"minimark",[9,14,18,22,27,30,33,39,52,63,66,70,73,76,79,83,94,102,104,108,111,114,117,121,132,140,142,146,149,152,155,159,170,178,180,183,348,350,353,373,375,378],[10,11,13],"h1",{"id":12},"_2026年3月27日の開発日記","2026年3月27日の開発日記",[15,16,17],"p",{},"会計ソフトA連携Chrome拡張に一日中張り付いた。朝イチでコードレビュー16件を潰し、4400行のcontent.jsを5ファイルに叩き割り、自動仕訳ルールの連携機能を一から組み上げ、月次推移表エクスポートを仕上げ、消費税集計の計画を立てた。合間に日記の匿名化とCPEレポートも片付けた。",[19,20,21],"h2",{"id":21},"今日やったこと",[23,24,26],"h3",{"id":25},"_1-chrome拡張のコードレビューモジュール分割","1. Chrome拡張のコードレビュー＆モジュール分割",[15,28,29],{},"3つのレビューエージェントを並列に走らせてCritical 4件・High 6件・Medium 6件の指摘を洗い出し、全16件を修正した。XSS対策のescapeHtml関数追加、二重実行防止、message handlerのsender検証などセキュリティ系が中心。",[15,31,32],{},"修正後、content.js（4440行）をstorage.js / bridge.js / export.js / import.js / content.jsの5ファイルに分割。分割作業中にXSS修正で埋め込んだescapedNameバグを発見し、テンプレートリテラル内の未定義変数を静的検知するテストを追加して再発防止。",[15,34,35],{},[36,37,38],"strong",{},"主な成果:",[40,41,42,46,49],"ul",{},[43,44,45],"li",{},"Critical 4件 + High 6件 + Medium 6件を全修正",[43,47,48],{},"4440行→5ファイルにモジュール分割（テスト全通過）",[43,50,51],{},"テンプレートリテラル未定義変数の静的検知テスト追加",[15,53,54,57,58],{},[36,55,56],{},"詳細:"," ",[59,60,62],"a",{"href":61},"/chrome-extension-code-review-refactoring","Chrome拡張クラウド会計連携 - コードレビューとモジュール分割",[64,65],"hr",{},[23,67,69],{"id":68},"_2-自動仕訳ルール-エクスポートインポート同期機能","2. 自動仕訳ルール エクスポート・インポート・同期機能",[15,71,72],{},"Chrome DevToolsで会計ソフトAの内部APIを調査し、自動仕訳ルールのフルサイクル（エクスポート→インポート→同期）を実装した。",[15,74,75],{},"UIは2回作り直した。最初は独立タブで実装したが、一括エクスポートのチェックボックスに統合する形に変更。スプレッドシートの書式設定ではMaterial Designカラーで金融機関ごとに色分けし、条件/仕訳/借方貸方を縦ボーダーで区切った。",[15,77,78],{},"CTIクロスコンタミネーションバグ（extractCti()がURLから取得→別事業者に保存）とSearch APIのCSRFトークン必須（422エラー）を踏み抜いて修正。Codexレビュー3回で計画を磨いた。",[15,80,81],{},[36,82,38],{},[40,84,85,88,91],{},[43,86,87],{},"エクスポート・インポート・同期の3機能を6ファイルにわたって実装",[43,89,90],{},"スプレッドシート書式設定（Material Design、金融機関色分け）",[43,92,93],{},"CTIバグ修正、CSRF対応、フォールバックルール仕様のドキュメント化",[15,95,96,57,98],{},[36,97,56],{},[59,99,101],{"href":100},"/journal-rules-export-import","自動仕訳ルールのエクスポート・インポート・同期機能を実装した記録",[64,103],{},[23,105,107],{"id":106},"_3-月次推移表エクスポート消費税集計計画","3. 月次推移表エクスポート＆消費税集計計画",[15,109,110],{},"既存の年次推移表のコード設計が良く、startTransitionExportにperiodとyearのパラメータを追加するだけで月次推移表が動き出した。Codexレビューで致命的指摘2点（allYears汚染防止、複数年度サポート）を修正。",[15,112,113],{},"Google Sheets APIのレート制限（5年度一括時に429エラー）に対して年度間2秒クールダウンを挿入。PLヘッダー行の挿入、年度プレフィックス追加、進捗テーブルからスプレッドシートへの直接リンクなど細かいUI改善も入れた。",[15,115,116],{},"消費税集計エクスポートはChrome DevToolsでDOM調査し、colSpan展開が必要な点をCodexレビュー3回で確認。計画ファイルを作成して次のセッションに引き継ぎ。",[15,118,119],{},[36,120,38],{},[40,122,123,126,129],{},[43,124,125],{},"月次推移表エクスポート機能を実装（小規模変更で完了）",[43,127,128],{},"Google Sheets APIレート制限対策",[43,130,131],{},"消費税集計エクスポートの実装計画策定",[15,133,134,57,136],{},[36,135,56],{},[59,137,139],{"href":138},"/monthly-transition-export-excise-plan","月次推移表エクスポート実装と消費税集計エクスポート計画",[64,141],{},[23,143,145],{"id":144},"_4-日記匿名化cpeレポートメモ統合","4. 日記匿名化・CPEレポート・メモ統合",[15,147,148],{},"make-diaryコマンドで3/26の日記を自動生成後、「サービス名を伏せてほしい」との要望を受けて全コンテンツ（3/23〜3/26）からサービス名を匿名化。19ファイルの修正に追われた。",[15,150,151],{},"CPE単位申告用の書籍レポートを作成。AI臭い文章を指摘されて実務経験ベースに書き直し、/cpe-book-reportスラッシュコマンドも新規作成。",[15,153,154],{},"Excel会計テンプレートのPythonスクリプト8個をarchiveに移動し、戦略メモの統合ドキュメントを作成。返済予定表スプレッドシートの所在も特定してインベントリに記録。",[15,156,157],{},[36,158,38],{},[40,160,161,164,167],{},[43,162,163],{},"全コンテンツのサービス名匿名化",[43,165,166],{},"CPEレポート作成 + /cpe-book-reportコマンド新規作成",[43,168,169],{},"メモ統合ドキュメント・スプレッドシートインベントリ整理",[15,171,172,57,174],{},[36,173,56],{},[59,175,177],{"href":176},"/diary-content-management-cpe","日記匿名化・CPEレポート作成・メモ統合整理",[64,179],{},[19,181,182],{"id":182},"今日の試行錯誤",[184,185,186,208],"table",{},[187,188,189],"thead",{},[190,191,192,196,199,202,205],"tr",{},[193,194,195],"th",{},"#",[193,197,198],{},"テーマ",[193,200,201],{},"試したこと",[193,203,204],{},"結果",[193,206,207],{},"気づき",[209,210,211,229,246,263,280,297,314,331],"tbody",{},[190,212,213,217,220,223,226],{},[214,215,216],"td",{},"1",[214,218,219],{},"XSS修正",[214,221,222],{},"escapeHtml関数を追加して変数をエスケープ",[214,224,225],{},"成功だが副作用でescapedName未定義バグ発生",[214,227,228],{},"修正が新しいバグを生む典型例。テンプレートリテラルは未定義をエラーにしない",[190,230,231,234,237,240,243],{},[214,232,233],{},"2",[214,235,236],{},"バリデーション",[214,238,239],{},"レビュー指摘でエクスポート前にバリデーション実行を接続",[214,241,242],{},"運用ノイズが多すぎて削除",[214,244,245],{},"会計ソフトのデータは例外パターンが多い。理論上正しい検証が実務で邪魔になることがある",[190,247,248,251,254,257,260],{},[214,249,250],{},"3",[214,252,253],{},"自動仕訳ルールUI",[214,255,256],{},"独立タブで実装",[214,258,259],{},"ユーザーフィードバックで一括エクスポートに統合",[214,261,262],{},"UIは使ってみないと分からない。最初から完成形を目指すより早めにフィードバックを得るべき",[190,264,265,268,271,274,277],{},[214,266,267],{},"4",[214,269,270],{},"Search API POST",[214,272,273],{},"CSRFトークンなしでPOST",[214,275,276],{},"422エラー",[214,278,279],{},"GETでは不要だったCSRFトークンがPOSTでは必須。MF固有の仕様",[190,281,282,285,288,291,294],{},[214,283,284],{},"5",[214,286,287],{},"CTIクロスコンタミ",[214,289,290],{},"extractCti()でURLからCTI取得",[214,292,293],{},"一括エクスポート時にCTI切替後もURLが古いまま→別事業者に保存",[214,295,296],{},"引数でCTIを渡すべきだった。URLからの動的取得は一括処理で破綻する",[190,298,299,302,305,308,311],{},[214,300,301],{},"6",[214,303,304],{},"Google Sheets API",[214,306,307],{},"5年度分を連続書き込み",[214,309,310],{},"429レート制限",[214,312,313],{},"年度間にクールダウンを挟めば回避できる。リトライのみでは遅くなるだけ",[190,315,316,319,322,325,328],{},[214,317,318],{},"7",[214,320,321],{},"Amazonビジネス重複",[214,323,324],{},"cleanServiceNameがカッコを一括削除",[214,326,327],{},"「Amazonビジネス(API)」と「Amazonビジネス」を同一視",[214,329,330],{},"カッコ一括削除ではなく既知ノイズパターンのみ除去すべき",[190,332,333,336,339,342,345],{},[214,334,335],{},"8",[214,337,338],{},"AI臭い文章",[214,340,341],{},"CPEレポートをそのまま提出",[214,343,344],{},"「素人の読書感想文みたい」と指摘",[214,346,347],{},"プロフェッショナルの視点で書く。自分のプロジェクト文脈を入れて説得力を出す",[64,349],{},[19,351,352],{"id":352},"今日の学び",[40,354,355,358,361,364,367,370],{},[43,356,357],{},"3エージェント並列レビューは待ち時間が短く、観点の偏りも減る。結果マージの手間はある",[43,359,360],{},"レビュー→修正→分割の順番が正解。先に分割すると修正箇所の追跡コストが増える",[43,362,363],{},"テンプレートリテラル内の未定義変数はJavaScriptがエラーにしない。静的検知テストが必要",[43,365,366],{},"UIは早めにフィードバックを得て作り直す前提で進めるのが効率的",[43,368,369],{},"Google Sheets APIのレート制限はリクエスト数が原因。クールダウン挿入が根本対策",[43,371,372],{},"MFのPOSTにはCSRFトークン必須、alertは3つのdivが常に存在しhiddenで切替（CLAUDE.mdに記録）",[64,374],{},[19,376,377],{"id":377},"関連記事",[40,379,380,384,388,392],{},[43,381,382],{},[59,383,62],{"href":61},[43,385,386],{},[59,387,101],{"href":100},[43,389,390],{},[59,391,139],{"href":138},[43,393,394],{},[59,395,177],{"href":176},{"title":397,"searchDepth":398,"depth":398,"links":399},"",2,[400,407,408,409],{"id":21,"depth":398,"text":21,"children":401},[402,404,405,406],{"id":25,"depth":403,"text":26},3,{"id":68,"depth":403,"text":69},{"id":106,"depth":403,"text":107},{"id":144,"depth":403,"text":145},{"id":182,"depth":398,"text":182},{"id":352,"depth":398,"text":352},{"id":377,"depth":398,"text":377},"diary","会計ソフトA連携Chrome拡張のコードレビュー16件修正とcontent.js 5ファイル分割、自動仕訳ルールのエクスポート・インポート・同期機能の実装、月次推移表エクスポート、消費税集計計画、日記匿名化とCPEレポート作成を一日で完了","md",{},true,"/2026-03-27-diary","daily-log",false,"2026-03-27T00:00:00.000Z",{"title":5,"description":411},"2026-03/2026-03-27/diary-2026-03-27",[422,423,424,425,426,427],"日記","Chrome拡張機能","コードレビュー","リファクタリング","自動仕訳ルール","月次推移表",null,"cnoO5w2LyoGoZZ0bT4MHBYRQw6Y_SttARf3OZ_Xml54",[],"https://log.eurekapu.com/favicon.svg",1778379977978]