contents memorandum はてな

目次とメモを置いとく場

『スッキリわかるJava入門[第3版]』(中山清喬, 国本大悟[著] インプレス 2019//2011)

著者:中山 清喬[なかやま・きよたか]
著者:国本 大悟[くにもと・だいご]
執筆協力:飯田 理恵子[いいだ・りえこ]
執筆協力:部坂 征司[へさか・せいじ] ITコーディネータ
監修:株式会社フレアリンク
イラスト:高田ゲンキ[たかだ・げんき](1976-) イラストレーター。 
カバーデザイン:阿部 修[あべ・おさむ] 
カバー制作:高橋 結花[たかはし・ゆか]
カバー制作:鈴木 薫[すずき・かおる]
NDC:007.64 情報学.情報科学 >> プログラミング


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



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


第0章 Javaをはじめよう 015
0.1 ようこそJavaの世界へ 016
  0.1.1 Javaを使ってできること
  0.1.2 一緒にJavaを学ぶ仲間たち
0.2 はじめてのプログラミング 018
  0.2.1 プログラミングの準備をしよう
  0.2.2 サンプルプログラムを動かしてみよう
  0.2.3 画面に好きな文字を表示させよう
  0.2.4 たくさんの文章を表示しよう
  0.2.5 計算させてみよう
  0.2.6 変数を使ってみよう
  0.2.7 プログラミング体験終えて


  第I部 ようこそJavaの世界へ 029

第1章 プログラムの書き方 
1.1 Javaによる開発の基礎知識 032
  1.1.1 開発の流れ
  1.1.2 開発環境の整備

1.2 Javaプログラムの基本構造 036
  1.2.1 プログラムの骨格
  1.2.2 プログラムの書き始め方
  1.2.3 インデント
  1.2.4 コメント
  1.2.5 mainメソッドの中身

1.3 変数宣言の文 046
  1.3.1 変数宣言の文
  1.3.2 変数の名前
  1.3.3 データ型
  1.3.4 変数の初期化
  1.3.5 定数の利用

1.4 第1章のまとめ 057
1.5 練習問題 058
1.6 練習問題の解答 059


第2章 式と演算子
2.1 計算の文 062
  2.1.1 計算の文とは?
  2.1.2 式の構成要素
2.2 オペランド 064
  2.2.1 リテラル
  2.2.2 エスケープシーケンス[escape sequence]
2.3 評価のしくみ 068
  2.3.1 評価の結果
  2.3.2 優先順位
  2.3.3 結合規則
2.4 演算子 072
  2.4.1 算術演算子
  2.4.2 文字列結合演算子
  2.4.3 代入演算子
  2.4.4 インクリメント/デクリメント演算子
2.5 型の変換 077
  2.5.1 3種類の型変換
  2.5.2 代入時の自動型変換
  2.5.3 強制的な型変換
  2.5.4 演算時の自動型変換
2.6 命令実行の文 086
  2.6.1 命令実行の文とは?
  2.6.2 画面に文字を表示する命令
  2.6.3 大きいほうの数値を代入する命令
  2.6.4 文字列を数値に変換する命令
  2.6.5 乱数を生み出して代入する命令
  2.6.6 キーボードから1行の入力を受け取る命令
2.7 第2章のまとめ 094
2.8 練習問題 095
2.9 練習問題の解答 097


第3章 条件分岐と繰り返し 
3.1 プログラムの流れ 100
  3.1.1 代表的な制御構文
  3.1.2 分岐を体験する
  3.1.3 繰り返しを体験する
  3.1.4 制御構文の構成要素
3.2 ブロックの書き方 107
  3.2.1 ブロックとは
3.3 条件式の書き方 109
  3.3.1 条件式とは
  3.3.2 if文や while文の正体
  3.3.3 文字列の比較
  3.3.4 論理演算子を用いた複雑な条件式
3.4 分岐構文のバリエーション 116
  3.4.1 3種類のif構文
    if-else 構文(基本形)
    ifのみの構文
    if-else if-else構文
  3.4.2 switch文による分岐
  3.4.3 break文を書き忘れると?
3.5 繰り返し構文のバリエーション 124
  3.5.1 2種類のwhile文
  3.5.2 for文による繰り返し
  3.5.3 for文の各部の意味
  3.5.4 ループ変数
  3.5.5 複雑なfor文
3.6 制御構文の応用 131
  3.6.1 制御構造のネスト
  3.6.2 繰り返しの中断
  3.6.3 無限ループ
3.7 第3章のまとめ 134
3.8 練習問題 135
3.9 練習問題の解答 138


第4章 配列
4.1 配列のメリット 144
  4.4.1 変数が持つ不便さ
  4.4.2 配列とは
4.2 配列の書き方 148
  4.2.1 配列の作成
  4.2.2 配列の利用方法
  4.2.3 配列の初期化
  4.2.4 省略記法
4.3 配列と例外 154
  4.3.1範囲外要素の利用による例外の発生
4.4 配列のデータをまとめて扱う 156
  4.4.1 配列とfor文
  4.4.2 パターン1 ループによる全要素の利用
  4.4.3 パターン2 ループによる集計
  4.4.4 パターン3 添え字に対応した情報の利用
  4.4.5 拡張for文
4.5 配列の舞台裏 164
  4.5.1 配列を理解する
  4.5.2 メモリと変数
  4.5.3 メモリと配列
  4.5.4 配列を複数の変換で参照する
4.6 配列の後片付け 168
  4.6.1 ガベージコレクション
  4.6.2 null
  4.6.3 Null Pointer Exception
4.7 多次元の配列 172
  4.7.1 多次元配列とは?
4.8 第4章のまとめ 175
4.9 練習問題 176
4.10 練習問題の解答 178


第5章 メソッド 
5.1 メソッドとは 182
  5.1.1 メソッドを利用するメソッド
  5.1.2 メソッドの定義
  5.1.3 メソッドの呼び出し
  5.1.4 mainメソッド以外からのメソッドの呼び出し
  5.1.5 メソッドにまつわる2つの立場
5.2 引数の利用 192
  5.2.1 引数〔ひきすう〕とは
  5.2.2 1つの引数を渡す例
  5.2.3 複数の引数を渡す例
  5.2.4 仮引数と実引数
  5.2.5 変数のスコープとローカル変数
5.3 戻り値の利用 200
  5.3.1 戻り値とは
  5.3.2 戻り値を受け取る
  5.3.3 戻り値をそのまま使う
  5.3.4 return文の注意点
5.4 オーバーロードの利用 205
  5.4.1 類似する複数のメソッドを定義する
5.5 引数や戻り値に配列を用いる 209
  5.5.1 引数に配列を用いる
  5.5.2 値渡しと参照渡し
  5.5.3 戻り値に配列を用いる
5.6 コマンドライン引数 215
  5.6.1 コマンドライン引数
5.7 第5章のまとめ 217
5.8 練習問題 218
5.9 練習問題の解答 220


第6章 複数クラスを用いた開発
6.1 ソースファイルを分割する 224
  6.1.1 1つのソースファイルによる開発の限界
  6.1.2 計算機プログラムを分割しよう
6.2 複数クラスで構成されるプログラム 229
  6.2.1 JDKで開発をしてみよう
  6.2.2 複数クラスのコンパイル
  6.2.3 プログラムの完成品
  6.2.4 プログラムの実行方法
6.3 パッケージを利用する 233
  6.3.1 クラスが増えすぎたら…どうしよう?
  6.3.2 パッケージを含むクラス名を指定する
  6.3.3 完全限定クラス名の入力を省略する
6.4 パッケージに属したクラスの実行方法 241
  6.4.1 実行クラス名の正しい指定
  6.4.2 クラス名だけでクラスファイルを探し出すためのしくみ
  6.4.3 クラスパスの指定方法
  6.4.4 クラスパスで指定できる対象
  6.4.5 クラスファイルの正しい配置
6.5 名前空間 250
  6.5.1 パッケージを使うもう1つのメリット
  6.5.2 パッケージ名自体の衝突を避ける方法
6.6 Java API について学ぶ 255
  6.6.1 世界中の人々の協力で完成してきたHelloWorld
  6.6.2 APIで提供されるパッケージ
  6.6.3 APIリファレンスの読み方
6.7 第6章のまとめ 262
6.8 練習問題 263
6.9 練習問題の解答 265


  第II部 すっきり納得オブジェクト指向 269

第7章 オブジェクト指向をはじめよう 
7.1 オブジェクト指向を学ぶ理由 272
  7.1.1 ソフトウェア開発の新たな課題
  7.1.2 オブジェクト指向プログラミングをマスターしよう
  7.1.3 オブジェクト指向を学ぶコツ
7.2 オブジェクト指向の定義と効果 277
  7.2.1 オブジェクト指向の定義
  7.2.2 オブジェクト指向のメリット
7.3 オブジェクト指向の全体像と本質 281
  7.3.1 オブジェクト指向と現実世界
  7.3.2 手続き型プログラミングとの違い
  7.3.3 開発時に作るクラス,実行時に動くオブジェクト
  7.3.4 オブジェクト指向における開発者の役割
  7.3.5 オブジェクト指向の本質
7.4 オブジェクトと責務 287
  7.4.1 サッカーで考えるオブジェクト指向
  7.4.2 オブジェクトの姿
  7.4.3 オブジェクトのふるまいと相互作用
7.5 オブジェクト指向の3大機能と今後の学習 293
  7.5.1 3大機能とその位置付け
  7.5.2 以降の章の学び方
7.6 第7章のまとめ 297
7.7 練習問題 298
7.8 練習問題の解答 299


第8章 インスタンスとクラス
8.1 仮想世界の作り方 302
  8.1.1 オブジェクトを生み出す手順
  8.1.2 クラスとオブジェクトが別である理由
  8.1.3 オブジェクトという用語のあいまいさ
  8.1.4 プログラムに登場する2種類のクラス
8.2 クラスの定義方法 309
  8.2.1 登場人物クラスの作り方
  8.2.2 クラスの宣言方法
  8.2.3 属性の宣言方法
  8.2.4 属性の初期値と定数フィールド
  8.2.5 操作のの宣言方法
  8.2.6 クラス名とメンバ名のルール
  8.2.7 クラス定義のまとめ
8.3 クラス定義による効果 316
  8.3.1 クラス定義によって可能になる2つのこと
  8.3.2 クラス型変数とは
  8.3.3 クラス型変数が必要な理由
8.4 インスタンスの利用方法 319
  8.4.1 「神様のクラス」の作り方
  8.4.2 インスタンスの生成方法
  8.4.3 インスタンスのフィールド利用
  8.4.4 インスタンスのメソッド呼び出し
  8.4.5 インスタンス利用のまとめ
  8.4.6 オブジェクト指向のクラスは現実とつながっている
8.5 第8章のまとめ 328
8.6 練習問題 329
8.7 練習問題の解答 330


第9章 さまざまなクラス機構
9.1 クラス型と参照 334
  9.1.1 仮想世界の真の姿
  9.1.2 クラス型変数とその内容
  9.1.3 Step1:Hero型変数の確保
  9.1.4 Step2:Heroインスタンスの生成
  9.1.5 Step3:参照の代入
  9.1.6 Step4:フィールドへの値の代入
  9.1.7 同一インスタンスを指す変数
  9.1.8 クラス型をフィールドに用いる
  9.1.9 クラス型をメソッド引数や戻り値に用いる
  9.1.10 String型の真実
9.2 コンストラクタ 349
  9.2.1 生まれたてのインスタンスの状態
  9.2.2 フィールド初期値を自動設定する
  9.2.3 コンストラクタの定義方法
  9.2.4 コンストラクタに情報を渡す
  9.2.5 2つ以上の同名コンストラクタを定義する
  9.2.6 暗黙のコンストラク
  9.2.7 ほかのコンストラクタを呼び出す
9.3 第9章のまとめ 363
9.4 練習問題 364
9.5 練習問題の解答 366


第10章 継承
10.1 継承の基礎 370
  10.1.1 似かよったクラスの開発
  10.1.2 「コピペ解決法」の問題点
  10.1.3 継承による解決
  10.1.4 継承関係の表現方法
  10.1.5 継承のバリエーション
  10.1.6 オーバーライド
  10.1.7 継承やオーバーライドの禁止
10.2 インスタンスの姿 383
  10.2.1 インスタンスの多重構造
  10.2.2 メソッドの呼び出し
  10.2.3 親インスタンス部へのアクセス
10.3 継承とコンストラクタ 389
  10.3.1 継承を利用したクラスのコンストラク
  10.3.2 親インスタンス部分が作れない状況
  10.3.3 内部インスタンスのコンストラクタ引数を指定する
10.4 正しい継承、間違った継承 395
  10.4.1 is-aの原則
  10.4.2 間違った継承の例
  10.4.3 間違った継承をすべきでない理由
  10.4.4 汎化・特化の関係
10.5 第10章のまとめ 400
10.6 練習問題 401
10.7 練習問題の解答 403


第11章 高度な継承 
11.1 未来に備えるための継承 406
  11.1.1 高度な継承を学ぶにあたって
  11.1.2 新しい「立場」で考える
  11.1.3 「未来に備える」開発者の立場の具体例
11.2 高度な継承に関する2つの不都合 412
  11.2.1 2つの不都合、3つの心配
  11.2.2 最初の不都合
  11.2.3 不都合Aに対する間違った解決方法
  11.2.4 不都合Aに対する対応策と2つの心配事
  11.2.5 第1の心配事:オーバーライドを忘れる
  11.2.6 第2の心配事:「本当に何もしない」と区別がつかない
  11.2.7 第3の心配事:意図せずnewして利用されてしまう
  11.2.8 第3の心配事の原因
11.3 抽象クラス 424
  11.3.1 安全な「継承の材料」を実現するために
  11.3.2 詳細未定のメソッドを宣言
  11.3.3 未完成のためnewしてはいけないクラスの宣言
  11.3.4 オーバーライドの強制
  11.3.5 多階層の抽象継承構造
11.4 インタフェース 435
  11.4.1 抽象階層を上に辿ると…
  11.4.2 抽象クラスの特別扱い
  11.4.3 インターフェースの名前の由来
  11.4.4 インターフェースの実装
  11.4.5 特扱いされる理由
  11.4.6 インターフェースの継承
  11.4.7 extendsと implementsを一緒に使う
11.5 第11章のまとめ 452
11.6 練習問題 453
11.7 練習問題の解答 456


第12章 多態性 
12.1 多態性とは 460
  12.1.1 開発をラクにする多態性
  12.1.2 多態性のイメージ
  12.1.3 ザックリ捉えるメリット
12.2 ザックリ捉える方法 463
  12.2.1 ザックリ捉えるための文法
  12.2.2 できる代入、できない代入
  12.2.3 継承のもう1つの役割
  12.2.4 箱の型に抽象クラスを使う
12.3 ザックリ捉えたものに命令を送る 469
  12.3.1 捉え方の違いは使い方の違い
  12.3.2 呼び出せるメソッドの変化
  12.3.3 メソッドを呼び出せた場合に動く処理
12.4 捉え方を変更する方法 476
  12.4.1 捉え方を途中で変える
  12.4.2 キャストの失敗
  12.4.3 インスタンスを代入可能かチェックする
12.5 多態性のメリット 480
  12.5.1 ザックリ捉えることによるメリット
  12.5.2 同一視して配列を利用する
  12.5.3 同一視してザックリとした引数を受け取る
  12.5.4 ザックリ利用しても、ちゃんと動く
12.6 第12章のまとめ 487
12.7 練習問題 488
12.8 練習問題の解答 490


第13章 カプセル化 
13.1 カプセル化の目的とメリット 492
  13.1.1 カプセル化とは?
  13.1.2 アクセス制御されない怖さ
13.2 メンバに対するアクセス制御 498
  13.2.1 4つのアクセス制御レベル
  13.2.2 privateを利用する
  13.2.3 publicやpackage privateを利用する
  13.2.4 アクセス修飾の定石
13.3 getter と setter 503
  13.3.1 メソッドを経由したフィールド操作
  13.3.2 単純にフィールド値を取り出すだけのメソッド
  13.3.3 getterメソッドの書き方
  13.3.4 単純にフィールドに値を代入するだけのメソッド
  13.3.5 getter / setter の存在価値
    メリット1:Read Omly、Write Onlyのフィールドを実現できる
    メリット2:フィールドの名前など、クラスの内部設計を自由に変更できる
    メリット3:フィールドへのアクセスを検査できる
13.4 クラスに対するアクセス制御 512
  13.4.1 2つのアクセス制御レベル
  13.4.2 非publicクラスとソースファイル
13.5 カプセル化を支えている考え方 514
  13.5.1 メソッドでフィールドを保護する
  13.5.2 カプセル化の本質
13.6 第13章のまとめ 517
13.7 練習問題 518
13.8 練習問題の解答 520


  第III部 もっと便利にAPI活用術 525

第14章 Java を支えるクラスたち
14.1 Javaが備えるAPI群 528
  14.1.1 JavaAPIを探検しよう
14.2 すべてのクラスの祖先 529
  14.2.1 暗黙の継承
  14.2.2 Objectクラスの存在価値
    理由1:多態性を利用できるようになるから
    理由2:すべてのクラスが最低限備えるべきメソッドを定義できるから
  14.2.3 デフォルトの文字列表現
  14.2.4 文字列表現を定義する
  14.2.5 等値と等価の違い
  14.2.6 等価判定方法の指定
14.3 静的メンバ 540
  14.3.1 stackが付けられたメンバ
  14.3.2 静的フィールド
  14.3.3 静的メソッド
  14.3.4 静的メソッドの制約
  14.3.5 静的メンバの使いどころ
14.4 第14章のまとめ 551
14.5 練習問題 552
14.6 練習問題の解答 553


第15章 文字列と日付の扱い 
15.1 文字列処理とは 556
  15.1.1 文字列にまつわる処理
15.2 基本的な文字列操作 557
  15.2.1 文字列を調査する
  15.2.2 文字列を検索する
  15.2.3 文字列を切り出す
  15.2.4 文字列を変換する
15.3 文字列の連結 561
  15.3.1 文字列の連結の方法
  15.3.2 StringBuilderを用いた連結
  15.3.3 +演算子が遅い理由
15.4 正規表現の活用 566
  15.4.1 パターンマッチング
  15.4.2 正規表現の基本文法
    ①通常の文字:その文字でなければならない
    ②ピリオド:任意の1文字であればよい
    ③アスタリスク:直前の文字の0回以上の繰り返し
    ④波カッコ:指定回数の繰り返し
    ⑤角カッコ:いずれかの文字
    ⑥角カッコ内のハイフン:指定範囲のいずれかの文字
    ⑦ハットとダラー:先頭と末尾
  15.4.3 正規表現を用いたほかの処理
    splitメソッド:文字列の分割
    replaceAllメソッド:文字列の置換
15.5 文字列の書式整形 574
  15.5.1 桁を揃えた表示
15.6 日付と時刻を扱う 578
  15.6.1 日時情報を扱う2つの基本形式
    形式1:long型の数値
    形式2:Date型のインスタンス
  15.6.2 人間が扱いやすい2つの形式
    形式3:人間が指定しやすい「6つのint」形式
    形式4:人間が読みやすいString型のインスタンス
  15.6.3 Calenderクラスの利用
  15.6.4 SimpleDateFormatクラスの利用
  15.6.5 DateやCalenderの問題点と限界
15.7 Time API 589
  15.7.1 java.timeパッケージ
  15.7.2 より正確な「瞬間」を表すクラス
  15.7.3 曖昧な日時を表すクラス
  15.7.4 その他の日時を表すクラス
  15.7.5 時間や期間あを表すクラス
15.8 第15章のまとめ 599
15.9 練習問題 600
15.10 練習問題の解答 602


第16章 コレクション 
16.1 コレクションとは 606
  16.1.1 さまざまなデータ構造
  16.1.2 コレクションを体験する
  16.1.3 ラッパークラス[wrapper class]
16.2 ArrayListの使い方 613
  16.2.1 ArrayListの宣言と操作
  16.2.2 要素を順に取り出す3つの方法
  16.2.3 イテレータiterator
16.3 LinkedListの使い方 622
  16.3.1 連結されたリスト
  16.3.2 ザックリとらえれば、どちらもリスト
16.4 Set 関連のクラス 627
  16.4.1 コレクションクラスの全体像
  16.4.2 java.util.HashSetクラス
  16.4.3 Setの実装バリエーション
16.5 Map の使い方 633
  16.5.1 ペアを格納するデータ構造
  16.5.2 HashMapクラスの利用
  16.5.3 HashMapの中身を1つずつ取り出す
16.6 コレクションの応用 638
  16.6.1 コレクションのネスト
  16.6.2 要素の参照に関する注意点
  16.6.3 自分で作るクラスをコレクションに格納する場合の注意点
16.7 第16章のまとめ 642
16.8 練習問題 643
16.9 練習問題の解答 644


第17章 例外 
17.1 エラーの種類と対応策 648
  17.1.1 不具合のないプログラムを目指す
  17.1.2 3種類の不具合と対処法
    ①文法エラー[syntax error]
    ②実行時エラー[runtime error]
    ③論理エラー[logic error]
  17.1.3 例外的状況[exceptional situation]
17.2 例外処理[exceptional handling]の流れ 653
  17.2.1 従来型例外処理の問題点
  17.2.2 新しい例外処理の方法
17.3 例外クラスとその種類 657
  17.3.1 例外を表すクラス
  17.3.2 例外の種類
    ①Error系例外
    ②Exception系例外
    ③RuntimeException系例外
  17.3.3 チェック例外
  17.3.4 発生する例外の調べ方
17.4 例外の発生と例外インスタンス 663
  17.4.1 例外インスタンスの受け渡し
  17.4.2 例外インスタンスの利用
17.5 さまざまなcatch構文 666
  17.5.1 try-catch構文の基本形
  17.5.2 2種類以上の例外をキャッチする
  17.5.3 ザックリと例外をキャッチする方法
  17.5.4 後片付け処理への対応
  17.5.5 close( )にまつわる複雑なエラーと解決方法
    ①「変数fwが見つからない」エラーを解決する
    ②「new FlieWriter( )をtry-catchしてない」エラーを解決する
    ③「初期化されていない変数fwを利用する可能性がある」エラーを解決する
    ④「fw.closeをtry-catchしてない」エラーを解決する
    ⑤「NullPointerExceptionの発生」に対応する
  17.5.6 自動的にcliose()が呼ばれるtry-catch文
17.6 例外の伝播 680
  17.6.1 mainメソッドで例外をキャッチしないと…
  17.6.2 チェック例外の伝播とスロー宣言
17.7 例外を発生させる 685
  17.7.1 例外的状況をJVMに報告する
  17.7.2 オリジナル例外クラスの定義
17.8 第17章のまとめ 689
17.9 練習問題 690
17.10 練習問題の解答 691


第18章 まだまだ広がるJavaの世界 
18.1 ファイルを読み書きする 694
  18.1.1 ストリーム
  18.1.2 ファイルから文字を読み込む
  18.1.3 ファイルへ文字を書き込む
18.2 インターネットにアクセスする 697
  18.2.1 Webページを取得する
18.3 データベースを操作する 699
  18.3.1 データベースとSQL
18.4 ウィンドウアプリケーションを作る 701
  18.4.1 CUIGUI
18.5 スマートフォンアプリを作る 703
  18.5.1 携帯端末で動くJavaプログラム
18.6 Webサーバで動くJavaプログラム 705
  18.6.1 Webアプリケーションとは
  18.6.2 Javaで作るWebアプリケーション

さらなる高みを目指して―― 708


付録
付録A ローカル開発環境のセットアップと利用 709
  A.1 ローカル開発環境の種類と構成 710
    A.1.1 Javaの開発に必要なルール
    A.1.2 JDK単体を用いる方法
    A.1.3 統合開発環境の利用
    A.1.4 プラグイン追加済みIDEの利用
    A.1.5 ローカル開発環境を選ぶ
  A.2 コマンドプロンプトの使い方 715
    A.2.1 コマンドプロンプトとは
    A.2.2 コマンドプロンプトの起動
    A.2.3 カレントディレクトリ[current directory]
    A.2.4 ファイルの一覧表示【dirコマンド/ls -laコマンド】
    A.2.5 カレントディレクトリの変更
    A.2.6 その他の操作
  A.3 JDK単体利用による開発手順 719
    A.3.1 手順① ソースコードの作成
    A.3.2 手順② コンパイルする
    A.3.3 手順③ プログラムの実行
    A.3.4 手順④ プログラムの実行


付録B エラー解決・虎の巻74 25
  B.1 エラーとの上手なつきあい方 726
    B.1.1 エラーを解決できるようになる3つのコツ
    B.1.2 コンパイルエラーの読み方
    B.1.3 実行時エラーの読み方
  B.2 トラブルシューティング 730
    B.2.1 Javaのセットアップができない
    B.2.2 コンパイルができない(初級編)
    B.2.3 コンパイルができない(中級編)
    B.2.4 プログラムが実行できない
    B.2.5 エラーは出ないが動作がおかしい
    B.2.6 文字列の操作
    B.2.7 日付情報の操作
    B.2.8 コレクション
  B.3 エラーメッセージ別索引 746


付録C クイックリファレンス 747
  C.1 代表的な構文 748
  C.2 予約語 751
  C.3 演算子 752
  C.4 正規表現 753
  C.5 エスケープシーケンス 754
  C.6 ACSII 文字コード 755


INDEX [757-765]
奥付 [766]



【コラム一覧】
スッキリわかるシリーズ 005
QRコードでdokojava にアクセスしよう 019
バイトコード仮想マシン 060
整数リテラルに関する応用記法 065
++や-は、ほかの演算子と一緒に使わない! 075
整数型としてのchar型 081
Java言語仕様をのぞいてみよう 085
円記号とバックスラッシュ 096
条件式の短絡評価 115
数学の表現とJava 条件式の表現 116
三項条件演算子 137
配列のlength と文字列のlength()  171
メソッド名の表記について 191
メソッドのシグネチャ 208
JARファイル 232
デフォルトパッケージ 235
import 宣言はあくまでも「入力軽減機能」 240
似ているようで異なるjavac と java の引数 249
クラスロードは必要なときに必要なものだけ 261
クラスパスに自動的に加わるAPI 267
「考え方」「捉え方」の違いが世界を変えることもある 280
thisは省略しないで! 315
フィールド初期値の設定手段 367
フィールドはオーバーライドさせない! 382
親の親インスタンス部分へのアクセスは不可能! 388
コンストラクタは継承されない 404
インタフェースにおける定数宣言 439
インタフェースで利用できるメソッドの種類 451
クラスに対するアクセス修飾の定石 502
継承関係によるアクセス制御 519
同一クラス内でもアクセサ経由でアクセスする 524
getter / setter を用いた増減のイディオム 524
System.out.println()の中身 532
staticインポート文 554
String・char配列・byte配列の相互変換 565
メソッドチェーン 573
可変長引数 577
java.sql.Dateと混同しない 580
和暦を扱う API 590
Collectionインタフェース 637
CollectionsクラスとArraysクラス 641
ローカル変数の型推論 645
例外をもみ消さない 684
さまざまなモノにつながるストリーム 698
VM上で動作するJava以外の言語 704
さまざまなJDK 714
JREJava Runtime Enviroment]とは 718
Java の進化の歴史 723




