[{"data":1,"prerenderedAt":381},["ShallowReactive",2],{"content-/japan-memory-export-price-page":3,"all-pages-for-dir":360,"related-/japan-memory-export-price-page":361,"og-image-/japan-memory-export-price-page":380},{"id":4,"title":5,"body":6,"category":339,"concepts":340,"description":341,"extension":342,"meta":343,"navigation":344,"ogImage":340,"path":345,"project_name":346,"published":347,"publishedAt":348,"seo":349,"source":350,"stem":351,"tags":352,"todo":340,"unpublished":347,"updatedAt":340,"__hash__":359},"pages/2026-08/2026-08-31/japan-memory-export-price-page.md","財務省貿易統計で日本のNAND輸出単価を再現し、統計ページにする",{"type":7,"value":8,"toc":327},"minimark",[9,13,16,20,23,26,29,42,46,49,52,55,58,61,64,68,71,74,77,80,218,221,224,227,230,233,240,244,247,254,257,260,263,266,269,272,275,282,285,288,291,294,297,304,307,323],[10,11,12],"p",{},"Xのタイムラインに「日本のNAND輸出単価 月次推移グラフ」という図が流れてきた。\n添えられた説明によると、2022年から2025年までおおむね1,000〜2,500円のボックス圏で動いていた線が、2026年4月以降にその枠を抜け、7月は7,631.5円まで跳ねているという。",[10,14,15],{},"跳ねたこと自体より先に気になったのは、この数字がどこから出ているのかだった。\n月次で誰でも取れる統計なら、自分のサイトに常設したい。\n出所が分からないうちは載せられない。\nだから最初に投げたのは、チャートを描く指示ではなく、出所を特定する指示だった。",[17,18,19],"h2",{"id":19},"図の数字が手元で再現できるか",[10,21,22],{},"Claude Code に統計の当たりを付けさせたら、財務省貿易統計の統計品別表に行き着いた。\n9桁の統計品目番号で品目が細分されていて、NAND（8542.32-921）が単独で取れる。",[10,24,25],{},"2026年7月分は、金額が185,383,600千円、数量が24,291,760個だった。\n割ると7,631.5円になった。\nXの図と小数第1位まで一致した。",[10,27,28],{},"ここで作ることを決めた。\n同じ数字が自分の手元から出るなら、あとは取得と表示をつなぐだけになる。",[10,30,31,32,41],{},"公表サイクルを確認させたところ、そこに落とし穴があった。\n月次の「速報」は翌月20日頃に出るが、9桁の品目別が入るのは翌月末に出る「確報」のほうである。\n速報の日に取りにいっても、新しい月は1行も増えない。\n更新の当番日は確報側に合わせないと、毎月「変更なし」だけを見て終わることになる。\n公表予定日の正本は",[33,34,40],"a",{"href":35,"target":36,"rel":37},"https://www.customs.go.jp/toukei/calendar/calend.htm","_blank",[38,39],"noopener","noreferrer","税関の公表予定カレンダー","の「輸出確報」列に載っている。",[17,43,45],{"id":44},"dramと完成品の数字が小さいのが引っかかった","DRAMと完成品の数字が小さいのが引っかかった",[10,47,48],{},"同じ表にはDRAM（8542.32-911）と、SSDやUSBメモリのような完成品（8523.51-000）も並んでいる。\n数字を眺めていると、どちらも金額が小さい。\n日本から出ていくメモリは、完成品より前工程寄りのものが中心という構図に見える。",[10,50,51],{},"構図を確かめたくて、輸入側も取らせて見比べた。\n輸入は品目の細分が輸出と違うので、まず品名を突き合わせるところから始めてもらった。\n比較は構図の確認だけで終わらせ、ページに載せるのは輸出側に絞った。",[17,53,54],{"id":54},"報告と実物のずれ",[10,56,57],{},"ここで一度、手を止めさせた。\n「今回作ってくれた記事ページはどこですか。フルパス教えて」と聞いた。",[10,59,60],{},"返ってきたのは「まだ1つもファイルを作っていない」という答えだった。\n前の応答には「実装に入ります」と書いてあった。\nそれでもディスクには何も無い。",[10,62,63],{},"調査の報告が具体的だと、実装まで進んだ気になる。\n実際に増えていたのはコンテキストだけで、ファイルは0件だった。\n以降は区切りごとにフルパスを聞くようにした。\n存在しないパスは、聞けばその場で分かる。",[17,65,67],{"id":66},"ssotの設計とパーサ","SSOTの設計とパーサ",[10,69,70],{},"取得したデータは、ページが読む1本のTypeScriptファイル（SSOT）にまとめることにした。\n収録する期間は2022年1月以降に区切った。\nHS2022の発効でこの年から品目細分がそろうため、それより前は同じ系列として並べられない。",[10,72,73],{},"収録したのは10品目。\nページに出すのはNANDとベアチップ、DRAM、完成品の4つで、残りはSSOTに持たせておく。\n系列を足したくなったときにデータを取り直さずに済む。",[10,75,76],{},"単価は金額を数量で割って出す。\n数量の単位が「個」でない品目は単価を null にした。\n8542.32系はUnit2に、8486系はUnit1に「個」が来るので、列の位置ではなく単位記号で判定させている。",[10,78,79],{},"つまずいたのはCSVのパースだった。\nHS列のクォートを片側しか剥がしておらず、品目コードが一致しなかった。\nクォートは両端に付いている。",[81,82,87],"pre",{"className":83,"code":84,"language":85,"meta":86,"style":86},"language-js shiki shiki-themes vitesse-light vitesse-light","// HS列は両端にクォートが付く。片側だけ剥がすとコードが一致しない\nexport const parseCsvRow = (line) =>\n  line.split(',').map((c) => c.trim().replace(/^'|'$/g, ''))\n","js","",[88,89,90,99,130],"code",{"__ignoreMap":86},[91,92,95],"span",{"class":93,"line":94},"line",1,[91,96,98],{"class":97},"sxvE3","// HS列は両端にクォートが付く。片側だけ剥がすとコードが一致しない\n",[91,100,102,106,110,114,118,121,124,127],{"class":93,"line":101},2,[91,103,105],{"class":104},"sHkkW","export",[91,107,109],{"class":108},"stQ0i"," const",[91,111,113],{"class":112},"senZ8"," parseCsvRow",[91,115,117],{"class":116},"shFtX"," =",[91,119,120],{"class":116}," (",[91,122,93],{"class":123},"s4oTP",[91,125,126],{"class":116},")",[91,128,129],{"class":116}," =>\n",[91,131,133,136,139,142,145,149,153,155,158,161,164,167,169,172,175,177,180,183,186,188,191,194,197,200,202,205,207,210,212,215],{"class":93,"line":132},3,[91,134,135],{"class":123},"  line",[91,137,138],{"class":116},".",[91,140,141],{"class":112},"split",[91,143,144],{"class":116},"(",[91,146,148],{"class":147},"sMJiu","'",[91,150,152],{"class":151},"sdGka",",",[91,154,148],{"class":147},[91,156,157],{"class":116},").",[91,159,160],{"class":112},"map",[91,162,163],{"class":116},"((",[91,165,166],{"class":123},"c",[91,168,126],{"class":116},[91,170,171],{"class":116}," =>",[91,173,174],{"class":123}," c",[91,176,138],{"class":116},[91,178,179],{"class":112},"trim",[91,181,182],{"class":116},"().",[91,184,185],{"class":112},"replace",[91,187,144],{"class":116},[91,189,190],{"class":147},"/",[91,192,193],{"class":104},"^",[91,195,148],{"class":196},"sLkVR",[91,198,199],{"class":108},"|",[91,201,148],{"class":196},[91,203,204],{"class":104},"$",[91,206,190],{"class":147},[91,208,209],{"class":104},"g",[91,211,152],{"class":116},[91,213,214],{"class":147}," ''",[91,216,217],{"class":116},"))\n",[10,219,220],{},"パーサを直してSSOTを作り直したら、7,631.5円が出た。\nXの図と同じ数字が、今度は自分のリポジトリから出てきた。",[17,222,223],{"id":223},"ページ側で出た手直し",[10,225,226],{},"Vueのページをheredocで流し込もうとしたら、長すぎて途中で壊れた。\nWriteツールに切り替えて作り直させた。",[10,228,229],{},"スタイルは既存のメモリメーカー系ページから引き継がせている。\n隣のページと並べたときに揃わなくなるのが嫌で、新しいトンマナは作らせなかった。",[10,231,232],{},"トップのカード、一覧、ナビ、公表スケジュールにも登録させた。\nその途中で、関連ページのリンクに本番では404になるページが混ざっているのを見つけた。\ndevサーバーでは開けてしまうので、リンク先を1つずつ当たらないと気づけない。",[10,234,235,236,239],{},"Chromeで開いて、さらに2箇所直させた。\n統計品目番号が ",[88,237,238],{},"854232921"," の生コードのまま表に出ていた。\n数量が億単位で、桁を数えないと読めなかった。",[17,241,243],{"id":242},"x軸から月が消えた","X軸から月が消えた",[10,245,246],{},"長期系列のチャートは、36ヶ月を超えると各年1月だけにラベルを間引く実装になっていた。\nこのページの系列は55ヶ月ある。\nその結果、X軸には年しか出ず、右端が何月なのか読めなくなっていた。",[10,248,249,250,253],{},"間引き自体は残したまま、",[88,251,252],{},"'YY/M"," の形を保つように直してもらった。\nラベル数が上限に収まる最小の間隔を3ヶ月、6ヶ月、12ヶ月の順に選ぶ。\n拾う起点を先頭ではなく末尾に置いて、最新月には必ずラベルが付くようにした。\n直近がどの月なのかを読めなくするくらいなら、古い側が欠けるほうがいい。",[10,255,256],{},"31ヶ月の韓国ページは閾値の内側なので、表示は変わっていない。",[17,258,259],{"id":259},"落ちた3件のテスト",[10,261,262],{},"このページ用のテストは20件になった。\n最初の実行で1件だけ落ちた。",[10,264,265],{},"単価と数量から金額を逆算して照合するテストで、逆算値がわずかにずれた。\n原因はデータ側ではなかった。\nSSOTの金額を億円の小数1桁に丸めているので、逆算するとその丸め幅のぶんだけずれる。\n許容幅を丸め幅から導出する形に直させた。",[10,267,268],{},"全体テストではさらに2件落ちた。\n公表スケジュールのテストで、追加したエントリのimportが足りず、行順も「公表ラグの昇順」という規約に違反していた。\n正しい位置へ移して通した。",[10,270,271],{},"スケジュールページには反映月2026-07、次回9/28頃と出るようになった。",[17,273,274],{"id":274},"毎月の更新をどう回すか",[10,276,277,278,281],{},"更新は ",[88,279,280],{},"/update-japan-chip-exports"," に閉じた。\n差分を追記するのではなく、2022年からの全年を毎回取り直して全再生成する。\n貿易統計は改定が入るので、速報値を固定して積み上げると系列の中で整合が取れなくなる。",[10,283,284],{},"e-Stat側の構造が変わって1品目も抽出できないときは、スクリプトが例外を投げて止まる。\n黙って欠測にしない設計にした。",[10,286,287],{},"make-diaryチェーンにも組み込んだので、毎朝の流れの中で月末に拾える。",[17,289,290],{"id":290},"コミットとプッシュ",[10,292,293],{},"コミットの手前で学習ゲートに止められた。\nステージしようとしたら、別セッションが触っている途中のファイルが未ステージに混ざっていた。\n巻き込まずに、自分の作業由来のものだけをステージし直させた。",[10,295,296],{},"同じころ、全体テストでスイートごと落ちているものを見つけた。\n原因の調査はCodexに投げて、こちらはコミットを先に進めることにした。\n学習ゲートは今回スキップした。",[10,298,299,300,303],{},"プッシュは1回はねられた。\noriginが3コミット先に進んでいて、中身は別マシンで作った日記のコミットだった。\n",[88,301,302],{},"svgManifest.json"," が両側で変わっていたので、先に退避してからマージした。\n衝突は出ず、そのままプッシュできた。",[17,305,306],{"id":306},"学び",[308,309,310,314,317,320],"ul",{},[311,312,313],"li",{},"図を見て最初にやることは、チャートを描くことではなく、同じ数字を手元で再現することだった。小数第1位まで合った時点で、あとの実装で迷う場所が無くなった。",[311,315,316],{},"統計は「公表される日」より「その日に何が入るか」を見る。速報と確報で粒度が違うので、当番日を間違えると毎月空振りする。",[311,318,319],{},"「実装に入ります」は成果物ではない。区切りでフルパスを聞けば、0件かどうかがその場で分かる。",[311,321,322],{},"テストが落ちても、データが間違っているとは限らない。今回は、丸めた値を逆算して比べていた側に問題があった。",[324,325,326],"style",{},"html pre.shiki code .sxvE3, html code.shiki .sxvE3{--shiki-default:#A0ADA0;--shiki-dark:#A0ADA0}html pre.shiki code .sHkkW, html code.shiki .sHkkW{--shiki-default:#1E754F;--shiki-dark:#1E754F}html pre.shiki code .stQ0i, html code.shiki .stQ0i{--shiki-default:#AB5959;--shiki-dark:#AB5959}html pre.shiki code .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}html pre.shiki code .shFtX, html code.shiki .shFtX{--shiki-default:#999999;--shiki-dark:#999999}html pre.shiki code .s4oTP, html code.shiki .s4oTP{--shiki-default:#B07D48;--shiki-dark:#B07D48}html pre.shiki code .sMJiu, html code.shiki .sMJiu{--shiki-default:#B5695977;--shiki-dark:#B5695977}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}html pre.shiki code .sLkVR, html code.shiki .sLkVR{--shiki-default:#AB5E3F;--shiki-dark:#AB5E3F}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":86,"searchDepth":101,"depth":101,"links":328},[329,330,331,332,333,334,335,336,337,338],{"id":19,"depth":101,"text":19},{"id":44,"depth":101,"text":45},{"id":54,"depth":101,"text":54},{"id":66,"depth":101,"text":67},{"id":223,"depth":101,"text":223},{"id":242,"depth":101,"text":243},{"id":259,"depth":101,"text":259},{"id":274,"depth":101,"text":274},{"id":290,"depth":101,"text":290},{"id":306,"depth":101,"text":306},"dev",null,"Xで見た日本のNAND輸出単価グラフを財務省貿易統計から自前で再現した記録。e-Statの統計品別表を取るスクリプトとSSOT生成、memory-makers配下のページ実装、長期系列チャートのX軸ラベル修正までの試行錯誤。","md",{},true,"/japan-memory-export-price-page","mdx-playground",false,"2026-08-31T00:00:00.000Z",{"title":5,"description":341},"make-diary","2026-08/2026-08-31/japan-memory-export-price-page",[353,354,355,356,357,358],"財務省貿易統計","e-Stat","NAND","Nuxt","データ可視化","Claude Code","8-HdgDrkVH7-5pOsH5_wnPqyajft12_Qph2L38182Wc",[],[362,366,369,372,376],{"title":363,"path":364,"publishedAt":365},"月次統計カードにNEWバッジを実装 - データ鮮度で自動点灯・自動消灯させる","/memory-makers-new-badge","2026-07-13T00:00:00.000Z",{"title":367,"path":368,"publishedAt":348},"2026年8月31日の作業日記 - 自由研究の問いを絞り、別表の図をbefore/afterで作り直す","/2026-08-31-diary",{"title":370,"path":371,"publishedAt":348},"21職種の母集団を対数軸で比べるページを作り、パンくずの生スラッグ176件を直す","/talent-population-log-scale-page",{"title":373,"path":374,"publishedAt":375},"図解60型カタログのフレームを統一する。スライドの領域を命名して意味グリッドで揃えた1日","/diagram-catalog-frame-grid","2026-08-12T00:00:00.000Z",{"title":377,"path":378,"publishedAt":379},"自作の聞き方クイズを自分で解いて2問落とした。誤答解説と分野別出題を足すまで","/listening-quiz-self-test","2026-08-01T00:00:00.000Z","https://log.eurekapu.com/og/blog/japan-memory-export-price-page.png?v=2026-08-31T00%3A00%3A00.000Z&title=%E8%B2%A1%E5%8B%99%E7%9C%81%E8%B2%BF%E6%98%93%E7%B5%B1%E8%A8%88%E3%81%A7%E6%97%A5%E6%9C%AC%E3%81%AENAND%E8%BC%B8%E5%87%BA%E5%8D%98%E4%BE%A1%E3%82%92%E5%86%8D%E7%8F%BE%E3%81%97%E3%80%81%E7%B5%B1%E8%A8%88%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AB%E3%81%99%E3%82%8B&author=Kei%20Komatsu&sig=183bbfdf95ebfcf4",1788417367607]