[{"data":1,"prerenderedAt":232},["ShallowReactive",2],{"content-/unpublished-article-image-leak":3,"all-pages-for-dir":209,"related-/unpublished-article-image-leak":210,"og-image-/unpublished-article-image-leak":231},{"id":4,"title":5,"body":6,"category":189,"concepts":190,"description":191,"extension":192,"meta":193,"navigation":194,"ogImage":190,"path":195,"project_name":196,"published":197,"publishedAt":198,"seo":199,"source":200,"stem":201,"tags":202,"todo":190,"unpublished":197,"updatedAt":190,"__hash__":208},"pages/2026-08/2026-08-11/unpublished-article-image-leak.md","非公開にしたのは本文だけだった",{"type":7,"value":8,"toc":178},"minimark",[9,12,16,24,27,42,46,49,60,71,75,81,84,91,95,110,114,117,120,123,126,129,132,135,142,145,150,153,156,159],[10,11,5],"h1",{"id":5},[13,14,15],"p",{},"朝から記事を書かせていた。\nそのうちの1本は、書き上げたあとで公開しなくてよいと思い直した。\n公開ディレクトリに入ったままだったので、「非公開の方に入れといてください」と頼んだ。",[13,17,18,19,23],{},"非公開の置き場所は ",[20,21,22],"code",{},"content/_local-unpublished/"," になっている。\nこの配下は本番のビルドから外れ、dev では今までどおり読める。\n移動は数秒で終わった。\nそれで片付いたと思っていた。",[13,25,26],{},"移動のあとで、画像の扱いも確認させた。\nその記事には図が7枚ある。\n本文が本番に出ないのなら、図はどこにいるのか。",[13,28,29,30,33,34,37,38,41],{},"図は ",[20,31,32],{},"public/images/"," にあるので本番へ出ている、というのが返ってきた答えだった。\n",[20,35,36],{},"public/"," はビルドのときに中身を問わず ",[20,39,40],{},"dist/"," へコピーされる。\n記事の側だけを非公開ディレクトリへ動かしても、画像はそこに置き去りになる。\n本文は非公開、図は公開。\n7枚とも、URLを直接叩けば本番で見られる状態だった。",[43,44,45],"h2",{"id":45},"仕様を変えるまでもなかった",[13,47,48],{},"非公開記事の画像は手元で見られれば足りる。\n本番へ配る理由がない。\n仕様をそう変えないかと提案した。",[13,50,51,52,55,56,59],{},"調べさせたら、その仕様はすでにあった。\n",[20,53,54],{},"server/middleware/content-images.ts"," が ",[20,57,58],{},"/_local-unpublished/"," 配下の画像を dev の localhost にだけ配信し、本番では 404 を返す。\nビルド時のコピー対象からも外れている。",[13,61,62,63,65,66,70],{},"作るものは何もなかった。\n",[20,64,32],{}," を画像の置き場所に選んだ時点で、記事をどこへ動かそうと図は本番に出る。\n",[67,68,69],"strong",{},"用意されていた仕組みを使っていなかっただけ","だった。",[43,72,74],{"id":73},"移す前に公開記事からの参照を確かめる","移す前に、公開記事からの参照を確かめる",[13,76,77,78,80],{},"非公開に回してあった記事は1本ではなかった。\n8本ぶん、18ファイルの画像が ",[20,79,32],{}," に取り残されていた。",[13,82,83],{},"移す前に、その18枚が公開記事から参照されていないことを機械的に確認させた。\n同じ図を公開記事が使っていたら、移した瞬間にそちらが壊れる。\n参照はゼロだった。",[13,85,86,87,90],{},"移動と同時に、本文の参照を ",[20,88,89],{},"/_local-unpublished/\u003CYYYY-MM>/\u003CYYYY-MM-DD>/\u003Cslug>/..."," の形へ書き換えた。\n移したあとで公開記事867件の画像参照を全数検証させたところ、破損はゼロだった。",[43,92,94],{"id":93},"二度目を-lint-で止める","二度目を lint で止める",[13,96,97,98,101,102,105,106,109],{},"この種の取り違えは、忘れたころにまたやる。\n",[20,99,100],{},"scripts/lint-md-render.mjs"," に検査を1本足した。\n非公開記事が ",[20,103,104],{},"/images/"," を参照していたら、その場で exit 1 になる。\n",[20,107,108],{},".githooks/pre-commit"," から自動で走るので、コミットの前に必ず引っかかる。",[43,111,113],{"id":112},"svgが消えたと思った","SVGが消えた、と思った",[13,115,116],{},"画像を動かした直後に図解のページを開いたら、SVGカードが表示されていなかった。\n18枚を移したあとだったので、まずそれを疑った。",[13,118,119],{},"確認させると、SVGの実体は無事だった。\npart1が126件、part2が108件、どれも欠けていない。\n応答していなかったのはポート3001の dev サーバーの方で、60秒待っても返ってこないハング状態だった。\nポート3000で同じページを開いたら、カードは全部並んでいた。",[13,121,122],{},"dev サーバーには朝から手を焼いていた。\nポート3000のサーバーは旧セッションの残骸で、メモリを2.8GB使い、初回の応答に47秒かかっていた。\n図が消えたように見えた原因は、画像の移動ではなく dev サーバーの残骸の側にあった。",[43,124,125],{"id":125},"並行して書いていた公開記事2本",[13,127,128],{},"朝の記事は、GPUの計算資源を独立した投資対象として扱う金融側の動きだった。\n運用会社6社と組み、第三者の資本5000億ドル超をAIインフラの建設へ向ける枠組みが前日に発表されていた。\nチップを買ってデータセンターを1件ずつ建てる時代から、計算資源そのものに資本がつく時代への移行として書かせた。",[13,130,131],{},"図は5枚作らせて、1枚ずつ自分の目で見た。\n引っかかったのは3枚目だった。\nB200のクラウド価格が2026年に5.30ドルから7.05ドルの幅で動くという図で、その幅が棒グラフで塗られていた。\n読めば分かる。\nただ、ぱっと見て棒の高さが値なのか幅なのかを判断できない。\n株のローソク足のように上下へ短い横棒を渡して縦線でつなぐ形にしてほしい、と言った。\n直った図は、上端7.05ドル、下端5.30ドルのI字マーカーになった。\nこれなら一目で幅だと読める。",[13,133,134],{},"この計算資源の売り方が残価設定ローンに似ているのではないかと聞いたら、かなり近いという答えが返ってきた。\n図をもう1枚足して、その節を記事に追加させた。",[13,136,137,138],{},"記事: ",[139,140,141],"a",{"href":141},"/nvidia-ai-factory-investable-asset-class",[13,143,144],{},"午後は、CloudflareがAIエージェント向けに出した Kitesurf というブラウザを調べさせた。\n知りたかったのは3つで、費用がかかるのか、手元のChromeと併用するのか、拡張機能でやっていることが要らなくなるのかだった。\nKitesurf は画面を持たないサーバー側のブラウザで、手元のChromeとも拡張機能とも競合しない、というのが答えだった。\n置き換えの話ではなかった。\nこれも公開記事にした。\n1枚目の図で行の折り返しが語の途中に入っていたので、そこだけ直させた。",[13,146,137,147],{},[139,148,149],{"href":149},"/cloudflare-kitesurf-agent-browser",[43,151,152],{"id":152},"学習ゲートの教材の図",[13,154,155],{},"前日ぶんの学習ゲートの教材に、図を2点とSVGマニフェストを足した。",[43,157,158],{"id":158},"今日の学び",[160,161,162,166,169,172,175],"ul",{},[163,164,165],"li",{},"「非公開にして」と言ったとき、自分が動かしたのは本文だけだった。本文と画像で置き場所が分かれていると、片方を動かした時点で安心してしまう",[163,167,168],{},"仕様を変えようとする前に既存の仕組みを調べさせたら、作るものは何もなかった。middleware は最初から書かれていて、使っていなかっただけだった",[163,170,171],{},"同じ間違いを二度しないように、判定を lint に落として pre-commit へ載せた。次は自分が気づく前に止まる",[163,173,174],{},"図は自分の目で見る。範囲を棒で塗った図は、読めば分かるが、ぱっと見では読めない",[163,176,177],{},"表示が消えたときは、まず自分の直前の変更を疑う。今回はそれが外れて、原因はハングした dev サーバーの方にあった",{"title":179,"searchDepth":180,"depth":180,"links":181},"",2,[182,183,184,185,186,187,188],{"id":45,"depth":180,"text":45},{"id":73,"depth":180,"text":74},{"id":93,"depth":180,"text":94},{"id":112,"depth":180,"text":113},{"id":125,"depth":180,"text":125},{"id":152,"depth":180,"text":152},{"id":158,"depth":180,"text":158},"dev",null,"下書きを非公開へ移したあとで、本文はビルドから外れるのに図だけが本番に出ていると分かった。仕様を変えるつもりで調べさせたら、その仕組みは最初から実装されていて、使っていなかっただけだった。","md",{},true,"/unpublished-article-image-leak","mdx-playground",false,"2026-08-11T00:00:00.000Z",{"title":5,"description":191},"make-diary","2026-08/2026-08-11/unpublished-article-image-leak",[203,204,205,206,207],"Nuxt","静的サイト生成","非公開記事","lint","SVG","RhjsBHO_iSwfXlu8rs6dicJ1qoI5BLMaxmBPhA6SXJA",[],[211,215,219,223,227],{"title":212,"path":213,"publishedAt":214},"図解60型カタログのフレームを統一する。スライドの領域を命名して意味グリッドで揃えた1日","/diagram-catalog-frame-grid","2026-08-12T00:00:00.000Z",{"title":216,"path":217,"publishedAt":218},"eurekapu-nuxt4の積み残し解消：lint・依存脆弱性ゼロ化から語源単語ページ再構成まで","/eurekapu-nuxt4-maintenance-catchup","2026-07-22T00:00:00.000Z",{"title":220,"path":221,"publishedAt":222},"過去記事に散らばったSVG図版を一覧するギャラリービューアを作った","/svg-gallery-viewer","2026-07-01T00:00:00.000Z",{"title":224,"path":225,"publishedAt":226},"2026年6月30日の開発日記 - つくみセミナードラフトとSVG 17枚スライド","/2026-06-30-diary","2026-06-30T00:00:00.000Z",{"title":228,"path":229,"publishedAt":230},"カメラの露出シミュレーターを Nuxt のページに移植して、SS/F値/ISO の三角関係を体感する","/camera-exposure-simulator","2026-06-14T00:00:00.000Z","https://log.eurekapu.com/og/blog/unpublished-article-image-leak.png?v=2026-08-11T00%3A00%3A00.000Z&title=%E9%9D%9E%E5%85%AC%E9%96%8B%E3%81%AB%E3%81%97%E3%81%9F%E3%81%AE%E3%81%AF%E6%9C%AC%E6%96%87%E3%81%A0%E3%81%91%E3%81%A0%E3%81%A3%E3%81%9F&author=Kei%20Komatsu&sig=3b8edb9aa446fc63",1786603478274]