【メモランダム】
・玄人目線で入門書を比較すると、この本にもキズはあるようだ。以下は一例。
https://twitter.com/kis/status/1499315606872494081

『オブジェクト指向の考え方――概念から学べる開発のエッセンス 5th Edition』(Matt Weisfeld[著] 神林靖[訳] インプレス 2020//2019)

原題:Object-Oriented Thought Process, 5th Edition.
著者:Matt A. Weisfeld  ソフトウェア開発、システム管理。
訳者:神林 靖[かんばやし・やすし] (1958-) 計算理論、分散システム。
出版社:インプレス
シリーズ:impress top gear
NDC:007.61 情報科学 >> データ処理.情報処理 >> システム分析.システム設計
件名:オブジェクト指向プログラミング


オブジェクト指向の考え方 5th Edition - インプレスブックス


【目次】
まえがき [iii-vii]
  本書の範囲
  第5版で新しくなったこと
  対象読者
  本書のアプローチ
  本書で使用するソースコード
訳者まえがき(2020年5月 神林靖) [viii-ix]
著訳者紹介 [ix]
目次 [x-xv]


Chapter 1 オブジェクト指向概念への招待 001
1.1 基本概念 002
1.2 オブジェクトとレガシーシステム 003
1.3 手続き型プログラミングとオブジェクト指向プログラミング 005
1.4 手続き型開発からオブジェクト指向開発への移行 009
  1.4.1 手続き型プログラミング
  1.4.2 オブジェクト指向プログラミング
1.5 オブジェクトとは何か 011
  1.5.1 オブジェクトのデータ
  1.5.2 オブジェクトの振舞い
1.6 クラスとは何か 017
  1.6.1 オブジェクトの生成
  1.6.2 属性
  1.6.3 メソッド
  1.6.4 メッセージ
1.7 視覚化ツールとしてクラス図を使用する 021
1.8 カプセル化とデータ隠蔽 022
  1.8.1 インタフェース
  1.8.2 実装
  1.8.3 インタフェース / 実装パラダイムの実世界の例
  1.8.4 インタフェース / 実装パラダイムのモデル
1.9 継承 026
  1.9.1 スーパークラスとサブクラス
  1.9.2 抽象化
  1.9.3 is-a 関係
1.10 ポリモーフィズム 031
1.11 コンポジション 035
  1.11.1 抽象化
  1.11.2 has a 関係
1.12 まとめ 036


Chapter 2 オブジェクトを用いて考える 039
2.1 インタフェースと実装の相違を理解する 041
  2.1.1 インタフェース
  2.1.2 実装
  2.1.3 インタフェースと実装の例
2.2 抽象的な考え方を使ってインタフェースを設計する 049
2.3 真に最小限のユーザーインタフェースを提供する 051
  2.3.1 ユーザーを決定する
  2.3.2 オブジェクトの振舞い
  2.3.3 環境による制約
  2.3.4 パブリックインタフェースを特定する
  2.3.5 実装を特定する
2.4 まとめ 055
参考文献 056


Chapter 3 オブジェクト指向概念の詳細 057
3.1 コンストラクタ 058
  3.1.1 コンストラクタはいつ呼び出されるか
  3.1.2 コンストラクタには何があるのか
  3.1.3 デフォルトコンストラク
  3.1.4 複数のコンストラクタを使用する
    メソッドオーバーロード
    UMLを使ってクラスをモデル化する
    スーパークラスはどのように構成されるか
  3.1.5 コンストラクタの設計
3.2 エラー処理 067
  3.2.1 問題を無視する
  3.2.2 問題を検出してアプリケーションを終了する
  3.2.3 問題を検査して回復を試みる
  3.2.4 例外をスローする
3.3 スコープの重要性 071
  3.3.1 局所属性
  3.3.2 オブジェクト属性
  3.3.3 クラス属性
3.4 演算子オーバーロード 078
3.5 多重継承 079
3.6 オブジェクトの操作 080
3.7 まとめ082
参考文献 083


Chapter 4 クラス解剖 085
4.1 クラスの名前 086
4.2 コメント 088
4.3 属性 089
4.4 参照を渡す 091
4.5 コンストラクタ 091
4.6 アクセスメソッド 094
4.7 パブリックインタフェースメソッド 097
4.8 プライベート実装メソッド 098
4.9 まとめ 099
参考文献 099


Chapter 5 クラス設計のガイドライン 101
5.1 実世界システムをモデル化する 102
5.2 パブリックインタフェースを特定する 104
  5.2.1 最小限のパブリックインタフェース
  5.2.2 実装を隠蔽する
5.3 頑健なコンストラクタを(デストラクタも)設計する 107
5.4 クラス中にエラー処理を設計する 108
  5.4.1 クラスのドキュメント化とコメントの使用
  5.4.2 協調を意図したオブジェクトを構成する
5.5 再利用を意識して設計する 109
5.6 拡張を意識して設計する 110
  5.6.1 記述的な名前をつける
  5.6.2 移植不能なコードをカプセル化する
  5.6.3 オブジェクトのコピーと比較の方法を提供する
  5.6.4 スコープをできるだけ小さく保つ
5.7 保持性を意識して設計する 114
  5.7.1 開発プロセスを繰り返す
  5.7.2 インタフェースをテストする
5.8 永続オブジェクトを使用する 118
  5.8.1 オブジェクトの直列化とマーシャリング
5.9 まとめ 120
参考文献 120


Chapter 6 オブジェクトを用いて設計する 123
6.1 設計ガイドライン 124
  6.1.1 適切な分析を施す
  6.1.2 作業範囲記述書を作成する
  6.1.3 要求事項を収集する
  6.1.4 システムプロトタイプを開発する
  6.1.5 クラスを特定する
  6.1.6 各クラスの役割を決定する
  6.1.7 クラスの相互作用を決定する
  6.1.8 システムを記述するクラスモデルを生成する
  6.1.9 コードを使ってユーザーインタフェースのプロトタイプを生成する
6.2 オブジェクトラッパー 131
  6.2.1 構造型のコード
  6.2.2 構造型のコードをラッピングする
  6.2.3 移植不能なコードをラッピングする
  6.2.4 既存のクラスをラッピングする
6.3 まとめ 139
参考文献 139


Chapter 7 継承とコンポジションをマスターする 141
7.1 オブジェクトを再利用する 142
7.2 継承 143
  7.2.1 汎化と特化
  7.2.2 設計上の決定
7.3 コンポジション 150
  7.3.1 UMLコンポジションを表す
7.4 なぜカプセル化オブジェクト指向の基本なのか 154
  7.4.1 継承はどのようにカプセル化を損なうか
  7.4.2 ポリモーフィズムの詳細な例
  7.4.3 オブジェクトの役割
  7.4.4 抽象クラス、 仮想メソッド、プロトコル
7.5 まとめ 165
参考文献 166


Chapter 8 フレームワークと再利用:インタフェースと抽象クラスを使って設計する 167
8.1 コード:再利用すべきかすべきでないか 168
8.2 フレームワークとは何か 169
8.3 契約とは何か 171
  8.3.1 抽象クラス
  8.3.2 インタフェース
  8.3.3 すべてを統合する
  8.3.4 コンパイラによる検証
  8.3.5 契約を締結する
  8.3.6 システムプラグインポイント
8.4 eビジネスの例 187
  8.4.1 eビジネスの課題
  8.4.2 再利用しないアプローチ
  8.4.3 eビジネスソリューション
  8.4.4 UML オブジェクトモデル
8.5 まとめ 197
参考文献 197


Chapter 9 オブジェクトの構築とオブジェクト指向設計 199
9.1 コンポジション関係 201
9.2 段階的に構築する 203
9.3 コンポジションの型 205
  9.3.1 集約
  9.3.2 関連
  9.3.3 関連と集約を併用する
9.4 依存関係を避ける 208
9.5 多重度[cardinality] 210
  9.5.1 複数オブジェクト関連
  9.5.2 オプションとしての関連
9.6 総まとめの例 214
9.7 まとめ 215
参考文献 216


Chapter 10 デザインパターン 217
10.1 なぜデザインパターンなのか 219
10.2 Smalltalk のモデル/ビュー/コントローラ 220
10.3 デザインパターンの型 222
  10.3.1 生成に関するパターン
    ファクトリメソッドデザインパターン
    ファクトリメソッドパターン
  10.3.2 構造に関するパターン
    アダプタ
  10.3.3 振舞いに関するパターン
    イテレータ
    
    
10.4 アンチパターン 234
10.5 まとめ 235
参考文献 235


Chapter 11 依存関係と強く結合したクラスの回避 237
11.1 コンポジションと継承、そして依存関係の注入 240
  11.1.1 1) 継承
  11.1.2 2) コンポジション
  11.1.3 依存関係の注入
