<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>oharu tech blog</title><description>關於 Astro、TypeScript、AWS 與 AI 代理工具的技術筆記。</description><link>https://oharu121.com/</link><language>zh-TW</language><item><title>Dependabot 的最小發布經過天數與自動合併 — 私有儲存庫裡的陷阱</title><link>https://oharu121.com/zh-tw/blog/dependabot-minimum-release-age-auto-merge-private-repo/</link><guid isPermaLink="true">https://oharu121.com/zh-tw/blog/dependabot-minimum-release-age-auto-merge-private-repo/</guid><description>私有儲存庫的相依關係圖預設關閉，所以 Dependabot 一個 npm PR 都沒開，而自動合併的工作流程在 CI 完成前 45 秒就合併了。</description><pubDate>Mon, 17 Aug 2026 13:20:29 GMT</pubDate></item><item><title>用 Vercel Web Analytics 為熱門文章加上標記 — 在建置時解析，仍以靜態 HTML 出貨</title><link>https://oharu121.com/zh-tw/blog/astro-build-time-vercel-analytics-popular-article-badges/</link><guid isPermaLink="true">https://oharu121.com/zh-tw/blog/astro-build-time-vercel-analytics-popular-article-badges/</guid><description>這個 Astro 部落格如何標記最多人讀的文章：建置期間向 Vercel Web Analytics 查詢一次，合計三個語系，再烘進靜態 HTML。</description><pubDate>Mon, 17 Aug 2026 09:00:50 GMT</pubDate></item><item><title>用 CLAUDE_PROJECT_DIR 把詞彙表移出 Claude Code skill — 寫入 .claude/ 為何一律要核准</title><link>https://oharu121.com/zh-tw/blog/claude-code-project-dir-skill-glossary-approval-prompts/</link><guid isPermaLink="true">https://oharu121.com/zh-tw/blog/claude-code-project-dir-skill-glossary-approval-prompts/</guid><description>Claude Code 把 .claude/ 視為受保護路徑，允許規則無法事先核准那裡的寫入。這篇記錄如何用 CLAUDE_PROJECT_DIR 把會被改寫的詞彙表移出去。</description><pubDate>Mon, 17 Aug 2026 01:58:35 GMT</pubDate></item><item><title>Chrome DevTools MCP 與 Playwright MCP 有何不同 — 我為什麼在 Astro 部落格選了 Chrome DevTools</title><link>https://oharu121.com/zh-tw/blog/chrome-devtools-mcp-vs-playwright-mcp-astro-blog/</link><guid isPermaLink="true">https://oharu121.com/zh-tw/blog/chrome-devtools-mcp-vs-playwright-mcp-astro-blog/</guid><description>Chrome DevTools MCP 與 Playwright MCP 交給編碼智能體的東西並不相同。各自提供什麼，以及一個 Astro 部落格為何留下其中一個、拒絕另一個。</description><pubDate>Sun, 16 Aug 2026 13:35:56 GMT</pubDate></item><item><title>在靜態的 Astro 部落格上統計「喜歡」 — 一條 Vercel 路由與 Upstash Redis</title><link>https://oharu121.com/zh-tw/blog/astro-like-counter-upstash-redis-vercel-serverless-route/</link><guid isPermaLink="true">https://oharu121.com/zh-tw/blog/astro-like-counter-upstash-redis-vercel-serverless-route/</guid><description>為完全靜態的 Astro 網站加上共用的喜歡計數：只多一條非預先渲染的路由、Upstash Redis 的鍵設計，以及為了驗證它而付出的 CI 錯誤。</description><pubDate>Sun, 16 Aug 2026 07:27:12 GMT</pubDate></item><item><title>在捕獲階段攔下 Pagefind 的 Enter，修好日文搜尋 — 為什麼只靠 isComposing 不夠</title><link>https://oharu121.com/zh-tw/blog/pagefind-ime-composition-capture-phase-iscomposing-webkit/</link><guid isPermaLink="true">https://oharu121.com/zh-tw/blog/pagefind-ime-composition-capture-phase-iscomposing-webkit/</guid><description>輸入法組字還沒結束，Pagefind 就把頁面帶走了。isComposing 是必要條件但不充分：WebKit 會在 keydown 之前先觸發 compositionend。</description><pubDate>Sat, 15 Aug 2026 14:03:15 GMT</pubDate></item><item><title>讓 Astro 的圖表依自己的尺寸繪製、點一下就能放大 — 原始寬度、原生對話框與 @2x</title><link>https://oharu121.com/zh-tw/blog/astro-figure-intrinsic-width-native-dialog-2x-density/</link><guid isPermaLink="true">https://oharu121.com/zh-tw/blog/astro-figure-intrinsic-width-native-dialog-2x-density/</guid><description>在 Astro 中 width:100% 為何讓 256px 的螢幕截圖變糊，以及原生對話框如何讓每張圖表在手機上都讀得清楚。修正這個設計的是七次計測。</description><pubDate>Sat, 15 Aug 2026 00:17:03 GMT</pubDate></item><item><title>Pagefind 的詞幹還原警告是假線索 — 讓日文複合詞搜尋失效的是斷詞不一致</title><link>https://oharu121.com/zh-tw/blog/pagefind-stemming-vs-segmentation-japanese-search-red-herring/</link><guid isPermaLink="true">https://oharu121.com/zh-tw/blog/pagefind-stemming-vs-segmentation-japanese-search-red-herring/</guid><description>Pagefind 每次建置都警告日文與中文缺少詞幹還原。真正的缺陷在別處：查詢端與索引端的斷詞器不一致，回傳了錯誤的頁面。</description><pubDate>Fri, 14 Aug 2026 06:21:55 GMT</pubDate></item><item><title>git gc 回收了 8.6 MB — 追查一個 0.8 MB 的問題時，發現儲存庫從未封裝過</title><link>https://oharu121.com/zh-tw/blog/git-gc-loose-objects-vs-filter-repo-history-rewrite/</link><guid isPermaLink="true">https://oharu121.com/zh-tw/blog/git-gc-loose-objects-vs-filter-repo-history-rewrite/</guid><description>追查 git 歷史裡 1.6 MB 的 PNG blob，結果發現儲存庫從未封裝過。git gc 回收了 8.6 MB，而我放棄的那次歷史改寫只值 0.8 MB。</description><pubDate>Thu, 13 Aug 2026 15:04:22 GMT</pubDate></item><item><title>在 Astro 中依語言決定分享按鈕的目標 — 桌機是固定側欄，行動裝置是具名按鈕</title><link>https://oharu121.com/zh-tw/blog/astro-share-buttons-intent-urls-per-locale-targets/</link><guid isPermaLink="true">https://oharu121.com/zh-tw/blog/astro-share-buttons-intent-urls-per-locale-targets/</guid><description>在 Astro 中用 Intent URL 組出分享按鈕：每個語系有各自的分享目標、寬螢幕上的固定圖示側欄，以及過程中發現的端點變動。</description><pubDate>Thu, 13 Aug 2026 11:20:42 GMT</pubDate></item><item><title>把 Playwright 當成量測儀器 — 靜態檢查碰不到的 i18n 缺陷</title><link>https://oharu121.com/zh-tw/blog/playwright-i18n-svg-label-overflow-render-check/</link><guid isPermaLink="true">https://oharu121.com/zh-tw/blog/playwright-i18n-svg-label-overflow-render-check/</guid><description>用 Playwright 量測翻譯後的 SVG 標籤有沒有超出方框，以及讓這個檢查在什麼都沒量到的情況下回報 37 頁全數乾淨的兩個錯誤。</description><pubDate>Thu, 13 Aug 2026 01:21:47 GMT</pubDate></item><item><title>讓 Astro 目錄記住你讀到哪裡 — 捲動監看、共用軌線，以及手機上的 dvh</title><link>https://oharu121.com/zh-tw/blog/astro-table-of-contents-scroll-spy-shared-rail-details-content/</link><guid isPermaLink="true">https://oharu121.com/zh-tw/blog/astro-table-of-contents-scroll-spy-shared-rail-details-content/</guid><description>為 Astro 部落格的目錄加上跟隨讀者的捲動、跨層級共用的軌線，以及在手機上悄悄吃掉 max-height 的 ::details-content 虛擬元素。</description><pubDate>Thu, 13 Aug 2026 01:03:19 GMT</pubDate></item><item><title>在 Astro 部落格導入 Expressive Code — 檔名分頁、檔案圖示，以及 97 個讀不出來的程式碼圍籬</title><link>https://oharu121.com/zh-tw/blog/astro-expressive-code-snippet-ui-filename-tabs-file-icons/</link><guid isPermaLink="true">https://oharu121.com/zh-tw/blog/astro-expressive-code-snippet-ui-filename-tabs-file-icons/</guid><description>在 Astro 7 導入 Expressive Code 的紀錄：檔名分頁、依主題調整的檔案圖示、Sätteri 處理器的陷阱，以及被 Shiki 當成語言名稱的 97 個程式碼圍籬。</description><pubDate>Wed, 12 Aug 2026 13:12:24 GMT</pubDate></item><item><title>「一連串的失敗」造就了 LLM（下篇）— 從 Attention 到規模革命與對齊</title><link>https://oharu121.com/zh-tw/blog/llm-birth-history-turing-shannon-transformer-gpt3-part2/</link><guid isPermaLink="true">https://oharu121.com/zh-tw/blog/llm-birth-history-turing-shannon-transformer-gpt3-part2/</guid><description>從如何處理脈絡到 LLM 的完成：RNN 的結構性極限、Attention 的誕生、Transformer、GPT-3 的規模革命、RLHF 對齊，以及效率化的時代。</description><pubDate>Wed, 12 Aug 2026 01:25:21 GMT</pubDate></item><item><title>「一連串的失敗」造就了 LLM（上篇）— 從數學的極限到意義的幾何學</title><link>https://oharu121.com/zh-tw/blog/llm-birth-history-turing-shannon-perceptron-word2vec-part1/</link><guid isPermaLink="true">https://oharu121.com/zh-tw/blog/llm-birth-history-turing-shannon-perceptron-word2vec-part1/</guid><description>LLM 是一連串無關問題的副產品：圖靈的可計算性、夏農的資訊理論、感知器、反向傳播、GPU，以及 Word2Vec。</description><pubDate>Tue, 11 Aug 2026 13:23:50 GMT</pubDate></item><item><title>Fine-tuning 能取代 RAG 做 KB 檢索嗎 — 它真正學到的東西，以及純 IR 勝出的時機</title><link>https://oharu121.com/zh-tw/blog/rag-vs-finetuning-kb-search/</link><guid isPermaLink="true">https://oharu121.com/zh-tw/blog/rag-vs-finetuning-kb-search/</guid><description>知識庫檢索能不能用 Fine-tuning 取代 RAG：Fine-tuning 真正學到的是什麼、純 IR 或長脈絡勝出的時機，以及各自的成本。</description><pubDate>Tue, 11 Aug 2026 06:07:58 GMT</pubDate></item><item><title>用 Python 實作 RFC 10008 的 HTTP QUERY 方法：它和 GET、POST 差在哪</title><link>https://oharu121.com/zh-tw/blog/http-query-method-rfc10008-python-demo/</link><guid isPermaLink="true">https://oharu121.com/zh-tw/blog/http-query-method-rfc10008-python-demo/</guid><description>以 Python 與 Starlette 實作 RFC 10008 的 HTTP QUERY：帶結構化請求主體，同時安全、冪等、可快取的請求，以及它與 GraphQL 的互補關係。</description><pubDate>Mon, 10 Aug 2026 15:47:19 GMT</pubDate></item><item><title>用 AIMock 讓 AI 智能體測試變得決定性 — 在單一連接埠模擬 LLM、向量資料庫、MCP 與 A2A</title><link>https://oharu121.com/zh-tw/blog/aimock-deterministic-testing-ai-agent-llm-vectordb-a2a/</link><guid isPermaLink="true">https://oharu121.com/zh-tw/blog/aimock-deterministic-testing-ai-agent-llm-vectordb-a2a/</guid><description>AIMock 在單一連接埠上模擬整個 AI 技術堆疊（LLM、向量資料庫、MCP、A2A），讓智能體測試套件在三秒內跑完，而且每次輸出都相同。</description><pubDate>Mon, 10 Aug 2026 09:10:57 GMT</pubDate></item><item><title>和 AI 智能體花五個回合做出部落格 logo：留下來的是一個 /logo skill 與三支指令碼</title><link>https://oharu121.com/zh-tw/blog/ai-agent-logo-design-fonttools-svg-path-bugs-jetbrains-mono/</link><guid isPermaLink="true">https://oharu121.com/zh-tw/blog/ai-agent-logo-design-fonttools-svg-path-bugs-jetbrains-mono/</guid><description>用 AI 智能體重做這個部落格的 logo 與程式碼字型：壞掉的 SVG 字形、用正規表達式算出的邊界框、猜錯的漢字，以及最後長出來的 /logo skill。</description><pubDate>Mon, 10 Aug 2026 05:33:43 GMT</pubDate></item><item><title>gpt-image-1 與 DALL-E 3 差在哪：自迴歸與擴散模型的架構之爭</title><link>https://oharu121.com/zh-tw/blog/autoregressive-vs-diffusion-image-generation-2026/</link><guid isPermaLink="true">https://oharu121.com/zh-tw/blog/autoregressive-vs-diffusion-image-generation-2026/</guid><description>gpt-image-1 與 DALL-E 3 的架構差異：自迴歸的 token 生成與反覆去雜訊、離散與連續的壁壘、DiT，以及 2026 年三方並立的市場。</description><pubDate>Sun, 09 Aug 2026 16:17:48 GMT</pubDate></item><item><title>只用 Astro 內容集合經營部落格 — 捨棄 CMS、選擇 MDX，並用型別取代外鍵</title><link>https://oharu121.com/zh-tw/blog/astro-content-collections-no-database-mdx-tags-cjk-fonts/</link><guid isPermaLink="true">https://oharu121.com/zh-tw/blog/astro-content-collections-no-database-mdx-tags-cjk-fonts/</guid><description>這個部落格為什麼沒有 CMS：由圖片決定的目錄結構、選擇 MDX 而非 Markdown 的判斷，以及取代外鍵的標籤登錄表。</description><pubDate>Mon, 03 Aug 2026 15:50:42 GMT</pubDate></item><item><title>A2A 與 MCP 差在哪裡？智能體間通訊為何需要獨立協定，兩者又為何都不選 gRPC</title><link>https://oharu121.com/zh-tw/blog/a2a-mcp-complementary-agent-protocol-design/</link><guid isPermaLink="true">https://oharu121.com/zh-tw/blog/a2a-mcp-complementary-agent-protocol-design/</guid><description>從對等性、Agent Card 能力發現與非同步任務管理，說明 MCP 單獨為何不足以支撐智能體間通訊，並解析兩個協定為何都選擇 HTTP 作為基礎。</description><pubDate>Mon, 13 Jul 2026 03:00:00 GMT</pubDate></item></channel></rss>