contents memorandum はてな

目次とメモを置いとく場

『強い将棋ソフトの創りかた―― Pythonで実装するディープラーニング将棋AI』(山岡忠夫, 加納邦彦 マイナビ出版 2021)

著者:山岡 忠夫[やまおか・ただお] エンジニア。
著者:加納 邦彦[かのう・くにひこ] エンジニア。
カバー:海江田 暁[かいえだ・さとる] (Dada House
図版制作:島村 龍胆[しまむら・りんどう] 
編集担当:山口 正樹[やまぐち・まさき] 
cover illustration:Tanya Shatseva / Shutterstock.com
cover photo:DRN Studio / Shutterstock.com
シリーズ:Compass Programming
NDC:007.64 情報学.情報科学 >> データ処理.情報処理 >> プログラミング
NDC:796 諸芸.娯楽 >> 将棋
件名:プログラミング(コンピュータ)
件名:将棋
件名:深層学習


強い将棋ソフトの創りかた | マイナビブックス

【書籍の宣伝】強い将棋ソフトの創りかた - TadaoYamaokaの開発日記


【目次】
はじめに [iii-iv]
本書の読み方 [v-vii]
  本書の構成
  対象読者
  読み進め方
  ソースコード
目次 [viii-x]


  Part 1 導入編

第1章 コンピュータ将棋について
1.1 コンピュータ将棋の歴史
1.2 コンピュータ将棋とディープラーニング
1.3 コンピュータ将棋の大会
  1.3.1 コンピュータ将棋の大会について
  1.3.2 大会への参加方法
    世界コンピュータ将棋選手権
    世界将棋AI電竜線
  1.3.3 コンピュータ将棋連続対局場所(floodgate)


  Part 2 理論編

第2章 コンピュータ将棋のアルゴリズム
2.1 従来のアルゴリズム 011
  2.1.1 ゲーム木
  2.1.2 ミニマックス法
  2.1.3 評価関数
  2.1.4 αβ法
  2.1.5 評価関数の機械学習
  2.1.6 強化学習

2.2 コンピュータ囲碁アルゴリズム 017
  2.2.1 コンピュータ囲碁の課題
  2.2.2 モンテカルロ法
  2.2.3 モンテカルロ木探索
    1. 選択
    2. 展開
    3. プレイアウト
    4. バックアップ
  2.2.4 マルチアームドバンディッド問題
    マルチアームドバンディッド問題
    UCB1アルゴリズム
  2.2.5 UCTアルゴリズム
    1. 選択
    2. 展開
    3. プレイアウト
    4. バックアップ
    優先順位の制御
    並列化
      (1) ルート並列化
      (2) ツリー並列化
    Virtual Loss

2.3 AlphaGoの手法 025
  2.3.1 方策ネットワーク
  2.3.2 価値ネットワーク
  2.3.3 AlphaGoの探索アルゴリズム
    1. 選択
    2. 評価
    3. バックアップ
    4. 展開
  2.3.4 AlphaGo Zeroの手法
  2.3.5 AlphaZero
  Tips ディープラーニングはαβ法で使えないのか 031

2.4 ディープラーニングの将棋AIへの応用 030
2.5 まとめ 031


第3章 ディープラーニングの基本
3.1 ニューラルネットワーク 033
  3.1.1 パーセプトロン
  3.1.2 多層パーセプトロン
  3.1.3 活性化関数
    出力層の活性化関数
    中間層の活性化関数
  3.1.4 順伝播

3.2 ニューラルネットワークの学習 039
  3.2.1 損失関数
  3.2.2 誤差逆伝播
    勾配降下法
    誤差逆伝播
    活性化関数と損失関数の微分
  3.2.3 確率的勾配降下法[Stochastic Gradient Decent]
  3.2.4 最適化手法
    Momentum SGD
  3.2.5 ミニバッチ学習の手順
  3.2.6 正規化
  3.2.7 重みの初期値
  3.2.8 過学習について
    正則化
    dropout

3.3 Batch Normalization 045

3.4 分類問題と回帰問題 045
  3.4.1 分類問題
    2値分類問題
    多クラス分類問題
  3.4.2 回帰問題

3.5 畳み込みニューラルネットワーク 048
  3.5.1 畳み込み演算
    ゼロパディング
    バイアス
    ストライド
    畳み込み層
  3.5.2 プーリング層
  3.5.3 畳み込みニューラルネットワーク

3.6 まとめ 053


  Part 3 実装編

第4章 ディープラーニングフレームワーク
4.1 ディープラーニングフレームワークについて 057

4.2 GPU 058

4.3 Google Colab[Google Colaboratory] 058
  4.3.1 Google Colabの基本的な使い方
    1. ノートブックの新規作成
    2. コードセルの実行
    3. コードセル追加
    4. セルのコピー
    5. ランタイムタイプをGPUに変更
    6. ランタイムの仕様の変更
    7. セッションの管理
    8. ヘルプ
  4.3.2 GitHub上のノートブックの開き方

4.4 PyTorchの基本 073
  4.4.1 インポート
  4.4.2 ハイパーパラメータ
  4.4.3 データセット
  4.4.4 データローダ
  4.4.5 デバイス
  4.4.6 ニューラルネットワークの定義
  4.4.7 モデルのインスタンス化とデバイスへの転送
  4.4.8 損失関数
  4.4.9 オプティマイザ
  4.4.10 訓練ループ
  4.4.11 実行結果
  4.4.12 推論
4.5 まとめ 084


第5章 Pythonで将棋AIを創る
5.1 将棋ライブラリcshogi 085
  5.1.1 インストール
  5.1.2 パッケージインポート
  5.1.3 基本的な使い方
    盤面作成
    合法手生成
    手を指す
  5.1.4 座標系
  5.1.5 駒
    駒の種類を表す定数
    先手後手を区別する駒を表す定数
    持ち駒を表す定数
  5.1.6 指し手
  5.1.7 メソッド・プロパティ一覧
    Boardクラス
    指し手を変換するヘルパー関数
    CSA.Parseクラス

5.2 ソースコードとモジュールインストール 095
  5.2.1 ソースコード
  5.2.2 パッケージインストール

5.3 ディープラーニングの将棋AIへの応用 096
  5.3.1 方策ネットワーク(policy network)
    入力
    出力
    移動元の考慮
    出力ラベル数
  5.3.2 価値ネットワーク(value network)
    入力
    出力
  5.3.3 マルチタスク学習
  5.3.4 ニューラルネットワークの構成
    入力層
    中間層
  5.3.5 出力層
    方策ネットワークの出力量
    価値ネットワークの出力量

5.4 将棋AIモデルの実装 107
  5.4.1 入力特徴量の実装
  5.4.2 方策ネットワークの出力ラベルの実装
  5.4.3 価値ネットワークの出力ラベルの実装
  5.4.4 ニューラルネットワークの実装

5.5 モデルの学習 113
  5.5.1 訓練データの準備
    dloodgateの棋譜
    CSA形式の棋譜からhcpe形式[HuffmanCodedPosAndEval]に変換
  5.5.2 訓練の実装
    コマンド引数
    デバイス初期化
    ニューラルネットワークの初期化
    オプティマイザ
    損失関数
    チェックポイント読み込み
    データ読み込み
    正解率
    チェックポイント保存
    訓練
  5.5.3 訓練の実行
  5.5.4 チェックポイントをローカルにダウンロード

5.6 まとめ 130


第6章 対局プログラムの実装
6.1 GUIソフト 131

6.2 USIプロトコル 132
  6.2.1 座標系
  6.2.2 usiコマンド
  6.2.3 isreadyコマンド
  6.2.4 usinewgameコマンド
  6.2.5 positionコマンド
    (1) 開始局面からの指し手
    (2) SFEN形式
  6.2.6 goコマンド
  6.2.7 ponder
  6.2.8 quitコマンド

6.3 USIエンジンの基本処理 139

6.4 ゲーム木 142
  6.4.1 UctNodeクラスの実装
  6.4.2 NodeTreeクラスの実装

6.5 モンテカルロ木探索の実装 147
  6.5.1 コンストラク
  6.5.2 usiメソッド
  6.5.3 setoptionメソッド
  6.5.4 isreadyメソッド
  6.5.5 positionメソッド
  6.5.6 set_limitsメソッド
  6.5.7 goメソッド
  6.5.8 searchメソッド
  6.5.9 uct_searchメソッド
  6.5.10 select_max_ucb_childメソッド
  6.5.11 get_bestmove_and_print_pvメソッド
  6.5.12 check_interruptionメソッド
    ノード数チェック
    探索打ち切り
    探索延長
  6.5.13 queue_nodeメソッド
  6.5.14 evalメソッド
  6.5.15 inferメソッド

6.6 起動処理 172

6.7 テスト 173

6.8 Colabで対局 176
  6.8.1 人間プレイヤーとの対局
  6.8.2 USIエンジンとの対局
  6.8.3 dlshogiのモデルと対局

6.9 PCで対局 182
  6.9.1 GPU
  6.9.2 Python
    ダウンロードしてインストールする方法
  6.9.3 PyTorchの環境構築
  6.9.4 パッケージインストール
  6.9.5 バッチファイル作成
  6.9.6 コマンドラインからテスト
  6.9.7 モデルファイルの配置
  6.9.8 将棋所のインストール
  6.9.9 将棋所にエンジン登録
  6.9.10 対局

6.10 まとめ 190


第7章 GCT電竜を超える強い将棋AIを創る
7.1 GCT電竜 191
  7.1.1 世界将棋AI電竜戦とは
  7.1.2 GCT電竜の紹介
    開発の経緯と動機
    dlshogiライブラリとモデルの関係
    Colabの使用について
  7.1.3 使用した棋譜
    事前学習
      floogate
      教師データの条件
      elmo_for_learn
    AobaZero棋譜
    dlshogiの強化学習
  7.1.4 公開したGCTの成果物
  Column dlshogiとGCT 197

7.2 dlshogiライブラリ 198
  7.2.1 学習部
    パッケージインストール
    コマンド
    オプション引数
    ファイル形式
    チェックポイントとモデルファイル
    ONNX形式への変換
  7.2.2 探索部
    推論ライブラリ
    探索部の特徴
  7.2.3 入力特徴量
  7.2.4 ニューラルネットワークの構成
    入力層
    中間層
    活性化関数
  7.2.5 学習テクニック
    指し手のみの学習と方策の分布の学習
    平均化
    ブートストラップ
    オプティマイザ
    学習率スケジューラ
    Stochastic Weight Averating(SWA)
    Automatic Mixed Precision(AMP)
  7.2.6 ユーティリティ
  Column dlshogiが影響を受けたソフトウェア 210

7.3 dlshogiライブラリを使用したモデルの学習 211
  7.3.1 ノートブックの処理時間
  7.3.2 本書で使用する棋譜
  7.3.3 ノートブックの実行
    ランタイムタイプの実行
    CUDAバージョンの確認
    タイムゾーンの変更
    共有アイテムのショートカット作成
    Google Driveのマウント
    作業ディレクトリの作成
    シンボリックリンクの作成
    データの確認
    学習
    ログの可視化
    学習済みファイルのコピー
    ONNX形式のモデルに変換

7.4 対局 226
  7.4.1 USIオプション設定
  7.4.2 ColabRTのインストール
    TensorRTのインストール
    dlshogiのビルド
    onnxモデルの準備
    USIエンジン同士の対局
  7.4.3 PCでの対局
    dlshogiのインストール
      GPU
      インストール
      CUDA
      cuDNN
      TensorRT
    将棋所で水匠4改と対局
      dlshogiのダウンロード
      水匠4改のダウンロード
      対局
  7.4.4 floodgateに放流

7.5 まとめ 256


  Part4 発展 編

第8章 さらに強くするために
8.1 強化学習 259
  8.1.1 初期局面集
  8.1.2 ランダムによる多様性確保
  8.1.3 並列実行
  8.1.4 詰み探索
  8.1.5 USIエンジンとのリーグ戦
  8.1.6 自己対局
    ビルド
    引数
    自己対局実行

8.2 定跡作成 265
  8.2.1 ビルド
  8.2.2 相手番定跡作成
  8.2.3 定跡作成実行

8.3 探索パラメータの最適化 268
  8.3.1 dlshogiのビルド
  8.3.2 基準USIエンジンとしてのやねうら王のビルド
  8.3.3 パッケージインストール
  8.3.4 optunaのstudy作成
  8.3.5 最適化実行

8.4 棋力計測 274
  8.4.1 互角局面集
  8.4.2 仮説検定
  8.4.3 連続対局の方法

8.5 まとめ 280


参考文献 [281]
INDEX:索引 [282-284]
著者について [285]




【メモランダム】
・著者それぞれがインタビューを受けた記事。コンピュータ将棋開発への情熱が伝わる。
最強CPU将棋ソフト『水匠』VS最強GPU将棋ソフト『dlshogi』長時間マッチ観戦記 第二譜『dlshogi』山岡忠夫の信念 | 文春オンライン
最強CPU将棋ソフト『水匠』VS最強GPU将棋ソフト『dlshogi』長時間マッチ観戦記 第三譜『GCT』加納邦彦の自信 | ニコニコニュース オリジナル

『スッキリわかるSQL入門 第2版』(中山清喬, 飯田理恵子 インプレス 2018//2013)

著者:中山 清喬
著者:飯田 理恵子
シリーズ:スッキリわかる入門シリーズ
件名:データベース
NDC:007.609 情報学.情報科学 >> データ処理.情報処理 >> データ管理
メモ:Relational DatabaseとSQL[Structured Query Language]の入門書。


スッキリわかるSQL入門 第2版 - IT入門書籍 スッキリシリーズ
スッキリわかるSQL入門 第2版 ドリル222問付き! - インプレスブックス


【目次】
はじめに [003]
dokoQLの使い方 [004-005]
本書の見方 [006]
表の種類 [007]
CONTENTS [008-014]


第0章 データベースを学ぶにあたって 015
0.1 データベースを学ぼう 016


  第I部 SQLを始めよう 

第1章 はじめてのSQL 023
1.1 データベースとは 024
  1.1.1 データベースってなんだろう
  1.1.2 データベース管理システム(DBMS
  1.1.3 代表的なRDBMS製品
  1.1.4 データベースにSQLを送るには

1.2 はじめてのSQL 029
  1.2.1 SQLを体験してみよう
  1.2.2 検索してみよう
  1.2.3 条件付きの検索
  1.2.4 データを追加してみよう
  1.2.5 データを更新してみよう
  1.2.6 データを削除してみよう

1.3 この章のまとめ 038
  1.3.1 この章で学習した内容

1.4 練習問題 039
1.5 解答 040


第2章 基本文法と4大命令 041
2.1 SQLの基本ルール 042
  2.1.1 記述形式に関するルール
  2.1.2 コメントに関する2つのルール
  2.1.3 予約語に関するルール

2.2 データ型とリテラル 046
  2.2.1 リテラルの種類
  2.2.2 列とデータ型
  2.2.3 固定長と可変長

2.3 SQLの命令体系 051
  2.3.1 4つの重要なSQL
  2.3.2 4大命令の全体像を俯瞰する

2.4 SELECT文 ――データの検索 054
  2.4.1 SELECT文の基本構造
  2.4.2 ASによる別名の定義

2.5 UPDATT文 ――データの更新 057
  2.5.1 UPDATT文の基本構造

2.6 DELETT文 ――データの削除 059
  2.6.1 DELETT文の基本構造

2.7 INSERT文 ――データの追加 061
  2.7.1 INSERT文の基本構造

2.8 4つのSQLをスッキリ学ぶコツ 064
  2.8.1 4大命令を振り返って
  2.8.2 4大命令の2通りの分類を理解する
  2.8.3 テーブル指定を先に記述する

2.9 この章のまとめ 069
  2.9.1 この章で学習した内容
  2.9.2 この章でできるようになったこと

2.10 練習問題 071
2.11 解答 073


第3章 操作する行の絞り込み 075
3.1 WHERE句による絞り込み 076
3.2 条件式 078
3.3 さまざまな比較演算子 080
3.4 複数の条件式を組み合わせる 090
3.5 主キーとその必要性 094
3.6 この章のまとめ 100
  3.6.1 この章で学習した内容
  3.6.2 この章でできるようになったこと

3.7 練習問題 102
3.8 解答 105


第4章 検索結果の加工 109
4.1 検索結果の加工 110
  4.1.1 SELECT文にだけ可能な修飾

4.2 DISTINCT ――重複行を除外する 112
  4.2.1 値の一覧を得る

4.3 ORDER BY ――結果を並べ替える 114
  4.3.1 並び替えの基本
  4.3.2 複数の列を基準にした並び替え
  4.3.3 列番号を指定した並び替え

4.4 OFFSET - FETCH ――先頭から数行だけ取得する 118
  4.4.1 FFSET - FETCH句の利用

4.5 集合演算子 121
  4.5.1 集合演算子とは
  4.5.2 UNION ――和集合を求める
  4.5.3 EXCEPT/MINUS ――差集合を求める
  4.5.4 INTERSECT ――積集合を求める

4.6 この章のまとめ 130
  4.6.1 この章で学習した内容
  4.6.2 家計簿DBでできるようになったこと

4.7 練習問題 132
4.8 解答 134


  第II部 SQL を使いこなそう

第5章 式と関数 137
5.1 式と演算子 138
  5.1.1 式の種類
  5.1.2 選択列リストで計算式を使う
  5.1.3 データの代わりに計算式を使う
  5.1.4 式が評価されるしくみ

5.2 さまざまな演算子 144
  5.2.1 基本的な算術演算子
  5.2.2 CASE ――値を変換する

5.3 さまざまな関数 147
  5.3.1 関数とは
  5.3.2 関数の使い方
  5.3.3 関数が動作する流れ
  5.3.4 関数にまつわる注意点

5.4 文字列にまつわる関数 152
  5.4.1 LENGTH/LEN ――長さを得る
  5.4.2 TRIM ――空白を除去する
  5.4.3 REPLACE ――指定文字を置換する
  5.4.4 SUBSTRING/SUBSTR ―― 一部を抽出する
  5.4.5 CONCAT ――文字列を連結する

5.5 数値にまつわる関数 156
  5.5.1 ROUND ――指定桁で四捨五入
  5.5.2 TRUNC ――指定桁で切り捨てる
  5.5.3 POWER ――べき乗を計算する 

5.6 日付にまつわる関数 158
  5.6.1 CURRENT_DATE ――現在の日付を得る

5.7 変換にまつわる関数 159
  5.7.1 CAST ――データ型を変換する
  5.7.2 COALESCE ――最初に登場するNULLでない値を返す

5.8 この章のまとめ 163
  5.8.1 この章で学習した内容
  5.8.2 この章でできるようになったこと

5.9 練習問題 165
5.10 解答 168


第6章 集計とグループ化 171
6.1 データを集計する 172
  6.1.1 集計関数とは
  6.1.2 集計関数の特徴

6.2 集計関数の使い方 175
  6.2.1 代表的な集計関数
  6.2.2 合計、最大、最小、平均を求める
  6.2.3 検索結果の行数を求める

6.3 集計に関する4つの注意点 179
  6.3.1 SELECT文でしか利用できない
  6.3.2 結果表がデコボコになってはならない
  6.3.3 引数に許される型が異なる
  6.3.4 NULLの取り扱い

6.4 データをグループに分ける 183
  6.4.1 グループ別の集計
  6.4.2 グループ化
  6.4.3 グループ集計の流れ
  6.4.4 グループ集計後の絞り込み

6.5 集計テーブルの活用 191
  6.5.1 大量のデータ集計
  6.5.2 集計テーブルの活用
  6.5.3 集計テーブルを更新する

6.6 この章のまとめ 195
  6.8.1 この章で学習した内容
  6.8.2 この章でできるようになったこと

6.7 練習問題 198
6.8 解答 201


第7章 副問い合わせ 203
7.1 検索結果に基づいて表を操作する 204
  7.1.1 2回のSELECTが必要な状況
  7.1.2 SELECTをネストする
  7.1.3 副問い合わせを習得するコツ
  7.1.4 コツその1:副問い合わせが処理されるしくみ
  7.1.5 コツその2:副問い合わせのパターン

7.2 単一の値の代わりに副問い合わせを用いる 211
  7.2.1 単一行副問い合わせ
  7.2.2 SET句で利用する
  7.2.3 選択列リストで利用する

7.3 複数の値の代わりに副問い合わせを用いる 214
  7.3.1 複数行副問い合わせ
  7.3.2 IN演算子で利用する
  7.3.3 ANY/ALL演算子で利用する
  7.3.4 エラーとなる副問い合わせ
  7.3.5 副問い合わせとNULL

7.4 表の代わりに副問い合わせを用いる 221
  7.4.1 表の結果となる副問い合わせ
  7.4.2 FROM句で利用する
  7.4.3 INSERT文で利用する

7.5 この章のまとめ 226
  7.5.1 この章で学習した内容
  7.5.2 この章でできるようになったこと
7.6 練習問題 229
7.7 解答 233


第8章 複数テーブルの結合 235
8.1 「リレーショナル」の意味 236
  8.1.1 RDBMSの真の実力
  8.1.2 複数テーブルへのデータ格納
  8.1.3 外部キーとリレーションシップ
  8.1.4 複数テーブルに分けるメリット
  8.1.5 デメリットの克服

8.2 テーブルの結合 246
  8.2.1 結合の基本的な使い方
  8.2.2 結合の動作イメージ
  8.2.3 紙工作でJOINを体験する

8.3 結合条件の取り扱い 253
  8.3.1 結合相手が複数行の場合
  8.3.2 結合相手の行がない場合
  8.3.3 左外部結合
  8.3.4 RIGHT JOINとFULL JOIN

8.4 結合に関するさまざまな構文 261
  8.4.1 テーブル名の指定
  8.4.2 3テーブル以上の結合
  8.4.3 副問い合わせの結果との結合
  8.4.4 同じテーブル同士を結合

8.5 この章のまとめ 265
  8.5.1 この章で学習した内容
  8.5.2 この章でできるようになったこと
8.6 練習問題 267
8.7 解答 269


  第III部 データベースの知識を深めよう 

第9章 トランザクション 275
9.1 正確なデータ操作 276
  9.1.1 正確なデータ操作を脅かすもの
  9.1.2 トランザクション

9.2 コミットとロールバック 279
  9.2.1 トランザクションの中断
  9.2.2 原子性確保のしくみ
  9.2.3 トランザクションの指定方法
  9.2.4 自動コミットモードの解除

9.3 トランザクションの分離 284
  9.3.1 同時実行の副作用
  9.3.2 3つの代表的な副作用
    副作用1 ダーティーリード
    副作用2 反復不能読み取り
    副作用3 ファントムリード
  9.3.3 トランザクションの分離
  9.3.4 分離レベル

9.4 ロックの活用 292
  9.4.1 明示的なロック
  9.4.2 デッドロック

9.5 この章のまとめ 299
  9.5.1 この章で学習した内容
  9.5.2 この章でできるようになったこと
9.6 練習問題 301
9.7 解答 304


第10章 テーブルの作成 307
10.1 SQL命令の種類 308
  10.1.1 データベースを使う2つの立場
  10.1.2 4種類の命令
  10.1.3 DCLとは

10.2 テーブルの作成 312
  10.2.1 テーブル作成の基本
  10.2.2 デフォルト値の指定
  10.2.3 DROP TABLE文
  10.2.4 ALTER TABLE文

10.3 制約 318
  10.3.1 人為的ミスに備える
  10.3.2 基本的な3つの制約
    [その1]NOT NULL制約
    [その2]UNIQUE制約
    [その3]CHECK制約
  10.3.3 主キー制約

10.4 外部キーと参照整合性 325
  10.4.1 参照整合性の崩壊
  10.4.2 崩壊の原因
  10.4.3 外部キー制約

10.5 この章のまとめ 330
  10.5.1 この章で学習した内容
  10.5.2 この章でできるようになったこと
10.6 練習問題 332
10.7 解答 334


第11章 様々な支援機能 337
11.1 データベースをより速くする 338
  11.1.1 検索を速くする方法
  11.1.2 インデックスの作成と削除
  11.1.3 高速化のパターン
  11.1.4 インデックスの注意点

11.2 データベースをより便利にする 345
  11.2.1 ビュー
  11.2.2 ビューの制約とデメリット
  11.2.3 採番の方法

11.3 データベースをより安全に使う 355
  11.3.1 信頼性のために備えるべき4つの特性
  11.3.2 バックアップのしくみ
  11.3.3 バックアップの整合性
  11.3.4 ログファイルのバックアップ

11.4 この章のまとめ 361
  11.4.1 この章で学習した内容
  11.4.2 この章でできるようになったこと
11.5 練習問題 363
11.6 解答 365


  第Ⅳ部 データベースで実現しよう

第12章 テーブルの設計 369
12.1 システムとデータベース 370
  12.1.1 システム化と要件
  12.1.2 データベース設計の流れ

12.2 家計管理データベースの要件 375
  12.2.1 立花いずみの要件
  12.2.2 立花コウジの要件
  12.2.3 既存の家計管理ノート

12.3 概念設計 378
  12.3.1 概念設計ですること
  12.3.2 ER図【entity-relation diagram】
  12.3.3 ER図の記述ルール
  12.3.4 エンティティを導き出す方法

12.4 論理設計 385
  12.4.1 論理設計ですること
  12.4.2 「多対多」の分解
  12.4.3 キーの整理
  12.4.4 正規化

12.5 正規化の手順 390
  12.5.1 正規化の段階
  12.5.2 非正規形
  12.5.3 第1正規形への変形
  12.5.4 関数従属性
  12.5.5 第2正規形への変形
  12.5.6 第3正規形への変形
  12.5.7 正規化を覚えるコツ

12.6 物理設計 402
  12.6.1 物理設計の流れ
  12.6.2 家計管理データベースの物理設計

12.7 正規化されたデータの利用 405
  12.7.1 家計管理データベースを使おう
  12.7.2 エンジニアの使命

12.8 この章のまとめ 409
  12.8.1 この章で学習した内容

12.9 練習問題 410
12.10 解答 411


練習ドリル 413
 基礎問題 414
  〇題材A 銀行口座データベース
  〇題材B 商店データベース
  〇題材C RPGデータベース
 発展問題 434
  〇題材D ヘアサロンデータベース


付録A DBMS別互換性簡易リファレンス [441-461]
  A.1 各DBMSに共通するDMLの構文
  A.2 Oracle DBに関する互換性のポイント
  A.3 SQL Serverに関する互換性のポイント
  A.4 Db2に関する互換性のポイント
  A.5 MySQLに関する互換性のポイント
  A.6 MariaDBに関する互換性のポイント
  A.7 PostgreSQLに関する互換性のポイント
  A.8 SQLiteに関する互換性のポイント
  A.9 H2 Datebaseに関する互換性のポイント
  A.10 DBMS比較表


付録B エラー解決 虎の巻 [463-479]


索引 [480-486]

『わかりやすいJakarta EEウェブシステム入門』(川場隆 秀和システム 2020)

著者:川場 隆[かわば・たかし]
件名:プログラミング言語
件名:ウェブアプリケーション
備考:前身は『わかりやすいJavaEEウェブシステム入門』(秀和システム、2014年)


WEBS
わかりやすいJakarta EE ウェブシステム入門 - 秀和システム あなたの学びをサポート!


【目次】
まえがき [iii-iv]
目次 [v-xx]


第1章 Jakarta EEと開発ツール
Section 1 Jakarta EEとは 002
Section 2 JET (Jakarta EE Toolkit) 004
  2.1 開発ツールの概要
    2.1.1 JDK(Java開発キット)
    2.1.2 IDE(統合開発環境)
    2.1.3 アプリケーションサーバ
    2.1.4 データベースサーバー
    2.1.5 Maven

Section 3 開発ツールの準備(Windows編) 006
  3.1 準備作業

Section 4 開発ツールの準備(MacOS編) 011
  4.1 導入作業

Section 5 プロジェクトを実行する 014

Section 6 まとめ 016


第2章 HTMLとCSS
Section 1 HTMLの基本 018
  1.1 HTMLファイルの作成と表示
    1.1.1 プロジェクトグループの作成
    1.1.2 プロジェクト」を作成する
    1.1.3 表示用のブラウザを設定する
    1.1.4 htmlファイルを表示する
  1.2 基本的なHTML文書を作成して実行する
    1.2.1 コード補完機能(NetBeansの)
    1.2.2 実行
  1.3 HTML文書の成り立ち
    1.3.1 タグの仕組み
    1.3.2 基本的なタグ
      titleタグ
      h1タグ
      divタグ
      pタグ
    1.3.3 ブロックレベル要素

Section 2 HTMLにCSSを適用する 028
  2.1 CSSを書いて実行する
  2.2 CSSの基本形
  2.3 複数のCSSを適用する

Section 3 CSSの詳細 032
  3.1 CSSの属性と値
    [表]代表的なCSS属性
    3.1.1 marginとpadding
  3.2 単位
  3.3 色
  3.4 セレクタ
    3.4.1 タイプセレクタ
    3.4.2 IDセレクタ
    3.4.3 クラスセレクタ
    3.4.4 タイプセレクタの適用範囲を限する書き方
  3.5 HTMLタグのstyle属性にCSSを書く
  3.6 外部CSSファイルを使用する
    3.6.1 例題の作成手順

Section 4 よく使うHTMLタグ 040
  4.1 入力フォームとボタン
    4.1.1 formタグ
    4.1.2 inputタグ
    4.1.3 checkbox、radio、image
  4.2 選択
  4.3 テキスト入力
  4.4 リスト、画像、リンク
    4.4.1 画像
    4.4.2 リスト
    4.4.3 リンク
    4.4.4 CSS
  4.5 テーブル
    4.5.1 表示を調整するCSS
    4.5.2 tableにCSSを適用する
    4.5.3 変則的な表
  4.6 ブロックレベル要素とインライン要素
    4.6.1 ブロックレベル要素
    4.6.2 インライン要素
    4.6.3 幅と高さを持つインライン要素
    4.6.4 display属性

Section 5 画面のレイアウト 056
  5.1 テーブルタグによるレイアウト
  5.2 プロジェクトの読み込みと実行
  5.3 CSSによるレイアウト

Section 6 まとめ 063
  要点 063
  練習064


第3章 ウェブアプリケーションの仕組み
Section 1 プロジェクトの構成
  1.1 各種の設定ファイル
  1.2 ウェブデータ
  1.3 ソース・パッケージ
  1.4 persistence.xml
  1.5 pom.xml

Section 2 バッキングビーン 069
  2.1 バッキングビーンとは
  2.2 バッキングビーンの作成
  2.3 アノテーションの役割
    @Named
    @RequestScoped
  2.4 アノテーションの追加と自動インポート
    アノテーションの付け方

Section 3 JSFページ 076
  3.1 JSFページの構成
    3.1.1 画面表示に関係する記述
    3.1.2 名前空間の定
    3.1.3 Faceletsとバッキングビーンを結び付けるEL式[Expression Language]
    3.1.4 コマンドボタンの働き
  3.2 ウェブアプリケーションの動作を確認する
    3.2.1 出力メソッドを追加する
    3.2.2 ボタンにactionListenerを追加する
      actionListener属性の用途
    3.2.3 値の受け渡しを確認する

Section 4 ページナビゲーション 083
  4.1 ウェブページの構成
    4.1.1 h:commandButton(コマンドボタン)
    4.1.2 h:link(リンク)
  4.2 プロジェクトの読み込みと実行
    4.2.1 h:outputText
  4.3 ナビゲーションの実行と確認

Section 5 ウェブアプリケーションとPayara Server 090
  5.1 ウェブアプリケーションのパッケージング
  5.2 Payara Serverの操作方法
    5.2.1Payara Serverの管理画面を開く

Section 6 まとめ 093
  要点 093
  練習 094


第4章 JSFの基礎
Section 1 JSFJavaServer Faces]の仕組み 098
  1.1 HTTP通信とMVCアーキテクチャ
    1.1.1 コンポーネントベースとアクションベースのMVC
  1.2 JSFとは
    1.2.1 コンポーネントベースのMVCフレームワーク
  1.3 FacesServlet
    1.3.1 コンポーネントツリー
    1.3.2 レンダリング
  1.4 JSFのライフサイクル
  1.5 web.xml

Section 2 Faceletsタグの概要 109
  2.1 Faceletsタグの分類
  2.2 ネームスペース宣言
  2.3 主要なタグ一覧

Section 3 リソースの管理と利用 113
  3.1 resourcesフォルダ
  3.2 リソースの指定方法
  3.3 リソースのバージョニング
  3.4 JavaScriptを使用する
    3.4.1 JavaScriptを実行する仕組み
    3.4.2 イベント属性一覧表

Section 4 まとめ 120
  要点 120
  練習 121


第5章 JSF:入力と出力の基本
Section 1 表とレイアウト 124
  1.1 h:panelGridの基本
  1.2 h:panelGridの属性
  1.3 h:panelGridで見栄えのする表を描く
    1.3.1 罫線の引き方
    1.3.2 列ごとのCSS指定
    1.3.3 f:facetによるヘッダ行の追加
  1.4 Faceletsタグの属性のまとめ

Section 2 テキストと画像の出力 131
  2.1 テキスト出力(h:outputText)
    2.1.1 h:panelGridでの利用
    2.1.2 エスケープ文字
  2.2 フォーマット出力(h:outputFormat)
  2.3 ラベル(h:outputLabel)
  2.4 テキスト出力タグの属性
  2.5 画像出力(h:graphicImage)

Section 3 画面からの入力 139
  3.1 入力領域(h:inputText、h:inputTextarea)
    3.1.1改行コードを含むデータの表示方法
    3.1.2 表内の上下方向揃えについて
  3.2 パスワード入力(h:inputSecret)
  3.3 隠し項目(h:inputHidden)
  3.4 入力タグの属性

Section 4 メッセージ処理 145
  4.1 項目ごとにエラーメッセージを表示する(h:message)
  4.2 エラーメッセージをまとめて表示する(h:messages)
  4.3 メッセージの種類とメッセージタグの属性
  4.4 エラーメッセージをカスタマイズする

Section 5 まとめ 151
  要点 151
  練習 152


第6章 JSF:ボタン・リンクと選択
Section 1 ボタンとリンク 156
  1.1 postとgetの違い
  1.2 コマンドボタン(h:commandButton)
  1.3 コマンドリンク(h:commandLink)
  1.4 h:link
  1.5 h:button
  1.6 h:outputLink
  1.7 ボタンとリンクの属性

Section 2 選択のタグ 169
  2.1 h:selectBooleanCheckbox
  2.2 h:selectManyCheckbox
    2.2.1 値の受け取り
    2.2.2 選択肢をまとめて指定する(f:selectItems)
      Mapで選択肢を割り当てる
      オブジェクトの配列で選択肢を割り当てる
  2.3 h:selectOneRadio
    2.3.1 縦に並べて表示する
  2.4 h:selectOneListbox
  2.5 h:selectManyListbox
  2.6 h:selectOneMenu
  2.7 h:selectManyMenu
  2.8 選択肢と選択タグの属性

Section 3 まとめ 190
  要点 190
  練習 193


第7章 表作成、HTML5
Section 1 データテーブル 198
  1.1 データテーブルの基本
    1.1.1 h:dataTable
    1.1.2 初期化ブロック
  1.2 h:dataTableで表示できるもの
  1.3 f:facetによるヘッダ、フッタ、キャプションの追加
  1.4 CSSを使って見やすい表にする

Section 2 実用的なデータテーブル 206
  2.1 編集できるようにする
  2.2 編集できるデータテーブルの作成方法
  2.3 クリックした行のオブジェクトを取得する
  2.4 h:dataTableの属性

Section 3 HTML5とFaceletsの連携 215
  3.1 HTMLタグをFaceletsタグとして使う(Passing-Through Elements)
  3.2 Faceletsタグの中にHTML5の属性を書く(Passing-Through Attribute)

Section 4 まとめ 219
  要点 219
  練習 221


第8章 コンバータとバリデータ
Section 1 標準コンバータ 224
  1.1 標準コンバータ
  1.2 日付時刻のコンバータ(f:convertDateTime)
    1.2.1 日付の入力
    1.2.2 日付の出力
    1.2.3 HTML5のtype属性を指定する
    1.2.4 和暦での表示
  1.3 整数のコンバータ(f:convertNumber)

Section 2 標準バリデータ 234
    2.0.1 バリデータの使い方
    2.0.2 エラーメッセージ

Section 3 エラーメッセージのカスタマイズ 238
  3.1 プロパティファイルの作成
  3.2 プロパティファイルの編集
  3.3 JSFシステムに登録する

Section 4 ビーン・バリデーション 242
  4.1 ビーン・バリデーションとは
  4.2 ビーン・バリデーションで使えるアノテーション
    4.2.1 @Null @NotNull
    4.2.2 @NotEmpty
    4.2.3 @NotBlank
    4.2.4 @Min @Max
    4.2.5 @DecimalMin @DecimalMax
    4.2.6 @Digit
    4.2.7 @Size
    4.2.8 @Pattern
    4.2.9 @Positive、@Negative、@PositiveOrZero、@NegativeOrZero
    4.2.10 @Past、@Future、@PastOrPresent、@FutureOrPresent
    4.2.11 @AssertTrue @AssertFalse
  4.3 ビーン・バリデーションの適用方法
    4.3.1 エラーメッセージの表示
  4.4 ゲッターへの指定
  4.5 メッセージバンドルの利用
    4.5.1 エラーメッセージの一時的な変更

Section 5 バリデータの作成 250
  5.1 インタフェースの作成
  5.2 検証を行うクラス(バリデータ)の作成
    5.2.1 クラスファイル作成手順
    5.2.2 ConstraintValidatorインタフェース

Section 6 クラスレベルのバリデーション 255
    6.0.1 web.xmlに追記して有効にする(①)
    6.0.2 グループ名の作成(②)
    6.0.3 入力用のJSFページを作成する(③、④)
    6.0.4 カスタムバリデータを作成する(⑤)
    6.0.5 バッキングビーンに作成したアノテーションを適用する(⑥、⑦)
    6.0.6 実行結果

Section 7 まとめ 260
  要点 260
  練習 262


第9章 Ajax機能
Section 1 Ajax機能とは 266
  1.1 Ajaxが必要なケースの例

Section 2 Ajax機能による改良 270
  2.1 Ajax機能の使用方法(f:ajaxタグ)
    2.1.1 event属性
    2.1.2 execute属性
    2.1.3 listener属性
  2.2 スコープアノテーションを変更する
    2.2.1 Serializableインタフェースの実装

Section 3 Ajaxコマンドボタン 274

Section 4 Ajaxバリデーション 276
    event="blur"
    execute="@this"
    render="massageCode"
  4.1 Ajaxバリデーションの例題プログラム
  4.2 Ajax処理とスコープアノテーション
  4.3 JSFのライフサイクルとAjax処理

Section 5 f:ajaxタグの属性と指定できる値 281

Section 6 まとめ 283
  要点 283
  練習 284


第10章 リソースバンドルと国際化
Section 1 リソースバンドル 286
  1.1 プロパティファイルの作成と登録
    1.1.1 base-name
    1.1.2 var
    1.1.3 メッセージバンドルとリソースバンドル 
  1.2 リソースバンドルの適用

Section 2 リソースバンドルの国際化 292
  2.1 国際化とは
  2.2 ロケールファイルの作成
  2.3 ロケールファイルの編集
  2.4 ロケールの登録

Section 3 まとめ 296
  要点 296
  練習 297


第11章 テンプレート機能
Section 1 テンプレート機能 300
  1.1 テンプレート機能とは
  1.2 テンプレートファイルの作成
  1.3 テンプレートファイル

Section 2 テンプレート用表示データの作成 307
  2.1 content-1.xhtmlファイルの作成
  2.2 content-1.xhtmlの編集

Section 3 テンプレートファイルを使用する 309
  3.1 index.xhtmlの作成
  3.2 output.xhtmlの作成
  3.3 テンプレート関連タグのまとめ

Section 4 まとめ 313
  要点 313
  練習 314


第12章 CDI ――新しいオブジェクトの作り方
Section 1 CDIJakarta Context and Dependency Injection]とは 318
  1.1 CDIを使ってみる
  1.2 CDIのスコープアノテーション
  1.3 FacesContextとServletContext
  1.4 インジェクションポイント

Section 2 Conversation(会話)スコープ 331
  2.1 例題の画面推移
  2.2 会話処理の開始と終了
    2.2.1 情報の表示
  2.3 JSFページの内容

Section 3 複数ページをまとめるFlowスコープ 336
  3.1 FLOWスコープ用のフォルダの作成
  3.2 Flow定義ファイルの作成
  3.3 JSFページの書き方
  3.4 バッキングビーンの書き方

Section 4 インジェクトできるようにする@Produces 341
  4.1 @Producesの使い方
  4.2 Listを返すメソッドに@Producesを付ける
  4.3 フィールドに@Producersを付ける
  4.4 インジェクトできるロガーを作る
  4.5 後始末をするためのディスポーザー
    4.5.1 ログをファイルにも出力するようにする
    4.5.2 ファイルハンドラーを閉じる

Section 5 CDIビーンの実装を使い分ける 351
  5.1 設定ファイル(bean.xml)を使う方法
  5.2 アノテーションを使う方法

Section 6 まとめ 356
  要点 356
  練習 357


第13章 CDIの高度な機能
Section 1 コールバックメソッド 360
  1.1 ライフサイクル・コールバックメソッド

Section 2 インターセプター(割り込み処理) 363
  2.1 カスタムアノテーションの作成
  2.2 インターセプタを作成する
    2.2.1 コンストラクタ用のインターセプタでの処理
    2.2.2 メソッド用のインターセプタでの処理
  2.3 インターセプタをCDIに登録する
  2.4 インターセプタを使う

Section 3 デコレーター 370
  3.1 デコレーターを作成する
  3.2 beans.xmlに登録する
  3.3 使用例

Section 4 オブザーバー(イベント駆動処理) 375
  4.1 同期イベント処理
  4.2 非同期イベント処理

Section 5 まとめ 382
  要点 382
  練習 383


第14章 Jakarta Enterprise Beans(EJB)
Section 1 Jakarta Enterprise Beansの概要 386
  1.1 EJBの種類
    1.1.1 ステートレスセッションビーン
    1.1.2 ステートフルセッションビーン
    1.1.3 シングルトンセッションビーン
  1.2 DI(依存性注入)
  1.3 セッションビーンの書き方

Section 2 シングルトン・セッションビーン 390
  2.1 シングルトンセッションビーンを使う
  2.2 ウェブアプリケーション(画面1)
  2.3 ウェブアプリケーション(画面2)
  2.4 シングルトンセッションビーンで使えるアノテーション

Section 3 タイマーサービス 394
  3.1 タイマーサービスの起動と終了
    3.1.1 タイマーサービスの終了方法
  3.2 タイマーサービスの作り方
    3.2.1 @Scheduleアノテーション

Section 4 非同期呼び出し 398

Section 5 まとめ 400
  要点 400
  練習 401


第15章 データベースの基礎
Section 1 データベースとは 404
  1.1 リレーショナルデータベース
  1.2 JPAの役割

Section 2 データベースシステムのセットアップ 407
  2.1 Dockerのダウンロードとインストール
    2.1.1 Dockerの起動と確認
  2.2 MySQLデータベースを動かす
    2.2.1 操作方法 Windows
    2.2.2 操作方法 Mac
  2.3 Dockerの仕組み
    2.3.1 environment:(環境変数
    2.3.2 command:
    2.3.3 ports:
    2.3.4 volumes:
  2.4 NetBeansからMySQLの起動・停止を行う
  2.5 NetBeansでデータベースmydbの内容を確認できるようにする
  2.6 Payara Serverの設定

Section 3 データベースの使い方 417
  3.1 エンティティの作成
  3.2 persistence unit (永続性ユニット)
    3.2.1 persistence unit
  3.3 エンティティマネージャーの使い方
  3.4 入力データをデータベースに保存する
  3.5 データベースの中身を見る
  3.6 @Transactionalアノテーション

Section 4 CRUD処理 428
  4.1 エンティティマネージャーのAPIと使い方
    4.1.1 新規登録:em.persist(meibo)
    4.1.2 更新:em.merge(meibo)
    4.1.3 検索:em.find(meibo.class, key)
    4.1.4 削除:em.remove(em.merge(meibo))
    4.1.5 全データのListを返す
  4.2 CRUD処理の書き方
    4.2.1 バッキングビーンと一覧表示の仕組み
    4.2.2 新規登録処理
    4.2.3 更新処理
    4.2.4 検索処理
    4.2.5 削除処理
  4.3 バッキングビーンソースコード

Section 5 まとめ 440
  要点 440
  練習 442


第16章 マッピングアノテーション
Section 1 マッピングアノテーションの概要 444
  1.1 アノテーションの概要
  1.2 デフォルトのマッピング

Section 2 エンティティの構成を指定する 446
  2.1 テーブルの名前や項目の名前を変える
  2.2 複数のテーブルで構成する
  2.3 他のクラス全体を1つのフィールドとして組み込む
  2.4 カラムの名前を変える
  2.5 カラムをデーベースに保管しないように指示する

Section 3 主キーの構成を指定する 453
  3.1 主キーを自動生成する
  3.2 複合キーを使う
    3.2.1 【重要】複合キーのクラスではequalsとhashCodeをオーバーライドする
  3.3 複合キーを使う(@IdClass)

Section 4 ファイル、列挙、日付と時刻の扱い方 460
  4.1 ファイルなどの大きなデータを記録する
  4.2 列挙の記録方法を指定する
  4.3 日付と時刻の取り扱い

Section 5 マッピングの適用例 462
  5.1 エンティティ・クラス
  5.2 バッキングビーン(全体のソースリストは5.5に掲載)
  5.3 index.xhtml
  5.4 画像データの受け渡し
  5.5 バッキングビーン(全体)

Section 6 コレクションとマップを使う 472
  6.1 フィールド変数にListやSetを使う
  6.2 フィールド変数にMapを使う

Section 7 まとめ 478
  要点 478
  練習 480


第17章 オブジェクト関係マッピング(ORM)
Section 1 オブジェクト関係マッピングとは 486
  1.1 オブジェクトをフィールドに持つことで関係ができる
  1.2 ORMの種類

Section 2 1方向のOne-to-One 489
  2.1 DAOの作成手順
  2.2 エンティティの新規登録
  2.3 永続性コンテキストの制約
  2.4 Customerエンティティの一覧表示
  2.5 @JoinColumnで外部キーの名前を指定する
  2.6 カスケードを指定して保存を簡単にする
  2.7 データベースからの削除(remove)

Section 3 双方向のOne-to-One 499
  3.1 マッピングの指定方法
  3.2 エンティティの新規作成
  3.3 Addressエンティティを読み出してみる

Section 4 1方向のMany-to-One 503
  4.1 マッピングの指定方法
  4.2 エンティティの作成とデータベースへの新規登録
  4.3 社員エンティティを一覧出力する

Section 5 1方向のOne-to-Many 507
  5.1 マッピングの指定方法
  5.2 エンティティの作成と登録
  5.3 講義エンティティの表示

Section 6 双方向のOne-to-Many(Many-to-Oneも同じ) 511
  6.1 マッピングの指定方法
  6.2 エンティティの新規登録
  6.3 エンティティの表示

Section 7 1方向のMany-to-Many 514
  7.1 マッピングの指定方法
  7.2 エンティティの作成と登録
  7.3 エンティティの表示 

Section 8 双方向のMany-to-Many 514
  8.1 マッピングの指定方法
  8.2 エンティティの作成
  8.3 エンティティの出力

Section 9 まとめ 523
  要点 523
  練習 525


第18章 問い合わせ言語JPQL
Section 1 JPQL TEST 528
  1.1 JPQL TESTについて
  1.2 JPQL TESTで操作するデータベーステーブル
    1.2.1 Employee
    1.2.2 Address
    1.2.3 Phone
    1.2.4 Department
    1.2.5 Project

Section 2 JPQLの書き方 532
  2.1 SELECT文
    2.1.1 Addressエンティティをすべて抽出する
    2.1.2 Addressエンティティを、郵便番号順に並べた状態ですべて抽出する
    2.1.3 Addressエンティティのうち神奈川県の住所だけ抽出する
    2.1.4 都道府県別にエンティティの数を数える
  2.2 集計関数
  2.3 識別変数とPath式

Section 3 where句で使える演算子 536
  3.1 いろいろな演算子
  3.2 演算子の使い方
    3.2.1 v BETWEEN a AND b
    3.2.2 str LIKE exp
    3.2.3 v IN (a1, a2, ...)
    3.2.4 c IS [NOT] EMPTY
    3.2.5 サブクエリ
    3.2.6 e [NOT] EXISTS (sub-query)
    3.2.7 v ope ALL (sub-query), v ope ANY (sub-query)
    3.2.8 IN (sub-query)

Section 4 JPQLの中で使える関数 541
    捕捉

Section 5 distinctとコンストラクタ式 542
  5.1 重複を取り除くDISTINCTオペレータ
  5.2 結果からオブジェクトを作るコンストラクタ式

Section 6 レコードを結合するJOIN 545
  6.1 2つのエンティティの組み合わせ
  6.2 内部結合(INNER JOIN) --- エンティティ内部のListとの直積
    nullとは直積を取らない
  6.3 外部結合(LEFT JOIN)--- 相手がnullでも直積を取る

Section 7 一括更新と一括削除 549
  7.1 一括更新
  7.2 一括削除

Section 8 JPQLをJavaプログラムから実行する 551
  8.1 動的クエリ Query型
    8.1.1 @Transitionalについて
    8.1.2 実行結果
  8.2 動的クエリ TypedQuery型
  8.3 コンストラクタ式による検索結果の抽出
  8.4 更新と削除
  8.5 名前付きクエリ
    8.5.1 クエリ・パラメータ
  8.6 メソッドのまとめ
  8.7 ORMでマッピングされたエンティティの削除
    8.7.1 addressフィールド --- orphanRemoval=trueの指定(①)
    8.7.2 phonesフィールド --- orphanRemoval=trueの指定(②)
    8.7.3 departmentフィールド --- 何もしない
    8.7.4 projectsフィールド --- 何もしない
    8.7.5 managerフィールド --- managerのdirectsから削除しておく
    8.7.6 directsフィールド --- directsの各要素から削除しておく

Section 9 N+1問題 564
  9.1 デフォルトのフェッチタイプ
  9.2 N+1問題とは
  9.3 EAGERフェッチに変えても問題は解決されない
  9.4 LEFT JOIN FETCH
  9.5 マルチLEFT JOIN FETCH

Section 10まとめ 573
  要点 573
  練習 574


第19章 セキュリティAPI
Section 1 どのページに制限をかけるか指定する 576

Section 2 利用者を登録する 579
  2.1 テーブルの構成とエンティティクラス
  2.2 データベースへの登録処理

Section 3 データベースストアの使用設定 584
  3.1 アノテーションで設定する
  3.2 論理JNDI名を使えるようにする

Section 4 認証方式の指定 587
  4.1 カスタムFORM認証とは
  4.2 認証方式としてカスタムフォーム認証を指定する

Section 5 認証処理の作成 589
  5.1 login.xhtmlの作成
  5.2 login用バッキングビーンの作成
  5.3 ログアウト用バッキングビーンの作成
  5.4 認証されているかチェックする仕組み
  5.5 例題1を実行する
  5.6 SecurityContext

Section 6 まとめ 597
  要点


第20章 RESTfulウェブサービス
Section 1 RESTfulウェブサービスの概要 600
  1.1 RESTとは
  1.2 RESTfulウェブサービスの構成方法
  1.3 クライアントプログラムで実行する

Section 2 サブURIの指定とPathパラメータ 604
  2.1 サブURI
  2.2 Pathパラメータ

Section 3 Queryパラメータ 607
  3.1 Queryパラメータ
  3.2 Querayパラメータのデフォルト値
  3.3 複数のQueryパラメータ
  3.4 通信テストプログラムの利用

Section 4 HTTPとメディアタイプ 612
  4.1 MIMEタイプ
  4.2 @ProducesとMIMEタイプの選択メカニズム
  4.3 @Consumes

Section 5 戻り値の作成 620
  5.1 戻り値に使うResponseクラス
  5.2 CRUDウェブサービス

Section 6 クライアントAPI 627
  6.1 CRUD処理の概要
  6.2 クライアントAPIの使い方

Section 7 まとめ 634
  要点


第21章 ウェブアプリケーション
Section 1 プログラミングの準備 638
  1.1 継承を利用してバッキングビーンを分ける
  1.2 データベース処理のクラスを作る
  1.3 ページングマネージャーを作る

Section 2 『雑貨屋さん.com』について 641
  2.1 商品データ、顧客データの作成
  2.2 例題システムの画面構成
  2.3 各画面の機能概要
  2.4 テンプレート構成

Section 3 エンティティの作成 646
  3.1 エンティティの種類
  3.2 エンティティ設計の注意
  3.3 エンティティの自動生成

Section 4 商品の一覧表示(トップページ) 650
  4.1 バッキングビーンでの初期化
  4.2 コマンドリンクとページナビゲーション
  4.3 メニューバー
  4.4 商品一覧表示
  4.5 その他のページ

Section 5 ログイン認証 663

Section 6 『雑貨屋さん.com』のソースコード 664

Section 7 まとめ 672
  要点
  課題


巻末資料
Section 1 既定のブラウザを設定する方法 676

Section 2 サーバーのデータベース設定(Windows用) 677
  2.1 準備作業 ― Javaのパスを環境変数に登録する
  2.2 Payara Serverのセットアップ

Section 3 サーバーのデータベース設定(一般的な方法) 679
  3.1 データベースドライバの登録(JETでは不要)
  3.2 コネクションプールの作成
  3.3 データソースの作成

Section 4 プロジェクトの作成方法 683

Section 5 MySQLの外部ボリュームを変更する 685

Section 6 その他の資料 686


索引 [687-699]





【抜き書き】


Java EEJakarta EEの歴史と特徴を述べた部分(pp.2-3)。

 Jakarta EE[Java Enterprise Edition]は、Java SE[Java Standard Edition]ではカバーされないデータベース処理、トランザクション機能、データ変換、ウェブ通信やメッセージ通信、分散ネットワーク、セキュリティ、バッチ処理など、実務的・応用的なソフトウェアを開発するための、さまざまなライブラリの集合体です。
 Java言語を使って業務用プログラムを開発するには、もはやJavaSEだけではどうにもならないことは明らかです。近年、〔……〕Jakarta EEの技術は必要不可欠のものになりました。
 最も顕著なものは、データベース技術です。Javaオブジェクトをそのまま読み書きできるオブジェクト指向データベース技術(JPAJava Persistence API)は、データベース操作に革命をもたらしました。JPAにより、データベース接続を意識することなく、普通の読み書きと同じようにデータベースを操作できます。
 そして、クラス同士を疎結合に保ち、改訂の容易なシステムを構築する技術が、CDIContext Dependency Injection)です。もやはオブジェクトはnewで作るのではなく、CDIサービスが勝手に作ってくれるのでそれを使うだけでよくなりました。また、実行中のメソッドに割り込んでログを取ったりする処理も、簡単なアノテーションを付けるだけで動かせます。いろいろな高度な処理を簡単に書けるのはまさにCDIの働きです。
 WEBをユーザーインタフェースとするシステムは、2000年前後からservletという技術を基礎に作成されてきましたが、データの検証、画面遷移やセッション制御など、大量のコードを書かないと完結しない大仕事でした。しかし、それもJSFJava ServerFaces)の登場により一挙にハードルが下がりました。ウェブ用のコンポーネント(部品)を組み合わせるだけで、高度なウェブシステムを作成できます。また、ユーザーインタフェースは持たないものの、アクセスするといろいろなサービスをクライアントに提供するサーバーが注目されています。そのようなサーバーを簡単に構築する技術をRESTfulウェブサービスといい、JakartaEEでは、Jakarta RESTful Web Servicesと呼ばれています。
 一方、近年、Dockerコンテナという軽量の仮想環境を使って、いくつものサーバーをすばやく起動することができるようになりました。そこで、Dockerコンテナ上に、RESTfulウェブサービスを使ってシンプルな機能のサーバーをいくつも起動し、それらを協働させて大きなシステムを構築しようとする動きが盛んになってきました〔……〕。
 セキュリティに関する機能も、従来から業務アプリケーションの重要テーマでした。特にサーバーに固有な機能として組み込まれた機能はこれまで重要な働きをしてきましたが、Jakarta EEでは、それらを標準APIにまとめ、サーバーが変わっても同じ仕組みで認証や認可ができるようにしています。APIであれば、汎用的なプログラムを作成できるので、大変有用です。
 さらに、チャットシステムのような多数のノード間での通信を効率よく実行するウェブソケット、1対多でデータを非同期に送受信するメッセージング機能、一連の作業をまとめて効率よく実行するバッチ機能など、Jakarta EEが可能にする有用な業務向けの機能はたくさんあります。