11.2 まとめ 251
参考文献 251


Chapter 12 オブジェクト指向設計のSOLIDの原則 253
12.1 オブジェクト指向設計のSOLID の原則 255
  1) 単一役割の原則 (Single Responsibility Principle、SRP)
  2) オープン/クローズの原則 (Open/Close Principle、OCP)
  3) リスコフ置換の原則 (Liskov Substitution Principle、LSP)
  4) インタフェース分割の原則 (Interface Segregation Principle、IPS)
  5) 依存関係の逆転の原則 (Dependency Inversion Principle、DIP)
12.2 まとめ 277
参考文献 278


索引 [280-286]




【抜き書き】


・p. iv

プログラマ採用のインタビューで頻繁に目にすることなのだが、C++プログラマだと主張する開発者が、単に C++ コンパイラを使っているだけのCプログラマであることはよくある。C#.NET、VB.NETObjective-C、Swift、Java といった言語が普及している今日でも、ジョブインタビューで若干の質問をするだけで、 オブジェクト指向についての理解が欠けていることがわかってしまうことも珍しくない。
 〔……〕より悲劇(喜劇)的なことに、中途半端にオブジェクト指向の機能を使用することで、オブジェクト指向プログラマにも理解できないし、非オブジェクト指向プログラマにも理解できないような困ったプログラムを作成するプログラマもいる。
 したがってオブジェクト指向開発環境の使用法を学ぶことも重要であるが、最初に行うべきことは、基本的なオブジェクト指向概念の修得である。読者におかれては、プログラミング言語の使用に飛びつきたいという情動を抑えて、オブジェクト指向の思考プロセスを学ぶことに時間を費やすことをお勧めしたい。

