Rust

Rust で JSON を扱う — serde デシリアライズ実践まとめ
読了 4分

Rust で JSON を扱う — serde デシリアライズ実践まとめ

Rust の JSON 処理の標準である serde を実践の順序で整理します。derive 1 行で始める構造体のデシリアライズ、フィールドがないかもしれない現実の JSON を受ける Option と default、API の camelCase をつなぐ rename_all、構造の分からない JSON を探る Value、形が複数ある応答を受ける enum と untagged、そしてエラーメッセージから位置を読む方法まで扱います。

PyO3 で Python 拡張モジュールを作る — maturin のビルドから wheel 配布まで
読了 5分

PyO3 で Python 拡張モジュールを作る — maturin のビルドから wheel 配布まで

Polars、Ruff、pydantic が証明した経路「Python のボトルネック関数だけ Rust に」を実際に歩きます。maturin new で始めるプロジェクト構造、#[pyfunction] と #[pymodule] で Rust 関数を Python に公開する方法、maturin develop の開発サイクル、型変換(str・list・dict)の規則、free-threaded Python 時代との相性、そして wheel のビルドと PyPI への配布まで扱います。

Box・Rc・Arc の違い — Rust のスマートポインタ、いつ何を使うか
読了 5分

Box・Rc・Arc の違い — Rust のスマートポインタ、いつ何を使うか

基礎講座が The Book に預けていた空白を回収します。値をヒープに置く Box が必要な 3 つの状況(再帰型、dyn トレイト、大きな値の移動)、所有者を複数にする Rc と参照カウント、スレッドをまたぐ Arc、実行時の借用検査で内部可変性を開く RefCell、そして実務のイディオムである Rc<RefCell<T>> と Arc<Mutex<T>> まで、選択基準を決定手順として整理します。

Rust vs Go — サーバー、CLI、システムプログラミングで何を選ぶかの基準
読了 4分

Rust vs Go — サーバー、CLI、システムプログラミングで何を選ぶかの基準

どちらも静的型付けで単一バイナリを作るコンパイル言語ですが、設計哲学は正反対に近いです。メモリ管理(GC vs 所有権)、並行処理(組み込みのゴルーチン vs async エコシステム)、学習曲線とチームのオンボーディング、レイテンシ特性、そして Web API、CLI ツール、インフラソフトウェア、組み込みまで、用途別にどちらが有利かの判断基準を整理します。

Rust 借用エラー総まとめ — value moved、cannot borrow、does not live long enough
読了 5分

Rust 借用エラー総まとめ — value moved、cannot borrow、does not live long enough

Rust 入門者が最もよく出会う借用チェッカーのエラーをコード別に整理します。E0382(移動後の使用)、E0502(不変・可変借用の衝突)、E0499(可変借用の重複)、E0506(借用中の値への代入)、E0597(ライフタイム不足)、E0596(クロージャのキャプチャ)まで、各エラーの原因と代表的な対処を、診断→原因→解決の順で扱います。

Rust 実践講座 #8 配布 — crates.io への公開と GitHub Releases の自動化で完結
読了 4分

Rust 実践講座 #8 配布 — crates.io への公開と GitHub Releases の自動化で完結

実践講座の最終回です。crates.io への公開に必要なメタデータと cargo publish の手順(dry-run、公開の永続性と yank)、利用者が cargo install の 1 行でインストールする体験、Rust を持たない利用者のための GitHub Releases でのバイナリ配布、そしてタグのプッシュに反応して 3 つの OS でビルド・アップロードする GitHub Actions のマトリックスワークフローまで作り、シリーズを締めくくります。

Rust 実践講座 #7 リリース最適化とクロスコンパイル — 小さく速いバイナリをどこでも
読了 5分

Rust 実践講座 #7 リリース最適化とクロスコンパイル — 小さく速いバイナリをどこでも

配布準備の前半です。[profile.release] で締める最適化(lto、codegen-units、strip)とそれぞれの代償、panic = "abort" を安易に有効にしてはいけない理由、バイナリサイズが縮む過程、そして rustup target で行うクロスコンパイル — 特に glibc 依存をなくして古いサーバーでも動く musl 静的リンクビルドと、リンカ問題を Docker で迂回する cross ツールまで扱います。

Rust 実践講座 #6 テスト — パーサーの単体テストから CLI の統合テストまで
読了 4分

Rust 実践講座 #6 テスト — パーサーの単体テストから CLI の統合テストまで

loglens に安全網を張ります。同じファイルに置く #[cfg(test)] の単体テスト(パーサーの正常・境界・失敗ケース)、tests/ ディレクトリの統合テスト、assert_cmd と predicates でビルド済みバイナリを実際に実行して出力と終了コードを検証する CLI テスト、tempfile で作る一時ログファイル、そして cargo test がテストを並列実行するという事実が持つ意味まで扱います。

Rust 実践講座 #5 rayon 並列化 — データ競合のない map-reduce
読了 5分

Rust 実践講座 #5 rayon 並列化 — データ競合のない map-reduce

集計を複数コアに分けます。並列化が得になる条件(CPU バウンド)とストリーミングから丸ごと読みへ戦略を変える理由、rayon の par_lines と fold・reduce で作るスレッドごとの部分集計と統合、Mutex で 1 つの HashMap を共有すると遅くなる理由(ロック競合)、そして共有可変状態のミスをコンパイラが捕まえる場面まで扱います。

Rust 実践講座 #4 イテレータ実践 — 集計と top-N、そしてリリースビルドの差
読了 4分

Rust 実践講座 #4 イテレータ実践 — 集計と top-N、そしてリリースビルドの差

パーサーの上に分析を載せます。パース失敗を数えながら成功だけを流す集計構造、HashMap の entry で作るステータスコード分布、ソートで取り出す top-N、コマンド 2 つ(stats・top)の完成、そして Instant で実測する debug と release ビルドの性能差(なぜ数十倍になるのか、なぜ release が既定値ではないのか)まで扱います。

Rust 実践講座 #3 ファイル IO とパース — BufReader で読み、ログ 1 行を構造体へ
読了 4分

Rust 実践講座 #3 ファイル IO とパース — BufReader で読み、ログ 1 行を構造体へ

大きなファイルを扱う 2 つの基本を固めます。全体をメモリに載せる read_to_string と行単位で流す BufReader の選択基準、システムコールとバッファリングの関係、アクセスログ 1 行を LogEntry 構造体に変えるパーサー(引用符の処理、ステータスコードの変換、第 2 回 ParseError の実戦投入)、そして serde で JSON Lines ログまで受け付ける拡張を扱います。

Rust 実践講座 #2 エラー設計 — anyhow と thiserror、死に方を設計する
読了 5分

Rust 実践講座 #2 エラー設計 — anyhow と thiserror、死に方を設計する

CLI ツールにおいてエラーメッセージはユーザーインターフェースの一部です。アプリケーション層の既定値である anyhow(main が anyhow::Result を返し、context で文脈を積む)と、呼び出し側が種類で分岐できる具体的なエラー型を作るライブラリ層の thiserror の役割分担、2 つのクレートを選ぶ判断基準、そして終了コードまで、loglens のエラー経路を設計します。