・名称変更について。

 さて、このようなエンタープライズ版のJavaは、"Java EE"という名前で知られていましたが、2017年にOracle社からオープンソースコミュニティの非営利法人Eclipse財団に譲渡され、その結果2019年に名称が変更されて、現在のJakarta EEになりました。現在は、全体を網羅するフルプロファイルとウェブアプリケーション技術だけを集めたウェブプロファイルの2つのディストリビューションがあります。
 また、クラウド上での分散アプリケーション開発に特化したマイクロプロファイルが、Jakarta EEに基づいて開発され、別種のディストリビューションとして展開されています。マイクロプロファイルは、現在も早いスピードで改訂が進んでいます。
 Jakarta EEは、譲渡後の2019年にJava EE8を引き継いだJakarta EE8として登場し、さらに2020年のJakarta EE9で、パッケージ名をjavaxからjakartaに変更するという大きな出来事がありました。これで、名実共に、Jakarta EEとなり、今後の出発点になるバージョンができました。〔……〕
 例えば、これまでウェブ画面を含めたアプリケーション開発技術としてはコンポーネントベースのJSFだけしか使えませんでしたが、アクションベースのMVCが仕様に含められることになり、応用の範囲が広がります。また、今後期待されている新機能として、コア機能であるCDIの機能拡張や、マイクロプロファイルの機能拡張などがあります。特に、マイクロプロファイルは、現在のJakarta EEが持っていないような分散システムに固有の拡張を続けており、やがてそれらがJakarta EE標準に取り込まれることで、クラウドネイティブ時代の新しいエンタープライズJavaが形作られていくと期待されています。


