<?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>Python on hdknr blog</title><link>https://hdknr.github.io/blogs/tags/python/</link><description>Recent content in Python on hdknr blog</description><generator>Hugo -- 0.157.0</generator><language>ja</language><lastBuildDate>Tue, 07 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://hdknr.github.io/blogs/tags/python/index.xml" rel="self" type="application/rss+xml"/><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>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>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>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>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>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>「値は計算されていた。ただ届いていなかっただけ」— 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>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>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>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>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>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>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>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>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>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>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>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>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>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>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>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>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>「研究コミュニティをまるごとエミュレートせよ」— 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>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>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>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>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>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>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>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>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>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>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>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>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># 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>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>請求入金</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>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>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>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>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>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>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>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>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>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>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>メモ</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>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>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>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>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>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>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: 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>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>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>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>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>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>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>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>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>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>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>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>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>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>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>半角カナ文字</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>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>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>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>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>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>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>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>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>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>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>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>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>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>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>サバクラ両方で動く 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>