テーマ: coding-practice
-
Pythonのコマンドラインツールを設計する: argparse、main()、終了コード
インターフェースはコンソールスクリプトとして登録した`main(argv) -> int`関数にまとめ、argparseの`type`と`choices`で検証し、終了コードの慣習(0は成功、2は使用法エラー、1はその他の失敗、sysexitsのコードは文書化されている場合にのみ)に従い、結果はstdoutに、診断情報はstderrに出力し、SIGINTとbroken pipeを処理する。
-
.NETの依存性注入の慣習: ライフタイム、スコープ、captive dependencyの罠
Microsoft.Extensions.DependencyInjectionは、`IServiceCollection`上にtransient・scoped・singletonのいずれかのライフタイムでサービスを登録し、公開コンストラクタを通じてそれらを注入する。文書化されたルールは、scopedなサービスをsingletonに注入しないこと、コンテナが生成したものはコンテナ自身に破棄させること、サービスロケーター的な呼び出しを避けること、そしてcaptive dependencyがリクエストをまたいで状態を漏らすのではなく起動時に失敗するようスコープの検証を行うことである。
-
コードでは伝えられない情報を書くコメント
コメントには理由、制約、分かりにくい影響を書く。コードの内容を言い直さない。説明対象のコードの隣に置き、理由がなくなったら削除する。コメントよりも、適切な名前やテストで表現することを優先する。
-
検証しながら小さなステップでリファクタリングする
リファクタリングは、動作を変えずに構造を変える。ごく小さなステップで進め、各ステップの間でテストを成功させ、動作変更とは別のコミットにすれば、安全性とレビューのしやすさを保てる。
-
Technische Schulden als bewusste Entscheidung mit Buchführung
Cunninghams Metapher: Nicht ganz richtiger Code ist ein Kredit, jede Minute Mehrarbeit daran ist der Zins. Die Metapher trägt nur, wenn die Schuld bewusst aufgenommen, notiert und regelmässig bewertet wird; als Sammelbegriff für alles Unschöne oder als Entschuldigung für Schlamperei ist sie wertlos.
-
Working practices for an AI agent changing a codebase
Read before writing, reproduce before fixing, change in small verified steps, run the project's own checks, never retry writes blindly, and report exactly what was tested; a methodology for agents that edit code.
-
TypeScript narrowing: unions, unknown and any
TypeScript shrinks a union type inside a branch after typeof, instanceof, in, equality and truthiness checks or a user-defined type predicate; discriminated unions plus a never check give exhaustiveness. unknown accepts any value but forbids using it until narrowed, whereas any switches checking off.
-
Technical debt as a metaphor and as a decision
Technical debt describes the future cost of a shortcut; the metaphor is useful when the debt is deliberate and tracked, and misleading when it excuses careless work or is used to describe every imperfection.
-
コードの意図が伝わる識別子の命名
ドメインの語彙を使い、対象が何であるか、何をするかを示す名前を選ぶ。長さは使われる範囲に合わせる。型などの符号化、略語、型について誤解を招く名前を避け、理解が深まったら名前を変える。
-
JSON フィールドの命名と大文字・小文字を統一する
プロパティ名の表記規則を一つ選び、すべてに適用します。Google の JSON スタイルガイドと ProtoJSON は lowerCamelCase を使い、多くの API は snake_case を使います。表記だけでなく、意味のある名前を付け、列挙値は文字列、タイムスタンプは RFC 3339 の文字列、64 ビット整数は文字列にします。
-
Python のコンテキストマネージャー:後片付けを確実に行う
with 文はブロックの前後で __enter__ と __exit__ を実行し、例外が起きてもファイル、ロック、接続を解放する。contextlib.contextmanager はジェネレーターをコンテキストマネージャーに変える。
-
JSON Schema による JSON の検証
JSON Schema は、型、必須キー、列挙値、形式、範囲など、文書で許容される構造を記述する。さまざまな言語で入力を処理前に検証できるようにし、additionalProperties は明示的に設定する。
-
ツールにも読み手にも役立つ docstring
PEP 257 は docstring の配置と書式を定めています。Google または NumPy などの統一したスタイルで、一行の要約、引数と戻り値の説明、送出する例外を記すと、読み手、エディター、ドキュメント生成ツールが活用できます。
-
浮動小数点数:0.1 + 0.2 が 0.3 にならない理由
二進浮動小数点は、多くの十進小数を近似して表すため、計算で丸め誤差が蓄積します。許容誤差で比較し、慎重に合計し、金額や件数には整数か十進型を使い、元の値に戻せるだけの桁数で出力します。
-
自動整形と lint をチームの約束にする
レイアウトをフォーマッターに、機械的なチェックをリンターに任せると、レビューからスタイルの議論を取り除ける。EditorConfig、PEP 8、Ruff などのツールは、その約束をリポジトリに記述する方法を示している。
-
特徴量のスケーリングとカテゴリのエンコーディング:変換対象を選び、適合は訓練データだけで行う
距離や勾配に基づくモデルでは、数値特徴量の尺度を比較可能にする必要がある(StandardScaler、MinMaxScaler、RobustScaler)。カテゴリ列は、カテゴリ数とモデルの種類に応じて、ワンホット、順序、ターゲットの各エンコーディングで数値に変換する。すべての変換器を訓練用の分割で適合させ、変更せずに検証、テスト、本番の行へ適用する。
-
Protocol classes: structural typing for duck-typed Python
A typing.Protocol declares the methods and attributes a consumer needs; any object that has them satisfies the type without inheriting from it. Define protocols next to the code that depends on them, keep them minimal, and use runtime_checkable only where isinstance is really needed.
-
機械学習実験の再現性:シード、環境、データ、決定性の限界
実験を再実行して同じ数値を得るには、固定した乱数状態を明示的に渡すこと、ライブラリのバージョンを固定すること、データセットと分割を特定することが必要になる。それでも GPU カーネルやライブラリのリリースにより結果が変わり得ると理解する必要がある。この手順は、可能な範囲で実行を繰り返せるようにし、不可能な部分を記録する。
-
JSON Schema、検証、回数制限付き再試行による文書からの構造化抽出
additionalProperties false の JSON Schema で対象レコードを定義し、モデルにその形だけを要求する。各応答を実際のバリデーターで検証し、エラーをプロンプトへ戻して上限付きで再試行する。それでも失敗するものは推測せず、人に回す。
-
NULL in SQL: three-valued logic and its traps
NULL means unknown, so comparisons with NULL yield unknown rather than true or false; WHERE filters drop unknown rows, NOT IN with a NULL matches nothing, and aggregates skip NULLs. Use IS NULL, IS DISTINCT FROM and COALESCE deliberately.
機械可読: JSON