Java EEからの転換の理由については、著者によるこの記事(2021年01月)で解説されている。
JavaEEとJakartaEE、どう違うの? - Qiita

『スッキリわかるサーブレット&JSP入門[第2版]』(国本大悟 インプレス 2019//2014)

著者:国本 大悟[くにもと・だいご]
監修:株式会社フレアリンク
NDC:007.64 : 情報学.情報科学


スッキリわかるサーブレット&JSP入門 第2版 - インプレスブックス



【目次】
まえがき [003]
本書の見方 [004]
CONTENTS [005-012]


第0章 サーブレット/ JSPを学ぶにあたって 013


  第I部 Webのしくみを知ろう

第1章 HTMLとWebページ 021
1.1 WebページとHTML 022
  1.1.1 Webアプリケーション開発の基礎知識
  1.1.2 HTMLとブラウザ
1.2 HTMLの基本構造 027
  1.2.1 タグとは
  1.2.2 属性
  1.2.3 HTMLの基本構造
1.3 Webページの作成 033
  1.3.1 基本的なタグ
  1.3.2 Webページ作成の手順とルール
  1.3.3 HTMLファイルの作成
  1.3.4 HTMLファイルからWebページを表示
  1.3.5 Webページの表示がおかしい場合(空白)
  1.3.6 Webページの表示がおかしい場合(文字化け)
1.4 HTMLリファレンス 043
1.5 まとめ 046
1.6 練習問題 039
1.7 解答 040


第2章 Webのしくみ 051
2.1 Webページの公開 052
  2.1.1 Webページを公開する方法
  2.1.2 リクエストに必要なもの

2.2 Webを支える通信のしくみ 054
  2.2.1 HTTPとは
  2.2.2 リクエストの中身
  2.2.3 レスポンスの中身

2.3 Webアプリケーションのしくみ 059
  2.3.1 Webアプリケーション
  2.3.2 サーバサイドプログラム
  2.3.3 サーブレットJSPによるWebアプリケーション開発
  2.3.4 アプリケーションサーバとは

2.4 開発の準備をしよう 065
  2.4.1 開発に必要なもの
  2.4.2 開発の準備をする

2.5 開発環境を体験する
  2.5.1 体験する内容
  2.5.2 HTMLファイルをEclipseで作成
  2.5.3 アプリケーションサーバを起動
  2.5.4 HTMLファイルのリクエストとURL
  2.5.5 404ページ
  2.5.6 Eclipseの実行機能
  2.5.7 問題解決のために「虎の巻」を活用

2.6 まとめ 075
  2.6.1 この章で学習した内容

2.7 練習問題 076
2.8 解答 077


  第II部 開発の基礎を身に付けよう

第3章 サーブレットの基礎 081
3.1 サーブレットの基礎と作成方法 082
  3.1.1 サーブレットとは
  3.1.2 サーブレットクラスの基本形
  3.1.3 HttpServletRequestとHttpServletResponse
  3.1.4 HTMLを出力
  3.1.5 サーブレットクラスのコンパイルインスタンス

3.2 サーブレットクラスの実行方法 088
  3.2.1 サーブレットクラスのURL
  3.2.2 URLパターンの設定
  3.2.3 サーブレットクラスを実行する
    方法① ブラウザを起動してURLを入力する
    方法② Eclipseの実行機能を利用する
    方法③ サーブレットクラスへのリンクをクリックする
  3.2.4 リクエストメソッドと実行メソッド

3.3 サーブレットクラスを作成して実行する 093
  3.3.1 Eclipseサーブレットクラスを定義
    解説① URLパターン
    解説② serialVersionUIDフィールド
    解説③ HTMLの出力
    補足① 運勢をランダムに決定
    補足② 実行日の取得
  3.3.2 サーブレットクラスを実行

3.4 サーブレットの注意事項 098
  3.4.1 サーブレットクラスの内容を変更するときの注意
    対処方法① サーバを再起動する
    対処方法② しばらく待つ
  3.4.2 サーブレットの基本の学習方法
  3.4.3 サーブレットクラスのAPIドキュメント

3.5 まとめ 103
3.6 練習問題 104
3.7 解答 105


第4章 JSPの基本 107
4.1 JSPの基本 108
  4.1.1 JSPとは

4.2 JSPの基本 112
  4.2.1 JSPファイルの構成要素
  4.2.2 スクリプトレット
  4.2.3 スクリプト
  4.2.4 JSPコメント
  4.2.5 pageディレクティブ
  4.2.6 pageディレクティブ―― Content-Typeヘッダを指定
  4.2.7 pageディレクティブ――クラス、インターフェースをインポート

4.3 JSPファイルの実行方法 119
4.4 JSPファイルを作成して実行する 121
4.5 まとめ 126
4.6 練習問題 127
4.7 解答 128


第5章 フォーム 129
5.1 フォームの基本 130
  5.1.1 フォームとは
  5.1.2 フォームの構造
  5.1.3 フォームの部品
  5.1.4 フォームの作成
  5.1.5 データ送信のしくみ
  5.1.6 GETリクエストとPOSTリクエス

5.2 リクエストパラメータの取得 141
  5.2.1 リクエストパラメータとHttpServletRequestインスタンス
  5.2.2 サーブレットクラスでリクエストパラメータの値を取得する
  5.2.3 JSPファイルでリクエストパラメータの値を取得する

5.3 フォームを使ったプログラムの作成 147
  5.3.1 サンプルプログラムの説明
  5.3.2 サンプルプログラムを作成する

5.4 リクエストパラメータの応用 154
  5.4.1 開発者がプログラムにデータを送る

5.5 まとめ 156
5.6 練習問題 157
5.7 解答 159


  第III部 本格的な開発を始めよう

第6章 MVCモデルと処理の遷移 163
6.1 MVCモデル 164
  6.1.1 サーブレットクラスとJSPファイル、それぞれの得手不得手
  6.1.2 MVCモデルとは

6.2 処理の転送 169
  6.2.1 フォワードとは
  6.2.2 フォワードの実現方法と特徴
  6.2.3 JSPファイルへの直接リクエストを禁止する
  6.2.4 フォワードのサンプルプログラムを作成する
  6.2.5 リダイレクトとは
  6.2.6 リダイレクトの実現方法
  6.2.7 リダイレクトのサンプルプログラムを作成する
  6.2.8 フォワードとリダイレクトの使い分け
  6.2.9 転送後のURLの違い
  6.2.10 フォワードとリダイレクトの比較

6.3 まとめ 184
6.4 練習問題 185
6.5 解答 186


第7章 リクエストスコープ 187
7.1 スコープの基本 188
  7.1.1 スコープとは
  7.1.2 スコープとインスタンス
  7.1.3 JavaBeansのサンプルプログラム
    JavaBeansのルール① 
    JavaBeansのルール②
    JavaBeansのルール③
    JavaBeansのルール④
    JavaBeansのルール⑤
  7.1.4 JavaBeansのプロパティ

7.2 リクエストスコープの基礎 196
  7.2.1 リクエストスコープの特徴
  7.2.2 リクエストスコープの基本操作
  7.2.3 JSPファイルでリクエストスコープを使用する例

7.3 リクエストスコープを使ったプログラムの作成 200
  7.3.1 サンプルプログラムの説明
  7.3.2 サンプルプログラムの作成

7.4 リクエストスコープの注意点 209
  7.4.1 リクエストスコープでできないこと

7.5 まとめ 212
7.6 練習問題 213
7.7 解答 215


第8章 セッションスコープ 217
8.1 セッションスコープの基礎 218
  8.1.1 セッションスコープの特徴
  8.1.2 セッションスコープの基本操作の例

8.2 セッションスコープを使ったプログラムの作成 223
  8.2.1 サンプルプログラムの基本動作 
  8.2.2 リクエストパラメータによる処理の振り分け 
  8.2.3 サンプルプログラムの作成 
    [コード8-5]解説① セッションスコープ内のインスタンスを削除
    [コード8-6]解説① パスワードボックス
    [コード8-7]解説① リクエストパラメータの送信

8.3 セッションスコープのしくみ 234
  8.3.1 セッションID
  8.3.2 セッションIDとクッキー

8.4 セッションスコープの注意点 237
  8.4.1 セッションのタイムアウト
  8.4.2 セッションスコープの破棄とインスタンスの削除

8.5 まとめ 241
8.6 練習問題 242
8.7 解答 243


第9章 アプリケーションスコープ 245
9.1 アプリケーションスコープの基本 246
  9.1.1 アプリケーションスコープの特徴
  9.1.2 Webアプリケーションの開始と終了
    1. サーバの起動と停止
    2. オートリロード機能
    3. 管理ツールによる開始と終了
  9.1.3 アプリケーションスコープの基本動作

9.2 アプリケーションスコープを使ったプログラムの作成 252
  9.2.1 サンプルプログラムの基本動作
  9.2.2 サンプルプログラムの作成
    [コード9-5]解説① スコープからインスタンスが取得できなかった場合

9.3 アプリケーションスコープの注意点 259
  9.3.1 アプリケーションスコープのトラブル
    ① 同時アクセスによる更新
    ② インスタンスの保存期間

9.4 スコープの比較 261
  9.3.1 スコープの特徴のまとめ

9.5 まとめ 262
9.6 練習問題 263
9.7 解答 264


第10章 アプリケーション作成 267
10.1 作成するアプリケーションの機能と動作 268
  10.1.1 「どこつぶ」の機能と画面設計
    機能① ログイン機能
    機能② ログアウト機能
    機能③ 投稿機能
    機能④ 閲覧機能
  10.1.2 「どこつぶ」作成にあたって

10.2 開発の準備 271
  10.2.1 動的Webプロジェクトの作成
  10.2.2 JavaBeansの作成
  10.2.3 トップ画面の作成

10.3 ログイン機能を作成する 276
  10.3.1 ログイン機能のしくみ
  10.3.2 プログラムの作成

10.4 メイン画面を表示する 282
  10.4.1 メイン画面表示のしくみ
  10.4.2 プログラムの作成
    [コード10-8]解説① ArrayListインスタンスを格納
    解説② スコープからArrayListインスタンスを取得
    解説③ デフォルトページへのリダイレクト

10.5 ログアウト機能を作成する 289
  10.5.1 ログアウト機能のしくみ
  10.5.2 プログラムの作成

10.6 投稿と閲覧の機能を作成する 293
  10.6.1 投稿と閲覧機能そしくみ
  10.6.2 プログラムの作成
    [コード10-13]解説① ArrayListインスタンスを格納
    [コード10-15]解説① ArrayListに格納されたインスタンスを先頭から順に取得

10.7 エラーメッセージの表示機能を追加する 301
  10.7.1 エラー表示のしくみ
  10.7.2 プログラムの作成

10.8 まとめ 307


  第IV部 応用的な知識を深めよう

第11章 サーブレットクラスの実行のしくみとフィルタ 311
11.1 サーブレットクラス実行のしくみ 312
  11.1.1 サーブレットクラスのインスタンス
  11.1.2 init() メソッド/ destroy() メソッド
  11.1.3 init() / destroy() メソッドのサンプルプログラム
    解説① init() / destroy() メソッド
  11.1.4 init() メソッドの注意点
  11.1.5 サーブレットクラスのフィールド

11.2 リスナー 325
  11.2.1 リスナーのしくみ
  11.2.2 リスナーの作成方法
  11.2.3 リスナーのサンプルプログラム
    解説① @WebListenerアノテーションの付与
    解説② リスナーインタフェースとそのメソッドの実装
  11.2.4 リスナーの作り方

11.3 フィルタ 330
  11.3.1 フィルタとは
  11.3.2 フィルタのサンプルプログラム
    解説① @Filterアノテーションの付与
    解説② Filterインタフェースの実装
    解説③ doFilter()メソッド
  11.3.3 フィルタクラスの作り方

11.4 この章のまとめ 337
11.5 練習問題 338
11.6 練習問題の解答 339


第12章 アクションタグとEL式 341
12.1 インクルードと標準アクションタグ 342
  12.1.1 動的インクルードと標準アクションタグ
  12.1.2 動的インクルードのサンプルプログラム
    解説① インクルード先の指定方法
  12.1.3 静的インクルードとサンプルプログラム

12.2 EL式 351
  12.2.1 EL[Expression Language]式とは
  12.2.2 EL式の使い方
  12.2.3 EL式のサンプルプログラム
    ポイント① インポートとスコープからの取得が不要
    ポイント② プロパティの値を取得
    ポイント③ 出力
  12.2.4 EL式の演算子
  12.2.5 EL式とコレクション
  12.2.6 EL式とスクリプト要素

12.3 JSTL[JavaServer Pages Standard Tag] 360
  12.3.1 JSTLとカスタムタグ
  12.3.2 JSTLの構成
  12.3.3 Coreタグライブラリ
    変数出力
    分岐
    繰り返し
  12.3.4 JSTLのサンプルプログラム
  12.3.5 アクションタグとEL式の関係

12.4 この章のまとめ 371
12.5 練習問題 372
12.6 解答 373


第13章 JDBCプログラムとDAOパターン 375
13.1 データベースとJDBCプログラム 376
  13.1.1 データベースの基礎知識
  13.1.2 JDBCプログラム
  13.1.3 JDBCプログラムの例

13.2 DAOパターン 385
  13.2.1 JDBCプログラムの問題
  13.2.2 DAO[Date Access Object]パターンによる解決
  13.2.3 DAOパターンのサンプルプログラム
  13.2.4 WebアプリケーションとDAOパターンの関係

13.3 どこつぶでデータベースを利用する 396
  13.3.1 データベース化の準備
  13.3.2 データベース化のしくみ
  13.3.3 プログラムの作成

13.4 この章のまとめ 407
13.5 練習問題 408
13.6 解答 409


  第V部 設計手法を身に付けよう

第14章 Webアプリケーションの設計
14.1 Webアプリケーションの設計とは 414
  14.1.1 アプリケーションの要件
  14.1.2 さまざまな設計手法
  14.1.3 テーブルの設計
  14.1.4 開発する機能の順番を決定
  14.1.5 画面の設計
  14.1.6 サーブレットクラスとJSPファイルの設計
    画面、サーブレットクラス、JSPファイルのつながり
    リクエストパラメータの流れ
    スコープ
    リクエスト先がサーブレットクラスか
    画面を出力しているのはJSPファイルか
    処理に必要な情報が揃っているか
    画面に出力するのに必要な情報が揃っているか
  14.1.7 サーバサイドの設計
    BO[Business Object]
    DAO[Data Access Object]
    Entity  

14.2 プログラムを完成させる 429
  14.2.1 プログラムを書いて機能を完成 429
    ①Entityクラスの作成
    ②DAOの作成
    ③DAOのテスト
    ④BO[Business Object]の作成
    ⑤BOのテスト
    ⑥サーブレットクラスとJSPファイルの連携の作成
    ⑦画面遷移の確認
    ⑧サーブレットクラスの仕上げ
    ⑨JSPファイルの仕上げ
    ⑩機能の最終動作確認
  14.2.2 次の機能を開発する際のコツ 

14.3 まとめ 448 


付録
付録A 使用するソフトウェアの操作手順 449


付録B フォーム作成の注意点 451
 B.1 フォームの作り方
  B.1.1 4つの連携点
  B.1.2 対応していない場合に生じる問題


付録C エラー解決・虎の巻 455
 C.1 エラーとの上手な付き合い方 456
  C.1.1 エラーを解決できるようになる3つのコツ
  C.1.2 Eclipseコンパイルエラー
  C.1.3 スタックトレースの読み方
 C.2 トラブルシューティング 461
  C.2.1 リクエストしていないページや画面が表示される
  C.2.2 サーバを起動できない
  C.2.3 エラーは出ないが動作がおかしい
  C.2.4 Eclipseの操作で生じる不具合
  C.2.5 Eclipseのエディタで警告/エラーが表示される
  C.2.6 例外が発生する
  C.2.7 例外が発生する―― JdbcSQLException


付録D 補足 485
 D.1 Java EEの基礎知識
  D.1.1 Java EEとは
  D.1.2 Java EEの仕様と実装
  D.1.3 サーブレットJSPのバージョン
 D.2 Webアプリケーションとデプロイ
  D.2.1 Webアプリケーションのディレクトリ構成と動的Webプロジェクト
  D.2.2 WebアプリケーションのデプロイとWAR[Web Application Resources]ファイル
  D.2.3 JARファイル
 D.3 リクエスト先の指定方法
  D.3.1 指定方法の種類
  D.3.2 絶対URLを使って指定する方法
  D.3.3 相対URLを使って指定する方法
  D.3.4 ルート相対URLを使って指定する方法
 D.4 本書のデータベース環境を構築
  D.4.1 テーブルを作成する
  D.4.2 テーブルにレコードを追加する
  D.4.3 SELECT文でレコードを検索する
  D.4.4 どこつぶ専用データベースを作成する


INDEX [503-509]
奥付 [510]




【抜き書き】
・業界用語(77頁)について。

 「どうやら若者のhoge離れが進んでいる」

『スッキリわかるJava入門 実践編[第3版]』(中山清喬 インプレス 2021//2012)

著者 : 中山 清喬


スッキリわかるJava入門 実践編 第3版 - インプレスブックス


【簡易目次】
1章 インスタンスの基本操作
2章 さまざまな種類のクラス
3章 関数とラムダ式
4章 JVM制御とリフレクション
5章 非標準ライブラリの活用
6章 ファイルの操作
7章 さまざまなファイル形式
8章 ネットワークアクセス
9章 データベースアクセス
10章 基本的な開発ツール
11章 単体テストアサーション
12章 メトリクスとリファクタリング
13章 ソースコードの管理と共有
14章 アジャイルな開発
15章 設計の原則とデザインパターン
16章 スレッドによる並列処理
17章 ユーザーインタフェース制御



【目次】
まえがき(著者) [003]
dokojavaの使い方 [004]
sukkiri.jpについて [005]
CONTENTS [006-013]
本書の見方 [014]


第0章 Javaを使いこなす技術者をめざそう
0.1 ようこそ Java実践の世界へ 016
  0.1.1 「学習」から「実践」へ
  0.1.2 一緒にJavaスキルを磨く仲間たち
  0.1.3 実践へのロードマップ


  第I部 さまざまな基本機能

第1章 インスタンスの基本操作
1.1 インスタンスの5大基本操作 024
  1.1.1 Objectクラスに備わる基礎知識

1.2 インスタンスの文字列表現 025
  1.2.1 toString()の責務
  1.2.2 toString()をオーバーライドする

1.3 インスタンスの等価判定 027
  1.3.1 等価と等値の違い
  1.3.2 equals()のオーバーライド
  1.3.3 コレクションとequals()
  1.3.4 配列の等価判定

1.4 インスタンスの要約 033
  1.4.1 HashSetでremove()できない自体
  1.4.2 HashSetの内部動作
  1.4.3 HashCode()のオーバーライド

1.5 インスタンスの順序付け 038
  1.5.1 インスタンスの並び替え
  1.5.2 Comparableインタフェースの実装
  1.5.3 コンパレータの利用

1.6 インスタンスの複製 044
  1.6.1 コピーと参照
  1.6.2 cloneメソッド
    ①Cloneableインタフェースを実装する
    ②clone()をpublicでオーバーライドする
  1.6.3 複製の失敗
  1.6.4 深いコピーと浅いコピー

1.7 この章のまとめ 052
1.8 練習問題 053
1.9 練習問題の解答 055


第2章 さまざまな種類のクラス
2.1 型安全という価値 060
  2.1.1 もし型がなかったら
  2.1.2 型を用いるメリット

2.2 ジェネリクス 064
  2.2.1 昔のArrayList
  2.2.2 ジェネリクスgenerics
  2.2.3 ジェネリクス活用の前知識
  2.2.4 ジェネリクスの活用
  2.2.5 ジェネリクスの制限
  2.2.6 ジェネリクスメソッド

2.3 列挙型 075
  2.3.1 講座種別を引数で受け取る
  2.3.2 列挙型[enum type]
  2.3.3 staticインポート宣言

2.4 インナークラス 080
  2.4.1 クラスの中で定義するクラス
  2.4.2 メンバクラスの宣言と利用
  2.4.3 ローカルクラスの宣言と利用
  2.4.4 匿名クラスの利用
  2.4.5 匿名クラスの活用例
  2.4.6 インナークラスのまとめ

2.5 null安全性 089
  2.5.1 Optionalクラス
  2.5.2 null安全に配慮する

2.6 この章のまとめ 093
2.7 練習問題 094
2.8 練習問題の解答 095


第3章 関数とラムダ式
3.1 関数オブジェクト[function object] 098
  3.1.1 第1級オブジェクト[first-class object]
  3.1.2 関数[function]とは
  3.1.3 関数とメソッドの違い
    ①メソッドとは、クラスに属する一種の関数である
    ②関数にとって名前は重要ではなく、必須ではない

3.2 関数の代入 103
  3.2.1 関数オブジェクトの代入
  3.2.2 Function型とそのバリエーション
  3.2.3 オリジナルの関数インタフェース

3.3 ラムダ式 110
  3.3.1 関数をその場で作る
  3.3.2 ラムダ式の省略記法
  3.3.3 クロージャ

3.4 関数オブジェクトの活用 115
  3.4.1 関数を利用するメリット
  3.4.2 関数オブジェクトの身近な活用例

3.5 StreamAPI 119
  3.5.1 データ集合に対して用いられる高級関数
  3.5.2 ストリームの生成
  3.5.3 データ処理メソッドの使い方
  3.5.4 Lsitとして取り出す
  3.5.5 中間処理メソッドの利用

3.6 この章のまとめ 128
3.7 練習問題 129
3.8 練習問題の解答 130


第4章 JVM制御とリフレクション
4.1 JVMへのアクセス 134
  4.1.1 JVM自体を制御する

4.2 JVMの終了 135
  4.2.1 System.exit()

4.3 外部プログラムの実行 136
  4.3.1 ProcessBuilderクラス

4.4 システムプロパティの利用 137
  4.4.1 JVMが内部に持つシステム情報
  4.4.2 システムプロパティの取得
  4.4.3 環境依存を排除する
  4.4.4 システムプロパティの設定

4.5 ロケールと国際化 143
  4.5.1 ロケール[locale]
  4.5.2 タイムゾーン[time zone]

4.6 メモリに関する状態の取得 147
  4.6.1 JVMの内部メモリ
  4.6.2 3つのメモリ指標

4.7 リフレクション 150
  4.7.1 実行時型情報[RTTI:run-time type information]
  4.7.2 型情報の取得と操作
  4.7.3 メンバの取得と操作
  4.7.4 リフレクションの用途
    ① テストや解析のために、privateメンバを操作したい場合
    ② メンバ名を用いた特殊な処理を作り込みたい場合
    ③ 利用するクラスを動的に追加・変更できるようにしたい場合

4.8 この章のまとめ 156

4.9 練習問題 157
4.10 練習問題の解答 158


第5章 非標準ライブラリの活用
5.1 ライブラリ[library]とは 162
  5.1.1 すでに存在するクラスの活用
  5.1.2 2つの利用方法
    方法① 相手からソースコード[source code]をもらう
    方法② 相手からバイナリモジュール[binary module]をもらう
  5.1.3 JAR[Java Archive]形式での提供

5.2 クラスパスのおさらい 165
  5.2.1 ライブラリが動かない
  5.2.2 クラスパス[class path]

5.3 commons-langを使ってみよう 169
  5.3.1 Commonsプロジェクト
  5.3.2 commons-langの入手
  5.3.3 EqualsBuilderを使う
  5.3.4 HashCodeBuilderを使ってみる

5.4 ログ出力ライブラリ 173
  5.4.1 さまざまなロガーライブラリ[Logger Library]
  5.4.2 簡単なログの出力
  5.4.3 ロガー実装の切り替え

5.5 オープンソースとライセンス 177
  5.5.1 オープンソースと商用製品
  5.5.2 ソフトウェアとライセンス
  5.5.3 ライセンスに違反しないために
  5.5.4 代表的なOSSライセンス
    パブリックドメイン
    BSD系ライセンス
    GPL系ライセンス
  5.5.5 コピーレフトcopyleft

5.6 この章のまとめ 184
5.7 練習問題 185
5.8 練習問題の解答 186


  第II部 外部資源へのアクセス

第6章 ファイルの操作
6.1 ファイル操作の前提知識 190
  6.1.1 ファイル操作の基本手順
  6.1.2 2種類の読み書き方法

6.2 テキストファイルの読み書き 193
  6.2.1 書き込み
  6.2.2 読み取り

6.3 バイナリファイルの読み書き 198
  6.3.1 2種類のファイル
  6.3.2 FileOutputStreamとFileInputStream
  6.3.3 文字とバイトの関係
  6.3.4 日本語と文字コード体系

6.4 ファイル操作の落とし穴 203
  6.4.1 恐ろしいファイルの閉じ忘れ
  6.4.2 正しい例外処理

6.5 ストリームの概念 207
  6.5.1 ストリームとは?
  6.5.2 さまざまなストリーム
    標準出力、標準エラー出力、標準入力
    文字列やバイト配列につながるストリーム

6.6 フィルタの活用 214
  6.6.1 フィルタ[filter]とは
  6.6.2 フィルタの特徴
    特徴① Filter ~クラスを継承している
    特徴② 単独で存在できず、ストリームに接続する形で生成する
    特徴③ 複数のフィルタを連結することができる
  6.6.3 バッファリングフィルタ[buffering filter]
    メリット① 処理性能の向上
    メリット② まとまった単位でデータを読める

6.7 ファイルシステムの操作 219
  6.7.1 ファイル自体を操作する
  6.7.2 Fileクラスの懸念点と解決策

6.8 この章のまとめ 222
6.9 練習問題 223
6.10 練習問題の解答 224


第7章 さまざまなファイル形式
7.1 データフォーマット 228
  7.1.1 データフォーマットとは

7.2 CSV形式 230
  7.2.1 汎用フォーマット
  7.2.2 CSV(Comma-Separeted-Values)
  7.2.3 CSVの読み書き

7.3 プロパティファイル形式 234
  7.3.1 プロパティファイル
  7.3.2 プロパティファイルの読み取り
  7.3.3 プロパティファイルの書き込み
  7.3.4 リソースバンドル

7.4 XML形式 241
  7.4.1 XML[eXtensible Markup Language]とは
  7.4.2 XMLの扱い

7.5 JSON形式 244
  7.5.1 JSONJavaScript Object Notation]形式とは
  7.5.2 JSON形式ファイルの読み書き

7.6 オブジェクトの直列化 249
  7.6.1 ファイル保存に関する不満
  7.6.2 Java直列化機構の概要
  7.6.3 直列化の基本的な使い方
  7.6.4 直列化される対象
  7.6.5 シリアルバージョンUID

7.7 さまざまなフォーマット 256
  7.7.1 より高度なフォーマットと操作ライブラリ
  7.7.2 Microsoft Office形式
  7.7.3 アーカイブファイル形式
  7.7.4 音声形式
  7.7.5 画像形式

7.8 この章のまとめ 263
7.9 練習問題 264
7.10 練習問題の解答 265


第8章 ネットワークアクセス
8.1 ネットワーク APIの全体像 268
  8.1.1 高水準命令と低水準命令
  8.1.2 Webページを取得しよう
  8.1.3 java.net.URLクラスの利用手順

8.2 Socketを用いた低水準アクセス 273
  8.2.1 低水準APIの特徴と理解の鍵
  8.2.2 TCP/IPの基礎
  8.2.3 Socketを用いた接続と切断
  8.2.4 上位プロトコルの利用

8.3 サーバ側ソフトウェアの開発 279
  8.3.1 接続を待つプログラムを作る

8.4 HTTPとWebAPI 281
  8.4.1 HTTPの新たな用途
  8.4.2 HTTPの基礎と全体像
  8.4.3 HTTPレスポンスの構造
    1. ステータスコード(status code)
    2. レスポンスヘッダ(response header)
    3. レスポンスボディ(response body)
  8.4.4 HTTPリクエストの構造
    1. リソースパス(resource path)
    2. リクエストメソッド(request method)
    3. クエリパラメータ(query parameter)
    4. リクエストヘッダ(request header)
    5. リクエストボディ(request body)
  8.4.5 WebAPI
  8.4.6 WebAPI仕様とREST[REpresentative State Transfer]
  8.4.7 JavaからのWebAPIアクセス
    1. HttpClientインスタンスを生成する
    2. HttpRequestインスタンスを生成する
    3. リクエストの実行とHttpResponseの取得

8.5 この章のまとめ 297
8.6 練習問題 298
8.7 練習問題の解答 300


第9章 データベースアクセス
9.1 データベースとは 304
  9.1.1 データベースとは
  9.1.2 データベースの特徴
  9.1.3 代表的なデータベース製品

9.2 データベースの基本操作 310
  9.2.1 データベースの基本構造
  9.2.2 4つの基本操作
  9.2.3 データベースとの接続
  9.2.4 データベース利用のためのAPI

9.3 データベースの接続と切断 315
  9.3.1 JDBCJava Database Connectivity]をマスターするコツ
  9.3.2 基本パターン
  9.3.3 STEP 0 事前準備
    STEP 0-1 JDBCドライバの準備
    STEP 0-2 JDBCドライバのロード
  9.3.4 STEP 1 接続の確立
  9.3.5 STEP 2 接続の切断
  9.3.6 STEP 3 SQL送信に関する各種パターン

