プログラミングRust 第2版

Book description

次世代ブラウザ開発用にMozillaによって開発されたRustは、C/C++並みのパフォーマンスと低レベルの制御能力に加え、メモリとスレッドの安全性を担保し、さらに並行性にも優れるといった特徴を持つ、優秀な言語です。本書はMozillaで実際にRustを使ってFirefoxを開発している著者らによる、言語の概要と用途について解説する書籍で、Rustのほとんどの機能を詳細にカバーします。Rustのメジャーバージョンアップにより非同期処理が可能となったことに対応し、第2版では新たに非同期処理の章を設け、この機能を詳細に解説しています。Rust 2021対応。

Table of contents

  1. 大扉
  2. 原書大扉
  3. クレジット
  4. 訳者まえがき
    1. 第2版へのまえがき
    2. 第1版へのまえがき
  5. まえがき
    1. 本書の読者
    2. なぜ本書を書いたのか
    3. 本書の構成
    4. 本書の表記法
    5. コード例の使用
    6. 問い合わせ先
    7. 謝辞
  6. 1章 システムプログラマにもっといいものを
    1. 1.1 Rustはプログラマの負担を引き受ける
    2. 1.2 並列プログラムを飼いならす
    3. 1.3 にもかかわらずRustは速い
    4. 1.4 Rustでは協調するのも容易
  7. 2章 Rustツアー
    1. 2.1 rustupとCargo
    2. 2.2 Rustの関数
    3. 2.3 ユニットテストの記述と実行
    4. 2.4 コマンドライン引数の処理
    5. 2.5 Webページを公開する
    6. 2.6 並列プログラミング
      1. 2.6.1 マンデルブロ集合とは
      2. 2.6.2 コマンドライン引数に書いた値ペアのパース
      3. 2.6.3 ピクセルから複素数へのマッピング
      4. 2.6.4 集合の描画
      5. 2.6.5 画像ファイルの書き出し
      6. 2.6.6 並列マンデルブロプログラム
      7. 2.6.7 マンデルブロ描画プログラムの実行
      8. 2.6.8 安全性は見えない
    7. 2.7 ファイルシステムとコマンドラインツール
      1. 2.7.1 コマンドラインインターフェイス
      2. 2.7.2 ファイルの読み書き
      3. 2.7.3 検索と置換
  8. 3章 基本的な型
    1. 3.1 固定長数値
      1. 3.1.1 整数型
      2. 3.1.2 チェック付き演算、ラップ演算、飽和演算、オーバーフロー演算
      3. 3.1.3 浮動小数点数
    2. 3.2 真偽値型
    3. 3.3 文字
    4. 3.4 タプル
    5. 3.5 ポインタ型
      1. 3.5.1 参照
      2. 3.5.2 Box
      3. 3.5.3 rawポインタ
    6. 3.6 配列、ベクタ、スライス
      1. 3.6.1 配列
      2. 3.6.2 ベクタ
      3. 3.6.3 スライス
    7. 3.7 文字列型
      1. 3.7.1 文字列リテラル
      2. 3.7.2 バイト文字列
      3. 3.7.3 メモリ上の文字列
      4. 3.7.4 文字列String
      5. 3.7.5 文字列の使用
      6. 3.7.6 他の文字列に類する型
    8. 3.8 型エイリアス
    9. 3.9 基本型の先にあるもの
  9. 4章 所有権と移動
    1. 4.1 所有権
    2. 4.2 移動
      1. 4.2.1 移動を伴う他の操作
      2. 4.2.2 移動と制御フロー
      3. 4.2.3 移動とインデックス参照される値
    3. 4.3 コピー型:移動の例外
    4. 4.4 RcとArc:所有権の共有
  10. 5章 参照
    1. 5.1 値への参照
    2. 5.2 参照の使い方
      1. 5.2.1 Rustの参照 vs C++の参照
      2. 5.2.2 参照の代入
      3. 5.2.3 参照への参照
      4. 5.2.4 参照の比較
      5. 5.2.5 参照はnullにはならない
      6. 5.2.6 任意の式への参照の借用
      7. 5.2.7 スライスとトレイトオブジェクトへの参照
    3. 5.3 参照の安全性
      1. 5.3.1 ローカル変数の借用
      2. 5.3.2 仮引数として参照を受け取る場合
      3. 5.3.3 参照を関数に渡す
      4. 5.3.4 返り値としての参照
      5. 5.3.5 参照を含む構造体
      6. 5.3.6 個別の生存期間パラメータ
      7. 5.3.7 生存期間パラメータの省略
    4. 5.4 共有と変更
      1. Rustの共有参照vsCのconstへのポインタ
    5. 5.5 オブジェクトの海に立ち向かう
  11. 6章 式
    1. 6.1 式言語
    2. 6.2 優先順位と結合性
    3. 6.3 ブロックとセミコロン
    4. 6.4 宣言
    5. 6.5 ifとmatch
    6. 6.6 if let式
    7. 6.7 ループ
    8. 6.8 ループ内の制御フロー
    9. 6.9 return式
    10. 6.10 なぜRustにはloop式があるのか
    11. 6.11 関数呼び出しとメソッド呼び出し
    12. 6.12 フィールドと要素
    13. 6.13 参照演算子
    14. 6.14 算術演算子、ビット演算子、比較演算子、論理演算子
    15. 6.15 代入
    16. 6.16 型キャスト
    17. 6.17 クロージャ
    18. 6.18 その先へ
  12. 7章 エラー処理
    1. 7.1 パニック
      1. 7.1.1 スレッドの巻き戻し
      2. 7.1.2 アボート
    2. 7.2 Result
      1. 7.2.1 エラーのキャッチ
      2. 7.2.2 Result型のエイリアス
      3. 7.2.3 エラーの表示
      4. 7.2.4 エラーの伝播
      5. 7.2.5 複数種類のエラーへの対応
      6. 7.2.6 「起こるはずのない」エラーの処理
      7. 7.2.7 エラーを無視する
      8. 7.2.8 main()でのエラー処理
      9. 7.2.9 カスタムエラー型の宣言
      10. 7.2.10 なぜResultを使うのか
  13. 8章 クレートとモジュール
    1. 8.1 クレート
      1. 8.1.1 エディション
      2. 8.1.2 ビルドプロファイル
    2. 8.2 モジュール
      1. 8.2.1 モジュールのネスト
      2. 8.2.2 モジュールの複数ファイルへの分割
      3. 8.2.3 パスとインポート
      4. 8.2.4 標準のプレリュード
      5. 8.2.5 use宣言をパブリックにする
      6. 8.2.6 構造体のフィールドをpubにする
      7. 8.2.7 staticと定数
    3. 8.3 プログラムからライブラリへ
    4. 8.4 src/binディレクトリ
    5. 8.5 属性
    6. 8.6 テストとドキュメント
      1. 8.6.1 結合テスト
      2. 8.6.2 ドキュメント
      3. 8.6.3 ドキュメントテスト
    7. 8.7 依存ライブラリの指定
      1. 8.7.1 バージョン
      2. 8.7.2 Cargo.lock
    8. 8.8 クレートのcrates.ioでの公開
    9. 8.9 ワークスペース
    10. 8.10 いいものをもっと
  14. 9章 構造体
    1. 9.1 名前付きフィールド型構造体
    2. 9.2 タプル型構造体
    3. 9.3 ユニット型構造体
    4. 9.4 構造体のメモリ配置
    5. 9.5 implによるメソッド定義
      1. 9.5.1 selfをBox、Rc、Arcで渡す
      2. 9.5.2 型関連関数
    6. 9.6 型関連定数
    7. 9.7 ジェネリック構造体
    8. 9.8 生存期間パラメータを持つジェネリック構造体
    9. 9.9 定数パラメータを持つジェネリック構造体
    10. 9.10 一般的なトレイトの自動実装
    11. 9.11 内部可変性
  15. 10章 列挙型とパターン
    1. 10.1 列挙型
      1. 10.1.1 データを保持する列挙型
      2. 10.1.2 列挙型のメモリ上での表現
      3. 10.1.3 列挙型を用いたリッチなデータ構造
      4. 10.1.4 ジェネリック列挙型
    2. 10.2 パターン
      1. 10.2.1 パターン内のリテラル、変数、ワイルドカード
      2. 10.2.2 タプルと構造体パターン
      3. 10.2.3 配列パターンとスライスパターン
      4. 10.2.4 参照パターン
      5. 10.2.5 マッチガード
      6. 10.2.6 複数の可能性へのマッチ
      7. 10.2.7 @パターンによる束縛
      8. 10.2.8 パターンが使える場所
      9. 10.2.9 二分木へのデータ追加
    3. 10.3 大きな絵の中での位置付け
  16. 11章 トレイトとジェネリクス
    1. 11.1 トレイトの使い方
      1. 11.1.1 トレイトオブジェクト
        1. 11.1.1.1 トレイトオブジェクトのメモリ配置
      2. 11.1.2 ジェネリック関数と型パラメータ
      3. 11.1.3 どちらを使うべきか
    2. 11.2 トレイトの定義と実装
      1. 11.2.1 デフォルトメソッド
      2. 11.2.2 トレイトと第三者の定義した型
      3. 11.2.3 トレイトでのSelf
      4. 11.2.4 サブトレイト
      5. 11.2.5 型関連関数
    3. 11.3 完全修飾メソッド呼び出し
    4. 11.4 型と型の関係を定義するトレイト
      1. 11.4.1 関連型:イテレータはどう動く
      2. 11.4.2 ジェネリックトレイト:演算子オーバーロードはどう機能するか
      3. 11.4.3 impl Trait
      4. 11.4.4 トレイトの関連定数
    5. 11.5 制約のリバースエンジニアリング
    6. 11.6 基盤としてのトレイト
  17. 12章 演算子オーバーロード
    1. 12.1 算術演算子とビット演算子
      1. 12.1.1 単項演算子
      2. 12.1.2 二項演算子
      3. 12.1.3 複合代入演算子
    2. 12.2 等価性テスト
    3. 12.3 順序比較
    4. 12.4 IndexとIndexMut
    5. 12.5 その他の演算子
  18. 13章 ユーティリティトレイト
    1. 13.1 Drop
    2. 13.2 Sized
    3. 13.3 Clone
    4. 13.4 Copy
    5. 13.5 DerefとDerefMut
    6. 13.6 Default
    7. 13.7 AsRefとAsMut
    8. 13.8 BorrowとBorrowMut
    9. 13.9 FromとInto
    10. 13.10 TryFromとTryInto
    11. 13.11 ToOwned
    12. 13.12 BorrowとToOwnedの動作例:つつましいCow
  19. 14章 クロージャ
    1. 14.1 変数のキャプチャ
      1. 14.1.1 借用するクロージャ
      2. 14.1.2 盗むクロージャ
    2. 14.2 関数型とクロージャ型
    3. 14.3 クロージャの性能
    4. 14.4 クロージャと安全性
      1. 14.4.1 殺すクロージャ
      2. 14.4.2 FnOnce
      3. 14.4.3 FnMut
      4. 14.4.4 クロージャのCopyとClone
    5. 14.5 コールバック
    6. 14.6 クロージャの効率的な利用
  20. 15章 イテレータ
    1. 15.1 IteratorトレイトとIntoIteratorトレイト
    2. 15.2 イテレータの作成
      1. 15.2.1 iterメソッドとiter_mutメソッド
      2. 15.2.2 IntoIteratorの実装
      3. 15.2.3 from_fnとsuccessors
      4. 15.2.4 drainメソッド
      5. 15.2.5 他のイテレータの生成方法
    3. 15.3 イテレータアダプタ
      1. 15.3.1 mapとfilter
      2. 15.3.2 filter_mapとflat_map
      3. 15.3.3 flatten
      4. 15.3.4 takeとtake_while
      5. 15.3.5 skipとskip_while
      6. 15.3.6 peekable
      7. 15.3.7 fuse
      8. 15.3.8 反転可能イテレータとrev
      9. 15.3.9 inspect
      10. 15.3.10 chain
      11. 15.3.11 enumerate
      12. 15.3.12 zip
      13. 15.3.13 by_ref
      14. 15.3.14 clonedとcopied
      15. 15.3.15 cycle
    4. 15.4 イテレータの消費
      1. 15.4.1 単純な累積:count、sum、product
      2. 15.4.2 max、min
      3. 15.4.3 max_by、min_by
      4. 15.4.4 max_by_key、min_by_key
      5. 15.4.5 アイテム列の比較
      6. 15.4.6 any、all
      7. 15.4.7 position、rposition、ExactSizeIterator
      8. 15.4.8 foldとrfold
      9. 15.4.9 try_foldとtry_rfold
      10. 15.4.10 nthとnth_back
      11. 15.4.11 last
      12. 15.4.12 find、rfind、find_map
      13. 15.4.13 コレクションの作成:collectとFromIterator
      14. 15.4.14 Extendトレイト
      15. 15.4.15 partition
      16. 15.4.16 for_eachとtry_for_each
    5. 15.5 ユーザ定義イテレータの実装
  21. 16章 コレクション
    1. 16.1 概要
    2. 16.2 Vec<T>
      1. 16.2.1 要素へのアクセス
      2. 16.2.2 イテレート処理
      3. 16.2.3 ベクタの伸長と縮小
      4. 16.2.4 連結
      5. 16.2.5 分割
      6. 16.2.6 入れ替え
      7. 16.2.7 フィル
      8. 16.2.8 ソートと検索
      9. 16.2.9 スライスの比較
      10. 16.2.10 ランダムな要素
      11. 16.2.11 Rustでは無効化エラーは生じない
    3. 16.3 VecDeque<T>
    4. 16.4 BinaryHeap<T>
    5. 16.5 HashMap<K, V>とBTreeMap<K, V>
      1. 16.5.1 エントリ
      2. 16.5.2 マップに対するイテレート
    6. 16.6 HashSet<T>とBTreeSet<T>
      1. 16.6.1 セットのイテレート
      2. 16.6.2 値が等しいが別のものの場合
      3. 16.6.3 セット全体に対する演算
    7. 16.7 ハッシュ
    8. 16.8 ハッシュアルゴリズムのカスタマイズ
    9. 16.9 標準コレクションを超えて
  22. 17章 文字列とテキスト
    1. 17.1 Unicodeについて
      1. 17.1.1 ASCII、Latin-1、Unicode
      2. 17.1.2 UTF-8
      3. 17.1.3 テキストの向き
    2. 17.2 文字(char)
      1. 17.2.1 文字の分類
      2. 17.2.2 数字の取り扱い
      3. 17.2.3 文字の大文字小文字変換
      4. 17.2.4 整数との間の変換
    3. 17.3 Stringとstr
      1. 17.3.1 String値の作成
      2. 17.3.2 単純な検査
      3. 17.3.3 テキストの追加と挿入
      4. 17.3.4 テキストの削除と置換
      5. 17.3.5 検索とイテレート関数の名前付け
      6. 17.3.6 パターンによるテキスト検索
      7. 17.3.7 検索と置換
      8. 17.3.8 テキストに対するイテレート
      9. 17.3.9 トリミング
      10. 17.3.10 文字列の大文字小文字変換
      11. 17.3.11 他の型を文字列からパース
      12. 17.3.12 他の型から文字列への変換
      13. 17.3.13 他のテキストに類する型としての借用
      14. 17.3.14 UTF-8としてのアクセス
      15. 17.3.15 UTF-8データからのテキストの作成
      16. 17.3.16 ヒープ確保の遅延
      17. 17.3.17 汎用コレクションとしての文字列
    4. 17.4 値のフォーマット出力
      1. 17.4.1 テキスト値のフォーマット
      2. 17.4.2 数値のフォーマット
      3. 17.4.3 他の型のフォーマット
      4. 17.4.4 デバッグのためのフォーマット
      5. 17.4.5 デバッグのためのポインタのフォーマット
      6. 17.4.6 インデックス、名前による引数の参照
      7. 17.4.7 動的なフィールド幅
      8. 17.4.8 ユーザ定義型のフォーマット出力
      9. 17.4.9 フォーマット言語のユーザコードでの利用
    5. 17.5 正規表現
      1. 17.5.1 Regexの基本的な使い方
      2. 17.5.2 Regex値の遅延作成
    6. 17.6 正規化
      1. 17.6.1 正規化形式
      2. 17.6.2 unicode-normalizationクレート
  23. 18章 入出力
    1. 18.1 readerとwriter
      1. 18.1.1 Reader
      2. 18.1.2 バッファ付きreader
      3. 18.1.3 行の読み出し
      4. 18.1.4 行に対するcollect
      5. 18.1.5 writer
      6. 18.1.6 ファイル
      7. 18.1.7 シーク
      8. 18.1.8 他のreader型、writer型
      9. 18.1.9 バイナリデータ、圧縮、シリアライズ
    2. 18.2 ファイルとディレクトリ
      1. 18.2.1 OsStrとPath
      2. 18.2.2 PathとPathBufのメソッド
      3. 18.2.3 ファイルシステムアクセス関数
      4. 18.2.4 ディレクトリの読み出し
      5. 18.2.5 プラットフォーム固有機能
    3. 18.3 ネットワークプログラム
  24. 19章 並列性
    1. 19.1 フォーク・ジョイン並列
      1. 19.1.1 spawnとjoin
      2. 19.1.2 スレッド間でのエラー処理
      3. 19.1.3 不変データのスレッド間共有
      4. 19.1.4 Rayon
      5. 19.1.5 マンデルブロ集合再訪
    2. 19.2 チャネル
      1. 19.2.1 値の送信
      2. 19.2.2 値の受信
      3. 19.2.3 パイプラインの実行
      4. 19.2.4 チャネルの機能と性能
      5. 19.2.5 スレッド安全性:SendとSync
      6. 19.2.6 ほとんどすべてのイテレータをつなげられるチャネル
      7. 19.2.7 パイプライン以外のチャネルの使用法
    3. 19.3 可変状態の共有
      1. 19.3.1 排他ロックとは何か?
      2. 19.3.2 Mutex<T>
      3. 19.3.3 可変性とMutex
      4. 19.3.4 排他ロックがいつもいいとは限らないのはなぜか
      5. 19.3.5 デッドロック
      6. 19.3.6 毒された排他ロック
      7. 19.3.7 排他ロックを用いた、複数の消費者を持つチャネル
      8. 19.3.8 リードライトロック(RwLock<T>)
      9. 19.3.9 条件変数(Condvar)
      10. 19.3.10 アトミック変数
      11. 19.3.11 グローバル変数
    4. 19.4 Rustでの並列コードの開発
  25. 20章 非同期プログラミング
    1. 20.1 同期プログラムから非同期プログラムへ
      1. 20.1.1 フューチャ
      2. 20.1.2 async関数とawait式
      3. 20.1.3 非同期関数を同期コードから呼び出す:block_on
      4. 20.1.4 非同期タスクの起動
      5. 20.1.5 非同期ブロック
      6. 20.1.6 非同期ブロックを用いた非同期関数の記述
      7. 20.1.7 非同期タスクをスレッドプールで実行
      8. 20.1.8 このフューチャはSendを実装してたっけ?
      9. 20.1.9 長時間の計算:yield_nowとspawn_blocking
      10. 20.1.10 非同期機構の設計
      11. 20.1.11 本当に非同期なHTTPクライアント
    2. 20.2 非同期なクライアントとサーバ
      1. 20.2.1 Error型とResult型
      2. 20.2.2 プロトコル
      3. 20.2.3 ユーザ入力の取得:非同期ストリーム
      4. 20.2.4 パケットの送信
      5. 20.2.5 パケットの受信:非同期ストリームについてもう少し
      6. 20.2.6 クライアントのmain関数
      7. 20.2.7 サーバのmain関数
      8. 20.2.8 チャット接続の管理:非同期排他ロック
      9. 20.2.9 GroupTable:同期排他ロック
      10. 20.2.10 チャットグループ:tokioのブロードキャストチャネル
    3. 20.3 原始的なフューチャとエグゼキュータ:フューチャを再度ポーリングするべきなのはいつか?
      1. 20.3.1 ウェイカの起動:spawn_bloking
      2. 20.3.2 block_onの実装
    4. 20.4 ピン留め
      1. 20.4.1 フューチャの2つのライフステージ
      2. 20.4.2 ピン留めされたポインタ
      3. 20.4.3 Unpinトレイト
    5. 20.5 非同期コードはどのような場合に使うべきか?
  26. 21章 マクロ
    1. 21.1 マクロの基本
      1. 21.1.1 マクロ展開の基礎
      2. 21.1.2 意図しない結果
      3. 21.1.3 繰り返し
    2. 21.2 組み込みマクロ
    3. 21.3 マクロのデバッグ
    4. 21.4 json!マクロの構築
      1. 21.4.1 フラグメント型
      2. 21.4.2 マクロ中の再帰
      3. 21.4.3 マクロでのトレイトの利用
      4. 21.4.4 スコープと健全マクロ
      5. 21.4.5 マクロのインポートとエクスポート
    5. 21.5 マッチ中のシンタックスエラーを避ける
    6. 21.6 macro_rules!よりも複雑なマクロ
  27. 22章 unsafeなコード
    1. 22.1 何に対してunsafeなのか?
    2. 22.2 unsafeブロック
    3. 22.3 例:効率的なASCII文字列型
    4. 22.4 unsafe関数
    5. 22.5 unsafeブロックかunsafe関数か?
    6. 22.6 未定義動作
    7. 22.7 unsafeトレイト
    8. 22.8 rawポインタ
      1. 22.8.1 rawポインタを安全に参照解決するには
      2. 22.8.2 例:RefWithFlag
      3. 22.8.3 nullとなり得るポインタ
      4. 22.8.4 型のサイズとアラインメント
      5. 22.8.5 ポインタ演算
      6. 22.8.6 メモリに移動、メモリから移動
      7. 22.8.7 例:GapBuffer
      8. 22.8.8 unsafeなコードのパニック安全性
    9. 22.9 共用体を用いたメモリの再解釈
    10. 22.10 共用体に対するマッチ
    11. 22.11 共用体の借用
  28. 23章 外部言語関数
    1. 23.1 共通のデータ表現を見つける
    2. 23.2 外部言語関数、変数の宣言
    3. 23.3 ライブラリ関数の使用
    4. 23.4 libgit2のrawインターフェイス
    5. 23.5 libgit2に対する安全なインターフェイス
    6. 23.6 結論
  29. 著者・訳者紹介
  30. 奥付

