Skip to content

Instantly share code, notes, and snippets.

View hdknr's full-sized avatar
💭
I may be slow to respond.

hdknr hdknr

💭
I may be slow to respond.
View GitHub Profile
@hdknr
hdknr / blog_oncommit_testcase.md
Created July 8, 2026 01:00
transaction.on_commit と TestCase の相性 —— 正しい本番修正が『昨日まで緑だったテスト』を赤にした話 (EPM #10222/#10223/#10178)

transaction.on_commit と TestCase の相性 —— 正しい本番修正が「昨日まで緑だったテスト」を赤にした話

TL;DR

  • ある日、日次テスト監査が test_booktempfile.py と test_ordertempfile.py の 非同期取込テストを失敗として起票しはじめた(#10222 / #10223)。
  • 直接の引き金は、まったく正しい本番バグ修正(#10178)だった。「Celery タスクが DB コミット前に .delay() されて未コミット行を掴めない」という実バグを、transaction.on_commit 経由の enqueue に直して解消したもの。
  • ところが該当テストは高速化のため TransactionTestCase → TestCase(RestFastTestCase)へ移行済みで、TestCase では on_commit コールバックが発火しない。その結果、create 時の取込タスクが実行されず、「取込が完了していない」状態で反映が 400 になって落ちた。
  • 修正はテスト側。非同期取込を起こす API 呼び出しを self.captureOnCommitCallbacks(execute=True) で囲むだけ。
  • 本質的な教訓: 「本番コードに on_commit を足す」変更は、TestCase ベースのテストが踏んでいる限り変更箇所では何も壊れず、離れた場所で後から静かに壊れる。共有ディスパッチ層を触るときは、それを踏むテストの実行モデル(commit するか否か)まで含めて確認する。
@hdknr
hdknr / sli-slo-sla.md
Created May 11, 2026 01:59
SLI / SLO / SLA — 提案書で使い分ける「サービスレベル」3 用語入門

SLI / SLO / SLA — 提案書で使い分ける「サービスレベル」3 用語入門

IoT システムや SaaS の提案書を書いていると、お客様から「このシステム、ちゃんと動くんですか?」と聞かれます。この質問にどう答えるか で、契約交渉の主導権が決まります。

「99.9% 動きます」と言い切れば SLA (契約) になり、下回ったら違約金。「目標値です」と言えば SLO (内部目標) で、超過しても返金義務はない。この 1 文字違いで法的拘束力が変わります。

本記事では、SRE (Site Reliability Engineering) 業界で標準となっている SLI / SLO / SLA の 3 用語を、提案書を書く立場から整理します。

3 用語の違い (要点)

@hdknr
hdknr / django-mptt-blog.md
Created April 20, 2026 00:58
django-mptt はなぜ unmaintained なのか — そして django-tree-queries への移行

django-mptt はなぜ「unmaintained」と書かれているのか — そして django-tree-queries への移行

django-mptt の README を開くと、いきなり以下の文言が目に飛び込んでくる。

This project is currently unmaintained

You can find alternatives to django-mptt on Django Packages. Maybe you do not need MPTT, especially when using newer databases. See django-tree-queries for an implementation using recursive Common Table Expressions (CTE).

「単に飽きて投げ出した」のか、それとも「技術的に役目を終えた」のか。本稿では django-mptt のリポジトリ、CHANGELOG、ソースコードを実際に読んで、その背景と後継への移行可否を整理する。

@hdknr
hdknr / claude-code-silent-degradation.md
Created April 3, 2026 00:06
Claude Code 開発で機能が静かにデグレードする問題と対策

Claude Code 開発で機能が静かにデグレードする問題と対策

TL;DR

Claude Code でリファクタリングや新機能追加を行うと、既存機能の出力品質が意図せず劣化することがある。機能は正しく動いておりテストも通るが、ユーザーが期待する情報が出力から消えている。これは「新しいコードパス」に注力するあまり「既存パスの出力同等性」が見落とされるために起きる。

何が起きたか

経緯

Claude Code でのDB開発: ALTER TABLE が漏れる落とし穴

TL;DR

Claude Code(AIコーディングアシスタント)に SQLAlchemy モデルへのカラム追加を依頼すると、models.py の変更とテストは通るが、既存DBへのマイグレーション(ALTER TABLE)が漏れる。テストは毎回クリーンなDBで実行されるため、本番で初めてエラーが発覚する。

何が起きたか

経緯

Claude Code + Self-hosted Runner: 「Auto mode is unavailable for your plan」エラーの原因と対処

症状

GitHub Actions の self-hosted runner で claude --print を使った自動処理が突然動かなくなった。

claude CLI failed (rc=1): stdout=Auto mode is unavailable for your plan
@hdknr
hdknr / llm-prompt-hardcode-bug.md
Last active March 27, 2026 04:11
「値は計算されていた。ただ届いていなかっただけ」— LLMエージェントプロンプトのハードコード問題

「値は計算されていた。ただ届いていなかっただけ」— LLMエージェントプロンプトのハードコード問題

TL;DR

自立型トレーディングシステムで、投資目標の進捗に応じてリスクパラメータを動的に調整する機能を実装した。計算ロジックは正しく動いていたが、計算結果がエージェントのプロンプトに届いていなかった。プロンプト内の数値がプレーンテキストでハードコードされていたため、エージェントは常に保守的な固定値に従い続けていた。


背景

@hdknr
hdknr / 01-planning.md
Created March 26, 2026 08:39
Claude Code で Laravel→Django 全自動移行をやってみた(全3回)

Claude Code で Laravel→Django 全自動移行をやってみた(1/3)計画編

はじめに

業務管理システム(PHP/Laravel 6.20)を Python/Django 4.2 に移行するプロジェクトを、Claude Code の自律実行でほぼ全自動で完遂しました。

  • 移行元: Laravel 6.20 / PHP 8.0 / MySQL 5.7 / Blade テンプレート
  • 移行先: Django 4.2 LTS / Python 3.11+ / MySQL 8.0 / Django Templates
  • 所要時間: 約 5.5 時間(準備フェーズ除く)
  • 成果物: 17 モデル / 50+ テンプレート / 199 テスト / 15,000 行の Python コード

AWS DMS Serverless の OOM 障害と監視の盲点 — 検知漏れの根本原因と対策

はじめに

AWS DMS Serverless Replication(CDC モード)が OOM(Out of Memory)で failed 状態になり、自動再起動の仕組みが検知できずに長期間停止していた問題について、根本原因と対策をまとめます。

構成

RDS (MySQL) → DMS Serverless (CDC) → S3 (Parquet)

開発サーバーの Let's Encrypt 証明書が切れたので自動更新できるようにした

きっかけ

ある日、開発環境の Web アプリにアクセスしたら証明書の期限切れ警告が表示された。

確認してみると、ワイルドカード証明書 (*.dev.example.com) がちょうどその日に期限切れになっていた。さらにもう1つ古い証明書も半年前に失効済み。

Certificate Name: dev.example.com-0001