9.4 更新系SQL文の送信 321
  9.4.1 更新系SQL文送信の流れ
  9.4.2 STEP 2-①-1 SQL文送のひな形の準備
  9.4.3 STEP 2-①-2 ひな形に値を流し込む
  9.4.4 STEP 2-①-3 SQL文をDBMSに送信する
  9.4.5 STEP 2-①-4 成否判定を行う
  9.4.6 STEP 2-①-5 パラメータの異なるSQL文を何度も送る

9.5 検索系SQL文の送信 326
  9.5.1 検索系SQL文送信の流れ
  9.5.2 STEP 2-②-3 検索系SQL文の送信

9.6 結果表の処理 328
  9.6.1 ResultSetの操作
  9.6.2 複数行の結果表処理パターン
  9.6.3 単一行の結果表処理パターン

9.7 Java DBのデータ型 331
  9.7.1 データ型の対応と注意すべき型
  9.7.2 日時情報の格納と取り出し
  9.7.3 java.sqlパッケージの日時関連クラス

9.8 トランザクション処理 334
  9.8.1 トランザクションとは
  9.8.2 トランザクションの利用
    setAutoCommit() ――接続確立した直後
    commit() ―― 一連のSQL文をすべて送信し終わったとき
    rollback() ――途中で異常を検知したとき