Product information

  • Title: プログラミングRust 第2版
  • Author(s): Jim Blandy, Jason Orendorff, Leonora F. S. Tindall, 中田 秀基
  • Release date: January 2022
  • Publisher(s): O'Reilly Japan, Inc.
  • ISBN: 9784873119786

You might also like

book

詳解 システム・パフォーマンス 第2版

by Brendan Gregg, 西脇 靖紘, 長尾 高弘

本書は、エンタープライズとクラウド環境を対象としたオペレーティングシステムとアプリケーションのパフォーマンス分析と向上について解説します。 主にLinuxベースのオペレーティングシステムに含まれるツールとその使用例を通じてシステムパフォーマンスを引き出す手法を説明します。システム評価のためのベンチマーク、キャパシティプランニング、ボトルネックの解消について解説しスケーラビリティを制限する要因を発見、分析し、解決する方法を学びます。 第2版では、perf、Ftrace、BPFの解説が加わり、Linuxとクラウドコンピューティングについての説明が充実しました。 システムのパフォーマンスを向上させ、コストを削減し、レイテンシの外れ値を減らすための方法を学ぶ本書はエンジニア必携の一冊です。

book

scikit-learn、Keras、TensorFlowによる実践機械学習 第2版

by Aurélien Géron, 下田 倫大, 長尾 高弘

