プログラミング言語
Celery で Python の非同期タスク処理 — キュー、ワーカー、運用チェックリスト
Web リクエストの中で処理してはいけない重い仕事を Celery に切り出す方法を整理します。ブローカー・ワーカー・結果バックエンドからなるタスクキューの構造、タスク定義と delay 呼び出し、リトライと指数バックオフの設定、最低 1 回実行という前提から導かれる冪等性の原則、acks_late やタイムリミットといった運用設定、Flower での監視、そして FastAPI BackgroundTasks や RQ で足りるケースの見極めまで扱います。
Rust 基礎講座 #9 ライフタイムとモジュール — 注釈が必要になる瞬間、クレートで仕上げる
基礎講座の最終回です。第 4 回のダングリング参照の遮断がどう働いていたのかをライフタイム(lifetime)で説明します。missing lifetime specifier エラーが出る瞬間、ライフタイム注釈の本当の意味(寿命を延ばすのではなく関係を宣言する)、ほとんどの場合に表記が省略される理由。続いて mod と pub でコードを分けるモジュールシステム、crates.io の外部クレートの使い方、そして講座後の学習経路まで整理します。
Rust 基礎講座 #8 トレイトとジェネリクス — 継承がない言語で共通の動作を定義する
これまで先送りしてきた概念を回収する回です。共通の動作を定義するトレイト(trait)と既定実装、型を一般化するジェネリクスとトレイト境界、derive が自動生成する標準トレイト(Debug・Clone・Copy・PartialEq)、ジェネリクスがランタイムコストなしにコンパイルされる単相化、そして Box<dyn Error> の dyn が意味する動的ディスパッチまで扱います。
SQLAlchemy 2.0 #7 Alembic と実戦構成 — マイグレーション、非同期、チーム規約
シリーズ最終回として運用フェーズのテーマを整理します。create_all がスキーマ変更を解決できない理由と Alembic の導入、autogenerate が検知できるものと見落とすもの、マイグレーションファイルのレビュー原則、create_async_engine と AsyncSession に移行する非同期構成と遅延ロードの制約、モデル・セッション・設定を配置するプロジェクト構造、チームで守る規約まで扱います。
Rust 基礎講座 #7 コレクションとイテレータ — Vec・String・HashMap、for の代わりにチェーン
実務コードの本体である 3 つのコレクションを扱います。可変長リストの Vec とインデックスの代わりに get を使う理由、なぜ String はインデックスでアクセスできないのか(UTF-8 とバイト・文字の違い)、HashMap と entry API、そして for 文を map・filter・collect のチェーンに置き換えるイテレータスタイルと遅延評価まで扱います。
SQLAlchemy 2.0 #6 クエリ応用 — 結合、集計、サブクエリ、大量処理
select() ひとつで実戦的なクエリを組み立てる方法を整理します。scalars と execute の戻り値の形の違い、複数条件と or_、結合と明示的な ON 句、group_by と集計関数にラベルを付けて読む方法、サブクエリと EXISTS、LIMIT・OFFSET ページネーションとその限界、ORM の単位作業を迂回する大量 INSERT・UPDATE まで、2.0 スタイルのクエリの実務レパートリーを扱います。
Rust 基礎講座 #6 エラー処理 — Result と ? 演算子、panic と unwrap の境界
例外(exception)のない Rust のエラー処理を扱います。失敗の可能性を戻り値の型に現す Result、match の入れ子を 1 文字に縮めてエラーを伝播する ? 演算子、main が Result を返す実用形、そして unwrap・expect・panic をいつ使ってよく、いつ使ってはいけないのかの判断基準まで扱います。
SQLAlchemy 2.0 #5 リレーション — 1:N、N:M、そして N+1 問題
ORM の花形であり罠でもある relationship を整理します。外部キーと relationship の役割分担、back_populates で双方向をつなぐ 1:N の宣言、secondary テーブルを使う N:M、親削除時の子の扱いを決める cascade と delete-orphan、遅延ロードが生む N+1 問題を echo ログで確認する方法、selectinload と joinedload で解決する基準まで扱います。
Rust 基礎講座 #5 構造体と列挙型 — match と Option、null がない言語の設計
データを構造化する 2 本の軸、構造体(struct)と列挙型(enum)を扱います。impl ブロックでメソッドを付ける方法、バリアントごとに異なるデータを持てる Rust 列挙型の表現力、すべてのケースを検査したかをコンパイラが強制する match、そして null の代わりに「値がないかもしれない」を型で表す Option まで、Rust コードの骨格になる道具を扱います。
SQLAlchemy 2.0 #4 セッション — 変更追跡、flush と commit、オブジェクトの 4 つの状態
ORM の心臓部である Session を整理します。セッションが単位作業(Unit of Work)として変更をため込み、まとめて SQL として送り出す仕組み、flush と commit の違い、transient・pending・persistent・detached というオブジェクトの 4 状態、同じ行には同じオブジェクトを返す identity map、commit 後の属性アクセスが再クエリを発行する理由、Web アプリケーションではリクエストごとにセッション 1 つというスコープ原則まで扱います。
Rust 基礎講座 #4 参照と借用 — & と &mut、借用規則のコンパイルエラーを解決する
所有権を移さずに値を使う参照(&)と可変参照(&mut)を扱います。「不変参照はいくつでも、可変参照は 1 つだけ」という借用規則が何を防ぐのか(反復中の変更、データ競合)、cannot borrow as mutable エラーの読み方と直し方、解放済みメモリを指すダングリング参照がコンパイル段階で遮断される構造、そして &str とスライスまで扱います。
SQLAlchemy 2.0 #3 ORM モデル定義 — DeclarativeBase、Mapped、mapped_column
テーブルを Python クラスとして宣言する 2.0 スタイルの ORM モデル定義を整理します。DeclarativeBase を継承する構造、Mapped 型ヒントと mapped_column の役割分担、Python の型が DB の型にマッピングされるルール、Optional と nullable の連動、デフォルト値・ユニーク制約・インデックスの宣言、制約名を自動で付ける命名規約まで扱います。