9.9 この章のまとめ 340
9.10 練習問題 341
9.11 練習問題の解答 342


  第III部 効率的な開発の実現

第10章 基本的な開発ツール
10.1 Javaが備える基本ツール 350
  10.1.1 実践の難しさ
  10.1.2 開発効率を高める3つの方法

10.2 JDKJava Development Kit] 352
  10.2.1 JavaJDKの関係
  10.2.2 JDKとライセンス

10.3 javadoc ――仕様書の自動生成 357
  10.3.1 仕様書とは
  10.3.2 仕様書の自動生成
  10.3.3 Javadocの基本的な使い方
  10.3.4 Javadocでよく使うオプション指定
  10.3.5 詳細な解説文を出力する
  10.3.6 Javadocタグの利用

10.4 javac ――コンパイル 365
  10.4.1 javacコマンドとは
  10.4.2 アノテーション[annotation]
  10.4.3 @SuppressWarnings ――警告を抑制する
  10.4.4 @Override ――オーバーライド宣言
  10.4.5 @Deprecated ――非推奨の宣言

10.5 jar ――アーカイブの操作 369
  10.5.1 jarコマンドとは
  10.5.2 jarコマンドの基本的な利用方法
  10.5.3 マニフェストファイル
  10.5.4 Main-Classエントリ