本書はコードを動かしながら学び、機械学習が使えるようになることを目的とした書籍です。現実的な問題を出し、サンプルデータを示しながら、機械学習で問題を解決に導くまでの一連の手法を体系立てて解説します。深層学習以外の機械学習にはscikit-learnを使い、機械学習プロジェクトの流れ、データからモデルを学習する方法、データの処理・クリーニングなどの基礎から、特徴量の選択や過学習、データの次元削減など応用までを学びます。深層学習にはTensorFlowとKerasを使い、ニューラルネットワークの構築と訓練、ニューラルネットワークアーキテクチャ、深層学習や強化学習、さらにTensorFlowの分散処理のメカニズムや実装までを幅広く解説します。

book

レガシーコードからの脱却 ―ソフトウェアの寿命を延ばし価値を高める9つのプラクティス

by David Scott Bernstein, 吉羽 龍太郎, 永瀬 美穂, 原田 騎郎, 有野 雅士

レガシーコードとは、バグを多く含み、壊れやすく拡張が難しいコードを指します。このようなコードの保守と管理には多大な労力がつぎ込まれることになります。しかも一度作ってしまったレガシーコードの質を上げるには、初めから質の高いコードを作るよりも膨大なコストがかかります。 本書では、ソフトウェア開発において、初めからレガシーコードを作りださないためのプラクティスを9つ挙げて解説します。プロダクトオーナーは目的を語り、やり方は開発者に任せること、小さなバッチで開発を進めること、継続的に統合すること、チームメンバーで協力することなど、日々の開発に取り入れる考え方と具体的な実践について各章で分かりやすく解説します。 信頼性や拡張性が高いソフトウェアをリリースしたい開発者、運用管理者、マネージャに必携の一冊です。

book

マスタリングLinuxシェルスクリプト 第2版 ―Linuxコマンド、bashスクリプト、シェルプログラミング実践入門

by Mokhtar Ebrahim, Andrew Mallett, 萬谷 暢崇, 原 隆文

Linuxシェルスクリプトの解説書。その中でも特にbashのシェルスクリプティングに焦点を当てています。シェルスクリプトの書き方、デバッグ方法、bashプログラミングの基本といったシェルスクリプティングの基礎から、sedやAWKなど各種ツールとの連携といった実践的な応用までを体系的に解説します。WebサーバーなどのLinuxシステムの管理を任されるようになった初級の管理者にも、もっと高度で実践的なテクニックを必要としている中級の管理者や開発者にも広く役に立つ内容です。