『オブジェクト指向でなぜつくるのか[第3版]――知っておきたいOOP、設計、アジャイル開発の基礎知識』(平澤章 日経BP 2021//2004)

著者:平澤 章[ひらさわ・あきら] システム開発。技術書の執筆・翻訳。(株)ウルシステムズ所属。
寄稿:平鍋 健児[ひらなべ・けんじ] システム開発。技術書の翻訳。(株)永和システムマネジメント 代表取締役
寄稿:小森 裕介[こもり・ゆうすけ] システム開発。著書に『なぜ,あなたはJavaオブジェクト指向開発ができないのか』など。
装丁:折原 若緒
イラスト:葉波 高人 (有)桜デザイン工房


オブジェクト指向でなぜつくるのか 第3版 - サポートページ
オブジェクト指向でなぜつくるのか 第3版 | 日経BOOKプラス


【目次】
推薦のことば(平鍋健児) [001-002]
推薦のことば(小森裕介) [003-004]
まえがき(2021年2月 平澤章) [005-006]
本書の構成 [007-009]
キーワード [010-011]
目次 [012-017]
各章の構成 [018]


第1章 オブジェクト指向はソフトウエア開発を楽にする技術 019
  オブジェクト指向はソフトウエア開発の総合技術
  モノ中心にソフトウエアを組み上げる開発手法
  プログラミング言語から総合技術に進化した
  オブジェクト指向が難しい理由
  理由その 1 ――プログラミング言語の仕組みが複雑
  理由その 2 ――比喩を使った説明による混乱
  理由その 3 ――オブジェクト指向というコンセプトが 抽象的
  オブジェクト指向技術のwhatとwhyを説明する
  本書の構成
  [COLUMN]今ドキのOOP:とっつきやすくて、奥の深いPython 032


第2章 オブジェクト指向と現実世界は似て非なるもの 035
  オブジェクト指向を現実世界に対比して説明する
  クラスは種類、インスタンスは具体的なモノ
  ポリモーフィズムはメッセージの送り方を共通にする
  継承は共通点と相違点を体系的に分類して整理する
  比喩を強調した説明は混乱 を招きやすい
  オブジェクト指向と現実世界は似て非なるもの
  プログラミングのための仕組みと割り切って理解する
  そもそもソフトウエアは現実世界をそのまま表現しない
  現実世界と似ていることが可能性を広げた
  [COLUMN]オブジェクトの向こう側:バズワードになったオブジェクト指向 050


第3章 OOPを理解する近道はプログラミング言語の歴史にあり 053
  OOPは必然性を持って登場した
  黎明期には機械語でプログラムを書いていた
  プログラミング言語の最初の一歩はアセンブリ言語
  高級言語の発明でプログラムはより人間に近づいた
  わかりやすさを重視する構造化プログラミング
  サブルーチンの独立性を高めて保守に強くする
  GOTOレスプログラミングを実現する構造化言語
  進化の方向は保守性と再利用性重視に変化した
  残された課題はグローバル変数問題と貧弱な再利用
  [COLUMN]プログラミング昔話:COBOLコンパイラのニワトリとタマゴの話 072


第4章 OOPは無駄を省いて整理整頓するプログラミング技術 075
  OOPが持つ構造化言語にはない3つの仕組み
  OOPの仕組みは言語ごとに微妙に異なる
  三大要素1 ――クラスに備わる3つの仕組み
  クラスの効能 1 ――まとめる
  クラスの効能 2 ――隠す
  クラスの効能 3 ――たくさん作る
  インスタンス変数は「仲間内だけのグローバル変数
  三大要素2 ――呼び出す側を共通化するポリモーフィズム
  三大要素3 ――クラス定義の重複を排除する継承
  三大要素のまとめ
  型にはめられるとプログラマは楽になる
  クラスを型として利用する
  プログラミング言語は「退化」した?
  さらに進化したOOPの仕組み
  進化したOOPの仕組み1 ――パッケージ
  進化したOOPの仕組み2 ――例外
  進化したOOPの仕組み3 ――ガベージコレクション
  [COLUMN]今ドキのOOP:ホームページツールから進化したPHP 120


第5章 メモリの仕組みの理解はプログラマのたしなみ 123
  OOPのプログラムが動く仕組みを理解しておこう
  コンパイラインタプリタの2つの実行方式
  中間コードを解釈して実行する仮想マシン
  CPUは複数のスレッドを掛け持ちで実行する
  静的領域、ヒープ領域、スタック領域で管理
  OOPの特徴はメモリの使い方にあり
  クラス情報はクラスにつき1つだけロードする
  インスタンス生成のたびにヒープ領域が使われる
  変数はインスタンスの「ポインタ」が格納される
  インスタンスを格納する変数のコピーに要注意
  ポリモーフィズムは異なるクラスが同じ顔を見せる
  継承される情報の種類 によってメモリ配置は異なる
  孤立したインスタンスはガベージコレクタが処分する
  [COLUMN]プログラミング昔話:OOPはダンプが見づらい? 160


第6章 OOPがもたらしたソフトウエアとアイデアの再利用 163
  OOPの優れた仕組みにより再利用が進んだ
  クラスライブラリはOOPのソフトウエア部品群
  標準のクラスライブラリは言語仕様の一部
  Objectクラスを頂点とする継承構造
  フレームワークにはさまざまな意味がある
  フレームワークはアプリケーションの半完成品
  世界中で再利用されるソフトウエア部品群
  独立性の高い部品を意味するコンポーネント
  デザインパターンは優れた設計のアイデア
  デザインパターンはクラスライブラリ探検の道しるべ
  設計以外の分野にも広がるアイデアの再利用
  クラスライブラリやパターンで知る再利用の恩恵
  [COLUMN]今ドキのOOPRailsフレームワークでブレークしたRuby 184


第7章 汎用の整理術に化けたオブジェクト指向 187
  ソフトウエアは現実世界をそのまま表現しない
  集合論と役割分担に応用された
  上流工程で「汎用の整理術」に化けた
  2つの意味を持つことが混乱をもたらした
  プログラミング技術と整理術に分けて考える
  なぜ汎用の整理術に化けたのか
  [COLUMN]オブジェクト指向の向こう側:言語が先か、コンセプトが先か 200


第8章 UMLは形のないソフトウエアを見る道具 203
  UMLはソフトウエアの機能や構造を表す図の描き方
  UMLには13種類のダイアグラムがある
  UMLの使い方は大きく3つある
  UMLの使い方 1 ――プログラム構造や動作を表現
  クラス図でOOPのプログラム構造を表現
  シーケンス図とコミュニケーション図で動きを表現
  UMLの使い方 2 ――汎用の整理術の成果物を表現
  集合論で整理した結果をクラス図で表現
  役割分担はシーケンス図とコミュニケーション図
  UMLの使い方 3 ――非オブジェクト指向を表現
  ユースケース図でコンピュータに任せる仕事を表現
  仕事の流れをアクティビティ図で表現
  状態の変化をステートマシン図で表現
  自然言語とコンピュータ用言語の欠点を補う「言語」


第9章 現実世界とソフトウエアのギャップを埋めるモデリング 233
  現実世界とソフトウエアにはギャップがある
  得意技は「決まり切った仕事」と「覚える仕事」
  業務分析、要件定義、設計でギャップを埋める
  モデリングは3ステップを円滑に進めるための技術
  アプリケーションによってモデリングの内容は変わる
  ビジネスアプリケーションは現実の出来事を記録する
  図書館の貸出業務そのものをモデリングする
  図書館業務をユースケース図で表現する
  図書館システムの情報を概念データモデルで表現する
  ビジネスアプリではデータ構造が現実世界を写し取る
  組み込みソフトウエアは現実世界の仕事を置き換える
  組み込みソフトウエアでは装置の研究開発が重要
  全自動で動作する様子をステートマシン図で表現
  組み込みソフトウエアは単調な仕事をひたすら実行
  モデリングにはソフトウエア開発の醍醐味がある


第10章 擬人化して役割分担させるオブジェクト指向設計 261
  設計が対象とする範囲は広く深い
  実行効率よりも保守性や再利用性が重視される時代
  設計の目標 1 ――重複を排除する
  設計の目標 2 ――部品の独立性を高める
  部品の独立性を高めるコツ
  設計の目標 3 ――依存関係を循環させない
  ブジェクト指向設計の感覚は擬人化と役割分担
  役割分担されたソフトウエア が作る奇妙な世界
  [COLUMN]今ドキのOOP:クラスに縛られずに動くJavaScript 278


第11章 オブジェクト指向から生まれたアジャイル開発 281
  技術やノウハウだけでソフトウエア開発は成功しない
  作業手順や成果物を体系的にまとめた開発プロセス
  変更を抑えるウォーターフォール開発プロセス
  ウォーターフォール開発プロセスの限界
  変化に柔軟に対応するための反復型開発プロセス
  多くのタブーを破ったXP
  チームによる仕事の進め方の枠組みを定めたスクラム
  優れたソフトウエアを手早く作るためのアジャイル宣言
  アジャイル開発を支えるプラクティス
  テストコードを先に書いて動かしながら開発するTDD
  [COLUMN]プログラミング昔話:昔は許されなかったXP 304


第12章 オブジェクト指向を使いこなそう 307
  オブジェクト指向を使いこなそう
  オブジェクト指向という強力なコンセプトが原動力
  時代がオブジェクト指向に追いついた
  オブジェクト指向はブームで終わらない
  オブジェクト指向を使いこなそう
  知的なソフトウエア開発を楽しもう


補章 関数型言語でなぜつくるのか 317
  関数型言語でなぜつくるのか
  オブジェクト指向と関数型のハイブリッドが主流の時代
  関数型言語の7つの特徴
  特徴1:関数でプログラムを組み上げる
  特徴2:すべての式が値を返す
  特徴3:関数を値として扱える
  特徴4:関数と引数を柔軟に組み合わせることができる
  特徴5:副作用を起こさない
  特徴6:場合分けと再帰でループ処理を記述する
  特徴7:コンパイラが型を自動的に推測する
  7つの特徴のまとめ
  関数型言語の分類
  関数型言語のメリット
  関数型言語の課題
  関数型言語オブジェクト指向の関係
  関数型プログラミングを身につけよう
  [COLUMN]今ドキのOOP関数型言語の箱庭を用意したJava 360


あとがき [362-363]
索引 [364-369]
著者プロフィール [370]

『Javaで学ぶ自然言語処理と機械学習』(杉本徹 岩下志乃 オーム社 2018)

著者:杉本 徹[すぎもと・とおる] 自然言語処理人工知能
著者:岩下 志乃[いわした・しの] 感性情報処理、自然言語処理ユーザーインターフェース
カバーデザイン:オガワヒロシ(V Ariant design)
NDC:007.636 情報科学 >> コンピュータ・システム.ソフトウェア >> 機械翻訳


Javaで学ぶ自然言語処理と機械学習 | Ohmsha


【目次】
はじめに [iii-iv] 
目次 [v-vii]


1章 自然言語処理の概要 
1.1 自然言語処理とは 001
  1.1.1 自然言語処理の目的
  1.1.2 自然言語処理の歴史
  1.1.3 自然言語処理の応用例

1.2 必要な文法の知識 004
  1.2.1 日本語の階層構造
  1.2.2 格文法
  1.2.3 単語と品詞

1.3 自然言語処理における統計的手法 012

1.4 コーパス 015

演習1.1 コーパスファイルの整形(青空文庫を例にして) 017
  リスト1-1 AozoraFilter.java [020-025]

演習問題 026
  問 .1
  問 .2


2章 機械学習の基礎 
2.1 機械学習[machine learning]とは 027
  2.1.1 教師あり学習[supervised learning]
  2.1.2 教師なし学習[unsupervised learning]
  2.1.3 強化学習reinforcement learning
  2.1.4 深層学習[deep learning

2.2 分類器とその使いかた 033
  2.2.1 分類器[classifier]
  2.2.2 分類器の使用手順
    手順1 データの用意
    手順2 学習
    手順3 適用,評価
  2.2.3 分類器の評価方法

2.3 ナイーブベイズ分類器[naive Bayes classifier] 039
  2.3.1 概要
  2.3.2 使用手順
    学習
    適用

演習2.1 ナイーブベイズ分類器の実装 042

2.4 サポートベクトルマシン[SVMSupport Vector Machine] 054
  2.4.1 概要
  2.4.2 使用手順
    学習
    適用
  2.4.3 カーネル法[kernel method]

演習2.2 サポートベクトルマシンの利用 060

2.5 ニューラルネットワーク[neural network] 065
  2.5.1 概要
  2.5.2 誤差逆伝播[backpropagation]学習
  2.5.3 使用手順
    学習
    適用

演習2.3 ニューラルネットワークによる分類 070

演習問題 078
  問 2.1
  問 2.2


3章 自然言語テキストの解析 
3.1 解析処理の概要 079
  3.1.1 形態素解析[morphological analysis]
  3.1.2 構文解析[syntactic analysis]
  3.1.3 意味解析[semantic analysis]
  3.1.4 文脈解析[context analysis]

3.2 形態素解析 090
  3.2.1 ラティス構造[lattice structures]とコスト最小法[minimum connective-cost method]
  3.2.2 単語N-gramとコスト推定
  3.2.3 隠れマルコフモデル[HMM:Hidden Markov Model]に基づくコスト推定
  3.2.4 ビタビアルゴリズム[viterbi algorithm]

演習3.1 MeCabによる形態素解析 097
  MeCab.java
  Word.java
  TestMeCab.java
演習3.2 MeCabを用いたN-gramの計算 107
  TestNgram.java
  Counter.java
  Word.java
  Bigram.java
3.3 係り受け解析 115

演習3.3 CaboChaによる係り受け解析 115
  CaboCha.java
  Chunk.java
  Word.java
  TestMeCab.java
演習問題 128
  問 3.1
  問 3.2
  参考


4章 自然言語の意味理解 
4.1 意味理解とは 129
  4.1.1 意味理解の必要性
  4.1.2 単語の意味
  4.1.3 文の意味
  4.1.4 文章の意味
  4.1.5 意味に対する操作
    ①フィルタリング
    ②推論
    ③類似性判定

4.2 概念体系とシソーラス 137
  4.2.1 単語と概念の関係
  4.2.2 概念の体系化とシソーラス[thesaurus]
  4.2.3 WordNet
  4.2.4 シソーラスに基づく単語の類似度の定義
  4.2.5 概念体系やシソーラスに基づく方法の問題点

演習4.1 日本語WordNetを使ってみる 144
  公式Webサイトでの検索方法
  使用例① WordNetの最上位層を確認する
  使用例② 2つの単語の類似度を求める

4.3 単語の共起関係と意味 148
  4.3.1 分布意味論[distributional semantics]
  4.3.2 共起語[co-occurred terms]と自己相互情報量[PMI:pointwise mutual information]
  4.3.3 分布類似度[distributional similarity]
  4.3.4 共起語ベクトルに基づく方法の問題点

演習4.2 共起語を求める 153

4.4 単語の分散表現[distributed representation] 160
  4.4.1 概要
  4.4.2 skip-gramとCBOW[Continuous Bag-Of-Words]
  4.4.3 単語分散表現の特徴

演習4.3 単語分散表現の利用 165
  ①単語分散表現データの用意
  ②単語分散表現データを利用するJavaプログラム

4.5 文の意味解析 179
  4.5.1 概要
  4.5.2 格フレーム辞書の利用
  4.5.3 機械学習の利用

演習問題 184
  問 4.1
  問 4.2
  問 4.3
  問 4.4
  問 4.5


5章 自然言語処理の応用 
5.1 応用技術の概要 185
  5.1.1 情報検索とその関連技術 186
    情報検索[information retrieval]
    情報推薦
    質問応答
  5.1.2 文書処理 188
    文書分類
    文書クラスタリング
    文書要約
  5.1.3 テキスト分析 189
    情報抽出
    評判分析
    テキストマイニング
  5.1.3 対話システム[dialogue system] 190
  5.1.4 機械翻訳[machine translation] 190

5.2 文書のモデル化と情報検索 191
  5.2.1 情報検索の概要
  5.2.2 文書のモデル化
  5.2.3 単語の重要度とTF-IDF[term frequency–inverse document frequency]法
  5.2.4 情報検索のモデル
    ブーリアンモデル
    ベクトル空間モデル
  5.2.5 情報検索システムの評価
  5.2.6 Web検索

演習5.1 文書中の重要語を求める 207

5.3 文書分類 212
  5.3.1 文書分類の概要
  5.3.2 文書分類の方法
    辞書に基づく方法
    機械学習を用いる方法
  5.3.3 評判分析
    
演習5.2 経験を述べた文のポジネガ分類 216

5.4 対話システム 220
  5.4.1 対話システムの概要
  5.4.2 対話システムの類型
    対話の目的
    対話の主導権
    入出力のモダリティ
  5.4.3 対話システムの実現方法
    状態遷移方式
    知識駆動方式
    プランに基づく方式
    雑談に適した方式
    機械学習の利用

演習5.3 簡単な雑談対話システム 230

演習問題 242
  問 5.1
  問 5.2
  問 5.3
  問 5.4
  問 5.5


付録 Javaについて 
a.1 Javaの概要 245
a.2 開発環境の準備と実行方法 246
  a.2.1 コマンドラインから実行する方法
  a.2.2 統合開発環境を利用する方法
a.3 Javaプログラムの構成 249
a.4 本書で使用する標準ライブラリ機能 251
  a.4.1 文字列(String)
  a.4.2 リスト(List,ArrayList
  a.4.3 マップ(Map,HashMap)
  a.4.4 ストリーム入出力(ファイル,プロセスなど)
a.5 トラブルシューティング 255


参考文献 [257]
索引 [258-262]





【メモランダム】

・誤植について。本書の第5章第1節の構成を示す数字に重複を発見したので、上記目次では変更してある(第1版第1刷で確認した)。

  [変更前
  5.1.3 テキスト分析 189
    情報抽出
    評判分析
    テキストマイニング
  5.1.3 対話システム 190
  5.1.4 機械翻訳 190

  ↓ 

  [変更後
  5.1.3 テキスト分析 189
    情報抽出
    評判分析
    テキストマイニング
  5.1.4 対話システム 190
  5.1.5 機械翻訳 190

『Ctrl+Z ――忘れられる権利』(Meg Leta Jones[著] 加藤尚徳, 高崎晴夫, 藤井秀之, 村上陽亮[訳] 勁草書房 2021//2016)

原題:CTRL+Z: The Right to be Forgotten (NYU Press 2016)
著者:Meg Leta Jones 情報法(デジタル情報とコンピューティング技術におけるプライバシーやイノベーションなど)
監訳・解説:石井 夏生利[いしい・かおり]  情報法、プライバシー・個人情報保護法
訳者:加藤 尚徳[かとう・なおのり] 情報学。KDDI総合研究所 アナリスト。
訳者:高崎 晴夫[たかさき・はるお] 経済学。KDDI総合研究所 研究員。
訳者:藤井 秀之[ふじい・ひでゆき] 公共政策学。NRIセキュアテクノロジーズ セキュリティコンサルタント
訳者:村上 陽亮[むらかみ・ようすけ] KDDI総合研究所 執行役員 KDDI research atelier フューチャーデザイン1部門長。
装丁:吉田 憲二[よしだ・けんじ] 


Ctrl+Z 忘れられる権利 - 株式会社 勁草書房



【目次】
謝辞 [i-iii]
目次 [v-vii]


序章 001
  忘れられる権利
  デジタル贖罪
  文化的特異性
  本書の議論と注意事項


第一章 忘れることが容易になったEU 029


第二章 忘れることが不可能になったアメリカ 059


第三章 プライバシーの革新 089


第四章 デジタル情報スチュワードシップ 113


第五章 法文化におけるCtrl+Z 149


第六章 国際コミュニティにおけるCtrl+Z 179
  まとめ(ペーパーバック版) 206


解説(石井 夏生利) 211
 I はじめに 211
 II 「忘れられる権利」に関するCJEU先決判決 212
  1 コステハ判決(2014年)
    (1) 根拠規定
    (2) 事案の概要
    (3) 先決判決の要旨
  2 地理的範囲に関する判決(2019年)
    (1) 根拠規定
    (2) 事案の概要
    (3) 先決判決の要旨
  3 Google 2判決(2019)
    (1) 根拠規定
    (2) 事案の概要
    (3) 争点と判断
      ①データ保護指令の適用範囲
      ②削除義務
      ③「特別な種類の個人データ」の範囲及び古い情報の削除義務
 III GDPRの「忘れられる権利」とその解釈 224
  1 GDPR第一七条と解釈指針の公表
  2 指針の概要
    (1) GDPRに基づく検索結果削除請求権の根拠
    (2) 第一七条三項に基づく削除請求権の例外
注 229


原注 [xxiii-li]
文献 [vii-xxii]
人名索引 [iv-vi]
事項索引 [ii-iii]
著者・訳者紹介 [i]





【抜き書き】
 「序章」から。強調は引用者による。


・キーとしての「発見可能性」について。

 情報法学者のビクター・マイヤー゠ショーンベルガーは、個人的な生活の詳細をデジタル化し、開示することは、「すべての過去の行動を永遠につなぎ、実際にそこから逃げ出すことが不可能になる」と警告している。その鎖は、実は発見可能性の詳細な構造で、無数の技術的で社会的な出来事に基づく発見可能性の仕組みの細部である。ウェブページのダウンロードや、電子メールの送信、ファイルの転送などのすべてのインターネット通信は、他のコンピュータに接続し、データをパケット(基本情報単位)に分割し、それらをTCP/IP標準を使用して目的の宛先に送信することによって実現される。

 デジタル情報への依存は、ビット腐敗データ腐敗およびリンク腐敗のすべてに翻弄されることになる。ビット腐敗とは、時間の経過とともにソフトウェアが劣化することを指す。最新のコンピュータにはフロッピーディスクドライブはなく、多くはコンパクトディスクドライブすら有していない〔……〕。データ腐敗またはデータ減衰とは、フロッピーディスク上のビットの帯磁方向の喪失や、半導体ドライブ(SSD)内のビットの電荷の喪失など、記憶媒体の減衰を指す。デジタルデータを格納する機能を増強できるシステムも、訂正、検出されていないデータ破損の可能性を高めることが示されている。リンク腐敗は、ハイパーリンクがもともと参照されていたウェブサイトがもはや存在しなくなったときに、ハイパーリンクが機能せずリンク腐敗が発生する。ウェブページの平均寿命は約一〇〇日だ〔……〕。紙からデジタルへの移行は、発見可能性の向上による利点と欠点があり、情報がデジタル形式で保存される際は、人間の読み手のために内容を解釈するようコンピュータに要求するという異なるライフサイクルを有することになる。
 発見可能性が高まることの利点は、過大評価されることがめったにない。市民の参加と政府の説明責任の向上〔……〕、商業的可能性などが約束されていることから、当然のことながらわれわれを共有に駆り立てる。一方で、発見可能性の低下という危機はほとんど認識されていないが、データに基づいた進歩の約束を果たすためにも、デジタル記憶の問題の枠組みを作るためにも、極めて重要である。このデータ主導の動きは可もなく不可もないが、何を保存すべきか、何を一時的に残しておくかを決めるためには、限界があり、価値が再評価され、再構築されなければならない。
 デジタル情報の発見可能性の向上と永続性の増大に対する激しい非難は、筆者がデジタル贖罪(digital redemption)またはデジタル再創造(digital reinvention)と呼ぶものに対する需要を呼び起こした。これらは、対象者の要求に応じてデジタル公共情報を私的情報に変換し、個人を発見可能な個人情報から解放する意志と手段を指す。デジタル再創造の法的実装は、忘れられる権利であり、「もう終わった過去の出来事について沈黙させる権利」として説明される。この広い概念は議論を呼び、「歴史の書き換え」や、「個人史の修正主義」、あるいは単に「検閲」と呼ばれてきた。

・再びMayer-Schönbergerの(過去の超克法としての「忘却」にかんする)記述をひき、著者がそこに「赦し」を加える。

  デジタル贖罪

 マイヤー゠ショーンベルガーは、ユビキタス・コンピューティング時代において、何を、どのように記憶すべきかに関する変化について論じている。〔……〕。つまり、「忘れることが例外となり、記憶することがデフォルトとなった」。人間の記憶にはさまざまな長所があり、記憶の誤りやすさによって、過去の記憶の修正や忘却、文脈化がなされ、それによってわれわれは守られている。一方でデジタル記憶は、「忘れっぽい人間の精神の誤りやすい記憶と比較し、より広範囲でより正確かつ客観的である」と考えられている〔……〕。デジタル記憶は「時間の価値を無効にする」と彼は指摘する。人々は、恥ずかしい、当惑させられる過去の記憶から逃れることが難しくなり、自己改善の努力が無駄になる。インターネットは外部記憶にとって不可欠な装置であると同時に、人々が新たなコミュニティに移り新しい自分を再構築しやり直すことを阻むものでもある。要するに、デジタル記憶は、過去を忘れることができないため、社会が過去を乗り越えることを妨げる。
 ショーンベルガーは、記憶がどのように変化し、なぜ忘れることが心理的な健康にとって認知的に重要なのかについて分析したが、社会的価値として現れてくるのは記憶だけではない。個人が過去を乗り越えられるよう選択することは忘れるということではない〔……〕。デジタルプライバシーとアイデンティティに関係するものとしての忘却は、デジタルな重荷から個人を解放することを意味する。個人が過去を乗り越えることはより大きな文化の志向するところであり、赦し(forgiveness)を提供する社会的包容力であり、やり直しの機会を提供し、再構築の価値を認識するものである。

・「赦すこと」の定義と効能

 赦しの定義はさまざまだが、ほとんどの心理学者は、赦しとは罪を忘れたり、見逃したり、赦免したり、和解したり、信頼を回復したり、法的責任から解放されることでないと考えている。 これらの概念は関連しているが、同義語や定義を表すものではない。 赦しの定義の多くには規範的な意図がある。代わりに、筆者は赦しのより記述的で一般的な定義を活用する。簡単にいえば、赦しとは、否定的な感情や報復、または報復の放棄を決めることを意味する。より広義の定義は、赦しの一般的な理解を包含する。
赦しに関連する多岐にわたる利点は、報復の代替案を確立しようとする修復的司法〔犯罪によって引き起こされた被害に関して、関係当事者(加害者・被害者・コミュニティ)の話し合いにより、被害者・加害者間の関係修復を図り、加害者の反省を促して更生を助長するという考え方〕の研究分野で見ることができる
〔……〕
 赦しに関連する多岐にわたる利点は、報復の代替案を確立しようとする修復的司法〔犯罪によって引き起こされた被害に関して、関係当事者(加害者・被害者・コミュニティ)の話し合いにより、被害者・加害者間の関係修復を図り、加害者の反省を促して更生を助長するという考え方〕の研究分野で見ることができる〔……〕。

 さらに、不法行為者は他人に赦されることで恩恵を受ける。個々人は、仲間の善意を大切にしており、罪を犯した者の多くは、「自身の悪い行いに対する一片の良心を感じる」〔……〕。自身の過ちを認めることから逃げない人たちは、「赦しを求め、受け取り、自身の教訓から学ぶ可能性が高い」。赦しを得たいという願望は、健康で肯定的な変化の触媒になる可能性がある。〔……〕赦されることで心理的な癒しがもたらされ、〔……〕現実世界の派閥間の紛争解決の希望を促進する。自分自身を赦すことも有益である。自尊感情を下げ、気分の落ち込みが増大し、不安と怒りが増すことは、自己を赦すことの困難さと関連している。自身に寛容な人は、被害者との良好な関係とあわせて、後悔や自己批判、罪悪感が低いと報告されている。


・「赦すこと」が機能しない場

 赦しは個人的にも社会的にもよいことであるかもしれないが、その不法な行為を忘れられないときには、どのような赦しも得ることは困難である。〔……〕検索エンジンによって情報が永久にアクセス可能な状態にあると仮定すると、自分自身を含めて誰かを「赦す」ことは大変挑戦的なものになるかもしれない。
 インターネットは厳しい場所であり、インターネットの「永遠の記憶」は忘れるのを妨げ、それによって赦すことを妨げる。


・主張の骨子

  本書の議論と注意事項
 本書の中心的な主張は、デジタル上の忘れられる権利は、多くの可能性と将来性がある革新的なアイデアであるという点だ。このアイデアはさらに拡張、再構成、再構築される必要がある。現在検討されている極端な選択肢はデジタル贖罪についてのさまざまな考えを制限し、地域間の分極化をもたらす。 プライバシーの新しい理論を活用し、さまざまな定義を整理するために概念を分解し、問題を情報の永続性ではなく情報スチュワードシップ〔情報の管理・報告の責務〕 であると置き換えて考えることで、多数の選択肢が検討可能となる。検討時にこれらの困難な選択を行うためには、論点はデジタル言説、既存の法文化、国際社会の中に収まるように構成しなければならない。
 デジタル贖罪に関する筆者の分析アプローチは、本質的に相対的なものである。忘れられる権利はまぎれもなくEUが構築したが、EUの国境を越えてデジタル贖罪を学ぶことから多くのことを得ることができる。忘れられる権利は変化の交差するところに位置している。〔……〕このような独特な状況の中で、忘れられる権利は情報技術を取り巻く多数の大きな疑問をもたらし、民主的な情報社会の比較を行うにあたり価値ある示唆を提供する。