10.6 java ―― JVM の起動と実行 373
  10.6.1 javaコマンドとは
  10.6.2 ヒープとスタック
  10.6.3 ガベージコレクションGC
  10.6.4 GCの落とし穴
    注意点1 GCがいつ動作を開始するかは制御できない
    注意点2 GCが動作するときにはファイナライザ[finalizer]
    注意点3 GCが動作している間、ほかの計算処理などは完全に停止する
  10.6.5 メモリリークに注意しよう

10.7 jshell ―― Javaの対話的実行 380
  10.7.1 JavaのためのREPL[Read-Eval-Print Loop]
  10.7.2 JShellの基本的な使い方

10.8 統合開発環境 382
  10.8.1 統合開発環境と代表的な製品

10.9 Ant 383
  10.9.1 ビルドの自動化
  10.9.2 Antとは

10.10 Maven 386
  10.10.1 より高度な自由化
  10.10.2 POM[project object model]
  10.10.3 標準フォルダ構造
  10.10.4 Maven標準コマンドの実行
  10.10.5 プロジェクトサイトの生成
  10.10.6 依存アーティファクトの宣言と自動取得

10.11 この章のまとめ 399
10.12 練習問題 400
10.13 練習問題の解答 402


第11章 単体テストアサーション
11.1 不具合に対するアプローチ 406
  11.1.1 「完成」の基準
  11.1.2 品質の高さの度合い
  11.1.3 部品化とテスト
    単体テスト[Unit Test]
    結合テスト[Integration Test]
    総合テスト[System Test]

