<?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>ja-JP</language><item><title>Dependabotで最小リリース経過日数と自動マージを設定する — プライベートリポジトリに潜む罠</title><link>https://oharu121.com/ja/blog/dependabot-minimum-release-age-auto-merge-private-repo/</link><guid isPermaLink="true">https://oharu121.com/ja/blog/dependabot-minimum-release-age-auto-merge-private-repo/</guid><description>プライベートリポジトリでは依存関係グラフが既定でオフのため、DependabotはnpmのPRを1件も出さず、自動マージのワークフローはCI完了の45秒前にマージしていた。</description><pubDate>Mon, 17 Aug 2026 13:20:29 GMT</pubDate></item><item><title>Vercel Web Analytics で人気記事にバッジを付ける — ビルド時に解決し、静的サイトのまま配信する</title><link>https://oharu121.com/ja/blog/astro-build-time-vercel-analytics-popular-article-badges/</link><guid isPermaLink="true">https://oharu121.com/ja/blog/astro-build-time-vercel-analytics-popular-article-badges/</guid><description>このブログが人気記事にバッジを付ける仕組み。ビルド中に Vercel Web Analytics へ 1 回問い合わせ、3 つのロケールを合算して静的 HTML に焼き込みます。</description><pubDate>Mon, 17 Aug 2026 09:00:50 GMT</pubDate></item><item><title>CLAUDE_PROJECT_DIR で用語集をスキルの外に出す — .claude/ への書き込みが必ず承認を求める理由</title><link>https://oharu121.com/ja/blog/claude-code-project-dir-skill-glossary-approval-prompts/</link><guid isPermaLink="true">https://oharu121.com/ja/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/ja/blog/chrome-devtools-mcp-vs-playwright-mcp-astro-blog/</link><guid isPermaLink="true">https://oharu121.com/ja/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の1ルートとUpstash Redis</title><link>https://oharu121.com/ja/blog/astro-like-counter-upstash-redis-vercel-serverless-route/</link><guid isPermaLink="true">https://oharu121.com/ja/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/ja/blog/pagefind-ime-composition-capture-phase-iscomposing-webkit/</link><guid isPermaLink="true">https://oharu121.com/ja/blog/pagefind-ime-composition-capture-phase-iscomposing-webkit/</guid><description>IME の変換中に 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/ja/blog/astro-figure-intrinsic-width-native-dialog-2x-density/</link><guid isPermaLink="true">https://oharu121.com/ja/blog/astro-figure-intrinsic-width-native-dialog-2x-density/</guid><description>Astroでwidth:100%が256pxのスクリーンショットをぼかしていた理由と、ネイティブダイアログでスマートフォンでも図版が読めるようになるまで。設計を正したのは7つの計測でした。</description><pubDate>Sat, 15 Aug 2026 00:17:03 GMT</pubDate></item><item><title>Pagefindのステミング警告は見当違いだった — 日本語検索を壊していたのは分かち書きの不一致</title><link>https://oharu121.com/ja/blog/pagefind-stemming-vs-segmentation-japanese-search-red-herring/</link><guid isPermaLink="true">https://oharu121.com/ja/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.6MBを回収した — 0.8MBのPNG問題を追いかけて見つけた、一度もパックされていないリポジトリ</title><link>https://oharu121.com/ja/blog/git-gc-loose-objects-vs-filter-repo-history-rewrite/</link><guid isPermaLink="true">https://oharu121.com/ja/blog/git-gc-loose-objects-vs-filter-repo-history-rewrite/</guid><description>git履歴に残る1.6MBのPNGブロブを追ったら、一度もパックされていないリポジトリが出てきました。git gcで8.6MB回収、見送った履歴の書き換えの価値は0.8MBでした。</description><pubDate>Thu, 13 Aug 2026 15:04:22 GMT</pubDate></item><item><title>Astroの共有ボタンを言語ごとに出し分ける — デスクトップは固定レール、モバイルはラベル付きのピル</title><link>https://oharu121.com/ja/blog/astro-share-buttons-intent-urls-per-locale-targets/</link><guid isPermaLink="true">https://oharu121.com/ja/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でSVGラベルのはみ出しを計測する — 静的チェックが届かないi18nの不具合</title><link>https://oharu121.com/ja/blog/playwright-i18n-svg-label-overflow-render-check/</link><guid isPermaLink="true">https://oharu121.com/ja/blog/playwright-i18n-svg-label-overflow-render-check/</guid><description>Playwrightで翻訳後のSVGラベルを枠と突き合わせて計測します。何も計測しないまま37ページを合格と報告した2つのバグも解説します。</description><pubDate>Thu, 13 Aug 2026 01:21:47 GMT</pubDate></item><item><title>Astroの目次で読者の現在地を追い続ける — スクロールスパイ・共有レール・モバイルのdvh</title><link>https://oharu121.com/ja/blog/astro-table-of-contents-scroll-spy-shared-rail-details-content/</link><guid isPermaLink="true">https://oharu121.com/ja/blog/astro-table-of-contents-scroll-spy-shared-rail-details-content/</guid><description>Astroの目次にスクロールスパイの追従、見出しの深さを問わない1本のレール、dvhによる高さ上限を実装した記録。モバイルの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/ja/blog/astro-expressive-code-snippet-ui-filename-tabs-file-icons/</link><guid isPermaLink="true">https://oharu121.com/ja/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/ja/blog/llm-birth-history-turing-shannon-transformer-gpt3-part2/</link><guid isPermaLink="true">https://oharu121.com/ja/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/ja/blog/llm-birth-history-turing-shannon-perceptron-word2vec-part1/</link><guid isPermaLink="true">https://oharu121.com/ja/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>RAGをファインチューニングで置き換えられる？ KB検索の選択肢を調べて考えてみた</title><link>https://oharu121.com/ja/blog/rag-vs-finetuning-kb-search/</link><guid isPermaLink="true">https://oharu121.com/ja/blog/rag-vs-finetuning-kb-search/</guid><description>社内KB検索でRAGをファインチューニングに置き換えられるか。ファインチューニングが実際に学ぶもの、純粋IRやロングコンテキストが勝つ場面、それぞれのコストを整理します。</description><pubDate>Tue, 11 Aug 2026 06:07:58 GMT</pubDate></item><item><title>HTTP QUERYメソッド（RFC 10008）をPythonで実装して、GET・POSTとの違いを体感してみた</title><link>https://oharu121.com/ja/blog/http-query-method-rfc10008-python-demo/</link><guid isPermaLink="true">https://oharu121.com/ja/blog/http-query-method-rfc10008-python-demo/</guid><description>RFC 10008のHTTP QUERYをPythonとStarletteで実装。構造化ボディを持ちながら安全・冪等・キャッシュ可能なリクエスト、そのエラーハンドリング、キャッシュ、GraphQLとの補完関係を解説します。</description><pubDate>Mon, 10 Aug 2026 15:47:19 GMT</pubDate></item><item><title>AIMockでAIエージェントのテストを決定論的にする — LLM・ベクトルDB・MCP・A2Aを1つのポートでモックする</title><link>https://oharu121.com/ja/blog/aimock-deterministic-testing-ai-agent-llm-vectordb-a2a/</link><guid isPermaLink="true">https://oharu121.com/ja/blog/aimock-deterministic-testing-ai-agent-llm-vectordb-a2a/</guid><description>AIMockはLLM・ベクトルDB・MCP・A2Aを1つのポートでモックします。エージェントのテストスイートが3秒以内に、毎回同じ出力で完了します。</description><pubDate>Mon, 10 Aug 2026 09:10:57 GMT</pubDate></item><item><title>AIエージェントと5ラウンドでブログのロゴを作る — 手元に残ったのは/logoスキルと3本のスクリプト</title><link>https://oharu121.com/ja/blog/ai-agent-logo-design-fonttools-svg-path-bugs-jetbrains-mono/</link><guid isPermaLink="true">https://oharu121.com/ja/blog/ai-agent-logo-design-fonttools-svg-path-bugs-jetbrains-mono/</guid><description>AIエージェントとブログのロゴとコードフォントを作り直した記録です。壊れたSVGの字形、正規表現によるバウンディングボックス、間違った漢字、そしてそこから生まれた/logoスキルを扱います。</description><pubDate>Mon, 10 Aug 2026 05:33:43 GMT</pubDate></item><item><title>画像生成AIのアーキテクチャ対決：Autoregressive vs Diffusion — 2026年の勝者は？</title><link>https://oharu121.com/ja/blog/autoregressive-vs-diffusion-image-generation-2026/</link><guid isPermaLink="true">https://oharu121.com/ja/blog/autoregressive-vs-diffusion-image-generation-2026/</guid><description>gpt-image-1とDALL-E 3のアーキテクチャの違いを、自己回帰的なトークン生成と反復ノイズ除去、連続と離散の壁、DiT、そして2026年の三つ巴市場から解説します。</description><pubDate>Sun, 09 Aug 2026 16:17:48 GMT</pubDate></item><item><title>Astroのコンテンツコレクションだけでブログを運用する — CMSを捨て、MDXを選び、外部キーを型で置き換えた話</title><link>https://oharu121.com/ja/blog/astro-content-collections-no-database-mdx-tags-cjk-fonts/</link><guid isPermaLink="true">https://oharu121.com/ja/blog/astro-content-collections-no-database-mdx-tags-cjk-fonts/</guid><description>このブログにCMSがない理由。画像から決まったディレクトリ構成、MarkdownではなくMDXを選んだ判断、そして外部キーの代わりになったタグレジストリについて整理します。</description><pubDate>Mon, 03 Aug 2026 15:50:42 GMT</pubDate></item><item><title>A2A と MCP は何が違う？エージェント間通信プロトコルの設計思想を整理してみた</title><link>https://oharu121.com/ja/blog/a2a-mcp-complementary-agent-protocol-design/</link><guid isPermaLink="true">https://oharu121.com/ja/blog/a2a-mcp-complementary-agent-protocol-design/</guid><description>MCPだけではエージェント間通信に足りない理由を、対等性・Agent Cardによる能力発見・非同期タスク管理から整理し、両プロトコルがHTTPを選んだ理由まで解説します。</description><pubDate>Mon, 13 Jul 2026 03:00:00 GMT</pubDate></item></channel></rss>