11.2 単体テストのやり方 412
  11.2.1 テストクラスとは
  11.2.2 テストクラスを作成する
  11.2.3 テストクラスで稼働クラスをテストする
  11.2.4 二度目のテスト実行
  11.2.5 テストクラスを使う理由
  11.2.6 良いテストケースとは

11.3 JUnitを用いたテスト 421
  11.3.1 テスティングフレームワーク
  11.3.2 JUnitとは
  11.3.3 JUnitテストクラスの記述
  11.3.4 テストの実行

11.4 アサーション 429
  11.4.1 アサーションとは
  11.4.2 アサーションの記述方法
  11.4.3 AssertionErrorが例外でなくエラーである理由
  11.4.4 アサーションを有効にする
  11.4.5 アサーションの注意点

11.5 この章のまとめ 436
11.6 練習問題 437
11.7 練習問題の解答 438


第12章 メトリクスとリファクタリング
12.1 品質の「見える化」 442
  12.1.1 本当に大丈夫?
  12.1.2 品質を「見える化」する
  12.1.3 コードのカバレッジ
  12.1.4 カバレッジの数え方
  12.1.5 カバレッジの計測
  12.1.6 カバレッジ中毒にご用心

12.2 さまざまなメトリクス 449
  12.2.1 便利なメトリクスたち
  12.2.2 規模を大まかに把握できるLOC[Lines of Code]
  12.2.3 メソッドの複雑さを示すCC[Cyclomatic Complexity]
  12.2.4 クラス複雑度を示すWMC[Weighted Method Class]

12.3 リファクタリング 451
  12.3.1 「カイゼン」しよう
  12.3.2 リファクタリングとは
  12.3.3 単体テストの重要性
  12.3.4 リファクタリングの注意点

12.4 コードの静的解析 456
  12.4.1 静的解析とは?
  12.4.2 SpotBugs ――バグの種を検出
  12.4.3 Checkstyle ――スタイルの統一

12.5 この章のまとめ 460
12.6 練習問題 461
12.7 練習問題の解答 462


第13章 ソースコードの管理と共有
13.1 チームによる開発 466
  13.1.1 チームによる分業
  13.1.2 分業の特徴

13.2 ソースコードの共有 469
  13.2.1 ソースコード共有の課題
  13.2.2 バージョン管理システムとは
    Subversion
    Git

13.3 Gitの基礎 473
  13.3.1 Git入門のアプローチ
  13.3.2 Git利用の構図と3つの「場所」
    場所1 ワークツリー(working tree)
    場所2 ローカルレポジトリ(local repository)
    場所3 リモートレポジトリ(remote repository)
  13.3.3 Gitに関する3つの「アクション」
    アクション1 commit
    アクション2 push
    アクション3 pull
  13.3.4 「場所」の関係を結ぶためのアクション

13.4 Gitツールの利用 479
  13.4.1 Gitクライアントのインストール
  13.4.2 Gitクライアントの初期設定
  13.4.3 レポジトリの認証とclone
  13.4.4 ファイルの修正とcommit
  13.4.5 pushの実施

13.5 競合の発生と解決 487
  13.5.1 競合の発生
  13.5.2 pullによる統合
    注意点① 「統合した歴史」を改めてpushする必要がある
    注意点② 未commitのファイルがあるとpullに失敗することがある
    注意点③ 歴史を「いい感じ」に統合できないことがある

13.6 commit の制御 497
  13.6.1 一部のファイルだけをcommitする
  13.6.2 ワークツリーとステージの状態を調べる
  13.6.3 過去のcommitの閲覧
  13.6.4 コミットコメントの修正
  13.6.5 commitの取り消し
  13.6.6 .gitignoreファイル
  13.6.7 .gitkeepファイル

13.7 ブランチ 505
  13.7.1 より高度なGit活用に向けて
  13.7.2 ブランチとは
  13.7.3 ブランチを作る
  13.7.4 ブランチのマージ

13.8 Gitサーバ 512
  13.8.1 Gitサーバの利用
  13.8.2 フォークとプルリクエス

13.9 この章のまとめ 516
13.10 練習問題 519
13.11 練習問題の解答 520


第14章 アジャイルな開発
14.1 チーム開発の基盤 522
  14.1.1 チーム開発に必要なもの

14.2 共通の言葉 523
  14.2.1 技術者が使うさまざまな言葉
  14.2.2 UML ――統一モデリング言語
  14.2.3 クラス図
  14.2.4 シーケンス図
  14.2.5 ユースケース

14.3 共通の手順 531
  14.3.1 開発の工程と成果物
  14.3.2 代表的な開発プロセス
  14.3.3 開発を支える価値観

14.4 アジャイルという価値観 536
  14.4.1 コードと人と変化を重視する
  14.4.2 アジャイル開発の進め方

14.5 エクストリーム・プログラミング(XP) 539

  14.5.1 XPとは
  14.5.2 ペアプログラミング
  14.5.3 テスト駆動開発[TDD:Test Driven Development]
  14.5.4 継続的インテグレーション

14.6 スクラム(Scrum) 548
  14.6.1 スクラムとは
  14.6.2 Scrumが定める3つのルール
    ① プロダクトオーナー
    ② 開発メンバー
    ③ スクラムマスター
  14.6.3 スクラムで用いられる3つのリスト
    ① プロダクトバックログ(product backlog)
    ② スプリントバックログ(sprint backlog)
    ③ 障害リスト(impediment lsit)
  14.6.4 スクラムが定める4つのミーティング
    ① スプリント計画ミーティング
    ② デイリースクラム
    ③ スプリント・レビュー
    ④ ふりかえり(スプリント・レトロスペクティブ)
  14.6.5 デイリースクラムの実践ポイント

14.7 継続的デプロイメント 554
  14.7.1 継続的インテグレーションの自動化
  14.7.2 ビルドエージェント[build agent]の活用
  14.7.3 継続的デプロイメント[CD:continuous deployment]

14.8 この章のまとめ 558
14.9 練習問題 559
14.10 練習問題の解答 560


  第IV部 より高度な設計をめざして

第15章 設計の原則とデザインパターン
15.1 優れた設計の原則 564
  15.1.1 設計の優劣

15.2 コード記述全般に関する原則 566
  15.2.1 同じことを何度もやらない(DRY[Don't Repeat Yourself])
  15.2.2 意味や意図を明確に記述する(PIE[Program Intently and Expressively])
    (1) 適切な名前を選ぶ
    (2) マジックナンバーに名前を付ける
    (3) 複雑な処理に名前を付ける

15.3 クラスの設計に関する原則 569
  15.3.1 クラスに与える責務は1つだけ(SRP[Single Responsibility Principle])
  15.3.2 既存部分の修正なしで拡張可能に(OCP[Open–Closed principle])

15.4 クラスの関係に関する原則 571
  15.4.1 クラスの依存関係
  15.4.2 安定したものに依存する(SDP[Stable Dependencies Principle])
  15.4.3 循環依存、相互依存を避ける(ADP[Acyclic Dependencies Principle])

15.5 デザインパターン 574
  15.5.1 設計のパターン
  15.5.2 パターンを利用するメリット
    メリット① 開発者間のコミュニケーションが円滑になる
    メリット② オブジェクト指向や設計原則の理解が深まる
  15.5.3 GoFパターン

15.6 Facade ――内部を隠してシンプルに 579
  15.6.1 引越手続きの煩雑さ
  15.6.2 「表の窓口」役を作る

15.7 Singleton ――唯一無二の存在 581
  15.7.1 「世界に一つだけの花」の設計図を考える
  15.7.2 1回しかnewできなくする方法

15.8 Strategy ――プラグインの切り替え 585
  15.8.1 複数のアルゴリズムを選べるしくみ
  15.8.2 さらに拡張性を高める

15.9 TemplateMethod ――大まかなシナリオ 590
  15.9.1 すべては確定できないけれど、流れだけは確定したい
  15.9.2 流れは確定し、細部は任せる
  15.9.3 TemplateMethodの応用例

15.10 モジュール 596
  15.10.1 「優れた設計」の共演のために
  15.10.2 JARマニフェストによるモジュール名宣言
  15.10.3 module-infoによるモジュール定義
  15.10.4 パッケージのアクセス制御
  15.10.5 依存の表明と連鎖への反応
  15.10.6 モジュールパスからのJARファイルの読み込み
  15.10.7 モジュールシステム[module system]の必要性
    問題1 「publicなクラスがpublicすぎる」問題
    問題2 「同じクラスの別バージョンを利用している」問題

15.11 この章のまとめ 612
15.12 練習問題 613
15.13 練習問題の解答 614


第16章 スレッドによる並列処理
16.1 処理効率の追求 618
  16.1.1 複数処理の同時実行
  16.1.2 スレッド

16.2 Javaにおける並列処理 621
  16.2.1 Threadクラスの利用
  16.2.2 Runnableの利用
  16.2.3 そのほかの使い方と注意点
    (1) スレッドはrun()を実行し終えると自動消滅する
    (2) stop()の利用は御法度
    (3) JVMは全スレッドの終了をもって終了する
    (4) join()で別スレッドの終了を待つことができる
    (5) OSによって動作に違いが生じる可能性がある
    (6) 例外はほかのスレッドに伝播しない
    (7) 同時に1つの変数を利用するとデータが壊れる

16.3 スレッドセーフな設計 629
  16.3.1 スレッドの競合
  16.3.2 synchronizedによる排他制御
  16.3.3 ほかのスレッドに道を譲る

16.4 スレッド活用と高水準API 634
  16.4.1 スレッド活用の難しさ
  16.4.2 スレッドセーフなデータ型
  16.4.3 スレッドにまつわるデザインパターン
  16.4.4 スレッドを正しく「おそれる」

16.5 この章のまとめ 641
16.6 練習問題 642
16.7 練習問題の解答 643


第17章 ユーザーインタフェース制御
17.1 ユーザーインタフェース 646
  17.1.1 Javaで開発可能なアプリケーション

17.2 ウィンドウUIの基礎 648
  17.2.1 ユーザーインターフェースの種類
  17.2.2 ウィンドウUIの基本要素
  17.2.3 ウィンドウUIを実現するJava API

17.3 Swing APIの基礎 651
  17.3.1 ウィンドウの種類
  17.3.2 フレームの利用
  17.3.3 ウィンドウアプリケーションとスレッド
  17.3.4 ウィジェットの生成と追加

17.4 レイアウト 657
  17.4.1 座標指定による配置
  17.4.2 レイアウトマネージャ
  17.4.3 レイアウトのネストによる配置

17.5 イベントハンドリング 665
  17.5.1 イベントとイベントハンドラ
  17.5.2 ボタンのクリックイベントに対応する
  17.5.3 さまざまなイベントへの対応
  17.5.4 アダプタクラスの利用
  17.5.5 イベントディスパッチスレッド[EDT: event dispatch thread]の制約
  17.5.6 終わりに

17.6 この章のまとめ 680
17.7 練習問題 681
17.8 練習問題の解答 682


エラー解決・虎の巻 [691-715]
あとがき & 参考文献一覧(著者) [716]
索引 [717-726]






【メモ】
・改訂履歴
第1版 2012
第2版 2014
第3版 2021


・列挙される見出しが不統一だったので、上記目次では勝手に補完しておいた。本文では286頁。


  [変更前]

  8.4.4 HTTPリクエストの構造
    1. リソースパス(resource path)
    2. リクエストメソッド(method)
    3. クエリパラメータ(query parameter)
    4. リクエストヘッダ(request header)
    5. リクエストボディ(request body)

  ↓
  [変更後]

  8.4.4 HTTPリクエストの構造
    1. リソースパス(resource path)
    2. リクエストメソッド(request method)
    3. クエリパラメータ(query parameter)
    4. リクエストヘッダ(request header)
    5. リクエストボディ(request body)