<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>NoccaLabs</title><description>暮らしを少し便利にするアプリを開発しています。</description><link>https://tutttuwi.github.io/</link><language>en</language><item><title>Flutterアーキテクチャについて</title><link>https://tutttuwi.github.io/posts/2026-05-31_flutter%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2026-05-31_flutter%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/</guid><description>Flutter 公式ドキュメントをもとに、レイヤー構造・3 つのツリー・レイアウトの黄金ルール・ホットリロード・ビルドモード・ドットショートハンドを具体例で解説し、理解を深める学習ロードマップをまとめる。</description><pubDate>Sun, 31 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概要&lt;/h2&gt;
&lt;p&gt;Flutter は「すべてがウィジェット（everything is a widget）」という思想のもと、宣言的・リアクティブに UI を構築するクロスプラットフォーム UI ツールキットである。
普段は &lt;code&gt;Column&lt;/code&gt; や &lt;code&gt;Container&lt;/code&gt; を組み合わせるだけで画面が作れてしまうが、「なぜ &lt;code&gt;width: 100&lt;/code&gt; を指定しても 100px にならないのか」「ホットリロードが効かないのはなぜか」「&lt;code&gt;RenderFlex overflow&lt;/code&gt; は何が起きているのか」といった疑問にぶつかったとき、その裏側の仕組みを知っているかどうかで対応力が大きく変わる。&lt;/p&gt;
&lt;p&gt;この記事では、Flutter 公式ドキュメントを要約しつつ、以下のトピックを具体例を交えて整理する。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Flutter のアーキテクチャ全体像（レイヤー構造 / 3 つのツリー / レンダリングパイプライン）&lt;/li&gt;
&lt;li&gt;Flutter 内部の仕組み（なぜ大量のウィジェットでも高速なのか）&lt;/li&gt;
&lt;li&gt;レイアウトの黄金ルール（Constraints go down. Sizes go up. Parent sets position.）&lt;/li&gt;
&lt;li&gt;ホットリロードの仕組みと効かないケース&lt;/li&gt;
&lt;li&gt;ビルドモード（debug / profile / release）&lt;/li&gt;
&lt;li&gt;ドットショートハンド構文（Dart 3.10 / Flutter 3.44）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最後に、これらを段階的に理解していくための学習ロードマップを示す。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;本記事は Flutter 3.44 時点の公式ドキュメントを参照している。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;💻 前提環境&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Flutter: 3.44 系を想定&lt;/li&gt;
&lt;li&gt;言語: Dart 3.10 以降&lt;/li&gt;
&lt;li&gt;対象読者: Flutter を触り始めた初心者〜中級者&lt;/li&gt;
&lt;li&gt;サンプルコードは説明用の簡略版&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;🏛️ Flutter のアーキテクチャ全体像&lt;/h2&gt;
&lt;h3&gt;レイヤーモデル（Framework / Engine / Embedder）&lt;/h3&gt;
&lt;p&gt;Flutter は &lt;strong&gt;拡張可能でレイヤー化されたシステム&lt;/strong&gt; として設計されている。各レイヤーは下位レイヤーに依存するが、下位レイヤーへの特権的アクセスは持たず、フレームワーク部分はすべて &lt;strong&gt;任意で置き換え可能&lt;/strong&gt; になっている。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;レイヤー&lt;/th&gt;
&lt;th&gt;主な言語&lt;/th&gt;
&lt;th&gt;役割&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Framework&lt;/td&gt;
&lt;td&gt;Dart&lt;/td&gt;
&lt;td&gt;開発者が普段触る層。ウィジェット / レイアウト / アニメーション / Material・Cupertino&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Engine&lt;/td&gt;
&lt;td&gt;C++&lt;/td&gt;
&lt;td&gt;合成済みシーンのラスタライズ、テキストレイアウト、I/O、Dart ランタイム。&lt;code&gt;dart:ui&lt;/code&gt; 経由で公開&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Embedder&lt;/td&gt;
&lt;td&gt;Java/C++（Android）, Swift/ObjC（iOS/macOS）, C++（Win/Linux）&lt;/td&gt;
&lt;td&gt;OS との橋渡し。エントリポイント / レンダリング面 / 入力 / イベントループ&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;flowchart TB
  subgraph framework [Framework Dart]
    materialCupertino[Material / Cupertino]
    widgets[Widgets]
    rendering[Rendering]
    foundation[Foundation / Animation / Painting / Gestures]
    materialCupertino --&amp;gt; widgets --&amp;gt; rendering --&amp;gt; foundation
  end
  subgraph engine [Engine C++]
    dartui[dart:ui]
    impeller[Impeller / Skia / Dart Runtime]
    dartui --&amp;gt; impeller
  end
  subgraph embedder [Embedder Platform]
    os[Android / iOS / Web / Desktop]
  end
  framework --&amp;gt; engine --&amp;gt; embedder
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Framework 層をさらに下から見ると次のように積み上がっている。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Foundation&lt;/strong&gt;: 基礎クラス、アニメーション・描画・ジェスチャなどの共通抽象&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rendering&lt;/strong&gt;: レイアウトを扱う層。レンダリング可能オブジェクトのツリーを構築する&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Widgets&lt;/strong&gt;: 合成の抽象化層。&lt;strong&gt;リアクティブなプログラミングモデルはここで導入される&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Material / Cupertino&lt;/strong&gt;: ウィジェット層の合成プリミティブを使って各デザイン言語のコントロールを実装&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Framework 自体は比較的小さく、&lt;code&gt;camera&lt;/code&gt; や &lt;code&gt;webview&lt;/code&gt; などの多くの高機能はパッケージ（プラグイン）として提供される。&lt;/p&gt;
&lt;h3&gt;アプリの構成要素&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;flutter create&lt;/code&gt; で生成される標準的なアプリは、以下のピースで構成される。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dart App&lt;/strong&gt;: ウィジェットを組み合わせて UI とビジネスロジックを実装（アプリ開発者が所有）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Framework&lt;/strong&gt;: ウィジェットツリーをシーンに合成する高レベル API&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Engine&lt;/strong&gt;: 合成済みシーンのラスタライズ。&lt;code&gt;dart:ui&lt;/code&gt; で公開し、Embedder API で各プラットフォームと統合&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Embedder&lt;/strong&gt;: OS とのやり取り、イベントループ管理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Runner&lt;/strong&gt;: Embedder のプラットフォーム固有 API を組み合わせ、実行可能なアプリパッケージにする&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;リアクティブ UI: &lt;code&gt;UI = f(state)&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Flutter は React に影響を受けた &lt;strong&gt;リアクティブ / 宣言的&lt;/strong&gt; UI フレームワークである。
開発者は「アプリの状態 → UI の対応」を記述するだけで、状態が変わったときの UI 更新はフレームワークが担う。&lt;/p&gt;
&lt;p&gt;ウィジェットは &lt;code&gt;build()&lt;/code&gt; メソッドで自身の UI を宣言する。これは状態を UI に変換する関数だと考えられる。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;UI = f(state)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;build()&lt;/code&gt; は &lt;strong&gt;副作用がなく高速&lt;/strong&gt; であることが前提で、フレームワークは必要に応じて（最悪フレームごとに）何度でも呼び出せる。&lt;/p&gt;
&lt;h3&gt;ウィジェットと「合成（Composition）」&lt;/h3&gt;
&lt;p&gt;Flutter の最大の特徴のひとつが &lt;strong&gt;積極的な合成（aggressive composability）&lt;/strong&gt; である。
たとえば「余白」は他ウィジェットのプロパティではなく、&lt;code&gt;Padding&lt;/code&gt; という独立したウィジェットになっている。中央寄せも &lt;code&gt;Align&lt;/code&gt; プロパティをいじるのではなく &lt;code&gt;Center&lt;/code&gt; ウィジェットで包む。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 中央寄せは「プロパティ」ではなく「ウィジェットで包む」
Center(
  child: Padding(
    padding: const EdgeInsets.all(16),
    child: const Text(&apos;Hello World&apos;),
  ),
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;クラス階層をあえて &lt;strong&gt;浅く広く&lt;/strong&gt; することで、小さな単機能ウィジェットの組み合わせ爆発によって表現力を確保している。
よく使う &lt;code&gt;Container&lt;/code&gt; でさえ、内部的には &lt;code&gt;LimitedBox&lt;/code&gt; / &lt;code&gt;ConstrainedBox&lt;/code&gt; / &lt;code&gt;Align&lt;/code&gt; / &lt;code&gt;Padding&lt;/code&gt; / &lt;code&gt;DecoratedBox&lt;/code&gt; / &lt;code&gt;Transform&lt;/code&gt; といったウィジェットの合成で作られている。&lt;/p&gt;
&lt;h3&gt;3 つのツリー（Widget / Element / RenderObject）&lt;/h3&gt;
&lt;p&gt;Flutter を理解するうえで最重要なのが、&lt;strong&gt;3 種類のツリー&lt;/strong&gt; が連携して動く点である。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart LR
  subgraph w [Widget Tree]
    w1[&quot;不変の設定値&amp;lt;br/&amp;gt;毎フレーム作り直し可&quot;]
  end
  subgraph e [Element Tree]
    e1[&quot;ツリー上の位置と実体&amp;lt;br/&amp;gt;State を保持・永続的&quot;]
  end
  subgraph r [RenderObject Tree]
    r1[&quot;レイアウト・描画&amp;lt;br/&amp;gt;ヒットテスト&quot;]
  end
  w --&amp;gt;|inflate| e --&amp;gt;|生成・更新| r
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ツリー&lt;/th&gt;
&lt;th&gt;性質&lt;/th&gt;
&lt;th&gt;役割&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Widget&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;不変（immutable）&lt;/td&gt;
&lt;td&gt;UI の「設定」。&lt;code&gt;build()&lt;/code&gt; が毎回新しく返す&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Element&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;永続的&lt;/td&gt;
&lt;td&gt;ウィジェットの「実体」。ツリー上の位置と State を保持&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RenderObject&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;永続的&lt;/td&gt;
&lt;td&gt;実際のレイアウト・描画・ヒットテストを担当&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;ポイントは &lt;strong&gt;Widget は使い捨て、Element は再利用される&lt;/strong&gt; という点。
&lt;code&gt;Text(&apos;A&apos;)&lt;/code&gt; を &lt;code&gt;Text(&apos;B&apos;)&lt;/code&gt; に変えると新しい Widget オブジェクトが作られるが、Element ツリーはフレームをまたいで維持され、変更があった部分だけを差分更新する。これにより「ウィジェットツリーは完全に使い捨てに見えるが、内部表現はキャッシュされている」という設計が成立する。&lt;/p&gt;
&lt;p&gt;Element には 2 種類ある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ComponentElement&lt;/code&gt;: 他の Element を保持するホスト&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RenderObjectElement&lt;/code&gt;: レイアウトや描画フェーズに参加する Element（対応する &lt;code&gt;RenderObject&lt;/code&gt; の仲介役）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;build()&lt;/code&gt; の引数 &lt;code&gt;BuildContext&lt;/code&gt; は、実体としてはこの Element への参照（ツリー上の位置のハンドル）であり、&lt;code&gt;Theme.of(context)&lt;/code&gt; のような呼び出しはこの context を使って祖先を辿っている。&lt;/p&gt;
&lt;h3&gt;状態管理（State / InheritedWidget）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;状態を持たないウィジェットは &lt;code&gt;StatelessWidget&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;状態を持つウィジェットは &lt;code&gt;StatefulWidget&lt;/code&gt;。ウィジェット自体は不変なので、可変状態は別の &lt;code&gt;State&lt;/code&gt; クラスに保持する&lt;/li&gt;
&lt;li&gt;状態を変えるときは &lt;code&gt;setState()&lt;/code&gt; を呼び、フレームワークに再 build を依頼する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ツリーが深くなると、状態をバケツリレーするのが煩雑になる。そこで &lt;code&gt;InheritedWidget&lt;/code&gt; を使うと、共通の祖先からデータを効率よく取得できる。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 祖先に置いた状態を、子孫から型で取得する
final studentState = StudentState.of(context);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Flutter 自身もテーマ（&lt;code&gt;Theme.of(context)&lt;/code&gt;）などで &lt;code&gt;InheritedWidget&lt;/code&gt; を多用している。&lt;code&gt;provider&lt;/code&gt; などの状態管理パッケージも、その多くは &lt;code&gt;InheritedWidget&lt;/code&gt; のラッパーである。&lt;/p&gt;
&lt;h3&gt;レンダリングパイプライン（Build → Layout → Paint）&lt;/h3&gt;
&lt;p&gt;UI コードが実際のピクセルになるまでの流れは次の通り。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart LR
  state[State] --&amp;gt;|build| widget[Widget Tree]
  widget --&amp;gt;|inflate| element[Element Tree]
  element --&amp;gt;|create/update| render[RenderObject Tree]
  render --&amp;gt;|layout| size[サイズ・位置確定]
  size --&amp;gt;|paint| scene[Scene]
  scene --&amp;gt;|compositeFrame| gpu[GPU でラスタライズ]
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Build&lt;/strong&gt;: 状態から Widget ツリーを構築し、対応する Element ツリーへ展開（inflate）。ここで &lt;code&gt;Container&lt;/code&gt; が &lt;code&gt;ColoredBox&lt;/code&gt; を挿入するなど、コードより深いツリーになることがある&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Layout&lt;/strong&gt;: &lt;code&gt;RenderObject&lt;/code&gt; ツリーを深さ優先で 1 パス走査。親から子へ制約（constraints）を渡し、子から親へサイズ（geometry）を返す。&lt;strong&gt;O(n)&lt;/strong&gt; で完了する&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Paint&lt;/strong&gt;: 各 &lt;code&gt;RenderObject&lt;/code&gt; が &lt;code&gt;paint()&lt;/code&gt; で描画。ルートの &lt;code&gt;RenderView&lt;/code&gt; が &lt;code&gt;compositeFrame()&lt;/code&gt; でシーンを合成し、&lt;code&gt;dart:ui&lt;/code&gt; 経由で GPU に渡す&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;なお Flutter は OS のウィジェットを使わず、&lt;strong&gt;自前のウィジェットセットを直接描画する&lt;/strong&gt;（描画は Impeller）。これにより OS バージョンによらず同じ見た目・性能を保ち、Flutter ↔ プラットフォーム間の往復オーバーヘッドを避けている。&lt;/p&gt;
&lt;h2&gt;⚙️ Flutter 内部の仕組み（なぜ高速なのか）&lt;/h2&gt;
&lt;p&gt;積極的な合成の結果、Flutter の UI は &lt;strong&gt;大量のウィジェット&lt;/strong&gt; で構成される。それでも高速に動くのは、レイアウトとビルドに &lt;strong&gt;サブリニア（sublinear）なアルゴリズム&lt;/strong&gt; を採用しているためである。&lt;/p&gt;
&lt;h3&gt;サブリニアなレイアウト&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Flutter のレイアウトは &lt;strong&gt;1 フレームにつき 1 回・単一パス&lt;/strong&gt; で行われる&lt;/li&gt;
&lt;li&gt;親が子の &lt;code&gt;layout&lt;/code&gt; を呼んで制約を渡し、子はサイズを返す。一度返した &lt;code&gt;RenderObject&lt;/code&gt; はそのフレームでは原則 &lt;strong&gt;二度と訪問されない&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;各 &lt;code&gt;RenderObject&lt;/code&gt; はレイアウト中に &lt;strong&gt;最大 2 回&lt;/strong&gt;（下りと上り）しか訪問されない&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;さらに、無駄な再計算を避ける仕組みがある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;子が dirty でなく、前回と &lt;strong&gt;同じ制約&lt;/strong&gt; を受け取ったなら、子は即座に return できる（走査を打ち切る）&lt;/li&gt;
&lt;li&gt;親が子のサイズを使わないなら、子のサイズが変わっても親は再レイアウト不要&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;tight 制約&lt;/strong&gt;（最小 = 最大）なら、子は親から新しい制約が来ない限りサイズを変えられないので、親の再計算も不要&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;結果として、dirty なノードとその周辺の限定的な部分木だけが訪問される。&lt;/p&gt;
&lt;h3&gt;サブリニアなウィジェットビルド&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ビルド後のウィジェットは Element ツリーが保持する（ウィジェットは不変で親子関係を覚えられないため）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;setState()&lt;/code&gt; などで Element が &lt;strong&gt;dirty&lt;/strong&gt; になると、フレームワークは dirty な Element のリストを持ち、ビルド時にそこへ直接ジャンプして clean な Element を飛ばす&lt;/li&gt;
&lt;li&gt;ビルド中は情報が &lt;strong&gt;下方向にしか流れない&lt;/strong&gt; ため、各 Element はビルド時に最大 1 回しか訪問されない&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ここで効くのが &lt;code&gt;const&lt;/code&gt; と「再投影（reprojection）」パターン。
ウィジェットが不変なので、親が &lt;strong&gt;同一インスタンス&lt;/strong&gt; の子で再ビルドすれば、Element はオブジェクト同一性の比較だけで「変わっていない」と判断し、即座に return できる。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// const を付けると同一インスタンスとして扱われ、再ビルドがスキップされやすい
const SizedBox(height: 20)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;また、&lt;code&gt;InheritedWidget&lt;/code&gt; は各 Element にハッシュテーブルとして情報を &lt;strong&gt;下方向にプッシュ&lt;/strong&gt; することで、テーマ参照などのたびに親チェーンを辿る O(N²) を回避している。&lt;/p&gt;
&lt;h3&gt;線形の差分（reconciliation）と key&lt;/h3&gt;
&lt;p&gt;意外なことに、Flutter は &lt;strong&gt;ツリー差分（tree-diffing）アルゴリズムを使っていない&lt;/strong&gt;。
代わりに、各 Element の子リストを個別に O(N) で照合する。最適化されるケースは以下。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;旧子リストが空&lt;/li&gt;
&lt;li&gt;新旧リストが同一&lt;/li&gt;
&lt;li&gt;1 か所だけ挿入・削除された&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;同じ key を持つウィジェット同士をマッチさせる&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;key&lt;/code&gt; を付けると、リスト内で要素が並び替わっても「同じものだ」と認識でき、State を取り違えずに済む。&lt;/p&gt;
&lt;h3&gt;ツリーサージェリー（GlobalKey）&lt;/h3&gt;
&lt;p&gt;Element の再利用は、&lt;strong&gt;State と RenderObject を保持できる&lt;/strong&gt; ため性能上きわめて重要。
&lt;code&gt;GlobalKey&lt;/code&gt; を使うと、Element ツリーの &lt;strong&gt;別の場所へウィジェットを移動&lt;/strong&gt; しても、新規生成ではなく既存 Element を付け替え（reparent）て部分木全体を維持できる。&lt;/p&gt;
&lt;p&gt;これは &lt;strong&gt;Hero アニメーション&lt;/strong&gt; やナビゲーションで多用される。移動先の親が同じ制約を渡せば、子はレイアウトを即 return できるため、移動してもレイアウト情報が再利用される。&lt;/p&gt;
&lt;h3&gt;無限スクロール（Viewport / Sliver）&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ListView&lt;/code&gt; のような無限スクロールは、表示されているぶんだけウィジェットをオンデマンド生成する。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;スクロール領域の外側は &lt;code&gt;Viewport&lt;/code&gt;（「中身が外より大きい箱」）&lt;/li&gt;
&lt;li&gt;その子は &lt;code&gt;RenderBox&lt;/code&gt; ではなく &lt;code&gt;RenderSliver&lt;/code&gt;（ビューポートを意識したレイアウトプロトコルを持つ）&lt;/li&gt;
&lt;li&gt;Sliver は「見えている残り空間」の情報を受け取れるので、無限の子を持ちうる場合でも &lt;strong&gt;有限個だけ&lt;/strong&gt; 生成する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これを成立させるため、Flutter は &lt;strong&gt;ビルドとレイアウトのフェーズを織り交ぜる&lt;/strong&gt;。レイアウト中（＝見える空間が分かった時点）に、その配下のウィジェットを必要なぶんだけ生成できる。&lt;/p&gt;
&lt;h3&gt;Element と RenderObject を分ける理由&lt;/h3&gt;
&lt;p&gt;両ツリーはほぼ同型（RenderObject ツリーは Element ツリーの部分集合）だが、あえて分けている。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;性能&lt;/strong&gt;: レイアウト変更時、合成由来の余計なノードを飛ばして必要部分だけ走査できる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;明確さ&lt;/strong&gt;: ウィジェットのプロトコルと描画のプロトコルをそれぞれ専門化でき、API が単純になる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;型安全&lt;/strong&gt;: RenderObject ツリーは座標系ごとに型を保証できる&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;📐 レイアウトの黄金ルール&lt;/h2&gt;
&lt;p&gt;Flutter のレイアウトでつまずく多くの原因は、HTML/CSS の感覚を持ち込んでしまうこと。
公式は次のルールを &lt;strong&gt;早い段階で暗記すべき&lt;/strong&gt; としている。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Constraints go down. Sizes go up. Parent sets position.&lt;/strong&gt;
（制約は下りていく。サイズは上っていく。位置は親が決める。）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;詳細にすると次の流れ。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ウィジェットは親から &lt;strong&gt;制約（constraints）&lt;/strong&gt; を受け取る。制約とは「最小・最大の幅」「最小・最大の高さ」の 4 つの double&lt;/li&gt;
&lt;li&gt;ウィジェットは各子に制約を伝え、子に「どんなサイズになりたいか」を尋ねる&lt;/li&gt;
&lt;li&gt;ウィジェットは子の &lt;strong&gt;位置&lt;/strong&gt; を決める&lt;/li&gt;
&lt;li&gt;最後に、ウィジェットは自分の &lt;strong&gt;サイズ&lt;/strong&gt; を親に伝える（受け取った制約の範囲内で）&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;親子の「交渉」の具体例&lt;/h3&gt;
&lt;p&gt;公式の例（幅 300・高さ 85 の制約、5px の padding 付き Column）を要約すると、こうした会話になる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;親「君は幅 0〜300px、高さ 0〜85px の範囲ね」&lt;/li&gt;
&lt;li&gt;ウィジェット「padding 5px ぶん引くので、子には最大 290 × 75 を渡そう」&lt;/li&gt;
&lt;li&gt;第 1 子「では幅 290px、高さ 20px にします」&lt;/li&gt;
&lt;li&gt;ウィジェット「2 つ目は第 1 子の下に置くから、残り高さは 55px」&lt;/li&gt;
&lt;li&gt;第 2 子「幅 140px、高さ 30px にします」&lt;/li&gt;
&lt;li&gt;ウィジェット「位置は第 1 子 (5,5)、第 2 子 (80,25)。自分は 300×60 にする」と親へ報告&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;つまり &lt;strong&gt;位置は子自身では決められず、親が決める&lt;/strong&gt;。子は与えられた制約の範囲でしかサイズを選べない。&lt;/p&gt;
&lt;h3&gt;ボックスの 3 つのタイプ&lt;/h3&gt;
&lt;p&gt;制約の扱い方で、ボックスは大きく 3 種類に分かれる。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;タイプ&lt;/th&gt;
&lt;th&gt;振る舞い&lt;/th&gt;
&lt;th&gt;例&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;できるだけ大きくなる&lt;/td&gt;
&lt;td&gt;与えられた制約いっぱいに広がる&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Center&lt;/code&gt;, &lt;code&gt;ListView&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;子と同じサイズになる&lt;/td&gt;
&lt;td&gt;子に合わせる&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Transform&lt;/code&gt;, &lt;code&gt;Opacity&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;特定サイズになろうとする&lt;/td&gt;
&lt;td&gt;固有のサイズを持つ&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Image&lt;/code&gt;, &lt;code&gt;Text&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;Container&lt;/code&gt; は引数次第で変化する。デフォルトは「できるだけ大きく」だが、&lt;code&gt;width&lt;/code&gt; を与えるとそのサイズを尊重しようとする。&lt;/p&gt;
&lt;p&gt;これが「&lt;code&gt;width: 100&lt;/code&gt; を指定したのに 100px にならない」問題の正体。
たとえば画面いっぱいの制約を受けた &lt;code&gt;Container(width: 100)&lt;/code&gt; は、&lt;strong&gt;親（画面）の tight な制約&lt;/strong&gt; に従って画面サイズになってしまう。&lt;code&gt;Center&lt;/code&gt; で包むと、&lt;code&gt;Center&lt;/code&gt; が子に「0〜画面サイズ」の &lt;strong&gt;loose な制約&lt;/strong&gt; を渡すため、ようやく 100px になれる。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// これは画面いっぱいになる（親が tight な制約を渡すため width が無視される）
Container(width: 100, height: 100, color: Colors.red)

// Center で包むと loose な制約になり、100x100 になれる
Center(
  child: Container(width: 100, height: 100, color: Colors.red),
)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;tight 制約と loose 制約&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;tight（きつい）制約&lt;/strong&gt;: 最小 = 最大。満たすサイズはただ 1 つ。例: 画面ルートが子に渡す制約&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;loose（ゆるい）制約&lt;/strong&gt;: 最小が 0。「最大までなら好きなサイズで良い」。例: &lt;code&gt;Center&lt;/code&gt; が子に渡す制約&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;ConstrainedBox&lt;/code&gt; と &lt;code&gt;UnconstrainedBox&lt;/code&gt; の違いも理解の助けになる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ConstrainedBox&lt;/code&gt;: 親から受けた制約に &lt;strong&gt;追加の制約&lt;/strong&gt; を課す。親が tight ならその追加は効かないことがある&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UnconstrainedBox&lt;/code&gt;: 子に制約を課さず、子が好きなサイズになれる。ただし子が大きすぎると、あの &lt;strong&gt;&lt;code&gt;overflow&lt;/code&gt; 警告&lt;/strong&gt; が出る&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// Row の中で子が大きすぎると &quot;RenderFlex overflow&quot; になる
Row(
  children: [
    Container(width: 4000, color: Colors.blue), // 画面幅を超えて溢れる
  ],
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Row&lt;/code&gt; / &lt;code&gt;Column&lt;/code&gt; のオーバーフローは、「子に制約を課さない」性質と「画面という有限の制約」がぶつかった結果である。&lt;code&gt;Expanded&lt;/code&gt; や &lt;code&gt;Flexible&lt;/code&gt; で残り空間を分配したり、&lt;code&gt;SingleChildScrollView&lt;/code&gt; でスクロール可能にしたりして解決する。&lt;/p&gt;
&lt;h2&gt;🔥 ホットリロードの仕組み&lt;/h2&gt;
&lt;p&gt;ホットリロードは、&lt;strong&gt;更新したソースコードを実行中の Dart ランタイムへ注入&lt;/strong&gt; する機能。クラスのフィールドや関数を新しい版に差し替えたあと、Flutter フレームワークがウィジェットツリーを自動的に再ビルドし、変更を即座に確認できる。&lt;/p&gt;
&lt;h3&gt;仕組み&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;ホスト側が前回のコンパイル以降に編集されたコードを調べ、変更されたライブラリ・アプリのメインライブラリ・そこに至るライブラリを再コンパイルする&lt;/li&gt;
&lt;li&gt;生成された kernel ファイルをデバイスの Dart VM に送る&lt;/li&gt;
&lt;li&gt;Dart VM が新しい kernel からライブラリを再ロードする（この時点ではまだコードは再実行されない）&lt;/li&gt;
&lt;li&gt;フレームワークが既存の全ウィジェット / RenderObject の再ビルド・再レイアウト・再描画を発火する&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;重要なのは、&lt;strong&gt;ホットリロードは既存ウィジェットの再ビルドを引き起こすだけ&lt;/strong&gt; という点。再ビルドに関わるコードしか再実行されないため、&lt;code&gt;main()&lt;/code&gt; や &lt;code&gt;initState()&lt;/code&gt; は &lt;strong&gt;再実行されない&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;State が保持される&lt;/h3&gt;
&lt;p&gt;ホットリロードは &lt;strong&gt;アプリの状態を保持&lt;/strong&gt; する。ログイン後の深い画面で UI を修正してリロードしても、ログインし直さずに変更を確認できる。これが通常は望ましい挙動。&lt;/p&gt;
&lt;p&gt;ただし、状態に影響する変更をした場合、「最初から実行したときの状態」とは食い違うことがある。その場合は &lt;strong&gt;ホットリスタート&lt;/strong&gt;（状態を捨てて再起動）が必要になる。&lt;/p&gt;
&lt;h3&gt;ホットリロードが効かない / 効きにくいケース&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ケース&lt;/th&gt;
&lt;th&gt;挙動&lt;/th&gt;
&lt;th&gt;対処&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;main()&lt;/code&gt; / &lt;code&gt;initState()&lt;/code&gt; の変更&lt;/td&gt;
&lt;td&gt;再実行されないため反映されない&lt;/td&gt;
&lt;td&gt;ホットリスタート&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;グローバル変数・static フィールドの初期化子変更&lt;/td&gt;
&lt;td&gt;遅延初期化のため再実行されない&lt;/td&gt;
&lt;td&gt;ホットリスタート&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;enum ↔ 通常クラスの相互変更&lt;/td&gt;
&lt;td&gt;反映されない&lt;/td&gt;
&lt;td&gt;ホットリスタート&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ジェネリック型の宣言変更（&lt;code&gt;A&amp;lt;T&amp;gt;&lt;/code&gt; → &lt;code&gt;A&amp;lt;T, V&amp;gt;&lt;/code&gt;）&lt;/td&gt;
&lt;td&gt;反映されない&lt;/td&gt;
&lt;td&gt;ホットリスタート&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ネイティブコード（Kotlin/Swift 等）の変更&lt;/td&gt;
&lt;td&gt;反映されない&lt;/td&gt;
&lt;td&gt;フルリスタート（停止して再起動）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;コンパイルエラー&lt;/td&gt;
&lt;td&gt;拒否されエラー表示&lt;/td&gt;
&lt;td&gt;該当行を修正&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;アプリが kill された&lt;/td&gt;
&lt;td&gt;中断される&lt;/td&gt;
&lt;td&gt;再起動&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;// 例: ルートウィジェットの build より「下流」の変更はホットリロードで反映される
class Counter extends StatelessWidget {
  const Counter({super.key});

  @override
  Widget build(BuildContext context) {
    // ここの文字色やテキストを変えるとホットリロードで即反映される
    return const Text(&apos;count: 0&apos;);
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;判断の目安は「&lt;strong&gt;変更したコードが、ルートウィジェットの &lt;code&gt;build()&lt;/code&gt; より下流で再実行されるか&lt;/strong&gt;」。下流なら反映される。&lt;code&gt;final bar = foo;&lt;/code&gt; のような初期化子の変更は反映されにくいので、&lt;code&gt;const&lt;/code&gt; にするか getter（&lt;code&gt;int get bar =&amp;gt; foo;&lt;/code&gt;）に置き換えると良い。&lt;/p&gt;
&lt;h2&gt;🏗️ ビルドモード&lt;/h2&gt;
&lt;p&gt;Flutter はコンパイル時に 3 つのモードを持つ（加えてテスト用のヘッドレスモード）。開発サイクルのどこにいるかで使い分ける。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;モード&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;th&gt;コンパイル&lt;/th&gt;
&lt;th&gt;主な特徴&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;debug&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;開発中（ホットリロード）&lt;/td&gt;
&lt;td&gt;JIT&lt;/td&gt;
&lt;td&gt;assert 有効、サービス拡張有効、デバッグ可能。実行速度より開発速度を最適化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;profile&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;性能分析&lt;/td&gt;
&lt;td&gt;AOT&lt;/td&gt;
&lt;td&gt;release に近いが、トレースと一部サービス拡張（パフォーマンスオーバーレイ等）が有効&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;release&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;本番リリース&lt;/td&gt;
&lt;td&gt;AOT&lt;/td&gt;
&lt;td&gt;assert 無効、デバッグ情報除去、起動・実行・サイズを最適化&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;flutter run            # debug（デフォルト）
flutter run --profile  # profile
flutter run --release  # release
flutter build apk      # release ビルドの生成（ターゲット指定）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ポイント。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;debug は JIT、profile / release は AOT&lt;/strong&gt;（事前にネイティブコードへコンパイル）でマシンコードに変換される&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ホットリロードは debug モードのみ&lt;/strong&gt; 利用できる&lt;/li&gt;
&lt;li&gt;profile / release は実機が必要で、&lt;strong&gt;エミュレータ / シミュレータでは無効&lt;/strong&gt;（実機相当の性能が出ないため）&lt;/li&gt;
&lt;li&gt;Web では debug が &lt;code&gt;dartdevc&lt;/code&gt;、release が &lt;code&gt;dart2js&lt;/code&gt;（minify + tree shaking）でコンパイルされる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;開発は debug、カクつきの原因調査は profile、ストア提出は release、と覚えておけば良い。&lt;/p&gt;
&lt;h2&gt;✨ ドットショートハンド構文（Dart 3.10 / Flutter 3.44）&lt;/h2&gt;
&lt;p&gt;ドットショートハンドは、&lt;strong&gt;コンパイラが文脈から型を推論できる場合に、静的メンバ・コンストラクタ・enum 値の型名を省略できる&lt;/strong&gt; 機能。
Flutter は深くネストしたウィジェットツリーを書くことが多く、&lt;code&gt;Alignment.center&lt;/code&gt; や &lt;code&gt;MainAxisAlignment.center&lt;/code&gt; のような型名の繰り返しがボイラープレートになりがちだった。これを &lt;code&gt;.center&lt;/code&gt; のように短く書ける。&lt;/p&gt;
&lt;h3&gt;Before / After&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// Before（型名を明示）
Container(
  alignment: Alignment.center,
  padding: const EdgeInsets.all(16.0),
  child: Column(
    mainAxisAlignment: MainAxisAlignment.center,
    crossAxisAlignment: CrossAxisAlignment.start,
    children: [
      Text(&apos;Hello World&apos;, style: TextStyle(fontWeight: FontWeight.bold)),
    ],
  ),
);
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;// After（ドットショートハンド）
Container(
  alignment: .center,                  // Alignment.center
  padding: const .all(16.0),           // EdgeInsets.all(16.0)
  child: Column(
    mainAxisAlignment: .center,        // MainAxisAlignment.center
    crossAxisAlignment: .start,        // CrossAxisAlignment.start
    children: [
      Text(&apos;Hello World&apos;, style: TextStyle(fontWeight: .bold)), // FontWeight.bold
    ],
  ),
);
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;使える場所&lt;/h3&gt;
&lt;p&gt;コンパイラが明確な「コンテキスト型」を持つ場所、つまりウィジェットのプロパティ指定のほぼすべてで使える。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;enum&lt;/strong&gt;: &lt;code&gt;MainAxisAlignment&lt;/code&gt;, &lt;code&gt;CrossAxisAlignment&lt;/code&gt;, &lt;code&gt;BoxFit&lt;/code&gt;, &lt;code&gt;TextDirection&lt;/code&gt; など&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;静的プロパティ / メソッド&lt;/strong&gt;: &lt;code&gt;FontWeight.bold&lt;/code&gt; → &lt;code&gt;.bold&lt;/code&gt; など&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;コンストラクタ&lt;/strong&gt;: &lt;code&gt;EdgeInsets.all()&lt;/code&gt; → &lt;code&gt;.all()&lt;/code&gt;、&lt;code&gt;BorderRadius.circular()&lt;/code&gt; → &lt;code&gt;.circular()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// 名前付きコンストラクタ（基底クラス EdgeInsetsGeometry を推論）
Padding(
  padding: .symmetric(horizontal: 16.0, vertical: 8.0),
  child: Text(&apos;Spaced out text&apos;),
)

// .new で無名コンストラクタも呼べる（ウィジェットツリーでは稀）
final ScrollController _scrollController = .new(); // ScrollController()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;型名が省けるぶん可読性が上がる一方、文脈が曖昧だと推論が効かない。慣れるまでは「何の型が推論されているか」を意識しておくと安全。&lt;/p&gt;
&lt;h2&gt;🗺️ 理解を深めるためのロードマップ&lt;/h2&gt;
&lt;p&gt;ここまでの内容を、手を動かしながら段階的に深めていくためのロードマップを示す。各フェーズの「課題」を実際に試すことで、ドキュメントの知識が腑に落ちる。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart TB
  p1[&quot;Phase 1: 入門&amp;lt;br/&amp;gt;ウィジェットで画面を作る&quot;]
  p2[&quot;Phase 2: 基礎&amp;lt;br/&amp;gt;レイアウトと状態管理&quot;]
  p3[&quot;Phase 3: 内部理解&amp;lt;br/&amp;gt;3 ツリーとパイプライン&quot;]
  p4[&quot;Phase 4: 実践&amp;lt;br/&amp;gt;性能・最適化・運用&quot;]
  p1 --&amp;gt; p2 --&amp;gt; p3 --&amp;gt; p4
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Phase 1: 入門 — ウィジェットで画面を作る&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;手を動かす課題&lt;/th&gt;
&lt;th&gt;対応ドキュメント&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Stateless / Stateful の違い&lt;/td&gt;
&lt;td&gt;カウンタアプリを &lt;code&gt;setState&lt;/code&gt; で実装&lt;/td&gt;
&lt;td&gt;architectural-overview&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;合成（composition）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Center&lt;/code&gt; + &lt;code&gt;Padding&lt;/code&gt; + &lt;code&gt;Column&lt;/code&gt; で簡単な画面を組む&lt;/td&gt;
&lt;td&gt;architectural-overview&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ホットリロード体験&lt;/td&gt;
&lt;td&gt;色やテキストを変えて即反映を確認、&lt;code&gt;main()&lt;/code&gt; 変更が効かないことも体験&lt;/td&gt;
&lt;td&gt;hot-reload&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;ゴール: 「すべてがウィジェット」「&lt;code&gt;UI = f(state)&lt;/code&gt;」を体感する。&lt;/p&gt;
&lt;h3&gt;Phase 2: 基礎 — レイアウトと状態管理&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;手を動かす課題&lt;/th&gt;
&lt;th&gt;対応ドキュメント&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;レイアウトの黄金ルール&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Container(width:100)&lt;/code&gt; が画面いっぱいになる→&lt;code&gt;Center&lt;/code&gt; で 100px になる、を再現&lt;/td&gt;
&lt;td&gt;constraints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tight / loose 制約&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ConstrainedBox&lt;/code&gt; と &lt;code&gt;UnconstrainedBox&lt;/code&gt; の違いを確認&lt;/td&gt;
&lt;td&gt;constraints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;overflow の解消&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Row&lt;/code&gt; をわざと溢れさせ、&lt;code&gt;Expanded&lt;/code&gt; / &lt;code&gt;SingleChildScrollView&lt;/code&gt; で直す&lt;/td&gt;
&lt;td&gt;constraints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;状態の受け渡し&lt;/td&gt;
&lt;td&gt;&lt;code&gt;InheritedWidget&lt;/code&gt;（または &lt;code&gt;provider&lt;/code&gt;）でテーマや状態を共有&lt;/td&gt;
&lt;td&gt;architectural-overview&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;ゴール: 「Constraints go down. Sizes go up. Parent sets position.」を説明できる。&lt;/p&gt;
&lt;h3&gt;Phase 3: 内部理解 — 3 つのツリーとパイプライン&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;手を動かす課題&lt;/th&gt;
&lt;th&gt;対応ドキュメント&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Widget / Element / RenderObject&lt;/td&gt;
&lt;td&gt;Flutter DevTools の Inspector で実際のツリーの深さを観察&lt;/td&gt;
&lt;td&gt;architectural-overview / inside-flutter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;key の役割&lt;/td&gt;
&lt;td&gt;リストの並び替えで State が崩れる例を作り、&lt;code&gt;key&lt;/code&gt; で直す&lt;/td&gt;
&lt;td&gt;inside-flutter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GlobalKey とツリーサージェリー&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Hero&lt;/code&gt; アニメーションを実装し、State 保持を確認&lt;/td&gt;
&lt;td&gt;inside-flutter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;const の効果&lt;/td&gt;
&lt;td&gt;&lt;code&gt;const&lt;/code&gt; の有無で再ビルド回数が変わることを確認&lt;/td&gt;
&lt;td&gt;inside-flutter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;無限スクロール&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ListView.builder&lt;/code&gt; で大量データを表示し、Sliver の遅延生成を理解&lt;/td&gt;
&lt;td&gt;inside-flutter&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;ゴール: 「なぜ大量のウィジェットでも高速なのか（サブリニア / 線形差分）」を説明できる。&lt;/p&gt;
&lt;h3&gt;Phase 4: 実践 — 性能・最適化・運用&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;手を動かす課題&lt;/th&gt;
&lt;th&gt;対応ドキュメント&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ビルドモードの使い分け&lt;/td&gt;
&lt;td&gt;debug / profile / release を切り替えて性能差を体感&lt;/td&gt;
&lt;td&gt;build-modes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;性能分析&lt;/td&gt;
&lt;td&gt;profile モードで DevTools の Performance を見て jank を調査&lt;/td&gt;
&lt;td&gt;build-modes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;RepaintBoundary&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;再描画範囲を絞って描画コストを下げる&lt;/td&gt;
&lt;td&gt;inside-flutter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ドットショートハンド&lt;/td&gt;
&lt;td&gt;既存コードを &lt;code&gt;.center&lt;/code&gt; 等で書き換えて可読性を改善&lt;/td&gt;
&lt;td&gt;dot-shorthands&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;プラットフォーム連携&lt;/td&gt;
&lt;td&gt;Platform Channel / FFI でネイティブ機能を呼ぶ&lt;/td&gt;
&lt;td&gt;architectural-overview&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;ゴール: 性能問題を計測ベースで切り分け、適切な最適化を選べる。&lt;/p&gt;
&lt;h2&gt;📚 参考リンク（公式ドキュメント）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.flutter.dev/resources/architectural-overview&quot;&gt;Flutter architectural overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.flutter.dev/resources/inside-flutter&quot;&gt;Inside Flutter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.flutter.dev/ui/layout/constraints&quot;&gt;Understanding constraints&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.flutter.dev/testing/build-modes&quot;&gt;Flutter&apos;s build modes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.flutter.dev/tools/hot-reload&quot;&gt;Hot reload&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.flutter.dev/ui/dot-shorthands&quot;&gt;Dot shorthands in Flutter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>OSPO（Open Source Program Office）とは？</title><link>https://tutttuwi.github.io/posts/2026-05-25_ospo%E3%81%A8%E3%81%AF/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2026-05-25_ospo%E3%81%A8%E3%81%AF/</guid><description>OSPO/OSS人材になるための必要知識・スキル・具体的ロードマップと、OSS活動で押さえるべき勘所をまとめる</description><pubDate>Sun, 24 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概要&lt;/h2&gt;
&lt;p&gt;OSPO（Open Source Program Office）は、企業や組織においてオープンソースソフトウェア（OSS）を効果的かつ安全に活用・管理するための専門部署です。&lt;/p&gt;
&lt;p&gt;TODO Group の定義では、OSPO は組織の OSS 運用の「center of competency（能力の中心）」であり、戦略・ガバナンス・コンプライアンス・コミュニティエンゲージメントという4つの枠組みを横断して、コードの利用・配布・選定・監査・コントリビュートに関するポリシー策定、社内外の教育、法務コンプライアンスの担保、コミュニティとの橋渡しを担うとされています。 (&lt;a href=&quot;https://github.com/todogroup/ospodefinition.org&quot;&gt;TODO Group OSPO Definition&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;この記事では「OSPO とは何か」だけでなく、&lt;strong&gt;OSS / OSPO に関わる人材になるにはどうすればよいか&lt;/strong&gt;という視点で、必要な知識・なり方・具体的なロードマップ・OSS 活動で押さえておくべきことを横断的にまとめます。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;1. OSPO人材の全体像&lt;/h1&gt;
&lt;p&gt;OSPO は単一の職種ではなく、複数の専門性を持つ人が「異なる帽子をかぶって」協働する組織です。 (&lt;a href=&quot;https://github.com/todogroup/ospodefinition.org&quot;&gt;TODO Group OSPO Definition&lt;/a&gt;) おおまかに次の3つの顔があります。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;顔&lt;/th&gt;
&lt;th&gt;主な役割&lt;/th&gt;
&lt;th&gt;関連スキル&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;技術&lt;/td&gt;
&lt;td&gt;OSS 利用方針、依存管理、上流コントリビュート、内製の OSS 化支援&lt;/td&gt;
&lt;td&gt;SDLC / Git / CI/CD / セキュリティ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;法務・コンプライアンス&lt;/td&gt;
&lt;td&gt;ライセンス選定・互換性、IP 管理、監査、M&amp;amp;A 時のソース監査&lt;/td&gt;
&lt;td&gt;OSS ライセンス / 知財 / コンプラ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;コミュニティ・エコシステム&lt;/td&gt;
&lt;td&gt;Developer Relations、社内教育、財団・コミュニティとの関係構築&lt;/td&gt;
&lt;td&gt;コミュニケーション / 渉外 / 教育&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;そして、OSS への関わり方には段階があります。多くの人は「利用者」から始まり、徐々に関与を深めていきます。OSPO 担当者はこの全レイヤーを理解していることが求められます。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart LR
    user[&quot;OSS利用者&amp;lt;br/&amp;gt;(使う・読む)&quot;] --&amp;gt; contributor[&quot;コントリビューター&amp;lt;br/&amp;gt;(Issue/PRを出す)&quot;]
    contributor --&amp;gt; maintainer[&quot;メンテナー&amp;lt;br/&amp;gt;(プロジェクトを運営)&quot;]
    maintainer --&amp;gt; ospo[&quot;OSPO担当&amp;lt;br/&amp;gt;(組織横断で統括)&quot;]
    user -. &quot;ポリシー/教育で支援&quot; .- ospo
    contributor -. &quot;上流ファースト推進&quot; .- ospo
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重要なのは、&lt;strong&gt;「いきなり OSPO 担当になる」のではなく、利用者・コントリビューターとしての実体験を積み上げた人がOSPO の中核を担う&lt;/strong&gt;という点です。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;2. どんな知識が必要か&lt;/h1&gt;
&lt;p&gt;OSPO / OSS 人材に求められる知識は、大きく4つの能力領域に分けられます。これは Linux Foundation の OSPO 研修（OSPO 101）でカバーされる範囲ともおおむね一致します。 (&lt;a href=&quot;https://github.com/todogroup/ospo-career-path/tree/main/OSPO-101&quot;&gt;OSPO Career Path / OSPO 101&lt;/a&gt;)&lt;/p&gt;
&lt;h2&gt;2-1. 技術&lt;/h2&gt;
&lt;p&gt;OSS の利用と貢献の土台になる、ソフトウェアエンジニアリングの基礎知識です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ソフトウェア開発ライフサイクル（SDLC）の理解&lt;/li&gt;
&lt;li&gt;Git / GitHub（fork、branch、PR、レビュー、issue 運用）&lt;/li&gt;
&lt;li&gt;CI/CD（GitHub Actions などでのビルド・テスト自動化）&lt;/li&gt;
&lt;li&gt;依存管理（lockfile による固定、&lt;code&gt;^1.2.3&lt;/code&gt; のような曖昧バージョンの危険性）&lt;/li&gt;
&lt;li&gt;SBOM / SCA（Software Composition Analysis）による依存の可視化&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;2-2. 法務・コンプライアンス&lt;/h2&gt;
&lt;p&gt;OSPO の存在意義の中核。ライセンスを「読めて・判断できる」ことが求められます。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ライセンス&lt;/th&gt;
&lt;th&gt;タイプ&lt;/th&gt;
&lt;th&gt;主な注意点&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MIT / BSD&lt;/td&gt;
&lt;td&gt;パーミッシブ&lt;/td&gt;
&lt;td&gt;著作権表記の保持&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apache-2.0&lt;/td&gt;
&lt;td&gt;パーミッシブ&lt;/td&gt;
&lt;td&gt;特許条項、NOTICE ファイル&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPL / LGPL&lt;/td&gt;
&lt;td&gt;コピーレフト&lt;/td&gt;
&lt;td&gt;ソース開示義務、リンク形態&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AGPL&lt;/td&gt;
&lt;td&gt;強いコピーレフト&lt;/td&gt;
&lt;td&gt;ネットワーク越し利用も開示対象&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSPL&lt;/td&gt;
&lt;td&gt;非OSI&lt;/td&gt;
&lt;td&gt;商用 SaaS 提供に制限&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;ライセンス&lt;strong&gt;互換性&lt;/strong&gt;（例: GPL と Apache-2.0 の組み合わせ可否）&lt;/li&gt;
&lt;li&gt;IP（知的財産）・著作権・NOTICE / attribution（著作権表記）&lt;/li&gt;
&lt;li&gt;監査（M&amp;amp;A 時のソースコードデューデリジェンスを含む）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;2-3. セキュリティ・サプライチェーン&lt;/h2&gt;
&lt;p&gt;近年もっとも重要度が増している領域です。詳細は別記事の &lt;a href=&quot;2026-05-25_CNCF%E3%83%97%E3%83%AD%E3%83%80%E3%82%AF%E3%83%88%E3%83%AB%E3%83%BC%E3%83%AB%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6&quot;&gt;CNCFプロダクトルールについて&lt;/a&gt; にまとめていますが、最低限以下は押さえておきたいところです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SBOM 生成（Syft / Trivy）と脆弱性スキャン（Grype / osv-scanner）&lt;/li&gt;
&lt;li&gt;成果物への署名（cosign / sigstore）と来歴情報（provenance / SLSA）&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ossf/scorecard&quot;&gt;OpenSSF Scorecard&lt;/a&gt; によるプロジェクトの健全性評価&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SECURITY.md&lt;/code&gt;、2FA、branch protection などのメンテナー保護&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;2-4. ソフトスキル&lt;/h2&gt;
&lt;p&gt;意外と軽視されがちですが、OSPO の成否を分けるのはむしろここです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コミュニティ運営・ファシリテーション&lt;/li&gt;
&lt;li&gt;Developer Relations（社内外の開発者との関係構築）&lt;/li&gt;
&lt;li&gt;社内教育・トレーニングの設計&lt;/li&gt;
&lt;li&gt;部門横断（エンジニア・法務・経営）の調整力・合意形成&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h1&gt;3. どうすればなれるか&lt;/h1&gt;
&lt;p&gt;OSPO 人材への道は、&lt;strong&gt;段階的に OSS への関与を深める&lt;/strong&gt;ことで開けます。資格よりも「実際に OSS を使い、貢献し、社内で旗を振った実績」が重視されます。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;OSS 利用者として基礎を固める&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;業務で使っている OSS のライセンスを一覧化してみる&lt;/li&gt;
&lt;li&gt;依存ツリーと脆弱性を実際にスキャンしてみる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;小さなコントリビュートを始める&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;ドキュメント修正・typo・翻訳など低リスクな PR から&lt;/li&gt;
&lt;li&gt;&lt;code&gt;good first issue&lt;/code&gt; ラベルの活用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ライセンス／コンプライアンスを学ぶ&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;自社プロダクトのライセンス互換性をチェック&lt;/li&gt;
&lt;li&gt;NOTICE / attribution の整備&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;社内ポリシー・教育に関与する&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;OSS 利用申請フローや承認ポリシーの草案づくり&lt;/li&gt;
&lt;li&gt;開発者向けのライセンス入門研修を企画&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OSPO ロールへ&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;TODO Group は OSPO Lead 採用のための職務記述テンプレートも公開しており、求められる役割像の参考になります。 (&lt;a href=&quot;https://todogroup.org/resources/guides/how-to-create-an-open-source-program-office/&quot;&gt;How to create an OSPO&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;OSPO Lead に求められるのは、&lt;strong&gt;技術とビジネス双方を理解し、組織文化を踏まえて橋渡しできる人材&lt;/strong&gt;です。 (&lt;a href=&quot;https://osr.finos.org/docs/bok/Roles/OSPO&quot;&gt;FINOS OSPO ロール定義&lt;/a&gt;)&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;4. 具体的なロードマップ&lt;/h1&gt;
&lt;p&gt;学習と実践を並走させる、フェーズ別のロードマップ例です。あくまで目安として、自分の現状に合わせて調整してください。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;フェーズ&lt;/th&gt;
&lt;th&gt;学習リソース&lt;/th&gt;
&lt;th&gt;実践・成果物&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0〜3ヶ月（基礎）&lt;/td&gt;
&lt;td&gt;OSPO 101 の「Open Source Introduction」、Git/GitHub 入門&lt;/td&gt;
&lt;td&gt;業務で使う OSS のライセンス一覧を作成、初めての PR（docs/typo）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3〜6ヶ月（コンプラ／貢献）&lt;/td&gt;
&lt;td&gt;LFC112（Open Source Licensing Basics）、OSPO 101 の「Compliance Programs」&lt;/td&gt;
&lt;td&gt;依存スキャン＆ SBOM 生成の習得、機能 PR、ライセンス互換性チェック表&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6〜12ヶ月（運営／統括）&lt;/td&gt;
&lt;td&gt;LFC204（Effective Open Source Program Management）&lt;/td&gt;
&lt;td&gt;社内 OSS 利用ポリシー草案、開発者向け研修の実施、上流コントリビュート戦略の提案&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;学習リソースの入口:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TODO Group &lt;a href=&quot;https://github.com/todogroup/ospo-career-path/tree/main/OSPO-101&quot;&gt;OSPO Career Path / OSPO 101&lt;/a&gt;（無料・モジュール式）&lt;/li&gt;
&lt;li&gt;Linux Foundation &lt;a href=&quot;https://training.linuxfoundation.org/training/open-source-management-and-strategy/&quot;&gt;Open Source Management &amp;amp; Strategy（LFC112 / LFC204 等）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ospobook.todogroup.org/01-chapter/&quot;&gt;OSPO Book&lt;/a&gt;（OSPO の立ち上げ・運営の体系的ガイド）&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;利用 → 貢献 → コンプラ理解 → 社内ポリシー → OSPO運営
 │        │           │              │            │
基礎     初PR      SBOM/ライセンス   研修/規程    戦略立案
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;5. OSS活動で知っておくべきこと&lt;/h1&gt;
&lt;p&gt;実際に OSS に貢献・運営する際に、つまずきやすい・トラブルになりやすいポイントをまとめます。&lt;/p&gt;
&lt;h2&gt;5-1. コントリビュート前の確認&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CONTRIBUTING.md&lt;/code&gt; を読み、貢献の手順・コーディング規約を確認する&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CLA（Contributor License Agreement）／ DCO（Developer Certificate of Origin）&lt;/strong&gt; の署名要否を確認する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CODE_OF_CONDUCT.md&lt;/code&gt;（行動規範）を尊重する&lt;/li&gt;
&lt;li&gt;大きな変更は、いきなり PR を出す前に Issue で方針を合意しておく&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;5-2. 良い PR・コミットの作法&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;1 PR = 1 目的（巨大な PR は避ける）&lt;/li&gt;
&lt;li&gt;コミットメッセージは「なぜ」を伝える&lt;/li&gt;
&lt;li&gt;テストを添える、CI を緑にする&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;上流ファースト（upstream first）&lt;/strong&gt;: 自社で fork して魔改造するのではなく、まず本家に還元できないかを考える&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;5-3. ライセンス順守&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;「コピー&amp;amp;ペーストの罠」: ネット上のコードにもライセンスがある&lt;/li&gt;
&lt;li&gt;依存を追加するときは&lt;strong&gt;追加前に&lt;/strong&gt;ライセンスを確認する&lt;/li&gt;
&lt;li&gt;GPL / AGPL 混入はプロダクトの配布形態に影響する&lt;/li&gt;
&lt;li&gt;NOTICE / attribution（著作権表記）の保持義務を忘れない&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;5-4. メンテナー視点&lt;/h2&gt;
&lt;p&gt;自分がプロジェクトを公開・運営する側になったときに重要になる点です。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SECURITY.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;脆弱性の報告窓口・対応方針を明示&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2FA 必須&lt;/td&gt;
&lt;td&gt;GitHub / npm / PyPI などのアカウント保護&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;署名コミット&lt;/td&gt;
&lt;td&gt;GPG / Sigstore による真正性担保&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;レビュー必須&lt;/td&gt;
&lt;td&gt;1人 merge を避け、レビュー文化を作る&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;5-5. 企業として参加する際の注意&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;業務時間での OSS 貢献に関する社内ルール（就業規則・著作権の帰属）を確認する&lt;/li&gt;
&lt;li&gt;会社として CLA に署名できる権限があるか&lt;/li&gt;
&lt;li&gt;コミットに&lt;strong&gt;機密情報・社内固有情報が混入しないか&lt;/strong&gt;を必ずチェックする&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h1&gt;6. まとめ &amp;amp; 次の一歩&lt;/h1&gt;
&lt;p&gt;OSPO / OSS 人材は、技術・法務・コミュニティを横断する「橋渡し役」です。資格よりも実体験が物を言う領域であり、&lt;strong&gt;小さく始めて段階的に関与を深める&lt;/strong&gt;のが王道です。&lt;/p&gt;
&lt;p&gt;まず踏むべき最初の一歩はシンプルです。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;いま業務で使っている OSS を1つ選び、そのライセンスと依存関係を調べてみる。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;ここから「利用者 → コントリビューター → メンテナー → OSPO 担当」への道が始まります。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;参考リンク&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/todogroup/ospodefinition.org&quot;&gt;TODO Group: OSPO Definition&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ospobook.todogroup.org/01-chapter/&quot;&gt;OSPO Book（Chapter 1）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://todogroup.org/resources/guides/how-to-create-an-open-source-program-office/&quot;&gt;TODO Group: How to create an open source program office&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/todogroup/ospo-career-path/tree/main/OSPO-101&quot;&gt;TODO Group: OSPO Career Path / OSPO 101&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://training.linuxfoundation.org/training/open-source-management-and-strategy/&quot;&gt;Linux Foundation: Open Source Management &amp;amp; Strategy（LFC112 / LFC204）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://osr.finos.org/docs/bok/Roles/OSPO&quot;&gt;FINOS: Open Source Program Office（ロール定義）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ossf/scorecard&quot;&gt;OpenSSF Scorecard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;関連記事: &lt;a href=&quot;2026-05-25_CNCF%E3%83%97%E3%83%AD%E3%83%80%E3%82%AF%E3%83%88%E3%83%AB%E3%83%BC%E3%83%AB%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6&quot;&gt;CNCFプロダクトルールについて&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>短縮URL OSS 徹底比較 (Shlink / YOURLS / Kutt / Dub / Polr / Slash / Sink)</title><link>https://tutttuwi.github.io/posts/2026-05-21_%E7%9F%AD%E7%B8%AEurl_oss/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2026-05-21_%E7%9F%AD%E7%B8%AEurl_oss/</guid><description>自己ホスト型の短縮URLサービスを比較し、AWS / Cloudflare での構築費用や検討すべき観点を整理します。</description><pubDate>Thu, 21 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概要&lt;/h2&gt;
&lt;p&gt;短縮URLサービスは Bitly や TinyURL のような SaaS が有名ですが、以下のような理由で自前運用を検討するケースがあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自社ドメインで運用したい&lt;/li&gt;
&lt;li&gt;アクセスログを社外に出したくない&lt;/li&gt;
&lt;li&gt;課金体系に縛られたくない&lt;/li&gt;
&lt;li&gt;SaaSのリンク数制限に引っかかる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;こうした要件には &lt;strong&gt;自己ホスト型 (Self-hosted) の OSS&lt;/strong&gt; がフィットします。
本記事では代表的な OSS を比較し、AWS で構築した場合の費用感や、選定時にチェックしたい観点を整理します。&lt;/p&gt;
&lt;h2&gt;想定読者とこの記事のゴール&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;短縮URLサービスを自社で運用したいエンジニア・SRE&lt;/li&gt;
&lt;li&gt;マーケティング部門から「クリック分析できる自社ドメインのリンクが欲しい」と相談を受けた人&lt;/li&gt;
&lt;li&gt;既存の Bitly 等から自前運用へ移行を検討している人&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ゴールは次の3点です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;主要 OSS の特徴・できること/できないことを把握する&lt;/li&gt;
&lt;li&gt;AWS で構築した場合の概算費用を見積もる&lt;/li&gt;
&lt;li&gt;運用に乗せるための検討ポイントを押さえる&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;まず全体像&lt;/h2&gt;
&lt;p&gt;短縮URL OSS は、大まかに次のような系統に分けられます。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart LR
    A[短縮URL OSS] --&amp;gt; PHP[PHP系]
    A --&amp;gt; NODE[Node.js系]
    A --&amp;gt; GO[Go系]
    A --&amp;gt; EDGE[エッジ/サーバーレス系]

    PHP --&amp;gt; Shlink
    PHP --&amp;gt; YOURLS
    PHP --&amp;gt; Polr
    NODE --&amp;gt; Kutt
    NODE --&amp;gt; Dub
    GO --&amp;gt; Slash
    EDGE --&amp;gt; Sink

    classDef active fill:#e8f5e9,stroke:#2e7d32,color:#1b5e20;
    classDef stable fill:#fff3e0,stroke:#ef6c00,color:#e65100;
    classDef slow fill:#ffebee,stroke:#c62828,color:#b71c1c;

    class Shlink,Kutt,Dub,Slash,Sink active;
    class YOURLS stable;
    class Polr slow;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;色は「メンテナンスの活発度」のイメージです (緑：活発 / 橙：安定だが緩やか / 赤：更新が少なめ)。&lt;/p&gt;
&lt;h2&gt;各 OSS の概要&lt;/h2&gt;
&lt;h3&gt;Shlink&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;公式: &lt;a href=&quot;https://shlink.io/&quot;&gt;https://shlink.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ドキュメント: &lt;a href=&quot;https://shlink.io/documentation/&quot;&gt;https://shlink.io/documentation/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href=&quot;https://github.com/shlinkio/shlink&quot;&gt;https://github.com/shlinkio/shlink&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;言語: PHP 8.x (Mezzio / Laminas)&lt;/li&gt;
&lt;li&gt;ライセンス: MIT&lt;/li&gt;
&lt;li&gt;GitHub Star: 約 4,000+&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;できること (Shlink)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;REST API / CLI / 公式 Web Client (別リポジトリで配布)&lt;/li&gt;
&lt;li&gt;複数ドメイン対応 (1 インスタンスで複数ドメインの短縮URL)&lt;/li&gt;
&lt;li&gt;QRコード生成、タグ管理、UTM パラメータ自動付与&lt;/li&gt;
&lt;li&gt;地理情報・デバイス・OS・リファラ別の詳細トラッキング&lt;/li&gt;
&lt;li&gt;Real-time 統計、Webhook、Matomo / Google Analytics 連携&lt;/li&gt;
&lt;li&gt;マルチユーザー対応 (v4.x 以降)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;できない・苦手 (Shlink)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;単体では UI が最低限。フル機能の管理画面は &lt;code&gt;shlink-web-client&lt;/code&gt; を別途デプロイする必要がある&lt;/li&gt;
&lt;li&gt;パスワード保護リンク、A/B テスト、リンクの有効期限内分岐などの高機能は標準ではない&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;企業内の業務用途や、メール配信・キャンペーン計測のような &lt;strong&gt;真面目な計測用途&lt;/strong&gt; に向いています。&lt;/p&gt;
&lt;h3&gt;YOURLS&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;公式: &lt;a href=&quot;https://yourls.org/&quot;&gt;https://yourls.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ドキュメント: &lt;a href=&quot;https://yourls.org/docs/&quot;&gt;https://yourls.org/docs/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href=&quot;https://github.com/YOURLS/YOURLS&quot;&gt;https://github.com/YOURLS/YOURLS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;言語: PHP&lt;/li&gt;
&lt;li&gt;ライセンス: MIT&lt;/li&gt;
&lt;li&gt;GitHub Star: 約 9,000+&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;できること (YOURLS)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;古参 (2009年〜) で安定感がある&lt;/li&gt;
&lt;li&gt;プラグインエコシステムが豊富 (&lt;code&gt;yourls-plugins&lt;/code&gt; で公式・非公式が多数)&lt;/li&gt;
&lt;li&gt;カスタム短縮 URL、QR コード、簡易統計、ブックマークレット&lt;/li&gt;
&lt;li&gt;PHP + MySQL のみで動作するため、レンタルサーバーでも動く&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;できない・苦手 (YOURLS)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;UI/UX は 2010 年代風で古い&lt;/li&gt;
&lt;li&gt;標準の分析ダッシュボードは Bitly や Dub と比べて見劣りする&lt;/li&gt;
&lt;li&gt;マルチテナント・チーム機能は弱い&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;「とにかく軽く動かしたい」「PHP のレガシー環境がある」場合に依然として現実的な選択肢です。&lt;/p&gt;
&lt;h3&gt;Kutt&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;公式: &lt;a href=&quot;https://kutt.it/&quot;&gt;https://kutt.it/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ドキュメント: &lt;a href=&quot;https://docs.kutt.it/&quot;&gt;https://docs.kutt.it/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href=&quot;https://github.com/thedevs-network/kutt&quot;&gt;https://github.com/thedevs-network/kutt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;言語: TypeScript / Node.js&lt;/li&gt;
&lt;li&gt;ライセンス: MIT&lt;/li&gt;
&lt;li&gt;GitHub Star: 約 8,000+&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;できること (Kutt)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;モダンな UI (React / Next.js ベース)&lt;/li&gt;
&lt;li&gt;カスタム短縮 URL、QR コード、リンクの有効期限、パスワード保護&lt;/li&gt;
&lt;li&gt;API トークンによる API 連携&lt;/li&gt;
&lt;li&gt;Telegram ボット、ブラウザ拡張機能&lt;/li&gt;
&lt;li&gt;ドメイン追加機能 (複数ドメイン対応)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;できない・苦手 (Kutt)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;単体ではアナリティクスがシンプル (国別・リファラ等の基本のみ)&lt;/li&gt;
&lt;li&gt;A/B テストやリンク内クローキングなどの高度な機能はない&lt;/li&gt;
&lt;li&gt;大規模利用では Redis + PostgreSQL の運用知識が必要&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;「中小規模で OK、UI もまともで API も使いたい」のスイートスポット。&lt;/p&gt;
&lt;h3&gt;Dub&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;公式: &lt;a href=&quot;https://dub.co/&quot;&gt;https://dub.co/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ドキュメント: &lt;a href=&quot;https://dub.co/docs&quot;&gt;https://dub.co/docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href=&quot;https://github.com/dubinc/dub&quot;&gt;https://github.com/dubinc/dub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;言語: TypeScript / Next.js&lt;/li&gt;
&lt;li&gt;ライセンス: AGPL-3.0&lt;/li&gt;
&lt;li&gt;GitHub Star: 約 18,000+&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;できること (Dub)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;SaaS 品質のモダン UI / 機能 (Vercel 系開発者文化)&lt;/li&gt;
&lt;li&gt;高機能リンク管理 (UTM ビルダー、リンククローク、Geo/Device ターゲティング、A/B テスト)&lt;/li&gt;
&lt;li&gt;リッチな OG プレビュー、リンクの有効期限、パスワード保護&lt;/li&gt;
&lt;li&gt;Tinybird ベースのリアルタイムアナリティクス&lt;/li&gt;
&lt;li&gt;チーム / ワークスペース / Webhook / 公開 API&lt;/li&gt;
&lt;li&gt;Conversion Tracking、決済連携 (Stripe)、Affiliate 等の機能も拡張中&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;できない・苦手 (Dub)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;構成要素が多い (Postgres / Redis / Tinybird / S3 / Resend など) ため、純粋な「自己ホスト」のハードルは高い&lt;/li&gt;
&lt;li&gt;AGPL-3.0 なので、改修して SaaS 提供する場合はソース公開義務が発生する&lt;/li&gt;
&lt;li&gt;小規模用途にはオーバースペック気味&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;「Bitly の代替を本気で内製したい」場合の最右翼。SaaS 版 dub.co を使う前提でも品質は最高クラス。&lt;/p&gt;
&lt;h3&gt;Polr&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;公式: &lt;a href=&quot;https://polrproject.org/&quot;&gt;https://polrproject.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ドキュメント: &lt;a href=&quot;https://docs.polrproject.org/&quot;&gt;https://docs.polrproject.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href=&quot;https://github.com/cydrobolt/polr&quot;&gt;https://github.com/cydrobolt/polr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;言語: PHP (Laravel)&lt;/li&gt;
&lt;li&gt;ライセンス: GPL-2.0&lt;/li&gt;
&lt;li&gt;GitHub Star: 約 4,000+&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;できること (Polr)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;シンプルかつ軽量&lt;/li&gt;
&lt;li&gt;API、カスタム短縮 URL、基本的なクリック統計&lt;/li&gt;
&lt;li&gt;マルチユーザー、API トークン&lt;/li&gt;
&lt;li&gt;Pro 版 (有料) で更に機能拡張可能&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;できない・苦手 (Polr)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;メンテナンスの活発度はやや低下傾向 (リリース間隔が長い)&lt;/li&gt;
&lt;li&gt;モダンな分析機能はなく、SaaS と比較すると見劣りする&lt;/li&gt;
&lt;li&gt;セキュリティ修正の追従が遅れがちなので、本番運用は要注意&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;「学習用、社内ツールでとりあえず動かす」用途には十分。&lt;/p&gt;
&lt;h3&gt;Slash (補足)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href=&quot;https://github.com/yourselfhosted/slash&quot;&gt;https://github.com/yourselfhosted/slash&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;言語: Go&lt;/li&gt;
&lt;li&gt;ライセンス: MIT&lt;/li&gt;
&lt;li&gt;GitHub Star: 約 5,000+&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;できること (Slash)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;単一バイナリで動作する Go 製短縮URL/ブックマーク管理&lt;/li&gt;
&lt;li&gt;Docker で 1 コマンド起動&lt;/li&gt;
&lt;li&gt;軽量で軽い、SQLite/PostgreSQL/MySQL に対応&lt;/li&gt;
&lt;li&gt;チーム共有のリンクコレクション機能あり&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;できない・苦手 (Slash)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;大規模なクリック分析は弱い&lt;/li&gt;
&lt;li&gt;短縮 URL に特化というよりは「チーム向けリンク共有」の色合いが強い&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;「個人 / 小チームで Docker 1 個で済ませたい」場合の選択肢。&lt;/p&gt;
&lt;h3&gt;Sink (サーバーレス系)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href=&quot;https://github.com/ccbikai/Sink&quot;&gt;https://github.com/ccbikai/Sink&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;公式デモ: &lt;a href=&quot;https://sink.cool/&quot;&gt;https://sink.cool/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;言語: TypeScript (Nuxt 3)&lt;/li&gt;
&lt;li&gt;ライセンス: MIT&lt;/li&gt;
&lt;li&gt;GitHub Star: 約 6,000+&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ここまで紹介してきた OSS は基本的に &lt;strong&gt;コンテナ / VM 上で動かす前提&lt;/strong&gt; ですが、Sink は &lt;strong&gt;Cloudflare ネイティブ (Workers + KV + Analytics Engine)&lt;/strong&gt; で動作する点が大きく異なります。サーバーを 1 台も立てずに、&lt;code&gt;wrangler deploy&lt;/code&gt; 1 コマンドで運用開始できます。&lt;/p&gt;
&lt;h4&gt;できること (Sink)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Cloudflare アカウント1つで構築完了 (サーバー不要)&lt;/li&gt;
&lt;li&gt;グローバルにエッジ配信されるため &lt;strong&gt;リダイレクトの初動が非常に速い&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;AI (Workers AI) によるスラッグ自動生成&lt;/li&gt;
&lt;li&gt;パスワード保護リンク、有効期限付きリンク&lt;/li&gt;
&lt;li&gt;リアルタイムアナリティクス (国 / デバイス / リファラ、Analytics Engine ベース)&lt;/li&gt;
&lt;li&gt;個人利用なら &lt;strong&gt;実質 $0 / 月&lt;/strong&gt; で運用可能 (Cloudflare の無料枠内)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;できない・苦手 (Sink)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare ロックイン&lt;/strong&gt; が強い。他クラウドへの移植性は低い&lt;/li&gt;
&lt;li&gt;KV は &lt;strong&gt;結果整合性&lt;/strong&gt; なので、書き込み直後の世界規模での即時反映は保証されない&lt;/li&gt;
&lt;li&gt;Workers 無料枠は &lt;strong&gt;10万 req/日&lt;/strong&gt;、超過時は Workers Paid ($5/月〜) へ&lt;/li&gt;
&lt;li&gt;Webhook / 業務システム連携機能は控えめ&lt;/li&gt;
&lt;li&gt;監査ログや細かな権限管理が必要なエンタープライズ要件には不向き&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;「個人ブログ・社内ツール・小さな SaaS のリンク管理で、運用コストをゼロに近づけたい」場合の決定版。&lt;/p&gt;
&lt;h2&gt;比較表&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;観点&lt;/th&gt;
&lt;th&gt;Shlink&lt;/th&gt;
&lt;th&gt;YOURLS&lt;/th&gt;
&lt;th&gt;Kutt&lt;/th&gt;
&lt;th&gt;Dub&lt;/th&gt;
&lt;th&gt;Polr&lt;/th&gt;
&lt;th&gt;Slash&lt;/th&gt;
&lt;th&gt;Sink&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;言語&lt;/td&gt;
&lt;td&gt;PHP&lt;/td&gt;
&lt;td&gt;PHP&lt;/td&gt;
&lt;td&gt;Node.js&lt;/td&gt;
&lt;td&gt;Next.js&lt;/td&gt;
&lt;td&gt;PHP (Laravel)&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;TypeScript (Nuxt 3)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ライセンス&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;AGPL-3.0&lt;/td&gt;
&lt;td&gt;GPL-2.0&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub Star (概算)&lt;/td&gt;
&lt;td&gt;4k+&lt;/td&gt;
&lt;td&gt;9k+&lt;/td&gt;
&lt;td&gt;8k+&lt;/td&gt;
&lt;td&gt;18k+&lt;/td&gt;
&lt;td&gt;4k+&lt;/td&gt;
&lt;td&gt;5k+&lt;/td&gt;
&lt;td&gt;6k+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;メンテナンス活発度&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;td&gt;中&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;td&gt;非常に高&lt;/td&gt;
&lt;td&gt;低〜中&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;初版リリース&lt;/td&gt;
&lt;td&gt;2016&lt;/td&gt;
&lt;td&gt;2009&lt;/td&gt;
&lt;td&gt;2017&lt;/td&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;2014&lt;/td&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ホスティング形態&lt;/td&gt;
&lt;td&gt;コンテナ/VM&lt;/td&gt;
&lt;td&gt;コンテナ/VM&lt;/td&gt;
&lt;td&gt;コンテナ/VM&lt;/td&gt;
&lt;td&gt;コンテナ/VM&lt;/td&gt;
&lt;td&gt;コンテナ/VM&lt;/td&gt;
&lt;td&gt;コンテナ/VM&lt;/td&gt;
&lt;td&gt;サーバーレス (Cloudflare)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DB&lt;/td&gt;
&lt;td&gt;MySQL/MariaDB/PostgreSQL/SQLite&lt;/td&gt;
&lt;td&gt;MySQL/MariaDB&lt;/td&gt;
&lt;td&gt;PostgreSQL&lt;/td&gt;
&lt;td&gt;PostgreSQL&lt;/td&gt;
&lt;td&gt;MySQL/MariaDB/SQLite&lt;/td&gt;
&lt;td&gt;SQLite/PostgreSQL/MySQL&lt;/td&gt;
&lt;td&gt;Cloudflare KV&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redis&lt;/td&gt;
&lt;td&gt;任意&lt;/td&gt;
&lt;td&gt;不要&lt;/td&gt;
&lt;td&gt;任意&lt;/td&gt;
&lt;td&gt;必須 (Upstash 等)&lt;/td&gt;
&lt;td&gt;不要&lt;/td&gt;
&lt;td&gt;不要&lt;/td&gt;
&lt;td&gt;不要&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;必須外部サービス&lt;/td&gt;
&lt;td&gt;なし&lt;/td&gt;
&lt;td&gt;なし&lt;/td&gt;
&lt;td&gt;なし&lt;/td&gt;
&lt;td&gt;Tinybird, Resend, S3 等&lt;/td&gt;
&lt;td&gt;なし&lt;/td&gt;
&lt;td&gt;なし&lt;/td&gt;
&lt;td&gt;Cloudflare 一式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;公式 Docker&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;td&gt;あり (開発用)&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;td&gt;不要 (Workers)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;マルチドメイン&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;td&gt;プラグイン&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;td&gt;限定的&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;マルチユーザー&lt;/td&gt;
&lt;td&gt;あり (v4+)&lt;/td&gt;
&lt;td&gt;プラグイン&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;td&gt;あり (ワークスペース)&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;td&gt;単一管理者&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;カスタム短縮 URL&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QR コード&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;td&gt;プラグイン&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;td&gt;プラグイン&lt;/td&gt;
&lt;td&gt;なし&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;パスワード保護&lt;/td&gt;
&lt;td&gt;なし&lt;/td&gt;
&lt;td&gt;プラグイン&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;td&gt;なし&lt;/td&gt;
&lt;td&gt;なし&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;有効期限&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;td&gt;プラグイン&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;td&gt;なし&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A/B テスト&lt;/td&gt;
&lt;td&gt;なし&lt;/td&gt;
&lt;td&gt;なし&lt;/td&gt;
&lt;td&gt;なし&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;td&gt;なし&lt;/td&gt;
&lt;td&gt;なし&lt;/td&gt;
&lt;td&gt;なし&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Geo/Device ターゲティング&lt;/td&gt;
&lt;td&gt;なし&lt;/td&gt;
&lt;td&gt;なし&lt;/td&gt;
&lt;td&gt;なし&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;td&gt;なし&lt;/td&gt;
&lt;td&gt;なし&lt;/td&gt;
&lt;td&gt;なし&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;アナリティクス&lt;/td&gt;
&lt;td&gt;高機能&lt;/td&gt;
&lt;td&gt;簡易&lt;/td&gt;
&lt;td&gt;中程度&lt;/td&gt;
&lt;td&gt;非常に高機能&lt;/td&gt;
&lt;td&gt;簡易&lt;/td&gt;
&lt;td&gt;簡易&lt;/td&gt;
&lt;td&gt;中程度 (Analytics Engine)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;公開 API&lt;/td&gt;
&lt;td&gt;あり (REST)&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;td&gt;あり (REST)&lt;/td&gt;
&lt;td&gt;あり (REST)&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;td&gt;あり (gRPC/REST)&lt;/td&gt;
&lt;td&gt;あり (REST)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;想定月額 (個人利用)&lt;/td&gt;
&lt;td&gt;$30〜 (AWS)&lt;/td&gt;
&lt;td&gt;$30〜 (AWS)&lt;/td&gt;
&lt;td&gt;$30〜 (AWS)&lt;/td&gt;
&lt;td&gt;$150〜 (AWS)&lt;/td&gt;
&lt;td&gt;$30〜 (AWS)&lt;/td&gt;
&lt;td&gt;$30〜 (AWS)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0 (CF 無料枠)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;推奨用途&lt;/td&gt;
&lt;td&gt;業務計測&lt;/td&gt;
&lt;td&gt;レガシー軽量&lt;/td&gt;
&lt;td&gt;中規模・API 利用&lt;/td&gt;
&lt;td&gt;大規模・SaaS 品質&lt;/td&gt;
&lt;td&gt;学習・個人&lt;/td&gt;
&lt;td&gt;小チーム&lt;/td&gt;
&lt;td&gt;ゼロコスト運用&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;AWS で構築した場合の費用概算&lt;/h2&gt;
&lt;p&gt;東京リージョン (&lt;code&gt;ap-northeast-1&lt;/code&gt;)、1 年継続利用 (On-Demand) の概算です。
為替・割引は時期により変動するため、目安としてご覧ください。&lt;/p&gt;
&lt;h3&gt;構成パターン&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;flowchart LR
    subgraph User
        U[利用者]
    end

    subgraph AWS
        R53[Route 53&amp;lt;br/&amp;gt;独自ドメイン]
        ALB[ALB / CloudFront]
        APP[ECS Fargate or EC2&amp;lt;br/&amp;gt;短縮URL アプリ]
        DB[(RDS&amp;lt;br/&amp;gt;MySQL/PostgreSQL)]
        CACHE[(ElastiCache&amp;lt;br/&amp;gt;Redis)]
        S3[(S3&amp;lt;br/&amp;gt;必要に応じて)]
    end

    U --&amp;gt; R53 --&amp;gt; ALB --&amp;gt; APP
    APP --&amp;gt; DB
    APP --&amp;gt; CACHE
    APP --&amp;gt; S3
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;パターン 1: 最小構成 (個人〜小規模社内)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;リソース&lt;/th&gt;
&lt;th&gt;想定月額 (USD)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Compute&lt;/td&gt;
&lt;td&gt;EC2 t4g.small (1台、24h)&lt;/td&gt;
&lt;td&gt;約 $12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DB&lt;/td&gt;
&lt;td&gt;RDS db.t4g.micro (Single-AZ)&lt;/td&gt;
&lt;td&gt;約 $13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ストレージ&lt;/td&gt;
&lt;td&gt;EBS 20GB + RDS 20GB&lt;/td&gt;
&lt;td&gt;約 $5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;データ転送&lt;/td&gt;
&lt;td&gt;アウト 10GB/月&lt;/td&gt;
&lt;td&gt;約 $1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Route 53&lt;/td&gt;
&lt;td&gt;ホストゾーン + クエリ&lt;/td&gt;
&lt;td&gt;約 $1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;合計&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;約 $32 / 月 (約 5,000 円)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;ALB を使わず、Nginx + Let&apos;s Encrypt で EC2 直撮 (Elastic IP) の前提です。
&lt;strong&gt;Shlink / YOURLS / Polr / Slash / Kutt (Redis 無し設定)&lt;/strong&gt; が現実的です。&lt;/p&gt;
&lt;h3&gt;パターン 2: 中規模 (社内全体・サービス公開)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;リソース&lt;/th&gt;
&lt;th&gt;想定月額 (USD)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Compute&lt;/td&gt;
&lt;td&gt;ECS Fargate 0.5 vCPU/1GB × 2 タスク&lt;/td&gt;
&lt;td&gt;約 $30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ALB&lt;/td&gt;
&lt;td&gt;1 台&lt;/td&gt;
&lt;td&gt;約 $22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DB&lt;/td&gt;
&lt;td&gt;RDS db.t4g.small Multi-AZ&lt;/td&gt;
&lt;td&gt;約 $55&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redis&lt;/td&gt;
&lt;td&gt;ElastiCache cache.t4g.micro&lt;/td&gt;
&lt;td&gt;約 $12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;データ転送&lt;/td&gt;
&lt;td&gt;アウト 100GB/月&lt;/td&gt;
&lt;td&gt;約 $12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CloudFront&lt;/td&gt;
&lt;td&gt;100GB/月&lt;/td&gt;
&lt;td&gt;約 $10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WAF&lt;/td&gt;
&lt;td&gt;Basic + 数ルール&lt;/td&gt;
&lt;td&gt;約 $10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Route 53&lt;/td&gt;
&lt;td&gt;ホストゾーン + クエリ&lt;/td&gt;
&lt;td&gt;約 $1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;合計&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;約 $152 / 月 (約 23,000 円)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Shlink / Kutt&lt;/strong&gt; あたりに最適。冗長化と CDN を効かせた構成です。&lt;/p&gt;
&lt;h3&gt;パターン 3: 大規模 (Dub 級の SaaS 品質を内製)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;リソース&lt;/th&gt;
&lt;th&gt;想定月額 (USD)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Compute&lt;/td&gt;
&lt;td&gt;ECS Fargate 1 vCPU/2GB × 3 タスク&lt;/td&gt;
&lt;td&gt;約 $90&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ALB&lt;/td&gt;
&lt;td&gt;1 台&lt;/td&gt;
&lt;td&gt;約 $22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DB&lt;/td&gt;
&lt;td&gt;RDS db.r6g.large Multi-AZ&lt;/td&gt;
&lt;td&gt;約 $370&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redis&lt;/td&gt;
&lt;td&gt;ElastiCache cache.t4g.small × 2 (HA)&lt;/td&gt;
&lt;td&gt;約 $50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;データ転送 + CloudFront&lt;/td&gt;
&lt;td&gt;アウト 1TB/月&lt;/td&gt;
&lt;td&gt;約 $120&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ログ/分析基盤&lt;/td&gt;
&lt;td&gt;Kinesis Firehose + S3 + Athena&lt;/td&gt;
&lt;td&gt;約 $50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WAF + Shield Standard&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;約 $20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Route 53&lt;/td&gt;
&lt;td&gt;ホストゾーン + クエリ&lt;/td&gt;
&lt;td&gt;約 $5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;合計&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;約 $727 / 月 (約 11 万円)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;これに加えて Dub の場合は &lt;strong&gt;Tinybird (有料)&lt;/strong&gt;、&lt;strong&gt;Resend (メール送信)&lt;/strong&gt; などのサードパーティ費用が乗ります。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;補足: 短縮URLは「リダイレクトだけ」と侮りがちですが、&lt;strong&gt;クリック計測の書き込み量がスループットのボトルネック&lt;/strong&gt; になります。本格運用では Redis や ClickHouse / Tinybird のようなアナリティクス基盤の検討が早期に必要です。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;パターン 4: サーバーレス (Cloudflare / Sink 利用)&lt;/h3&gt;
&lt;p&gt;AWS ではなく Cloudflare を使う前提で、&lt;strong&gt;Sink&lt;/strong&gt; を採用する場合の費用感です。
EC2 / RDS / ALB といったリソースが一切不要になるため、桁が変わります。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart LR
    User[利用者] --&amp;gt; CF[Cloudflare&amp;lt;br/&amp;gt;エッジ]
    CF --&amp;gt; W[Cloudflare Workers&amp;lt;br/&amp;gt;リダイレクト + 管理画面]
    W --&amp;gt; KV[(Cloudflare KV&amp;lt;br/&amp;gt;slug → 元URL)]
    W --&amp;gt; AE[(Analytics Engine&amp;lt;br/&amp;gt;クリックログ)]
    W -.-&amp;gt;|任意| AI[Workers AI&amp;lt;br/&amp;gt;slug 自動生成]
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;リソース&lt;/th&gt;
&lt;th&gt;想定月額 (USD)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;実行&lt;/td&gt;
&lt;td&gt;Cloudflare Workers (Free Plan)&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ストレージ&lt;/td&gt;
&lt;td&gt;Cloudflare KV (Free Plan)&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;分析&lt;/td&gt;
&lt;td&gt;Analytics Engine (Free 枠)&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;独自ドメイン&lt;/td&gt;
&lt;td&gt;Cloudflare DNS 管理&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;合計 (小規模)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;約 $0 / 月&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;中規模以上 (1日 10 万リクエスト超 / KV 読み取り 10 万/日超) では Workers Paid プランへの移行が必要です。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;リソース&lt;/th&gt;
&lt;th&gt;想定月額 (USD)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;実行&lt;/td&gt;
&lt;td&gt;Cloudflare Workers Paid&lt;/td&gt;
&lt;td&gt;$5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ストレージ&lt;/td&gt;
&lt;td&gt;KV 追加分 (1000万 read で $0.50)&lt;/td&gt;
&lt;td&gt;$1 〜&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;分析&lt;/td&gt;
&lt;td&gt;Analytics Engine 超過分&lt;/td&gt;
&lt;td&gt;$1 〜&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;合計 (中規模)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;約 $5 〜 $10 / 月&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;AWS のパターン 2 (約 $152/月) と比較すると、&lt;strong&gt;Sink + Cloudflare は1桁安く済む&lt;/strong&gt; ケースがほとんどです。
ただし、&lt;strong&gt;Cloudflare 依存&lt;/strong&gt;・&lt;strong&gt;KV の結果整合性&lt;/strong&gt;・&lt;strong&gt;監査ログの粒度&lt;/strong&gt; などのトレードオフがあるため、用途と要件次第で AWS 構成と使い分けるのが現実的です。&lt;/p&gt;
&lt;h2&gt;選定にあたって検討したい観点&lt;/h2&gt;
&lt;p&gt;機能比較だけで選ぶと後悔しがちなので、以下の観点も合わせて評価することをおすすめします。&lt;/p&gt;
&lt;h3&gt;1. ドメイン戦略&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;短縮 URL は &lt;strong&gt;独自ドメイン (例: &lt;code&gt;go.example.co.jp&lt;/code&gt;)&lt;/strong&gt; で発行するのが基本&lt;/li&gt;
&lt;li&gt;ブランド毀損や乗っ取り対策のため、ドメインの &lt;strong&gt;HSTS preload / CAA レコード / DMARC&lt;/strong&gt; も同時に検討&lt;/li&gt;
&lt;li&gt;リンクは長期間生き残るので、&lt;strong&gt;捨てやすいドメインを使わない&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. リンクの永続性 (Link Persistence)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;数年後にもクリックされる前提で、&lt;strong&gt;DB バックアップ・サービス停止時の代替案&lt;/strong&gt; を必ず用意&lt;/li&gt;
&lt;li&gt;移行性を考えるなら、&lt;strong&gt;カスタム短縮 URL (slug) のエクスポート / インポート&lt;/strong&gt; がしやすい OSS を選ぶ&lt;/li&gt;
&lt;li&gt;ShortIO 等の SaaS から移行する場合、CSV インポート可否を確認する&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. アナリティクスの粒度と保存期間&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;クリックログは個人情報 (IP) を含むため、&lt;strong&gt;保存期間・匿名化方針&lt;/strong&gt; を最初に決める&lt;/li&gt;
&lt;li&gt;大量のリンク + 大量のクリックを扱う場合、RDB だけでは負荷的に厳しい。&lt;strong&gt;カラムナ DB (Tinybird / ClickHouse) や Redis、Kinesis&lt;/strong&gt; との組み合わせを検討&lt;/li&gt;
&lt;li&gt;GDPR / 個人情報保護法を意識するなら、IP のハッシュ化やジオロケーション粒度の制御が必要&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4. セキュリティ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;短縮 URL は &lt;strong&gt;フィッシングや C2 通信の踏み台&lt;/strong&gt; として悪用されやすい&lt;/li&gt;
&lt;li&gt;対策として、&lt;strong&gt;事前 URL スキャン (Google Safe Browsing API, VirusTotal API)&lt;/strong&gt;、&lt;strong&gt;禁止ドメインリスト&lt;/strong&gt;、&lt;strong&gt;レート制限&lt;/strong&gt;、&lt;strong&gt;短縮可能ユーザーの認証&lt;/strong&gt; をどう実装するか&lt;/li&gt;
&lt;li&gt;公開短縮 URL を許す場合は、&lt;strong&gt;CAPTCHA + WAF + 通報フロー&lt;/strong&gt; を必ず設計する&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5. 可用性・SLO&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;短縮 URL がダウンすると、&lt;strong&gt;過去に配信したすべてのリンクが死ぬ&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;影響範囲が極めて大きいので、&lt;strong&gt;Multi-AZ / CDN キャッシュ / 障害時のフォールバック&lt;/strong&gt; を初期から考慮&lt;/li&gt;
&lt;li&gt;CloudFront でリダイレクト結果を短時間キャッシュ (例: 60秒) するだけでも、原本ダウン時の被害が抑えられる&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6. ライセンスと商用利用&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AGPL-3.0 (Dub)&lt;/strong&gt; は SaaS として外部提供する場合にソース公開義務が生じる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPL-2.0 (Polr)&lt;/strong&gt; も同様に注意が必要&lt;/li&gt;
&lt;li&gt;社内利用にとどめる前提なら問題は少ないが、&lt;strong&gt;プロダクトに組み込んで顧客提供する場合は法務確認&lt;/strong&gt; を&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;7. 運用負荷&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;個人で運用するなら &lt;strong&gt;依存サービスが少ない OSS&lt;/strong&gt; (YOURLS / Slash / Shlink) が無難&lt;/li&gt;
&lt;li&gt;「フルマネージドに近づけたい」なら &lt;strong&gt;App Runner / ECS Fargate + RDS&lt;/strong&gt; のような構成にして、EC2 直運用を避ける&lt;/li&gt;
&lt;li&gt;自動デプロイ・自動バックアップ・脆弱性パッチ自動適用までを最初の構築時に組み込んでおく&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;用途別おすすめ&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;flowchart TD
    Q1{用途は?}
    Q1 --&amp;gt; |個人・小規模| Q0{ランニングコストを&amp;lt;br/&amp;gt;ほぼゼロにしたい?}
    Q1 --&amp;gt; |業務・社内全体| Q3{高度な分析が必要?}
    Q1 --&amp;gt; |顧客向けSaaS| Q4{AGPL に同意できる?}

    Q0 --&amp;gt; |Yes Cloudflare依存OK| Sink[Sink&amp;lt;br/&amp;gt;Cloudflare サーバーレス]
    Q0 --&amp;gt; |No 自前運用したい| Q2{Docker 1 個で済ませたい?}

    Q2 --&amp;gt; |Yes| Slash[Slash]
    Q2 --&amp;gt; |No, UIも欲しい| Kutt[Kutt]

    Q3 --&amp;gt; |Yes 詳細計測| Shlink[Shlink]
    Q3 --&amp;gt; |No 軽くてOK| YOURLS[YOURLS]

    Q4 --&amp;gt; |Yes| Dub[Dub]
    Q4 --&amp;gt; |No | Dev[Dub のフォーク不可&amp;lt;br/&amp;gt;独自開発 or 他OSSベースを検討]

    classDef rec fill:#e8f5e9,stroke:#2e7d32,color:#1b5e20;
    class Sink,Slash,Kutt,Shlink,YOURLS,Dub rec;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;利用イメージ (典型的なリクエストフロー)&lt;/h2&gt;
&lt;p&gt;短縮 URL の典型的なリクエスト / トラッキングは下記の流れになります。
Dub クラスではここに A/B テストや UTM 付与が挟まり、Shlink クラスでは Webhook で SIEM に転送、といったバリエーションが生まれます。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sequenceDiagram
    participant User as ユーザー
    participant CDN as CloudFront
    participant App as 短縮URLアプリ
    participant DB as DB (slug → 元URL)
    participant Q as ログキュー / Redis
    participant DW as 分析基盤

    User-&amp;gt;&amp;gt;CDN: GET https://go.example.co.jp/abc
    CDN-&amp;gt;&amp;gt;App: cache miss
    App-&amp;gt;&amp;gt;DB: SELECT * WHERE slug=&apos;abc&apos;
    DB--&amp;gt;&amp;gt;App: 元URL, 設定
    App-&amp;gt;&amp;gt;Q: クリックログ非同期送信 (IP, UA, Referer)
    App--&amp;gt;&amp;gt;CDN: 302 Location: https://...
    CDN--&amp;gt;&amp;gt;User: 302 Location: https://...
    Q--&amp;gt;&amp;gt;DW: 集約・集計
    Note over App,DB: 必要に応じて&amp;lt;br/&amp;gt;パスワード/期限/Geo分岐
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;シーン&lt;/th&gt;
&lt;th&gt;おすすめ&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;とにかく無料で運用したい (Cloudflare OK)&lt;/td&gt;
&lt;td&gt;Sink&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;とりあえず動かしたい / レガシー PHP 環境&lt;/td&gt;
&lt;td&gt;YOURLS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;業務での真面目な計測・複数ドメイン&lt;/td&gt;
&lt;td&gt;Shlink&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;モダンUI + API 連携、中規模社内&lt;/td&gt;
&lt;td&gt;Kutt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bitly 代替を本気で内製 (顧客提供)&lt;/td&gt;
&lt;td&gt;Dub&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学習・個人ブログ用途&lt;/td&gt;
&lt;td&gt;Polr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker 1 個でチームのリンク共有&lt;/td&gt;
&lt;td&gt;Slash&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;短縮 URL は「ドメインの寿命 = リンクの寿命」と「クリックログのスケール」が落とし穴です。
&lt;strong&gt;選定の前に &quot;5 年後もこのドメインを維持できるか / 月間クリックがどこまで伸びるか&quot; を見積もる&lt;/strong&gt; ことを強くおすすめします。&lt;/p&gt;
&lt;p&gt;最終的には、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ランニングコスト最優先 (Cloudflare 依存OK) → &lt;strong&gt;Sink&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;個人・社内ツール (自前運用) → &lt;strong&gt;Shlink / Kutt / Slash&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;顧客向け本格運用 → &lt;strong&gt;Dub (or 自社開発)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;が最初の選択肢になるはずです。&lt;/p&gt;
</content:encoded></item><item><title>モバイルアプリ開発 ディープリンクについて</title><link>https://tutttuwi.github.io/posts/2026-05-11_flutter%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA-%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%AA%E3%83%B3%E3%82%AF%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2026-05-11_flutter%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA-%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%AA%E3%83%B3%E3%82%AF%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/</guid><description>Flutterアプリ開発のディープリンクについて</description><pubDate>Mon, 11 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概要&lt;/h2&gt;
&lt;p&gt;モバイルアプリ開発における「ディープリンク」について、iOS/Android それぞれの仕組み、セキュリティ面の注意点、そして Flutter での実装方法をまとめる。&lt;/p&gt;
&lt;p&gt;Web から特定のアプリ画面にユーザーを誘導したい、メールや SNS の URL から直接「商品詳細」「特定のチャット」に飛ばしたい、というのは現代のモバイルアプリでは当たり前の体験となっている。
その裏側で動いているのがディープリンクであり、その実装の正しさはユーザー体験だけでなく、フィッシングなどのセキュリティリスクにも直結する。&lt;/p&gt;
&lt;h2&gt;💻 環境&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Flutter: 3.41.4 (fvm)&lt;/li&gt;
&lt;li&gt;OS: macOS Tahoe&lt;/li&gt;
&lt;li&gt;IDE: Cursor&lt;/li&gt;
&lt;li&gt;iOS: 18 以降想定&lt;/li&gt;
&lt;li&gt;Android: 12 (API 31) 以降想定&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;🔗 ディープリンクとは&lt;/h2&gt;
&lt;p&gt;ディープリンクとは、Web の URL からアプリ内の特定画面に直接遷移させるリンクの総称。
モバイルにおけるディープリンクは、大きく以下の 3 種類に分類できる。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;種類&lt;/th&gt;
&lt;th&gt;iOS&lt;/th&gt;
&lt;th&gt;Android&lt;/th&gt;
&lt;th&gt;検証&lt;/th&gt;
&lt;th&gt;安全性&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Web URL ベース&lt;/td&gt;
&lt;td&gt;Universal Links&lt;/td&gt;
&lt;td&gt;App Links&lt;/td&gt;
&lt;td&gt;サーバ上の検証ファイル必須&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;カスタム URI スキーム&lt;/td&gt;
&lt;td&gt;&lt;code&gt;myapp://...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;myapp://...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;なし&lt;/td&gt;
&lt;td&gt;低&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deferred Deep Link&lt;/td&gt;
&lt;td&gt;3rd party SDK 等&lt;/td&gt;
&lt;td&gt;3rd party SDK 等&lt;/td&gt;
&lt;td&gt;サービス依存&lt;/td&gt;
&lt;td&gt;サービス依存&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;iOS: Universal Links&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;https://example.com/items/123&lt;/code&gt; のような &lt;strong&gt;通常の HTTPS URL&lt;/strong&gt; が、アプリがインストールされていればアプリで開かれ、未インストールであれば Safari で Web ページとして開かれる仕組み。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ドメインの所有者であることを Apple に検証させる&lt;/li&gt;
&lt;li&gt;検証ファイル: &lt;code&gt;https://example.com/.well-known/apple-app-site-association&lt;/code&gt; (AASA)&lt;/li&gt;
&lt;li&gt;AASA は &lt;strong&gt;Content-Type が &lt;code&gt;application/json&lt;/code&gt;&lt;/strong&gt;、リダイレクトなし、HTTPS 必須&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AASA の例:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;applinks&quot;: {
    &quot;apps&quot;: [],
    &quot;details&quot;: [
      {
        &quot;appID&quot;: &quot;TEAMID.com.example.myapp&quot;,
        &quot;paths&quot;: [ &quot;/items/*&quot;, &quot;/users/*&quot;, &quot;NOT /admin/*&quot; ]
      }
    ]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;appID&lt;/code&gt; は &lt;code&gt;&amp;lt;TeamID&amp;gt;.&amp;lt;BundleID&amp;gt;&lt;/code&gt; の形式&lt;/li&gt;
&lt;li&gt;iOS 13 以降は &lt;code&gt;details&lt;/code&gt; の &lt;code&gt;appIDs&lt;/code&gt;(複数) と &lt;code&gt;components&lt;/code&gt; を使う新フォーマットも推奨&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;iOS 側設定:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Xcode の &lt;strong&gt;Signing &amp;amp; Capabilities&lt;/strong&gt; で &lt;code&gt;Associated Domains&lt;/code&gt; を追加&lt;/li&gt;
&lt;li&gt;&lt;code&gt;applinks:example.com&lt;/code&gt; を登録&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Android: App Links&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;https://example.com/items/123&lt;/code&gt; のような HTTPS URL をアプリで処理する仕組み。Android 12 以降は &lt;strong&gt;デフォルトで未検証のリンクはアプリで開かれなくなった&lt;/strong&gt; ので、Web 検証が必須に近い扱いとなっている。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;検証ファイル: &lt;code&gt;https://example.com/.well-known/assetlinks.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;アプリ署名証明書の SHA-256 fingerprint を記載&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;assetlinks.json&lt;/code&gt; の例:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[
  {
    &quot;relation&quot;: [&quot;delegate_permission/common.handle_all_urls&quot;],
    &quot;target&quot;: {
      &quot;namespace&quot;: &quot;android_app&quot;,
      &quot;package_name&quot;: &quot;com.example.myapp&quot;,
      &quot;sha256_cert_fingerprints&quot;: [
        &quot;AA:BB:CC:...&quot;
      ]
    }
  }
]
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Google Play App Signing を使っている場合は Play Console の「アプリの署名」から &lt;strong&gt;アプリ署名鍵の SHA-256&lt;/strong&gt; を取得する(アップロード鍵ではない)&lt;/li&gt;
&lt;li&gt;検証コマンド:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;adb shell pm verify-app-links --re-verify com.example.myapp
adb shell pm get-app-links com.example.myapp
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;BundleID/カスタム URI スキーム (&lt;code&gt;myapp://...&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;myapp://item/123&lt;/code&gt; のようにアプリ独自のスキームを宣言してアプリを開く方式。
歴史的に最初に使われたディープリンクで、今でも OAuth コールバックなど一部用途では現役。&lt;/p&gt;
&lt;h4&gt;セキュリティ面の懸念&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;誰でも同じスキームを宣言できる&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;悪意あるアプリが先にインストールされていると、本来のアプリではなくそちらが起動される可能性&lt;/li&gt;
&lt;li&gt;認証コードやアクセストークンを URI で渡している場合、トークンの横取りに繋がる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ドメインのような所有権検証が存在しない&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;ユーザーから見て「これは正規アプリのリンクである」ことを保証できない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OS 側の挙動が不安定&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;iOS では同じスキームが複数ある場合、どのアプリが開くかは未定義&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;ベストプラクティス&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;新規実装ではまず &lt;strong&gt;Universal Links / App Links を第一候補にする&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;カスタム URI スキームを使う場合は:
&lt;ul&gt;
&lt;li&gt;スキーム名を &lt;strong&gt;アプリ固有かつ衝突しにくい命名&lt;/strong&gt; にする (例: &lt;code&gt;com.example.myapp&lt;/code&gt; を逆ドメインで)&lt;/li&gt;
&lt;li&gt;認証コールバックには &lt;strong&gt;PKCE&lt;/strong&gt; を併用し、トークン横取りを前提に防御&lt;/li&gt;
&lt;li&gt;URI 経由で渡される値は &lt;strong&gt;必ず検証&lt;/strong&gt; する(SQL/HTML エスケープ、整数範囲チェックなど)&lt;/li&gt;
&lt;li&gt;機微情報(JWT, refresh token など)を URI に載せない&lt;/li&gt;
&lt;li&gt;OAuth であれば RFC 8252 (Native Apps) で推奨される &lt;strong&gt;Claimed HTTPS スキーム = Universal Links/App Links&lt;/strong&gt; を優先&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Deferred Deep Link (DDL)&lt;/h3&gt;
&lt;p&gt;通常のディープリンクは「アプリがインストール済み」が前提だが、Deferred Deep Link は &lt;strong&gt;未インストール時のフローも含めて目的画面まで誘導する&lt;/strong&gt; 仕組み。&lt;/p&gt;
&lt;p&gt;典型的なフロー:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ユーザーが広告/SNS のリンクを踏む&lt;/li&gt;
&lt;li&gt;アプリ未インストールなので App Store / Play Store に誘導&lt;/li&gt;
&lt;li&gt;インストール後、初回起動時に「本来開きたかった画面」へ自動遷移&lt;/li&gt;
&lt;li&gt;ついでにインストールアトリビューション(どの広告から来たか)も取得&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;実装はストア側で URL パラメータを保持できないため、&lt;strong&gt;サードパーティ SDK の利用が一般的&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AppsFlyer&lt;/li&gt;
&lt;li&gt;Adjust&lt;/li&gt;
&lt;li&gt;Branch.io&lt;/li&gt;
&lt;li&gt;Firebase Dynamic Links (※ &lt;strong&gt;2025/8/25 にサービス終了済み&lt;/strong&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Firebase Dynamic Links が終了したことで、現状新規構築する場合は AppsFlyer / Adjust / Branch などの有償 SDK か、自前実装(初回起動時にクリップボードや IP+UserAgent でマッチング)するしかない。
自前実装は精度・プライバシー両面で難があるため、本格運用では SDK 採用が現実的。&lt;/p&gt;
&lt;h2&gt;🦋 Flutter での設定&lt;/h2&gt;
&lt;p&gt;Flutter ではプラットフォーム側 (iOS/Android) のネイティブ設定 + Dart 側でリンクを受け取るパッケージを組み合わせる。&lt;/p&gt;
&lt;p&gt;代表的なパッケージ:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pub.dev/packages/app_links&quot;&gt;&lt;code&gt;app_links&lt;/code&gt;&lt;/a&gt; (推奨。&lt;code&gt;uni_links&lt;/code&gt; の後継的存在)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;uni_links&lt;/code&gt; (メンテ停止気味)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;go_router&lt;/code&gt; (ルーティング側で deep link を吸収できる)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Dart 側: app_links を使う&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;import &apos;package:app_links/app_links.dart&apos;;
import &apos;package:flutter/material.dart&apos;;

class DeepLinkHandler extends StatefulWidget {
  final Widget child;
  const DeepLinkHandler({super.key, required this.child});

  @override
  State&amp;lt;DeepLinkHandler&amp;gt; createState() =&amp;gt; _DeepLinkHandlerState();
}

class _DeepLinkHandlerState extends State&amp;lt;DeepLinkHandler&amp;gt; {
  final _appLinks = AppLinks();

  @override
  void initState() {
    super.initState();
    _initDeepLinks();
  }

  Future&amp;lt;void&amp;gt; _initDeepLinks() async {
    // 起動時に URI で開かれた場合
    final initialUri = await _appLinks.getInitialAppLink();
    if (initialUri != null) {
      _handleUri(initialUri);
    }

    // 起動中にリンクで叩かれた場合
    _appLinks.uriLinkStream.listen(_handleUri);
  }

  void _handleUri(Uri uri) {
    // /items/123 のようなパスを解析してナビゲーション
    debugPrint(&apos;deep link: $uri&apos;);
  }

  @override
  Widget build(BuildContext context) =&amp;gt; widget.child;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;go_router&lt;/code&gt; を使う場合は &lt;code&gt;GoRouter&lt;/code&gt; の &lt;code&gt;redirect&lt;/code&gt; や &lt;code&gt;routes&lt;/code&gt; で &lt;code&gt;uri.path&lt;/code&gt; をそのままハンドリングできるので、より簡潔に書ける。&lt;/p&gt;
&lt;h3&gt;iOS 側設定&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;ios/Runner/Runner.entitlements&lt;/code&gt; に Associated Domains を追加&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;key&amp;gt;com.apple.developer.associated-domains&amp;lt;/key&amp;gt;
&amp;lt;array&amp;gt;
  &amp;lt;string&amp;gt;applinks:example.com&amp;lt;/string&amp;gt;
&amp;lt;/array&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;Xcode の Signing &amp;amp; Capabilities でも同じ設定を行う&lt;/li&gt;
&lt;li&gt;&lt;code&gt;https://example.com/.well-known/apple-app-site-association&lt;/code&gt; を &lt;strong&gt;HTTPS かつ Content-Type application/json かつリダイレクトなし&lt;/strong&gt; で配置&lt;/li&gt;
&lt;li&gt;カスタムスキームも併用する場合は &lt;code&gt;Info.plist&lt;/code&gt; に追加&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;key&amp;gt;CFBundleURLTypes&amp;lt;/key&amp;gt;
&amp;lt;array&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;CFBundleURLName&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;com.example.myapp&amp;lt;/string&amp;gt;
    &amp;lt;key&amp;gt;CFBundleURLSchemes&amp;lt;/key&amp;gt;
    &amp;lt;array&amp;gt;
      &amp;lt;string&amp;gt;myapp&amp;lt;/string&amp;gt;
    &amp;lt;/array&amp;gt;
  &amp;lt;/dict&amp;gt;
&amp;lt;/array&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Android 側設定&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;android/app/src/main/AndroidManifest.xml&lt;/code&gt; の &lt;code&gt;&amp;lt;activity&amp;gt;&lt;/code&gt; に intent-filter を追加:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;activity
    android:name=&quot;.MainActivity&quot;
    android:exported=&quot;true&quot;
    ... &amp;gt;

    &amp;lt;!-- App Links (HTTPS) --&amp;gt;
    &amp;lt;intent-filter android:autoVerify=&quot;true&quot;&amp;gt;
        &amp;lt;action android:name=&quot;android.intent.action.VIEW&quot; /&amp;gt;
        &amp;lt;category android:name=&quot;android.intent.category.DEFAULT&quot; /&amp;gt;
        &amp;lt;category android:name=&quot;android.intent.category.BROWSABLE&quot; /&amp;gt;
        &amp;lt;data android:scheme=&quot;https&quot;
              android:host=&quot;example.com&quot;
              android:pathPrefix=&quot;/items&quot; /&amp;gt;
    &amp;lt;/intent-filter&amp;gt;

    &amp;lt;!-- カスタムスキーム (任意) --&amp;gt;
    &amp;lt;intent-filter&amp;gt;
        &amp;lt;action android:name=&quot;android.intent.action.VIEW&quot; /&amp;gt;
        &amp;lt;category android:name=&quot;android.intent.category.DEFAULT&quot; /&amp;gt;
        &amp;lt;category android:name=&quot;android.intent.category.BROWSABLE&quot; /&amp;gt;
        &amp;lt;data android:scheme=&quot;myapp&quot; /&amp;gt;
    &amp;lt;/intent-filter&amp;gt;
&amp;lt;/activity&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;android:autoVerify=&quot;true&quot;&lt;/code&gt; を付けることで App Links として OS が &lt;code&gt;assetlinks.json&lt;/code&gt; を自動取得・検証する&lt;/li&gt;
&lt;li&gt;Play Store にアップロード後は &lt;strong&gt;アプリ署名鍵&lt;/strong&gt; の SHA-256 を &lt;code&gt;assetlinks.json&lt;/code&gt; に登録する必要がある(ローカルビルド時のデバッグ署名とは別物)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;動作確認コマンド&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# iOS Simulator
xcrun simctl openurl booted &quot;https://example.com/items/123&quot;
xcrun simctl openurl booted &quot;myapp://item/123&quot;

# Android (実機 / エミュレータ)
adb shell am start -a android.intent.action.VIEW -d &quot;https://example.com/items/123&quot; com.example.myapp
adb shell am start -a android.intent.action.VIEW -d &quot;myapp://item/123&quot; com.example.myapp
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;⚠️ その他知っておきたいこと&lt;/h2&gt;
&lt;h3&gt;1. アプリ未起動 / 起動済みで挙動が違う&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;コールドスタート&lt;/strong&gt;: &lt;code&gt;getInitialAppLink()&lt;/code&gt; で取得&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;バックグラウンドから復帰&lt;/strong&gt;: &lt;code&gt;uriLinkStream&lt;/code&gt; (StreamSubscription) で受け取り&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;両方を実装しないと「起動済みのときだけ動かない」「初回だけ動かない」というバグが起きやすい。&lt;/p&gt;
&lt;h3&gt;2. ナビゲーションスタックの設計&lt;/h3&gt;
&lt;p&gt;ディープリンクで深い階層に直接飛ばす場合、戻るボタンの遷移先がない、というのが頻出問題。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;例: 商品詳細にディープリンクで飛んできたユーザーが「戻る」を押したらアプリが落ちる&lt;/li&gt;
&lt;li&gt;対策: ホーム→商品一覧→詳細、のようにスタックを擬似的に積む or &lt;code&gt;go_router&lt;/code&gt; の &lt;code&gt;initialLocation&lt;/code&gt; 設計をする&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. ログインが必要な画面への遷移&lt;/h3&gt;
&lt;p&gt;ディープリンクで飛ばしたい画面が認証必須の場合、&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;リンク受信 → 認証状態チェック&lt;/li&gt;
&lt;li&gt;未認証ならログイン画面へ、ログイン後に本来の URI へ復元&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;という「保留 URI」の管理が必要。&lt;code&gt;go_router&lt;/code&gt; の &lt;code&gt;redirect&lt;/code&gt; と &lt;code&gt;state.matchedLocation&lt;/code&gt; が便利。&lt;/p&gt;
&lt;h3&gt;4. AASA / assetlinks.json のキャッシュ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;iOS は AASA を &lt;strong&gt;Apple の CDN 経由でキャッシュ&lt;/strong&gt; してから端末に配布する仕組みのため、自社サーバの AASA を更新しても &lt;strong&gt;すぐには端末に反映されない&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;開発中は &lt;strong&gt;アプリの再インストール&lt;/strong&gt; と、設定 &amp;gt; 開発者 &amp;gt; Associated Domains Development の有効化が役立つ&lt;/li&gt;
&lt;li&gt;Android は &lt;code&gt;adb shell pm verify-app-links --re-verify&lt;/code&gt; で再検証可能&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Apple CDN にキャッシュされている AASA を直接確認する&lt;/h4&gt;
&lt;p&gt;Apple 側がどの AASA をキャッシュしているかは、以下の URL から &lt;strong&gt;直接取得できる&lt;/strong&gt;。実機が見る AASA とほぼ同じ内容になっているはずなので、デプロイ後の反映確認はここを見るのが一番早い。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://app-site-association.cdn-apple.com/a/v1/&amp;lt;domain-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Apple CDN にキャッシュされた example.com の AASA を確認
curl -sS https://app-site-association.cdn-apple.com/a/v1/example.com | jq .

# 自社サーバ上の AASA との差分を見たい場合
diff \
  &amp;lt;(curl -sS https://example.com/.well-known/apple-app-site-association | jq -S .) \
  &amp;lt;(curl -sS https://app-site-association.cdn-apple.com/a/v1/example.com   | jq -S .)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ポイント:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;domain-name&amp;gt;&lt;/code&gt; には &lt;strong&gt;スキームなし&lt;/strong&gt; のドメインを入れる (例: &lt;code&gt;example.com&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;自社の AASA を更新した直後はここがまだ古いことがある。&lt;strong&gt;反映には数十分〜数時間かかる&lt;/strong&gt; ケースもある&lt;/li&gt;
&lt;li&gt;ここで取得できる JSON が「自社サーバの最新版と一致しているか」が、iOS の Universal Links が動く前提条件&lt;/li&gt;
&lt;li&gt;404 や古い内容が返る場合、AASA の Content-Type / リダイレクト / HTTPS 証明書まわりで弾かれている可能性が高いので、自社サーバ側の応答(ヘッダ含む)を再確認する&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5. 検証ツール&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;iOS: &lt;a href=&quot;https://search.developer.apple.com/appsearch-validation-tool&quot;&gt;Apple の App Search API Validation Tool&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Android: &lt;a href=&quot;https://developers.google.com/digital-asset-links/tools/generator&quot;&gt;Asset Links Tool / Statement List Generator&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6. プライバシーへの配慮&lt;/h3&gt;
&lt;p&gt;クリップボード経由で deferred deep link を実装すると、iOS 14 以降は &lt;strong&gt;クリップボードアクセス通知&lt;/strong&gt; がユーザーに表示されたり、App Tracking Transparency (ATT) の同意が必要になるケースがある。3rd party SDK を使う場合も、SDK が裏でやっている挙動を把握しておく。&lt;/p&gt;
&lt;h3&gt;7. ブラウザ → アプリ起動の &quot;クッション&quot;&lt;/h3&gt;
&lt;p&gt;SNS の WebView (Instagram, LINE 内ブラウザ等) からは Universal Links が &lt;strong&gt;WebView 内で開いてしまい、アプリに飛ばない&lt;/strong&gt; ことがある。
これに対しては中継ページで「アプリで開く」ボタンを置く、&lt;code&gt;intent://&lt;/code&gt; URI (Android Chrome) を使う、などのフォールバックを検討する。&lt;/p&gt;
&lt;h2&gt;あとがき&lt;/h2&gt;
&lt;p&gt;ディープリンクは「ただ URL を貼るだけ」に見えて、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ドメイン検証 (AASA/assetlinks.json)&lt;/li&gt;
&lt;li&gt;署名証明書の SHA-256&lt;/li&gt;
&lt;li&gt;アプリ側の intent-filter / Associated Domains&lt;/li&gt;
&lt;li&gt;起動状態によるハンドリング差&lt;/li&gt;
&lt;li&gt;ナビゲーションスタック設計&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;と複数レイヤが絡む地味に難しい領域。
特にカスタム URI スキームは「動くから OK」で済ませがちだが、OAuth 等で使うとセキュリティリスクに直結するので、まずは Universal Links / App Links を第一に検討するのが鉄則。&lt;/p&gt;
&lt;p&gt;Firebase Dynamic Links 終了で Deferred Deep Link は選択肢が減ったので、必要なら早めに代替 SDK の評価を始めるのがよさそう。&lt;/p&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.apple.com/documentation/xcode/supporting-associated-domains&quot;&gt;https://developer.apple.com/documentation/xcode/supporting-associated-domains&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.android.com/training/app-links&quot;&gt;https://developer.android.com/training/app-links&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc8252&quot;&gt;https://datatracker.ietf.org/doc/html/rfc8252&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pub.dev/packages/app_links&quot;&gt;https://pub.dev/packages/app_links&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://firebase.google.com/support/dynamic-links-faq&quot;&gt;https://firebase.google.com/support/dynamic-links-faq&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Oracle Cloud 関連資格の整理（2026年時点・OCI 2025 ラインアップ）</title><link>https://tutttuwi.github.io/posts/2026-05-01_oraclecloud%E9%96%A2%E9%80%A3%E8%B3%87%E6%A0%BC%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%81%BE%E3%81%A8%E3%82%81/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2026-05-01_oraclecloud%E9%96%A2%E9%80%A3%E8%B3%87%E6%A0%BC%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%81%BE%E3%81%A8%E3%82%81/</guid><description>Oracle Cloud Infrastructure（OCI）周りの認定資格を、レベル感と用途で整理した一覧と、受験の進め方・注意点のまとめ。受験料や形式は公式の最新情報で要確認。</description><pubDate>Fri, 01 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概要&lt;/h2&gt;
&lt;p&gt;Oracle Cloud（特に OCI）はサービスと認定試験のバリエーションが多く、名称に年度が付くため「どれから取ればよいか」「自分の役割に近いのはどれか」が分かりにくいです。本記事では &lt;strong&gt;2026 年時点で Oracle が提供している OCI 2025 Certification 系の主な試験&lt;/strong&gt;を、ジャンル・ざっくり難易度・学習期間の目安とあわせて一覧にし、あわせて受験の考え方の補足をまとめます。&lt;/p&gt;
&lt;p&gt;個々の試験の&lt;strong&gt;出題範囲の細部や問題傾向の深掘り&lt;/strong&gt;は扱いません。受験を決めたら、必ず &lt;a href=&quot;https://www.oracle.com/education/certification&quot;&gt;Oracle の認定ポータル&lt;/a&gt; と各試験ページのシラバスで確定してください。&lt;/p&gt;
&lt;h2&gt;目次&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#%E3%81%93%E3%81%AE%E8%A8%98%E4%BA%8B%E3%81%AE%E5%AF%BE%E8%B1%A1%E3%81%A8%E7%AF%84%E5%9B%B2&quot;&gt;この記事の対象と範囲&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#oracle-cloud-%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E4%B8%80%E8%A6%A7oci-2025-%E3%83%A9%E3%82%A4%E3%83%B3%E3%82%A2%E3%83%83%E3%83%972026-%E5%B9%B4%E6%99%82%E7%82%B9&quot;&gt;Oracle Cloud 認定資格一覧&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E8%A3%9C%E8%B6%B3%E9%87%8D%E8%A6%81%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88&quot;&gt;補足（重要ポイント）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E3%81%BE%E3%81%A8%E3%82%81&quot;&gt;まとめ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;この記事の対象と範囲&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;向いている読者&lt;/strong&gt;: OCI をこれから触る／触り始めた人、社内で資格取得を検討している人、なんとなく名前だけ聞いて地図が欲しい人。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分かること&lt;/strong&gt;: 主要な OCI 系認定のおおよその位置づけ、Fundamentals と Associate／Professional の違いのイメージ、学習の出発点の考え方。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分からないこと・しないこと&lt;/strong&gt;: 各試験の詳細シラバス解説、合格のための対策本の比較、正確な当日の受験料（地域・キャンペーンで変わるため）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以下の表は &lt;strong&gt;受験料・期間・受験方法は一般的な目安&lt;/strong&gt;です。特に Foundations 系の無料化やプロモーションは時期によって変わります。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Oracle Cloud 認定資格一覧（OCI 2025 ラインアップ、2026 年時点）&lt;/h2&gt;
&lt;p&gt;表は列数が多いため、&lt;strong&gt;狭い画面では横スクロール&lt;/strong&gt;になります。試験の正式名称・試験番号・当日の料金・利用可能な受験モードは、&lt;a href=&quot;https://www.oracle.com/education/certification&quot;&gt;Oracle Certification&lt;/a&gt; および &lt;a href=&quot;https://education.oracle.com/oracle-certification-exams-list&quot;&gt;Oracle University の試験一覧&lt;/a&gt; の各試験ページを優先してください。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;出典・確認日の目安&lt;/strong&gt;: 試験名は &lt;a href=&quot;https://www.oracle.com/education/certification&quot;&gt;Oracle Certification（Oracle Cloud Infrastructure 欄）&lt;/a&gt; の掲載（2026 年 5 月時点）と照合しています。HPE（Hands-on Performance Exam）など試験形式の説明は &lt;a href=&quot;https://blogs.oracle.com/oracleuniversity/oci-2025-certification-learning-paths-and-exams-now-available&quot;&gt;Oracle University の OCI 2025 認定向け告知&lt;/a&gt; も参考にしました。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;資格名&lt;/th&gt;
&lt;th&gt;ジャンル&lt;/th&gt;
&lt;th&gt;概要&lt;/th&gt;
&lt;th&gt;難易度&lt;/th&gt;
&lt;th&gt;受験料（目安）&lt;/th&gt;
&lt;th&gt;学習期間（目安）&lt;/th&gt;
&lt;th&gt;受験方法（目安）&lt;/th&gt;
&lt;th&gt;学習の手がかり&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Oracle Cloud Infrastructure 2025 Foundations Associate&lt;/td&gt;
&lt;td&gt;OCI 基礎&lt;/td&gt;
&lt;td&gt;OCI の基本概念（Compute, Storage, IAM）&lt;/td&gt;
&lt;td&gt;★&lt;/td&gt;
&lt;td&gt;無料〜（要確認）&lt;/td&gt;
&lt;td&gt;1〜2 週間&lt;/td&gt;
&lt;td&gt;オンラインが一般的&lt;/td&gt;
&lt;td&gt;Oracle University の Foundations 教材&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oracle Data Platform 2025 Foundations Associate&lt;/td&gt;
&lt;td&gt;データ基礎&lt;/td&gt;
&lt;td&gt;データ基盤・分析の基礎&lt;/td&gt;
&lt;td&gt;★&lt;/td&gt;
&lt;td&gt;無料〜（要確認）&lt;/td&gt;
&lt;td&gt;1〜2 週間&lt;/td&gt;
&lt;td&gt;オンラインが一般的&lt;/td&gt;
&lt;td&gt;Oracle University&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oracle Cloud Infrastructure 2025 AI Foundations Associate&lt;/td&gt;
&lt;td&gt;AI 基礎&lt;/td&gt;
&lt;td&gt;AI/ML・生成 AI の基本&lt;/td&gt;
&lt;td&gt;★&lt;/td&gt;
&lt;td&gt;無料〜（要確認）&lt;/td&gt;
&lt;td&gt;1〜2 週間&lt;/td&gt;
&lt;td&gt;オンラインが一般的&lt;/td&gt;
&lt;td&gt;Oracle AI Foundations 系教材&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oracle Cloud Infrastructure 2025 Architect Associate&lt;/td&gt;
&lt;td&gt;アーキテクト&lt;/td&gt;
&lt;td&gt;OCI 設計の基礎&lt;/td&gt;
&lt;td&gt;★★&lt;/td&gt;
&lt;td&gt;約 $150&lt;/td&gt;
&lt;td&gt;1〜2 ヶ月&lt;/td&gt;
&lt;td&gt;オンライン／会場（地域による）&lt;/td&gt;
&lt;td&gt;ラボ＋公式模擬・Learning Path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oracle Redwood Application 2025 Developer Associate&lt;/td&gt;
&lt;td&gt;アプリ開発&lt;/td&gt;
&lt;td&gt;Redwood UI ベースの開発&lt;/td&gt;
&lt;td&gt;★★&lt;/td&gt;
&lt;td&gt;約 $150&lt;/td&gt;
&lt;td&gt;1〜2 ヶ月&lt;/td&gt;
&lt;td&gt;オンラインが一般的&lt;/td&gt;
&lt;td&gt;Redwood 公式ドキュメント&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oracle Cloud Infrastructure 2025 Architect Professional&lt;/td&gt;
&lt;td&gt;上級設計&lt;/td&gt;
&lt;td&gt;高可用性・大規模設計（HPE 形式）&lt;/td&gt;
&lt;td&gt;★★★&lt;/td&gt;
&lt;td&gt;約 $245&lt;/td&gt;
&lt;td&gt;2〜3 ヶ月&lt;/td&gt;
&lt;td&gt;試験により指定あり&lt;/td&gt;
&lt;td&gt;実務＋公式 Hands-on 系準備&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oracle AI Vector Search Professional&lt;/td&gt;
&lt;td&gt;AI/DB&lt;/td&gt;
&lt;td&gt;ベクトル検索（AI 検索）&lt;/td&gt;
&lt;td&gt;★★&lt;/td&gt;
&lt;td&gt;約 $150&lt;/td&gt;
&lt;td&gt;約 1 ヶ月&lt;/td&gt;
&lt;td&gt;オンラインが一般的&lt;/td&gt;
&lt;td&gt;DB・AI 関連 Learning Path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oracle Cloud Infrastructure 2025 Multicloud Architect Professional&lt;/td&gt;
&lt;td&gt;マルチクラウド&lt;/td&gt;
&lt;td&gt;他クラウド等との連携設計&lt;/td&gt;
&lt;td&gt;★★★&lt;/td&gt;
&lt;td&gt;約 $245&lt;/td&gt;
&lt;td&gt;2〜3 ヶ月&lt;/td&gt;
&lt;td&gt;試験により指定あり&lt;/td&gt;
&lt;td&gt;マルチクラウド設計の公式教材&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oracle Cloud Infrastructure 2025 Networking Professional&lt;/td&gt;
&lt;td&gt;ネットワーク&lt;/td&gt;
&lt;td&gt;OCI ネットワーク設計&lt;/td&gt;
&lt;td&gt;★★★&lt;/td&gt;
&lt;td&gt;約 $245&lt;/td&gt;
&lt;td&gt;2〜3 ヶ月&lt;/td&gt;
&lt;td&gt;試験により指定あり&lt;/td&gt;
&lt;td&gt;VCN・接続の公式コース&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oracle Cloud Infrastructure 2025 Developer Professional&lt;/td&gt;
&lt;td&gt;開発&lt;/td&gt;
&lt;td&gt;OCI でのアプリ開発&lt;/td&gt;
&lt;td&gt;★★★&lt;/td&gt;
&lt;td&gt;約 $245&lt;/td&gt;
&lt;td&gt;2〜3 ヶ月&lt;/td&gt;
&lt;td&gt;試験により指定あり&lt;/td&gt;
&lt;td&gt;SDK/CLI・公式ラボ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oracle Cloud Infrastructure 2025 DevOps Professional&lt;/td&gt;
&lt;td&gt;DevOps&lt;/td&gt;
&lt;td&gt;CI/CD・自動化&lt;/td&gt;
&lt;td&gt;★★★&lt;/td&gt;
&lt;td&gt;約 $245&lt;/td&gt;
&lt;td&gt;2〜3 ヶ月&lt;/td&gt;
&lt;td&gt;試験により指定あり&lt;/td&gt;
&lt;td&gt;DevOps 系 Learning Path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oracle Analytics Cloud 2025 Professional&lt;/td&gt;
&lt;td&gt;分析&lt;/td&gt;
&lt;td&gt;BI/ダッシュボード&lt;/td&gt;
&lt;td&gt;★★★&lt;/td&gt;
&lt;td&gt;約 $245&lt;/td&gt;
&lt;td&gt;約 2 ヶ月&lt;/td&gt;
&lt;td&gt;オンラインが一般的&lt;/td&gt;
&lt;td&gt;OAC 公式教材&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oracle APEX Cloud Developer Professional&lt;/td&gt;
&lt;td&gt;ローコード&lt;/td&gt;
&lt;td&gt;APEX 開発&lt;/td&gt;
&lt;td&gt;★★★&lt;/td&gt;
&lt;td&gt;約 $245&lt;/td&gt;
&lt;td&gt;約 2 ヶ月&lt;/td&gt;
&lt;td&gt;オンラインが一般的&lt;/td&gt;
&lt;td&gt;APEX ハンズオン&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oracle Cloud Infrastructure 2025 Security Professional&lt;/td&gt;
&lt;td&gt;セキュリティ&lt;/td&gt;
&lt;td&gt;IAM・セキュリティスタック（HPE あり）&lt;/td&gt;
&lt;td&gt;★★★&lt;/td&gt;
&lt;td&gt;約 $245&lt;/td&gt;
&lt;td&gt;2〜3 ヶ月&lt;/td&gt;
&lt;td&gt;試験により指定あり&lt;/td&gt;
&lt;td&gt;セキュリティ公式シナリオ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oracle Cloud Infrastructure 2025 Cloud Operations Professional&lt;/td&gt;
&lt;td&gt;運用&lt;/td&gt;
&lt;td&gt;監視・運用設計&lt;/td&gt;
&lt;td&gt;★★★&lt;/td&gt;
&lt;td&gt;約 $245&lt;/td&gt;
&lt;td&gt;約 2 ヶ月&lt;/td&gt;
&lt;td&gt;試験により指定あり&lt;/td&gt;
&lt;td&gt;運用・管理系コース&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oracle Cloud Infrastructure 2025 Observability Professional&lt;/td&gt;
&lt;td&gt;可観測性&lt;/td&gt;
&lt;td&gt;ログ/メトリクス分析&lt;/td&gt;
&lt;td&gt;★★★&lt;/td&gt;
&lt;td&gt;約 $245&lt;/td&gt;
&lt;td&gt;約 2 ヶ月&lt;/td&gt;
&lt;td&gt;試験により指定あり&lt;/td&gt;
&lt;td&gt;Monitoring / Logging 公式教材&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oracle Cloud Infrastructure 2025 Migration Architect Professional&lt;/td&gt;
&lt;td&gt;移行&lt;/td&gt;
&lt;td&gt;クラウド移行戦略&lt;/td&gt;
&lt;td&gt;★★★&lt;/td&gt;
&lt;td&gt;約 $245&lt;/td&gt;
&lt;td&gt;2〜3 ヶ月&lt;/td&gt;
&lt;td&gt;試験により指定あり&lt;/td&gt;
&lt;td&gt;移行ツール・ベストプラクティス&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oracle Cloud Infrastructure 2025 Generative AI Professional&lt;/td&gt;
&lt;td&gt;生成 AI&lt;/td&gt;
&lt;td&gt;LLM 活用・設計&lt;/td&gt;
&lt;td&gt;★★★&lt;/td&gt;
&lt;td&gt;約 $245&lt;/td&gt;
&lt;td&gt;約 2 ヶ月&lt;/td&gt;
&lt;td&gt;オンラインが一般的&lt;/td&gt;
&lt;td&gt;GenAI 公式 Learning Path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oracle Cloud Infrastructure 2025 Data Science Professional&lt;/td&gt;
&lt;td&gt;データサイエンス&lt;/td&gt;
&lt;td&gt;ML/分析実装&lt;/td&gt;
&lt;td&gt;★★★&lt;/td&gt;
&lt;td&gt;約 $245&lt;/td&gt;
&lt;td&gt;2〜3 ヶ月&lt;/td&gt;
&lt;td&gt;試験により指定あり&lt;/td&gt;
&lt;td&gt;Data Science / OAC 関連&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oracle Cloud Infrastructure 2025 Application Integration Professional&lt;/td&gt;
&lt;td&gt;統合&lt;/td&gt;
&lt;td&gt;API/連携（OIC 等）&lt;/td&gt;
&lt;td&gt;★★★&lt;/td&gt;
&lt;td&gt;約 $245&lt;/td&gt;
&lt;td&gt;約 2 ヶ月&lt;/td&gt;
&lt;td&gt;オンラインが一般的&lt;/td&gt;
&lt;td&gt;Integration Cloud 公式コース&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oracle AI Cloud Database Services 2025 Professional&lt;/td&gt;
&lt;td&gt;DB×AI&lt;/td&gt;
&lt;td&gt;AI 対応 DB サービス&lt;/td&gt;
&lt;td&gt;★★★&lt;/td&gt;
&lt;td&gt;約 $245&lt;/td&gt;
&lt;td&gt;約 2 ヶ月&lt;/td&gt;
&lt;td&gt;試験により指定あり&lt;/td&gt;
&lt;td&gt;Autonomous DB 関連&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oracle AI Autonomous Database 2025 Professional&lt;/td&gt;
&lt;td&gt;自律 DB&lt;/td&gt;
&lt;td&gt;自動運用 DB&lt;/td&gt;
&lt;td&gt;★★★&lt;/td&gt;
&lt;td&gt;約 $245&lt;/td&gt;
&lt;td&gt;約 2 ヶ月&lt;/td&gt;
&lt;td&gt;試験により指定あり&lt;/td&gt;
&lt;td&gt;Autonomous Database 公式教材&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oracle Database@AWS Architect Professional&lt;/td&gt;
&lt;td&gt;DB/マルチ&lt;/td&gt;
&lt;td&gt;AWS 上の Oracle 設計&lt;/td&gt;
&lt;td&gt;★★★&lt;/td&gt;
&lt;td&gt;約 $245&lt;/td&gt;
&lt;td&gt;2〜3 ヶ月&lt;/td&gt;
&lt;td&gt;試験により指定あり&lt;/td&gt;
&lt;td&gt;Database@AWS 公式資料&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oracle Cloud Infrastructure for Sunbird ED Specialty&lt;/td&gt;
&lt;td&gt;教育&lt;/td&gt;
&lt;td&gt;教育プラットフォーム（Sunbird ED）&lt;/td&gt;
&lt;td&gt;★★&lt;/td&gt;
&lt;td&gt;約 $150&lt;/td&gt;
&lt;td&gt;約 1 ヶ月&lt;/td&gt;
&lt;td&gt;オンラインが一般的&lt;/td&gt;
&lt;td&gt;Sunbird ED 向け公式ガイド&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;免責（再掲）&lt;/strong&gt;: 受験料の通貨単位、割引・無料キャンペーン、Proctor 形式、試験の廃止・追加は告知どおり変わります。&lt;strong&gt;申し込み前に必ず各試験の公式ページで確認&lt;/strong&gt;してください。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;補足（重要ポイント）&lt;/h2&gt;
&lt;h3&gt;1. レベル感のざっくり整理&lt;/h3&gt;
&lt;p&gt;難易度の星はあくまでこの記事内での目安であり、公式の区分名とは一致しません。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;★（Fundamentals 相当）&lt;/strong&gt;&lt;br /&gt;
OCI やデータ、AI の「入口」。多くはアソシエイトより前段の位置づけで、&lt;strong&gt;無料で受けられるプロモーションが出やすい&lt;/strong&gt;区分です（常に無料とは限らない）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;★★（Associate 相当）&lt;/strong&gt;&lt;br /&gt;
特定ロールにフォーカスした&lt;strong&gt;実務入り口&lt;/strong&gt;。 Architect Associate のように汎用設計から、Redwood／Vector Search のように専門トピックに絞ったものまで含みます。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;★★★（Professional 相当）&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;設計判断・運用実務が前提&lt;/strong&gt;になることが多いです。&lt;a href=&quot;https://blogs.oracle.com/oracleuniversity/oci-2025-certification-learning-paths-and-exams-now-available&quot;&gt;Oracle University の OCI 2025 認定向け告知&lt;/a&gt; によれば、Architect Professional や Security Professional などは &lt;strong&gt;Hands-on Performance Exam（HPE）&lt;/strong&gt; のように、実機に近い課題で評価される形式もあります。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. Foundations（無料枠）の位置づけ&lt;/h3&gt;
&lt;p&gt;OCI / Data Platform / AI の Foundations は、&lt;strong&gt;チーム全体の共通言語づくり&lt;/strong&gt;や、自らの学習マップの確認に向きます。ここで終わらず、役割に応じて Associate 以降を組み合わせると「設計・実装」につながりやすいです。料金が無料ないし割引になるキャンペーンは期間限定のことがあるため、申込画面で確認してください。&lt;/p&gt;
&lt;h3&gt;3. おすすめの受験順の一例&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;一例にすぎません&lt;/strong&gt;（担当がデータ基盤のみ、なら Data Platform Foundations → DB 系、などルートは人によって変わります）。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Oracle Cloud Infrastructure 2025 Foundations Associate&lt;/strong&gt;（OCI の全体像）&lt;/li&gt;
&lt;li&gt;興味に応じて &lt;strong&gt;Oracle Data Platform 2025 Foundations Associate&lt;/strong&gt; または &lt;strong&gt;Oracle Cloud Infrastructure 2025 AI Foundations Associate&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;インフラ寄りなら &lt;strong&gt;Oracle Cloud Infrastructure 2025 Architect Associate&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;役割に合わせて &lt;strong&gt;Professional&lt;/strong&gt;（例: セキュリティ担当なら Security Professional、ネットワーク専任なら Networking Professional）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Professional は未受験でも受けられるものと、実務経験が推奨されるものがあります。&lt;strong&gt;前提条件は試験ごとの公式説明を参照&lt;/strong&gt;してください。&lt;/p&gt;
&lt;h3&gt;4. 受験方法・試験形式について&lt;/h3&gt;
&lt;p&gt;表の「オンライン／テストセンター」は&lt;strong&gt;大まかな例&lt;/strong&gt;です。実際には &lt;strong&gt;オンライン監督付き（プロクタ）／会場試験／HPE（パフォーマンス系）&lt;/strong&gt; など試験ごとに異なり、アカウントの地域や提携プロクタ会社の事情でも変わります。「すべての Professional が会場のみ」などと決めつけず、&lt;strong&gt;申込時の選択肢&lt;/strong&gt;で確定してください。&lt;/p&gt;
&lt;h3&gt;5. 試験名の「2025」と更新サイクル&lt;/h3&gt;
&lt;p&gt;試験名に付く **2025 は「その年度版のカリキュラム・シラバスに対応」**という意味に近く、「2026 年に受けても意味がない」わけではありません。一方で Oracle はサービス更新に合わせて試験内容を更新するため、&lt;strong&gt;受験直前にシラバスと Learning Path の更新履歴を見る&lt;/strong&gt;習慣があると安全です。古い教材だけでなく、公式の最新コースやブログ（例: Oracle University の OCI 2025 認定向け告知）をあわせて確認してください。&lt;/p&gt;
&lt;h3&gt;学習リソースについて&lt;/h3&gt;
&lt;p&gt;表の「学習の手がかり」列は、記事の保守をしやすくするために&lt;strong&gt;大分類だけ&lt;/strong&gt;に留めています。具体的なコース名・モジュールは変わりやすいので、各試験ページから &lt;strong&gt;Oracle University の対応 Learning Path / Exam Prep&lt;/strong&gt; に進むのが確実です。&lt;/p&gt;
&lt;p&gt;あわせて、以下の公式ドキュメント・比較資料・FAQ を参照すると、資格学習と実務の橋渡しがしやすくなります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.oracle.com/en-us/iaas/Content/home.htm&quot;&gt;Oracle Cloud Infrastructure Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://oracle-japan.github.io/ocidocs/&quot;&gt;Oracle Cloud Infrastracture 活用資料集&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://oracle-japan.github.io/ocitutorials/&quot;&gt;Oracle Cloud Infrastructure チュートリアル&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.oracle.com/cloud/service-comparison/&quot;&gt;Compare OCI with AWS, Azure, and Google Cloud&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.oracle.com/ja-jp/iaas/Content/GSG/Reference/faq.htm&quot;&gt;よくある質問とその回答&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.oracle.com/jp/cloud/free/&quot;&gt;Oracle Cloud Free Tier&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;本記事では、&lt;strong&gt;2026 年時点の Oracle 公式リストに沿った OCI 2025 ラインアップ中心の認定&lt;/strong&gt;を、ジャンルとレベル感で俯瞰できるように整理しました。次のステップは次の 3 点です。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://www.oracle.com/education/certification&quot;&gt;Oracle Certification&lt;/a&gt; で自分の関心に近い試験名を開き、&lt;strong&gt;シラバスと前提条件&lt;/strong&gt;を読む。&lt;/li&gt;
&lt;li&gt;受験料・スケジュール・利用可能な受験方式を &lt;strong&gt;申込フロー&lt;/strong&gt; で確定する。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;公式 Learning Path&lt;/strong&gt; で学習し、必要ならコミュニティや社内勉強会と組み合わせる。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;資格は学習の道しるべであり、実務の代替ではありませんが、OCI の幅広いサービスを把握するうえで、&lt;strong&gt;地図としての一覧&lt;/strong&gt;には役立つはずです。&lt;/p&gt;
</content:encoded></item><item><title>Claude Code Pro で 24 時間自律稼働させる実行可能ベストプラクティス</title><link>https://tutttuwi.github.io/posts/2026-04-28_claude-code-pro-%E8%87%AA%E5%BE%8B%E7%A8%BC%E5%83%8D-%E5%AE%9F%E8%A1%8C%E5%8F%AF%E8%83%BD%E3%83%99%E3%82%B9%E3%83%88%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2026-04-28_claude-code-pro-%E8%87%AA%E5%BE%8B%E7%A8%BC%E5%83%8D-%E5%AE%9F%E8%A1%8C%E5%8F%AF%E8%83%BD%E3%83%99%E3%82%B9%E3%83%88%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9/</guid><description>Pro プランの Claude Code を 24 時間自走させるための、コピペで動く設定・ループ・Hooks のベストプラクティス集</description><pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;この記事のゴール&lt;/h2&gt;
&lt;p&gt;「機能要件を 1 行書けば、寝ている間に PR が出来上がっている」という状態を、&lt;strong&gt;Pro プラン($20/月)でも実現する&lt;/strong&gt;ための最小構成のベストプラクティスをまとめます。&lt;/p&gt;
&lt;p&gt;ここでは「&lt;strong&gt;今日から導入できる実装手順&lt;/strong&gt;」だけを順序立てて並べていきます。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;全体像:5 層構成で考える&lt;/h2&gt;
&lt;p&gt;無人運用は、以下の 5 層をきれいに積み上げることで安定します。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart TB
    A[&quot;⑤ 永続実行層&amp;lt;br/&amp;gt;bash ループ + caffeinate + launchd&quot;]
    B[&quot;④ 分業層&amp;lt;br/&amp;gt;Skills + Subagents + MCP&quot;]
    C[&quot;③ 行動原則層&amp;lt;br/&amp;gt;CLAUDE.md + TODO.md&quot;]
    D[&quot;② 権限層&amp;lt;br/&amp;gt;settings.json + Hooks&quot;]
    E[&quot;① モデル層&amp;lt;br/&amp;gt;/model sonnet 固定&quot;]

    A --&amp;gt; B --&amp;gt; C --&amp;gt; D --&amp;gt; E

    style E fill:#e1f5ff,stroke:#0277bd
    style D fill:#fff3e0,stroke:#ef6c00
    style C fill:#f3e5f5,stroke:#7b1fa2
    style B fill:#e8f5e9,stroke:#2e7d32
    style A fill:#fce4ec,stroke:#c2185b
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;層&lt;/th&gt;
&lt;th&gt;役割&lt;/th&gt;
&lt;th&gt;主なツール&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;① モデル&lt;/td&gt;
&lt;td&gt;安定稼働&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/model sonnet&lt;/code&gt; 固定&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;② 権限&lt;/td&gt;
&lt;td&gt;暴走防止&lt;/td&gt;
&lt;td&gt;&lt;code&gt;settings.json&lt;/code&gt; の deny + Hooks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;③ 行動原則&lt;/td&gt;
&lt;td&gt;動作優先・止めない&lt;/td&gt;
&lt;td&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt; + &lt;code&gt;TODO.md&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;④ 分業&lt;/td&gt;
&lt;td&gt;コンテキスト圧迫回避&lt;/td&gt;
&lt;td&gt;Skills + Subagents + MCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⑤ 永続実行&lt;/td&gt;
&lt;td&gt;24 時間化&lt;/td&gt;
&lt;td&gt;bash ループ + &lt;code&gt;caffeinate&lt;/code&gt; + &lt;code&gt;launchd&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;すべて &lt;code&gt;.claude/&lt;/code&gt; 配下と &lt;code&gt;~/Library/LaunchAgents/&lt;/code&gt; だけで完結します。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;ベストプラクティス 1:モデルは &lt;code&gt;/model sonnet&lt;/code&gt; を明示する&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Pro プランでは Opus はそもそも使えませんが、&lt;strong&gt;Default のままだと週次 Opus 上限に当たってブロックされます&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;起動直後に必ず &lt;code&gt;/model sonnet&lt;/code&gt; を実行しましょう。5 時間制限なら自動切替が効くため止まりません。&lt;/li&gt;
&lt;li&gt;残量は &lt;code&gt;npx ccusage@latest blocks --live&lt;/code&gt; で常時確認できます。&lt;code&gt;statusLine&lt;/code&gt; に登録するとプロンプト下に常駐表示されます。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;真犯人は Cache Read&lt;/strong&gt; です。月初に &lt;code&gt;ccusage daily --breakdown&lt;/code&gt; で内訳を確認する習慣をつけてください。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;flowchart LR
    A[&quot;起動&quot;] --&amp;gt; B{&quot;/model 設定&quot;}
    B --&amp;gt;|&quot;Default のまま&quot;| C[&quot;❌ 週次 Opus 上限で&amp;lt;br/&amp;gt;ブロック&quot;]
    B --&amp;gt;|&quot;/model sonnet 明示&quot;| D[&quot;✅ 5h 上限のみ&amp;lt;br/&amp;gt;自動切替で継続&quot;]
    style C fill:#ffebee,stroke:#c62828
    style D fill:#e8f5e9,stroke:#2e7d32
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;ベストプラクティス 2:権限は「三層防衛」で固める&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;settings.json&lt;/code&gt; の deny には 2025〜2026 年に既知バグが残っているため、&lt;strong&gt;必ず PreToolUse Hook で重ねがけ&lt;/strong&gt;しましょう。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart TB
    Tool[&quot;Claude がツール実行を試みる&quot;] --&amp;gt; L1{&quot;① settings.json&amp;lt;br/&amp;gt;allow / deny&quot;}
    L1 --&amp;gt;|&quot;deny ヒット&quot;| Block1[&quot;🛑 ブロック&quot;]
    L1 --&amp;gt;|&quot;allow / 通過&quot;| L2{&quot;② PreToolUse Hook&amp;lt;br/&amp;gt;block-dangerous.sh&quot;}
    L2 --&amp;gt;|&quot;exit 2&quot;| Block2[&quot;🛑 ブロック&amp;lt;br/&amp;gt;(deny バグの保険)&quot;]
    L2 --&amp;gt;|&quot;exit 0&quot;| L3{&quot;③ DevContainer&amp;lt;br/&amp;gt;iptables ファイアウォール&quot;}
    L3 --&amp;gt;|&quot;許可外通信&quot;| Block3[&quot;🛑 ブロック&quot;]
    L3 --&amp;gt;|&quot;通過&quot;| Exec[&quot;✅ 実行&quot;]

    style Block1 fill:#ffebee,stroke:#c62828
    style Block2 fill:#ffebee,stroke:#c62828
    style Block3 fill:#ffebee,stroke:#c62828
    style Exec fill:#e8f5e9,stroke:#2e7d32
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;.claude/settings.json&lt;/code&gt; 最小テンプレ&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;permissions&quot;: {
    &quot;defaultMode&quot;: &quot;acceptEdits&quot;,
    &quot;allow&quot;: [
      &quot;Bash(npm:*)&quot;, &quot;Bash(pnpm:*)&quot;, &quot;Bash(git status)&quot;, &quot;Bash(git diff *)&quot;,
      &quot;Bash(git add *)&quot;, &quot;Bash(git commit -m *)&quot;, &quot;Bash(gh *)&quot;,
      &quot;Read&quot;, &quot;Edit&quot;, &quot;Write&quot;, &quot;Glob&quot;, &quot;Grep&quot;,
      &quot;mcp__playwright__*&quot;, &quot;mcp__github__*&quot;, &quot;mcp__context7__*&quot;
    ],
    &quot;ask&quot;: [&quot;Bash(git push *)&quot;],
    &quot;deny&quot;: [
      &quot;Read(./.env)&quot;, &quot;Read(./.env.*)&quot;, &quot;Read(**/.aws/**)&quot;, &quot;Read(**/.ssh/**)&quot;,
      &quot;Bash(rm -rf:*)&quot;, &quot;Bash(sudo:*)&quot;, &quot;Bash(curl:*)&quot;, &quot;Bash(wget:*)&quot;
    ]
  },
  &quot;hooks&quot;: {
    &quot;PreToolUse&quot;: [{
      &quot;matcher&quot;: &quot;Bash&quot;,
      &quot;hooks&quot;: [{ &quot;type&quot;: &quot;command&quot;,
        &quot;command&quot;: &quot;$CLAUDE_PROJECT_DIR/.claude/hooks/block-dangerous.sh&quot; }]
    }],
    &quot;PostToolUse&quot;: [{
      &quot;matcher&quot;: &quot;Edit|Write|MultiEdit&quot;,
      &quot;hooks&quot;: [
        { &quot;type&quot;: &quot;command&quot;, &quot;command&quot;: &quot;npx prettier --write \&quot;$CLAUDE_TOOL_INPUT_FILE_PATH\&quot; 2&amp;gt;/dev/null; true&quot; }
      ]
    }],
    &quot;Stop&quot;: [{
      &quot;hooks&quot;: [{ &quot;type&quot;: &quot;command&quot;,
        &quot;command&quot;: &quot;afplay /System/Library/Sounds/Glass.aiff &amp;amp; osascript -e &apos;display notification \&quot;Task done\&quot; with title \&quot;Claude Code\&quot;&apos;&quot; }]
    }]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;抑えておきたい原則&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;defaultMode: acceptEdits&lt;/code&gt;&lt;/strong&gt; が無人運用の基本です。&lt;code&gt;bypassPermissions&lt;/code&gt; は実機では使わないようにしてください。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;exit 2&lt;/code&gt; でブロッキング&lt;/strong&gt;できるのが Hook の強みです(Unix 慣習と逆なので注意してください)。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git push&lt;/code&gt; だけは &lt;code&gt;ask&lt;/code&gt; に置いて、PR 作成だけは人間が確認する運用が安全です。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;ベストプラクティス 3:CLAUDE.md は「200 行以下」「動作ルールだけ」&lt;/h2&gt;
&lt;p&gt;LLM の指示遵守は 150〜200 個が限界と言われています。&lt;code&gt;@docs/architecture.md&lt;/code&gt; のように外出しして、本体は &lt;strong&gt;行動原則&lt;/strong&gt; に絞りましょう。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart LR
    subgraph &quot;✅ CLAUDE.md (200 行以内)&quot;
        A1[&quot;動作原則&amp;lt;br/&amp;gt;3 つだけ&quot;]
        A2[&quot;禁止事項&amp;lt;br/&amp;gt;(git add -A など)&quot;]
        A3[&quot;@docs/... import&quot;]
    end
    subgraph &quot;📄 外部ファイル&quot;
        B1[&quot;docs/architecture.md&quot;]
        B2[&quot;docs/style-guide.md&quot;]
        B3[&quot;TODO.md&quot;]
    end
    A3 -.必要時にロード.-&amp;gt; B1
    A3 -.必要時にロード.-&amp;gt; B2
    A3 -.必要時にロード.-&amp;gt; B3
    style A1 fill:#e1f5ff
    style A2 fill:#e1f5ff
    style A3 fill:#e1f5ff
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;必須の 3 原則&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;動作優先・デザイン後回し&lt;/strong&gt;:UI は最低限の見た目で先に動かす&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;解決困難は TODO.md に「⚠️ Blocked」で記録して次へ&lt;/strong&gt;:3 回連続失敗したら諦める&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;完了報告の禁止条件&lt;/strong&gt;:failing tests / compile errors が残っていたら完了と言わせない&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;コピペテンプレ(抜粋)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;## 開発フロー
1. `git switch -c feat/&amp;lt;topic&amp;gt;` でブランチ作成
2. 実装 → `npm run typecheck` → `npm test` → Playwright 検証
3. 全グリーンで `git add -p` → Conventional Commits でコミット
4. 機能完了で `gh pr create --fill`

## 解決困難な課題
- 同じテストが 3 回連続失敗 → TODO.md に「⚠️ Blocked」追記して次へ
- 不確実な API は Context7 MCP で確認

## 禁止事項
- `git add -A` 禁止
- `.env*`、`*.pem` のコミット禁止
- `any`、`as`、`@ts-ignore` 禁止
- 既存テストの削除禁止
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;ベストプラクティス 4:Skills と Subagents で分業する&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;flowchart TB
    Main[&quot;🧠 メインエージェント&amp;lt;br/&amp;gt;(タスク分配)&quot;]

    subgraph &quot;Subagents (独立コンテキスト)&quot;
        S1[&quot;feature-implementer&amp;lt;br/&amp;gt;+ worktree 隔離&quot;]
        S2[&quot;test-writer&quot;]
        S3[&quot;code-reviewer&quot;]
        S4[&quot;debugger&quot;]
    end

    subgraph &quot;Skills (共有スキル)&quot;
        K1[&quot;commit&quot;]
        K2[&quot;run-tests-and-fix&quot;]
        K3[&quot;verify-in-browser&amp;lt;br/&amp;gt;(Playwright MCP)&quot;]
    end

    Main --&amp;gt; S1 &amp;amp; S2 &amp;amp; S3 &amp;amp; S4
    S1 -.使う.-&amp;gt; K1 &amp;amp; K2 &amp;amp; K3
    S2 -.使う.-&amp;gt; K2
    S1 -- 最終要約のみ返却 --&amp;gt; Main

    style Main fill:#fff3e0,stroke:#ef6c00
    style S1 fill:#e8f5e9
    style S2 fill:#e8f5e9
    style S3 fill:#e8f5e9
    style S4 fill:#e8f5e9
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Skills は 3 つだけ用意&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;.claude/skills/&amp;lt;name&amp;gt;/SKILL.md&lt;/code&gt; の YAML frontmatter は &lt;strong&gt;「◯◯と言ったら必ず使え」と押し気味に書く&lt;/strong&gt;のが Anthropic 推奨です。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Skill&lt;/th&gt;
&lt;th&gt;役割&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;commit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Conventional Commits を自動生成&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;run-tests-and-fix&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;テスト実行 + 失敗時の修正&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;verify-in-browser&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Playwright MCP で UI を実機検証&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Subagents は 4 つに絞る&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;.claude/agents/&amp;lt;name&amp;gt;.md&lt;/code&gt; に独立コンテキスト・独立権限のエージェントを定義します。&lt;strong&gt;最終要約だけ親に返る&lt;/strong&gt;ためメインを汚染しません。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;feature-implementer&lt;/code&gt;(実装、&lt;code&gt;isolation: worktree&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;test-writer&lt;/code&gt;(テスト作成)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;code-reviewer&lt;/code&gt;(レビュー)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;debugger&lt;/code&gt;(デバッグ)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;5 個以上に増やすと選択ミスが増えます。&lt;strong&gt;3〜7 個が黄金比&lt;/strong&gt;です。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;ベストプラクティス 5:MCP は &lt;code&gt;.mcp.json&lt;/code&gt; ルート直下に置く&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;.claude/.mcp.json&lt;/code&gt; だと一部読み込まれない既知不具合があります。&lt;strong&gt;必ずプロジェクトルート&lt;/strong&gt;に置いてください。&lt;/p&gt;
&lt;p&gt;無人運用に効く 7 点セット:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;mcpServers&quot;: {
    &quot;github&quot;: {
      &quot;type&quot;: &quot;http&quot;,
      &quot;url&quot;: &quot;https://api.githubcopilot.com/mcp&quot;,
      &quot;headers&quot;: { &quot;Authorization&quot;: &quot;Bearer ${GITHUB_PAT}&quot; }
    },
    &quot;playwright&quot;: { &quot;command&quot;: &quot;npx&quot;, &quot;args&quot;: [&quot;@playwright/mcp@latest&quot;, &quot;--browser=chromium&quot;] },
    &quot;chrome-devtools&quot;: { &quot;command&quot;: &quot;npx&quot;, &quot;args&quot;: [&quot;chrome-devtools-mcp@latest&quot;] },
    &quot;context7&quot;: { &quot;command&quot;: &quot;npx&quot;, &quot;args&quot;: [&quot;-y&quot;, &quot;@upstash/context7-mcp@latest&quot;] },
    &quot;sequential-thinking&quot;: { &quot;command&quot;: &quot;npx&quot;, &quot;args&quot;: [&quot;-y&quot;, &quot;@modelcontextprotocol/server-sequential-thinking&quot;] },
    &quot;memory&quot;: { &quot;command&quot;: &quot;npx&quot;, &quot;args&quot;: [&quot;-y&quot;, &quot;@modelcontextprotocol/server-memory&quot;] }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;code&gt;@modelcontextprotocol/server-github&lt;/code&gt; の npm 版は &lt;strong&gt;2025/4 に deprecated&lt;/strong&gt; になりました。GitHub 公式の HTTP 版を使ってください。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;ベストプラクティス 6:TODO.md 駆動の無限ループで 24 時間化&lt;/h2&gt;
&lt;p&gt;「LLM の記憶を信じない、ファイルに状態を書き続ける」という &lt;strong&gt;Ralph Wiggum ループ思想&lt;/strong&gt;が核になります。各イテレーションは &lt;strong&gt;フレッシュコンテキスト&lt;/strong&gt; で開始し、知識は Git と TODO.md で永続化させます。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart TB
    Start([&quot;🌙 launchd 22:00 起動&quot;]) --&amp;gt; Loop{&quot;TODO.md に&amp;lt;br/&amp;gt;[ ] タスクあり?&quot;}
    Loop --&amp;gt;|&quot;なし&quot;| Done([&quot;🎉 全完了通知&amp;lt;br/&amp;gt;(osascript)&quot;])
    Loop --&amp;gt;|&quot;あり&quot;| Fresh[&quot;🆕 フレッシュ Claude 起動&amp;lt;br/&amp;gt;(timeout 30m)&quot;]
    Fresh --&amp;gt; Impl[&quot;実装 → テスト → コミット&amp;lt;br/&amp;gt;→ TODO.md 更新&quot;]
    Impl --&amp;gt; Check{&quot;結果&quot;}
    Check --&amp;gt;|&quot;ITERATION_COMPLETE&quot;| Loop
    Check --&amp;gt;|&quot;usage limit&quot;| Wait[&quot;⏰ リセット時刻まで&amp;lt;br/&amp;gt;caffeinate -i sleep&quot;]
    Wait --&amp;gt; Loop
    Check --&amp;gt;|&quot;3 回連続失敗&quot;| Block[&quot;⚠️ TODO.md に Blocked 追記&quot;]
    Block --&amp;gt; Loop

    style Start fill:#e1f5ff
    style Done fill:#e8f5e9
    style Wait fill:#fff3e0
    style Block fill:#ffebee
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;claude-loop.sh&lt;/code&gt;(macOS / Linux 両対応・最小版)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;#!/usr/bin/env bash
set -uo pipefail
TODO=&quot;$(pwd)/TODO.md&quot;; LOG_DIR=&quot;$(pwd)/.claude-loop&quot;; mkdir -p &quot;$LOG_DIR&quot;
ITER=0; MAX_ITER=&quot;${MAX_ITER:-50}&quot;

while (( ITER &amp;lt; MAX_ITER )); do
  ITER=$((ITER + 1)); LOG=&quot;$LOG_DIR/iter_${ITER}.log&quot;

  # 未完了タスクが無ければ終了
  grep -qE &apos;^\s*-\s*\[\s*\]&apos; &quot;$TODO&quot; 2&amp;gt;/dev/null || {
    osascript -e &apos;display notification &quot;ALL DONE 🎉&quot; with title &quot;Claude Loop&quot;&apos;
    break
  }

  timeout 30m claude -p &quot;TODO.md の最上位 [ ] タスクを実装→テスト→コミット→[x]更新。
完了で &apos;ITERATION_COMPLETE&apos; を最終行に出力。3 回連続失敗で ⚠️Blocked 追記して次へ。&quot; \
    --permission-mode acceptEdits --output-format text 2&amp;gt;&amp;amp;1 | tee &quot;$LOG&quot;

  # リミット検知 → リセット時刻まで待機
  if grep -qiE &quot;usage limit reached&quot; &quot;$LOG&quot;; then
    reset=$(grep -oE &apos;reset at [0-9]+(am|pm)&apos; &quot;$LOG&quot; | tail -1 | awk &apos;{print $3}&apos;)
    sleep_for=$(( $(date -j -f &apos;%I%p&apos; &quot;$reset&quot; +%s 2&amp;gt;/dev/null || echo 1800) - $(date +%s) + 60 ))
    (( sleep_for &amp;lt; 60 )) &amp;amp;&amp;amp; sleep_for=1800
    caffeinate -i sleep &quot;$sleep_for&quot;
  fi
done
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;tmux で起動する場合&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;tmux new-session -d -s claude-loop \
  &quot;caffeinate -i ./claude-loop.sh &amp;gt; .claude-loop/run.log 2&amp;gt;&amp;amp;1&quot;
tmux attach -t claude-loop   # 監視
# Ctrl+b d でデタッチ
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;ベストプラクティス 7:Mac の launchd で完全無人化(cron は使わない)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;cron は寝てる Mac では発火しません&lt;/strong&gt;。launchd 一択です。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart LR
    A[&quot;💤 Mac スリープ中&quot;] --&amp;gt; B{{&quot;launchd&amp;lt;br/&amp;gt;22:00 起床&quot;}}
    B --&amp;gt; C[&quot;caffeinate -i&amp;lt;br/&amp;gt;(スリープ抑止)&quot;]
    C --&amp;gt; D[&quot;claude-loop.sh&quot;]
    D --&amp;gt; E[&quot;朝起きたら&amp;lt;br/&amp;gt;PR が積み上がっている&quot;]

    style A fill:#eceff1
    style B fill:#e1f5ff,stroke:#0277bd
    style C fill:#fff3e0
    style E fill:#e8f5e9,stroke:#2e7d32
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;~/Library/LaunchAgents/com.user.claude-loop.plist&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;plist version=&quot;1.0&quot;&amp;gt;&amp;lt;dict&amp;gt;
  &amp;lt;key&amp;gt;Label&amp;lt;/key&amp;gt;&amp;lt;string&amp;gt;com.user.claude-loop&amp;lt;/string&amp;gt;
  &amp;lt;key&amp;gt;ProgramArguments&amp;lt;/key&amp;gt;&amp;lt;array&amp;gt;
    &amp;lt;string&amp;gt;/usr/bin/caffeinate&amp;lt;/string&amp;gt;&amp;lt;string&amp;gt;-i&amp;lt;/string&amp;gt;
    &amp;lt;string&amp;gt;/bin/bash&amp;lt;/string&amp;gt;&amp;lt;string&amp;gt;-lc&amp;lt;/string&amp;gt;
    &amp;lt;string&amp;gt;cd /Users/me/projects/myapp &amp;amp;&amp;amp; /usr/local/bin/claude-loop.sh&amp;lt;/string&amp;gt;
  &amp;lt;/array&amp;gt;
  &amp;lt;key&amp;gt;StartCalendarInterval&amp;lt;/key&amp;gt;
    &amp;lt;dict&amp;gt;&amp;lt;key&amp;gt;Hour&amp;lt;/key&amp;gt;&amp;lt;integer&amp;gt;22&amp;lt;/integer&amp;gt;&amp;lt;key&amp;gt;Minute&amp;lt;/key&amp;gt;&amp;lt;integer&amp;gt;0&amp;lt;/integer&amp;gt;&amp;lt;/dict&amp;gt;
  &amp;lt;key&amp;gt;EnvironmentVariables&amp;lt;/key&amp;gt;
    &amp;lt;dict&amp;gt;&amp;lt;key&amp;gt;PATH&amp;lt;/key&amp;gt;&amp;lt;string&amp;gt;/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin&amp;lt;/string&amp;gt;&amp;lt;/dict&amp;gt;
  &amp;lt;key&amp;gt;StandardOutPath&amp;lt;/key&amp;gt;&amp;lt;string&amp;gt;/Users/me/.claude-loop/stdout.log&amp;lt;/string&amp;gt;
  &amp;lt;key&amp;gt;StandardErrorPath&amp;lt;/key&amp;gt;&amp;lt;string&amp;gt;/Users/me/.claude-loop/stderr.log&amp;lt;/string&amp;gt;
&amp;lt;/dict&amp;gt;&amp;lt;/plist&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4 つの「壁」を事前に潰しましょう(GMO ペパボの知見)&lt;/h3&gt;
&lt;p&gt;cron / launchd で自走させるとき、毎回ハマる 4 つのポイントがあります。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart LR
    Start[&quot;🚀 launchd 起動&quot;] --&amp;gt; W1{&quot;壁 ①&amp;lt;br/&amp;gt;Bypass&amp;lt;br/&amp;gt;permissions&quot;}
    W1 --&amp;gt;|&quot;OK&quot;| W2{&quot;壁 ②&amp;lt;br/&amp;gt;Trust this&amp;lt;br/&amp;gt;folder&quot;}
    W2 --&amp;gt;|&quot;OK&quot;| W3{&quot;壁 ③&amp;lt;br/&amp;gt;MCP&amp;lt;br/&amp;gt;allow/deny&quot;}
    W3 --&amp;gt;|&quot;OK&quot;| W4{&quot;壁 ④&amp;lt;br/&amp;gt;ファイル&amp;lt;br/&amp;gt;除外リスト&quot;}
    W4 --&amp;gt;|&quot;OK&quot;| Run[&quot;✅ 自走開始&quot;]

    W1 -.解決策.-&amp;gt; S1[&quot;acceptEdits 設定&quot;]
    W2 -.解決策.-&amp;gt; S2[&quot;事前に対話モードで&amp;lt;br/&amp;gt;一度開く&quot;]
    W3 -.解決策.-&amp;gt; S3[&quot;事前 allowlist&quot;]
    W4 -.解決策.-&amp;gt; S4[&quot;.env 等の deny を&amp;lt;br/&amp;gt;settings.json に&quot;]

    style Run fill:#e8f5e9,stroke:#2e7d32
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;壁&lt;/th&gt;
&lt;th&gt;内容&lt;/th&gt;
&lt;th&gt;解決策&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;① Bypass permissions&lt;/td&gt;
&lt;td&gt;権限プロンプトで止まる&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--permission-mode acceptEdits&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;② Trust this folder&lt;/td&gt;
&lt;td&gt;初回起動で信頼確認&lt;/td&gt;
&lt;td&gt;対話モードで一度開く、もしくは &lt;code&gt;~/.claude.json&lt;/code&gt; の &lt;code&gt;hasTrustDialogAccepted: true&lt;/code&gt; を直書き&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;③ MCP の allow/deny&lt;/td&gt;
&lt;td&gt;MCP ツールで止まる&lt;/td&gt;
&lt;td&gt;事前に対話モードで一度許可&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;④ ファイル除外&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.env&lt;/code&gt; などへのアクセス&lt;/td&gt;
&lt;td&gt;settings.json の deny に明記&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;推奨ディレクトリ構成&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;~/projects/myapp/
├── CLAUDE.md                  # 200 行以下、行動原則だけ
├── TODO.md                    # [ ] / [x] / ⚠️ Blocked
├── .mcp.json                  # ルート直下が必須
├── .claude/
│   ├── settings.json          # 権限 + Hooks
│   ├── skills/{commit,run-tests-and-fix,verify-in-browser}/SKILL.md
│   ├── agents/{feature-implementer,test-writer,code-reviewer,debugger}.md
│   └── hooks/block-dangerous.sh
└── specs/&amp;lt;feature&amp;gt;/{requirements,design,tasks}.md   # SDD
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;全体の流れ:要件 1 行から PR まで&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sequenceDiagram
    actor User as 👤 あなた
    participant TODO as 📝 TODO.md
    participant Loop as 🔁 claude-loop.sh
    participant Claude as 🧠 Claude (Sonnet)
    participant Sub as 👥 Subagents
    participant GH as 🐙 GitHub

    User-&amp;gt;&amp;gt;TODO: 機能要件を 1 行追記
    User-&amp;gt;&amp;gt;Loop: launchd 22:00 起動
    loop 各タスク (フレッシュコンテキスト)
        Loop-&amp;gt;&amp;gt;Claude: TODO の [ ] タスクを渡す
        Claude-&amp;gt;&amp;gt;Sub: feature-implementer に委譲
        Sub-&amp;gt;&amp;gt;Sub: 実装 + test-writer + reviewer
        Sub--&amp;gt;&amp;gt;Claude: 完了要約のみ返却
        Claude-&amp;gt;&amp;gt;GH: gh pr create --fill
        Claude-&amp;gt;&amp;gt;TODO: [x] に更新
    end
    Loop-&amp;gt;&amp;gt;User: 🎉 朝起きたら PR が並んでいる
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;チェックリスト:今日やること&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[ ] &lt;code&gt;/model sonnet&lt;/code&gt; を明示する習慣をつける&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;ccusage statusline&lt;/code&gt; を &lt;code&gt;~/.claude/settings.json&lt;/code&gt; に登録する&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;.claude/settings.json&lt;/code&gt; の deny に &lt;code&gt;.env&lt;/code&gt; / &lt;code&gt;rm -rf&lt;/code&gt; / &lt;code&gt;sudo&lt;/code&gt; を追加する&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;.claude/hooks/block-dangerous.sh&lt;/code&gt; で deny を二重化する&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;CLAUDE.md&lt;/code&gt; を 200 行以下に削り、3 原則を明記する&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;.mcp.json&lt;/code&gt; をルート直下に置き、Playwright + GitHub + Context7 を登録する&lt;/li&gt;
&lt;li&gt;[ ] Skills を &lt;code&gt;commit&lt;/code&gt; / &lt;code&gt;run-tests-and-fix&lt;/code&gt; / &lt;code&gt;verify-in-browser&lt;/code&gt; の 3 つだけ作る&lt;/li&gt;
&lt;li&gt;[ ] Subagents を 4 つに絞る(&lt;code&gt;isolation: worktree&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;claude-loop.sh&lt;/code&gt; + &lt;code&gt;caffeinate&lt;/code&gt; で tmux 起動を試す&lt;/li&gt;
&lt;li&gt;[ ] 安定したら launchd plist で 22:00 起動に登録する&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;Pro プランで 24 時間自律稼働させる肝は、派手な機能ではなく &lt;strong&gt;地味な 3 つの徹底&lt;/strong&gt; にあります。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;権限は三層で固める&lt;/strong&gt;(settings の allow/deny + PreToolUse Hook + DevContainer)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;行動原則は短く書く&lt;/strong&gt;(CLAUDE.md は 200 行、解決困難は次へ)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;状態はファイルに書く&lt;/strong&gt;(TODO.md + Git で記憶を永続化、コンテキストはフレッシュ)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;これに &lt;code&gt;caffeinate&lt;/code&gt; + &lt;code&gt;launchd&lt;/code&gt; という 2 つの Mac 固有の小技を足せば、寝ている間に PR が積み上がる環境が完成します。残るボトルネックは Claude ではなく &lt;strong&gt;人間が書く要件の質&lt;/strong&gt; だけで、それを &lt;code&gt;requirements.md&lt;/code&gt; に EARS 記法で書ければ、あとは任せられます。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;関連&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;元の網羅版:[[2026-04-28_Claude Code を Pro プランで 24 時間自律稼働させる完全ガイド.md]]&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Claude Code を Pro プランで 24 時間自律稼働させる完全ガイド</title><link>https://tutttuwi.github.io/posts/2026-04-28_claude-code-%E3%82%92-pro-%E3%83%97%E3%83%A9%E3%83%B3%E3%81%A7-24-%E6%99%82%E9%96%93%E8%87%AA%E5%BE%8B%E7%A8%BC%E5%83%8D%E3%81%95%E3%81%9B%E3%82%8B%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2026-04-28_claude-code-%E3%82%92-pro-%E3%83%97%E3%83%A9%E3%83%B3%E3%81%A7-24-%E6%99%82%E9%96%93%E8%87%AA%E5%BE%8B%E7%A8%BC%E5%83%8D%E3%81%95%E3%81%9B%E3%82%8B%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89/</guid><pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概要&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;機能要件さえ書けば無人で開発が進む究極のセットアップは、5 つの層を組み合わせれば 2026 年 5 月時点で実現可能&lt;/strong&gt; です。&lt;code&gt;--permission-mode acceptEdits&lt;/code&gt;、&lt;code&gt;.claude/settings.json&lt;/code&gt; の hooks、Subagents と Skills、&lt;code&gt;.mcp.json&lt;/code&gt; での Playwright/GitHub MCP、そして Mac の &lt;code&gt;launchd&lt;/code&gt; + &lt;code&gt;caffeinate&lt;/code&gt; + &lt;code&gt;tmux&lt;/code&gt; でラップする &lt;strong&gt;Ralph Loop&lt;/strong&gt;──これだけで「PROMPT.md / fix_plan.md 駆動の自律実装ループ」が成立します。&lt;/p&gt;
&lt;p&gt;Anthropic は 2025 年 7 月発表 / 8 月施行でユーザーの &lt;strong&gt;5% 未満&lt;/strong&gt; しか引っかからない週次リミットを導入し、&lt;strong&gt;2025 年 9 月の Claude Code 2.0 で Checkpointing と VS Code 拡張&lt;/strong&gt;(Plan Mode 自体は Shift+Tab で 2.0 以前から存在)、&lt;strong&gt;2025 年 10 月で Skills&lt;/strong&gt;、&lt;strong&gt;2026 年 2 月で Agent Teams (実験的)&lt;/strong&gt;、&lt;strong&gt;2026 年 3 月で &lt;code&gt;--permission-mode auto&lt;/code&gt;&lt;/strong&gt;、&lt;strong&gt;2026 年 4 月で Routines(クラウド定期実行)&lt;/strong&gt; と Opus 4.7 を順次解放しました。&lt;strong&gt;Pro プランは Sonnet 4.6 中心&lt;/strong&gt;(Opus 4.7 は Max プラン以上が前提)で「機能要件 1 行 → spec 生成 → 自律実装 → 自動検証 → PR 作成」までほぼ無人で回すことができ、リミット到達時は Claude が返すリセット時刻を bash でパースして &lt;code&gt;caffeinate -i sleep&lt;/code&gt; で待機させればよいのです。&lt;/p&gt;
&lt;p&gt;本稿では公式ドキュメント・GitHub の主要 OSS・Zenn / Qiita の実装事例を統合し、コピペで動くテンプレート一式を提示します。&lt;/p&gt;
&lt;h3&gt;全体アーキテクチャ&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;flowchart TB
    User[&quot;👤 機能要件 1 行&quot;] --&amp;gt; Loop[&quot;🔁 ralph-loop.sh&amp;lt;br/&amp;gt;(.ralph/PROMPT.md 駆動)&quot;]

    subgraph &quot;5 つの層&quot;
        L5[&quot;⑤ launchd + caffeinate + tmux&amp;lt;br/&amp;gt;= 24 時間自走&quot;]
        L4[&quot;④ Skills + Subagents + MCP&amp;lt;br/&amp;gt;= 分業と外部連携&quot;]
        L3[&quot;③ CLAUDE.md + .ralph/fix_plan.md&amp;lt;br/&amp;gt;= 行動原則と作業キュー&quot;]
        L2[&quot;② settings.json + Hooks&amp;lt;br/&amp;gt;(Stop で Ralph 継続強制)&quot;]
        L1[&quot;① /model sonnet 固定&amp;lt;br/&amp;gt;= 安定稼働&quot;]
    end

    Loop --&amp;gt; L5 --&amp;gt; L4 --&amp;gt; L3 --&amp;gt; L2 --&amp;gt; L1
    L1 --&amp;gt; PR[&quot;🐙 GitHub PR&amp;lt;br/&amp;gt;朝起きたら完成&quot;]

    style User fill:#fff3e0
    style PR fill:#e8f5e9,stroke:#2e7d32
    style Loop fill:#e1f5ff,stroke:#0277bd
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Pro プランの二層リミットと「Sonnet 固定」の鉄則&lt;/h2&gt;
&lt;p&gt;Anthropic のサブスクリプションは 2025 年 8 月 28 日以降、&lt;strong&gt;5 時間セッション(rolling)と週次リミット&lt;/strong&gt; の二層構造に変わりました。プラン別の上限は次の通りです。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;プラン&lt;/th&gt;
&lt;th&gt;月額&lt;/th&gt;
&lt;th&gt;5h あたり&lt;/th&gt;
&lt;th&gt;週次 Sonnet&lt;/th&gt;
&lt;th&gt;週次 Opus&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;$20&lt;/td&gt;
&lt;td&gt;約 45 メッセージ&lt;/td&gt;
&lt;td&gt;40〜80 時間&lt;/td&gt;
&lt;td&gt;❌ ほぼ不可&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max 5x&lt;/td&gt;
&lt;td&gt;$100&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;140〜280 時間&lt;/td&gt;
&lt;td&gt;15〜35 時間&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max 20x&lt;/td&gt;
&lt;td&gt;$200&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;240〜480 時間&lt;/td&gt;
&lt;td&gt;24〜40 時間&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Pro プランは事実上 Sonnet 専用&lt;/strong&gt;です(2026 年 5 月時点)。Opus 4.7 を本格利用したいなら Max 5x 以上に上げる必要があります。リミット超過時は &lt;code&gt;extra usage&lt;/code&gt; を有効にすれば、標準 API レートで継続課金できます。あるいは後述の &lt;code&gt;claude-code-router&lt;/code&gt; で OpenRouter 等の API へ動的にスワップする運用もあります。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart LR
    A[&quot;起動&quot;] --&amp;gt; B{&quot;/model 設定&quot;}
    B --&amp;gt;|&quot;Default のまま&quot;| C[&quot;❌ 週次 Opus 上限で&amp;lt;br/&amp;gt;ブロック&quot;]
    B --&amp;gt;|&quot;/model sonnet 明示&quot;| D[&quot;✅ 5h 上限のみ&amp;lt;br/&amp;gt;自動切替で継続&quot;]
    style C fill:#ffebee,stroke:#c62828
    style D fill:#e8f5e9,stroke:#2e7d32
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;無人運用で最も詰まるのは(Max プラン以上の場合)「&lt;code&gt;/model&lt;/code&gt; を &lt;strong&gt;Default (recommended)&lt;/strong&gt; にしていると、週次の Opus 上限到達時に Sonnet へ自動フォールバックせずブロックされる」点です。&lt;strong&gt;&lt;code&gt;/model sonnet&lt;/code&gt; を明示&lt;/strong&gt; すれば 5 時間制限は自動切替が効きます(&lt;a href=&quot;https://qiita.com/takezone/items/e6da864ff9e31b0875ca&quot;&gt;Qiita @takezone&lt;/a&gt;)。Pro プランの場合は最初から Sonnet 固定なのでこの問題は生じませんが、習慣として &lt;code&gt;/model sonnet&lt;/code&gt; を明示しておくと安全です。リミット到達時に Claude Code が出すメッセージは &lt;code&gt;Claude usage limit reached. Your limit will reset at 3pm (America/New_York).&lt;/code&gt; または API 直エラーでは &lt;code&gt;Claude AI usage limit reached|1749924000&lt;/code&gt;(Unix epoch)で、これを bash で正規表現パースします。&lt;/p&gt;
&lt;p&gt;残量監視は &lt;strong&gt;&lt;code&gt;ccusage&lt;/code&gt;&lt;/strong&gt;(日本人開発者 ryoppippi 作、&lt;code&gt;npx ccusage@latest blocks --live&lt;/code&gt;)が標準で、&lt;code&gt;~/.claude/projects/*.jsonl&lt;/code&gt; を解析して 5 時間ブロックとモデル別コストを表示します。&lt;code&gt;ccusage statusline&lt;/code&gt; を &lt;code&gt;~/.claude/settings.json&lt;/code&gt; の &lt;code&gt;statusLine&lt;/code&gt; に登録すれば、プロンプト下部に常時残量が出ます。Python 製の &lt;strong&gt;claude-monitor&lt;/strong&gt;(&lt;code&gt;uv tool install claude-monitor&lt;/code&gt;、&lt;code&gt;--plan pro --timezone Asia/Tokyo&lt;/code&gt;)は機械学習でリセット時刻を予測する TUI を提供し、&lt;code&gt;tmux-claude-live&lt;/code&gt; で tmux ステータスバーへも出せます。日本語 note 記事(&lt;a href=&quot;https://note.com/euro0202/n/n67db146ef97c&quot;&gt;@euro0202&lt;/a&gt;)の指摘で重要なのは「消費の大半は output ではなく &lt;strong&gt;Cache Read&lt;/strong&gt;」という点で、&lt;code&gt;ccusage daily --breakdown&lt;/code&gt; で必ず内訳を確認すべきです。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;自動化フラグの全貌と auto モードという新解&lt;/h2&gt;
&lt;p&gt;Claude Code v2.1+ には自動化用フラグが 50 種類以上ありますが、無人運用で覚えるべきものは限られています。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;フラグ&lt;/th&gt;
&lt;th&gt;役割&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--print&lt;/code&gt; (&lt;code&gt;-p&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;非対話実行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--continue&lt;/code&gt; (&lt;code&gt;-c&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;カレントディレクトリの直近セッション再開&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--resume&lt;/code&gt; (&lt;code&gt;-r&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;ID 指定再開&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--max-turns&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ターン上限&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--output-format stream-json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;NDJSON ログ取得&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--input-format stream-json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SDK 連携用 NDJSON 入力&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--worktree&lt;/code&gt; (&lt;code&gt;-w&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.claude/worktrees/&amp;lt;name&amp;gt;/&lt;/code&gt; への隔離 worktree 作成 (v2.1.49+)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;権限制御の中心は &lt;code&gt;--permission-mode&lt;/code&gt; で、値は &lt;strong&gt;&lt;code&gt;default&lt;/code&gt;/&lt;code&gt;acceptEdits&lt;/code&gt;/&lt;code&gt;plan&lt;/code&gt;/&lt;code&gt;auto&lt;/code&gt;/&lt;code&gt;bypassPermissions&lt;/code&gt;&lt;/strong&gt; の 5 つです。Shift+Tab で対話モード中の YOLO / auto-accept 切替に使います。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;stateDiagram-v2
    [*] --&amp;gt; default
    default --&amp;gt; acceptEdits: Shift+Tab
    acceptEdits --&amp;gt; plan: Shift+Tab
    plan --&amp;gt; bypassPermissions: Shift+Tab
    bypassPermissions --&amp;gt; default: Shift+Tab
    plan --&amp;gt; auto: Shift+Tab
    auto --&amp;gt; default: Shift+Tab

    note right of acceptEdits
        🟢 無人運用の基本
    end note
    note right of bypassPermissions
        ⚠️ 危険:実機では避ける
    end note
    note right of auto
        🆕 2026/3 導入
        サーバ側で危険検知
    end note
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;--dangerously-skip-permissions&lt;/code&gt; は &lt;code&gt;bypassPermissions&lt;/code&gt; の別名&lt;/strong&gt; で、全パーミッションプロンプトをスキップしますが &lt;code&gt;.git&lt;/code&gt;/&lt;code&gt;.claude&lt;/code&gt;/&lt;code&gt;.vscode&lt;/code&gt;/&lt;code&gt;.idea&lt;/code&gt;/&lt;code&gt;.husky&lt;/code&gt; への書き込みだけは依然確認します(リポジトリ / フック破壊防止)。Anthropic 公式は「コンテナで使え、実機では使うな」と明記しており、&lt;strong&gt;2025 年 10 月 21 日に報告された Wolak 事件 (Issue #10077, Claude Code v2.0.22, WSL2 / Ubuntu)&lt;/strong&gt; では &lt;code&gt;rm -rf tests/ patches/ plan/ ~/&lt;/code&gt; がチルダ展開後に実行され、ユーザのホームディレクトリを丸ごと削除しました(validation はチルダ展開「前」に行われていた)。eesel AI 調査では同フラグ利用者の &lt;strong&gt;32% が意図しないファイル変更&lt;/strong&gt; を経験、&lt;strong&gt;9% がデータ損失&lt;/strong&gt; を経験しています。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2026 年 3 月 24 日導入の &lt;code&gt;--permission-mode auto&lt;/code&gt;&lt;/strong&gt; がこの代替として推奨されています(Sonnet 4.6 / Opus 4.6 以上必須、当初は Team プランのリサーチプレビュー)。サーバ側の transcript 分類器(fast filter → chain-of-thought)が危険操作を検知し、3 連続 / 累計 20 の拒否で人間にエスカレーションする仕組みです。auto 進入時は blanket shell access、&lt;code&gt;python/node/ruby&lt;/code&gt; の wildcard、パッケージマネージャ &lt;code&gt;run&lt;/code&gt; の always-allow ルールはドロップされる安全設計になっています。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;settings.json は「許可リスト + deny + hooks」の三層で固める&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;.claude/settings.json&lt;/code&gt;(プロジェクト)と &lt;code&gt;~/.claude/settings.json&lt;/code&gt;(ユーザー)と &lt;code&gt;managed-settings.json&lt;/code&gt;(IT 管理)の 3 階層があり、配列フィールドは連結マージ、評価順は &lt;strong&gt;deny → ask → allow → defaultMode&lt;/strong&gt; で最初にマッチしたルールが勝ちます。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart TB
    Tool[&quot;Claude がツール実行を試みる&quot;] --&amp;gt; L1{&quot;① settings.json&amp;lt;br/&amp;gt;deny → ask → allow&quot;}
    L1 --&amp;gt;|&quot;deny ヒット&quot;| Block1[&quot;🛑 ブロック&quot;]
    L1 --&amp;gt;|&quot;通過&quot;| L2{&quot;② PreToolUse Hook&amp;lt;br/&amp;gt;block-dangerous.sh&quot;}
    L2 --&amp;gt;|&quot;exit 2&quot;| Block2[&quot;🛑 ブロック&amp;lt;br/&amp;gt;(deny バグの保険)&quot;]
    L2 --&amp;gt;|&quot;exit 0&quot;| L3{&quot;③ DevContainer&amp;lt;br/&amp;gt;iptables ファイアウォール&quot;}
    L3 --&amp;gt;|&quot;許可外通信&quot;| Block3[&quot;🛑 ブロック&quot;]
    L3 --&amp;gt;|&quot;通過&quot;| Exec[&quot;✅ 実行&quot;]

    style Block1 fill:#ffebee,stroke:#c62828
    style Block2 fill:#ffebee,stroke:#c62828
    style Block3 fill:#ffebee,stroke:#c62828
    style Exec fill:#e8f5e9,stroke:#2e7d32
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bash ルールは glob、Read / Edit は gitignore 互換、WebFetch は &lt;code&gt;domain:&lt;/code&gt; プレフィックスで指定します。ただし &lt;strong&gt;2025〜2026 年の Issue #6699 / #18846 / #15921 / #13340 で &lt;code&gt;allow&lt;/code&gt;/&lt;code&gt;deny&lt;/code&gt; が一部効かない既知バグ&lt;/strong&gt; が複数 open のため、&lt;strong&gt;重要な制約は必ず PreToolUse hook で重ねがけする&lt;/strong&gt; のが業界 consensus です。&lt;/p&gt;
&lt;p&gt;無人開発向けの推奨 &lt;code&gt;settings.json&lt;/code&gt; テンプレートは以下の通りです。&lt;code&gt;defaultMode&lt;/code&gt; を &lt;code&gt;acceptEdits&lt;/code&gt; にし、開発で頻発する &lt;code&gt;npm/pnpm/git/node/python/pytest/make&lt;/code&gt; 系を allow、&lt;code&gt;git push&lt;/code&gt; だけ ask、機密ファイル(&lt;code&gt;.env&lt;/code&gt;、&lt;code&gt;.aws&lt;/code&gt;、&lt;code&gt;.ssh&lt;/code&gt;、&lt;code&gt;credentials*&lt;/code&gt;)と破壊コマンド(&lt;code&gt;rm -rf:*&lt;/code&gt;、&lt;code&gt;sudo:*&lt;/code&gt;、&lt;code&gt;curl:*&lt;/code&gt;、&lt;code&gt;wget:*&lt;/code&gt;)を deny します。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;$schema&quot;: &quot;https://json.schemastore.org/claude-code-settings.json&quot;,
  &quot;env&quot;: {
    &quot;CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC&quot;: &quot;1&quot;
  },
  &quot;permissions&quot;: {
    &quot;defaultMode&quot;: &quot;acceptEdits&quot;,
    &quot;allow&quot;: [
      &quot;Bash(npm:*)&quot;, &quot;Bash(pnpm:*)&quot;, &quot;Bash(yarn:*)&quot;,
      &quot;Bash(git status)&quot;, &quot;Bash(git diff *)&quot;, &quot;Bash(git log *)&quot;,
      &quot;Bash(git add *)&quot;, &quot;Bash(git commit -m *)&quot;, &quot;Bash(git checkout -b *)&quot;,
      &quot;Bash(node *)&quot;, &quot;Bash(python *)&quot;, &quot;Bash(pytest *)&quot;, &quot;Bash(make *)&quot;,
      &quot;Bash(gh *)&quot;,
      &quot;Read&quot;, &quot;Edit&quot;, &quot;Write&quot;, &quot;Glob&quot;, &quot;Grep&quot;,
      &quot;WebFetch(domain:docs.anthropic.com)&quot;,
      &quot;WebFetch(domain:github.com)&quot;,
      &quot;mcp__playwright__*&quot;, &quot;mcp__github__*&quot;, &quot;mcp__context7__*&quot;
    ],
    &quot;ask&quot;: [&quot;Bash(git push *)&quot;],
    &quot;deny&quot;: [
      &quot;Read(./.env)&quot;, &quot;Read(./.env.*)&quot;, &quot;Read(**/.aws/**)&quot;,
      &quot;Read(**/.ssh/**)&quot;, &quot;Read(**/credentials*)&quot;,
      &quot;Bash(rm -rf:*)&quot;, &quot;Bash(sudo:*)&quot;, &quot;Bash(curl:*)&quot;, &quot;Bash(wget:*)&quot;
    ]
  },
  &quot;hooks&quot;: {
    &quot;PreToolUse&quot;: [{
      &quot;matcher&quot;: &quot;Bash&quot;,
      &quot;hooks&quot;: [{ &quot;type&quot;: &quot;command&quot;,
        &quot;command&quot;: &quot;$CLAUDE_PROJECT_DIR/.claude/hooks/block-dangerous.sh&quot; }]
    }],
    &quot;PostToolUse&quot;: [{
      &quot;matcher&quot;: &quot;Edit|Write|MultiEdit&quot;,
      &quot;hooks&quot;: [
        { &quot;type&quot;: &quot;command&quot;, &quot;command&quot;: &quot;npx prettier --write \&quot;$CLAUDE_TOOL_INPUT_FILE_PATH\&quot; 2&amp;gt;/dev/null; true&quot; },
        { &quot;type&quot;: &quot;command&quot;, &quot;command&quot;: &quot;npx eslint --fix \&quot;$CLAUDE_TOOL_INPUT_FILE_PATH\&quot; 2&amp;gt;/dev/null; true&quot; }
      ]
    }],
    &quot;Stop&quot;: [{
      &quot;hooks&quot;: [{ &quot;type&quot;: &quot;command&quot;,
        &quot;command&quot;: &quot;afplay /System/Library/Sounds/Glass.aiff &amp;amp; osascript -e &apos;display notification \&quot;Task done\&quot; with title \&quot;Claude Code\&quot;&apos;&quot; }]
    }],
    &quot;Notification&quot;: [{
      &quot;matcher&quot;: &quot;permission_prompt&quot;,
      &quot;hooks&quot;: [{ &quot;type&quot;: &quot;command&quot;,
        &quot;command&quot;: &quot;afplay /System/Library/Sounds/Basso.aiff &amp;amp; osascript -e &apos;display notification \&quot;Approval needed\&quot; with title \&quot;Claude Code\&quot;&apos;&quot; }]
    }]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hook は &lt;strong&gt;20 種類前後のライフサイクルイベント&lt;/strong&gt;(2026 年 5 月時点で公式 21 イベント)を持ち、&lt;code&gt;PreToolUse&lt;/code&gt;(ツール呼出前、deny 可)、&lt;code&gt;PostToolUse&lt;/code&gt; / &lt;code&gt;PostToolUseFailure&lt;/code&gt;(編集後フォーマット)、&lt;code&gt;Stop&lt;/code&gt; / &lt;code&gt;StopFailure&lt;/code&gt;(応答終了、&lt;code&gt;exit 2&lt;/code&gt; で継続強制可、&lt;strong&gt;Ralph Loop の心臓部&lt;/strong&gt;)、&lt;code&gt;SessionStart&lt;/code&gt; / &lt;code&gt;SessionEnd&lt;/code&gt;、&lt;code&gt;UserPromptSubmit&lt;/code&gt;、&lt;code&gt;SubagentStart&lt;/code&gt; / &lt;code&gt;SubagentStop&lt;/code&gt;、&lt;code&gt;PreCompact&lt;/code&gt;、&lt;code&gt;Notification&lt;/code&gt;、&lt;code&gt;PermissionRequest&lt;/code&gt; などが主役になります。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sequenceDiagram
    participant U as User
    participant C as Claude
    participant H as Hooks
    participant T as Tool

    U-&amp;gt;&amp;gt;C: プロンプト送信
    C-&amp;gt;&amp;gt;H: UserPromptSubmit
    C-&amp;gt;&amp;gt;C: 推論
    C-&amp;gt;&amp;gt;H: PreToolUse (deny 判定可)
    alt deny ヒット
        H--&amp;gt;&amp;gt;C: exit 2 (ブロック)
    else 通過
        C-&amp;gt;&amp;gt;T: ツール実行
        T--&amp;gt;&amp;gt;C: 結果
        C-&amp;gt;&amp;gt;H: PostToolUse (フォーマット等)
    end
    C--&amp;gt;&amp;gt;U: 応答返却
    C-&amp;gt;&amp;gt;H: Stop (テスト失敗なら exit 2 で継続強制)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;exit 0&lt;/code&gt; で成功・&lt;code&gt;exit 2&lt;/code&gt; でブロッキング / 継続強制&lt;/strong&gt; というセマンティクスが Unix 慣習と異なる点に注意してください。&lt;code&gt;PreToolUse&lt;/code&gt; で &lt;code&gt;permissionDecision: &quot;deny&quot;&lt;/code&gt; を返せば &lt;code&gt;bypassPermissions&lt;/code&gt; モードでも止まるため、settings.json の deny バグを補完できます。Stop hook で「テストが通るまで継続」を強制する例は次の通りです。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/usr/bin/env bash
INPUT=$(cat); ACTIVE=$(echo &quot;$INPUT&quot; | jq -r &apos;.stop_hook_active&apos;)
[ &quot;$ACTIVE&quot; = &quot;true&quot; ] &amp;amp;&amp;amp; exit 0   # 無限ループ防止
if ! npm test &amp;gt; /tmp/test.log 2&amp;gt;&amp;amp;1; then
  echo &quot;Tests failing. Fix and retry. See /tmp/test.log&quot; &amp;gt;&amp;amp;2
  exit 2   # Claude に継続させる
fi
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;CLAUDE.md・Skills・Subagents で「動作優先・解決困難は後回し」を行動原則化&lt;/h2&gt;
&lt;p&gt;CLAUDE.md は &lt;strong&gt;セッション開始時に自動でコンテキストへロードされる Markdown&lt;/strong&gt; で、プロジェクトの「憲法」として働きます。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart TB
    Start[&quot;セッション開始&quot;] --&amp;gt; E[&quot;Enterprise managed&quot;]
    E --&amp;gt; P[&quot;プロジェクトルート&amp;lt;br/&amp;gt;CLAUDE.md&quot;]
    P --&amp;gt; S[&quot;サブディレクトリ&amp;lt;br/&amp;gt;(lazy)&quot;]
    S --&amp;gt; H[&quot;~/.claude/CLAUDE.md&quot;]
    H --&amp;gt; L[&quot;CLAUDE.local.md&quot;]
    L --&amp;gt; Loaded[&quot;📚 重ねがけで全部ロード&quot;]

    style Loaded fill:#e8f5e9,stroke:#2e7d32
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;優先順位は Enterprise → プロジェクトルート → サブディレクトリ(lazy)→ &lt;code&gt;~/.claude/CLAUDE.md&lt;/code&gt; → &lt;code&gt;CLAUDE.local.md&lt;/code&gt; の順で重ねがけされます。HumanLayer 調査によれば &lt;strong&gt;LLM の指示遵守は 150〜200 個程度が限界&lt;/strong&gt; のため、本体は &lt;strong&gt;200 行以下&lt;/strong&gt; にし、&lt;code&gt;@docs/architecture.md&lt;/code&gt; のような import 構文で組織化するのがベストプラクティスです。コードスタイルは linter / formatter / hook に任せ、CLAUDE.md には「動作ルール」だけ書きましょう。&lt;/p&gt;
&lt;p&gt;ユーザーの要件「動作優先・デザイン後回し」「解決困難は後回し」「自動コミット」を行動原則化した CLAUDE.md テンプレートは以下の通りです。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# プロジェクト: &amp;lt;NAME&amp;gt;

## アーキテクチャ概要
- 言語:TypeScript(厳格)/ Next.js 15 / Vitest + Playwright
- 詳細は @docs/architecture.md

## 開発フロー(必ず守る)
1. 変更前に `git switch -c feat/&amp;lt;topic&amp;gt;` でブランチ作成
2. **動作優先・デザイン後回し**:UI は最低限の見た目で先に動かす。
   美化や色調整は最後にまとめて行う
3. 機能を実装したら必ず:
   a. `npm run typecheck` を通す
   b. `npm test` を通す
   c. UI 機能なら verify-in-browser スキルで Playwright 検証
4. 全グリーンになったら **自動コミット**:
   `git add -p` で関連変更のみステージ → Conventional Commits でコミット
5. 1 機能完了ごとに push し、`gh pr create --fill` で PR 作成

## 解決困難な課題のハンドリング
- 同じテストが **3 回連続で失敗** したら、修正を諦めて以下を行う:
  1. `.ralph/fix_plan.md` に「⚠️ Blocked: &amp;lt;問題&amp;gt; / &amp;lt;ファイル:行&amp;gt; / &amp;lt;最後のエラー&amp;gt;」を追記
  2. 該当箇所に `// TODO(claude): blocked - see .ralph/fix_plan.md` コメントを残す
  3. **次のタスクに進む**(Ralph ループを止めない)
- 不確実な API 仕様は Context7 MCP で確認してから実装

## Retry Policy
- 問題発生時は自動で**最大 5 回**まで再試行
- 完了報告時に「failing tests / compile errors / unresolved errors」が
  残っていた場合は完了報告禁止

## 禁止事項
- `git add -A` 禁止(必ず `git add &amp;lt;file&amp;gt;` か `git add -p`)
- `.env*`、`secrets/`、`*.pem` のコミット禁止
- `any`、`as`、`@ts-ignore` の使用禁止
- 既存テストの削除禁止(壊れたら原因を直す)

## 関連ドキュメント
- @.ralph/PROMPT.md(同一プロンプト)
- @.ralph/fix_plan.md(現在の作業キュー)
- @docs/architecture.md
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Skills の progressive disclosure&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Skills&lt;/strong&gt;(2025 年 10 月発表)は &lt;code&gt;.claude/skills/&amp;lt;name&amp;gt;/SKILL.md&lt;/code&gt; に YAML frontmatter で定義する「専門知識パック」で、&lt;strong&gt;progressive disclosure&lt;/strong&gt; によりコンテキストを圧迫しません。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart LR
    A[&quot;セッション開始&quot;] --&amp;gt; B[&quot;📋 メタデータのみロード&amp;lt;br/&amp;gt;(name + description)&quot;]
    B --&amp;gt; C{&quot;トリガー?&quot;}
    C --&amp;gt;|&quot;description にマッチ&quot;| D[&quot;📖 SKILL.md 本体ロード&quot;]
    D --&amp;gt; E{&quot;参照必要?&quot;}
    E --&amp;gt;|&quot;yes&quot;| F[&quot;📚 references/ を Read&quot;]
    E --&amp;gt;|&quot;yes&quot;| G[&quot;🔧 scripts/ を Bash 実行&quot;]
    C --&amp;gt;|&quot;非マッチ&quot;| H[&quot;💤 ロードしない&amp;lt;br/&amp;gt;= コンテキスト節約&quot;]

    style B fill:#e1f5ff
    style H fill:#eceff1
    style D fill:#e8f5e9
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;description は「ユーザーが◯◯と言ったら必ずこのスキルを使え」と &lt;strong&gt;やや押し気味&lt;/strong&gt; に書くのが Anthropic 推奨です。コミット用、テスト実行用、ブラウザ検証用の 3 つを最低限揃えると無人ループが回ります。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
name: verify-in-browser
description: &amp;gt;
  実装した UI 機能を Playwright MCP で実際にブラウザで開き、
  期待通りに表示・動作するか確認する。フロントエンド機能の
  実装完了直後、PR 作成前に必ず使用。
allowed-tools: mcp__playwright__*, Read, Bash
---
## 手順
1. `npm run dev` をバックグラウンド起動(ポート確認)
2. `browser_navigate` で localhost:&amp;lt;port&amp;gt; を開く
3. `browser_snapshot` でアクセシビリティツリー取得
4. 実装した UI フロー(クリック・入力・遷移)を実行
5. 期待 DOM/テキストの存在を検証
6. 失敗したら debugger サブエージェントへ委譲
7. 成功なら &quot;✅ Verified in browser: &amp;lt;flow&amp;gt;&quot; を返す
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Subagents で並列分業&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Subagents&lt;/strong&gt;(&lt;code&gt;.claude/agents/&amp;lt;name&amp;gt;.md&lt;/code&gt;)は独立コンテキスト・独立ツール権限・独立モデルを持つ専門エージェントで、親には &lt;strong&gt;最終要約だけ&lt;/strong&gt; 返るためメインのコンテキストが汚染されません。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart TB
    Main[&quot;🧠 メインエージェント&amp;lt;br/&amp;gt;(タスク分配)&quot;]

    subgraph &quot;Subagents (独立コンテキスト)&quot;
        S1[&quot;feature-implementer&amp;lt;br/&amp;gt;+ worktree 隔離&quot;]
        S2[&quot;test-writer&quot;]
        S3[&quot;code-reviewer&quot;]
        S4[&quot;debugger&quot;]
    end

    Main --&amp;gt;|並列起動| S1
    Main --&amp;gt;|並列起動| S2
    Main --&amp;gt;|並列起動| S3
    Main --&amp;gt;|並列起動| S4
    S1 --&amp;gt;|最終要約のみ| Main
    S2 --&amp;gt;|最終要約のみ| Main
    S3 --&amp;gt;|最終要約のみ| Main
    S4 --&amp;gt;|最終要約のみ| Main

    style Main fill:#fff3e0,stroke:#ef6c00
    style S1 fill:#e8f5e9
    style S2 fill:#e8f5e9
    style S3 fill:#e8f5e9
    style S4 fill:#e8f5e9
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;クラスメソッドの検証では「アーキテクチャ調査 / テストカバレッジ調査 / 依存関係調査」を 3 並列起動して 53 回のツール呼び出しを 2 分で完了しています。&lt;strong&gt;3〜7 個に絞る&lt;/strong&gt; のが推奨で、&lt;code&gt;feature-implementer&lt;/code&gt;(実装)/ &lt;code&gt;test-writer&lt;/code&gt;(テスト)/ &lt;code&gt;code-reviewer&lt;/code&gt;(レビュー)/ &lt;code&gt;debugger&lt;/code&gt;(デバッグ)の 4 構成が標準です。&lt;code&gt;isolation: worktree&lt;/code&gt; を frontmatter に書けば各サブエージェントが独立 worktree で動き、並列編集時のコンフリクトを物理的に防げます。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;MCP サーバー 7 点セットで「ブラウザで動かして検証」まで自動化&lt;/h2&gt;
&lt;p&gt;MCP(Model Context Protocol)は 2024 年 11 月発表のオープンプロトコルで、&lt;code&gt;claude mcp add&lt;/code&gt; または &lt;code&gt;.mcp.json&lt;/code&gt; で接続します。&lt;strong&gt;ルート直下の &lt;code&gt;.mcp.json&lt;/code&gt; に置く&lt;/strong&gt; こと(&lt;code&gt;.claude/.mcp.json&lt;/code&gt; だと一部サーバが読み込まれない既知不具合あり、Issue #5037)。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart LR
    Claude[&quot;🧠 Claude Code&quot;]

    subgraph &quot;MCP 7 点セット&quot;
        M1[&quot;🐙 GitHub MCP&amp;lt;br/&amp;gt;issue/PR/コミット&quot;]
        M2[&quot;📁 Filesystem MCP&quot;]
        M3[&quot;🌐 Playwright MCP&amp;lt;br/&amp;gt;ブラウザ操作&quot;]
        M4[&quot;🔍 Chrome DevTools MCP&amp;lt;br/&amp;gt;ネットワーク解析&quot;]
        M5[&quot;📚 Context7 MCP&amp;lt;br/&amp;gt;最新ドキュメント&quot;]
        M6[&quot;🧠 Sequential Thinking&quot;]
        M7[&quot;💾 Memory MCP&amp;lt;br/&amp;gt;SQLite KG&quot;]
    end

    Claude --&amp;gt; M1 &amp;amp; M2 &amp;amp; M3 &amp;amp; M4 &amp;amp; M5 &amp;amp; M6 &amp;amp; M7
    style Claude fill:#fff3e0,stroke:#ef6c00
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;無人開発に効く 7 点セットは &lt;strong&gt;GitHub MCP&lt;/strong&gt;(公式の &lt;code&gt;api.githubcopilot.com/mcp&lt;/code&gt;、issue/PR/コミット)、&lt;strong&gt;Filesystem MCP&lt;/strong&gt;、&lt;strong&gt;Playwright MCP&lt;/strong&gt;(Microsoft 公式、&lt;code&gt;browser_navigate&lt;/code&gt;/&lt;code&gt;browser_snapshot&lt;/code&gt;/&lt;code&gt;browser_run_code&lt;/code&gt;)、&lt;strong&gt;Chrome DevTools MCP&lt;/strong&gt;(Google 公式、ネットワーク解析)、&lt;strong&gt;Context7 MCP&lt;/strong&gt;(Upstash、ライブラリ最新ドキュメント取得)、&lt;strong&gt;Sequential Thinking MCP&lt;/strong&gt;、&lt;strong&gt;Memory MCP&lt;/strong&gt;(SQLite Knowledge Graph)です。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;注意:&lt;code&gt;@modelcontextprotocol/server-github&lt;/code&gt; npm 版は 2025 年中に deprecated&lt;/strong&gt; となっています(現行は &lt;code&gt;github/github-mcp-server&lt;/code&gt; リポジトリの Docker / HTTP 版に統合)。本記事の &lt;code&gt;.mcp.json&lt;/code&gt; は HTTP 版(&lt;code&gt;api.githubcopilot.com/mcp&lt;/code&gt;)を採用しています。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;mcpServers&quot;: {
    &quot;github&quot;: {
      &quot;type&quot;: &quot;http&quot;,
      &quot;url&quot;: &quot;https://api.githubcopilot.com/mcp&quot;,
      &quot;headers&quot;: { &quot;Authorization&quot;: &quot;Bearer ${GITHUB_PAT}&quot; }
    },
    &quot;playwright&quot;: { &quot;command&quot;: &quot;npx&quot;, &quot;args&quot;: [&quot;@playwright/mcp@latest&quot;, &quot;--browser=chromium&quot;] },
    &quot;chrome-devtools&quot;: { &quot;command&quot;: &quot;npx&quot;, &quot;args&quot;: [&quot;chrome-devtools-mcp@latest&quot;] },
    &quot;context7&quot;: { &quot;command&quot;: &quot;npx&quot;, &quot;args&quot;: [&quot;-y&quot;, &quot;@upstash/context7-mcp@latest&quot;] },
    &quot;sequential-thinking&quot;: { &quot;command&quot;: &quot;npx&quot;, &quot;args&quot;: [&quot;-y&quot;, &quot;@modelcontextprotocol/server-sequential-thinking&quot;] },
    &quot;memory&quot;: { &quot;command&quot;: &quot;npx&quot;, &quot;args&quot;: [&quot;-y&quot;, &quot;@modelcontextprotocol/server-memory&quot;, &quot;--memory-path&quot;, &quot;${HOME}/.claude-memory&quot;] }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ブラウザ動作確認のワークフローは次の連鎖になります。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart LR
    A[&quot;1. 機能実装&quot;] --&amp;gt; B[&quot;2. browser_navigate&quot;]
    B --&amp;gt; C[&quot;3. browser_snapshot&amp;lt;br/&amp;gt;(a11y tree)&quot;]
    C --&amp;gt; D[&quot;4. DOM/テキスト検証&quot;]
    D --&amp;gt;|&quot;OK&quot;| E[&quot;7. PR 作成&amp;lt;br/&amp;gt;(GitHub MCP)&quot;]
    D --&amp;gt;|&quot;NG&quot;| F[&quot;5. Chrome DevTools MCP&amp;lt;br/&amp;gt;で深掘り&quot;]
    F --&amp;gt; G[&quot;6. 修正&quot;] --&amp;gt; A

    style E fill:#e8f5e9,stroke:#2e7d32
    style F fill:#fff3e0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Microsoft の &lt;code&gt;playwright-cli install --skills&lt;/code&gt; で Skill が自動配置され、&lt;code&gt;--codegen&lt;/code&gt; オプションで TypeScript テストの自動生成までしてくれます。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Ralph Loop:2026 年に標準化された「同一プロンプト無限投入」パターン&lt;/h2&gt;
&lt;p&gt;リミット到達の検知から再開までの実装は OSS が複数公開されています。&lt;code&gt;terryso/claude-auto-resume&lt;/code&gt;(bash で &lt;code&gt;Claude usage limit reached&lt;/code&gt; を grep → &lt;code&gt;date -d&lt;/code&gt; で時刻パース → &lt;code&gt;sleep&lt;/code&gt; → &lt;code&gt;--continue&lt;/code&gt;)と &lt;code&gt;cheapestinference/claude-auto-retry&lt;/code&gt;(npm、tmux capture-pane でポーリング、DST 対応)が代表格です。Anthropic 公式 issue(#36320, #35744, #18980)でも要望が多数集まっていますが、2026 年 5 月時点で公式機能としては未実装のため、自前で組みます。&lt;/p&gt;
&lt;p&gt;「機能要件さえ書けば無人で動く」コア部分は、Geoffrey Huntley が提唱した &lt;strong&gt;Ralph Wiggum ループ&lt;/strong&gt;(&lt;a href=&quot;https://ghuntley.com/ralph/&quot;&gt;原典 ghuntley.com/ralph&lt;/a&gt; / &lt;a href=&quot;https://ghuntley.com/loop/&quot;&gt;everything is a ralph loop&lt;/a&gt; / &lt;a href=&quot;https://note.com/jujunjun110/n/n0903bad8b2f2&quot;&gt;note @jujunjun110&lt;/a&gt; 日本語解説)で実装します。思想は &lt;strong&gt;「同じプロンプトを while ループで AI に投げ続け、状態は AI の記憶ではなくファイル(&lt;code&gt;PROMPT.md&lt;/code&gt; / &lt;code&gt;fix_plan.md&lt;/code&gt; / &lt;code&gt;AGENTS.md&lt;/code&gt;)+ git に保持する」&lt;/strong&gt;。各イテレーションは &lt;strong&gt;フレッシュコンテキスト&lt;/strong&gt; で開始するので context rot(コンテキスト劣化)が起きず、根気だけで機能が完成します。&lt;/p&gt;
&lt;h3&gt;2026 年 5 月時点のエコシステム&lt;/h3&gt;
&lt;p&gt;Ralph パターンは 2025 年後半から 2026 年にかけて急速に標準化されました。主要な実装の現況は次の通りです。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;実装&lt;/th&gt;
&lt;th&gt;形態&lt;/th&gt;
&lt;th&gt;特徴&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Anthropic 公式 &lt;code&gt;ralph-loop&lt;/code&gt; plugin&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;claude.com/plugins/ralph-loop&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Stop hook で自動再投入、&lt;code&gt;--max-iterations&lt;/code&gt;、&lt;code&gt;--completion-promise &quot;DONE&quot;&lt;/code&gt; 標準対応&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;snarktank/ralph&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;OSS フレームワーク非依存&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.ralph/{PROMPT.md,fix_plan.md,AGENT.md}&lt;/code&gt; を正典とする最も支持されている canonical 実装&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;vercel-labs/ralph-loop-agent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AI SDK 向け&lt;/td&gt;
&lt;td&gt;TypeScript、Next.js とのインテグレーション&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;frankbria/ralph-claude-code&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Claude Code 特化&lt;/td&gt;
&lt;td&gt;終了検出強化(false-positive 抑制)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OpenAI Codex CLI 0.128.0&lt;/strong&gt; (2026/4/30)&lt;/td&gt;
&lt;td&gt;CLI 組込&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/goal&lt;/code&gt; コマンドとして Ralph がビルトイン化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;jujunjun110/claude-looper&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;日本語解説 + bash 実装&lt;/td&gt;
&lt;td&gt;入門に最適&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Ralph Loop ベストプラクティス 4 原則&lt;/h3&gt;
&lt;p&gt;2026 年に確立した実装ガイドラインです。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart LR
    A[&quot;① 機械検証可能な完了条件&amp;lt;br/&amp;gt;(tests pass, lint clean, checklist [x])&quot;] --&amp;gt; B[&quot;② ハードキャップ必須&amp;lt;br/&amp;gt;(--max-iterations + $ budget)&quot;]
    B --&amp;gt; C[&quot;③ コンテキスト枯渇前に&amp;lt;br/&amp;gt;fresh agent へ rotate&amp;lt;br/&amp;gt;状態は AGENTS.md + git へ&quot;]
    C --&amp;gt; D[&quot;④ SDD と分離&amp;lt;br/&amp;gt;(spec は人間 / 実装だけ Ralph)&quot;]

    style A fill:#e8f5e9
    style B fill:#fff3e0
    style C fill:#e1f5ff
    style D fill:#f3e5f5
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Mechanically checkable な完了条件&lt;/strong&gt;:&lt;code&gt;pnpm test &amp;amp;&amp;amp; pnpm lint &amp;amp;&amp;amp; pnpm typecheck&lt;/code&gt; がすべて緑、または &lt;code&gt;fix_plan.md&lt;/code&gt; の全項目が &lt;code&gt;[x]&lt;/code&gt; になる、といった機械判定可能なゴールに限定する。「プロっぽく見せて」「ユーザフレンドリーに」など曖昧条件は厳禁。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ハードキャップ必須&lt;/strong&gt;:&lt;code&gt;--max-iterations 30&lt;/code&gt; と &lt;code&gt;--max-budget-usd 5.00&lt;/code&gt; を必ず設定し、暴走時の被害を物理的に止める。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;コンテキスト枯渇前に fresh agent へ rotate&lt;/strong&gt;:1 イテレーション = 1 セッション。状態は &lt;code&gt;AGENTS.md&lt;/code&gt; / &lt;code&gt;fix_plan.md&lt;/code&gt; / git log に逃がす。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SDD と組み合わせる&lt;/strong&gt;:仕様策定(BMAD / cc-sdd / GitHub Spec Kit / bmalph)と Ralph 実装は分離する。Ralph は greenfield + 機械検証可能なタスクに最適、本番 critical path には別の人間レビューを噛ませる。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;全体フロー&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;flowchart TB
    Start([&quot;🌙 launchd 22:00 起動&quot;]) --&amp;gt; Init[&quot;📂 .ralph/ 初期化&amp;lt;br/&amp;gt;PROMPT.md / fix_plan.md / AGENTS.md&quot;]
    Init --&amp;gt; Loop{&quot;fix_plan.md に&amp;lt;br/&amp;gt;[ ] あり?&quot;}
    Loop --&amp;gt;|&quot;なし&quot;| Done([&quot;🎉 完了通知&amp;lt;br/&amp;gt;(osascript)&quot;])
    Loop --&amp;gt;|&quot;あり&quot;| Fresh[&quot;🆕 フレッシュ claude -p&amp;lt;br/&amp;gt;(同一 PROMPT.md 投入)&quot;]
    Fresh --&amp;gt; Impl[&quot;実装 → テスト → コミット&amp;lt;br/&amp;gt;→ fix_plan.md 更新&quot;]
    Impl --&amp;gt; Check{&quot;Stop hook&amp;lt;br/&amp;gt;判定&quot;}
    Check --&amp;gt;|&quot;DONE 出力&quot;| Loop
    Check --&amp;gt;|&quot;usage limit&quot;| Wait[&quot;⏰ リセット時刻まで&amp;lt;br/&amp;gt;caffeinate -i sleep&quot;]
    Wait --&amp;gt; Loop
    Check --&amp;gt;|&quot;3 回連続失敗&quot;| Block[&quot;⚠️ fix_plan.md に&amp;lt;br/&amp;gt;Blocked 追記&quot;]
    Block --&amp;gt; Loop
    Loop --&amp;gt;|&quot;max-iter 到達&quot;| Cap([&quot;🛑 ハードキャップで停止&quot;])

    style Start fill:#e1f5ff
    style Done fill:#e8f5e9
    style Wait fill:#fff3e0
    style Block fill:#ffebee
    style Cap fill:#ffebee
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;推奨実装:公式 ralph-loop plugin + 薄い bash ラッパー&lt;/h3&gt;
&lt;p&gt;最もメンテコストが低いのは &lt;strong&gt;Anthropic 公式 &lt;code&gt;ralph-loop&lt;/code&gt; plugin を使い、リミット待機だけ bash で巻く&lt;/strong&gt; パターンです。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# プラグインインストール(2026/5 時点)
claude plugin install anthropic/ralph-loop
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;.ralph/PROMPT.md&lt;/code&gt;(同一プロンプトで毎回再投入される正典)を作ります。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- .ralph/PROMPT.md --&amp;gt;
# 目的
@specs/feature/requirements.md を fix_plan.md のチェックリストに沿って実装する。

# あなたが毎イテレーション必ず行うこと
1. `git status` と `cat .ralph/fix_plan.md` で現在地を確認
2. `[ ]` の最上位項目を 1 つだけ選ぶ
3. TDD で実装(Red → Green → Refactor)
4. `pnpm test &amp;amp;&amp;amp; pnpm lint &amp;amp;&amp;amp; pnpm typecheck` がすべて緑になるまで修正
5. `git add -p &amp;amp;&amp;amp; git commit -m &quot;feat: ...&quot;`(Conventional Commits)
6. `.ralph/fix_plan.md` で該当項目を `[x]` に更新して再 commit
7. **完了したら最終行に必ず `DONE` とだけ出力**
8. 5 回連続で同じテストが落ちたら、その項目に `⚠️ Blocked: &amp;lt;理由&amp;gt;` を追記し次へ

# 禁止
- `git add -A` / `--no-verify` / `any` / `as` / `@ts-ignore`
- 既存テストの削除(壊れたら原因を直す)
- specs/ 以下の改変(仕様変更が必要なら fix_plan.md に「要 spec 改訂」と書いて停止)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ループ本体は次のシンプルな bash で十分です(リミット時刻パース + &lt;code&gt;caffeinate&lt;/code&gt; + osascript 通知付き)。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/usr/bin/env bash
# ralph-loop.sh - 公式 plugin に薄く被せるリミット耐性ラッパー
set -uo pipefail
REPO=&quot;$(pwd)&quot;; LOG_DIR=&quot;${REPO}/.ralph/logs&quot;; mkdir -p &quot;$LOG_DIR&quot;
ITER=0; MAX_ITER=&quot;${MAX_ITER:-30}&quot;; BUDGET=&quot;${BUDGET_USD:-5.00}&quot;

while (( ITER &amp;lt; MAX_ITER )); do
  ITER=$((ITER + 1)); TS=$(date +%Y%m%d_%H%M%S)
  LOG=&quot;$LOG_DIR/iter_${ITER}_${TS}.log&quot;
  echo &quot;===== Ralph Iteration ${ITER} =====&quot; | tee &quot;$LOG&quot;

  # ① fix_plan.md に未完了 [ ] が残っているか
  if ! grep -qE &apos;^\s*-\s*\[\s*\]&apos; .ralph/fix_plan.md 2&amp;gt;/dev/null; then
    osascript -e &apos;display notification &quot;Ralph: ALL DONE 🎉&quot; with title &quot;Claude&quot;&apos; 2&amp;gt;/dev/null
    break
  fi

  # ② フレッシュコンテキストで PROMPT.md 投入
  timeout 30m claude -p &quot;$(cat .ralph/PROMPT.md)&quot; \
    --permission-mode acceptEdits \
    --max-turns 80 \
    --output-format text 2&amp;gt;&amp;amp;1 | tee -a &quot;$LOG&quot;
  EC=${PIPESTATUS[0]}

  # ③ リミット検知 → リセット時刻まで caffeinate sleep
  if grep -qiE &quot;usage limit reached&quot; &quot;$LOG&quot;; then
    reset=$(grep -oE &apos;reset at [0-9]+(am|pm)&apos; &quot;$LOG&quot; | tail -1 | awk &apos;{print $3}&apos;)
    tz=$(grep -oE &apos;\([A-Za-z_/]+\)&apos; &quot;$LOG&quot; | tail -1 | tr -d &apos;()&apos;)
    target=$(TZ=&quot;$tz&quot; date -j -f &apos;%I%p %Y-%m-%d&apos; &quot;$reset $(date +%Y-%m-%d)&quot; +%s 2&amp;gt;/dev/null \
             || date -d &quot;today $reset&quot; +%s 2&amp;gt;/dev/null \
             || echo $(( $(date +%s) + 1800 )))
    now=$(date +%s); (( target &amp;lt;= now )) &amp;amp;&amp;amp; target=$((target + 86400))
    sleep_for=$(( target - now + 60 ))
    osascript -e &quot;display notification \&quot;Ralph waiting $((sleep_for/60))m\&quot; with title \&quot;Claude\&quot;&quot; 2&amp;gt;/dev/null
    caffeinate -i sleep &quot;$sleep_for&quot;
    continue
  fi

  # ④ DONE が最終行になければ次イテレーションで再投入(これが Ralph の本質)
  if ! tail -3 &quot;$LOG&quot; | grep -q &quot;^DONE$&quot;; then
    sleep $(( 30 * (1 + ITER % 5) ))    # 軽いバックオフのみ
  fi
done
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Stop hook で plugin を駆動する派&lt;/strong&gt;(より洗練された方法)は &lt;code&gt;.claude/settings.json&lt;/code&gt; に次を入れます。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;hooks&quot;: {
    &quot;Stop&quot;: [{
      &quot;hooks&quot;: [{
        &quot;type&quot;: &quot;command&quot;,
        &quot;command&quot;: &quot;$CLAUDE_PROJECT_DIR/.claude/hooks/ralph-continue.sh&quot;
      }]
    }]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;#!/usr/bin/env bash
# .claude/hooks/ralph-continue.sh - Stop 時に DONE が無ければ exit 2 で継続強制
INPUT=$(cat)
[ &quot;$(echo &quot;$INPUT&quot; | jq -r &apos;.stop_hook_active&apos;)&quot; = &quot;true&quot; ] &amp;amp;&amp;amp; exit 0
LAST=$(echo &quot;$INPUT&quot; | jq -r &apos;.transcript_path&apos; | xargs tail -n 5)
if echo &quot;$LAST&quot; | grep -q &quot;^DONE$&quot;; then exit 0; fi
echo &quot;fix_plan.md にまだ [ ] が残っています。次のタスクを継続してください。&quot; &amp;gt;&amp;amp;2
exit 2   # Claude に継続を強制
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;tmux で「夜間放置」する場合は &lt;code&gt;tmux new-session -d -s ralph &quot;caffeinate -i ./ralph-loop.sh &amp;gt; .ralph/logs/run.log 2&amp;gt;&amp;amp;1&quot;&lt;/code&gt; で起動し、&lt;code&gt;tmux attach -t ralph&lt;/code&gt; で監視、&lt;code&gt;Ctrl+b d&lt;/code&gt; でデタッチします。OS 再起動後の自動復元には &lt;strong&gt;tmux-resurrect + tmux-continuum&lt;/strong&gt; を組み合わせます。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Mac 固有の自動化:launchd + caffeinate + 4 つの壁突破&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;caffeinate -i&lt;/code&gt; でアイドルスリープ防止、&lt;code&gt;-d&lt;/code&gt; でディスプレイ、&lt;code&gt;-s&lt;/code&gt; で AC 電源時の system sleep、&lt;code&gt;-t 28800&lt;/code&gt; で時間限定が可能です。実は &lt;strong&gt;Claude Code 自身が内部で &lt;code&gt;caffeinate -i -t 300&lt;/code&gt; を 5 分ごとに spawn する&lt;/strong&gt; ため対話実行中はそもそもスリープしませんが(Issue #21432)、&lt;strong&gt;バックエンド / cron / launchd から spawn する場合は明示的に &lt;code&gt;caffeinate&lt;/code&gt; でラップする&lt;/strong&gt; のが安全です。ラップトップを閉じた瞬間も caffeinate は効きません。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart LR
    A[&quot;💤 Mac スリープ中&quot;] --&amp;gt; B{{&quot;launchd&amp;lt;br/&amp;gt;22:00 起床&quot;}}
    B --&amp;gt; C[&quot;caffeinate -i&amp;lt;br/&amp;gt;(スリープ抑止)&quot;]
    C --&amp;gt; D[&quot;claude-loop.sh&quot;]
    D --&amp;gt; E[&quot;朝起きたら&amp;lt;br/&amp;gt;PR が積み上がっている&quot;]

    style A fill:#eceff1
    style B fill:#e1f5ff,stroke:#0277bd
    style C fill:#fff3e0
    style E fill:#e8f5e9,stroke:#2e7d32
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;GMO ペパボの記事(&lt;a href=&quot;https://zenn.dev/pepabo/articles/claude-code-cron-autonomous-ui-walls&quot;&gt;zenn.dev/pepabo&lt;/a&gt;)が指摘する &lt;strong&gt;cron 自走で毎回ハマる 4 つの壁&lt;/strong&gt; を整理しました。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart LR
    Start[&quot;🚀 launchd 起動&quot;] --&amp;gt; W1{&quot;壁 ①&amp;lt;br/&amp;gt;Bypass&amp;lt;br/&amp;gt;permissions&quot;}
    W1 --&amp;gt;|&quot;OK&quot;| W2{&quot;壁 ②&amp;lt;br/&amp;gt;Trust this&amp;lt;br/&amp;gt;folder&quot;}
    W2 --&amp;gt;|&quot;OK&quot;| W3{&quot;壁 ③&amp;lt;br/&amp;gt;MCP&amp;lt;br/&amp;gt;allow/deny&quot;}
    W3 --&amp;gt;|&quot;OK&quot;| W4{&quot;壁 ④&amp;lt;br/&amp;gt;ファイル&amp;lt;br/&amp;gt;除外リスト&quot;}
    W4 --&amp;gt;|&quot;OK&quot;| Run[&quot;✅ 自走開始&quot;]

    W1 -.解決策.-&amp;gt; S1[&quot;acceptEdits 設定&quot;]
    W2 -.解決策.-&amp;gt; S2[&quot;事前に対話モードで&amp;lt;br/&amp;gt;一度開く&quot;]
    W3 -.解決策.-&amp;gt; S3[&quot;事前 allowlist&quot;]
    W4 -.解決策.-&amp;gt; S4[&quot;.env 等の deny を&amp;lt;br/&amp;gt;settings.json に&quot;]

    style Run fill:#e8f5e9,stroke:#2e7d32
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;壁&lt;/th&gt;
&lt;th&gt;内容&lt;/th&gt;
&lt;th&gt;解決策&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;① Bypass permissions&lt;/td&gt;
&lt;td&gt;権限プロンプトで止まる&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--permission-mode acceptEdits&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;② Trust this folder&lt;/td&gt;
&lt;td&gt;初回起動で信頼確認&lt;/td&gt;
&lt;td&gt;対話モードで一度開く / &lt;code&gt;~/.claude.json&lt;/code&gt; の &lt;code&gt;hasTrustDialogAccepted: true&lt;/code&gt; を直書き&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;③ MCP の allow/deny&lt;/td&gt;
&lt;td&gt;MCP ツールで止まる&lt;/td&gt;
&lt;td&gt;事前に対話モードで一度許可&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;④ ファイル除外&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.env&lt;/code&gt; などへのアクセス&lt;/td&gt;
&lt;td&gt;settings.json の deny に明記&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;これらを抜ければ launchd で完全無人化できます。&lt;code&gt;~/Library/LaunchAgents/com.user.claude-loop.plist&lt;/code&gt; を以下で配置します。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;plist version=&quot;1.0&quot;&amp;gt;&amp;lt;dict&amp;gt;
  &amp;lt;key&amp;gt;Label&amp;lt;/key&amp;gt;&amp;lt;string&amp;gt;com.user.claude-loop&amp;lt;/string&amp;gt;
  &amp;lt;key&amp;gt;ProgramArguments&amp;lt;/key&amp;gt;&amp;lt;array&amp;gt;
    &amp;lt;string&amp;gt;/usr/bin/caffeinate&amp;lt;/string&amp;gt;&amp;lt;string&amp;gt;-i&amp;lt;/string&amp;gt;
    &amp;lt;string&amp;gt;/bin/bash&amp;lt;/string&amp;gt;&amp;lt;string&amp;gt;-lc&amp;lt;/string&amp;gt;
    &amp;lt;string&amp;gt;cd /Users/me/projects/myapp &amp;amp;&amp;amp; /usr/local/bin/claude-loop.sh&amp;lt;/string&amp;gt;
  &amp;lt;/array&amp;gt;
  &amp;lt;key&amp;gt;StartCalendarInterval&amp;lt;/key&amp;gt;
    &amp;lt;dict&amp;gt;&amp;lt;key&amp;gt;Hour&amp;lt;/key&amp;gt;&amp;lt;integer&amp;gt;22&amp;lt;/integer&amp;gt;&amp;lt;key&amp;gt;Minute&amp;lt;/key&amp;gt;&amp;lt;integer&amp;gt;0&amp;lt;/integer&amp;gt;&amp;lt;/dict&amp;gt;
  &amp;lt;key&amp;gt;EnvironmentVariables&amp;lt;/key&amp;gt;
    &amp;lt;dict&amp;gt;&amp;lt;key&amp;gt;PATH&amp;lt;/key&amp;gt;&amp;lt;string&amp;gt;/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin&amp;lt;/string&amp;gt;&amp;lt;/dict&amp;gt;
  &amp;lt;key&amp;gt;StandardOutPath&amp;lt;/key&amp;gt;&amp;lt;string&amp;gt;/Users/me/.claude-loop/stdout.log&amp;lt;/string&amp;gt;
  &amp;lt;key&amp;gt;StandardErrorPath&amp;lt;/key&amp;gt;&amp;lt;string&amp;gt;/Users/me/.claude-loop/stderr.log&amp;lt;/string&amp;gt;
  &amp;lt;key&amp;gt;WorkingDirectory&amp;lt;/key&amp;gt;&amp;lt;string&amp;gt;/Users/me/projects/myapp&amp;lt;/string&amp;gt;
&amp;lt;/dict&amp;gt;&amp;lt;/plist&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;launchctl load ~/Library/LaunchAgents/com.user.claude-loop.plist&lt;/code&gt; でロードし、&lt;code&gt;launchctl start com.user.claude-loop&lt;/code&gt; で即時実行できます。&lt;strong&gt;cron は寝てる Mac では発火しない&lt;/strong&gt; ため &lt;code&gt;pmset repeat wake MTWRF 02:55:00&lt;/code&gt; の事前起床と組み合わせるか、&lt;strong&gt;launchd 一択&lt;/strong&gt; です。完了通知は &lt;code&gt;osascript -e &apos;display notification &quot;Iteration 5 完了&quot; with title &quot;Claude Loop&quot; sound name &quot;Glass&quot;&apos;&lt;/code&gt; でロックスクリーンに送れます。&lt;code&gt;fswatch -o src/ tests/ | xargs -n1 -I{} claude -p &quot;...&quot;&lt;/code&gt; のファイル監視併用も有効で、保存と同時にテスト / 修復ループが走ります。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;究極のセットアップ:4 フェーズで「機能要件 1 行 → PR 作成」&lt;/h2&gt;
&lt;p&gt;ディレクトリ構成は次のように &lt;code&gt;.claude/&lt;/code&gt; と &lt;code&gt;.ralph/&lt;/code&gt; 配下に &lt;strong&gt;全制御ファイルを集約&lt;/strong&gt; します。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/projects/myapp/
├── CLAUDE.md                     # 200 行以下、行動原則
├── AGENTS.md                     # マルチ AI 共通(Ralph 状態の正典)
├── .mcp.json                     # 7 点セット MCP
├── .ralph/
│   ├── PROMPT.md                 # 同一プロンプト(毎イテレーション再投入)
│   ├── fix_plan.md               # 作業キュー([ ]/[x]/⚠️ Blocked)
│   └── logs/                     # 各イテレーションのログ
├── .claude/
│   ├── settings.json             # 権限・hooks(Stop で ralph-continue.sh)
│   ├── skills/
│   │   ├── commit/SKILL.md       # Conventional Commits 自動生成
│   │   ├── run-tests-and-fix/SKILL.md
│   │   └── verify-in-browser/SKILL.md  # Playwright 検証
│   ├── agents/
│   │   ├── feature-implementer.md  # model: sonnet, isolation: worktree
│   │   ├── test-writer.md
│   │   ├── code-reviewer.md
│   │   └── debugger.md
│   └── hooks/
│       ├── block-dangerous.sh
│       ├── format-and-lint.sh
│       └── ralph-continue.sh     # Stop hook で DONE 判定 → 継続強制
└── specs/&amp;lt;feature&amp;gt;/{requirements,design,tasks}.md   # cc-sdd の SDD
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;運用は次の 4 フェーズで進めます。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart TB
    P1[&quot;📋 Phase 1: 計画(人間関与)&amp;lt;br/&amp;gt;plan モード + /kiro-discovery&amp;lt;br/&amp;gt;requirements → design → tasks&quot;]
    P2[&quot;🔁 Phase 2: 自律実装ループ&amp;lt;br/&amp;gt;/ralph-loop で TDD 実装&amp;lt;br/&amp;gt;Stop hook でテスト自動実行&quot;]
    P3[&quot;🌐 Phase 3: 自動 QA&amp;lt;br/&amp;gt;qa subagent + Playwright MCP&amp;lt;br/&amp;gt;各種 viewport で実フロー検証&quot;]
    P4[&quot;🐙 Phase 4: 出荷&amp;lt;br/&amp;gt;gh pr create&amp;lt;br/&amp;gt;Actions で自動レビュー&quot;]

    P1 --&amp;gt; P2 --&amp;gt; P3 --&amp;gt; P4

    style P1 fill:#fff3e0,stroke:#ef6c00
    style P2 fill:#e1f5ff,stroke:#0277bd
    style P3 fill:#f3e5f5,stroke:#7b1fa2
    style P4 fill:#e8f5e9,stroke:#2e7d32
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Phase 1(計画、人間関与)&lt;/strong&gt; で &lt;code&gt;claude --permission-mode plan&lt;/code&gt; を起動し cc-sdd プラグイン(&lt;code&gt;gotalab/cc-sdd&lt;/code&gt;)で機能要件を &lt;code&gt;requirements.md&lt;/code&gt;(EARS 記法)→ &lt;code&gt;design.md&lt;/code&gt; → &lt;code&gt;tasks.md&lt;/code&gt; に分解、人間が approve します。&lt;strong&gt;この成果物を &lt;code&gt;.ralph/fix_plan.md&lt;/code&gt; の機械検証可能なチェックリストへ変換するのが Phase 1 の最終ステップ&lt;/strong&gt; です。&lt;strong&gt;Phase 2(Ralph 自律実装ループ)&lt;/strong&gt; で &lt;code&gt;claude -w feature-x&lt;/code&gt; から &lt;code&gt;./ralph-loop.sh&lt;/code&gt; を起動、Sonnet 4.6 が &lt;strong&gt;フレッシュコンテキストで &lt;code&gt;.ralph/PROMPT.md&lt;/code&gt; を毎回再投入&lt;/strong&gt;、各タスクを TDD で実装、Stop hook (&lt;code&gt;ralph-continue.sh&lt;/code&gt;) で &lt;code&gt;DONE&lt;/code&gt; が出ていなければ自動継続。&lt;strong&gt;Phase 3(自動 QA)&lt;/strong&gt; では &lt;code&gt;qa&lt;/code&gt; subagent が Playwright MCP で 375×667 モバイル含む各種 viewport で実フロー検証、失敗時はデバッガに自動委譲します。&lt;strong&gt;Phase 4(出荷)&lt;/strong&gt; で &lt;code&gt;gh pr create&lt;/code&gt; し、GitHub Actions の &lt;code&gt;anthropics/claude-code-action@v1&lt;/code&gt; が PR レビューを自動コメントします。&lt;/p&gt;
&lt;p&gt;「機能要件 1 行 → 無人で機能完成」の最小コマンドは次の通りです(Ralph パターン版)。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 1. 仕様を spec に展開(対話、5 分)
echo &quot;ユーザーが商品にレビューを書いて星評価できる機能&quot; &amp;gt; /tmp/req.txt
claude --permission-mode plan \
  -p &quot;$(cat /tmp/req.txt) を cc-sdd で specs/review/{requirements,design,tasks}.md に展開し、
       .ralph/fix_plan.md にテストで検証可能なチェックリストを作成してください&quot;

# 2. Ralph ループを夜間に走らせる
caffeinate -i tmux new -d -s ralph \
  &quot;MAX_ITER=30 BUDGET_USD=5.00 ./ralph-loop.sh&quot;

# 3. 朝、PR を確認
gh pr list --author @me
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Pro プランで 24 時間化する経済的レシピ&lt;/strong&gt; は、ローカル launchd で毎晩 22:00 に &lt;code&gt;ralph-loop.sh&lt;/code&gt; を起動し(&lt;code&gt;/loop&lt;/code&gt; はセッション終了で消えるため永続用途には不適)、&lt;code&gt;ccusage statusline&lt;/code&gt; で残量常時表示、リミット到達時は bash でリセット時刻まで &lt;code&gt;caffeinate -i sleep&lt;/code&gt; するというものです。Routines(クラウド)は Pro で 5 回 / 日と少ないため、&lt;code&gt;@claude&lt;/code&gt; の PR コメント自動レビュー専用に使い、メイン開発はローカル Ralph で回しましょう。Pro 上限が頻繁にぶつかるようなら &lt;strong&gt;Max 5x($100)か &lt;code&gt;musistudio/claude-code-router&lt;/code&gt; で Sonnet を OpenRouter 経由 API(例: &lt;code&gt;anthropic/claude-sonnet-4.6&lt;/code&gt;)にスワップ&lt;/strong&gt; する運用が現実解です。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;隔離戦略:DevContainer + Worktree + Checkpointing が三種の神器&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;--dangerously-skip-permissions&lt;/code&gt; を実機で直に使うのはプロンプトインジェクションと破壊コマンドのリスクが高いです。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart TB
    Risk[&quot;⚠️ プロンプトインジェクション&amp;lt;br/&amp;gt;+ 破壊コマンド&quot;]

    subgraph &quot;🛡️ 三種の神器&quot;
        A[&quot;🐳 DevContainer&amp;lt;br/&amp;gt;iptables ホワイトリスト&quot;]
        B[&quot;🌳 Worktree 隔離&amp;lt;br/&amp;gt;.claude/worktrees/&quot;]
        C[&quot;⏪ Checkpointing&amp;lt;br/&amp;gt;Esc Esc / /rewind&quot;]
    end

    Risk -.防ぐ.-&amp;gt; A
    Risk -.防ぐ.-&amp;gt; B
    Risk -.防ぐ.-&amp;gt; C

    A --&amp;gt; Safe[&quot;✅ 無人実行可能&quot;]
    B --&amp;gt; Safe
    C --&amp;gt; Safe

    style Risk fill:#ffebee,stroke:#c62828
    style Safe fill:#e8f5e9,stroke:#2e7d32
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Anthropic 公式 DevContainer(&lt;code&gt;anthropics/claude-code/.devcontainer&lt;/code&gt;)は 3 ファイル構成(&lt;code&gt;devcontainer.json&lt;/code&gt;/&lt;code&gt;Dockerfile&lt;/code&gt;/&lt;code&gt;init-firewall.sh&lt;/code&gt;)で、iptables + ipset によるホワイトリスト型ファイアウォールを &lt;code&gt;node&lt;/code&gt; ユーザー sudoers で設定し、&lt;code&gt;api.anthropic.com&lt;/code&gt;/&lt;code&gt;registry.npmjs.org&lt;/code&gt;/&lt;code&gt;api.github.com&lt;/code&gt; 等のみ outbound 許可、それ以外 deny します。Anthropic は「コンテナのセキュリティ強化により安全に無人実行できる」と明記していますが、「Claude Code credential が漏洩しうるので &lt;strong&gt;信頼できるリポジトリでのみ使え&lt;/strong&gt;」と注意しています。スタンドアロンで動かすなら &lt;code&gt;docker run --cap-drop=ALL --cap-add=NET_ADMIN --cap-add=NET_RAW -v $(pwd):/workspaces/project claude-code-sandbox&lt;/code&gt; が定石で、&lt;code&gt;~/.ssh&lt;/code&gt; &lt;code&gt;~/.aws&lt;/code&gt; は絶対にマウントしないでください。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;--worktree&lt;/code&gt; (&lt;code&gt;-w&lt;/code&gt;) ネイティブサポートは v2.1.49–50 で CLI 統合され、&lt;code&gt;&amp;lt;repo&amp;gt;/.claude/worktrees/&amp;lt;name&amp;gt;/&lt;/code&gt; に隔離 worktree を作成します。Subagent frontmatter の &lt;code&gt;isolation: worktree&lt;/code&gt; で各サブエージェントを独立 worktree に閉じ込められ、並列実行時の同一ファイル編集競合を物理的に防げます。Boris Cherny 自身は &lt;strong&gt;同時 10〜15 体&lt;/strong&gt; の Claude を回しています。Checkpointing(Claude Code 2.0)は各編集前に自動スナップショットし &lt;code&gt;Esc Esc&lt;/code&gt; または &lt;code&gt;/rewind&lt;/code&gt; で巻き戻せますが、&lt;strong&gt;Claude のファイル編集ツールが行った変更のみ&lt;/strong&gt; が対象で手動編集や bash 経由の変更は含まれません──必ず Git と併用してください。&lt;code&gt;--max-turns 50&lt;/code&gt; と &lt;code&gt;--max-budget-usd 5.00&lt;/code&gt; で物理的上限も設定し、&lt;code&gt;PreToolUse&lt;/code&gt; hook で &lt;code&gt;rm -rf|sudo|:(){:|:&amp;amp;};:|dd if=|mkfs&lt;/code&gt; を正規表現で deny するスクリプトを必ず登録するようにしましょう。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;結論:Pro でも実装可能、ボトルネックは「人間の要件記述」だけ&lt;/h2&gt;
&lt;p&gt;2026 年 5 月時点で「機能要件さえ書けば Claude Code が無人で開発を進める」セットアップは Pro プランでも完全に実装可能です。鍵は次の 5 つです。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mindmap
  root((Pro で&amp;lt;br/&amp;gt;24h 自走))
    1. 三層防衛
      acceptEdits モード
      厳密な deny
      PreToolUse Hook
    2. 行動原則
      動作優先
      解決困難は次へ
      fix_plan.md 記録
    3. 分業
      Skills
      Subagents
      MCP 7 点
    4. 自己 QA
      Playwright MCP
      自動ブラウザ検証
    5. Ralph Loop で 24h 自走
      公式 ralph-loop plugin
      Stop hook 継続強制
      caffeinate + launchd
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;(1) &lt;code&gt;acceptEdits&lt;/code&gt; モード + 厳密な deny + PreToolUse hook の三層防衛&lt;/strong&gt; で危険操作を物理ブロックする&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(2) CLAUDE.md に「動作優先・解決困難は &lt;code&gt;.ralph/fix_plan.md&lt;/code&gt; に⚠️で記録して次へ」を行動原則化&lt;/strong&gt; する&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(3) Skills と Subagents で実装 / テスト / レビュー / QA を分業&lt;/strong&gt; する&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(4) Playwright MCP で自己 QA&lt;/strong&gt; まで閉じさせる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(5) Ralph Loop(公式 &lt;code&gt;ralph-loop&lt;/code&gt; plugin or snarktank/ralph)+ &lt;code&gt;caffeinate&lt;/code&gt; + リミット時刻パース + launchd で 24 時間自走させる&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ralph Wiggum ループ思想で「&lt;strong&gt;フレッシュコンテキスト × ファイルと git による状態永続化&lt;/strong&gt;」を徹底し、&lt;strong&gt;機械検証可能な完了条件 + ハードキャップ(&lt;code&gt;--max-iterations&lt;/code&gt;/&lt;code&gt;--max-budget-usd&lt;/code&gt;)&lt;/strong&gt; を必ず設定すれば、context rot で破綻せず根気で機能を完成させられます。&lt;/p&gt;
&lt;p&gt;留意点として、Claude Code は週次で急速にアップデートしており、&lt;code&gt;auto&lt;/code&gt; モード(2026/3)、Agent Teams(2026/2 実験的)、Routines(2026/4)、Opus 4.7(2026/4/16 GA)、OpenAI Codex CLI への Ralph ビルトイン化(2026/4/30)など 2026 年に入って自律性の階梯が一段上がりました。Pro での Routines 5 回 / 日制限は重要トリガー(PR review など)に絞り、メインのループはローカル launchd + Ralph で安く長く回すのが経済合理的です。&lt;/p&gt;
&lt;p&gt;最後に注意したいのは &lt;strong&gt;Pro は事実上 Sonnet 専用&lt;/strong&gt;(Opus 4.7 は Max 以上)である点、&lt;strong&gt;&lt;code&gt;/model sonnet&lt;/code&gt; 明示で安定稼働&lt;/strong&gt; する点、&lt;strong&gt;Cache Read がトークン消費の主犯&lt;/strong&gt; である点で、&lt;code&gt;ccusage daily --breakdown&lt;/code&gt; で月初に内訳を確認する習慣をつけたいところです。残るボトルネックは Claude ではなく &lt;strong&gt;人間が書く機能要件の質&lt;/strong&gt;(と &lt;code&gt;.ralph/fix_plan.md&lt;/code&gt; に落とす機械検証可能なチェックリストの設計)だけで、それを SDD の &lt;code&gt;requirements.md&lt;/code&gt; に EARS 記法で書ければ──あとは寝ている間に PR が積み上がっています。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;関連&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;実行可能ベストプラクティス版:[[2026-04-28_Claude Code Pro 自律稼働 実行可能ベストプラクティス.md]]&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>ClaudeCodeで抑えておく機能</title><link>https://tutttuwi.github.io/posts/2026-04-28_claudecode%E3%81%A7%E6%8A%91%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8F%E6%A9%9F%E8%83%BD/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2026-04-28_claudecode%E3%81%A7%E6%8A%91%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8F%E6%A9%9F%E8%83%BD/</guid><pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概要&lt;/h2&gt;
&lt;p&gt;Claude Code は Anthropic が提供する CLI ベースの AI コーディングエージェントです。単なる「コード補完ツール」ではなく、&lt;strong&gt;ファイル操作・シェル実行・Web 検索・サブエージェント呼び出し&lt;/strong&gt;といった機能を組み合わせて、設計→実装→レビュー→コミットまで一連の開発ワークフローをこなせる点が特徴です。&lt;/p&gt;
&lt;p&gt;ただし機能が豊富なため、「とりあえず使う」だけだと コンテキスト肥大・無限ループ・誤操作 などの落とし穴にハマりがちです。本記事では Claude Code を実務で使ううえで &lt;strong&gt;押さえておくべき主要機能&lt;/strong&gt; と、それぞれの&lt;strong&gt;ベストプラクティス／アンチパターン／活用事例&lt;/strong&gt;をまとめます。&lt;/p&gt;
&lt;h2&gt;目次&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#claudemd%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E8%A8%98%E6%86%B6%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB&quot;&gt;CLAUDE.md（プロジェクト記憶ファイル）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#skills%E5%86%8D%E5%88%A9%E7%94%A8%E5%8F%AF%E8%83%BD%E3%81%AA%E6%89%8B%E9%A0%86%E6%9B%B8&quot;&gt;Skills（再利用可能な手順書）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E8%87%AA%E5%8B%95%E6%89%BF%E8%AA%8D%E3%83%A2%E3%83%BC%E3%83%89permission-mode&quot;&gt;自動承認モード（permission mode）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%A8compact&quot;&gt;コンテキストサイズと /compact&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E3%83%9E%E3%83%AB%E3%83%81%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88sub-agents&quot;&gt;マルチエージェント（Sub-agents）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88clauderemote-agents--sandbox&quot;&gt;リモート Claude（Remote Agents / Sandbox）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#hooks%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%83%95%E3%83%83%E3%82%AF&quot;&gt;Hooks（イベントフック）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#plugins&quot;&gt;Plugins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#chrome%E6%8B%A1%E5%BC%B5&quot;&gt;Chrome 拡張&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#github%E9%80%A3%E6%90%BA&quot;&gt;GitHub 連携&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E3%81%9D%E3%81%AE%E4%BB%96%E6%8A%BC%E3%81%95%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E6%A9%9F%E8%83%BD&quot;&gt;その他押さえておきたい機能&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%85%A8%E4%BD%93%E3%83%99%E3%82%B9%E3%83%88%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9%E3%81%BE%E3%81%A8%E3%82%81&quot;&gt;全体ベストプラクティスまとめ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;CLAUDE.md（プロジェクト記憶ファイル）&lt;/h2&gt;
&lt;h3&gt;機能概要&lt;/h3&gt;
&lt;p&gt;Claude Code は起動時にカレントディレクトリ及び親ディレクトリの &lt;code&gt;CLAUDE.md&lt;/code&gt; を&lt;strong&gt;自動的に読み込み&lt;/strong&gt;、システムプロンプトに追加します。プロジェクト固有のコーディング規約・ディレクトリ構造・ビルドコマンド・禁止事項などを記述することで、毎回指示し直す必要がなくなります。&lt;/p&gt;
&lt;p&gt;階層は以下の優先順で読み込まれます：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;スコープ&lt;/th&gt;
&lt;th&gt;パス&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ユーザー&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.claude/CLAUDE.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;個人の好み（言語、口調、共通ルール）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;プロジェクト&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;repo&amp;gt;/CLAUDE.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;チーム共有のルール（Git にコミット）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ローカル&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;repo&amp;gt;/CLAUDE.local.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;個人用の上書き（&lt;code&gt;.gitignore&lt;/code&gt; 推奨）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;サブディレクトリ&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;repo&amp;gt;/path/to/CLAUDE.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;特定モジュール固有のルール&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;使い方&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;/init&lt;/code&gt; コマンドを叩くと、Claude が&lt;strong&gt;リポジトリを走査して CLAUDE.md の雛形を自動生成&lt;/strong&gt;してくれます。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 起動して
claude

# プロジェクトのルートで
/init
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;記載すべき主要項目：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Project Overview
- 何のプロジェクトか / 主要技術スタック

# Build &amp;amp; Test Commands
- `pnpm install` / `pnpm test` / `pnpm lint` などよく使うコマンド

# Code Style
- 言語別のコーディング規約
- コメントは日本語、識別子は英語、など

# Architecture
- 主要ディレクトリの責務
- 依存関係の方向

# Do / Don&apos;t
- 直接編集禁止のファイル
- 触ってはいけない設定
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;ベストプラクティス&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;「コマンド一覧」を必ず書く&lt;/strong&gt;：Claude は知らないとビルドコマンドを推測しがち。明示すれば確実にそれを使う。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Don&apos;t（禁止事項）を明確に&lt;/strong&gt;：「&lt;code&gt;migrations/&lt;/code&gt; 配下のファイルは編集しない」など、人間が暗黙に守っているルールほど書く価値が高い。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;長くなりすぎない&lt;/strong&gt;：CLAUDE.md は毎ターンのコンテキストに乗る。500 行を超えたら &lt;strong&gt;Skills に切り出す&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;アンチパターン&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;❌ README をそのままコピー → 不要な情報でコンテキストを汚染&lt;/li&gt;
&lt;li&gt;❌ 「丁寧に説明してください」など曖昧な指示 → 守られない&lt;/li&gt;
&lt;li&gt;❌ 全社共通ルールをプロジェクト CLAUDE.md に書く → ユーザースコープに置くべき&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;活用事例&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;モノレポで各パッケージの README 代わりに &lt;code&gt;packages/*/CLAUDE.md&lt;/code&gt; を配置し、Claude にそのパッケージ内の作業をさせる&lt;/li&gt;
&lt;li&gt;DB スキーマ規約を &lt;code&gt;db/CLAUDE.md&lt;/code&gt; に書き、SQL マイグレーション生成を任せる&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Skills（再利用可能な手順書）&lt;/h2&gt;
&lt;h3&gt;機能概要&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Skills&lt;/strong&gt; は「特定タスクの手順書」をディレクトリ単位で定義し、必要な時だけロードできる仕組みです。CLAUDE.md と違って&lt;strong&gt;常時ロードされない&lt;/strong&gt;ため、コンテキストを節約しつつ、複雑な手順を再現性高く実行できます。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/.claude/skills/
├── pr-review/
│   ├── SKILL.md           # 説明（先頭の YAML フロントマターでトリガー定義）
│   └── scripts/...        # 補助スクリプトも置ける
└── deploy-staging/
    └── SKILL.md
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;SKILL.md&lt;/code&gt; の冒頭に &lt;code&gt;description&lt;/code&gt; を書くと、Claude がユーザーの要求と照らし合わせて&lt;strong&gt;自動的に適切な Skill を起動&lt;/strong&gt;します。&lt;/p&gt;
&lt;h3&gt;使い方&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;---
name: pr-review
description: |
  GitHub PR のレビューを実施する。差分取得・テスト確認・
  コメント投稿までを行う。「PR レビューして」と言われたら起動。
---

# PR Review Skill
1. `gh pr view` で対象 PR を取得
2. `gh pr diff` で差分取得
3. レビュー観点（セキュリティ、パフォーマンス、可読性）でチェック
4. `gh pr review --comment` でコメント投稿
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;明示的に呼び出すこともできます：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/pr-review 1234
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;ベストプラクティス&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;「定型作業」を Skill 化&lt;/strong&gt;：リリース、コードレビュー、調査レポート生成など、毎回似た手順を踏むものは Skill にすると再現性が上がる。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;description はトリガー条件を具体的に&lt;/strong&gt;：「いつ起動すべきか／すべきでないか」を書くと誤起動が減る。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skill 内で別 Skill を呼ぶ&lt;/strong&gt;：合成して大きなワークフローを作れる。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;アンチパターン&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;❌ 1 回しか使わない処理を Skill 化 → 普通に依頼すれば良い&lt;/li&gt;
&lt;li&gt;❌ description が曖昧 → 起動されない or 誤起動&lt;/li&gt;
&lt;li&gt;❌ 巨大スクリプトを SKILL.md に直書き → &lt;code&gt;scripts/&lt;/code&gt; に分割する&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;活用事例&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;security-review&lt;/code&gt;：差分に対してセキュリティ観点のレビューを実施&lt;/li&gt;
&lt;li&gt;&lt;code&gt;init&lt;/code&gt;：新規プロジェクトに &lt;code&gt;CLAUDE.md&lt;/code&gt; を生成&lt;/li&gt;
&lt;li&gt;&lt;code&gt;simplify&lt;/code&gt;：直近の差分をリファクタしてシンプル化&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;自動承認モード（permission mode）&lt;/h2&gt;
&lt;h3&gt;機能概要&lt;/h3&gt;
&lt;p&gt;Claude Code は安全のため、ファイル書き込みやシェル実行のたびに&lt;strong&gt;確認プロンプト&lt;/strong&gt;を出します。これを制御するのが permission mode です。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;モード&lt;/th&gt;
&lt;th&gt;挙動&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;default&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;危険な操作のみ確認&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;acceptEdits&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ファイル編集のみ自動承認&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;plan&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;計画のみ立てて実行はしない（読み取り専用）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bypassPermissions&lt;/code&gt;（俗称：YOLO モード）&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;すべて自動実行&lt;/strong&gt;（要注意）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;起動時オプションや実行中の &lt;code&gt;Shift+Tab&lt;/code&gt; で切り替え可能。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 起動時に指定
claude --permission-mode acceptEdits

# 完全自動（サンドボックス環境でのみ推奨）
claude --dangerously-skip-permissions
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;ベストプラクティス&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;通常作業は &lt;code&gt;acceptEdits&lt;/code&gt;&lt;/strong&gt;：編集の確認プロンプトが減るだけでも体感が大きく変わる。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;読むだけなら &lt;code&gt;plan&lt;/code&gt; モード&lt;/strong&gt;：調査や設計レビューはこれで十分。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;完全自動は隔離環境で&lt;/strong&gt;：Docker / Devcontainer / &lt;code&gt;git worktree&lt;/code&gt; 内で動かす。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.claude/settings.json&lt;/code&gt; で &lt;strong&gt;特定コマンドのみ allowlist&lt;/strong&gt; にしておけば、permission prompt の発生回数を減らせる。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;permissions&quot;: {
    &quot;allow&quot;: [
      &quot;Bash(pnpm test*)&quot;,
      &quot;Bash(pnpm lint*)&quot;,
      &quot;Bash(git status)&quot;,
      &quot;Bash(git diff*)&quot;
    ]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;アンチパターン&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;❌ 本番リポジトリで最初から &lt;code&gt;--dangerously-skip-permissions&lt;/code&gt; → &lt;code&gt;rm -rf&lt;/code&gt; 系の事故が起きうる&lt;/li&gt;
&lt;li&gt;❌ allowlist に &lt;code&gt;Bash(*)&lt;/code&gt; を入れる → 自動承認の意味がない&lt;/li&gt;
&lt;li&gt;❌ &lt;code&gt;git push --force&lt;/code&gt; を allowlist に入れる → 取り返しがつかなくなる&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;活用事例&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;大量のリファクタを夜間に流すとき、サンドボックスで YOLO モード ＋ Hooks でテスト自動実行&lt;/li&gt;
&lt;li&gt;レビュー専用エイリアス：&lt;code&gt;alias claude-review=&apos;claude --permission-mode plan&apos;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;コンテキストサイズと /compact&lt;/h2&gt;
&lt;h3&gt;機能概要&lt;/h3&gt;
&lt;p&gt;LLM には扱える&lt;strong&gt;コンテキストウィンドウ&lt;/strong&gt;（Claude Sonnet 4.5/4.6 系で 200K〜1M トークン）があり、会話が長引くと制限に達します。Claude Code はこれを軽減するため：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;/compact&lt;/code&gt;&lt;/strong&gt;：会話履歴を要約して圧縮（手動実行）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自動コンパクション&lt;/strong&gt;：上限近くで自動的に要約&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;/clear&lt;/code&gt;&lt;/strong&gt;：履歴を完全リセット&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;使い方&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 手動で要約
/compact

# 要約のヒントを指定
/compact 「現在のリファクタリングの進捗とTODOを残して圧縮して」

# 完全リセット（タスク切替時）
/clear
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;ベストプラクティス&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;タスクが切り替わったら &lt;code&gt;/clear&lt;/code&gt;&lt;/strong&gt;：前のタスクの記憶は新タスクのノイズになる。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;長期タスクは &lt;code&gt;/compact&lt;/code&gt; を意識的に&lt;/strong&gt;：自動コンパクションは予測しにくい。区切りで明示的に呼ぶと精度が安定する。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重要事項はファイルに書き出す&lt;/strong&gt;：TODO / 設計メモは &lt;code&gt;notes/&lt;/code&gt; などに残せば、&lt;code&gt;/clear&lt;/code&gt; してもファイル経由で復元可能。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;キャッシュを温存する操作を選ぶ&lt;/strong&gt;：プロンプトキャッシュは 5 分 TTL。&lt;code&gt;/compact&lt;/code&gt; 直後など、キャッシュが切れる操作の連発はコスト増につながる。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;アンチパターン&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;❌ 1 セッションで何時間も同じスレッドを使い続ける → コストも品質も悪化&lt;/li&gt;
&lt;li&gt;❌ &lt;code&gt;/compact&lt;/code&gt; を何度も連打 → 要約の要約で情報が劣化&lt;/li&gt;
&lt;li&gt;❌ 大きなファイル全体を何度も Read → コンテキストを圧迫。Grep / 範囲指定 Read を使う&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;活用事例&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;長時間の調査タスクで「中間レポートを &lt;code&gt;report.md&lt;/code&gt; に保存 → &lt;code&gt;/clear&lt;/code&gt; → 続き」というワークフロー&lt;/li&gt;
&lt;li&gt;マルチタスクの並走時、&lt;code&gt;git worktree&lt;/code&gt; ＋ 別セッションで分離&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;マルチエージェント（Sub-agents）&lt;/h2&gt;
&lt;h3&gt;機能概要&lt;/h3&gt;
&lt;p&gt;Claude Code には &lt;strong&gt;Agent ツール&lt;/strong&gt;があり、メインのエージェントから&lt;strong&gt;サブエージェント&lt;/strong&gt;を起動して、独立したコンテキストで作業させられます。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;エージェント種別&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Explore&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;高速な調査専用（読み取りのみ）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;general-purpose&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;何でもこなす汎用エージェント&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Plan&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;設計・計画立案専用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;カスタム&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.claude/agents/*.md&lt;/code&gt; で独自定義可能&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;使い方&lt;/h3&gt;
&lt;p&gt;メインエージェントが「広範な調査」「独立検証」「設計レビュー」を必要とした際に内部的に呼び出します。ユーザーが明示的にお願いすることも可能：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;このコードベースで認証周りの実装をすべて洗い出して。Exploreエージェントを使って。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;カスタムエージェント定義例 &lt;code&gt;.claude/agents/sql-reviewer.md&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
name: sql-reviewer
description: SQLマイグレーションをレビューし、ロック・性能観点で問題を指摘
tools: [Read, Grep, Bash]
---
あなたはDB専門家です。以下を確認してください：
- NOT NULL 追加時のロック影響
- インデックスの妥当性
- 後方互換性
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;ベストプラクティス&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;コンテキスト分離が目的&lt;/strong&gt;：メインエージェントの履歴を汚さずに済む大量の調査・検証はサブに任せる。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;独立した「セカンドオピニオン」に使う&lt;/strong&gt;：レビュアーや設計レビューには別エージェントが効く。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;並列実行できる場合は並列で&lt;/strong&gt;：複数の独立調査は 1 メッセージで並列スポーン。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;アンチパターン&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;❌ 些細な質問でも毎回サブエージェント → 起動コストの無駄&lt;/li&gt;
&lt;li&gt;❌ サブにあいまいな指示「いい感じにして」 → 独立コンテキストなので余計に迷子になる&lt;/li&gt;
&lt;li&gt;❌ サブの結果を鵜呑み → 「やったつもり」の幻覚に注意。実ファイルを確認する&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;活用事例&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;大規模リファクタの「事前調査 → 計画 → 実装 → レビュー」を 4 つのサブで分業&lt;/li&gt;
&lt;li&gt;セキュリティレビュー時に &lt;code&gt;general-purpose&lt;/code&gt; ＋ &lt;code&gt;security-review&lt;/code&gt; Skill を併用&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;リモートClaude（Remote Agents / Sandbox）&lt;/h2&gt;
&lt;h3&gt;機能概要&lt;/h3&gt;
&lt;p&gt;ローカルマシンを占有せずに、**Anthropic 側のサンドボックス（または GitHub Actions などのリモート実行環境）**で Claude Code を走らせる機能群です。代表的なものに：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Anthropic 公式の Cloud Agents / Routines&lt;/strong&gt;：cron スケジュールで自動実行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub Actions 連携&lt;/strong&gt;：PR コメントで &lt;code&gt;@claude&lt;/code&gt; メンションするとサンドボックス内で実行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Devcontainer / Docker 内実行&lt;/strong&gt;：自前のサンドボックス&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;使い方&lt;/h3&gt;
&lt;p&gt;cron 風のスケジュール実行（例）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/schedule &quot;毎日 9:00 に dependabot PR をレビューしてマージ可能なものは approve&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;GitHub PR でのメンション：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@claude このPRをレビューして、テストの不足を指摘してください
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;ベストプラクティス&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;「夜間バッチ」用途に最適&lt;/strong&gt;：定期的な依存更新・脆弱性スキャン・ドキュメント整備など。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;権限を最小化&lt;/strong&gt;：リモート Claude が触れる範囲を GitHub App の権限で絞る（特定リポのみ、特定 Action のみ）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;シークレット管理&lt;/strong&gt;：API キーは Repo Secrets 経由。Claude のログに漏れないよう Hooks でマスク。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;アンチパターン&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;❌ 本番デプロイ権限まで渡す → 想定外コミットでロールアウトされる事故&lt;/li&gt;
&lt;li&gt;❌ ログ未確認で長期間放置 → 暴走に気付けない&lt;/li&gt;
&lt;li&gt;❌ コスト管理なしで cron 連打 → API 費用が膨らむ&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;活用事例&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;毎日 9:00 に「昨日マージされた PR を要約して Slack へ投稿」&lt;/li&gt;
&lt;li&gt;毎週月曜に「ライブラリ更新 PR を作成」&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Hooks（イベントフック）&lt;/h2&gt;
&lt;h3&gt;機能概要&lt;/h3&gt;
&lt;p&gt;Claude Code には &lt;strong&gt;ライフサイクルイベント&lt;/strong&gt;があり、各イベントで任意のシェルコマンドを実行できます。設定は &lt;code&gt;.claude/settings.json&lt;/code&gt; の &lt;code&gt;hooks&lt;/code&gt; フィールド。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;イベント&lt;/th&gt;
&lt;th&gt;タイミング&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PreToolUse&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ツール実行直前&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PostToolUse&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ツール実行直後&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;UserPromptSubmit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ユーザー入力送信時&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Stop&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;エージェント停止時&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SubagentStop&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;サブエージェント停止時&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Notification&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;確認プロンプト発生時&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;使い方&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;.claude/settings.json&lt;/code&gt; 例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;hooks&quot;: {
    &quot;PostToolUse&quot;: [
      {
        &quot;matcher&quot;: &quot;Edit|Write&quot;,
        &quot;hooks&quot;: [
          { &quot;type&quot;: &quot;command&quot;, &quot;command&quot;: &quot;pnpm lint --fix&quot; }
        ]
      }
    ],
    &quot;Stop&quot;: [
      {
        &quot;hooks&quot;: [
          { &quot;type&quot;: &quot;command&quot;, &quot;command&quot;: &quot;osascript -e &apos;display notification \&quot;Claude finished\&quot;&apos;&quot; }
        ]
      }
    ]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;ベストプラクティス&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;編集後は自動 lint / format&lt;/strong&gt;：人間がレビューするときに無駄な指摘が減る。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ガードレールに使う&lt;/strong&gt;：&lt;code&gt;PreToolUse&lt;/code&gt; で「特定ファイルへの編集を拒否」など。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;完了通知&lt;/strong&gt;：長時間タスクの終了を macOS 通知 / Slack で受け取る。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;アンチパターン&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;❌ Hook で重い処理（フルテストなど）→ 体感が極端に遅くなる&lt;/li&gt;
&lt;li&gt;❌ 失敗しても無視するスクリプト → 通った気になる落とし穴&lt;/li&gt;
&lt;li&gt;❌ 無限ループを作るフック（編集→lint→ファイル書き換え→編集 …）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;活用事例&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;PostToolUse&lt;/code&gt; で &lt;code&gt;prettier --write&lt;/code&gt; → 常にフォーマット済み&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Stop&lt;/code&gt; フックで &lt;code&gt;notify-send&lt;/code&gt; ＋ ベル音&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PreToolUse&lt;/code&gt; で本番DBに接続しようとした場合に拒否&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Plugins&lt;/h2&gt;
&lt;h3&gt;機能概要&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Plugin&lt;/strong&gt; は Skills / Hooks / Agents / Commands をパッケージ化して&lt;strong&gt;配布可能にする仕組み&lt;/strong&gt;です。&lt;code&gt;marketplace&lt;/code&gt; から追加でき、社内独自の Plugin を Git リポジトリで公開することも可能です。&lt;/p&gt;
&lt;h3&gt;使い方&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# Plugin 一覧
/plugins

# 追加（マーケットプレイス）
/plugins install anthropic/code-review

# 自社プラグインを Git から
/plugins install git+ssh://git@github.com/myorg/claude-plugins.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Plugin の中身（例）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;my-plugin/
├── plugin.json          # メタデータ
├── skills/
│   └── deploy/SKILL.md
├── agents/
│   └── reviewer.md
└── hooks/
    └── post-edit.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;ベストプラクティス&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;チーム共通の作法を Plugin 化&lt;/strong&gt;：CLAUDE.md だけでは表現しきれない複合的な機能（Skill ＋ Hook ＋ Agent）をひとまとめに配布。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;バージョニング&lt;/strong&gt;：Plugin の更新で挙動が変わると事故になるのでセマンティックバージョニングを徹底。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;アンチパターン&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;❌ 信頼できないソースから入れる → Hook で任意コマンド実行されるリスクあり&lt;/li&gt;
&lt;li&gt;❌ 1 機能だけの Plugin を乱立 → Skill 単体で十分&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;活用事例&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;社内デプロイフローをまるごと Plugin 化（Skill: deploy-staging / Hook: 自動 changelog 更新 / Agent: deploy-reviewer）&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Chrome拡張&lt;/h2&gt;
&lt;h3&gt;機能概要&lt;/h3&gt;
&lt;p&gt;Claude Code 関連の Chrome 拡張は、&lt;strong&gt;ブラウザの内容（選択テキスト、PR、Issue、Stack Overflow など）を Claude にワンクリックで渡す&lt;/strong&gt;ためのものです。代表的には：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Claude for Chrome&lt;/strong&gt;：ページの選択範囲・URL を取得して Claude のコンテキストに送る&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Obsidian 連携拡張&lt;/strong&gt;：Web → Obsidian → Claude の動線&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;使い方&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;拡張をインストール&lt;/li&gt;
&lt;li&gt;ページ上で対象テキストを選択&lt;/li&gt;
&lt;li&gt;拡張のショートカットキーで Claude に送信&lt;/li&gt;
&lt;li&gt;ローカルの Claude Code セッションがコンテキスト付きで起動&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;ベストプラクティス&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;長文のドキュメントを丸ごと送らない&lt;/strong&gt;：必要部分のみ選択。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;機密ページでは無効化&lt;/strong&gt;：社内 Wiki などで送信先を誤らないよう、ドメイン制限を設定。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;アンチパターン&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;❌ 「全ページ送信」→ コンテキスト浪費 ＋ 情報漏洩リスク&lt;/li&gt;
&lt;li&gt;❌ 拡張を経由してログを残さない → 何を送ったか後から確認できない&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;活用事例&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;LeetCode / AtCoder の問題ページから直接 Claude に解法を相談&lt;/li&gt;
&lt;li&gt;GitHub Issue を選択 → 関連する自分のコードベースを Claude に調査させる&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;GitHub連携&lt;/h2&gt;
&lt;h3&gt;機能概要&lt;/h3&gt;
&lt;p&gt;Claude Code には &lt;strong&gt;GitHub 公式 App&lt;/strong&gt; があり、PR・Issue 上で &lt;code&gt;@claude&lt;/code&gt; メンションすると、リモート Claude が起動して以下を実行できます：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PR レビュー＋コメント投稿&lt;/li&gt;
&lt;li&gt;Issue から PR 自動作成（実装 → ブランチ作成 → PR）&lt;/li&gt;
&lt;li&gt;CI 失敗時の自動リトライ・修正提案&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ローカル CLI からも &lt;code&gt;gh&lt;/code&gt; コマンド経由で密接に連携できます。&lt;/p&gt;
&lt;h3&gt;使い方&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# Claude Code 内から
gh pr create --title &quot;feat: add X&quot; --body &quot;...&quot;
gh pr review 123 --approve
gh issue list --label bug
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;PR コメントで：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@claude このコメントの指摘を反映してコミットしてください
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;ベストプラクティス&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitHub App の権限は最小化&lt;/strong&gt;：必要なリポのみ、必要なスコープのみ。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;gh&lt;/code&gt; を活用&lt;/strong&gt;：ローカル Claude Code は &lt;code&gt;gh&lt;/code&gt; で十分強力。コードレビュー、PR 作成、リリースノート作成までこなせる。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CI と組み合わせる&lt;/strong&gt;：CI 失敗 → Claude にスタックトレースを渡して修正案、というループ。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;アンチパターン&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;❌ &lt;code&gt;main&lt;/code&gt; への直接 push 権限を Claude に与える → ロールバック不能事故&lt;/li&gt;
&lt;li&gt;❌ Issue の自動 PR 化を「全 Issue」に適用 → ノイズ PR が量産される&lt;/li&gt;
&lt;li&gt;❌ レビュー結果を盲信して即マージ → 必ず人間のサインオフを残す&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;活用事例&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Issue ラベル &lt;code&gt;claude-task&lt;/code&gt; が付いたものだけ自動で PR ドラフト化&lt;/li&gt;
&lt;li&gt;リリース前に過去 1 週間の PR を Claude が要約してリリースノート生成&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;その他押さえておきたい機能&lt;/h2&gt;
&lt;h3&gt;Worktree / Isolation&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;git worktree&lt;/code&gt; を使った&lt;strong&gt;分離実行&lt;/strong&gt;で、メインブランチに影響を与えずに並列タスクを走らせられる。エージェント呼び出し時に &lt;code&gt;isolation: &quot;worktree&quot;&lt;/code&gt; を指定可能。&lt;/p&gt;
&lt;h3&gt;Background tasks&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;run_in_background&lt;/code&gt; 付きで Bash 実行すると、長時間タスクをバックグラウンド化できる。&lt;code&gt;Monitor&lt;/code&gt; でログのストリーミング監視。&lt;/p&gt;
&lt;h3&gt;MCP（Model Context Protocol）&lt;/h3&gt;
&lt;p&gt;外部のツールサーバー（DB、Slack、Figma など）を MCP サーバーとして接続でき、Claude が直接呼び出せる。&lt;code&gt;.mcp.json&lt;/code&gt; に定義。&lt;/p&gt;
&lt;h3&gt;Slash Commands（カスタム）&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;.claude/commands/*.md&lt;/code&gt; でプロジェクト固有のコマンドを定義可能。Skill よりも軽量、テンプレート的な使い方に向く。&lt;/p&gt;
&lt;h3&gt;Settings 階層&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;~/.claude/settings.json&lt;/code&gt;（個人）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;repo&amp;gt;/.claude/settings.json&lt;/code&gt;（プロジェクト共通、コミット）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;repo&amp;gt;/.claude/settings.local.json&lt;/code&gt;（個人ローカル、&lt;code&gt;.gitignore&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;キャッシュ最適化&lt;/h3&gt;
&lt;p&gt;プロンプトキャッシュは 5 分 TTL。短時間に繰り返し呼ぶワークロードは安く速くなる。逆に &lt;strong&gt;5 分超え&lt;/strong&gt; での待機はコストが膨らむので注意。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;全体ベストプラクティスまとめ&lt;/h2&gt;
&lt;h3&gt;「効く順」で導入する&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;CLAUDE.md&lt;/strong&gt; を整備（最大の費用対効果）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.claude/settings.json&lt;/code&gt; の allowlist&lt;/strong&gt; で permission prompt を減らす&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hooks&lt;/strong&gt; で lint / format / 完了通知を自動化&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skills&lt;/strong&gt; で定型作業をパッケージ化&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;マルチエージェント / Plugins / リモート&lt;/strong&gt; は必要になってから&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;安全運用の三原則&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;🔒 &lt;strong&gt;権限は最小・段階的に&lt;/strong&gt;：&lt;code&gt;plan&lt;/code&gt; → &lt;code&gt;default&lt;/code&gt; → &lt;code&gt;acceptEdits&lt;/code&gt; → &lt;code&gt;bypass&lt;/code&gt; の順に上げる&lt;/li&gt;
&lt;li&gt;🔒 &lt;strong&gt;隔離環境で攻めた使い方&lt;/strong&gt;：Docker / worktree / リモートサンドボックス&lt;/li&gt;
&lt;li&gt;🔒 &lt;strong&gt;コミットは人間が確認&lt;/strong&gt;：&lt;code&gt;git commit&lt;/code&gt; の自動化はしても、push 前のレビューは残す&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;コスト・速度の三原則&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;⚡ &lt;strong&gt;タスク切替で &lt;code&gt;/clear&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;⚡ &lt;strong&gt;大きなファイルは Grep / 範囲 Read&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;⚡ &lt;strong&gt;5 分以内ならキャッシュ温存、長く待つなら一気に&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;失敗パターンの早期発見&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;エージェントが&lt;strong&gt;同じツールを繰り返す&lt;/strong&gt;ようになったら無限ループの兆候 → 一度止める&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;「やりました」と言うが diff がない&lt;/strong&gt; → 必ず &lt;code&gt;git status&lt;/code&gt; / &lt;code&gt;git diff&lt;/code&gt; で確認&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;要約後に話が噛み合わない&lt;/strong&gt; → &lt;code&gt;/compact&lt;/code&gt; の劣化、&lt;code&gt;/clear&lt;/code&gt; ＋ 要点ファイル読み直しに切り替え&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;Claude Code はあくまで「優秀だが新人のチームメイト」です。&lt;strong&gt;CLAUDE.md で文化を共有し、Hooks でガードレールを敷き、Skills と Plugins で標準作業を整備する&lt;/strong&gt;ことで、長期的に安定したパフォーマンスを引き出せます。逆に何も整備せず権限だけ広げると、便利さと裏腹に事故率が上がるので、上記のベストプラクティスを段階的に取り入れていくのがおすすめです。&lt;/p&gt;
</content:encoded></item><item><title>Macディスクスペース確保操作</title><link>https://tutttuwi.github.io/posts/2026-04-27_mac%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E7%A2%BA%E4%BF%9D%E6%93%8D%E4%BD%9C/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2026-04-27_mac%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E7%A2%BA%E4%BF%9D%E6%93%8D%E4%BD%9C/</guid><pubDate>Mon, 27 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概要&lt;/h2&gt;
&lt;p&gt;Macのストレージは新しいバージョンのmacOSやアプリケーション更新により、気づかないうちに容量が逼迫することがあります。本記事では、Macでディスクスペースを確保するための調査方法と削減テクニック、開発環境固有の容量問題、そしてよくあるトラブルシューティングをまとめています。&lt;/p&gt;
&lt;h2&gt;目次&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%81%8C%E9%80%BC%E8%BF%AB%E3%81%99%E3%82%8B%E4%B8%BB%E3%81%AA%E5%8E%9F%E5%9B%A0&quot;&gt;ディスクスペースが逼迫する主な原因&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%AE%B9%E9%87%8F%E3%82%92%E8%AA%BF%E6%9F%BB%E3%81%99%E3%82%8B%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89&quot;&gt;容量を調査するコマンド&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E9%96%A2%E9%80%A3%E3%81%AE%E5%AE%B9%E9%87%8F%E5%89%8A%E6%B8%9B&quot;&gt;開発環境関連の容量削減&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%81%A8%E3%83%AD%E3%82%B0%E3%81%AE%E5%89%8A%E6%B8%9B&quot;&gt;キャッシュとログの削減&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#mac%E3%81%82%E3%82%8B%E3%81%82%E3%82%8B%E3%81%AA%E5%AE%B9%E9%87%8F%E5%95%8F%E9%A1%8C&quot;&gt;Macあるあるな容量問題&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E4%BE%BF%E5%88%A9%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB&quot;&gt;便利なツール&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;ディスクスペースが逼迫する主な原因&lt;/h2&gt;
&lt;h3&gt;1. &lt;strong&gt;開発環境関連&lt;/strong&gt;（最も容量消費しやすい）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Xcode キャッシュ&amp;amp;派生データ&lt;/strong&gt;：DerivedDataが数GB～十数GBになることも&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;iOS DeviceSupport&lt;/strong&gt;：複数バージョンのシミュレータサポートファイル&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gradle キャッシュ&lt;/strong&gt;（Android開発）：&lt;code&gt;.gradle/caches/&lt;/code&gt; が数GB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Node.js（node_modules）&lt;/strong&gt;：プロジェクトごとに数百MB～GB単位&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pnpm/npm/yarn キャッシュ&lt;/strong&gt;：パッケージマネージャの履歴&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docker イメージ&amp;amp;コンテナ&lt;/strong&gt;：不要なイメージが蓄積&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Python 仮想環境&lt;/strong&gt;（venv, conda）：複数プロジェクトで重複&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. &lt;strong&gt;キャッシュファイル&lt;/strong&gt;（見えにくい）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;~/Library/Caches/&lt;/code&gt;：アプリケーション各種のキャッシュ&lt;/li&gt;
&lt;li&gt;ブラウザキャッシュ（Chrome、Safari等）&lt;/li&gt;
&lt;li&gt;システムキャッシュ&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. &lt;strong&gt;ログファイル&lt;/strong&gt;（蓄積型）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;~/Library/Logs/&lt;/code&gt;：アプリケーションログ&lt;/li&gt;
&lt;li&gt;システムログ（&lt;code&gt;/var/log/&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;アプリケーション固有のログディレクトリ&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4. &lt;strong&gt;Macあるあるな容量消費&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Time Machine ローカルスナップショット&lt;/strong&gt;：バックアップ容量&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;言語データ&lt;/strong&gt;：Spotlightやシステムの多言語対応ファイル&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;システムキャッシュ&lt;/strong&gt;（.DS_Store等）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一時ファイル&lt;/strong&gt;（&lt;code&gt;/tmp/&lt;/code&gt;, &lt;code&gt;/var/tmp/&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;古いバージョンのOSダウンロード&lt;/strong&gt;（&lt;code&gt;/Library/Updates/&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5. &lt;strong&gt;メディアとバックアップ&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ダウンロードフォルダ&lt;/strong&gt;：使い終わったファイルが残存&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ゴミ箱&lt;/strong&gt;：未削除ファイル&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;クラウドストレージのローカルキャッシュ&lt;/strong&gt;（iCloud Drive等）&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;容量を調査するコマンド&lt;/h2&gt;
&lt;h3&gt;ディスク全体の使用状況を確認&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 全体の概観を見る
df -h

# より詳細に見る
diskutil info /
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;大容量フォルダを特定（推奨）&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 1GB以上のフォルダを容量順で表示（デスクトップに結果を出力）
sudo du --si -xct 1000000000 /System/Volumes/Data | sort -nr | head -30

# より詳細：結果をファイルに保存
sudo du --si -xct 1000000000 /System/Volumes/Data | sort -nr &amp;gt; ~/Desktop/DiskSpace.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;特定ディレクトリの容量を確認&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# ホームディレクトリの直下のフォルダサイズ
du -sh ~/*

# Libraryディレクトリの直下
du -sh ~/Library/*

# より詳細（木構造で表示）
tree -h -L 2 ~/Library 2&amp;gt;/dev/null || find ~/Library -maxdepth 2 -type d | xargs du -sh | sort -hr | head -20
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;ローカルスナップショットのサイズ確認（Time Machine）&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# Time Machine ローカルバックアップのサイズ確認
tmutil listlocalsnapshots /
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;開発環境関連の容量削減&lt;/h2&gt;
&lt;h3&gt;&lt;strong&gt;1. Xcode キャッシュとシミュレータ&lt;/strong&gt;&lt;/h3&gt;
&lt;h4&gt;DerivedData の削除（数GB～20GB程度削減可能）&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# まず容量を確認
du -sh ~/Library/Developer/Xcode/DerivedData

# 削除
rm -rf ~/Library/Developer/Xcode/DerivedData/*
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;iOS DeviceSupport の不要バージョン削除&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# リスト表示
ls -lh ~/Library/Developer/Xcode/iOS\ DeviceSupport/

# 不要なバージョン（古いiOSバージョン）をフォルダごと削除
rm -rf ~/Library/Developer/Xcode/iOS\ DeviceSupport/16.* # 例：iOS 16系を削除
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;シミュレータの利用不可デバイスを削除&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# 利用可能なデバイスをリスト表示
xcrun simctl list devices

# 利用不可デバイスを自動削除（2～3GB削減可能）
xcrun simctl delete unavailable
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Xcodeキャッシュの強制リセット&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;xcrun --kill-cache
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;2. Gradle キャッシュ&lt;/strong&gt;（Android開発）&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# Gradleキャッシュディレクトリの容量確認
du -sh ~/.gradle/caches/

# 削除
rm -rf ~/.gradle/caches/

# または、gradle コマンドで実行
cd /path/to/your/android/project
./gradlew cleanBuildCache
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;3. Node.js パッケージマネージャ&lt;/strong&gt;&lt;/h3&gt;
&lt;h4&gt;&lt;strong&gt;pnpm の不要キャッシュ削除&lt;/strong&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# ストア内の不要ファイル削除（推奨、安全）
pnpm store prune

# より詳細に確認
pnpm store status
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;strong&gt;npm キャッシュ削除&lt;/strong&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;npm cache clean --force
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;strong&gt;yarn キャッシュ削除&lt;/strong&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;yarn cache clean
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;strong&gt;node_modules の削除&lt;/strong&gt;（開発中は注意、再インストール必要）&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# 個別プロジェクト
cd /path/to/project
rm -rf node_modules/
pnpm install # または npm install / yarn install

# 複数プロジェクトを一括処理
find ~ -maxdepth 4 -name node_modules -type d -exec du -sh {} \; | sort -rh
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;4. Docker&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 使用していないイメージ、コンテナ、ネットワークを削除（推奨）
docker system prune -a

# より詳細な確認
docker system df

# 特定のイメージを削除
docker rmi &amp;lt;image_id&amp;gt;

# ダンgling imageだけ削除（安全）
docker image prune -a --filter &quot;dangling=true&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;5. Ollama（LLMモデル）&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# ダウンロード済みモデルをリスト表示
ollama list

# 不要なモデルを削除（数GBまたは数十GB）
ollama rm &amp;lt;model_name&amp;gt;

# 例：Llama2 (7B) を削除
ollama rm llama2:7b
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;6. Python 仮想環境&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# venv の容量確認
du -sh ~/.venv/
du -sh ./venv/

# 不要な仮想環境をまとめて削除
find ~ -maxdepth 3 -name &quot;venv&quot; -o -name &quot;.venv&quot; | xargs du -sh | sort -rh

# 削除
rm -rf ~/.venv/
rm -rf ./venv/

# conda の場合
conda clean --all -y
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;キャッシュとログの削減&lt;/h2&gt;
&lt;h3&gt;&lt;strong&gt;Caches フォルダの削除&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 容量確認
du -sh ~/Library/Caches/

# 削除（注意：アプリの再ダウンロードが発生する可能性）
rm -rf ~/Library/Caches/*

# 安全な部分削除（Chromeキャッシュなど）
rm -rf ~/Library/Caches/Google/Chrome/Default/Cache/
rm -rf ~/Library/Caches/Firefox/
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;ブラウザキャッシュの削除&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# Chrome
rm -rf ~/Library/Application\ Support/Google/Chrome/Default/Cache/
rm -rf ~/Library/Application\ Support/Google/Chrome/Default/Code\ Cache/

# Safari
rm -rf ~/Library/Safari/History.db*
rm -rf ~/Library/Caches/com.apple.Safari/

# Firefox
rm -rf ~/Library/Application\ Support/Firefox/Profiles/*/cache*/
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;ログファイルの削除&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# ホームディレクトリ内のログ
du -sh ~/Library/Logs/
rm -rf ~/Library/Logs/*

# システムログ（rootが必要）
sudo du -sh /var/log/
sudo rm -rf /var/log/*.log  # 注意：ログが消える
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;一時ファイルの削除&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# /tmp ディレクトリ
du -sh /tmp
rm -rf /tmp/*

# /var/tmp ディレクトリ
sudo du -sh /var/tmp
sudo rm -rf /var/tmp/*
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Macあるあるな容量問題&lt;/h2&gt;
&lt;h3&gt;&lt;strong&gt;1. Time Machine ローカルスナップショット&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Macがバッテリー駆動で外付けドライブがない場合、自動的にローカルスナップショット（バックアップ）が作成されます。これが10GB～100GB近く占めることがあります。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# スナップショット確認
tmutil listlocalsnapshots /

# 最も古いスナップショットを削除
tmutil deletelocalsnapshots $(tmutil listlocalsnapshots / | head -1 | tr -d &apos;.&apos; | awk &apos;{print $NF}&apos;)

# より安全：全スナップショット削除（要確認）
tmutil disablelocal  # ローカルスナップショット無効化
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;2. 言語データと絵文字&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# Spotlightインデックス
du -sh ~/Library/Metadata/CoreSpotlight/

# システム言語ファイル
du -sh /Library/Components/

# 不要な言語リソースを削除する場合
# /System/Library/English.lproj/ など（リスク高）
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;3. .DS_Store ファイル&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;macOSが各フォルダに自動生成するメタデータ。単体は小さいが、蓄積するとGB単位に。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# すべての .DS_Store を検索・削除
find ~ -name &quot;.DS_Store&quot; -type f -delete

# または
sudo find / -name &quot;.DS_Store&quot; -type f -delete
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;4. ダウンロードフォルダの未整理&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# ダウンロードフォルダの容量確認
du -sh ~/Downloads

# 30日以上前のファイルを確認
find ~/Downloads -mtime +30 -type f
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;5. ゴミ箱の未削除&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# ゴミ箱の容量確認
du -sh ~/.Trash/

# 空にする
rm -rf ~/.Trash/*
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;6. iCloud Drive のローカルキャッシュ&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# iCloud Driveのキャッシュ
du -sh ~/Library/Mobile\ Documents/

# 保存容量を最適化
# システム設定 &amp;gt; iCloud &amp;gt; iCloud Drive &amp;gt; オプション &amp;gt; 書類とデータ
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;7. アプリケーションの言語ファイル削除&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# アプリの多言語サポートを削除（日本語のみ残す等）
# AppMaker等のツールを使用するか、手動で削除可能
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;便利なツール&lt;/h2&gt;
&lt;h3&gt;&lt;strong&gt;GUI ツール&lt;/strong&gt;&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ツール&lt;/th&gt;
&lt;th&gt;説明&lt;/th&gt;
&lt;th&gt;価格&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Disk Diag&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ディスク容量を視覚的に表示、大容量ファイルを検出&lt;/td&gt;
&lt;td&gt;無料/有料&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CleanMyMac X&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;キャッシュ、ログ、不要ファイルの一括削除&lt;/td&gt;
&lt;td&gt;有料（サブスク）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DaisyDisk&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;円形グラフでディスク使用状況を視覚化&lt;/td&gt;
&lt;td&gt;有料&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OmniDiskSweeper&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;シンプルで軽量、視覚的なディスク分析&lt;/td&gt;
&lt;td&gt;無料&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Finder&lt;/strong&gt; の「ファイル情報」&lt;/td&gt;
&lt;td&gt;標準機能でフォルダサイズを確認&lt;/td&gt;
&lt;td&gt;無料&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;&lt;strong&gt;CLI ツール&lt;/strong&gt;&lt;/h3&gt;
&lt;h4&gt;&lt;strong&gt;ncdu（NCurses Disk Usage）&lt;/strong&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# インストール
brew install ncdu

# 使用例
ncdu ~
ncdu ~/Library

# ナビゲーション
# ↑↓：上下移動
# →：フォルダを開く
# ←：戻る
# d：削除
# q：終了
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;strong&gt;dust（より modern な du）&lt;/strong&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# インストール
brew install dust

# 使用例
dust ~/Library
dust -r ~/  # 逆順でソート
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;strong&gt;dirstat-rs（Rust 製）&lt;/strong&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# インストール
brew install dirstat-rs

# 使用例
dirstat ~/Library
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;strong&gt;duf（ディスク使用状況 CLI）&lt;/strong&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# インストール
brew install duf

# 使用例
duf        # マウント済みディスク全体
duf ~/     # ホームディレクトリ
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;ワンコマンドで実行できるスクリプト&lt;/h2&gt;
&lt;h3&gt;&lt;strong&gt;安全な削減スクリプト&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash

echo &quot;🧹 Macディスク容量削減スクリプト&quot;
echo &quot;================================&quot;

# 現在の使用量
echo &quot;&quot;
echo &quot;📊 削減前の使用量：&quot;
df -h | grep -E &quot;disk|Filesystem&quot;

# キャッシュ削除
echo &quot;&quot;
echo &quot;🗑️  キャッシュを削除...&quot;
rm -rf ~/Library/Caches/* 2&amp;gt;/dev/null
pnpm store prune 2&amp;gt;/dev/null
npm cache clean --force 2&amp;gt;/dev/null

# Xcode 関連
echo &quot;🗑️  Xcode キャッシュを削除...&quot;
rm -rf ~/Library/Developer/Xcode/DerivedData/* 2&amp;gt;/dev/null
xcrun simctl delete unavailable 2&amp;gt;/dev/null

# Docker
echo &quot;🗑️  Docker イメージを削除...&quot;
docker system prune -a -f 2&amp;gt;/dev/null

# ログ削除
echo &quot;🗑️  ログファイルを削除...&quot;
rm -rf ~/Library/Logs/* 2&amp;gt;/dev/null

# 結果表示
echo &quot;&quot;
echo &quot;📊 削減後の使用量：&quot;
df -h | grep -E &quot;disk|Filesystem&quot;
echo &quot;&quot;
echo &quot;✅ 完了！&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;より詳細に容量を確認するスクリプト&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash

echo &quot;🔍 Macディスク容量分析&quot;
echo &quot;====================&quot;

DIRS=(
  &quot;~/Library/Developer/Xcode/DerivedData&quot;
  &quot;~/Library/Caches&quot;
  &quot;~/Library/Logs&quot;
  &quot;~/.gradle/caches&quot;
  &quot;~/.docker&quot;
  &quot;~/Library/Mobile Documents&quot;
  &quot;~/.Trash&quot;
  &quot;~/Downloads&quot;
)

for DIR in &quot;${DIRS[@]}&quot;; do
  EXPANDED=$(eval echo &quot;$DIR&quot;)
  if [ -d &quot;$EXPANDED&quot; ]; then
    SIZE=$(du -sh &quot;$EXPANDED&quot; 2&amp;gt;/dev/null | awk &apos;{print $1}&apos;)
    echo &quot;$DIR: $SIZE&quot;
  fi
done
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;削減時の注意点&lt;/h2&gt;
&lt;h3&gt;&lt;strong&gt;削除しても安全なもの&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;✅ DerivedData（再構築される）&lt;/li&gt;
&lt;li&gt;✅ キャッシュ（再生成される）&lt;/li&gt;
&lt;li&gt;✅ 不要なDockerイメージ&lt;/li&gt;
&lt;li&gt;✅ .DS_Store&lt;/li&gt;
&lt;li&gt;✅ ローカルスナップショット（バックアップ必須時のみ）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;削除に慎重なもの&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;⚠️ node_modules（再インストール必要）&lt;/li&gt;
&lt;li&gt;⚠️ Python 仮想環境（再構築必要）&lt;/li&gt;
&lt;li&gt;⚠️ システムログ（トラブル時に必要）&lt;/li&gt;
&lt;li&gt;⚠️ iCloud Drive のキャッシュ（同期の遅延）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;絶対に削除してはいけないもの&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;❌ /System（システムファイル）&lt;/li&gt;
&lt;li&gt;❌ /Library/Fonts（フォント）&lt;/li&gt;
&lt;li&gt;❌ 重要なプロジェクトファイル&lt;/li&gt;
&lt;li&gt;❌ Time Machine の有効なバックアップ&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;Macの容量逼迫は予防が重要です：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;定期的に大容量フォルダを確認&lt;/strong&gt;する習慣をつける&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;開発環境のキャッシュを定期的にクリア&lt;/strong&gt;する&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不要なアプリ、言語ファイルを削除&lt;/strong&gt;する&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Time Machine の設定を確認&lt;/strong&gt;する&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;必要に応じて自動削減ツールを活用&lt;/strong&gt;する&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;スクリプトを cronjob で定期実行させることで、容量問題をプロアクティブに解決できます。&lt;/p&gt;
</content:encoded></item><item><title>脆弱性診断関連ツール種別サマリ</title><link>https://tutttuwi.github.io/posts/2026-04-14_security-summary/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2026-04-14_security-summary/</guid><pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概要&lt;/h2&gt;
&lt;p&gt;脆弱性診断ツールは種類が多く、選定の時点で迷いやすいです。
この記事では、まず全体像をつかみ、そのあとに実運用で使える比較と導入ステップまで一気に整理します。&lt;/p&gt;
&lt;h2&gt;想定読者とこの記事のゴール&lt;/h2&gt;
&lt;p&gt;本記事は、開発チームまたはSRE/セキュリティ担当として「脆弱性診断ツールをどう選び、どう運用に乗せるか」を短時間で判断したい読者を想定しています。&lt;/p&gt;
&lt;p&gt;ゴールは次の3点です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;種別ごとの役割を誤解なく把握する&lt;/li&gt;
&lt;li&gt;無料/有料を含む現実的な選択肢を比較する&lt;/li&gt;
&lt;li&gt;明日から動ける導入ステップを決める&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;まず押さえる用語整理&lt;/h2&gt;
&lt;p&gt;似た言葉が多いため、最初にざっくり整理しておきます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SAST&lt;/code&gt;: ソースコードを静的に解析し、実装上の問題を早期検出&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DAST&lt;/code&gt;: 稼働中アプリにリクエストを送り、外部から見える脆弱性を検出&lt;/li&gt;
&lt;li&gt;&lt;code&gt;OAST&lt;/code&gt;: 外部コールバックを使い、Blind系（SSRF/XXE等）の検出を補完&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SCA&lt;/code&gt;: OSS依存パッケージの脆弱性・ライセンスを把握&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CSPM/KSPM/IaC Scan&lt;/code&gt;: クラウド設定やIaCのミスコンフィグを検出&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;実務上は「診断（検出）」と「防御（RASP/CNAPP/CWPPなど）」を分けて考えると、導入時の判断がしやすくなります。&lt;/p&gt;
&lt;h2&gt;まず全体像（種別一覧）&lt;/h2&gt;
&lt;p&gt;最初に、脆弱性診断の種別を一枚で把握します。ここを基準に、この後の比較表や導入パターンを見ていくと理解しやすいです。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ツール種別&lt;/th&gt;
&lt;th&gt;略称＊SASTなど&lt;/th&gt;
&lt;th&gt;診断対象・目的&lt;/th&gt;
&lt;th&gt;代表ツール&lt;/th&gt;
&lt;th&gt;その他備考&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;サーバー・OS・インフラ脆弱性診断&lt;/td&gt;
&lt;td&gt;VMS / VM&lt;/td&gt;
&lt;td&gt;OS・ミドルウェア・ネットワーク機器の既知脆弱性検出&lt;/td&gt;
&lt;td&gt;Nessus, Qualys VMDR, OpenVAS&lt;/td&gt;
&lt;td&gt;定期スキャンとパッチ管理の連携が重要&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;コンテナ・イメージスキャン&lt;/td&gt;
&lt;td&gt;CIS&lt;/td&gt;
&lt;td&gt;コンテナイメージ内のOS/ライブラリ脆弱性検出&lt;/td&gt;
&lt;td&gt;Trivy, Grype, Clair&lt;/td&gt;
&lt;td&gt;CI/CD組み込みでシフトレフトしやすい&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Webアプリケーション動的診断&lt;/td&gt;
&lt;td&gt;DAST&lt;/td&gt;
&lt;td&gt;稼働中Webアプリへの疑似攻撃で脆弱性検出&lt;/td&gt;
&lt;td&gt;OWASP ZAP, Burp Suite, Invicti&lt;/td&gt;
&lt;td&gt;実行環境依存。認証付きテスト設計が鍵&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Out-of-Bandアプリケーション診断&lt;/td&gt;
&lt;td&gt;OAST&lt;/td&gt;
&lt;td&gt;外部コールバックを利用し、Blind系脆弱性（SSRF/XXE/Command Injection等）を検出&lt;/td&gt;
&lt;td&gt;Burp Collaborator, Interactsh&lt;/td&gt;
&lt;td&gt;DASTやAPI診断と併用して検出率を高める&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ソースコード静的解析&lt;/td&gt;
&lt;td&gt;SAST&lt;/td&gt;
&lt;td&gt;コード上の脆弱実装・危険パターン検出&lt;/td&gt;
&lt;td&gt;SonarQube, Checkmarx, Semgrep&lt;/td&gt;
&lt;td&gt;早期検出に有効。誤検知チューニングが必要&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ソフトウェア・コンポジション解析&lt;/td&gt;
&lt;td&gt;SCA&lt;/td&gt;
&lt;td&gt;OSS依存関係の脆弱性・ライセンスリスク把握&lt;/td&gt;
&lt;td&gt;Snyk, Dependabot, OWASP Dependency-Check&lt;/td&gt;
&lt;td&gt;SBOM運用と相性が良い&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;クラウド設定ポスチャ管理&lt;/td&gt;
&lt;td&gt;CSPM&lt;/td&gt;
&lt;td&gt;クラウド設定ミス・過剰権限・準拠違反の検出&lt;/td&gt;
&lt;td&gt;Prisma Cloud, Wiz, Orca Security&lt;/td&gt;
&lt;td&gt;マルチクラウド統制に有効&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;インタラクティブ・アプリケーション診断&lt;/td&gt;
&lt;td&gt;IAST&lt;/td&gt;
&lt;td&gt;実行時のアプリ内部計測で脆弱性を高精度検出&lt;/td&gt;
&lt;td&gt;Contrast Security, Seeker&lt;/td&gt;
&lt;td&gt;DAST/SASTの中間的アプローチ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;モバイルアプリ診断&lt;/td&gt;
&lt;td&gt;MAST&lt;/td&gt;
&lt;td&gt;モバイルアプリの静的/動的/逆コンパイル診断&lt;/td&gt;
&lt;td&gt;MobSF, QARK, NowSecure&lt;/td&gt;
&lt;td&gt;端末側保護や証明書ピンニング評価も対象&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;APIセキュリティ診断&lt;/td&gt;
&lt;td&gt;APIST&lt;/td&gt;
&lt;td&gt;API仕様・認可不備・ビジネスロジック欠陥検出&lt;/td&gt;
&lt;td&gt;42Crunch, Salt Security, Burp Suite API Scan&lt;/td&gt;
&lt;td&gt;OpenAPI連携で網羅性向上&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;外部アタックサーフェス管理&lt;/td&gt;
&lt;td&gt;EASM&lt;/td&gt;
&lt;td&gt;公開資産の棚卸し・露出リスク・設定不備の検出&lt;/td&gt;
&lt;td&gt;Censys, Shodan, Randori&lt;/td&gt;
&lt;td&gt;Shadow ITの可視化に有効&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;実行時アプリ自己防御&lt;/td&gt;
&lt;td&gt;RASP&lt;/td&gt;
&lt;td&gt;実行中アプリを監視し攻撃を検知・防御&lt;/td&gt;
&lt;td&gt;Contrast Protect, Imperva RASP&lt;/td&gt;
&lt;td&gt;防御寄り技術。診断と併用が一般的&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;クラウドネイティブ統合保護基盤&lt;/td&gt;
&lt;td&gt;CNAPP&lt;/td&gt;
&lt;td&gt;CSPM/CWPP/CIEM等を統合しクラウド全体を管理&lt;/td&gt;
&lt;td&gt;Prisma Cloud, Wiz, Lacework&lt;/td&gt;
&lt;td&gt;機能重複があるため導入時の整理が必要&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;クラウドワークロード保護&lt;/td&gt;
&lt;td&gt;CWPP&lt;/td&gt;
&lt;td&gt;VM/コンテナ/Kubernetes実行基盤の保護・検知&lt;/td&gt;
&lt;td&gt;Aqua Security, Sysdig Secure, Prisma Cloud Compute&lt;/td&gt;
&lt;td&gt;ランタイム保護中心&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kubernetes設定ポスチャ管理&lt;/td&gt;
&lt;td&gt;KSPM&lt;/td&gt;
&lt;td&gt;Kubernetesクラスタ設定不備・権限過多の検出&lt;/td&gt;
&lt;td&gt;Kubescape, Checkov, kube-bench&lt;/td&gt;
&lt;td&gt;Kubernetes特化。CSPMの補完として有効&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infrastructure as Code診断&lt;/td&gt;
&lt;td&gt;IaC Scan&lt;/td&gt;
&lt;td&gt;Terraform/CloudFormation等の設定不備を事前検出&lt;/td&gt;
&lt;td&gt;Checkov, tfsec, Terrascan&lt;/td&gt;
&lt;td&gt;デプロイ前検出で手戻り削減&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;シークレット検出&lt;/td&gt;
&lt;td&gt;Secrets Scan&lt;/td&gt;
&lt;td&gt;ソース/履歴内のAPIキー・資格情報漏えい検出&lt;/td&gt;
&lt;td&gt;Gitleaks, TruffleHog, GitHub Secret Scanning&lt;/td&gt;
&lt;td&gt;インシデント予防の即効性が高い&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;ツール選定マップ（Mermaid）&lt;/h2&gt;
&lt;p&gt;次に、よく使う種別と代表ツールの関係をマップで俯瞰します。無料/有料/推奨を色で見分けられるようにしています。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart LR
    A[脆弱性診断種別]
    A --&amp;gt; SAST[SAST]
    A --&amp;gt; DAST[DAST]
    A --&amp;gt; OAST[OAST]
    A --&amp;gt; SCA[SCA]
    A --&amp;gt; CSPM[CSPM]
    A --&amp;gt; APIST[APIST]
    A --&amp;gt; CIS[CIS]
    A --&amp;gt; SECRET[Secrets Scan]

    SAST --&amp;gt; Semgrep[Semgrep]
    SAST --&amp;gt; SonarQube[SonarQube]
    DAST --&amp;gt; ZAP[OWASP ZAP]
    DAST --&amp;gt; Burp[Burp Suite]
    OAST --&amp;gt; Interactsh[Interactsh]
    OAST --&amp;gt; Collaborator[Burp Collaborator]
    SCA --&amp;gt; Dependabot[Dependabot]
    SCA --&amp;gt; Snyk[Snyk]
    CSPM --&amp;gt; Prowler[Prowler]
    CSPM --&amp;gt; Wiz[Wiz]
    APIST --&amp;gt; APIFuzz[APIFuzzer]
    APIST --&amp;gt; Crunch[42Crunch]
    CIS --&amp;gt; Trivy[Trivy]
    CIS --&amp;gt; Grype[Grype]
    SECRET --&amp;gt; Gitleaks[Gitleaks]
    SECRET --&amp;gt; GHSecret[GitHub Secret Scanning]

    class Semgrep,ZAP,Interactsh,Dependabot,Prowler,APIFuzz,Trivy,Grype,Gitleaks free;
    class SonarQube,Burp,Collaborator,Snyk,Wiz,Crunch,GHSecret paid;
    class Semgrep,ZAP,Trivy,Gitleaks,Dependabot recommended;

    classDef free fill:#e8f5e9,stroke:#2e7d32,color:#1b5e20;
    classDef paid fill:#e3f2fd,stroke:#1565c0,color:#0d47a1;
    classDef recommended fill:#fffde7,stroke:#f9a825,stroke-width:3px,color:#5d4037;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;色の意味: 緑=無料中心、青=有料中心、黄枠=推奨（導入しやすさ/実績ベース）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;有料・無料と推奨の一覧（実務向け）&lt;/h2&gt;
&lt;p&gt;マップで全体感をつかんだあと、実際の選定に使えるように有料/無料と推奨候補を表で整理します。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ツール種別&lt;/th&gt;
&lt;th&gt;略称&lt;/th&gt;
&lt;th&gt;無料候補&lt;/th&gt;
&lt;th&gt;有料候補&lt;/th&gt;
&lt;th&gt;推奨（まず使う候補）&lt;/th&gt;
&lt;th&gt;その他備考&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;サーバー・OS・インフラ脆弱性診断&lt;/td&gt;
&lt;td&gt;VMS / VM&lt;/td&gt;
&lt;td&gt;OpenVAS&lt;/td&gt;
&lt;td&gt;Nessus, Qualys VMDR&lt;/td&gt;
&lt;td&gt;Nessus（商用）/ OpenVAS（OSS）&lt;/td&gt;
&lt;td&gt;エージェント運用の有無を先に決める&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;コンテナ・イメージスキャン&lt;/td&gt;
&lt;td&gt;CIS&lt;/td&gt;
&lt;td&gt;Trivy, Grype&lt;/td&gt;
&lt;td&gt;Prisma Cloud Compute, Snyk Container&lt;/td&gt;
&lt;td&gt;Trivy&lt;/td&gt;
&lt;td&gt;CIへの組込みが容易&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Webアプリケーション動的診断&lt;/td&gt;
&lt;td&gt;DAST&lt;/td&gt;
&lt;td&gt;OWASP ZAP&lt;/td&gt;
&lt;td&gt;Burp Suite Pro, Invicti&lt;/td&gt;
&lt;td&gt;ZAP + Burp Suite（併用）&lt;/td&gt;
&lt;td&gt;自動と手動の併用が有効&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Out-of-Bandアプリケーション診断&lt;/td&gt;
&lt;td&gt;OAST&lt;/td&gt;
&lt;td&gt;Interactsh&lt;/td&gt;
&lt;td&gt;Burp Collaborator&lt;/td&gt;
&lt;td&gt;Interactsh（OSS）&lt;/td&gt;
&lt;td&gt;Blind系検出でDAST補完&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ソースコード静的解析&lt;/td&gt;
&lt;td&gt;SAST&lt;/td&gt;
&lt;td&gt;Semgrep CE&lt;/td&gt;
&lt;td&gt;Checkmarx, SonarQube Server&lt;/td&gt;
&lt;td&gt;Semgrep CE&lt;/td&gt;
&lt;td&gt;ルール調整で誤検知抑制&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ソフトウェア・コンポジション解析&lt;/td&gt;
&lt;td&gt;SCA&lt;/td&gt;
&lt;td&gt;OWASP Dependency-Check, Dependabot&lt;/td&gt;
&lt;td&gt;Snyk, Mend&lt;/td&gt;
&lt;td&gt;Dependabot + Dependency-Check&lt;/td&gt;
&lt;td&gt;SBOM連携しやすい&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;クラウド設定ポスチャ管理&lt;/td&gt;
&lt;td&gt;CSPM&lt;/td&gt;
&lt;td&gt;Prowler, ScoutSuite&lt;/td&gt;
&lt;td&gt;Wiz, Prisma Cloud, Orca&lt;/td&gt;
&lt;td&gt;Wiz（商用）/ Prowler（OSS）&lt;/td&gt;
&lt;td&gt;マルチクラウド対応を要確認&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;インタラクティブ・アプリケーション診断&lt;/td&gt;
&lt;td&gt;IAST&lt;/td&gt;
&lt;td&gt;（選択肢少）&lt;/td&gt;
&lt;td&gt;Contrast, Seeker&lt;/td&gt;
&lt;td&gt;Contrast&lt;/td&gt;
&lt;td&gt;APM連携や性能影響を確認&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;モバイルアプリ診断&lt;/td&gt;
&lt;td&gt;MAST&lt;/td&gt;
&lt;td&gt;MobSF&lt;/td&gt;
&lt;td&gt;NowSecure&lt;/td&gt;
&lt;td&gt;MobSF&lt;/td&gt;
&lt;td&gt;まずは静的診断から開始&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;APIセキュリティ診断&lt;/td&gt;
&lt;td&gt;APIST&lt;/td&gt;
&lt;td&gt;OWASP ZAP API Scan, APIFuzzer&lt;/td&gt;
&lt;td&gt;42Crunch, Salt Security&lt;/td&gt;
&lt;td&gt;ZAP API Scan&lt;/td&gt;
&lt;td&gt;OpenAPI定義の整備が前提&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;外部アタックサーフェス管理&lt;/td&gt;
&lt;td&gt;EASM&lt;/td&gt;
&lt;td&gt;Shodan（限定無料）, Amass&lt;/td&gt;
&lt;td&gt;Censys, Randori&lt;/td&gt;
&lt;td&gt;Censys（商用）/ Amass（OSS）&lt;/td&gt;
&lt;td&gt;資産棚卸しプロセスとセット運用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;実行時アプリ自己防御&lt;/td&gt;
&lt;td&gt;RASP&lt;/td&gt;
&lt;td&gt;（選択肢少）&lt;/td&gt;
&lt;td&gt;Contrast Protect, Imperva RASP&lt;/td&gt;
&lt;td&gt;Contrast Protect&lt;/td&gt;
&lt;td&gt;防御系で運用チーム連携が必要&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;クラウドネイティブ統合保護基盤&lt;/td&gt;
&lt;td&gt;CNAPP&lt;/td&gt;
&lt;td&gt;（実質なし）&lt;/td&gt;
&lt;td&gt;Wiz, Prisma Cloud, Lacework&lt;/td&gt;
&lt;td&gt;Wiz&lt;/td&gt;
&lt;td&gt;単一製品へ寄せると運用しやすい&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;クラウドワークロード保護&lt;/td&gt;
&lt;td&gt;CWPP&lt;/td&gt;
&lt;td&gt;Falco（検知寄り）&lt;/td&gt;
&lt;td&gt;Aqua, Sysdig Secure&lt;/td&gt;
&lt;td&gt;Sysdig Secure&lt;/td&gt;
&lt;td&gt;ランタイム監視設計が重要&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kubernetes設定ポスチャ管理&lt;/td&gt;
&lt;td&gt;KSPM&lt;/td&gt;
&lt;td&gt;Kubescape, kube-bench&lt;/td&gt;
&lt;td&gt;Prisma Cloud, Wiz&lt;/td&gt;
&lt;td&gt;Kubescape&lt;/td&gt;
&lt;td&gt;Admission制御との併用推奨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infrastructure as Code診断&lt;/td&gt;
&lt;td&gt;IaC Scan&lt;/td&gt;
&lt;td&gt;Checkov, tfsec, Terrascan&lt;/td&gt;
&lt;td&gt;Snyk IaC&lt;/td&gt;
&lt;td&gt;Checkov&lt;/td&gt;
&lt;td&gt;PR時の自動チェック推奨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;シークレット検出&lt;/td&gt;
&lt;td&gt;Secrets Scan&lt;/td&gt;
&lt;td&gt;Gitleaks, TruffleHog&lt;/td&gt;
&lt;td&gt;GitHub Advanced Security&lt;/td&gt;
&lt;td&gt;Gitleaks&lt;/td&gt;
&lt;td&gt;pre-commit導入が効果的&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;ツール選定の判断軸&lt;/h2&gt;
&lt;p&gt;製品比較は機能の多さだけでなく、運用に乗るかどうかで評価するのが重要です。最低限、以下の軸で比較することを推奨します。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;判断軸&lt;/th&gt;
&lt;th&gt;見るポイント&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;検出カバレッジ&lt;/td&gt;
&lt;td&gt;想定脅威（Web/API/クラウド/依存関係）をどこまでカバーできるか&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;精度&lt;/td&gt;
&lt;td&gt;誤検知/見逃しのバランス、チューニング容易性&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;開発体験&lt;/td&gt;
&lt;td&gt;CI/CD連携、PRコメント連携、実行時間&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;運用コスト&lt;/td&gt;
&lt;td&gt;初期設定、ルール整備、日次トリアージ負荷&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;組織適合&lt;/td&gt;
&lt;td&gt;監査要件、マルチクラウド、責任分界との整合&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;組織規模別の導入パターン&lt;/h2&gt;
&lt;h3&gt;1. 小規模チーム（まずは低コストで開始）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Semgrep&lt;/code&gt;（SAST）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Trivy&lt;/code&gt;（コンテナ/CIS）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Gitleaks&lt;/code&gt;（Secrets）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Dependabot&lt;/code&gt;（SCA）&lt;/li&gt;
&lt;li&gt;必要に応じて &lt;code&gt;OWASP ZAP&lt;/code&gt;（DAST）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;まずは「PRで検出し、重大項目だけブロック」を目標にします。&lt;/p&gt;
&lt;h3&gt;2. 中規模チーム（OSS + 商用のハイブリッド）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;OSSで日常スキャン（Semgrep/Trivy/Gitleaks）&lt;/li&gt;
&lt;li&gt;商用で可視化や高度分析（Burp Suite Pro, Wiz, Snykなど）&lt;/li&gt;
&lt;li&gt;DAST + OAST（ZAP + Interactsh/Burp Collaborator）を併用&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;検出の幅と運用効率のバランスを取りやすい構成です。&lt;/p&gt;
&lt;h3&gt;3. 大規模組織（統合基盤でガバナンス強化）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CNAPP&lt;/code&gt; を中核に &lt;code&gt;CSPM/CWPP/KSPM&lt;/code&gt; を統合&lt;/li&gt;
&lt;li&gt;開発側に &lt;code&gt;SAST/SCA/Secrets&lt;/code&gt; を標準組込み&lt;/li&gt;
&lt;li&gt;監査向けレポートとSLA運用をセットで定義&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;「全体可視化」と「現場の改善サイクル」を分断しないことが成功の鍵です。&lt;/p&gt;
&lt;h2&gt;CI/CDへの最小実装例（GitHub Actions）&lt;/h2&gt;
&lt;p&gt;最初の一歩として、PR時に &lt;code&gt;SAST + SCA + Secrets + Container&lt;/code&gt; を実行する構成が現実的です。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;name: security-minimum
on:
  pull_request:
  push:
    branches: [main]

jobs:
  security-scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Semgrep (SAST)
        uses: returntocorp/semgrep-action@v1

      - name: Trivy (Container/FS)
        uses: aquasecurity/trivy-action@0.24.0
        with:
          scan-type: &quot;fs&quot;
          scan-ref: &quot;.&quot;
          severity: &quot;CRITICAL,HIGH&quot;

      - name: Gitleaks (Secrets)
        uses: gitleaks/gitleaks-action@v2

      - name: Dependency Check (SCA)
        uses: dependency-check/Dependency-Check_Action@main
        with:
          project: &quot;sample&quot;
          path: &quot;.&quot;
          format: &quot;HTML&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ポイントは、最初から完璧を目指さず、重大度で閾値を決めて段階的に厳格化することです。&lt;/p&gt;
&lt;h2&gt;運用ルール（導入後に効く項目）&lt;/h2&gt;
&lt;p&gt;ツール導入よりも、トリアージ運用の設計が成果を左右します。最低限、以下を決めておくと運用が安定します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;重大度ごとの対応期限（例: Criticalは48時間以内）&lt;/li&gt;
&lt;li&gt;誰が一次トリアージするか（開発/セキュリティの責任分界）&lt;/li&gt;
&lt;li&gt;誤検知のクローズ基準と再発防止の記録方法&lt;/li&gt;
&lt;li&gt;例外承認フロー（期限付き、承認者明記）&lt;/li&gt;
&lt;li&gt;月次での再発傾向レビュー&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;よくある失敗と回避策&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ツールを増やしすぎて誰も見なくなる&lt;br /&gt;
-&amp;gt; 最初は4種類程度に絞る（SAST/SCA/Secrets/Container）&lt;/li&gt;
&lt;li&gt;検出はするが直らない&lt;br /&gt;
-&amp;gt; SLAと担当を定義し、未対応を可視化する&lt;/li&gt;
&lt;li&gt;誤検知が多く開発体験を壊す&lt;br /&gt;
-&amp;gt; ルールを棚卸しし、ノイズの高い検知は調整する&lt;/li&gt;
&lt;li&gt;本番運用前にCI時間が肥大化する&lt;br /&gt;
-&amp;gt; PR時と夜間バッチでジョブを分割する&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;30/60/90日ロードマップ&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;期間&lt;/th&gt;
&lt;th&gt;目標&lt;/th&gt;
&lt;th&gt;実施内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;30日&lt;/td&gt;
&lt;td&gt;可視化開始&lt;/td&gt;
&lt;td&gt;Semgrep/Trivy/Gitleaks/DependabotをCIへ導入し、重大項目を把握&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;60日&lt;/td&gt;
&lt;td&gt;運用定着&lt;/td&gt;
&lt;td&gt;トリアージ手順、SLA、例外承認フローを文書化して運用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;90日&lt;/td&gt;
&lt;td&gt;統制強化&lt;/td&gt;
&lt;td&gt;DAST/OASTやCSPMを追加し、クラウド/アプリ横断で継続改善&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;参考フレームワーク&lt;/h2&gt;
&lt;p&gt;判断根拠を揃えるため、以下のフレームワークを参照すると実務で説明しやすくなります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OWASP ASVS&lt;/li&gt;
&lt;li&gt;OWASP SAMM&lt;/li&gt;
&lt;li&gt;NIST SSDF&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;脆弱性診断ツールの導入は「どの製品を入れるか」だけでなく、「どの順で、誰が、どう回すか」で成果が大きく変わります。
まずは小さく始めて、&lt;code&gt;SAST/SCA/Secrets/Container&lt;/code&gt; を確実に運用し、次に &lt;code&gt;DAST/OAST&lt;/code&gt; や &lt;code&gt;CSPM&lt;/code&gt; へ広げる進め方が現実的です。&lt;/p&gt;
</content:encoded></item><item><title>SSO連携について</title><link>https://tutttuwi.github.io/posts/2026-04-14_sso%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2026-04-14_sso%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/</guid><pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概要&lt;/h2&gt;
&lt;p&gt;SSO（Single Sign-On）は、1回の認証で複数システムにアクセスできる仕組みです。&lt;br /&gt;
「SSO連携」と一口に言っても、利用するプロトコルやトークンの扱いによって実装パターンが大きく変わります。&lt;/p&gt;
&lt;p&gt;この記事では、実務でよく使われるSSO連携の実装種別を整理し、各方式の動きと実装観点を図付きでまとめます。&lt;/p&gt;
&lt;h2&gt;SSO連携の実装種別&lt;/h2&gt;
&lt;p&gt;代表的な実装種別は次の4つです。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;SAML 2.0ベースSSO&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenID Connect（OIDC）ベースSSO&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OAuth 2.0（認可委譲）を中心にした疑似SSO&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ゲートウェイ／リバースプロキシ型SSO&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;補足: 近年の新規開発ではOIDCが中心ですが、企業システムではSAMLが現役のケースも多く、ハイブリッド運用も一般的です。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;各実装種別ごとの具体的な内容&lt;/h2&gt;
&lt;h3&gt;1) SAML 2.0ベースSSO&lt;/h3&gt;
&lt;h4&gt;SAMLの方式概要&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;ブラウザリダイレクトとXMLアサーションを使って認証結果を連携&lt;/li&gt;
&lt;li&gt;&lt;code&gt;IdP（Identity Provider）&lt;/code&gt; が認証し、&lt;code&gt;SP（Service Provider）&lt;/code&gt; が受け入れる&lt;/li&gt;
&lt;li&gt;企業内業務システムやSaaS連携で現在も広く利用&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;sequenceDiagram
    participant U as User
    participant SP as Service Provider
    participant IdP as Identity Provider

    U-&amp;gt;&amp;gt;SP: サービスへアクセス
    SP--&amp;gt;&amp;gt;U: IdPへリダイレクト（AuthnRequest）
    U-&amp;gt;&amp;gt;IdP: ログイン
    IdP--&amp;gt;&amp;gt;U: SAMLResponse（署名付き）をPOST
    U-&amp;gt;&amp;gt;SP: SAMLResponseを送信
    SP-&amp;gt;&amp;gt;SP: 署名検証・属性マッピング
    SP--&amp;gt;&amp;gt;U: セッション発行
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;SAML実装のポイント&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;メタデータ交換&lt;/strong&gt;: IdP/SP間で証明書・エンドポイントを事前共有&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;署名検証&lt;/strong&gt;: SAMLResponseの署名検証は必須&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;属性マッピング&lt;/strong&gt;: &lt;code&gt;NameID&lt;/code&gt; や属性をアプリのユーザー情報へ対応付け&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;セッション管理&lt;/strong&gt;: SP側セッションの有効期限と再認証条件を設計&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;SAMLが向いているケース&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;既存の企業基盤（ADFS, Shibboleth など）との連携&lt;/li&gt;
&lt;li&gt;既存SaaS連携がSAML中心の組織&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;2) OpenID Connect（OIDC）ベースSSO&lt;/h3&gt;
&lt;h4&gt;OIDCの方式概要&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;OAuth 2.0を拡張し、&lt;code&gt;IDトークン（JWT）&lt;/code&gt; で認証情報を表現&lt;/li&gt;
&lt;li&gt;Web/SPA/モバイルなどモダンなアプリ実装と相性が良い&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Authorization Code Flow + PKCE&lt;/code&gt; が現在の推奨&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;sequenceDiagram
    participant U as User
    participant C as Client App
    participant OP as OIDC Provider
    participant API as Resource API

    U-&amp;gt;&amp;gt;C: ログイン要求
    C--&amp;gt;&amp;gt;U: OPへリダイレクト（認可要求）
    U-&amp;gt;&amp;gt;OP: 認証
    OP--&amp;gt;&amp;gt;C: 認可コード
    C-&amp;gt;&amp;gt;OP: コード交換（+PKCE）
    OP--&amp;gt;&amp;gt;C: IDトークン + Accessトークン
    C-&amp;gt;&amp;gt;API: Accessトークン付きAPI呼び出し
    API--&amp;gt;&amp;gt;C: レスポンス
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;OIDC実装のポイント&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;フロー選定&lt;/strong&gt;: サーバーサイド/SPAで適切なフローを選ぶ&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;トークン検証&lt;/strong&gt;: 署名、&lt;code&gt;iss&lt;/code&gt;、&lt;code&gt;aud&lt;/code&gt;、&lt;code&gt;exp&lt;/code&gt; の検証を徹底&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PKCE対応&lt;/strong&gt;: 公開クライアント（SPA/モバイル）では必須&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;リフレッシュ戦略&lt;/strong&gt;: セキュアな保管と失効設計が重要&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;OIDCが向いているケース&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;新規開発のWebアプリ、モバイルアプリ、API中心アーキテクチャ&lt;/li&gt;
&lt;li&gt;Keycloak、Auth0、Entra IDなどモダンIdP利用時&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;3) OAuth 2.0中心の疑似SSO&lt;/h3&gt;
&lt;h4&gt;OAuth中心方式の概要&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;OAuthは本来「認可」の仕様であり、認証そのものの標準はOIDCが担う&lt;/li&gt;
&lt;li&gt;ただし実務では「同じ認可サーバーのトークンで複数APIを呼ぶ」ことで、体感的なSSOを実現するケースがある&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;flowchart LR
    U[User] --&amp;gt; FE[Frontend]
    FE --&amp;gt; AS[Authorization Server]
    AS --&amp;gt;|Access Token| FE
    FE --&amp;gt; API1[API A]
    FE --&amp;gt; API2[API B]
    FE --&amp;gt; API3[API C]
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;OAuth中心方式の実装ポイント&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;認証と認可の分離理解&lt;/strong&gt;: ログイン要件はOIDC併用で満たす&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;スコープ設計&lt;/strong&gt;: API単位の権限境界を明確化&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;トークン寿命&lt;/strong&gt;: 短命化と更新制御で漏えいリスクを低減&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;OAuth中心方式の注意点&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;OAuth単独では「ユーザーが誰か」を標準化して表現しづらい&lt;/li&gt;
&lt;li&gt;「SSOを実装したつもり」になる落とし穴があるため、要件定義で認証責務を明確にする&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;4) ゲートウェイ／リバースプロキシ型SSO&lt;/h3&gt;
&lt;h4&gt;ゲートウェイ型の方式概要&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;アプリの手前に認証ゲートウェイを置き、認証を共通化する方式&lt;/li&gt;
&lt;li&gt;各アプリはゲートウェイから渡されるヘッダやクレームを信頼して利用&lt;/li&gt;
&lt;li&gt;レガシーアプリを短期間でSSO配下に入れたい時に有効&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;flowchart TB
    U[User] --&amp;gt; GW[Auth Gateway / Reverse Proxy]
    GW --&amp;gt; IdP[Identity Provider]
    GW --&amp;gt; APP1[Legacy App]
    GW --&amp;gt; APP2[Internal Tool]
    GW --&amp;gt; APP3[Admin Console]
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;ゲートウェイ型の実装ポイント&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;信頼境界の明確化&lt;/strong&gt;: ヘッダ偽装防止（内部NW限定、mTLS等）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;アプリ改修最小化&lt;/strong&gt;: 既存アプリ側は最小限のユーザー受け渡し対応&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;監査ログ&lt;/strong&gt;: ゲートウェイで統一的に認証/アクセスログを取得&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;ゲートウェイ型が向いているケース&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;レガシー資産が多く、アプリ個別改修コストを抑えたい&lt;/li&gt;
&lt;li&gt;認証統制を入口で一元管理したい&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;実装選定の観点（簡易比較）&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;観点&lt;/th&gt;
&lt;th&gt;SAML&lt;/th&gt;
&lt;th&gt;OIDC&lt;/th&gt;
&lt;th&gt;OAuth中心&lt;/th&gt;
&lt;th&gt;ゲートウェイ型&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;主な用途&lt;/td&gt;
&lt;td&gt;企業連携/既存SaaS&lt;/td&gt;
&lt;td&gt;新規Web/SPA/モバイル&lt;/td&gt;
&lt;td&gt;API認可中心&lt;/td&gt;
&lt;td&gt;レガシー統合&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;実装難易度&lt;/td&gt;
&lt;td&gt;中&lt;/td&gt;
&lt;td&gt;中&lt;/td&gt;
&lt;td&gt;中&lt;/td&gt;
&lt;td&gt;中〜高&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;モダン開発との相性&lt;/td&gt;
&lt;td&gt;低〜中&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;td&gt;中&lt;/td&gt;
&lt;td&gt;中&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;認証標準としての明確さ&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;td&gt;低（単独では不足）&lt;/td&gt;
&lt;td&gt;構成依存&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;SSO連携は「どのプロトコルを使うか」だけでなく、&lt;strong&gt;認証責務をどこで担保するか&lt;/strong&gt;を決める設計です。&lt;br /&gt;
新規開発ではOIDCが第一候補になりやすく、既存環境ではSAMLやゲートウェイ型との併用が現実的です。&lt;/p&gt;
&lt;p&gt;最終的には、次の3点で選ぶと失敗しにくくなります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;利用中のIdP・既存資産との親和性&lt;/li&gt;
&lt;li&gt;対象アプリ（Web/SPA/モバイル/レガシー）の実装特性&lt;/li&gt;
&lt;li&gt;監査・運用（失効、ログ、障害時切り戻し）まで含めた運用設計&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>flutter JIT エラーで実機デバッグができなくなったことについて</title><link>https://tutttuwi.github.io/posts/2026-03-16_flutter-hotreload-error/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2026-03-16_flutter-hotreload-error/</guid><pubDate>Mon, 16 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概要&lt;/h2&gt;
&lt;p&gt;flutter開発をしていて、突然実機デバッグビルドができなくなったのでエラーを調査したことについて記載&lt;/p&gt;
&lt;h2&gt;💻 環境&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Flutter: 3.29.0 (fvm)&lt;/li&gt;
&lt;li&gt;OS: macOS Tahoe&lt;/li&gt;
&lt;li&gt;IDE: Cursor&lt;/li&gt;
&lt;li&gt;実機iPhone: 26.3.1&lt;/li&gt;
&lt;li&gt;xCode: 26.3&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;❌ エラー内容&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;Launching lib/main.dart on iPhone in debug mode...
Automatically signing iOS for device deployment using specified development team in Xcode project: xxxxxxxx
Xcode build done.                                           83.3s
You may be prompted to give access to control Xcode. Flutter uses Xcode to run your app. If access is not allowed, you can change this through your Settings &amp;gt; Privacy &amp;amp; Security &amp;gt; Automation.
version=3.7.2 (stable) (Tue Mar 11 04:27:50 2025 -0700) on &quot;ios_arm64&quot;
pid=81547, thread=259, isolate_group=vm-isolate(0x1056e1400), isolate=vm-isolate(0x105ccd000)
os=ios, arch=arm64, comp=no, sim=no
isolate_instructions=1071d75a0, vm_instructions=1071d75a0
fp=16d2a9050, sp=16d2a9030, pc=107c2f624
  pc 0x0000000107c2f624 fp 0x000000016d2a9050 Dart_DumpNativeStackTrace+0x18
  pc 0x00000001077ddbc8 fp 0x000000016d2a9070 dart::Assert::Fail(char const*, ...) const+0x30
  pc 0x00000001078d8adc fp 0x000000016d2a9520 dart::Code::FinalizeCode(dart::FlowGraphCompiler*, dart::compiler::Assembler*, dart::Code::PoolAttachment, bool, dart::CodeStatistics*)+0x82c
  pc 0x0000000107966450 fp 0x000000016d2a9b30 dart::StubCode::Init()+0x320
  pc 0x0000000107828c94 fp 0x000000016d2aa5e0 dart::Dart::DartInit(Dart_InitializeParams const*)+0x2b18
  pc 0x0000000107c15ef4 fp 0x000000016d2aaa60 Dart_Initialize+0x60
  pc 0x000000010779e5c4 fp 0x000000016d2ab030 flutter::DartVM::Create(flutter::Settings const&amp;amp;, fml::RefPtr&amp;lt;flutter::DartSnapshot const&amp;gt;, fml::RefPtr&amp;lt;flutter::DartSnapshot const&amp;gt;, std::_fl::shared_ptr&amp;lt;flutter::IsolateNameServer&amp;gt;)+0x1d64
  pc 0x00000001076fa73c fp 0x000000016d2ab790 flutter::Shell::Create(flutter::PlatformData const&amp;amp;, flutter::TaskRunners const&amp;amp;, flutter::Settings, std::_fl::function&amp;lt;std::_fl::unique_ptr&amp;lt;flutter::PlatformView, std::_fl::default_delete&amp;lt;flutter::PlatformView&amp;gt;&amp;gt; (flutter::Shell&amp;amp;)&amp;gt; const&amp;amp;, std::_fl::function&amp;lt;std::_fl::unique_ptr&amp;lt;flutter::Rasterizer, std::_fl::default_delete&amp;lt;flutter::Rasterizer&amp;gt;&amp;gt; (flutter::Shell&amp;amp;)&amp;gt; const&amp;amp;, bool)+0x310
  pc 0x00000001071e6564 fp 0x000000016d2ac520 -[FlutterEngine createShell:libraryURI:initialRoute:]+0xa8c
  pc 0x0000000107218e64 fp 0x000000016d2ac580 -[FlutterViewController sharedSetupWithProject:initialRoute:]+0x198
  pc 0x0000000107218ca4 fp 0x000000016d2ac5b0 -[FlutterViewController awakeFromNib]+0x6c
  pc 0x000000019c255374 fp 0x000000016d2aca80 &amp;lt;redacted&amp;gt;+0x6dc
  pc 0x000000019c82b61c fp 0x000000016d2acaf0 &amp;lt;redacted&amp;gt;+0xec
  pc 0x000000019c82b4f4 fp 0x000000016d2acb20 &amp;lt;redacted&amp;gt;+0x50
  pc 0x000000019c6893e4 fp 0x000000016d2acb80 &amp;lt;redacted&amp;gt;+0x8c
  pc 0x000000019b3f8a68 fp 0x000000016d2acbc0 &amp;lt;redacted&amp;gt;+0xa8
  pc 0x000000019c688908 fp 0x000000016d2acdb0 &amp;lt;redacted&amp;gt;+0x280
  pc 0x000000019bc91ea4 fp 0x000000016d2acde0 &amp;lt;redacted&amp;gt;+0x74
  pc 0x000000019b33de94 fp 0x000000016d2ace30 _UIScenePerformActionsWithLifecycleActionMask+0x70
  pc 0x000000019bc92720 fp 0x000000016d2acef0 &amp;lt;redacted&amp;gt;+0xfc
  pc 0x000000019bc9222c fp 0x000000016d2acf60 &amp;lt;redacted&amp;gt;+0xd4
  pc 0x000000019bc92538 fp 0x000000016d2ad070 &amp;lt;redacted&amp;gt;+0x260
  pc 0x000000019bc91fc4 fp 0x000000016d2ad0e0 &amp;lt;redacted&amp;gt;+0xf4
  pc 0x000000019bc9d444 fp 0x000000016d2ad120 &amp;lt;redacted&amp;gt;+0x94
  pc 0x000000019c10fcec fp 0x000000016d2ad220 &amp;lt;redacted&amp;gt;+0x2e0
  pc 0x000000019b33ecac fp 0x000000016d2ad290 _UISceneSettingsDiffActionPerformChangesWithTransitionContextAndCompletion+0xe0
  pc 0x000000019bc9d140 fp 0x000000016d2ad390 &amp;lt;redacted&amp;gt;+0x13c
  pc 0x000000019badc3b4 fp 0x000000016d2ad4e0 &amp;lt;redacted&amp;gt;+0x268
  pc 0x000000019badb448 fp 0x000000016d2ad650 &amp;lt;redacted&amp;gt;+0xd0
  pc 0x000000019badc020 fp 0x000000016d2ad710 &amp;lt;redacted&amp;gt;+0xf4
  pc 0x000000019c687968 fp 0x000000016d2ad7d0 &amp;lt;redacted&amp;gt;+0x1dc
  pc 0x000000019c138adc fp 0x000000016d2ad860 &amp;lt;redacted&amp;gt;+0x120
  pc 0x00000001b5a00388 fp 0x000000016d2ada10 &amp;lt;redacted&amp;gt;+0x16c
  pc 0x00000001b5a00840 fp 0x000000016d2ada50 &amp;lt;redacted&amp;gt;+0x80
  pc 0x00000001b5a001a0 fp 0x000000016d2adb20 &amp;lt;redacted&amp;gt;+0x1b4
  pc 0x00000001b5a6eb34 fp 0x000000016d2adbe0 &amp;lt;redacted&amp;gt;+0x120
  pc 0x00000001b5a0df00 fp 0x000000016d2adc20 &amp;lt;redacted&amp;gt;+0xa8
  pc 0x00000001b5a2ad98 fp 0x000000016d2add70 &amp;lt;redacted&amp;gt;+0x1e0
  pc 0x00000001b5a2c6fc fp 0x000000016d2ade00 &amp;lt;redacted&amp;gt;+0x10c
  pc 0x00000001b5a0df00 fp 0x000000016d2ade40 &amp;lt;redacted&amp;gt;+0xa8
  pc 0x00000001041c62e0 fp 0x000000016d2ade50 _dispatch_client_callout+0x10
  pc 0x00000001041b0998 fp 0x000000016d2adea0 _dispatch_block_invoke_direct+0x128
  pc 0x00000001ad0f41d4 fp 0x000000016d2aded0 &amp;lt;redacted&amp;gt;+0x34
  pc 0x00000001ad0f4054 fp 0x000000016d2adf50 &amp;lt;redacted&amp;gt;+0xe0
  pc 0x0000000195973f10 fp 0x000000016d2adf60 &amp;lt;redacted&amp;gt;+0x1c
  pc 0x0000000195973e84 fp 0x000000016d2adf90 &amp;lt;redacted&amp;gt;+0xac
  pc 0x0000000195951b30 fp 0x000000016d2adff0 &amp;lt;redacted&amp;gt;+0x14c
  pc 0x00000001959286d8 fp 0x000000016d2aed50 &amp;lt;redacted&amp;gt;+0x334
  pc 0x0000000195927a6c fp 0x000000016d2aede0 &amp;lt;redacted&amp;gt;+0x214
  pc 0x000000023753c498 fp 0x000000016d2aee30 GSEventRunModal+0x78
  pc 0x000000019b302df8 fp 0x000000016d2aeeb0 &amp;lt;redacted&amp;gt;+0x318
  pc 0x000000019b2abe54 fp 0x000000016d2aef40 UIApplicationMain+0x150
  pc 0x000000019b3d7820 fp 0x000000016d2aef80 &amp;lt;redacted&amp;gt;+0x24c
  pc 0x0000000103a6882c fp 0x000000016d2aefd0 $sSo21UIApplicationDelegateP5UIKitE4mainyyFZ+0x78
  pc 0x0000000103a687a4 fp 0x000000016d2af000 $s6Runner11AppDelegateC5$mainyyFZ+0x2c
  pc 0x0000000103a688a8 fp 0x000000016d2af020 __debug_main_executable_dylib_entry_point+0x1c
  pc 0x000000019293ae28 fp 0x000000016d2af690 &amp;lt;redacted&amp;gt;+0x1bcc
-- End of DumpStackTrace
=== Crash occurred when compiling unknown function in unoptimized JIT mode in unknown pass
════════════════════════════════════════════════════════════════════════════════
A change to iOS has caused a temporary break in Flutter&apos;s debug mode on
physical devices.
See https://github.com/flutter/flutter/issues/163984 for details.

In the meantime, we recommend these temporary workarounds:

* When developing with a physical device, use one running iOS 18.3 or lower.
* Use a simulator for development rather than a physical device.
* If you must use a device updated to iOS 26.2.1 23C71, use Flutter&apos;s release or
  profile mode via --release or --profile flags.
════════════════════════════════════════════════════════════════════════════════
=== Flow Graph not available

Exited (1).
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;🛠 解決方法&lt;/h2&gt;
&lt;h3&gt;flutterバージョンアップ&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# こちらにアップ
flutter --version
# Flutter 3.41.4 • channel stable • https://github.com/flutter/flutter.git
# Framework • revision ff37bef603 (12 days ago) • 2026-03-03 16:03:22 -0800
# Engine • hash 99578ad0355da00edb26301c874a3c250a5716f5 (revision e4b8dca3f1) (11 days ago) • 2026-03-03 18:24:54.000Z
# Tools • Dart 3.11.1 • DevTools 2.54.1

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;環境初期化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;端末内のアプリを削除しておく&lt;/li&gt;
&lt;li&gt;プロジェクトは&lt;code&gt;flutter clean&lt;/code&gt;、&lt;code&gt;flutter pub get&lt;/code&gt;からやり直す&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;IDE(vscode/launch.json)経由ではうまく行かない&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;IDEでいつも起動しているところからProfileモードで起動してもうまく行かなかった&lt;/li&gt;
&lt;li&gt;コマンドラインから立ち上げることでうまく立ち上がることを確認&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;flutter run --profile -d &amp;lt;device-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;あとがき&lt;/h2&gt;
&lt;p&gt;セキュリティ上の理由とのことだが少し不便&lt;/p&gt;
&lt;p&gt;デバッグはSimulatorで実施するべしとのこと&lt;/p&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/flutter/flutter/issues/163984&quot;&gt;https://github.com/flutter/flutter/issues/163984&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://speakerdeck.com/chigichan24/a-day-hot-reload-was-not-working&quot;&gt;https://speakerdeck.com/chigichan24/a-day-hot-reload-was-not-working&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>flutter fvm 設定について</title><link>https://tutttuwi.github.io/posts/2026-03-16_fvm-settings/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2026-03-16_fvm-settings/</guid><pubDate>Mon, 16 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概要&lt;/h2&gt;
&lt;p&gt;fvmのセットアップ方法をまとめます。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# インストール
brew tap leoafarias/fvm
brew install fvm

# flutter install
# インストールできるリストを確認
fvm releases

# インストール
fvm stable
fvm 3.41.4

# インストールされているリストを確認
fvm list

# 環境変数設定
echo -e &quot;\n# FVM Global Flutter Path\nexport PATH=\&quot;\$HOME/fvm/default/bin\&quot;:\&quot;\$PATH\&quot;&quot; &amp;gt;&amp;gt; ~/.zshrc
source ~/.zshrc

# バージョン確認
flutter --version

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;プロジェクトローカルで指定する方法&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# プロジェクトローカルで指定
fvm use &amp;lt;使用したいバージョン&amp;gt;
# 作成されるファイル) .fvm/fvm_config.json

# 他メンバが開いたときに指定されたバージョンのインストール
fvm install

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;IDE側でSDK設定
&lt;ul&gt;
&lt;li&gt;vscodeの場合（.vscode/settings.json）&lt;/li&gt;
&lt;li&gt;以下の設定を追加して認識させること&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;dart.flutterSdkPath&quot;: &quot;.fvm/flutter_sdk&quot;,
  &quot;search.exclude&quot;: {
    &quot;**/.fvm&quot;: true
  },
  &quot;files.exclude&quot;: {
    &quot;**/.fvm&quot;: true
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;gitignoreでsdkファイルは除外すること&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# FVM
.fvm/flutter_sdk
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;でも、プロジェクトごとにsdkを置くのはディスク容量取るのであまりやりたくない&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That&apos;s all!&lt;/p&gt;
</content:encoded></item><item><title>Git に誤ってプッシュしたセンシティブデータを完全削除する方法</title><link>https://tutttuwi.github.io/posts/2026-03-16_git-delete-sensitive-data/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2026-03-16_git-delete-sensitive-data/</guid><description>APIキーやパスワードなどのクレデンシャル情報をGitリポジトリに誤ってコミット・プッシュしてしまった場合の、GitLab・GitHub 両対応の完全削除手順を解説します。</description><pubDate>Mon, 16 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概要&lt;/h2&gt;
&lt;p&gt;APIキー、パスワード、秘密鍵などのセンシティブな情報を誤って Git リポジトリにコミット・プッシュしてしまった場合、&lt;strong&gt;単純に &lt;code&gt;git rm&lt;/code&gt; してコミットするだけでは不十分&lt;/strong&gt;です。Git の履歴にはすべての変更が記録されているため、過去のコミットを辿れば誰でも削除したつもりのファイルを参照できてしまいます。&lt;/p&gt;
&lt;p&gt;この記事では、GitLab および GitHub から該当ファイルの履歴を物理的に削除する手順を解説します。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;まず最初にやること&lt;/strong&gt;
作業を始める前に、流出したクレデンシャルを&lt;strong&gt;今すぐ無効化・ローテーション&lt;/strong&gt;してください。削除作業中もそのクレデンシャルは有効なままです。完全な削除が完了するまでの間も攻撃者がアクセスできる状態が続きます。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;GitLab 編&lt;/h2&gt;
&lt;h3&gt;1. ツールのインストール&lt;/h3&gt;
&lt;p&gt;履歴書き換えには &lt;a href=&quot;https://github.com/newren/git-filter-repo&quot;&gt;&lt;code&gt;git-filter-repo&lt;/code&gt;&lt;/a&gt; を使用します。Git 公式も推奨しているツールで、旧来の &lt;code&gt;git filter-branch&lt;/code&gt; より安全かつ高速です。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pip install git-filter-repo
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2. ミラークローンで全履歴を取得&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git clone --mirror &amp;lt;リポジトリの URL&amp;gt;
cd &amp;lt;リポジトリ名&amp;gt;.git
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;ミラークローンとは？&lt;/h4&gt;
&lt;p&gt;通常の &lt;code&gt;git clone&lt;/code&gt; はデフォルトブランチのみを取得しますが、&lt;code&gt;--mirror&lt;/code&gt; オプションを付けると&lt;strong&gt;すべてのブランチ・タグ・refs を含む完全なコピー&lt;/strong&gt;が取得されます。作業ディレクトリは作成されず、&lt;code&gt;.git&lt;/code&gt; の中身がそのままフォルダに展開された状態（ベアリポジトリ）になります。&lt;/p&gt;
&lt;p&gt;履歴の書き換えはすべてのブランチに一括で適用する必要があるため、ミラークローンが必要です。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;3. 対象ファイルの履歴を削除&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git filter-repo --path &amp;lt;削除対象ファイルのパス&amp;gt; --invert-paths
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--path&lt;/code&gt; : 対象ファイルのパスを指定します（例: &lt;code&gt;config/secrets.yml&lt;/code&gt;、&lt;code&gt;src/.env&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--invert-paths&lt;/code&gt; : 指定したパス&lt;strong&gt;以外&lt;/strong&gt;を残す、つまり指定したファイルをすべての履歴から取り除く、という意味です&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;複数ファイルを一度に削除したい場合は &lt;code&gt;--path&lt;/code&gt; を並べます：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git filter-repo --path config/secrets.yml --path .env --invert-paths
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;実行後、すべてのコミット履歴からそのファイルが取り除かれます。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;4. GitLab のプロテクトブランチを一時解除&lt;/h3&gt;
&lt;p&gt;強制プッシュ（force push）は通常、保護されたブランチへは禁止されています。GitLab の管理画面から一時的に解除します。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;GitLab のリポジトリページを開く&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Settings &amp;gt; Repository &amp;gt; Protected branches&lt;/strong&gt; に移動&lt;/li&gt;
&lt;li&gt;&lt;code&gt;main&lt;/code&gt;、&lt;code&gt;develop&lt;/code&gt; などの保護ブランチを &lt;strong&gt;Unprotect&lt;/strong&gt; にする&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;作業終了後は必ず保護設定を元に戻してください。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;5. リモートの登録と強制プッシュ&lt;/h3&gt;
&lt;p&gt;ミラークローンした状態ではリモートが未設定のため、まず追加します：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git remote add origin &amp;lt;リポジトリの URL&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;すべてのブランチとタグを強制プッシュします：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 全ブランチの強制プッシュ
git push origin --force --all

# 全タグの強制プッシュ
git push origin --force --tags
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;強制プッシュが必要な理由&lt;/h4&gt;
&lt;p&gt;通常のプッシュはリモートの履歴に対して&lt;strong&gt;追記のみ&lt;/strong&gt;が許可されています。今回は履歴を書き換えているため、リモートとローカルの履歴が矛盾します。&lt;code&gt;--force&lt;/code&gt; を使うことでリモートの履歴を上書きします。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;6. プロテクトブランチの保護設定を復旧&lt;/h3&gt;
&lt;p&gt;手順 4 で Unprotect したブランチを元の設定に戻します。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Settings &amp;gt; Repository &amp;gt; Protected branches&lt;/strong&gt; から再設定してください。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;7. GitLab 上の物理削除（ハウスキーピング）&lt;/h3&gt;
&lt;p&gt;強制プッシュでリモートから参照は外れますが、GitLab のサーバー上にはキャッシュや内部オブジェクトが残っている場合があります。ハウスキーピングを実行して物理的にデータを削除します。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;GitLab のリポジトリページを開く&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Settings &amp;gt; General &amp;gt; Advanced&lt;/strong&gt; に移動&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Housekeeping（ハウスキーピング）&lt;/strong&gt; を実行&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;GitLab.com（SaaS）の場合、完全な物理削除にはサポートへの問い合わせが必要になるケースもあります。セルフホスト版では管理者が &lt;code&gt;git gc --prune=now&lt;/code&gt; を実行することでも対応できます。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;8. 削除確認&lt;/h3&gt;
&lt;p&gt;対象ファイルへの古いコミットのパーマリンク URL にアクセスし、&lt;strong&gt;404 エラー&lt;/strong&gt;が返ることを確認します。&lt;/p&gt;
&lt;p&gt;例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://gitlab.com/&amp;lt;namespace&amp;gt;/&amp;lt;repo&amp;gt;/-/blob/&amp;lt;古いcommit hash&amp;gt;/&amp;lt;削除対象ファイルのパス&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;404 が返れば、GitLab 上からは閲覧不可能になっています。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;GitHub 編&lt;/h2&gt;
&lt;p&gt;基本的な手順は GitLab と同様ですが、いくつか差異があります。&lt;/p&gt;
&lt;h3&gt;1〜3. ツールインストール・ミラークローン・履歴削除&lt;/h3&gt;
&lt;p&gt;GitLab と完全に同じ手順です。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pip install git-filter-repo
git clone --mirror &amp;lt;リポジトリの URL&amp;gt;
cd &amp;lt;リポジトリ名&amp;gt;.git
git filter-repo --path &amp;lt;削除対象ファイルのパス&amp;gt; --invert-paths
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;4. GitHub のブランチ保護ルールを一時解除&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;GitHub のリポジトリページを開く&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Settings &amp;gt; Branches&lt;/strong&gt; に移動&lt;/li&gt;
&lt;li&gt;Branch protection rules の対象ブランチ（&lt;code&gt;main&lt;/code&gt; など）の &lt;strong&gt;Edit&lt;/strong&gt; をクリック&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Require a pull request before merging&lt;/strong&gt; などのルールを一時的に無効化するか、または &lt;strong&gt;Allow force pushes&lt;/strong&gt; を有効にする&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;5. 強制プッシュ&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git remote add origin &amp;lt;リポジトリの URL&amp;gt;
git push origin --force --all
git push origin --force --tags
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;6. ブランチ保護ルールの復旧&lt;/h3&gt;
&lt;p&gt;手順 4 で変更した設定を元に戻します。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;7. GitHub のキャッシュ削除&lt;/h3&gt;
&lt;p&gt;GitHub 側のキャッシュやフォークには古いデータが残っている可能性があります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;キャッシュのクリア&lt;/strong&gt;: GitHub サポートへ問い合わせることで、サーバー側のキャッシュを削除してもらえます。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;フォークの扱い&lt;/strong&gt;: フォークしているリポジトリには書き換えが反映されないため、フォーク先でも同様の作業が必要です。フォーク一覧は &lt;strong&gt;Settings &amp;gt; Danger Zone&lt;/strong&gt; から確認できます。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;GitHub には &lt;a href=&quot;https://docs.github.com/en/code-security/secret-scanning/about-secret-scanning&quot;&gt;Secret scanning&lt;/a&gt; 機能があり、プッシュされたシークレットを自動検出してアラートを出してくれます。流出したシークレットのローテーションと合わせて活用してください。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;チームメンバーへの周知とローカル環境の復旧&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;これが非常に重要です。&lt;/strong&gt; 書き換えた履歴を他のメンバーがそのまま &lt;code&gt;git push&lt;/code&gt; すると、削除したはずの履歴が復活してしまいます。必ずチーム全員に作業完了を通知し、ローカル環境を更新してもらってください。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;絶対禁止: 作業完了前後に既存のローカルリポジトリから &lt;code&gt;git push&lt;/code&gt; しないこと&lt;/strong&gt;
古い履歴を持ったまま push すると、削除した情報が再びリモートに載ってしまいます。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;未プッシュの変更がない人&lt;/h3&gt;
&lt;p&gt;一番シンプルなケースです。既存のフォルダを削除して再クローンするだけです。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 既存のフォルダを削除
rm -rf &amp;lt;リポジトリのフォルダ&amp;gt;

# 再クローン
git clone &amp;lt;リポジトリの URL&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;未プッシュの変更がある人&lt;/h3&gt;
&lt;p&gt;作業中の変更をパッチファイルに退避してから再クローンします。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# ステップ1: 現在の差分をパッチファイルに書き出す
git diff &amp;gt; my.patch

# ステップ2: ステージ済みの変更も含める場合
git diff --cached &amp;gt;&amp;gt; my.patch

# ステップ3: 既存フォルダを削除して再クローン
rm -rf &amp;lt;リポジトリのフォルダ&amp;gt;
git clone &amp;lt;リポジトリの URL&amp;gt;
cd &amp;lt;リポジトリのフォルダ&amp;gt;

# ステップ4: パッチを適用して変更を復元
git apply my.patch
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;ブランチも含めた変更がある場合は、&lt;code&gt;git bundle&lt;/code&gt; を使うとより安全に移行できます。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;まとめ・チェックリスト&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ステップ&lt;/th&gt;
&lt;th&gt;内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;✅ 0&lt;/td&gt;
&lt;td&gt;流出したクレデンシャルを&lt;strong&gt;今すぐ無効化・ローテーション&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ 1&lt;/td&gt;
&lt;td&gt;&lt;code&gt;git-filter-repo&lt;/code&gt; のインストール&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ 2&lt;/td&gt;
&lt;td&gt;ミラークローンで全履歴取得&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ 3&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--invert-paths&lt;/code&gt; で対象ファイルを履歴から削除&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ 4&lt;/td&gt;
&lt;td&gt;ブランチ保護の一時解除&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ 5&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--force --all&lt;/code&gt; と &lt;code&gt;--force --tags&lt;/code&gt; で強制プッシュ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ 6&lt;/td&gt;
&lt;td&gt;ブランチ保護の復旧&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ 7&lt;/td&gt;
&lt;td&gt;ハウスキーピング（物理削除）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ 8&lt;/td&gt;
&lt;td&gt;古い URL が 404 になることを確認&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ 9&lt;/td&gt;
&lt;td&gt;チームメンバーへ周知・ローカル環境を再クローン&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;そもそも防ぐためには &lt;code&gt;.gitignore&lt;/code&gt; の徹底や &lt;a href=&quot;https://github.com/awslabs/git-secrets&quot;&gt;git-secrets&lt;/a&gt; などのプリコミットフックの導入が有効です。「消す方法」を知ることも大事ですが、「プッシュしない仕組み」を先に整えることを強くお勧めします。&lt;/p&gt;
&lt;p&gt;That&apos;s all!&lt;/p&gt;
</content:encoded></item><item><title>rbenvの設定方法について</title><link>https://tutttuwi.github.io/posts/2026-03-13_setup-rbenv/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2026-03-13_setup-rbenv/</guid><pubDate>Fri, 13 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概要&lt;/h2&gt;
&lt;p&gt;flutter開発していて、以下の構成で進めていたが、cocoapodsが不安定になってきたので、gemfileのバージョン固定に乗り換えるためにrbenvの設定方法についてまとめます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;元々の構成&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ツール&lt;/th&gt;
&lt;th&gt;管理&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;rbenv&lt;/td&gt;
&lt;td&gt;brew&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ruby&lt;/td&gt;
&lt;td&gt;brew&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cocoapods&lt;/td&gt;
&lt;td&gt;brew&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;Gemfile構成&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ツール&lt;/th&gt;
&lt;th&gt;管理&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;rbenv&lt;/td&gt;
&lt;td&gt;brew&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ruby&lt;/td&gt;
&lt;td&gt;rbenv/Gemfile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cocoapods&lt;/td&gt;
&lt;td&gt;rbenv/Gemfile&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;fastlane&lt;/strong&gt;などを動かす場合は、同じくGemfileでバージョン固定するのが良さそう&lt;/p&gt;
&lt;h2&gt;1. Homebrewでrbenvをインストール&lt;/h2&gt;
&lt;p&gt;まずはパッケージマネージャーのHomebrewを使って、rbenvと、Rubyのビルドに必要な&lt;code&gt;ruby-build&lt;/code&gt;をインストールします。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;brew update
brew install rbenv ruby-build

&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2. シェルの設定（パスを通す）&lt;/h2&gt;
&lt;p&gt;インストールしただけではrbenvは動きません。お使いのシェル（多くの場合はZsh）の設定ファイルに、rbenvを初期化する記述を追加します。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo &apos;eval &quot;$(rbenv init -)&quot; &apos; &amp;gt;&amp;gt; ~/.zshrc
source ~/.zshrc

&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Bashを使っている場合は &lt;code&gt;~/.zshrc&lt;/code&gt; を &lt;code&gt;~/.bash_profile&lt;/code&gt; に読み替えてください。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;3. Ruby 4.0.1 のインストール&lt;/h2&gt;
&lt;p&gt;次に、目的のバージョンをインストールします。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# インストール可能なリストを更新
brew upgrade ruby-build

# 4.0.1 がリストにあるか確認
rbenv install -l | grep 4.0.1

# インストール実行
rbenv install 4.0.1

&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;4. バージョンの切り替え&lt;/h2&gt;
&lt;p&gt;インストールが終わったら、PC全体（global）で使うバージョンを4.0.1に固定します。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rbenv global 4.0.1

# 反映を確認
ruby -v

&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;よくあるトラブルと解決策&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;「4.0.1が見つからない」と言われる場合&lt;/strong&gt;: &lt;code&gt;brew upgrade ruby-build&lt;/code&gt; を実行して、rbenvが最新のRubyを知っている状態にしてください。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ビルドエラーが出る場合&lt;/strong&gt;: Xcode Command Line Toolsが必要です。&lt;code&gt;xcode-select --install&lt;/code&gt; を実行してから再度試してみてください。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;Ruby 4.0.1の準備が整いましたね！次に、プロジェクトでライブラリ（Gem）を管理するための &lt;strong&gt;Gemfile&lt;/strong&gt; を作成しましょう。&lt;/p&gt;
&lt;p&gt;最も一般的で「作法」に則った方法は、&lt;strong&gt;Bundler&lt;/strong&gt; というツールを使う方法です。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;ここからはGemfileのセットアップ&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;1. Bundlerをインストールする&lt;/h2&gt;
&lt;p&gt;Ruby 4.0系であれば標準で含まれていることが多いですが、念のため最新をインストールします。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gem install bundler

&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2. Gemfileを自動生成する&lt;/h2&gt;
&lt;p&gt;プロジェクトのルートディレクトリ（作業フォルダ）に移動して、以下のコマンドを叩きます。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bundle init

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;これだけで、カレントディレクトリに &lt;code&gt;Gemfile&lt;/code&gt; という名前のファイルが作成されます。&lt;/p&gt;
&lt;h2&gt;3. Gemfileの中身を編集する&lt;/h2&gt;
&lt;p&gt;生成された &lt;code&gt;Gemfile&lt;/code&gt; をテキストエディタで開き、必要なライブラリを記述します。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# frozen_string_literal: true

source &quot;https://rubygems.org&quot;

# 使用するRubyのバージョンを指定（チーム開発で役立ちます）
ruby &quot;4.0.1&quot;

# インストールしたいGemをここに書く
gem &quot;rails&quot;
gem &quot;sqlite3&quot;

&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;4. ライブラリをインストールする&lt;/h2&gt;
&lt;p&gt;記述が終わったら、ターミナルで以下のコマンドを実行します。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bundle install

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;これにより、Gemのインストールと同時に &lt;strong&gt;&lt;code&gt;Gemfile.lock&lt;/code&gt;&lt;/strong&gt; というファイルが生成されます。これは「どのバージョンのGemをインストールしたか」を正確に記録する重要なファイルです。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Gemfile管理のイメージ&lt;/h3&gt;
&lt;p&gt;Gemfileは「注文書」、Gemfile.lockは「納品書（確定版）」のような関係です。&lt;/p&gt;
&lt;hr /&gt;
</content:encoded></item><item><title>GoogleCalendarイベント追加リンク作成方法</title><link>https://tutttuwi.github.io/posts/2026-02-25_add-google-calendar-event/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2026-02-25_add-google-calendar-event/</guid><pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概要&lt;/h2&gt;
&lt;p&gt;GoogleCalendarイベントをリンクから作成する方法についてまとめます。&lt;/p&gt;
&lt;h2&gt;作成方法参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/InteractionDesignFoundation/add-event-to-calendar-docs/blob/main/services/google.md&quot;&gt;https://github.com/InteractionDesignFoundation/add-event-to-calendar-docs/blob/main/services/google.md&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;パラメータ解説&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ドメイン / いづれかを利用
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://calendar.google.com/calendar/render&quot;&gt;https://calendar.google.com/calendar/render&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://calendar.google.com/calendar/r/eventedit&quot;&gt;https://calendar.google.com/calendar/r/eventedit&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;こっちはactionパラメータが不要&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# TEMPLATE のみしか指定できない
action=TEMPLATE

# タイトル
text=hogeTitle 

# 日付
dates=20201231T193000Z/20201231T223000Z

# タイムゾーン
ctz=America/New_York

# 詳細
details=With clowns and stuff

# 場所
location=North Pole

# 他、パラメータは割愛

&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;サンプルURL&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://calendar.google.com/calendar/u/0/r/eventedit?text=Birthday&amp;amp;dates=20201231T193000Z/20201231T223000Z&amp;amp;details=With+clowns+and+stuff&amp;amp;location=North+Pole&quot;&gt;https://calendar.google.com/calendar/u/0/r/eventedit?text=Birthday&amp;amp;dates=20201231T193000Z/20201231T223000Z&amp;amp;details=With+clowns+and+stuff&amp;amp;location=North+Pole&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Markdownファイルをリアルタイムで編集する方法</title><link>https://tutttuwi.github.io/posts/2026-02-25_edit-markdown-efficiency/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2026-02-25_edit-markdown-efficiency/</guid><pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概要&lt;/h2&gt;
&lt;p&gt;Markdown編集の管理方法について&lt;/p&gt;
&lt;h2&gt;VSCode Extension&lt;/h2&gt;
&lt;h3&gt;Markdown Editor&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://marketplace.cursorapi.com/items/?itemName=zaaack.markdown-editor&quot;&gt;https://marketplace.cursorapi.com/items/?itemName=zaaack.markdown-editor&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;拡張機能でWYSIWYGが実現できるエディタ&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Tools&lt;/h2&gt;
&lt;h3&gt;MarkText&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/marktext/marktext&quot;&gt;https://github.com/marktext/marktext&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;brew&lt;/code&gt;経由だとインストール後に起動できないことを確認しました。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;以下より直接インストールすることで動作確認ができました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/marktext/marktext?tab=readme-ov-file#download-and-installation&quot;&gt;https://github.com/marktext/marktext?tab=readme-ov-file#download-and-installation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>ローカルLLM実践入門</title><link>https://tutttuwi.github.io/posts/2025-04_%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%ABllm%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2025-04_%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%ABllm%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80/</guid><pubDate>Thu, 17 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;基本情報&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;価格：2530円（本体2300円）　発行・発売日：2024年12月23日

◆自宅のパソコンで「CharGPT」のようなチャットAIサービスを動かす方法がわかります！

◆最初はGUIの操作だけで動かす方法を紹介するので、ローカルLLMがはじめてでも安心！

◆ローカルLLMをPythonのプログラムに組み込む方法がわかります！

◆ローカルLLMが生成した文章を「ずんだもん」に読み上げさせる方法がわかります！

◆ローカルLLMを快適に動かすためのパソコンを自作できます！

　「ChatGPT」のようなチャットAIサービスを手元のパソコンで動かす環境が整いつつあります。チャットAIサービスの頭脳とも呼ぶべき「LLM」（大規模言語モデル）が多数、公開されるようになったからです。本書では、これら公開されているLLMを手元のパソコンで動かし、活用する方法を解説しています。
　活用の手段として、本書では主にPythonのプログラムを利用しています。そう聞くと「Pythonのプログラマー向けか？」と思われるかもしれません。ご安心ください。本書はPythonを使ったことのない人でもローカルLLMを活用できるよう、Pythonの実行環境の導入方法なども含めて丁寧に解説しています。
　一つだけ注意点があります。現状は高性能なパソコンでなければ、ローカルLLMを快適には動かせないことです。特に高性能なグラフィックス機能を搭載しないパソコンでは、処理が終わるのに数十分も待たされたり、正しく動作しなかったりします。
　本書は7つの章で構成しています。第1章でローカルLLMの概要を解説した後、第2章以降で、実際に手元のパソコンでローカルLLMを動かす方法を解説しています。本書の解説とおりに手を動かしながら読み進めることで、ローカルLLMの動く仕組みと基本的な使い方、さらには活用法までを理解できる構成になっています。

【目次】

第1章　ローカルLLM［大規模言語モデル］の概要
　「LLM」には「クラウド型」と「ローカル型」があることを解説し、「ローカル型」のLLMである「ローカルLLM」を手元のパソコンで動かすのに必要なソフトウエアを紹介しています。

第2章　ローカルLLMをサクッと使える　ChatGPT風ツール「Jan」
　ローカルLLMを動かすためのソフトウエアとして「Jan」を紹介します。インストールから設定、利用まで、すべてGUIの操作だけで済むので、ローカルLLMがはじめてでも簡単に動かすことができます。

第3章　ローカルLLMを活用できる　コマンドラインツール「Ollama」
　ローカルLLMを動かすのに、コマンドラインを利用するソフトウエアとして「Ollama」を紹介します。基本的な使い方だけでなく、「LLMサーバー」として使う方法と、Pythonのプログラムに組み込んで使う方法も簡単に紹介しています。

第4章　ローカルLLMを活用（その1）　画像の内容を説明
　第4章から第6章は、主にローカルLLMをPythonのプログラムに組み込んで活用する方法を紹介します。第4章では、画像を読み込んで説明文を生成できる「マルチモーダル対応のLLM」を使う方法を紹介します。

第5章　ローカルLLMを活用（その2）　コードの作成を支援
　米Microsoftの「Visual Studio Code」などのテキストエディタにローカルLLMを組み込み、コードの作成を支援してもらう方法を解説します。実際に解説とおりに試すと、生成したコードを修正しなくても正常に動作することがわかります。

第6章　ローカルLLMを活用（その3）　LLM の回答を読み上げる
　ローカルLLMと音声読み上げライブラリ「「VOICEVOX CORE」を組み合わせ、ローカルLLMが生成した文章を、人気の読み上げキャラクターである「ずんだもん」の声で読み上げる方法を解説します。

第7章　ローカルLLMが快適に使える　最適なパソコンを自作しよう
　ローカルLLMが快適に動かせるパソコンのスペックと、お勧めのPCパーツを紹介します。パソコンの自作がはじめてでも、PCパーツの選び方や購入先などがわかります。

　なお、本書は第3章を除き、以下の日経BPが発行する専門誌の掲載記事を加筆修正する形で掲載しています。
第1章　日経ソフトウエア　2024年9月号　特集1
第2章　日経ソフトウエア　2024年9月号　特集1
第4章　日経ソフトウエア　2024年9月号　特集1
第5章　日経ソフトウエア　2025年1月号　特集1
第6章　日経ソフトウエア　2025年1月号　特集1
第7章　日経PC21　2024年12月号　特集

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;はじめに&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;OpenAI が ChatGPT を公開したのは2022年11月のこと&lt;/li&gt;
&lt;li&gt;生成AI：会話、ストーリー、画像、動画、音楽などの新しいコンテンツやアイデアを生み出すことのできる AI の一種&lt;/li&gt;
&lt;li&gt;LLM(大規模言語モデル)：文書を生成するAIの中核となる技術&lt;/li&gt;
&lt;li&gt;GoogleやMetaが高性能なLLMモデルを公開し始めたのでローカル環境で高性能なLLMを利用することができるようになった&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;✅ GoogleやMetaが自社LLMを公開した理由まとめ&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;目的&lt;/th&gt;
&lt;th&gt;説明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;技術の普及&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;研究・教育・技術開発の加速。オープンなAI開発を促進。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ブランド強化&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;技術力のアピールや人材獲得。業界内での存在感を示す。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;利用データ取得&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;実利用によるフィードバックでモデルを改善。偏りやバグの発見も可能。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;エコシステム構築&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;他社に使わせて囲い込み。自社クラウドやプラットフォームの利用促進。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;コスト削減&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;開発リソースを分散し、他者の改良を取り込むことで効率的に改善。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;社会的責任&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;透明性の確保や規制対応。オープンにすることで責任あるAI開発を推進。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;第1章　ローカルLLM［大規模言語モデル］の概要&lt;/h3&gt;
&lt;p&gt;「LLM」には「クラウド型」と「ローカル型」があることを解説し、「ローカル型」のLLMである「ローカルLLM」を手元のパソコンで動かすのに必要なソフトウエアを紹介しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ローカルLLMの一種&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MicrosoftCopilot&lt;/li&gt;
&lt;li&gt;Apple Intelligence
&lt;ul&gt;
&lt;li&gt;情報漏洩の心配もなし&lt;/li&gt;
&lt;li&gt;従量課金の心配もなし&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pythonライブラリを利用すればWebUIも簡単に実装可能&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chainlit&lt;/li&gt;
&lt;li&gt;Streamlit&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AIチャットボットも構築可能&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Transforms&lt;/li&gt;
&lt;li&gt;Langchain&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ローカルLLMのカスタマイズ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RAG&lt;/li&gt;
&lt;li&gt;ファインチューニング&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;1.2 ローカルLLMに必要なファイル&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;必要なファイルは２つ
&lt;ul&gt;
&lt;li&gt;LLMファイル
&lt;ul&gt;
&lt;li&gt;インターネット上にある膨大なデータを学習したモデルファイル&lt;/li&gt;
&lt;li&gt;ChatGPTのようなクラウド型のAIはクローズド型&lt;/li&gt;
&lt;li&gt;インターネット公開されているものはオープン型のLLMファイル
&lt;ul&gt;
&lt;li&gt;HuggingFaceのModelsのウェブページから入手可能&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://huggingface.co/models&quot;&gt;https://huggingface.co/models&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;ファイルはGB単位で、一般的にサイズが大きいほど高性能なLLM&lt;/li&gt;
&lt;li&gt;日本語に強いLLMがあったり色々&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;LLM選択のポイント
&lt;ul&gt;
&lt;li&gt;gguf形式であること&lt;/li&gt;
&lt;li&gt;パラメータ数&lt;/li&gt;
&lt;li&gt;量子化のビット数
&lt;ul&gt;
&lt;li&gt;量子化・標本化について：&lt;a href=&quot;https://joho-taisaku.com/sampling/&quot;&gt;https://joho-taisaku.com/sampling/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;まとめ
&lt;ul&gt;
&lt;li&gt;パラメータ数と量子化のビット数が多いほど高性能なLLMだが、代わりにファイルサイズも巨大になるので、動かすには高性能なパソコンを用意しなければならない&lt;/li&gt;
&lt;li&gt;性能の低いパソコンをでLLMを動かしたいのであれば、パラメータ数と量子化ビット数が少ないLLMを選ぶ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;LLM選定の３つのポイントはファイル名に含まれている
&lt;ul&gt;
&lt;li&gt;ELYZA-japanese-Llama-2-7b-q4_0.gguf&lt;/li&gt;
&lt;li&gt;7b:70億パラメータを示す billion&lt;/li&gt;
&lt;li&gt;q4:量子化ビット数は4bitを示す、qはquantization(量子化)の略&lt;/li&gt;
&lt;li&gt;gguf:ファイル形式&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;LLMプラットフォームのソフトウェア
&lt;ul&gt;
&lt;li&gt;LLM実行環境と呼ばれるもの&lt;/li&gt;
&lt;li&gt;例）
&lt;ul&gt;
&lt;li&gt;Jan&lt;/li&gt;
&lt;li&gt;Ollama&lt;/li&gt;
&lt;li&gt;llama.cpp&lt;/li&gt;
&lt;li&gt;Text-generation-webui&lt;/li&gt;
&lt;li&gt;Backyard AI&lt;/li&gt;
&lt;li&gt;LM Studio&lt;/li&gt;
&lt;li&gt;NVIDIA ChatRTX&lt;/li&gt;
&lt;li&gt;AI Toolkit for VS Code&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;これらのソフトでダウンロードしたLLMファイルを動かすことが可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;第2章　ローカルLLMをサクッと使える　ChatGPT風ツール「Jan」&lt;/h3&gt;
&lt;p&gt;ローカルLLMを動かすためのソフトウエアとして「Jan」を紹介します。インストールから設定、利用まで、すべてGUIの操作だけで済むので、ローカルLLMがはじめてでも簡単に動かすことができます。&lt;/p&gt;
&lt;h4&gt;2.1 ChatGPT風ツール「Jan」を導入する&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jan: ローカル環境で大規模言語モデル（LLM）を簡単に実行できるオープンソースのプラットフォーム&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;👋のマークのLLMプラットフォーム&lt;/li&gt;
&lt;li&gt;たぶん、Janは人名でよく使われる名称で親しみを込めて命名されたのでは？という説&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ここからインストール&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://jan.ai&quot;&gt;https://jan.ai&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;開くといろんなLLMモデルが表示されるが、タグがついていないのが、現在のマシンで推奨されるモデル&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Llama 3.2 1B Instruct Q8&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;8bit量子化&lt;/li&gt;
&lt;li&gt;10億パラメータ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2.2 Llama 3.2 とのチャットAIを試す&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;前提
&lt;ul&gt;
&lt;li&gt;Fugakuはスペック不足でインストールできなかったので、Llamaで試す&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Jan起動&lt;/li&gt;
&lt;li&gt;適当なChatを実施する&lt;/li&gt;
&lt;li&gt;左下のサーバーボタンを選択し、StartServerでサーバ起動&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;from openai import OpenAI

client = OpenAI(base_url=&quot;http://127.0.0.1:1337/v1&quot;, api_key=&quot;dummy&quot;)

completion = client.chat.completions.create(
  # model=&quot;Fugaku-LLM-13B-instruct-Q4_0.gguf&quot;,
  # model=&quot;meta-llama/Llama-3.2-1B&quot;,
  model=&quot;llama3.2:1b&quot;,
  messages=[
    {&quot;role&quot;: &quot;system&quot;, 
     &quot;content&quot;: &quot;あなたは親切なアシスタントです。&quot;},
    {&quot;role&quot;: &quot;user&quot;, 
     &quot;content&quot;: &quot;プログラミング言語を二つに分類すると、何と何になりますか？&quot;}
  ])

print(completion.choices[0].message.content)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;tempelatureの値を0に設定すると毎回ほぼ同じ解答になる
&lt;ul&gt;
&lt;li&gt;ばらつきを示す&lt;/li&gt;
&lt;li&gt;&lt;code&gt;0.7&lt;/code&gt;がばらんすの取れた値とされている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;from openai import OpenAI

client = OpenAI(base_url=&quot;http://127.0.0.1:1337/v1&quot;, api_key=&quot;dummy&quot;)

completion = client.chat.completions.create(
  temperature=0,
  # model=&quot;Fugaku-LLM-13B-instruct-Q4_0.gguf&quot;,
  # model=&quot;meta-llama/Llama-3.2-1B&quot;,
  model=&quot;llama3.2:1b&quot;,
  messages=[
    {&quot;role&quot;: &quot;system&quot;, 
     &quot;content&quot;: &quot;あなたは親切なアシスタントです。&quot;},
    {&quot;role&quot;: &quot;user&quot;, 
     &quot;content&quot;: &quot;プログラミング言語を二つに分類すると、何と何になりますか？&quot;}
  ])

print(completion.choices[0].message.content)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;別PCからアクセス可能にするために、Server起動時に&lt;code&gt;127.0.0.1&lt;/code&gt;のループバックアドレスではなく、&lt;code&gt;0.0.0.0&lt;/code&gt;を指定する&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Pythonダウンロードと設定&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;brew install python@3
python3 -m venv ~/mypy
source ~/mypy/bin/activate
pip3 install openai
deactivate
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;2.5 チャットAIのWebサイトを構築&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;PythonのOSSWebUIライブラリの「Chainlit」を使ってWebサイト構築&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vscodeをインストール&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pip install chainlit&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;以下実行&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;from openai import AsyncOpenAI
import chainlit as cl

client = AsyncOpenAI(base_url=&quot;http://127.0.0.1:1337/v1&quot;, api_key=&quot;dummy&quot;)

@cl.on_message
async def on_message(input):
  completion = await client.chat.completions.create(
    # model=&quot;Fugaku-LLM-13B-instruct-Q4_0.gguf&quot;,
    model=&quot;llama3.2:1b&quot;,
    messages=[
      {&quot;role&quot;: &quot;system&quot;, 
       &quot;content&quot;: &quot;あなたは親切なアシスタントです。&quot;},
      {&quot;role&quot;: &quot;user&quot;, 
       &quot;content&quot;: input.content}])

  await cl.Message(content=completion.choices[0].message.content).send()


&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;返答が少しずつ表示されるように改修&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;from openai import AsyncOpenAI
import chainlit as cl

client = AsyncOpenAI(base_url=&quot;http://127.0.0.1:1337/v1&quot;, api_key=&quot;dummy&quot;)

@cl.on_chat_start   # チャット開始時に実行される関数
def start_chat():
  # ユーザーセッションの変数&quot;history&quot;を設定する
  cl.user_session.set(&quot;history&quot;,
    [{&quot;role&quot;: &quot;system&quot;,   # &quot;history&quot;の初期値
      &quot;content&quot;: &quot;あなたは親切なアシスタントです。&quot;}])

@cl.on_message   # ユーザーが質問文を送信したときに実行される関数
async def main(input):   # ユーザーの質問文は引数inputに格納される
  message = cl.Message(content=&quot;&quot;)   # メッセージを作成
  await message.send()               # メッセージを送信
  
  # ユーザーセッションの変数&quot;history&quot;を取得
  history = cl.user_session.get(&quot;history&quot;)
  # &quot;history&quot;にユーザーの質問文を追加
  history.append({&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: input.content})

  # LLMに変数&quot;history&quot;の内容を送る
  stream = await client.chat.completions.create(
    # model=&quot;Fugaku-LLM-13B-instruct-Q4_0.gguf&quot;,
    model=&quot;llama3.2:1b&quot;,
    messages=history, 
    stream=True)   # ストリーミングをオンにする

  # LLMの返答を1トークンずつ表示
  async for part in stream:
    token = part.choices[0].delta.content
    if token != &quot;&quot;:
      await message.stream_token(token)

  # &quot;history&quot;にLLMの返答を追加
  history.append({&quot;role&quot;: &quot;assistant&quot;, &quot;content&quot;: message.content})
  await message.update()


&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;休題&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;ローカルLMMを手軽に試すには？
&lt;ul&gt;
&lt;li&gt;ローカルLMMのスマホアプリ
&lt;ul&gt;
&lt;li&gt;例
&lt;ul&gt;
&lt;li&gt;PocketPal&lt;/li&gt;
&lt;li&gt;PricateLLM&lt;/li&gt;
&lt;li&gt;LLM Farm&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;第3章　ローカルLLMを活用できる　コマンドラインツール「Ollama」&lt;/h3&gt;
&lt;p&gt;ローカルLLMを動かすのに、コマンドラインを利用するソフトウエアとして「Ollama」を紹介します。基本的な使い方だけでなく、「LLMサーバー」として使う方法と、Pythonのプログラムに組み込んで使う方法も簡単に紹介しています。&lt;/p&gt;
&lt;h4&gt;3.1 Ollamaの概要&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;OllamaはJanと同じく、LLMプラットフォームで、ローカル環境でLLMを実行するためのOSSの１つ
&lt;ul&gt;
&lt;li&gt;データが外部に送信されない&lt;/li&gt;
&lt;li&gt;オフラインでも実行可能&lt;/li&gt;
&lt;li&gt;大規模言語モデルの推論を高速に実行するためのOSSライブラリである「llama.cpp」を実行基盤としている&lt;/li&gt;
&lt;li&gt;そのため、llama.cppで実行できる、「GGUF」形式のファイルをサポートしている
&lt;ul&gt;
&lt;li&gt;「.safetensors」や「.pth」などのモデルファイル形式には対応していない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3.2 Ollamaのインストール&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Windowsの場合&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://ollama.com/download&quot;&gt;https://ollama.com/download&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;こちらからインストール&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Macの場合&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;homebrewでインストール可能&lt;/li&gt;
&lt;li&gt;&lt;code&gt;brew install --cask ollama&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;以下のコマンドを追加実行すると最新化できる
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;brew upgrade --cask ollama&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pkill ollama&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;open -a Ollama&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ollama --version&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3.3 Ollamaの使い方&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ollama pull&lt;/code&gt;コマンドでモデル（LLMファイル）をダウンロードできる
&lt;ul&gt;
&lt;li&gt;ダウンロード済みのモデルをアップデートするときにも使う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ollama run&lt;/code&gt;コマンドを実行することで動作させる&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# モデル名を指定してダウンロード
ollama pull llama3.2
# ダウンロード済みのモデル自一項
ollama run llama2.3
# 正常に実行完了すると &amp;gt;&amp;gt;&amp;gt; で入力受付になるので対話形式で動かしてみる
# 対話形式で実行中に /? でヘルプ表示をすることも可能
# /bye で実行中のollama runコマンドを終了できる
# /load &amp;lt;model&amp;gt; でモデルを切り替えることができる

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;量子化でサイズを小さくしているモデルについての説明&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3.4 Ollamaを深く知ろう&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;発展的な使い方&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ollamaのローカルサーバーにリクエストを送信する&lt;/li&gt;
&lt;li&gt;PythonのプログラムからOllamaを実行する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;１）Ollaamaのローカルサーバーにリクエスト送信&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ollamaを起動している間はローカルサーバー（JanのLLMサーバと同じ）が立ち上がっている&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ollama serve&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;すでに立ち上がっていたらエラーが返る
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Error: listen tcp 127.0.0.1:11434: bind: address already in use&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# HTTP送信
curl http://localhost:11434/api/generate -d &apos;{&quot;model&quot;: &quot;llama3.2&quot;, &quot;prompt&quot;: &quot;こんにちは&quot;}&apos;
# デフォルトだとStream形式で表示される

# Streamオフ
curl http://localhost:11434/api/generate -d &apos;{&quot;model&quot;: &quot;llama3.2&quot;, &quot;prompt&quot;: &quot;こんにちは&quot;,&quot;stream&quot;: false}&apos;

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;PythonのプログラムからOllamaを実行する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ollamaインストール&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;pip install ollama&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;from ollama import Client
import json

client = Client()
response = client.chat(
    model=&quot;llama3.2&quot;, messages=[{&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;こんにちは&quot;}]
)

response = response.model_dump()
print(json.dumps(response, indent=2, ensure_ascii=False))

&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;休題：　Llamaのポート番号について&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;11434 は、LlamaのLeetであると言われている&lt;/li&gt;
&lt;li&gt;Leetとは：類似の文字や読みの同じ文字を別の文字に置き換えて表現すること
&lt;ul&gt;
&lt;li&gt;有名なところだと toやforを、2や4に置き換えて表現するもの&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;第4章　ローカルLLMを活用（その1）　画像の内容を説明&lt;/h3&gt;
&lt;p&gt;第4章から第6章は、主にローカルLLMをPythonのプログラムに組み込んで活用する方法を紹介します。第4章では、画像を読み込んで説明文を生成できる「マルチモーダル対応のLLM」を使う方法を紹介します。&lt;/p&gt;
&lt;h4&gt;4.1 画像を読み込んで説明する&lt;/h4&gt;
&lt;p&gt;LLMの中には文章だけではなく、画像も解釈できるものがある
いわゆる「マルチモーダル」に対応するLLM&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;例えば）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;llava-llama-3-8b-v1_1-ggufがそれに当たる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;画像読み込んで処理させる説明は省略&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;第5章　ローカルLLMを活用（その2）　コードの作成を支援&lt;/h3&gt;
&lt;p&gt;米Microsoftの「Visual Studio Code」などのテキストエディタにローカルLLMを組み込み、コードの作成を支援してもらう方法を解説します。実際に解説とおりに試すと、生成したコードを修正しなくても正常に動作することがわかります。&lt;/p&gt;
&lt;h4&gt;5.1 VSCodeの拡張機能「Continue」&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ContinueはVSCodeにAI支援を追加する拡張機能&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;流れ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VS Codeインストール：割愛&lt;/li&gt;
&lt;li&gt;OllamaとGemma2 2Bを導入
&lt;ul&gt;
&lt;li&gt;Googleが公開している「Gemma 2 2B」とGemma 2 2Bにコード生成させるためのソフトウェアである「Ollama」を導入&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ollama pull gemma2:2b&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ollama run gemma2:2b&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Python導入：割愛&lt;/li&gt;
&lt;li&gt;Continueを導入
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://localhost:11434/&quot;&gt;http://localhost:11434/&lt;/a&gt;にアクセスしてOllama is running と表示されるかどうかを確認&lt;/li&gt;
&lt;li&gt;VSCodeのプラグイン検索：Continue&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.2 MacOSとLinuxで使えるZedエディタ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Zed: AI支援機能付きのエディタ&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.3 コマンドプロンプトで使える「Aider」&lt;/h4&gt;
&lt;p&gt;コマンドプロンプトで対話しながら、LLMにプログラムの作成を依頼できるPythonで作られたツール&lt;/p&gt;
&lt;h3&gt;第6章　ローカルLLMを活用（その3）　LLM の回答を読み上げる&lt;/h3&gt;
&lt;p&gt;ローカルLLMと音声読み上げライブラリ「「VOICEVOX CORE」を組み合わせ、ローカルLLMが生成した文章を、人気の読み上げキャラクターである「ずんだもん」の声で読み上げる方法を解説します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;略&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;第7章　ローカルLLMが快適に使える　最適なパソコンを自作しよう&lt;/h3&gt;
&lt;p&gt;ローカルLLMが快適に動かせるパソコンのスペックと、お勧めのPCパーツを紹介します。パソコンの自作がはじめてでも、PCパーツの選び方や購入先などがわかります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;LLM動作環境の自作PC構成例について&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>2026-04_認証と認可 Keycloak入門 第2版</title><link>https://tutttuwi.github.io/posts/2026-04_%E8%AA%8D%E8%A8%BC%E3%81%A8%E8%AA%8D%E5%8F%AF-keycloak%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2026-04_%E8%AA%8D%E8%A8%BC%E3%81%A8%E8%AA%8D%E5%8F%AF-keycloak%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88/</guid><pubDate>Thu, 17 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;基本情報&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;Keycloak（キークローク）は、Webベースのシステムに認証と認可の機能を組み込むOSS（オープンソースソフトウェア）です。セキュリティ事件が相次ぐ今、認証・認可は必須技術です。「第２版」は、WildFlyからQuarkusへ刷新されたオープンソースのセキュリティの仕組み「Keycloak（キークローク）」の新アーキテクチャを詳解する日本初の書籍です。 本書では、豊富な機能を備えるKeycloakについて、前提となる認証と認可の仕組みを基礎から解説し、典型的なユースケースの実現方法や本番システムへの実装方法まで詳しく解説しました。前提知識の部分も説明が少なかったログアウト等も補足しました。 最新技術に対応した実践的な内容で、ソフトウェア技術者必読の一冊です！
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;目次&lt;/h2&gt;
&lt;h3&gt;入門編&lt;/h3&gt;
&lt;p&gt;基礎知識を習得しよう&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第1章 Keycloakを理解するための第一歩
&lt;ul&gt;
&lt;li&gt;1.1 認証と認可およびKeycloakの概要&lt;/li&gt;
&lt;li&gt;1.2 Keycloakの動作要件とディレクトリー構成&lt;/li&gt;
&lt;li&gt;1.3 Keycloakのセットアップと動作確認&lt;/li&gt;
&lt;li&gt;1.4 本章のまとめ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;第2章 OAuthとOIDCの基礎知識
&lt;ul&gt;
&lt;li&gt;2.1 OAuthのフロー&lt;/li&gt;
&lt;li&gt;2.2 アクセストークンとリフレッシュトークン&lt;/li&gt;
&lt;li&gt;2.3 トークンの無効化と認可判断&lt;/li&gt;
&lt;li&gt;2.4 OIDCのフロー&lt;/li&gt;
&lt;li&gt;2.5 本章のまとめ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;第3章 SSOの基礎知識
&lt;ul&gt;
&lt;li&gt;3.1 SSOを理解する&lt;/li&gt;
&lt;li&gt;3.2 標準プロトコルによるSSO&lt;/li&gt;
&lt;li&gt;3.3 本章のまとめ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;第4章 Keycloakの基礎を理解する
&lt;ul&gt;
&lt;li&gt;4.1 Keycloakの用語解説&lt;/li&gt;
&lt;li&gt;4.2 セッションとトークンの設定&lt;/li&gt;
&lt;li&gt;4.3 Keycloakの情報源&lt;/li&gt;
&lt;li&gt;4.4 本章のまとめ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;認証認可について&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Authenticationを略して、AuthN&lt;/li&gt;
&lt;li&gt;Authorizationを略して、AuthZ&lt;/li&gt;
&lt;li&gt;と呼ばれることがあるらしい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;KeyCloakは IAM(Identity and Access Management) のソフトウェア&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IAM: 適切な人やマシンが適切なリソースに適切な理由のため適切なタイミングでアクセスできるようにするもの
&lt;ul&gt;
&lt;li&gt;*ガートナー社定義&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;IAMの中でも、「認証と認可」を担っている&lt;/li&gt;
&lt;li&gt;IAMで認証・認可以外に重要な機能
&lt;ul&gt;
&lt;li&gt;IDライフサイクル管理: 入社/異動/退職に合わせてアカウントと権限を自動で付与・変更・剥奪する（JML: Joiner/Mover/Leaver）&lt;/li&gt;
&lt;li&gt;ユーザー/組織情報の統合: 人事DBやディレクトリ（LDAP/AD）と連携し、ID情報を一元管理する&lt;/li&gt;
&lt;li&gt;特権アクセス管理（PAM）: 管理者アカウントの利用を最小化し、払い出し・記録・承認を厳格化する&lt;/li&gt;
&lt;li&gt;監査ログと追跡性: 「誰が・いつ・どの権限で・何をしたか」を証跡として残し、監査に対応する&lt;/li&gt;
&lt;li&gt;セルフサービスと運用効率化: パスワードリセット、アクセス申請、承認フローをユーザー主導で回せるようにする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;IAMで押さえるべき実務ポイント
&lt;ul&gt;
&lt;li&gt;最小権限の原則: 初期権限は必要最小限にし、ロール設計は職務ベース（RBAC）を基本にする&lt;/li&gt;
&lt;li&gt;権限の定期レビュー: 付与しっぱなしを防ぐため、棚卸し（アクセスレビュー）を定期実施する&lt;/li&gt;
&lt;li&gt;職務分掌（SoD）違反の防止: 申請と承認を同一人物に集中させないなど、統制ルールを設ける&lt;/li&gt;
&lt;li&gt;可用性と災害対策: IAM停止が業務停止に直結するため、冗長化・バックアップ・復旧手順を準備する&lt;/li&gt;
&lt;li&gt;法令/規制対応: 個人情報保護や各種ガイドラインに合わせ、保持期間やマスキング方針を明確化する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;KeyCloakの中のIAM機能&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;区分&lt;/th&gt;
&lt;th&gt;KeyCloakでできること&lt;/th&gt;
&lt;th&gt;代表的な機能例&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ID管理（Identity Management）&lt;/td&gt;
&lt;td&gt;ユーザー、グループ、ロール、属性の管理。LDAP/Active Directory連携。&lt;/td&gt;
&lt;td&gt;ユーザー属性管理、グループベース割当、LDAP Federation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;認証（Authentication）&lt;/td&gt;
&lt;td&gt;ログイン/ログアウト、セッション管理、MFA、パスワードポリシー、認証フローのカスタマイズ。&lt;/td&gt;
&lt;td&gt;Browser Flow、OTP、条件付き認証&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;認可（Authorization）&lt;/td&gt;
&lt;td&gt;RBAC、クライアントスコープ、ポリシーベース認可。&lt;/td&gt;
&lt;td&gt;Authorization Services（Resource/Scope/Policy）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;フェデレーションとSSO&lt;/td&gt;
&lt;td&gt;OIDC/SAMLによるSSO、外部IdP連携、SLO。&lt;/td&gt;
&lt;td&gt;Identity Brokering、Google/Azure AD連携&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;トークンとセッション制御&lt;/td&gt;
&lt;td&gt;Access/Refresh/IDトークンの発行・更新・失効、有効期限設定。&lt;/td&gt;
&lt;td&gt;Token Lifespan設定、Revocation、Offline Session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;監査・運用管理&lt;/td&gt;
&lt;td&gt;認証イベント/管理イベントログ、管理コンソール、Admin API、Realm分離。&lt;/td&gt;
&lt;td&gt;Event Logs、Admin REST API、マルチRealm運用&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;KeyCloakの守備範囲外（または単体では不足しやすい）IAM機能&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;機能領域&lt;/th&gt;
&lt;th&gt;概要&lt;/th&gt;
&lt;th&gt;KeyCloak単体での扱い&lt;/th&gt;
&lt;th&gt;代表的な製品/サービス例&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;特権アクセス管理（PAM）&lt;/td&gt;
&lt;td&gt;管理者IDの貸与、記録、セッション統制、緊急アクセス管理。&lt;/td&gt;
&lt;td&gt;直接の中核機能は弱い。外部PAM連携が一般的。&lt;/td&gt;
&lt;td&gt;CyberArk、BeyondTrust、Delinea、HashiCorp Boundary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IGA（IDガバナンス/ライフサイクル）&lt;/td&gt;
&lt;td&gt;入社/異動/退職（JML）、申請承認、アクセスレビュー、SoD統制。&lt;/td&gt;
&lt;td&gt;ワークフロー/統制機能は限定的。外部IGAが必要になりやすい。&lt;/td&gt;
&lt;td&gt;SailPoint、Saviynt、Omada、Microsoft Entra ID Governance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;権限申請・承認ワークフロー&lt;/td&gt;
&lt;td&gt;業務ロール申請、上長承認、期限付き付与、自動剥奪。&lt;/td&gt;
&lt;td&gt;標準で本格的な承認ワークフローは薄い。&lt;/td&gt;
&lt;td&gt;ServiceNow、SailPoint、Saviynt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SIEM/SOC連携による高度監視&lt;/td&gt;
&lt;td&gt;横断ログ分析、相関検知、脅威ハンティング、インシデント対応。&lt;/td&gt;
&lt;td&gt;イベント出力は可能だが、分析基盤は別途必要。&lt;/td&gt;
&lt;td&gt;Splunk、Microsoft Sentinel、Elastic Security、IBM QRadar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;非人間ID（Workload/Secrets）管理&lt;/td&gt;
&lt;td&gt;サービスアカウント、マシンID、秘密情報ローテーション。&lt;/td&gt;
&lt;td&gt;一部対応は可能だが、Secrets管理は専用製品が適する。&lt;/td&gt;
&lt;td&gt;HashiCorp Vault、AWS Secrets Manager、Azure Key Vault&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ゼロトラスト文脈制御（ZTNA）&lt;/td&gt;
&lt;td&gt;端末状態・ネットワーク文脈を加味したアクセス制御。&lt;/td&gt;
&lt;td&gt;認証基盤としては連携可能だが、ZTNA自体は範囲外。&lt;/td&gt;
&lt;td&gt;Zscaler、Cloudflare Zero Trust、Netskope&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;KeyCloakアーキテクチャの変換点&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;timeline
    title Keycloakの歴史（主要マイルストーン）
    2013-07 : GitHubで初公開
            : Red Hat/JBossコミュニティ主導で開発が進展
    2022 : Keycloak 17.0.0
         : WildFlyベースからQuarkusベースへ大規模刷新
         : クラウドネイティブ対応を強化
    2023-04 : CNCF Incubatingプロジェクトとして承認
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Web情報ベースで追加で押さえるポイント&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;観点&lt;/th&gt;
&lt;th&gt;押さえるポイント&lt;/th&gt;
&lt;th&gt;実務でのアクション&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;最新リリース追従&lt;/td&gt;
&lt;td&gt;Keycloakは継続的にリリースされ、セキュリティ修正（CVE対応）が頻繁に入る。&lt;/td&gt;
&lt;td&gt;四半期ごとにリリースノートを確認し、計画的にアップデートする。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quarkus前提の運用&lt;/td&gt;
&lt;td&gt;Keycloak 17以降はQuarkusディストリビューションが前提。WildFly時代と設定/運用手順が異なる。&lt;/td&gt;
&lt;td&gt;新規構築はQuarkus前提で設計し、移行時は公式Migrationガイドを必ず確認する。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kubernetes運用&lt;/td&gt;
&lt;td&gt;Keycloak OperatorでKubernetes/OpenShift運用が可能。&lt;/td&gt;
&lt;td&gt;Operator導入時はCRDベース運用を採用し、設定は宣言的に管理する。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;アップグレード統制&lt;/td&gt;
&lt;td&gt;Operatorの自動更新は意図しないバージョン更新やDBマイグレーションを招く可能性がある。&lt;/td&gt;
&lt;td&gt;本番は手動承認で更新し、事前にステージングでマイグレーション検証を行う。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CNCFエコシステム連携&lt;/td&gt;
&lt;td&gt;CNCF Incubatingとして、クラウドネイティブ運用との親和性が高い。&lt;/td&gt;
&lt;td&gt;監視（Prometheus）、トレース、GitOpsなど周辺基盤との統合を前提に構成する。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Quarkusについて&lt;/h3&gt;
&lt;p&gt;Quarkusは、コンテナー/Kubernetes環境を前提に最適化されたJavaフレームワーク。
特に「起動の速さ」「省メモリ」「運用しやすさ」を重視しており、クラウドネイティブなJava実行基盤として採用が進んでいる。
Keycloakもバージョン17以降でQuarkusベースに移行し、従来のWildFlyベースより軽量で予測可能な運用がしやすくなった。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Quarkusの主な特徴
&lt;ul&gt;
&lt;li&gt;高速起動: 開発時のホットリロードと本番時の短時間起動&lt;/li&gt;
&lt;li&gt;省メモリ: コンテナー密度を上げやすい&lt;/li&gt;
&lt;li&gt;Kubernetes親和性: 設定・ヘルスチェック・メトリクス連携がしやすい&lt;/li&gt;
&lt;li&gt;JVMモード/Native Imageモード: 要件に応じて実行形態を選択可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Javaフレームワーク比較（歴代含む）&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;フレームワーク/世代&lt;/th&gt;
&lt;th&gt;主な時代感&lt;/th&gt;
&lt;th&gt;強み&lt;/th&gt;
&lt;th&gt;注意点・向いている用途&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Java EE / Jakarta EE（仕様）&lt;/td&gt;
&lt;td&gt;2000年代〜現在&lt;/td&gt;
&lt;td&gt;エンタープライズ標準、仕様ベースで移植性が高い&lt;/td&gt;
&lt;td&gt;実装製品への理解が必要。大規模業務システム向け&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WildFly&lt;/td&gt;
&lt;td&gt;2013年〜現在&lt;/td&gt;
&lt;td&gt;Java EE/Jakarta EE準拠の実装。高い拡張性と豊富な運用機能&lt;/td&gt;
&lt;td&gt;設定や運用が複雑になりやすい。従来型/大規模システム向き。最新のクラウドネイティブ用途はQuarkus推奨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Struts（1/2）&lt;/td&gt;
&lt;td&gt;2000年代前半〜中盤&lt;/td&gt;
&lt;td&gt;当時のMVC Web開発を普及&lt;/td&gt;
&lt;td&gt;現代的な開発体験や保守性で不利。新規採用は限定的&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spring Framework（MVC中心）&lt;/td&gt;
&lt;td&gt;2000年代中盤〜&lt;/td&gt;
&lt;td&gt;DI/AOPで柔軟、エコシステムが巨大&lt;/td&gt;
&lt;td&gt;設定自由度が高く設計ルールがないと複雑化しやすい&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Play Framework&lt;/td&gt;
&lt;td&gt;2010年代〜&lt;/td&gt;
&lt;td&gt;非同期I/O、軽快なWeb開発体験&lt;/td&gt;
&lt;td&gt;採用母数はSpring系より小さい&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dropwizard&lt;/td&gt;
&lt;td&gt;2010年代〜&lt;/td&gt;
&lt;td&gt;シンプルなREST API構築、運用部品がまとまっている&lt;/td&gt;
&lt;td&gt;機能拡張の幅はSpring Bootより狭め&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Micronaut&lt;/td&gt;
&lt;td&gt;2018年〜&lt;/td&gt;
&lt;td&gt;低メモリ・高速起動、DIをコンパイル時に解決&lt;/td&gt;
&lt;td&gt;周辺エコシステムはSpringより小さめ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Helidon（SE/MP）&lt;/td&gt;
&lt;td&gt;2018年〜&lt;/td&gt;
&lt;td&gt;MicroProfile対応、軽量マイクロサービス向け&lt;/td&gt;
&lt;td&gt;採用事例は限定的で情報量が少なめ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spring Boot&lt;/td&gt;
&lt;td&gt;2014年〜現在&lt;/td&gt;
&lt;td&gt;実績・情報量・ライブラリ連携が非常に豊富&lt;/td&gt;
&lt;td&gt;デフォルト運用でメモリ消費が大きくなりやすい&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quarkus&lt;/td&gt;
&lt;td&gt;2019年〜現在&lt;/td&gt;
&lt;td&gt;起動速度・省メモリ・Kubernetes親和性、Native Image対応&lt;/td&gt;
&lt;td&gt;Native化時は制約確認が必要。クラウドネイティブ用途に強い&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;補足: 実務では「既存資産の多さならSpring Boot」「軽量・高速起動重視ならQuarkus/Micronaut」を軸に比較するケースが多い。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;トークン検証について&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;以下の２通りがある
&lt;ul&gt;
&lt;li&gt;ローカルでのトークン検証
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;https://www.jwt.io/ja/libraries&lt;/code&gt;に対応する言語とのライブラリーが紹介されている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;トークンイントロスペクション&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;admin-cli&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;各Realmには &lt;code&gt;admin-cli&lt;/code&gt;クライアントが作成される
&lt;ul&gt;
&lt;li&gt;このクライアントを使ってKeyCloakのAdminRESTAPIを呼び出せる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;KeyCloakコミュニティー&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;公式な最新情報&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;KeyCloak公式Webサイトのブログ
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://keycloak.org/blog&quot;&gt;https://keycloak.org/blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;KeyCloakのXアカウント
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://x.com/keycloak&quot;&gt;https://x.com/keycloak&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;質問をしたい&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Slack
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://slack.cncf.io/&quot;&gt;https://slack.cncf.io/&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;keycloak&lt;/code&gt;,&lt;code&gt;#keycloak-dev&lt;/code&gt;チャネル&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Discourse
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://keycloak.discourse.group/&quot;&gt;https://keycloak.discourse.group/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;GitHub Disscussions
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/keycloak/keycloak/discussions&quot;&gt;https://github.com/keycloak/keycloak/discussions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;メーリングリスト
&lt;ul&gt;
&lt;li&gt;ユーザー向け；&lt;a href=&quot;https://groups.google.com/g/keycloak.user/&quot;&gt;https://groups.google.com/g/keycloak.user/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;開発者向け：&lt;a href=&quot;https://groups.google.com/g/keycloak.dev/&quot;&gt;https://groups.google.com/g/keycloak.dev/&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Slackなどが出てきてあまり活発でなくなった&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;これらについては公式ページにも案内あり、その時の最新は公式から取得する必要あり&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Questions and help: &lt;a href=&quot;https://www.keycloak.org/community&quot;&gt;https://www.keycloak.org/community&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;バグ報告や機能追加リクエストをしたい&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Issueを作成する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コードやドキュメントの開発に貢献したい&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Contributionガイドを確認しPullRequestを提出&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;最新の標準仕様の開発に携わりたい&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/keycloak/keycloak-oauth-sig/tree/main&quot;&gt;https://github.com/keycloak/keycloak-oauth-sig/tree/main&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ユーザーや開発者と交流したい&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://community.cncf.io/cloud-native-security-japan/&quot;&gt;https://community.cncf.io/cloud-native-security-japan/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.keycloak.org/community&quot;&gt;https://www.keycloak.org/community&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;実践編&lt;/h3&gt;
&lt;p&gt;実際の3つのユースケースを題材に基本的な使い方と設定方法をマスターしよう&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第5章 OAuthに従ったAPI認可の実現
&lt;ul&gt;
&lt;li&gt;5.1 API認可を実現する環境の構築&lt;/li&gt;
&lt;li&gt;5.2 認可コードフローによるアクセストークン取得&lt;/li&gt;
&lt;li&gt;5.3 API呼び出し時の認可判断とスコープの設定&lt;/li&gt;
&lt;li&gt;5.4 トークンのリフレッシュと無効化&lt;/li&gt;
&lt;li&gt;5.5 OAuth/OIDCのセキュリティー確保&lt;/li&gt;
&lt;li&gt;5.6 API認可で重要なKeycloakの利用方法&lt;/li&gt;
&lt;li&gt;5.7 本章のまとめ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;第6章 SSOを実現する
&lt;ul&gt;
&lt;li&gt;6.1 本章で取り扱うユースケース&lt;/li&gt;
&lt;li&gt;6.2 Spring Securityを用いた認証連携&lt;/li&gt;
&lt;li&gt;6.3 リバースプロキシーを用いた認証連携&lt;/li&gt;
&lt;li&gt;6.4 JavaScriptアダプターを用いた認証連携&lt;/li&gt;
&lt;li&gt;6.5 SSOとSLOの動作確認&lt;/li&gt;
&lt;li&gt;6.6 その他のSSOの動向と概略&lt;/li&gt;
&lt;li&gt;6.7 本章のまとめ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;第7章 さまざまな認証方式を用いる
&lt;ul&gt;
&lt;li&gt;7.1 認証の強化&lt;/li&gt;
&lt;li&gt;7.2 外部ユーザーストレージによる認証&lt;/li&gt;
&lt;li&gt;7.3 外部アイデンティティープロバイダーによる認証&lt;/li&gt;
&lt;li&gt;7.4 本章のまとめ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;認証方式についての情報&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;この部分についての公式ページ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.keycloak.org/docs/latest/server_admin/index.html&quot;&gt;https://www.keycloak.org/docs/latest/server_admin/index.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;KeyCloakではOTPやパスキー認証が可能&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;認証フローの概要&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Executionと呼ばれる個々の認証処理を組み合わせて構成&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;認証フロートその構成の考え方&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;認証フロー要件（Requirement）の種類
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Required（必須）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;フロー内の &lt;code&gt;Required&lt;/code&gt; 要素は、順番にすべて成功する必要がある&lt;/li&gt;
&lt;li&gt;必須要素のいずれかが失敗した時点で、そのフローは終了する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Alternative（代替）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;フローが成功と判定されるには、&lt;code&gt;Alternative&lt;/code&gt; 要素のうち1つが成功すればよい&lt;/li&gt;
&lt;li&gt;ただし同じフロー内に &lt;code&gt;Required&lt;/code&gt; 要素がある場合、&lt;code&gt;Required&lt;/code&gt; だけで成功条件を満たすため、&lt;code&gt;Alternative&lt;/code&gt; は実行されない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disabled（無効）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;その要素は、フロー成功判定の対象にならない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Conditional（条件付き）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;この要件タイプはサブフローにのみ設定できる&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Conditional&lt;/code&gt; サブフローには Execution を含めることができ、Execution は論理式として評価される&lt;/li&gt;
&lt;li&gt;すべての Execution が &lt;code&gt;true&lt;/code&gt; の場合、&lt;code&gt;Conditional&lt;/code&gt; サブフローは &lt;code&gt;Required&lt;/code&gt; として動作する&lt;/li&gt;
&lt;li&gt;いずれかの Execution が &lt;code&gt;false&lt;/code&gt; の場合、&lt;code&gt;Conditional&lt;/code&gt; サブフローは &lt;code&gt;Disabled&lt;/code&gt; として動作する&lt;/li&gt;
&lt;li&gt;Execution を設定しない場合、&lt;code&gt;Conditional&lt;/code&gt; サブフローは &lt;code&gt;Disabled&lt;/code&gt; として扱われる&lt;/li&gt;
&lt;li&gt;フローに Execution が含まれていても、フロー自体が &lt;code&gt;Conditional&lt;/code&gt; に設定されていない場合、Keycloak は Execution を評価せず、機能的には &lt;code&gt;Disabled&lt;/code&gt; と同様に扱う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;acr（認証コンテキストクラスリファレンス）クレームを用いたステップアップ認証&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;概要&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;acr&lt;/code&gt; は「どの強度で認証したか」を示すクレーム&lt;/li&gt;
&lt;li&gt;ステップアップ認証は、通常操作では低い認証強度、重要操作では高い認証強度を要求する考え方&lt;/li&gt;
&lt;li&gt;これにより、UXを保ちながら高リスク操作だけを強固に守れる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;よくある利用シーン&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;閲覧系画面: パスワードログインのみで許可&lt;/li&gt;
&lt;li&gt;振込・個人情報変更・管理者操作: OTPやパスキーの追加認証を要求&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;具体例（ECサイトの支払い情報変更）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;ユーザーが通常ログイン（例: &lt;code&gt;acr=low&lt;/code&gt;）&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;商品閲覧やカート操作はそのまま許可&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;「クレジットカード変更」画面に遷移したとき、アプリ側で高い &lt;code&gt;acr&lt;/code&gt;（例: &lt;code&gt;acr=high&lt;/code&gt;）を要求&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;Keycloak がOTP入力を要求し、成功後に &lt;code&gt;acr=high&lt;/code&gt; のトークンを再発行&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;アプリは &lt;code&gt;acr=high&lt;/code&gt; を確認して、支払い情報変更を許可&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;実装時のポイント&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;アプリ側で「どの操作にどの &lt;code&gt;acr&lt;/code&gt; が必要か」を明確に定義する&lt;/li&gt;
&lt;li&gt;API側でも &lt;code&gt;acr&lt;/code&gt; を検証し、フロントだけに依存しない&lt;/li&gt;
&lt;li&gt;&lt;code&gt;acr&lt;/code&gt; の値設計（&lt;code&gt;low&lt;/code&gt; / &lt;code&gt;medium&lt;/code&gt; / &lt;code&gt;high&lt;/code&gt; など）は運用ルールと合わせて統一する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.keycloak.org/docs/latest/server_admin/index.html#_step-up-flow&quot;&gt;https://www.keycloak.org/docs/latest/server_admin/index.html#_step-up-flow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;応用編&lt;/h3&gt;
&lt;p&gt;実システム利用を見据えた使い方を知ろう&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第8章 Keycloakのカスタマイズ
&lt;ul&gt;
&lt;li&gt;8.1 カスタマイズの可能な箇所と仕組み&lt;/li&gt;
&lt;li&gt;8.2 画面のカスタマイズ&lt;/li&gt;
&lt;li&gt;8.3 SPIの新規プロバイダーの開発&lt;/li&gt;
&lt;li&gt;8.4 Keycloakのビルド&lt;/li&gt;
&lt;li&gt;8.5 カスタムコンテナーイメージの作成&lt;/li&gt;
&lt;li&gt;8.6 本章のまとめ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;第9章 Keycloakの非機能面の考慮ポイント
&lt;ul&gt;
&lt;li&gt;9.1 HA構成&lt;/li&gt;
&lt;li&gt;9.2 HTTPSの設定&lt;/li&gt;
&lt;li&gt;9.3 エンドポイントの設定&lt;/li&gt;
&lt;li&gt;9.4 可観測性（Observability）&lt;/li&gt;
&lt;li&gt;9.5 アップグレード&lt;/li&gt;
&lt;li&gt;9.6 本章のまとめ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>独習PHP 第4版</title><link>https://tutttuwi.github.io/posts/2023-10_%E7%8B%AC%E7%BF%92php%E7%AC%AC4%E7%89%88/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2023-10_%E7%8B%AC%E7%BF%92php%E7%AC%AC4%E7%89%88/</guid><pubDate>Fri, 13 Oct 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;独習PHP 第4版&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;PHPについて&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://atmarkit.itmedia.co.jp/aig/07wcr/php.html#:~:text=%E3%83%94%E3%83%BC%E3%83%BB%E3%82%A8%E3%82%A4%E3%83%81%E3%83%BB%E3%83%94%E3%83%BC%20%2F%20PHP,%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%82%92%E5%BF%85%E8%A6%81%E3%81%A8%E3%81%97%E3%81%AA%E3%81%84%E3%80%82&quot;&gt;https://atmarkit.itmedia.co.jp/aig/07wcr/php.html#:~:text=ピー・エイチ・ピー %2F PHP,コンパイルを必要としない。&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;当初はPHP(Personal Home Page)として公開され&lt;/li&gt;
&lt;li&gt;PHP3.0で PHP:Hypertext Preprocessorとなった&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;サンプルファイルについて&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://wings.msn.to/index.php/-/A-03/978-4-7981-6849-4/&quot;&gt;https://wings.msn.to/index.php/-/A-03/978-4-7981-6849-4/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第1章　イントロダクション&lt;/h2&gt;
&lt;h3&gt;1.1　PHPとWebアプリ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;サーバとクライアントの話&lt;/li&gt;
&lt;li&gt;サーバには色々あります&lt;/li&gt;
&lt;li&gt;静的なページを返すだけの場合もある&lt;/li&gt;
&lt;li&gt;PHPは動的なページを作成するための代表的なサーバーサイド技術！&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.2　サーバーサイド技術におけるPHPの位置付け&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;PHPの特徴
&lt;ul&gt;
&lt;li&gt;習得が容易である&lt;/li&gt;
&lt;li&gt;ドキュメントが充実している&lt;/li&gt;
&lt;li&gt;利用できる環境が豊富である&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.3　PHP環境を設定するための手順&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;XAMPP(ザンプ)のインストール
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.apachefriends.org/jp/download.html&quot;&gt;https://www.apachefriends.org/jp/download.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.4　PHPの基本構文&lt;/h3&gt;
&lt;h4&gt;1.4.2 拡張子は「.php」が基本&lt;/h4&gt;
&lt;p&gt;Apacheは拡張子が「.php」であるファイルが要求されたタイミングでPHPの実行エンジンを起動する
ファイル名に含めていいのはシングルバイト文字だけ
マルチバイト文字（日本語）などは含めることができない&lt;/p&gt;
&lt;h4&gt;1.4.3 文字コードの設定&lt;/h4&gt;
&lt;p&gt;PHPでは文字化けを防ぐため、php.iniファイルで文字コードを宣言している&lt;/p&gt;
&lt;p&gt;BOM無しのUTF-8で宣言していく&lt;/p&gt;
&lt;h4&gt;1.4.4 改行コードの設定&lt;/h4&gt;
&lt;p&gt;PHPではLFで統一すべしとしている&lt;/p&gt;
&lt;p&gt;PHP8では、JIT(Just-In-Time)機能を搭載した
JITとはソースコードを毎回翻訳するのではなく、内部的に一括翻訳する
一括翻訳されたコードはメモリ上に保存して再利用されるので、実行効率が大幅に向上する&lt;/p&gt;
&lt;h4&gt;1.4.6 PHPはHTML埋込み型言語&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;?php ?&amp;gt;&lt;/code&gt; のことをスクリプティングデリミターや、PHPタグと言う&lt;/p&gt;
&lt;p&gt;スクリプトブロックが.phpファイルの末尾で終わる場合は、その後方に改行や空白があると、これがブラウザーにも出力されてしまい、
レイアウトがずれる原因にもなるため、ファイルの末尾の「?&amp;gt;」は調略すべきというコーディング規約が一般的&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文字列を出力する省略構文&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?= &apos;こんにちは、世界！&apos; ?&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;?= &apos;こんにちは、皆さん！&apos; ?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;スクリプトの文末にセミコロンは必須！&lt;/p&gt;
&lt;p&gt;セミコロンで区切れば1行にもかけるが、あまりいい書き方ではない&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
print &apos;こんにちは、世界！&amp;lt;br /&amp;gt;&apos;; print &apos;こんにちは、皆さん！&apos;;
?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;大文字小文字を区別しないので、ごちゃまぜでかけるが、可読性が下がるので統一すべき
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;print&lt;/code&gt;でも&lt;code&gt;PriNt&lt;/code&gt;でもうまく動く&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;1.4.9 コメントは開発者のための備忘録&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;!--  --&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;//&lt;/code&gt;, &lt;code&gt;#&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;単一業コメント&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;/* */&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;複数行コメント、入れ子にできない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;この章の理解度チェック&lt;/h3&gt;
&lt;h2&gt;第2章　PHPの基本&lt;/h2&gt;
&lt;h3&gt;2.1　変数&lt;/h3&gt;
&lt;h3&gt;2.2　定数&lt;/h3&gt;
&lt;h3&gt;2.3　データ型&lt;/h3&gt;
&lt;h3&gt;2.4　配列&lt;/h3&gt;
&lt;h3&gt;2.5　型の相互変換&lt;/h3&gt;
&lt;h3&gt;この章の理解度チェック&lt;/h3&gt;
&lt;h2&gt;第3章　演算子&lt;/h2&gt;
&lt;h3&gt;3.1　代数演算子&lt;/h3&gt;
&lt;h3&gt;3.2　代入演算子&lt;/h3&gt;
&lt;h3&gt;3.3　比較演算子&lt;/h3&gt;
&lt;h3&gt;3.4　論理演算子&lt;/h3&gt;
&lt;h3&gt;3.5　ビット演算子&lt;/h3&gt;
&lt;h3&gt;3.6　その他の演算子&lt;/h3&gt;
&lt;h3&gt;3.7　演算子の優先順位と結合則&lt;/h3&gt;
&lt;h3&gt;この章の理解度チェック&lt;/h3&gt;
&lt;h2&gt;第4章　制御構文&lt;/h2&gt;
&lt;h3&gt;4.1　条件分岐&lt;/h3&gt;
&lt;h3&gt;4.2　繰り返し処理&lt;/h3&gt;
&lt;h3&gt;4.3　ループの制御&lt;/h3&gt;
&lt;h3&gt;4.4　制御命令のその他の話題&lt;/h3&gt;
&lt;h3&gt;この章の理解度チェック&lt;/h3&gt;
&lt;h2&gt;第5章　組み込み関数&lt;/h2&gt;
&lt;h3&gt;5.1　関数の基本&lt;/h3&gt;
&lt;h3&gt;5.2　文字列関数&lt;/h3&gt;
&lt;h3&gt;5.3　配列関数&lt;/h3&gt;
&lt;h3&gt;5.4　正規表現（PCRE）関数&lt;/h3&gt;
&lt;h3&gt;5.5　ファイルシステム関数&lt;/h3&gt;
&lt;h3&gt;5.6　その他の関数&lt;/h3&gt;
&lt;h3&gt;この章の理解度チェック&lt;/h3&gt;
&lt;h2&gt;第6章　ユーザー定義関数&lt;/h2&gt;
&lt;h3&gt;6.1　ユーザー定義関数とは?&lt;/h3&gt;
&lt;h3&gt;6.2　変数の有効範囲（スコープ）&lt;/h3&gt;
&lt;h3&gt;6.3　引数のさまざまな記法&lt;/h3&gt;
&lt;h3&gt;6.4　関数呼び出しと戻り値&lt;/h3&gt;
&lt;h3&gt;6.5　ジェネレーター&lt;/h3&gt;
&lt;h3&gt;この章の理解度チェック&lt;/h3&gt;
&lt;h2&gt;第7章　標準クラスライブラリ&lt;/h2&gt;
&lt;h3&gt;7.1　オブジェクト指向プログラミングの基本&lt;/h3&gt;
&lt;h3&gt;7.2　DateTimeクラス&lt;/h3&gt;
&lt;h3&gt;7.3　DirectoryIteratorクラス&lt;/h3&gt;
&lt;h3&gt;7.4　外部ライブラリの活用―Composer&lt;/h3&gt;
&lt;h3&gt;7.5　HTTPクライアントGuzzle&lt;/h3&gt;
&lt;h3&gt;この章の理解度チェック&lt;/h3&gt;
&lt;h2&gt;第8章　リクエスト情報&lt;/h2&gt;
&lt;h3&gt;8.1　リクエスト情報&lt;/h3&gt;
&lt;h3&gt;8.2　ポストデータ―$_POST&lt;/h3&gt;
&lt;h3&gt;8.3　クエリ情報―$_GET&lt;/h3&gt;
&lt;h3&gt;8.4　ヘッダー情報―$_SERVER&lt;/h3&gt;
&lt;h3&gt;8.5　サーバー環境変数―$_ENV&lt;/h3&gt;
&lt;h3&gt;8.6　クッキー情報―$_COOKIE&lt;/h3&gt;
&lt;h3&gt;8.7　セッション情報―$_SESSION&lt;/h3&gt;
&lt;h3&gt;8.8　アップロード処理の実装―$_FILES&lt;/h3&gt;
&lt;h3&gt;この章の理解度チェック&lt;/h3&gt;
&lt;h2&gt;第9章　データベース連携&lt;/h2&gt;
&lt;h3&gt;9.1　データベースの種類&lt;/h3&gt;
&lt;h3&gt;9.2　データベース操作の基本&lt;/h3&gt;
&lt;h3&gt;9.3　データベース抽象化レイヤー&lt;/h3&gt;
&lt;h3&gt;9.4　データベースへの接続&lt;/h3&gt;
&lt;h3&gt;9.5　SQLクエリの発行&lt;/h3&gt;
&lt;h3&gt;9.6　結果セットの取得&lt;/h3&gt;
&lt;h3&gt;9.7　パラメーター値のバインド&lt;/h3&gt;
&lt;h3&gt;9.8　トランザクション処理&lt;/h3&gt;
&lt;h3&gt;この章の理解度チェック&lt;/h3&gt;
&lt;h2&gt;第10章　オブジェクト指向構文&lt;/h2&gt;
&lt;h3&gt;10.1　クラスの定義&lt;/h3&gt;
&lt;h3&gt;10.2　カプセル化&lt;/h3&gt;
&lt;h3&gt;10.3　継承&lt;/h3&gt;
&lt;h3&gt;10.4　ポリモーフィズム&lt;/h3&gt;
&lt;h3&gt;10.5　トレイト&lt;/h3&gt;
&lt;h3&gt;10.6　オブジェクトの操作&lt;/h3&gt;
&lt;h3&gt;10.7　例外処理&lt;/h3&gt;
&lt;h3&gt;10.8　マジックメソッド&lt;/h3&gt;
&lt;h3&gt;10.9　名前空間&lt;/h3&gt;
&lt;h3&gt;10.10　クラスの自動ローディング&lt;/h3&gt;
&lt;h3&gt;この章の理解度チェック&lt;/h3&gt;
&lt;h2&gt;第11章　高度なプログラミング&lt;/h2&gt;
&lt;h3&gt;11.1　属性&lt;/h3&gt;
&lt;h3&gt;11.2　セキュリティ対策&lt;/h3&gt;
&lt;h3&gt;11.3　ドキュメンテーションコメント&lt;/h3&gt;
&lt;h3&gt;11.4　VSCode＋PHP Debug拡張によるデバッグ&lt;/h3&gt;
&lt;h3&gt;この章の理解度チェック&lt;/h3&gt;
&lt;h2&gt;付録A　「練習問題」「この章の理解度チェック」解答&lt;/h2&gt;
</content:encoded></item><item><title>AWS_SolutionArchitectSpecialist_受験対策まとめ</title><link>https://tutttuwi.github.io/posts/2023-06_aws_solutionarchitectspecialist_%E5%8F%97%E9%A8%93%E5%AF%BE%E7%AD%96%E3%83%A1%E3%83%A2/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2023-06_aws_solutionarchitectspecialist_%E5%8F%97%E9%A8%93%E5%AF%BE%E7%AD%96%E3%83%A1%E3%83%A2/</guid><pubDate>Sat, 24 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;AWS SysOps Administrator Associate Exam preparation&lt;/h1&gt;
&lt;h2&gt;基本情報&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;試験時間：試験完了までに 180 分&lt;/li&gt;
&lt;li&gt;スコア：100-1000点&lt;/li&gt;
&lt;li&gt;最低合格スコア：720点&lt;/li&gt;
&lt;li&gt;受験料：300 USD&lt;/li&gt;
&lt;li&gt;フォーマット: 75 問&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;WEB情報&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://aws.amazon.com/jp/certification/certified-solutions-architect-professional/?ch=sec&amp;amp;sec=rmg&amp;amp;d=1&quot;&gt;https://aws.amazon.com/jp/certification/certified-solutions-architect-professional/?ch=sec&amp;amp;sec=rmg&amp;amp;d=1&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;認定によって検証される能力&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;複雑な組織に対応する設計&lt;/li&gt;
&lt;li&gt;新しいソリューションのための設計&lt;/li&gt;
&lt;li&gt;既存ソリューションの継続的な改善&lt;/li&gt;
&lt;li&gt;ワークロードの移行とモダナイゼーションの加速&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;内容の概要&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;分野&lt;/th&gt;
&lt;th&gt;出題の比率&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;第 1 分野 複雑な組織に対応するソリューションの設計&lt;/td&gt;
&lt;td&gt;26%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;第 2 分野 新しいソリューションのための設計&lt;/td&gt;
&lt;td&gt;29%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;第 3 分野 既存のソリューションの継続的な改善&lt;/td&gt;
&lt;td&gt;25%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;第 4 分野 ワークロードの移行とモダナイゼーションの加速&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;合計&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;タスク&lt;/h2&gt;
&lt;h3&gt;第１分野: 複雑な組織に対応するソリューションの設計&lt;/h3&gt;
&lt;p&gt;タスクステートメント 1: ネットワーク接続戦略を設計する。&lt;/p&gt;
&lt;p&gt;対象知識:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWS のグローバルインフラストラクチャ&lt;/li&gt;
&lt;li&gt;AWS ネットワークの概念 (Amazon VPC、AWS Direct Connect、AWS VPN、推移的ルーティング、AWS コンテナサービスなど)&lt;/li&gt;
&lt;li&gt;ハイブリッド DNS の概念 (Amazon Route 53 Resolver、オンプレミス DNS 統合など)&lt;/li&gt;
&lt;li&gt;ネットワークセグメンテーション (サブネット、IP アドレス指定、VPC 間の接続など)&lt;/li&gt;
&lt;li&gt;ネットワークトラフィックモニタリング&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;対象スキル:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;複数の VPC の接続オプションを評価する&lt;/li&gt;
&lt;li&gt;オンプレミス、コロケーション、クラウド統合の接続オプションを評価する&lt;/li&gt;
&lt;li&gt;ネットワークとレイテンシーの要件に基づいて AWS リージョンとアベイラビリティーゾーンを選択する&lt;/li&gt;
&lt;li&gt;AWS ツールを使用してトラフィックフローの問題を解決する&lt;/li&gt;
&lt;li&gt;サービス統合のサービスエンドポイントを活用する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;タスクステートメント 2: セキュリティコントロールを規定する。&lt;/p&gt;
&lt;p&gt;対象知識:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWS Identity and Access Management (IAM) と AWS Single Sign-On&lt;/li&gt;
&lt;li&gt;ルートテーブル、セキュリティグループ、ネットワーク ACL&lt;/li&gt;
&lt;li&gt;暗号化キーと証明書管理 (AWS Key Management Service [AWS KMS]、AWS CertificateManager [ACM] など)&lt;/li&gt;
&lt;li&gt;AWS のセキュリティ、アイデンティティ、コンプライアンスのツール (AWS CloudTrail、AWS Identity and Access Management Access Analyzer、AWS Security Hub、Amazon Inspector など)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;対象スキル:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;クロスアカウントアクセス管理を評価する&lt;/li&gt;
&lt;li&gt;サードパーティー ID プロバイダーと統合する&lt;/li&gt;
&lt;li&gt;保存中のデータと転送中のデータに対する暗号化戦略を導入する&lt;/li&gt;
&lt;li&gt;セキュリティイベントの通知と監査を一元化するための戦略を策定する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;タスクステートメント 3: 信頼性と耐障害性に優れたアーキテクチャを設計する。&lt;/p&gt;
&lt;p&gt;対象知識:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;目標復旧時間 (RTO) と目標復旧時点 (RPO)&lt;/li&gt;
&lt;li&gt;災害対策戦略 (AWS Elastic Disaster Recovery [CloudEndure Disaster Recovery]、パイロットライト、ウォームスタンバイ、マルチサイトの使用など)&lt;/li&gt;
&lt;li&gt;データのバックアップと復元&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;対象スキル:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RTO および RPO 要件に基づいて災害対策ソリューションを設計する&lt;/li&gt;
&lt;li&gt;障害から自動的に復旧するアーキテクチャを実装する&lt;/li&gt;
&lt;li&gt;スケールアップとスケールアウトのオプションを考慮し、最適なアーキテクチャを策定する&lt;/li&gt;
&lt;li&gt;効果的なバックアップ/復元の戦略を設計する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;タスクステートメント 4: マルチアカウント AWS 環境を設計する。&lt;/p&gt;
&lt;p&gt;対象知識:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWS Organizations と AWS Control Tower&lt;/li&gt;
&lt;li&gt;マルチアカウントイベント通知&lt;/li&gt;
&lt;li&gt;環境間の AWS リソース共有&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;対象スキル:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;組織の要件に最も適したアカウント構造を評価する&lt;/li&gt;
&lt;li&gt;一元的なログ記録とイベント通知の戦略を推奨する&lt;/li&gt;
&lt;li&gt;マルチアカウントガバナンスモデルを開発する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;タスクステートメント 5: コスト最適化と可視化の戦略を決定する。&lt;/p&gt;
&lt;p&gt;対象知識:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWS のコストおよび使用状況のモニタリングツール (AWS Trusted Advisor、AWS Pricing Calculator、AWS Cost Explorer、AWS Budgets など)&lt;/li&gt;
&lt;li&gt;AWS 購入オプション (リザーブドインスタンス、Savings Plans、スポットインスタンスなど)&lt;/li&gt;
&lt;li&gt;サイズ適正化のための AWS 可視化ツール (AWS Compute Optimizer、Amazon S3 StorageLens など)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;対象スキル:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWS ツールでコストと使用量をモニタリングする&lt;/li&gt;
&lt;li&gt;コストを事業単位にマッピングする効果的なタグ付け戦略を策定する&lt;/li&gt;
&lt;li&gt;購入オプションがコストとパフォーマンスに与える影響を理解する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;第 2 分野: 新しいソリューションのための設計&lt;/p&gt;
&lt;p&gt;タスクステートメント 1: ビジネス要件を満たす導入戦略を設計する。&lt;/p&gt;
&lt;p&gt;対象知識:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Infrastructure as Code (IaC) (AWS CloudFormation など)&lt;/li&gt;
&lt;li&gt;継続的インテグレーション/継続的デリバリー (CI/CD)&lt;/li&gt;
&lt;li&gt;変更管理プロセス&lt;/li&gt;
&lt;li&gt;構成管理ツール (AWS Systems Manager など)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;対象スキル:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;新しいサービスや機能のためのアプリケーションまたはアップグレードパスを決定する&lt;/li&gt;
&lt;li&gt;デプロイ戦略を策定し、適切なロールバックメカニズムを実装するためのサービスを選定する&lt;/li&gt;
&lt;li&gt;必要に応じてマネージドサービスを採用し、インフラストラクチャのプロビジョニングやパッチ適用のオーバーヘッドを削減する&lt;/li&gt;
&lt;li&gt;複雑な開発タスクとデプロイタスクを AWS にまかせ、高度なテクノロジーを利用できるようにする&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;タスクステートメント 2: 事業継続性を確保するソリューションを設計する。&lt;/p&gt;
&lt;p&gt;対象知識:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWS のグローバルインフラストラクチャ&lt;/li&gt;
&lt;li&gt;AWS ネットワークの概念 (Route 53、ルーティングメソッドなど)&lt;/li&gt;
&lt;li&gt;RTO と RPO&lt;/li&gt;
&lt;li&gt;災害対策シナリオ (バックアップと復元、パイロットライト、ウォームスタンバイ、マルチサイトなど)&lt;/li&gt;
&lt;li&gt;AWS の災害対策ソリューション&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;対象スキル:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;災害対策ソリューションを構成する&lt;/li&gt;
&lt;li&gt;データとデータベースのレプリケーションを構成する&lt;/li&gt;
&lt;li&gt;災害対策テストを実行する&lt;/li&gt;
&lt;li&gt;自動化され、費用対効果が高く、複数のアベイラビリティーゾーンおよび/またはAWS リージョンをまたいで事業継続性をサポートするバックアップソリューションのアーキテクチャを設計する&lt;/li&gt;
&lt;li&gt;障害時もアプリケーションとインフラストラクチャの可用性を維持するアーキテクチャを設計する&lt;/li&gt;
&lt;li&gt;プロセスとコンポーネントを活用して一元的なモニタリングを行い、システム障害からプロアクティブに復旧する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;タスクステートメント 3: 要件に基づいてセキュリティコントロールを決定する。&lt;/p&gt;
&lt;p&gt;対象知識:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IAM&lt;/li&gt;
&lt;li&gt;ルートテーブル、セキュリティグループ、ネットワーク ACL&lt;/li&gt;
&lt;li&gt;保管中のデータと転送中のデータの暗号化オプション&lt;/li&gt;
&lt;li&gt;AWS サービスエンドポイント&lt;/li&gt;
&lt;li&gt;認証情報管理サービス&lt;/li&gt;
&lt;li&gt;AWS マネージドセキュリティサービス (AWS Shield、AWS WAF、Amazon GuardDuty、AWS Security Hub など)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;対象スキル:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最小権限アクセスの原則に従った IAM ユーザーと IAM ロールを指定する&lt;/li&gt;
&lt;li&gt;セキュリティグループルールとネットワーク ACL ルールを使用したインバウンドおよびアウトバウンドのネットワークフローを指定する&lt;/li&gt;
&lt;li&gt;大規模なウェブアプリケーションの攻撃対策戦略を策定する&lt;/li&gt;
&lt;li&gt;保管中のデータと転送中のデータの暗号化戦略を策定する&lt;/li&gt;
&lt;li&gt;サービス統合のサービスエンドポイントを指定する&lt;/li&gt;
&lt;li&gt;組織の規格への準拠を維持するためのパッチ管理戦略を策定する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;タスクステートメント 4: 信頼性の要件を満たす戦略を策定する。&lt;/p&gt;
&lt;p&gt;対象知識:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWS のグローバルインフラストラクチャ&lt;/li&gt;
&lt;li&gt;AWS ストレージサービスとレプリケーション戦略 (Amazon S3、Amazon RDS、AmazonElastiCache など)&lt;/li&gt;
&lt;li&gt;マルチ AZ およびマルチリージョンアーキテクチャ&lt;/li&gt;
&lt;li&gt;オートスケーリングのポリシーとイベント&lt;/li&gt;
&lt;li&gt;アプリケーション統合 (Amazon Simple Notification Service [Amazon SNS]、AmazonSimple Queue Service [Amazon SQS]、AWS Step Functions など)&lt;/li&gt;
&lt;li&gt;サービスクォータと上限&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;対象スキル:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ビジネス要件に基づいて可用性の高いアプリケーション環境を設計する&lt;/li&gt;
&lt;li&gt;高度な技術を活用して障害に備えて設計し、シームレスなシステム回復性を確保する&lt;/li&gt;
&lt;li&gt;疎結合依存関係を実装する&lt;/li&gt;
&lt;li&gt;高可用性アーキテクチャを運用、保守する (アプリケーションのフェイルオーバー、データベースのフェイルオーバーなど)&lt;/li&gt;
&lt;li&gt;AWS マネージドサービスを活用して高可用性を実現する&lt;/li&gt;
&lt;li&gt;DNS ルーティングポリシーを実装する (Route 53 のレイテンシールーティングポリシー、位置情報ルーティング、シンプルルーティングなど)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;タスクステートメント 5: パフォーマンス目標を満たすソリューションを設計する。&lt;/p&gt;
&lt;p&gt;対象知識:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;パフォーマンスモニタリングテクノロジー&lt;/li&gt;
&lt;li&gt;AWS のストレージオプション&lt;/li&gt;
&lt;li&gt;インスタンスファミリーとユースケース&lt;/li&gt;
&lt;li&gt;目的別データベース&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;対象スキル:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;さまざまなアクセスパターンに対応した大規模アプリケーションアーキテクチャを設計する&lt;/li&gt;
&lt;li&gt;ビジネス目標に合わせて伸縮自在なアーキテクチャを設計する&lt;/li&gt;
&lt;li&gt;キャッシュ、バッファリング、レプリカでパフォーマンス目標を達成するための設計パターンを適用する&lt;/li&gt;
&lt;li&gt;必要なタスクに特化したサービスを選択するためのプロセス方法論を策定する&lt;/li&gt;
&lt;li&gt;サイズ適正化戦略を設計する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;タスクステートメント 6: ソリューションの目標と目的を達成するためのコスト最適化戦略を決定する。&lt;/p&gt;
&lt;p&gt;対象知識:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWS のコストおよび使用状況のモニタリングツール (Cost Explorer、Trusted Advisor、AWS Pricing Calculator など)&lt;/li&gt;
&lt;li&gt;料金モデル (リザーブドインスタンス、Savings Plans など)&lt;/li&gt;
&lt;li&gt;ストレージ階層化&lt;/li&gt;
&lt;li&gt;データ転送コスト&lt;/li&gt;
&lt;li&gt;AWS が提供するマネージドサービス&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;対象スキル:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;インフラストラクチャを選択し、適切なサイズにする機会を特定し、リソースの費用対効果を上げる&lt;/li&gt;
&lt;li&gt;適切な価格モデルを特定する&lt;/li&gt;
&lt;li&gt;データ転送のモデル化とサービスの選択を行い、データ転送コストを削減する&lt;/li&gt;
&lt;li&gt;経費支出と使用状況を認識するための戦略を策定し、制御を実装する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;第 3 分野: 既存のソリューションの継続的な改善&lt;/p&gt;
&lt;p&gt;タスクステートメント 1: 全体的な運用上の優秀性を高めるための戦略を作成する。&lt;/p&gt;
&lt;p&gt;対象知識:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アラートと自動修復の戦略&lt;/li&gt;
&lt;li&gt;災害対策計画&lt;/li&gt;
&lt;li&gt;モニタリングとログ記録のソリューション (Amazon CloudWatch など)&lt;/li&gt;
&lt;li&gt;CI/CD パイプラインとデプロイ戦略 (ブルー/グリーン、オールアットワンス、ローリングなど)&lt;/li&gt;
&lt;li&gt;構成管理ツール (Systems Manager など)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;対象スキル:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最も適したログ記録とモニタリング戦略を決定する&lt;/li&gt;
&lt;li&gt;改善の機会を特定する目的で現在のデプロイプロセスを評価する&lt;/li&gt;
&lt;li&gt;ソリューションスタック内の自動化の機会に優先順位を付ける&lt;/li&gt;
&lt;li&gt;構成管理を自動化を可能にするために適切な AWS ソリューションを提案する&lt;/li&gt;
&lt;li&gt;復旧アクションの理解をサポートし、演習するための障害シナリオアクティビティを設計する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;タスクステートメント 2: セキュリティを向上させるための戦略を決定する。&lt;/p&gt;
&lt;p&gt;対象知識:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;データ保持、データ機密性、データ規制要件&lt;/li&gt;
&lt;li&gt;モニタリングと修正の自動化戦略 (AWS Config ルールなど)&lt;/li&gt;
&lt;li&gt;シークレット管理 (Systems Manager、AWS Secrets Manager など)&lt;/li&gt;
&lt;li&gt;最小権限アクセスの原則&lt;/li&gt;
&lt;li&gt;セキュリティ固有の AWS ソリューション&lt;/li&gt;
&lt;li&gt;パッチ適用のプラクティス&lt;/li&gt;
&lt;li&gt;バックアップのプラクティスと方法&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;対象スキル:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;シークレットと認証情報を安全に管理するための戦略を評価する&lt;/li&gt;
&lt;li&gt;最小権限アクセスについて環境を監査する&lt;/li&gt;
&lt;li&gt;実装されたソリューションを見直し、すべてのレイヤーでセキュリティを確保する&lt;/li&gt;
&lt;li&gt;ユーザーとサービスの包括的なトレーサビリティを見直す&lt;/li&gt;
&lt;li&gt;脆弱性の検出に対する自動対応に優先順位を付ける&lt;/li&gt;
&lt;li&gt;パッチと更新のプロセスを設計し、実装する&lt;/li&gt;
&lt;li&gt;バックアッププロセスを設計し、実装する&lt;/li&gt;
&lt;li&gt;修復手法を採用する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;タスクステートメント 3: パフォーマンスを改善するための戦略を決定する。&lt;/p&gt;
&lt;p&gt;対象知識:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;高パフォーマンスのシステムアーキテクチャ (オートスケーリング、インスタンスフリート、プレイスメントグループなど)&lt;/li&gt;
&lt;li&gt;グローバルサービス (AWS Global Accelerator、Amazon CloudFront、エッジコンピューティングサービスなど)&lt;/li&gt;
&lt;li&gt;モニタリングツールのセットとサービス (CloudWatch など)&lt;/li&gt;
&lt;li&gt;サービスレベルアグリーメント (SLA) と重要業績評価指標 (KPI)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;対象スキル:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ビジネス要件を測定可能な指標に変換する&lt;/li&gt;
&lt;li&gt;修復ソリューション候補をテストし、提案を行う&lt;/li&gt;
&lt;li&gt;新しいテクノロジーとマネージドサービスを導入する機会を提案する&lt;/li&gt;
&lt;li&gt;ソリューションを評価し、要件に基づいてサイズの適正化を行う&lt;/li&gt;
&lt;li&gt;パフォーマンスのボトルネックを特定し、調査する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;タスクステートメント 4: 信頼性を向上させるための戦略を決定する。&lt;/p&gt;
&lt;p&gt;対象知識:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWS のグローバルインフラストラクチャ&lt;/li&gt;
&lt;li&gt;データレプリケーション方法&lt;/li&gt;
&lt;li&gt;スケーリング方法論 (ロードバランシング、オートスケーリングなど)&lt;/li&gt;
&lt;li&gt;高可用性と回復力&lt;/li&gt;
&lt;li&gt;災害対策の方法とツール&lt;/li&gt;
&lt;li&gt;サービスクォータと上限&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;対象スキル:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アプリケーションの利用増加と使用傾向を把握する&lt;/li&gt;
&lt;li&gt;既存のアーキテクチャを評価し、信頼性が不十分な領域を特定する&lt;/li&gt;
&lt;li&gt;単一障害点を修正する&lt;/li&gt;
&lt;li&gt;データレプリケーション、自己修復、伸縮自在な機能とサービスを実現する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;タスクステートメント 5: コスト最適化の機会を特定する。&lt;/p&gt;
&lt;p&gt;対象知識:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コスト意識の高いアーキテクチャを選択する (スポットインスタンスの利用、スケーリングポリシー、リソースのサイズ適正化など)&lt;/li&gt;
&lt;li&gt;価格モデルの採用 (リザーブドインスタンス、Savings Plans など)&lt;/li&gt;
&lt;li&gt;ネットワークとデータ転送のコスト&lt;/li&gt;
&lt;li&gt;コスト管理、アラート、レポート作成&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;対象スキル:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用状況レポートを分析し、使用率の低いリソースと使用率の高いリソースを特定する&lt;/li&gt;
&lt;li&gt;AWS ソリューションを活用して使用されていないリソースを特定する&lt;/li&gt;
&lt;li&gt;予想される使用パターンに基づいて課金アラームを設計する&lt;/li&gt;
&lt;li&gt;AWS Cost and Usage Report をきめ細かく調査する&lt;/li&gt;
&lt;li&gt;コスト配分とレポート作成にタグ付けを活用する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;第 4 分野: ワークロードの移行とモダナイゼーションの加速&lt;/p&gt;
&lt;p&gt;タスクステートメント 1: 移行が可能な既存のワークロードとプロセスを選択する。&lt;/p&gt;
&lt;p&gt;対象知識:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;移行アセスメントおよび追跡ツール (AWS Migration Hub など)&lt;/li&gt;
&lt;li&gt;ポートフォリオアセスメント&lt;/li&gt;
&lt;li&gt;アセットプランニング&lt;/li&gt;
&lt;li&gt;ワークロードの優先順位付けと移行 (ウェーブプランニングなど)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;対象スキル:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アプリケーション移行アセスメントを実施する&lt;/li&gt;
&lt;li&gt;7 つの一般的な移行戦略 (7R) に従ってアプリケーションを評価する&lt;/li&gt;
&lt;li&gt;総保有コスト (TCO) を評価するタスクステートメント 2: 既存ワークロードの最適な移行アプローチを決定する。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;対象知識:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;データ移行のオプションとツール (AWS DataSync、AWS Transfer Family、AWS SnowFamily、S3 Transfer Acceleration など)&lt;/li&gt;
&lt;li&gt;アプリケーション移行ツール (AWS Application Discovery Service、AWS ApplicationMigration Service [CloudEndure Migration]、AWS Server Migration Service[AWS SMS] など)&lt;/li&gt;
&lt;li&gt;AWS ネットワークサービスと DNS (Direct Connect、AWS Site-to-Site VPN、Route 53 など)&lt;/li&gt;
&lt;li&gt;アイデンティティサービス (AWS SSO、AWS Directory Service など)&lt;/li&gt;
&lt;li&gt;データベース移行ツール (AWS Database Migration Service [AWS DMS]、AWS SchemaConversion Tool [AWS SCT] など)&lt;/li&gt;
&lt;li&gt;ガバナンスツール (AWS Control Tower、Organizations など)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;対象スキル:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;適切なデータベース転送メカニズムを選択する&lt;/li&gt;
&lt;li&gt;適切なアプリケーション転送メカニズムを選択する&lt;/li&gt;
&lt;li&gt;適切なデータ転送サービスと移行戦略を選択する&lt;/li&gt;
&lt;li&gt;移行ツールに適したセキュリティ方法を適用する&lt;/li&gt;
&lt;li&gt;適切なガバナンスモデルを選択する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;タスクステートメント 3: 既存ワークロードの新しいアーキテクチャを決定する。&lt;/p&gt;
&lt;p&gt;対象知識:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コンピューティングサービス (Amazon EC2、AWS Elastic Beanstalk など)&lt;/li&gt;
&lt;li&gt;コンテナ (Amazon Elastic Container Service [Amazon ECS]、Amazon Elastic KubernetesService [Amazon EKS]、AWS Fargate, Amazon Elastic Container Registry[Amazon ECR] など)&lt;/li&gt;
&lt;li&gt;AWS ストレージサービス (Amazon Elastic Block Store [Amazon EBS]、Amazon Elastic FileSystem [Amazon EFS]、Amazon FSx、Amazon S3、Volume Gateway など)&lt;/li&gt;
&lt;li&gt;データベース (Amazon DynamoDB、Amazon OpenSearch Service [Amazon ElasticsearchService]、Amazon RDS、Amazon EC2 のセルフマネージド型データベースなど)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;対象スキル:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;適切なコンピューティングプラットフォームを選択する&lt;/li&gt;
&lt;li&gt;適切なコンテナホスティングプラットフォームを選択する&lt;/li&gt;
&lt;li&gt;適切なストレージサービスを選択する&lt;/li&gt;
&lt;li&gt;適切なデータベースプラットフォームを選択する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;タスクステートメント 4: モダナイゼーションと機能強化の機会を決定する。
対象知識:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;サーバーレスコンピューティングサービス (AWS Lambda など)&lt;/li&gt;
&lt;li&gt;コンテナ (Amazon ECS、Amazon EKS、AWS Fargate など)&lt;/li&gt;
&lt;li&gt;AWS ストレージサービス (Amazon S3、Amazon EFS など)&lt;/li&gt;
&lt;li&gt;目的別データベース (DynamoDB, Amazon Aurora Serverless、ElastiCache など)&lt;/li&gt;
&lt;li&gt;統合サービス (Amazon SQS、Amazon SNS、Amazon EventBridge [Amazon CloudWatchEvents]、Step Functions など)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;対象スキル:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アプリケーションコンポーネントを切り離す機会を特定する&lt;/li&gt;
&lt;li&gt;サーバーレスソリューションの機会を特定する&lt;/li&gt;
&lt;li&gt;コンテナに適したサービスを選択する&lt;/li&gt;
&lt;li&gt;目的別データベースの機会を特定する&lt;/li&gt;
&lt;li&gt;適切なアプリケーション統合サービスを選択する&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;試験の対象となる主要なツール、テクノロジー、概念&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;コンピューティング&lt;/li&gt;
&lt;li&gt;コスト管理&lt;/li&gt;
&lt;li&gt;データベース&lt;/li&gt;
&lt;li&gt;災害対策&lt;/li&gt;
&lt;li&gt;高可用性&lt;/li&gt;
&lt;li&gt;マネジメントとガバナンス&lt;/li&gt;
&lt;li&gt;マイクロサービスとコンポーネントのデカップリング&lt;/li&gt;
&lt;li&gt;移行とデータの転送&lt;/li&gt;
&lt;li&gt;ネットワーク、接続、コンテンツ配信&lt;/li&gt;
&lt;li&gt;セキュリティ&lt;/li&gt;
&lt;li&gt;サーバーレスの設計原則&lt;/li&gt;
&lt;li&gt;ストレージ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;範囲内の AWS のサービスと機能
分析:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Amazon Athena&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Data Exchange&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Data Pipeline&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon EMR&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Glue&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Kinesis Data Analytics&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Kinesis Data Firehose&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Kinesis Data Streams&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Lake Formation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Managed Streaming for Apache Kafka (Amazon MSK)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon OpenSearch Service&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon QuickSight
アプリケーション統合:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon AppFlow&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS AppSync&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon EventBridge (Amazon CloudWatch Events)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon MQ&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Simple Notification Service (Amazon SNS)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Simple Queue Service (Amazon SQS)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Step Functions
ビジネスアプリケーション:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Alexa for Business&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Simple Email Service (Amazon SES)
ブロックチェーン:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Managed Blockchain
クラウド財務管理:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Budgets&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Cost and Usage Report&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Cost Explorer&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Savings Plans
コンピューティング:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS App Runner&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Auto Scaling&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Batch&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon EC2&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon EC2 Auto Scaling&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Elastic Beanstalk&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Elastic Kubernetes Service (Amazon EKS)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Elastic Load Balancing&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Fargate&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Lambda&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Lightsail&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Outposts&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Wavelength
コンテナ:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Elastic Container Registry (Amazon ECR)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Elastic Container Service (Amazon ECS)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon ECS Anywhere&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Elastic Kubernetes Service (Amazon EKS)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon EKS Anywhere&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon EKS Distro
データベース:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Aurora&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Aurora Serverless&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon DocumentDB (MongoDB 互換)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon DynamoDB&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon ElastiCache&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Keyspaces (for Apache Cassandra)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Neptune&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon RDS&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Redshift&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Timestream
デベロッパーツール:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Cloud9&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS CodeArtifact&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS CodeBuild&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS CodeCommit&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS CodeDeploy&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon CodeGuru&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS CodePipeline&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS CodeStar&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS X-Ray
エンドユーザーコンピューティング:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon AppStream 2.0&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon WorkSpaces
フロントエンドのウェブとモバイル:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Amplify&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon API Gateway&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Device Farm&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Pinpoint
IoT:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS IoT Analytics&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS IoT Core&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS IoT Device Defender&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS IoT Device Management&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS IoT Events&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS IoT Greengrass&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS IoT SiteWise&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS IoT Things Graph&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS IoT 1-Click&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;機械学習:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Amazon Comprehend&lt;/li&gt;
&lt;li&gt;Amazon Forecast&lt;/li&gt;
&lt;li&gt;Amazon Fraud Detector&lt;/li&gt;
&lt;li&gt;Amazon Kendra&lt;/li&gt;
&lt;li&gt;Amazon Lex&lt;/li&gt;
&lt;li&gt;Amazon Personalize&lt;/li&gt;
&lt;li&gt;Amazon Polly&lt;/li&gt;
&lt;li&gt;Amazon Rekognition&lt;/li&gt;
&lt;li&gt;Amazon SageMaker&lt;/li&gt;
&lt;li&gt;Amazon Textract&lt;/li&gt;
&lt;li&gt;Amazon Transcribe&lt;/li&gt;
&lt;li&gt;Amazon Translate
マネジメントとガバナンス:&lt;/li&gt;
&lt;li&gt;AWS CloudFormation&lt;/li&gt;
&lt;li&gt;AWS CloudTrail&lt;/li&gt;
&lt;li&gt;Amazon CloudWatch&lt;/li&gt;
&lt;li&gt;Amazon CloudWatch Logs&lt;/li&gt;
&lt;li&gt;AWS Command Line Interface (AWS CLI)&lt;/li&gt;
&lt;li&gt;AWS Compute Optimizer&lt;/li&gt;
&lt;li&gt;AWS Config&lt;/li&gt;
&lt;li&gt;AWS Control Tower&lt;/li&gt;
&lt;li&gt;AWS License Manager&lt;/li&gt;
&lt;li&gt;Amazon Managed Grafana&lt;/li&gt;
&lt;li&gt;Amazon Managed Service for Prometheus&lt;/li&gt;
&lt;li&gt;AWS Management Console&lt;/li&gt;
&lt;li&gt;AWS Organizations&lt;/li&gt;
&lt;li&gt;AWS Personal Health Dashboard&lt;/li&gt;
&lt;li&gt;AWS Proton&lt;/li&gt;
&lt;li&gt;AWS Service Catalog&lt;/li&gt;
&lt;li&gt;Service Quotas&lt;/li&gt;
&lt;li&gt;AWS Systems Manager&lt;/li&gt;
&lt;li&gt;AWS Trusted Advisor&lt;/li&gt;
&lt;li&gt;AWS Well-Architected Tool
メディアサービス:&lt;/li&gt;
&lt;li&gt;Amazon Elastic Transcoder&lt;/li&gt;
&lt;li&gt;Amazon Kinesis Video Streams
移行と転送:&lt;/li&gt;
&lt;li&gt;AWS Application Discovery Service&lt;/li&gt;
&lt;li&gt;AWS Application Migration Service (CloudEndure Migration)&lt;/li&gt;
&lt;li&gt;AWS Database Migration Service (AWS DMS)&lt;/li&gt;
&lt;li&gt;AWS DataSync&lt;/li&gt;
&lt;li&gt;AWS Migration Hub&lt;/li&gt;
&lt;li&gt;AWS Schema Conversion Tool (AWS SCT)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AWS Snow ファミリー&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWS Transfer Family
ネットワークとコンテンツ配信:&lt;/li&gt;
&lt;li&gt;Amazon CloudFront&lt;/li&gt;
&lt;li&gt;AWS Direct Connect&lt;/li&gt;
&lt;li&gt;Elastic Load Balancing (ELB)&lt;/li&gt;
&lt;li&gt;AWS Global Accelerator&lt;/li&gt;
&lt;li&gt;AWS PrivateLink&lt;/li&gt;
&lt;li&gt;Amazon Route 53&lt;/li&gt;
&lt;li&gt;AWS Transit Gateway&lt;/li&gt;
&lt;li&gt;Amazon VPC&lt;/li&gt;
&lt;li&gt;AWS VPN
セキュリティ、アイデンティティ、コンプライアンス:&lt;/li&gt;
&lt;li&gt;AWS Artifact&lt;/li&gt;
&lt;li&gt;AWS Audit Manager&lt;/li&gt;
&lt;li&gt;AWS Certificate Manager (ACM)&lt;/li&gt;
&lt;li&gt;AWS CloudHSM&lt;/li&gt;
&lt;li&gt;Amazon Cognito&lt;/li&gt;
&lt;li&gt;Amazon Detective&lt;/li&gt;
&lt;li&gt;AWS Directory Service&lt;/li&gt;
&lt;li&gt;AWS Firewall Manager&lt;/li&gt;
&lt;li&gt;Amazon GuardDuty&lt;/li&gt;
&lt;li&gt;AWS Identity and Access Management (IAM)&lt;/li&gt;
&lt;li&gt;Amazon Inspector&lt;/li&gt;
&lt;li&gt;AWS Key Management Service (AWS KMS)&lt;/li&gt;
&lt;li&gt;Amazon Macie&lt;/li&gt;
&lt;li&gt;AWS Network Firewall&lt;/li&gt;
&lt;li&gt;AWS Resource Access Manager (AWS RAM)&lt;/li&gt;
&lt;li&gt;AWS Secrets Manager&lt;/li&gt;
&lt;li&gt;AWS Security Hub&lt;/li&gt;
&lt;li&gt;AWS Security Token Service (AWS STS)&lt;/li&gt;
&lt;li&gt;AWS Shield&lt;/li&gt;
&lt;li&gt;AWS Single Sign-On&lt;/li&gt;
&lt;li&gt;AWS WAF
ストレージ:&lt;/li&gt;
&lt;li&gt;AWS Backup&lt;/li&gt;
&lt;li&gt;Amazon Elastic Block Store (Amazon EBS)&lt;/li&gt;
&lt;li&gt;AWS Elastic Disaster Recovery (CloudEndure Disaster Recovery)&lt;/li&gt;
&lt;li&gt;Amazon Elastic File System (Amazon EFS)&lt;/li&gt;
&lt;li&gt;Amazon FSx (すべてのタイプに対応)&lt;/li&gt;
&lt;li&gt;Amazon S3&lt;/li&gt;
&lt;li&gt;Amazon S3 Glacier&lt;/li&gt;
&lt;li&gt;AWS Storage Gateway&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Web参考記事&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;AWS セキュリティベストプラクティス&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://d1.awsstatic.com/whitepapers/ja_JP/Security/AWS_Security_Best_Practices.pdf&quot;&gt;https://d1.awsstatic.com/whitepapers/ja_JP/Security/AWS_Security_Best_Practices.pdf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Trusted Advisor ベストプラクティス&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://aws.amazon.com/jp/premiumsupport/trustedadvisor/best-practices/&quot;&gt;https://aws.amazon.com/jp/premiumsupport/trustedadvisor/best-practices/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ホワイトペーパー&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://aws.amazon.com/jp/whitepapers&quot;&gt;https://aws.amazon.com/jp/whitepapers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;受験録系&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.sky365.co.jp/blog/certification/aws-certified-solutions-architect---professional.html&quot;&gt;https://www.sky365.co.jp/blog/certification/aws-certified-solutions-architect---professional.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://engineerblog.mynavi.jp/technology/sap-gokaku-repo/&quot;&gt;https://engineerblog.mynavi.jp/technology/sap-gokaku-repo/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;書籍&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;AWS認定ソリューションアーキテクト-プロフェッショナル ~試験特性から導き出した演習問題と詳細解説&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB-%E8%A9%A6%E9%A8%93%E7%89%B9%E6%80%A7%E3%81%8B%E3%82%89%E5%B0%8E%E3%81%8D%E5%87%BA%E3%81%97%E3%81%9F%E6%BC%94%E7%BF%92%E5%95%8F%E9%A1%8C%E3%81%A8%E8%A9%B3%E7%B4%B0%E8%A7%A3%E8%AA%AC-%E5%B9%B3%E5%B1%B1-%E6%AF%85/dp/4865942483&quot;&gt;https://www.amazon.co.jp/AWS認定ソリューションアーキテクト-プロフェッショナル-試験特性から導き出した演習問題と詳細解説-平山-毅/dp/4865942483&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS認定資格試験テキスト＆問題集　AWS認定ソリューションアーキテクト - プロフェッショナル　改訂第2版 (ＡＷＳ認定資格試験テキスト)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%EF%BC%86%E5%95%8F%E9%A1%8C%E9%9B%86-AWS%E8%AA%8D%E5%AE%9A%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB-%E6%94%B9%E8%A8%82%E7%AC%AC2%E7%89%88-%EF%BC%A1%EF%BC%B7%EF%BC%B3%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-%E5%B1%B1%E4%B8%8B%E5%85%89%E6%B4%8B/dp/4815617929/ref=d_pd_sbs_sccl_2_2/357-9098591-2099520?pd_rd_w=oeQXV&amp;amp;content-id=amzn1.sym.0658137e-f5cd-4a01-8903-013eee01b385&amp;amp;pf_rd_p=0658137e-f5cd-4a01-8903-013eee01b385&amp;amp;pf_rd_r=49DM6XEHKNBQ4H26W830&amp;amp;pd_rd_wg=IDn7j&amp;amp;pd_rd_r=33121b2a-c7fb-49da-89aa-32c23c0a7b8e&amp;amp;pd_rd_i=4815617929&amp;amp;psc=1&quot;&gt;https://www.amazon.co.jp/AWS認定資格試験テキスト＆問題集-AWS認定ソリューションアーキテクト-プロフェッショナル-改訂第2版-ＡＷＳ認定資格試験テキスト-山下光洋/dp/4815617929/ref=d_pd_sbs_sccl_2_2/357-9098591-2099520?pd_rd_w=oeQXV&amp;amp;content-id=amzn1.sym.0658137e-f5cd-4a01-8903-013eee01b385&amp;amp;pf_rd_p=0658137e-f5cd-4a01-8903-013eee01b385&amp;amp;pf_rd_r=49DM6XEHKNBQ4H26W830&amp;amp;pd_rd_wg=IDn7j&amp;amp;pd_rd_r=33121b2a-c7fb-49da-89aa-32c23c0a7b8e&amp;amp;pd_rd_i=4815617929&amp;amp;psc=1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;問題集&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Whizlabx
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.whizlabs.com/learn/course/aws-solutions-architect-professional/168&quot;&gt;https://www.whizlabs.com/learn/course/aws-solutions-architect-professional/168&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;抑えておくサービス&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Lambda&lt;/li&gt;
&lt;li&gt;APIGateway&lt;/li&gt;
&lt;li&gt;DynamoDB&lt;/li&gt;
&lt;li&gt;Codeシリーズ&lt;/li&gt;
&lt;li&gt;X-ray&lt;/li&gt;
&lt;li&gt;CloudFormation&lt;/li&gt;
&lt;li&gt;Cognito&lt;/li&gt;
&lt;li&gt;SQS&lt;/li&gt;
&lt;li&gt;S3&lt;/li&gt;
&lt;li&gt;ElasticBeanstalk&lt;/li&gt;
&lt;li&gt;CloudFront&lt;/li&gt;
&lt;li&gt;KMS&lt;/li&gt;
&lt;li&gt;Kinesis&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>AWS認定資格試験テキスト＆問題集　AWS認定ソリューションアーキテクト - プロフェッショナル　改訂第2版 (ＡＷＳ認定資格試験テキスト)</title><link>https://tutttuwi.github.io/posts/2023-06_aws_%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E5%95%8F%E9%A1%8C%E9%9B%86_sap/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2023-06_aws_%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E5%95%8F%E9%A1%8C%E9%9B%86_sap/</guid><pubDate>Sat, 24 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;AWS認定資格試験テキスト＆問題集　AWS認定ソリューションアーキテクト - プロフェッショナル　改訂第2版 (ＡＷＳ認定資格試験テキスト)&lt;/h1&gt;
&lt;h2&gt;書籍情報&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.sbcr.jp/product/4815617929/&quot;&gt;https://www.sbcr.jp/product/4815617929/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;山下光洋：著者&lt;/p&gt;
&lt;p&gt;基礎知識から合格する解答力を身につける！&lt;/p&gt;
&lt;p&gt;AWSプラットフォームでシステム設計やアプリケーション開発をするために必要な技術スキルと経験を検証するのが「AWS認定ソリューションアーキテクト-プロフェッショナル」試験です。プロフェッショナル試験では、具体的な業務要件や課題をケース問題で出題されるため、基本となる知識をベースに、要件や課題に対応した最適な解答を導く応用力が求められます。
本書は、2022年秋に改訂された「SAP-C02 」試験に向けたテキスト＆問題集になっています。出題分野である「複雑な組織に対応するソリューションの設計」「新しいソリューションのための設計」「既存のソリューションの継続的な改善」「ワークロードの移行とモダナイゼーションの加速」に対応して、具体的な要件や課題を読み解きながら、ポイントとなるサービスの利用方法を紹介し、最適な解答につながるように丁寧に解説しています。
各節末のポイントのまとめは試験の直前に知識の確認に利用してもらえ、各章末の確認テストや最終章の模擬試験は合格に必要な解答力をしっかり身につけてもらえます。&lt;/p&gt;
&lt;h2&gt;コンテンツ&lt;/h2&gt;
&lt;h3&gt;第1章　AWS認定ソリューションアーキテクト－プロフェッショナル&lt;/h3&gt;
&lt;h4&gt;1　試験の概要&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;IMDb: &lt;a href=&quot;https://psbr.hatenablog.com/entry/imdb&quot;&gt;https://psbr.hatenablog.com/entry/imdb&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Amazonの子会社&lt;/li&gt;
&lt;li&gt;AWS Data Exchangeを使っていて、S3バケットに様々なデータをインポートしている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Data Pipeline: AWSリソースやコマンドからAWSリソースへデータを変換、コピーする一連の処理をパイプラインとして設定できる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;現在、マネジメントコンソールからアクセスできなくなったため、今後は重要なサービスではなくなる可能性がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon EMR: EMR(Elastic Map Reduce)はApacheHadoopやSparkなどのOSSをマネージドサービスで提供&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Glue: ETLサービス&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;データを指定した方法で変換してS3などストレージやデータベースにデータを保管できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Kinesis Data Analytics: ストリーミングデータをSQLなど使い慣れた言語を使ってリアルタイムに抽出検索&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Kinesis Data Firehose: 最低60秒のバッファでデータをS3、OpenSearchServiceなどに簡単に格納&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Kinesis Data Streams: 秒あたり数GBのデータをリアルタイムにストリーミング処理できます。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Lake Formation: データレイクの構築、管理を簡易化&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Managed Streaming for Apache Kafka(Amazon MSK): マネージドなApache Kafkaを提供するサービス&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon OpenSearch Service: Amazon Elasticsearch Serviceの後継サービス&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;テキストや非構造化データの全文検索や視覚化、ダッシュボード分析が可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon QuickSight: BIサービス&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon AppFlow: 外部SaaSからのノーコードなデータ連携サービス&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS AppSync: GraphQL APIとPubSub APIを高速に開発できる&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2　お勧めの学習方法&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;模擬試験 AWS Skill Builder&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://explore.skillbuilder.aws/learn/external-ecommerce;view=none;redirectURL=?ctldoc-catalog-0=se-%22architect%20professional%22&quot;&gt;https://explore.skillbuilder.aws/learn/external-ecommerce;view=none;redirectURL=?ctldoc-catalog-0=se-&quot;architect professional&quot;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;検証用のAWSアカウント&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;会社、個人でAWSアカウントを利用して実際に動かしてみる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Well-Architected Framework&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://aws.amazon.com/jp/architecture/well-architected/?wa-lens-whitepapers.sort-by=item.additionalFields.sortDate&amp;amp;wa-lens-whitepapers.sort-order=desc&amp;amp;wa-guidance-whitepapers.sort-by=item.additionalFields.sortDate&amp;amp;wa-guidance-whitepapers.sort-order=desc&quot;&gt;https://aws.amazon.com/jp/architecture/well-architected/?wa-lens-whitepapers.sort-by=item.additionalFields.sortDate&amp;amp;wa-lens-whitepapers.sort-order=desc&amp;amp;wa-guidance-whitepapers.sort-by=item.additionalFields.sortDate&amp;amp;wa-guidance-whitepapers.sort-order=desc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;6つの柱を抑えておく
&lt;ul&gt;
&lt;li&gt;オペレーショナル・エクセレンス&lt;/li&gt;
&lt;li&gt;セキュリティ&lt;/li&gt;
&lt;li&gt;パフォーマンス&lt;/li&gt;
&lt;li&gt;コスト最適化&lt;/li&gt;
&lt;li&gt;信頼性&lt;/li&gt;
&lt;li&gt;持続可能性&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;その他リソース&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWS Black Belt&lt;/li&gt;
&lt;li&gt;AWS FAQ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;第2章　複雑な組織への対応&lt;/h3&gt;
&lt;h4&gt;1　組織のネットワーク設計&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;VPC内のEC2からリクエストを実行するためには以下のいずれかが必要&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;インターネットゲートウェイがアタッチされたVPCのパブリックネットワークでEC2を起動する&lt;/li&gt;
&lt;li&gt;インターネットゲートウェイがアタッチされ、NATゲートウェイが起動しているVPCのプライベートサブネットでEC2を起動&lt;/li&gt;
&lt;li&gt;VPCエンドポイントを設定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;VPCエンドポイント&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ゲートウェイエンドポイント
&lt;ul&gt;
&lt;li&gt;VPCのサービス専用のゲートウェイをアタッチする&lt;/li&gt;
&lt;li&gt;対象サービスはS3とDynamoDB&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;インターフェースエンドポイント
&lt;ul&gt;
&lt;li&gt;VPCのサブネットにENI(Elastic Network Interface)を作成&lt;/li&gt;
&lt;li&gt;ENIに割り当てられたプライベートIPアドレスを使用してサービスにアクセス&lt;/li&gt;
&lt;li&gt;ENIとサービス間のプライベート接続を提供しているのがAWS PrivateLinkという技術&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;S3ゲートウェイエンドポイント&lt;/h5&gt;
&lt;p&gt;ゲートウェイエンドポイントは利用料金が不要&lt;/p&gt;
&lt;p&gt;オンプレからアクセスする場合はプロキシサーバーを経由してアクセス&lt;/p&gt;
&lt;p&gt;プロキシサーバーの可用性を考慮すると、ELB、EC2、Auto Scalingを検討する必要がある&lt;/p&gt;
&lt;h5&gt;S3インターフェースエンドポイント&lt;/h5&gt;
&lt;p&gt;インターフェイスエンドポイントは利用料金が発生する&lt;/p&gt;
&lt;p&gt;インターフェイスエンドポイントは指定したサブネットにENIを作成&lt;/p&gt;
&lt;p&gt;インターフェイスエンドポイントが作成されるとDNS名が発行される&lt;/p&gt;
&lt;p&gt;このDNSをS3のエンドポイントに指定してアプリケーションなどからリクエストを実行&lt;/p&gt;
&lt;p&gt;VPCエンドポイントにはエンドポイントポリシーがあり、デフォルトでは全てのリソース、すべてのアクションを許可している&lt;/p&gt;
&lt;h5&gt;AWS PrivateLinkを使用したサードパーティサービスの提供&lt;/h5&gt;
&lt;p&gt;独自のソフトウェアサービスをサードパーティサービスと呼ぶことがある&lt;/p&gt;
&lt;h5&gt;AWSクライアントVPN&lt;/h5&gt;
&lt;p&gt;クライアントからVPCへのアクセス&lt;/p&gt;
&lt;p&gt;VPCを介したオンプレミスやインターネット、他のVPCへのOpenVPNベースのVPNクライアントを使用した安全なアクセスを可能にする&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;認証タイプ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Active Directory（ユーザーベース）
&lt;ul&gt;
&lt;li&gt;AWS Managed Microsoft ADまたは、AD Connectorを使用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;シングルサインオン（SAMLベースのフェデレーション、ユーザーベース）
&lt;ul&gt;
&lt;li&gt;IAM SAML IDプロバイダー&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;相互認証（証明書ベース）
&lt;ul&gt;
&lt;li&gt;AWS Certificate Managerにアップロードしたサーバー証明書とクライアント証明書を使用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;基本設定&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;クライアントが使用するIPアドレス用にをCIDRで設定&lt;/li&gt;
&lt;li&gt;AWSクライアントVPNにサブネットを関連付ける&lt;/li&gt;
&lt;li&gt;関連付けられたサブネットにはENIが作成され、ENIにはセキュリティグループがアタッチされる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;接続ログ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;オプションでCloudwatchLogsに接続ログを記録することができる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;接続ハンドラ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;接続時にLambda関数で任意のプログラムを実行して、接続の許可・拒否判定ロジックを実装できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;AWS Site-to-Site VPN&lt;/h5&gt;
&lt;p&gt;VPCに仮想プライベートゲートウェイをアタッチして、データセンターなどのオンプレミスのルーターと、インタネットプロトコルセキュリティ（IPSec）VPN接続が可能&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;仮想プライベートゲートウェイ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ASN（自律システム番号）を指定することもできる&lt;/li&gt;
&lt;li&gt;指定しない場合はAmaxonのデフォルトASN（64512）が使用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;カスタマーゲートウェイ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;オンプレミス側のルーターなどのこと&lt;/li&gt;
&lt;li&gt;動的ルーティングでは、BGP（ボーダーゲートウェイプロトコル）ASNの指定が可能&lt;/li&gt;
&lt;li&gt;パブリックなASNが無い場合は、プライベートASNを指定できる&lt;/li&gt;
&lt;li&gt;証明書ベースではなく、事前共有キーで認証する場合は、インターネットから接続可能なIPアドレスが必要&lt;/li&gt;
&lt;li&gt;証明書ベースの認証をする場合は、AWS Certificate Managerにプライベート証明書をインポートして指定可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;静的ルーティングと動的ルーティング&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;カスタマーゲートウェイデバイスがBGPをサポートしている場合は動的ルーティング&lt;/li&gt;
&lt;li&gt;サポートしていない場合は静的ルーティングを選択&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;VPN接続&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Internet Key Exchangeバージョン2(IKEv2):暗号化のための共通鍵を交換する仕組み&lt;/li&gt;
&lt;li&gt;NATトラバーサル: オンプレミス側でNATルーターを介したVPN接続が可能&lt;/li&gt;
&lt;li&gt;デッドピア検出（DPD）：接続先のデバイスが有効かどうかを確認&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;複数のSite-to-SiteVPN接続&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1つの仮想プライベートゲートウェイから、複数のカスタマーゲートウェイにVPN接続を作成可能&lt;/li&gt;
&lt;li&gt;この設計はVPN CloudHubと呼ばれる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;冗長なSite-to-SiteVPN接続&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;カスタマーゲートウェイデバイスを冗長化する構成&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ソフトウェアVPN&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EC2インスタンスにソフトウェアVPNをセットアップして、インターネットゲートウェイ経由でVPN接続も可能&lt;/li&gt;
&lt;li&gt;次のような要件の場合利用
&lt;ul&gt;
&lt;li&gt;コンプライアンス要件により、接続両端を完全にコントロールする必要がある&lt;/li&gt;
&lt;li&gt;IPsec以外のVPNプロトコルが必要&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;AWS Direct Connect(DX)&lt;/h5&gt;
&lt;p&gt;ユーザーまたはパートナーのルーター（Customer Router）からDirect Connectのルーター（DX Router）に標準のイーサネット光ファイバーケーブルを介して接続するサービス&lt;/p&gt;
&lt;p&gt;この接続を使用して、VPCやAWSパブリックサービスへの仮想インターフェースを作成&lt;/p&gt;
&lt;p&gt;インターネットサービスプロバイダーを利用する必要なく、オンプレミス拠点間の専用線の代替として、AWSへの接続に使用できるサービス&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;接続&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;専用接続&lt;/li&gt;
&lt;li&gt;ホスト接続&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;VPNバックアップのDirectConnect&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;回復性レベル&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最大回復性：Direct Connectローケーション全体、またはロケーション内部に物理障害があっても、冗長化を継続できる回復性レベル&lt;/li&gt;
&lt;li&gt;高い回復性&lt;/li&gt;
&lt;li&gt;開発とテスト&lt;/li&gt;
&lt;li&gt;クラシック&lt;/li&gt;
&lt;li&gt;AWS Direct Connect フェイルオーバーテスト&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;仮想インターフェース&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWS Direct Connect接続を使用するには、仮想インターフェイス(VIF)が必要&lt;/li&gt;
&lt;li&gt;仮想インターフェイスの種類は以下（覚えておく）
&lt;ul&gt;
&lt;li&gt;プライベート仮想インターフェイス
&lt;ul&gt;
&lt;li&gt;オンプレミスのOSでEFSにマウントできる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;パブリック仮想インターフェイス
&lt;ul&gt;
&lt;li&gt;S3,DynamoDBにアクセスできる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;トランジット仮想インターフェイス
&lt;ul&gt;
&lt;li&gt;Direct Connect Gatewayに関連付けられたTransit Gatewayにアクセスできる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;LAG(Link Aggregation Group)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Direct Connect の料金&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ポート時間
&lt;ul&gt;
&lt;li&gt;容量、接続タイプによって時間料金が決まる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;データ転送
&lt;ul&gt;
&lt;li&gt;プライベートVIFの場合は、データ転送を行うAWSアカウントに課金される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Direct Connect 専用接続&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1,10,100Gbpsから選択可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Direct Connect ホスト接続&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;500Mbpsを選択可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Direct Connectのポート時間料金が発生するタイミング&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;接続確立していないが、接続が作成されてから９０日後から&lt;/li&gt;
&lt;li&gt;９０日経っていないが、Direct Connectエンドポイントとカスタマールーターの接続が確立されたときから&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;VPC ピア接続&lt;/h5&gt;
&lt;p&gt;VPCピア接続を使用することで、VPCが他のVPCとの接続をプライベートネットワークで行える&lt;/p&gt;
&lt;h5&gt;AWS Transit Gateway&lt;/h5&gt;
&lt;p&gt;最大5000のVPCやオンプレミス環境の接続を簡素化する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;VPCアタッチメント&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;VPN接続&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Direct Connectトランジット仮想インターフェイス&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Transit Gatewayピアリング接続&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Transit Gateway Network Manager&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Global Accelerator連携のVPN高速化&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Route 53 プライベートホストゾーンとRoute 53 Resolver&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Route 53 プライベートホストゾーン&lt;/li&gt;
&lt;li&gt;Route 53 Resolver&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2　マルチアカウント&lt;/h4&gt;
&lt;h5&gt;クロスアカウントアクセス&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;組織内でのクロスアカウントアクセス
&lt;ul&gt;
&lt;li&gt;複数のAWSアカウントに対して認証が必要な場合の管理&lt;/li&gt;
&lt;li&gt;IAMユーザは特定のAWSアカウントで管理&lt;/li&gt;
&lt;li&gt;組織内の各AWSアカウントにはIAMロールを作成&lt;/li&gt;
&lt;li&gt;AWS STSのAssume RoleアクションによってIAMロールから一時的認証情報を取得して使用&lt;/li&gt;
&lt;li&gt;信頼関係
&lt;ul&gt;
&lt;li&gt;誰がIAMロールに対して、sts:AssumeRoleを実行できるかを許可しているのが信頼関係&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;カスタムIDブローカーアプリケーション&lt;/h5&gt;
&lt;p&gt;クロスアカウントだけでなく、オンプレミスのアプリからも同様にSDKにより開発したプログラムでIAMロール二リクエストを実行することにより、一時的な認証情報を使用してAWSのサービスをアプリケーションから使用したり、マネジメントコンソールへのリダイレクトURLを生成できる&lt;/p&gt;
&lt;h5&gt;サードパーティ製品へのアクセス許可&lt;/h5&gt;
&lt;p&gt;外部のサービスに対して必要なリソースへの操作を許可することもできる&lt;/p&gt;
&lt;p&gt;ただし、「混乱した代理問題」が課題&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;※AWS作図くんの例&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;「混乱した代理問題」を解決するのが「外部ID」&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;AWS Directory Service&lt;/h5&gt;
&lt;p&gt;サーバー認証に、組織で管理している既存のActiceDirectoryを使用したいケースがある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AD Connector
&lt;ul&gt;
&lt;li&gt;オンプレミスのデータセンターなどで稼働しているActiveDirectoryの認証をそのまま使えるサービス&lt;/li&gt;
&lt;li&gt;AD Connectorを使えば、Amazon Workspaces, Amazon WorkDocs, Amazon WorkMail, Amazon QuickSightなどのAWSマネージドディレクトリと連携するサービスを、既存のADのユーザ情報で利用できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Simple AD
&lt;ul&gt;
&lt;li&gt;Samba 4 Active Directory Compatible Server&lt;/li&gt;
&lt;li&gt;最大５０００ユーザー
&lt;ul&gt;
&lt;li&gt;5000を超える場合はAWS Managed Microsoft ADを利用
&lt;ul&gt;
&lt;li&gt;また、他ドメインとの信頼関係、MFA（多要素認証）が必要な場合もAWS Managed Microsoft ADを使用する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AWS Directory Service for Microsoft Active Directory(AWS Managed Microsoft AD)
&lt;ul&gt;
&lt;li&gt;Microsoft Active Directoryのマネージドサービス&lt;/li&gt;
&lt;li&gt;5000を超えるユーザー&lt;/li&gt;
&lt;li&gt;他ドメインとの信頼関係&lt;/li&gt;
&lt;li&gt;MFA(他要素認証)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;IAMアイデンティティセンター（AWS SSOの後継）&lt;/h5&gt;
&lt;p&gt;複数のAWSアカウントとSalesforceやBOXなどの外部アプリケーションへのSSOが可能&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;IAMアイデンティティセンターの認証&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アイデンティティセンターディレクトリ
&lt;ul&gt;
&lt;li&gt;認証情報（ユーザ名、パスワード）をIAMアイデンティティセンターで管理、デフォルト設定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ActiveDirectory
&lt;ul&gt;
&lt;li&gt;AWS Managed Microsoft ADか、AD Connectorを選択できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;外部IDプロバイダー
&lt;ul&gt;
&lt;li&gt;Azure AD,Okta,OneLoginなど外部IDプロバイダーを使用できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWSアカウントへの許可セット&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IAMアイデンティティセンターで許可セットを作成して、AWSアカウントにSSOした際の権限を設定できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;外部アプリケーションの追加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;IAMアイデンティティセンターを使用しないケース&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;すでにAD FS(Active Directory Federation Services)や、認証だけでなくOkta、OneLoginのポータルサイトも使用している場合に、&lt;/li&gt;
&lt;li&gt;IAMアイデンティティセンターを使用せずに設定するケースもある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;AWS Organizations&lt;/h5&gt;
&lt;p&gt;AWS Organizationsを利用していない複数のアカウント環境では、次の重複作業が発生&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アカウント作成時にクレジットカード、電話番号などの登録&lt;/li&gt;
&lt;li&gt;各アカウントのIAMロールのポリシー設定&lt;/li&gt;
&lt;li&gt;請求管理&lt;/li&gt;
&lt;li&gt;CloudTrailなどのさまざまなサービスはアカウントごとの設定&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AWS Organizationsを利用した場合&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;AWS Organizations APIによるアカウント作成の自動化&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SCP(サービスコントロールポリシー)による組織単位のポリシー設定&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;一括請求管理&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;各AWSサービスとのサービス統合&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;アカウント作成の自動化&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;通常、あWSアカウントの作成時には、メールアドレス、パスワード、住所、電話番号、クレジットカードが必要&lt;/li&gt;
&lt;li&gt;SMSか通話での本人確認も必要&lt;/li&gt;
&lt;li&gt;Organizationsでは、既存アカウントを組織のメンバーアカウントとして招待できますが、新規メンバーアカウントもマネジメントコンソール、CLI、SDKから追加可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SCP(サービスコントロールポリシー)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Organizations組織でOUやアカウントに設定するポリシー&lt;/li&gt;
&lt;li&gt;予防コントロールとして、OUに所属するアカウント、またはアカウントでの権限を制限できる&lt;/li&gt;
&lt;li&gt;SCPはOUの階層において下のレベルへ継承される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SCPの許可リスト戦略&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SCPの拒否リスト戦略&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;一括請求（コンソリデーテッドビリング）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;１つの請求書、統合請求データ：コストと使用状況データを複数カウントに渡って複合的に分析できる&lt;/li&gt;
&lt;li&gt;合計量によるボリュームディスカウント：複数アカウントの合計容量による従量制の割引が受けられる&lt;/li&gt;
&lt;li&gt;リザーブドインスタンス（RI）、Savings Plansの共有
&lt;ul&gt;
&lt;li&gt;組織のアカウントの合計使用量にリザーブドインスタンス、Savings Plansを適用できるので選択しやすくなる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: Saving Plans &lt;a href=&quot;https://aws.amazon.com/jp/savingsplans/&quot;&gt;https://aws.amazon.com/jp/savingsplans/&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Savings Plans は、1 年または 3 年の時間単位で利用をコミットする代わりに、オンデマンド料金と比較して最大 72% の請求額の削減を可能にする柔軟な料金モデルです。&lt;/li&gt;
&lt;li&gt;AWS は 3 種類の Savings Plans を提供しています:
&lt;ul&gt;
&lt;li&gt;Compute Savings Plans&lt;/li&gt;
&lt;li&gt;EC2 Instance Savings Plans&lt;/li&gt;
&lt;li&gt;Amazon SageMaker Savings Plans&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS CloudFormation StackSets&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;複数リージョン、複数アカウントにスタックを作成して、変更・削除・管理できる機能&lt;/li&gt;
&lt;li&gt;Organizationsと統合することで、組織、OU、アカウントを指定して、スタックを作成・変更・削除できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS CloudTrail （ユーザのアクティビティやAPI使用量をトレース）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Organizations組織のマスターアカウントで、組織内のすべてのアカウントについてCloudTrailを有効化できる&lt;/li&gt;
&lt;li&gt;書き出されるS3オブジェクトのプレフィックスには組織IDが含まれる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Service Catalog&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IAMユーザ二CloudFormationスタックで作成されるリソースへの直接的なアクセス権限を与えられずに、事前に用意されたテンプレートからスタックを作成できる&lt;/li&gt;
&lt;li&gt;例えば、スタックによって作成されたEC2インスタンスなどのリソースには直接アクセスできませんので、決められたインスタンスタイプ以外を起動したり、セキュリティグループを勝手に変更することはできない&lt;/li&gt;
&lt;li&gt;管理者があらかじめテンプレートを&lt;strong&gt;製品&lt;/strong&gt;としてService Catalogに登録し、IAMユーザに許可する製品のリストをポートフォリオとして設定&lt;/li&gt;
&lt;li&gt;ポートフォリオはいわばIAMユーザにとってのサービスカタログメニューで、Organizations組織でOUを指定して共有できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Resource Access Manager(RAM)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Organizationsと連携して組織、OUとの共有が可能&lt;/li&gt;
&lt;li&gt;Transit Gateway、サブネット、Route53Resolverの転送ルールを複数アカウントで共有可能&lt;/li&gt;
&lt;li&gt;License Managerではソフトウェア・ライセンスを複数アカウントにまたがって管理&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Control Tower&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;複数アカウントのベストプラクティスであるランディングゾーンを児童構築する&lt;/li&gt;
&lt;li&gt;ランディングゾーンは、Organizations組織のベストプラクティス構成&lt;/li&gt;
&lt;li&gt;ログアカウントと監査アカウント
&lt;ul&gt;
&lt;li&gt;SecurityOUにログと監査のアカウントを作成&lt;/li&gt;
&lt;li&gt;ログアカウントにはCloudTrailとConfigのログが集約される
&lt;ul&gt;
&lt;li&gt;Athenaなどを使用して集約されたログを分析可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;監査アカウント
&lt;ul&gt;
&lt;li&gt;各アカウントのSNSトピックのサブスクライバーのLambda関数から、監査アカウントのSNSトピックへ通知がパブリッシュ（送信）される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;アカウトの追加、招待
&lt;ul&gt;
&lt;li&gt;アカウントは、Service Controlポートフォリオで作成されたAccountFactoryで新規作成、または追加ができる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;アカウント認証
&lt;ul&gt;
&lt;li&gt;Organizationsと連携するIAMアイデンティティセンターによって、各アカウントへのシングルサインオン設定が可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;コントロール（ガードレール）&lt;/li&gt;
&lt;li&gt;ダッシュボード
&lt;ul&gt;
&lt;li&gt;Control Tower ランディングゾーンは作成して終わりでなく、ダッシュボードで確認、設定が可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3　確認テスト&lt;/h4&gt;
&lt;h3&gt;第3章　ソリューション設計と継続的改善&lt;/h3&gt;
&lt;h4&gt;1　運用上の優秀性&lt;/h4&gt;
&lt;h5&gt;デプロイ関連サービス&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;この節では、リリース作業を自動化するAWSデプロイサービスと、サービスを活用することにより実現しやすくなったデプロイメントパターンを解説&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cloud9&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;統合開発環境（IDE）をブラウザさえあれば実行できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CodeGuru&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ソースコードのレビューによってバグや問題の抽出、パフォーマンスの最適化を自動化&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CodeStar&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CodePipeline、CodeCommit、CodeBuild、CodeDeployなどを組み合わせたCICDパイプライン&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CodeArtifact&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;パッケージを適切なアクセス権限でチーム内に公開、共有可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OpsWorks&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chef、Puppetの機能をマネージドで提供&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Codecommit&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;リポジトリのアクセス許可はIAMポリシーで制限可能&lt;/li&gt;
&lt;li&gt;リポジトリのソースコードなどのデータはKMSのAWSマネージドキーによってサードパーティ暗号化されている&lt;/li&gt;
&lt;li&gt;リポジトリへのアクセス履歴はCloudTrailによって記録&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS CodeBuild&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ビルド環境：AWSが用意したLinux、Windowsコンテナを選択したり任意のコンテナを用意したりもできる&lt;/li&gt;
&lt;li&gt;ソースコード：CodeCommit以外にもS3バケット、Github、Bitbucketが選択可能&lt;/li&gt;
&lt;li&gt;CodeBuildで実行される、テストやコンパイル、パッケージ作成、コンテナイメージ作成などはbuildspec.ymlに事前定義されたコマンドによって実行される&lt;/li&gt;
&lt;li&gt;作成されたパッケージ（アーティファクトファイル）は、指定したS3バケットへ保存されたり、buildspec.ymlに定義したdocker pushコマンドでアップロードしたECRリポジトリに保存される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS CodeDeploy&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EC2インスタンス、ECSのコンテナ、Lambda関数、オンプレミスサーバーへのデプロイを自動化するサービス&lt;/li&gt;
&lt;li&gt;EC2インスタンス・オンプレミスのデプロイ設定
&lt;ul&gt;
&lt;li&gt;AllAtOnce
&lt;ul&gt;
&lt;li&gt;正常なホストの最小数値：0&lt;/li&gt;
&lt;li&gt;一度にすべてのインスタンスにデプロイ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;HalfAtATime
&lt;ul&gt;
&lt;li&gt;正常なホストの最小数値：50%&lt;/li&gt;
&lt;li&gt;一度に最大半分のインスタンスにデプロイ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;OneAtAAtime
&lt;ul&gt;
&lt;li&gt;正常なホストの最小数値：１&lt;/li&gt;
&lt;li&gt;一度に１つのインスタンスにデプロイ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ECSのデプロイ設定
&lt;ul&gt;
&lt;li&gt;ECSで実行しているコンテナデプロイは、カナリアとリニアから選択可能&lt;/li&gt;
&lt;li&gt;Canary：最初一定の割合のみにリリースしたあと、指定した期間後に残りのリリースを完了&lt;/li&gt;
&lt;li&gt;Linear:最初一定の割合のみにリリースしたあと、指定した感覚でデプロイ対象を増分する
&lt;ul&gt;
&lt;li&gt;ECSCanary10Percent5Minutes:最初10%のみ移行、5分後に残り90%も移行&lt;/li&gt;
&lt;li&gt;ECSLinear10Percent1Minutes:すべての移行が完了するまで、1分ごとに10%ずつ移行&lt;/li&gt;
&lt;li&gt;ECSAllAtOnce:一度にすべてのコンテナにデプロイ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Lambdaのデプロイ設定
&lt;ul&gt;
&lt;li&gt;AWS Lambdaにはバージョン、エイリアスという機能がある&lt;/li&gt;
&lt;li&gt;バージョン：イミュータブルで開発後にバージョンを作成したら変更できない&lt;/li&gt;
&lt;li&gt;エイリアス：バージョンと紐づけ管理する&lt;/li&gt;
&lt;li&gt;こうすることで迅速なデプロイとロールバックが可能&lt;/li&gt;
&lt;li&gt;LambdaCanary10Percent5Minutes&lt;/li&gt;
&lt;li&gt;LambdaLinear10PercentEvery1Minutes&lt;/li&gt;
&lt;li&gt;LambdaAllAtOnce&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS CloudFormation&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;テンプレートをもとにAWSリソースをスタックという単位で作成する&lt;/li&gt;
&lt;li&gt;カスタムリソース
&lt;ul&gt;
&lt;li&gt;Resourcesにカスタムリソースを含めて任意のLambda関数を実行することができる&lt;/li&gt;
&lt;li&gt;カスタムリソースを使用してLambda関数を実行することによって、CloudFormationがサポートしていない処理や、必要な情報を動的に取得可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CloudFormationヘルパースクリプト
&lt;ul&gt;
&lt;li&gt;EC2インスタンスへデプロイするアプリケーション向けに、CloudFormationヘルパースクリプトが用意されている&lt;/li&gt;
&lt;li&gt;Amazon Linux AMIにはすでにインストールされていて、&lt;code&gt;/opt/aws/bin&lt;/code&gt;にある
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cfn-init&lt;/code&gt;: パッケージのインストール、ファイルの作成、サービスの開始などが可能&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cfn-signal&lt;/code&gt;: CreationPolicy、またはWaitConditionにシグナルを送信するために使用可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;スタックポリシー
&lt;ul&gt;
&lt;li&gt;スタックに含まれるリソースノ更新は、テンプレートの更新によって行う&lt;/li&gt;
&lt;li&gt;意図しない更新を防ぐためにはスタックポリシーを使用できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;DeletionPolicy（削除ポリシー）
&lt;ul&gt;
&lt;li&gt;スタック削除時に特定のリソースを保護することができる&lt;/li&gt;
&lt;li&gt;データベースやストレージを保護する際などに有効&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AWS CDK
&lt;ul&gt;
&lt;li&gt;ソースコードからCloudFormationテンプレートを生成することができる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS CodePipeline&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ソース、ビルド、デプロイのCI/CDパイプラインを自動化&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Elastic Beanstalk&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;開発者がすばやくAWSを使い始めることができるようにするサービス&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.ebextensions&lt;/code&gt;: EB CLIを実行するカレントディレクトリに、&lt;code&gt;.ebextensions&lt;/code&gt;ディレクトリを作成して、配下にconfigファイルを配置することで、アプリケーションのカスタマイズが可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;デプロイメントパターン&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ローリングデプロイ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;指定したバッチサイズ（インスタンス数、割合）ずつ更新デプロイします。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ブルー／グリーンデプロイ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;現在のアプリケーションバージョンをブルー&lt;/li&gt;
&lt;li&gt;新しいバージョンをグリーンとしてデプロイ&lt;/li&gt;
&lt;li&gt;リクエスト送信先を切り替えてリリース方法をブルー／グリーンデプロイと呼ぶ&lt;/li&gt;
&lt;li&gt;Route53を使用したデプロイ&lt;/li&gt;
&lt;li&gt;Application Load Balancerを使用したデプロイ&lt;/li&gt;
&lt;li&gt;EC2 Auto Scalingを使用したデプロイ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;モニタリング&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;AWS Healthイベント&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWSアカウントに影響を及ぼすイベントをモニタリングできる&lt;/li&gt;
&lt;li&gt;AWS Personal Health Dashboard
&lt;ul&gt;
&lt;li&gt;マネジメントコンソールにサインインんして、ダッシュボードとイベントログで、過去９０日のアカウント固有のイベントとパブリックイベントを確認可能&lt;/li&gt;
&lt;li&gt;問題のイベントタイプコードの例：&lt;/li&gt;
&lt;li&gt;アカウント通知のイベントタイプコードの例&lt;/li&gt;
&lt;li&gt;スケジュールされた変更のイベントタイプコードの例&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AWS Health API&lt;/li&gt;
&lt;li&gt;Service Health Dashboard
&lt;ul&gt;
&lt;li&gt;インターネット上の公開ページで、パブリックイベントを確認可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon CloudWatch&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;メトリクス、ダッシュボード&lt;/li&gt;
&lt;li&gt;アラーム&lt;/li&gt;
&lt;li&gt;以上検出&lt;/li&gt;
&lt;li&gt;CloudWatch Logs
&lt;ul&gt;
&lt;li&gt;AWSサービスうやCloudWatchエージェントによるアプリケーションログなどさまざまなログを収集できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CloudWatch Synthetics
&lt;ul&gt;
&lt;li&gt;CanaryというLambda関数を設定したスケジュールで実行し、指定したウェブページへ定期的に自動アクセス&lt;/li&gt;
&lt;li&gt;その時点のスクリーンショットの取得と、Webページに含まれるコンテンツのダウンロード時間などを記録&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CloudWatch RUM
&lt;ul&gt;
&lt;li&gt;RUM(リアルユーザモニタリング)は、エンドユーザの場所や使用デバイス別のパフォーマンスやエラー発生情報を収集、モニタリングできる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon VPCのモニタリング&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VPC Flow Logs
&lt;ul&gt;
&lt;li&gt;ENIへのインバウンド／アウトバウンドトラフィックに関する情報は、CloudWatchLogsまたはS3バケットへ送信可能&lt;/li&gt;
&lt;li&gt;VPC Flow Logsでは各種のAWS情報をモニタリング可能&lt;/li&gt;
&lt;li&gt;トラフィックミラーリング&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AWS X-Ray
&lt;ul&gt;
&lt;li&gt;アプリケーションの潜在的なバグとボトルネックを抽出&lt;/li&gt;
&lt;li&gt;X-RayのPutTrace Segments APIアクセ本により、実行時間やリクエストの成功失敗がX-Rayに送信される&lt;/li&gt;
&lt;li&gt;結果をサービスマップやトレース情報で確認可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SIEM on Amazon OpenSearch Sevice
&lt;ul&gt;
&lt;li&gt;SIEM(Security Information and Event Management)と呼ばれるログの収集、一元的なモニタリング、分析が可能なシステムを、&lt;/li&gt;
&lt;li&gt;Amazon OpenSearchServiceを中心として構築できる&lt;/li&gt;
&lt;li&gt;OpenSearch Dashboardsで可視化、分析可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;構成管理、メンテナンス&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;AWS Systems Manager
&lt;ul&gt;
&lt;li&gt;LinuxやWindowsのEC2インスタンス、オンプレミスサーバにSSMAgent(AWS Ssytems Managerエージェント)をインストールすることで、Systems Managerのマネージドインスタンス(管理対象)にできる&lt;/li&gt;
&lt;li&gt;Session Manager
&lt;ul&gt;
&lt;li&gt;セキュリティグループでSSHポートを許可する必要もキーペアを使用する必要も内&lt;/li&gt;
&lt;li&gt;ブラウザのSessionManagerからsudo可能なssm-userを使って対話式コマンドを実行可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;RunCommand
&lt;ul&gt;
&lt;li&gt;EC2、オンプレミスサーバーなどマネージドインスタンスに、コマンドドキュメントに事前定義されたコマンドを実行可能&lt;/li&gt;
&lt;li&gt;定形運用をドキュメント化して、Run Commandにより1回のみ実行したり、Lambdaから動的に実行するなども可能&lt;/li&gt;
&lt;li&gt;コマンド実行対象のインスタンスは、インスタンスID、タグ、リソースグループから指定可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;パッチマネージャ
&lt;ul&gt;
&lt;li&gt;マネージドインスタンスへのパッチ適用を自動化できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Automation
&lt;ul&gt;
&lt;li&gt;定義済みのオートメーションドキュメントを実行&lt;/li&gt;
&lt;li&gt;例）Health EventのEventBridge連携の自動アクションで紹介したAWS-RestartEC2Instanceの例を紹介
&lt;ul&gt;
&lt;li&gt;インスタンスIDとIAMロールがパラメータで定義されている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;OpsCenter
&lt;ul&gt;
&lt;li&gt;運用で発生した問題の確認やステータスを一言管理できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;AWS Config&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;AWSアカウント内のリソースの設定情報を収集する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ControlTowerによって組織内のアカウントすべてのリソースの設定情報を集約することもできます。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;設定変更の際にイベント通知&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;有効にしておいたルールによって組織で決められたルールやコンプライアンス要件に準拠しているかを確認できる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;非準拠になり修復する必要がある場合は、修復アクションを設定して自動修復することも可能&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;自動修復にはSystemsManagerAutomationを選択可能&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;S3バッチオペレーション&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;S3のオブジェクト管理機能にバッチオペレーションがある&lt;/li&gt;
&lt;li&gt;数十億のオブジェクトを大規模に管理可能&lt;/li&gt;
&lt;li&gt;S3バッチオペレーションが使用するIAMロールには、batchoperations.s3.amazonaws.comからの信頼ポリシーが必要&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2　セキュリティ&lt;/h4&gt;
&lt;h5&gt;ルートユーザーの保護&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ルートユーザはIAMポリシーを設定できず、すべてのアクションが可能&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ルートユーザは基本的に使用せず、複雑なパスワードとMFAを設定して保護しておくこと&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メールアドレスは個人に紐づくものではなく、企業のエイリアスやメーリングリストを使用する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ルートユーザーにしかできないタスク&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アカウント設定の変更：アカウント名、Eメールアドレス、パスワードの変更&lt;/li&gt;
&lt;li&gt;アクセスキーの作成：ルートユーザーにもアクセスキーを作成できますが非推奨なので作成しないこと&lt;/li&gt;
&lt;li&gt;請求情報へのIAMアクセスの有効化：有効化したあとはIAMユーザー、IAMロールに請求情報へのアクションをポリシーで許可できる&lt;/li&gt;
&lt;li&gt;MFA Delete：S3バケットのMFA Deleteを設定&lt;/li&gt;
&lt;li&gt;S3バケットポリシーの修復：誰もアクセスできないS3バケットポリシーを設定してしまった場合は、ルートユーザーによって削除、編集可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ルートユーザ使用時に通知する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GuardDutyで検知
&lt;ul&gt;
&lt;li&gt;Amazon GuardDuty→AmazonEventBridge→AmazonSNS&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;最小権限の適用&lt;/h5&gt;
&lt;p&gt;IAM Access Analyzer: 最小権限の原則を適用するために便利なサービス&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;IAM Access Analyzer&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;外部に共有されているリソースの識別&lt;/li&gt;
&lt;li&gt;IAMポリシーの検証&lt;/li&gt;
&lt;li&gt;CloudTrailログに基づいたIAMポリシーの作成&lt;/li&gt;
&lt;li&gt;外部に共有されているリソースの識別
&lt;ul&gt;
&lt;li&gt;IAMロール、S3バケット、KMSキー、RDSスナップショットといったアカウントやパブリックなどのアカウント外部と共有可能なリソースを調べて、&lt;/li&gt;
&lt;li&gt;外部と共有されたリソースを検出する&lt;/li&gt;
&lt;li&gt;Organizationsの組織全体での検出が可能だが、リージョンごとに有効化する必要がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;IAMポリシーの検証
&lt;ul&gt;
&lt;li&gt;IAM Access AnalyzerはIAMポリシーの作成時に、セキュリティ・エラー・警告・提案の４つの視点で検証してくれる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CloudTrailログに基づいたIAMポリシーの作成
&lt;ul&gt;
&lt;li&gt;IAMユーザー、IAMロールが実行したリクエストのCloudTrailログを分析して、適切なIAMポリシーを生成してくれる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;アクセス許可の境界&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IAMユーザー、IAMロールを作成しポリシーを設定するユーザーが過剰な権限を適用することを防ぐ機能&lt;/li&gt;
&lt;li&gt;例）Lambda関数やEC2インスタンス向けのIAMロールを作成することを許可されたユーザがいるとする。
&lt;ul&gt;
&lt;li&gt;開発ユーザ自身はapp-bucketにアクセスすることは許可されているが、機密情報が保存されたsecure-bucketへのアクセスは許可されていない&lt;/li&gt;
&lt;li&gt;このとき、開発ユーザーがIAMロールとIAMポリシーを作成する際に、secure-bucketへのフルアクセス許可のあるIAMロールを作成下とすると、開発ユーザはIAMロールをEC2インスタンスに設定して、EC2インスタンス上でCLIなどでの操作でsecure-bucketへアクセスできてしまう&lt;/li&gt;
&lt;li&gt;だからといって、開発ユーザからIAMロールやIAMポリシーの権限を奪ってしまうと開発スピードが落ちる&lt;/li&gt;
&lt;li&gt;この問題を解決するのが&lt;strong&gt;アクセス許可の境界&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;アクセス許可の境界はIAMユーザー、IAMロールに追加で設定する管理ポリシーです。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;VPCのセキュリティ&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;VPCにおけるセキュリティ設定の基礎
&lt;ul&gt;
&lt;li&gt;ルートテーブル&lt;/li&gt;
&lt;li&gt;セキュリティグループ：ALB,EC2,ENIを保護するファイアウォール&lt;/li&gt;
&lt;li&gt;ネットワークACL：サブネットを保護するファイアウォール&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;AWS KMS&lt;/h5&gt;
&lt;p&gt;CMK(カスタマー管理キー)を管理して、データキーを生成・暗号化・復号するなど、復号化に必要なキー管理、キーオペレーションを提供するマネージド・サービス&lt;/p&gt;
&lt;p&gt;さまざまなAWSサービスとシームレスに統合することができる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;KMSキーの種類&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;カスタマー管理キー：AWSユーザーが作成、管理、完全に制御するキー。キーストレージ料金とリクエスト量に応じた料金が発生&lt;/li&gt;
&lt;li&gt;AWS管理キー：AWSが作成、管理するキー。特定のサービスを使用したり、暗号化するときに選択することで作成される。リクエスト量に応じた課金のみ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;エンベロープ暗号化&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;対象暗号化&lt;/li&gt;
&lt;li&gt;非対称暗号化&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;キーのローテーション&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;KMSキーには年ごとに自動ローテーション機能がある&lt;/li&gt;
&lt;li&gt;カスタマー管理キーでは、自動ローテーションはオプションで有効にできる&lt;/li&gt;
&lt;li&gt;AWS管理キーは自動ローテーションが矯正される&lt;/li&gt;
&lt;li&gt;有効にするとKMSは毎年新しいキーマテリアルを生成&lt;/li&gt;
&lt;li&gt;私達はキーIDを指定して暗号化／復号をするのみで、ローテーションされたキーマテリアルの指定は意識しない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;キーのエイリアス&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;カスタマー管理キーにはエイリアスが設定できる&lt;/li&gt;
&lt;li&gt;アプリケーションからはキーIDのかわりにエイリアスを指定してキーへのアクションを実行できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;キーのインポート&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;カスタマー管理キーの作成時にキーをインポート可能&lt;/li&gt;
&lt;li&gt;オンプレミスで作成したキーマテリアルをアップロードしてカスタマー管理キーとして使用できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;KMSをサポートするサービス&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWS Systems Manager Parameter Store&lt;/li&gt;
&lt;li&gt;AWS Secrets Manager&lt;/li&gt;
&lt;li&gt;Amazon DynamoDB
&lt;ul&gt;
&lt;li&gt;デフォルトはDynamoDBが管理するキーで暗号化出来る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Amazon EBS&lt;/li&gt;
&lt;li&gt;Amazon RDS
&lt;ul&gt;
&lt;li&gt;暗号化されていないRDSを暗号化するには：スナップショットを暗号化、暗号化されたスナップショットから復元すると同じ暗号化形式で復号化出来る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Amazon WorkSpaces&lt;/li&gt;
&lt;li&gt;Amazon EMR
&lt;ul&gt;
&lt;li&gt;ストレージにS3またはEBSを使用します&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Amazon Redshift
&lt;ul&gt;
&lt;li&gt;4階層のキーで暗号化される。KMSキー＞クラスターキー＞データベースキー＞データ暗号化キー＞クラスタ内のデータブロック&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Amazon S3
&lt;ul&gt;
&lt;li&gt;クライアントサイド暗号化
&lt;ul&gt;
&lt;li&gt;CSE-C&lt;/li&gt;
&lt;li&gt;CSE-KMS&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;サーバーサイド暗号化
&lt;ul&gt;
&lt;li&gt;SSE-S3&lt;/li&gt;
&lt;li&gt;SSE-KMS&lt;/li&gt;
&lt;li&gt;SSE-C&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;AWS CloudHSM&lt;/h5&gt;
&lt;p&gt;キー保存、暗号化を実行するハードウェアを物理的に専有するサービスが、AWS CloudHSM&lt;/p&gt;
&lt;p&gt;CloudHSMはFIPS 140-2レベル3に準拠している&lt;/p&gt;
&lt;p&gt;AWS KMSもFIPS 140-2レベル2に準拠しているが、レベル3が必要な場合はCloudHSMを選択&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CloudHSMの構成&lt;/li&gt;
&lt;li&gt;KMSカスタムキーストア&lt;/li&gt;
&lt;li&gt;CloudHSMのバックアップ&lt;/li&gt;
&lt;li&gt;CloudHSMのユースケース(TDE)&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;AWS Certificate Manager&lt;/h5&gt;
&lt;p&gt;パブリックなSSL/TSL証明書の保存、更新を提供する無料のサービス&lt;/p&gt;
&lt;p&gt;Croud Front,Elastic Load Balancer, API Gatewayと連携してユーザー所有のドメインの証明書を作成出来る&lt;/p&gt;
&lt;p&gt;所有者の確認はメール認証化、CNAME認証で行われる、発行済みの証明書をインポートすることも出来る&lt;/p&gt;
&lt;p&gt;ACMはサイトシールを提供していない&lt;/p&gt;
&lt;h5&gt;AWS Private Certificate Authority&lt;/h5&gt;
&lt;p&gt;プライベートな独自の証明機関(CA)階層を作成し、ユーザー、デバイス、アプリケーションなどの認証のプライベート証明書を作成可能&lt;/p&gt;
&lt;h5&gt;Amazon Cognito&lt;/h5&gt;
&lt;p&gt;Webアプリケーションやモバイルアプリケーションに安全に認証を提供するサービス&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cognitoユーザープール
&lt;ul&gt;
&lt;li&gt;サインアップ・サインインを短期間でアプリケーションに実装
&lt;ul&gt;
&lt;li&gt;認証基盤を開発しなくても、モバイルアプリケーションやWebアプリケーションからのサインアップ、サインインのために使用可能&lt;/li&gt;
&lt;li&gt;開発コストを下げて開発機関を短くするためにも有用&lt;/li&gt;
&lt;li&gt;Cognitoユーザープールのみで認証も可能、SNSなど外部での認証も可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;MFA、アドバンスドセキュリティ他
&lt;ul&gt;
&lt;li&gt;パスワードポリシー&lt;/li&gt;
&lt;li&gt;メールアドレス、電話番号の検証&lt;/li&gt;
&lt;li&gt;MFA(多要素認証)&lt;/li&gt;
&lt;li&gt;アドバンスドセキュリティ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Lambdaトリガー
&lt;ul&gt;
&lt;li&gt;サインアップイベント、サインインイベントをトリガーにAWS Lambda関数を実行できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;IDプール
&lt;ul&gt;
&lt;li&gt;モバイルアプリケーションやクライアントサイドJavaScriptが動作しているアプリケーションで、AWSのサービスに対して安全にリクエストを実行したい場合、CognitoIDプールを利用する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;AWS Secrets Manager&lt;/h5&gt;
&lt;p&gt;データベースなどの認証情報を保持し、取得にはSecrets ManagerへのAPIリクエストを使用します。&lt;/p&gt;
&lt;p&gt;認証情報のローテーション更新が必要となった際には、Secrets Managerがデータベースの認証情報を更新して保持します&lt;/p&gt;
&lt;p&gt;アプリケーションからはSecrets ManagerへGetSecretValueリクエストを実行することで、常に現在の認証情報を取得できるので、認証情報の再配布やそのための長時間に渡るシステムダウンタイムはない&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ローテーション戦略&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Amazon Inspector&lt;/h5&gt;
&lt;p&gt;EC2インスタンス、ECRコンテナイメージ、Lambda関数を自動的に検出して、脆弱性のスキャンを継続的に行い、レポートで可視化するサービスです。&lt;/p&gt;
&lt;p&gt;以前はInspector用のエージェントが必要で、EC2のみスキャン可能でしたが、そのバージョンはAmazon Inspector Classicになった&lt;/p&gt;
&lt;h5&gt;AWS WAF&lt;/h5&gt;
&lt;p&gt;Web Application Firewall&lt;/p&gt;
&lt;p&gt;CloudFront,APIGateway,ApplicationLoadBalancer,AppSync GraphQL API, Cognitoユーザープール、App Runnerへのリクエストに対応できる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWS WAFの構成と料金&lt;/li&gt;
&lt;li&gt;AWS WAFの代表的なマネージドルール&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;AWS Shield&lt;/h5&gt;
&lt;p&gt;DDoS攻撃から保護するサービスで、StandardとAdvancedがある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;AWS Shield Standardは無料で有効になり、AWSサービスへのベーシックなネットワークレイヤー攻撃を自動的に緩和する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Advancedは1ヶ月3000USDのサブスクリプションサービスで、Organizations組織で利用可能&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Shield Advancedで可能になること&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Shield Engagement Lambda&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DDoS攻撃を自動検知して、エスカレーションアクションを自動化する設計パターン&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;AWS Network Firewall&lt;/h5&gt;
&lt;p&gt;VPC向けのステートフルなマネージドネットワークファイアウォール及びIPSサービス&lt;/p&gt;
&lt;p&gt;Network Firewallはトラフィック量に応じて自動的にスケールし、複数のAZにエンドポイントをデプロイすることで高可用性を実現&lt;/p&gt;
&lt;h5&gt;AWS Firewall Manager&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;複数アカウントで以下を一元管理
&lt;ul&gt;
&lt;li&gt;AWS WAF&lt;/li&gt;
&lt;li&gt;AWS Shield Advanced&lt;/li&gt;
&lt;li&gt;VPCセキュリティグループ&lt;/li&gt;
&lt;li&gt;AWS Network Firewall&lt;/li&gt;
&lt;li&gt;Amazon Route53 Resolver DNSファイアウォール&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Amazon GuardDuty&lt;/h5&gt;
&lt;p&gt;CloudTrail,S3データログ、VPC Flow Logs、DNSクエリログを分析して脅威を抽出する&lt;/p&gt;
&lt;h5&gt;Amazon Macie&lt;/h5&gt;
&lt;p&gt;S3バケットに保存された機密データを機械学習とパターンマッチングで検出・監視出来る&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;参考
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.classmethod.jp/articles/introduce-to-amazon-macie/&quot;&gt;https://dev.classmethod.jp/articles/introduce-to-amazon-macie/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Macieは女の子の名前で「武器」「活発でスポーティで魅力的な人の代表名」という意味&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;AWS Security Hub&lt;/h5&gt;
&lt;p&gt;AWS Security Hubは、GuardDutyやMacieなどAWSのセキュリティサービスや外部のサードパーティサービスの検出結果を、AWS Security Finding形式という共通のJSONフォーマットに変換して結合する&lt;/p&gt;
&lt;h5&gt;Amazon Detective&lt;/h5&gt;
&lt;p&gt;GurardDutyの検出結果や、取り込んだログデータソースから、簡単に調査、原因の特定が行えるサービス&lt;/p&gt;
&lt;p&gt;例えば、いつもは呼び出されないAPIリクエストがいつもとは違う送信元から呼び出されたことがGuardDutyで検出されたとする。
Detectiveではその送信元から最初と最後の呼び出しや、合計時間、IAMロールなどに関連付けている他の検出結果など、調査二必要な情報を次々に確認出来る&lt;/p&gt;
&lt;h4&gt;3　信頼性&lt;/h4&gt;
&lt;h5&gt;災害対策&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;RPOとRTO&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RPO(Recovery Point Objective)：目標復旧時点&lt;/li&gt;
&lt;li&gt;RTO(Recovery Time Objective)：目標復旧時間&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;オンプレミスからのバックアップ＆リカバリー&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Storage Gateway&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;オンプレミスから主にS3などのAWSストレージサービスを透過的に使用するためのサービス&lt;/li&gt;
&lt;li&gt;ゲートウェイ種類
&lt;ul&gt;
&lt;li&gt;AmazonS3ファイルゲートウェイ&lt;/li&gt;
&lt;li&gt;ボリュームゲートウェイ&lt;/li&gt;
&lt;li&gt;テープゲートウェイ&lt;/li&gt;
&lt;li&gt;Amazon FSｘファイルゲートウェイ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;オンプレミスにデプロイする仮想イメージ
&lt;ul&gt;
&lt;li&gt;VMware ESXi&lt;/li&gt;
&lt;li&gt;Microsoft Hyper-V 2012R/2016&lt;/li&gt;
&lt;li&gt;Linux KVM&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS マルチリージョンのバックアップ＆リカバリー&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWSリージョンで稼働しているWEB層/アプリ層/DB層の3層システムの災害対策サイトを他のAWSリージョンにする例&lt;/li&gt;
&lt;li&gt;AMI,ESBは対象範囲がリージョンなので、クロスリージョンコピーをする必要がある&lt;/li&gt;
&lt;li&gt;DLM(Data Lifecycle Manager)で自動取得し、クロスリージョンコピーをスケジューリング出来る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Backup&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;システム全体のストレージ、データベースサービス之バックアップを一元管理して自動化出来る&lt;/li&gt;
&lt;li&gt;以前から各ストレージ之バックアップ機能（EBSのDataLifecycleManager、RDSの自動スナップショット、DynamoDBのAPIバックアップなど）はあったが、&lt;/li&gt;
&lt;li&gt;それらのスケジュールや世代管理はそれぞれで設定する必要があったが、この機能で一元管理が可能&lt;/li&gt;
&lt;li&gt;バックアップボールト
&lt;ul&gt;
&lt;li&gt;バックアップを管理する抽象的な入れ物&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;バックアッププラン
&lt;ul&gt;
&lt;li&gt;ルールとリソースを指定
&lt;ul&gt;
&lt;li&gt;ルール：バックアップスケジュール、保存世代、対象のボールトを指定&lt;/li&gt;
&lt;li&gt;リソース：同じリージョンの対象リソースタイプ（EBS、RDSなど）をすべて指定したり、特定のタグキーと値で限定したり出来る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;パイロットライト&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Web層やアプリ層はAMIとCloudFormationテンプレートを作成しておく&lt;/li&gt;
&lt;li&gt;災害発生時はスタックを作成して復旧&lt;/li&gt;
&lt;li&gt;RDSはクロスリージョンリードレプリカを作成しておき、障害発生時はマスターへ昇格し、スタンバイデータベースを作成&lt;/li&gt;
&lt;li&gt;DynamoDBはグローバルテーブルでレプリカを作成しておく&lt;/li&gt;
&lt;li&gt;※AWS Elastic Disaster Recovery: システムダウンタイム時間を最小に抑えながら、オンプレミスのサーバーをAWSへ復旧&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ウォームスタンバイ（最小構成のスタンバイ）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;パイロットライト構成に加えて、WEB層とアプリ層を最小構成で稼働させておく&lt;/li&gt;
&lt;li&gt;パイロットライトよりもRTOを短縮できるがコストが増加する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;マルチサイトアクティブ／アクティブ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;すべてのリソースを常時稼働させておく構成&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Global Accelerator&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;フェールオーバー時間をさらに短縮出来る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Fault Injection Simulator&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用意されたシナリオによる障害をAWSリソースに注入することで、災害をシュミレーション出来る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;疎結合化による信頼性の改善&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;外部API呼び出し処理を、SNSとSQSでファンアウト(Fanout)して、アプリケーションEC2インスタンスが行っていた処理をLambdaで実行&lt;/li&gt;
&lt;li&gt;順番を守るため、SNSトピックとSQSキューの両方でFIFOトピックとFIFOキューを選択しておく&lt;/li&gt;
&lt;li&gt;このような構成にすることで極力外部のAPIに依存しない設計にすることが出来る&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;データベースへのリクエスト改善&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;RDS Proxy&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;リフト&amp;amp;シフトからの信頼性の改善&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;WEB層、アプリ層をステートレスにすることで異なるリージョンでも切り替えられるようにする&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;EC2 Auto Scaling&lt;/h5&gt;
&lt;p&gt;EC2インスタンスを自動で増減する機能&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;スケーリングポリシー&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;スケールアウト・スケールインをいつ行うか、どのような状態になったら行うか、どうなりそうなら行うかを設定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;同期的設計&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;普通の３層設計&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;非同期的設計&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SQS+Lambdaを挟んだ設計&lt;/li&gt;
&lt;li&gt;※オフロード戦略：少ない処理を先に終わらせ、並列処理が必要なものを非同期で行う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SQSに基づくスケーリング&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;キューの属性ApporoximateNumberOfMessagesを取得&lt;/li&gt;
&lt;li&gt;Auto ScalingグループからのInService状態のインスタンス数を取得&lt;/li&gt;
&lt;li&gt;CloudWatchのPutMetricDataAPIで送信する。ココマdの処理を定期的に繰り返すLambda関数をデプロイする&lt;/li&gt;
&lt;li&gt;AutoScalingグループのスケーリングポリシーによって、PutMetricDataされたメトリクスのしきい値アラームに応じたスケールアウト・スケールインアクションが実行される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ファンアウト&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;fanout: 扇形に広がるという意味&lt;/li&gt;
&lt;li&gt;SNSトピック＋SQSキューで複数のキューにためて、複数のAutoScalingグループで処理させる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;優先処理を考慮したキュー&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SQSの優先度の高い方から取得して処理実施&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ライフサイクルフック&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;スケールアウト時にソフトウェアのデプロイを完全に完了したことを確認してからInServiceにしたり&lt;/li&gt;
&lt;li&gt;スケールイン時に必要なデータをコピー完了してからターミネートする場合などに利用できる
&lt;ul&gt;
&lt;li&gt;※一時的にPending:Wait状態にする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Amazon Route 53&lt;/h5&gt;
&lt;p&gt;パブリックまたはプライベートなホストゾーンやリゾルバーを提供するDNSサービス。ドメインの購入、管理も可能&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Route53ヘルスチェック
&lt;ul&gt;
&lt;li&gt;IPアドレスかドメインとポートを指定して、接続テストが実行可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;フェイルオーバールーティングポリシー
&lt;ul&gt;
&lt;li&gt;２つのリージョン間でDNSクエリに対して返すIPアドレスが変わる設定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;位置情報ルーティングポリシー
&lt;ul&gt;
&lt;li&gt;位置情報でルーティングを決める設定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;レイテンシールーティングポリシー
&lt;ul&gt;
&lt;li&gt;低いレイテンシーのレコードを返す設定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;AWS Service Quotas&lt;/h5&gt;
&lt;p&gt;AWSの各サービス使用量には制限がある&lt;/p&gt;
&lt;p&gt;調整可能な制限値と使用量が、現在のAWSアカウントでどうなっているかをAWS Service Quotasで確認可能&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;クォータモニタ(AWS Limit Monitor)
&lt;ul&gt;
&lt;li&gt;サービス使用量が制限に近づいているかのモニタリングを自動化するソリューション実装&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4　パフォーマンス&lt;/h4&gt;
&lt;h5&gt;EC2のパフォーマンス&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;インスタンスタイプ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;m6g.large
&lt;ul&gt;
&lt;li&gt;m:ファミリー&lt;/li&gt;
&lt;li&gt;6:世代&lt;/li&gt;
&lt;li&gt;g:追加機能&lt;/li&gt;
&lt;li&gt;large:サイズ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;新しい世代を選択したほうがコスト、パフォーマンスでメリットのある場合が多い&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;追加機能について&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;d: インスタンスストアが使用できる&lt;/li&gt;
&lt;li&gt;n: ネットワーク強化&lt;/li&gt;
&lt;li&gt;a: AMDプロセッサ搭載&lt;/li&gt;
&lt;li&gt;g: Gravitonプロセッサ搭載&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;インスタンスファミリー&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;汎用（T3,T4g,M5,M6g,A1など）：Web、アプリなど&lt;/li&gt;
&lt;li&gt;コンピューティング最適化（C5,C7g）：HPC,メディアトランスコード、機械学習推論など&lt;/li&gt;
&lt;li&gt;メモリ最適化（R5,R6g,X1）：大きなデータセット処理など&lt;/li&gt;
&lt;li&gt;高速コンピューティング（P4,G5,F1,Trn1）：機械学習推論、GPUグラフィックス処理など&lt;/li&gt;
&lt;li&gt;ストレージ最適化（I3,D3,H1）：ビックデータ処理など
&lt;ul&gt;
&lt;li&gt;覚え方参考）&lt;a href=&quot;https://qiita.com/cloud-solution/items/c8dd9ed491abd3360516&quot;&gt;https://qiita.com/cloud-solution/items/c8dd9ed491abd3360516&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;バーストパフォーマンスインスタンス&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;T2,T3,T3a,T4gインスタンスにはCPUバーストパフォーマンスがある&lt;/li&gt;
&lt;li&gt;通常はインスタンスサイズごとに決まっているベースラインまでのCPUが使えるが、ベースラインを超えてバースト可能&lt;/li&gt;
&lt;li&gt;ベースラインを超えるときにはCPUクレジットが消費され、ベースラインを下回っているときにはCPUクレジットが蓄積される&lt;/li&gt;
&lt;li&gt;CPU使用率がベースラインを超え続けるような使い方はバーストパフォーマンスインスタンスとしては不向きなので、M5などのインスタンスを検討する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;拡張ネットワーキング&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;現行世代を含むほとんどのインスタンスタイプでは、Elastic Network Adapter(ENA)がサポートされている&lt;/li&gt;
&lt;li&gt;起動時拡張ネットワーキングが有効になっている&lt;/li&gt;
&lt;li&gt;enaモジュールがインストールされていることを確認：&lt;code&gt;modinfo ena&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;ネットワークインターフェースドライバーの確認：&lt;code&gt;ethtool -i eth0&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ジャンボフレーム&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最大送信単位(MTU:Maximum Transmission Unit)は単一パケットで渡すことの出来る最大許容サイズのこと&lt;/li&gt;
&lt;li&gt;EC2ではすべてのインスタンスで1500MTUがサポートされている&lt;/li&gt;
&lt;li&gt;かつ、ほとんどのインスタンスで、9001MTU(ジャンボフレーム)がサポートされている&lt;/li&gt;
&lt;li&gt;イーサネットではMTUは1500バイトまでと規定されている&lt;a href=&quot;https://e-words.jp/w/MTU.html&quot;&gt;https://e-words.jp/w/MTU.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;プレイスメントグループ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ネットワークレイテンシを低くして、ネットワークパフォーマンスを向上させる選択肢としてプレイスメントグループがある
&lt;ul&gt;
&lt;li&gt;クラスタプレイスメントグループ
&lt;ul&gt;
&lt;li&gt;拡張ネットワーキング、ジャンボフレームで高いネットワークスループットを実現&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;パーティションプレイスメントグループ
&lt;ul&gt;
&lt;li&gt;パーティションというセグメントに配置し、各パーティションは異なるラックになる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;スプレッドプレイスメントグループ
&lt;ul&gt;
&lt;li&gt;1つ1つ異なるラックに配置され、1つのAZごとに7つまでインスタンス起動が可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;ストレージのパフォーマンス&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Amazon FSx for Lustre&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lustreという、大規模なHPC(ハイパフォーマンスコンピューティング)やスーパーコンピューターで使用されている分散ファイルシステムがある&lt;/li&gt;
&lt;li&gt;FSx for Lustreは、Lustreを簡単に効率よく起動出来る&lt;/li&gt;
&lt;li&gt;SSD、HDDからストレージを選択可能&lt;/li&gt;
&lt;li&gt;S3と統合することで、S3のオブジェクトをインポートすることも、S3にエクスポートすることも可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon S3のパフォーマンス最適化&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;S3マルチパートアップロードとダウンロード&lt;/li&gt;
&lt;li&gt;S3 Transfer Acceleration
&lt;ul&gt;
&lt;li&gt;離れた大陸や地域からアップロードが実行される場合、さまざまな影響を受けレイテンシーが高くなる可能性がある&lt;/li&gt;
&lt;li&gt;Transfer Accelerationを有効にすることで、全世界のエッジロケーションを経由してアップロードを実行出来る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon DynamoDBのパフォーマンス最適化&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;投票アプリケーションのように、まとめて集計するように全アイテムにアクセスすることが多く、書き込みの処理時間を短くする要件の場合はランダムサフィックスを検討&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Amazon CloudFront&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Webコンテンツの配信&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CloudFrontの配信設定のことをディストリビューションと呼ぶ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;オリジンへのアクセス制限&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OAC(Origin Access Control)
&lt;ul&gt;
&lt;li&gt;S3バケットがオリジンの場合は、OACが使用できる&lt;/li&gt;
&lt;li&gt;OACは2022年8月にリリースされた&lt;/li&gt;
&lt;li&gt;以前はOAI(Origin Access Identity)が使用されていたが、SSE-KMSに対応していなかったり、POST、PUTリクエストがそのままではできなかったりと課題があった&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;カスタムヘッダー
&lt;ul&gt;
&lt;li&gt;オリジンがALB等の場合に有効&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;IPアドレス制限&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;オンデマンドビデオ、ライブストリーミングビデオの配信&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;S3二アップロードされた動画をAWS Elemental MediaConvertによってHLSなどに変換して、配信用のS3バケットに保存し、&lt;/li&gt;
&lt;li&gt;CloudFrontディストリビューションから再生アプリケーションやデバイスへ配信&lt;/li&gt;
&lt;li&gt;AWS Elemental MediaLivで、リアルタイムにエンコードしたコンテンツをAWS Elemental MediaStoreに保存して、CloudFrontを使用して配信可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;フィールドレベルの暗号化&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;署名付きURLと署名付きCookieを使用したプライベートコンテンツの配信&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;エッジ関数&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CloudFrontディストリビューションへのHTTPリクエスト、レスポンスの処理をエッジ関数でカスタマイズ出来る&lt;/li&gt;
&lt;li&gt;エッジ関数には、CloudFront FunctionsとLambda@Edgeの２種類がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;AWS Global Accelerator&lt;/h5&gt;
&lt;p&gt;AWSグローバルネットワークを利用することで、AWSリージョンへのネットワーク経路を最適化、静的エニーキャストIPアドレスが提供される&lt;/p&gt;
&lt;p&gt;BYOIPとしてIPアドレスを持ち込むことも可能&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CloudFrontと似ている&lt;/li&gt;
&lt;li&gt;リージョンまたぎのLBみたいなものみたい&lt;/li&gt;
&lt;li&gt;参考）&lt;a href=&quot;https://qiita.com/miyuki_samitani/items/9a320888a833b4aed08c&quot;&gt;https://qiita.com/miyuki_samitani/items/9a320888a833b4aed08c&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Amazon ElastiCache&lt;/h5&gt;
&lt;p&gt;マネージドなインメモリのデータストアとして、Memcachced,Redisを提供&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MemcachedとRedis&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Amazon RDSのパフォーマンス&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;インスタンスクラス&lt;/li&gt;
&lt;li&gt;ストレージ&lt;/li&gt;
&lt;li&gt;リードレプリカ&lt;/li&gt;
&lt;li&gt;読み取り可能なスタンバイを備えたマルチAZ&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Amazon Aurora&lt;/h5&gt;
&lt;p&gt;MySQL,PostgreSQLと互換性のあるそれぞれのタイプを用意している、高いパフォーマンスデータベースエンジン&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;サーバーレス
&lt;ul&gt;
&lt;li&gt;Serverless V2を使用すると、インスタンスクラスを指定する必要はなく、ACU(Aurora Capacity Unit)の最小値、最大値を決めます&lt;/li&gt;
&lt;li&gt;開始して間もない、リクエスト量の読めないアプリに向いている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Amazon API Gateway&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;API Gatewayキャッシュ&lt;/li&gt;
&lt;li&gt;API エンドポイント
&lt;ul&gt;
&lt;li&gt;エッジ最適化APIエンドポイント&lt;/li&gt;
&lt;li&gt;リージョンAPIエンドポイント&lt;/li&gt;
&lt;li&gt;プライベートAPIエンドポイント&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;使用量プラン&lt;/li&gt;
&lt;li&gt;APIの認証
&lt;ul&gt;
&lt;li&gt;IAM認証&lt;/li&gt;
&lt;li&gt;Cognitoオーソライザー&lt;/li&gt;
&lt;li&gt;Lmabdaオーソライザー&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5　コスト最適化&lt;/h4&gt;
&lt;h5&gt;Amazon EC2のコスト&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;リザーブドインスタンス&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Savings Plansもあるが、リザーブドインスタンスも依然として有効な割引オプション&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;スポットインスタンス&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;各AZの各インスタンスタイプの使用されていない量によって決定されるスポット料金&lt;/li&gt;
&lt;li&gt;上限料金をリクエストして使用&lt;/li&gt;
&lt;li&gt;スポット料金が上限料金を超えた場合か、AZに利用可能なキャパシティがなくなった場合、スポットインスタンスは中断される
&lt;ul&gt;
&lt;li&gt;中断に備えたベストプラクティス
&lt;ul&gt;
&lt;li&gt;リクエスト料金にデフォルトのオンデマンドインスタンス料金を使用&lt;/li&gt;
&lt;li&gt;中断されたインスタンスのかわりにのインスタンスをすぐに起動できるように、AMI,起動テンプレートを準備しておく&lt;/li&gt;
&lt;li&gt;S3、DynamoDB、RDS、EFSなどにデータを保存する&lt;/li&gt;
&lt;li&gt;SQSからジョブメッセージを受信して処理をし、中断時には可視性タイムアウトによって他のインスタンスから再試行可能な構成にする&lt;/li&gt;
&lt;li&gt;中断前の処理が必要な場合、メタデータのポーリングかEventBridgeで検知し処理を完了させる&lt;/li&gt;
&lt;li&gt;Fault injection Simulatorでスポットインスタンス中断を発生させてアプリケーションをテストする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dedicated Hosts(専有ホスト)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;専用物理サーバにEC2インスタンスを起動出来る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Saving Plans&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1年または3年期間で時間あたりの使用料金を契約することで、割引料金で使用可能
&lt;ul&gt;
&lt;li&gt;EC2 Instance Savings Plans&lt;/li&gt;
&lt;li&gt;Compute Savings Plans&lt;/li&gt;
&lt;li&gt;SageMaker Savings Plans&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Amazon S3のコスト&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;S3ストレージクラス（S3標準とS3標準IA）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;S3 Intelligent-Tiering&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アップロード後の経過日数によってアクセス頻度の変化するパターンが一定でない場合、S3 Intelligent-Tieringを使用することでコスト最適化が可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;S3 リクエスタ支払い&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;リクエスト料金とデータ転送料金をリクエストした側のアカウントに請求するのが、リクエスタ支払い&lt;/li&gt;
&lt;li&gt;リクエスタ料金を有効にすると、AWSアカウント以外からのアクセスができなくなる&lt;/li&gt;
&lt;li&gt;&lt;code&gt;x-amz-request-payer&lt;/code&gt;をヘッダーに含めることで課金される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;S3 Storage Lens&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;複数アカウント、複数のS3バケットの使用状況をS3コンソールのダッシュボードで分析可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Amazon DynamoDBのコスト&lt;/h5&gt;
&lt;p&gt;DynamoDBのアイテムの読み込み・書き込みにはオンデマンドモードとプロビジョンドキャパシティモード&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;オンデマンドモード&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;書き込み、読み込みリクエストが発生するごとに料金が発生
&lt;ul&gt;
&lt;li&gt;書き込みは1KBの項目100万回あたりの料金：$1.4269&lt;/li&gt;
&lt;li&gt;読み込みは4KBの項目を強い整合性読み込みは100万回、結果整合性の読み込みは200万回分の料金：$0.285&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;プロビジョンドキャパシティモード&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1秒間の書き込み・容量に対して設定するWCU、読み込み回数・容量に対して設定するRCUを設定&lt;/li&gt;
&lt;li&gt;1WCU:1KB/1秒 1回&lt;/li&gt;
&lt;li&gt;1RCU:4KB/1秒 強い整合性1回 結果整合性2回&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;比較&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;プロビジョンドキャパシティモードの１時間あたりの料金に合わせた場合、オンデマンドモードでは５２０回リクエストが可能&lt;/li&gt;
&lt;li&gt;プロビジョンドキャパシティモードは１秒間に１回実行できるので、毎秒実行したとして３６００回実行可能のため、オンデマンドモードのほうが高くなる&lt;/li&gt;
&lt;li&gt;頻度が少ない場合や、急激なスパイクが発生する場合はオンデマンドモードのほうが優位性がある&lt;/li&gt;
&lt;li&gt;継続的なリクエストが発生して、ゆるやかな増減がある場合はプロビジョンドキャパシティモードのほうが良い&lt;/li&gt;
&lt;li&gt;請求モードは24時間に１回切り替えることが可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DynamoDB Accelerator(DAX)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VPC内でDynamoDBキャッシュ二アクセス出来る&lt;/li&gt;
&lt;li&gt;マイクロ秒での応答が必要なケースでDAXを検討する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;その他リザーブドオプション&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Amazon RDS&lt;/li&gt;
&lt;li&gt;Amazon ElastiCache&lt;/li&gt;
&lt;li&gt;Amazon Redshift&lt;/li&gt;
&lt;li&gt;Amazon Open Search Service&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;コスト配分タグ&lt;/h5&gt;
&lt;p&gt;タグをサポートしているリソースに適切なタグを設定することは、コスト分析、モニタリングに役立つ&lt;/p&gt;
&lt;p&gt;請求メニューのコスト配分タグで指定してアクティブにできる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Organizationsタグポリシー&lt;/li&gt;
&lt;li&gt;SCP：SCPで特定のリソース作成時にタグ付けを必須にする&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;AWS Cost Explorer&lt;/h5&gt;
&lt;p&gt;コストの使用状況のグラフビューを使用できる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コストの予測
&lt;ul&gt;
&lt;li&gt;日付範囲に未来の日付を含めることで予測を作成可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;予約とSavings Plans
&lt;ul&gt;
&lt;li&gt;使用状況だけでなく、予約の使用状況と過去実績に基づく推奨事項が確認可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;AWS Cost Anomaly Detection&lt;/h5&gt;
&lt;p&gt;支払いパターンをモニタリングしながら異常なコストを検出する&lt;/p&gt;
&lt;h5&gt;AWS Cost and Usage Repots&lt;/h5&gt;
&lt;p&gt;より詳細な課金の情報を、S3に保存されるCSV、Parquestデータで確認可能&lt;/p&gt;
&lt;p&gt;CSVデータを個別にダウンロードして確認、分析するのではなく、AthenaからSQLクエリで分析したり、さらにQuickSightを使用して可視化されたグラフのGUIで分析可能&lt;/p&gt;
&lt;h5&gt;AWS Budgets&lt;/h5&gt;
&lt;p&gt;AWSアカウント、Organizations組織にまたがった全体の予算や、特定の条件でフィルタリングした条件での予算を作成出来る&lt;/p&gt;
&lt;h5&gt;請求アラーム&lt;/h5&gt;
&lt;p&gt;アカウントの請求設定で、「請求アラートを受け取る」オプションを有効にしていると、バージニア北部のCloudWatchで請求アラームを設定可能&lt;/p&gt;
&lt;h5&gt;マネージドサービスの利用&lt;/h5&gt;
&lt;p&gt;AWSの請求だけがコストではない、EC2はOSの運用管理も必要&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EC2中心のアーキテクチャからサーバーレスアーキテクチャへ&lt;/li&gt;
&lt;li&gt;NATインスタンスをNATゲートウェイに変更する
&lt;ul&gt;
&lt;li&gt;NATゲートウェイは、内部的な冗長化、復元可用性を持っている&lt;/li&gt;
&lt;li&gt;NATインスタンスは、送信先・送信元チェックを無効化したEC2インスタンス&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;データ転送料金の削減&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;NATゲートウェイの料金削減&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;時間利用料金とデータ処理料金が発生&lt;/li&gt;
&lt;li&gt;データ処理料金はデータ量に応じて増加する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メディア配信コストの最適化&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;AWS Compute Optimizer&lt;/h5&gt;
&lt;p&gt;EC2,AutoScalingグループ,EBSボリューム,Lambda関数,Fargate(ECS)に付いて、使用率メトリクスを分析し、リソースサイズの選択が最適化どうかレポートして、コスト削減とパフォーマンスに関する推奨事項を提供&lt;/p&gt;
&lt;h4&gt;6　確認テスト&lt;/h4&gt;
&lt;h3&gt;第4章　移行とモダナイゼーションの加速&lt;/h3&gt;
&lt;h4&gt;1　移行評価とアプローチ&lt;/h4&gt;
&lt;h5&gt;7つのR&lt;/h5&gt;
&lt;p&gt;移行する際の考え方についての７つのRが公開されている&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Refactor
&lt;ul&gt;
&lt;li&gt;アプリケーションをフルにカスタマイズ出来るケース&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Replatform
&lt;ul&gt;
&lt;li&gt;アプリケーションのカスタマイズは行わない&lt;/li&gt;
&lt;li&gt;オンプレミスで利用している成約はそのまま引き継ぐ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Repurchase
&lt;ul&gt;
&lt;li&gt;これまで組織で構築し運用していたシステムをSaaSなどに変更する方法&lt;/li&gt;
&lt;li&gt;例）サーバーに構築していたRedmineをBacklogやJiraなどのSaaSに変更するケース、社内メールサーバをクラウドメールサーバーに変更するなど&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Rehost
&lt;ul&gt;
&lt;li&gt;シンプルな載せ替えのこと&lt;/li&gt;
&lt;li&gt;アンマネージドサービスであるEC2を中心に構成&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Relocate
&lt;ul&gt;
&lt;li&gt;VMware Cloud on AWSの使用を開始し、そのままAWSへ移行する手段&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Retain
&lt;ul&gt;
&lt;li&gt;検討した結果オンプレミスのままというビジネス判断をしたもの&lt;/li&gt;
&lt;li&gt;システムを見直すいい機会になった&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Retire
&lt;ul&gt;
&lt;li&gt;移行を検討する段階で、不要なシステムやインフラがあれば、Retire(廃止)します&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;移行評価支援のサービス&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;AWS Cloud Adoption Readiness Tool(CART)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;クラウド支援準備ツール&lt;/li&gt;
&lt;li&gt;６つのパースペクティブについての質問に答えることで準備状況に関する大まかな推奨事項のレポートを生成&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cloudreadiness.amazonaws.com/#/cart&quot;&gt;https://cloudreadiness.amazonaws.com/#/cart&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Application Discovery Service&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;オンプレミスのサーバーの使用状況や設定データを収集することでAWSへの移行計画をサポート&lt;/li&gt;
&lt;li&gt;AWS Migration Hubに統合されており、収集した情報はAWS Migration Hubで確認できる&lt;/li&gt;
&lt;li&gt;WindowsやLinuxにインストール出来るエージェント型&lt;/li&gt;
&lt;li&gt;VMware向けのエージェントレスコネクタ型&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;データ、アプリケーション移行のサービス&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;AWS Snowファミリー&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Snowcone&lt;/li&gt;
&lt;li&gt;Snowball Edage Storage Optimized(ストレージ最適化)&lt;/li&gt;
&lt;li&gt;Snowball Edage Compute Optimized(コンピューティング最適化)&lt;/li&gt;
&lt;li&gt;Snowball Edage Compute Optimized with GPU(コンピューティング最適化GPU)&lt;/li&gt;
&lt;li&gt;Snowmobile
&lt;ul&gt;
&lt;li&gt;エクサバイト規模のデータ転送をサポートする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS DataSync&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;オンプレミスなどのデータをS3,EFS,FSxへ安全かつ高速に転送するサービス&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Application Migration Service(MGN)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;オンプレミスサーバをAWSに移行するサービス&lt;/li&gt;
&lt;li&gt;MGNの料金
&lt;ul&gt;
&lt;li&gt;90以内に移行が完了したサーバーにはコスト発生なし&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Database Migration Service(DMS)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;データベースの移行サービス&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2　移行後アーキテクチャとモダナイゼーション&lt;/h4&gt;
&lt;p&gt;クラウドジャーニー：移行してからクラウドの最適化を勧め、継続的な改善が出来る状態にしていくこと&lt;/p&gt;
&lt;h5&gt;コンテナ&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Amazon ECS(Amazon Elastic Container Service)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;クラスタ、タスク定義、サービスの設定があり、コンテナイメージの保存先としてECRも利用できる&lt;/li&gt;
&lt;li&gt;Amazon ECR(Amazon Elastic Container Registry)
&lt;ul&gt;
&lt;li&gt;コンテナイメージを管理するレジストリ&lt;/li&gt;
&lt;li&gt;ECS,EKS,App Runnerなどのコンテナ実行サービスから使用できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ECS クラスタ
&lt;ul&gt;
&lt;li&gt;コンテナを実行するためのサービスとタスクのグループがクラスタ&lt;/li&gt;
&lt;li&gt;組織のチームや部門ごとに分けたり、アクセス権限やコストで分離したりする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;タスク定義
&lt;ul&gt;
&lt;li&gt;コンテナイメージ、タスクサイズ、使用するポート、コンテナタスクがAWSサービスへのアクセスを許可するためのIAMロール、コンテナを実行するためのIAMロール、環境変数、ログ記録などを定義&lt;/li&gt;
&lt;li&gt;JSONで直接記述することも可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;サービス
&lt;ul&gt;
&lt;li&gt;実行するタスク定義、コンテナを配置するVPC、サブネット、セキュリティグループ、スケーリングポリシー、ALBのターゲットブループ、インフラストラクチャなどが設定出来る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;起動タイプトキャパシティプロバイダー
&lt;ul&gt;
&lt;li&gt;起動タイプ：AWS FargateとEC2のどちらで実行するか選択可能
&lt;ul&gt;
&lt;li&gt;Fargateでコンテナを起動すれば、OS、クラスタの可用性、ソフトウェアの管理が必要なくなり、コンテナの実行に集中出来る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;キャパシティプロバイダー
&lt;ul&gt;
&lt;li&gt;より詳細にコントロール出来るコンテナの実行環境&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ネットワークモード&lt;/li&gt;
&lt;li&gt;ECSイベントストリーム&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Proton&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コンテナの実行環境を環境テンプレートとサービステンプレートに分けて、自動構築、管理出来るサービス&lt;/li&gt;
&lt;li&gt;環境テンプレート：VPC、IAMロール、ECSクラスタなどが作成&lt;/li&gt;
&lt;li&gt;サービステンプレート：ALB、ECSタスク、ECSサービス、ECR、CodePipleineが作成&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon EKS(AMazon Elastic Kubernetes Service)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コンテナオーケストレーションのためのオープンソースソフトウェアのマネージドサービス&lt;/li&gt;
&lt;li&gt;EKSでもEC2起動タプとFargateを使用できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS App Runner&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Githubのそー＾すリポジトリまたはECRイメージからアプリケーションを継続的にデプロイ、運用出来る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Managed Service for Prometheus&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prometheusとの互換性を持つモニタリングサービス&lt;/li&gt;
&lt;li&gt;コンテナによって構築されたマイクロサービスと相性の良いモニタリングソフトウェア&lt;/li&gt;
&lt;li&gt;Prometheusクエリ言語を使用して、コンテナで構築されたサービスのモニタリングとアラートを出せます&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Managed SErvice for Grafana&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Grafanaのフルマネージドサービス&lt;/li&gt;
&lt;li&gt;KibanaやOpenSearch Dashboardsのようにさまざまなデータソースを可視化、分析できるダッシュボード&lt;/li&gt;
&lt;li&gt;Prometheusもデータソースとして使用可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Amazon Kinesis&lt;/h5&gt;
&lt;p&gt;ストリーミングデータを扱うサービス&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Amazon kinesis DataStreams
&lt;ul&gt;
&lt;li&gt;ストリームデータを収集して順番通りにリアルタイム処理を実現する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Amazon Kinesis Firehose
&lt;ul&gt;
&lt;li&gt;大量のデータを、指定した送信先へ簡単に送る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Amazon Kinesis Data Analytics
&lt;ul&gt;
&lt;li&gt;Kinesis Data Streams, Kinesis Data Firehoseのストリーミングデータをもとに、SQLクエリを使用して分析&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Amazon Kinesis Video Streams
&lt;ul&gt;
&lt;li&gt;動画ストリームをAWSに収集して、Amazon Rekognition Videoなどと連携してリアルタイムな動画分析が行える&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Amazon Managed Streaming for Apache Kafka(Amazon MSK)
&lt;ul&gt;
&lt;li&gt;マネージドなApache Kafkaを提供するサービス&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;S3を中心としたデータレイク&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;データレイク&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;クラウドに送信されたデータを収集して保存し、保存したデータを加工処理したり、分析処理したり、可視化したりします&lt;/li&gt;
&lt;li&gt;可視化された結果から気づきを得て、ビジネス戦略を練ったり、エンドユーザーに対して提案したりしている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Glue&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;フルマネージドなETL(Extract Transform Load)サービス&lt;/li&gt;
&lt;li&gt;S3のデータをGlueデータカタログでカタログ化し、これはAthenaやRedshift Spectrumでも使用可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Athena&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;S3内のデータをSQLを使用して簡単に分析出来るサービス
&lt;ul&gt;
&lt;li&gt;S3に保存した、CSV,JSON,ParquestなどのデータをSQLで分析する要件の場合は、まずAthenaを検討する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Lake Formation&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;データレイクの芝やい構築、きめ細やかなアクセス制限を設定出来る&lt;/li&gt;
&lt;li&gt;ブループリント
&lt;ul&gt;
&lt;li&gt;LakeFormationに用意されているブループリントを使用すると、RDSデータベース、CloudTrail、Application Load BalancerからS3へデータを収集するために必要なリソースを自動で作成可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Data Exchange&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;データプロバイダーが提供するデータ製品をS3バケットにインポート出来る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon AppFlow&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Salesforce、ServiceNow,Slack,Datadog,Zendeskなど様々なSaaSサービスから、コード開発することなく、S3やRedshiftなどのAWSサービスへデータを連携でkリウ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon SageMaker&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;機械学習のトレーニングのための環境構築、作成した推論モデルのデプロイなどを提供しているサービスが、Amazon SageMaker&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Comprehend&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文章テキストから自動でキーワードを抽出したり、ネガティブ／ポジティブを判定したり出来る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Rekognition&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;画像、動画を分析できるサービス&lt;/li&gt;
&lt;li&gt;S3バケットにアップロードした画像データから顔を比較して個人を特定して顔認証を実現したり、写真内の要素を検出して自動でラベルを設定したりで着る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Forecast&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;S3に蓄積した過去の時系列データをもとに、将来予測を作成出来る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Fraud Detector&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;オンライン決済詐欺や偽アカウントによる不正を自動検知出来る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Kendra&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;S3,FSx,RDSなどのAWSサービスや、SaaSのストレージサービスの情報をインデックスして、自然言語検索サービスを構築できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Translate&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;翻訳サービスで、すぐに使い始めることも出来る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Polly&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;テキストを音声に変換するサービス&lt;/li&gt;
&lt;li&gt;言語ごとに男性・女性の音声が用意されていて、プロパティで選択できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Transcrive&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;音声をテキストに変換するサービス&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Textract&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;手書きのドキュメント化rあ自動で文字を抽出して、テキストデータに出来る&lt;/li&gt;
&lt;li&gt;OCRと呼ばれる技術に該当するサービスですが、従来のOCRのレベルにとどまらず、どこに書いてあっても自動で抽出出来る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Lex&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Alexaと同じ会話形AIチャットボットを作成出来る&lt;/li&gt;
&lt;li&gt;Amazon ConnectやKendraと連携して、サポートセンターを構築するのに役立つ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Amazon Simple Email Service&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SES受信&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Route53などのDNSサービスで、MXレコードをSESドメインに向けて設定する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SES送信&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;エンドユーザーからの問い合わせフォームや資料請求、ECサイトでの購入確認メールの送信など、取引における送信メールの自動化、マーケティング目的のダイレクトメールや、エンドユーザーへの一括アナウンスを自動化&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon PinPoint&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;マーケティングのためのサービス&lt;/li&gt;
&lt;li&gt;顧客にメール、ショートメッセージ、アプリケーションプッシュメッセージなどキャンペーンメッセージを送る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;AWS Transfer Family&lt;/h5&gt;
&lt;p&gt;S3バケット、EFSファイルシステムへのデータ保存に、SFTP、FTPS、FTPプロトコルを使用できる&lt;/p&gt;
&lt;h5&gt;IPアドレスに依存した設計&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Network Load BalancerにIPアドレスを固定する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;固定IPアドレスを持ち込んで設定出来る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Elastic Network Interface&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;プライベートIPアドレス、MACアドレスやセキュリティグループ、Elastic IPアドレスなどを紐づけておくことが出来る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Egress-Only インターネットゲートウェイ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VPCではIPv6を使用できる&lt;/li&gt;
&lt;li&gt;IPv４では、プライベートサブネットからインターネットへの出口にNATゲートウェイを使用するが、IPv６ではEgress-Onlyインターネットゲートウェイを使用する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;低遅延を実現するサービス&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;AWS Outposts&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWSのデータセンターで運用されているものと同様のハードウェア機器がラックサーバー単位で指定したオンプレミスデータセンターに設置される&lt;/li&gt;
&lt;li&gt;最も近い場所でAWSサービスを使用できるサービス&lt;/li&gt;
&lt;li&gt;物理的な管理はすべてAWSが実施&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Local Zones&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;リージョンの拡張&lt;/li&gt;
&lt;li&gt;リージョンよりもユーザーに近い拠点で一部のサービスを使用可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Wavelength&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;5Gねとワークの通信事業者のネットワークへの直接的なデータ送受信が可能になる&lt;/li&gt;
&lt;li&gt;日本ではKDDI5Gネットワークが利用できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;マネージドデータベース&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;目的別データベーストマネージドデータベース&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Neptune&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;グラフデータベースで、ノード同士の関係性を保存して検索する機能を提供&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon DocumentDB&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MongoDBと互換性を持ったマネージドデータベースサービス&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Keyspaces&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Apache Cassandra互換のマネージドデータベースサービス&lt;/li&gt;
&lt;li&gt;Cassandraクエリ言語、API、Cassandraドライバーをサポートしているので、これまで同様の開発者ツールを使える&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Timestream&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;時系列データを管理することに特化したマネージドデータベースサービス&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;マネージドアプリケーションサービス&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;AWS AppSync&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GraphQL APIとPub/Sub APIを高速に開発出来る&lt;/li&gt;
&lt;li&gt;DynamoDBテーブル、OpenSearch Serviceなどへ安全に接続してデータの読み書きが行える&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Device Farm&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アプリケーション二台する複数のブラウザ、複数のモバイルデバイスからのテストを実行&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3　確認テスト&lt;/h4&gt;
&lt;h3&gt;第5章　模擬テスト&lt;/h3&gt;
&lt;h4&gt;1　問題&lt;/h4&gt;
&lt;h4&gt;2　解答と解説&lt;/h4&gt;
&lt;h3&gt;X.確認テストまとめ&lt;/h3&gt;
&lt;h4&gt;2-3.確認テスト&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;２つのアカウントでクロスアカウントアクセス&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IAM チュートリアル: AWS アカウント間の IAM ロールを使用したアクセスの委任 - AWS Identity and Access Management
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html&quot;&gt;https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;外部IDの正しい使い方&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ADConnector&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;オンプレミスのActive Directoryを利用して、AWS　IAMアイデンティティセンターのIDソースにする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;S3ゲートウェイエンドポイント&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;追加料金不要でS3アクセス&lt;/li&gt;
&lt;li&gt;S3インターフェイスエンドポイントは追加料金がかかる&lt;/li&gt;
&lt;li&gt;PrivateLinkはインターフェースエンドポイントを実現している技術の名称&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PC端末からVPCにVPN接続する必要がある、どの方法が運用負荷がかからないか&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWS クライアントVPN&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;マネージドSite-to-SiteVPN接続を作成するために必要な要素&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;カスタマーゲートウェイ：オンプレミス側のIPアドレスなどの設定&lt;/li&gt;
&lt;li&gt;仮想プライベートゲートウェイ：VPC側二アタッチしてカスタマーゲートウェイとVPN接続&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;仮想プライベートゲートウェイのAWS site-to-siteVPN接続でサポートされている機能&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;デッドピア検出&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コンプライアンス要件によりVPN接続両端を完全にコントロールする必要がある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ソフトウェアVPN：EC2にソフトウェアVPNをインストr－うするので、インスタンスレベル、OSレベルでコントロール出来る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ISPを介さない500Mbpsの接続が必要&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Direct Connectホスト接続&lt;/li&gt;
&lt;li&gt;Direct Connect専用接続：1Gbps,10Gpbs,100Gbpsから選択する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DirectConnect ロケーション全体またはロケーション内部に物理障害があってもDirect Connectの冗長化を継続できる回復性は次のどれ？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最大回復性&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;S3,DynamoDBへの専用接続が必要&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;パブリック仮想インターフェース&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Direct Connectのポート時間料金が発生するのはどれ？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;接続確率していないが、接続が作成されてから90日後から&lt;/li&gt;
&lt;li&gt;90日経っていないが、Direct Connectエンドポイントとカスタマールーターの接続が確率されたときから&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;数十のVPCと複数のデータセンター拠点との複雑な接続が必要、運用負荷を軽減しルーティングの一元管理ができる？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Transit Gateway&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;複数リージョンでのTransit Gatewayを使った接続は次のどれで実現可能か？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Transit　Gatewayピア接続&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;オンプレミスト双方向のDNSアクセスを実現できるのは次の打ちどれか？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Route53 Resolver&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Organizationsを使用するメリットはどれ？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SCPによるOU単位でのセキュリティ管理&lt;/li&gt;
&lt;li&gt;一括請求による請求管理の簡易化とディスカウントオプションの適用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;予防コントロール、検出コントロール、ログ集約アカウント、監査アカウント、AWS IAMアイデンティティセンター連携などマルチアカウントの組織におけるベストプラクティスを自動で簡単に構築出来るOrganizationsと連携したサービスはどれ？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWS Control Tower&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3-6.確認テスト&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;CodeDeployでEC2インスタンスにアプリケーションをデプロイする直前にOSレベルでの処理を実行したい&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;appspec.ymlのBeforeInstallに処理を記述する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CloudFormationスタック之作成時にLambda関数を実行して追加の処理を実行したい&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;カスタムリソース
&lt;ul&gt;
&lt;li&gt;Lambda関数のARNを指定して実行出来る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CodeCommitとECRのどちらかが更新されたときに、ECSへのリリースをしたい&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CodePipelineのソースでCodeCommitとECRのそれぞれを設定して２つのEventBridgeルールによってCodePipleineが実行されるようにする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;EC2インスタンスのホストがリタイアする前に自動でEC2インスタンスのホストを変更したい&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWS_EC2_PERSISTENT_INSTANCE_RETIREMENT_SCHEDULEDイベントでSystems Manager Automationを呼び出して自動処理が可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS X-Ray で抽出できるもの&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アプリケーションのバグ&lt;/li&gt;
&lt;li&gt;アプリケーションのボトルネック&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;VPC内のトラフィックのパケット内容をモニタリング&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;トラフィックミラーリング&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;企業はLinuxでのSSH接続を止めることにした、どの手順が必要か？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EC2インスタンスが引き受けるIAMロール二Amazon SSM ManagedInstance Coreポリシーをアタッチし、IAMユーザはセッションマネージャを使用できるようにポリシー追加&lt;/li&gt;
&lt;li&gt;SSMエージェントがインストール済みのAMIを選択するか、EC2インスタンスにSSMエージェントをインストールする&lt;/li&gt;
&lt;li&gt;EC2インスタンスがSSMサービスへ通信できるようにネットワーク設定する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;複数のEC2インスタンスに効率的にかつ正確にOSレベルでのコマンドを実行したい&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RunCommand
&lt;ul&gt;
&lt;li&gt;複数のターゲットに事前定義したコマンドを一括で実行可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;特定のEC2インスタンスに特定のパッチを除外して、必要なパッチを適用する方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;パッチマネージャでベースラインを設定し、対象のEC2インスタンスにタグを設定し、RunCommandを実行する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;S3バッチオペレーションでできることを３つ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;オブジェクトロックの保持設定&lt;/li&gt;
&lt;li&gt;オブジェクトのコピー&lt;/li&gt;
&lt;li&gt;AWS Lambda関数の呼び出し&lt;/li&gt;
&lt;li&gt;すべてのオブジェクトタグを置換する&lt;/li&gt;
&lt;li&gt;すべてのオブジェクトタグを削除する&lt;/li&gt;
&lt;li&gt;アクセスコントロールリストを置き換える&lt;/li&gt;
&lt;li&gt;S3オブジェクトロックのリーガルホールド&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;なるべくコストを抑えてKMSをを利用したい&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWS管理キーを使用する
&lt;ul&gt;
&lt;li&gt;ストレージ料金分のコストが抑えられます&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;複数のアプリケーションサーバーで使用するパラメータを暗号化して保持したい&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;パラメータストア
&lt;ul&gt;
&lt;li&gt;システムズマネージャーパラメータストアのSecureStringを使用すれば、&lt;/li&gt;
&lt;li&gt;KMSのキーで暗号化される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用中のEBSボリュームを暗号化しなければならなくなった、どうしたらいい？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;スナップショットを作成して、スナップショットをもとに新規ボリュームを作成するときに暗号化を有効にする&lt;/li&gt;
&lt;li&gt;新しくできた暗号化ボリュームをEC2インスタンスにアタッチする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;特定のS3バケットでアップロードされるS3オブジェクトの保管時の暗号化設定が必要&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;バケットのプロパティでデフォルトの暗号化を設定する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;キー管理に専有ハードウェアと高可用性が必要、どの選択肢が最適？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CloudHSMクラスタを複数のAZを指定して起動し、HSMインスタンスを複数作成して使用する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Webアプリにユーザがhttps接続できるように証明書が必要、CloudFrontで配信している場合どうしたらいいか&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CloudFrontにACM(AWS Certificate Manager)の証明書を設定する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;開発するモバイルアプリにサインインする際にMFAが必要&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CognitoユーザープールでMFAを有効にする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;EC2インスタンスがビットコインのマイングに使用されている可能性があることなどの脅威を検出するサービス&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Amazon GuardDuty&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RDSデータベースで使用されているパスワードを毎月変更する必要がある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Secrets Managerシークレットに格納して自動ローテーションを有効にする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;組織は24時間365日対応のShield Response Team(SRT)を必要としています&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWS Shield Advanced&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;オンプレミスのストレージ容量を節約しながらオンプレミスのアプリケーション・サーバーからiSCSIで接続してデータを保存したい&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Storage Gatewayボリュームゲートウェイキャッシュモード&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;EC2のスケールインが実行される前に追加の処理が必要、どうすればいいか？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;インスタンス終了するときのライフサイクルフックを設定して、EventBridgeルールを作成し、処理するLambdaをターゲットに設定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;EC2同士のネットワークレイテンシを極力低くするためのオプションは？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;クラスタプレイスメントグループ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Auroraクラスタデータベースへの多くの接続とリクエストにより接続拒否が発生している。どうしたら改善されるか？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RDS Proxy: SQLリクエストが調整される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CloudFrontディストリビューションで配信するサイトのオリジンがS3バケットです。直接S3バケットへのリクエストは拒否したい&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;S3バケットポリシーでCloudFront OAC(OriginAccessControl)からのリクエストのみを許可する&lt;/li&gt;
&lt;li&gt;CloudFrontオリジン設定でOACを設定する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Global Acceleratorが提供するものは？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;グローバルな静的エニーキャストIPアドレス&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ElastiCache for Memcahedの特徴&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;マルチスレッドでの実行が可能&lt;/li&gt;
&lt;li&gt;自動検出機能によってノードを追加、削除する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Redisの方は？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ソート済みセット型をサポート&lt;/li&gt;
&lt;li&gt;アトミックオペレーションによりキャッシュ内のデータ値をINCR/DECRコマンドで増減&lt;/li&gt;
&lt;li&gt;永続性を持つ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;API Gatewayで呼び出されるLambdaの実行回数を減らしたい&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;API Gateway キャッシュを有効にする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;リザーブドインスタンスを１年契約しているが、期限切れになったときなるべき未適用期間が発生しないようにしたい&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;購入予約をキューに入れる
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ri-market-concepts-buying.html&quot;&gt;https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ri-market-concepts-buying.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;組織ではオンプレミスアプリケーションをEC2に移行したあと、1年を目標期間として、順次コンテナ化して、部分的にサーバレスアーキテクチャに変更することも予定している。可能化限り割引を適用したい&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Compute Savings Plans
&lt;ul&gt;
&lt;li&gt;EC2、Fargate、Lambdaに適用できるので、アーキテクチャを変更してもコンピューティングリソースの割引が受けられる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;EC2 Instance Savings Plans,EC2 Reserved Instance:EC2にしか適用できない&lt;/li&gt;
&lt;li&gt;SageMaker Savings Plan: Sagemakerインスタンスの割引プラン&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;S3 Intelligent-Tieringの特徴&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アクセスされないオブジェクトは自動的に低頻度階層へ移動し、自動的にコストが最適になる&lt;/li&gt;
&lt;li&gt;Glacier：アーカイブされるのでアクセスするときは取り出しに3～5時間かかる&lt;/li&gt;
&lt;li&gt;ライフサイクルルール：アップロードした日から設定した日数追加したオブジェクトがS3標準IAへ移動する&lt;/li&gt;
&lt;li&gt;オブジェクトロック：コンプライアンスモードではオブジェクトが削除から保護される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;S3オブジェクトに対してリクエストしたアカウントに請求が発生するようにしたい&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;リクエスタ支払いを有効にして、リクエスト側はx-amz-request-payerをリクエストに含める。リクエスト料金とデータ転送料金がリクエスト側に請求される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コストの異常検知をするには？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cost Anormaly Detectionでコストモニターを作成する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;課金状況に対して月ごとに増加する予算管理を死体&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コスト予算の月次予算設定で初期予算と成長率を入力する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Compute Optimize&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EC2インスタンスタイプ、Lambda関数のメモリ最適化レポートを確認出来る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4-3.確認テスト&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;AWS Application Migration Service&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;サーバー之継続移行が可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SCTでスキーマ変換してDMSでデータ移行する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Glue&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ETLツール&lt;/li&gt;
&lt;li&gt;S3バケットに格納されているJSONデータを変換して別のS3バケットに格納&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Outposts&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ユーザの敷地内でAWSサービスを実行できるラックを設置して低レイテンシを実現&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon MQ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Apache ActiveMQを提供するマネージドサービス&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5-1.模擬テスト（メモ）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;「ユーザー名をタグに設定しなければ作成できないように制限」しなければならない条件&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アクセス権の境界設定ポリシーが必要&lt;/li&gt;
&lt;li&gt;制限を超えた権限を持つIAMロールをEC2にアタッチしても、境界以上の権限は拒否出来る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;IAM Permissions boundary（アクセス権限の境界）で明示的に許可していないアクションでも条件次第で実行できるということを評価論理の流れを眺めて再認識してみた | DevelopersIO&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.classmethod.jp/articles/iam-policies-evaluation-logic-rikai/&quot;&gt;https://dev.classmethod.jp/articles/iam-policies-evaluation-logic-rikai/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;S3 RTC(Replication Time Control)を有効にすることで、ほとんどのオブジェクトは数秒でレプリケートされ、&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;99.99%のオブジェクトは15分以内にレプリケートされる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;15分のしきい値を超えたとき、イベント通知を作成可能&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Transfer Family&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;パブリックアクセス可能なSFTP対応サーバーではElastic IPアドレスは設定できない&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.classmethod.jp/articles/202210-aws-transfer-family-sftp/&quot;&gt;https://dev.classmethod.jp/articles/202210-aws-transfer-family-sftp/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon SESでエンドユーザーに対してメールを送信出来る&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メールのイベントは設定セットを作成してメール送信時のパラメータで指定することで、イベントをKinesis Data Firehoseに送信できます&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kinesis Data FirehoseはS3バケットへデータを送信出来る&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;S3バケットに送信されたデータはAthenaからSQLクエリで検索、抽出が可能&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;User-Agentなどのパケット内容はVPC Flow Logsでは調査できない&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;VPCトラフィックミラーリングを使用する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dedicated Hostsのアフィニティオプションを使うことで、ライセンス要件を満たせる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;問題16&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AuroraやRDSデータベースのスナップショットは、クラスタやインスタンスを暗号化しているKMSのCMK(カスタマーマスターキー)で暗号化される&lt;/li&gt;
&lt;li&gt;スナップショット化r復元する際は、CMKを使用する権限が必要&lt;/li&gt;
&lt;li&gt;CMKはエクスポートできない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;問題18&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DynamoDBに Saving Plansはない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;問題19&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Elastic IPアドレスをサポートしているのはNetwork Load Balancer&lt;/li&gt;
&lt;li&gt;API GatewayやApplication Load Balancerはサポートしていない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;問題23&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kinesis Data Analyticsを四王するとストリーミングデータを１秒未満のレイテンシーで処理出来る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;問題24&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Redisクラスタのライトスルー戦略&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;問題33&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IPv6アドレスを利用するには&lt;/li&gt;
&lt;li&gt;Egress-Onlyインターネットゲートウェイを使用することでアウトバウンド専用のネットワークを構築可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;問題34&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IAMユーザとMFA認証必須化&lt;/li&gt;
&lt;li&gt;TODO: 復習&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;問題36&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;サードパーティ製品ごとに外部ID&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;問題60&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kinesis Video Streams&lt;/li&gt;
&lt;li&gt;Rekognition Video&lt;/li&gt;
&lt;li&gt;倉庫の監視カメラの映像をリアルタイム分析して、人を検出した際に通知したい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;問題65&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ルートユーザーの認証に対して通知：RootCredentialUsageイベントで検知可能&lt;/li&gt;
&lt;li&gt;CloudTrailのログ集約と迅速な検索：１つのアカウントに集約して、Athenaでデータパーティション分割&lt;/li&gt;
&lt;li&gt;CloudTrailのログ改ざん検知：整合性検証オプションを有効にすればいい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;問題66&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Application Discovery Serviceは移行の判断や移行の計画を立てることに役立つ&lt;/li&gt;
&lt;li&gt;オンプレミスのサーバーにエージェントをインストールして情報を収集するエージェント型と&lt;/li&gt;
&lt;li&gt;VMWare向けのコネクタ型がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;問題68&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;FSx for Lustre:高速な共有ストレージ&lt;/li&gt;
&lt;li&gt;AWS Wavelenght:5Gネットワークの通信事業者のネットワークへの直接送受信&lt;/li&gt;
&lt;li&gt;AWS OutPuts:特定の場所にAWSサービスを構築&lt;/li&gt;
&lt;li&gt;AWS Local Zones:ユーザーに近い場所を選択できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;問題70&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;amazon-efs-utils(EFSマウントヘルパー)をインストールして、&lt;/li&gt;
&lt;li&gt;マウントヘルパーコマンドで、-o tlsオプションを付けてマウントする&lt;/li&gt;
&lt;li&gt;このときEFSファイルシステムIDを指定するので名前解決できている必要がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;問題72&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RDS Proxy: データベース接続プールの作成ト再利用により多くのリクエストを調整処理出来る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;メモ&lt;/h2&gt;
&lt;p&gt;AWS Connector for vCenter
AWS Step Functions
Timestream
Timestream は、高速でスケーラブルかつフルマネージドの専用時系列データベースであり、毎日何兆もの時系列データポイントを保存して分析することができます。Timestream は、リレーショナルデータベースよりも最大 1000 倍高速になることがあります。
https://docs.aws.amazon.com/timestream/latest/developerguide/what-is-timestream.html&lt;/p&gt;
&lt;p&gt;このソリューションは 2 部に分かれます。IAM Access Analyzer は CloudTrail ログを分析して、外部アクセスが許可されているかどうかを判断します。Macie は S3 バケットを分析して、パブリックオブジェクト、パブリックバケット、または機密情報が Amazon S3 にあるかどうかをチェックします。IAM Access Analyzer と Macie の調査結果は両方とも Security Hub で報告できます。Security Hub は Organizations と統合されているため、単一の Security Hub ダッシュボードを使用して、両方のセキュリティ問題を 1 か所でモニタリングできます。
IAM Access Analyzer と Security Hub の統合の詳細については、「AWS Security Hub との統合」を参照してください。
Security Hub との Macie 統合の詳細については、「Amazon Macie Integration with AWS Security Hub (AWS Security Hub との Macie 統合)」を参照してください。
Security Hub と Organizations との統合の詳細については、「AWS Security Hub: および AWS Organizations」を参照してください。&lt;/p&gt;
&lt;p&gt;SCP を使用できるようにするには、組織内のすべての機能を有効にする必要があります。&lt;/p&gt;
&lt;p&gt;AWS OutPosts サーバーとラックは異なるもの
https://engineers.ntt.com/entry/2023/03/24/095642&lt;/p&gt;
&lt;p&gt;EC2 Fleet&lt;/p&gt;
&lt;p&gt;S3 Transfer Acceleration は、CloudFront エッジロケーションと最適化されたネットワークパスを使用して、オブジェクトの転送を高速化します。
マルチパートアップロードは、チャンクを並列にアップロードすることで、大きなファイルを高速に転送します。この方法では、アップロードのスピードが向上し、失敗したアップロードの回復性が向上します。&lt;/p&gt;
&lt;p&gt;CloudWatch Synthetics を使用して、エンドポイントと API をモニタリングするために、スケジュールに従って実行される設定可能なスクリプトであるカナリアを作成できます。GET メソッドで API カナリアを作成して、サードパーティーサービスが期待どおりに応答しているかどうかを判断できます。Route 53 はアラームステータスを追跡でき、必要に応じてセカンダリリージョンにフェイルオーバーできます。
Amazon Timestream は、高速でスケーラブルな、サーバーレスの時系列データベースです。Timestream には、時系列関数をサポートし、消費者行動の傾向を特定するのに役立つ組み込みの時系列分析があります。Timestream は数百テラバイトのデータを保存できます。Timestream は、最新データのメモリストアと履歴データの磁気ストアにより、データライフサイクル管理を簡素化します。Timestream は、受信データに対してリアルタイム分析を実行するために、クエリを定期的かつ自動的にスケジュールできます。このソリューションはすべての要件を満たしています。
AWS PrivateLink VPC間のIPが被っても接続可能&lt;/p&gt;
&lt;p&gt;Amazon QuickSightからAmazon Athenaに接続&lt;/p&gt;
&lt;p&gt;Amazon WorkSpaces&lt;/p&gt;
</content:encoded></item><item><title>Excelで学ぶ ビジネスデータ分析の基礎</title><link>https://tutttuwi.github.io/posts/2023-02_excel%E3%81%A7%E5%AD%A6%E3%81%B6_%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%81%AE%E5%9F%BA%E7%A4%8E/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2023-02_excel%E3%81%A7%E5%AD%A6%E3%81%B6_%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%81%AE%E5%9F%BA%E7%A4%8E/</guid><pubDate>Sun, 26 Feb 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Excelで学ぶ ビジネスデータ分析の基礎&lt;/h1&gt;
&lt;h2&gt;理解したこと&lt;/h2&gt;
&lt;h2&gt;書籍サイト&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://aoten.jp/store/detail.html?no=a1500i_b171113&quot;&gt;https://aoten.jp/store/detail.html?no=a1500i_b171113&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;ダウンロード&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://stat.odyssey-com.co.jp/book/statex_basic/&quot;&gt;https://stat.odyssey-com.co.jp/book/statex_basic/&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;書籍情報&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;商品の特長
本書は、ビジネスの現場でさまざまなデータを活用するための基本的な知識とExcelを使用したデータ分析の方法を解説した書籍です。義務教育の算数・数学レベルを習得していれば、十分理解して実践できる内容になっています。統計分析の実務やデータの見方を習得したい学生、ビジネスパーソン、マネージャー、経営者の方を対象としています。
また本書は、資格試験『ビジネス統計スペシャリスト エクセル分析ベーシック』の出題範囲を網羅しており、試験対策テキストとしてもご利用いただけます。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;内容は大きく3つの部門に分かれており、全15章で構成されています。章が進むにつれて、より高度な分析方法を習得できるようになり、ビジネス実務におけるデータ分析の理解と実践的な力が身につけられます。また、各章の最後には章末問題があり、学習した内容の理解度を確認できます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;目次
[ビジネスデータ把握力 編]
第1章 平均値｜第2章 中央値｜第3章 最頻値｜第4章 レンジ｜第5章 標準偏差&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;[ビジネス課題発見力 編]
第6章 外れ値の検出｜第7章 度数分布表｜第8章 標準化｜第9章 移動平均｜第10章 季節調整&lt;/p&gt;
&lt;p&gt;[ビジネス仮説検証力 編]
第11章 集計｜第12章 散布図｜第13章 相関｜第14章 回帰分析｜第15章 最適化&lt;/p&gt;
&lt;h3&gt;[ビジネスデータ把握力 編]&lt;/h3&gt;
&lt;h4&gt;第1章 平均値&lt;/h4&gt;
&lt;h4&gt;第2章 中央値&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;外れ値(他のデータと大きく異なる値)の影響を受けにくい&lt;/li&gt;
&lt;li&gt;データの個数が偶数の場合は２つの値の平均を取る&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;第3章 最頻値&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;modeと呼ばれる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;modeに流行り、流行のような意味合いがあり最頻値と結びついてそう&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MODE.MULT,MODE.SNGLの違い&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.eurus.dti.ne.jp/~yoneyama/Excel/kansu/mode.htm&quot;&gt;http://www.eurus.dti.ne.jp/~yoneyama/Excel/kansu/mode.htm&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;MULT: マルチの意味で複数の最頻値を返却する&lt;/li&gt;
&lt;li&gt;SNGL: シングルの意味で単一の最頻値を返却する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;代表値&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;平均値&lt;/li&gt;
&lt;li&gt;中央値&lt;/li&gt;
&lt;li&gt;最頻値
&lt;a href=&quot;https://atmarkit.itmedia.co.jp/ait/articles/2109/15/news033.html&quot;&gt;https://atmarkit.itmedia.co.jp/ait/articles/2109/15/news033.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;第4章 レンジ&lt;/h4&gt;
&lt;p&gt;データが分布している範囲を表す&lt;/p&gt;
&lt;h4&gt;第5章 標準偏差&lt;/h4&gt;
&lt;h3&gt;[ビジネス課題発見力 編]&lt;/h3&gt;
&lt;h4&gt;第6章 外れ値の検出&lt;/h4&gt;
&lt;h4&gt;第7章 度数分布表&lt;/h4&gt;
&lt;h4&gt;第8章 標準化&lt;/h4&gt;
&lt;h4&gt;第9章 移動平均&lt;/h4&gt;
&lt;h4&gt;第10章 季節調整&lt;/h4&gt;
&lt;h3&gt;[ビジネス仮説検証力 編]&lt;/h3&gt;
&lt;h4&gt;第11章 集計&lt;/h4&gt;
&lt;h4&gt;第12章 散布図&lt;/h4&gt;
&lt;h4&gt;第13章 相関&lt;/h4&gt;
&lt;h4&gt;第14章 回帰分析&lt;/h4&gt;
&lt;h4&gt;第15章 最適化&lt;/h4&gt;
</content:encoded></item><item><title>Linux教科書_LinuCレベル2Version10.0対応</title><link>https://tutttuwi.github.io/posts/2021-11_linux%E6%95%99%E7%A7%91%E6%9B%B8_linuc%E3%83%AC%E3%83%99%E3%83%AB2version100%E5%AF%BE%E5%BF%9C-copy/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2021-11_linux%E6%95%99%E7%A7%91%E6%9B%B8_linuc%E3%83%AC%E3%83%99%E3%83%AB2version100%E5%AF%BE%E5%BF%9C-copy/</guid><pubDate>Sat, 20 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Linux教科書_LinuCレベル2Version10.0対応&lt;/h1&gt;
&lt;h2&gt;理解したこと&lt;/h2&gt;
&lt;h2&gt;書籍サイト&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.shoeisha.co.jp/book/detail/9784798167961&quot;&gt;https://www.shoeisha.co.jp/book/detail/9784798167961&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;ダウンロード&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.shoeisha.co.jp/book/download/9784798167961/detail&quot;&gt;https://www.shoeisha.co.jp/book/download/9784798167961/detail&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;書籍情報&lt;/h2&gt;
&lt;p&gt;支持率No.1「Linux教科書」シリーズのノウハウを注いだ『LinuCレベル2』が登場！
クラウド時代のLinuxエンジニアの技術力を証明する資格として
LPI-Japanにより新たに開発された認定試験が「LinuC（リナック）」です。&lt;/p&gt;
&lt;p&gt;この試験が、2020年4月よりVersion 10.0にバージョンアップ。
本書は「レベル2 Version 10.0」に対応したLPI-Japan認定テキストです。
「あずき本」で有名な、支持率No.1「Linux教科書」シリーズのノウハウを
すべて注ぎ込み、LinuCレベル2最新バージョンの出題範囲を完全網羅した新しい定番書です。&lt;/p&gt;
&lt;p&gt;●「201試験」「202試験」の2試験に対応。出題範囲を完全網羅
●学習したことを確認できる練習問題を、各章末に豊富に掲載しています
●巻末には1回分の模擬試験を収録。本試験に向けて実力を試せます
●Linux実習環境（CentOS）を翔泳社Webサイトからダウンロード可。
　実際にコマンドを入力しながら学習できます&lt;/p&gt;
&lt;p&gt;【LinuCレベル2】 「仮想マシン・コンテナを含むLinuxシステム、ネットワークの設定・構築」
ができるエンジニアとして認定されます。&lt;/p&gt;
&lt;h2&gt;メモ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ローカル環境にDockerでCentOS7環境を作ってSSHで接続して演習する
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pocketcode.net/docker-centos7-ssh-connect&quot;&gt;https://pocketcode.net/docker-centos7-ssh-connect&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;序章　LinuCの概要&lt;/h2&gt;
&lt;h2&gt;LinuCとは&lt;/h2&gt;
&lt;h2&gt;LinuCの概要&lt;/h2&gt;
&lt;h2&gt;受験の申し込み手続き&lt;/h2&gt;
&lt;h2&gt;受験の実際&lt;/h2&gt;
&lt;h2&gt;試験問題の形式&lt;/h2&gt;
&lt;h2&gt;学習の進め方&lt;/h2&gt;
&lt;h2&gt;受験のテクニック&lt;/h2&gt;
&lt;h2&gt;■第1部　201試験（LinuC Level2 Exam 201）&lt;/h2&gt;
&lt;h2&gt;第1章　システムの起動とLinuxカーネル&lt;/h2&gt;
&lt;h3&gt;1.1　ブートプロセス&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;BIOS
&lt;ul&gt;
&lt;li&gt;MBR:マスターブートレコード
&lt;ul&gt;
&lt;li&gt;ブートローダ：OSを起動するプログラム&lt;/li&gt;
&lt;li&gt;パーティションテーブル&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;UEFI
&lt;ul&gt;
&lt;li&gt;GPT:GUID Partition Table&lt;/li&gt;
&lt;li&gt;ブートローダ：UEFIシステムパーティション(ESP)に格納される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# ブロックデバイスを一覧表示する
lsblk

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ブートローダ：OSを起動するプログラム&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Linuxでもっともよく利用されるブートローダはGRUB(Grand Unified Bootloader)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;カーネル&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OSの中でハードウェアとソフトウェアの仲立ちをしてくれるプログラム&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://qiita.com/uguis410/items/17ec1e447e9716bfdca7&quot;&gt;https://qiita.com/uguis410/items/17ec1e447e9716bfdca7&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;起動処理
&lt;ul&gt;
&lt;li&gt;組み込まれているハードウェアの検出と初期化&lt;/li&gt;
&lt;li&gt;システムクロックの設定&lt;/li&gt;
&lt;li&gt;ルートパーティションのチェックとマウント&lt;/li&gt;
&lt;li&gt;systemdの開始&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;journalctl -b
dmesg

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;初期RAMディスク&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;カーネルが起動すると、初期RAMディスクをルートパーティションとしてマウントする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RAMディスク：メモリ上にファイルシステムを作成&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ループバックマウント：ファイルをファイルシステムとしてマウントする&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TODO: 初期RAMディスクの作成などについては復習が必要&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.2　ブートローダ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ブートローダとは：
&lt;ul&gt;
&lt;li&gt;カーネルをストレージから読み込み、システムを起動するためのプログラム&lt;/li&gt;
&lt;li&gt;Linuxの代表的なブートローダはGRUB&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.3　システム起動のカスタマイズ&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# メンテナンスモード
systemctl isolate rescue.target
systemctl rescue
# 緊急モード
systemctl isolate emergency.target
systemclt emergency

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Unit設定ファイル
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/etc/systemd/system&lt;/code&gt;ディレクトリに配置される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;[tomo@localhost system]$ cat multi-user.target.wants/postfix.service
[Unit]
Description=Postfix Mail Transport Agent
After=syslog.target network.target
Conflicts=sendmail.service exim.service

[Service]
Type=forking
PIDFile=/var/spool/postfix/pid/master.pid
EnvironmentFile=-/etc/sysconfig/network
ExecStartPre=-/usr/libexec/postfix/aliasesdb
ExecStartPre=-/usr/libexec/postfix/chroot-update
ExecStart=/usr/sbin/postfix start
ExecReload=/usr/sbin/postfix reload
ExecStop=/usr/sbin/postfix stop

[Install]
WantedBy=multi-user.target

# systemd-deltaコマンド 設定ファイルの差分を出力
[tomo@localhost system]$ systemd-delta
[EXTENDED]   /run/systemd/system/user-0.slice → /run/systemd/system/user-0.slice.d/50-After-systemd-logind\x2eservice.conf
[EXTENDED]   /run/systemd/system/user-0.slice → /run/systemd/system/user-0.slice.d/50-TasksMax.conf
[EXTENDED]   /run/systemd/system/user-0.slice → /run/systemd/system/user-0.slice.d/50-Description.conf
[EXTENDED]   /run/systemd/system/user-0.slice → /run/systemd/system/user-0.slice.d/50-After-systemd-user-sessions\x2eservice.conf
[EXTENDED]   /run/systemd/system/session-2.scope → /run/systemd/system/session-2.scope.d/50-After-systemd-user-sessions\x2eservice.conf
[EXTENDED]   /run/systemd/system/session-2.scope → /run/systemd/system/session-2.scope.d/50-After-systemd-logind\x2eservice.conf
[EXTENDED]   /run/systemd/system/session-2.scope → /run/systemd/system/session-2.scope.d/50-Description.conf
[EXTENDED]   /run/systemd/system/session-2.scope → /run/systemd/system/session-2.scope.d/50-Slice.conf
[EXTENDED]   /run/systemd/system/session-2.scope → /run/systemd/system/session-2.scope.d/50-SendSIGHUP.conf
[EXTENDED]   /run/systemd/system/session-2.scope → /run/systemd/system/session-2.scope.d/50-TasksMax.conf
[EXTENDED]   /run/systemd/system/session-6.scope → /run/systemd/system/session-6.scope.d/50-Slice.conf
[EXTENDED]   /run/systemd/system/session-6.scope → /run/systemd/system/session-6.scope.d/50-TasksMax.conf
[EXTENDED]   /run/systemd/system/session-6.scope → /run/systemd/system/session-6.scope.d/50-After-systemd-user-sessions\x2eservice.conf
[EXTENDED]   /run/systemd/system/session-6.scope → /run/systemd/system/session-6.scope.d/50-After-systemd-logind\x2eservice.conf
[EXTENDED]   /run/systemd/system/session-6.scope → /run/systemd/system/session-6.scope.d/50-Description.conf
[EXTENDED]   /run/systemd/system/session-6.scope → /run/systemd/system/session-6.scope.d/50-SendSIGHUP.conf
[EQUIVALENT] /etc/systemd/system/default.target → /usr/lib/systemd/system/default.target
[EXTENDED]   /run/systemd/system/session-3.scope → /run/systemd/system/session-3.scope.d/50-After-systemd-logind\x2eservice.conf
[EXTENDED]   /run/systemd/system/session-3.scope → /run/systemd/system/session-3.scope.d/50-SendSIGHUP.conf
[EXTENDED]   /run/systemd/system/session-3.scope → /run/systemd/system/session-3.scope.d/50-TasksMax.conf
[EXTENDED]   /run/systemd/system/session-3.scope → /run/systemd/system/session-3.scope.d/50-Description.conf
[EXTENDED]   /run/systemd/system/session-3.scope → /run/systemd/system/session-3.scope.d/50-Slice.conf
[EXTENDED]   /run/systemd/system/session-3.scope → /run/systemd/system/session-3.scope.d/50-After-systemd-user-sessions\x2eservice.conf
[EXTENDED]   /run/systemd/system/user-1000.slice → /run/systemd/system/user-1000.slice.d/50-After-systemd-logind\x2eservice.conf
[EXTENDED]   /run/systemd/system/user-1000.slice → /run/systemd/system/user-1000.slice.d/50-Description.conf
[EXTENDED]   /run/systemd/system/user-1000.slice → /run/systemd/system/user-1000.slice.d/50-TasksMax.conf
[EXTENDED]   /run/systemd/system/user-1000.slice → /run/systemd/system/user-1000.slice.d/50-After-systemd-user-sessions\x2eservice.conf

27 overridden configuration files found.

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;systemdのログ&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;journalctl -b
journalctl -f
journalctl -n 10
journalctl -p err
-p, --priority=
           Filter output by message priorities or priority ranges. Takes either a single numeric or textual log level (i.e. between 0/&quot;emerg&quot; and 7/&quot;debug&quot;), or a range of numeric/text log levels in the
           form FROM..TO. The log levels are the usual syslog log levels as documented in syslog(3), i.e.  &quot;emerg&quot; (0), &quot;alert&quot; (1), &quot;crit&quot; (2), &quot;err&quot; (3), &quot;warning&quot; (4), &quot;notice&quot; (5), &quot;info&quot; (6),
           &quot;debug&quot; (7). If a single log level is specified, all messages with this log level or a lower (hence more important) log level are shown. If a range is specified, all messages within the range are
           shown, including both the start and the end value of the range. This will add &quot;PRIORITY=&quot; matches for the specified priorities.

journalctl -r
# よく使うことになるのはこれだけと思う
journalctl -u postfix.service

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;ログの保存場所
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/var/run/log/journal&lt;/code&gt;ディレクトリ配下にバイナリファイルが存在する。このファイルはシステム再起動で失われるため永続化するなら&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/var/log/journal&lt;/code&gt;ディレクトリを作成して、&lt;code&gt;/etc/systemd/journalId.conf&lt;/code&gt;ファイルで次の設定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;Storage=persistent
SystemMaxUse=200M

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1.4　カーネルの構成要素&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;カーネルバージョン&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;uname&lt;/code&gt;コマンドでバージョンがわかる&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cat /proc/version&lt;/code&gt;でもわかる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;カーネルイメージ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ls /boot&lt;/code&gt;でvmlinuz-xxxの名前でファイルが存在する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;lsmodコマンド&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;現在ロードされているすべてのモジュール一覧を表示&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cat /proc/modules&lt;/code&gt;でも同様の情報が取得できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;modinfoコマンド&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;モジュールの情報を表示&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;insmodコマンド&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ローダブルモジュールをロード&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rmmodコマンド&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ロードされているモジュールをアンロード&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;modproveコマンド&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;モジュールのロードやアンロードを行います。&lt;/li&gt;
&lt;li&gt;insmodやrmmodだと依存関係を気にしなければ行けないが、&lt;/li&gt;
&lt;li&gt;このコマンドであれば必要なモジュールをロードできるから楽&lt;/li&gt;
&lt;li&gt;modproveコマンドが参照する依存関係はmodles.depファイルに記述されている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.5　カーネルのコンパイル&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;カーネルソースの格納ディレクトリ：&lt;code&gt;/usr/src/linux&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;TODO: ディレクトリ内構造把握しておいたほうがいい&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.6　カーネルパラメータの変更&lt;/h3&gt;
&lt;h3&gt;1.7　カーネルの管理と問題解決&lt;/h3&gt;
&lt;h3&gt;練習問題&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;1.1 GRUBの設定ファイルgrub.cfgを生成するコマンド：grub2-mkconfig -o /boot/grub2/grub.cfg&lt;/li&gt;
&lt;li&gt;1.2 システム起動→GRUBメニュー画面→カーネルが見つからないエラー：メニュー画面で&lt;code&gt;[c]&lt;/code&gt;を押下してGRUBシェルを起動し、原因を探って修復&lt;/li&gt;
&lt;li&gt;1.3 GRUBを再インストールするコマンド：&lt;code&gt;grub-install&lt;/code&gt;or&lt;code&gt;grub2-install&lt;/code&gt;コマンド&lt;/li&gt;
&lt;li&gt;1.4 systemdを採用したシステムでログを確認するコマンド：&lt;code&gt;journalctl&lt;/code&gt;コマンド&lt;/li&gt;
&lt;li&gt;1.5 systemdを採用したシステムでnginxサーバが自動起動しないようにするコマンド：&lt;code&gt;systemctl disabled nginx.service&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;1.6 rescueモードで起動：一般ユーザはログインできない、ネットワーク接続されない&lt;/li&gt;
&lt;li&gt;1.7 mobproveコマンドが利用するファイルで、モジュールの依存関係情報が格納されているファイル：&lt;code&gt;/lib/modules/4.19.132/modules.dep&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;1.8 xxx&lt;/li&gt;
&lt;li&gt;1.9 カーネルソースツリーを初期化するコマンド：make mrproper&lt;/li&gt;
&lt;li&gt;1.10 ロードされているカーネルモジュールを確認する方法：&lt;code&gt;lsmod&lt;/code&gt;or&lt;code&gt;cat /proc/modules&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;1.11 初期RAMディスクに関する問題：システム起動に必要なデバイスドライバがカーネル本体に含まれていれば初期RAMディスクは必須ではない&lt;/li&gt;
&lt;li&gt;1.12&lt;/li&gt;
&lt;li&gt;1.13&lt;/li&gt;
&lt;li&gt;1.14&lt;/li&gt;
&lt;li&gt;1.15&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第2章　ファイルシステムとストレージ管理&lt;/h2&gt;
&lt;h3&gt;2.1　ファイルシステムの設定とマウント&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ファイルシステム：SSDやHDDなどのストレージにファイルを保存して管理する仕組み&lt;/li&gt;
&lt;li&gt;システムで利用するファイルシステム情報は&lt;code&gt;/etc/fstab&lt;/code&gt;ファイルに記述されている&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;[root@localhost etc]# cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Sat Nov 20 22:26:51 2021
#
# Accessible filesystems, by reference, are maintained under &apos;/dev/disk&apos;
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=165774f9-21d1-4f11-ac52-75928012626b /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0

# 書式：
# 1.デバイスファイル名・ラベル・UID
# 2.マウントポイント
# 3.ファイルシステムの種類
# 4.マウントオプション
# 5.dumpコマンドの対象
# 6.ブート時にfsckがチェックする順序


# UUIDを確認するコマンド
[root@localhost etc]# blkid
/dev/mapper/centos-root: UUID=&quot;947b91d3-28fe-493a-b8e9-522e5c598fb6&quot; TYPE=&quot;xfs&quot;
/dev/sda2: UUID=&quot;Rl5syf-IFgI-7shw-aKvy-Y4cH-ZrIM-lVVpOU&quot; TYPE=&quot;LVM2_member&quot;
/dev/sda1: UUID=&quot;165774f9-21d1-4f11-ac52-75928012626b&quot; TYPE=&quot;xfs&quot;
/dev/mapper/centos-swap: UUID=&quot;4fab2c94-5288-45ee-8a62-1acd401bb752&quot; TYPE=&quot;swap&quot;

[root@localhost etc]# ls -l /dev/disk/by-uuid/
合計 0
lrwxrwxrwx. 1 root root 10 11月 21 17:49 165774f9-21d1-4f11-ac52-75928012626b -&amp;gt; ../../sda1
lrwxrwxrwx. 1 root root 10 11月 21 17:49 4fab2c94-5288-45ee-8a62-1acd401bb752 -&amp;gt; ../../dm-1
lrwxrwxrwx. 1 root root 10 11月 21 17:49 947b91d3-28fe-493a-b8e9-522e5c598fb6 -&amp;gt; ../../dm-0

# UUIDを変更するコマンド
tune2fs -U `uuidgen` /dev/sdb1




[root@localhost etc]# cat /usr/lib/systemd/system/tmp.mount
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Temporary Directory
Documentation=man:hier(7)
Documentation=http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
ConditionPathIsSymbolicLink=!/tmp
DefaultDependencies=no
Conflicts=umount.target
Before=local-fs.target umount.target

[Mount]
What=tmpfs
Where=/tmp
Type=tmpfs
Options=mode=1777,strictatime

# Make &apos;systemctl enable tmp.mount&apos; work:
[Install]
WantedBy=local-fs.target


# カーネルがサポートしているファイルシステム
[root@localhost etc]# cat /proc/filesystems
nodev   sysfs
nodev   rootfs
nodev   ramfs
nodev   bdev
nodev   proc
nodev   cgroup
nodev   cpuset
nodev   tmpfs
nodev   devtmpfs
nodev   debugfs
nodev   securityfs
nodev   sockfs
nodev   dax
nodev   bpf
nodev   pipefs
nodev   configfs
nodev   devpts
nodev   hugetlbfs
nodev   autofs
nodev   pstore
nodev   mqueue
nodev   selinuxfs
        fuseblk
nodev   fuse
nodev   fusectl
        xfs
nodev   rpc_pipefs


# 現在どのようなファイルシステムがマウントされているか
[root@localhost etc]# cat /etc/mtab
sysfs /sys sysfs rw,seclabel,nosuid,nodev,noexec,relatime 0 0
proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0
devtmpfs /dev devtmpfs rw,seclabel,nosuid,size=4515168k,nr_inodes=1128792,mode=755 0 0
securityfs /sys/kernel/security securityfs rw,nosuid,nodev,noexec,relatime 0 0
tmpfs /dev/shm tmpfs rw,seclabel,nosuid,nodev 0 0
devpts /dev/pts devpts rw,seclabel,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0
tmpfs /run tmpfs rw,seclabel,nosuid,nodev,mode=755 0 0
tmpfs /sys/fs/cgroup tmpfs ro,seclabel,nosuid,nodev,noexec,mode=755 0 0
cgroup /sys/fs/cgroup/systemd cgroup rw,seclabel,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd 0 0
pstore /sys/fs/pstore pstore rw,nosuid,nodev,noexec,relatime 0 0
cgroup /sys/fs/cgroup/devices cgroup rw,seclabel,nosuid,nodev,noexec,relatime,devices 0 0
cgroup /sys/fs/cgroup/net_cls,net_prio cgroup rw,seclabel,nosuid,nodev,noexec,relatime,net_prio,net_cls 0 0
cgroup /sys/fs/cgroup/hugetlb cgroup rw,seclabel,nosuid,nodev,noexec,relatime,hugetlb 0 0
cgroup /sys/fs/cgroup/cpuset cgroup rw,seclabel,nosuid,nodev,noexec,relatime,cpuset 0 0
cgroup /sys/fs/cgroup/cpu,cpuacct cgroup rw,seclabel,nosuid,nodev,noexec,relatime,cpuacct,cpu 0 0
cgroup /sys/fs/cgroup/memory cgroup rw,seclabel,nosuid,nodev,noexec,relatime,memory 0 0
cgroup /sys/fs/cgroup/perf_event cgroup rw,seclabel,nosuid,nodev,noexec,relatime,perf_event 0 0
cgroup /sys/fs/cgroup/pids cgroup rw,seclabel,nosuid,nodev,noexec,relatime,pids 0 0
cgroup /sys/fs/cgroup/blkio cgroup rw,seclabel,nosuid,nodev,noexec,relatime,blkio 0 0
cgroup /sys/fs/cgroup/freezer cgroup rw,seclabel,nosuid,nodev,noexec,relatime,freezer 0 0
configfs /sys/kernel/config configfs rw,relatime 0 0
/dev/mapper/centos-root / xfs rw,seclabel,relatime,attr2,inode64,noquota 0 0
selinuxfs /sys/fs/selinux selinuxfs rw,relatime 0 0
systemd-1 /proc/sys/fs/binfmt_misc autofs rw,relatime,fd=22,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=10915 0 0
debugfs /sys/kernel/debug debugfs rw,relatime 0 0
mqueue /dev/mqueue mqueue rw,seclabel,relatime 0 0
fusectl /sys/fs/fuse/connections fusectl rw,relatime 0 0
hugetlbfs /dev/hugepages hugetlbfs rw,seclabel,relatime 0 0
/dev/sda1 /boot xfs rw,seclabel,relatime,attr2,inode64,noquota 0 0
sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw,relatime 0 0
tmpfs /run/user/1000 tmpfs rw,seclabel,nosuid,nodev,relatime,size=906448k,mode=700,uid=1000,gid=1000 0 0
gvfsd-fuse /run/user/1000/gvfs fuse.gvfsd-fuse rw,nosuid,nodev,relatime,user_id=1000,group_id=1000 0 0
tmpfs /run/user/0 tmpfs rw,seclabel,nosuid,nodev,relatime,size=906448k,mode=700 0 0

# こちらにもほぼ同じ情報（どのようなファイルシステムがマウントされているか）
[root@localhost etc]# cat /proc/mounts
sysfs /sys sysfs rw,seclabel,nosuid,nodev,noexec,relatime 0 0
proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0
devtmpfs /dev devtmpfs rw,seclabel,nosuid,size=4515168k,nr_inodes=1128792,mode=755 0 0
securityfs /sys/kernel/security securityfs rw,nosuid,nodev,noexec,relatime 0 0
tmpfs /dev/shm tmpfs rw,seclabel,nosuid,nodev 0 0
devpts /dev/pts devpts rw,seclabel,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0
tmpfs /run tmpfs rw,seclabel,nosuid,nodev,mode=755 0 0
tmpfs /sys/fs/cgroup tmpfs ro,seclabel,nosuid,nodev,noexec,mode=755 0 0
cgroup /sys/fs/cgroup/systemd cgroup rw,seclabel,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd 0 0
pstore /sys/fs/pstore pstore rw,nosuid,nodev,noexec,relatime 0 0
cgroup /sys/fs/cgroup/devices cgroup rw,seclabel,nosuid,nodev,noexec,relatime,devices 0 0
cgroup /sys/fs/cgroup/net_cls,net_prio cgroup rw,seclabel,nosuid,nodev,noexec,relatime,net_prio,net_cls 0 0
cgroup /sys/fs/cgroup/hugetlb cgroup rw,seclabel,nosuid,nodev,noexec,relatime,hugetlb 0 0
cgroup /sys/fs/cgroup/cpuset cgroup rw,seclabel,nosuid,nodev,noexec,relatime,cpuset 0 0
cgroup /sys/fs/cgroup/cpu,cpuacct cgroup rw,seclabel,nosuid,nodev,noexec,relatime,cpuacct,cpu 0 0
cgroup /sys/fs/cgroup/memory cgroup rw,seclabel,nosuid,nodev,noexec,relatime,memory 0 0
cgroup /sys/fs/cgroup/perf_event cgroup rw,seclabel,nosuid,nodev,noexec,relatime,perf_event 0 0
cgroup /sys/fs/cgroup/pids cgroup rw,seclabel,nosuid,nodev,noexec,relatime,pids 0 0
cgroup /sys/fs/cgroup/blkio cgroup rw,seclabel,nosuid,nodev,noexec,relatime,blkio 0 0
cgroup /sys/fs/cgroup/freezer cgroup rw,seclabel,nosuid,nodev,noexec,relatime,freezer 0 0
configfs /sys/kernel/config configfs rw,relatime 0 0
/dev/mapper/centos-root / xfs rw,seclabel,relatime,attr2,inode64,noquota 0 0
selinuxfs /sys/fs/selinux selinuxfs rw,relatime 0 0
systemd-1 /proc/sys/fs/binfmt_misc autofs rw,relatime,fd=22,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=10915 0 0
debugfs /sys/kernel/debug debugfs rw,relatime 0 0
mqueue /dev/mqueue mqueue rw,seclabel,relatime 0 0
fusectl /sys/fs/fuse/connections fusectl rw,relatime 0 0
hugetlbfs /dev/hugepages hugetlbfs rw,seclabel,relatime 0 0
/dev/sda1 /boot xfs rw,seclabel,relatime,attr2,inode64,noquota 0 0
sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw,relatime 0 0
tmpfs /run/user/1000 tmpfs rw,seclabel,nosuid,nodev,relatime,size=906448k,mode=700,uid=1000,gid=1000 0 0
gvfsd-fuse /run/user/1000/gvfs fuse.gvfsd-fuse rw,nosuid,nodev,relatime,user_id=1000,group_id=1000 0 0
tmpfs /run/user/0 tmpfs rw,seclabel,nosuid,nodev,relatime,size=906448k,mode=700 0 0

# そのため、/etc/mtabを誤って編集してしまった場合は、/proc/mountsを利用して復旧を試みることができる

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;マウントとアンマウント
&lt;ul&gt;
&lt;li&gt;ファイルシステムを利用するには、任意のディレクトリをマウントポイントとしてマウントする必要がある&lt;/li&gt;
&lt;li&gt;ファイルシステムをマウントするには&lt;code&gt;mount&lt;/code&gt;コマンドを使う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;[root@localhost etc]# mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime,seclabel)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
devtmpfs on /dev type devtmpfs (rw,nosuid,seclabel,size=4515168k,nr_inodes=1128792,mode=755)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,seclabel)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,seclabel,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,nodev,seclabel,mode=755)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,seclabel,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,devices)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,net_prio,net_cls)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,hugetlb)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,cpuset)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,cpuacct,cpu)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,memory)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,perf_event)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,pids)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,blkio)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,freezer)
configfs on /sys/kernel/config type configfs (rw,relatime)
/dev/mapper/centos-root on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
selinuxfs on /sys/fs/selinux type selinuxfs (rw,relatime)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=22,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=10915)
debugfs on /sys/kernel/debug type debugfs (rw,relatime)
mqueue on /dev/mqueue type mqueue (rw,relatime,seclabel)
fusectl on /sys/fs/fuse/connections type fusectl (rw,relatime)
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,seclabel)
/dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime)
tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,seclabel,size=906448k,mode=700,uid=1000,gid=1000)
gvfsd-fuse on /run/user/1000/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)
tmpfs on /run/user/0 type tmpfs (rw,nosuid,nodev,relatime,seclabel,size=906448k,mode=700)


# マウント
mount /dev/sdb1 /data
mount -o remount /data


&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;スワップ
&lt;ul&gt;
&lt;li&gt;スワップ領域は、ブロックデバイス上の仮想的なメモリ領域として使われます。&lt;/li&gt;
&lt;li&gt;スワップ領域は通常、システムのインストール時に作成しますが、あとから作成することも可能&lt;/li&gt;
&lt;li&gt;作成するには、&lt;code&gt;mkswap&lt;/code&gt;コマンドを使う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# スワップ領域作成
mkswap -c /dev/sda3

[root@localhost etc]# dd if=/dev/zero of=/tmp/swapfile bs=1M count=500
500+0 レコード入力
500+0 レコード出力
524288000 バイト (524 MB) コピーされました、 0.539949 秒、 971 MB/秒
[root@localhost etc]# mkswap /tmp/swapfile
スワップ空間バージョン1を設定します、サイズ = 511996 KiB
ラベルはありません, UUID=2b778452-5107-43a0-8f90-03fb310b6c19
[root@localhost etc]# chmod 600 /tmp/swapfile
[root@localhost etc]# ll /tmp/swapfile
-rw-------. 1 root root 524288000 11月 21 18:59 /tmp/swapfile

[root@localhost etc]# swapon /tmp/swapfile
[root@localhost etc]# swapon -s
Filename                                Type            Size    Used    Priority
/dev/dm-1                               partition       839676  0       -2
/tmp/swapfile                           file    511996  0       -3
[root@localhost etc]# cat /proc/swaps
Filename                                Type            Size    Used    Priority
/dev/dm-1                               partition       839676  0       -2
/tmp/swapfile                           file            511996  0       -3


[root@localhost etc]# swapoff /tmp/swapfile
[root@localhost etc]# swapon -s
Filename                                Type            Size    Used    Priority
/dev/dm-1                               partition       839676  0       -2

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.2　ファイルシステムの作成&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mkfs&lt;/code&gt;コマンド：ファイルシステムを作成するコマンド&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# ブロックデバイス確認
lsblk
[root@localhost etc]# lsblk -p
NAME                        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
/dev/sda                      8:0    0    8G  0 disk
tq/dev/sda1                   8:1    0    1G  0 part /boot
mq/dev/sda2                   8:2    0    7G  0 part
  tq/dev/mapper/centos-root 253:0    0  6.2G  0 lvm  /
  mq/dev/mapper/centos-swap 253:1    0  820M  0 lvm  [SWAP]
/dev/sr0                     11:0    1 1024M  0 rom

# ext2/ext3/ext4ファイルシステムの作成
mke2fs


# mke2fsコマンドのデフォルト値
[root@localhost etc]# cat /etc/mke2fs.conf
[defaults]
        base_features = sparse_super,filetype,resize_inode,dir_index,ext_attr
        default_mntopts = acl,user_xattr
        enable_periodic_fsck = 0
        blocksize = 4096
        inode_size = 256
        inode_ratio = 16384

[fs_types]
        ext3 = {
                features = has_journal
        }
        ext4 = {
                features = has_journal,extent,huge_file,flex_bg,uninit_bg,dir_nlink,extra_isize,64bit
                inode_size = 256
        }
        ext4dev = {
                features = has_journal,extent,huge_file,flex_bg,uninit_bg,dir_nlink,extra_isize
                inode_size = 256
                options = test_fs=1
        }
        rhel6_ext4 = {
                features = has_journal,extent,huge_file,flex_bg,uninit_bg,dir_nlink,extra_isize
                inode_size = 256
                enable_periodic_fsck = 1
                default_mntopts = &quot;&quot;
        }
        small = {
                blocksize = 1024
                inode_size = 128
                inode_ratio = 4096
        }
        floppy = {
                blocksize = 1024
                inode_size = 128
                inode_ratio = 8192
        }
        big = {
                inode_ratio = 32768
        }
        huge = {
                inode_ratio = 65536
        }
        news = {
                inode_ratio = 4096
        }
        largefile = {
                inode_ratio = 1048576
                blocksize = -1
        }
        largefile4 = {
                inode_ratio = 4194304
                blocksize = -1
        }
        hurd = {
             blocksize = 4096
             inode_size = 128
        }



# mkfsコマンドによるファイルシステム作成
mkdf -t ext3 /dev/sdc1


&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Btrfsファイルシステムの作成
&lt;ul&gt;
&lt;li&gt;Btrfs(B-tree file system)はLinux向けの新しいファイルシステムで対象外性に優れ先進的な機能が取り込まれている
&lt;ul&gt;
&lt;li&gt;最大ファイルサイズは16EiB&lt;/li&gt;
&lt;li&gt;コピーオンライと&lt;/li&gt;
&lt;li&gt;ディスク容量の効率的な使用&lt;/li&gt;
&lt;li&gt;iノードの動的割当&lt;/li&gt;
&lt;li&gt;ストレージプール対応&lt;/li&gt;
&lt;li&gt;スナップショット機能&lt;/li&gt;
&lt;li&gt;チェックサムによる完全性の保証&lt;/li&gt;
&lt;li&gt;効率的な増分バックアップ&lt;/li&gt;
&lt;li&gt;オンラインデフラグ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mkfs.btrfs&lt;/code&gt;コマンドを実行して作成する
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mkfs.btrfs /dev/sdb1 /dev/sdb2&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;このように複数の物理ボリュームをまとめた１つの仮想的なボリュームをストレージプールと言う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;btrfs-convert&lt;/code&gt;コマンドを使うと、ext2/ext3/ext4ファイルシステムをBtrfsに変換できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.3　ファイルシステムの管理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ext2/ext3ファイルシステムはブロック単位で管理されている&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ブロックには以下が存在する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;データブロック&lt;/li&gt;
&lt;li&gt;iノードブロック
&lt;ul&gt;
&lt;li&gt;どのデータブロックにどんなデータが格納されているかの情報&lt;/li&gt;
&lt;li&gt;ファイル・タイプ、アクセス権、所有者、所有グループ、ファイルサイズ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;スーパーブロック
&lt;ul&gt;
&lt;li&gt;ファイルシステムの全般的な情報（データブロックサイズ、マウント回数、iノードやデータブロックの数など）&lt;/li&gt;
&lt;li&gt;スーパーブロックは非常に重要なので、ブロックグループごとにバックアップが作成される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TODO: 詳細見れていない・・&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.4　LVM&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;LVM:論理ボリューム管理　Logical Volume Manager&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ディスクのパーティションを直接操作するのではなく、仮想的なパーティションである論理ボリュームを動的に管理&lt;/li&gt;
&lt;li&gt;パーティションを使ったディスク管理に比べて次の制約を回避できる
&lt;ul&gt;
&lt;li&gt;一度パーティションを作成するとサイズ変更ができない&lt;/li&gt;
&lt;li&gt;別のディスクにパーティションを移動させることができない&lt;/li&gt;
&lt;li&gt;ディスクのサイズを超える大きさのパーティションは作成できない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;★：PVがPhysical Volume(物理ボリューム)、VGがVolume Group(ボリュームグループ)、LVがLogical Volume(論理ボリューム)の略称であることを覚えておく&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;LVMの作成&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;物理ボリュームを用意して、パーティションタイプを「8e」(Linux LVM)に設定しておく&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pvcreate&lt;/code&gt;: デバイスを物理ボリュームとして初期化&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vgcreate testvg /dev/sdd1 /dev/sde1&lt;/code&gt;: ボリュームグループの作成&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lvcreate -L 500M -n lv01 testvg&lt;/code&gt;: 論理ボリュームの作成&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lvscan&lt;/code&gt;: 論理ボリュームの状態を完結に表示&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TODO: vg~~コマンドが他にも多数あるが詳細は一旦飛ばす&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;練習問題&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;2.1 カーネルがサポートしているファイルシステムの種類を確認するにはどのコマンドを実行すればよいか
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cat /proc/filesystems&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;その他：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/etc/mtab&lt;/code&gt;には現在マウントされているファイルシステムについての情報が格納されている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2.2 &lt;code&gt;/etc/fstab&lt;/code&gt;で指定できるマウントオプションの説明で適切でないもの
&lt;ul&gt;
&lt;li&gt;割愛&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2.3 &lt;code&gt;/etc/fstab&lt;/code&gt;の書式として適切でないもの&lt;/li&gt;
&lt;li&gt;2.4 &lt;code&gt;/mnt&lt;/code&gt;ディレクトリにマウント下Btrfsファイルシステムの使用状況を表示したい場合
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;btrfs filesystem df /mnt&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2.5 Btrfsファイルシステムのサブボリューム/dataのスナップショットを/mnt/data_snapとして作成
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;btrfs subvolume snapshot /data /mnt/data_snap&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2.6 USBメモリを読み取り専用でマウントしたい。マウントポイントは&lt;code&gt;/media/usb&lt;/code&gt;、デバイスファイルは&lt;code&gt;/dev/sdb1&lt;/code&gt;とする。ファイルシステム地アプは&lt;code&gt;vfat&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mount -t vfat -o ro /dev/sdb1 /media/usb&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2.7 現在マウントされているファイルシステムとそのオプションを知るには何というファイルを参照
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cat /etc/mtab&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2.8 ファイルシステムの種類がxfsであるファイルシステムのみをすべてアンマウントするには
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;unmount -at xfs&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2.9 &lt;code&gt;unmount /home; mount /home&lt;/code&gt;を実行するのと同じことを１コマンドで実行したい場合
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mount -o remount /home&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2.10 スワップ領域を&lt;code&gt;/dev/sda7&lt;/code&gt;に作成するコマンドを引数とともに記述してください
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mkswap /dev/sda7&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2.11 アクティブなスワップ領域を表示するには
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;swapon -s&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2.12 mkfsコマンドを使ってext4ファイルシステムを作成。その際に、予約ブロックの割合も変更する。不良ブロックのチェックも行う。必要なオプションをすべて選択
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-t&lt;/code&gt;:タイプを指定&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-c&lt;/code&gt;:不良ブロックのチェック&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-m&lt;/code&gt;:root用の予約領域を指定する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2.13 rootユーザー用予約領域が5%確保されているext4ファイルシステム&lt;code&gt;/dev/sda5&lt;/code&gt;がある。この領域を0%に死体
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tune2fs -m 0 /dev/sda5&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2.14 XFSファイルシステムをバックアップするコマンド
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;xfsdump&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2.15 &lt;code&gt;/dev/sdb1&lt;/code&gt;を物理ボリュームとして初期化したい場合に実行するコマンド
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pvcreate /dev/sdb1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2.16 &lt;code&gt;testvg&lt;/code&gt;という名称のボリュームグループを作成したい場合。ボリュームグループを構成する物理ボリュームデバイスは&lt;code&gt;/dev/sdb1&lt;/code&gt;と&lt;code&gt;/dev/sdc1&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;vgcreate -s 32m testvg /dev/sdb1 /dev/sdc1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2.17 ボリュームグループtestvg内にサイズが10Gバイトの論理ボリュームlv01を作成しようとする。
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;lvcreate&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;-L:サイズ&lt;/li&gt;
&lt;li&gt;-n:論理ボリューム名&lt;/li&gt;
&lt;li&gt;引数にはボリュームグループ名を指定する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第3章　ネットワーク構成&lt;/h2&gt;
&lt;h3&gt;3.1　基本的なネットワーク構成&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ネットワークデバイスの操作
&lt;ul&gt;
&lt;li&gt;インターフェース名：eth0,eth1,loなどがもともと&lt;/li&gt;
&lt;li&gt;最近は、&lt;code&gt;enp0s3&lt;/code&gt;などの名前が使われる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# カーネルが認識しているネットワークデバイスを確認
lspci | grep -i eth
journalctl -b | grep -i eth | grep enp

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ip&lt;/code&gt;コマンド
&lt;ul&gt;
&lt;li&gt;ネットワークインターフェースやルーティングテーブル、ARPテーブルなどを管理するコマンド&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# データリンク層
ip link show
# IPアドレス
ip addr show
# ルーティングテーブル
ip route show
# ARPキャッシュ
ip neigh show


ip -s link show enp0s3

# add でパラメータ設定する
ip addr add 192.168.11.10/24 dev enp0s3

#### ifconfigコマンド
# ipコマンド以前に広く使われていたコマンド
ifconfig
ifconfig -a

ifconfig enp0s3 192.168.120.27 netmask 255.255.255.0
ifconfig enp0s3 up
# まとめて指定も可能
ifconfig enp0s3 192.168.120.27 netmask 255.255.255.0 up

#### ARP
# MACアドレスとIPアドレスを変換するプロトコル
# 自分のIPアドレス/MACアドレスと相手のIPアドレスが含まれたパケットをブロードキャストして、指定されたIPアドレスを持つ相手がこのパケットを受け取ると、自分のMACアドレスを返す
# 一度取得した情報は、ARPキャッシュと呼ばれるテーブルに一定期間キャッシュされる

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;無線ネットワークの設定&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;iwconfig

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3.2　高度なネットワーク設定&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;route
netstat -r
# 情報は同じ物が出力される

[root@localhost etc]# netstat -r
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
default         buffalo.setup   0.0.0.0         UG        0 0          0 enp0s3
192.168.11.0    0.0.0.0         255.255.255.0   U         0 0          0 enp0s3
192.168.122.0   0.0.0.0         255.255.255.0   U         0 0          0 virbr0
[root@localhost etc]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         buffalo.setup   0.0.0.0         UG    100    0        0 enp0s3
192.168.11.0    0.0.0.0         255.255.255.0   U     100    0        0 enp0s3
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0


&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;基本的なネットワーク管理コマンド&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pingコマンド：指定されたホストにICMPパケットを贈り、その反応も表示
&lt;ul&gt;
&lt;li&gt;オプション：
&lt;ul&gt;
&lt;li&gt;-n:ホスト名を名前解決せずにIPアドレスで表示&lt;/li&gt;
&lt;li&gt;-c 回数&lt;/li&gt;
&lt;li&gt;-i 間隔：指定した間隔ごとにICMPパケットを送信&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ping6コマンド：IPv6用コマンド&lt;/li&gt;
&lt;li&gt;tcpdumpコマンド：指定したネットワークインターフェースを監視市、そこに到達したデータをコンソール上に表示&lt;/li&gt;
&lt;li&gt;netstatコマンド：ネットワーク機能に関する様々な情報を表示&lt;/li&gt;
&lt;li&gt;ssコマンド：netstatコマンドに変わるのがssコマンド&lt;/li&gt;
&lt;li&gt;tracerouteコマンド：指定されたホストまでパケットが伝わる経路を表示
&lt;ul&gt;
&lt;li&gt;ネットワーク経路上にICMPメッセージに返答しないホストが存在する場合などでは適切な動作は期待できない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ncコマンド：TCP/UDPを使ったネットワーク通信を行うシンプルなコマンド
&lt;ul&gt;
&lt;li&gt;ポートスキャンを実施したり、通信状態を確認したりといったちょっとした操作に活用できる&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nc localhost 25&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;NetworkManager&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ネットワークを管理するサブシステムとして、NetworkManagerが導入されている&lt;/li&gt;
&lt;li&gt;稼働しているか確認：&lt;code&gt;systemctl status NetworkManager&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nmcli&lt;/code&gt;コマンドを使ってネットワークの設定、接続の管理、状態の確認などが可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;nmcli

# NetworkManagerの状態確認
nmcli general status

# ネットワークインターフェースの設定ファイル
cat /etc/sysconfig/network-scripts/ifcfg-enp0s3


&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3.3　ネットワークの問題解決&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ネットワーク設定情報の収集
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/etc/hostname&lt;/code&gt;: ホスト名を記述&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/hosts&lt;/code&gt;: ホスト名とIPアドレスの対応を記述&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/networks&lt;/code&gt;: ネットワーク名とネットワークアドレスの対応が記述&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/nsswitch.conf&lt;/code&gt;: 名前解決をする際の問い合わせ順を記述&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/resolv.conf&lt;/code&gt;: 問い合わせ先のDNSサーバーやドメイン名を記述&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;##### /etc/nsswitch.conf
[root@localhost ~]# cat /etc/nsswitch.conf
#
# /etc/nsswitch.conf
#
# An example Name Service Switch config file. This file should be
# sorted with the most-used services at the beginning.
#
# The entry &apos;[NOTFOUND=return]&apos; means that the search for an
# entry should stop if the search in the previous entry turned
# up nothing. Note that if the search failed due to some other reason
# (like no NIS server responding) then the search continues with the
# next entry.
#
# Valid entries include:
#
#       nisplus                 Use NIS+ (NIS version 3)
#       nis                     Use NIS (NIS version 2), also called YP
#       dns                     Use DNS (Domain Name Service)
#       files                   Use the local files
#       db                      Use the local database (.db) files
#       compat                  Use NIS on compat mode
#       hesiod                  Use Hesiod for user lookups
#       sss                     Use sssd (System Security Services Daemon)
#       [NOTFOUND=return]       Stop searching if not found so far
#
# WARNING: Running nscd with a secondary caching service like sssd may lead to
#          unexpected behaviour, especially with how long entries are cached.

# To use db, put the &quot;db&quot; in front of &quot;files&quot; for entries you want to be
# looked up first in the databases
#
# Example:
#passwd:    db files nisplus nis
#shadow:    db files nisplus nis
#group:     db files nisplus nis

passwd:     files sss
shadow:     files sss
group:      files sss
#initgroups: files sss

#hosts:     db files nisplus nis dns
hosts:      files dns myhostname

# Example - obey only what nisplus tells us...
#services:   nisplus [NOTFOUND=return] files
#networks:   nisplus [NOTFOUND=return] files
#protocols:  nisplus [NOTFOUND=return] files
#rpc:        nisplus [NOTFOUND=return] files
#ethers:     nisplus [NOTFOUND=return] files
#netmasks:   nisplus [NOTFOUND=return] files

bootparams: nisplus [NOTFOUND=return] files

ethers:     files
netmasks:   files
networks:   files
protocols:  files
rpc:        files
services:   files sss

netgroup:   nisplus sss

publickey:  nisplus

automount:  files nisplus sss
aliases:    files nisplus

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;ネットワークの通信経路の確認&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;練習問題&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;3.1 ARPキャッシュを表示したりエントリーを追加したりするときに利用するコマンド&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;arp&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;3.2 tcpdumpコマンドの出力の一部。適切な説明を選択&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;接続元IPアドレス.ポート番号(サービス名) &amp;gt; 接続先IPアドレス.ポート番号(サービス名)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;3.3 routeコマンドを実行したときの表示&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;3.4 routeコマンドの使い方&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;route add -net 192.168.100.0 netmask 255.255.255.0 gw 172.16.100.1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;3.5 ルーティングテーブルを表示するコマンド&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;route&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ip route show&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;netstat -r&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;3.6 &lt;code&gt;/etc/resolv.conf&lt;/code&gt;の記述&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;nameserver 172.16.0.1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;3.7 &lt;code&gt;www.example.com&lt;/code&gt;に到達するまでに経由するルーター一覧を表示して経路を確認したい場合、役立つコマンド&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;traceroute6&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mtr&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第4章　システムの保守と運用管理&lt;/h2&gt;
&lt;h3&gt;4.1　makeによるソースコードからのビルドとインストール&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;tar cvf
tar xvf
tar tvf
gzip
gunzip
bzip
bunzip

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4.2　バックアップ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;バックアップの種類&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;完全バックアップ：時間がかかり容量も必要&lt;/li&gt;
&lt;li&gt;差分バックアップ：復元にはフルバックアップと最新の差分バックアップが必要&lt;/li&gt;
&lt;li&gt;増分バックアップ：復元にはフルバックアップとフルバックアップ以降のすべての増分バックアップが必要&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;バックアップデバイス&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CD-R/RW、リムーバブルハードディスク&lt;/li&gt;
&lt;li&gt;DVD-R/RW&lt;/li&gt;
&lt;li&gt;BD-R/RE&lt;/li&gt;
&lt;li&gt;磁気テープ&lt;/li&gt;
&lt;li&gt;ネットワーク&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ローカルでのバックアップ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;tar,dd,dump,restoreなどのコマンドでバックアップが可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# OP,形式と拡張子
# -j bzip -&amp;gt; bz2
# -z gzip -&amp;gt; gz
# -J xz - xz

# このコマンドをあわせて使う使い方は必要に応じて調べるで良さそう
dump
restore

# テープドライブを操作するコマンド
mt

# ネットワーク経由でのバックアップ
rsync

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4.3　ユーザーへのシステム管理情報の通知&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ログイン前後のメッセージ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/etc/issue&lt;/code&gt;: 接続前に表示されるメッセージ　telnet接続だと表示される sshだとログイン前メッセージが表示されない（Teratermとコマンドプロンプト）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/issue.net&lt;/code&gt;: 接続前に表示されるメッセージ　telnet接続だと表示される  sshだとログイン前メッセージが表示されない（Teratermとコマンドプロンプト）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/motd&lt;/code&gt;: 接続後に表示されるメッセージ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ログイン中のユーザへの通知&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;wall &quot;message&quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;shutdown -k now &quot;message&quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://qiita.com/montblanc18/items/8b4fd2cf150913c6e1c2&quot;&gt;https://qiita.com/montblanc18/items/8b4fd2cf150913c6e1c2&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;telnetを有効にする方法で参考&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.4　リソース使用状況の把握&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;CPU使用率やメモリの状況など、システムリソースを総合的に確認できるツール&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;top&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vmstat&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;EPELリポジトリ epelリポジトリを追加方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://linuc.spa-miz.com/2020/10/13/installing-htop-centos/&quot;&gt;https://linuc.spa-miz.com/2020/10/13/installing-htop-centos/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;top
htop
vmstat
iostat
iotop
sar
uptime # システムの稼働時間やログインユーザー数、平均負荷などが表示される。topコマンドの１行目とほぼ同じ
w # 現在ログインしているユーザと各ユーザのプロセス情報が表示される

&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# CPU使用率の測定
ps
ps aux: システムで使用されているすべてのプロセスを表示

# 開いているファイルやポートの確認
lsof
# /var/log/messagesファイルを開いているプロセスを検索
[root@localhost top]# lsof /var/log/messages
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
abrt-watc  914 root    4r   REG  253,0   718793 10468097 /var/log/messages
rsyslogd  1338 root    7w   REG  253,0   718793 10468097 /var/log/messages
# プロセス名が開いているファイルを表示
[root@localhost top]# lsof -p `pidof rsyslogd`
COMMAND   PID USER   FD      TYPE             DEVICE SIZE/OFF     NODE NAME
rsyslogd 1338 root  cwd       DIR              253,0      224       64 /
rsyslogd 1338 root  rtd       DIR              253,0      224       64 /
rsyslogd 1338 root  txt       REG              253,0   663976  3172893 /usr/sbin/rsyslogd
rsyslogd 1338 root  mem       REG               0,19  8388608     8307 /run/log/journal/4f887155365a419b9cb02e497221d5a4/system.journal
rsyslogd 1338 root  mem       REG              253,0    68192   176358 /usr/lib64/libbz2.so.1.0.6
rsyslogd 1338 root  mem       REG              253,0    99944   176516 /usr/lib64/libelf-0.176.so
rsyslogd 1338 root  mem       REG              253,0   402384   383771 /usr/lib64/libpcre.so.1.2.0
rsyslogd 1338 root  mem       REG              253,0    19896   176626 /usr/lib64/libattr.so.1.1.0
rsyslogd 1338 root  mem       REG              253,0   338672  1300052 /usr/lib64/libdw-0.176.so
rsyslogd 1338 root  mem       REG              253,0   109976   383691 /usr/lib64/libresolv-2.17.so
rsyslogd 1338 root  mem       REG              253,0    19384   176460 /usr/lib64/libgpg-error.so.0.10.0
rsyslogd 1338 root  mem       REG              253,0   535064   176472 /usr/lib64/libgcrypt.so.11.8.2
rsyslogd 1338 root  mem       REG              253,0    61752   270256 /usr/lib64/liblz4.so.1.8.3
rsyslogd 1338 root  mem       REG              253,0   157424   176353 /usr/lib64/liblzma.so.5.2.2
rsyslogd 1338 root  mem       REG              253,0   155744   176263 /usr/lib64/libselinux.so.1
rsyslogd 1338 root  mem       REG              253,0  1136944   383671 /usr/lib64/libm-2.17.so
rsyslogd 1338 root  mem       REG              253,0    20048   176631 /usr/lib64/libcap.so.2.22
rsyslogd 1338 root  mem       REG              253,0   203688  1300065 /usr/lib64/libsystemd.so.0.6.0
rsyslogd 1338 root  mem       REG              253,0    25024  5817422 /usr/lib64/rsyslog/imjournal.so
rsyslogd 1338 root  mem       REG              253,0    38048  5817429 /usr/lib64/rsyslog/imuxsock.so
rsyslogd 1338 root  mem       REG              253,0    24432  5817430 /usr/lib64/rsyslog/lmnet.so
rsyslogd 1338 root  mem       REG              253,0  2156272   383663 /usr/lib64/libc-2.17.so
rsyslogd 1338 root  mem       REG              253,0    88720       85 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
rsyslogd 1338 root  mem       REG              253,0    20064   176270 /usr/lib64/libuuid.so.1.3.0
rsyslogd 1338 root  mem       REG              253,0    40896  1245966 /usr/lib64/libfastjson.so.4.0.0
rsyslogd 1338 root  mem       REG              253,0    15424  1299766 /usr/lib64/libestr.so.0.0.0
rsyslogd 1338 root  mem       REG              253,0    43712   383693 /usr/lib64/librt-2.17.so
rsyslogd 1338 root  mem       REG              253,0    19248   383669 /usr/lib64/libdl-2.17.so
rsyslogd 1338 root  mem       REG              253,0   142144   383689 /usr/lib64/libpthread-2.17.so
rsyslogd 1338 root  mem       REG              253,0    90248   176266 /usr/lib64/libz.so.1.2.7
rsyslogd 1338 root  mem       REG              253,0   163312   383656 /usr/lib64/ld-2.17.so
rsyslogd 1338 root    0r      CHR                1,3      0t0     1028 /dev/null
rsyslogd 1338 root    1w      CHR                1,3      0t0     1028 /dev/null
rsyslogd 1338 root    2w      CHR                1,3      0t0     1028 /dev/null
rsyslogd 1338 root    3r  a_inode               0,10        0     6415 inotify
rsyslogd 1338 root    4u     unix 0xffff8e7135db5940      0t0    23333 socket
rsyslogd 1338 root    5r      REG               0,19  8388608     8307 /run/log/journal/4f887155365a419b9cb02e497221d5a4/system.journal
rsyslogd 1338 root    6w      REG              253,0    18803  8671877 /var/log/cron
rsyslogd 1338 root    7w      REG              253,0   718793 10468097 /var/log/messages
rsyslogd 1338 root    8w      REG              253,0    20795 10468098 /var/log/secure
rsyslogd 1338 root    9w      REG              253,0     1639 10468099 /var/log/maillog


### メモリ及びスワップ使用量の測定
# メモリ使用率を測定するには、先に上げたtop,sadc/sarコマンドなどが利用できる他freeコマンドも利用できる
# Linuxは、使われていない物理メモリをできるだけキャッシュに割り当てようとします。
# そのため、Linuxの起動時間が長くなればなるほど、Mem行のfree列の値は小さくなっていきます。
# その値が小さくても、キャッシュに割り当てられているサイズが大きいのであれば、実際にメモリが足りないわけではない、ということに注意してください。
# available列を見ると、おおよその利用可能なメモリ量がわかります。スワップはディスクの一部を仮想的なメモリとして利用する機能です。
# システムの物理メモリが不足するとスワップが行われます。スワップ領域が継続的に使われるようであれば、システムのパフォーマンスが低下します。
# そのため、システムが利用しているメモリ量を把握することは必要です。前記の例ではスワップは利用されていませんが、スワップが頻繁に利用されるようなら、
# 不要なサービスを停止させるか、メモリの増設を検討する必要があります。freeコマンド以上に詳細なメモリの情報を得るには、/proc/meminfoを参照します。


### ディスク使用量の測定
df

### ネットワークトラフィックの測定
netstat -s
ss -s

netserver
netperf
iptables
iftop

# この辺詳細ちょっとおいきれてないので後で振り返り

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4.5　死活監視と運用監視ツール&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;リソースの枯渇&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;スラッシング：アプリが使うメモリ領域が肥大し、空きメモリがなくなるとメモリの一部がスワップ領域に移されその分のメモリが開放される
&lt;ul&gt;
&lt;li&gt;さらにメモリ不足が継続すると、スワップ領域への対比が頻発市、システムの動作が大幅に遅くなってしまうこと&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;システムの過負荷&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;サービスの以上&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OOMKiller&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cat /proc/sys/vm/panic_on_oom&lt;/code&gt;これが0であればOOM Killerは動作しない、1であれば動作する&lt;/li&gt;
&lt;li&gt;真っ先にOOM Killerに強制終了されるプロセスはdstatコマンドで調べることができる&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dstat --top-oom&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pidof python2&lt;/code&gt; dstatコマンドで出力されるのはこの値が最も高いプロセス&lt;/li&gt;
&lt;li&gt;強制終了の優先度を変更するには、&lt;code&gt;/proc/PID/oom_adj&lt;/code&gt;ファイルに値を書き込む&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;監視作業&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;死活監視&lt;/li&gt;
&lt;li&gt;リソース監視&lt;/li&gt;
&lt;li&gt;ログ監視
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;swatch&lt;/code&gt;: simple log watcherが古くから使われている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SNMP: ネットワーク上のサーバーやネットワーク機器を監視できるプロトコル&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SNMPマネージャ：監視する側&lt;/li&gt;
&lt;li&gt;SNMPエージェント：監視される側&lt;/li&gt;
&lt;li&gt;監視の仕組み：
&lt;ul&gt;
&lt;li&gt;SNMPマネージャ側からSNMPエージェント側に情報を求める（ポーリング）&lt;/li&gt;
&lt;li&gt;SNMPエージェント側からSNMPマネージャ側に通知する
&lt;ul&gt;
&lt;li&gt;ポーリングには、SNMPエージェント側のUDP161ポート、SNMPマネージャ側のUDP162ポートが使われる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;システム運用監視ツール&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;collectd: システムの各種情報を定期的に収集する軽量なデーモン&lt;/li&gt;
&lt;li&gt;Nagios&lt;/li&gt;
&lt;li&gt;MRTG (Multi Router Traffic Grapher)&lt;/li&gt;
&lt;li&gt;Cacti&lt;/li&gt;
&lt;li&gt;Icinga2&lt;/li&gt;
&lt;li&gt;Zabbix&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.6　システム構成ツール&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ansibleの概要&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;YAML形式のテキストファイルで設定&lt;/li&gt;
&lt;li&gt;Pythonが動けば使える&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コントロールノードとターゲットノード&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コントロールノード：システム構成処理の指示を出すホスト&lt;/li&gt;
&lt;li&gt;ターゲットノード：コントロールノードによってシステム構成処理が実行されるホスト&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;インベントリとPlaybook&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;インベントリ:
&lt;ul&gt;
&lt;li&gt;ターゲットノードのリストが記述される&lt;/li&gt;
&lt;li&gt;複数のターゲットノードをまとめたグループも設定できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Playbook:
&lt;ul&gt;
&lt;li&gt;ターゲットノードで実施するシステム構成処理が記述される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;モジュール: Ansibleの構成管理機能を実現するため、数多くのモジュールが提供されている&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ansibleの基本的な設定&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/etc/ansible/ansible.cfg&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;[root@localhost 1340]# cat /etc/ansible/ansible.cfg
# config file for ansible -- https://ansible.com/
# ===============================================

# nearly all parameters can be overridden in ansible-playbook
# or with command line flags. ansible will read ANSIBLE_CONFIG,
# ansible.cfg in the current working directory, .ansible.cfg in
# the home directory or /etc/ansible/ansible.cfg, whichever it
# finds first

[defaults]

# some basic default values...

#inventory      = /etc/ansible/hosts
#library        = /usr/share/my_modules/
#module_utils   = /usr/share/my_module_utils/
#remote_tmp     = ~/.ansible/tmp
#local_tmp      = ~/.ansible/tmp
#plugin_filters_cfg = /etc/ansible/plugin_filters.yml
#forks          = 5
#poll_interval  = 15
#sudo_user      = root
#ask_sudo_pass = True
#ask_pass      = True
#transport      = smart
#remote_port    = 22
#module_lang    = C
#module_set_locale = False

# plays will gather facts by default, which contain information about
# the remote system.
#
# smart - gather by default, but don&apos;t regather if already gathered
# implicit - gather by default, turn off with gather_facts: False
# explicit - do not gather by default, must say gather_facts: True
#gathering = implicit

# This only affects the gathering done by a play&apos;s gather_facts directive,
# by default gathering retrieves all facts subsets
# all - gather all subsets
# network - gather min and network facts
# hardware - gather hardware facts (longest facts to retrieve)
# virtual - gather min and virtual facts
# facter - import facts from facter
# ohai - import facts from ohai
# You can combine them using comma (ex: network,virtual)
# You can negate them using ! (ex: !hardware,!facter,!ohai)
# A minimal set of facts is always gathered.
#gather_subset = all

# some hardware related facts are collected
# with a maximum timeout of 10 seconds. This
# option lets you increase or decrease that
# timeout to something more suitable for the
# environment.
# gather_timeout = 10

# Ansible facts are available inside the ansible_facts.* dictionary
# namespace. This setting maintains the behaviour which was the default prior
# to 2.5, duplicating these variables into the main namespace, each with a
# prefix of &apos;ansible_&apos;.
# This variable is set to True by default for backwards compatibility. It
# will be changed to a default of &apos;False&apos; in a future release.
# ansible_facts.
# inject_facts_as_vars = True

# additional paths to search for roles in, colon separated
#roles_path    = /etc/ansible/roles

# uncomment this to disable SSH key host checking
#host_key_checking = False

# change the default callback, you can only have one &apos;stdout&apos; type  enabled at a time.
#stdout_callback = skippy


## Ansible ships with some plugins that require whitelisting,
## this is done to avoid running all of a type by default.
## These setting lists those that you want enabled for your system.
## Custom plugins should not need this unless plugin author specifies it.

# enable callback plugins, they can output to stdout but cannot be &apos;stdout&apos; type.
#callback_whitelist = timer, mail

# Determine whether includes in tasks and handlers are &quot;static&quot; by
# default. As of 2.0, includes are dynamic by default. Setting these
# values to True will make includes behave more like they did in the
# 1.x versions.
#task_includes_static = False
#handler_includes_static = False

# Controls if a missing handler for a notification event is an error or a warning
#error_on_missing_handler = True

# change this for alternative sudo implementations
#sudo_exe = sudo

# What flags to pass to sudo
# WARNING: leaving out the defaults might create unexpected behaviours
#sudo_flags = -H -S -n

# SSH timeout
#timeout = 10

# default user to use for playbooks if user is not specified
# (/usr/bin/ansible will use current user as default)
#remote_user = root

# logging is off by default unless this path is defined
# if so defined, consider logrotate
#log_path = /var/log/ansible.log

# default module name for /usr/bin/ansible
#module_name = command

# use this shell for commands executed under sudo
# you may need to change this to bin/bash in rare instances
# if sudo is constrained
#executable = /bin/sh

# if inventory variables overlap, does the higher precedence one win
# or are hash values merged together?  The default is &apos;replace&apos; but
# this can also be set to &apos;merge&apos;.
#hash_behaviour = replace

# by default, variables from roles will be visible in the global variable
# scope. To prevent this, the following option can be enabled, and only
# tasks and handlers within the role will see the variables there
#private_role_vars = yes

# list any Jinja2 extensions to enable here:
#jinja2_extensions = jinja2.ext.do,jinja2.ext.i18n

# if set, always use this private key file for authentication, same as
# if passing --private-key to ansible or ansible-playbook
#private_key_file = /path/to/file

# If set, configures the path to the Vault password file as an alternative to
# specifying --vault-password-file on the command line.
#vault_password_file = /path/to/vault_password_file

# format of string {{ ansible_managed }} available within Jinja2
# templates indicates to users editing templates files will be replaced.
# replacing {file}, {host} and {uid} and strftime codes with proper values.
#ansible_managed = Ansible managed: {file} modified on %Y-%m-%d %H:%M:%S by {uid} on {host}
# {file}, {host}, {uid}, and the timestamp can all interfere with idempotence
# in some situations so the default is a static string:
#ansible_managed = Ansible managed

# by default, ansible-playbook will display &quot;Skipping [host]&quot; if it determines a task
# should not be run on a host.  Set this to &quot;False&quot; if you don&apos;t want to see these &quot;Skipping&quot;
# messages. NOTE: the task header will still be shown regardless of whether or not the
# task is skipped.
#display_skipped_hosts = True

# by default, if a task in a playbook does not include a name: field then
# ansible-playbook will construct a header that includes the task&apos;s action but
# not the task&apos;s args.  This is a security feature because ansible cannot know
# if the *module* considers an argument to be no_log at the time that the
# header is printed.  If your environment doesn&apos;t have a problem securing
# stdout from ansible-playbook (or you have manually specified no_log in your
# playbook on all of the tasks where you have secret information) then you can
# safely set this to True to get more informative messages.
#display_args_to_stdout = False

# by default (as of 1.3), Ansible will raise errors when attempting to dereference
# Jinja2 variables that are not set in templates or action lines. Uncomment this line
# to revert the behavior to pre-1.3.
#error_on_undefined_vars = False

# by default (as of 1.6), Ansible may display warnings based on the configuration of the
# system running ansible itself. This may include warnings about 3rd party packages or
# other conditions that should be resolved if possible.
# to disable these warnings, set the following value to False:
#system_warnings = True

# by default (as of 1.4), Ansible may display deprecation warnings for language
# features that should no longer be used and will be removed in future versions.
# to disable these warnings, set the following value to False:
#deprecation_warnings = True

# (as of 1.8), Ansible can optionally warn when usage of the shell and
# command module appear to be simplified by using a default Ansible module
# instead.  These warnings can be silenced by adjusting the following
# setting or adding warn=yes or warn=no to the end of the command line
# parameter string.  This will for example suggest using the git module
# instead of shelling out to the git command.
# command_warnings = False


# set plugin path directories here, separate with colons
#action_plugins     = /usr/share/ansible/plugins/action
#become_plugins     = /usr/share/ansible/plugins/become
#cache_plugins      = /usr/share/ansible/plugins/cache
#callback_plugins   = /usr/share/ansible/plugins/callback
#connection_plugins = /usr/share/ansible/plugins/connection
#lookup_plugins     = /usr/share/ansible/plugins/lookup
#inventory_plugins  = /usr/share/ansible/plugins/inventory
#vars_plugins       = /usr/share/ansible/plugins/vars
#filter_plugins     = /usr/share/ansible/plugins/filter
#test_plugins       = /usr/share/ansible/plugins/test
#terminal_plugins   = /usr/share/ansible/plugins/terminal
#strategy_plugins   = /usr/share/ansible/plugins/strategy


# by default, ansible will use the &apos;linear&apos; strategy but you may want to try
# another one
#strategy = free

# by default callbacks are not loaded for /bin/ansible, enable this if you
# want, for example, a notification or logging callback to also apply to
# /bin/ansible runs
#bin_ansible_callbacks = False


# don&apos;t like cows?  that&apos;s unfortunate.
# set to 1 if you don&apos;t want cowsay support or export ANSIBLE_NOCOWS=1
#nocows = 1

# set which cowsay stencil you&apos;d like to use by default. When set to &apos;random&apos;,
# a random stencil will be selected for each task. The selection will be filtered
# against the `cow_whitelist` option below.
#cow_selection = default
#cow_selection = random

# when using the &apos;random&apos; option for cowsay, stencils will be restricted to this list.
# it should be formatted as a comma-separated list with no spaces between names.
# NOTE: line continuations here are for formatting purposes only, as the INI parser
#       in python does not support them.
#cow_whitelist=bud-frogs,bunny,cheese,daemon,default,dragon,elephant-in-snake,elephant,eyes,\
#              hellokitty,kitty,luke-koala,meow,milk,moofasa,moose,ren,sheep,small,stegosaurus,\
#              stimpy,supermilker,three-eyes,turkey,turtle,tux,udder,vader-koala,vader,www

# don&apos;t like colors either?
# set to 1 if you don&apos;t want colors, or export ANSIBLE_NOCOLOR=1
#nocolor = 1

# if set to a persistent type (not &apos;memory&apos;, for example &apos;redis&apos;) fact values
# from previous runs in Ansible will be stored.  This may be useful when
# wanting to use, for example, IP information from one group of servers
# without having to talk to them in the same playbook run to get their
# current IP information.
#fact_caching = memory

#This option tells Ansible where to cache facts. The value is plugin dependent.
#For the jsonfile plugin, it should be a path to a local directory.
#For the redis plugin, the value is a host:port:database triplet: fact_caching_connection = localhost:6379:0

#fact_caching_connection=/tmp



# retry files
# When a playbook fails a .retry file can be created that will be placed in ~/
# You can enable this feature by setting retry_files_enabled to True
# and you can change the location of the files by setting retry_files_save_path

#retry_files_enabled = False
#retry_files_save_path = ~/.ansible-retry

# squash actions
# Ansible can optimise actions that call modules with list parameters
# when looping. Instead of calling the module once per with_ item, the
# module is called once with all items at once. Currently this only works
# under limited circumstances, and only with parameters named &apos;name&apos;.
#squash_actions = apk,apt,dnf,homebrew,pacman,pkgng,yum,zypper

# prevents logging of task data, off by default
#no_log = False

# prevents logging of tasks, but only on the targets, data is still logged on the master/controller
#no_target_syslog = False

# controls whether Ansible will raise an error or warning if a task has no
# choice but to create world readable temporary files to execute a module on
# the remote machine.  This option is False by default for security.  Users may
# turn this on to have behaviour more like Ansible prior to 2.1.x.  See
# https://docs.ansible.com/ansible/become.html#becoming-an-unprivileged-user
# for more secure ways to fix this than enabling this option.
#allow_world_readable_tmpfiles = False

# controls the compression level of variables sent to
# worker processes. At the default of 0, no compression
# is used. This value must be an integer from 0 to 9.
#var_compression_level = 9

# controls what compression method is used for new-style ansible modules when
# they are sent to the remote system.  The compression types depend on having
# support compiled into both the controller&apos;s python and the client&apos;s python.
# The names should match with the python Zipfile compression types:
# * ZIP_STORED (no compression. available everywhere)
# * ZIP_DEFLATED (uses zlib, the default)
# These values may be set per host via the ansible_module_compression inventory
# variable
#module_compression = &apos;ZIP_DEFLATED&apos;

# This controls the cutoff point (in bytes) on --diff for files
# set to 0 for unlimited (RAM may suffer!).
#max_diff_size = 1048576

# This controls how ansible handles multiple --tags and --skip-tags arguments
# on the CLI.  If this is True then multiple arguments are merged together.  If
# it is False, then the last specified argument is used and the others are ignored.
# This option will be removed in 2.8.
#merge_multiple_cli_flags = True

# Controls showing custom stats at the end, off by default
#show_custom_stats = True

# Controls which files to ignore when using a directory as inventory with
# possibly multiple sources (both static and dynamic)
#inventory_ignore_extensions = ~, .orig, .bak, .ini, .cfg, .retry, .pyc, .pyo

# This family of modules use an alternative execution path optimized for network appliances
# only update this setting if you know how this works, otherwise it can break module execution
#network_group_modules=eos, nxos, ios, iosxr, junos, vyos

# When enabled, this option allows lookups (via variables like {{lookup(&apos;foo&apos;)}} or when used as
# a loop with `with_foo`) to return data that is not marked &quot;unsafe&quot;. This means the data may contain
# jinja2 templating language which will be run through the templating engine.
# ENABLING THIS COULD BE A SECURITY RISK
#allow_unsafe_lookups = False

# set default errors for all plays
#any_errors_fatal = False

[inventory]
# enable inventory plugins, default: &apos;host_list&apos;, &apos;script&apos;, &apos;auto&apos;, &apos;yaml&apos;, &apos;ini&apos;, &apos;toml&apos;
#enable_plugins = host_list, virtualbox, yaml, constructed

# ignore these extensions when parsing a directory as inventory source
#ignore_extensions = .pyc, .pyo, .swp, .bak, ~, .rpm, .md, .txt, ~, .orig, .ini, .cfg, .retry

# ignore files matching these patterns when parsing a directory as inventory source
#ignore_patterns=

# If &apos;true&apos; unparsed inventory sources become fatal errors, they are warnings otherwise.
#unparsed_is_failed=False

[privilege_escalation]
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False

[paramiko_connection]

# uncomment this line to cause the paramiko connection plugin to not record new host
# keys encountered.  Increases performance on new host additions.  Setting works independently of the
# host key checking setting above.
#record_host_keys=False

# by default, Ansible requests a pseudo-terminal for commands executed under sudo. Uncomment this
# line to disable this behaviour.
#pty=False

# paramiko will default to looking for SSH keys initially when trying to
# authenticate to remote devices.  This is a problem for some network devices
# that close the connection after a key failure.  Uncomment this line to
# disable the Paramiko look for keys function
#look_for_keys = False

# When using persistent connections with Paramiko, the connection runs in a
# background process.  If the host doesn&apos;t already have a valid SSH key, by
# default Ansible will prompt to add the host key.  This will cause connections
# running in background processes to fail.  Uncomment this line to have
# Paramiko automatically add host keys.
#host_key_auto_add = True

[ssh_connection]

# ssh arguments to use
# Leaving off ControlPersist will result in poor performance, so use
# paramiko on older platforms rather than removing it, -C controls compression use
#ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s

# The base directory for the ControlPath sockets.
# This is the &quot;%(directory)s&quot; in the control_path option
#
# Example:
# control_path_dir = /tmp/.ansible/cp
#control_path_dir = ~/.ansible/cp

# The path to use for the ControlPath sockets. This defaults to a hashed string of the hostname,
# port and username (empty string in the config). The hash mitigates a common problem users
# found with long hostnames and the conventional %(directory)s/ansible-ssh-%%h-%%p-%%r format.
# In those cases, a &quot;too long for Unix domain socket&quot; ssh error would occur.
#
# Example:
# control_path = %(directory)s/%%h-%%r
#control_path =

# Enabling pipelining reduces the number of SSH operations required to
# execute a module on the remote server. This can result in a significant
# performance improvement when enabled, however when using &quot;sudo:&quot; you must
# first disable &apos;requiretty&apos; in /etc/sudoers
#
# By default, this option is disabled to preserve compatibility with
# sudoers configurations that have requiretty (the default on many distros).
#
#pipelining = False

# Control the mechanism for transferring files (old)
#   * smart = try sftp and then try scp [default]
#   * True = use scp only
#   * False = use sftp only
#scp_if_ssh = smart

# Control the mechanism for transferring files (new)
# If set, this will override the scp_if_ssh option
#   * sftp  = use sftp to transfer files
#   * scp   = use scp to transfer files
#   * piped = use &apos;dd&apos; over SSH to transfer files
#   * smart = try sftp, scp, and piped, in that order [default]
#transfer_method = smart

# if False, sftp will not use batch mode to transfer files. This may cause some
# types of file transfer failures impossible to catch however, and should
# only be disabled if your sftp version has problems with batch mode
#sftp_batch_mode = False

# The -tt argument is passed to ssh when pipelining is not enabled because sudo
# requires a tty by default.
#usetty = True

# Number of times to retry an SSH connection to a host, in case of UNREACHABLE.
# For each retry attempt, there is an exponential backoff,
# so after the first attempt there is 1s wait, then 2s, 4s etc. up to 30s (max).
#retries = 3

[persistent_connection]

# Configures the persistent connection timeout value in seconds.  This value is
# how long the persistent connection will remain idle before it is destroyed.
# If the connection doesn&apos;t receive a request before the timeout value
# expires, the connection is shutdown. The default value is 30 seconds.
#connect_timeout = 30

# The command timeout value defines the amount of time to wait for a command
# or RPC call before timing out. The value for the command timeout must
# be less than the value of the persistent connection idle timeout (connect_timeout)
# The default value is 30 second.
#command_timeout = 30

[accelerate]
#accelerate_port = 5099
#accelerate_timeout = 30
#accelerate_connect_timeout = 5.0

# The daemon timeout is measured in minutes. This time is measured
# from the last activity to the accelerate daemon.
#accelerate_daemon_timeout = 30

# If set to yes, accelerate_multi_key will allow multiple
# private keys to be uploaded to it, though each user must
# have access to the system via SSH to add a new key. The default
# is &quot;no&quot;.
#accelerate_multi_key = yes

[selinux]
# file systems that require special treatment when dealing with security context
# the default behaviour that copies the existing context or uses the user default
# needs to be changed to use the file system dependent context.
#special_context_filesystems=nfs,vboxsf,fuse,ramfs,9p,vfat

# Set this to yes to allow libvirt_lxc connections to work without SELinux.
#libvirt_lxc_noseclabel = yes

[colors]
#highlight = white
#verbose = blue
#warn = bright purple
#error = red
#debug = dark gray
#deprecate = purple
#skip = cyan
#unreachable = red
#ok = green
#changed = yellow
#diff_add = green
#diff_remove = red
#diff_lines = cyan


[diff]
# Always print diff when running ( same as always running with -D/--diff )
# always = no

# Set how many context lines to show in diff
# context = 3

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/etc/ansible/hosts&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;[root@localhost 1340]# cat /etc/ansible/hosts
# This is the default ansible &apos;hosts&apos; file.
#
# It should live in /etc/ansible/hosts
#
#   - Comments begin with the &apos;#&apos; character
#   - Blank lines are ignored
#   - Groups of hosts are delimited by [header] elements
#   - You can enter hostnames or ip addresses
#   - A hostname/ip can be a member of multiple groups

# Ex 1: Ungrouped hosts, specify before any group headers.

## green.example.com
## blue.example.com
## 192.168.100.1
## 192.168.100.10

# Ex 2: A collection of hosts belonging to the &apos;webservers&apos; group

## [webservers]
## alpha.example.org
## beta.example.org
## 192.168.1.100
## 192.168.1.110

# If you have multiple hosts following a pattern you can specify
# them like this:

## www[001:006].example.com

# Ex 3: A collection of database servers in the &apos;dbservers&apos; group

## [dbservers]
##
## db01.intranet.mydomain.net
## db02.intranet.mydomain.net
## 10.25.1.56
## 10.25.1.57

# Here&apos;s another example of host ranges, this time there are no
# leading 0s:

## db-[99:101]-node.example.com

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Playbook&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;YAML形式で記載する&lt;/li&gt;
&lt;li&gt;実行するには&lt;code&gt;ansible-playbook&lt;/code&gt;コマンドを使う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ansibleの活用&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アプリケーションのリリース&lt;/li&gt;
&lt;li&gt;仮想サーバー・コンテナの払い出し
&lt;ul&gt;
&lt;li&gt;KVMによる仮想マシンや、Dockerコンテナ、コンテナイメージの作成などを自動化できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ネットワーク機器の管理
&lt;ul&gt;
&lt;li&gt;CISCOを始めとするネットワークベンダーの様々なネットワーク機器に対応しており、ネットワーク機器の設定や情報収集に利用できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;練習問題&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;4.1 gitコマンド
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git clone http://github/xxxx&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;4.2 gzファイルを展開する方法
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gunzip newsoft.tar.gx ; tar xvf newsoft.tar&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tar zxvf newsoft.tar.gz&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gzip -dc newsoft.tar.gz | tar xvf -&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;4.3 &lt;code&gt;make&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;./configure&lt;/code&gt;でMackefileを作成&lt;/li&gt;
&lt;li&gt;&lt;code&gt;make&lt;/code&gt;コマンドでMakefileに基づいてコンパイルを行う&lt;/li&gt;
&lt;li&gt;&lt;code&gt;make install&lt;/code&gt;コマンドでコンパイル済みのファイルをインストール&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;4.4 パッチの適用を取り消すには？patchコマンドでなんというオプション？
&lt;ul&gt;
&lt;li&gt;R&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;4.5 &lt;code&gt;dd if=/dev/sdb of=/dev/sdc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;4.6 &lt;code&gt;tar cvf /dev/st0 /home&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;tar [option] [アーカイブ先] [アーカイブ元]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;4.7 /dataディレクトリ以下を、ホストjupiterの/backupディレクトリにバックアップ
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;rsync -auvz -e ssh /data/ march@jupiter:/backup&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;TODO: rsyncコマンド使ってみる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;4.8 メンテナンス情報を通知する方法&lt;/li&gt;
&lt;li&gt;4.9 スワップ領域がどの程度利用されているのか、その容量を計測したい場合のコマンド
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;vmstat&lt;/code&gt;,&lt;code&gt;cat /proc/swaps&lt;/code&gt;,&lt;code&gt;free&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;swapon&lt;/code&gt;,&lt;code&gt;/proc/meminfo&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;4.10 vmstatコマンドで使用率が高いと考えられるリソース
&lt;ul&gt;
&lt;li&gt;TODO: vmstatコマンドの見方再確認&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;4.11 sarで今月の15日の記録を見たい
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sar -b -f /var/log/sa/sa15&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;4.12 次のコマンド実行結果の説明
&lt;ul&gt;
&lt;li&gt;vmstat 30 50
&lt;ul&gt;
&lt;li&gt;30秒間隔で計測結果が50回表示される&lt;/li&gt;
&lt;li&gt;使用中のスワップ領域サイズが表示される&lt;/li&gt;
&lt;li&gt;バッファキャッシュとページキャッシュの利用状況が表示される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;4.13 プロセスごとにメモリ使用量を把握したい
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;top&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ps aux&lt;/code&gt;でもわかる。&lt;code&gt;ps -ex&lt;/code&gt;は、Unix98オプションとGNUオプションを続けて指定できないためエラーになる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;4.14 物理メモリが枯渇してしまう前にプロセスを強制終了し、そのプロセスが使っていたメモリを開放する仕組み
&lt;ul&gt;
&lt;li&gt;OOM Killer&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;4.15 Ansibleの説明について&lt;/li&gt;
&lt;li&gt;4.16 Ansilbeをインストール下ホストで以下のコマンドを実行
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ansible-playbook -i localtest test_playbook.yml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;TODO: ansibleを実際に使ってみる必要ある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第5章　仮想化サーバー&lt;/h2&gt;
&lt;h3&gt;5.1　仮想マシンの仕組みとKVM&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;仮想化&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ホスト型仮想化：仮想化ソフトウェアをインストールし、仮想化ソフトウェアが作り出した仮想マシン上にOSをインストールする方式
&lt;ul&gt;
&lt;li&gt;ホストOSとゲストOSに分けられる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ハイパーバイザー型仮想化：コンピュータ上にハイパーバイザと呼ばれる仮想化管理機構を用意し、その上で仮想マシンを動かす方式
&lt;ul&gt;
&lt;li&gt;ホスト型仮想化よりも高いパフォーマンスを期待できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;仮想化のメリット・デメリット&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;メリット：
&lt;ul&gt;
&lt;li&gt;トータルの運用コストを削減できる&lt;/li&gt;
&lt;li&gt;リソースの変化に柔軟に対応できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;デメリット：
&lt;ul&gt;
&lt;li&gt;仮想マシンのホストに障害が発生したい場合、複数の仮想マシンが影響&lt;/li&gt;
&lt;li&gt;物理サーバとは違った形での運用スキルやセキュリティ対策が必要&lt;/li&gt;
&lt;li&gt;ハードウェア上で直接OSを動作させるのに比べてパフォーマンスが低下してしまう
&lt;ul&gt;
&lt;li&gt;オーバーヘッドを低減するCPUの仮想化支援機能
&lt;ul&gt;
&lt;li&gt;Intel社のCPUに搭載されているVT-x&lt;/li&gt;
&lt;li&gt;AMD社のCPUに搭載されているADM-V&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;KVM&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPUが仮想化支援機構に対応しているかどうかを確認するコマンド：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;lscpu | grep Virtualization&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grep -E &apos;vmx|svm&apos; /proc/cpuinfo&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.2　仮想マシンの作成と管理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;KVM環境の構築&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;手順
&lt;ul&gt;
&lt;li&gt;KVMと関連ツールおよびQEMU(ハードウェアエミュレータ)をインストール
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;yum install libvirt bridge-utils qemu-kvm virt-manager virt-install&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;systemctl start libvirt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;systemctl enable libvirt&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ブリッジネットワークを設定する
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;nmcli con add type bridge con-name br0 ifname br0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nmcli con mod br0 ipv4.method manual ipv4.addresses &quot;192.168.1.80/24&quot; ipv4.gateway &quot;192.168.1.1&quot; ipv4.dns &quot;192.168.1.1&quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;仮想マシンを作成する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;実際にvirshを使った操作が紹介されているが試す環境ないので割愛&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;練習問題&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;5.1 ホスト型とハイパーバイザ型の問題&lt;/li&gt;
&lt;li&gt;5.2 &lt;code&gt;cat /proc/cpuinfo | grep flags | uniq&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;KVMを利用するには、CPUが仮想化支援機能に対応している必要がある（IntelのVT-xかAMDのAMD-V）&lt;/li&gt;
&lt;li&gt;中の文字列に、「vmx」か「svm」がなければ対応しない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;5.3 CUI環境でKVM観葉マシンを作成してゲストOSをインストールするには
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;virt-install&lt;/code&gt;コマンドを使う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;5.4 KVMを使って仮想マシンを運用したい
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;systemctl enamble libvirt&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;libvirtは仮想マシンの制御を抽象化したライブラリ&lt;/li&gt;
&lt;li&gt;KVMを使って仮想マシンを運用するには、libvirtサービスを起動しておく必要がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;5.5 KVM仮想マシンを作成してCentOS7をインストールしたい
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;virt-install&lt;/code&gt;コマンド&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;5.6 コマンドラインからKVM仮想マシン「vm01」に接続してコマンド操作をしようとしています。
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;virsh console vm01&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第6章　コンテナ&lt;/h2&gt;
&lt;h3&gt;6.1　コンテナの仕組み&lt;/h3&gt;
&lt;p&gt;仮想マシンと並んでよく使われる仮想化技術&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;コンテナ型仮想化&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;仮想マシンを動かす技術ではなく、独立下環境でアプリケーションを動かす技術&lt;/li&gt;
&lt;li&gt;コンテナ型仮想化ではホストOSとカーネルを共有するので仮想マシンよりもコンテナのほうがシステムリソースの消費が少なくて済む&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;参考&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;特定のサーバープロセスなどアプリケーションのみを実行するコンテナをアプリケーションコンテナ&lt;/li&gt;
&lt;li&gt;一連のシステムプロセス群を実行し仮想マシンに近いコンテナをシステムコンテナということがあります。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;名前空間とcgroup&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;名前空間
&lt;ul&gt;
&lt;li&gt;コンテナの隔離に使われているカーネルの機能のこと&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;cgroup
&lt;ul&gt;
&lt;li&gt;プロセスをグループ化して管理する仕組み&lt;/li&gt;
&lt;li&gt;グループごとにシステムリソースの利用に制限をかけることができる&lt;/li&gt;
&lt;li&gt;管理できるシステムリソースは&lt;code&gt;ls /sys/fs/cgroup/&lt;/code&gt;で確認できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Docker&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コンテナ化する仕組みをDockerエンジンといいます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6.2　Dockerコンテナとコンテナイメージの管理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Dockerの導入&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;yum install docker&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;systemctl start docker.service&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker version&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;dockerコマンド&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;実行するにはroot権限が必要&lt;/li&gt;
&lt;li&gt;一般ユーザでも実行させるにはdockerグループに所属させる必要がある&lt;/li&gt;
&lt;li&gt;&lt;code&gt;groupadd docker&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;usermod -aG docker linucuser&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;dockerの基本操作&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コンテナイメージの取得
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docker pull centos:8&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ディスク容量不足になったのでvirtualboxの容量増やす&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://cream-worker.blog.jp/archives/1077340749.html&quot;&gt;https://cream-worker.blog.jp/archives/1077340749.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;docker pull centos:8
docker images
docker create --name mycentos8 centos:8
docker start mycentos8
# dokcer pull/create/start をあわせた動きが docekr runコマンド
docker run centos:8 cat /etc/redhat-release
docker ps
docker ps -a
docker rm [コンテナIDorコンテナ名]

# コンテナへのログイン
# docker run -it --name コンテナ名 イメージ名:タグ名 シェル
docker run -it --name mucentos centos:8 /bin/bash
uname -a # あくまでホストOSのカーネル情報が見える
Ctrl + p, Ctrl + q で抜ける
docker ps # プロセスが立ち上がっていることを確認
docker attach mycentos
exit # exitで抜けるとcontainerが落ちる
docker ps



&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;仮想ネットワークの利用&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;docker run -itd --name centosA cenots:8 /bin/bash
docker run -itd --name centosB cenots:8 /bin/bash
docker ps
docker exec centosA /sbin/ip a
docker exec centosB /sbin/ip a

# ホストOS側にdocker0というネットワークインターフェースが作成されているのがわかる
ip a show docker0

# 仮想ネットワークを新しく作成することもできる
docker network create mynetwork
docker network connect mynetwork centosA
docker network connect mynetwork centosB

docker exec centosA /sbin/ip a
docker exec centosB /sbin/ip a

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;dockerイメージの作成&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;docker run -it centos:8 /bin/bash

echo &quot;My Docker Image&quot; &amp;gt;&amp;gt; /root/docker.txt
exit

docker commit [コンテナID/コンテナ名] test/centos
docker images

docker run test/centos cat /root/docker.txt
docker rmi test/centos

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;ポート変換&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;docker run --name nginxtest -d -p 8080:80 nginx

docker run --name nginxtest2 -v /home/tomo/html:/usr/share/nginx/html -d -p 8080:80 nginx
# 権限が足りずうまく行かなかった


&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Dcokerfile
&lt;ul&gt;
&lt;li&gt;既存のDockerイメージに操作を加えて、新しいDockerイメージを作ることができる&lt;/li&gt;
&lt;li&gt;Dockerfileに記述して独自のイメージを作成する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;FROM centos:8
MAINTAINER testimage &amp;lt;linucuser@example.com&amp;gt;

RUN yum -y install httpd

EXPOSE 80

CMD [&quot;/usr/sbin/httpd&quot;,&quot;-DFOREGROUND&quot;]

&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;docker build -t local/centos:apache .
docker images

# 作成したDockerイメージからコンテナ名「apachetest」としてコンテナを作成、起動
docker run --name apachetest -d -p 8080:80 local/centos:apache

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;コンテナの運用・管理コマンド&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# コンテナの状態を詳しく確認できる
docker stats

# 圧縮アーカイブファイルを取得してDockerイメージを生成
docker import http://example.com/exampleimage.tgz

# コンテナ内のすべてのプロセスを一時停止/再開
docker pause
docker unpause

# コンテナ終了
docker stop
# docker stopコマンドで終了できない場合に利用 メインプロセスに対してKILLシグナルを送信してコンテナを終了します。
docker kill

# プライベートレジストリの構築
docker run -d -p 5000:5000 --name registry registry:2
docker pull ubuntu
docker tag ubuntu:latest localhost:5000/ubuntu
docker push localhost:5000/ubuntu

docker images

docker pull localhost:5000/ubuntu
# ローカルレジストリ削除
docker stop registry &amp;amp;&amp;amp; docker rm -v registry

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;練習問題&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;6.1 仮想マシンと比較した際、コンテナにはどういうメリットがあるか
&lt;ul&gt;
&lt;li&gt;カーネルはホストOSのものを利用するのでシステムリソースの消費が少なくて済む&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;6.2 dockerコマンド
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docker pull centos:8&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker create --name testctl centos:8&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dokcer start testctl&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;6.3 起動中コンテナのシェルに接続
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docker attach testct2&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;6.4 改変を加えたコンテナから新しいDockerイメージを作成する際のコマンド
&lt;ul&gt;
&lt;li&gt;docker commit&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;6.5 Dockerfile&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第7章　201模擬試験&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;TODO: Q1.
&lt;ul&gt;
&lt;li&gt;EFIシステムパーティションはFAT（またはVFAT）でフォーマットされる&lt;/li&gt;
&lt;li&gt;BIOSはマザーボード上のフラッシュメモリに保存される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;TODO: Q2.GRUB2の設定ファイル&lt;code&gt;/etc/default/grub&lt;/code&gt;の変更後は、&lt;code&gt;grub-mkconfig&lt;/code&gt;コマンドを実行して&lt;code&gt;/boot/grub/grub.cfg&lt;/code&gt;ファイルを生成する必要がある&lt;/li&gt;
&lt;li&gt;TODO: Q3.GRUB2ブートローダ&lt;/li&gt;
&lt;li&gt;TODO: Q4.GRUBを再インストールするには
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;grub2-install /dev/sda&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;TODO: Q5.systemdについて
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/usr/lib/systemd/system&lt;/code&gt;ディレクトリ：デフォルトのUnitファイル&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/systemd/system&lt;/code&gt;ディレクトリ：管理者がカスタマイズするUnitファイル&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q6.systemd postfix.serviceが自動起動するように設定
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;systemctl enable postfix.service&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;TODO: Q7.システムメンテナンスを行うためレスキューモードに移行
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;systemctl isolate rescue.target&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;TODO: Q8.&lt;code&gt;/boot&lt;/code&gt;ディレクトリ以下にあるファイルのうち、カーネルイメージを選択
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/boot/vmlinuz-カーネルバージョン&lt;/code&gt;という名前のファイル&lt;/li&gt;
&lt;li&gt;自己解凍される圧縮ファイルとなっている&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/boot/initamfs&lt;/code&gt;や&lt;code&gt;/boot/initrd&lt;/code&gt;は初期RAMディスクファイル&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/boot/System.map&lt;/code&gt;はシンボルのマッピングファイル&lt;/li&gt;
&lt;li&gt;configはカーネルコンフィギュレーションファイル&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;TODO: Q9.現在利用中のカーネルバージョンを表示することができるコマンド
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;uname -r&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cat /proc/version&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;TODO: Q10.カーネルのコンフィギュレーションが保存されるファイルのファイル名
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/usr/src/linux/.config&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;TODO: Q11.初期RAMディスクの作成ができるコマンド
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mkinitrd&lt;/code&gt;,&lt;code&gt;mkinitramfs&lt;/code&gt;,&lt;code&gt;dracut&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q12.systemdを採用したシステムでsshdサービスのログを取得
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;journalctl -u sshd.service&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;TODO: Q13. udevを使用している場合、&lt;code&gt;.rules&lt;/code&gt;ファイルが格納されているデフォルトのディレクトリ
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/etc/udev/udev.conf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/udev/rules.d&lt;/code&gt;ディレクトリ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;TODO: Q14.PCIデバイスの情報を集めている。1番目のバス、8番目のスロットに関する詳細な情報を表示
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;lspci -vv -s 0:8&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;TODO: Q15.&lt;code&gt;/etc/fstab&lt;/code&gt;ファイルの書式
&lt;ul&gt;
&lt;li&gt;ファイルシステムの情報が記載されたファイル&lt;/li&gt;
&lt;li&gt;デバイスファイル名またはUUIDまたはラベル　マウントポイント　ファイルシステムの種類　マウントオプション　dumpフラグ　fsckのチェック順&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;TODO: Q16.現在マウントされているファイルシステムとそのマウントオプションを確認
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/etc/mtab&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/proc/mounts&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;TODO: Q17.有効になっているスワップ領域を確認するコマンド
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cat /proc/swaps&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;swapon -s&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q18.ext4ファイルシステムをブロクサイズ4096バイトで作成したい場合
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mke2fs -b 4096 -t ext4 /dev/sdb1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;TODO: Q19.Btrfsを使っている。/mntにマウントしているトップレベルのサブボリュームの下に、/mnt/sub1というボリュームを作ろうとしている。
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;btrfs subvolume create /mnt/sub1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;TODO: Q20./dev/sda5にはext2ファイルシステムが格納されている。このファイルシステム内のデータに影響を与えずに、ext3ファイルシステムに変換したい場合
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tune2fs -j /dev/sda5&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;既存のext2ファイルシステムに影響を与えずにext3ファイルシステムに変換できる
&lt;ul&gt;
&lt;li&gt;他のオプションも含めて確認する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q21.LVMの論理ボリューム/dev/centos/rootｎ構築されたXFSファイルシステムの情報を確認
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;xfs_info&lt;/code&gt;: XFSファイルシステムの情報を確認できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q22.パーティションやディスクに対してLVMの物理ボリュームを作成するコマンド
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pvcreate&lt;/code&gt;:物理ボリュームを作成&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vgcreate&lt;/code&gt;:ボリュームグループを作成&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lvcreate&lt;/code&gt;:論理ボリュームを作成&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q23.ボリュームグループvolgroup1の空き容量が不足してきたので、物理ボリューム/dev/sdd1をvolgroup1に追加したい
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;vgextend volgroup1 /dev/sdd1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q24./dev/vg01/lv01のスナップショットをlv01_snapという名前で作成しようとしている
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;lvcreate -s -L 500m -n lv01_snap /dev/vg01/lv01&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;スナップショットを作成するには、lvcreateに-sオプションをつける&lt;/li&gt;
&lt;li&gt;-Lはサイズの指定、-nはスナップショットの名称を指定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q25.LAN内に存在するホストをしるために、IPアドレスとMACアドレスとの対応テーブルを作成したい場合実行すべきこと
&lt;ul&gt;
&lt;li&gt;LAN内のブロードキャストアドレスに対してpingコマンドを実行し、次にarpコマンドを実行する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q26.デフォルトゲートウェイを192.168.1.1に設定しようとしている
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ip route add default via 192.168.1.1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;route add default gw 192.168.1.1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q27.無線ネットワークに関わるコマンドや説明で適切なもの
&lt;ul&gt;
&lt;li&gt;iwconfigコマンドで無線LANインターフェースの状態を表示できる&lt;/li&gt;
&lt;li&gt;無線LANのアクセスポイントを識別するIDとしてSSID・ESSIDがある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q28.ルーティングテーブル系問題&lt;/li&gt;
&lt;li&gt;Q29.tcpdumpコマンドの出力結果読み解き問題 クライアントのIPアドレスはどれか&lt;/li&gt;
&lt;li&gt;Q30.ルーティングテーブル系問題&lt;/li&gt;
&lt;li&gt;Q31.ネットワークに異常がみられるので、ルーティングテーブルを表示しようとしている。
&lt;ul&gt;
&lt;li&gt;DNSの問題と切り離すため、名前解決せずに表示させたい場合、routeコマンドにどのオプションをつければよいか
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;route -n&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;netstat -rn&lt;/code&gt;でも同じ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q32.パケットの受信および転送におけるエラーや取りこぼしの状況をネットワークインターフェースごとに表示することができるコマンド
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;netstat -i&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q33.ターゲットホストまでのネットワーク経路を確認
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mtr&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;traceroute&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tracepath&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q34.gitコマンド系
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git clone https://github.com/xxxxxx&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q35.ソフトウェアをソースコードからコンパイルしてインストールするときの説明
&lt;ul&gt;
&lt;li&gt;makeコマンドを利用してもソフトウェア間の依存関係を解消できない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q36.gccコンパイラがなくてconfigureとmakeでエラー&lt;/li&gt;
&lt;li&gt;Q37.ソースコードに適用したパッチを取り消したい場合、patchコマンドでは何というオプションを指定すればいいか
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;patch -R p0 &amp;lt; patch-2.3.4&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q38.バックアップメディアの必要本数問題&lt;/li&gt;
&lt;li&gt;Q39.dumpコマンド
&lt;ul&gt;
&lt;li&gt;ファイルシステム単位でext2/ext3/ext4ファイルシステムをバックアップ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q40.ログインプロンプトの上方に表示されるディストリビューション情報などを編集したい
&lt;ul&gt;
&lt;li&gt;編集すべきファイル「&lt;code&gt;/etc/issue&lt;/code&gt;」&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q41.ファイルシステムやディスクのI/Oを計測できるコマンドを2つ選択してください
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;iostat&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;iotop&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q42.vmstatの出力結果
&lt;ul&gt;
&lt;li&gt;bi:block in ブロックデバイスから受け取ったブロック数(ブロック数/秒)&lt;/li&gt;
&lt;li&gt;r: 実行待ちプロセス数&lt;/li&gt;
&lt;li&gt;bo: ブロックデバイスに送られたブロック数(ブロック数/秒)&lt;/li&gt;
&lt;li&gt;wa: 入出力待ち時間&lt;/li&gt;
&lt;li&gt;b: 割り込み不可能なスリープ状態にあるプロセス数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q43.freeコマンドからメモリとスワップ領域の状態について読み取る問題&lt;/li&gt;
&lt;li&gt;Q44.vmstatコマンドの実行結果から読み取る問題&lt;/li&gt;
&lt;li&gt;Q45.Webブラウザ経由でサーバーのCPU利用率やネットワークのトラフィックを監視したいときに導入すべきソフトウェア
&lt;ul&gt;
&lt;li&gt;collectd,Nagios,MRTG,Cacti,Icinga2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q46.SNMPに関する説明
&lt;ul&gt;
&lt;li&gt;SNMPマネージャからSNMPエージェント側に情報を求めることをポーリングという&lt;/li&gt;
&lt;li&gt;障害発生時にSNMPマネージャへ通知する異常通知データをTRAPという&lt;/li&gt;
&lt;li&gt;SNMPではUDPの161と162が使われる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q47.Ansibleに関する説明
&lt;ul&gt;
&lt;li&gt;インベントリにはシステム構成処理が実行されるホストのリストが記述されている&lt;/li&gt;
&lt;li&gt;AnsibleのターゲットノードはLinuxホスト以外にも対応&lt;/li&gt;
&lt;li&gt;冪等性とはある操作を何度行っても同じ結果になること&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q48.Ansibleの導入目的として不適切なものを１つ
&lt;ul&gt;
&lt;li&gt;サーバーのセキュリティを高める&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q49.playbookを実行するコマンド
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ansilbe-playbook -i server.hosts sample_playbook.yml&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q50.ハイパーバイザ型仮想化の説明
&lt;ul&gt;
&lt;li&gt;1つのハードウェア上で複数のOSを仮想マシン上で実行できる&lt;/li&gt;
&lt;li&gt;ホストOSのハードウェア障害は仮想マシンから特定しづらい&lt;/li&gt;
&lt;li&gt;CPUの仮想化支援機能を利用できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q51.サーバーのCPUがKVMに対応しているかどうかを調べる
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cat /proc/cpuinfo | grep flags | uniq&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;根拠となるフラグ：vmx or svm&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q52.仮想マシンのネットワークインターフェースをホストOSのネットワークインターフェースと同じネットワークに配置する仕組みをなんと呼ぶか？
&lt;ul&gt;
&lt;li&gt;ブリッジネットワーク&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q53.GUI環境で仮想マシンを管理：virt-manager&lt;/li&gt;
&lt;li&gt;Q54.virsh は仮想マシン操作のためのコマンドラインインターフェース
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;virsh shutdown vm_centos7&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q55.コマンドラインで仮想マシンを作成してOSをインストールするためのコマンド
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;virt-install&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;Q56.コンテナに関する説明で誤っているもの&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;Q57.Dockerの説明としてただしいもの
&lt;ul&gt;
&lt;li&gt;ホストOSのディレクトリをコンテナ内からアクセスできるように設定できる&lt;/li&gt;
&lt;li&gt;DockerレジストリでDockerイメージを入手できる&lt;/li&gt;
&lt;li&gt;DockerではLinuxカーネルの機能であるcgroupが使われる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q58.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docker run -it alpine:latest /bin/sh&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q59.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docker attach [id]&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;バックグラウンドで起動中のコンテナに入るにはattachを使う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q60.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docker images&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;模擬試験 問題&lt;/h2&gt;
&lt;h2&gt;模擬試験 解答・解説&lt;/h2&gt;
&lt;h2&gt;■第2部　202試験（LinuC Level2 Exam 202）&lt;/h2&gt;
&lt;h2&gt;第8章　ネットワーククライアントの管理&lt;/h2&gt;
&lt;h3&gt;8.1　DHCPの設定&lt;/h3&gt;
&lt;h3&gt;8.2　PAM認証&lt;/h3&gt;
&lt;h3&gt;8.3　LDAP&lt;/h3&gt;
&lt;h2&gt;第9章　ドメインネームサーバー&lt;/h2&gt;
&lt;h3&gt;9.1　DNSの基本&lt;/h3&gt;
&lt;h3&gt;9.2　BINDの基本設定&lt;/h3&gt;
&lt;h3&gt;9.3　ゾーンファイルの管理&lt;/h3&gt;
&lt;h3&gt;9.4　DNSサーバーのセキュリティ&lt;/h3&gt;
&lt;h2&gt;第10章　HTTPサーバーとプロキシサーバー&lt;/h2&gt;
&lt;h3&gt;10.1　Webサーバーの設定&lt;/h3&gt;
&lt;h3&gt;10.2　Nginx&lt;/h3&gt;
&lt;h3&gt;10.3　プロキシサーバーの設定&lt;/h3&gt;
&lt;h2&gt;第11章　電子メールサービス&lt;/h2&gt;
&lt;h3&gt;11.1　SMTPサーバーの構築&lt;/h3&gt;
&lt;h3&gt;11.2　Dovecotの利用&lt;/h3&gt;
&lt;h2&gt;第12章　ファイル共有サービス&lt;/h2&gt;
&lt;h3&gt;12.1　Microsoftネットワーク&lt;/h3&gt;
&lt;h3&gt;12.2　Sambaサーバーの構築&lt;/h3&gt;
&lt;h3&gt;12.3　NFSサーバーの構築&lt;/h3&gt;
&lt;h2&gt;第13章　システムのセキュリティ&lt;/h2&gt;
&lt;h3&gt;13.1　パケットフィルタリング&lt;/h3&gt;
&lt;h3&gt;13.2　OpenSSH&lt;/h3&gt;
&lt;h3&gt;13.3　OpenVPN&lt;/h3&gt;
&lt;h3&gt;13.4　セキュリティ業務&lt;/h3&gt;
&lt;h2&gt;第14章　システムアーキテクチャ&lt;/h2&gt;
&lt;h3&gt;14.1　高可用システムの実現方法&lt;/h3&gt;
&lt;h3&gt;14.2　キャパシティプランニングとスケーラビリティの確保&lt;/h3&gt;
&lt;h3&gt;14.3　クラウドサービス上のシステム構成&lt;/h3&gt;
&lt;h3&gt;14.4　典型的なシステムアーキテクチャ&lt;/h3&gt;
&lt;h2&gt;第15章　202模擬試験&lt;/h2&gt;
&lt;h2&gt;模擬試験 問題&lt;/h2&gt;
&lt;h2&gt;模擬試験 解答・解説&lt;/h2&gt;
&lt;h2&gt;付録　Linux実習環境の使い方&lt;/h2&gt;
&lt;h2&gt;Linux実習環境の利用について&lt;/h2&gt;
&lt;h2&gt;VirtualBoxのインストール&lt;/h2&gt;
&lt;h2&gt;仮想マシンの使い方&lt;/h2&gt;
</content:encoded></item><item><title>安全なWebアプリケーションの作り方_脆弱性が生まれる原理と対策の実践_第2版</title><link>https://tutttuwi.github.io/posts/2020-08_%E5%AE%89%E5%85%A8%E3%81%AAweb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9_%E8%84%86%E5%BC%B1%E6%80%A7%E3%81%8C%E7%94%9F%E3%81%BE%E3%82%8C%E3%82%8B%E5%8E%9F%E7%90%86%E3%81%A8%E5%AF%BE%E7%AD%96%E3%81%AE%E5%AE%9F%E8%B7%B5_%E7%AC%AC2%E7%89%88/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2020-08_%E5%AE%89%E5%85%A8%E3%81%AAweb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9_%E8%84%86%E5%BC%B1%E6%80%A7%E3%81%8C%E7%94%9F%E3%81%BE%E3%82%8C%E3%82%8B%E5%8E%9F%E7%90%86%E3%81%A8%E5%AF%BE%E7%AD%96%E3%81%AE%E5%AE%9F%E8%B7%B5_%E7%AC%AC2%E7%89%88/</guid><pubDate>Thu, 20 Aug 2020 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;安全なWebアプリケーションの作り方_脆弱性が生まれる原理と対策の実践_第2版&lt;/h1&gt;
&lt;h2&gt;理解したこと&lt;/h2&gt;
&lt;h2&gt;書籍情報&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;著者&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;徳丸浩:ＥＧセキュアソリューションズ株式会社代表、ＯＷＡＳＰ Ｊａｐａｎアドバイザリーボード、独占行政法人情報処理推進機構（ＩＰＡ）非常勤研究員&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;定価&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;3,520円&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;発売日&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2018/06/22&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ISBN&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;978-4-7973-9316-3&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ｗｅｂアプリ開発者が知っておくべき攻撃と防御の知識を徹底解説。脆弱性が生まれる原理と具体的な対処法が学べる。実習用仮想マシンのダウンロードサービス付き。ＯＷＡＳＰ Ｔｏｐ１０−２０１７対応。【「TRC MARC」の商品解説】&lt;/p&gt;
&lt;p&gt;日本中の現場で支持されたベストセラーが、最新環境にあわせて全面刷新＋大増ページ！&lt;/p&gt;
&lt;p&gt;Webアプリケーションにはなぜ脆弱性が生まれるのか？
脆弱性を解消するにはどうプログラミングすればよいか？
PHPサンプルへの攻撃を通して脆弱性が生まれる原理と具体的な対処方法が学べる！&lt;/p&gt;
&lt;p&gt;Webアプリ開発者の必読書、待望の改訂版！
OWASP Top 10 - 2017対応&lt;/p&gt;
&lt;p&gt;&amp;lt;主な改訂内容&amp;gt;
・HTML5の普及に対応してWeb APIやJavaScriptに関する解説を新設
・OWASP Top 10 - 2017に対応して、XXEや安全でないデシリアライゼーションなどを解説
・脆弱性診断に対する関心が高まっていることから、脆弱性診断の入門の章を親設
・IE7のサポート終了など現在のソフトウェアの状況に対応
・実習環境をWindowsに加えてMacにも対応【商品解説】&lt;/p&gt;
&lt;h2&gt;1章 Webアプリケーションの脆弱性とは&lt;/h2&gt;
&lt;h3&gt;1.1 脆弱性とは、「悪用できるバグ」&lt;/h3&gt;
&lt;p&gt;脆弱性(vulnerability)とは：バグの中でも悪用できてしまうもの&lt;/p&gt;
&lt;h3&gt;1.2 脆弱性があるとなぜ駄目なのか&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;経済的損失&lt;/li&gt;
&lt;li&gt;法的な要求&lt;/li&gt;
&lt;li&gt;利用者が回復不可能なダメージを受ける場合が多い&lt;/li&gt;
&lt;li&gt;Webサイト利用者に嘘をつくことになる&lt;/li&gt;
&lt;li&gt;攻撃インフラ（ボットネットワークなど）構築に荷担してしまう&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.3 脆弱性が生まれる理由&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;理由
&lt;ul&gt;
&lt;li&gt;(A)バグによるもの：XSS&lt;/li&gt;
&lt;li&gt;(B)チェック機能の不足によるもの：ディレクトリトラバーサルなど&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.4 セキュリティバグとセキュリティ機能&lt;/h3&gt;
&lt;h3&gt;1.5 本書の構成&lt;/h3&gt;
&lt;h3&gt;1.6 セキュリティガイドラインとの対応&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ガイドライン２種類
&lt;ul&gt;
&lt;li&gt;安全なウェブサイトの作り方&lt;/li&gt;
&lt;li&gt;OWASP Top 10&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本書の項目との対応表の説明&lt;/p&gt;
&lt;h2&gt;2章 実習環境のセットアップ&lt;/h2&gt;
&lt;h3&gt;2.1 実習環境の概要&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;サンプルを動かす環境&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Linux&lt;/li&gt;
&lt;li&gt;nginx 1.10&lt;/li&gt;
&lt;li&gt;Apache 2.4&lt;/li&gt;
&lt;li&gt;PHP 5.3 / PHP 7.0&lt;/li&gt;
&lt;li&gt;Tomcat 8.5&lt;/li&gt;
&lt;li&gt;MariaDB 10.1&lt;/li&gt;
&lt;li&gt;Postfix 3.1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;インストールするプログラム&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Firefox&lt;/li&gt;
&lt;li&gt;VirtualBox&lt;/li&gt;
&lt;li&gt;仮想マシン&lt;/li&gt;
&lt;li&gt;OWASP ZAP(脆弱性診断に用いるツール)&lt;/li&gt;
&lt;li&gt;FoxyProxy-Standard(プロキシを切り替えるFirefoxアドオン)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;実習用仮想マシンのダウンロード&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://wasbook.org/download/&quot;&gt;https://wasbook.org/download/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.2 Firefoxのインストール&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;XSSフィルタが標準では実装されていないのでクロスサイトスクリプティングという脆弱性の体験がやりやすい&lt;/li&gt;
&lt;li&gt;ダウンロードURL
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mozilla.org/ja/firefox/new/&quot;&gt;https://www.mozilla.org/ja/firefox/new/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.3 VirtualBoxのインストール&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ダウンロードURL
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.virtualbox.org/&quot;&gt;https://www.virtualbox.org/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.4 仮想マシンのインストールと動作確認&lt;/h3&gt;
&lt;p&gt;wasbookのOSイメージをインポート
ホストネットワークマネージャを設定
ゲストOSの設定＞ネットワークより以下を確認
アダプター１にNATが設定されている
アダプター２にホストオンリーアダプター、名前に先程ホストネットワークマネージャより設定した名前が選択されていること&lt;/p&gt;
&lt;p&gt;ゲストOSを起動してログイン
&lt;code&gt;ip a&lt;/code&gt;でアドレス確認
ホストOSからping疎通&lt;/p&gt;
&lt;h3&gt;2.5 OWASP ZAPのインストール&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;OWASP ZAPとは&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OWASP ZAP(OWASP Zed Attack Proxy)は、OWASP(The Open Web Application Security Project)が開発・公開しているWebアプリケーション脆弱性診断用ツールで、無償で公開されている&lt;/li&gt;
&lt;li&gt;OWASP ZAPはWindowsPC/Mac上でプロキシとして動作し、HTTP通信を観察したり、変更したりすることができる&lt;/li&gt;
&lt;li&gt;同種のツールに、Burp SuiteやFiddlerなどがあるが、本書では以下の理由でこちらを使う
&lt;ul&gt;
&lt;li&gt;完全に無償で利用できる&lt;/li&gt;
&lt;li&gt;自動の診断ツールが手軽に利用できる&lt;/li&gt;
&lt;li&gt;WindowsとmacOSの両方で利用できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JREのインストール&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OWASP ZAPはJavaで記述されているので実行環境が必要&lt;/li&gt;
&lt;li&gt;ただしmacOS版のOWASP ZAPはJRE版が同梱されているのでJREをインストールする必要はありません&lt;/li&gt;
&lt;li&gt;Windowsは必要があればJREをインストール
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;java -version&lt;/code&gt;で確認&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OWASP ZAPのインストール&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://owasp.org/www-project-zap/&quot;&gt;https://owasp.org/www-project-zap/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;JRE実行環境とbit数をあわせること&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;オプションの設定を行っておく&lt;/p&gt;
&lt;h3&gt;2.6 Firefoxの拡張FoxyProxy-Standardのインストール&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ForxProxy Satandard
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://addons.mozilla.org/ja/firefox/addon/foxyproxy-standard/&quot;&gt;https://addons.mozilla.org/ja/firefox/addon/foxyproxy-standard/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;アドオン内のプロキシ設定を修正&lt;/p&gt;
&lt;h3&gt;2.7 OWASP ZAPを使ってみる&lt;/h3&gt;
&lt;p&gt;実際にFireFoxからアクセスして記録されるかどうかを確認する&lt;/p&gt;
&lt;h3&gt;2.8 Webメールの確認&lt;/h3&gt;
&lt;p&gt;本書では、メール処理に伴う脆弱性でメールを送信したり、
脆弱性に対する攻撃でメールを送信したりする場合があるので、ブラウザからメールを確認できるように、RoundcubeというWebメールソフトが導入されている&lt;/p&gt;
&lt;p&gt;実際にログインして確かめましょう&lt;/p&gt;
&lt;h2&gt;3章 Webセキュリティの基礎 ～ HTTP、セッション管理、同一オリジンポリシー&lt;/h2&gt;
&lt;h3&gt;3.1 HTTPとセッション管理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;なぜHTTPを学ぶのか&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Web固有の特性に由来して、脆弱性が発生するため&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;一番かんたんなHTTP&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Referer&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;セキュリティ上の問題になるのは、URLが秘密情報を含んでいる場合&lt;/li&gt;
&lt;li&gt;典型的にはURLにセッションIDを含んでいる場合、Referer経由で外部に漏洩し、なりすましに悪用される可能性がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;hiddenパラメータの書き換えを体験&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;hiddenパラメータ部分に脆弱性がある場合に、OWASP ZAPのようなプロキシツールを用いてhiddenパラメータを改変し、攻撃することが可能であることを実感してもらうため&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;hiddenパラメータのメリット&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;hiddenは利用者自身からは書き換えできるものの、情報漏洩や第三者からの書き換えに対しては堅牢だということ&lt;/li&gt;
&lt;li&gt;hiddenパラメ―tあと比較する対象には、後述するクッキーやセッション変数がある&lt;/li&gt;
&lt;li&gt;特にログイン前の状態でかつ、地域型JPドメイン名や都道府県型JPドメイン名を使っている場合、後述するクッキーモンスターバグの影響により、セッション変数の漏洩に対する効果的な対策がない&lt;/li&gt;
&lt;li&gt;このため利用者自身によっても書換えられては困る認証や認可に関する情報はセッション変数に保存するべきだが、それ以外の情報はまずはhiddenパラメータに保存することを検討するとよい&lt;/li&gt;
&lt;li&gt;特にログイン前の状態では認証認可に関する情報はないはずなので、原則としてセッション変数の使用は避け、hiddenパラメータを使うことが情報漏えいなどに対して安全&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ステートレスなHTTP認証&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTTPには認証機能がサポートされている&lt;/li&gt;
&lt;li&gt;HTTP認証と総称されるが
&lt;ul&gt;
&lt;li&gt;Basic認証&lt;/li&gt;
&lt;li&gt;NTLM認証&lt;/li&gt;
&lt;li&gt;Digest認証
&lt;ul&gt;
&lt;li&gt;などが存在する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;HTTPがステートレスなプロトコルであることから、HTTP認証もステートレス&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Basic認証を体験する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Basic認証は認証が必要なページにリクエストがあると、いったん「401 Unauthorized(認証が必要なのにされていない)」というステータスを返します。これを受けてブラウザはIDとパスワードの入力画面を表示し、入力されたIDとパスワードを追加したリクエストをあらためてサーバーに返信します。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;認証と認可&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;認証とは：利用者がたしかに本人であることをなんらかの手段で確認すること
&lt;ul&gt;
&lt;li&gt;Basic認証のほか、HTMLフォームでIDとパスワードを入力させるフォーム認証、TLSクライアント証明書を用いるクライアント認証など&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;認可とは：認証済みの利用者に権限を与えること
&lt;ul&gt;
&lt;li&gt;具体的には、データの参照・更新・削除や、預金の振り込み、物品の購入などを「できるようにする」こと&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;クッキーとセッション管理&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;クッキー：サーバー側からブラウザに対して、「名前＝変数」の組を覚えておくように指示するもの
&lt;ul&gt;
&lt;li&gt;クッキーはセッション管理という機能の実現に使われる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;アプリケーションが&lt;code&gt;Set-Cookie&lt;/code&gt;というレスポンスヘッダーを返却して、ブラウザに対してクッキーを覚えるように指示する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;クッキーには有効期限が設定できるが、有効期限が設定されていないクッキーはブラウザ終了時まで有効になる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;クッキーによるセッション管理&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アプリケーションデータを保持する目的でクッキーそのものに値を入れることはあまり行われない&lt;/li&gt;
&lt;li&gt;その理由は以下の通り
&lt;ul&gt;
&lt;li&gt;クッキーが保持できる値の個数や文字列長には制限がある&lt;/li&gt;
&lt;li&gt;クッキーの値は利用者本人には参照・変更ができるので、秘密情報の格納に向かない
&lt;ul&gt;
&lt;li&gt;このためクッキーには「整理番号」としてセッションIDを格納しておき、実際の値はサーバー側で管理する方法が広く用いられている&lt;/li&gt;
&lt;li&gt;これをクッキーによるセッション管理と呼ぶ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;セッションIDに求められる要件&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;要件１：第三者がセッションIDを推測できないこと
&lt;ul&gt;
&lt;li&gt;暗号論的擬似乱数生成器を用いて生成&lt;a href=&quot;https://www.cryptrec.go.jp/list.html&quot;&gt;https://www.cryptrec.go.jp/list.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;しかし実際にはセッションIDを自作するのではなく、Webアプリケーション開発ツールで提供されるものを利用すべき&lt;/li&gt;
&lt;li&gt;セッション管理機構は自作しないことが重要&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;要件２：第三者がセッションIDを強制されないこと
&lt;ul&gt;
&lt;li&gt;セッションIDの固定化攻撃(Session Fixaction Attack)を受けないように、認証が完了したタイミングでセッションIDを新しく払い出そうという話&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;要件３：第三者にセッションIDが漏洩しないこと
&lt;ul&gt;
&lt;li&gt;セッションIDが漏洩する主な原因
&lt;ul&gt;
&lt;li&gt;クッキー発行の際の属性に不備がある&lt;/li&gt;
&lt;li&gt;ネットワーク的にセッションIDが盗聴される&lt;/li&gt;
&lt;li&gt;XSSなどアプリケーションの脆弱性により漏洩する&lt;/li&gt;
&lt;li&gt;PHPやブラウザなどプラットフォームの脆弱性により漏洩する&lt;/li&gt;
&lt;li&gt;セッションIDをURLに保持している場合は、Refererヘッダから漏洩する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;クッキーの属性&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;属性&lt;/th&gt;
&lt;th&gt;意味&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Domain&lt;/td&gt;
&lt;td&gt;ブラウザがクッキー値を送信するサーバーのドメイン&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Path&lt;/td&gt;
&lt;td&gt;ブラウザがクッキー値を送信するURLのディレクトリ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Expires&lt;/td&gt;
&lt;td&gt;クッキー値の有効期限。指定しない場合、ブラウザの終了まで&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Secure&lt;/td&gt;
&lt;td&gt;HTTPSの場合のみクッキーを送信&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HttpOnly&lt;/td&gt;
&lt;td&gt;この属性が指定されたクッキーはJavascriptからアクセスできない&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;このうちセキュリティ上重要な属性&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Domain&lt;/li&gt;
&lt;li&gt;Secure&lt;/li&gt;
&lt;li&gt;HttpOnly&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Domain属性：通常設定しない&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;複数のサーバに送信されるクッキーを生成したい場合に使うが、Domain属性を指定しない状態がもっともクッキーの送信範囲が狭く、安全な状態と言える&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Column：クッキーモンスターバグ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;筆者が所属する会社のドメイン名は&lt;code&gt;eg-secure.co.jp&lt;/code&gt;なので、クッキーを発行する際のドメイン指定の最短は&lt;code&gt;eg-secure.co.jp&lt;/code&gt;となるはず&lt;/li&gt;
&lt;li&gt;ところが、古いブラウザを使っていると&lt;code&gt;.co.jp&lt;/code&gt;のドメインのクッキーが作れてしまうという問題があった&lt;/li&gt;
&lt;li&gt;このバグを「クッキーモンスターバグ」という&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;クッキーのセキュア属性&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTTPS通信の場合のみにサーバーに送信されるので、HTTPS通信を保証することができる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;クッキーのHttpOnly属性&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Javascriptからアクセスできないクッキーを設定するもの&lt;/li&gt;
&lt;li&gt;XSS攻撃でJavascriptを悪用してクッキーを盗み出すというもので、クッキーにHttpOnly属性をつけておくとJavascriptによりクッキーを盗み出すことができなくなる&lt;/li&gt;
&lt;li&gt;HttpOnly属性をつけることで悪影響はないのでつけておくことをおすすめ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.2 受動的攻撃と同一オリジンポリシー&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;能動的攻撃と受動的攻撃&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;能動的攻撃：攻撃者がWebサーバーに対して直接攻撃すること&lt;/li&gt;
&lt;li&gt;受動的攻撃：攻撃者がサーバーに直接攻撃するのではなく、Webサイトの利用者に罠を仕掛ける事により、罠を閲覧したユーザを通してアプリケーションを攻撃する手法
&lt;ul&gt;
&lt;li&gt;罠サイト経由でCSRFやXSSの攻撃を仕掛ける&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ブラウザはどのように受動的攻撃を防ぐか&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;受動的攻撃に対しては、ブラウザとWebサイトそれぞれで対策を行う必要がある&lt;/li&gt;
&lt;li&gt;Webサイト側の対策を説明する前に、この節でブラウザのセキュリティ機能について説明する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;サンドボックスという考え方&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;利用者に配布元を確認させた上で、利用者が許可した場合のみに実行する&lt;/li&gt;
&lt;li&gt;プログラムの「できること」を制限するサンドボックスという環境を用意する
&lt;ul&gt;
&lt;li&gt;ローカルファイルへのアクセス禁止&lt;/li&gt;
&lt;li&gt;プリンタなどの資源の利用禁止（画面表示は可能）&lt;/li&gt;
&lt;li&gt;ネットワークアクセスの制限（同一オリジンポリシー）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;同一オリジンポリシー&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JavaScriptなどのクライアントスクリプトからサイトをまたがったアクセスを禁止するセキュリティ上の制限であり、ブラウザのサンドボックスに用意された制限の１つ&lt;/li&gt;
&lt;li&gt;iframeを題材にして、同一オリジンポリシーがなぜ必要かを説明していきます&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;同一オリジンである条件&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;「同一オリジン」であるとは、以下のすべてを満たす場合
&lt;ul&gt;
&lt;li&gt;URLのホスト（FQDN:Fully Qualified Domain Name）が一致している&lt;/li&gt;
&lt;li&gt;スキーム（プロトコル）が一致している&lt;/li&gt;
&lt;li&gt;ポート番号が一致している&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;クッキーに対する条件はスキームとポート番号は関係ないのでJavaScriptの制限のほうが厳しい&lt;/li&gt;
&lt;li&gt;一方JavaScriptにはディレクトリに関する制限はない&lt;/li&gt;
&lt;li&gt;iframeだけでなく、Ajaxの実現に使用されているXMLHttpRequestについても成約がある&lt;/li&gt;
&lt;li&gt;ただし、XMLHttpRequestについては相手側の許可があれば同一オリジンでなくても通信できるCORSという規格が策定されました&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;アプリケーション脆弱性と受動的攻撃&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ブラウザは同一オリジンポリシーにより受動的攻撃を防止しているが、アプリケーションに脆弱性があると受動的攻撃を受ける場合がある&lt;/li&gt;
&lt;li&gt;その代表がクロスサイトスクリプティング（XSS）攻撃&lt;/li&gt;
&lt;li&gt;iframeの外側から内側の要素へアクセスすることはできないが、何らかの方法で内側の要素にスクリプトを埋め込むことができれば、同一オリジンポリシーの制約は受けないのでドキュメント情報にアクセスできる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JavaScript以外のクロスドメインアクセス&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;frame要素とiframe要素&lt;/li&gt;
&lt;li&gt;img要素&lt;/li&gt;
&lt;li&gt;script要素&lt;/li&gt;
&lt;li&gt;CSS
&lt;ul&gt;
&lt;li&gt;クロスドメインで読み込み可能&lt;/li&gt;
&lt;li&gt;IEにはCSSXSSと呼ばれる脆弱性があった&lt;/li&gt;
&lt;li&gt;HTMLやJavaScriptをCSSとして呼び出した場合、これらCSSでないデータが部分的に読み出せるジェイ弱製があった&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;form要素のaction属性
&lt;ul&gt;
&lt;li&gt;form要素のaction属性もクロスドメインの指定が可能&lt;/li&gt;
&lt;li&gt;またformの送信（submit）はJavaScriptから常に（action先がクロスドメインであっても）操作できる&lt;/li&gt;
&lt;li&gt;この仕様を悪用した攻撃手法がクロスサイトリクエストフォージェリ（CSRF）攻撃&lt;/li&gt;
&lt;li&gt;CSRF攻撃では、ユーザの意図しないformを送信させられ、アプリケーションの機能が勝手に実行される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.3 CORS（Cross-Origin Resource Sharing）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;シンプルなリクエスト&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;特定の王権を満たす「シンプルなリクエスト」の場合、XMLHttpRequestを用いて異なるオリジンにHTTPリクエストを送ることが相手側の許可なしに可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Access-Control-Allow-Origin&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;クロスオリジンからの読み出しを許可するための仕掛けで、情報の提供元がHTTPレスポンスヘッダとして出力&lt;/li&gt;
&lt;li&gt;&lt;code&gt;http://example.jp&lt;/code&gt;に対してXMLHttpRequestなどのアクセスを許可する場合は下記のHTTPレスポンスヘッダを送信
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Access-Control-Allow-Origin: http://example.jp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;情報提供元がこの許可をすればJavaScriptから参照できるようになる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;シンプルなリクエストの要件&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;メソッド
&lt;ul&gt;
&lt;li&gt;GET&lt;/li&gt;
&lt;li&gt;HEAD&lt;/li&gt;
&lt;li&gt;POST&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;XMLHttpRequestオブジェクトのsetRequestHeaderメソッドで設定するリクエストヘッダは以下に限る
&lt;ul&gt;
&lt;li&gt;Accept&lt;/li&gt;
&lt;li&gt;Accept-Language&lt;/li&gt;
&lt;li&gt;Content-Language&lt;/li&gt;
&lt;li&gt;Content-Type&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Content-Typeヘッダは以下のいずれかである
&lt;ul&gt;
&lt;li&gt;application/x-www-form-urlencoded&lt;/li&gt;
&lt;li&gt;multipart/form-data&lt;/li&gt;
&lt;li&gt;text/plain&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;プリフライトリクエスト&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;クロスオリジンアクセスにおいて「シンプルなリクエスト」の条件を満たさない場合、&lt;/li&gt;
&lt;li&gt;ブラウザは、プリフライトリクエスト（pre-flight request）というHTTPリクエストを送信する&lt;/li&gt;
&lt;li&gt;上記のシンプルなリクエストの要件に合致しない場合、ブラウザは以下のようなリクエストヘッダを送信
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Access-Control-Request-Method: POST&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Access-Control-Request-Headers: content-type&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Origin: http://example.jp&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: CORS制約に引っかかる場合でもリソース提供元のソースは走る&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;返却されたリソースを読み込むときに、レスポンスヘッダが存在しないと読み込むことができない様になっている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;認証情報を含むリクエスト&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;デフォルトでは、クロスオリジンに対するリクエストにはHTTP認証やクッキーなどの認証に用いられるリクエストヘッダは自動的に送信されません&lt;/li&gt;
&lt;li&gt;これらを用いるには、XMLHttpRequestのプロパティ&lt;code&gt;withCredentials&lt;/code&gt;をtrueにセットする必要がある&lt;/li&gt;
&lt;li&gt;&lt;code&gt;withCredentials&lt;/code&gt;プロパティをtrueにしたリクエストに対しては、&lt;code&gt;Access-Control-Allow-Credentials: true&lt;/code&gt;というレスポンスヘッダを返す必要がある&lt;/li&gt;
&lt;li&gt;まとめると
&lt;ul&gt;
&lt;li&gt;クライアント側：XMLHttpRequestオブジェクトのwithCredentialsプロパティをtrueにする&lt;/li&gt;
&lt;li&gt;サーバー側：レスポンスヘッダとしてAccess-Control-Allow-Credentials: trueを返す&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;4章 Webアプリケーションの機能別に見るセキュリティバグ&lt;/h2&gt;
&lt;h3&gt;4.1 Webアプリケーションの機能と脆弱性の対応&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;脆弱性はどこで発生するか&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Webアプリケーションの出力処理で発生
&lt;ul&gt;
&lt;li&gt;ここでいう出力は、ブラウザ表示、RDB処理、シェル実行、メール処理、ファイル処理など&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;まとめると
&lt;ul&gt;
&lt;li&gt;脆弱性には処理に起因するものと出力に起因するものがある&lt;/li&gt;
&lt;li&gt;入力に起因する脆弱性はない（ミドルウェアの範囲を広げると、入力時の検証処理に脆弱性が入り込む余地はある）&lt;/li&gt;
&lt;li&gt;出力に起因する脆弱性には「インジェクション」という単語がつくものが多い&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;インジェクション系脆弱性とは&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;まとめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;脆弱性の説明を始めるにあたり、脆弱性の発生箇所と脆弱性の種類の関連性について説明しました&lt;/li&gt;
&lt;li&gt;また「出力」で発生する脆弱性は、インジェクションと呼ばれる共通の原理で発生することを紹介&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.2 入力処理とセキュリティ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;WEBアプリケーションの「入力」では何をするのか&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;処理に入る前の準備段階
&lt;ul&gt;
&lt;li&gt;文字エンコーディングの妥当性検証&lt;/li&gt;
&lt;li&gt;文字エンコーディングの交換（必要な場合のみ）&lt;/li&gt;
&lt;li&gt;入力値（パラメータ文字列）の妥当性検証&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;文字エンコーディングの検証&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PHPの場合、文字エンコーディングの検証にはmb_check_encoding関数が利用できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;文字エンコーディングの変換&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;言語によって文字エンコーディングの変換手段は異なる&lt;/li&gt;
&lt;li&gt;おおまかな分類として、文字エンコーディングを自動的に変換する言語と、スクリプトで変換ロジックを明示する言語がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;入力値の検証&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;入力値の検証がないと...
&lt;ul&gt;
&lt;li&gt;数値のみを受け付ける項目に英数字や記号を入力して、データベースのエラーになる&lt;/li&gt;
&lt;li&gt;更新処理が途中でエラーになり、データベースの不整合が発生する&lt;/li&gt;
&lt;li&gt;利用者が多数の項目を入力して事項ボタンをクリックしたら内部エラーとなり入力を最初からやり直す羽目になる&lt;/li&gt;
&lt;li&gt;メールアドレスの入力を忘れているのにアプリケーションがメール送信処理を実行する
&lt;ul&gt;
&lt;li&gt;入力検証はこのような悪いことが起きる可能性をへらす！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;目的
&lt;ul&gt;
&lt;li&gt;入力値の間違いを早期に発見して再入力を促すことにより、ユーザビリティ（使いやすさ）を向上する&lt;/li&gt;
&lt;li&gt;間違った処理を継続することによるデータの不整合などを防ぎ、システムの信頼性を向上させる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;バイナリセーフという考え方とヌルバイト攻撃&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;バイナリセーフとは：入力値がどんなバイト列であっても正しく扱えること&lt;/li&gt;
&lt;li&gt;ヌルバイトは、バイナリセーフでない関数の場合終端文字として扱われるため、後ろの文字列を評価対象としない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;入力値検証だけでは対策にならない&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;入力段階で不正な入力をチェックしておけば、セキュリティ対策は終わりにできないか？
&lt;ul&gt;
&lt;li&gt;アプリの仕様のためすべての文字を許容するという仕様の場合は入力時点でも何も防げない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.3 表示処理に伴う問題&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;クロスサイトスクリプティング（基本編）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;外部からの入力値を画面に表示するしてHTMLを生成する処理に問題があると生じる脆弱性&lt;/li&gt;
&lt;li&gt;影響
&lt;ul&gt;
&lt;li&gt;サイト利用者のブラウザ上で、攻撃者の用意したスクリプトの実行によりクッキー値を盗まれ、利用者がなりすましの被害にあう&lt;/li&gt;
&lt;li&gt;同じくブラウザ上でスクリプトを実行させられ、サイト利用者の権限でWebアプリケーションの機能を悪用される&lt;/li&gt;
&lt;li&gt;Webサイト上に偽の入力フォームが表示され、フィッシングにより利用者が個人情報を盗まれる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;攻撃手法と影響&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;クッキー値の盗み出し
&lt;ul&gt;
&lt;li&gt;罠サイトを用意してiframeで標的サイトを表示し、script実行！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;その他のJavaScriptによる攻撃
&lt;ul&gt;
&lt;li&gt;ワーム攻撃&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;画面の書換え
&lt;ul&gt;
&lt;li&gt;JavaScriptを使わない攻撃&lt;/li&gt;
&lt;li&gt;formを表示する画面で入力画面と編集画面を兼ねているようなもので、各入力項目の初期値が設定できるようになっているページに脆弱性があると実現する&lt;/li&gt;
&lt;li&gt;MEMO: 最初わからなかったが腑に落ちた！ただこんなページを実装しているサイトは無いと思う。。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;P129まで 2020-08-27 02:33:29&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;反射型XSSと持続型XSS&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;反射型：攻撃用JavaScriptが攻撃対象サイトとは別のサイトに有る場合&lt;/li&gt;
&lt;li&gt;持続型：攻撃用のJavaScriptが、攻撃対象のデータベースなどに保存される場合&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;COLUMN: TRACEメソッドの無効化とXST&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;古いブラウザに対して飲み有効なクロスサイト・トレーシングという攻撃がある&lt;/li&gt;
&lt;li&gt;JavaScriptによりHTTPのTRACEメソッドを送信する事によりクッキーやBasic認証のID・パスワードを盗み出す手法&lt;/li&gt;
&lt;li&gt;XST攻撃はブラウザで対策が2006年に完了しており、リスクはほぼないと考えられる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;対策まとめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;必須対策（個別の対策）
&lt;ul&gt;
&lt;li&gt;HTMLの要素内容
&lt;ul&gt;
&lt;li&gt;htmlspecialchars関数によりエスケープ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;属性値
&lt;ul&gt;
&lt;li&gt;htmlspecialcharsカンスによりエスケープしてダブルクォートで囲む&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;必須対策（共通対策）
&lt;ul&gt;
&lt;li&gt;HTTPレスポンスに文字エンコーディングを明示する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;保険的対策
&lt;ul&gt;
&lt;li&gt;X-XSS-Protectionレスポンスヘッダの使用&lt;/li&gt;
&lt;li&gt;入力値の検証&lt;/li&gt;
&lt;li&gt;クッキーにHttpOnly属性を付与&lt;/li&gt;
&lt;li&gt;TRACEメソッドの無効化（コラム参照）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;4.3.2 クロスサイトスクリプティング（発展編）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;href属性やsrc属性のXSS&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;対策
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;http:&lt;/code&gt;または&lt;code&gt;https:&lt;/code&gt;で始まる絶対URLチェック&lt;/li&gt;
&lt;li&gt;スラッシュで始まる相対URLチェック&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JavaScriptの動的生成&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;イベントハンドラのXSS
&lt;ul&gt;
&lt;li&gt;Javascriptのメソッド引数にサーバ側で動的に生成したスクリプトが注入されている場合
&lt;ul&gt;
&lt;li&gt;対策
&lt;ul&gt;
&lt;li&gt;JavaScript文字列リテラルとしてエスケープする&lt;/li&gt;
&lt;li&gt;結果をHTMLエスケープする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;script要素のXSS&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.4 SQL呼び出しに伴う脆弱性&lt;/h3&gt;
&lt;h3&gt;4.5 「 重要な処理」の際に混入する脆弱性&lt;/h3&gt;
&lt;h3&gt;4.6 セッション管理の不備&lt;/h3&gt;
&lt;h3&gt;4.7 リダイレクト処理にまつわる脆弱性&lt;/h3&gt;
&lt;h3&gt;4.8 クッキー出力にまつわる脆弱性&lt;/h3&gt;
&lt;h3&gt;4.9 メール送信の問題&lt;/h3&gt;
&lt;h3&gt;4.10 ファイルアクセスにまつわる問題&lt;/h3&gt;
&lt;h3&gt;4.11 OSコマンド呼び出しの際に発生する脆弱性&lt;/h3&gt;
&lt;h3&gt;4.12 ファイルアップロードにまつわる問題&lt;/h3&gt;
&lt;h3&gt;4.13 インクルードにまつわる問題&lt;/h3&gt;
&lt;h3&gt;4.14 構造化データの読み込みにまつわる問題&lt;/h3&gt;
&lt;h3&gt;4.15 共有資源やキャッシュに関する問題&lt;/h3&gt;
&lt;h3&gt;4.16 Web API実装における脆弱性&lt;/h3&gt;
&lt;h3&gt;4.17 JavaScriptの問題&lt;/h3&gt;
&lt;h2&gt;5章 代表的なセキュリティ機能&lt;/h2&gt;
&lt;h3&gt;5.1 認証&lt;/h3&gt;
&lt;h3&gt;5.2 アカウント管理&lt;/h3&gt;
&lt;h3&gt;5.3 認可&lt;/h3&gt;
&lt;h3&gt;5.4 ログ出力&lt;/h3&gt;
&lt;h2&gt;6章 文字コードとセキュリティ&lt;/h2&gt;
&lt;h3&gt;6.1 文字コードとセキュリティの概要&lt;/h3&gt;
&lt;h3&gt;6.2 文字集合&lt;/h3&gt;
&lt;h3&gt;6.3 文字エンコーディング&lt;/h3&gt;
&lt;h3&gt;6.4 文字コードによる脆弱性の発生要因まとめ&lt;/h3&gt;
&lt;h3&gt;6.5 文字コードを正しく扱うために&lt;/h3&gt;
&lt;h3&gt;6.6 まとめ&lt;/h3&gt;
&lt;h2&gt;7章 脆弱性診断入門&lt;/h2&gt;
&lt;h3&gt;7.1 脆弱性診断の概要&lt;/h3&gt;
&lt;h3&gt;7.2 脆弱なサンプルアプリケーションBad Todo&lt;/h3&gt;
&lt;h3&gt;7.3 診断ツールのダウンロードとインストール&lt;/h3&gt;
&lt;h3&gt;7.4 Nmapによるポートスキャン&lt;/h3&gt;
&lt;h3&gt;7.5 OpenVASによるプラットフォーム脆弱性診断&lt;/h3&gt;
&lt;h3&gt;7.6 OWASP ZAPによる自動脆弱性スキャン&lt;/h3&gt;
&lt;h3&gt;7.7 OWASP ZAPによる手動脆弱性診断&lt;/h3&gt;
&lt;h3&gt;7.8 RIPSによるソースコード診断&lt;/h3&gt;
&lt;h3&gt;7.9 脆弱性診断実施上の注意&lt;/h3&gt;
&lt;h3&gt;7.10 まとめ&lt;/h3&gt;
&lt;h3&gt;7.11 脆弱性診断報告書のサンプル&lt;/h3&gt;
&lt;h2&gt;8章 Webサイトの安全性を高めるために&lt;/h2&gt;
&lt;h3&gt;8.1 Webサーバーへの攻撃経路と対策&lt;/h3&gt;
&lt;h3&gt;8.2 成りすまし対策&lt;/h3&gt;
&lt;h3&gt;8.3 盗聴・改ざん対策&lt;/h3&gt;
&lt;h3&gt;8.4 マルウェア対策&lt;/h3&gt;
&lt;h3&gt;8.5 まとめ&lt;/h3&gt;
&lt;h2&gt;9章 安全なWebアプリケーションのための開発マネジメント&lt;/h2&gt;
&lt;h3&gt;9.1 開発マネジメントにおけるセキュリティ施策の全体像&lt;/h3&gt;
&lt;h3&gt;9.2 開発体制&lt;/h3&gt;
&lt;h3&gt;9.3 開発プロセス&lt;/h3&gt;
&lt;h3&gt;9.4 まとめ&lt;/h3&gt;
</content:encoded></item><item><title>現場で使える Ruby on Rails 5速習実践ガイド</title><link>https://tutttuwi.github.io/posts/2021-03_%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B-ruby-on-rails-5%E9%80%9F%E7%BF%92%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2021-03_%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B-ruby-on-rails-5%E9%80%9F%E7%BF%92%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89/</guid><pubDate>Thu, 20 Aug 2020 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;現場で使える Ruby on Rails 5速習実践ガイド（ISBN978-4-8399-6222-7）&lt;/h1&gt;
&lt;h2&gt;理解したこと&lt;/h2&gt;
&lt;h2&gt;書籍サイト&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://book.mynavi.jp/ec/products/detail/id=93905&quot;&gt;https://book.mynavi.jp/ec/products/detail/id=93905&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;サポートサイト&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://book.mynavi.jp/supportsite/detail/9784839962227.html&quot;&gt;https://book.mynavi.jp/supportsite/detail/9784839962227.html&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;書籍情報&lt;/h2&gt;
&lt;p&gt;Railsアプリの基本から実践的なノウハウまでこの1冊で！本書は、Ruby on Rails（以下Rails）を使ってWebアプリケーションを開発するための解説書です。&lt;/p&gt;
&lt;p&gt;RailsでどのようにWebアプリケーションを作るのかという基本的なところから、現場のニーズに合わせてどのように機能を追加していくのか、テストはどのように行うのか、複数人で開発していく場合の方法といった実践的なトピックまで、幅広くカバーしています。&lt;/p&gt;
&lt;p&gt;本書を読んだ方が単にRailsでWebアプリケーションを作れるようになるだけでなく、「Railsらしいアプリケーションコード」を書けるようになり、そして開発チームの仲間とともに実現したいことを実現できるように、という視点で必要な情報をまとめた1冊です。&lt;/p&gt;
&lt;p&gt;なお、本書の対応バージョンはRuby 2.5／Rails5.2です。Rails5.2から導入されたActive Storageやcredentials.yml.encについても解説しています。macOS／Windows 10（64ビット版）対応。&lt;/p&gt;
&lt;p&gt;■読者対象について&lt;/p&gt;
&lt;p&gt;Ruby以外の言語でのWebアプリケーションの開発や、オブジェクト指向プログラミングについては知識・経験があるものの、RubyやRailsについては初めて学ぶ方を主な対象にしています。&lt;/p&gt;
&lt;p&gt;ただし、Webアプリケーションやオブジェクト指向が初めての方にも理解しやすいように説明するように努めています。&lt;/p&gt;
&lt;p&gt;■構成と内容について&lt;/p&gt;
&lt;p&gt;本書の構成は以下の通りです。&lt;/p&gt;
&lt;p&gt;＜入門編＞
Chapter 1 RailsのためのRuby入門
Chapter 2 Railsアプリケーションをのぞいてみよう
Chapter 3 タスク管理アプリケーションを作ろう&lt;/p&gt;
&lt;p&gt;＜レベルアップ編＞
Chapter 4 現実の複雑さに対応する
Chapter 5 テストをはじめよう
Chapter 6 Railsの全体像を理解する
Chapter 7 機能を追加してみよう&lt;/p&gt;
&lt;p&gt;＜発展編＞
Chapter 8 RailsとJavaScript
Chapter 9 複数人でRailsアプリケーションを開発する
Chapter 10 Railsアプリケーションと長く付き合うために&lt;/p&gt;
&lt;p&gt;章ごとの内容は以下の通りです。&lt;/p&gt;
&lt;p&gt;Chapter1では、Railsのアプリケーションのコードを読み書きするために最低限必要となるようなRubyの基礎知識を解説していきます。&lt;/p&gt;
&lt;p&gt;Chapter2では、RubyやRailsが動作する環境を構築するとともに、簡単なサンプルアプリケーションを作成し、中身の構成を解説していきます。&lt;/p&gt;
&lt;p&gt;Chapter3では、シンプルなタスク管理アプリケーションの作成を通じて、CRUDと呼ばれるソフトウェアの基本的な機能をRailsで実装する方法について学んでいきます。&lt;/p&gt;
&lt;p&gt;Chapter4では、Chapter3で作成したアプリケーションに、いくつかの機能を追加していきます。具体的には「データ内容の制限」「検証」「コールバック」「フィルタ」「ログイン機能の追加」「関連」「検索」について解説していきます。&lt;/p&gt;
&lt;p&gt;Chapter5では、Railsにあらかじめ用意されている「自動テスト」という仕組みについて、利用方法や注意事項を解説します。&lt;/p&gt;
&lt;p&gt;Chapter6では、Railsの備える機能や、Railsを取り巻く世界の全体像を改めて一望し、これまで取り上げる機会のなかったいくつかの重要な要素について解説していきます。&lt;/p&gt;
&lt;p&gt;Chapter7では、Railsアプリケーションで比較的よくある具体的な機能を実現するやり方を、Chapter4までで作成したアプリケーションへの機能追加という形で紹介していきます。&lt;/p&gt;
&lt;p&gt;Chapter8では、Railsを利用する際のJavaScriptの扱い方について解説していきます。モダンなJavaScriptについても扱っています。&lt;/p&gt;
&lt;p&gt;Chapter9では、複数人で開発を行う場合に重要になってくる知識や、注意すべきポイントについて解説していきます。&lt;/p&gt;
&lt;p&gt;Chapter10では、Railsアプリケーションと長く付き合っていくために特に重要なテーマとして、「バージョンアップに対してどのように取り組むべきか」「Railsアプリケーションコードが複雑になっていくことにどうに立ち向かい、メンテナンスしやすい状態の維持を図るのか」について扱います。&lt;/p&gt;
&lt;h2&gt;＜入門編＞&lt;/h2&gt;
&lt;h2&gt;Chapter 1 RailsのためのRuby入門&lt;/h2&gt;
&lt;h2&gt;1-1 オブジェクトを理解しよう&lt;/h2&gt;
&lt;h3&gt;1-1-1 万物がオブジェクト&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;オブジェクトという存在になれましょう
&lt;ul&gt;
&lt;li&gt;※詳細割愛&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1-1-2 irb&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Rubyには、&lt;code&gt;irb(アイアールビー)&lt;/code&gt;という、対話的な実行環境が付属している&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;オブジェクトがどういうものかを体験していただくために操作しながら読みすすめる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;以下から実行環境を取得しておいた&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://rubyinstaller.org/&quot;&gt;https://rubyinstaller.org/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1-1-3 文字列&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ダウブルクォーテーションかシングルクォーテーションで文字列を囲む
&lt;ul&gt;
&lt;li&gt;違い：&lt;a href=&quot;https://qiita.com/ryosuketter/items/ddad508cb0124e4fe378&quot;&gt;https://qiita.com/ryosuketter/items/ddad508cb0124e4fe378&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1-1-4 数値&lt;/h3&gt;
&lt;h3&gt;1-1-5 オブジェクトに、自分が何者かを聞いてみる&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;irb(main):006:0&amp;gt; &quot;氏名&quot;.class
=&amp;gt; String
irb(main):007:0&amp;gt; 1.class
=&amp;gt; Integer
irb(main):008:0&amp;gt; 1.1.class
=&amp;gt; Float
irb(main):009:0&amp;gt; true.class
=&amp;gt; TrueClass
irb(main):010:0&amp;gt; false.class
=&amp;gt; FalseClass
irb(main):013:0&amp;gt; &quot;氏名&quot;.object_id
=&amp;gt; 300
irb(main):014:0&amp;gt; &quot;氏名&quot;.object_id
=&amp;gt; 320
irb(main):015:0&amp;gt; &quot;氏名&quot;.object_id
=&amp;gt; 340
irb(main):016:0&amp;gt; 1.object_id
=&amp;gt; 3
irb(main):017:0&amp;gt; 1.object_id
=&amp;gt; 3
// 数値は同じオブジェクトIDを取るが、文字列は異なるオブジェクトIDを取る
// この辺はJavaのプリミティブ型、参照型と同じ概念のよう
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1-1-6 クラスとインスタンス&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;「オブジェクトXのクラスがAであるとき、XはAのインスタンス（オブジェクト）である」といいます。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1-1-7 オブジェクトの機能はクラスで決まる&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;オブジェクトの種類により、プロパティなどが異なりますよという説明&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1-1-8 変数&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ローカル変数の記載&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;スネークケースで先頭は小文字か&lt;code&gt;_(アンダースコア)&lt;/code&gt;で記載されるのでこれに習おう
&lt;ul&gt;
&lt;li&gt;sample_message&lt;/li&gt;
&lt;li&gt;part2&lt;/li&gt;
&lt;li&gt;_user&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;定数は大文字で始まる名前にすること。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1-1-9 コメント&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# １行をコメントアウト
name = &quot;氏名&quot; # 途中からも可能
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1-1-10 メソッド&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;class cat
  def run(ネズミ)
    puts &quot;一生懸命 #{ネズミ} を追いかけた...&quot; # 画面にメッセージを出力します
  end
end

タマ = cat.new
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;メソッドの基本的な説明&lt;/li&gt;
&lt;li&gt;メソッドを呼び出すときにかっこを省略できる&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;irb(main):066:0&amp;gt; message1 = &quot;こんにちは&quot;
=&amp;gt; &quot;こんにちは&quot;
irb(main):067:0&amp;gt; message2 = &quot;こんばんは&quot;
=&amp;gt; &quot;こんばんは&quot;
irb(main):068:0* split = ^C
irb(main):068:0&amp;gt; split = &quot;｜&quot;
=&amp;gt; &quot;｜&quot;
irb(main):069:0&amp;gt; message3 = &quot;あいさつ！&quot;
=&amp;gt; &quot;あいさつ！&quot;
irb(main):070:0&amp;gt; message3.concat message1, message2
=&amp;gt; &quot;あいさつ！こんにちはこんばんは&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;1-2 自分でクラスを作ってみよう&lt;/h2&gt;
&lt;h3&gt;1-2-1 クラスを作る&lt;/h3&gt;
&lt;h3&gt;1-2-2 Userクラスを作る&lt;/h3&gt;
&lt;h3&gt;1-2-3 Userクラスにメソッドを定義する&lt;/h3&gt;
&lt;h3&gt;1-2-4 インスタンス変数&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;インスタンス変数：オブジェクトが抱えている変数&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;class User
  def name=(name)
    @name = name
  end

  def name
    @name
  end
end
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1-2-5 ローカル変数とインスタンス変数の違い&lt;/h3&gt;
&lt;h3&gt;1-2-6 属性&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;一般的にオブジェクトが抱えるデータのことを「属性（Attribute）」&lt;/li&gt;
&lt;li&gt;属性とインスタンス変数はよく似た概念と言える&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1-2-7 ゲッターやセッターを簡単に定義する&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;class User
  #attr_accessor :name
  #attr_reader :name
  #attr_writer :name
end
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1-2-8 住んでいる場所やEメールアドレスを持たせる&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;class User
  attr_accessor :name, :address, :email
end
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1-2-9 メソッドからメソッドを使う&lt;/h3&gt;
&lt;h3&gt;1-2-10 まとめ - オブジェクトの振る舞いとデータ&lt;/h3&gt;
&lt;h2&gt;1-3 Rubyプログラムの基礎知識&lt;/h2&gt;
&lt;h3&gt;1-3-1 演算子&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;目新しい演算子はないので割愛&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1-3-2 nil&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# nilにする
value = nil
# nilかどうか確かめる
value.nil?

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1-3-3 真偽&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Rubyでは0も真になるので注意！&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1-3-4 条件分岐&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;number = 1
if number == 1
  puts &apos;数値は1です&apos;
elsif number == 2
  puts &apos;数値は2です&apos;
else
  puts &apos;数値は1や2以外です&apos;
end
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# ifは評価結果を返すことを抑えておく
number = 100
message = if number &amp;gt; 50
            &quot;numberは50より大きいです&quot;
          else
            &quot;numberは50以下です&quot;
          end
# elseがなくどのオブジェクトにも当てはまらない場合はnilオブジェクト
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# 当てはまらない場合に分岐する unless
# ifの裏返しを表現する方法
# これは使わなくても良さそう わかりにくくなる
age = 16
unless age &amp;gt;= 20
  puts &quot;未成年者には酒類を提供できません！&quot;
end
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# 後置if
puts &apos;おはようございます&apos; if true
puts &apos;お疲れ様でした&apos; if false
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1-3-5 配列&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# eachメソッド
a = [1,2,3]
a.each do |element|
  puts element
end

# forでもかける
for element in a
  puts element
end
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Rubyに慣れている人は、&lt;strong&gt;For文よりもeachを好んで使うとのこと&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 配列に要素を追加する場合は&amp;lt;&amp;lt;を使う
a = [1,2,3]
a &amp;lt;&amp;lt; 4
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://qiita.com/may88seiji/items/ce9396a4c267a3d449ae&quot;&gt;https://qiita.com/may88seiji/items/ce9396a4c267a3d449ae&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;1-3-6 ハッシュ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内部的にデータをキーと対応づけて格納しておくデータ構造&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;pref = { tokyo: 13636222, kanagawa: 9144572 }

irb(main):060:0&amp;gt; pref
=&amp;gt; {:tokyo=&amp;gt;13636222, :kanagawa=&amp;gt;9144572}
irb(main):061:0&amp;gt; pref[:tokyo]
=&amp;gt; 13636222

&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;1-4 少し高度なテクニック&lt;/h2&gt;
&lt;h3&gt;1-4-1 initialize&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;class User
  attr_reader :name, :address, :email
  def initialize(name, address, email)
    @name = name
    @address = address
    @email = email
  end
end

user = User.new(&quot;田中太郎&quot;,&quot;東京都&quot;,nil)

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1-4-2 メソッドの呼び出しに制限をかける&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;class Person
  def initialize(money)
    @money = money
  end
  def billionaire?
    money &amp;gt;= 1000000000
  end

  # privateキーワード以降のメソッドはプライベートメソッドとなる
  # initializeメソッドはprivate指定しなくても自動的にプライベートになる
  private

  def money
    @money
  end
end

person = Person.new(1000000000)

# privateなのでエラーになる！
person.money

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1-4-3 引数にデフォルト値を指定する&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# デフォルト値を指定することができる
def name(full = true, with_age = true)
  n = if full
        &quot;#{given_name} #{family_name}&quot;
      else
        given_name
      end
  n &amp;lt;&amp;lt; &quot;(#{age})&quot; if with_age
end
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1-4-4 キーワード引数&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# キーワード引数の定義
def name(full: true, with_age: true)
  n = if full
        &quot;#{given_name} #{family_name}&quot;
      else
        given_name
      end
  n &amp;lt;&amp;lt; &quot;(#{age})&quot; if with_age
end

# デフォルト値の省略も可能
def name(full: true, with_age:)
end

# どんな順序で呼び出してもいい
person.name(full: true, with_age: false)
person.name(with_age: false, full: true)

&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;1-5 似たところのあるクラスを作りたいとき&lt;/h2&gt;
&lt;h3&gt;1-5-1 継承&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# &amp;lt; で継承ができる
class Book
  def title
    &apos;本のタイトル&apos;
  end
end

class Magazine &amp;lt; Book
  # オーバーライド
  def title
    &apos;雑誌のタイトル&apos;
  end
end
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1-5-2 モジュールによる共通化（Mix-in）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Rubyの基本単位のオブジェクトであり、オブジェクトの設計図としてクラスがある&lt;/li&gt;
&lt;li&gt;ある一連の振る舞いの設計図を一箇所にまとめた存在として「モジュール(Module)」という概念がある&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;module Chatting
  def chat
    &quot;hello&quot;
  end
end

class Dog
  include Chatting
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;モジュールをクラスに取り込んで振る舞いを追加することをRubyでは、「Mix-in」(ミックスイン)と呼びます&lt;/p&gt;
&lt;h2&gt;Column クラスメソッド&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;クラスに対して呼び出せるクラスメソッドという概念が存在する&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;class Tax
  def self.rate
    1.08
  end
end
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;1-6 プログラムの異常を検知しよう（例外捕捉）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;独自例外を作成するときはStandardErrorを継承して作成する&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;begin
rescue
ensure
end

# メソッド内の例外処理なら以下のようにかける
def method
  rescue
  # 例外に対応するコード
  ensure
  # 例外が発生してもしなくても必ず実行したいコード
end

begin
  do_something
rescue SomeSpecialError =&amp;gt; e
  # エラーオブジェクトを変数として受け取る方法
  puts &quot;#{e.class} (#{e.message})が発生しました。処理を続行します。&quot;
end



&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;1-7 読めると便利！Rubyっぽい書き方&lt;/h2&gt;
&lt;h3&gt;1-7-1 nil ガード&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;number ||= 10
number || (number = 10)

def children
  @children ||= []
end
# childrenがnilの状態であっても必ず配列で初期化されるので安心
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1-7-2 ぼっち演算子 &amp;amp;.&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;user = User.new
user.name

object = nil
object&amp;amp;.name
# =&amp;gt; ここでエラーにならない

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1-7-3 %記法&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# すべての要素が文字列である配列は、通常の配列記法の他に、「%w」というキーワードを使って書くことができる
ary1 = [&apos;apple&apos;,&apos;banana&apos;,&apos;orange&apos;]
puts ary1
# irb(main):001:0&amp;gt; ary1 = [&apos;apple&apos;,&apos;banana&apos;,&apos;orange&apos;]
# =&amp;gt; [&quot;apple&quot;, &quot;banana&quot;, &quot;orange&quot;]
# irb(main):002:0&amp;gt; puts ary1
# apple
# banana
# orange
# =&amp;gt; nil

irb(main):003:0&amp;gt; ary2 = %w(apple banana orange)
=&amp;gt; [&quot;apple&quot;, &quot;banana&quot;, &quot;orange&quot;]

# すべての要素がシンボルの場合は、「%i」というキーワードを使ってかける
irb(main):004:0&amp;gt; ary2 = %i(apple banana orange)
=&amp;gt; [:apple, :banana, :orange]

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1-7-4 配列の各要素から特定の属性だけを取り出す&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;class User
  attr_accessor :name
end

user1 = User.new
user1.name = &apos;テスト１&apos;
user2 = User.new
user2.name = &apos;テスト２&apos;
user3 = User.new
user3.name = &apos;テスト３&apos;

users = [user1, user2, user3]

# ------ 名前だけが入った配列を求める方法１ --------

names = []
user.each do |user|
  names &amp;lt;&amp;lt; user.name
end

p names

# ------ 名前だけが入った配列を求める方法２ --------

names = users.map do |user|
  user.name
end

# ------ 名前だけが入った配列を求める方法３ --------

names = users.map { |user| user.name }

# ------ 名前だけが入った配列を求める方４ -------- ※これが一番簡潔！

nemes = users.map(&amp;amp;:name)

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;※なれないとわからない書き方だと思った&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Chapter2 Railsアプリケーションをのぞいてみよう&lt;/h2&gt;
&lt;h2&gt;2-1 コマンド実行環境を準備しよう&lt;/h2&gt;
&lt;h3&gt;2-1-1 Windowsでコマンド実行環境を用意する&lt;/h3&gt;
&lt;p&gt;windows環境のWSLでubuntuを動かしてそこにRubyを入れる
&lt;code&gt;wsl -u root&lt;/code&gt;
wslにログインしてupdate打つ際に管理者権限が必要なのだが、
Windowsユーザだとパスワード通らなかったのでrootではいって更新コマンド売った&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update

# Cドライブ直下
ls /mnt/c

&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2-2 rbenvをインストールしよう&lt;/h2&gt;
&lt;h3&gt;2-2-1 macOSでrbnevをインストール&lt;/h3&gt;
&lt;h3&gt;2-2-2 Windows（WSL）でrbenvをインストール&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/rbenv.git ~/.rbenv

echo &apos;export PATH=&quot;$HOME/.rbenv/bin:$PATH&quot;&apos; &amp;gt;&amp;gt; ~/.bashrc
echo &apos;eval &quot;${rbenv init -}&quot;&apos; &amp;gt;&amp;gt; ~/.bashrc
exit

# 再度ログイン
wsl -u root

rbenv -v
# =&amp;gt; バージョンが表示されること


# rbenvでのRubyのインストールを簡単にするプラグイン、ruby-buildをセットアップ
git clone https://github.com/rbenv/ruby-build.git &quot;$(rbenv root)&quot;/plugins/ruby-build

# こちらのコマンドはhttps://github.com/rbenv/ruby-build/wiki を参照
sudo apt-get install autoconf bison build-essential libssl-dev libyaml-dev libreadline-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm-dev libdb-dev

# libgdbm6 このパッケージが見つからなかった
# sudo apt-get install autoconf bison build-essential libssl-dev libyaml-dev libreadline-dev # zlib1g-dev libncurses5-dev libffi-dev libgdbm libgdbm-dev libdb-dev
# Reading package lists... Done
# Building dependency tree
# Reading state information... Done
# E: Unable to locate package libgdbm

&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2-3 Rubyのインストール&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;rbenv install 2.5.1
rbenv global 2.5.1

ruby -v
which ruby

# うまく行かなかったので以下を参照して設定した
# &amp;lt;https://qiita.com/yuma-ito-bd/items/00f89ca0c04909c7c467&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2-3-1 Rubyのパッケージ管理ツール「RubyGems」&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Rubyは本体だけでも動作するが、公開されているサードパーティのライブラリを利用することで素早く生産的にプログラミング可能&lt;/li&gt;
&lt;li&gt;これらのライブラリは「gem」という形式でパッケージ化されている&lt;/li&gt;
&lt;li&gt;本書で取り扱っていくRailsもgemの１つ&lt;/li&gt;
&lt;li&gt;Rubygemsと呼ばれるパッケージ管理ツールがgemのインストールや管理を簡単にしてくれる&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;gem update --system

gem -v

gem list

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2-3-2 Bundlerのインストール&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bundler：gemをどのバージョンで利用するのかを管理する仕組み&lt;/li&gt;
&lt;li&gt;プロジェクトのディレクトリに&lt;code&gt;Gemfile&lt;/code&gt;という名前のファイルを作成し、gemの名前を記載しておくとそのとおりにインストールしたり、それらのgemをRubyから利用したりすることができるようになる&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;gem install bundler
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;bundle install&lt;/code&gt;: Gemfileに記述したgemをインストールする&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bundle exec [コマンド]&lt;/code&gt;: Bundlerが管理するgemを利用できる状態でコマンドを実行する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bundle init&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bundle update&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;2-4 Railsのインストール&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gem install rails -v 5.2.1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rails -v&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2-4-1 Node.jsのインストール&lt;/h3&gt;
&lt;p&gt;Javascriptランタイムとしてnodejsをインストールする&lt;/p&gt;
&lt;p&gt;&lt;code&gt;curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -&lt;/code&gt;
sudo apt install nodejs&lt;/p&gt;
&lt;p&gt;nodebrewインストール参考
&lt;code&gt;&amp;lt;https://www.kimoton.com/entry/20190215/1550166179&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;2-5 データベースのインストールとセットアップ&lt;/h2&gt;
&lt;h3&gt;2-5-1 macOSの場合&lt;/h3&gt;
&lt;h3&gt;2-5-2 Windows（WSL）の場合&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo sh -c &apos;echo &quot;deb http://apt.postgresql.org/pub/repos/apt/${lsb_release -cs}-pgdg main&quot; &amp;gt; /etc/apt/sources.list.d/pgdg.list&apos;
wget --quiet -P - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt update
sudo apt install postgresql

# 資料に記載の手順でpostgresqlインストールできなさそうだったので以下の手順で実施
# 参考）&amp;lt;https://www.digitalocean.com/community/tutorials/how-to-install-postgresql-on-ubuntu-20-04-quickstart-ja&amp;gt;
sudo apt update
sudo apt install postgresql postgresql-contrib
# サービスが起動しているか確認し起動していなければ立ち上げる
service postgresql status
service postgresql start

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2-5-3 トラブルシューティング：RailsでPG::ConnectionBadというエラーになるとき&lt;/h3&gt;
&lt;h2&gt;2-6 Railsに触れてみよう&lt;/h2&gt;
&lt;h3&gt;2-6-1 実際にアプリケーションを動かしてみよう&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 雛形生成
rails new scaffold_app -d postgresql
# 確認
cd scaffold_app
ls
# データベース作成
# railsコマンドではなく、bin/railsコマンドを利用する
# このスクリプトだと、bundle exec railsとして実行したときと同様に、Gemfile通りのgemを利用できる環境上でrailsコマンドを実行することができる
bin/rails db:create

# サーバー起動
bin/rails s


&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;うまくRails立ち上がらないので、書籍とは別のバージョンを入れる&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://qiita.com/Gushi_maru/items/f3b5cc43e135e678085f&quot;&gt;https://qiita.com/Gushi_maru/items/f3b5cc43e135e678085f&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;apt-get install libpq-dev&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;
# 問題：postgresqlが5432portで立ち上がらない問題
# 原因：Windows側でインストールしているPostgresqlがすでに5432ポートで立ち上がっていたため
# 対策：Windows側で立ち上がっていたサービスを停止した上で起動
root@DORAEMON:/etc/postgresql/10/main# service postgresql start
 * Starting PostgreSQL 10 database server                                                                                                                                                     * Removed stale pid file.
Error: /usr/lib/postgresql/10/bin/pg_ctl /usr/lib/postgresql/10/bin/pg_ctl start -D /var/lib/postgresql/10/main -l /var/log/postgresql/postgresql-10-main.log -s -o  -c config_file=&quot;/etc/postgresql/10/main/postgresql.conf&quot;  exited with status 1:
2021-03-28 04:08:07.395 JST [210] LOG:  could not bind IPv4 address &quot;127.0.0.1&quot;: Permission denied
2021-03-28 04:08:07.395 JST [210] HINT:  Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
2021-03-28 04:08:07.395 JST [210] WARNING:  could not create listen socket for &quot;localhost&quot;
2021-03-28 04:08:07.395 JST [210] FATAL:  could not create any TCP/IP sockets
2021-03-28 04:08:07.396 JST [210] LOG:  database system is shut down
pg_ctl: could not start server
Examine the log output.


# 問題：DB作成ができない問題
root@DORAEMON:/mnt/c/users/Tomo/ruby-work/scaffold-app# bin/rails db:create
FATAL:  role &quot;root&quot; does not exist
Couldn&apos;t create &apos;scaffold_app_development&apos; database. Please check your configuration.
rails aborted!
PG::ConnectionBad: FATAL:  role &quot;root&quot; does not exist
/mnt/c/users/Tomo/ruby-work/scaffold-app/bin/rails:9:in `&amp;lt;top (required)&amp;gt;&apos;
/mnt/c/users/Tomo/ruby-work/scaffold-app/bin/spring:15:in `&amp;lt;top (required)&amp;gt;&apos;
bin/rails:3:in `load&apos;
bin/rails:3:in `&amp;lt;main&amp;gt;&apos;
Tasks: TOP =&amp;gt; db:create
(See full trace by running task with --trace)

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;そもそもPostgresqlにユーザ作成しておく必要がありそうなので対応&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Postgresqlにユーザを作成する手順&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://qiita.com/krtsato/items/4565051608a63f11b316&quot;&gt;https://qiita.com/krtsato/items/4565051608a63f11b316&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;パスワードは環境変数に設定しておき読み込む&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.techscore.com/blog/2012/10/26/how-to-manage-database-yml/&quot;&gt;https://www.techscore.com/blog/2012/10/26/how-to-manage-database-yml/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ユーザ作成&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://qiita.com/sibakenY/items/407b721ad1bd0975bd00&quot;&gt;https://qiita.com/sibakenY/items/407b721ad1bd0975bd00&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/hexo/source/img/2021-03-28-15-05-16.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;railsはHTTPサーバとしてpumaを使用している&lt;/li&gt;
&lt;li&gt;Pumaは広く使用されており、Railsの機能を利用する上で不足はありません。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2-6-1-2 ユーザ管理画面の雛形を作る&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# ユーザーに関するscaffoldを自動生成する
bin/rails generate scaffold user name:string address:string age:integer

# ユーザ管理機能に使うデータベースを作成する
bin/rails db:migrate

# 準備が整ったところで再度アプリケーションを起動する
bin/rails s


&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;2-6-1-4 コードの通り道&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Controllerからページテンプレート周りの簡単な説明&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2-6-1-5 ディレクトリ構成&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ディレクトリ構成（割愛）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;database.yml&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;データベースと接続するための設定ファイル&lt;/li&gt;
&lt;li&gt;development,test,productionという環境用にそれぞれ作成&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目名&lt;/th&gt;
&lt;th&gt;説明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;adapter&lt;/td&gt;
&lt;td&gt;データベースの接続に使用するアダプタの名前を指定します。アダプタには各データベースに対応するsqlite3,postgresql,mysql2,oracle_enhancedなどがある&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;encoding&lt;/td&gt;
&lt;td&gt;文字コード&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pool&lt;/td&gt;
&lt;td&gt;コネクション数の上限&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;database&lt;/td&gt;
&lt;td&gt;データベース名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;username&lt;/td&gt;
&lt;td&gt;データベースに接続するユーザ名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;password&lt;/td&gt;
&lt;td&gt;データベースに接続するユーザのパスワード&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;host&lt;/td&gt;
&lt;td&gt;データベースが動作しているホスト名またはipアドレス&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;# PostgreSQL. Versions 9.3 and up are supported.
#
# Install the pg driver:
#   gem install pg
# On macOS with Homebrew:
#   gem install pg -- --with-pg-config=/usr/local/bin/pg_config
# On macOS with MacPorts:
#   gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config
# On Windows:
#   gem install pg
#       Choose the win32 build.
#       Install PostgreSQL and put its /bin directory on your path.
#
# Configure Using Gemfile
# gem &apos;pg&apos;
#
default: &amp;amp;default
  adapter: postgresql
  encoding: unicode
  # For details on connection pooling, see Rails configuration guide
  # https://guides.rubyonrails.org/configuring.html#database-pooling
  pool: &amp;lt;%= ENV.fetch(&quot;RAILS_MAX_THREADS&quot;) { 5 } %&amp;gt;

development:
  &amp;lt;&amp;lt;: *default
  database: scaffold_app_development

  # The specified database role being used to connect to postgres.
  # To create additional roles in postgres see `$ createuser --help`.
  # When left blank, postgres will use the default role. This is
  # the same name as the operating system user that initialized the database.
  #username: scaffold_app

  # The password associated with the postgres role (username).
  #password:

  # Connect on a TCP socket. Omitted by default since the client uses a
  # domain socket that doesn&apos;t need configuration. Windows does not have
  # domain sockets, so uncomment these lines.
  #host: localhost

  # The TCP port the server listens on. Defaults to 5432.
  # If your server runs on a different port number, change accordingly.
  #port: 5432

  # Schema search path. The server defaults to $user,public
  #schema_search_path: myapp,sharedapp,public

  # Minimum log levels, in increasing order:
  #   debug5, debug4, debug3, debug2, debug1,
  #   log, notice, warning, error, fatal, and panic
  # Defaults to warning.
  #min_messages: notice

# Warning: The database defined as &quot;test&quot; will be erased and
# re-generated from your development database when you run &quot;rake&quot;.
# Do not set this db to the same as development or production.
test:
  &amp;lt;&amp;lt;: *default
  database: scaffold_app_test

# As with config/credentials.yml, you never want to store sensitive information,
# like your database password, in your source code. If your source code is
# ever seen by anyone, they now have access to your database.
#
# Instead, provide the password as a unix environment variable when you boot
# the app. Read https://guides.rubyonrails.org/configuring.html#configuring-a-database
# for a full rundown on how to provide these environment variables in a
# production deployment.
#
# On Heroku and other platform providers, you may have a full connection URL
# available as an environment variable. For example:
#
#   DATABASE_URL=&quot;postgres://myuser:mypass@localhost/somedatabase&quot;
#
# You can use this database configuration with:
#
#   production:
#     url: &amp;lt;%= ENV[&apos;DATABASE_URL&apos;] %&amp;gt;
#
production:
  &amp;lt;&amp;lt;: *default
  database: scaffold_app_production
  username: scaffold_app
  password: &amp;lt;%= ENV[&apos;SCAFFOLD_APP_DATABASE_PASSWORD&apos;] %&amp;gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Column YAMLの基本&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;エイリアスとアンカー問機能&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;animal: &amp;amp;animal
  cat: &apos;ネコ&apos;
  dog: &apos;イヌ&apos;

animal_shop_1:
  &amp;lt;&amp;lt;: *animal
  hamster: &apos;ハムスター&apos;

animal_shop_2:
  &amp;lt;&amp;lt;: *animal
  parrot: &apos;オウム&apos;

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;routes.rb&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;アプリケーションのルーティングを定義するファイル&lt;/li&gt;
&lt;li&gt;リクエストに対応するレスポンスを作るためにどの処理を実行するかを定義したもの&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# すべてのルーティングを確認できる
bin/rails routes

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2-6-2 RailsのMVC&lt;/h3&gt;
&lt;h2&gt;Chapter3 タスク管理アプリケーションを作ろう&lt;/h2&gt;
&lt;h2&gt;3-1 アプリケーション作成の準備をしよう&lt;/h2&gt;
&lt;h3&gt;3-1-1 作成するアプリケーションの内容を考える&lt;/h3&gt;
&lt;h3&gt;3-1-2 アプリケーションの名前を決める&lt;/h3&gt;
&lt;h3&gt;3-1-3 アプリケーションのひな形を作成する&lt;/h3&gt;
&lt;h3&gt;3-1-4 データベースの環境ごとの使い分け&lt;/h3&gt;
&lt;h3&gt;3-1-5 ビュー層を効率良く書くためにSlimを使えるようにする&lt;/h3&gt;
&lt;h3&gt;3-1-6 アプリケーションの見栄えを良くするためにBootstrapを導入する&lt;/h3&gt;
&lt;h3&gt;3-1-7 Railsのエラーメッセージなどを日本語で出せるようにする&lt;/h3&gt;
&lt;h2&gt;3-2 タスクモデルを作成する&lt;/h2&gt;
&lt;h3&gt;3-2-1 タスクモデルの属性を設計する&lt;/h3&gt;
&lt;h3&gt;3-2-2 タスクモデルのひな形を作成する&lt;/h3&gt;
&lt;h3&gt;3-2-3 マイグレーションでデータベースにテーブルを追加する&lt;/h3&gt;
&lt;h2&gt;3-3 コントローラとビュー&lt;/h2&gt;
&lt;h3&gt;3-3-1 新規登録機能を実装する&lt;/h3&gt;
&lt;h3&gt;3-3-2 一覧表示機能を実装する&lt;/h3&gt;
&lt;h3&gt;3-3-3 詳細表示機能を実装する&lt;/h3&gt;
&lt;h3&gt;3-3-4 編集機能を実装する&lt;/h3&gt;
&lt;h3&gt;3-3-5 削除機能を実装する&lt;/h3&gt;
&lt;h3&gt;3-3-6 シンプルなCRUD機能の完成&lt;/h3&gt;
&lt;h2&gt;＜レベルアップ編＞&lt;/h2&gt;
&lt;h2&gt;Chapter4 現実の複雑さに対応する&lt;/h2&gt;
&lt;h2&gt;4-1 さまざまなマイグレーション操作を使いこなす&lt;/h2&gt;
&lt;h3&gt;4-1-1 マイグレーションの適用を理解しよう&lt;/h3&gt;
&lt;h3&gt;4-1-2 マイグレーションではバージョンの上げ下げ両方を意識しよう&lt;/h3&gt;
&lt;h3&gt;4-1-3 マイグレーションの名前の付け方に注意する&lt;/h3&gt;
&lt;h3&gt;4-1-4 schema.rb&lt;/h3&gt;
&lt;h3&gt;4-1-5 マイグレーションに関する主なコマンド&lt;/h3&gt;
&lt;h3&gt;4-1-6 マイグレーションの適用中にエラーが出たときは&lt;/h3&gt;
&lt;h2&gt;4-2 データの内容を制限する&lt;/h2&gt;
&lt;h3&gt;4-2-1 データ型&lt;/h3&gt;
&lt;h3&gt;4-2-2 NOT NULL制約&lt;/h3&gt;
&lt;h3&gt;4-2-3 文字列カラムの長さを指定する&lt;/h3&gt;
&lt;h3&gt;4-2-4 ユニークインデックスを作成する&lt;/h3&gt;
&lt;h2&gt;4-3 モデルの「検証」を使う&lt;/h2&gt;
&lt;h3&gt;4-3-1 モデルの検証の仕組み&lt;/h3&gt;
&lt;h3&gt;4-3-2 検証の書き方&lt;/h3&gt;
&lt;h3&gt;4-3-3 必須かどうかの検証を追加する&lt;/h3&gt;
&lt;h3&gt;4-3-4 コントローラとビューで検証エラーに対応する&lt;/h3&gt;
&lt;h3&gt;4-3-5 文字列長の検証を追加する&lt;/h3&gt;
&lt;h3&gt;4-3-6 オリジナルの検証コードを書く&lt;/h3&gt;
&lt;h3&gt;4-3-7 検証が行われない登録・更新操作もある&lt;/h3&gt;
&lt;h2&gt;4-4 モデルの状態を自動的に制御する―「コールバック」&lt;/h2&gt;
&lt;h3&gt;4-4-1 コールバックの仕組み&lt;/h3&gt;
&lt;h3&gt;4-4-2 コールバックの実装&lt;/h3&gt;
&lt;h3&gt;4-4-3 トランザクション&lt;/h3&gt;
&lt;h2&gt;4-5 ログイン機能を作る&lt;/h2&gt;
&lt;h3&gt;4-5-1 セッションとCookie&lt;/h3&gt;
&lt;h3&gt;4-5-2 User モデルを作る&lt;/h3&gt;
&lt;h3&gt;4-5-3 パスワードを受け付けてdigestを保存する&lt;/h3&gt;
&lt;h3&gt;4-5-4 ユーザー管理機能一式を追加する&lt;/h3&gt;
&lt;h3&gt;4-5-5 ログイン機能を実装する&lt;/h3&gt;
&lt;h3&gt;4-5-6 ログインのフォームを表示する&lt;/h3&gt;
&lt;h3&gt;4-5-7 ログインの実行&lt;/h3&gt;
&lt;h3&gt;4-5-8 ログイン状態の取得を簡単にする&lt;/h3&gt;
&lt;h3&gt;4-5-9 ログアウト機能を実装する&lt;/h3&gt;
&lt;h3&gt;4-5-10 ログインしていなければタスク管理を利用できなくする&lt;/h3&gt;
&lt;h3&gt;4-5-11 ログインしているユーザーのデータだけを扱えるようにする&lt;/h3&gt;
&lt;h3&gt;4-5-12 管理機能を管理者ユーザーだけに利用させるようにする&lt;/h3&gt;
&lt;h3&gt;4-5-13 最初の管理者ユーザーを作る&lt;/h3&gt;
&lt;h2&gt;4-6 データを絞り込む&lt;/h2&gt;
&lt;h3&gt;4-6-1 絞り込みの起点&lt;/h3&gt;
&lt;h3&gt;4-6-2 絞り込み条件&lt;/h3&gt;
&lt;h3&gt;4-6-3 実行部分&lt;/h3&gt;
&lt;h2&gt;4-7 タスク一覧を作成日時の新しい順に表示する&lt;/h2&gt;
&lt;h2&gt;4-8 scopeを活用する&lt;/h2&gt;
&lt;h2&gt;4-9 フィルタを使い重複を避ける&lt;/h2&gt;
&lt;h3&gt;4-10 詳しい説明に含まれるURLをリンクとして表示する&lt;/h3&gt;
&lt;h3&gt;4-10-1 まとめ&lt;/h3&gt;
&lt;h2&gt;Chapter5 テストをはじめよう&lt;/h2&gt;
&lt;h2&gt;5-1 テストについて&lt;/h2&gt;
&lt;h2&gt;5-2 テストを書くことのメリット&lt;/h2&gt;
&lt;h3&gt;5-2-1 テスト全体にかかるコストの削減&lt;/h3&gt;
&lt;h3&gt;5-2-2 変更をフットワーク軽く行えるようになる&lt;/h3&gt;
&lt;h3&gt;5-2-3 環境のバージョンアップやリファクタリングの必須条件&lt;/h3&gt;
&lt;h3&gt;5-2-4 仕様変更の影響の大きさを簡単に把握することができる&lt;/h3&gt;
&lt;h3&gt;5-2-5 仕様を記述したドキュメントとしても機能する&lt;/h3&gt;
&lt;h3&gt;5-2-6 仕様やインターフェイスを深く考えるきっかけとして役立つ&lt;/h3&gt;
&lt;h3&gt;5-2-7 適切な粒度のコードになりやすい&lt;/h3&gt;
&lt;h3&gt;5-2-8 確実性を高めることで開発効率を上げる&lt;/h3&gt;
&lt;h2&gt;5-3 本章で利用するテスト用ライブラリ&lt;/h2&gt;
&lt;h3&gt;5-3-1 RSpec&lt;/h3&gt;
&lt;h3&gt;5-3-2 Capybara&lt;/h3&gt;
&lt;h3&gt;5-3-3 FactoryBot&lt;/h3&gt;
&lt;h2&gt;5-4 本章で記述するテストの種類&lt;/h2&gt;
&lt;h3&gt;5-4-1 モデルのテスト&lt;/h3&gt;
&lt;h3&gt;5-4-2 結合テスト&lt;/h3&gt;
&lt;h3&gt;5-4-3 ルーティング、メーラー、ジョブのテスト&lt;/h3&gt;
&lt;h3&gt;5-4-4 あまり利用しないテスト&lt;/h3&gt;
&lt;h2&gt;Column System Specとは？&lt;/h2&gt;
&lt;h2&gt;5-5 System Specを書くための準備&lt;/h2&gt;
&lt;h3&gt;5-5-1 RSpecのインストールと初期準備&lt;/h3&gt;
&lt;h3&gt;5-5-2 Capybaraの初期準備&lt;/h3&gt;
&lt;h3&gt;5-5-3 FactoryBotのインストール&lt;/h3&gt;
&lt;h2&gt;5-6 RSpecの基本形&lt;/h2&gt;
&lt;h2&gt;5-7 FactoryBotでテストデータを作成できるように準備する&lt;/h2&gt;
&lt;h2&gt;5-8 タスクの一覧表示機能のSystem Spec&lt;/h2&gt;
&lt;h3&gt;5-8-1 ユーザーAを作成しておく&lt;/h3&gt;
&lt;h3&gt;5-8-2 作成者がユーザーAであるタスクを作成しておく&lt;/h3&gt;
&lt;h3&gt;5-8-3 ユーザーAでログインする&lt;/h3&gt;
&lt;h3&gt;5-8-4 作成済みのタスクの名称が画面上に表示されていることを確認&lt;/h3&gt;
&lt;h2&gt;5-9 他のユーザーが作成したタスクが表示されないことの確認&lt;/h2&gt;
&lt;h3&gt;5-10 beforeを利用した共通化&lt;/h3&gt;
&lt;h3&gt;5-11 letを利用した共通化&lt;/h3&gt;
&lt;h2&gt;Column letとlet!&lt;/h2&gt;
&lt;h3&gt;5-12 詳細表示機能のSpecを追加する&lt;/h3&gt;
&lt;h3&gt;5-13 shared_examplesを利用する&lt;/h3&gt;
&lt;h3&gt;5-14 新規作成機能のSystem Spec&lt;/h3&gt;
&lt;h3&gt;5-15 letの上書き&lt;/h3&gt;
&lt;h3&gt;5-16 Specが失敗したときの調査方法&lt;/h3&gt;
&lt;h3&gt;5-16-1 Specが失敗するとき&lt;/h3&gt;
&lt;h3&gt;5-16-2 Specが失敗したときに確認すべき情報&lt;/h3&gt;
&lt;h3&gt;5-16-3 失敗場所とエラーメッセージを手がかりに原因を探す&lt;/h3&gt;
&lt;h3&gt;5-16-4 コンソールを使って調査する&lt;/h3&gt;
&lt;h3&gt;5-16-5 スクリーンショットを活用する&lt;/h3&gt;
&lt;h2&gt;Chapter6 Railsの全体像を理解する&lt;/h2&gt;
&lt;h2&gt;6-1 Railsを取り巻く世界&lt;/h2&gt;
&lt;h2&gt;6-2 ルーティング&lt;/h2&gt;
&lt;h3&gt;6-2-1 「 ルート」を構成する5つの要素&lt;/h3&gt;
&lt;h3&gt;6-2-2 1つのルートを定義する&lt;/h3&gt;
&lt;h2&gt;Column URLヘルパーメソッドは使わなくてはダメ？&lt;/h2&gt;
&lt;h3&gt;6-2-3 「 RESTful」の概要をつかんでおこう&lt;/h3&gt;
&lt;h3&gt;6-2-4 RESTfulにするための Railsの流儀&lt;/h3&gt;
&lt;h2&gt;Column RESTfulはどの程度追求すべき？&lt;/h2&gt;
&lt;h3&gt;6-2-5 resourcesでCRUDのルート一式を定義する&lt;/h3&gt;
&lt;h3&gt;6-2-6 routes.rbの構造化&lt;/h3&gt;
&lt;h2&gt;Column routes.rbの整理のコツ&lt;/h2&gt;
&lt;h2&gt;6-3 国際化&lt;/h2&gt;
&lt;h3&gt;6-3-1 ユーザーごとに言語を切り替える&lt;/h3&gt;
&lt;h3&gt;6-3-2 翻訳ファイルの扱い方&lt;/h3&gt;
&lt;h2&gt;6-4 日時の扱い方&lt;/h2&gt;
&lt;h3&gt;6-4-1 日時の扱い方に関する設定&lt;/h3&gt;
&lt;h3&gt;6-4-2 taskleafアプリケーションのデフォルトのタイムゾーンを日本時間にする&lt;/h3&gt;
&lt;h3&gt;6-4-3 Time.currentやDate.currentを利用する&lt;/h3&gt;
&lt;h2&gt;6-5 エラー処理のカスタマイズ&lt;/h2&gt;
&lt;h3&gt;6-5-1 Railsのエラー処理の概要&lt;/h3&gt;
&lt;h3&gt;6-5-2 デバッグ用/本番用のエラー画面の切り分け&lt;/h3&gt;
&lt;h3&gt;6-5-3 Railsの本番用エラー画面のカスタマイズ&lt;/h3&gt;
&lt;h3&gt;6-5-4 アプリケーション固有のエラー処理の追加&lt;/h3&gt;
&lt;h2&gt;6-6 Railsのログ&lt;/h2&gt;
&lt;h3&gt;6-6-1 ログの利用方法&lt;/h3&gt;
&lt;h3&gt;6-6-2 ログ（ロガー）の設定&lt;/h3&gt;
&lt;h2&gt;6-7 セキュリティを強化する&lt;/h2&gt;
&lt;h3&gt;6-7-1 意図しないパラメータを弾く「Strong Parameters」&lt;/h3&gt;
&lt;h3&gt;6-7-2 CSRF対策を利用する&lt;/h3&gt;
&lt;h3&gt;6-7-3 インジェクションに注意する&lt;/h3&gt;
&lt;h3&gt;6-7-4 Content Security Policy（CSP）を設定する&lt;/h3&gt;
&lt;h2&gt;6-8 アセットパイプライン&lt;/h2&gt;
&lt;h3&gt;6-8-1 環境による挙動の違い&lt;/h3&gt;
&lt;h3&gt;6-8-2 ブラウザにアセットを読み込ませる&lt;/h3&gt;
&lt;h3&gt;6-8-3 連結結果のファイルをどうやって生成するか&lt;/h3&gt;
&lt;h3&gt;6-8-4 マニフェストファイルを記述する&lt;/h3&gt;
&lt;h3&gt;6-8-5 アセットの探索パス&lt;/h3&gt;
&lt;h3&gt;6-8-6 アセット関連の設定&lt;/h3&gt;
&lt;h2&gt;6-9 production環境でアプリケーションを立ち上げる&lt;/h2&gt;
&lt;h3&gt;6-9-1 アセットのプリコンパイル&lt;/h3&gt;
&lt;h3&gt;6-9-2 静的ファイルの配信サーバを設定する&lt;/h3&gt;
&lt;h3&gt;6-9-3 production環境用のデータベースを作成する&lt;/h3&gt;
&lt;h3&gt;6-9-4 config/master.key が存在することを確認する&lt;/h3&gt;
&lt;h3&gt;6-9-5 productionモードでサーバを起動する&lt;/h3&gt;
&lt;h3&gt;6-9-6 production環境用の秘密情報の管理&lt;/h3&gt;
&lt;h3&gt;6-9-7 秘密情報の暗号化・復号&lt;/h3&gt;
&lt;h2&gt;Column secret_key_base&lt;/h2&gt;
&lt;h2&gt;Column カスタム暗号化ファイル（Encrypted）&lt;/h2&gt;
&lt;h2&gt;Chapter7 機能を追加してみよう&lt;/h2&gt;
&lt;h2&gt;7-1 登録や編集の実行前に確認画面をはさむ&lt;/h2&gt;
&lt;h3&gt;7-1-1 確認画面を表示するアクションを追加する&lt;/h3&gt;
&lt;h3&gt;7-1-2 新規登録画面からの遷移先を変える&lt;/h3&gt;
&lt;h3&gt;7-1-3 登録アクションで「戻る」ボタンからの遷移に対応する&lt;/h3&gt;
&lt;h2&gt;Column 確認画面があるほうが良いとは限らない&lt;/h2&gt;
&lt;h2&gt;7-2 一覧画面に検索機能を追加する&lt;/h2&gt;
&lt;h3&gt;7-2-1 Ransackのインストール&lt;/h3&gt;
&lt;h3&gt;7-2-2 名称による検索&lt;/h3&gt;
&lt;h3&gt;7-2-3 検索時のSQLの確認と検索マッチャー&lt;/h3&gt;
&lt;h3&gt;7-2-4 登録日時による検索&lt;/h3&gt;
&lt;h3&gt;7-2-5 検索条件を絞る&lt;/h3&gt;
&lt;h2&gt;7-3 一覧画面にソート機能を追加する&lt;/h2&gt;
&lt;h2&gt;7-4 メールを送る&lt;/h2&gt;
&lt;h3&gt;7-4-1 メイラーの実装&lt;/h3&gt;
&lt;h3&gt;7-4-2 テンプレートの実装&lt;/h3&gt;
&lt;h3&gt;7-4-3 メール送信処理&lt;/h3&gt;
&lt;h3&gt;7-4-4 動作確認&lt;/h3&gt;
&lt;h3&gt;7-4-5 メイラーのテスト&lt;/h3&gt;
&lt;h2&gt;7-5 ファイルをアップロードしてモデルに添付する&lt;/h2&gt;
&lt;h3&gt;7-5-1 タスクに画像ファイルを添付する&lt;/h3&gt;
&lt;h3&gt;7-5-2 Active Storage&lt;/h3&gt;
&lt;h3&gt;7-5-3 Active Storageの準備&lt;/h3&gt;
&lt;h3&gt;7-5-4 タスクモデルに画像を添付できるようにする&lt;/h3&gt;
&lt;h2&gt;7-6 CSV形式のファイルのインポート/エクスポート&lt;/h2&gt;
&lt;h3&gt;7-6-1 タスクをCSV出力（エクスポート）する&lt;/h3&gt;
&lt;h3&gt;7-6-2 CSVデータを入力（インポート）する&lt;/h3&gt;
&lt;h2&gt;7-7 ページネーション&lt;/h2&gt;
&lt;h3&gt;7-7-1 kaminariのインストール&lt;/h3&gt;
&lt;h3&gt;7-7-2 ページ番号に対応する範囲のデータを検索するようにする&lt;/h3&gt;
&lt;h3&gt;7-7-3 ビューにページネーションのための情報を表示する&lt;/h3&gt;
&lt;h3&gt;7-7-4 動作確認&lt;/h3&gt;
&lt;h3&gt;7-7-5 デザインの調整&lt;/h3&gt;
&lt;h3&gt;7-7-6 表示件数を変更したいとき&lt;/h3&gt;
&lt;h2&gt;7-8 非同期処理や定期実行を行う（Jobスケジューリング）&lt;/h2&gt;
&lt;h3&gt;7-8-1 非同期処理ツールの導入&lt;/h3&gt;
&lt;h3&gt;7-8-2 ジョブの作成、実行&lt;/h3&gt;
&lt;h3&gt;7-8-3 実行日時指定&lt;/h3&gt;
&lt;h3&gt;7-8-4 ７章の終わりに&lt;/h3&gt;
&lt;h2&gt;＜発展編＞&lt;/h2&gt;
&lt;h2&gt;Chapter8 RailsとJavaScript&lt;/h2&gt;
&lt;h2&gt;8-1 JavaScriptでページに変化をつける&lt;/h2&gt;
&lt;h2&gt;8-2 AjaxでRailsサーバと通信する&lt;/h2&gt;
&lt;h3&gt;8-2-1 Ajaxでタスクを削除する&lt;/h3&gt;
&lt;h3&gt;8-2-2 rails-ujsの果たしている役割&lt;/h3&gt;
&lt;h3&gt;8-2-3 コントローラからJavaScriptを返して実行する（SJR）&lt;/h3&gt;
&lt;h2&gt;Column CoffeeScriptは使わないことも検討する&lt;/h2&gt;
&lt;h2&gt;Column jQuery&lt;/h2&gt;
&lt;h2&gt;8-3 Turbolinks&lt;/h2&gt;
&lt;h3&gt;8-3-1 Turbolinksの発行するイベント&lt;/h3&gt;
&lt;h3&gt;8-3-3 Turbolinksが有効な環境での注意点&lt;/h3&gt;
&lt;h3&gt;8-3-4 Turbolinksを無効化するには&lt;/h3&gt;
&lt;h2&gt;8-4 モダンなJavaScript管理を行う&lt;/h2&gt;
&lt;h3&gt;8-4-1 Yarn&lt;/h3&gt;
&lt;h3&gt;8-4-2 Webpacker&lt;/h3&gt;
&lt;h2&gt;8-5 taskleafにReactを導入してみる&lt;/h2&gt;
&lt;h2&gt;Column Webpackerのメリット・デメリット&lt;/h2&gt;
&lt;h2&gt;Chapter9 複数人でRailsアプリケーションを開発する&lt;/h2&gt;
&lt;h2&gt;9-1 チーム開発の風景（導入編）&lt;/h2&gt;
&lt;h3&gt;9-1-1 ソースコードの変更を管理する&lt;/h3&gt;
&lt;h3&gt;9-1-2 GitHubなどの開発プラットフォームを使う&lt;/h3&gt;
&lt;h3&gt;9-1-3 GitHubを使うには？&lt;/h3&gt;
&lt;h3&gt;9-1-4 Pull Requestベースの開発&lt;/h3&gt;
&lt;h3&gt;9-1-5 Gitに入れるファイル、入れないファイル&lt;/h3&gt;
&lt;h2&gt;Column database.ymlとセキュリティ&lt;/h2&gt;
&lt;h3&gt;9-1-6 Pull Requestの変更差分を最新状態との比較にする&lt;/h3&gt;
&lt;h3&gt;9-1-7 Gitのpush -fに気をつける&lt;/h3&gt;
&lt;h3&gt;9-1-8 GitHubとチャットツールを連携させる&lt;/h3&gt;
&lt;h2&gt;9-2 チーム開発の風景（コードレビュー編）&lt;/h2&gt;
&lt;h3&gt;9-2-1 コードレビューではどんな点を見て、何をコメントする？&lt;/h3&gt;
&lt;h3&gt;9-2-2 コーディング規約&lt;/h3&gt;
&lt;h2&gt;Column コーディング規約との付き合い方&lt;/h2&gt;
&lt;h3&gt;9-2-3 Lintツールの活用&lt;/h3&gt;
&lt;h2&gt;Column コードレビューは素晴らしい、だが万能ではない&lt;/h2&gt;
&lt;h3&gt;9-2-4 CIツールとGitHubを連動させる&lt;/h3&gt;
&lt;h2&gt;9-3 チーム開発の風景（分担編）&lt;/h2&gt;
&lt;h3&gt;9-3-1 チームで開発するときの分担の仕方&lt;/h3&gt;
&lt;h2&gt;9-4 開発環境の構築方法をわかりやすくしておく&lt;/h2&gt;
&lt;h3&gt;9-4-1 誰でも簡単にセットアップできるようにする&lt;/h3&gt;
&lt;h3&gt;9-4-2 仮想化環境を利用する&lt;/h3&gt;
&lt;h3&gt;9-4-3 初期データ・テスト用データの共有&lt;/h3&gt;
&lt;h2&gt;9-5 マイグレーションに注意する&lt;/h2&gt;
&lt;h3&gt;9-5-1 ロールバックできることを確認しよう&lt;/h3&gt;
&lt;h3&gt;9-5-2 「redo」を習慣にしよう&lt;/h3&gt;
&lt;h3&gt;9-5-3 完全なロールバックができないとき&lt;/h3&gt;
&lt;h3&gt;9-5-4 過去のマイグレーションファイルの変更には慎重になろう&lt;/h3&gt;
&lt;h2&gt;Column 「きれいなマイグレーション」を追求しない&lt;/h2&gt;
&lt;h3&gt;9-5-5 マイグレーションファイルが多くなってきたら&lt;/h3&gt;
&lt;h3&gt;9-5-6 直接DBを変更したら必ずマイグレーションファイルも追加しておこう&lt;/h3&gt;
&lt;h3&gt;9-5-7 データメンテナンス&lt;/h3&gt;
&lt;h2&gt;Column Rakeタスクでのデータメンテナンス&lt;/h2&gt;
&lt;h2&gt;Chapter10 Railsアプリケーションと長く付き合うために&lt;/h2&gt;
&lt;h3&gt;10-1 バージョンアップにどう取り組むか&lt;/h3&gt;
&lt;h3&gt;10-2 小さなバージョンアップ&lt;/h3&gt;
&lt;h3&gt;10-2-1 bundle updateとは&lt;/h3&gt;
&lt;h3&gt;10-2-2 bundle updateの際に行うべきこと&lt;/h3&gt;
&lt;h3&gt;10-3 bundle update はチーム全体で行う&lt;/h3&gt;
&lt;h3&gt;10-4 bundle updateを自動化でサポートする&lt;/h3&gt;
&lt;h3&gt;10-5 大きなバージョンアップを行う際に気をつけること&lt;/h3&gt;
&lt;h3&gt;10-6 アプリケーションの複雑性に立ち向かう&lt;/h3&gt;
&lt;h3&gt;10-7 第一の鍵─しかるべきところにコードを書く&lt;/h3&gt;
&lt;h3&gt;10-7-1 コントローラに入り込む複雑さ&lt;/h3&gt;
&lt;h3&gt;10-7-2 モデルに書くべきコードをモデルに寄せる&lt;/h3&gt;
&lt;h3&gt;10-7-3 ビューに入り込んだビジネスロジックをモデルに寄せる&lt;/h3&gt;
&lt;h3&gt;10-7-4 Decoratorパターンでモデル固有の表示ロジックを分離する&lt;/h3&gt;
&lt;h3&gt;10-8 第二の鍵─上手に共通化する&lt;/h3&gt;
&lt;h3&gt;10-9 モデルの共通化&lt;/h3&gt;
&lt;h3&gt;10-9-1 共通機能のモジュールを複数のモデルクラスにMix-inする&lt;/h3&gt;
&lt;h3&gt;10-9-2 STI（単一テーブル継承）で共通機能を基底クラスに持たせる&lt;/h3&gt;
&lt;h3&gt;10-9-3 全モデルクラスに共通の処理をApplicationRecordに書く&lt;/h3&gt;
&lt;h3&gt;10-9-3 ApplicationRecordとモデルクラスの間に抽象的なクラスを挟む&lt;/h3&gt;
&lt;h3&gt;10-10 コントローラの共通化&lt;/h3&gt;
&lt;h3&gt;10-10-1 共通機能のモジュールを複数のコントローラクラスにMix-inする&lt;/h3&gt;
&lt;h3&gt;10-10-2 基底クラスを追加して共通機能を持たせる&lt;/h3&gt;
&lt;h3&gt;10-10-3 ApplicationControllerに共通機能を記述する&lt;/h3&gt;
&lt;h3&gt;10-10-4 第一の鍵を使わない状態で第二の鍵を使ってはいけない&lt;/h3&gt;
&lt;h3&gt;10-11 ビュー（プレゼンテーション）の共通化&lt;/h3&gt;
&lt;h3&gt;10-11-1 パーシャルテンプレートで画面の一部を共通化する&lt;/h3&gt;
&lt;h3&gt;10-11-2 レイアウトで画面の大枠を共通化する&lt;/h3&gt;
&lt;h3&gt;10-11-3 カスタムヘルパーに共通処理を記述する&lt;/h3&gt;
&lt;h3&gt;10-11-4 カスタムヘルパーは小さく作る&lt;/h3&gt;
&lt;h3&gt;10-11-5 特定のモデルに依存する処理をカスタムヘルパーに含めない&lt;/h3&gt;
&lt;h3&gt;10-12 第三の鍵─新しい構造を追加して役割を分担する&lt;/h3&gt;
&lt;h3&gt;10-12-1 ActiveModel&lt;/h3&gt;
&lt;h3&gt;10-12-2 共通処理を担当するオブジェクトを別につくって連携させる&lt;/h3&gt;
&lt;h3&gt;10-12-3 意味のあるパラメータの集合からクラスを生み出す&lt;/h3&gt;
&lt;h3&gt;10-12-4 外部サービスのロジックを閉じ込める&lt;/h3&gt;
&lt;h3&gt;10-12-5 複数のモデルが絡む特定処理の専門家を作る&lt;/h3&gt;
&lt;h3&gt;10-12-6 サブリソース単位でコントローラを分割する&lt;/h3&gt;
&lt;h2&gt;Column 何でも屋のアクションを実装しない&lt;/h2&gt;
&lt;h3&gt;10-13 モジュールを上手に利用するために&lt;/h3&gt;
&lt;h3&gt;10-13-1 構造として分かりやすい意味を持たせる&lt;/h3&gt;
&lt;h3&gt;10-13-2 利用元クラスの一部として違和感がないかを検討する&lt;/h3&gt;
&lt;h3&gt;10-13-3 利用元クラスと内部データを共有していることを意識する&lt;/h3&gt;
&lt;h3&gt;10-13-4 独立的にして利用条件を分かりやすくする&lt;/h3&gt;
&lt;h3&gt;10-13-5 追加部品であるという節度を守る&lt;/h3&gt;
&lt;h3&gt;10-14 おわりに&lt;/h3&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;h2&gt;Index&lt;/h2&gt;
</content:encoded></item><item><title>Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築</title><link>https://tutttuwi.github.io/posts/2020-06_gradle%E5%BE%B9%E5%BA%95%E5%85%A5%E9%96%80_%E6%AC%A1%E4%B8%96%E4%BB%A3%E3%83%93%E3%83%AB%E3%83%89%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AB%E3%82%88%E3%82%8B%E8%87%AA%E5%8B%95%E5%8C%96%E5%9F%BA%E7%9B%A4%E3%81%AE%E6%A7%8B%E7%AF%89/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2020-06_gradle%E5%BE%B9%E5%BA%95%E5%85%A5%E9%96%80_%E6%AC%A1%E4%B8%96%E4%BB%A3%E3%83%93%E3%83%AB%E3%83%89%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AB%E3%82%88%E3%82%8B%E8%87%AA%E5%8B%95%E5%8C%96%E5%9F%BA%E7%9B%A4%E3%81%AE%E6%A7%8B%E7%AF%89/</guid><pubDate>Sat, 13 Jun 2020 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築&lt;/h1&gt;
&lt;h2&gt;理解したこと&lt;/h2&gt;
&lt;h2&gt;書籍情報&lt;/h2&gt;
&lt;p&gt;形式：書籍
発売日：2014年11月04日
ISBN：9784798136431
価格：本体3,800円＋税
仕様：B5変・592ページ
分類：プログラミング・開発
シリーズ：徹底入門&lt;/p&gt;
&lt;p&gt;日本語初のGradle解説書、ついに刊行！
Groovyベースのビルドツール「Gradle」は、SpringやHibernateなどの著名なOSSで利用されているほか、Androidの公式ビルドツールとして採用されており、これからの開発者やビルド職人には無視することのできないツールのひとつと言えるでしょう。
本書は、GradleのインストールからJavaアプリケーションのビルドやテスト、依存関係の管理、ビルド成果物の公開などのGradleの主要な機能の解説に加え、詳細なスクリプトファイルの記述方法からCIツールやIDEとの連携といった実業務で必要となる範囲までをカバーした日本語初のGradleの解説書となります。
有識者によるGradle 2.0ベース（1.x系ベースの章や2.1のトピックなどもあります）で書き下ろされた500ページを超える本書は「徹底入門」の名に恥じない内容で、これだけ充実したGradle解説書は、日本語ではもちろん英語でも類を見ません。
これからGradleを始める人、Gradleをもっと使いこなしたい人、GradleとJenkinsでCIをやりたい人、AntやMavenからの移行を考えている人…などなど、多くの開発者やビルド職人にお勧めできる一冊です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;サンプルコード
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.shoeisha.co.jp/book/download/9784798136431/detail&quot;&gt;https://www.shoeisha.co.jp/book/download/9784798136431/detail&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第1部［導入編］&lt;/h2&gt;
&lt;h3&gt;第1章 Gradle の世界&lt;/h3&gt;
&lt;h4&gt;1.1 Gradleとは&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;次世代のビルドツールとして注目を集めているオープンソースのプロダクト&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Gradleが注目されている理由&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;既存のビルドツールに比べて優れている点が多い&lt;/li&gt;
&lt;li&gt;Gradleのビルドスクリプトは非常にシンプルに記述できるという点&lt;/li&gt;
&lt;li&gt;具体的には本書を読みすすめると実感できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;NOTE&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;特に、肥大したAntのビルドすくリプの保守に苦労された方や、Mavenに入門しようとしたものの敷居の高さに挫折した方にはおすすめ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;もう１つの利点&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AntやMaavenといった既存のビルドツールのエコシステムを最大限活用しているという点がある&lt;/li&gt;
&lt;li&gt;Gradleは既存のAntタスクやAntビルドスクリプト、さたにMavenリポジトリを利用できるので、過去に蓄積してきた資産は無駄にならない&lt;/li&gt;
&lt;li&gt;それらの資産を最大限利用して段階的にGradleに移行していくことが可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;1.1.1 ビルドツールとは&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;ビルドツールとは
&lt;ul&gt;
&lt;li&gt;定型的な作業を自動化するためのソフトウェア&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;1.1.2 ビルドツールの歴史&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ビルドツールの進化は比較的緩やかですが、時代とともに着実に発展しています。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ここでは、その進化の流れをたどってみたいと思います。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;元祖ビルドツールMake&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;元祖はUnix系OSにおけるMakeといって差し支えない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JavaのためのビルドツールAnt&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Antは当時流行のJavaとXMLを採用することで、Makeの弱点であったプラットフォーム依存から脱却することに成功&lt;/li&gt;
&lt;li&gt;シンプルで使いやすい反面、ちょっと複雑なことをしようとするとビルドスクリプトが長大になる&lt;/li&gt;
&lt;li&gt;メンテナンスが困難になる&lt;/li&gt;
&lt;li&gt;ライブラリの依存関係を管理する仕組みが無い&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ビルドツールの革新者Maven&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JavaとXMLによるプラットフォーム独立のアーキテクチャはAntと同じですが、ビルドツールにビルドライフサイクルとプロジェクトオブジェクトモデル（POM）という概念を持ち込むことで、Antの弱点であったビルドスクリプトの冗長化を解消&lt;/li&gt;
&lt;li&gt;また、POMにメタデータをもたせることで、ライブラリの依存関係を自動的に解決する仕組みを構築することに成功&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;そしてGradleへ&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;1.1.3 Gradleの概要&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;GradleプロジェクトのWebサイトでは、Gradleとは、Build Automation Evolved すなわち、「ビルド自動化ツールの進化系」であると紹介されている&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Gradleの特徴&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;拡張可能なGradleビルド言語（GSL）の提供&lt;/li&gt;
&lt;li&gt;ビルドの分割や共通部品抽出などの体系化の容易さ&lt;/li&gt;
&lt;li&gt;IDEなどと連携するため、Gradleを外部からコントロールするためのAPIを提供&lt;/li&gt;
&lt;li&gt;インクリメンタルビルドや並列ビルドなどでビルドを効率化&lt;/li&gt;
&lt;li&gt;マルチプロジェクトサポートの柔軟性&lt;/li&gt;
&lt;li&gt;Maven/Ivyリポジトリからローカルファイルシステムまで多用な依存関係管理手法に対応&lt;/li&gt;
&lt;li&gt;Antタスクだけでなく、Antプロジェクト全体とのインテグレーションに対応&lt;/li&gt;
&lt;li&gt;ビルドスクリプトの記述言語としてGroovyを利用&lt;/li&gt;
&lt;li&gt;GradleラッパーによってGradleがインストールされていない環境でもビルドが実行可能&lt;/li&gt;
&lt;li&gt;互換性への配慮&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Gradle User Guid&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.gradle.org/documentation&quot;&gt;http://www.gradle.org/documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Gradleユーザーガイド（日本語翻訳版）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://gradle.monochromeroad.com/docs/&quot;&gt;http://gradle.monochromeroad.com/docs/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;1.1.4 Gradleの事例&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Gradleが普及している例が紹介されている&lt;/li&gt;
&lt;li&gt;AntやMavenと比較するとIDE連携やアプリケーションサーバー連携などが課題らしい&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;1.2 なぜGradleなのか？&lt;/h4&gt;
&lt;h4&gt;1.2.1 ビルドスクリプトの生産性の高さ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;GradleはMavenと同じく、規約ベースのビルドというアプローチを採用している&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;これにより、規約に従ったプロジェクト構造（ディレクトリ構造）を使う限りにおいては、ビルドスクリプトの記述を大幅に省略可能&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GradleはJVM言語であるGroovyをベースに構築されている&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GroovyはJavaにはない、リストリテラル/マップリテラル/クロージャといった機能が使える&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GradleはたんにGroovyの文法を利用するだけでなく、ビルドスクリプトをより簡潔に記述するための独自の文法（DSL）も提供している&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;NOTE&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;XMLは静的な構造を表現することは得意ですが、ビルドスクリプトのような手順（手続き）を表現することには適していない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;1.2.2 ビルド手順の制御の容易性&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Mavenの偉大な業績として
&lt;ul&gt;
&lt;li&gt;大半のプロジェクトに適用できる標準的なビルド手順&lt;/li&gt;
&lt;li&gt;メタデータによるビルド手順の制御
&lt;ul&gt;
&lt;li&gt;という考え方を導入し、それを実現する具体的なアイデアとしてPOMを導入したことが挙げられる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;1.2.3 マルチプロジェクト対応&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;サブプロジェクトに共通するビルドの設定など&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;マルチプロジェクトに含めるサブプロジェクトを定義する機能&lt;/li&gt;
&lt;li&gt;サブプロジェクトに共通のビルドスクリプトを集約する機能&lt;/li&gt;
&lt;li&gt;サブプロジェクト間の依存関係を定義する機能&lt;/li&gt;
&lt;li&gt;依存関係を考慮してインクリメンタルビルドする機能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;機能を列挙してみるとやや複雑そうな印象を受けますが、実際のビルドスクリプトは非常にシンプル&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;HibernateがGradleに乗り換えた理由も「マルチプロジェクト対応が優秀だったから」だそう&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;1.2.4 部品化の手軽さ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;部品化も簡単だよーという説明&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;1.2.5 個別インストール不要&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;AntやMavenを使う際には、利用者の環境にインストールしなければならない&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ことのあるバージョンを導入してしまう可能性がある&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;このような問題に対処するために、GradleはGradleラッパーという仕組みを提供している&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Gradleラッパーはプロジェクト内にGradleのブートストラップを仕込むことで、指定されたバージョンのGradleを必要に応じて自動的にインストールして実行してくれる機能&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使い方は簡単で、あらかじめGradleのwrapperタスクを実行してブートストラップを生成しておくだけです。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;それをそのままSubversionやGitなどのバージョン管理システムに登録しておけば、利用者はバージョン管理システムからプロジェクトをチェックアウトし、gradlewコマンドを実行するだけで、Gradleのバイナリがダウンロードされ、ビルドが行われます。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Note&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;このGradleラッパーは優れたアイデアで、最近のビルドツールは同様にインストールレスで使えるようにしているものが増えてきているそう&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;1.2.6 互換性への配慮&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;互換性への方針&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;既存の機能が突然使えなくなるような変更は行わない&lt;/li&gt;
&lt;li&gt;機能を除去する場合は、将来的に廃止される可能性を明示して段階的に除去する&lt;/li&gt;
&lt;li&gt;新機能は十分なフィードバックを受けて安定してから固定化する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ライフサイクル&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;非公開&lt;/li&gt;
&lt;li&gt;実験的&lt;/li&gt;
&lt;li&gt;公開&lt;/li&gt;
&lt;li&gt;廃止&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;1.3 他のビルドツールとの比較&lt;/h4&gt;
&lt;h4&gt;1.3.1 Make vs Gradle&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;優位性
&lt;ul&gt;
&lt;li&gt;クロスプラットフォーム対応&lt;/li&gt;
&lt;li&gt;依存関係解決の機能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;1.3.2 Ant vs Gradle&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;優位性
&lt;ul&gt;
&lt;li&gt;依存関係解決の機能&lt;/li&gt;
&lt;li&gt;規約が無いため再利用性が損なわれる&lt;/li&gt;
&lt;li&gt;基本機能がシンプルであるがゆえに複雑なことをしようとすると冗長になる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;1.3.3 Maven vs Gradle&lt;/h4&gt;
&lt;h3&gt;第2章 インストールと設定&lt;/h3&gt;
&lt;h4&gt;2.1 Gradleのインストール&lt;/h4&gt;
&lt;h4&gt;2.1.1 前提条件&lt;/h4&gt;
&lt;p&gt;Gradleを利用するためにはJDK6以上が必要
Gradleは内部にGroovyのライブラリをバンドルしているので、別途Groovyをインストールする必要はない&lt;/p&gt;
&lt;h4&gt;2.1.2 GVMによるGradleのインストール&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;MacOSXやLinux、CygwinなどでBashが使える環境であれば、&lt;/li&gt;
&lt;li&gt;おすすめのインストール方法はGVM（the Groovy enVironment Manager）を利用することです。&lt;/li&gt;
&lt;li&gt;GVMとは、GroovyやGrailsなどいわゆるGroovyエコシステムに付随するプロダクトのインストールやアップデートを一元的に行うためのツール&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// 事前準備
// curl と unzipは使えること

// GVMのインストール
curl -s get.gvm.net | bash

// プロキシ設定されていたら
export http_proxy = htpp://&amp;lt;proxyhost&amp;gt;:&amp;lt;port&amp;gt;/

// インストール後は、 `~/.bashrc`が書き換えられ、GVMが利用可能な状態になるので
// .source ~/.gvm/bin/gvm-init.sh を実行して環境設定を更新してください

// インストールされていることを確認
gvm help

// GVMのオフラインモード切り替え
gvm offline enable
gvm offline disable

// Gradleのインストール
gvm install gradle

// インストール可能なGradleのバージョン確認
gvm list gradle
gvm install gradle &amp;lt;version&amp;gt;

// 複数のバージョンのGradleをインストールしている場合切り替えることができる
gvm default gradle &amp;lt;version&amp;gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;2.1.3 ZIPファイル展開によるインストール&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Windowsのインストール方法を説明&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2.2 基本的な設定と動作確認&lt;/h4&gt;
&lt;h4&gt;2.2.1 環境変数の設定&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;環境設定&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;gradleコマンドへパスが通っていること&lt;/li&gt;
&lt;li&gt;java コマンドが実行できること&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JAVA_OPTS、GRADLE_OPTSの設定についても言及&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2.2.2 gradleコマンドの実行&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;gradle -v
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;第3章 スタートアップGradle&lt;/h3&gt;
&lt;h4&gt;3.1 Groovy特有の文法&lt;/h4&gt;
&lt;p&gt;Gradleのビルドスクリプトは、実際にはGroovyのスクリプト
しかし、Gradleの提供するDSLのおかげで、Groovyのことはあまり意識せずにビルドスクリプトが記述できるようになっている
Groovyの文法はJavaと互換性があるので、Javaを知っていれば文法的に難解な箇所はそれほどないでしょう&lt;/p&gt;
&lt;p&gt;とはいえ、Groovy特有の文法を知らないと、Gradleのビルドスクリプトを読み書きするのが難しいのも事実
Gradleでよく使われるものに絞って文法を説明&lt;/p&gt;
&lt;h4&gt;3.1.1 文字列&lt;/h4&gt;
&lt;p&gt;文字列の表記方法として大きく２通りの方法が利用できる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;シングルクォート：Javaの文字列とほぼ同等の利用方法&lt;/li&gt;
&lt;li&gt;ダブルクォート：文字列の内部に$記号で動的な内容を埋め込むことができる。内部的には、GroovyのGStringというクラスが使われる&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3.1.2 メソッド呼び出し時のカッコ省略&lt;/h4&gt;
&lt;h4&gt;3.1.3 defによる型指定の省略&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// 型を指定した変数定義
String name = &apos;John&apos;
// 型を省略下変数定義
def name = &apos;John&apos;

// Javaにおいて、Object型を指定した場合と同等になる
// ただし、Groovyの場合はダックタイピングの機能があるため、型としてdefを指定した場合でもオブジェクトのメソッドやプロパティは参照できる
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;3.1.4 クロージャ&lt;/h4&gt;
&lt;p&gt;Groovyは言語機能としてクロージャを提供している
Java8で導入されたラムダや、他のプログラム言語で言うところの関数オブジェクトのようなものと理解しておいて&lt;/p&gt;
&lt;p&gt;クロージャは中括弧を利用して定義し、&amp;lt;クロージャ名&amp;gt;.call()または、通常のメソッド呼び出しと同様に&amp;lt;クロージャ名&amp;gt;()で実行できる&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// クロージャ定義
def clos1 = { mes -&amp;gt; println &quot;Hi, $mes&quot;}
// 引数と省略した場合は、暗黙引数itを利用
def clos2 = { println &quot;Hi, $it&quot;}

// クロージャ実行
clos1.call(&apos;John&apos;)
clos2(&apos;Bob&apos;)
// メソッド呼び出しと同様にカッコ省略可能
clos2 &apos;Alice&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Gradleはクロージャを多用しており、例えば次のようなタスク定義はクロージャによって実現されている&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;task hello &amp;lt;&amp;lt; {
  println &apos;Hello Gradle world!&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;// 上記を個別に定義した場合は下記のようになる

// タスクへ追加する処理をクロージャとして定義
def clos = { println &apos;Hello Gradle world!&apos; }

// タスクを定義
task hello {}
// タスクにクロージャを追加
// &amp;lt;&amp;lt; は leftShift()の省略形なので以下と等価
hello.leftShift(clos)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;3.2 Hello Gradle world&lt;/h4&gt;
&lt;h4&gt;3.2.1 ビルドスクリプトの作成と実行&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;task hello doLast {
  println &apos;Hello Gradle world!&apos;
}
task hello2 doLast {
  println &apos;Hello Gradle world!(hello2)&apos;
}
// doLast欠かないとConfigure扱いになって起動時に処理はしるらしい
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;MEMO: Gradle3以降ぐらいから、leftShiftが非推奨になりつかなくなった様子
&lt;ul&gt;
&lt;li&gt;代わりにdoLastを使うのだとか&lt;a href=&quot;https://qiita.com/ossan_pg/items/608134f44ccf4542edf2&quot;&gt;https://qiita.com/ossan_pg/items/608134f44ccf4542edf2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3.2.2 ビルドスクリプトと実行結果の解説&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;実行結果について説明しているだけ&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3.2.3 組み込みタスク&lt;/h4&gt;
&lt;p&gt;Gradleはビルドスクリプトで特に何も指定していなくても利用可能なタスクを提供している
これらのタスクのことを「組み込みタスク（built-in tasks）」と呼びます
タスクの一覧はgradle tasks で確認できる&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;E:\XXX_POKET\020_資格・学習\JAVA\20200613_Gradle徹底入門\practice\chap3&amp;gt;gradle tasks

&amp;gt; Task :tasks

------------------------------------------------------------
Tasks runnable from root project
------------------------------------------------------------

Build Setup tasks
-----------------
init - Initializes a new Gradle build.
wrapper - Generates Gradle wrapper files.

Help tasks
----------
buildEnvironment - Displays all buildscript dependencies declared in root project &apos;chap3&apos;.
components - Displays the components produced by root project &apos;chap3&apos;. [incubating]
dependencies - Displays all dependencies declared in root project &apos;chap3&apos;.
dependencyInsight - Displays the insight into a specific dependency in root project &apos;chap3&apos;.
dependentComponents - Displays the dependent components of components in root project &apos;chap3&apos;. [incubating]
help - Displays a help message.
model - Displays the configuration model of root project &apos;chap3&apos;. [incubating]
projects - Displays the sub-projects of root project &apos;chap3&apos;.
properties - Displays the properties of root project &apos;chap3&apos;.
tasks - Displays the tasks runnable from root project &apos;chap3&apos;.

To see all tasks and more detail, run gradle tasks --all

To see more detail about a task, run gradle help --task &amp;lt;task&amp;gt;

BUILD SUCCESSFUL in 1s
1 actionable task: 1 executed

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;initタスクは「Build Setup tasks」に属しており、ビルドの初期化を行うタスクであるということが読み取れます&lt;/li&gt;
&lt;li&gt;プラグインを追加することで利用できるタスクも追加されるので、gradle tasksで利用できるタスクを一覧で見れるということを覚えておく&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;また、よく使う組み込みタスクとして、&lt;code&gt;gradle properties&lt;/code&gt;がある
これはGradleのビルドスクリプトに定義されているプログラムの一覧を表示するタスク&lt;/p&gt;
&lt;h4&gt;3.2.4 主要なコマンドラインオプション&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ログ出力量の少ない順にGradleのコマンドラインオプションを並べると次のようになる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-i (--info)&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;ログレベルがINFOになり、ビルドスクリプトのファイル名などの情報が表示されるようになる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-s (--stacktrace)&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;例外発生時にユーザー例外部分のみスタックトレースを表示&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-S (--full-stacktrace)&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;例外発生時にすべてのスタックトレースを表示&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-d (--debug)&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;ログレベルがDEBUGに設定され、非常に詳細な情報が表示される様になる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;デフォルトの&lt;code&gt;build.gradle&lt;/code&gt;ファイル以外のファイル名のビルドスクリプトを指定する場合&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gradle -b build-new.gradle&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3.3 プロジェクト自動生成とビルド&lt;/h4&gt;
&lt;h4&gt;3.3.1 initタスクによるプロジェクト自動生成&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;gradle init --type java-library
// 生成される
// 途中、使用するDSLなどを聞かれる
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Gradleの規約はMavenに倣って定義されているので、プロダクションコードは、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;src/main/java以下&lt;/li&gt;
&lt;li&gt;テストコードは
&lt;ul&gt;
&lt;li&gt;src/test/java以下に配置される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;NOTE&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gradleは、規約とは異なる場所にJavaソースを配置することもできる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;/*
 * This file was generated by the Gradle &apos;init&apos; task.
 *
 * This generated file contains a sample Java Library project to get you started.
 * For more details take a look at the Java Libraries chapter in the Gradle
 * User Manual available at https://docs.gradle.org/5.5.1/userguide/java_library_plugin.html
 */

plugins {
    // ★Javaプラグインが適用されている
    // これによりjavaプロジェクトに対する規約（プロダクションコードをsrc/main/javaに配置するなど）やJavaプロジェクトのビルドに必要なタスクが追加されます
    // Apply the java-library plugin to add support for Java Library
    id &apos;java-library&apos;
}
// 昔の書き方として以下があったらしい
apply plugin: &apos;java&apos;


repositories {
    // ★Maven Centralリポジトリを指定
    mavenCentral()
    // Use jcenter for resolving dependencies.
    // You can declare any Maven/Ivy/file repository here.
    jcenter()
}

dependencies {
    // &apos;group:name:version&apos;という省略記法でプラグインが記載されている
    // compileやtestCompileというキーワードがありますが、これはJavaプラグインによって定義されているコンフィグレーションを意味している 詳しくは第４章で解説

    // This dependency is exported to consumers, that is to say found on their compile classpath.
    api &apos;org.apache.commons:commons-math3:3.6.1&apos;

    // This dependency is used internally, and not exposed to consumers on their own compile classpath.
    implementation &apos;com.google.guava:guava:27.1-jre&apos;

    // Use JUnit test framework
    testImplementation &apos;junit:junit:4.12&apos;
}

&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;3.3.2 ビルド実行と結果確認&lt;/h4&gt;
&lt;p&gt;先程自動生成したJavaプロジェクトをそのままビルドしてみましょう&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gradle tasks
// 様々なタスクが追加されていることを確認

// ビルド実行
gradle build

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ビルド実行直後再度ビルドすると、[UP-TO-DATE]と判断されて、処理がスキップされる様になっている&lt;/p&gt;
&lt;h4&gt;3.3.3 テスト実行と結果確認&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;buildタスクの実行によって、testタスクも実行されている&lt;/li&gt;
&lt;li&gt;今回の場合、自動生成されたテストコードがコンパイルされ、テストが実行されている&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;レポートを確認してみる
HTML形式レポートが出力されていることを確認&lt;/p&gt;
&lt;p&gt;build/test-resultsディレクトリ以下を確認してみると、TEST-LibraryTest.xmlというファイルが生成されていることがわかる
これはJUnit4が出力するXML形式のテストレポートで、Jenkinsなど他システムとの連携が必要な場合にはこちらを利用することになる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NOTE
&lt;ul&gt;
&lt;li&gt;じつは、先程確認したHTML形式のテストレポートは、このXML形式のテストレポートをGradleのJavaプラグインが加工して生成したもの&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3.4 Webアプリケーションのビルド&lt;/h4&gt;
&lt;p&gt;WebアプリケーションをビルドしてTomcat上で実行するビルドスクリプトを作成してみる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NOTE
&lt;ul&gt;
&lt;li&gt;Gradleの標準プラグインにJettyプラグインがあり、そちらを利用して組み込みJettyによるWebアプリケーションのテストを行うことも可能&lt;/li&gt;
&lt;li&gt;しかし、このプラグインで起動されるJettyバージョンがJetty6と古く、Servlet3.0など新しいAPIに対応していません。&lt;/li&gt;
&lt;li&gt;そのため、ここではサードパーティのプラグインを利用する手順を紹介しています。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3.4.1 Webプロジェクトの作成&lt;/h4&gt;
&lt;p&gt;前回のjavaプロジェクトの、build.gradleを修正してWebプロジェクトへ発展させる&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gradle init --type java-library
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;/*
 * This file was generated by the Gradle &apos;init&apos; task.
 *
 * This generated file contains a sample Java Library project to get you started.
 * For more details take a look at the Java Libraries chapter in the Gradle
 * User Manual available at https://docs.gradle.org/5.5.1/userguide/java_library_plugin.html
 */

// (1) Tomcatプラグイン利用のための設定
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath &apos;com.bmuschko:gradle-tomcat-plugin:2.0&apos;
    }
}


plugins {
    // Apply the java-library plugin to add support for Java Library
    id &apos;java-library&apos;
    // WARプラグイン追加
    // id &apos;war&apos;
    // Tomcatプラグイン適用
    // id &apos;com.bmuschko.tomcat&apos;
    // id &apos;com.bmuschko.tomcat-base&apos;
}
apply plugin: &apos;war&apos;
apply plugin: &apos;com.bmuschko.tomcat&apos;


repositories {
    // セントラルレポジトリ追加
    mavenCentral()
    // Use jcenter for resolving dependencies.
    // You can declare any Maven/Ivy/file repository here.
    jcenter()
}

dependencies {
    // (4) 依存関係にJava EE 6のAPIを追加
    // ビルド時には参照するが、ビルド生成物からは除外する　用に指定している
    providedCompile &apos;javax:javaee-web-api:6.0&apos;
    compile &apos;org.slf4j:slf4j-api:1.7.5&apos;

    // This dependency is exported to consumers, that is to say found on their compile classpath.
    api &apos;org.apache.commons:commons-math3:3.6.1&apos;

    // This dependency is used internally, and not exposed to consumers on their own compile classpath.
    implementation &apos;com.google.guava:guava:27.1-jre&apos;

    // Use JUnit test framework
    testImplementation &apos;junit:junit:4.12&apos;
    
    
    // (5) Tomcat実行に必要な依存ライブラリの設定
    def tomcatVersion = &apos;7.0.52&apos;
      tomcat &quot;org.apache.tomcat.embed:tomcat-embed-core:${tomcatVersion}&quot;,
             &quot;org.apache.tomcat.embed:tomcat-embed-logging-juli:${tomcatVersion}&quot;
      tomcat(&quot;org.apache.tomcat.embed:tomcat-embed-jasper:${tomcatVersion}&quot;) {
        exclude group: &apos;org.eclipse.jdt.core.compiler&apos;, module: &apos;ecj&apos;
    }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;gradle tomcatRunWar
gradle tRW

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Buildエラーは出力されるが、アクセスできた&lt;a href=&quot;http://localhost:8080/chap3-java-web/&quot;&gt;http://localhost:8080/chap3-java-web/&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;3.4.3 WARファイルの生成&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;gradle war
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;3.5 Gradleの便利な機能&lt;/h4&gt;
&lt;p&gt;Gradleを使うにあたって知っておくと便利な機能を本章の最後に紹介&lt;/p&gt;
&lt;h4&gt;3.5.1 Gradleデーモン&lt;/h4&gt;
&lt;p&gt;Gradleを本格的に使い始めると、まず気になるところが、gradleコマンドの起動に時間がかかること&lt;/p&gt;
&lt;p&gt;この起動時間を解消するために、Gradleは「Gradleデーモン」という機能を提供している
Gradleデーモンを利用すると、毎回JavaVMを起動/停止するのではなく、JavaVMを常駐させておくことができる&lt;/p&gt;
&lt;p&gt;gradleコマンドを事項してGradleデーモン(JavaVMプロセス)を常駐させてしまえば
2度目以降のビルドは非常に高速に実行される用になります。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gradle --daemon hello

// デフォルトでデーモンを有効にしたい場合
// GRADLE_OPTSに追加する
GRADLE_OPS=&quot;-Dorg.gradle.daemon=true&quot;
// gradle.propertiesに追加する
org.gradle.daemon=true

// デーモンは一定時間で停止されるが、明示的に停止する場合以下を実行
gradle --stop
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;3.5.2 Gradleラッパー&lt;/h4&gt;
&lt;p&gt;新しいツールを現在進行中のプロジェクトに適用したい場合、以下の試練がある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gradleの良さを紹介する&lt;/li&gt;
&lt;li&gt;インストール方法を説明する&lt;/li&gt;
&lt;li&gt;使い方を説明する&lt;/li&gt;
&lt;li&gt;慣れるまでサポートする&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この問題はGradleラッパーで解消できる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;このメリット
&lt;ul&gt;
&lt;li&gt;利用するGradleのバージョンを固定できる&lt;/li&gt;
&lt;li&gt;JenkinsなどのCIツールを実行する環境にGradleをインストールしなくてよい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第2部［基礎編］&lt;/h2&gt;
&lt;h3&gt;第4章 Java プロジェクトのビルド&lt;/h3&gt;
&lt;h4&gt;4.1 Javaプロジェクトになぜプラグインが必要なのか？&lt;/h4&gt;
&lt;p&gt;標準機能だけでJavaプロジェクトのビルドもできないの？と疑問に思われるかもしれない
実は、Gradleのコア機能は次の２つのみで構成されている&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;定型的に繰り返し行う作業を自動化するための仕組み&lt;/li&gt;
&lt;li&gt;自動化された処理を実行するための部品&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Gradleの看板機能であるビルド例外ではなく、自動化の対象となる具体的な作業はすべてプラグインとして実装されており、コア機能からは分離されている
厳密に言えば、Gradleは「ビルドツール」ではなく、「拡張可能な自動化ツール」と呼ぶのが適切なのだと思います。&lt;/p&gt;
&lt;p&gt;このように、JavaプロジェクトのビルドにJavaプラグインが必要である背景には、Gradleのアーキテクチャに起因する理由がある&lt;/p&gt;
&lt;h4&gt;4.2 Javaプラグインとは&lt;/h4&gt;
&lt;p&gt;Javaプラグインがどのようなものかを見ていきましょう&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Javaプラグイン
&lt;ul&gt;
&lt;li&gt;タスク：Javaのビルドに必要&lt;/li&gt;
&lt;li&gt;規約：設定を簡略化する&lt;/li&gt;
&lt;li&gt;プロパティ&lt;/li&gt;
&lt;li&gt;ソースセット
&lt;ul&gt;
&lt;li&gt;がパッケージングされたビルド機能のコンポーネント&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4.2.1 ソースセット&lt;/h4&gt;
&lt;p&gt;最も重要なソースセットについて説明&lt;/p&gt;
&lt;p&gt;ビルド対象となるソースの種類として、
・プロダクションコード
・テストコード
　・ユニットテスト
　・インテグレーションテスト
と、様々ある&lt;/p&gt;
&lt;p&gt;このような構成に対応するためにソースセットという仕組みを提供している&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;特徴
&lt;ul&gt;
&lt;li&gt;ビルドスクリプト内に自由に追加できる&lt;/li&gt;
&lt;li&gt;ユニークな名前を持つ&lt;/li&gt;
&lt;li&gt;コンパイルの入力となるJavaソースおよびリソースのセットが指定できる&lt;/li&gt;
&lt;li&gt;コンパイルの出力（クラスファイルなど）を生成するパスが指定できる&lt;/li&gt;
&lt;li&gt;コンパイル時のクラスパス、及び実行時のクラスパスが指定できる&lt;/li&gt;
&lt;li&gt;ソースセットごとに専用のタスクを提供する&lt;/li&gt;
&lt;li&gt;ソースセットごとに専用のプロパティを提供する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例えば、テストコードのコンパイルを行う前にプロダクションコードをコンパイルしておく必要がある場合、
テストコードに対応するソースセットのコンパイルタスクの依存関係にプロダクションコードのコンパイルタスクを設定するだけで済みます&lt;/p&gt;
&lt;p&gt;Javaプラグインにはあらかじめmainとtestという２つのソースセットが定義されている
２種類のソースセットだけで対応可能なJavaプロジェクトであれば、独自にソースセットを追加する必要はない&lt;/p&gt;
&lt;h4&gt;4.2.2 タスク&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ビルドに必要な作業&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ソースファイルのコンパイル&lt;/li&gt;
&lt;li&gt;テスト&lt;/li&gt;
&lt;li&gt;Javadocの生成&lt;/li&gt;
&lt;li&gt;JARファイルなどへのアーカイブ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GradleのJavaプラグインには、そのすべての機能がタスクとして定義されている&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;主要なタスク&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;clean&lt;/li&gt;
&lt;li&gt;build&lt;/li&gt;
&lt;li&gt;javadoc&lt;/li&gt;
&lt;li&gt;jar&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4.2.3 規約&lt;/h4&gt;
&lt;p&gt;規約＝約束事&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Javaプラグイン規約&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;プロダクションコードのソース・ファイルは&lt;code&gt;src/main/java&lt;/code&gt;ディレクトリ配下に配置していること&lt;/li&gt;
&lt;li&gt;プロダクションコードのリソースは&lt;code&gt;src/main/resources&lt;/code&gt;ディレクトリ配下に配置していること&lt;/li&gt;
&lt;li&gt;テストコードのソースファイルは&lt;code&gt;src/test/java&lt;/code&gt;ディレクトリ配下に配置していること&lt;/li&gt;
&lt;li&gt;テストコードのリソースは&lt;code&gt;src/test/resources&lt;/code&gt;ディレクトリ配下に配置していること&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mavenを使ったことのある人には馴染みの深いもの&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;規約に関してはMavenという先輩の知恵を有効活用している&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4.2.4 プロパティ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;多くのプロパティにはデフォルト値が設定されている&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4.3 Javaプロジェクトへの適用&lt;/h4&gt;
&lt;p&gt;本章ではJavaプラグインの仕組みを理解するために、あえて手作業で作成&lt;/p&gt;
&lt;h4&gt;4.3.1 基本的なビルドの定義と実行&lt;/h4&gt;
&lt;h4&gt;4.3.2 テストコードを含むビルドの定義と実行&lt;/h4&gt;
&lt;h4&gt;4.3.3 その他の作業&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;コンパイルオプションの設定
&lt;ul&gt;
&lt;li&gt;compileJavaタスクやtestCompileJavaタスクなどのJavaCompile型のタスクに対しては、optionsプロパティを利用して詳細なコンパイルオプションを設定できます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;compileJava {
  // forkした別プロセスでコンパイルを行う
  options.fork = true

  // lint を無効化する
  options.compilerArgs &amp;lt;&amp;lt; &apos;-Xdlint:unchecked&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;JARファイルの設定&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;jar {
  baseName = &apos;example&apos;
  appendix = &apos;bin&apos;
  version = &apos;0.1&apos;
  classifier = &apos;jdk17&apos;
}

// 直接指定する場合
jar {
  archiveName = &apos;example.jar&apos;
}

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;MANIFEST.MFのカスタマイズ&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Javadoc生成&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;javadoc {
  destinationDir = file(&quot;${buildDir/dist/javadoc}&quot;)
  title = &apos;example library V0.1&apos;
}
// @linkタグでJava標準APIのJavadocへリンクする場合など、外部のJavadocへのリンクを生成したい場合は次の用にする
javadoc {
  options.links &amp;lt;&amp;lt; &apos;http://docs.oracle.com/javase/jp/7/api/&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;ビルド出力のクリーンアップ
&lt;ul&gt;
&lt;li&gt;削除したい場合&lt;/li&gt;
&lt;li&gt;Javadocのみ削除したい場合、gradle cleanJavadocを実行&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4.4 Javaプラグインの詳細&lt;/h4&gt;
&lt;p&gt;Gradleの規約に適合していれば、そこまで深くJavaのプラグインを知らなくてもよいが、
適合していない場合、独自のタスクを組み込んだりカスタマイズしていかなくてはならない&lt;/p&gt;
&lt;h4&gt;4.4.1 Javaプラグインのタスクの依存関係&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;タスクはそれぞれ依存関係を持っている
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://gradle.monochromeroad.com/docs/userguide/java_plugin.html&quot;&gt;http://gradle.monochromeroad.com/docs/userguide/java_plugin.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;dependsで指定されている&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4.4.2 つくの詳細&lt;/h4&gt;
&lt;p&gt;Javaプラグインが提供するタスクのうち、重要なものについて説明&lt;/p&gt;
&lt;p&gt;テストに関連するタスクは第８章、アーティファクトの公開に関連するタスクは第１２章で詳しく説明しているのでここでは割愛&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;compileJavaタスク/compileTestJavaタスク&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JavaCompile型のタスク&lt;/li&gt;
&lt;li&gt;javacコマンドによりJavaソースをコンパイルし、クラスファイルを生成します。&lt;/li&gt;
&lt;li&gt;対象
&lt;ul&gt;
&lt;li&gt;compileJavaタスク
&lt;ul&gt;
&lt;li&gt;ソースセットmainのjava.srcDirsプロパティで指定したディレクトリに含まれるJavaソース&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;compileTestJavaタスク
&lt;ul&gt;
&lt;li&gt;ソースセットtestのjava.srcDirsプロパティで指定したディレクトリに含まれるJavaソース&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;拡張子が.javaのファイルのみがコンパイル対象となる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;processResourcesタスク/processTestResourcesタスク&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Copy型のタスク&lt;/li&gt;
&lt;li&gt;プロダクションコードのリソース(.propertiesなど)をクラス出力先にコピーする&lt;/li&gt;
&lt;li&gt;対象
&lt;ul&gt;
&lt;li&gt;processResourcesタスク
&lt;ul&gt;
&lt;li&gt;ソースセットmainのresources.srcDisプロパティで指定したディレクトリに含まれるファイル&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;processTestResourcesタスク
&lt;ul&gt;
&lt;li&gt;ソースセットtestのresources.srcDisプロパティで指定したディレクトリに含まれるファイル&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;jarタスク&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Jar型のタスク&lt;/li&gt;
&lt;li&gt;JARファイルを生成します&lt;/li&gt;
&lt;li&gt;dフォルトではアーカイブ対象はソースセットmainのoutputプロパティ、すなわちcompileJavaタスクとprocessResourcesタスクの出力です。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;javadocタスク&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Javadoc型のタスク&lt;/li&gt;
&lt;li&gt;Javadocを生成します&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4.5 規約に合わないプロジェクトへの適用法&lt;/h4&gt;
&lt;p&gt;新規で作成するプロジェクトはできるだけGradleの規約に合わせることをおすすめします。
既存のプロジェクトにGradleを適用する場合や、プロジェクト特有の事情によってGradleの規約に合わせることができない場合に対応する方法を説明&lt;/p&gt;
&lt;h4&gt;4.5.1 ディレクトリ構成の変更&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;src/main/java以下にxmlやpropertiesなどを配置している場合&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;TODO: 処理の意味が理解できていないので再確認
なぜこれで実現できるのか腑に落ちない&lt;/p&gt;
&lt;h4&gt;4.5.2 コンフィグレーションによる依存関係の変更&lt;/h4&gt;
&lt;p&gt;Gradleには依存関係をグループ化して分類するコンフィグレーションという仕組みがある
依存ライブラリによってはコンパイル時のみ必要で実行時には不要であるものがある
このような状況に対応するための仕組みがコンフィグレーションです&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Javaプラグイン標準コンフィグレーション&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;compile: ソースセットmainのコンパイル時クラスパス。compileJavaタスクが参照&lt;/li&gt;
&lt;li&gt;runtime: ソースセットmainの実行時クラスパス。デフォルトではコンフィグレーションcompileと同内容が設定&lt;/li&gt;
&lt;li&gt;testCompile: ソースセットtestのコンパイル時のクラスパス&lt;/li&gt;
&lt;li&gt;testRuntime: ソースセットtestの実行時クラスパス。&lt;/li&gt;
&lt;li&gt;archives: このプロジェクトのアーティファクトを表すコンフィグレーション&lt;/li&gt;
&lt;li&gt;default このプロジェクトに依存するプロジェクトが利用するデフォルトのクラスパス&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: implementationとかの説明がない..&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4.5.3 ソースセットの追加&lt;/h4&gt;
&lt;p&gt;Javaプラグインは標準でmainとtestの２つのソースセットを提供している
この２つだけでは足りない場合新しく追加できる
インテグレーションテスト用のソースセットがほしいと仮定して作成してみる&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sourceSets {
  integrationTest
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Javaプラグインの規約ではソースセットごとのプロパティにもデフォルト値が定義されている&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Javaソースの配置先はsrc/integrationTest/javaディレクトリ&lt;/li&gt;
&lt;li&gt;リソースの配置先はsrc/integrationTest/resourcesディレクトリ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;作成すると勝手に上記のような規約に沿った形で定義されるみたい
規約に合わない場合は以下の用に定義して対応する&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sourceSets {
  integrationTest {
    java.srcDir file(&apos;src/intTest/java&apos;)
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;TODO: 残りは、IntegrationテストとUnitテストを明確に分けたい場合参照すべし&lt;/p&gt;
&lt;h4&gt;4.6 Applicationプラグイン&lt;/h4&gt;
&lt;p&gt;ApplicationプラグインはJavaアプリケーションを実行したり、配布したりするためのプラグインで、Javaプラグインを拡張して作られている&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用途
&lt;ul&gt;
&lt;li&gt;ビルドスクリプト内でメインクラスを指定し、Gradleからアプリケーションを実行する&lt;/li&gt;
&lt;li&gt;アプリケーションを実行環境に配布するためのアーカイブ(ZIPファイル)を作成する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4.6.1 Applicationプラグインの利用方法&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// applicationプラグインを適用する
apply plugin: &apos;application&apos;
// メインクラスのFQCN名(完全修飾名)を指定する
mainClassName = &apos;com.example.cli.SimpleCalc&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;apply plugin: &apos;java&apos;
apply plugin: &apos;application&apos;

def defaultEncoding = &apos;UTF-8&apos;
compileJava.options.encoding = defaultEncoding

sourceCompatibility = 1.7
targetCompatibility = 1.7

mainClassName = &apos;com.example.cli.SimpleCalc&apos;
applicationName = &apos;SimpleCalc&apos;

repositories {
	mavenCentral()
}

dependencies {
  compile &apos;commons-cli:commons-cli:1.2&apos;
}

run {
  standardInput = System.in
}

javadoc {
  options.links &amp;lt;&amp;lt; &apos;http://docs.oracle.com/javase/jp/7/api/&apos;
}

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;runブロックの内容について
&lt;ul&gt;
&lt;li&gt;実行するアプリケーションが標準入力を必要とする場合は必須&lt;/li&gt;
&lt;li&gt;ビルド実行中はGradleが標準入力を処理しているため、アプリケーションに標準入力を渡すために、このようなおまじないが必要になります。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4.6.2 ビルドスクリプトからのアプリケーション実行&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Applicationプラグインを適用することで、runタスクが加わります&lt;/li&gt;
&lt;li&gt;このタスクを実行するとGradleによって指定したアプリケーションが実行されます。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4.6.3 アプリケーション実行用アーカイブの作成&lt;/h4&gt;
&lt;p&gt;アプリケーション実行用アーカイブを作成
この機能もApplication プラグインによって提供される
アーカイブにドキュメントを追加したい場合は、プロジェクトのsrc/distディレクトリに、それらを配置しておけば自動的にアーカイブに含まれる&lt;/p&gt;
&lt;p&gt;gradle distZipを実行する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;build/libsディレクトリ
&lt;ul&gt;
&lt;li&gt;JARファイルが生成される（実際にJARファイルを生成しているのは&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;build/scriptsディレクトリ
&lt;ul&gt;
&lt;li&gt;アプリケーション実行用のシェルスクリプトとバッチファイルが生成される&lt;/li&gt;
&lt;li&gt;distZipタスクと連動して実行した、startScriptsタスクが生成&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;build/distributionsディレクトリ
&lt;ul&gt;
&lt;li&gt;build/libsディレクトリやbuild/scriptsディレクトリの出力を含んだアーカイブが作成される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;後は、アーカイブを配ってバッチ叩けば実行できるというもの
GUIアプリとか配ると便利そう
ローカルで起動する系のWEBアプリもこれで配れそう&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;必要な依存ライブラリを添えろ得て配布物に含める&lt;/li&gt;
&lt;li&gt;環境変数や、JavaVMオプションなどを設定するための起動スクリプトを準備する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらの手間がなくなるのでApplication プラグインは便利&lt;/p&gt;
&lt;h4&gt;4.7 Warプラグイン&lt;/h4&gt;
&lt;p&gt;WarプラグインはJavaベースのWebアプリケーションのビルドを行うためのプラグインで、Application プラグインと同じ句、Javaプラグインを拡張して作られています&lt;/p&gt;
&lt;h4&gt;4.7.1 Warプラグインの挙動&lt;/h4&gt;
&lt;p&gt;Warプラグインの主な機能はWARファイルを生成すること
warタスクが実際にwarファイルを生成する&lt;/p&gt;
&lt;p&gt;warタスクはJavaプラグインのjarタスクに相当しますが、次のような違いがある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ソースセットmainのコンパイル結果（クラスファイル）をWARファイルのWEB-INF/classesに配置する&lt;/li&gt;
&lt;li&gt;コンフィグレーションruntimeに設定されている依存ライブラリ（JARファイル）をWARファイルのWEB-INF/libに配置する&lt;/li&gt;
&lt;li&gt;webAppDirNameプロパティに設定されているディレクトリ以下をWARファイルの/に展開する
&lt;ul&gt;
&lt;li&gt;このプロパティに指定するディレクトリは、HTMLファイルやCSSファイルといったWebリソースの置き場を指す&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4.7.2 プロパティ&lt;/h4&gt;
&lt;p&gt;Warプラグインが提供するプロパティは次の２つ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;webAppDirName
&lt;ul&gt;
&lt;li&gt;HTMLファイルやJSPファイルなどのWebアプリケーションコンテンツの配置先を、プロジェクトのルートから相対パスで指定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;webAppDir
&lt;ul&gt;
&lt;li&gt;前述のwebAppDirNameの設定に基づき、絶対パスが設定される（参照専用）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4.7.3 コンフィグレーション&lt;/h4&gt;
&lt;p&gt;Warプラグインが提供するコンフィグレーションは次の２つ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;providedCompile
&lt;ul&gt;
&lt;li&gt;ソースセットmainのコンパイル時クラスパスのうち、WARファイルへのコピー対象外としたいもの&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;providedRuntime
&lt;ul&gt;
&lt;li&gt;ソースセットmainの実行時クラスパスのうち、WARファイルへのコピー対象外としたいもの&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらのコンフィグレーションは、WARファイルの実行環境が提供している依存ライブラリを指定するときに使う
典型的な利用方法は、ServletAPIなどアプリケーションサーバーに含まれる依存ライブラリをビルド時のみ参照にし、WARファイルからは除外するという使い方&lt;/p&gt;
&lt;h4&gt;4.7.4 warタスクの設定&lt;/h4&gt;
&lt;p&gt;ビルドスクリプトにwarブロックを追加して、warタスクの挙動をカスタマイズできる&lt;/p&gt;
&lt;p&gt;例えば、web.xmlを別名で用意しておき、ビルド時にweb.xmlとしてWARファイルにコピーする場合&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def env = &apos;dev&apos;
war {
  webXml = file(&quot;src/web-${env}.xml&quot;)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Eclipse WTPプラグイン
&lt;ul&gt;
&lt;li&gt;Warプラグインを適用したプロジェクトをEclipseで開く場合、Eclipseプラグインを適用して、gradle eclipseでEclipseプロジェクトを作っただけではEclipseのWTPプロジェクトとして認識されない&lt;/li&gt;
&lt;li&gt;この場合、Eclipseプラグインを使うのではなく、EclipseWTPプラグインを利用してください&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;第5章 Gradle の基礎&lt;/h3&gt;
&lt;p&gt;本章では、Gradleのアーキテクチャや主要な機能など、理解しておくべきGradleの基礎について解説&lt;/p&gt;
&lt;h4&gt;5.1 Gradleにおけるビルド&lt;/h4&gt;
&lt;p&gt;Gradleでのビルドが何なのかについては明らかにしていませんでした
Gradleのビルドが何を指し、どのように実行されるのかを説明する&lt;/p&gt;
&lt;h4&gt;5.1.1 ビルドとはなにか&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;wiki
&lt;ul&gt;
&lt;li&gt;ソフトウェアのビルドは、ソースコードファイルを独立したソフトウェア成果物に変換するコンピュータ上で実行されるプロセス、またはその結果を指す。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;なにかしらのアクションを実行すること、それがビルドツールにおけるビルドであると言える&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gradleでは実行する処理の単位をタスクと呼び、このタスクを実行することがGradleにとってのビルドであり、ビルドを実行するための仕組みがGradleの根幹&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.1.2 ビルドの入力情報&lt;/h4&gt;
&lt;p&gt;ビルド実行時に、Gradleが参照するファイルやディレクトリ、パラメータにどのようなものがあり、
それらがどのような役割を果たしているかを理解しておきましょう&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;初期化スクリプト
&lt;ul&gt;
&lt;li&gt;ビルドの最初で実行されるGroovyスクリプト&lt;/li&gt;
&lt;li&gt;デフォルトのファイル名はinit.gradleになる&lt;/li&gt;
&lt;li&gt;主にユーザー情報や実行環境などの初期設定を行うために使う&lt;/li&gt;
&lt;li&gt;初期スクリプトはいくつか指定方法があり、複数のスクリプトファイルを使い分けることができる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;設定スクリプト
&lt;ul&gt;
&lt;li&gt;ビルド対象のプロジェクトの設定を行うGroovyスクリプト&lt;/li&gt;
&lt;li&gt;デフォルトのファイル名はsettings.gradleとなります&lt;/li&gt;
&lt;li&gt;主にビルドに参加するプロジェクトを定義する用途で使用&lt;/li&gt;
&lt;li&gt;マルチプロジェクトでは必須のスクリプトファイル&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ビルドスクリプト
&lt;ul&gt;
&lt;li&gt;ビルドの入力情報の中で一番大切な「ビルドの定義」を記述するGroovyスクリプト&lt;/li&gt;
&lt;li&gt;デフォルトのファイル名はbuild.gradleになります&lt;/li&gt;
&lt;li&gt;当該プロジェクトの依存関係やタスク定義などをするのが主な用途で、通常のビルドであればこのファイルだけで事足ります。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;プロパティファイル
&lt;ul&gt;
&lt;li&gt;Gradleが標準で参照するプロパティファイルで、ファイル名はgradle.propertiesとなる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;環境変数/コマンドライン引数&lt;/li&gt;
&lt;li&gt;buildSrcプロジェクト&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらのうち、以下の３つのスクリプトファイルは特に重要
記述した内容がビルド実行時にGradle固有のドメインオブジェクトに移譲される&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;スクリプトファイル&lt;/th&gt;
&lt;th&gt;Gradleドメインオブジェクト&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;初期化スクリプト&lt;/td&gt;
&lt;td&gt;Gradleオブジェクト&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;設定スクリプト&lt;/td&gt;
&lt;td&gt;Settingsオブジェクト&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ビルドスクリプト&lt;/td&gt;
&lt;td&gt;Projectオブジェクト&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;5.1.3 ビルドの流れ&lt;/h4&gt;
&lt;p&gt;コマンドラインからgreetタスクを実行するときの処理の流れについて見ていく&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;task greet doLast { println &apos;hello,&apos; + user }

&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;gradle -Puser=kotetsu greet

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Gradleビルドの流れ
&lt;ul&gt;
&lt;li&gt;コマンドの解析：&lt;/li&gt;
&lt;li&gt;スクリプトファイルの初期化：初期化フェーズ&lt;/li&gt;
&lt;li&gt;プロジェクトの設定：設定フェーズ&lt;/li&gt;
&lt;li&gt;タスクの実行：実行フェーズ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.2 アーキテクチャと主要な機能&lt;/h4&gt;
&lt;h4&gt;5.2.1 物理構造&lt;/h4&gt;
&lt;p&gt;Gradleは40近くのJARファイルで構成されるが、大きく分類するとGradle本体、プラグインの２つに分けられる&lt;/p&gt;
&lt;p&gt;スクリプトファイルの中で適用されない限りは、基本的にGradleにプラグインはロードされない
プラグインを取り除いてスリムにしたGradleを使用することもできる&lt;/p&gt;
&lt;p&gt;このプラグイン機構はGradleの特徴の１つと言える&lt;/p&gt;
&lt;h4&gt;5.2.2 実行基盤を支える仕組みと標準機能&lt;/h4&gt;
&lt;p&gt;ビルドで実行する処理の主体はプラグイン側にある
Gradle本体が提供するのは、ビルドの実行基盤を支えるための仕組みと標準的な機能になる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;実行基盤を支える仕組み
&lt;ul&gt;
&lt;li&gt;設定の自動ロード&lt;/li&gt;
&lt;li&gt;プロジェクトの探索&lt;/li&gt;
&lt;li&gt;タスクグラフ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Gradleの標準機能
&lt;ul&gt;
&lt;li&gt;ファイル操作：コンパイル後のファイルの出力先ディレクトリを作成したり、ビルド中の中間ファイルを削除したりとファイルシステムの操作をよく行う&lt;/li&gt;
&lt;li&gt;ロギング：ビルドの実行中の状態を知るには、処理状態や処理中に起きた問題について出力する機能が必要
&lt;ul&gt;
&lt;li&gt;Gradleではロギングフレームワークを内包した独自のロギング機能により、ログの出力を制御できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.3 設定の自動ロード&lt;/h4&gt;
&lt;h4&gt;5.3.1 初期化スクリプトによる設定&lt;/h4&gt;
&lt;p&gt;初期化スクリプトはビルドライフサイクルの初期化フェーズの先頭でロードされるため、ビルド実行時に環境設定を行うのに適している&lt;/p&gt;
&lt;p&gt;例えばMavenCentralリポジトリを参照する設定を初期化スクリプトに定義して、実行ユーザーのホームディレクトリの.gradleに配置しておくと、同ユーザーが実行するすべてのGradleのビルドでMaven Centralリポジトリを参照できるようになります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;初期化スクリプトの規約
&lt;ul&gt;
&lt;li&gt;コマンドライン引数 -I (--init-script)で指定する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;HOME&amp;gt;&lt;/code&gt;/.gradleディレクトリに配置：init.gradleが対象&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;HOME&amp;gt;&lt;/code&gt;/.gradle/init.dディレクトリに配置：.gradleが対象&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;GRADLE_HOME&amp;gt;&lt;/code&gt;/.gradle/init.dディレクトリに配置：gradleが対象&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.3.2 プロパティファイルによる設定&lt;/h4&gt;
&lt;p&gt;Gradleが自動的にロードするプロパティファイルは、環境に関する設定を記述する場合に適している
gradle.propertiesファイルに記述しておくと、初期化フェーズでロードされ、記述したプロパティが適用される&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;プロパティファイル
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;PROJECT_HOME&amp;gt;&lt;/code&gt;ディレクトリに配置する：gradle.propertiesが対象&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;HOME&amp;gt;&lt;/code&gt;/.gradleディレクトリに配置する：gradle.propertiesが対象&lt;/li&gt;
&lt;li&gt;コマンドライン引数-D(--system-prop)で指定する：規約なし&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.4 プロジェクトの探索&lt;/h4&gt;
&lt;h4&gt;5.4.1 プロジェクト構成と探索の関係&lt;/h4&gt;
&lt;p&gt;Gradleはビルドを実行する際にプロジェクトと言う概念で対象領域を特定する
通常、gradleコマンドを実行するカレントディレクトリがビルド対象のプロジェクト（カレントのプロジェクト）となる&lt;/p&gt;
&lt;p&gt;Gradleはシングルプロジェクトとマルチプロジェクトをサポートしていることもあり、ビルドを実行する前に、カレントのプロジェクトがシングルプロジェクトなのかマルチプロジェクトなのか探索する必要がある
このプロジェクトの判定は設定スクリプト（settings.gradle）を利用して行う
この設定スクリプトはプロジェクトを特定する上で重要な役割を担っている&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;設定スクリプトの決まり
&lt;ul&gt;
&lt;li&gt;設定スクリプトはルートプロジェクトの直下に配置しなければならない&lt;/li&gt;
&lt;li&gt;マルチプロジェクトの場合には、必ず設定スクリプトを容易しなければならない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.4.2 設定スクリプトに基づいた構成の特定&lt;/h4&gt;
&lt;p&gt;プロジェクトを探索するためには設定スクリプトの有無が最初のポイント&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;読み込み方法
&lt;ul&gt;
&lt;li&gt;コマンドライン引数の-c(--settings-file)オプションで、ファイルを指定する
&lt;ul&gt;
&lt;li&gt;引数で指定された場所にあれば読み込む&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Gradleの規約に従った場所に配置する
&lt;ul&gt;
&lt;li&gt;1.カレントディレクトリにsettings.gradleがあれば読み込む&lt;/li&gt;
&lt;li&gt;2.カレントディレクトリの親ディレクトリにsettings.gradleがあれば、それを設定スクリプトとみなす&lt;/li&gt;
&lt;li&gt;3.カレントディレクトリと同じ階層にmasterディレクトリがあり、その配下にsettings.gradleがあればそれを設定スクリプトとみなす
&lt;ul&gt;
&lt;li&gt;※ただし、コマンドライン引数に-u(--no-search-upward)オプションが含まれていた場合、2,3は行われない&lt;/li&gt;
&lt;li&gt;カレントディレクトリに設定ファイルが存在しなければシングルプロジェクトとして扱う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.5 タスクグラフ&lt;/h4&gt;
&lt;h4&gt;5.5.1 タスクグラフの概要&lt;/h4&gt;
&lt;p&gt;Gradleのタスクグラフは、グラフ理論の無閉路有効グラフの考えに基づいて設計されている&lt;/p&gt;
&lt;h4&gt;5.5.2 タスクグラフの制約&lt;/h4&gt;
&lt;p&gt;タスクグラフは基本的に指定されたタスクとそのタスクの依存関係によって構築されますが、依存関係以外にも次の制約によりタスクグラフが制御される場合がある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;同一のタスクが実行対象タスクとして指定された場合&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;タスクが順序付けられている場合&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ファイナライザータスクが設定されている場合&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;同一のタスクが実行対象タスクとして指定された場合&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gradleでは、１つのタスクは１回しか実行されないことが保証されている&lt;/li&gt;
&lt;li&gt;同じタスクを複数指定していたり、複数のタスクから依存されているタスクがあったりしても、タスクグラフには１つしか存在しないように制御される&lt;/li&gt;
&lt;li&gt;例えば、greetタスクを２回実行する用にしても１回しか実行されない&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gradle greet greet&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;タスクが順序付けられている場合&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;明示的に実行対象として指定された場合のみ有効になる&lt;/li&gt;
&lt;li&gt;タスクの順序付けについては次章で説明&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ファイナライザータスクが設定されている場合&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;順序付けのほかに、ファイナライザータスクという指定されたタスクの後に自動で必ず実行される特殊なタスクを定義できる&lt;/li&gt;
&lt;li&gt;ファイナライザータスクを設定しているタスクを実行した場合には、タスクグラフの構築の際にファイナライザータスクも自動的に追加されることになります。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.6 ファイル操作&lt;/h4&gt;
&lt;h4&gt;5.6.1 Gradle標準のファイル操作機能&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Gradleのファイルシステムの操作として次の機能を提供
&lt;ul&gt;
&lt;li&gt;ファイルの参照&lt;/li&gt;
&lt;li&gt;ファイルのコピー&lt;/li&gt;
&lt;li&gt;ファイルの削除&lt;/li&gt;
&lt;li&gt;ディレクトリの作成&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このうち、ファイルの参照とコピーに関しては提供されているAPIも多く、使い勝手がいい&lt;/p&gt;
&lt;h4&gt;5.6.2 単一ファイルの参照&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;file()&lt;/code&gt;を使用する
通常はルートプロジェクトのディレクトリを起点とした相対パスか、Fileオブジェクトを指定する&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;File javaFile = file(&apos;src/main/java/Main.java&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;ファイルパス以外からのファイル参照
&lt;ul&gt;
&lt;li&gt;file()はファイルパス以外にも、URL/URIオブジェクト、Callableインターフェースやクロージャなどを引数として、ファイルへの参照を取得できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;File index = null

URL url = new URL(&apos;file:/index.html&apos;)
index = file(url)

URI uri = new URI(&apos;file:/index.html&apos;)
index = file(uri)

import java.util.concurrent.Callable

index = file(new Callable&amp;lt;String&amp;gt;() {
  String call() {
    &apos;/index.html&apos;
  }
})

index = file { &apos;/index.html&apos; }

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;PathValidationによるファイルの検証&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;File existDir = file(&apos;src/main/existDir&apos;, PathValidation.DIRECTORY)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;PathValidationには、DIRECTORY,FILE,EXISTS,NONEが定義されている
指定しない場合はNONEが設定されている&lt;/p&gt;
&lt;h4&gt;5.6.3 ファイルコレクションによるファイルの参照&lt;/h4&gt;
&lt;p&gt;複数のファイルを扱う場合には、files()を使用する
ビルドスクリプトからfiles()を呼ぶことで、Fileの集合であるファイルコレクションを取得できる&lt;/p&gt;
&lt;p&gt;ファイルコレクションはConfigurableFileCollectionインターフェースを実装していますが、操作するためのAPIは親のFileCollectionインターフェースで定義されていることから、このFileCollection インターフェースを中心に説明&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;FileCollection&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gradleには、ビルドスクリプト上の記述を簡潔にするためのインターフェースがいくつか用意されている&lt;/li&gt;
&lt;li&gt;FileCollection はそのインターフェースの一つで、これによりファイルのコレクション操作を簡潔に行える&lt;/li&gt;
&lt;li&gt;使用頻度の高いと思われるものを中心に紹介&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ファイルコレクションの取得&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;files()の引数はfile()が許容する型のオブジェクトを複数渡すようなかたちになります。&lt;/li&gt;
&lt;li&gt;引数に渡すパラメータには、ファイルパスのおじ列、File、URL、URIなどを組み合わせることもできる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;FileCollection collection = files(&apos;file1.txt&apos;, &apos;file2.txt&apos;)

collection = files(&apos;file1.txt&apos;, new File(&apos;file2.txt&apos;), new URL(&apos;file:/index.html&apos;))

List fileList = [new File(&apos;file1.txt&apos;), new File(&apos;file2.txt&apos;)]

collections = files(fileList)
collections = files(fileList as File[])

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;ファイルコレクションの変換&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;FileCollection collections = files(&apos;file1.txt&apos;, &apos;file2.txt&apos;, &apos;file3.txt&apos;)

// as 演算子による変換
List list = collections as List
Set set1  = collections as Set
File[] array = collections as File[]

// getFiles() のGroovy簡略記法
Set set2 = collections.files

// ファイルコレクションに含まれるファイルが１つの場合は、getSingleFile()が使える

File file = collections.singleFile

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;遅延評価によるファイルコレクションの取得&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Callableの場合遅延評価されます→実際に参照されたときに実行されるということ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ファイルコレクションの演算&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ファイルコレクションの操作に加算と原産が利用できるらしい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ファイルコレクションのフィルタリング&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ファイルコレクションに条件を指定することで、条件に一致したファイルだけにフィルタリングをすることができる&lt;/li&gt;
&lt;li&gt;フィルタリングはfilter()にクロージャを渡します&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;FileCollection collections = files(&apos;file1.txt&apos;,&apos;file2.txt&apos;,new URL(&apos;file:/index.html&apos;))
FileCollection textFiles = collections.filter{ collectionFile -&amp;gt; 
  collectionFile.name.endsWith .txt
}

assert textFiles.files.size() == 2

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;その他の機能
&lt;ul&gt;
&lt;li&gt;getAsPath() : ファイルコレクションに含まれているファイルのパスを取得できる
&lt;ul&gt;
&lt;li&gt;このメソッドはファイルごとのパス環境に応じたパス区切り文字で連携つして出力するため、javaコマンドにクラスパス形式でJARファイルのパスを渡すような場合に便利&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.6.4 ファイルツリーによるファイルの参照&lt;/h4&gt;
&lt;p&gt;複数のファイルを木構造のファイルツリーとして扱う場合にはfileTree()を使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;FileTree sourceTree = fileTree(&apos;src&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;FileTreeとは&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;FileTreeインターフェースもファイルコレクションを簡潔に操作するためのインターフェースの１つ&lt;/li&gt;
&lt;li&gt;FileTreeインターフェースはFileCollectionインターフェースを継承しており、階層的にファイルを巡って処理するような機能が拡張されている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ファイルのマッチング&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;クロージャによるファイルツリーの取得&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;マップによるファイルツリーの取得&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;条件に一致するファイルツリーの取得&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ファイルツリーの探索&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;TODO: あとで纏める すぐ使える用にスニペットにする？&lt;/p&gt;
&lt;h4&gt;5.6.5 ファイルのコピー&lt;/h4&gt;
&lt;p&gt;ファイルをコピーするには、デフォルトで提供しているCopy型タスクから、独自のタスクを作成する方法と、ビルドスクリプト上でcopy()を使う方法の２通りある&lt;/p&gt;
&lt;p&gt;ここでは後者のcopy()を使用したファイルのコピーについて述べる
copy()はクロージャを引数としていますが、実際のコピーに関する記述はクロージャ内でCopySpecというインターフェースを使用して行います&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;copy {
  // CopySpec インターフェースのメソッドを使用する
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;CopySpecとは
&lt;ul&gt;
&lt;li&gt;ファイルのコピーに特化したGradleが提供するインターフェースの１つ&lt;/li&gt;
&lt;li&gt;Copyタスクを始めとする、ファイル操作を行うタスクの内部ではCopySpecインターフェースを使用しており、ファイルのコピーを伴うタスクではこのインターフェースを通じて処理が行われる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;TODO: 使用する際に詳細見直す テンプレートはクラス自動生成時に有用だと思った&lt;/p&gt;
&lt;h4&gt;5.6.6 ファイルの削除&lt;/h4&gt;
&lt;p&gt;ファイルの削除jは、デフォルトで提供しているDelete型のタスクを使って独自のタスクを作成する方法と、ビルドファイル上でdelete()を使う方法の２通りがある&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;delete &apos;target.txt&apos;

// 可変長なので複数指定できる
delete &apos;target1.txt&apos;,&apos;target2.txt&apos;,&apos;target3.txt&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;5.6.7 ディレクトリの作成&lt;/h4&gt;
&lt;p&gt;ディレクトリを作成するにはビルドスクリプト上でmkdir()を使用する&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir &apos;parent/child/grandchild&apos;
mkdir &apos;../outOfTheProject&apos;
mkdir &apos;/gradle-book/absolutePathDir&apos;

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Gradleでのファイルの作成方法
&lt;ul&gt;
&lt;li&gt;Gradleにはファイル作成のメソッドはありません。&lt;/li&gt;
&lt;li&gt;Groovyによって拡張されたFileクラスで作成する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;File newFile = file(&apos;newFile.txt&apos;)
newFile.write(&apos;ビルドスクリプトからファイルの生成を行います&apos;,&apos;UTF-8&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;5.7 ロギング&lt;/h4&gt;
&lt;h4&gt;5.7.1 Gradleでのロギング&lt;/h4&gt;
&lt;p&gt;GradleはSLF4Jを拡張したロガーを包含しています。
通常、Gradleを実行した際に出力されるログはこれによるもの&lt;/p&gt;
&lt;p&gt;TODO: Gradle用に、QUIETとLIFECYCLEというログレベルが追加されているらしい。時間があるときに抑える&lt;/p&gt;
&lt;h4&gt;5.7.2 loggerプロパティを使用したロギング&lt;/h4&gt;
&lt;p&gt;ビルドスクリプトでログ出力を定義する場合には、loggerプロパティを使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;logger.error = &apos;&apos;
logger.quiet = &apos;&apos;
logger.warn = &apos;&apos;
logger.lifecycle = &apos;&apos;
logger.info = &apos;&apos;
logger.debug = &apos;&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;標準出力とloggerプロパティの使い分け
&lt;ul&gt;
&lt;li&gt;標準出力は一時的に局所のログを出力したい場合にとどめ、&lt;/li&gt;
&lt;li&gt;恒久的にログを出力する場合はloggerプロパティを利用することをおすすめ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.7.3 外部ロギングフレームワークとのマッピング&lt;/h4&gt;
&lt;p&gt;TODO: 他のロギングAPIとの対比表を掲載。時間があればみる&lt;/p&gt;
&lt;h4&gt;5.7.4 ログレベルマッピングの変更&lt;/h4&gt;
&lt;p&gt;標準エラーは通常GradleではERRORレベルにマッピングされていますが、運用上の都合からERRORではなくINFOレベルに引き下げて出力させたいといった場合に対応する方法&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;logging.captureStandardError LogLevel.INFO
println &apos;標準出力&apos;
System.err.println &apos;標準エラー&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;MEMO: あまり使わないかも&lt;/p&gt;
&lt;h3&gt;第6章 スクリプトファイルの記述&lt;/h3&gt;
&lt;p&gt;Gradleのスクリプトファイルに記述された内容は実行時にGradleドメインオブジェクトに移譲される
記述したものが内部でどのクラスに異常されてどのように振る舞うのかを知っていると、
スクリプトファイルもより理解しやすくなります。
また、実際のプロジェクトでの多用な要求に対応するためには、タスクの詳細やマルチプロジェクトでのビルドスクリプト記述方法などについても知って置かなければなりません&lt;/p&gt;
&lt;h4&gt;6.1 スクリプトファイルの構造と共通要素&lt;/h4&gt;
&lt;h4&gt;6.1.1 スクリプトファイルの構造&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Gradleのスクリプトファイル&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ステートメント&lt;/li&gt;
&lt;li&gt;スクリプトブロック&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ステートメント&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ローカル変数やプロパティの設定、メソッドの実行など、&lt;/li&gt;
&lt;li&gt;一般的なプログラミングでのステートメントと同じ意味合いのもの&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;スクリプトブロック&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gradle独自の概念で、ある設定をおこなナウための領域を示すもの&lt;/li&gt;
&lt;li&gt;実際にはたんにクロージャを引数とするメソッドであり、そんなに難しいものではない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// ステートメント
xxx = &apos;&apos;

// スクリプトブロック
設定 {
  // 設定のための領域
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Groovyスクリプトがベースで有ることには変わりませんので、
通常のGroovyスクリプトと同様にクラスやクロージャを定義することもできる&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class Descriptor {
  String show() {
    &apos;*** これはGroovyスクリプトです。 ***&apos;
  }
}
println new Descriptor().show()
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;6.1.2 スクリプトファイルの共通要素&lt;/h4&gt;
&lt;p&gt;変数は欠かせない共通要素
Gradleにはプロパティが手軽に使える仕組みが用意されているので、さまざまな場面で重宝するでしょう&lt;/p&gt;
&lt;p&gt;4つの変数&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;名称&lt;/th&gt;
&lt;th&gt;概要&lt;/th&gt;
&lt;th&gt;使用可能なスクリプトファイル&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ローカル変数&lt;/td&gt;
&lt;td&gt;宣言されたスコープで有効な変数&lt;/td&gt;
&lt;td&gt;すべてのスクリプトファイル&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;システムプロパティ&lt;/td&gt;
&lt;td&gt;システムの情報を保持するためのプロパティ&lt;/td&gt;
&lt;td&gt;すべてのスクリプトファイル&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;拡張プロパティ&lt;/td&gt;
&lt;td&gt;ドメインオブジェクトを拡張するためのプロパティ&lt;/td&gt;
&lt;td&gt;すべてのスクリプトファイル&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;プロジェクトプロパティ&lt;/td&gt;
&lt;td&gt;プロジェクトで使用するためのプロパティ&lt;/td&gt;
&lt;td&gt;ビルドスクリプト&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;ローカル変数&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;def message = &apos;ローカル変数&apos;
String stringMessage = &apos;ローカル変数&apos;
// def でも 型指定でもいいよ
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;型宣言の無いものはGradleでは変数ではなく、移譲されるドメインオブジェクトのプロパティとみなす
変数として宣言するのではなく、オブジェクトにプロパティとして追加したい場合は、後述する拡張プロパティを使用する必要がある
→ここイマイチ腑に落ちない&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;システムプロパティ
&lt;ul&gt;
&lt;li&gt;システムプロパティをコマンドライン引数で指定する場合は-D(--system-prop)を使用する&lt;/li&gt;
&lt;li&gt;これだけならJavaと同じ&lt;/li&gt;
&lt;li&gt;Gradleには他の指定方法もある&lt;/li&gt;
&lt;li&gt;Gradleのプロパティファイル（gradle.properties）にsystemPropをプレフィックスとしてつけてプロパティを記述すると、システムプロパティとして識別される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# gradle.properties
systemProp.message=Hello
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;拡張プロパティ
&lt;ul&gt;
&lt;li&gt;Gradleには、スクリプトファイル上からドメインオブジェクトのプロパティを追加する仕組みとして、&lt;/li&gt;
&lt;li&gt;拡張プロパティというものがある&lt;/li&gt;
&lt;li&gt;拡張プロパティはextという名前で暗黙的に定義されており、使用にあたって特別な制約はない&lt;/li&gt;
&lt;li&gt;詳細は後述のGradleドメインオブジェクトExtraPropertiesExtensionで説明&lt;/li&gt;
&lt;li&gt;基本的に通常のキーバリュー方式でプロパティの追加と取得ができる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;ext {
  key1 = &apos;value1&apos;
  key2 = &apos;value2&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;プロジェクトプロパティ
&lt;ul&gt;
&lt;li&gt;もう1つGradle固有のプロパティとして、プロジェクトプロパティというものがあります。&lt;/li&gt;
&lt;li&gt;プロジェクトプロパティはビルドスクリプトで使用可能&lt;/li&gt;
&lt;li&gt;ビルド対象のプロジェクトのプロパティとして利用&lt;/li&gt;
&lt;li&gt;拡張プロパティの仕組みを使用しているので、内部的には拡張プロパティとの違いはありません&lt;/li&gt;
&lt;li&gt;拡張プロパティと違うところは設定方法で、
&lt;ul&gt;
&lt;li&gt;プロジェクトプロパティはプロパティファイル、環境変数、コマンドライン引数のどれでも設定できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;プロパティファイルの場合は、&lt;code&gt;&amp;lt;プロパティ名&amp;gt;=&amp;lt;値&amp;gt;&lt;/code&gt;と定義するだけで追加される&lt;/li&gt;
&lt;li&gt;環境変数の場合は、&lt;code&gt;ORG_GRADLE_PROJECT_&amp;lt;プロパティ名&amp;gt;=&amp;lt;値&amp;gt;&lt;/code&gt;という形式で設定できる&lt;/li&gt;
&lt;li&gt;コマンドライン引数の場合は、&lt;code&gt;-P&amp;lt;プロパティ名&amp;gt;=&amp;lt;値&amp;gt;&lt;/code&gt;または、&lt;code&gt;--project-prop &amp;lt;プロパティ名&amp;gt;=&amp;lt;値&amp;gt;&lt;/code&gt;で設定&lt;/li&gt;
&lt;li&gt;システムプロパティの場合は、&lt;code&gt;org.gradle.project.&lt;/code&gt;をプレフィクスでつけることで設定できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;TODO: プロジェクトプロパティのロード順を記載してくれている&lt;/p&gt;
&lt;h4&gt;6.1.3 スクリプトブロックとドメインオブジェクト&lt;/h4&gt;
&lt;p&gt;スクリプトブロックはクロージャを引数とするメソッド&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;println &apos;デフォルトの依存関係：&apos;
repositories.each { println it.name }

repositories {
  mavenCentral()
}

println &apos;リポジトリ追加後：&apos;
repositories.each { println it.name }

// このリポジトリブロックをGroovyのプログラム風に記述すると
def closure = { mavenCentral() }
this.reporitories(closure)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;スクリプトファイルはGradleのドメインオブジェクトに移譲されています
thisはまさにその移譲されたドメインオブジェクトを表しており、この例で言えば、thisはドメインオブジェクトであるProjectオブジェクトになる&lt;/p&gt;
&lt;h4&gt;6.1.4 主要なスクリプトブロック&lt;/h4&gt;
&lt;p&gt;スクリプトファイルに記述するスクリプトブロックがドメインオブジェクトと関係していることがわかったと思いますので、
主要なスクリプトブロックと移譲されるドメインオブジェクトを列挙しておきます&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;スクリプトブロック&lt;/th&gt;
&lt;th&gt;概要&lt;/th&gt;
&lt;th&gt;ドメインオブジェクト&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;initscript&lt;/td&gt;
&lt;td&gt;初期化スクリプトのクラスパスの設定を記述する&lt;/td&gt;
&lt;td&gt;ScriptHandler&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;buildscript&lt;/td&gt;
&lt;td&gt;ビルドスクリプトのクラスパスの設定を記述する&lt;/td&gt;
&lt;td&gt;ScriptHandler&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;allprojects&lt;/td&gt;
&lt;td&gt;当該プロジェクトとそのすべてのサブプロジェクトに関する設定を記述する&lt;/td&gt;
&lt;td&gt;Project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;subprojects&lt;/td&gt;
&lt;td&gt;当該プロジェクトのサブプロジェクトに対する設定を記述する&lt;/td&gt;
&lt;td&gt;Project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;configurations&lt;/td&gt;
&lt;td&gt;コンフィグレーションの設定を記述する&lt;/td&gt;
&lt;td&gt;ConfigurationContainer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dependencies&lt;/td&gt;
&lt;td&gt;依存関係の解決のための設定を記述する&lt;/td&gt;
&lt;td&gt;DependencyHandler&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;repositories&lt;/td&gt;
&lt;td&gt;リポジトリの設定を記述する&lt;/td&gt;
&lt;td&gt;RepositoryHandler&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;artifacts&lt;/td&gt;
&lt;td&gt;ビルド成果物（アーティファクト）を公開するための設定を記述&lt;/td&gt;
&lt;td&gt;ArtifactHandler&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;6.2 Gradleドメインオブジェクト&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;重要なドメインオブジェクトについて
&lt;ul&gt;
&lt;li&gt;Project&lt;/li&gt;
&lt;li&gt;Task&lt;/li&gt;
&lt;li&gt;Gradle&lt;/li&gt;
&lt;li&gt;Settings&lt;/li&gt;
&lt;li&gt;ExtensionAware&lt;/li&gt;
&lt;li&gt;ExtraPropertiesExtension&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;6.2.1 Projectオブジェクト&lt;/h4&gt;
&lt;p&gt;ProjectオブジェクトはGradleでの処理対象となる１つの領域を表すドメインオブジェクト
ビルドスクリプトからProjectオブジェクトに移譲される&lt;/p&gt;
&lt;p&gt;Projectオブジェクトはビルドスクリプト上のすべてのドメインを統括する、Gradleのなかで最も重要なドメインオブジェクト&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Projectオブジェクトの構造&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gradleでなにかを自動化するときには、プロジェクトが必ず１つは存在する&lt;/li&gt;
&lt;li&gt;マルチプロジェクトを扱うためにはコンポジットな構造である必要があるため、自分自身の親プロジェクト、起点となるルートプロジェクト、自分の下にぶら下がっているプロジェクトのリストを保持する用になっている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;プロパティ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Projectオブジェクトはビルドに必要なすべての情報にアクセスできなければなりません。&lt;/li&gt;
&lt;li&gt;そのためプロパティも多数存在する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;プロパティ&lt;/th&gt;
&lt;th&gt;概要&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;name&lt;/td&gt;
&lt;td&gt;プロジェクト名。論理名のため物理的なディレクトリと異なる場合もある&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;description&lt;/td&gt;
&lt;td&gt;プロジェクトの説明&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;group&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;path&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;projectrDir&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;status&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;state&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;version&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;プロジェクト参照属性
&lt;ul&gt;
&lt;li&gt;自分に該当するプロジェクトや、自身が属しているルートプロジェクトなど、プロジェクトを参照するためのプロパティ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;プロパティ&lt;/th&gt;
&lt;th&gt;概要&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;project&lt;/td&gt;
&lt;td&gt;当該プロジェクトの参照を保持する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rootProject&lt;/td&gt;
&lt;td&gt;ルートプロジェクト参照を保持する。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;parent&lt;/td&gt;
&lt;td&gt;上位プロジェクトの参照&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;childProjects&lt;/td&gt;
&lt;td&gt;子プロジェクトの参照をMapコレクションで保持&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;allprojects&lt;/td&gt;
&lt;td&gt;当該プロジェクトに含まれるすべてのプロジェクトの参照をSetコレクションで保持&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;subprojects&lt;/td&gt;
&lt;td&gt;当該プロジェクト配下のすべての参照をSetコレクションで保持&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;rootProjectはシングルプロジェクトの場合は自分自身、マルチプロジェクトの場合は、settings.gradleが置かれたディレクトリのプロジェクトとなる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;コンテナタイプ属性&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コンテナタイプのプロパティには、repositoriesやtasksなどビルドスクリプトで定義されたドメインを管理するためのものがある&lt;/li&gt;
&lt;li&gt;これらの多くはスクリプトブロックが用意されており、スクリプトブロックによって設定を記述する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;defaultTasksプロパティ&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;defaultTasks &apos;showProjectName&apos;
project.description = &apos;デフォルトタスクの説明のためのプロジェクトです。&apos;
task showProjectName doLast {
  println project.name
}

task showDescription doLast {
  println project.description
}

// 実行タスクが指定された場合は、デフォルトタスクは実行されない
// 複数のタスクを指定する場合は、
defaultTasks = [&apos;showProjectName&apos;,&apos;showProjectDescription&apos;]
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;主要なAPI&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ビルドスクリプトを記述する際には、ProjectオブジェクトのAPIは欠かせません&lt;/li&gt;
&lt;li&gt;プロパティと同様にAPIも用意されているので使用頻度の高いAPIに絞って紹介&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;プロジェクト参照API&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;def childInstance = project(&apos;:child&apos;)
childInstance.description = &apos;子プロジェクトの説明を設定&apos;

// パスとクロージャを引数とするオーバーロードメソッドを使用した場合
project(&apos;:child&apos;) {
  description = &apos;子プロジェクトの説明を設定&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;タスク定義API
&lt;ul&gt;
&lt;li&gt;タスクを定義する際のAPIはtask()です&lt;/li&gt;
&lt;li&gt;task()はオーバーロードメソッドになっていますが、よく利用されるのはタスク名を引数とするもので、これは本書ですでに何度も登場しています&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;task hello doLast {
  println &apos;hello gradle world!&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;コールバックAPI&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gradleがビルド処理を実行している最中にビルドフェーズ内からコールバックされるAPIとして、&lt;code&gt;beforeEvaluate()&lt;/code&gt;と&lt;code&gt;afterEvaluate()&lt;/code&gt;の２つがある&lt;/li&gt;
&lt;li&gt;beforeEvaluate()はプロジェクトの評価前ににコールバックされるため、ビルドスクリプトに記述した処理は参できない
&lt;ul&gt;
&lt;li&gt;→よって、プロジェクトの評価前に独自の処理を割り込ませるには、初期化スクリプトもしくは設定スクリプトに記述しておく必要がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TODO: イマイチ使いみちがわからなかった&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;その他のAPI&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;javaexec(): Javaのメインクラスを実行する&lt;/li&gt;
&lt;li&gt;exec(): 外部のOSコマンドを実行する&lt;/li&gt;
&lt;li&gt;tarTree(): 指定されたTARファイルを基にしてFileTreeを生成する&lt;/li&gt;
&lt;li&gt;zipTree(): 指定されたZIPファイルを基にしてFileTreeを生成する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;この他にも５章で紹介したファイル操作やロギングAPIもあるし他にもある&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;6.2.2 Taskオブジェクト&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;TaskオブジェクトはGradleでの対象作業を表すドメインオブジェクトで、ビルドスクリプトで記述されたタスクの定義がProjectオブジェクトを通じてTaskオブジェクトに移譲される&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;つまり、ビルドスクリプトでのタスクに関する記述は、Taskオブジェクトのプロパティへの設定やAPIの呼び出しになるということになります。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;プロパティ&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;プロパティ&lt;/th&gt;
&lt;th&gt;概要&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;name&lt;/td&gt;
&lt;td&gt;タスク名。定義名がそのまま設定される&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;description&lt;/td&gt;
&lt;td&gt;タスクの説明。tasksタスクで説明が表示される&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;group&lt;/td&gt;
&lt;td&gt;タスクが属するグループ。tasksタスクの出力時のタスクのグルーピングに使用される&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;path&lt;/td&gt;
&lt;td&gt;タスクのパス。プロジェクトも含めた場合は「：」がセパレータとなる&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;nameとpathはタスク定義の際に自動的に決まるが、descriptionとgroupは名自適に設定する必要がある&lt;/p&gt;
&lt;p&gt;その他のプロパティ&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;プロパティ&lt;/th&gt;
&lt;th&gt;概要&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;enabled&lt;/td&gt;
&lt;td&gt;タスクの実行可否情報を保持する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;state&lt;/td&gt;
&lt;td&gt;タスクの実行ステータスを保持する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;inputs&lt;/td&gt;
&lt;td&gt;このタスクの入力情報を保持する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;outputs&lt;/td&gt;
&lt;td&gt;このタスクの出力情報を保持する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dependsOn&lt;/td&gt;
&lt;td&gt;このタスクが依存するタスクを保持する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mustRunAfter&lt;/td&gt;
&lt;td&gt;必ず先に実行されなければならないタスクを保持する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;shouldRunAfter&lt;/td&gt;
&lt;td&gt;先に実行されなければならないタスクを保持する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;finalizedBy&lt;/td&gt;
&lt;td&gt;このタスクの後に実行されるファイナライザータスクを保持する&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;これらのプロパティを使用することで、タスクの実行順を制御したり、状態によって実行をスキップさせたりできる&lt;/p&gt;
&lt;p&gt;他に、直接プロパティを操作することはないが、acrionsという重要なプロパティがあるので触れておく
acrionsプロパティは、Gradle内部での最小処理単位であるActionオブジェクトのリストになっており、タスクの定義で記述された作業をActionオブジェクトとして保持している
このactionsプロパティ内のActionオブジェクトを順次実行することでタスクの処理は行われている&lt;/p&gt;
&lt;h4&gt;主要なAPI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;TaskオブジェクトのAPIは
&lt;ul&gt;
&lt;li&gt;タスクの処理のためのもの&lt;/li&gt;
&lt;li&gt;タスクの実行に関するもの&lt;/li&gt;
&lt;li&gt;プロパティのアクセサー
&lt;ul&gt;
&lt;li&gt;の３種類で占めている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;API&lt;/th&gt;
&lt;th&gt;概要&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;doFirst()&lt;/td&gt;
&lt;td&gt;タスク処理をActionオブジェクトとしてactionsの先頭に追加&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;doLast()&lt;/td&gt;
&lt;td&gt;タスク処理をActionオブジェクトとしてactionsの最後に追加&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;leftShift()&lt;/td&gt;
&lt;td&gt;タスク処理をActionオブジェクトとしてactionsの最後に追加&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;deleteAllActions()&lt;/td&gt;
&lt;td&gt;actions内のActionオブジェクトを削除&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;task myActionTask {
  doFirst {
    println &apos;First&apos;
  }
}
// これらはGradleのDSL記法で
// Groovyで書くと以下になる

&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;List&amp;lt;Action&amp;gt; actions = new ArrayList&amp;lt;Action&amp;gt;()

Closure doFirstAction = { println &apos;First&apos; }
actions.add(0,doFirstAction)

Closure doLastAction = { println &apos;Last&apos; }
actions.add(doLastAction)

actions.each{ action -&amp;gt;
  actions.execute()
}

&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;6.2.3 Gradleオブジェクト&lt;/h4&gt;
&lt;p&gt;実行環境であるGradleを表すドメインオブジェクトで、初期化スクリプトから移譲される
他にも後述するProjectオブジェクトやSettingsオブジェクトがプロパティとして保持しており、すべてのスクリプトファイルからアクセスできる&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;println gradle.gradleVersion

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;プロパティ&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;プロパティ&lt;/th&gt;
&lt;th&gt;概要&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;gradleHomeDir&lt;/td&gt;
&lt;td&gt;Gradleホームディレクトリを保持する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gradleUserHomeDir&lt;/td&gt;
&lt;td&gt;ホームディレクトリを保持する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gradleVersion&lt;/td&gt;
&lt;td&gt;実行するGradleのバージョンを保持する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rootProject&lt;/td&gt;
&lt;td&gt;ルートプロジェクトを保持する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;startParameter&lt;/td&gt;
&lt;td&gt;ビルド実行時のパラメータを保持する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;taskGraph&lt;/td&gt;
&lt;td&gt;当該ビルドのタスクグラフを保持する&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;主要なAPI
&lt;ul&gt;
&lt;li&gt;イベントリスナーについて紹介&lt;/li&gt;
&lt;li&gt;TODO: 処理順などまとめる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;6.2.4 Settingsオブジェクト&lt;/h4&gt;
&lt;p&gt;Settingsオブジェクトは設定スクリプトを表すドメインオブジェクトで、設定スクリプトから移譲される
設定スクリプトはマルチプロジェクトのためだけのものではない&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;プロパティ
&lt;ul&gt;
&lt;li&gt;Settingsオブジェクトは設定フェーズで生成されて使用されますが、&lt;/li&gt;
&lt;li&gt;その段階で扱える情報は自分自身の情報を除くと、Gradleオブジェクトとルートプロジェクトの情報ぐらい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;TODO: マルチプロジェクト作成時に再度確認しておく&lt;/p&gt;
&lt;h4&gt;6.2.5 ExtensionAwareオブジェクト&lt;/h4&gt;
&lt;p&gt;ビルド実行時にGradleドメインオブジェクトを他のオブジェクトで拡張可能にするためのドメインオブジェクト&lt;/p&gt;
&lt;p&gt;ExtensionAwareオブジェクトには、extensionsという拡張プロパティを格納するためのコンテナがあり、
Projectオブジェクト、TaskオブジェクトなどのGradleドメインオブジェクトの多くは、これに独自のプロパティ追加できる&lt;/p&gt;
&lt;p&gt;TODO: メリットがいまいちつかめなかった&lt;/p&gt;
&lt;h4&gt;6.2.6 ExtraPropertiesExtensionオブジェクト&lt;/h4&gt;
&lt;p&gt;ProjectオブジェクトやTaskオブジェクトなどで、extの名前で定義されている拡張プロパティの実態クラス
ExtraPropertiesExtensionオブジェクトをはpropertiesというプロパティを持ち、そこにキーとバリューで任意のオブジェクトを保持
そして、has(),set(),get()の３つのAPIを提供し、propertiesに指定のキーが存在するかの確認、キーと値の設定や取得ができる&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;project.ext.property = &apos;extに追加下プロパティです。&apos;
println &apos;拡張プロパティの値 :&apos; + project.property

project.ext[&apos;property&apos;] = &apos;extに追加したプロパティです。&apos;
println &apos;拡張プロパティの値:&apos; + project.ext[&apos;property&apos;]

project.ext {
  prop1 = &apos;aaa&apos;
  prop2 = &apos;bbb&apos;
}
println project.ext.prop1 + project.ext.prop2
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;6.3 タスクの記述&lt;/h4&gt;
&lt;h4&gt;6.3.1 タスクの定義方法&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;ビルドフェーズ
&lt;ul&gt;
&lt;li&gt;初期化フェーズ&lt;/li&gt;
&lt;li&gt;設定フェーズ&lt;/li&gt;
&lt;li&gt;実行フェーズ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;task hello doLast {
  println name + &apos;: Hello Gradle World!&apos;
}

// 設定のためのブロックとなるため設定フェーズで実行される
task hello2 {
  println name + &apos;: Hello Gradle World!&apos;
}

// descriptionプロパティを出力する例

showDescription doLast {
  println description
}
task showDescription.description = &apos;showDescriptionタスクです。&apos;
// 順序に違和感があるかもしれないがこの順番で記述しないと行けない
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Task型を使用した定義
&lt;ul&gt;
&lt;li&gt;Gradleにはあらかじめ特定のアクションを行うための汎用のタスクが数多く用意されている&lt;/li&gt;
&lt;li&gt;それらは独自のタスクを定義する際に利用できる&lt;/li&gt;
&lt;li&gt;汎用タスクはGradle本体が提供する標準のものと、&lt;/li&gt;
&lt;li&gt;プラグインを適用することで追加されるおのがある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;タスク型&lt;/th&gt;
&lt;th&gt;概要&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Copy&lt;/td&gt;
&lt;td&gt;ターゲットとするディレクトリにファイルをコピーする&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;td&gt;指定されたファイルまたはディレクトリを削除する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exec&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JavaExec&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sync&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tar&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zip&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;// これはmyCopyというタスクをCopy型で定義するという記述
task myCopy(type: Copy) {
  from &apos;original&apos;
  to &apos;target&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;task myCopyExtension(type: Copy){
  from &apos;original&apos;
  to &apos;target&apos;

  File newFile = file(&apos;original/newFile.txt&apos;)
  doFirst {
    println &apos;コピー元のファイルに書き込みします&apos;
    newFile.write(&apos;コピー用のファイルです。&apos;,&apos;UTF-8&apos;)
  }
  doLast {
    File copied = file(&apos;original/newFile_copied.txt&apos;)
    if (newFile.renameTo(copied)) {
      println &apos;コピーが完了しました。&apos;
    } else {
      println &apos;コピーできませんでした。&apos;
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;動的なタスクの定義
&lt;ul&gt;
&lt;li&gt;複数のサーバーインスタンスをしよいうしている場合に、サーバーごとにIPアドレスを出力するタスクを作成したい場合&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;def instances = [&apos;AppServer&apos;:&apos;192.0.2.10&apos;,&apos;DBServer&apos;:&apos;192.0.2.20&apos;,&apos;MailServer&apos;:&apos;192.0.2.30&apos;]

instances.each { serverType, ipAddress -&amp;gt;
  task &quot;show${serverType}&quot; doLast {
    println ipAddress
  }
}

// 便利な記載方法だが、Groovyの書き方なれてないと理解出来なさそう

&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;6.3.2 依存関係の定義方法&lt;/h4&gt;
&lt;p&gt;dependsOnというプロパティを使って定義ができる&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
doing.dependsOn todo
done.dependsOn doing

done.dependsOn doing, reviewing

done.dependsOn {
  tasks.findAll { task -&amp;gt; task.name ==~ /.*ing/}
}

&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;6.3.3 タスクルールの定義方法&lt;/h4&gt;
&lt;p&gt;異なる設定やパラメータに対して同じような処理を指せる場合には、似た名前のタスクを必要な数だけ作成する必要がある
そのような場合はタスクにルールをもたせることで簡潔に記述できる&lt;/p&gt;
&lt;p&gt;javaのCleanの例&lt;/p&gt;
&lt;p&gt;&lt;code&gt;gradle cleanTest&lt;/code&gt;
&lt;code&gt;gradle cleanJar&lt;/code&gt;
などと指定すると、それぞれのディレクトリのみ削除できる&lt;/p&gt;
&lt;p&gt;これは、clean&amp;lt;タスク名&amp;gt;というルールを定義することで実現している&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tasks.addRule(&apos;Pattern: show&amp;lt;TASKS_NAME&amp;gt;: Show task name.&apos;) { taskName -&amp;gt;
  if (taskName.startsWith(&apos;show&apos;)) {
    task(taskName) doLast {
      println &apos;*** &apos; + taskName + &apos; ***&apos;
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;定型的な処理はこのようなルールを作成して定義しておくとよい！！
MEMO: これは便利だと思う&lt;/p&gt;
&lt;h4&gt;6.3.4 タスクの制御&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;タスクの制御方法
&lt;ul&gt;
&lt;li&gt;処理内容の制御：組み込みタスクの処理内容は、タスクを再定義して処理を上書くことで既存の処理内容を変更できる&lt;/li&gt;
&lt;li&gt;実行可否の制御：タスクの事項条件を判定し、タスクの実行可否を制御できる&lt;/li&gt;
&lt;li&gt;実行順の制御：依存関係以外にも順序付けやファイナライザータスクの指定などで、タスクの実行順を制御できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;6.3.5 タスクの上書き&lt;/h4&gt;
&lt;p&gt;タスクを上書きする場合、同じタスク名でoverwriteプロパティを有効にして処理を定義するだけ&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apply plugin: &apos;java&apos;

task assemble(overwrite: true) doLast {
  println &apos;上書きしました。&apos;
}

&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;6.3.6 タスクの条件実行&lt;/h4&gt;
&lt;p&gt;条件によって実行するかしないか制御したい場合&lt;/p&gt;
&lt;p&gt;onlyIf()を使用する&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;task specialTask doLast {
  println &apos;特別な処理を実行&apos;
}

specialTask.onlyIf {
  buildType == &apos;partial-build&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;gradle -PbuildType=partial-build specialTask&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;6.3.7 タスクの順序付け&lt;/h4&gt;
&lt;p&gt;mustRunAfterとshouldRunAfterの使い方
MEMO: あまり意識することなさそうなので割愛&lt;/p&gt;
&lt;h4&gt;6.3.8 ファイナライザータスク&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// 例外が起きても実行される
normalTask.finalizedBy finalizerTask

&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;6.4 プラグインの記述&lt;/h4&gt;
&lt;h4&gt;6.4.1 Gradleにおけるプラグイン&lt;/h4&gt;
&lt;p&gt;apply()を呼ぶことでプラグインが提供するタスクやプロパティが当該のビルド処理で利用できるようになる&lt;/p&gt;
&lt;h4&gt;6.4.2 プラグインの適用方法&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;apply plugin: &apos;java&apos;

project.apply(plugin:&apos;java&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;このように記述すると「このビルドスクリプトのProjectオブジェクトにJavaプラグインを適用させている」ということがわかる
&apos;java&apos;はプラグインIDと呼ばれるもの
万が一プラグインIDがなければ、Pluginインターフェースを実装下クラスを指定することで、そのプラグインを適用できる&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apply plugin: org.gradle.api.plugins.JavaPlugin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;プラグインにはGradle標準以外にも、GithubやMaven Centralリポジトリなどで公開されているものがあります
Gradleからみて外部にあるプラグインを利用するには、そのプラグインをダウンロードして読み込む必要があり、プラグインの適用方法も異なります&lt;/p&gt;
&lt;p&gt;外部のプラグインを適用する場合は、buildscriptスクリプトブロックにプラグインのある場所とプラグインへの依存関係を設定し、通常のapply()でプラグインを適用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;buildscript {
  repositories {
    mavenCentral()
  }
  dependencies {
    classpath &apos;org.hidetake: gradle-ssh-plugin:0.1.10&apos;
  }
}

apply plugin: &apos;ssh&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Gradle2.1 のプラグイン適用方法
&lt;ul&gt;
&lt;li&gt;今後はこれが主流になるので覚えておきましょう&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// Javaプラグイン
plugins {
  id &apos;java&apos;
}

plugins {
  id &apos;org.gradle.java&apos;
}

plugins {
  id &apos;com.example.exampleplugin&apos; version: &apos;1.0&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;6.5 マルチプロジェクトでのスクリプトファイルの記述&lt;/h4&gt;
&lt;h4&gt;6.5.1 レイアウトと記述方法のバリエーション&lt;/h4&gt;
&lt;p&gt;TODO: 直近使わないので一旦飛ばす&lt;/p&gt;
&lt;h3&gt;第7章 依存関係の管理&lt;/h3&gt;
&lt;h4&gt;7.1 依存関係管理の目的&lt;/h4&gt;
&lt;p&gt;Gradleを始めとする多くのビルドツールや統合開発環境において、依存関係とは、「そのビルドの外で作成された成果物への参照」のことを指す&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;依存関係解決の自動化
&lt;ul&gt;
&lt;li&gt;設定を書いておくと、任意の場所から必要なファイルをダウンロードまたはコピーしてきてプロジェクトに取り込んでくれる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;推移的な依存関係の管理
&lt;ul&gt;
&lt;li&gt;必要な外部ファイルが、さらに別の外部ファイルを必要としていないか把握したり、管理したりできる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;依存関係の可視化
&lt;ul&gt;
&lt;li&gt;プロジェクトがどの外部ファイルのどのバージョンに依存しているか、かんたんに表示できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これら３つの目的を達成するのが本章のテーマ&lt;/p&gt;
&lt;h4&gt;7.2 依存関係解決の自動化&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;これら順を追って、ビルドスクリプトの依存関係の設定で使っている
&lt;ul&gt;
&lt;li&gt;configrations&lt;/li&gt;
&lt;li&gt;dependencies
&lt;ul&gt;
&lt;li&gt;といった設定項目について紹介&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.2.1 コンフィグレーション&lt;/h4&gt;
&lt;p&gt;多くのビルドツールでは依存関係をグループに分けて設定しており、Gradleもグループの概念がある&lt;/p&gt;
&lt;p&gt;Mavenにはスコープという概念があり、すべての依存関係はcmpileスコープ、runtimeスコープといったグループに属すように定義することになっている
GradleにはMavenのようにあらかじめ定義されているグループはないので、まずどのようなグループが必要化をビルドスクリプトで定義しなければいけない&lt;/p&gt;
&lt;p&gt;この依存関係を分類するグループをGradleではコンフィグレーションと呼びます
これを使って、依存関係を分類します。
これはMavenのスコープとほぼ同義です&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;configurations {
  conf1
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;7.2.2 依存関係の定義&lt;/h4&gt;
&lt;p&gt;コンフィグレーションを定義しｔら、次はそのコンフィグレーションに割り当てる依存関係を定義&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
dependencies {
  conf1 files(&quot;libs/sample-lib.jar&quot;)
}

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;依存関係の指定方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;外部モジュール依存関係
&lt;ul&gt;
&lt;li&gt;インターネット上のMavenリポジトリなどからファイルをダウンロードする。リポジトリの定義が別途必要&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ファイル依存関係
&lt;ul&gt;
&lt;li&gt;ファイルシステム上のファイルを参照&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;プロジェクト依存関係
&lt;ul&gt;
&lt;li&gt;あるプロジェクトから別のプロジェクトの成果物を参照&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;GradleAPI依存関係
&lt;ul&gt;
&lt;li&gt;現在使用しているGradleのAPIが含まれるライブラリファイルへの依存関係&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ローカルGroovy依存関係
&lt;ul&gt;
&lt;li&gt;現在使用しているGradleが同梱しているGroovyへの依存関係&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;外部モジュール依存関係&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;おおよそ理解できているので割愛&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ファイル依存関係&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;おおよそ理解できているので割愛&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;プロジェクト依存関係&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dependencies {
  compile project(&apos;:shared&apos;)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ルートプロジェクトの直下にあるsharedプロジェクトへの依存関係を宣言している
プロジェクト階層は:区切り&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GradleAPI依存関係
&lt;ul&gt;
&lt;li&gt;ビルドに使用しているGradleのAPIを参照するための依存関係&lt;/li&gt;
&lt;li&gt;Gradleのプラグインやタスクを作成するときなど、Gradle自体を拡張するときに使う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dependencies {
  conf1 gradleApi()
}

task showDeps doLast {
  configuration.conf1.each {
    println it.absolutePath
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;ローカルGroovy依存関係
&lt;ul&gt;
&lt;li&gt;ビルド似使用しているGradle似同梱されているGroovyを参照するための依存関係で、次の用にlocalGroovyを呼び出して指定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dependencies {
  conf1 localGroovy()
}

task showDeps doLast {
  configurations.conf1.each {
    println it.absolutePath
  }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;7.2.3 コンフィグレーションの継承&lt;/h4&gt;
&lt;p&gt;依存関係のコンフィグレーションは、ほかのコンフィグレーションを継承できる&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
configurations {
  conf1
  testConf1.extendsFrom conf1 // testConf1はconf1の依存関係も含む
}

dependencies {
  conf1 group: &apos;org.codehaus.groovy&apos;, name: &apos;groovy-all&apos;, version: &apos;2.3.1&apos;
  testConf1 group: &apos;junit&apos;, name: &apos;junit&apos;, version: &apos;4.11&apos;
}

task showDeps doLast {
  configurations.testConf1.each {
    println it.absolutePath
  }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;★用途
&lt;ul&gt;
&lt;li&gt;テスト用のコンフィグレーションにプロダクト用のコンフィグレーションも含めたい
&lt;ul&gt;
&lt;li&gt;といった用途によく利用される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.2.4 リポジトリ定義&lt;/h4&gt;
&lt;p&gt;外部モジュールの依存関係は、依存関係を取得する外部リポジトリを設定しなくてはいけない&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mavenリポジトリ&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;repositories {
  maven {
    url &apos;http://&apos;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Maven Central リポ維持鳥
&lt;ul&gt;
&lt;li&gt;よく利用される一部のリポジトリについては、URLを指定しなくてもリポジトリを指定できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;repositories {
  mavenCentral()
}
// ローカルリポジトリも以下の様に記載できる
repositories {
  mavenLocal()
}

// jcenter mavenリポジトリも
repositories {
  jcenter()
}

// Ivyリポジトリも
// 使う予定はあまりないので一旦割愛

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;パスワードで保護されたリポジトリ&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;repositories {
  maven {
    url &apos;http://xxxx&apos;
  }
  credentials {
    username &apos;user&apos;
    password &apos;pass&apos;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;セキュリティ上、認証情報はビルドスクリプトに直書きするのではなく、どこかバージョン管理システム似コミットされない外部ファイルに記述してそれを参照するのがいい&lt;/p&gt;
&lt;p&gt;gradle.propertiesに記述例を紹介&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;フラとディレクトリリポジトリ
&lt;ul&gt;
&lt;li&gt;ローカルファイルシステム上の単純なディレクトリをリポジトリとして指定できる&lt;/li&gt;
&lt;li&gt;ファイルシステムで共有している場合だったり、ライブラリをバージョン管理システムにあげている場合だったり&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.2.5 動的バージョンと変更性モジュール&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;
configurations {
  conf1
}

dependencies {
  conf1 &apos;org.slf4j:slf4j-api:1.7.+&apos; // 1.7系のうち最新版を取得
  conf1 &apos;commons-cli:commons-cli:latest.integration&apos; // 不安定版も含めて最新版を取得
  conf1 &apos;junit:junit:latest.release&apos; // 不安定版の最新版を取得
}

&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;7.3 推移的な依存関係の管理&lt;/h4&gt;
&lt;p&gt;依存関係に指定したJARファイルなどが更に別のファイルを必要としている場合について
名自適に指定した依存関係から依存関係が再帰的に派生することを「推移的な依存関係」とよびます&lt;/p&gt;
&lt;h4&gt;7.3.1 競合の解決&lt;/h4&gt;
&lt;p&gt;推移的な依存関係を管理する場合、避けて通れない問題が、依存関係のバージョン競合&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;同じ依存のあるモジュールのバージョン違いをどのように解消するか&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;２つ解決策がある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Newest戦略（デフォルト）
&lt;ul&gt;
&lt;li&gt;取得した依存関係のバージョンが競合した場合、最も新しいバージョンの依存関係を使用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Fail戦略
&lt;ul&gt;
&lt;li&gt;競合した場合は例外を発行してビルドを失敗させる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// Fail戦略を使う場合
configurations.testConf1 {
  resolutionStrategy {
    failOnVersionConflict() // Fail戦略を採用する
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;7.3.2 推移的な依存関係の除外設定&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// Fail戦略を使う場合
configurations.testConf1 {
  resolutionStrategy {
    failOnVersionConflict() // Fail戦略を採用する
  }
}

dependencies {
  conf1 group: &apos;&apos;
  testConf1(group: &apos;&apos;,name: &apos;&apos;,version:&apos;&apos;){
    exclude module: &apos;groovy-all&apos; // 依存関係から除外する！
  }
}


&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;7.3.3 使用するバージョンの強制&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;バージョン指定して記載するってこと&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;forceで強制している？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TODO: 必要になった際に再確認&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;クライアントモジュール依存関係&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;用途&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;依存しているモジュールのメタデータが誤っていたので上書きたい&lt;/li&gt;
&lt;li&gt;導入したモジュールに依存している別のライブラリがあった&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;あまり使わないとおもったので割愛&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.4 使用しているモジュールの調査&lt;/h4&gt;
&lt;p&gt;ここでは、さらに依存関係を管理する目的の一つ、使用しているモジュールの調査方法を紹介&lt;/p&gt;
&lt;p&gt;具体的には、Gradleが用意している依存関係のレポート用タスク、dependenciesタスクが本節のテーマ&lt;/p&gt;
&lt;p&gt;&lt;code&gt;gradel dependencies&lt;/code&gt; で実行できる&lt;/p&gt;
&lt;p&gt;依存関係をグラフ化して表示することができる&lt;/p&gt;
&lt;h4&gt;7.5 キャッシュ制御とオフライン実行&lt;/h4&gt;
&lt;h4&gt;7.5.1 キャッシュ制御&lt;/h4&gt;
&lt;p&gt;ビルドツールでは、一般的に一度解決した依存関係を再利用できるよう、ローカルマシンに依存関係をキャッシュする
ただGradleのキャシュ管理は他のビルドツールに比べて複雑&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;次に該当する場合、ネットワークへのアクセスが派生する場合がある
&lt;ul&gt;
&lt;li&gt;repositoriesブロックで、ネットワーク上にあるリポジトリが定義されている&lt;/li&gt;
&lt;li&gt;依存関係のうち、「外部モジュール依存関係」が使用されている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;できるだけネットワークアクセスを削減できるように、チェックサムと一致するファイルがキャッシュにあれば、それを使用するような仕組みになっている&lt;/p&gt;
&lt;h4&gt;7.5.2 オフライン実行&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;gradle --offline showDeps&lt;/code&gt;
オフラインで、キャッシュを使ってビルドする
キャッシュをつかってビルドできなければ、失敗する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;外部ネットワークとつながらない状態でビルドすることもできる&lt;/li&gt;
&lt;li&gt;イントラネット内にリポジトリサーバーを立てる方法紹介&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第3部［実践編］&lt;/h2&gt;
&lt;h3&gt;第8章 Gradle でのテスト&lt;/h3&gt;
&lt;p&gt;Gradleのビルドタスクはプロダクションコードのコンパイルだけでなく、テストコードの粉ピルとテストの実行も行う
Gradleを導入してビルドを行うだけで、テストを自動化できる環境が手に入ることになる
テストを自動化するにあたって、どのような要件があり、Gradleでどう解決できるかを把握しておく必要がある&lt;/p&gt;
&lt;h4&gt;8.1 テストの自動化とビルドツール&lt;/h4&gt;
&lt;h4&gt;8.1.1 テストを取り巻く状況&lt;/h4&gt;
&lt;h4&gt;8.1.2 自動テスト似おけるビルドツールの要件&lt;/h4&gt;
&lt;p&gt;CI導入が一般的になったことで今やCIツールとの親和性は必須の要件&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;特に以下の３点は重要
&lt;ul&gt;
&lt;li&gt;環境の差異が吸収できること&lt;/li&gt;
&lt;li&gt;特定の範囲でテストを実行できること&lt;/li&gt;
&lt;li&gt;スローテストを軽減できる仕組みをもっていること
&lt;ul&gt;
&lt;li&gt;実行に非常に時間がかかるテストは「スローテスト」と呼ばれ、&lt;/li&gt;
&lt;li&gt;開発プロジェクトを妨げる問題として、しばしば取り上げられるようになった&lt;/li&gt;
&lt;li&gt;ビルドツールがあれば暫定対応が容易にできるでしょう&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;8.2 Gradleによるアプローチ&lt;/h4&gt;
&lt;p&gt;Gradleは前述のビルドツールの要件をすべて満たしている
かんたんにかけるので紹介します&lt;/p&gt;
&lt;h4&gt;8.2.1 環境差異の吸収&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ビルドツールなら環境差異を吸収する仕組みを持っていることはあたりまえだが、&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Gradleならシンプルにかける&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;方法は２つ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;環境ごとにファイルを用意する&lt;/li&gt;
&lt;li&gt;１ファイル内でグループ化して切り替える&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;
// dev
ext.app_url = &apos;localhost&apos;

// pro
ext.app_url = &apos;xxx.xxx.xxx.xxx&apos;

// build.gradle
apply from: &quot;environments/${env}/env.gradle&quot;

task showURL &amp;lt;&amp;lt; {
  println &quot;App Server: ${app_url}&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;// env.conf
environments {
  dev {
    app_url = &apos;localhost&apos;
  }
  production {
    app_url = &apos;xxx.xxx.xxx.xxx&apos;
  }
}
// build.gradle
task showURL &amp;lt;&amp;lt; {
  def url = new File(&apos;config/env.conf&apos;).toURL()
  def config = new ConfigSlurper(&quot;$env&quot;).parse(url)
  println &apos;App Server: &apos; + config.app_url
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;8.2.2 特定の範囲でテストを実行できること&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;種類
&lt;ul&gt;
&lt;li&gt;パターンマッチングで特定して実行する&lt;/li&gt;
&lt;li&gt;テスティングフレームワークの機能を利用して実行する&lt;/li&gt;
&lt;li&gt;ソースセット単位で実行する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;apply plugin: &apos;java&apos;

sourceCompatibility = 1.7
targetCompatibility = 1.7

def defaultEncoding = &apos;UTF-8&apos;
[compileJava, compileTestJava]*.options*.encoding = defaultEncoding

repositories {
    mavenCentral()
}

dependencies {
    testCompile &apos;junit:junit:4.11&apos;
}

test {
	filter {
		includeTestsMatching &apos;*UT&apos;
	}
	reports.html.destination = file(&quot;${reports.html.destination}/unit&quot;)
	reports.junitXml.destination = file(&quot;${reports.junitXml.destination}/unit&quot;)
}

task integrationTest(type: Test) {
	filter {
		includeTestsMatching &apos;*IT&apos;
	}
	reports.html.destination = file(&quot;${reports.html.destination}/integration&quot;)
	reports.junitXml.destination = file(&quot;${reports.junitXml.destination}/integration&quot;)
}

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;TODO: 残りの説明割愛、必要になったら見返す&lt;/p&gt;
&lt;h4&gt;8.2.3 スローテスト対策&lt;/h4&gt;
&lt;h3&gt;第9章 Android プロジェクトでの適用&lt;/h3&gt;
&lt;h3&gt;第10章 統合開発環境（IDE）との連携&lt;/h3&gt;
&lt;h2&gt;第4部発展編&lt;/h2&gt;
&lt;h3&gt;第11章 Jenkins との連携&lt;/h3&gt;
&lt;h3&gt;第12章 アーカイブの作成とファイルの公開&lt;/h3&gt;
&lt;h3&gt;第13章 エキスパートへの道&lt;/h3&gt;
&lt;h3&gt;第14章 ほかのビルドツールからの移行&lt;/h3&gt;
&lt;h2&gt;付録 Gradleリファレンス&lt;/h2&gt;
</content:encoded></item><item><title>SpringBoot2徹底活用</title><link>https://tutttuwi.github.io/posts/2020-06_springboot2%E5%BE%B9%E5%BA%95%E6%B4%BB%E7%94%A8/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2020-06_springboot2%E5%BE%B9%E5%BA%95%E6%B4%BB%E7%94%A8/</guid><pubDate>Sun, 07 Jun 2020 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;現場至上主義SpringBoot2徹底活用&lt;/h1&gt;
&lt;h2&gt;理解したこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Gradleを使ったビルドができる&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;書籍情報&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;著者&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;廣末 丈士／宮林 岳洋 著、高安 厚思 監修&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;定価&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;3,456円（本体価格　3,200円）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;発売日&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2018年11月30日&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ISBN&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;978-4-8026-1185-5&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;目次&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第1章 Spring Bootの構成&lt;/li&gt;
&lt;li&gt;第2章 Webアプリケーションにおける共通処理&lt;/li&gt;
&lt;li&gt;第3章 データアクセス&lt;/li&gt;
&lt;li&gt;第4章 セキュリティ&lt;/li&gt;
&lt;li&gt;第5章 画面開発&lt;/li&gt;
&lt;li&gt;第6章 API開発&lt;/li&gt;
&lt;li&gt;第7章 チーム開発&lt;/li&gt;
&lt;li&gt;第8章 運用&lt;/li&gt;
&lt;li&gt;第9章 （Spring Bootアプリケーションが想定している）システム構成&lt;/li&gt;
&lt;li&gt;第10章 Spring5/Spring Boot2の新機能&lt;/li&gt;
&lt;li&gt;第11章 ローカル開発環境の構築について&lt;/li&gt;
&lt;li&gt;第12章 サンプルアプリについて&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;サンプルプログラム&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/miyabayt/spring-boot-doma2-sample&quot;&gt;https://github.com/miyabayt/spring-boot-doma2-sample&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第1章 Spring Bootの構成&lt;/h2&gt;
&lt;h3&gt;1.1 SpringBootの基礎&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SpringBootとは「Spring Frameworkベースのアプリケーションを手軽に作成することができるフレームワーク」&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;それ自体で完結するフレームワークではない&lt;/li&gt;
&lt;li&gt;Spring MVCやSpring Batchなどの様々なフレームワークを組み合わせて素早く簡潔にアプリケーションを開発する機能を提供&lt;/li&gt;
&lt;li&gt;SpringBootの中にTomcatが同梱されており、デフォルトでjarファイルをして、&lt;code&gt;java -jar&lt;/code&gt;コマンドで引数に指定すると組み込まれたtomcatが立ち上がり開発したアプリケーションを実行できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;代表的な特徴&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;スターター
&lt;ul&gt;
&lt;li&gt;依存関係をシンプルに定義するためのモジュール&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ビルドツール
&lt;ul&gt;
&lt;li&gt;バージョン解決など、開発を効率化するためのプラグイン&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;コンフィグレーションクラス
&lt;ul&gt;
&lt;li&gt;XMLではなく、アノテーションとJavaで設定が書ける&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;オートコンフィグレーション
&lt;ul&gt;
&lt;li&gt;デフォルトのコンフィグレーションが適用されて、必要なところだけを設定すればよくなる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;メインアプリケーションクラス
&lt;ul&gt;
&lt;li&gt;Javaコマンドで組み込みのTomcatを起動できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;設定ファイル
&lt;ul&gt;
&lt;li&gt;プロパティを外部ファイルに定義でき、動作使用を簡単に変更できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;スターター&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;一連の依存関係をセットとしてそろえるためのモジュール&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;必要なライブラリを準備したり、それぞれのバージョンを選定したりする煩わしい作業から解放される&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;たとえば、&lt;code&gt;spring-boot-starter-web&lt;/code&gt;を１つ依存関係に追加するだけで、SpringMVCやTomcatなど、Webアプリケーションに必要なライブラリがセットになって追加される&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;以下はスターターの例&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;spring-boot-starter-web&lt;/code&gt; : SpringMVC Tomcatが依存関係に追加される&lt;/li&gt;
&lt;li&gt;&lt;code&gt;spring-boot-starter-jdbc&lt;/code&gt; : SpringJDBC Tomcat JDBC Pool が依存関係に追加される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-build-systems.html#using-boot-starter&quot;&gt;スターターリファレンスページ&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;自分でスターターを作成する際は、&lt;code&gt;*-spring-boot-starter&lt;/code&gt;という命名規則が定められていることに注意&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;ビルドツール&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Spring Bootの推奨ビルドツール&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ApacheMaven&lt;/li&gt;
&lt;li&gt;Gradle&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本書では&lt;code&gt;Gradle&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;メリット
&lt;ul&gt;
&lt;li&gt;スクリプトを記述するタイプのビルドツールのため、Antのようにタスクを自由に記述することができる&lt;/li&gt;
&lt;li&gt;マルチプロジェクト構成の場合は、サブプロジェクトに対して一括設定して、必要に応じて個別に設定することができるため、記述量がMavenよりも少なくなる&lt;/li&gt;
&lt;li&gt;Mavenの場合は、特殊な処理が必要になった時に独自プラグインを実装する必要があるのに対し、Gradleはスクリプトを書くだけで対応できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Maven&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mavenを利用する場合、&lt;code&gt;spring-boot-starter-parent&lt;/code&gt;プロジェクトを親プロジェクトとして継承することで、プラグインのデフォルト設定、依存ライブラリのバージョンの定義、Javaコンパイラー準拠レベル、文字コードを引き継ぐことができる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;親プロジェクト設定&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;
&amp;lt;!-- Inherit defaults from Spring Boot --&amp;gt;
&amp;lt;parent&amp;gt;
  &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;spring-boot-starter-parent&amp;lt;/artifactId&amp;gt;
  &amp;lt;version&amp;gt;2.0.6.RELEASE&amp;lt;/version&amp;gt;
&amp;lt;/parent&amp;gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Gradle&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Spring Boot2.0.xはGradle4.0以降に対応している&lt;/li&gt;
&lt;li&gt;GradleはMavenと違って、設定を引き継ぐための親プロジェクトが存在しないため、単に、スターターを依存関係として追加します&lt;/li&gt;
&lt;li&gt;spring-boot-gradle-pluginというGradleプラグインが用意されており、実行可能なJarファイルを作成するためのタスクを利用できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ビルドスクリプトの処理内容&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;spring-boot-gradle-plugin をビルドスクリプトの依存関係に追加する&lt;/li&gt;
&lt;li&gt;spring-boot-gradle-plugin と dependency-management プラグインを利用することを宣言&lt;/li&gt;
&lt;li&gt;Javaコンパイラー準拠レベルをデフォルトの1.8から11に変更&lt;/li&gt;
&lt;li&gt;文字コードはUTF-8であることを指定する&lt;/li&gt;
&lt;li&gt;スターターをアプリケーションの依存関係に追加する&lt;/li&gt;
&lt;li&gt;テスト用のスターターをアプリケーションの依存関係に追加する&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;依存関係の管理&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;すべてのライブラリのバージョンを１つずつ指定するというような作業をする必要はない&lt;/li&gt;
&lt;li&gt;依存関係に定義されているライブラリも一緒にバージョンアップする&lt;/li&gt;
&lt;li&gt;Spring Bootのバージョンを上げる場合は、Project Wikiに載っているリリースノートを確認すること&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;コンフィグレーションクラス&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Spring BootはJavaベースのコンフィグレーションが好まれる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;従来通りXMLファイルに記述できるが、推奨されるのは&lt;code&gt;@Configuration&lt;/code&gt;アノテーションを付与したクラスによるコンフィグレーション&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MVCの設定のこと？再度確認する&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;オートコンフィグレーション&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Spring Bootは設定を変更しなければ、あらかじめ敷かれたレールに沿って動作するようになっている&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;メインアプリケーションクラス&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SpringBootのアプリケーションを起動するメソッドを呼び出すクラス&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Javaアプリケーションのエントリポイントとなるmainメソッドの中で、SpringApplicationクラスのrunメソッドを呼び出すと、組み込みのTomcatが立ち上がり、SpringIoCコンテナの初期化が行われる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;※再読&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;設定ファイル&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;アプリケーションを起動すると、次の場所にある&lt;code&gt;application.properties&lt;/code&gt;設定ファイルを読み込む&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;カレントディレクトリの&lt;code&gt;/config&lt;/code&gt;サブディレクトリ&lt;/li&gt;
&lt;li&gt;カレントディレクトリ&lt;/li&gt;
&lt;li&gt;クラスパスの&lt;code&gt;/config&lt;/code&gt;パッケージ&lt;/li&gt;
&lt;li&gt;クラスパスのルート&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;上から順番に優先度が高くなる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;プロファイルという単位で別々の設定を持たせることも可能&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;設定ファイルは&lt;code&gt;yml&lt;/code&gt;形式でもOK&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;application.yml&lt;/code&gt;を配置することで使用可能&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;設定ファイルの値を参照するのも簡単&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Colum 外部設定ファイルの種類&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;環境変数&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;システムプロパティ&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コマンドライン引数&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;いろんな渡し方がある&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;けど、アプリケーションプロパティしか使わないのではと思う&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;アプリケーションの起動&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;コマンドラインで起動 &lt;code&gt;gradle bootRun&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;InteliJ IDEAを使って起動する&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.2 Spring BootによるWebアプリケーション開発&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Intelij IDEA 起動&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Cntl + Shift + A&lt;/code&gt; -&amp;gt; &lt;code&gt;compiler.automake.allow.when.app.running&lt;/code&gt; を &lt;code&gt;ON&lt;/code&gt; にすることでファイル変更時に自動更新する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;リソースの除外&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;静的リソースの変更は単に再読み込みするだけで再起動は不要&lt;/li&gt;
&lt;li&gt;デフォルト設定では、
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/META-INF/maven&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/META-INF/resources&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/resources&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/static&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/public&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;templates&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;に含まれるファイルへの変更は再起動がかからないようになっている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// 再起動のトリガーから除外するファイルを設定する
spring.devtools.restart.exclude=static/**,public/**

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;LiveReload&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// LiveReloadを無効化する
spring.devtools.livereload.enabled=false

&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Restart vs Reload&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;JVM hot-swapping をよりよいものにしたい場合&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;JRebel&lt;/code&gt;(有償)または、&lt;code&gt;Spring Loaded&lt;/code&gt;(無償:Grails2の内部で利用されている) の利用を検討する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;もう一つの方法として、&lt;code&gt;Dynamic Code Evolution VM(DCEVM)&lt;/code&gt; HotSwapAgentを使ったJVM hot-swapping がある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JDKにパッチをあててクラスの再定義機能を強化してくれる&lt;/li&gt;
&lt;li&gt;Spring Loadedでは対応していないクラス追加に対してもhot-swappingが働く&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DCEVM + HotSwapAgentの導入方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;jar&lt;/code&gt;ファイルをインストール &lt;a href=&quot;http://dcevm.github.io/&quot;&gt;http://dcevm.github.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;java -jar DCEVM-*-installer.jar&lt;/code&gt; 実行&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Intelij IDEA プラグイン設定&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HotSwapAgent をインストール&lt;/li&gt;
&lt;li&gt;Settingより設定する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.3 サンプルプロジェクトの構成&lt;/h3&gt;
&lt;h4&gt;マルチプロジェクト&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;本書で用いるサンプルプロジェクトは複数のモジュールで構成されるマルチプロジェクト&lt;/li&gt;
&lt;li&gt;メリット
&lt;ul&gt;
&lt;li&gt;ビルドスクリプトを共通化することができるので記述量が減る&lt;/li&gt;
&lt;li&gt;ローカル・リモートリポジトリにアーティファクトをアップロードしなくてもソースコードの変更が反映される&lt;/li&gt;
&lt;li&gt;それぞれのプロジェクトを関連付けてタスクを実行できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;アプリケーション・アーキテクチャ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;プレゼンテーション層
&lt;ul&gt;
&lt;li&gt;プレゼンテーション層は、入力された値を受け取って、値をチェックしたり、値の変換を行ったりする層&lt;/li&gt;
&lt;li&gt;WebモジュールのFormクラス、FormValidatorクラスが該当&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;アプリケーション層
&lt;ul&gt;
&lt;li&gt;プレゼンテーション層から受け取った値をドメイン層に渡す層で、WebモジュールのControllerが該当する&lt;/li&gt;
&lt;li&gt;ビジネスロジックは含まれないが、画面遷移先を制御したり、セッションを用いて、次画面に値を渡したりといった処理を行う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ドメイン層
&lt;ul&gt;
&lt;li&gt;ドメインオブジェクトを持ち、ビジネスロジックを処理するメインの層で、ドメインモジュールのServiceクラスが該当する&lt;/li&gt;
&lt;li&gt;ドメインオブジェクトはすべての層から利用されるが、逆にドメイン層はほかの層に依存してはならない点に注意する！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;インフラストラクチャ層
&lt;ul&gt;
&lt;li&gt;インフラストラクチャ層では、ドメイン層から渡されたデータを永続化する層&lt;/li&gt;
&lt;li&gt;ドメインモジュールのRepositoryクラスが該当する&lt;/li&gt;
&lt;li&gt;アプリケーション層の影響を受けないように、汎用的な部品としてつくるようにすること！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;サンプルプロジェクトのビルドスクリプト&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Spring Bootのバージョンを拡張プロパティにセット&lt;/li&gt;
&lt;li&gt;テストコードはSpockフレームワークを利用するため、Groovyを扱えるようにする&lt;/li&gt;
&lt;li&gt;すべてのサブプロジェクトにおいて spring-boot-gradle-plugin を利用できるようにする&lt;/li&gt;
&lt;li&gt;すべてのサブプロジェクトにおいて dependency-management プラグインを利用できるようにする&lt;/li&gt;
&lt;li&gt;Javaコンパイラー準拠レベルを１１に変更する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;src/main/resources&lt;/code&gt; をクラスパスに追加して、開発中の変更がすぐに反映されるようにする&lt;/li&gt;
&lt;li&gt;リソースファイルの出力先をソースファイルの出力先に変更する&lt;/li&gt;
&lt;li&gt;コンパイルの前に、リソースファイルの出力を行うようにする&lt;/li&gt;
&lt;li&gt;Domaの依存関係にあるバージョン違いの Spring Boot を除外する&lt;/li&gt;
&lt;li&gt;Spring Session モジュールを使ってセッション情報をデータベースに格納する&lt;/li&gt;
&lt;li&gt;Gradleのプロジェクトプロパティを bootRun の引数に渡せるようにする&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;
// メインアプリケーションクラスを持たないモジュールの場合（build.gradle）
bootJar {
  enabled = false
}

&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Lombokを利用する&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;ボイラープレートコードの削減のため&lt;/li&gt;
&lt;li&gt;アプリケーションの実行時には不要なので、スコープはcompileOnlyに設定&lt;/li&gt;
&lt;li&gt;型&lt;code&gt;val&lt;/code&gt;が使用できる
&lt;ul&gt;
&lt;li&gt;MEMO: これを使うと長い型を３文字でかけるよっていうことらしい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第2章 Webアプリケーションにおける共通処理&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;サンプルプロジェクトにおける共通処理、その実装方法について説明&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;種別&lt;/th&gt;
&lt;th&gt;説明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;バリデーション&lt;/td&gt;
&lt;td&gt;単項目・相関チェックを効率よく実施する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;オブジェクトマッピング&lt;/td&gt;
&lt;td&gt;入力値を他のエンティティに効率よく詰め替える&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ログ出力&lt;/td&gt;
&lt;td&gt;共通的に処理の開始・終了をログ出力する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ファイルダウンロード&lt;/td&gt;
&lt;td&gt;CSV、Excel、PDFなどのファイルをダウンロードする&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ファイルアップロード&lt;/td&gt;
&lt;td&gt;アップロードされたファイルを、Domaを使ってデータベースに保存する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;メール送信&lt;/td&gt;
&lt;td&gt;本文をテンプレート処理してメールを送信できるようにする&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;2.1 バリデーション&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Spring MVC では単項目チェックを行うためのBean Validatorが用意されている&lt;/li&gt;
&lt;li&gt;相関チェックのためのアノテーションはないので、効率よく相関チェックを行うために共通処理を実装する&lt;/li&gt;
&lt;li&gt;Spring Bootでは &lt;code&gt;spring-boot-starter-validation&lt;/code&gt;スターターを依存関係に追加することで、Bean Validation 2.0 と Spring Validatorが利用できる&lt;/li&gt;
&lt;li&gt;バリデーションのポイント
&lt;ul&gt;
&lt;li&gt;メッセージの設定&lt;/li&gt;
&lt;li&gt;バリデーションの種類&lt;/li&gt;
&lt;li&gt;単項目チェック&lt;/li&gt;
&lt;li&gt;相関項目チェック&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;メッセージの設定&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Bean Validator はメッセージを外部ファイルで管理するためのMessageSourceを内包している&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;デフォルトでは文字コードが&lt;code&gt;UTF-8&lt;/code&gt; になっていないので、エラーメッセージを表示する際に文字化けてしまう&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;application.yml&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 共通の設定を定義する
spring:
  messages:
    # メッセージ定義ファイルのパスを含めて設定する
    basename: messages,ValidationMessages
    cache-duration: -1
    encoding: UTF-8 # P40. デフォルトのままだと文字化けするため指定

&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Colum メッセージを定義するファイルを分割する&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;application.yml&lt;/code&gt;のbasenameにカンマ区切りで複数指定可能
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ValidationMessage&lt;/code&gt;:バリデーションのエラーメッセージを定義する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PropertyNames&lt;/code&gt;:エラー項目の項目名を入力フォームごとに定義する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;messages&lt;/code&gt;:バリデーションとは関係ないシステムメッセージなどを定義する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;バリデーションの種類&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;バリデーションの種類&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;クライアントサイド&lt;/li&gt;
&lt;li&gt;サーバーサイド&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本書はサーバーサイドのバリデーションについて説明&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;単項目チェック：&lt;code&gt;Bean Validation API&lt;/code&gt;で提供されるアノテーションを利用できる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;相関項目チェック：&lt;code&gt;org.springframework.validation.Validator&lt;/code&gt;インターフェースの実装クラスを作成するか、自作のアノテーションを実装する&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;単項目チェック&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;javax.validation.constraints&lt;/code&gt;パッケージに定義されている&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;アノテーション&lt;/th&gt;
&lt;th&gt;チェック内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Min,DecimalMin&lt;/td&gt;
&lt;td&gt;数値の最小値を下回らないこと&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max,DecimalMax&lt;/td&gt;
&lt;td&gt;数値の最大値を超えないこと&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NotNull&lt;/td&gt;
&lt;td&gt;NULL値ではないこと&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pattern&lt;/td&gt;
&lt;td&gt;正規表現を満たすこと&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NotBlank&lt;/td&gt;
&lt;td&gt;値があること（空白を許さない）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NotEmpty&lt;/td&gt;
&lt;td&gt;値があること（空白を許す）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Digits&lt;/td&gt;
&lt;td&gt;数値であること&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Past&lt;/td&gt;
&lt;td&gt;過去であること&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Future&lt;/td&gt;
&lt;td&gt;未来であること&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;spring-boot-starter-validation&lt;/code&gt;スターターは &lt;code&gt;Bean Validation&lt;/code&gt;の実装ライブラリーとして、&lt;code&gt;Hibernate Validator&lt;/code&gt;を依存関係に追加しているので、Hibernateで定義されたアノテーションも使うことができる&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;アノテーション&lt;/th&gt;
&lt;th&gt;チェック内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CreditCardNumber&lt;/td&gt;
&lt;td&gt;正しいクレジットカード番号であること&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Length&lt;/td&gt;
&lt;td&gt;NULL値ではないこと&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Range&lt;/td&gt;
&lt;td&gt;範囲内の値であること&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SafeHtml&lt;/td&gt;
&lt;td&gt;妥当なHTML書式であること&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;URL&lt;/td&gt;
&lt;td&gt;正しいURLであること&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;参考URL&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://beanvalidation.org/2.0/&quot;&gt;https://beanvalidation.org/2.0/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Formオブジェクトに&lt;code&gt;@NotEmpty&lt;/code&gt;などのアノテーション付与&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Controller&lt;/code&gt;の&lt;code&gt;@PostMapping(&quot;/new&quot;)&lt;/code&gt;を付与したメソッドの引数に&lt;code&gt;@Validated&lt;/code&gt;を付与し、Formオブジェクトを第一引数に指定&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;チェック結果が、第二引数の&lt;code&gt;BindingResult&lt;/code&gt;に入るので結果をチェックする&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Column PRGパターンについて&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;PRGパターンでは、Post-Redirect-Getメソッドを組み合わせて、以下の流れで登録処理を行う実装パターン&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;保存ボタンを押したとき、POSTメソッドを使い、サーバーにリクエストする（P:Post）&lt;/li&gt;
&lt;li&gt;入力値をDBに保存するといった一連の処理を行い、詳細画面にリダイレクトする（R:Redirect）&lt;/li&gt;
&lt;li&gt;GETメソッドで詳細画面が表示される（G:Get）&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;サンプルプロジェクトはほぼすべての機能において、PRGパターンを適用している&lt;/li&gt;
&lt;li&gt;メリット
&lt;ul&gt;
&lt;li&gt;ブラウザの戻るボタンを押しても、フォーム再送信のダイアログを表示しないようにすることができる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;相関項目チェック&lt;/h4&gt;
&lt;h3&gt;2.2 オブジェクトマッピング&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ModelMapperを使用した詰め替え例の紹介&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dozerなどもあるのでお好みで使用すること&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Strictモードにしないと意図しない詰め替えが発生する可能性があるので注意&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: ここはOrikaを採用することにしたので割愛&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.3 ログ出力&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;MDCを使ってログに値を埋め込む設定&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コントローラに関数名を返却する処理を埋め込む&lt;/li&gt;
&lt;li&gt;リクエストごとに乱数を生成して埋め込む（リクエストトラッキング）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ログローテーションの設定について&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.4 ファイルダウンロード&lt;/h3&gt;
&lt;p&gt;ファイルの出力処理を共通処理にするとソースコードの記述量を削減市、統一された方法に揃えることで微妙な動作の違いを生まない用にすることができます。&lt;/p&gt;
&lt;p&gt;ファイルダウンロード機能は、エンタープライズのアプリケーション開発に限らず、とてもよくある機能の１つ&lt;/p&gt;
&lt;p&gt;&lt;code&gt;org.springframework.web.servlet.View&lt;/code&gt;インターエースを実装することで、汎用的なロジックで様々なファイルダウンロードに対応できる用になる&lt;/p&gt;
&lt;h4&gt;PDFファイルのダウンロード&lt;/h4&gt;
&lt;p&gt;帳票出力の代表的なライブラリとして、JasperReportsがある
JasperReportsは、&lt;code&gt;.jrxml&lt;/code&gt;という拡張子のXMLファイルで帳票のレイアウトをテンプレートとして定義して帳票を出する際に対象データを引数に渡すことで帳票を出力します。
テンプレートファイルはJasperSoftStudioというEclipseベースの帳票デザインツールを使って作成&lt;/p&gt;
&lt;p&gt;SpringMVCには、JasperReportsをサポートするViewクラスが提供されていたが、SpringFramework5から機能が除外されている&lt;/p&gt;
&lt;p&gt;そのため、JasperReportsライブラリを直接使ってPDF出力するPDFViewクラスを実装して、引数にデータを渡すだけでPDF出力ができるようにします。&lt;/p&gt;
&lt;h4&gt;CSVファイルのダウンロード&lt;/h4&gt;
&lt;p&gt;CSVファイルのダウンロードは、&lt;code&gt;jackson-dataformat-csv&lt;/code&gt;を利用するとシンプルに実装することができる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CsvViewクラス&lt;/li&gt;
&lt;li&gt;Entityクラス&lt;/li&gt;
&lt;li&gt;Controllerクラス&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Excelファイルのダウンロード&lt;/h4&gt;
&lt;p&gt;Excelファイルのダウンロードの場合は、&lt;code&gt;org.springframework.web.servlet.view.document.AbstractXlsxView&lt;/code&gt;を利用
AbstractXlsxViewはApachePOIに依存しているのでバージョンまで指定して依存関係を記述します
PDFファイルの場合と同様で、ファイル名に日本語文字が含まれると文字化けが生じてしまうので、子クラスを作成して対応&lt;/p&gt;
&lt;h3&gt;2.5 ファイルアップロード&lt;/h3&gt;
&lt;p&gt;ファイルダウンロードと同様によく実装する機能の１つ&lt;/p&gt;
&lt;p&gt;SpringBootでは、アップロードファイルのサイズ上限などの設定を適切に行わないと、オートコンフィグレーションによるデフォルトの動作仕様では要件を満たせないこともありえるので注意が必要
SpringBootでは、ServletAPI3.0で利用できる&lt;code&gt;javax.servlet.http.Part&lt;/code&gt;を内包するMultipartResolverがオートコンフィグレーションされるので、なにもしなくてもMultipartFileインターフェースを使ってファイルを受け取ることができる&lt;/p&gt;
&lt;h4&gt;ファイルサイズの設定&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;１ファイルのサイズ上限は１MBで、１リクエストで受け付ける上限は１０MBになっている&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;spring:
  servlet:
    multipart:
      max-file-size: -1 # デフォルトは1MB　-1だと無制限
      max-request-size: 20MB # デフォルトは10MB
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;ファイルの取扱&lt;/h4&gt;
&lt;h4&gt;ファイルのデータベースへの格納&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;TODO: 後で画像保存する処理実装する&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.6 メール送信&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;MEMO: 省略&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第3章 データアクセス&lt;/h2&gt;
&lt;p&gt;本chapterでは、O/RマッパーとしてDomaを使った実装方法を説明
Domaは2way-SQLと呼ばれるSQLテンプレートを利用できるので、SQL分の見通しがよくなるという特徴がある&lt;/p&gt;
&lt;p&gt;実行時にSQLテンプレートとJavaソースコードとの不整合を検知して間違いを指摘する機能も備わっていて、とても使い勝手がよいO/Rマッパーです&lt;/p&gt;
&lt;h3&gt;3.1 スターター&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;2way-SQLとは
&lt;ul&gt;
&lt;li&gt;SQLのコメントに条件分岐を記述することで、プログラムのSQLテンプレートとしての利用と、囲うせずにそのままツールでの利用という２通りの使い方が可能になっているSQL文&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.2 Domaの使い方&lt;/h3&gt;
&lt;h3&gt;3.3 エンティティ共通処理&lt;/h3&gt;
&lt;p&gt;すべてのエンティティにシステム固有のシステム制御項目（作成者、作成日時、更新者、更新日時、削除者、削除日時）を用いて、エンティティを取り扱うときに、すべてのテーブルに共通のルールを適用する場合の共通処理について説明&lt;/p&gt;
&lt;h4&gt;エンティティ基底クラス&lt;/h4&gt;
&lt;p&gt;エンティティ基底クラスを用意し、共通的に使うフィールドを定義することができる&lt;/p&gt;
&lt;p&gt;&lt;code&gt;@Entity&lt;/code&gt;アノテーションにリスナーを指定すると、更新・登録・削除のタイミングで共通的な処理を実行することができる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TODO: 共通項目実装&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.4 ページング処理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;DOMAはページング処理を行うための仕組みとして検索オプションを提供している&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TODO: 要実装&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.5 排他制御&lt;/h3&gt;
&lt;h4&gt;楽観的排他制御&lt;/h4&gt;
&lt;p&gt;データ不整合を保険的に防ぐ方法
複数人が同じデータを編集してしまった場合に、先に保存したほうの編集内容が後から保存した内容で上書きされてしまうといったことを防ぐことができる&lt;/p&gt;
&lt;p&gt;Domaを使って楽観的排他制御を行うには以下の条件を満たす必要がある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;エンティティのフィールドに&lt;code&gt;@Version&lt;/code&gt;アノテーションが付与されている&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Daoインターフェースに付与したアノテーションのignoreVersionをtrueにしていない&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;テーブルに数値型の改定番号カラムが定義されている&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;流れ&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Formオブジェクト二改定番号のフィールドを定義する&lt;/li&gt;
&lt;li&gt;コントローラに&lt;code&gt;@SessionAttribute&lt;/code&gt;アノテーションを付与する。&lt;/li&gt;
&lt;li&gt;編集画面の初期表示処理で改定番号を含めてデータを取得して、Formオブジェクトに詰め替える&lt;/li&gt;
&lt;li&gt;更新処理で、更新対象データを取得して、そのデータをFormオブジェクトの値で上書きする&lt;/li&gt;
&lt;li&gt;Daoの更新処理を呼び出す（ここで排他制御がかかる&lt;/li&gt;
&lt;li&gt;不要になったFormオブジェクトをセッションからクリアする&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TODO: 楽観的排他制御について深堀り、実装→悲観的排他制御だけでアプリとしては回せそう&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Column セッション情報の格納先について&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;楽観的排他制御の説明の中でSessionAttributeを使ってFormオブジェクトをセッション情報に保存する方法を紹介しました。サンプルプロジェクトでは、SpringSessionモジュールを依存関係に追加しているので、SpringBootによるオートコンフィグレーションが行われます。SpringSessionには、以下の格納先に対するオートコンフィグレーションが用意されています。
&lt;ul&gt;
&lt;li&gt;JDBC&lt;/li&gt;
&lt;li&gt;Redis&lt;/li&gt;
&lt;li&gt;Hazelcast&lt;/li&gt;
&lt;li&gt;MongoDB&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;セッション情報の格納先を変更したい場合は、設定ファイルにリスト3.11を記述することで変更することができます。
&lt;ul&gt;
&lt;li&gt;redisにする場合：&lt;code&gt;spring.session.store-type=redis&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TODO: セッションの格納先はREDISにする&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;悲観的排他制御&lt;/h4&gt;
&lt;p&gt;データベースの行ロック機能を使った排他制御で、在庫数のような頻繁に同時更新がかかるようなデータの整合性を担保する方法として利用される&lt;/p&gt;
&lt;p&gt;Domaでは、悲観的排他制御を行うための仕組みも用意されていて、ページング処理の説明と同じ用に検索オプションを使う&lt;/p&gt;
&lt;p&gt;悲観的排他制御を行うときに注意すべきなのは、検索結果が０件になるような条件で検索すると、行ロックではなくテーブルロックがかかる点です！！！
処理時間が長い処理でテーブルロックがかかってしまうと、処理の滞留が発生してしまい、システム全体が不安定な状態二なることもあるので注意する&lt;/p&gt;
&lt;h3&gt;3.6 論理削除&lt;/h3&gt;
&lt;p&gt;DBのレコードを削除するのではなく、削除フラグによってレコードの削除を表すという方法&lt;/p&gt;
&lt;h4&gt;更新機能による実現&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@Update(excludeNull = true) // Nullの項目は更新対象にしない&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;エンティティリスナーによる共通処理&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;リスナーの中の&lt;code&gt;preUpdate&lt;/code&gt;メソッドの中で、メソッド名が論理削除のメソッド名と一致するかを確認する&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;論理削除レコードの除外&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;論理削除を行うことをアプリケーション内で統一している場合は、データ取得のSQLに、論理削除フラグによる削除データの除外が行われる用にする必要がある&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Column 参考文献&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;BLOG.IK.AM &lt;a href=&quot;https://blog.ik.am/&quot;&gt;https://blog.ik.am/&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;初めてのSpringBoot著者&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SlideShare Toshiaki Maki &lt;a href=&quot;https://www.slideshare.net/makingx&quot;&gt;https://www.slideshare.net/makingx&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第4章 セキュリティ&lt;/h2&gt;
&lt;p&gt;本chapterでは、SpringSecurityを使った認証・認可とそれらにまつわる課題を解決する実装方法を説明&lt;/p&gt;
&lt;h3&gt;4.1 スターター&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;  compile group: &apos;org.thymeleaf.extras&apos;, name: &apos;thymeleaf-extras-springsecurity5&apos;, version: &apos;3.0.4.RELEASE&apos;
  compile &apos;org.springframework.boot:spring-boot-starter-security&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4.2 認証&lt;/h3&gt;
&lt;h4&gt;認証情報の取得&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;UserDetailsServiceをimplementsして実装する方法&lt;/li&gt;
&lt;li&gt;TODO: 権限周りが実装できていないので見ておく&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;ログイン機能&lt;/h4&gt;
&lt;p&gt;ログイン機能のコントローラを実装します。
デフォルトでも組み込みのログイン画面を表示することが可能ですが、ほとんどの場合において画面を変更する必要があるので、Thymeleafテンプレートを使ってログイン画面を表示する用に実装し、それ以降の処理はSpringSecurityと連携するようにします。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TODO: タイムアウト処理やログイン成功処理など実装の必要があればサンプルを基に実装する
&lt;ul&gt;
&lt;li&gt;/authorize　にfowardできなくて、formオブジェクト経由のエラーチェックが実装できなかった&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.3 RememberMe&lt;/h3&gt;
&lt;p&gt;一般的なWebサービスでは、ログイン画面に「ログインしたままにする」というチェックボックスがあることがしばしばある
一定期間内であればセッションがタイムアウトしても自動ログイン処理が行われる機能が提供されるので、何度もログイン画面でパスワードを入力する不便さを解消することができる&lt;/p&gt;
&lt;h4&gt;ログイン記録の永続化&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;TODO: 自動ログイン機能は必要になれば実装しておきたい
&lt;ul&gt;
&lt;li&gt;合わせて不要なレコードを削除する機能も実装する必要がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.4 認可&lt;/h3&gt;
&lt;p&gt;管理機能を備えたWebアプリケーションにおいては、ログインユーザーごとに権限を付与して、特定のユーザーのみが操作することができるように制御することがよくある
このようなアクセス制御を行う場合は、以下の要件が満たされていると汎用的に使えるためとても便利&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;要件&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;システムを利用するユーザーは、複数のロール（役割）を持つことができる&lt;/li&gt;
&lt;li&gt;特定リソースの操作を識別する単位として権限を定義することができる&lt;/li&gt;
&lt;li&gt;ロールは、複数の権限を持つことができる&lt;/li&gt;
&lt;li&gt;システムの移動中にロールの持つパーミッションや対象のリソースを変更することができる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SpringSecurityを使った認可の実装方法としては、アノテーションを使う方法と、JavaConfigでURLベースの条件式をていk技する方法がある&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;これらの方法では、システムの稼働中に新たに役割に権限を追加したり、することが困難&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;認証処理の中でデータベースからロール権限を取得して、コントローラのメソッドレベルでの認可制御を行うようにしている&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;権限管理データをロード&lt;/h4&gt;
&lt;h4&gt;権限とメソッドの紐付け&lt;/h4&gt;
&lt;h4&gt;認可制御のインターセプター&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;TODO: 権限管理はあとで見直す&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.5 CSRF対策&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// 以下を追加するとformにhiddenでcsrfトークンが埋め込まれる
http.csrf()
  .csrfTokenRepository(new CookieCsrfTokenRepository()); 
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4.6 二重送信防止&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;二重送信防止するためのチェック方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JavaScriptでボタンを連打できないようにする&lt;/li&gt;
&lt;li&gt;PostRedirectGetパターンを適用&lt;/li&gt;
&lt;li&gt;トークンを使った送信済みチェックをする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TODO: ここで紹介されているやり方だと、二重送信防止チェックをするのは、UPDATEが伴う処理のみに限定できる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ページ遷移や検索処理で二重送信が行われた場合は除外できるという仕組みになっている&lt;/li&gt;
&lt;li&gt;ここの実装方法の方がより現実的なので後で真似る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第5章 画面開発&lt;/h2&gt;
&lt;h3&gt;5.1 Thymeleaf&lt;/h3&gt;
&lt;p&gt;SpringMVCといえばJSP一択だったが、HTML5に準拠した形で管理できる方が望ましい&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;メリット
&lt;ul&gt;
&lt;li&gt;Spring推奨&lt;/li&gt;
&lt;li&gt;HTML5準拠&lt;/li&gt;
&lt;li&gt;デザイナとの分業がしやすい&lt;/li&gt;
&lt;li&gt;ブラウザで直接参照できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.2 Formバインディング&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;FormBeanの定義方法とバリデーション方法&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.3 事前評価&lt;/h3&gt;
&lt;p&gt;アプリケーションで扱うデータは特定の変換処理をかけたいことがよくある
Thymeleafでは事前評価をサポートしている&lt;/p&gt;
&lt;h4&gt;事前評価の実装例&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;表示する言語を翻訳する例が紹介されている&lt;/li&gt;
&lt;li&gt;FormBeanの値と、実際に表示したい値が異なる場合に有用だと思う&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;p th:text=&quot;${@myapp.translator.Translator@translateToEnglish(textVar)}&quot;&amp;gt;some text here ...&amp;lt;/p&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.4 テンプレート共有&lt;/h3&gt;
&lt;h4&gt;テンプレートの部品化&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;includeとreplaceの話&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;テンプレートの共通化&lt;/h4&gt;
&lt;p&gt;レイアウトという機能でテンプレートの共通化をサポートします
HTMLのレイアウトやJavaScriptおよびCSSのインクルードを一元管理できる
本機能を用いてテンプレートの共通化を採用することでソースコードの保守性や品質も向上するため、積極的に導入すべき機能&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  compile(&apos;nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect:2.3.0&apos;) {
    exclude group: &quot;org.codehaus.groovy&quot;, module: &quot;groovy&quot;
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;@Configuration
public class WebConfig extends WebMvcConfigurer {
  @Bean
  public LayoutDialect layoutDialect() {
    return new LayoutDialect();
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;レイアウト機能を利用するために、&lt;code&gt;xmlns:layout=&quot;http://www.ultraq.net.nz/thymeleaf/layout&quot;&lt;/code&gt;を指定する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;layout:fragment=&quot;任意の文字列&quot;&lt;/code&gt;で各ページで差し替えるエリアを指定する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: Spring徹底入門でも紹介されていたが、画面の全体像がわかりづらくなりやすいためincludeを用いることにする&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.5 Thymeleafのその他の機能&lt;/h3&gt;
&lt;h4&gt;エスケープなしのテキスト&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;通常、クロスサイトスクリプティング対策のためSpringはタグ文字列をエスケープして表示している&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;場合によってはエスケープしないで、文字列を表示したいケースがある&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;p th:utext=&quot;#{home.welcom}&quot;&amp;gt;Welcom to our grocery store!&amp;lt;/p&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;このutextを利用する場合は、XSSの脆弱性を含まない用に注意が必要&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;日付操作拡張&lt;/h4&gt;
&lt;p&gt;Thymeleafでは、Date/TimeAPIをデフォルトでサポートしていないため拡張ライブラリーを使用する必要がある&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  // https://mvnrepository.com/artifact/org.thymeleaf.extras/thymeleaf-extras-java8time
  compile group: &apos;org.thymeleaf.extras&apos;, name: &apos;thymeleaf-extras-java8time&apos;, version: &apos;3.0.4.RELEASE&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;input class=&quot;form-control&quot; type=&quot;text&quot; name=&quot;holidayDate&quot;
 th:value=&quot;${(value != null) ? #temporals.format(value, &apos;yyyy/MM/dd&apos;) : &apos;&apos; }&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;※その他にもThymeleafは各種の拡張機能をサポートしている&lt;/p&gt;
&lt;h3&gt;5.6 静的コンテンツ管理&lt;/h3&gt;
&lt;p&gt;BtoCのアプリケーションを構築する際、UI/UXの向上が欠かせないため、クライアントサイドライブラリを有効活用する必要がある
JavaScriptやCSSを適切に管理していない状況では、次の問題が発生することがありました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;JavaScriptやCSSが適切にバージョニングされていないため、ブラウザキャッシュにより、リリース時に古いバージョンが提供されてしまう。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JavaScriptやCSSライブラリが構成管理されていないため、安易な外部ライブラリの利用により障害が発生してしまう&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本節では、Webアプリケーションの静的コンテンツについて&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;配置場所&lt;/li&gt;
&lt;li&gt;キャッシュ制御&lt;/li&gt;
&lt;li&gt;アクセス制御&lt;/li&gt;
&lt;li&gt;クライアントライブラリの構成管理方法
&lt;ul&gt;
&lt;li&gt;を解説！！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;静的コンテンツの配置場所&lt;/h4&gt;
&lt;p&gt;SpringBootでは、SpringMVCのオートコンフィグレーションに以下の設定がされており、デフォルトでは次の４点のパスに静的コンテンツを配置できる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;/resources/&lt;/li&gt;
&lt;li&gt;/static/&lt;/li&gt;
&lt;li&gt;/public/&lt;/li&gt;
&lt;li&gt;/META-INF/resources/&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;キャシュ制御&lt;/h4&gt;
&lt;p&gt;キャッシュする時間は、application.(properties|yml) や ResourceHandlerRegistryのオーバーラードで調整&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;spring:
  resources:
#    cache-period: 86400 # 1日間キャッシュさせる
    chain:
      strategy:
        content:
          enabled: true # 静的コンテンツのキャッシュ無効設定 MD5ハッシュが計算される バージョン管理戦略と呼ばれるらしい
          paths: /**
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;TODO: バージョン管理戦略を実施した場合のキャッシュの挙動を確認しておく&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;アクセス制御&lt;/h4&gt;
&lt;p&gt;Faviconなどの画像ファイルやクライアントライブラリは未認証、認証にかかわらずアクセスできる必要がある
SpringBootでは、SpringSecurityのオートコンフィグレーションにリストの設定がされており、デフォルトで次の５点のパスはpublicアクセス可能&lt;/p&gt;
&lt;p&gt;しかし、SEOに必要なrobots.txtやsitemap.xmlは含まれないため、これらのファイルをPublicアクセス可能とするには、JavaConfigで設定を上書きする必要がある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;デフォルトで許可されている５点&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;/css/&lt;/li&gt;
&lt;li&gt;/js/&lt;/li&gt;
&lt;li&gt;/images/&lt;/li&gt;
&lt;li&gt;/webjars/&lt;/li&gt;
&lt;li&gt;favicon.ico&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TODO: SEO対策に必要な知識を習得しておく必要がある&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;  private static final String[] STATIC_RESOURCES = {
      &quot;/favicon.ico&quot;, &quot;/css/**&quot;, &quot;/js/**&quot;, &quot;/img/**&quot;, &quot;/lib/**&quot;, &quot;/font/**&quot;
  };
  @Override
  public void configure(WebSecurity web) {
    // セキュリティ対策が不要なリソースがある場合、SpringSecurityの処理を適用しないようにする
    //    web.ignoring().antMatchers(&quot;/resources/static/**&quot;);
    web.ignoring().antMatchers(STATIC_RESOURCES);
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;クライアントライブラリの構成管理&lt;/h4&gt;
&lt;p&gt;サーバサイドエンジニア中心のチーム構成だとフロントライブラリの管理が抜けてしまうことがよくある&lt;/p&gt;
&lt;p&gt;本項では、WebJarsを用いてクライントライブラリを管理する方法を紹介&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dependenciesの追加方法を説明&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;  // https://mvnrepository.com/artifact/org.webjars/webjars-locator-core
  compile group: &apos;org.webjars&apos;, name: &apos;webjars-locator-core&apos;, version: &apos;0.45&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;第6章 API開発&lt;/h2&gt;
&lt;p&gt;金融機関でのAPI公開の動きが急激に加速しているように、APIというキーワードはビジネス領域でもよく目にする用になってきている
システム開発でも迅速に機能をリリースしていくためにはAPI連携は書かせず、API連携の重要度は日に日に高まってきている&lt;/p&gt;
&lt;h3&gt;6.1 Spring でのAPI開発&lt;/h3&gt;
&lt;p&gt;MSA(Micro Service Architecture)開発やSPA開発ではAPI連携が必須
一方小売業界ではオムニチャネルといった言葉が生まれている&lt;/p&gt;
&lt;p&gt;チャネルの違いを意識しないようにするには、バックエンドのサービスをAPI化し、PC/スマホ/他サービスなどの複数のチャネルから透過的に利用できるようにする必要がある&lt;/p&gt;
&lt;h4&gt;API仕様&lt;/h4&gt;
&lt;h4&gt;リソース実装&lt;/h4&gt;
&lt;h4&gt;コントローラ実装&lt;/h4&gt;
&lt;h4&gt;エラーハンドリング実装&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;@RestControllerAdvice&lt;/code&gt;アノテーションを指定して作成&lt;/p&gt;
&lt;h3&gt;6.2 SpringでのAPI連携&lt;/h3&gt;
&lt;p&gt;現在のシステム開発でアジリティを追求するためにはAPI連携は欠かせません&lt;/p&gt;
&lt;h4&gt;RestTemplate&lt;/h4&gt;
&lt;p&gt;SpringではRestTemplateというRESTクライアントを提供している
RestTemplateを用いると、Javaオブジェクトとレスポンスボディの変換も容易に実現できる&lt;/p&gt;
&lt;h4&gt;ユーザー一覧取得APIへの連携&lt;/h4&gt;
&lt;h4&gt;ユーザー作成APIへの連携&lt;/h4&gt;
&lt;h3&gt;6.3 API開発効率の最大化&lt;/h3&gt;
&lt;p&gt;API開発でクライアント側でモックを用意して実装をすすめる必要がある&lt;/p&gt;
&lt;p&gt;API定義をExcelなどのドキュメントで管理し、Excelなどのドキュメントに基づきクライアント側でモックの準備をすすめると、仕様の認識齟齬が発生することが多くなってしまいます。&lt;/p&gt;
&lt;p&gt;またAPIの仕様変更時の連携のオーバーヘッドも大きくなってしまいます。&lt;/p&gt;
&lt;p&gt;本節では、現在の開発での必須要素であるAPI連携をより円滑にすすめるためにAPI管理にSwaggerを用い、API開発の効率を上げる方法を説明&lt;/p&gt;
&lt;h4&gt;Swaggerとは&lt;/h4&gt;
&lt;p&gt;OpenAPI仕様に基づくAPI開発ツールのフレームワークであり、APIのライフサイクル全体に渡って、設計から文書の管理、テストおよびデプロイまでを可能にします。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;大きな利点は以下の４つ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OpenAPI準拠&lt;/li&gt;
&lt;li&gt;YAMLを用いた宣言的な記法&lt;/li&gt;
&lt;li&gt;コード自動生成&lt;/li&gt;
&lt;li&gt;エコシステムの充実（SwaggerHub）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OpenAPI準拠&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;マイクロソフト、Googleなどの大手の企業を含むOpenAPIInitiativeがLinuxFoundationの協力のもとで結成され、APIの記述のために採用したのがSwagger&lt;/li&gt;
&lt;li&gt;API管理のデファクトスタンダードと呼ばれるほど普及している&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;YAMLを用いた宣言的な記法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SwaggerはAPI定義をYAML(JSON)により宣言的に記載できます。&lt;/li&gt;
&lt;li&gt;また、定義したYAMLからSwaggerUIというツールを用いると、HTMLベースの定義書やモックを作成できます。&lt;/li&gt;
&lt;li&gt;SwaggerUIを利用し、APIを公開すると、クライアント側は動く仕様としてAPIを参照できるため、API連詠によるコミュニケーションコストを低下させることができます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コード自動生成&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Swaggerには、Swagger CodegenというSwaggerUIで公開されたAPI仕様を基にコードを自動生成するツールがある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;TODO: Dockerを用いてSwaggerCodegenを用いたスタブサーバーの起動例　確認しておく&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;エコシステムの充実(SwaggerHub)
&lt;ul&gt;
&lt;li&gt;SwaggerCodegenを用いてスタブサーバーを起動し、開発チームで共有する方針も悪くないですが、ホスト環境の管理やAPI仕様の変更の都度、コードの再生成および再起動が必要になります。&lt;/li&gt;
&lt;li&gt;Swaggerはエコシステムも充実しており、SwaggerHubというAPI管理のプラットフォームがあります。&lt;/li&gt;
&lt;li&gt;SwaggerHubはSwaggerを使ったモックサーバーやテスト環境などAPI管理に関するサービスをまとめて提供しているため、APIの管理工数を下げることが可能です。&lt;/li&gt;
&lt;li&gt;SwaggerHubはAPIドキュメントの編集/表示、モックサーバーの立ち上げ、SwaggerCodegenの機能などをブラウザベースで提供しています。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;TODO: SwaggerHubは一回使ってみる必要あり！！！
→お金かかるから断念... チーム開発に有用かも？&lt;/p&gt;
&lt;h4&gt;Springでの利用(SpringFox)&lt;/h4&gt;
&lt;p&gt;SwaggerでのAPI管理がデファクトスタンダードになっていること、Swaggerを利用することのメリットを説明しました。
本項では、SwaggerをSpringで利用する方法を説明します。&lt;/p&gt;
&lt;p&gt;Springでは、SpringFoxを用いるとAPIドキュメントの自動生成が可能
SpringFoxはSwaggerUIの提供もサポートしているため、APIを用いたチーム開発を円滑にすすめることができる
次の手順に従い、SpringFoxの利用方法を説明&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;依存関係の設定&lt;/li&gt;
&lt;li&gt;共通設定カスタマイズ&lt;/li&gt;
&lt;li&gt;個別エンドポイントのカスタマイズ&lt;/li&gt;
&lt;li&gt;静的ドキュメント生成&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;依存関係の設定&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;// https://mvnrepository.com/artifact/io.springfox/springfox-swagger2
compile group: &apos;io.springfox&apos;, name: &apos;springfox-swagger2&apos;, version: &apos;2.9.2&apos;
// https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui
compile group: &apos;io.springfox&apos;, name: &apos;springfox-swagger-ui&apos;, version: &apos;2.9.2&apos;

&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;共通設定カスタマイズ(JavaConfig)&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;@Configuration
@Import({ ThymeleafConfig.class, // Thymeleafを使用することを明示
    GoogleAutoConfiguration.class })
@EnableSwagger2
public class AppConfig implements WebMvcConfigurer {
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;APIControllerのみグルーピングする方法を紹介&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;個別エンドポイントのカスタマイズ&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;アノテーションでAPIごとの説明を追加できる&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;静的ドキュメント生成&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;SwaggerUIを動的に生成する方法は、API連携開発の効率を上げてくれるため、開発フェーズでは導入しておくと効果的&lt;/p&gt;
&lt;p&gt;しかし本番サービス稼働後に上述の手順を有効化しておくと、SwaggerUIの外部公開制御が必要になります&lt;/p&gt;
&lt;p&gt;本項では、別のアプローチとして、SwaggerのAPI定義から静的ドキュメントを生成する方法を紹介&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;依存関係の設定&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;テストクラスの追加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;HTML変換&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;依存関係の設定&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SwaggerからAsciiDocへの変換をサポートしているSwagger2Markupというライブラリがある&lt;/li&gt;
&lt;li&gt;Swagger2MarkupをSpring向けにカスタマイズした、springfox-staticdocsを依存関係に追加する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;テストクラスの追加&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;テストコードを作成し、CIサイクルに含めておくと、静的なドキュメントのAsciiDocが自動生成される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;HTML変換&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTMLへの変換はasciidoctorを利用する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;TODO: HTMLへ変換するCI構築する&lt;/p&gt;
&lt;h4&gt;Spring REST Docs&lt;/h4&gt;
&lt;p&gt;Springでのドキュメント生成の自動化には、Spring REST Docsを採用する方法もある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;利点&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;テストをパスしないドキュメントは作成されないため、「動く仕様書」として信頼できる。&lt;/li&gt;
&lt;li&gt;asciidoctorを用いた簡潔な記法&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;手順&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;依存関係の設定&lt;/li&gt;
&lt;li&gt;雛形生成&lt;/li&gt;
&lt;li&gt;テストコード生成&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第7章 チーム開発&lt;/h2&gt;
&lt;p&gt;システム開発では、１人ですべての作業を簡潔させることはできません。&lt;/p&gt;
&lt;p&gt;最近のシステム開発で主流となってきている機能ごとに分割して開発する手法のMSA(MicroServieceArchitecture)開発でも、５～８人でのチーム開発（Two Pizza Team）が良いとされています。&lt;/p&gt;
&lt;h3&gt;7.1 インフラの構成管理&lt;/h3&gt;
&lt;p&gt;ローカルPC、検証環境、本番環境（オンプレミスもしくはクラウド）など、プログラムは様々な環境で動く可能性があります。&lt;/p&gt;
&lt;p&gt;本節では、特定の環境にロックインされないようにする方法を紹介
旧来のシステム開発では、Excelなどで作成された手順書を用いて、半日～２日かけて開発環境を構築することが当たり前でした
しかし最近では、Infrastracture as Code(IaC)やDockerをはじめとするコンテナ技術が広く普及してきたことにより、上述のような方法を採用することはとても効率的とは言えません&lt;/p&gt;
&lt;h4&gt;Docker&lt;/h4&gt;
&lt;p&gt;「私のローカル環境では再現しません」をなくそう
秘伝のたれ的な作業が影響して、このような環境差異によるトラブルが発生しがち&lt;/p&gt;
&lt;p&gt;コンテナ技術のDockerを用いて、環境構築手順をコード化してGithubなどにコミットし、環境の使い捨てができる状態にしておくことで、上述のようなトラブルを抑制できる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;メリット&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;インフラ構築手順のコード化（Dockerfile）&lt;/li&gt;
&lt;li&gt;環境依存性による問題の排除&lt;/li&gt;
&lt;li&gt;廃棄容易姓&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Column クラウドベースの統合開発環境（AWS Cloud9）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ここ数年、ブラウザのみでコードを記述、実行、デバッグできる統合開発環境の利用が活発化している&lt;/li&gt;
&lt;li&gt;ブラウザベースの統合開発環境の有名なサービスとして、AWS Cloud9がある&lt;/li&gt;
&lt;li&gt;AWS Cloud9を利用すると、開発には非力なマシン（ipadなど）でも、いつでもどこでも開発が可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;インフラ構築手順のコード化（Dockerfile）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;開発に関わる全ての文書は構成管理の対象とすることが望ましい&lt;/li&gt;
&lt;li&gt;チーム開発では、アプリケーションプログラムは必然的に構成管理の対象となりますが、設計文書やインフラ構築手順は構成管理の対象外になってしまうことがある&lt;/li&gt;
&lt;li&gt;インフラ構築手順のコード（Dockerfile）をSCMにコミットすることで、利用しているディストリビューション、設定ファイルの状態がコードで明確化されるため、インフラに関わるトラブルを抑制できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;環境依存性による問題の排除&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;廃棄容易姓&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Column Tweleve-Factor App&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コンテナ開発が活発になってきているのと同時に、クラウドアプリケーション開発のベストプラクティスの１つとして、The Twelve-Factor Appが取り上げ垂れることが多くなってきています。&lt;/li&gt;
&lt;li&gt;The Twelve-Factor Appは、Herokuのプラットフォーム開発での治験をプラクティスに落とし込んだもので、コードベース、依存関係、プロセス、並行性、廃棄容易姓、開発/本番一致などの１２の要素から構成されます。&lt;/li&gt;
&lt;li&gt;アプリケーションをThe Twelve-Factor Appに適用させることができれば、コンテナベースの開発に適用していることになるため、オンプレミス、クラウドなどの実行環境に関わらずアプリケーションをデプロイできます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;TODO: The Twelve-Factor Appについて深堀り&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows10proではHyper-Vを有効化することでDockerを利用できます。&lt;/li&gt;
&lt;li&gt;ここでは、Windows10 Pro以外でDockerを利用する方法を紹介します&lt;/li&gt;
&lt;li&gt;VagrantとVirtualBoxでDocker環境を構築&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;TODO: VagrantとDockerのコマンドについて説明しているので再度理解した上で読んで見る
SpringBootで利用するための設定についても記載があるので組み込んでおく&lt;/p&gt;
&lt;h3&gt;7.2 データベースの構成管理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;データベースの構成管理をするための、OSSのDBマイグレーションツールのFlywayを紹介&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Flywayの利用&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;SpringBootで利用するための設定
&lt;ul&gt;
&lt;li&gt;依存下院系の設定&lt;/li&gt;
&lt;li&gt;プロパティ設定&lt;/li&gt;
&lt;li&gt;マイグレーションファイルの準備&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;7.3 メンテナブルなテストコード&lt;/h3&gt;
&lt;p&gt;テストコードは重要
本節では、GroovyベースのテスティングフレームワークのSpockを用いてテストコードの可読性を上げる方法を紹介&lt;/p&gt;
&lt;h4&gt;Spock&lt;/h4&gt;
&lt;p&gt;言語仕様に、RSpecやScalaなどのよい点を取り入れており、大きく次の３点の利点がある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可読性&lt;/li&gt;
&lt;li&gt;データ駆動テスト&lt;/li&gt;
&lt;li&gt;Power Assertions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;TODO: SpringでのSpockの利用方法を紹介
GroovyやScalaなどをキャッチアップする必要がありそう&lt;/p&gt;
&lt;h3&gt;7.4 ドキュメント生成ツールの活用&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;設計書が適切に管理できていない例&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;詳細設計書がそもそもない&lt;/li&gt;
&lt;li&gt;Textファイル、Excel、Wikiなどにドキュメントが散乱している&lt;/li&gt;
&lt;li&gt;Excelなどで納品ドキュメントとして管理されているが、ソースコードと乖離している、および設計書がないプログラムがある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本節では、チーム開発で共有するドキュメントについて述べる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ドキュメント管理ツールのSphinxを紹介&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Sphinx&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Sphinxはドキュメントを簡単に作ることができるようにするツール&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;セットアップ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pythonを利用しているため、Pythonの実行環境が必要&lt;/li&gt;
&lt;li&gt;Dockerを用いた方法を紹介&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;TODO: 後ほど実施&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sphinxの特徴
&lt;ul&gt;
&lt;li&gt;テキスト(MarkDown)形式&lt;/li&gt;
&lt;li&gt;CIとの相性がよい&lt;/li&gt;
&lt;li&gt;様々な出力形式をサポート&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;7.5 ソースジェネレータ&lt;/h3&gt;
&lt;p&gt;SpringMVCに基づいた画面開発では、１つの機能を追加するために、多岐にわたるファイルの作成が必要
画面開発のたびに発生するファイル作成作業を効率化することで開発生産性を向上させることができる&lt;/p&gt;
&lt;p&gt;通常のプロジェクト開発では多くの画面を開発する必要があり、大規模なプロジェクトだと数百画面もの開発が必要になってくる
プロジェクト開発で必要になってくる画面開発にかかる以下のコストを削減することで、開発生産性をさらに向上させることができる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;開発メンバー参画の際のパッケージ構成のベストプラクティスの共有&lt;/li&gt;
&lt;li&gt;新規画面開発の際の必要なソースコード一式の作成作業&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この方法論は古くから知られており、有名なプロダクトとしては、YEOMANやAngularJSでも同様のツールセットが用意されている
→ AngularCliのことか&lt;/p&gt;
&lt;p&gt;ここでは、Thymeleafを用いて、Gradleのカスタムプラグインとして、ソースジェネレータを作成する方法を紹介&lt;/p&gt;
&lt;h4&gt;ソースジェネレータプラグインの導入&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;次の手順で導入
&lt;ul&gt;
&lt;li&gt;GradlePluginの実装&lt;/li&gt;
&lt;li&gt;GradlePluginの利用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;TODO: 余裕があればソースコード生成の自動化を組めたら&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;メンバー全員に自動生成の仕組みが浸透していない状態で導入すると、ごちゃごちゃするのであまりおすすめできないらしい&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第8章 運用&lt;/h2&gt;
&lt;p&gt;システム開発は、「開発を完了させること」＝「業務やサービスの提供が滞りなく進むこと」ではない
システムは、システムトラブルなどの望まない状態を排除・軽減し、利用者に継続的に使われていくことではじめて価値を生んでいきます。
IPAによると、運用コストはシステム開発の全体の3/4以上のコストを占め、運用の重要性が高まってきている&lt;/p&gt;
&lt;h3&gt;8.1 環境ごとの設定管理&lt;/h3&gt;
&lt;h4&gt;Spring Profiles&lt;/h4&gt;
&lt;p&gt;開発/本番環境の柔軟な切り替え&lt;/p&gt;
&lt;h4&gt;環境ごとの設定管理&lt;/h4&gt;
&lt;p&gt;ファイルを分ける方法を記載→理解しているので飛ばす&lt;/p&gt;
&lt;h3&gt;8.2 アプリケーションサーバー設定&lt;/h3&gt;
&lt;p&gt;本設では、SringBootで提供している組み込み型のWebサーバー（Embedded Web Servers）を配備するサーバーの設定方法を紹介&lt;/p&gt;
&lt;h4&gt;実行可能Jar&lt;/h4&gt;
&lt;p&gt;以下を加えることでビルド時に依存下院系のあるライブラリを梱包したJarを容易に作成できる&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bootJar {
  launchScript()
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;アプリケーションサーバーの設定及びリリース&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;systemdを用いたアプリケーションサーバーの設定&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;TODO:　jarファイルの生成とDocker組み合わせまでできたらやってみる&lt;/p&gt;
&lt;h3&gt;8.3 アプリケーションの状態確認&lt;/h3&gt;
&lt;p&gt;システム開発では、利用者に見える機能開発や画面デザインが優先されてしまい、SLAの検討が後回しになることが少なくありません。&lt;/p&gt;
&lt;p&gt;本設では、SpringBootでのアプリケーションの状態の確認方法について紹介&lt;/p&gt;
&lt;h4&gt;SpringBootActuator&lt;/h4&gt;
&lt;p&gt;SpringBootには、Actuatorという安定運用に寄与する強力な機能があるActuatorを有効にすると、HTTPやJMX経由でアプリケーションの状態を確認でき、自前でヘルスチェックのエンドポイントを実装する必要はなくなる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SpringBootActuatorを有効化する&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;  // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-actuator
  compile group: &apos;org.springframework.boot&apos;, name: &apos;spring-boot-starter-actuator&apos;, version: &apos;2.3.0.RELEASE&apos;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上記の設定だけで、デフォルトではシャットダウンを除く全てのエンドポイントが有効になります&lt;/p&gt;
&lt;h4&gt;主要なエンドポイント&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Beans&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アプリケーションに登録されたBeanの一覧を取得します。Curlでのリクエスト例を紹介&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Environment&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アプリケーションで利用している環境変数の一覧を取得&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Health&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アプリケーションのヘルスチェック。AutoConfigurationの状態をもとにデータベース接続やDiskFullのチェックを実施します&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;HeapDump&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ヒープダンプファイルをHTTPエンドポイントから取得できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mappings&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アプリケーションのエンドポイントとリクエストパスのマッピング情報を出力します。SpringFoxなどを導入しなくてもアプリケーションのエンドポイントの詳細な情報が取得できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Metrics&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アプリケーションの現在の状態を出力&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Thread Dump&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;スレッドダンプを取得します&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Prometheus&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;インフラサービス監視ツールのPrometheusへ連携するメトリクスを出力するエンドポイント&lt;/li&gt;
&lt;li&gt;2018/10現在、Prometheusエンドポイントを有効にするためには、ライブラリを追加する必要があるらしい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Column Prometheusとは&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;サーバーやインフラなどのメトリクスを取得できるOSSの統合監視ソリューション&lt;/li&gt;
&lt;li&gt;Prometheusはインストールや設定が容易で、かつ十分な機能を持ち管理しやすいという特徴を持ちます。&lt;/li&gt;
&lt;li&gt;Go言語で開発されており、バイナリと設定ファイルを用意するだけで利用できる他、Zabbixなどと異なり、データを格納するデータベースを別途用意する必要もありません。&lt;/li&gt;
&lt;li&gt;また、DockerやKubernetesといったコンテナ/クラスター管理ツールとの連携機能もあり、容易に監視対象を設定できるため、マイクロサービス開発を推進している企業での導入が増加&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;エルスチェックのカスタマイズ&lt;/h4&gt;
&lt;p&gt;Actuatorのデフォルトのヘルスチェックも強力ですが、ヘルスチェックをカスタマイズすることも可能&lt;/p&gt;
&lt;p&gt;システム独自のチェックをすることができる&lt;/p&gt;
&lt;p&gt;HealthIndicatorインターフェースを実装するBeanを登録することで実現できる&lt;/p&gt;
&lt;h4&gt;SpringBootActuatorのセキュリティ制御&lt;/h4&gt;
&lt;p&gt;アプリケーションの機密情報を取得できるため、システム管理者以外からのアクセスは遮断する必要がある&lt;/p&gt;
&lt;p&gt;Spring Boot 2系では、/info, /health以外のエンドポイントはデフォルトで認可ありとなります。
認可なしにしつつ、Listenポートの変更及び接続元IPを制限する設定は以下&lt;/p&gt;
&lt;h3&gt;8.4 アプリケーション監視&lt;/h3&gt;
&lt;p&gt;システムを運用していくためには、アプリケーション状態の可視化およびアプリケーション異常を迅速に検知する必要がある&lt;/p&gt;
&lt;p&gt;クラウドを用いた開発が普通（ニューノーマル）となった現在では、監視設計についてもクラウドに適したものにしていく必要があります。
本設では、システム運用に欠かせないアプリケーション監視について、Prometheusを用いる方法を説明&lt;/p&gt;
&lt;h4&gt;Prometheus&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;メリット
&lt;ul&gt;
&lt;li&gt;導入の敷居の低さ&lt;/li&gt;
&lt;li&gt;クラウドネイティブ時代に適した設計&lt;/li&gt;
&lt;li&gt;オープンソース&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;なお、本番環境のトータルの運用コストを見据える場合は、有償の監視サービスのMackerelやDatadogも検討対象にしてみる&lt;/p&gt;
&lt;h4&gt;Prometheusの導入&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;インストール方法は次の３つ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;バイナリのダウンロード&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;ソースビルド&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PrometheusのDownloadページよりターゲットOSのファイルをダウンロードし、展開するだけでインストールは完了&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Prometheusのサービスディスカバリー&lt;/h4&gt;
&lt;p&gt;Prometheusにはサービスディスカバリ機能が備わっており、サービスの拡張に自動で追従します。
例えば、AWS EC2を利用している場合、サーバーの増減に自動で追従します&lt;/p&gt;
&lt;h4&gt;Springアプリケーションとの連携&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;SpringActuatorとPrometheusは連携できる&lt;/li&gt;
&lt;li&gt;設定する方法を記載&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;メトリクスの可視化&lt;/h4&gt;
&lt;p&gt;単体でもメトリクスの可視化はできるが、Grafanaと連携すればより強力にビジュアライズできる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ダウンロード
&lt;ul&gt;
&lt;li&gt;バイナリのダウンロード&lt;/li&gt;
&lt;li&gt;パッケージマネージャインストール&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;アラート通知&lt;/h4&gt;
&lt;p&gt;Prometheusは複数のコンポーネントで構成されており、アラート通知もオプション構成となっている&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;AlertManagerのインストール&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アラート通知を実現するためには、Prometheus本体のPush通知を処理するAlertManagerのインストールが必要&lt;/li&gt;
&lt;li&gt;バイナリファイルをダウンロードして展開する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Slack通知設定&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;本書では、Slack通知の設定方法を説明&lt;/li&gt;
&lt;li&gt;AlertManagerはメール、HipChatなどの連携をデフォルトでサポートしています&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;TODO:　このあたりは見返して設定していきたい&lt;/p&gt;
&lt;h3&gt;8.5 リクエスト追跡&lt;/h3&gt;
&lt;p&gt;本番環境では、可用性要件を考慮の上、アプリケーションサーバーを冗長化することが多く行われます。
また並行性を考慮するとアプリケーションサーバーは状態をNoSQLやRDBに保持させるステートレス構成とし、
スケールアウト及びスケールイン構成とすることも多く行われます。&lt;/p&gt;
&lt;p&gt;アプリケーションが多層で連携する場合、各層でリクエストを処理するサーバーが不定となるため、ユーザーの行動履歴をトレースするためには、リクエスト追跡の仕掛けを導入する必要があります。本節では、リクエスト追跡の方法としてnginxを用いる方法を紹介&lt;/p&gt;
&lt;h4&gt;nginxトレース&lt;/h4&gt;
&lt;p&gt;静的コンテンツ配信の最適化やプロキシ用途でnginxを導入することは多く行われる&lt;/p&gt;
&lt;p&gt;nginxは以下の用に設定すると、リクエストIDがCookieに付与される&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;userid           on;
userid_name      uid;
userid_domain    example.com;
userid_path      /;
userid_expires   365d;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;nginxとのトレースIDの統合&lt;/h4&gt;
&lt;p&gt;前項では、ミドルウェア（nginx）でリクエスト追跡IDを発行する方法を紹介
リクエスト追跡を切れ目なく実現するために、nginxとリクエスト追跡IDの統合の方法を紹介&lt;/p&gt;
&lt;p&gt;リクエスト追跡機能は横断的関心事（cross-cutting concerns）のため、SpringAOPで実装する方針が望ましいと言えます&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;RequestTrackingInterceptor.java&lt;/code&gt;に実装した内容のことを説明していた&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Column ログ集約ソリューション&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;複数台構成のアプリケーションをステートレスにと持つことを望ましい構成とすると、各アプリケーションサーバーにSSH接続してログを確認する方法では運用が大変&lt;/li&gt;
&lt;li&gt;上述の課題に対応するためには、ログ集約の仕組みを導入する方法がよい&lt;/li&gt;
&lt;li&gt;ログ集約のソリューションとしては、商用のSplunk、DatadogやOSSのFluentd、Logs、AzureではLogAnalyticsなどの仕組みがある。アプリケーションを複数台で運用する際はこれらのソリューションの導入も検討してみて&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;TODO: OSSのFluentdは使ってみたい&lt;/p&gt;
&lt;h3&gt;8.6 レイテンシ分析&lt;/h3&gt;
&lt;p&gt;リクエスト追跡が可能な構成で、かつ応答遅延が発生した場合は、ボトルネック箇所を特定し対応を検討する必要がある
また、MSA開発では、多層、多数のサービスが連携するため、サービスのどこがボトルネックであるか特定できる仕組みの導入が望ましいと言えます。&lt;/p&gt;
&lt;p&gt;本節では、SpringエコシステムであるSpringCloudプロジェクトのSpringCloudSleuthを用いてレイテンシ分析する方法を紹介&lt;/p&gt;
&lt;h4&gt;Spring Cloud Sleuth&lt;/h4&gt;
&lt;p&gt;FrontentとBackendで同じIDを出力して処理を追うことができますよっていう説明
RestTemplateを使用する必要があるみたい&lt;/p&gt;
&lt;p&gt;ここでレイテンシが図られる様子
Zipkinで可視化できるみたい&lt;/p&gt;
&lt;h3&gt;8.7 無停止デプロイ&lt;/h3&gt;
&lt;p&gt;BtoCサービス開発の場合、サービスに影響をおよぼさず無停止でアプリケーションをデプロイする必要が多くあります。
特に利用者が多い場合は、必須の要件となります。&lt;/p&gt;
&lt;p&gt;本節では、オンプレミスの条件付きで、無停止でアプリケーションを更新する方法を紹介&lt;/p&gt;
&lt;h4&gt;ローリングデプロイ&lt;/h4&gt;
&lt;h4&gt;ローリングデプロイ作業フロー&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Step1. アプリサーバー#1へのデプロイ
&lt;ul&gt;
&lt;li&gt;プロキシサーバーからアプリサーバー#1へのリクエスト振り分けを停止&lt;/li&gt;
&lt;li&gt;アプリサーバー#1のアプリケーションをデプロイ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;ローリングデプロイ作業手順&lt;/h4&gt;
&lt;p&gt;TODO: nginxの設定ファイルの変更方法も記載しているので後で参考にして設定しておきたい&lt;/p&gt;
&lt;h3&gt;8.8 コンテナオーケストレーションツールへのデプロイ&lt;/h3&gt;
&lt;p&gt;コンテナをデプロイする基盤としてのコンテナオーケストレーションツールは、激しい開発競争が繰り広げられましたが、Kubernetesがデファクトスタンダードとなっている&lt;/p&gt;
&lt;p&gt;本節では、SpringBootアプリケーションを、Dockerコンテナを用い、コンテナオーケストレーションツールのKubernetesを用いてデプロイする方法を紹介&lt;/p&gt;
&lt;h4&gt;コンテナイメージの作成&lt;/h4&gt;
&lt;p&gt;TODO: Kubernetesを使ったコンテナ管理...後でDockerを一通り使い倒した後確認する&lt;/p&gt;
&lt;h2&gt;第9章 （Spring Bootアプリケーションが想定している）システム構成&lt;/h2&gt;
&lt;p&gt;どんなにアプリケーションコードが優れていても、システム・アーキテクチャ設計が適切でないと安定的にサービスを提供できません。本ChapterではSpringBootで作成したアプリケーションを中心とした本番環境のシステム・アーキテクチャ構成について検討します。&lt;/p&gt;
&lt;h3&gt;9.1 システム・アーキテクチャ考察&lt;/h3&gt;
&lt;p&gt;データベースを用いるSpringBootで作成したアプリケーションの場合、１つの仮想サーバーにアプリケーションおよびデータベースを構築することで、最小限の構成によるサービスの提供は可能&lt;/p&gt;
&lt;p&gt;クラウドネイティブが常識となった現在では、クラウドベンダーが提供するマネージドサービスの特性を理解し、適切なアーキテクチャ設計を行う必要があります。&lt;/p&gt;
&lt;h4&gt;システムが必要とする要件&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;要件
&lt;ul&gt;
&lt;li&gt;可用性：稼働率は99.9%以上を目標とすること&lt;/li&gt;
&lt;li&gt;拡張性：スループットの増加に対して、サービスが低下しない性能を維持するための資源の追加が容易に行えること&lt;/li&gt;
&lt;li&gt;完全性：データの操作にはACIDを保証し、データの堅牢性を実現すること&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;システム要件の検討&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;可用性&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;システム構築ではSLAが明記されることが普通&lt;/li&gt;
&lt;li&gt;サービス品質がSLAの保証値を著しく下回った場合には、ペナルティが発生することもあります。&lt;/li&gt;
&lt;li&gt;SLAに可用性99.9%と記載されている場合、数値として年間にして９時間弱、月間にして４４分弱以内の停止しか許さないシステム構成を検討する必要がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;拡張性&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;システム構築では、サービス特性によりシステムへの負荷がばらついたり、突発的な高負荷が発生したりすることがあります。&lt;/li&gt;
&lt;li&gt;可能な限りシステムリソースのスケールアウト及びスケールインできるように設計することが望ましいと言えます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;完全性&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;システム構築では、システムじの状態をRDBなどのデータストアに保管することが普通&lt;/li&gt;
&lt;li&gt;システムで保管した情報資産が正当な権利を持たない人により変更されていないことを確実にしておくよう設計する必要があります。また、データの消失を防ぐための対策も実施していく必要があります&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コスト&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Capter8で解説したように、運用コストはシステム開発全体の3/4以上のコストを締めます。
&lt;ul&gt;
&lt;li&gt;システムリソースの運用コスト（ハードウェアコストやライセンスコストなど）&lt;/li&gt;
&lt;li&gt;システム運用のコスト（人件費など）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;9.2 システム・アーキテクチャ案&lt;/h3&gt;
&lt;p&gt;AWSを利用したアーキテクチャ例を記載している&lt;/p&gt;
&lt;h4&gt;構成要素一覧&lt;/h4&gt;
&lt;h4&gt;可用性&lt;/h4&gt;
&lt;h4&gt;拡張性&lt;/h4&gt;
&lt;h4&gt;コスト&lt;/h4&gt;
&lt;h3&gt;9.3 構築チュートリアル&lt;/h3&gt;
&lt;p&gt;Teraformを利用した環境構築を紹介している&lt;/p&gt;
&lt;h2&gt;第10章 Spring5/Spring Boot2の新機能&lt;/h2&gt;
&lt;p&gt;2017年にリリースされたSpring5,2018年にリリースされたSpringBoot2の新機能のうち、
今後重要になると考えられるWebFluxについて説明&lt;/p&gt;
&lt;h3&gt;10.1 WebFlux&lt;/h3&gt;
&lt;p&gt;HTTPを利用したシステムの範囲が拡大し、同時アクセスが増えていくにつれて、Webアプリケーションにおけるコンピュータリソースに対して待ちが多いことがわかってきました。
そのため非同期処理を用いたWebアプリケーションが求められる様になりました。その解決案の１つとしてリアクティブプログラミングが選ばれ、Srping5/SpringBoot2においてはWebFlux飛ばれるリアクティブプログラミングを用いたWebプログラムを書くことができるようになりました。
このプログラムは同期ではないのでブロックされることなく、実施されてI/O待ちのような状態にはならず、I/Oが発生したタイミングで実施されることになります。&lt;/p&gt;
&lt;p&gt;TODO:　実装ハードル高そう。色々考えること多いので後で見返す&lt;/p&gt;
&lt;h2&gt;第11章 ローカル開発環境の構築について&lt;/h2&gt;
&lt;h2&gt;第12章 サンプルアプリについて&lt;/h2&gt;
</content:encoded></item><item><title>Spring徹底入門</title><link>https://tutttuwi.github.io/posts/2020-05_spring%E5%BE%B9%E5%BA%95%E5%85%A5%E9%96%80/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2020-05_spring%E5%BE%B9%E5%BA%95%E5%85%A5%E9%96%80/</guid><pubDate>Fri, 01 May 2020 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Spring徹底入門&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;目次&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第1章　Spring Frameworkとは&lt;/li&gt;
&lt;li&gt;第2章　Spring Core（DI×AOP）&lt;/li&gt;
&lt;li&gt;第3章　データアクセス（Tx、JDBC）&lt;/li&gt;
&lt;li&gt;第4章　Spring MVC&lt;/li&gt;
&lt;li&gt;第5章　Webアプリケーションの開発&lt;/li&gt;
&lt;li&gt;第6章　RESTful Webサービスの開発&lt;/li&gt;
&lt;li&gt;第7章　Spring MVC の応用&lt;/li&gt;
&lt;li&gt;第8章　Spring Test&lt;/li&gt;
&lt;li&gt;第9章　Spring Security&lt;/li&gt;
&lt;li&gt;第10章　Spring Data JPA&lt;/li&gt;
&lt;li&gt;第11章　Spring ＋ MyBatis&lt;/li&gt;
&lt;li&gt;第12章　Spring＋Thymeleaf&lt;/li&gt;
&lt;li&gt;第13章　Spring Boot&lt;/li&gt;
&lt;li&gt;第14章　チュートリアル&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;形式：書籍&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;発売日：2016年07月20日&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ISBN：9784798142470&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;価格：本体4,000円＋税&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;仕様：B5変・744ページ&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第1章　Spring Frameworkとは&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Spring Frameworkの概要&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;「Spring Frameworkは、開発当初より古いインフラ環境上でも新しいインフラ環境上でも、最新のプログラミング思想で開発出来ることを設計思想にしている」&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Spring Frameworkの歴史&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2003年：Interface21 Framework → Spring Frameworkへと変更になった (Expert One-one-One: J2EE Design and Development)&lt;/li&gt;
&lt;li&gt;2004年：EJBを使わずにSpringFramework1.0で開発する方法&lt;/li&gt;
&lt;li&gt;2005年：SpringFramework1.2 の機能をカバーした書籍が刊行 SpringをStruts,Hibernateと組み合わせて使う（SSH）&lt;/li&gt;
&lt;li&gt;2006年：SpringFramework2.0がリリース&lt;/li&gt;
&lt;li&gt;2007年：SpringFramework2.5 アノテーションベースのDIやMVC
&lt;ul&gt;
&lt;li&gt;米国に拠点を移す SpringToolSuiteなど統合開発環境の提供が始まる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2009年：SpringFramework3.0がリリース JSR330に対応&lt;/li&gt;
&lt;li&gt;2013年：SpringFramework4.0がリリース WebsocketやWebメソッドなどをサポート
&lt;ul&gt;
&lt;li&gt;Pivotalという新しい会社にスピンオフ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2014年：昨今注目されているSpringBootやSpringIOPlatformプロジェクトが始まる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Springの各種プロジェクトについて&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SpringMVC: Webアプリケーションを開発するためのフレームワークであり、MVCパターンを利用している
&lt;ul&gt;
&lt;li&gt;MVCパターンには、「アクションベースフレームワーク」と「コンポーネントベースフレームワーク」の２パターンある
&lt;ul&gt;
&lt;li&gt;アクションベースフレームワーク
&lt;ul&gt;
&lt;li&gt;リクエストによって実行する処理（アクション）を決定し、処理の結果としてレスポンスを返すフレームワーク&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;コンポーネントベースフレームワーク
&lt;ul&gt;
&lt;li&gt;リクエストやレスポンスを抽象化（隠蔽）し、画面を構成するコンポーネントをベースにWebアプリケーションを開発するフレームワーク&lt;/li&gt;
&lt;li&gt;JSFはコンポーネントベースのフレームワーク
&lt;ul&gt;
&lt;li&gt;MEMO: JavaEE徹底入門読んで理解した！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;各種サードパーティとの連携機能もある
&lt;ul&gt;
&lt;li&gt;Jackson&lt;/li&gt;
&lt;li&gt;ApacheTiles&lt;/li&gt;
&lt;li&gt;FreeMarker&lt;/li&gt;
&lt;li&gt;Rome&lt;/li&gt;
&lt;li&gt;JasperReports
&lt;ul&gt;
&lt;li&gt;また、Thymeleafなど、サードパーティ自体がSpringMVCをサポートしているケースも有る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Spring Security&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Authentication(認証)&lt;/li&gt;
&lt;li&gt;Authorization(認可)などのセキュリテイ要件を用意に実現するためのフレームワーク
&lt;ul&gt;
&lt;li&gt;非常に多くの認証方式に対応している
&lt;ul&gt;
&lt;li&gt;Basic認証&lt;/li&gt;
&lt;li&gt;ダイジェスト認証&lt;/li&gt;
&lt;li&gt;X.509クライアント証明証&lt;/li&gt;
&lt;li&gt;LDAP&lt;/li&gt;
&lt;li&gt;OpenID&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Spring Data&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Spring Dataはリレーショナル・データベースやNoSQL、Key-Valueストアなど様々なデータストアへのデータアクセスを用意にするためのもの
&lt;ul&gt;
&lt;li&gt;Spring Data Commons&lt;/li&gt;
&lt;li&gt;Spring Data JPA&lt;/li&gt;
&lt;li&gt;Spring Data MongoDB, Spring Data Redis, Spring Data Solr, etc...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Spring Batch&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;バッチアプリケーション向けの軽量フレームワーク&lt;/li&gt;
&lt;li&gt;大容量のデータ処理に必要な共通機能を提供している&lt;/li&gt;
&lt;li&gt;もともと、Accentureが開発したバッチアプリケーション向けのフレームワークをベースとしており、2008年にSpringBatchとしてバージョン1.0がリリース&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Spring Integration&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enterprise Integration Patterns(EIP)としてよく知られているさまざまなシステム間を連携させるアーキテクチャパターンに基づく開発をサポートするフレームワーク&lt;/li&gt;
&lt;li&gt;同様の機能を実現するOSSとして、ApacheCamelが有名です。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Spring Cloud&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;分散環境でCloud Nativeなアプリケーションを開発するためのフレームワーク及びツール群
&lt;ul&gt;
&lt;li&gt;SpringCloudConfig&lt;/li&gt;
&lt;li&gt;SpringCloudBus&lt;/li&gt;
&lt;li&gt;SpringCloudConnectors&lt;/li&gt;
&lt;li&gt;SpringCloudNetflix&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Spring tool Suite&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Eclipseベースの統合開発環境&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Spring IO Platform&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;依存関係を管理するためのライブラリー&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Spring Boot&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最小限の設定でプロダクションレベルのSpringアプリケーションを容易に開発するためのSpringプロジェクト&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JavaEEとの関係&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;差は縮まっている&lt;/li&gt;
&lt;li&gt;Springのほうが新しい技術を取り込むサイクルが早い&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第2章　Spring Core（DI×AOP）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;DIコンテナメリット&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;インスタンスのスコープを制御できる&lt;/li&gt;
&lt;li&gt;インスタンスのライフサイクルを制御できる&lt;/li&gt;
&lt;li&gt;共通機能を組み込める&lt;/li&gt;
&lt;li&gt;コンポーネント間が疎結合になるため、単体テストがしやすい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SpringFramework以外の有名なDIコンテナのフレームワーク&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CDI(Contexts&amp;amp;DependencyInjection) ：JavaEE6で導入されたコンテキストに対応したDIの仕様&lt;/li&gt;
&lt;li&gt;Google Guice&lt;/li&gt;
&lt;li&gt;Dagger&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ApplicationContextとBean定義&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SpringFrameworkではApplicationContextがDIコンテナの役割を担う
&lt;ul&gt;
&lt;li&gt;DIコンテナに登録するコンポーネントのことを「Bean」&lt;/li&gt;
&lt;li&gt;Configurationのことを「Bean定義」&lt;/li&gt;
&lt;li&gt;DIコンテナからBeanを取得することを「ルックアップ」という&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;UserService userService = context.getBean(UserService.class);
UserService userService = context.getBean(&quot;userService&quot;,UserService.class);
UserService userService = (UserService)context.getBean(&quot;userService&quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;代表的なBean定義の方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JavaベースConfiguration&lt;/li&gt;
&lt;li&gt;XMLベースConfiguration&lt;/li&gt;
&lt;li&gt;アノテーションベースConfiguration&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;それぞれ１つだけを使用して実装もできるが、通常は&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JavaベースConfigurationとアノテーションベースConfigurationの組み合わせ、または&lt;/li&gt;
&lt;li&gt;XMLベースConfigurationとアノテーションベースConfigurationの組み合わせを用いてBean定義を行う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configuration方法&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;javaベース、XMLベース、アノテーションベースの説明&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;インジェクションの種類&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;セッターインジェクション&lt;/li&gt;
&lt;li&gt;コンストラクタインジェクション&lt;/li&gt;
&lt;li&gt;フィールドインジェクション&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;オートワイヤリング&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@Bean&lt;/code&gt;メソッドや&lt;code&gt;&amp;lt;bean&amp;gt;&lt;/code&gt;要素で明示的にBean定義しなくても自動的にＤＩコンテナにインジェクションさせる仕組み&lt;/li&gt;
&lt;li&gt;解決方法は２つ
&lt;ul&gt;
&lt;li&gt;型によるもの（by Type）&lt;/li&gt;
&lt;li&gt;名前によるもの（by Name）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;型による解決&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;デフォルトでインジェクションされる事が必須&lt;/li&gt;
&lt;li&gt;対象の型を持つ&lt;code&gt;Bean&lt;/code&gt;が１つも登録されていないと&lt;code&gt;org.springframework.beans.factory.NoSuchBeanDefinitionException&lt;/code&gt;が発生&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;required = false を指定するか&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Spring4からは、&lt;code&gt;required = false&lt;/code&gt;の代わりに、JavaSE8から導入された、&lt;code&gt;java.util.Optional&lt;/code&gt;を使用することが出来る&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MEMO: &lt;code&gt;Optional&amp;lt;T&amp;gt;&lt;/code&gt;で実装できる！絶対こっちのほうがいい　関数型プログラミングの本で知った。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;名前による解決&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;同じ親クラスを持つ２つの実装クラスに&lt;code&gt;Bean&lt;/code&gt;定義をして、インジェクションする場合&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Qualifier&lt;/code&gt;で名前を指定してあげないといけない&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Primary&lt;/code&gt;を使えば、名前を指定しなかった時にインジェクションされるデフォルトを指定できる&lt;/li&gt;
&lt;li&gt;名前には、実装クラス名を記載するべきではない。呼び出し側で実装を特定してしまうとDIの意味がなくなる。用途名を指定するべき。&lt;/li&gt;
&lt;li&gt;用途は文字列ではなく、アノテーションでも指定できる。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[ ] 用途を指定するためのアノテーション作成してみたい&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[ ] 独自アノテーションを作成してみる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;名前によるオートワイヤリング&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@Resource&lt;/code&gt;を付与&lt;/li&gt;
&lt;li&gt;フィールド名がBean名に一致するパターン&lt;/li&gt;
&lt;li&gt;プロパティ名がBean名に一致するパターン&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コレクションやmap型によるオートワイヤリング&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.1.6 コンポーネントスキャン&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;デフォルトのコンポーネントスキャン&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;以下のアノテーションが付いたクラスがＤＩコンテナに登録される
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@org.springfrwamework.stereotype.Component&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@org.springfrwamework.stereotype.Controller&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@org.springfrwamework.stereotype.Service&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@org.springfrwamework.stereotype.Repository&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@org.springfrwamework.context.annotation.Configuration&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@org.springfrwamework.web.bind.annotation.RestController&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@org.springfrwamework.web.bind.annotation.ControllerAdvice&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@javax.annotation.ManagedBean&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@javax.inject.Named&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コンポーネントスキャンは広範囲な程処理が遅くなるので不適切&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@ComponentScan(basePackages = &quot;com&quot;)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@ComponentScan(basePackages = &quot;com.example&quot;)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;対象のアプリケーションのトップレベル、あるいはもう１階層下をスキャン対象にすべき&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@ComponentScan(basePackages = &quot;com.example.demo&quot;)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@ComponentScan(basePackages = &quot;com.example.demo.app&quot;)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;value属性は basePackages属性の別名であり、どちらを使用しても構いません。この属性を省略した場合、コンフィグレーションクラスと同じパッケージ配下をスキャンすることに注意する事&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;スキャン対象のアノテーションとしては以下の４種類がよく使われる&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;アノテーション&lt;/th&gt;
&lt;th&gt;説明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;@Controller&lt;/td&gt;
&lt;td&gt;MVCパターンのC(Controller)の役割を担うコンポーネントであることを示すアノテーション。このアノテーションを付与したコンポーネントでは、クライアントからのリクエストとクライアントへのレスポンスに関わる処理を実装する。ビジネスロジックは、&lt;code&gt;@Service&lt;/code&gt;を付与したコンポーネントで行う&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;@Service&lt;/td&gt;
&lt;td&gt;ビジネスロジック（ビジネスルール）を提供するコンポーネントであることを示すアノテーション。このアノテーションを付与したコンポーネントでは、ビジネスルールが関わる処理を実装する。データの永続化に関わる処理は&lt;code&gt;@Repository&lt;/code&gt;を付与したコンポーネントで行う。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;@Repository&lt;/td&gt;
&lt;td&gt;データの永続化に悪化÷処理を提供するコンポーネントであることを示すアノテーション。このアノテーションを付与したコンポーネントでは、ORM(Object-Relational Mapper)などの永続化ライブラリ等を使用して、データのCRUD処理を実装する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;@Component&lt;/td&gt;
&lt;td&gt;上記３に当てはまらないコンポーネント（ユーティリティクラスやサポートクラスなど）に付与するアノテーション&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;フィルタを明示したコンポーネントスキャン&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アノテーションによるフィルタ&lt;/li&gt;
&lt;li&gt;代入可能な型によるフィルタ&lt;/li&gt;
&lt;li&gt;正規表現によるフィルタ&lt;/li&gt;
&lt;li&gt;AspectJパターンによるフィルタ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[ ] フィルタを駆使するパターンについてメリットがあまり分からないため飛ばす.. あとで調べる&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.1.7 Beanのスコープ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;DIコンテナを使用するメリット
&lt;ul&gt;
&lt;li&gt;Beanのスコープ（生存期間）の管理をコンテナに任せる事が出来ること&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;スコープ&lt;/th&gt;
&lt;th&gt;説明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;singleton&lt;/td&gt;
&lt;td&gt;DIコンテナの起動時にBeanのインスタンスを生成し、同一のインスタンスを共有して利用する。デフォルトの設定であり、スコープを設定しない場合はsingletonとして扱われる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;prototype&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;session&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;request&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;globalSession&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;application&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;カスタムスコープ(独自の命名)&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;覚書
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@Bean&lt;/code&gt;アノテーションの使いどころ
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@Configuration&lt;/code&gt;クラスの中に定義しているメソッドに付与して使う&lt;/li&gt;
&lt;li&gt;DIコンテナに登録され、デフォルトではsingletonで参照出来る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.1.8 Beanのライフサイクル&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;初期化フェーズ&lt;/li&gt;
&lt;li&gt;利用フェーズ&lt;/li&gt;
&lt;li&gt;終了フェーズ&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2.1.9 Configurationの分割&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;DIコンテナで管理するBeanが多くなるとConfigurationも肥大化してしまう&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configurationの範囲を明確にし、可読性を上げるために、必要に応じてConfigurationの分割を行う&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;@import&lt;/code&gt;を使えば複数のConfigurationクラスに分割ができる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MEMO: importでまとめなくても、&lt;code&gt;@Configuration&lt;/code&gt;でコンポーネントスキャンされるので関係ないと思う&lt;/li&gt;
&lt;li&gt;Contextから取得してわざわざアクセスしていた際に有用な方法だったと考える&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.1.10 Configurationのプロファイル化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Springでは異なる環境や目的ごとにConfigurationをグループ化することができる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;このグループを「プロファイル」といいます。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;例えば、環境ごとに「developmentプロファイル」「testプロファイル」などを作成することが考えられる&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;@Profile&lt;/code&gt;アノテーションを使用して指定する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;使用するプロファイルの選択方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JVM引数 &lt;code&gt;-Dspring.profiles.acrive=production&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;環境変数 &lt;code&gt;export SPRING_PROFILES_ACTIVE=production&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;WEB.xmlに記載することもできる（割愛）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;application.yml&lt;/code&gt; に指定することもできる（割愛）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: 環境ごとの情報を定義するためのJavaクラスにアノテーションを付与して実現するのは微妙だと思うので、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;application.yml&lt;/code&gt;で管理するのが良いだろうと思う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.1.11 JSR 330: Dependency Injection for Java&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Springで、Java標準のJSR330で定められたAPI（主にアノテーション）を使用することができる&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Spring&lt;/th&gt;
&lt;th&gt;JSR&lt;/th&gt;
&lt;th&gt;説明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@Autowired&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@Inject&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@Inject&lt;/code&gt;には必須チェック（required属性）がない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@Component&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@Named&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Springの場合はデフォルトでSingletonスコープであるが、JSR330の場合はデフォルトでprototypeスコープである&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@Qualifier&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@Named&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@Named&lt;/code&gt;が兼用される&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@Scope&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@Scope&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;JSR330の&lt;code&gt;@Scope&lt;/code&gt;はスコープを定義するカスタムアノテーションを作るためのメタアノテーション&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;Springを使うのであれば、特にこだわりがなければ、Springのアノテーションを使うのがいいでしょう&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.2 AOP&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ロギング処理、キャッシュ処理など本質的ではない処理がいろいろなロジック中に散在するようになる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;複数のモジュールにまたがって存在する処理は、「横断的関心事（Cross-Cutting Concern）」と呼ばれる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;代表的なものとしては以下&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;セキュリティ&lt;/li&gt;
&lt;li&gt;ログ出力&lt;/li&gt;
&lt;li&gt;トランザクション&lt;/li&gt;
&lt;li&gt;モニタリング&lt;/li&gt;
&lt;li&gt;キャッシュ&lt;/li&gt;
&lt;li&gt;例外ハンドリング&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;プログラムの中から横断的関心事を取り除き、一箇所に集めることを「横断的関心事の分離（Separation Of Cross-Cutting Concerns）」と呼び&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;これを実現する手法をアスペクト指向プログラミングといいます&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.2.1 AOPの概要&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;AOPはDIと並ぶSpringFrameworkの重要な機能&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AOPのコンセプト&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Aspect
&lt;ul&gt;
&lt;li&gt;AOPの単位となる横断的な関心事を示すモジュールそのもの&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Join Point
&lt;ul&gt;
&lt;li&gt;横断的な関心事を実行するポイント（メソッド実行時や例外スロー時など）&lt;/li&gt;
&lt;li&gt;Join PointはAOPライブラリーによって使用が決められている&lt;/li&gt;
&lt;li&gt;SpringのAOPでは、Join Pointはメソッドの実行時&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Advice
&lt;ul&gt;
&lt;li&gt;特定のJoin Pointで実行されるコードのことで、横断的な関心事を実装する箇所&lt;/li&gt;
&lt;li&gt;Adviceには、Around,Before,Afterなど複数の種類が存在する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;PointCut
&lt;ul&gt;
&lt;li&gt;実行対象のJoin Pointを選択する表現式のこと&lt;/li&gt;
&lt;li&gt;SpringAOPではBean定義ファイルやアノテーションを利用してPointCutを定義&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Weaving
&lt;ul&gt;
&lt;li&gt;アプリケーションコードの適切なポイントにAspectを入れ込む処理のこと&lt;/li&gt;
&lt;li&gt;AOPライブラリにはWeavingをコンパイル時に行うもの、クラスロード時に行うもの、実行時に行うものがあり、SpringAOPは実行時にWeavingを行う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Target
&lt;ul&gt;
&lt;li&gt;AOP処理によって、処理フローが変更されたオブジェクトのこと&lt;/li&gt;
&lt;li&gt;TargetオブジェクトはAdvisedオブジェクトと呼ばれることもある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.2.2 Spring AOP&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;SpringAOP は現場で広く使われているAOPフレームワークであるAspectJを利用している&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.2.3 Adviceの実装方法&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Before&lt;/li&gt;
&lt;li&gt;After Returning&lt;/li&gt;
&lt;li&gt;After Throwing など記載していく&lt;/li&gt;
&lt;li&gt;括弧にPointCut式を記載する&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.2.4 XMLでAdviceの実装&lt;/h3&gt;
&lt;p&gt;XMLに記載する方法について&lt;/p&gt;
&lt;h3&gt;2.2.5 Pointcut式&lt;/h3&gt;
&lt;p&gt;Joint Pointを指すPointCutとして&lt;code&gt;execution(* *..*ServiceImple.*(..))&lt;/code&gt;という式を使ってきたがその打ち合わけを記載&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;                                                ↓メソッド
@After(execution(* com.example.domain.*Service.find*(..)))
                 ↑戻り値　↑パッケージ   ↑型、クラス     ↑引数

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;PointCut式で利用可能なワイルドカード&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;*&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;..&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;+&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;名前付きポイントカットの書き方&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.2.6 Springプロジェクトで利用されているAOP&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;トランザクション管理処理：メソッドに&lt;code&gt;@Transaction&lt;/code&gt;アノテーションを付与&lt;/li&gt;
&lt;li&gt;認可処理：&lt;code&gt;@PreAuthorize&lt;/code&gt;アノテーションを付与&lt;/li&gt;
&lt;li&gt;キャッシュ処理：&lt;code&gt;@Cacheable(&quot;key&quot;)&lt;/code&gt;ですでにキャッシュがある場合はメソッドを実行せずにキャッシュされた値を返す&lt;/li&gt;
&lt;li&gt;非同期処理：&lt;code&gt;@Async&lt;/code&gt;をメソッドに付与、指定された戻り値（&lt;code&gt;CompletableFuture&amp;lt;Result&amp;gt;&lt;/code&gt;）を指定することで非同期実行ができる&lt;/li&gt;
&lt;li&gt;リトライ処理：&lt;code&gt;@Retryable(maxAttempts=3)&lt;/code&gt;をメソッドに付与。信頼性をコントロールできない外部接続先の呼び出しなどで有用&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.3 データバインディングと型変換&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;本来であれば、&lt;code&gt;HttpServletRequestクラス&lt;/code&gt;からパラメータをgetしてBeanに１つ１つ設定しなければ行けないが、&lt;/li&gt;
&lt;li&gt;型変換しなければ行けない場面もあり面倒でミスが起きやすい&lt;/li&gt;
&lt;li&gt;Springのデータバインディングを利用するとこれらの問題を解消できる&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.3.1 Springのデータバインディング&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;EmployeeForm form = new EmployeeForm();
ServletRequestDataBinder dataBinder = new ServletRequestDataBinder(form);
dataBinder.bind(request);
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;これを記載することで、３行でデータバインディングができる&lt;/li&gt;
&lt;li&gt;また、SpringMVCの機能を使えば１行で済む （恐らく、&lt;code&gt;@ModelAttribute&lt;/code&gt;を付与することを言っているのだと思う）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.3.2 Springの型変換&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;型変換を行うための仕組みとして以下の３つを提供している
&lt;ul&gt;
&lt;li&gt;PropertyEditor&lt;/li&gt;
&lt;li&gt;Type Conversion&lt;/li&gt;
&lt;li&gt;Field Formatting&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.4 プロパティ管理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ハードコーディングを避けるためにプロパティから値を読み込む仕組みがある&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Strutsを使用していたときはプロパティファイルの値取得はResourceBundleでUtilクラス経由で取得していたのに対して、&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SpringのDIであれば、&lt;code&gt;@Value(xxxx)&lt;/code&gt;を引数やフィールドに指定するだけで取得できる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: これは必ず使用する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;:で区切って記載すればデフォルト値も指定できる！&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Value(xxxx:5)&lt;/code&gt;などのように&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.5 Spring Expression Language(SpEL)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Spring Expression Language (SpEL)は、SpringFrameworkが提供しているExpression Language&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: 使用しないことにする&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.5.1 SpELのセットアップ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;pom.xmlの例&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
  &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;spring-expression&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.5.2 SpEl APIの利用&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;直接APIを使用するケースはないと思うが、SpELの仕組みを理解するために使用方法を説明&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.5.3 Bean定義でのSpELの利用&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SpELで定義した値をコンストラクタの引数に渡す方法の説明&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;アノテーションの場合は、&lt;code&gt;@Value(&quot;#{T(java.util.UUID).randomUUID().toString()}&quot;) String id&lt;/code&gt;のような形で定義する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SpELは様々なアノテーションの中で利用することができる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@EventListener&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@TransactionalEventListener&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Cacheable&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@CachePut&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;TODO:後で調べる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.5.4 SpELで使用可能な式の表現&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;リテラル値&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;オブエジェクトの生成&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;プロパティへの参照&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メソッドの呼び出し&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;型の解決&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;変数の参照&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Beanの参照&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;演算子&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;テンプレート&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コレクションの操作&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO:テンプレートエンジン使うなら、SpELいらないのは説&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.6 リソースの抽象化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;アプリケーションは様々なリソースにアクセスする必要がある&lt;/li&gt;
&lt;li&gt;これらのリソースが格納されている場所は
&lt;ul&gt;
&lt;li&gt;ファイルシステム上のディレクトリ&lt;/li&gt;
&lt;li&gt;クラスパス上のディレクトリ&lt;/li&gt;
&lt;li&gt;サーブレットコンテナ上のwarファイル&lt;/li&gt;
&lt;li&gt;jarファイル&lt;/li&gt;
&lt;li&gt;別のWebサーバー
&lt;ul&gt;
&lt;li&gt;など多岐に渡る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.6.1 Resourceインターフェースと実装クラス&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Resourceインターフェース実装クラス&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ClassPathResource&lt;/li&gt;
&lt;li&gt;FileSystemResource&lt;/li&gt;
&lt;li&gt;PathResource&lt;/li&gt;
&lt;li&gt;UrlResource&lt;/li&gt;
&lt;li&gt;ServletContextResource&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TODO: Resourceインターフェースを実装しているクラスをいくつか紹介してくれているが、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;実際にこれらのクラスを使ってみる必要あり&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.6.2 ResourceLoaderインターフェース&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;MEMO: ResourceLoaderインターフェースと上記のつながりが理解できてないので再確認
&lt;ul&gt;
&lt;li&gt;ResourceLoader経由のほうがよい？&lt;/li&gt;
&lt;li&gt;上記の実装クラスを使わなくて済むならこっちのほうがよいと考える&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.6.3 Resourceインターフェースを利用したリソースアクセス&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;TODO: 実際に使ってみる必要あり&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.6.4 XMLファイル上でのリソースの指定&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;割愛&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: リソース取得先の指定はプロパティファイルにまとめるべき！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;すべて&lt;code&gt;@Value()&lt;/code&gt;で記載すればよい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.7 メッセージ管理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;説明文や項目名などの固定文言&lt;/li&gt;
&lt;li&gt;処理結果に通知するメッセージ&lt;/li&gt;
&lt;li&gt;エラーメッセージなどを表示する際に&lt;/li&gt;
&lt;li&gt;プロパティファイルなどの外部定義から取得することが求められるケースも多いはず&lt;/li&gt;
&lt;li&gt;メッセージの外部化のメリット
&lt;ul&gt;
&lt;li&gt;多言語サポートする要件を満たす&lt;/li&gt;
&lt;li&gt;一箇所で一元管理する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.7.1 MessageSourceインターフェースと実装クラス&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;MessageSource&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;メッセージの格納先を抽象化するためのインターフェース&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MessageSourceResolvable&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;メッセージ解決に必要な値（code,args,defaultMessage）を保持していることを示すインターフェース&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MessageSourceの実装クラス&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ResourceBundleMessageSource&lt;/li&gt;
&lt;li&gt;ReloadableResourceBundleMessageSource&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.7.2 MessageSourceの利用&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;MessageSourceのBean定義&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;@Bean
public MessageSource messageSource() {
  ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
  messageSource.setBeannames(&quot;messages&quot;); // クラスパス上に格納されているプロパティファイル（拡張子は除く）を指定する
  return messageSource;
}

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;メッセージの定義ファイルを作成&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MessageSourceのAPI利用&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DIコンテナに登録したMessageSourceをインジェクションして&lt;code&gt;getMessage&lt;/code&gt;メソッドを呼び出す&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: 感じたこと&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;標準のクラスをDIコンテナで管理したい場合&lt;code&gt;@Bean&lt;/code&gt;をメソッドにつけているのかなと思った&lt;/li&gt;
&lt;li&gt;独自のクラスを作るのであれば、&lt;code&gt;@Component&lt;/code&gt;でよいのではと&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MessageSourceResolvableの利用&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;メッセージ引数もメッセージ定義で管理したい場合に利用するみたい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第3章　データアクセス（Tx、JDBC）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;データアクセス機能について解説
&lt;ul&gt;
&lt;li&gt;JDBC関連の機能&lt;/li&gt;
&lt;li&gt;トランザクション管理機能&lt;/li&gt;
&lt;li&gt;データアクセスエラーのハンドリング機能&lt;/li&gt;
&lt;li&gt;その他ライブラリの機能（JPA、Hivernate、MyBatisといったORM）は以降の章で解説&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.1 Springによるデータアクセス&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;まずはSpringが扱うことができるデータソースの種類について&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.1.1 データソースについて&lt;/h3&gt;
&lt;p&gt;データソースは、データベースにアクセスするためのコネクションをアプリケーションに提供する役割を担う&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Springが提供するデータベースアクセス機能では、以下に示す３つのデータソースを利用することができる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アプリケーション内に定義したデータソース
&lt;ul&gt;
&lt;li&gt;アプリ内にユーザや接続情報などを記載するパターン&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;アプリケーションサーバーに定義したデータソース
&lt;ul&gt;
&lt;li&gt;APサーバーに定義されたデータソースを利用するパターン
&lt;ul&gt;
&lt;li&gt;MEMO: JavaEE徹底入門ではこのパターンでサンプル実装されていた&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;組み込みデータベースのデータソース
&lt;ul&gt;
&lt;li&gt;HSQLDB、H2、Apache Derbyといった組み込みデータベースをデータソースとして利用する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: Commons DBCP はコネクションプール機能付きのデータソースを提供するライブラリー&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;実際に定義を作成していく際に、コネクションプール設定方法について確認しておく&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.1.2 データソースのコンフィギュレーション&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-jdbc&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;5.2.3.RELEASE&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;アプリケーション定義のデータソース&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アノテーション定義の例（詳細略）&lt;/li&gt;
&lt;li&gt;XML定義の例（詳細略）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;アプリケーションサーバー定義のデータソース&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Jndiを指定して参照する（詳細略）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;組み込みデータソース&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;（詳細略）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TODO: 実際に上記の３種類で接続をしてみる必要がある&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.2 Spring JDBC&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;前節ではSpring JDBCを使用するために必要となるデータソースのBean定義方法を紹介した&lt;/li&gt;
&lt;li&gt;データアクセス処理を記述するための中心的な役割を持つJdbcTempleteクラスの使用方法を紹介
&lt;ul&gt;
&lt;li&gt;SQLを実行する方法&lt;/li&gt;
&lt;li&gt;SQLへ値をバインドする方法&lt;/li&gt;
&lt;li&gt;SQLの実行結果からデータを取得する方法&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.2.1 Spring JDBCとは&lt;/h3&gt;
&lt;p&gt;SQLの内容にかかわらす共通に行われる定型的なJDBCの処理をSpringが代替する機能&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;定型的な処理
&lt;ul&gt;
&lt;li&gt;コネクションのオープンやクローズ&lt;/li&gt;
&lt;li&gt;SQLステートメントの実行&lt;/li&gt;
&lt;li&gt;処理結果行の繰り返し処理&lt;/li&gt;
&lt;li&gt;例外ハンドリング&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SpringJDBCを利用することで、実装範囲を以下のような重要な処理に限定できる
&lt;ul&gt;
&lt;li&gt;SQLの定義&lt;/li&gt;
&lt;li&gt;パラメータの設定&lt;/li&gt;
&lt;li&gt;ResultSetの取得結果において、各レコードに対して実行したい処理&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.2.2 JdbcTempleteクラスを利用したCRUD操作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;JdbcTempleteクラスを用いたCRUD操作の説明&lt;/li&gt;
&lt;li&gt;MEMO: ORMを使用したほうが効率が良さそう
&lt;ul&gt;
&lt;li&gt;念の為読んでおく程度で、覚えておかなくても良いと考える&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.2.3 取得結果の変換処理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SpringJDBCでは取得結果を変換できる３つのインターフェースを用意している&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;RowMapper&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;ResultSetの１行を特定のPOJOインスタンスに変換する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ResultSetExtractor&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;複数行から１つのインスタンスを生成できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RowCallbackHandler&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;ResultSetを参照してなんらかの処理を行うためのインターフェース&lt;/li&gt;
&lt;li&gt;戻り値を返さない。取得結果のファイル出力や、データのチェックなどを行う場合に利用します。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RowMapperの実装方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RowMapperインターフェースを実装したクラスにメソッドを作成して使用する&lt;/li&gt;
&lt;li&gt;BeanPropertyRowMapperクラスを利用することもできる
&lt;ul&gt;
&lt;li&gt;制約はありルールに沿ってBean定義すればかんたんにResultSetを設定可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ResultSetExtractorの実装&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;割愛&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RowCallbackHandlerの実装&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;割愛&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.2.4 応用的なCRUD操作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;SQLのバッチ実行
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;batchUpdate()&lt;/code&gt;メソッドを利用する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ストアドプロシージャの呼び出し
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;JdbcTemplate&lt;/code&gt;の&lt;code&gt;call&lt;/code&gt;メソッドや&lt;code&gt;execute&lt;/code&gt;メソッドを利用することで呼び出すことができる&lt;/li&gt;
&lt;li&gt;TODO: ストアド・プロシージャ使ってみる。使ったことないので。。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.3 トランザクション管理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;アノテーションを用いたトランザクション管理方法&lt;/li&gt;
&lt;li&gt;プログラム内に直接commitメソッドやrollbackメソッドを記述する明示的なトランザクション管理について説明&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.3.1 トランザクションマネージャ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;PlatformTransactionManager&lt;/code&gt;: Springのトランザクション管理の中心となるインターフェース&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;トランザクションマネージャの定義&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;PlatformTransactionManager&lt;/code&gt;のBeanを定義する&lt;/li&gt;
&lt;li&gt;トランザクション対象とするメソッドを定義する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ローカルトランザクションを利用する場合&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;単一データベースに対する複数の操作&lt;/li&gt;
&lt;li&gt;XMLにTransactionManagerの定義を記載する方法を紹介&lt;/li&gt;
&lt;li&gt;BeanIDは&lt;code&gt;transactionManager&lt;/code&gt;を指定することを推奨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;グローバルトランザクションを利用する場合&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;異なるデータベースに対する複数の操作&lt;/li&gt;
&lt;li&gt;グローバルトランザクションの仕組みはJTAというJavaEEの仕様として標準化されておりアプリケーション・サーバーからJTAの仕組みが提供されている&lt;/li&gt;
&lt;li&gt;実装クラスとして&lt;code&gt;JtaTransactionManager&lt;/code&gt;を使用する&lt;/li&gt;
&lt;li&gt;ただし、製品ごとの&lt;code&gt;JtaTransactionManager&lt;/code&gt;が提供されているのでそちらを使う 自動的に最適なクラスを使う仕組みが用意されているらしい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.3.2 宣言的トランザクション&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;宣言的トランザクションとは&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;事前に宣言されたルールに従い、トランザクションを制御する方法のこと&lt;/li&gt;
&lt;li&gt;メリット
&lt;ul&gt;
&lt;li&gt;トランザクションの開始やコミット、ロールバックなどの典型的な処理をビジネスロジックの中に記述する必要がなくなる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;利用方法
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@Transactional&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;XMLコンフィギュレーション&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;@Transactional&lt;/code&gt;を利用した宣言的トランザクション&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;トランザクション制御で必要となる情報&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アノテーションの引数について説明（割愛）&lt;/li&gt;
&lt;li&gt;クラスに付与するかメソッドに付与するか&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コンフィギュレーションクラスに定義する方法も紹介している&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;XMLコンフィギュレーションによる宣言的トランザクション&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;割愛&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.3.3 明示的トランザクション&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;明示的トランザクションとは&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コミットやロールバックといったトランザクション制御に関する処理をソースコードに明示的に記述する方法&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;PlatformTransactionManager&lt;/code&gt;を利用した明示的トランザクション制御&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;commit(),rollback()などを直接書く&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;TransactionTemplete&lt;/code&gt;を利用した明示的トランザクション制御&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;@ConfigurationクラスにBean定義する際にトランザクションを設定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: 明示的トランザクションはどちらも使いにくいような印象&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.3.4 トランザクションの分離レベルと伝播レベル&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;TODO: ★見返して実装に組み込む&lt;/li&gt;
&lt;li&gt;トランザクション分離レベル
&lt;ul&gt;
&lt;li&gt;TODO: トランザクション分離レベルについて復習すべし&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;トランザクション伝播レベル
&lt;ul&gt;
&lt;li&gt;MEMO: 伝播レベルについて意識したことはなかった&lt;/li&gt;
&lt;li&gt;トランザクション処理が入れ子になったときに初めて意識することになる。&lt;/li&gt;
&lt;li&gt;通常の処理の場合はデフォルトの&lt;code&gt;Required&lt;/code&gt;で問題ないような気がする。&lt;/li&gt;
&lt;li&gt;TODO: 逆に入れ子にするパターンってどのような要件が考えられるか確認する
&lt;ul&gt;
&lt;li&gt;→本書に解説があった。
&lt;ul&gt;
&lt;li&gt;業務ロジックのトランザクションとは別に、ログ出力用の処理でDBアクセスがある場合&lt;/li&gt;
&lt;li&gt;業務ロジックでロールバックが発生すると、ログ出力用のデータもロールバックされてしまう。&lt;/li&gt;
&lt;li&gt;こうならないように、ログ出力用のトランザクションは&lt;code&gt;REQUIRES_NEW&lt;/code&gt;で生成しておく必要があるとのこと&lt;/li&gt;
&lt;li&gt;そもそもDBにログを貯める仕様が良くないのではと思う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.4 データアクセスエラーのハンドリング&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;データアクセス処理でエラーが発生した際のハンドリング処理を実装しておく必要がある&lt;/li&gt;
&lt;li&gt;Springにおけるデータアクセス例外の抽象化の考えかたを理解した上で、エラーハンドリング処理の実装方法や抽象化のカスタマイズ方法を紹介&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.4.1 Springが提供するデータアクセス例外&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;DataAccessExceptionを親クラスとするデータアクセス例外の階層構造&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MEMO: かなり多くの種類のエラーが、&lt;code&gt;DataAccessException&lt;/code&gt;から切られていることを確認した&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;非検査例外によるDataAccessExceptionの実装&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DataAccessExceptionはRuntimeExceptionが親クラスなので、例外ハンドリングが強制されてませんよという説明&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;実装を隠蔽したデータアクセス例外&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DBごとに例外コードが異なるが、Springのデータアクセス機能で共通の例外クラスに変換している&lt;/li&gt;
&lt;li&gt;MEMO: これは画期的ですごい便利だと感じた→当たり前でもあるか..&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.4.2 データアクセス例外のハンドリング&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;非検査例外のため、ハンドリングを行いたい場所だけcatchする、行いたくない場所は何もする必要が無い&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;データアクセス例外のハンドリングを行う実装例&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Springが提供している例外でcatchできるようにtry-catchで囲む&lt;/li&gt;
&lt;li&gt;catch後は、プロジェクトの例外を再throwする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.4.3 データアクセス例外の変換ルールのカスタマイズ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;各データベースのエラーコードとデータアクセス例外の対応はspring-jdbc-xxx.jarに含まれるsql-error-codes.xmlに定義されているが、クラスパス直下にsql-error-codes.xmlを配置することでこの定義をカスタマイズすることができる&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第4章　Spring MVC&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;第三章までで得た知識で開発できるのは、データベースにアクセスするスタンドアロンアプリケーション&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本章から７章までにかけて、SpringMVCの機能を利用したWebアプリケーションの開発方法について解説&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本章&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SpringMVCの特徴を簡単に説明&lt;/li&gt;
&lt;li&gt;シンプルなサンプルアプリケーションを作成しながらSpringMVCの基礎を学ぶ&lt;/li&gt;
&lt;li&gt;SpringMVCのアーキテクチャについて説明&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.1 Spring MVC とは&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;フレームワークのアーキテクチャとしてMVCパターンを採用している
&lt;ul&gt;
&lt;li&gt;TODO: MVC以外のアーキテクチャについて理解を深める&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Springは正確に言うと、フロントコントローラパターンを採用しているらしい詳細は4.3SpringMVCのアーキテクチャで解説&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.1.1 Webアプリケーション開発における特徴&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SpringMVCはWebアプリケーションをストレスなく快適に開発することができるフレームワークで、次のような特徴がある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;POJO（Plain Old Java Object）での実装
&lt;ul&gt;
&lt;li&gt;フレームワーク独自のインターフェースを実装する必要が無いため、作成するクラスの単体テストのテスタビリティを確保&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;アノテーションを使用した定義情報の指定&lt;/li&gt;
&lt;li&gt;柔軟なメソッドシグネチャの定義
&lt;ul&gt;
&lt;li&gt;Controllerに渡す引数や戻り値も様々な形がサポートされている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ServletAPIの抽象化
&lt;ul&gt;
&lt;li&gt;ServletAPI（HttpServletRequest,HttpServletResponse,HttpSessionなどのAPI）を抽象化する仕組みを提供&lt;/li&gt;
&lt;li&gt;テスタビリティを確保&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Viewの実装技術の抽象化
&lt;ul&gt;
&lt;li&gt;コントローラはView名（Viewの論理名）を返却し、SpringMVCのフレームワーク処理が呼び出すViewを決定&lt;/li&gt;
&lt;li&gt;ControllerはViewの実装技術（Thymeleaf,ServletAPI,FreeMarkerなど）を意識する必要がなくなる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SpringのDIコンテナとの連携
&lt;ul&gt;
&lt;li&gt;SpringMVCはSpringのDIコンテナ上で動作するフレームワーク&lt;/li&gt;
&lt;li&gt;DIやAOPなどの仕組みを活用できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: この辺は開発で感触をつかめているのですんなり理解できた&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.1.2 MVCフレームワークとしての特徴&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;豊富な拡張ポイントの提供&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;処理の役割に応じてインターフェースを定義している&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;エンタープライズアプリケーション向けの機能の提供&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;メッセージ管理&lt;/li&gt;
&lt;li&gt;セッション管理&lt;/li&gt;
&lt;li&gt;国際化&lt;/li&gt;
&lt;li&gt;ファイルアップロードといったエンタープライズアプリケーション向けのWebアプリケーションを開発する際に必要となる機能も提供&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;サードパーティのライブラリとの連携部品の提供&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;★Jackson(JSON/XML操作) → JSON操作は他に、org.jsonがあるみたいだが、Jacksonの方が良さそう&lt;/li&gt;
&lt;li&gt;Apache Tiles(レイアウトエンジン) → レイアウトを組める。Thymeleafのincludeで十分なので使わない&lt;/li&gt;
&lt;li&gt;FreeMarker(テンプレートエンジン) → 変数を持つ定型文言を作成しておき（*.ftlファイル）&lt;/li&gt;
&lt;li&gt;★Rome(RSS/Feed操作) → 他に、Informaというのがあるらしい。&lt;/li&gt;
&lt;li&gt;★JsperReports(帳票出力) → 他にも色々なライブラリがあるみたいだが、一旦これを使用したい
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://weblabo.oscasierra.net/java-pdf-lib-2017/&quot;&gt;https://weblabo.oscasierra.net/java-pdf-lib-2017/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;★Apache POI(Excel操作)&lt;/li&gt;
&lt;li&gt;★Hibernate Validator(Bean Validation)&lt;/li&gt;
&lt;li&gt;Joda Time(日付操作) → Java7時代の日付操作&lt;/li&gt;
&lt;li&gt;など&lt;/li&gt;
&lt;li&gt;サードパーティ自体がSpringMVCとの連携部品を提供しているケースもある。
&lt;ul&gt;
&lt;li&gt;Thymeleaf(テンプレートエンジン)&lt;/li&gt;
&lt;li&gt;★HDIV(セキュリティ強化)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TODO: ★つけたライブラリーは使用したい&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.2 はじめてのSpring MVCアプリケーション&lt;/h3&gt;
&lt;h3&gt;4.2.1 開発プロジェクトの作成&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;InteliJ IDEA でプロジェクトを作成することにした&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mavenプロジェクトをstartarのアーキタイプで作成&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pom.xmlをサンプルアプリに合わせる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;mavenがうまく動かない不具合発生&lt;/li&gt;
&lt;li&gt;原因: urlがmavenレポジトリを向いていなかったため
&lt;ul&gt;
&lt;li&gt;結果: 解消しなかった&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Intelijだとうまくいかないと判断し、Eclipseで実施&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Eclipseでサンプルプログラムを配置&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mavenの設定をサンプルに合わせる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;javaeeのモジュールがデフォルトで読み込めなくなったみたいなので、pomに定義を入れる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;tomcat9サーバーを立ち上げる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;context-pathはデフォルトでプロジェクト名？になるみたいなので、&lt;code&gt;http://localhost:8080/firstapp4-2&lt;/code&gt;でアクセスするとうまく行った&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Web.xmlに&lt;code&gt;jsp-config&lt;/code&gt;というものを定義すると、すべてのjspに対してデフォルトでincludeさせることができるみたい&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TODO: spring bootで生成したプロジェクトだと、web.xmlが必要ない？ そのあたりの仕組みが理解できていない&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.2.2 Spring MVCの適用&lt;/h3&gt;
&lt;h3&gt;4.2.3 トップ画面表示処理の実装&lt;/h3&gt;
&lt;h3&gt;4.2.4 入力画面表示処理の実装&lt;/h3&gt;
&lt;h3&gt;4.2.5 送信処理の実装&lt;/h3&gt;
&lt;h3&gt;4.2.6 入力チェック処理の実装&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ここまででサンプルアプリケーションの説明終了&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Controllerクラス&lt;/li&gt;
&lt;li&gt;フォームクラス&lt;/li&gt;
&lt;li&gt;View(JSPなどのテンプレートファイル)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本来であれば、JSPではなくThymeleafとかを使うべきだと思うので、詳細な実装はサラッと流し読み&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.2.7 XMLファイルを使用したBean定義&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;割愛&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.3 Spring MVCのアーキテクチャ&lt;/h3&gt;
&lt;h3&gt;4.3.1 フレームワークのアーキテクチャ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Spring MVCは「フロントコントローラパターン」と呼ばれるアーキテクチャを採用している&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;クライアントからのリクエストをフロントコントローラと呼ばれるコンポーネントが受け取り、リクエストの内容に応じて実行するHandler(Controller)を選択するアーキテクチャ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;フロントコントローラが担う処理&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;クライアントからのリクエストの受付&lt;/li&gt;
&lt;li&gt;リクエストデータのJavaオブジェクトへの変換&lt;/li&gt;
&lt;li&gt;入力チェックの実行（Bean Validation）&lt;/li&gt;
&lt;li&gt;Handlerの呼び出し&lt;/li&gt;
&lt;li&gt;Viewの解決&lt;/li&gt;
&lt;li&gt;クライアントへのレスポンスデータの応答&lt;/li&gt;
&lt;li&gt;例外ハンドリング&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TODO: Springフレームワークの全体を把握したときにもう一度見直す&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第5章　Webアプリケーションの開発&lt;/h2&gt;
&lt;h3&gt;5.1 Webアプリケーションの種類&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SpringMVCは大きく分けて以下の２種類のアプリケーションを作成するための機能を提供&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;画面を応答するアプリケーション&lt;/li&gt;
&lt;li&gt;データのみを応答するアプリケーション（RESTful Webサービス）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メモ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SpringMVCの仕組みは使用していないが、Spring4.0よりWebSocketの連携モジュールが提供されている&lt;/li&gt;
&lt;li&gt;フロントとサーバーサイドの双方向通信用&lt;/li&gt;
&lt;li&gt;TODO: 使ってみる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hamdlerメソッド作成&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@RequestMapping()&lt;/code&gt;は使用せずに、&lt;code&gt;@GetMapping()&lt;/code&gt;を使用する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Handlerメソッドの引数に指定可能な型、アノテーションを紹介&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TODO: 再度確認する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;暗黙的な引数の解決！覚えておく&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;引数の型がStringやIntegerといったシンプル型の場合、引数名に一致するリクエストパラメータの値を取得&lt;/li&gt;
&lt;li&gt;引数の方がJavaBeansだった場合、デフォルトの属性名に一致するオブジェクトをModelから取得する
&lt;ul&gt;
&lt;li&gt;該当するオブジェクトがModelに存在しない場合、デフォルトコンストラクタを呼び出して新しいオブジェクトを生成&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ServletAPI(HttpServletRequest,HttpServletResponse,HttpSession,Partなど)や低レベルのJavaAPI(InputStream,Reader,OutputStream, Writer,Map)なども指定できるが、これらのAPIを自由に使うとメンテナンス性を低下させる可能性があるので、使用しないようにする必要がある&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TODO: コーディング規約として利用を制限していくべき！&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.3.5 Handlerメソッドの戻り値&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Handlerメソッドは戻り値として様々なオブジェクトを返却できる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メモ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;返却できるオブジェクトは&lt;code&gt;org.springframework.web.method.support.HandlerMethodReturnValueHandler&lt;/code&gt;インターフェースの実装クラスを作成することで拡張できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SpringMVCがサポートしている主な型&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;java.lang.String&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Model&lt;/li&gt;
&lt;li&gt;ModelAndView&lt;/li&gt;
&lt;li&gt;void&lt;/li&gt;
&lt;li&gt;ResponseEntity&amp;lt;?&amp;gt;&lt;/li&gt;
&lt;li&gt;HttpHeaders&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.3.6 View Controllerの利用&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Viewを呼び出すだけであれば、SpringMVCが提供しているViewControllerの仕組みを利用することができる&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.4 リクエストマッピング&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;@RequestMapping&lt;/code&gt;の属性値を使ってリクエストマッピングの条件を指定する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;指定可能な属性&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;value&lt;/li&gt;
&lt;li&gt;path&lt;/li&gt;
&lt;li&gt;method&lt;/li&gt;
&lt;li&gt;params&lt;/li&gt;
&lt;li&gt;headers: リクエストヘッダー&lt;/li&gt;
&lt;li&gt;consumes: Content-Typeヘッダー&lt;/li&gt;
&lt;li&gt;produces: Acceptヘッダー&lt;/li&gt;
&lt;li&gt;name&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;value,pathは複数指定することができる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;or条件として扱われる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;パスパターンの使用&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;URIテンプレート形式のパスパターン&lt;/li&gt;
&lt;li&gt;正規表現も使える&lt;/li&gt;
&lt;li&gt;Antスタイルのパスパターン&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;paramsはメソッドが実行される条件としてパラメータの有無も入る&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.5 リクエストデータの取得&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;種類
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@PathVariable&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@RequestParam&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@RequestHeader&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;リクエストパラメータ値の一括取得&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.5.4 コンパイルオプションの注意点&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@PathVariable&lt;/code&gt;,&lt;code&gt;@RequestParam&lt;/code&gt;,&lt;code&gt;@RequestHeader&lt;/code&gt;,&lt;code&gt;@CookieValue&lt;/code&gt;のvalue属性を省略する場合、&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-g&lt;/code&gt;オプションまたはJavaSE8から追加された&lt;code&gt;-parameters&lt;/code&gt;オプションのどちらかのコンパイルオプションを有効にしておく必要がある
&lt;ul&gt;
&lt;li&gt;TODO: バインドされないとき確認&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.5.7 アノテーションを使用したフォーマットの指定&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;@org.springframework.format.annotation.DateTimeFormat&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;@org.springframework.format.annotation.NumberFormat&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JSR354 : Money and Currency APIというものがあるらしい&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TODO: 後で確認する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.6 フォームクラスの実装&lt;/h3&gt;
&lt;h4&gt;5.6.1 フォームオブジェクトのスコープ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;スコープの種類&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;リクエストスコープ&lt;/li&gt;
&lt;li&gt;フラッシュスコープ：PRGパターンのリクエスト間でオブジェクトを共有するためのスコープ&lt;/li&gt;
&lt;li&gt;セッションスコープ：HttpSessionに格納され、明示的に破棄するまで残り続ける&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;フラッシュスコープ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;RedirectAttributes&lt;/code&gt;の&lt;code&gt;addFlashAttribute()&lt;/code&gt;メソッドを使用して詰める&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;@RequestMapping(path = &quot;create&quot;, method = RequestMethod.POST)
public String create(
  @Validated AccountCreateForm form, BindingResult result,
  RedirectAttributes redirectAttributes) {
    redirectAttributes.addFlashAttribute(form);
    return &quot;redirect:/account/create?complete&quot;;
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;5.6.2 フォームクラスの作成&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;@Data
public class LoginFormRequestDto implements Serializable {
  private static final long serialVersionUID = 1L;
  private String id;
  private String password;
}

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Serializableインターフェスを実装しておく。これが必要なのはオブジェクトをセッションスコープで管理する場合だが、スコープに関係なく定義しておくのが無難&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.7 入力チェック&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;SpringMVCではBeanValidationの仕組みを利用して、リクエストパラメータ値がバインドされたフォームクラス（またはコマンドクラス）に対して入力チェックを行う&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.7.1 入力チェックの有効化&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;入力チェックを行う場合、
&lt;ul&gt;
&lt;li&gt;入力チェックを行うメソッドの引数にフォームクラスを定義して、
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@org.springframework.validation.annotation.Validated&lt;/code&gt;または&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@org.springframework.validation.annotation.Valid&lt;/code&gt; を指定する
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@Validated&lt;/code&gt;を使用すると、BeanValidationのバリデーショングループの仕組みが使用できるらしい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.7.2 入力チェック結果の判定&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;BindingResultで処理する&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.7.3 未入力の扱い&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;未入力は許容するが、入力された場合は６文字移譲であること&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;という要件をBeanValidation標準アノテーションを使用して満たすことができない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;この場合は、Springが提供している&lt;code&gt;org.springframework.beans.propertyeditors.StringTrimerEditor&lt;/code&gt;を使用することを検討&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TODO: 普通に独自アノテーションを作成した方がシンプルなような気がする&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.7.5 ネスト下JavaBeansの入力チェック&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ネストしたJavaBeansやコレクション内のJavaBeansに定義したプロパティに対して入力チェックを行いたい場合は、&lt;code&gt;@Valid&lt;/code&gt;を指定する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;チェック対象とすることを明示する必要がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;@Valid&lt;/code&gt;と&lt;code&gt;@Validated&lt;/code&gt;の違い&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://moondream.hatenablog.com/entry/20131006/1381031027&quot;&gt;http://moondream.hatenablog.com/entry/20131006/1381031027&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.7.6 入力チェックルールの追加&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;独自の入力チェックツール追加方法２つ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;既成ルールを合成して作成する方法&lt;/li&gt;
&lt;li&gt;独自のバリデータを実装して作成する方法&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;既成ルールを合成して作成する方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;→こっちは使った方がよい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import javax.validation.Constraint;
import javax.validation.Payload;
import javax.validation.ReportAsSingleViolation;
import javax.validation.constraints.Pattern;

@Documented
@Constraint(validatedBy = {})
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@ReportAsSingleViolation
@Pattern(regexp = &quot;[a-zA-Z0-9]*&quot;)
public @interface AlphaNumeric {

  String message() default &quot;{validation.AlphaNumeric.message}&quot;;
  Class&amp;lt;?&amp;gt;[] groups() default {};
  Class&amp;lt;? extends Payload&amp;gt;[] payload() default {};

  @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
  @Retention(RUNTIME)
  @Documented
  public @interface List {
    AlphaNumeric[] value();
  }

}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;メモ TODO: 覚えておく&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;上の例では１つしか既成ルールを使用していないが、既成ルールを複数まとめた合成アノテーションを作成することもできる
&lt;ul&gt;
&lt;li&gt;なお、既成ルールをまとめた合成アノテーションを作成する場合、&lt;code&gt;@ReportAsSingleViolation&lt;/code&gt;も付与するのが一般的で、付与すると、message属性で指定したメッセージが利用される用になる。付与しない場合は、既成ルールに指定したメッセージが利用される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;独自のバリデータを実装して作成する方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;→冗長になりがちだと思うので作成しないほうが良いのでは？
&lt;ul&gt;
&lt;li&gt;相関チェックも実装できそうだが、&lt;code&gt;@AssertTrue&lt;/code&gt;を使用したほうがシンプル&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;@AssertTrue&lt;/code&gt;の使用方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://qiita.com/t-iguchi/items/ea3dd8691d52d7abe695&quot;&gt;https://qiita.com/t-iguchi/items/ea3dd8691d52d7abe695&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.7.7 入力チェックツールの切り替え&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;コントローラーのメソッドでパラメータ指定して、呼び出すメソッドを変更することで実現する例を記載している&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.7.8 エラー情報の表示&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;form:errors path=&quot;name&quot;&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;このように記載することでエラー情報取れますよという説明がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;エラーメッセージ要素の構成案&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&quot;error-message d-none&quot;&amp;gt;
  &amp;lt;form:errors path=&quot;name&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;document.querySelectorAll(&quot;.error-message&quot;).forEach(el=&amp;gt;{
  if(el.innerText) el.classList.remove(&quot;d-none&quot;);
})
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;みたいな感じにすればいいのではなかろうかと&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.7.9 エラーメッセージの解決&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;エラーメッセージの定義方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Springが提供するMessageSourceで読み込んだプロパティファイルにメッセージを定義する&lt;/li&gt;
&lt;li&gt;BeanValidation管理のプロパティファイルにメッセージを定義する&lt;/li&gt;
&lt;li&gt;制約アノテーションのmessage属性に直接メッセージを定義する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Spring管理プロパティファイル&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;制約アノテーションのクラス名＋「.」＋フォームオブジェクトの属性名＋「.」＋プロパティ名&lt;/li&gt;
&lt;li&gt;制約アノテーションのクラス名＋「.」＋フォームオブジェクトの属性名&lt;/li&gt;
&lt;li&gt;制約アノテーションのクラス名＋「.」＋プロパティ名&lt;/li&gt;
&lt;li&gt;制約アノテーションのクラス名＋「.」＋プロパティの型名（FQCN）&lt;/li&gt;
&lt;li&gt;制約アノテーションのクラス名&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;BeanValidation管理のプロパティファイルにエラーメッセージを定義&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;クラスパス直下のValidationMessages.propertiesにメッセージを定義する
&lt;ul&gt;
&lt;li&gt;→あまり使用する機会無いのではと思う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.7.10 BeanValidationのカスタマイズ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;java configに設定
&lt;ul&gt;
&lt;li&gt;→あまりメリットが理解できなかったのでスキップ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.7.11 Spring Validatorの利用&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;割愛&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.8 画面遷移&lt;/h3&gt;
&lt;h4&gt;5.8.1 遷移先の指定方法&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;View名をHandlerメソッドの戻り値として返却することで実現&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.8.2 リクエストパスへのリダイレクト&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;View名に「redirect: + リダイレクト先のリクエストパス」&lt;/li&gt;
&lt;li&gt;RedirectAttributesを使用してパラメータを設定する&lt;/li&gt;
&lt;li&gt;パス変数を指定することもできる&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.8.3 リクエストパスへのフォワード&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;「forward: + 転送先のリクエストパス」&lt;/li&gt;
&lt;li&gt;&lt;code&gt;return &quot;forward:/auth/authenticate&quot;;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;MEMO: 使い所が知りたい&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.8.4 Viewとのデータ連携&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;JavaオブジェクトをModelに格納する方法は、以下の２つがある
&lt;ul&gt;
&lt;li&gt;ModelのAPIを直接呼び出す&lt;/li&gt;
&lt;li&gt;ModelAttributeアノテーションを付与したメソッドを用意する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.8.5 リダイレクト先とのデータ連携&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;RedirectAttributesのフラッシュスコープの説明&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.9 Viewの解決&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;jspとかいろいろ使えるよ&lt;/li&gt;
&lt;li&gt;JSP使うなら、ViewResolverRegistryに登録する必要があるよっていう説明&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.10 JSPの実装&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;JSP使用しないため割愛&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.11 SpringのHTMLフォーム用タグライブラリの利用&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;JSP使用しないため割愛&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.12 Springの汎用タグライブラリの利用&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Springで使用できるタグについて説明
&lt;ul&gt;
&lt;li&gt;MEMO: 必要であれば読み返す&lt;/li&gt;
&lt;li&gt;できるだけthymeleafだけの方が良いのではと思う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.13 例外ハンドリング&lt;/h3&gt;
&lt;h4&gt;5.13.1 例外の種類&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Webアプリケーションで発生する例外は大きく３つある
&lt;ul&gt;
&lt;li&gt;システム例外:処理を継続することができない例外
&lt;ul&gt;
&lt;li&gt;アプリケーション自体のバグ&lt;/li&gt;
&lt;li&gt;依存ライブラリのバグ&lt;/li&gt;
&lt;li&gt;ミドルウェアやハードウェアの故障&lt;/li&gt;
&lt;li&gt;システムリソースの枯渇&lt;/li&gt;
&lt;li&gt;ネットワーク障害&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;リクエスト不正を通知する例外：リクエストの内容が不正なときに発生する例外
&lt;ul&gt;
&lt;li&gt;存在しないパスへのリクエスト&lt;/li&gt;
&lt;li&gt;バインディングエラー&lt;/li&gt;
&lt;li&gt;入力チェックエラー&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;アプリケーション例外：ビジネスルールに違反したときに発生する例外
&lt;ul&gt;
&lt;li&gt;ユーザー登録時のIDの重複エラー&lt;/li&gt;
&lt;li&gt;排他エラー&lt;/li&gt;
&lt;li&gt;在庫数の不足エラー&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.13.2 例外の発生箇所とハンドリング方法&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;以下の箇所で例外が発生する可能性があり、それぞれ例外ハンドリングの方法も異なる
&lt;ul&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;Servlet Fileter&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;サーブレットコンテナへのエラーページ機能（web.xmlの&lt;code&gt;&amp;lt;error-page&amp;gt;&lt;/code&gt;要素）を使用してエラー処理を実装する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;DispatcherServlet: SpringMVCが提供する例外ハンドリングの仕組み（HandlerExceptionResolver）&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;アプリケーション(Controller, Service, Repositoryなど)：SpringMVCが提供する例外ハンドリングの仕組み（HandlerExceptionResolver）&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;View（JSPなど）&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Viewの中で発生した例外は、サーブレットコンテナのエラーページ機能を使用して絵r-あ処理を実装&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.13.3 サーブレットコンテナのエラーページ機能を利用&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;web.xml&lt;/code&gt;に&lt;code&gt;error-page&lt;/code&gt;を記載する方法を紹介&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.13.5 @ExceprtionHandlerメソッドの利用&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;複数のController間で共通の処理&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@ControllerAdvice&lt;/code&gt;を用いる&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://terasolunaorg.github.io/guideline/5.0.1.RELEASE/ja/ImplementationAtEachLayer/ApplicationLayer.html#id160&quot;&gt;https://terasolunaorg.github.io/guideline/5.0.1.RELEASE/ja/ImplementationAtEachLayer/ApplicationLayer.html#id160&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;@ExceptionHandler&lt;/code&gt;メソッドの引数&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Exception&lt;/li&gt;
&lt;li&gt;HandlerMethod&lt;/li&gt;
&lt;li&gt;java.util.Locale&lt;/li&gt;
&lt;li&gt;java.util.Timezone&lt;/li&gt;
&lt;li&gt;java.time.ZoneId&lt;/li&gt;
&lt;li&gt;java.security.Principal&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;戻り値について&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;String&lt;/li&gt;
&lt;li&gt;ModelAndView&lt;/li&gt;
&lt;li&gt;void&lt;/li&gt;
&lt;li&gt;ResponseEntity&amp;lt;?&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.13.6 @ResponseStatusを指定した例外クラスの利用&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;@ResponseStatus(HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {
  // *****
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;TODO: 独自Exceptionを作成していくべきかどうか&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第6章　RESTful Webサービスの開発&lt;/h2&gt;
&lt;h3&gt;6.1 REST APIのアーキテクチャ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;RESTは「REpresentational State Transfer」の略で、クライアントとサーバー間でデータをやり取りするアプリケーションを構築するためのアーキテクチャスタイルの１つ&lt;/li&gt;
&lt;li&gt;最も重要なのは「リソース」という概念&lt;/li&gt;
&lt;li&gt;REST APIはデータベースなどで管理している情報の中から、クライアントに提供する情報を「リソース」として抽出&lt;/li&gt;
&lt;li&gt;抽出したリソースはWeb上に公開し、リソースにアクセスするための手段としてRESTAPIを用意します&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;6.1.1 Resouce Oriented Architecture (ROA)&lt;/h4&gt;
&lt;h4&gt;6.1.2 フレームワークのアーキテクチャ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;割愛 TODO: 詳細を知りたくなったら読む&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6.2 アプリケーションの設定&lt;/h3&gt;
&lt;h4&gt;6.2.1 ライブラリのセットアップ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;リソース形式としてJSONを使用する際に利用する「FasterXML Jackson Databind」を依存ライブラリに追加する
&lt;ul&gt;
&lt;li&gt;MEMO: SpringBootだと不要みたい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;6.2.2 サーブレットコンテナの設定&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;HiddenHttpMethodFilterの適用&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RESTAPIを提供する場合、HTTPメソッドとして、PUT、PATCH、DELETEなども使用するが、&lt;/li&gt;
&lt;li&gt;Webブラウザなどクライアントの実装によっては、GETとPOSTしか使用できなかったりする&lt;/li&gt;
&lt;li&gt;そこをサポートするために&lt;code&gt;org.springframework.web.filter.HiddenHttpMethodFileter&lt;/code&gt;クラスを利用する
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;_method=put&lt;/code&gt;というパラメータでリクエストが送られると、サーブレットコンテナ内で行われる処理はPUTメソッドでアクセスしたときとおなじになる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;HttpMessageConverterのカスタマイズ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MEMO: Converterの設定をしているが、SpringBootだと不要だと思うので飛ばす&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6.3 @RestControllerの実装&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;大きく２つ種類がある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;メソッドシグネチャを参照してフロントコントローラが処理を行う「宣言型」の処理&lt;/li&gt;
&lt;li&gt;Controllerクラスのメソッド内に処理を実装する「プログラミング型」の処理&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: クライアントへ返却するオブジェクトは共通で作成しているもの（クラス）を使用するのが良いと思った&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;以下、割愛&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第7章　Spring MVC の応用&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;SpringMVCの機能を利用したWebアプリケーションの開発方法を学びましたが、&lt;/li&gt;
&lt;li&gt;典型的なWebアプリケーションの開発では、
&lt;ul&gt;
&lt;li&gt;セッションの利用&lt;/li&gt;
&lt;li&gt;ファイルアップロード&lt;/li&gt;
&lt;li&gt;画面やメッセージの国際化&lt;/li&gt;
&lt;li&gt;共通処理の適用&lt;/li&gt;
&lt;li&gt;静的リソースのキャッシュ制御　などへの考慮も必要になる&lt;/li&gt;
&lt;li&gt;非同期処理（SSE(Server-Sent Events)）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;7.1 HTTPセッションの利用&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;セッション管理する方法３つある
&lt;ul&gt;
&lt;li&gt;セッション属性（@SessionAttributes）の使用&lt;/li&gt;
&lt;li&gt;セッションスコープのBeanの利用&lt;/li&gt;
&lt;li&gt;HttpSessionのAPIの利用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.1.1 セッション属性（@SessionAttributes）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;１つのController内で扱う複数のリクエスト間でデータを共有する場合に有効な方法
&lt;ul&gt;
&lt;li&gt;入力画面が複数のページで構成される場合や、複雑な画面遷移を伴う場合は&lt;code&gt;@SessionAttributes&lt;/code&gt;を使用することを検討&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;シンプルな画面構成の場合（入力画面→確認画面→完了画面とかの場合）は、HTMLフォームのHiddenで値を持ち回る方法を検討すること&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.1.2 セッションスコープBean&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;複数のControllerをまたぐ画面遷移において、Controller間でデータを共有する場合に有効な方法&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;7.2 ファイルアップロード&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;SpringMVCでファイルをアップロードする場合は、以下のいずれかの方法を利用する
&lt;ul&gt;
&lt;li&gt;Servlet標準のアップロード機能&lt;/li&gt;
&lt;li&gt;ApacheCommonsFileUploadのアップロード機能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.2.2 ファイルアップロード機能のセットアップ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;web.xmlに&lt;code&gt;&amp;lt;multipart-config /&amp;gt;&lt;/code&gt;を追加するとのこと&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Servlet標準のファイルアップロード機能をデフォルトのまま利用するとアップロードできるファイルのサイズに上限がないため、上限を設けたい場合は、ファイル単位の最大サイズ、アップロード時のリクエスト全体の最大サイズ、一時ファイル出力有無の閾値サイズの３つを指定する必要がある&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;上限に引っかかると、&lt;code&gt;MultipartException&lt;/code&gt;が発生するので、Handlerでハンドリングすること&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メモ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SpringMVCのDispatcherServletより前にリクエストパラメータにアクセスする処理があると、MultipartExceptionが発生しない可能性がある&lt;/li&gt;
&lt;li&gt;SpringWEBから提供されているフィルターを利用すると制御できるとのこと
&lt;ul&gt;
&lt;li&gt;TODO: SpringBootだとどのように記載するか確認&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.2.3 アップロードデータの取得&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Formクラスの作成&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;普通にFormクラスの作成 &lt;code&gt;MultipartFile&lt;/code&gt;型で変数定義する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Viewの作成&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;input type=&quot;file&quot;で作成して送るだけ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Controller&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ファイルを取得して永続化操作&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Validation&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ファイルサイズや、コンテンツタイプ、ファイル名などをチェックする場合は、Validatorを作成してチェック&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TODO: 実際にアイコン画像などをDBで保持できる永続化ロジックまで書く&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;7.3 非同期リクエスト&lt;/h3&gt;
&lt;h4&gt;7.3.1 非同期リクエストの仕組み&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;非同期実行が終了してからHTTPレスポンスを開始&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;勘違いしやすいのが、HTTPレスポンスは非同期実行している処理が終了したあとに行うため、クライアント側から見ると、同期処理と同じ動作になる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SpringMVCはこのパターンの非同期処理をサポートするために以下の２つの方法を提供&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SpringMVC管理のスレッドを使用した非同期処理&lt;/li&gt;
&lt;li&gt;SpringMVC管理外のスレッドを使用した非同期処理&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;非同期実行の処理中にHTTPレスポンスを開始&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ロングポーリングを使用した非同期処理&lt;/li&gt;
&lt;li&gt;SSE（Server-Sent Events）に準拠した非同期処理&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.3.2 非同期実行を有効にするための設定&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;web.xmlに設定追記&lt;/li&gt;
&lt;li&gt;java configにBean定義追加&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.3.3 非同期処理の実装&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;以下の２つの非同期処理の実装方法を紹介&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CompletableFutureを使用した非同期処理&lt;/li&gt;
&lt;li&gt;SseEmitterを使用したPush型の非同期処理&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;@Async&lt;/code&gt;の利用&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;本書で説明する非同期処理は、どちらもSpringMVC管理外のスレッドを使用した非同期処理&lt;/li&gt;
&lt;li&gt;SpringFrameworkは、特定のメソッドを別スレッドで実行する仕組みを提供しており、別スレッドで実行したいメソッドに、&lt;code&gt;org.springframework.scheduling.annotation.Async&lt;/code&gt;を付与するだけ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: SpringBootでの利用に参考&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://qiita.com/mitsuya/items/c21907ab10919111e773&quot;&gt;https://qiita.com/mitsuya/items/c21907ab10919111e773&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CompletableFutureを使用した非同期処理の実装&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CoompletableFuture&amp;lt;String&amp;gt;&lt;/code&gt;を返却する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SseEmitterを使用したPush型の非同期処理の実装&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;new SseEmitter();&lt;/code&gt;でイベント処理を行う
&lt;ul&gt;
&lt;li&gt;具体的な使用方法について説明なし&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.3.4 非同期実行の例外ハンドリング&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DeferredResult&lt;/code&gt;を使用して結果を設定する&lt;/li&gt;
&lt;li&gt;TODO: 結果を非同期で画面に通知する方法確認&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.3.5 非同期実行に対する共通処理の実装&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;CallableProcessingInterceptorもしくはDeferredResultProcessingInterceptorのAdopterを実装したクラスを作成&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;現在は、interfaceにデフォルトメソッドが定義できるようになったので、Adopterではなくて、interfaceの方を使用すべきとのことで、&lt;code&gt;@Deprecated&lt;/code&gt;になっている&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;CallableProcessingInterceptor&lt;/code&gt;インターフェース&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;7.4 共通処理の実装&lt;/h3&gt;
&lt;p&gt;ControllerのHandlerメソッドの呼び出し前後に共通処理を実行する方法について説明します。&lt;/p&gt;
&lt;h4&gt;7.4.1 サーブレットフィルタの利用&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SpringMVCの呼び出し前後に共通する処理を実行するには、&lt;code&gt;javax.servlet.Filter&lt;/code&gt;インターフェースの実装クラスを作成する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Filterクラスを直接実装してもよいが、ここではSpringが提供しているサポートクラスを利用する方法を紹介&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;サポートクラス&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GenericFilterBean&lt;/code&gt;クラス&lt;/li&gt;
&lt;li&gt;&lt;code&gt;OncePerRequestFilter&lt;/code&gt;クラス&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DIコンテナで管理しているBeanのインジェクション方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;サーブレットフィルター内の処理でDIコンテナ管理しているBeanを利用したい場合は、サーブレットフィルタをDIコンテナに登録し、DelegatingFilterProxy経由でサーブレットフィルタの処理を実行する&lt;/li&gt;
&lt;li&gt;DelegatingFilterProxyは、SpringのDIコンテナに登録されているサーブレットフィルターに処理を移譲するサーブレットフィルタクラス&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.4.2 HandlerInterceptorの利用&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Controllerでハンドリングする処理に対してだけ共通処理を実行したい場合は、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;org.springframework.web.servlet.HndlerInterceptor&lt;/code&gt;インターフェースの実装クラスを作成する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メソッド&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;preHandle：実行前&lt;/li&gt;
&lt;li&gt;postHandle：例外時は呼び出されない&lt;/li&gt;
&lt;li&gt;afterCompletion：実行後&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;@Slf4j
public class LoggingInterceptor extends HandlerInterceptorAdapter {

  public void postHandler(HttpServletRequest request, HttpServletResponse response, Object handler,
      ModelAndView modelAndView) {
    if (log.isInfoEnabled()) {
      HandlerMethod handlerMethod = (HandlerMethod) handler;
      Method method = ((HandlerMethod) handler).getMethod();
      log.info(&quot;[SUCCESS CONTROLLER] {}.{}&quot;, method.getDeclaringClass().getSimpleName(), method.getName());
    }

  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoggingInterceptor())
                .addPathPatterns(&quot;/**&quot;)
                .excludePathPatterns(&quot;/resources/**&quot;);
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;7.4.3 @ControllerAdviceの利用&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Controllerクラスには、Handlerメソッドとは別に、Controller専用の特殊なメソッド（&lt;code&gt;@InitBinder&lt;/code&gt;メソッド、&lt;code&gt;@ModelAttribute&lt;/code&gt;メソッド、&lt;code&gt;@ExceptionHandler&lt;/code&gt;メソッド）を実装することができる&lt;/li&gt;
&lt;li&gt;これらのメソッドを複数のControllerクラスで共有するには、&lt;code&gt;@ControllerAdvice&lt;/code&gt;を付与したクラスを作成する&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;@Slf4j
@ControllerAdvice
public class ErrorController {

  @GetMapping(&quot;/error&quot;)
  public String handleError() {
    return &quot;error&quot;;
  }

  @ExceptionHandler(Throwable.class)
  public String handleThrowable(Throwable exception, Model model) {
    model.addAttribute(&quot;&quot;, &quot;&quot;);
    return &quot;error&quot;;
  }

  @ExceptionHandler(Exception.class)
  public String handleException(Exception exception, Model model) {
    model.addAttribute(&quot;&quot;, &quot;&quot;);
    return &quot;error&quot;;
  }

  @ExceptionHandler(IOException.class)
  public String handleIOException(IOException exception, Model model) {
    model.addAttribute(&quot;&quot;, &quot;&quot;);
    return &quot;error&quot;;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;7.4.4 HandlerMethodArgumentResolverの利用&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;SpringMVCのデフォルトでサポートされていないオブジェクトをControllerのHandlerメソッドの引数に渡したい場合は、&lt;code&gt;org.springframework.web.method.support.HandlerMethodArgumentResolver&lt;/code&gt;インターフェースの実装クラスを作成します。&lt;/li&gt;
&lt;li&gt;あまり利用するシーンがわからないため割愛する&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;7.5 静的リソース&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ルートから任意のディレクトリに配置した静的リソースにアクセスできますという説明&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.5.1 デフォルトサーブレットとDispatcherServletの共存&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Servletの使用では、ルートパス（）にマッピングされたサーブレットのことを「デフォルトサーブレット」と呼び、デフォルトサーブレット経由でWebアプリケーションのドキュメントルート配下のファイルにアクセスすることができる&lt;/li&gt;
&lt;li&gt;SpringMVCアプリケーションでは、DispatcherServletをルートパスにマッピングするスタイルを採用することがよくあるが、DispatcherServletをルートパスにマッピングすると、Webアプリケーションのドキュメントルート配下のファイルにアクセスできなくなってしまいます。&lt;/li&gt;
&lt;li&gt;この動作を変更するには、SpringMVCが提供している「DispatcherServletで受けたリクエストをデフォルトサーブレットへ転送する機能」を有効化する必要がある&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.5.2 SpringMVC独自の静的リソース解決の仕組み&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;HTTPのキャッシュ制御&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ResourceResolverとResouceTransformerの利用&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ResourceHttpRequestHandlerには
&lt;ul&gt;
&lt;li&gt;バージョン付き公開パスを使用した静的リソースへのアクセス&lt;/li&gt;
&lt;li&gt;Gzip化された静的リソースへのアクセス&lt;/li&gt;
&lt;li&gt;WebJars内の静的リソースのバージョン番号の隠蔽
&lt;ul&gt;
&lt;li&gt;を行う機能がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ResourceResolverインターフェース&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;静的リソースにアクセスするための公開パス&lt;/li&gt;
&lt;li&gt;サーバー上の物理的な静的リソースを相互に解決するためのメソッドを提供&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ResourceTransformerインターフェース&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;静的リソースのコンテンツデータを書き換えるためのメソッドを提供&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;バージョン付きの公開パスを使用した静的リソースへのアクセス&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Thymeleafでのアクセス方法について確認する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ここで紹介されていた&lt;a href=&quot;https://ksoichiro.blogspot.com/2015/04/spring-boot_14.html&quot;&gt;https://ksoichiro.blogspot.com/2015/04/spring-boot_14.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;th:href=&quot;@{/css/main.css}&quot;&lt;/code&gt;などと記載する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;7.6 国際化&lt;/h3&gt;
&lt;h4&gt;7.6.1 ロケールの解決&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;アプリケーション内で扱うロケール解決には、&lt;code&gt;org.springframework.web.servlet.LocaleResolver&lt;/code&gt;インターフェースを使用する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SpringMVCは、ロケールの保存場所に応じて以下の実装クラスを提供しており、デフォルトではAcceptHeaderLocaleResolverが有効になっている&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;提供されているLocaleResolverの実装クラス&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AcceptHeaderLocaleResolver&lt;/li&gt;
&lt;li&gt;SessionLocaleResolver&lt;/li&gt;
&lt;li&gt;CookieLocaleResolver&lt;/li&gt;
&lt;li&gt;FixedLocaleResolver&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;クライアントからロケールの指定がない場合、デフォルトロケールが利用され、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;LocaleResolverに指定したデフォルトロケール&lt;/li&gt;
&lt;li&gt;JVMに指定したロケール&lt;/li&gt;
&lt;li&gt;OSに指定したロケール
&lt;ul&gt;
&lt;li&gt;の順番で解決されます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.6.2 ロケールの利用&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;VIEWからロケールにアクセスするときはSpringのタグを使用する&lt;/li&gt;
&lt;li&gt;Handlerメソッドからロケールにアクセスするときは引数にLocaleを指定する&lt;/li&gt;
&lt;li&gt;Handler以外の場所からロケールにアクセスするときは、RequestContextUtilsのgetLocaleメソッドを使用する&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.6.3 UIを使用したロケールの切り替え&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;画面などのUIを使用してロケールを切り替える方法について説明&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ロケールの切り替えは、&lt;code&gt;org.springframework.web.servlet.i18n.LocaleChangeInterceptor&lt;/code&gt;を利用することで簡単に行うことができる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;LocaleResolverのBean定義&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;LocaleChangeInterceptorのBean定義&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ロケール切り替え用の画面要素の表示&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;a href=&quot;?locale=en&quot;&amp;gt;English&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;?locale=ja&quot;&amp;gt;Japanese&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;このリンクをクリクすると、LocaleChangeInterceptorが呼び出され、
リクエストパラメータで指定されたロケールがSpringMVCアプリケーションに反映される&lt;/p&gt;
&lt;h2&gt;第8章　Spring Test&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;本章では、SpringFrameworkが提供するテスト支援モジュールを利用して、Springアプリケーションに対してテストを行う方法について解説していく&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;紹介を行うテスト&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DIコンテナに登録したBeanへのテスト&lt;/li&gt;
&lt;li&gt;データベースアクセスを伴う処理へのテスト&lt;/li&gt;
&lt;li&gt;SpringMVC上で動くControllerへのテスト&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;第９章では、SpringSecurityの機能を利用した処理へのテストを紹介&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;8.1 Spring Testとは&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Spring Testとは&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Spring Framework上で動かすために作成したクラスのテストを支援するモジュール&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;単体テスト&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;テスト対象のクラス内で実装しているロジックのみをテスト&lt;/li&gt;
&lt;li&gt;単体テストを行う際には、テスト対象のクラスの中で依存している他のコンポーネントはモックやスタブを使用し、実行結果が他のコンポーネントの実装内容に左右されないようにする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;結合テスト&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基本的にモックやスタブは使わず、プロダクション環境で使用するクラスを結合してテストを行います。&lt;/li&gt;
&lt;li&gt;ポイントは、システムやアプリケーション全体が正しく動作するかを検証するのではなく、開発者が作成したクラスがSpringのフレームワーク上で正しく動作するかをテストするという点&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;提供されている機能&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JUnitやTestNGといったテスティングフレームワーク上でのSpringのDIコンテナを動かす機能&lt;/li&gt;
&lt;li&gt;トランザクション制御をテスト向けに最適化する機能&lt;/li&gt;
&lt;li&gt;アプリケーションサーバーを使わずにSpringMVCの動作を再現する機能&lt;/li&gt;
&lt;li&gt;テストデータをセットアップするためのSQLを実行する機能&lt;/li&gt;
&lt;li&gt;RestTemplateを使用したHTTP通信に対してモックレスポンスを返却する機能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;8.2 DIコンテナ管理のBeanに対するテスト&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;junitを使用する前提で説明&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;8.2.1 Beanの単体テスト&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Serviceクラスをテスト&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;依存しているコンポーネントはできるだけモック化することを検討する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;外部ファイル参照サービスやDBアクセスなど&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;8.2.2 DIコンテナ内のBeanに対する結合テスト&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Springの機能を使用して、DIコンテナ内のリソースを取得してテストを行う&lt;/li&gt;
&lt;li&gt;単体テストは本当にクラス単体の観点なのに対して、結合テストはプロジェクト内のリソースを結合したテストとみなしている&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;8.2.3 Spring Testcontext Framework&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;他のランナーとSpringを併用したい場合は、&lt;code&gt;@ClassRule&lt;/code&gt;と&lt;code&gt;@Rule&lt;/code&gt;を使用すれば実現できるという説明&lt;/li&gt;
&lt;li&gt;TODO: 使用するランナーによって何が違うのかを後で確認する必要ある&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;8.2.4 DIコンテナのコンフィギュレーション&lt;/h4&gt;
&lt;p&gt;DIコンテナを作成するには、
&lt;code&gt;@org.springframework.test.context.ContextConfiguration&lt;/code&gt;をテストクラスケースに付与する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;デフォルトのBean定義ファ入りう&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Webアプリケーション向けのDIコンテナのコンフィギュレーション&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@WebApplicationConfiguration&lt;/code&gt;付与について説明
&lt;ul&gt;
&lt;li&gt;Webアプリケーション向けのDIコンテナに加えて、&lt;/li&gt;
&lt;li&gt;ServletAPIに依存する各種モックオブジェクトなどをテストケースクラスにインジェクションできる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;8.2.5 DIコンテナのライフサイクル制御&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Spring TestContext Framework上に生成されたDIコンテナは、テスト実行時のJavaVMが終了するまでキャッシュされ、必要に応じてテストケース間で共有される仕組みになっています。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DIコンテナのキャッシュ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;デフォルトの動作では、同一テストケースクラスのテストメソッドで同じDIコンテナが使われる&lt;/li&gt;
&lt;li&gt;さらにテストケースクラスが別の場合でも、&lt;code&gt;@ContextConfiguration&lt;/code&gt;などに指定した属性値が同じであれば、キャッシュ済みのDIコンテナが利用される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DIコンテナの破棄&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;割愛...TODO: 実際のテストケースの組み方について調査する必要あり&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;8.2.6 プロファイルの指定&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Springのプロファイル機能を使用しているアプリケーションに対してテストを行う場合は、&lt;code&gt;@org.springframework.test.context.ActiveProfiles&lt;/code&gt;を使う&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;8.2.7 テスト用のプロパティ値の指定&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;テスト用のプロパティ値を設定できる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@org.springframework.test.context.TestPropertySource&lt;/code&gt;を使う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;プロパティ値の指定には２つの方法がある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アノテーションに直接指定する&lt;/li&gt;
&lt;li&gt;プロパティファイルに指定する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;8.3 データベースアクセスを伴う処理のテスト&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;データベースへアクセスするBeanに対するテスト方法について説明&lt;/li&gt;
&lt;li&gt;データベースにアクセスするBeanに対してテストを行う場合、以下の作業が必要になる
&lt;ul&gt;
&lt;li&gt;テスト用のデータソースの設定&lt;/li&gt;
&lt;li&gt;テストデータのセットアップ&lt;/li&gt;
&lt;li&gt;テストケース用のトランザクション制御&lt;/li&gt;
&lt;li&gt;テーブルの中身の検証&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;8.3.1 テスト用のデータソースの設定&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Test用のConfigクラスを作成して、既存のコンフィグクラスを上書きする説明&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;8.3.2 テストデータのセットアップ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@Sql&lt;/code&gt;を使用すると、テストケース・メソッドの呼び出し前に任意のSLQを実行できる&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;  /**
   * Sqlを付与することで、テストメソッド実行前に任意のSQL文を実行することができる
   */
  @Test
  @Sql({ &quot;/account-delete.sql&quot;, &quot;/account-insert-data.sql&quot; })
  final void testFindOne() {
    Account account = accountRepositry.findOne(&quot;001&quot;);
  }

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;メモ
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@Sql&lt;/code&gt;にはJavaSE8で追加された&lt;code&gt;@Repeatable&lt;/code&gt;が付与されているため、JavaSE8以降を使う場合は同じ箇所に複数指定できる
&lt;ul&gt;
&lt;li&gt;JavaSE7以前のJavaでも、&lt;code&gt;@org.springframework.test.context.jdbc.SqlGroup&lt;/code&gt;を使うことで、複数のSQLを指定できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;8.3.3 テストケース用のトランザクション制御&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;デフォルトではテストデータをセットアップする際に使用するトランザクションと、&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;テスト対象のデータアクセス処理で使用するトランザクションは別々になってしまう&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;テストが途中で失敗して、レコードが更新されてしまったり、データの状態が変わってしまうため注意が必要&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;このような事故を防ぐには、JUnit専用のデータベースを用意しておくと確実&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ローカルなんかも優位だと思う&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;あるいは、SpringTestが提供しているテスト用のトランザクション制御の仕組みを利用して防ぐこともできる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;トランザクション境界の移動&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SpringTestでは、、JUnit実行時のトランザクション境界を、テストケースメソッドの呼び出し前に移動する仕組みを提供している。&lt;/li&gt;
&lt;li&gt;この仕組を利用すると、&lt;code&gt;@Sql&lt;/code&gt;で指定したSQLファイルの実行とテストを同一のトランザクション内で行うことができる&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Transactional&lt;/code&gt;をクラス、メソッドに指定する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;トランザクション境界でのロールバック/コミットの制御&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;処理が完了したあと、ロールバックするのではなくコミットしたい場合、&lt;code&gt;@Commit&lt;/code&gt;を付与すれば実現できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;永続コンテキストをフラッシュ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JPAやHibernateがEntityへの更新操作を永続コンテキストと呼ばれるインメモリ領域に蓄積しておき、トランザクションのコミット時にSQLを発行する仕組みになっているため、明示的にSQLが発行されるようにフラッシュする必要がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;8.3.4 テーブルの中身の検証&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;JdbcTemplateを使用して検証する&lt;/li&gt;
&lt;li&gt;DIコンテナに入っている同じオブジェクトを使用すること&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;8.4 Spring MVC のテスト&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SpringMVC上で動くControllerに対するテスト方法について説明&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Controllerに対するテストの話をするときにいつも出てくる話題がある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;→「Controllerに対する単体テストは必要か？」という話題&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Controllerの主な役割は、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;リクエストマッピング&lt;/li&gt;
&lt;li&gt;入力チェック&lt;/li&gt;
&lt;li&gt;リクエストデータの取得&lt;/li&gt;
&lt;li&gt;ビジネスロジックの呼び出し&lt;/li&gt;
&lt;li&gt;遷移先の制御&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;これらは、SpringMVCのフレームワークと結合しないと妥当性を検証することができないので、単体テストではなく、結合テストとして行ったほうがよい&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;では、SpringMVCのフレームワーク機能と結合した状態でControllerをテストするにはどうすればよいのでしょうか？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;最もオーソドックスな選択肢は、Webアプリケーションをアプリケーションサーバーにデプロイし、E2E（End to End）テストとして実施する方法&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;E2Eテストとして実施すると、Viewが生成したレスポンスデータの妥当性を検証できるのがメリット&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;一方、以下のようなデメリットがある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アプリケーションサーバーやデータベースの起動が必須となる&lt;/li&gt;
&lt;li&gt;トランザクションがコミットされるため、テスト実施前の状態に戻すことができない&lt;/li&gt;
&lt;li&gt;回帰テストを実行するために、Seleniumなどを利用したテストケースの実装が必要になる&lt;/li&gt;
&lt;li&gt;Seleniumを使うと、テストの実行時間が長くなる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SpringTestはE2Eテストのデメリットを解消しつつ、SpringMVCのフレームワーク機能と結合した状態でControllerをテストするためのプラットフォームとして、&lt;code&gt;org.springframework.test.web.servlet.MockMvc&lt;/code&gt;というクラスを提供している&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;8.4.1 MockMvcとは&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;アプリケーションサーバー上にデプロイせず、SpringMVCの動作を再現する仕組みを提供するクラス&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;流れ&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;テストケース・メソッドは、DispatcherServletにリクエストするデータ（リクエストパスやリクエストパラメータなど）をセットアップする&lt;/li&gt;
&lt;li&gt;MockMvcは、DispatcherServletに対して擬似的なリクエストを行う。実際に使われるDispatcherServletは、テスト用に拡張されている、&lt;code&gt;org.springframework.test.web.servlet.TestDipacherSevlet&lt;/code&gt;となる&lt;/li&gt;
&lt;li&gt;DispatcherServletは、リクエスト内容に一致するHandlerのメソッドを呼び出す&lt;/li&gt;
&lt;li&gt;テストケースメソッドは、MockMvcが返却する実行結果を受け取り、実行結果の妥当性を検証する&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;動作モードには２つある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ユーザー指定のDIコンテナと連携するモード&lt;/li&gt;
&lt;li&gt;スタンドアロンモード&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SpringMVCのコンフィギュレーションも含めてテストしたい場合、ユーザー指定のDIコンテナと連携するモードを利用すること&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メモ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;本書では扱わないが、SpringTestは、MockMvcとHtmlUnitを連携する機能も提供している&lt;/li&gt;
&lt;li&gt;HtmlUnitと連携することで、テンプレートエンジンが生成したHTMLを検証することができる&lt;/li&gt;
&lt;li&gt;さらに、SeleniumWebDriverやGebと連携すると、Page Object Patternを活用した可読性および再利用性の高いテストケースを記載することも可能&lt;/li&gt;
&lt;li&gt;TODO: あとで確認してみる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;8.4.2 MockMvcのセットアップ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ユーザー指定のDIコンテナと連携するモード&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;スタンドアロンモード&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SpringMVCのコンフィギュレーションはSpringTest側が行い、SpringTestが生成したDIコンテナを使用してSpringMVCの動作を再現&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;サーブレットフィルタの追加&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MockMvcには、サーブレットフィルタを追加することができる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;staticメソッドのインポート&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;テストを書く前に、MockMvcを使用したテストをサポートしてくれるstaticメソッドをインポートします。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// よく使用するstaticメソッド
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.*;

&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;8.4.3 テストの実行&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;テストを実行する際は、Controllerを呼び出すために必要なリクエストデータをセットアップし、MockMvcにリクエストの実行依頼を行います。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;  public void testHome() throws Exception {
    mockMvc.perform(get(&quot;/&quot;))
        .andExpect(status().isOk())
        .andExpect(forwardedUrl(&quot;/WEB-INF/index.jsp&quot;));
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;8.4.4 リクエストデータのセットアップ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;リクエストデータのセットアップは、
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;org.springframework.test.web.servlet.request.MockMultipartHttpServletRequestBuilder&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;のファクトリメソッドを使用して行います。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;  @Test
  public void testBooks() throws Exception {
    mockMvc.perform(get(&quot;/books&quot;)
        .param(&quot;name&quot;, &quot;Spring&quot;)
        .accept(MediaType.APPLICATION_JSON)
        .header(&quot;X-Track-Id&quot;, UUID.randomUUID().toString()))
        .andExpect(status().isOk());
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;8.4.5 実行結果の検証&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;MockMvcResultMathcersの主なメソッド&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;status&lt;/li&gt;
&lt;li&gt;header&lt;/li&gt;
&lt;li&gt;cookie&lt;/li&gt;
&lt;li&gt;content&lt;/li&gt;
&lt;li&gt;view&lt;/li&gt;
&lt;li&gt;forwardedUrl&lt;/li&gt;
&lt;li&gt;redirectedUrl&lt;/li&gt;
&lt;li&gt;model&lt;/li&gt;
&lt;li&gt;flash&lt;/li&gt;
&lt;li&gt;request&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メモ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ResultMatcherでサポートされていない検証を行いたい場合は、以下のいずれかの方法で検証ロジックを実装する
&lt;ul&gt;
&lt;li&gt;独自のResultMatcherを作成する&lt;/li&gt;
&lt;li&gt;ResultActionsのandReturnメソッドを呼び出して、MvcResultを取得し、テストケース内で検証ロジックを実装する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;MEMO: 検証ロジックを複数のテストケースで共有したい場合は、ResultMatcherを作成すること&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;8.4.6 実行結果の出力&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;実行結果をログなどに出力する場合は、&lt;code&gt;org.springframework.test.web.servlet.ResultActions&lt;/code&gt;の&lt;code&gt;andDo&lt;/code&gt;メソッドを使用する&lt;/li&gt;
&lt;li&gt;andDoメソッドの引数には、実行結果に対して、任意の処理を行う&lt;code&gt;org.springframewok.test.web.servlet.ResultHandler&lt;/code&gt;を指定する&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;    mockMvc.perform(get(&quot;/books&quot;))
        .andExpect(status().isOk())
        .andDo(log());
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;log: 実行結果をデバッグレベルでログ出力する&lt;/li&gt;
&lt;li&gt;pring: 実行結果を任意の出力先に出力する&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第9章　Spring Security&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SpringSecurityの「セットアップ方法」と「アーキテクチャ」について説明したあと、&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;セキュリティ対策の基本となる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;「認証」と「認可」、&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;さらにセキュリティを強化するために必要となる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;「CSRF対策」&lt;/li&gt;
&lt;li&gt;「セッション管理」&lt;/li&gt;
&lt;li&gt;「ブラウザのセキュリティ対策機能との連携（セキュリティヘッダーの出力）」について説明&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;最後に、SpringSecurityが提供する支援モジュールを使用して、セキュリティ対策が正しく適用されているかをテストする方法についても紹介&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;9.1 SpringSecurityとは&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;アプリケーションにセキュリティ対策機能を実装する際に使用するフレームワーク&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.1.1 SpringSecurityの特徴&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;豊富なオプションの提供
&lt;ul&gt;
&lt;li&gt;SpringSecurityのデフォルト実装の動作をカスタマイズするためのオプションが豊富に提供されている&lt;/li&gt;
&lt;li&gt;このため、デフォルトの動作がセキュリティ要件に合致しない場合であっても、オプションの値を変更することで要件にあった動作に変更できるケースがある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;豊富な拡張ポイントの提供
&lt;ul&gt;
&lt;li&gt;SpringSecurityは動作をカスタマイズするための拡張ポイントを豊富に提供します。&lt;/li&gt;
&lt;li&gt;SpringSecurityのデフォルト実装を使って要件を満たせない場合は、拡張クラスを作成することで要件にあった動作にカスタマイズすることができます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.1.2 基本機能&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;セキュリティ対策の基本機能として「認証機能」と「認可機能」の２つを提供しています。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;認証機能：アプリケーションを利用するユーザーの正当性を確認する機能を提供する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;認可機能：アプリケーションが提供するリソースや処理に対するアクセスを制御する機能を提供する&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.1.3 強化機能&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SpringSecurityでは認証と認可という基本機能に加え、&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Webアプリケーションのセキュリティを強化するための機能をいくつか提供している&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;セキュリティ対策の強化機能&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;セッション管理機能&lt;/li&gt;
&lt;li&gt;CSRF対策機能&lt;/li&gt;
&lt;li&gt;ブラウザのセキュリティ対策機能との連携機能&lt;/li&gt;
&lt;li&gt;※他にある！TODO: 他のセキュリティ機能も確認しておく&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;9.2 Spring Securityのセットアップ&lt;/h3&gt;
&lt;h4&gt;9.2.1 ライブラリのセットアップ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;pom.xmlに設定を追加する手順の説明&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.2.2 SpringSecurityのBean定義&lt;/h4&gt;
&lt;p&gt;SpringSecurityのコンポーネントをBean定義します&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コンフィギュレーションクラスの作成&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// SpringSecurityが提供しているコンフィギュレーションクラスがインポートされ、SpringSecurityを利用するために必要となるコンポーネントのBean定義が自動で行われる仕組み
@EnableWebSecurity
public class AppSecurityConfig extends WebSecurityConfigurerAdapter { // 継承すると、デフォルトで適用されるBean定義を簡単にカスタマイズすることができる

  @Override
  public void configure(WebSecurity web) {
    // セキュリティ対策が不要なリソースがある場合、SpringSecurityの処理を適用しないようにする
    web.ignoring().antMatchers(&quot;/resources/**&quot;);
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;web.xmlへの設定追加方法説明
&lt;ul&gt;
&lt;li&gt;TODO: SpringBootだと必要？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.2.3 サーブレットフィルタの設定&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;最後に、SpringSecurityが提供しているサーブレットフィルタクラス（FilterChainProxy）をサーブレットコンテナに登録する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TODO: SpringBootだとConfigでフィルター追加する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://qiita.com/R-STYLE/items/61a3b6a678cb0ff00edf&quot;&gt;https://qiita.com/R-STYLE/items/61a3b6a678cb0ff00edf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://qiita.com/opengl-8080/items/c105152c9ca48509bd0c&quot;&gt;https://qiita.com/opengl-8080/items/c105152c9ca48509bd0c&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メモ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sevlet3.0以降のサーブレットコンテナでは、サーブレットコンテナの初期化処理をJavaのコードで行うことができる&lt;/li&gt;
&lt;li&gt;SpringSecurityでは、サーブレットコンテナの初期化処理をJavaを使って行うためのサポートクラス説いて、&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AbstractSecurityWebApplicationInitializer&lt;/code&gt;という抽象クラスを提供しています&lt;/li&gt;
&lt;li&gt;以下の初期化処理を自動で行ってくれる
&lt;ul&gt;
&lt;li&gt;ContextLoaderListenerをサーブレットコンテナに登録する処理&lt;/li&gt;
&lt;li&gt;SpringSecurityのサーブレットフィルタクラスをサーブレットコンテナに登録する処理&lt;/li&gt;
&lt;li&gt;参考：&lt;a href=&quot;https://qiita.com/opengl-8080/items/c105152c9ca48509bd0c&quot;&gt;https://qiita.com/opengl-8080/items/c105152c9ca48509bd0c&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;9.3 Spring Security のアーキテクチャ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;各機能の詳細な説明を行う前に、SpringSecurityのアーキテクチャ概要とSpringSecurityを構成する主要なコンポーネントの役割を見ていく&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メモ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ここで紹介する内容は、SpringSecurityが提供するデフォルトの動作をそのまま利用する場合や、&lt;/li&gt;
&lt;li&gt;SpringSecurityのコンフィギュレーションをサポートする仕組みを利用する場合は、開発者が直接意識する必要ない&lt;/li&gt;
&lt;li&gt;そのため、まず各機能の使い方を知りたい場合は、本説を読み飛ばしてOK&lt;/li&gt;
&lt;li&gt;カスタマイズする際に必要になってくるので、アーキテクトを目指す方は一読しておくことをおすすめします。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.3.1 Spring Securityのモジュール構成&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;提供しているモジュールを紹介&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コンポーネントの役割などに応じてモジュール分割されており、標準的なWebアプリケーションに対してセキュリティ対策を講じる際に必要となるモジュールは以下の４つになる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;spring-security-core&lt;/code&gt;: 認証と認可機能を実現するためのコアなコンポーネントが格納されている&lt;/li&gt;
&lt;li&gt;&lt;code&gt;spring-security-web&lt;/code&gt;: Webアプリケーションのセキュリティ対策を実現するためのコンポーネントが格納されている&lt;/li&gt;
&lt;li&gt;&lt;code&gt;spring-security-config&lt;/code&gt;: 各モジュールから提供されているコンポーネントのセットアップをサポートするためのコンポーネント（Java ConfigをサポートするクラスやXMLネームスペースを解析するクラスなど）が格納されている&lt;/li&gt;
&lt;li&gt;&lt;code&gt;spring-security-taglibs&lt;/code&gt;: 認証情報や認可機能にアクセスするためのJSPタグライブラリが格納されている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本書で使い方を紹介しないが、上記以外にも以下のようなモジュールがある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一般的に利用される認証方法（LDAP、OpenID、CASなど）をサポートするためのモジュール&lt;/li&gt;
&lt;li&gt;ACL（AccessControlList）を使用したドメインオブジェクトの認可制御を行うモジュール&lt;/li&gt;
&lt;li&gt;SpringのWebSocket機能に対してセキュリティ対策を追加するためのモジュール&lt;/li&gt;
&lt;li&gt;SpringSecurityの機能を用いる処理に対するテストを支援するためのモジュール&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メモ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SpringSecurityのモジュールではないが、OAuth2.0の仕組みを使用してAPIの認可を実現するためのモジュール（spring-security-oauth2）などが姉妹ライブラリとして提供されている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.3.2 フレームワークのアーキテクチャ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;処理の流れ&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;クライアントはWebアプリケーションに対してリクエストを送る&lt;/li&gt;
&lt;li&gt;SpringSecurityのFilterChainProxyクラスがリクエストを受け取り、HttpFirewallインターフェースのメソッドを呼び出して、HttpServletRequestとHttpServletResponseに対してファイアウォール機能を組み込む&lt;/li&gt;
&lt;li&gt;FilterChainProxyクラスはSecurityFilterChainに設定されているセキュリティ対策用のSecurityFilterクラスに処理を移譲する&lt;/li&gt;
&lt;li&gt;SecurityFilterChainには複数のSecurityFilterが設定されており、SecurityFilterの処理が正常に終了すると皇族のSecurityFilterが呼び出される&lt;/li&gt;
&lt;li&gt;最後のSecurityFilterの処理が正常に終了した場合、後続処理を呼び出し、Webアプリケーション内のリソースへアクセスする&lt;/li&gt;
&lt;li&gt;FilterChainProxyクラスは、Webアプリケーションから返却されたリソースをクライアントに返却する&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;FilterChainProxy&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;FilterChainProxyクラスは、フレームワーク処理のエントリーポイントとなるサーブレットフィルタクラス&lt;/li&gt;
&lt;li&gt;このクラスはフレームワーク処理の全体の流れを制御し、具体的なセキュリティ対策処理はSecurityFilterに移譲するスタイルとなっている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;HttpFirewall&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HttpFirewallインターフェースは、HttpServletRequestとHttpServletResponseに対して、ファイアウォール機能を組み込むためのインターフェースです。デフォルトでは、DefaultHttpFirewallクラスが使用され、ディレクトリトラバーサル攻撃や、不正なリダイレクト先の指定によるHTTPレスポンス分割攻撃に対するチェックなどが実装されている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SecurityFilterChain&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SecurityFilterChainインターフェースは、FilterChainProxyが受け取ったリクエストに対して適用する「SecurityFilterリスト」を管理するためのインターフェース&lt;/li&gt;
&lt;li&gt;デフォルトではDefaultSecurityFilterChainクラスが使用され、以下のようなBean定義を行うと、指定したパスパターンごとに異なるセキュリティ対策が適用できます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Security Filter&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SecurityFilterクラスは、フレームワーク機能やセキュリティ対策機能を提供するサーブレットフィルタクラスです。&lt;/li&gt;
&lt;li&gt;SpringSecurityは、複数のSecurityFilterを連鎖させることで、Webアプリケーションのセキュリティ対策を行う仕組みになっています。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コアなSecurityFilter&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SecurityContextPersistenceFilter&lt;/li&gt;
&lt;li&gt;UsernamePasswordAuthenticationFilter&lt;/li&gt;
&lt;li&gt;LogoutFilter&lt;/li&gt;
&lt;li&gt;FilterSecurityInterceptor&lt;/li&gt;
&lt;li&gt;ExceptionTranslationFilter&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;9.4 認証処理の適用&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;認証処理は、アプリケーションを利用するユーザーの正当性を確認するための処理&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;最も標準的な方法はアプリケーションを使用できるユーザーをデータストアに登録しておいて、利用者が入力した認証情報と照合する方法&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;利用者に認証情報を入力してもらう方式もいくつかあり、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTMLの入力フォームを使う方式&lt;/li&gt;
&lt;li&gt;RFCで定められているHTTP標準の認証方式（BASIC認証やDigest認証など）を利用するのが一般的&lt;/li&gt;
&lt;li&gt;OpenID認証、シングルサインオン認証などの認証方式を利用するケースもある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本節では、HTMLの入力フォームで入力した認証情報とリレーショナルデータベースに格納されているユーザー情報を照合して認証処理を行う実装例を紹介しながら、SpringSecurityの認証機能を解説&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.4.1 認証処理の仕組み&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;認証処理の流れ&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;クライントは認証処理を行うパスに対して資格情報（ユーザー名とパスワード）を指定してリクエストを送信する&lt;/li&gt;
&lt;li&gt;Authentication Filterはリクエストから資格情報を取得し、AuthenticationManagerクラスの認証処理を呼び出す&lt;/li&gt;
&lt;li&gt;ProviderManager（デフォルトで使用されるAuthenticationManagerの実装クラス）は、実際の認証処理をAuthenticationProviderインターフェースの実装クラスに移譲する&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メモ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Authentication FilterとAuthenticationProviderの実装クラスは複数用意されており、要件に合わせて使用するクラスを選択する仕組みになっている&lt;/li&gt;
&lt;li&gt;TODO: 選択できるクラスについて確認&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Authentication Filter&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;認証方式に対する実装を提供するサーブレットフィルタ&lt;/li&gt;
&lt;li&gt;本書では、フォーム認証用のサーブレットフィルタクラス（UsernamePasswordAuthenticationFilter）をシヨすうる前提で説明しますが、SpringSecurityはBasic認証、Digest認証、Remember Me 認証用のサーブレットフィルタクラスも提供しています&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AuthenticationManager&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;認証処理を実行するためのインターフェース&lt;/li&gt;
&lt;li&gt;SpringSecurityが提供するデフォルトの実装（ProviderManager）では、実際の認証処理はAuthenticationProviderに移譲し、AuthenticationProviderで行われた認証処理結果をハンドリングする仕組みになっています。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AuthenticationProvider&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;認証処理の実装をて依拠するためのインターフェース&lt;/li&gt;
&lt;li&gt;本書では、データストアに登録しているユーザーの資格情報とユーザーの状態をチェックして認証処理を行う実装クラス（DaoAuthenticationProvider）を使用する前提で説明しますが、SpringSecurityは認証方法別の実装クラスも提供している。
&lt;ul&gt;
&lt;li&gt;※DBだけでなく他の認証方式にも対応しているという意味だと理解&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.4.2 フォーム認証&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SpringSecurityは以下のような流れでフォーム認証を行う&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;クライアントは、フォーム認証を行うパスに対して資格情報（ユーザー名とパスワード）をリクエストパラメータとして送信する&lt;/li&gt;
&lt;li&gt;UsernamePasswordAuthenticationFilterクラスは、リクエストパラメータから資格情報を取得して、AuthenticationManagerの認証処理を呼び出す&lt;/li&gt;
&lt;li&gt;UsernamePasswordAuthenticationFilterクラスは、AuthenticationManagerから返却された認証結果をハンドリングする。認証処理が成功した場合は、AuthenticationSuccessHandlerのメソッドを、認証処理が失敗した場合は、AuthenticationFailureHandlerのメソッドを呼び出し、画面遷移を行う&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;フォーム認証の適用&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bean定義&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// SpringSecurityが提供しているコンフィギュレーションクラスがインポートされ、SpringSecurityを利用するために必要となるコンポーネントのBean定義が自動で行われる仕組み
@EnableWebSecurity
public class AppSecurityConfig extends WebSecurityConfigurerAdapter { // 継承すると、デフォルトで適用されるBean定義を簡単にカスタマイズすることができる

  @Override
  public void configure(WebSecurity web) {
    // セキュリティ対策が不要なリソースがある場合、SpringSecurityの処理を適用しないようにする
    web.ignoring().antMatchers(&quot;/resources/**&quot;);
  }

  // ★追加！！
  @Override
  public void configure(HttpSecurity http) throws Exception {
    http.formLogin();
    // formLoginメソッドを呼び出すと、フォーム認証が有効になり、FormLoginConfigurerのインスタンスが返却される。
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;デフォルトの動作&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SpringSecurityのデフォルトの動作では、&lt;code&gt;/login&lt;/code&gt;に対して、GETメソッドでアクセスするとSpringSecurityが用意しているデフォルトのログインフォームが表示され、ログインボタンを謳歌すると&lt;code&gt;/login&lt;/code&gt;に対してPOSTメソッドでアクセスして認証処理を行います。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ログインフォームの作成&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SpringSecurityは、フォーム認証用のログインフォームをデフォルトで提供しているが、そのまま利用するケースは殆どないと思う&lt;/li&gt;
&lt;li&gt;ここでは、自身で作成したログインフォームをSpringSecurityに適用する方法を紹介する&lt;/li&gt;
&lt;li&gt;まず、ログインフォームを表示するためのJSPを作成&lt;/li&gt;
&lt;li&gt;ここでは、SpringMVCのViewResolverに指定しているベースパス（src/main/webapp/views/）の直下にJSPを配置し、SpringMVC経由でログインフォームを表示する前提で説明&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ログインフォームをSpringSecurityに適用するために以下のようなBean定義を行う&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;loginPageメソッドを呼び出し、ログインフォームを表示するためのパスを指定する
&lt;ul&gt;
&lt;li&gt;匿名のユーザーが認証を必要するリソースにアクセスした場合、ここで指定したパスにリダイレクトしてログインフォームを表示する仕組みになっている。loginPageメソッドに与えられた引数によって、認証パス（loginProcessingUrl）も連動して変わる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;permitAll()メソッドを呼び出して、すべてのユーザーに対してログインフォームへのアクセス件を付与する&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;  @Override
  public void configure(HttpSecurity http) throws Exception {
    //    http.addFilter(this.preAuthenticatedProcessingFilter());
    //    http.formLogin();
    http.formLogin()
        .loginPage(&quot;/login&quot;) // 認証を必要とするURLに遷移した場合、このURLにリダイレクトしてログインフォームを表示する仕組み
        .permitAll(); // すべてのユーザーに対してログインフォームへのアクセス件を付与する
    http.authorizeRequests()
        .anyRequest()
        .authenticated();
    // formLoginメソッドを呼び出すと、フォーム認証が有効になり、FormLoginConfigurerのインスタンスが返却される。
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;デフォルト動作のカスタマイズ
&lt;ul&gt;
&lt;li&gt;フォーム認証処理のカスタマイズポイントとして
&lt;ul&gt;
&lt;li&gt;認証パス&lt;/li&gt;
&lt;li&gt;資格情報を送るリクエストパラメータ名の変更方法を紹介&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;    http.formLogin()
        //.loginPage(&quot;/login&quot;)
        .loginProcessingUrl(&quot;authenticate&quot;)
        .usernameParameter(&quot;uid&quot;)
        .passwordParameter(&quot;pwd&quot;)
        .permitAll();
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;loginPageもloginProcessingUrlもやっていることは同じらしい
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.ne.jp/asahi/hishidama/home/tech/java/spring/boot/web/form-auth.html&quot;&gt;http://www.ne.jp/asahi/hishidama/home/tech/java/spring/boot/web/form-auth.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.4.3 認証成功時のレスポンス&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SpringSecurityは、認証成功時のレスポンスを制御するためのコンポーネントとして、AuthenticationSuccessHandlerというインターフェースと実装クラスを提供している&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AuthenticationSuccessHandlerの実装クラス&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SavedRequestAwareAuthenticationSuccessHanlder: 認証前にアクセスを試みたURLにリダイレクト（デフォルト）&lt;/li&gt;
&lt;li&gt;SimpleUrlAuthenticastionSuccessHandler: コンストラクタに指定したURLにリダイレクトまたはフォワードする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;デフォルトの動作&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;認証前にアクセスを拒否したリクエストをHTTPセッションに保存しておいて、認証が成功した際にアクセスを拒否したリクエストを復元してリダイレクトする仕組みになっている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;デフォルト動作のカスタマイズ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;認証成功時のレスポンスのカスタマイズポイントとして、認証成功時に遷移するデフォルトのパスの変更方法を紹介&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;    http.formLogin()
        .loginPage(&quot;/login&quot;) // 認証を必要とするURLに遷移した場合、このURLにリダイレクトしてログインフォームを表示する仕組み
        .defaultSuccessUrl(&quot;/menu&quot;) // 認証成功時のデフォルトアクセスはルート。カスタマイズするために記載
        .permitAll(); // すべてのユーザーに対してログインフォームへのアクセス件を付与する

&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;9.4.5 データベース認証&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;データベース認証の仕組み&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SpringSecurityはクライアントからの認証依頼を受け、DaoAuthenticationProviderの認証処理を呼び出す&lt;/li&gt;
&lt;li&gt;DaoAuthenticationProviderは、UserDetailsServiceのユーザー情報取得処理を呼び出す&lt;/li&gt;
&lt;li&gt;UserDetailsServiceの実装クラスは、データストアからユーザー情報を取得する&lt;/li&gt;
&lt;li&gt;UserDetailsServiceの実装クラスは、データストアから取得したユーザー情報からUserDetailsを生成する&lt;/li&gt;
&lt;li&gt;DaoAuthenticationProviderは、UserDetailsServiceから返却されたUserDetailsとクライアントが指定した認証情報との照合を行い、クライアントが指定したユーザーの正当性をチェックする。クライアントが指定したユーザーが正当なユーザーでない場合は、認証例外をスローする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メモ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SpringSecurityはユーザー情報をリレーショナルデータベースからJDBC経由で取得するための実装クラスを提供しているが、最低限の認証処理しか行わないため、そのまま利用できるケースは少ないと思われる&lt;/li&gt;
&lt;li&gt;そのため本書では、UserDetailsとUserDetailsServiceの実装クラスを作成する方法を紹介します。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;UserDetailsの作成&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MEMO:※細かいのでソースを確認 後で追記&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;認証処理の適用&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.4.6 パスワードのハッシュ化&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;いくつか、パスワードを扱う実装クラスが提供されている&lt;/li&gt;
&lt;li&gt;MEMO:※細かいのでソースを確認 後で追記&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.4.7 認証イベントのハンドリング&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SpringSecurityは、SpringFrameworkが提供しているイベント通知の仕組みを利用して、&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;認証処理の結果を他のコンポーネントへ連携する仕組みを提供しています&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;この仕組を利用すると以下のようなセキュリティ要件をSpringSecurityの認証機能に組み込むことができます&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;認証成功、失敗などの認証履歴をデータベースやログに保存したい&lt;/li&gt;
&lt;li&gt;パスワードを連続して誤った場合にアカウントをロックしたい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;認証イベントの通知は以下のような仕組みで行われる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;認証イベントの通知の流れ&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;SpringSecurityの認証機能は、認証結果をAuthenticationEventPublisherに渡して認証イベントの通知依頼を行う&lt;/li&gt;
&lt;li&gt;AuthenticationEventPublisherインターフェースのデフォルトの実装クラスは、認証結果に対応する認証イベントクラスのインスタンスを生成し、ApplicationEventPublisherに渡してイベントの通知依頼を行う&lt;/li&gt;
&lt;li&gt;ApplicationEventPublisherインターフェースの実測クラスは、ApplicationListenerインターフェースの実装クラスにイベントを通知する&lt;/li&gt;
&lt;li&gt;ApplicationListenerの実装クラスの１つであるApplicationListenerMethodAdaptorは、&lt;code&gt;@org.springframework.context.event.EventLintener&lt;/code&gt;が付与されているメソッドを呼び出してイベントを通知する&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メモ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Spring4.1まではApplicationListenerインターフェースの実装クラスを作成して、イベントを受け取る必要があった&lt;/li&gt;
&lt;li&gt;Spring4.2からは、POJOに&lt;code&gt;@EventListener&lt;/code&gt;を付与したメソッドを実装するだけでイベントを受け取ることができる&lt;/li&gt;
&lt;li&gt;Spring4.2以降も、従来と同じ用にApplicationListenerインターフェースの実装クラスを作成してイベントを受け取ることができる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;認証成功イベント&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;認証が成功したときにSpringSecurityが通知する主なイベントは以下の３つです。&lt;/li&gt;
&lt;li&gt;この３つのイベントは途中でエラーが発生しなければ、以下の順番ですべて通知されます
&lt;ul&gt;
&lt;li&gt;AuthenticationSuccessEvent
&lt;ul&gt;
&lt;li&gt;AuthenticationProviderによる認証処理が成功したことを通知する。&lt;/li&gt;
&lt;li&gt;このイベントをハンドリングすると、クライアントが正しい認証情報を指定したことを検知することができるが、後続の認証処理でエラーになる可能性がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SessionFixationProtectionEvent
&lt;ul&gt;
&lt;li&gt;セッション固定攻撃対策の処理（セッションIDの変更処理）が成功したことを通知する。このイベントをハンドリングすると、変更後のセッションIDを検知することができる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;InteractiveAuthenticationSuccessEvent
&lt;ul&gt;
&lt;li&gt;認証処理がすべて成功したことを通知する。このイベントをハンドリングすると、画面遷移を除くすべての認証処理が成功したことを検知することができる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;認証失敗イベント&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;認証が失敗したときにSpringSecurityが通知する主なイベントは以下の通り&lt;/li&gt;
&lt;li&gt;認証に失敗した場合は、以下のいずれか１つのイベントが通知される
&lt;ul&gt;
&lt;li&gt;AuthenticationFailureBadCredentialsEvent&lt;/li&gt;
&lt;li&gt;AuthenticationFailureDisabledEvent&lt;/li&gt;
&lt;li&gt;AuthenticationFailureLockedEvent&lt;/li&gt;
&lt;li&gt;AuthenticationFailureExpiredEvent&lt;/li&gt;
&lt;li&gt;AuthenticationFailureCredentialsExpiredEvent&lt;/li&gt;
&lt;li&gt;AuthenticationFailureServiceExceptionEvent&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;イベントリスナの作成&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;認証イベントの通知を受け取って処理を行いたい場合、&lt;code&gt;@EventListener&lt;/code&gt;を付与したメソッドを実装したクラスを作成し、DIコンテナに登録するだけ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;

/**
 * - 認証イベントの通知の流れ
 *    1. SpringSecurityの認証機能は、認証結果をAuthenticationEventPublisherに渡して認証イベントの通知依頼を行う
 *    2. AuthenticationEventPublisherインターフェースのデフォルトの実装クラスは、認証結果に対応する認証イベントクラスのインスタンスを生成し、ApplicationEventPublisherに渡してイベントの通知依頼を行う
 *    3. ApplicationEventPublisherインターフェースの実測クラスは、ApplicationListenerインターフェースの実装クラスにイベントを通知する
 *    4. ApplicationListenerの実装クラスの１つであるApplicationListenerMethodAdaptorは、`@org.springframework.context.event.EventLintener`が付与されているメソッドを呼び出してイベントを通知する
 *
 * - `@EventLitener`を付与したメソッドを実装するだけで認証成功/失敗時の処理を実装できる仕組み
 * @author Tomo
 *
 */
@Slf4j
@Component
public class AppSecurityEventListener {

  // ==============================
  //  SUCCESS EVENT HANDLERS
  // ==============================

  /**
   * AuthenticationProviderによる認証処理が成功したことを通知する。
   * このイベントをハンドリングすると、クライアントが正しい認証情報を指定したことを検知することができるが、
   * 後続の認証処理でエラーになる可能性がある。
   * @param event
   */
  @EventListener
  public void handleAuthenticationSuccess(AuthenticationSuccessEvent event) {
    //
  }

  /**
   * セッション固定攻撃対策の処理（セッションIDの変更処理）が成功したことを通知する。
   * このイベントをハンドリングすると、変更後のセッションIDを検知することができる。
   * @param event
   */
  @EventListener
  public void handleSessionFixationProtection(SessionFixationProtectionEvent event) {
    //
  }

  /**
   * 認証処理がすべて成功したことを通知する。
   * このイベントをハンドリングすると、画面遷移を除くすべての認証処理が成功したことを検知することができる。
   * @param event
   */
  @EventListener
  public void handleInteractiveAuthenticationSuccess(InteractiveAuthenticationSuccessEvent event) {
    //
  }

  // ==============================
  //  FAILURE EVENT HANDLERS
  // ==============================

  @EventListener
  public void handleBadCredentials(AuthenticationFailureBadCredentialsEvent event) {
    log.info(&quot;BAD Credentials is detected. username : {}&quot;, event.getAuthentication().getName());
  }

  @EventListener
  public void handleDisabled(AuthenticationFailureDisabledEvent event) {
    log.info(&quot;Disabled user is detected. username : {}&quot;, event.getAuthentication().getName());
  }

  @EventListener
  public void handleLocked(AuthenticationFailureLockedEvent event) {
    log.info(&quot;Locked user is detected. username : {}&quot;, event.getAuthentication().getName());
  }

  @EventListener
  public void handleExpired(AuthenticationFailureExpiredEvent event) {
    log.info(&quot;Expired user is detected. username : {}&quot;, event.getAuthentication().getName());
  }

  @EventListener
  public void handleCredentialsExpired(AuthenticationFailureCredentialsExpiredEvent event) {
    log.info(&quot;CredentialsExpired is detected. username : {}&quot;, event.getAuthentication().getName());
  }

  @EventListener
  public void handleServiceException(AuthenticationFailureServiceExceptionEvent event) {
    log.info(&quot;ServiceException is detected. username : {}&quot;, event.getAuthentication().getName());
  }
}


&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;9.4.8 ログアウト&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SpringSecurityは以下のような流れでログアウト処理を行う&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;クライアントは、ログアウト処理を行うためのパスにリクエストを送信する&lt;/li&gt;
&lt;li&gt;LogoutFilterは、LogoutHandlerのメソッドを呼び出してログアウト処理を行う&lt;/li&gt;
&lt;li&gt;LogoutFilterは、LogoutSuccessHandlerのメソッドを呼び出して画面遷移を行う&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;LogoutHandlerの実装クラス&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SecurityContextLogoutHandler: 認証情報のクリアとセッションの破棄を行う&lt;/li&gt;
&lt;li&gt;CookieClearingLogoutHandler: 指定したクッキーの削除するためのレスポンスを行う&lt;/li&gt;
&lt;li&gt;CsrfLogoutHandler: CSRF対策用のトークンの破棄を行う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;こららのLogoutHandlerは、SpringSecurityが提供しているBean定義をサポートするクラスが自動でLogoutFilterに設定する仕組みになっているので、基本的にはアプリケーションの開発者が直接意識する必要はない&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ログアウト処理の適用&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ログアウト処理を適用するには、以下のようなBean定義を行う必要がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;    http.authorizeRequests()
        .antMatchers(&quot;/&quot;, &quot;/find&quot;, &quot;/login&quot;, &quot;/signup&quot;, &quot;/error&quot;, &quot;/login-error&quot;).permitAll()
        .anyRequest().authenticated()
        .and()
        // Login処理
        .formLogin()
        .loginPage(&quot;/login&quot;) // 認証を必要とするURLに遷移した場合、このURLにリダイレクトしてログインフォームを表示する仕組み
        .defaultSuccessUrl(&quot;/menu&quot;) // 認証成功時のデフォルトアクセスはルート。カスタマイズするために記載
        .failureUrl(&quot;/login&quot;) // 認証失敗時ログイン画面に戻す
        .usernameParameter(&quot;id&quot;)
        .passwordParameter(&quot;password&quot;)
        .and()
        // Logout処理
        .logout()
        .logoutRequestMatcher(new AntPathRequestMatcher(&quot;logout**&quot;))
        .logoutSuccessUrl(&quot;/login&quot;)
        .permitAll(); // すべてのユーザーに対してログインフォームへのアクセス件を付与する
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;デフォルトの動作のカスタマイズ
&lt;ul&gt;
&lt;li&gt;遷移先を変える &lt;code&gt;logoutSuccessUrl&lt;/code&gt;の引数を変えてあげる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.4.10 認証情報へのアクセス&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;認証済みのユーザーの認証情報は、SpringSecurityのデフォルト実装では、セッションに格納される&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;セッションに格納された認証情報は、リクエストごとにSecurityContextPersistenceFilterクラスによって&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SecurityContextHolderというクラスに格納され、同一スレッド内であればどこからでもアクセスすることができる用になる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Javaからのアクセス&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一般的な業務アプリケーションでは、「いつ」「誰が」「どのデータに」「どのようなアクセスをしたか」を&lt;/li&gt;
&lt;li&gt;記録する監査ログを取得することがある。この要件を実現する際の、「誰が」は、認証情報から取得できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// 認証情報（Authenticationオブジェクト）を取得する
Authentication authentication =
    SecurityContextHolder.getContext().getAuthentication();

String userUuid = null;
// Authentication#getPrincipal()メソッドを呼び出して、UserDetailsオブジェクトを取得する
// 認証済みでない場合は、匿名ユーザーを表す文字列が返却されるので注意
if (authentication.getPrincipal() instanceof AccountUserDetails) {
    AccountUserDetails userDetails = AccountUserDetails.class.cast(authentication.getPrincipal());
    // UserDetailsから処理に必要な情報を取得する
    userUuid = userDetails.getAccount().getUserUuid();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;アノテーションでアクセスした方が良さそう&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://qiita.com/Hyuga-Tsukui/items/81990938e43c7dff35cf&quot;&gt;https://qiita.com/Hyuga-Tsukui/items/81990938e43c7dff35cf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JSPからのアクセス&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一般的なWebアプリケーションでは、ログインユーザーのユーザー情報などを画面に表示することがある。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;% taglib prefix=&quot;sec&quot; uri=&quot;http://www.springframework.org/security/tags&quot; %&amp;gt;
&amp;lt;%-- ... --%&amp;gt;
ようこそ
&amp;lt;sec:authentication property=&quot;principal.account.lastName&quot; /&amp;gt;
さん。

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;追記：thymeleafからのアクセス&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html xmlns:th=&quot;http://www.thymeleaf.org&quot;
      xmlns:sec=&quot;http://www.thymeleaf.org/thymeleaf-extras-springsecurity4&quot;&amp;gt; &amp;lt;!-- これを追加してThymeleafからSpringSecurityを利用 --&amp;gt;

&amp;lt;!-- 省略 --&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;h1&amp;gt;こんにちは、&amp;lt;span sec:authentication=&quot;principal.userId&quot;&amp;gt;&amp;lt;/span&amp;gt;さん&amp;lt;/h1&amp;gt; &amp;lt;!-- principal.メンバ変数名　で参照できる　--&amp;gt;
&amp;lt;/body&amp;gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;9.4.11 認証処理とSpringMVCの連携&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;SpringSecurityは、SpringMVCと連携するためのコンポーネントをいくつか提供している&lt;/li&gt;
&lt;li&gt;ここでは、認証処理と連携するためのコンポーネントの使い方を紹介&lt;/li&gt;
&lt;li&gt;SpringSecurityは認証情報（UserDetails）をSpringMVCのコントローラーのメソッドに引き渡すためのコンポーネントとして、AuthenticationPrincipalArgumentResolverというクラスを提供している&lt;/li&gt;
&lt;li&gt;これを使用すると、コントローラーのメソッド引数として、UserDetailsインターフェースまたはその実装クラスのインスタンスを受け取ることができる&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;@Controller
public class Controller {

    @RequestMapping(&quot;/&quot;)
    public index(@AuthenticationPrincipal UserDetailsImpl userDetails) {
        System.out.println(userDetails.getUserId) // userId
        System.out.println(userDetails.getPassword) //password
        System.out.println(userDetails.getHoge) //hoge
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;9.4.12 エラーメッセージ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;認証に失敗した場合、SpringSecurityが用意しているエラーメッセージが表示されます&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;このエラーメッセージは内容を変更したり、表示しないようにすることができます。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;エラーメッセージの変更&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;認証失敗時に表示されるエラーメッセージを変更したい場合は、MessageSourceで読み込んでいるプロパティファイルに&lt;/li&gt;
&lt;li&gt;SpringSecurityが用意しているメッセージの定義を追加してください&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;AbstractUserDetailsAuthenticationProvider.badCredentials = 入力した認証情報に誤りがあります。
AbstractUserDetailsAuthenticationProvider.credentialsExpired = 認証情報の利用期限が切れています。
AbstractUserDetailsAuthenticationProvider.disabled = 無効なアカウントです。
AbstractUserDetailsAuthenticationProvider.expired = アカウントの期限が切れています。
AbstractUserDetailsAuthenticationProvider.locked = アカウントがロックされています。
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;この他にも多数のメッセージが用意されている&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;種類を確認するには、&lt;code&gt;spring-security-core&lt;/code&gt;モジュールのjarファイルの中の&lt;code&gt;org/springframework/security/message.properties&lt;/code&gt;ファイルを確認してください&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メッセージ定義定数クラスは自動生成するべきな件&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://terasolunaorg.github.io/guideline/1.0.x/ja/ArchitectureInDetail/MessageManagement.html&quot;&gt;https://terasolunaorg.github.io/guideline/1.0.x/ja/ArchitectureInDetail/MessageManagement.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メモ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MessageSourceの中でプロパティファイルをISO 8859-1(デフォルト)で読み込んでいる場合は、マルチバイト文字は&lt;/li&gt;
&lt;li&gt;Unicodeコード（\udddd表記）形式に変換する必要がある。&lt;/li&gt;
&lt;li&gt;なお、プロパティファイルを任意の文字コードで読み込む場合は、MessageSourceのdefaultEncodingプロパティに文字コードを指定してください。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;  @Bean
  public MessageSource messageSource() {
    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    messageSource.setBasenames(&quot;i18n/messages&quot;); // クラスパス上に格納されているプロパティファイル（拡張子は除く）を指定する
    messageSource.setDefaultEncoding(&quot;UTF-8&quot;); // ★ここのこと！
    return messageSource;
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;システムエラー時のメッセージ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;認証処理の中で予期しないエラー（システムエラーなど）が発生した場合、InternalAuthenticationServiceExceptionという例外が発生する。InteractiveAuthenticationServiceExceptionが保持するメッセージには、&lt;/li&gt;
&lt;li&gt;原因例外のメッセージが設定されるため画面にそのまま表示するのは好ましくない&lt;/li&gt;
&lt;li&gt;システムエラーの例外メッセージを画面に表示しない用にするには、ExceptionMappingAuthenticationFailureHandlerやDelegatingAuthenticationFailureHandlerを使用して、InternalAuthenticationServiceExceptionが発生したときの遷移先をシステムエラー画面にするのが良いでしょう。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TODO: この辺見て実装する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://qiita.com/rubytomato@github/items/6c6318c948398fa62275&quot;&gt;https://qiita.com/rubytomato@github/items/6c6318c948398fa62275&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;9.5 認可処理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;認可処理は、アプリケーションの利用者がアクセスできるリソースを制御するための処理&lt;/li&gt;
&lt;li&gt;最も標準的な方法は、リソース毎にアクセスポリシーを定義しておいて、利用者がリソースにアクセスしようとしたときにアクセスポリシーを調べて制御する方法&lt;/li&gt;
&lt;li&gt;アクセスポリシーには、どのリソースにどのユーザーからのアクセスを許可するかを定義します&lt;/li&gt;
&lt;li&gt;SpringSecurityでは、Webリソース、Javaメソッド、ドメインオブジェクトに対してアクセスポリシーを定義できる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;※ドメインオブジェクトに関する認可処理は本書では扱わない
興味がある場合は、下記参照
&lt;a href=&quot;http://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#domain-acls&quot;&gt;http://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#domain-acls&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;9.5.1 認可処理の仕組み&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SpringSecrityが提供する認証処理の仕組みを理解しましょう&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;以下のような流れで認可処理を行います&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;クライアントが任意のリソースにアクセスする&lt;/li&gt;
&lt;li&gt;FilterSecurityInterceptorクラスは、AccessDecisionManagerインターフェースのメソッドを呼び出し、リソースへのアクセス権の有無をチェックする&lt;/li&gt;
&lt;li&gt;AffirmativeBasedクラス（デフォルトで使用されるAccessDecisionManagerの実装クラス）は、AccessDecisionVoterインターフェースのメソッドを呼び出し、アクセス件の有無を投票してもらう&lt;/li&gt;
&lt;li&gt;FilterSecurityInterceptorは、AccessDecisionManagerによってアクセス権が付与された場合に限り、リソースへアクセスする&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ExceptionTranslationFilter&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;認可処理（AccessDecisionManager）で発生した例外をハンドリングし、&lt;/li&gt;
&lt;li&gt;クライアントに適切なレスポンスを行うためのサーブレットフィルタ&lt;/li&gt;
&lt;li&gt;デフォルトの実装では、未認証ユーザーからのアクセスの場合は、認証を促すレスポンス、認証済みユーザーからのアクセスの場合は、認可エラーを通知するレスポンスを返却する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;FilterSecurityInterceptor&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTTPリクエストに対して認可処理を適用するためのサーブレットフィルタで、実際の認可処理はAccessDecisionManagerに移譲しています。&lt;/li&gt;
&lt;li&gt;AccessDecisionManagerインターフェースのメソッドを呼び出す際には、クライアントがアクセスしようとしたWebリソースに指定されているアクセスポリシーを連携します。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AccessDecisionManager&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アクセスしようとしたリソースに対してアクセス権があるかチェックを行うためのインターフェース&lt;/li&gt;
&lt;li&gt;SpringSecurityが提供する実装クラスでは、このあと紹介するAccessDecisionVoterというインターフェースのメソッドを呼び出してアクセス権を付与するか否かを投票するしくみになっており、デフォルトで適用されるクラスはAffirmativeBasedクラスです。AffirmativeBasedクラスは、いずれかのAccessDecisionVoterが付与を投票した場合にアクセス権を与える実装クラス&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AccessDecisionVoter&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アクセスしようとしたリソースに指定されているアクセスポリシーを参照し、アクセス権を付与するか否かを投票する（付与、拒否、棄権）するためのインターフェース&lt;/li&gt;
&lt;li&gt;SpringSecurityではいくつかの実装クラスを提供しているが、4.0からデフォルトで適用されるクラスは、&lt;code&gt;WebExpressionVoter&lt;/code&gt;に統一されている&lt;/li&gt;
&lt;li&gt;WebExpressionVoterはSpring Expression Languageを使用して、利用者が持つ、権限情報とリクエスト情報を参照して投票を行う実装クラス&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.5.2 アクセスポリシーの記述方法&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SpringSecurityは、アクセスポリシーを指定する記述方法として、SpringExpressionLanguage（SpEL）をサポート&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SpELを使わない方法もあるが、本書では、Expressionを使ってアクセスポリシーを指定する方法で解説する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CommonExpressions&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;※割愛&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.5.3 Webリソースへの認可（JavaConfig編）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;JavaConfigを使用して、Webリソースに対してアクセスポリシーを定義する方法について説明&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;アクセスポリシーを適用するWebリソースの指定&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;まずは、アクセスポリシーを適用するリソースを指定&lt;/li&gt;
&lt;li&gt;アクセスポリシーを適用するリソースの指定は、ExpressionInterceptUrlRegistryクラスの以下のメソッドを呼び出して行います。
&lt;ul&gt;
&lt;li&gt;antMatchers&lt;/li&gt;
&lt;li&gt;regexMatchers&lt;/li&gt;
&lt;li&gt;requestMatchers&lt;/li&gt;
&lt;li&gt;anyRequests&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;  @Override
  public void configure(HttpSecurity http) throws Exception {
    //    http.addFilter(this.preAuthenticatedProcessingFilter());
    //    http.formLogin();
    http.authorizeRequests()
        .antMatchers(&quot;/&quot;, &quot;/find&quot;, &quot;/login&quot;, &quot;/signup&quot;, &quot;/error&quot;, &quot;/login-error&quot;).permitAll()
        // ★記載順には気をつける必要がある
        .antMatchers(&quot;/admin/accounts/***&quot;).hasRole(&quot;ACCOUNT_MANAGER&quot;)
        .antMatchers(&quot;/admin/***&quot;).hasRole(&quot;ADMIN&quot;)
        .anyRequest().authenticated()

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;アクセスポリシーの指定
&lt;ul&gt;
&lt;li&gt;次に、アクセスポリシーを指定します。&lt;/li&gt;
&lt;li&gt;アクセスポリシーの指定は、AuthorizedUrlクラスのメソッドを使用して行います。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;    http.authorizeRequests()
        .antMatchers(&quot;/&quot;, &quot;/find&quot;, &quot;/login&quot;, &quot;/signup&quot;, &quot;/error&quot;, &quot;/login-error&quot;).permitAll()
        //        .antMatchers(&quot;/admin/accounts/***&quot;).hasRole(&quot;ACCOUNT_MANAGER&quot;)
        //        .antMatchers(&quot;/admin/***&quot;).hasRole(&quot;ADMIN&quot;)
        .antMatchers(&quot;/admin/***&quot;).access(&quot;hasIpAddress(&apos;127.0.0.1&apos;) and hasRole(&apos;CONFIGURATION_MANAGER&apos;)&quot;)
        .antMatchers(&quot;/admin/***&quot;).hasRole(&quot;ADMIN&quot;)
        .anyRequest().authenticated()

&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;9.5.4 Webリソースへの認可（XMLファイル編）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;割愛&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.5.5 メソッドへの認可&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SpringSecurityは、SpringAOPの仕組みを利用して、アプリケーションコンテキスト内で管理しているBeanのメソッド呼び出しに対して認可処理を行う仕組みを提供しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;メソッドに対応する認可処理を使用すると、メソッドの引数や戻り値のオブジェクトの状態を参照できるため、よりきめ細かいアクセスポリシーの定義が行える&lt;/li&gt;
&lt;li&gt;メソッドへの認可を使用する場合は、メソッド呼び出しに対して認可処理を行うためのコンポーネント（AOP）を有効にしてから、アクセスポリシーをクラスやメソッドのアノテーションに定義します。
&lt;ul&gt;
&lt;li&gt;つまり
&lt;ul&gt;
&lt;li&gt;AOP有効化&lt;/li&gt;
&lt;li&gt;メソッドにアノテーション定義&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SpringSecurityがサポートしているアノテーションは以下&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;@PreAuthorize,@PostAuthorize,@PreFilter,@PostFilter: SpringSecurityのアノテーション&lt;/li&gt;
&lt;li&gt;@Secured: SpringSecurityのアノテーション&lt;/li&gt;
&lt;li&gt;JSR250(javax.annotation.securityパッケージ)のアノテーション（@RolesAllowedなど）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本書では、アクセスポリシーの指定にExpressionを使用することができる &lt;code&gt;@PreAuthorize&lt;/code&gt;と&lt;code&gt;@PostAuthorize&lt;/code&gt;を紹介する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メソッド認可の有効化&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;まず、メソッドに対して認可処理を行うAOPを有効化します&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;@EnableGlobalMethodSecurity(prePostEnabled = true) // メソッドに対して認可処理を行うAOPを有効化 prePostEnabled属性にtrueを指定すると、Expressionを使用してアクセスポリシーを定義することができるアノテーションが有効になる
public class AppSecurityConfig extends WebSecurityConfigurerAdapter {
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;メソッド実行前に適用するアクセスポリシーの指定
&lt;ul&gt;
&lt;li&gt;メソッドの実行前に適用するアクセスポリシーを指定する場合は&lt;code&gt;@PreAuthorize&lt;/code&gt;を使用する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@PreAuthorize&lt;/code&gt;のvalue属性に指定したExpressionの結果がtrueになるとメソッドの実行が許可される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// 管理者以外の人間が他人のアカウント情報にアクセスできないように定義している
@PreAuthorize(&quot;hasRole(&apos;ADMIN&apos;) or (#username == principal.username)&quot;)
public Account findOne(String username) {
  return accountRepository.findOne(username);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ここでポイントになるのが、Expressionの中からメソッドの引数にアクセスしている部分&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;具体的には、#usernameの部分が引数にアクセスしている部分になる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Expression内で「# + 引数名」形式のExpressionを指定するとメソッドの引数にアクセスすることができる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メモ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SpringSecurityは、クラスに出力されているデバッグ情報から引数名を解決する仕組みになっているが、&lt;/li&gt;
&lt;li&gt;アノテーション（&lt;code&gt;@P&lt;/code&gt;）を使用して明示的に引数名を指定することもできる&lt;/li&gt;
&lt;li&gt;以下の場合は、明示的に引数名を指定してあげる必要がある
&lt;ul&gt;
&lt;li&gt;引数のデバッグ情報を出力しない&lt;/li&gt;
&lt;li&gt;Expressionの中から実際の引数名とは別の名前を使ってアクセスする（例：短縮した名前）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;@PreAuthorize(&quot;hasRole(&apos;ADMIN&apos;) or (#username == principal.username)&quot;)
public Account findOne(@P(&quot;username&quot;) String username) {
  return accountRepository.findOne(username);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;JavaSE8から追加されたコンパイルオプション（-parameters）を使用すると、メソッドパラメータにリフレクション用のメタデータが生成されるため、アノテーションを指定しなくても引数名を解決してくれる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メソッド実行後に適用するアクセスポリシーの指定&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@PostAuthorize&lt;/code&gt;を使用する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;@PreAuthorize(&quot;hasRole(&apos;DEPARTMENT_MANAGER&apos;)&quot;)
@PostAuthorize(&quot;(returnObject == null) or (returnObject.departmentCode == principal.account.departmentCode)&quot;)
public Account findOne(@P(&quot;username&quot;) String username) {
  return accountRepository.findOne(username);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;9.5.6 JSPの画面項目への認可&lt;/h4&gt;
&lt;p&gt;SpringSecurityはJSPタグライブラリを使用してJSPの画面項目に対して認可処理を適用することができる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;※管理者の場合、この項目を表示するなどの制御
&lt;ul&gt;
&lt;li&gt;このURLへ遷移させるなどの制御&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.5.7 認可エラー時のレスポンス&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SpringSecurityはリソースへのアクセスを拒否した場合、以下のような流れでエラーハンドリング、レスポンスを行う&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;SpringSecurityは、リソースやメソッドへのアクセスを拒否するために、AccessDeniedExceptionをスローする&lt;/li&gt;
&lt;li&gt;ExceptionTranslationFilterクラスは、AccessDeniedExceptionを捕捉し、AccessDeniedHandlerまたは、AuthenticationEntryPointインターフェースのメソッドを呼び出してエラー応答を行う&lt;/li&gt;
&lt;li&gt;認証済みのユーザーからのアクセスの場合は、AccessDeniedHandlerインターフェースのメソッドを呼び出してエラー応答を行う&lt;/li&gt;
&lt;li&gt;未認証ユーザーからのアクセスの場合は、AuthenticationEntryPointインターフェースのメソッドを呼び出してエラー応答を行う&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AccessDeniedHandler&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AuthenticationEntryPoint&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;認可エラー時の遷移先&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;    http.exceptionHandling().accessDeniedPage(&quot;/accessDeniedError&quot;);

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;デフォルト動作のカスタマイズ
&lt;ul&gt;
&lt;li&gt;TODO: 認証エラー時にメッセージを出す処理を作るときに記述しないと行けない気がする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;9.6 CSRF対策&lt;/h3&gt;
&lt;h4&gt;9.6.1 Spring SecurityのCSRF対策&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Spring Securityはセッション単位にランダムなトークン値(CSRFトークン)を払い出し、払い出されたCSRFトークンをリクエストパラメータ（HTMLフォームのhidden項目）として送信することで、そのリクエストが正規のWebページからなのか、それとも攻撃者が用意したWebページからなのかを判断する機能がある&lt;/li&gt;
&lt;li&gt;SpringSecurityのデフォルト実装では、POST,PUT,DELETE,PATCHのHTTPメソッドを使用したリクエストに対して、CSRFトークンチェックを行います&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.6.2 CSRF対策機能の適用&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;CSRF対策機能はSpring3.2から追加された機能で、SpringSecurity4.0からデフォルトで適用されるようになりました。&lt;/li&gt;
&lt;li&gt;そのため、CSRF対策機能を有効にするための特別な定義はありません。&lt;/li&gt;
&lt;li&gt;なおCSRF機能を適用したくない場合は、明示的に無効にする必要がある&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;  @Override
  public void configure(HttpSecurity http) throws Exception {
    http.csrf().disable();
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;HTMLフォーム使用時のトークン値の連携&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JSPでの設定を紹介しているため割愛&lt;/li&gt;
&lt;li&gt;Thymeleafだとこんな感じ&lt;a href=&quot;https://qiita.com/nenokido2000/items/22a97a26a5858ddb164f&quot;&gt;https://qiita.com/nenokido2000/items/22a97a26a5858ddb164f&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ajax使用時の連携&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ajaxを使ってリクエストを送信する場合は、SpringSecurityから提供されている&lt;code&gt;&amp;lt;sec:csrfMetaTag&amp;gt;&lt;/code&gt;要素を使用して、HTMLの&lt;code&gt;&amp;lt;meta&amp;gt;&lt;/code&gt;要素としてCSRFトークンの情報を出力し&lt;code&gt;&amp;lt;meta&amp;gt;&lt;/code&gt;要素から取得したトークン値をAjax通信時のリクエストヘッダーに設定して連携します。&lt;/li&gt;
&lt;li&gt;Thymeleafの場合、以下を参考に、Cookieからcsrfトークンを取り出して、詰めて送る
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://qiita.com/nenokido2000/items/22a97a26a5858ddb164f&quot;&gt;https://qiita.com/nenokido2000/items/22a97a26a5858ddb164f&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;CookieにCSRFトークンを詰める処理は以下で行えるようになっている&lt;/li&gt;
&lt;li&gt;&lt;code&gt;http.csrf().csrfTokenRepository(new CookieCsrfTokenRepository());&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.6.3 トークンチェックエラー時のレスポンス&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;CSRFトークンチェックでエラーが発生した場合、SpringSecurityはAccessDeniedHandlerインターフェースを使用してエラーのレスポンスを行う&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CSRFトークンチェックでエラーが発生したときに専用のエラーページに遷移させる場合は、SpringSecurityから提供されているDelegatingAuthenticationFailureHandlerクラスを利用して、それぞれの例外にAccessDeniedHandlerインターフェースの実装クラスを指定してください&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CSRFトークンチェックで使用される例外クラス&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;InvalidCsrfTokenException&lt;/li&gt;
&lt;li&gt;MissingCsrfTokenException
&lt;ul&gt;
&lt;li&gt;TODO: この例外処理を実装する必要がある XMLで記載している例はあるけど、Javaで書いている例がない..&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.6.4 CSRF対策機能とSpringMVCとの連携&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;自動でFormにcsrfトークンが入りますよという説明&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;9.7 セッション管理&lt;/h3&gt;
&lt;h4&gt;9.7.1 セッション管理機能の適用&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;セッション管理機能を使用するには、以下のようなBean定義を行う&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;  @Override
  public void configure(HttpSecurity http) throws Exception {
    http.sessionManagement();
  }

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;sessionManagementメソッドを呼び出し、SessionManagementConfigurerのインスタンスを取得する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SessionManagementConfigurerには、セッション管理機能のコンポーネントの動作をカスタマイズするためのメソッドが定義されている。なお、WebSecurityConfigurerAdapterを継承して、コンフィギュレーションクラスを作成している場合は、sessionManagementメソッドは親クラスの処理で呼び出されるため、デフォルトでセッション管理機能が適用されている&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RESTAPIなどセッションを使用しない場合は、セッションの作成方式を stateless に変更する必要がある&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;セッションの作成方式は以下のオプションから選択することができる
&lt;ul&gt;
&lt;li&gt;always&lt;/li&gt;
&lt;li&gt;ifRequired (デフォルト)&lt;/li&gt;
&lt;li&gt;never&lt;/li&gt;
&lt;li&gt;stateless&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.7.2 URL Rewriting抑止機能&lt;/h4&gt;
&lt;p&gt;URL Rewritingが行われると、URL内にセッションIDが露出してしまうため、セッションIDを盗まれるリスクが高くなります。&lt;/p&gt;
&lt;p&gt;SpringSecurityでは、URL Rewritingを抑止するための仕組みも提供しており、この機能はSpringSecurity4.0以上ではデフォルトで適用されます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TODO: Cookieを許可しない設定になっているとどのような挙動になる？クエリに埋め込まれない？&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.7.3 セッション固定攻撃対策機能&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;セッション管理機能を適用すると、デフォルトでセッション固定攻撃機能が有効になる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;セッション固定攻撃対策機能を使用すると、ログイン成功時に新たセッションIDを払い直すため、攻撃者が事前に払い出したセッションIDが使われることはありません。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;セッション固定攻撃への対策オプション&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;changeSessionId: Servlet3.1で追加されたHttpServletRequest#changeSessionIdメソッドを使用してセッションIDを変更する（Servlet3.1以上のコンテナでのデフォルト動作）&lt;/li&gt;
&lt;li&gt;migrateSession: ログイン前に使用していたセッションを破棄し、新たにセッションを作成する。ログイン前にセッションに格納されていたオブジェクトは新しいセッションに引き継がれる&lt;/li&gt;
&lt;li&gt;newSession: migrateSessionと同じ方法でセッションIDを変更するが、ログイン前に格納されていたオブジェクトは新しいセッションには引き継がれない&lt;/li&gt;
&lt;li&gt;none: SpringSecurityはセッションIDを変更しない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;指定方法&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;
http.sessionManagement().sessionFixation().newSession();

&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;9.7.4 多重ログインの制御&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SpringSecurityは同じユーザー名（ログインID）を使った多重ログインを制御する機能を提供しているが、&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SpringSecurityが提供しているデフォルト実装にはいくつかの制約や注意事項がある&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本書では、これらの制約と注意事項について紹介するが、具体的な使い方は扱わない、リファレンス参照&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SpringSecurityが提供しているデフォルト実装では、ユーザー毎にセッション情報をアプリケーションサーバーのメモリ内で管理します。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;そのため、複数のアプリケーションサーバーを同時に実行するシステムでは利用することができません。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;また、アプリケーションサーバーを停止または再起動するとメモリ内で管理していたセッション情報はクリアされます。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用するアプリケーションサーバーによっては、停止または再起動時のセッション状態を復元する機能を持っているため、実際のセッション状態とSpringSecurityが管理しているセッション情報に不整合が生じる可能性がある&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TODO: Redisで管理する方法探る&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.7.5 無効なセッションを使ったリクエストの検知&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;SpringSecurityは無効なセッションを使ったリクエストを検知する機能を提供している&lt;/li&gt;
&lt;li&gt;無効なセッションとして扱われるリクエストの大部分は、セッションタイムアウト後のリクエストです。&lt;/li&gt;
&lt;li&gt;以下の例では、無効なセッションを検知した際の遷移先として &lt;code&gt;&quot;/error/invalidSession&quot;&lt;/code&gt;を指定することで、この機能を有効化している&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;
http.sessionManagement().invalidSessionUrl(&quot;/error/invalidSession&quot;);

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;9.8 ブラウザのセキュリティ対策機能との連携&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ブラウザが提供するセキュリティ対策機能の一部は、サーバー側で、HTTPのレスポンスヘッダーを出力することで動作を制御することができる&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.8.1 セキュリティヘッダー出力機能の適用&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Spring3.2から追加された機能で、Spring4.0からデフォルトで適用されるようになった&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// 無効にする方法
    http.headers().disable();

&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;9.8.2 デフォルトでサポートしているセキュリティヘッダー&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SpringSecurityがデフォルトでサポートしているレスポンスヘッダーは以下の５つ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cache-Control（Pragma, Expires）
&lt;ul&gt;
&lt;li&gt;コンテンツのキャッシュ方法を支持するヘッダー&lt;/li&gt;
&lt;li&gt;保護されたコンテンツがブラウザにキャッシュされないようにすることで、権限のないユーザーが保護されたコンテンツを閲覧できてしまうリスクを減らすことができる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;X-Frame-Options
&lt;ul&gt;
&lt;li&gt;フレーム（&lt;code&gt;&amp;lt;frame&amp;gt;&lt;/code&gt;または&lt;code&gt;&amp;lt;iframe&amp;gt;&lt;/code&gt;要素）内でコンテンツの表示を許可するか否かを支持するためのヘッダー&lt;/li&gt;
&lt;li&gt;フレーム内でコンテンツが表示されないようにすることで、クリックジャッキングと呼ばれる攻撃手法を使って機密情報を盗み取られるリスクを無くすことができる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;X-Content-Type-Options
&lt;ul&gt;
&lt;li&gt;コンテンツの種類の決定方法を指示するためのヘッダー&lt;/li&gt;
&lt;li&gt;一部のブラウザでは、Content-Typeヘッダーの値を無視して、コンテンツの内容を見て決定します。&lt;/li&gt;
&lt;li&gt;コンテンツの種類を決定する際にコンテンツの内容を見ないようにすることで、クロスサイトスクリプティングを使った攻撃を受ける可能性をへらすことができます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;X-XSS-Protection
&lt;ul&gt;
&lt;li&gt;ブラウザのXSSフィルタ機能を使って有害なスクリプトを検知する方法を支持するためのヘッダー&lt;/li&gt;
&lt;li&gt;XSSフィルタ機能を有効にして有害なスクリプトを検知するようにすれば、クロスサイトスクリプティングを使った攻撃を受ける可能性をへらすことができる。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Strict-Transport-Security
&lt;ul&gt;
&lt;li&gt;HTTPSを使ったアクセスをしたあとに、HTTPを使ってアクセスしようとした際に、HTTPSに置き換えてからアクセスすることを支持するためのヘッダー&lt;/li&gt;
&lt;li&gt;HTTPSでアクセスした後に、HTTPが使われないようにすることで、中間者攻撃と呼ばれる攻撃手法を使って悪意のあるサイトに誘導されるリスクをへらすことができる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TODO: 攻撃手法と対策について再度整理する必要あり&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.8.3 セキュリティヘッダーの選択&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;出力するセキュリティヘッダーを選択したい場合は、以下のようなBean定義を行います。&lt;/li&gt;
&lt;li&gt;ここではSpringSecurityが提供するすべてのセキュリティヘッダーを出力する例になっていますが、実際は必要なものだけ指定する&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;    http.headers()
        .defaultsDisabled()
        .cacheControl().and()
        .frameOptions().and()
        .contentTypeOptions().and()
        .xssProtection().and()
        .httpStrictTransportSecurity();

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;不要なものだけ無効化する方法もある&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;9.9 Spring Securityのテスト&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;MockMvcを使用して「認証処理」や「認可処理」などのテストを行うための機能&lt;/li&gt;
&lt;li&gt;テスト時に適用する認証情報をアノテーションで指定できる機能&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.9.1 Spring Security Testのセットアップ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;依存ライブラリーの追加&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// build.gradle
  testImplementation &apos;org.springframework.security:spring-security-test&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SpringSecurityのサーブレットフィルタの追加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TODO: テスト環境が作れて無いため一旦スキップする&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第10章　Spring Data JPA&lt;/h2&gt;
&lt;h3&gt;10.6 Repositoryの作成と利用&lt;/h3&gt;
&lt;h4&gt;10.6.4 ページネーション&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;TODO: DOMAにあるかどうか&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;10.6.6 監査情報の付与&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;TODO: DOMAにあるかどうか&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第11章　Spring ＋ MyBatis&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;XMLに記述しないといけないので採用したくない&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第12章　Spring＋Thymeleaf&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;SpringBootを始め、ViewにJSPではなくテンプレートエンジンであるThymeleafを使用するケースが増えている&lt;/li&gt;
&lt;li&gt;まずはThymeleaf自体や、Springとセットで開発する際に欠かせない連携ライブラリーの概要を紹介&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;12.1 Thymeleafとは&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Thymeleafは、Webアプリケーションと親和性の高いテンプレートエンジン&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;テンプレートエンジンとは&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;雛形となるドキュメント（テンプレート）に対して、可変データを埋め込むことで動的にドキュメントを生成する仕組み&lt;/li&gt;
&lt;li&gt;この仕組は、MVCフレームワークのModelとViewを分割する考え方と親和性が高く、しばしばMVCフレームワークのVIEWとし利用される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;特徴&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;XHTMLやHTML5に準拠した形で記述できること&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JSPはブラウザが認識できないタグライブラリなどが含まれるため、開発中のJSPを直接ブラウザ上で正確に表示させることが難しいという問題があった&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;一方ThymeleafのテンプレートはHTML5に準拠しているため、テンプレートをブラウザで直接表示させたり。HTMLをデザイナーとプログラマの間で共有することができる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: パーツをIncludeする際はうまく表示できない問題はあると思う&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;12.1.1 Thymeleafのテンプレート&lt;/h4&gt;
&lt;p&gt;ThymeleafはXHTMLやHTML5などで書かれたテンプレートをDOMに変換してから処理を行う仕組みになっている
「処理対象のDOMノード」と「DOMノードに適用する処理」をthネームスペースの属性（th属性）を使用して指定します。&lt;/p&gt;
&lt;p&gt;th属性が指定されているDOMノードは「プロセッサ」と呼ばれるコンポーネントによってDOM操作（追加、削除、変更）が行われる。th属性の属性値には、OGNL（Object-Graph Navigation Language）と呼ばれる式言語を指定でき、式の中から、ユーザー定義のオブジェクトやThymeleafが提供する暗黙オブジェクトにアクセスすることができる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;以下３つのことをDialectと呼ぶ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DOM操作を行うプロセッサ&lt;/li&gt;
&lt;li&gt;th属性の属性値に指定された式を解釈するコンポーネント&lt;/li&gt;
&lt;li&gt;暗黙オブジェクトを生成するコンポーネント
&lt;ul&gt;
&lt;li&gt;→デフォルトでは、StandardDialectクラスが使用される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dialectは拡張可能な仕組みになっており、本書で紹介するthymeleaf-spring4を使う場合は、StandardDiarectクラスを継承した、SpringStandardDialectクラスが使用される&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;12.1.2 ThymeleafとSpringの連携&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;連携する場合、Thymeleafが提供するthymeleaf-spring4モジュールを利用&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SpringMVCがJSP向けに提供しているタグライブラリと同様の機能を、Thymeleafで利用することができる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;実現できる機能&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Thymeleafが管理するテンプレートをSpringMVCのViewとして扱うことができる&lt;/li&gt;
&lt;li&gt;テンプレート内でSpringELを利用することができる&lt;/li&gt;
&lt;li&gt;テンプレートと、フォームクラスおよび入力値チェック結果のバインドが可能となる&lt;/li&gt;
&lt;li&gt;Springが管理するメッセージリソースを利用し、国際化対応のメッセージを表示することができる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;12.2 Spring + Thymeleafのセットアップ&lt;/h3&gt;
&lt;h4&gt;12.2.1 ライブラリのセットアップ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;thymeleaf-spring4を入れる&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;12.2.2 SpringとThymeleafを連携するための設定&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;SringBootだと書かなくても動くっぽいけど明示する意味で&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;
@Configuration
@Import(ThymeleafConfig.class) // Thymeleafを使用することを明示
public class AppConfig implements WebMvcConfigurer {
}

@Configuration
public class ThymeleafConfig {

  @Bean
  public ClassLoaderTemplateResolver templateResolver() {
    ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();
    resolver.setPrefix(&quot;/WEB-INF/templates/&quot;);
    resolver.setSuffix(&quot;.html&quot;);
    resolver.setTemplateMode(&quot;HTML5&quot;);
    resolver.setCharacterEncoding(&quot;UTF-8&quot;);
    return resolver;
  }

  @Bean
  public SpringTemplateEngine templateEngine() {
    SpringTemplateEngine templateEngine = new SpringTemplateEngine();
    templateEngine.setTemplateResolver(templateResolver());
    return templateEngine;
  }

  @Bean
  public ViewResolver viewResolver() {
    ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
    viewResolver.setTemplateEngine(templateEngine());
    viewResolver.setCharacterEncoding(&quot;UTF-8&quot;);
    return viewResolver;
  }

}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;12.3 Thymeleafを利用したViewの実装&lt;/h3&gt;
&lt;h4&gt;12.3.1 はじめてのThymeleaf&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Thymeleafを利用したViewへの変更&lt;/li&gt;
&lt;li&gt;テンプレートの実装&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;12.3.2 テキストの出力&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;th:text --- 属性値に指定した値をXHTMLサニタイジングして出力する
&lt;ul&gt;
&lt;li&gt;ユーザからの入力を表示する際はこちら&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;th:utext --- 属性値に指定した値をXHTMLサニタイジングせずに出力する
&lt;ul&gt;
&lt;li&gt;プロパティファイルでHTML要素を使用して意図的に装飾しているような場合は、th:utext属性を使用してXHTMLサニタイジングせずに出力する必要がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;12.3.3 式の構文&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;基本的な式
&lt;ul&gt;
&lt;li&gt;変数式&lt;/li&gt;
&lt;li&gt;選択変数式&lt;/li&gt;
&lt;li&gt;メッセージ式：これは利用しておきたい&lt;/li&gt;
&lt;li&gt;リンクURL式&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;リテラル&lt;/li&gt;
&lt;li&gt;基本的な演算子&lt;/li&gt;
&lt;li&gt;テキスト演算子&lt;/li&gt;
&lt;li&gt;条件演算子&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;12.3.4 th属性による属性値の設定&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Thymeleafのテンプレートエンジンとしての機能は、th属性に指定された式を解釈し、HTMLの各要素の属性値を設定または上書きすることです。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;特定の属性に値を設定する方法&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;現在の属性値の前後に値を追加する方法&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;存在有無が重要な属性の出力を制御する方法&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;複数の属性に同じ値を設定する方法：AltとTitleに同じ値を入れたりとか&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;任意の属性に値を設定する方法：独自データ属性に値を設定したい場合に使用する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;button th:attr=&quot;data-product-id=${product.id}&quot;&amp;gt;削除&amp;lt;/button&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;12.3.5 HTML要素の出力制御&lt;/h4&gt;
&lt;p&gt;ここまでth属性を使ってHTML属性の属性値を動的に設定する方法を見てきましたが、
動的にHTML要素の出力を制御する必要が出てくる場合がある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;例えば、特定の条件下の場合のみメッセージを表示したり、&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;データの件数だけ行を追加して出力したりする場合などです。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JSPでは、それらの専用タグライブラリが用意されていましたが、Thymeleafでも相当する機能がth属性として提供されている&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;条件による出力有無の制御&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;th:if&lt;/li&gt;
&lt;li&gt;th:unless&lt;/li&gt;
&lt;li&gt;th:switch&lt;/li&gt;
&lt;li&gt;th:case&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;繰り返し出力の制御&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;th:each
&lt;ul&gt;
&lt;li&gt;java.util.Listの実装クラス&lt;/li&gt;
&lt;li&gt;java.util.Iterableの実装クラス&lt;/li&gt;
&lt;li&gt;java.util.Mapの実装クラス&lt;/li&gt;
&lt;li&gt;配列&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;12.3.6 インライン記述&lt;/h4&gt;
&lt;p&gt;th属性を利用しない方法であるインライン記述について説明&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;[[ ${user.name} ]]&lt;/code&gt;でかけるよ&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;インライン記述はデフォルトで無効になっている&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;有効にするには、 &lt;code&gt;th:inline&lt;/code&gt;属性をインライン記述を利用する要素、もしくは親要素に付与する必要がある&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;インライン記述のでメリット&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;テンプレートファイルをブラウザ上で直接表示した際に、インライン記述のテキストがそのまま表示されてしまう点&lt;/li&gt;
&lt;li&gt;th:textの用にサンプルデータを表示することができないため、デザイナーとの分業に支障をきたす可能性がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メモ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;インライン記述はJavascriptなどのスクリプト内でも利用することができる&lt;/li&gt;
&lt;li&gt;これを利用すると、テンプレートをブラウザで静的に表示した場合や、アプリケーションサーバーにデプロイして動的に表示した場合、その両方においてスクリプトを正常に動作させられる。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: 結論（個人的な）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;インライン記述は原則禁止したほうがよいと思う（コーディング規約などで明記すべき）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;12.3.7 コメント&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- 
  このブロックはThymeleafの処理後もテンプレートに残ります。
 --&amp;gt;
&amp;lt;!--/*
  このブロックはThymeleafの処理後に削除される。
*/--&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;12.3.8 Springとの連携&lt;/h4&gt;
&lt;p&gt;本項では、thymleaf-springが提供しているSpringとの連携機能に焦点を当てる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;フォームオブジェクトのバインディング&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;th:object属性&lt;/li&gt;
&lt;li&gt;th:field属性&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;入力エラーの表示&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SpringMVCの入力チェック機能で発生したエラーの表示は、
&lt;ul&gt;
&lt;li&gt;th:errors属性 --- エラーメッセージの出力対象を指定するための属性&lt;/li&gt;
&lt;li&gt;th:errorclass属性 --- エラー時に適用するCSSを指定するための属性&lt;/li&gt;
&lt;li&gt;th:fieldsオブジェクト --- エラー情報にアクセスするための便利なメソッドを提供するオブジェクト
&lt;ul&gt;
&lt;li&gt;を使用して行う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TODO: エラー処理について設計する必要あり&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SpELの利用&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Thymeleafは数式をOGNLとして解釈しますが、thymeleaf-springを利用すると、&lt;/li&gt;
&lt;li&gt;変数式はSpELとして解釈されます。&lt;/li&gt;
&lt;li&gt;これにより、テンプレート内から、DIコンテナ内に登録されているBeanにアクセスできるようになる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span th:text=&quot;${@appSettings.passwordValidDays}&quot;&amp;gt;60&amp;lt;/span&amp;gt;
&amp;lt;!-- @Bean名でアクセスできる --&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;ConversionServiceとの連携
&lt;ul&gt;
&lt;li&gt;SpringMVCに適用されているConversionServiceと連携して、値の型変換を行うことができる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;public class AppSettings implements Serializable {
  @Value(&quot;${vasicPostage:1250}&quot;)
  @NumberFormat(style = NumberFormat.Style.NUMBER)
  private int basicOneDayCost;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span th:text=&quot;${@appSettings.basicOneDayCost}&quot;&amp;gt;1300&amp;lt;/span&amp;gt;円
&amp;lt;span th:text=&quot;${{@appSettings.basicOneDayCost}}&quot;&amp;gt;1300&amp;lt;/span&amp;gt;円
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;12.3.9 テンプレートの共通化&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;テンプレートのフラグメント化&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;共通な内容を別ファイルに切り出す&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;テンプレートのレイアウト化&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;複数のテンプレートで同じデザインレイアウトを適用する場合は、通常、共通的なレイアウトを定義して共有することになる。このような場合に有効なライブラリとして、&lt;code&gt;Thymeleaf Layout Dialect&lt;/code&gt;がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;テンプレートのフラグメント化&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;テンプレートの一部を分割して別ファイルに切り出すことができる&lt;/li&gt;
&lt;li&gt;ヘッダー、フッター、メニューがフラグメントとしてよく利用されるが、特定のUIコンポーネントをフラグメントとして切り出すことも可能
&lt;ul&gt;
&lt;li&gt;フラグメントの利用方法
&lt;ul&gt;
&lt;li&gt;フラグメントの定義と参照という２つの作業が必要になる&lt;/li&gt;
&lt;li&gt;定義方法には以下の２つの方法がある
&lt;ul&gt;
&lt;li&gt;Thymeleafのth:fragment属性を利用したフラグメント定義　★個人的にこっちがわかりやすくていいと思う&lt;/li&gt;
&lt;li&gt;CSSセレクタと同様、id属性を利用したフラグメント定義&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;定義したフラグメントを読み込む方法として以下の２つ
&lt;ul&gt;
&lt;li&gt;Thymeleafのth:include属性を利用したフラグメントのインクルード&lt;/li&gt;
&lt;li&gt;Thymeleafのth:replace属性を利用したフラグメントのち缶&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;テンプレートのレイアウト化&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Thymeleaf Layout Dialectを利用したテンプレートのレイアウト化について説明&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;セットアップ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;thymeleaf-layout-dialect&lt;/code&gt;のリポジトリ追加&lt;/li&gt;
&lt;li&gt;コンフィギュレーションクラスの実装&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;  @Bean
  public SpringTemplateEngine templateEngine() {
    SpringTemplateEngine templateEngine = new SpringTemplateEngine();
    templateEngine.setDialect(new LayoutDialect());
    templateEngine.setTemplateResolver(templateResolver());
    return templateEngine;
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Thymeleaf Layout DialectによるViewの実装&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;共通レイアウトとなるテンプレートを「Decorator」&lt;/li&gt;
&lt;li&gt;共通レイアウトを適用する側の個別のテンプレートを「Fragment」と呼ぶ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: 画面の全体像がわかりづらくなりやすいので、この方法は採用したくないため割愛&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;12.3.10 SpringSecurityとの連携&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SpringSecurityが提供する画面表示に関する機能をThymeleafで利用するためには、&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SpringSecurityDialectを利用します。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;以下の機能&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;認証情報にアクセスする機能を持つ sec:authentication属性を提供&lt;/li&gt;
&lt;li&gt;SpringSecurity expression を利用した認可処理と同等の機能を持つ sec:authorize属性を提供&lt;/li&gt;
&lt;li&gt;URLベースの認可処理を行う sec:authorize-ur属性を提供する&lt;/li&gt;
&lt;li&gt;ACL(Access Control List)を利用した認可処理を行う sec:authorize-acl属性を提供&lt;/li&gt;
&lt;li&gt;CSRFトークンにアクセスする機能を提供&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SpringSecurityDialectのセットアップ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;thymeleaf-extras-springsecurity4&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;認証情報へのアクセス&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html xmlns:th=&quot;http://www.thymeleaf.org&quot;
  xmlns:sec=&quot;http://www.thymeleaf.ort/extras/spring-security&quot;
  th:with=&quot;title=トップページ&quot;&amp;gt;
  &amp;lt;span sec:authentication=&quot;principal.username&quot;&amp;gt;テストユーザ名&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;画面項目への認可&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;適用する画面項目とアクセスポリシーの指定
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sec:authorize=&quot;hasRole(&apos;ADMIN&apos;)&quot;&lt;/code&gt;属性を付与&lt;/li&gt;
&lt;li&gt;Trueの場合、HTMLを表示&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Webリソースとして指定したアクセスポリシーとの連動
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sec:authorize-url=&quot;/admin/accounts&quot;&lt;/code&gt;にアクセスできることを条件として表示非表示を設定している&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CSRFトークンへのアクセス&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Spring Security Dialectを適用するだけでOK hidden項目としてHTMLに埋め込まれます&lt;/li&gt;
&lt;li&gt;ajax通信の際は取得してあげる必要がある
&lt;ul&gt;
&lt;li&gt;headerのmeta要素に設定しといて、JSで取得してあげる感じにする
&lt;ul&gt;
&lt;li&gt;TODO: 取得してPOSTする処理は実装考えてみる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;12.3.11 JSR 310: Date and Time APIの利用&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Thymeleafは、テンプレート内でJSR310:Date and TimeAPIのオブジェクトを操作するための機能を標準ではサポートしておらず、Thymeleafが提供する拡張ライブラリが必要になる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;依存ライブラリの追加&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;thymeleaf-extras-java8timeを利用する&lt;/li&gt;
&lt;li&gt;なお、thymeleaf-extras-java8timeはSpringIO Platformで管理されていないため、バージョンの指定が必要&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bean定義の追加&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;  @Bean
  public SpringTemplateEngine templateEngine() {
    SpringTemplateEngine templateEngine = new SpringTemplateEngine();
    templateEngine.setDialect(new Java8TimeDialect());
    templateEngine.setTemplateResolver(templateResolver());
    return templateEngine;
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;ユーティリティオブジェクト（temporals）を利用&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;title th:text=&quot;|${#temporals.format(date, &apos;yyyy/mm/dd&apos;)}の会議室|&quot;&amp;gt;2020/05/19の会議室&amp;lt;/title&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;第13章　Spring Boot&lt;/h2&gt;
&lt;p&gt;機能が豊富な事による課題がある
どう組み合わせていいかわからなかったり、ちょっとしたWebアプリケーションを作成するだけでも、数多くの設定が必要であったりする点です。&lt;/p&gt;
&lt;p&gt;SpringBootを利用することでこられの課題を解決することができる&lt;/p&gt;
&lt;h3&gt;13.1 SpringBootとは&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SpringBoot&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;２０１３年　　：開発開始&lt;/li&gt;
&lt;li&gt;２０１４年４月：1.0リリース&lt;/li&gt;
&lt;li&gt;２０１６年６月：1.3.5&lt;/li&gt;
&lt;li&gt;２０２０年５月：2.3.0&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SpringBootを使えば、何も設定しなくてもデフォルトで様々な機能が利用可能&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;XMLまたはJavaConfigによるBean定義、ログの設定、Servletの設定などが不要になる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;アプリケーションサーバーをデプロイする必要もなくなり、Javaのmainメソッドを実行すればアプリケーションを実行できる&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;13.1.1 SpringBootで作るHello Worldアプリケーション&lt;/h4&gt;
&lt;h4&gt;13.1.2 AutoConfigureに夜自動設定&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;自動設定の詳細を知りたい場合は、spring-boot-autoconfigureプロジェクトの◯◯AutoConfigurationクラスのソースを読むことをおすすめします。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;13.1.3 Starterによる依存ライブラリの解決&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;starterライブラリの説明&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;13.1.4 実行可能jarの作成&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;実行可能jarとしてパッケージングされる&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;13.2 SpringBootでSpringMVC&lt;/h3&gt;
&lt;h4&gt;13.2.1 RESTful Webサービスの作成&lt;/h4&gt;
&lt;h4&gt;13.2.2 画面遷移型アプリケーションの作成&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SpringBootの自動設定では、TemplateResolverがビュー名につけるプレフィックスとサフィックスのデフォルト値は、&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;それぞれ、&lt;code&gt;classpath:/templates/&lt;/code&gt;と&lt;code&gt;.html&lt;/code&gt;になる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;テンプレートからメッセージを取得する方法&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;title th:text=&quot;#{app.title}&quot;&amp;gt; &amp;lt;!-- ${変数名}ではなく#{メッセージキー名}--&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;13.3 SpringBootでデータアクセス&lt;/h3&gt;
&lt;h4&gt;13.3.1 SpringJDBC&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;これまで必要だったがSpringJDBCでは不要な定義&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;データソースの定義&lt;/li&gt;
&lt;li&gt;トランザクションマネージャの定義&lt;/li&gt;
&lt;li&gt;JdbcTemplateの定義&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SpringBootのデフォルトの挙動としてクラスパス直下に&lt;code&gt;schema.sql&lt;/code&gt;が存在すると起動時にそのSQLファイルを実行&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;13.3.2 Spring Data JPA&lt;/h4&gt;
&lt;h4&gt;13.3.3 MyBatis&lt;/h4&gt;
&lt;h4&gt;13.3.4 コネクションプールライブラリの変更&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SpringBootではDatasourceを定義する必要はなく、自動で生成されます。コネクションプーリングの仕組みも自動で決まり、以下のライブラリのうちクラスパス上にあるものが利用されます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TomcatJDBC&lt;/li&gt;
&lt;li&gt;HikariCP&lt;/li&gt;
&lt;li&gt;Commons DBCP&lt;/li&gt;
&lt;li&gt;Commons DBCP2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TODO: HikariCPが一番速いとのこと&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;13.4 SpringBootでSpring Security&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Spring Security用のプロジェクトも当然用意されています。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;13.4.1 Basic認証&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;デフォルトで有効になるらしい&lt;/li&gt;
&lt;li&gt;デフォルトユーザーはuser&lt;/li&gt;
&lt;li&gt;パスワードはランダムに設定される&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;13.4.2 認証・認可のカスタマイズ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;SpringSecruityの認証・認可の設定は&lt;code&gt;org.springframework.security.config.annotation.web.configuration.WebSecrityConfigurerAdapter&lt;/code&gt;を用いて行う&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;13.5 Spring Bootで型安全なプロパティ設定&lt;/h3&gt;
&lt;p&gt;application.propertiesから値を取得できる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TODO: EnumによるConst管理とどっちがいいか
&lt;ul&gt;
&lt;li&gt;メッセージのとり方確認&lt;/li&gt;
&lt;li&gt;定数管理方法のベストプラクティス&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;13.5.1 @ConfigurationPropertiesを用いたプロパティの設定&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;プロパティを多用するSpringBootでは、安全にプロパティを扱うための仕組みとして、&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;@ConfigurationProperties&lt;/code&gt;アノテーションが用意されている&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TODO: プロパティ管理はこれが良さそう&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;13.5.2 Bean Validationに夜プロパティ値のチェック&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;プロパティ値も、起動時にBindされる際、&lt;code&gt;@NotEmpty&lt;/code&gt;などで値の検証ができる&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;13.5.3 IDEによるプロパティの補完&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;@ConfigurationProperties&lt;/code&gt;を用いて定義したプロパティはIDEで補完が効く&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;補完させるためにプロパティのメタ情報を生成する必要がある&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;spring-boot-configuration-processorの説明&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SpringBootでプロパティを外部化する際は積極的に使用していくとよい&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;13.6 SpringBootAcruatorで運用機能強化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SpringBootでは開発を容易にする機能が提供されるだけでなく、アプリケーションの運用面を考慮した機能も提供されている&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;これを提供するのがSpringBootActuator&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;これだけでアプリケーションの状態を検査するためのエンドポイント（HTTP,JMX,SSH）が追加されたり、ヘルスチェック機能やメトリクス取得機能が有効になる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TODO: 有効にして活用したい&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;13.6.1 HTTPエンドポイントの追加&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;HTTPエンドポイント&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;/autoconfig&lt;/li&gt;
&lt;li&gt;/beans&lt;/li&gt;
&lt;li&gt;/env&lt;/li&gt;
&lt;li&gt;/configprops&lt;/li&gt;
&lt;li&gt;/dump&lt;/li&gt;
&lt;li&gt;/health&lt;/li&gt;
&lt;li&gt;/info&lt;/li&gt;
&lt;li&gt;/logfile&lt;/li&gt;
&lt;li&gt;/metrics&lt;/li&gt;
&lt;li&gt;/mappings&lt;/li&gt;
&lt;li&gt;/shutdown&lt;/li&gt;
&lt;li&gt;/trace&lt;/li&gt;
&lt;li&gt;/flyway&lt;/li&gt;
&lt;li&gt;/liquibase&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;エンドポイントのコンテキストパスやポート番号などはプロパティを使用して変更できる&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;management.context-path=/manage
management.port=8081
management.address=127.0.0.1 # localhostからのみアクセスを許可する

# 個別のエンドポイントの有効無効を次のプロパティで設定
endpoints.shutdown.enabled=true
endpoints.mapping.enabled=false
endpoints.trace.enabled=false

# エンドポイントはHTTPだけでなくJMXでもアクセスできる これらの無効にもできる
management.port=-1 # HTTPエンドポイントを無効にする
endpoints.jmx.enabled=false # JMXエンドポイントを無効にする

&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;13.6.2 ヘルスチェック&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;SpringBootActuatorはヘルスチェック機能を持っている&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;13.6.3 メトリクス&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SpringBootActuatorはメトリクス取得機能も備えている&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;次の２つのメトリクスがサポートされている&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;gauge: 絶対値を記録する&lt;/li&gt;
&lt;li&gt;counter: 差分値を記録する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TODO: メトリクスは収集して管理できる用にしておく&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第14章　チュートリアル&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;会議室予約システムを作成していく手順を記載&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Java EE 7徹底入門 標準Javaフレームワークによる高信頼性Webシステムの構築</title><link>https://tutttuwi.github.io/posts/2020-04_javaee7%E5%BE%B9%E5%BA%95%E5%85%A5%E9%96%80/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2020-04_javaee7%E5%BE%B9%E5%BA%95%E5%85%A5%E9%96%80/</guid><pubDate>Sun, 12 Apr 2020 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Java EE 7徹底入門 標準Javaフレームワークによる高信頼性Webシステムの構築&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;形式：書籍&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;発売日：2015年12月15日&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ISBN：9784798140926&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;価格：本体3,800円＋税&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;仕様：B5変・584ページ&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;分類：プログラミング・開発&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;シリーズ：徹底入門&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;書籍ページ &lt;a href=&quot;https://www.shoeisha.co.jp/book/detail/9784798140926&quot;&gt;https://www.shoeisha.co.jp/book/detail/9784798140926&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;サンプルプログラム &lt;a href=&quot;https://www.shoeisha.co.jp/book/download/9784798140926/detail&quot;&gt;https://www.shoeisha.co.jp/book/download/9784798140926/detail&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Chapter 1 Java EEの基礎知識&lt;/h2&gt;
&lt;h3&gt;1.1 Java EEのこれまで&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;1995年 Sun Microsytems,Inc&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JDK1.0 α版&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;1998年 Sun JPEと呼ぶプロジェクトを立ち上げ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;サーバー側の企業アプリケーション開発にJavaを利用できるようにするために立ち上げ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;1999年12月 フレームワーク提供(J2EE 1.2)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;10個の機能から構成
&lt;ul&gt;
&lt;li&gt;JSP+Servlet → 急速に普及&lt;/li&gt;
&lt;li&gt;EJB&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2001年 J2EE 1.3&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2003年 J2EE 1.4&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;XML対応&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;このころ、オープンソースのフレームワークも台頭&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2006年5月 簡単開発(Ease of Development)をテーマに、名前を改名&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Java Platform Enterprise Edition(JavaEE)と改め新バージョンをリリース&lt;/li&gt;
&lt;li&gt;Java EE 5
&lt;ul&gt;
&lt;li&gt;普及には至らず&lt;/li&gt;
&lt;li&gt;改善をすすめる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2009年12月 JavaEE5をさらに大幅改善したJavaEE6をリリース&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CDI&lt;/li&gt;
&lt;li&gt;プロファイル：全仕様に対するサブセットを提供&lt;/li&gt;
&lt;li&gt;プルーニング：使われなくなって古くなった使用を整理するための仕組み&lt;/li&gt;
&lt;li&gt;→ ミッションクリティカルな企業システムでも採用されるようになった&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;1.1.3 Java EE 7 へ --- 3つのテーマ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;JavaEE6のリリース後、すぐに次期バージョンの検討&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;目をつけたのは「クラウド」&lt;/li&gt;
&lt;li&gt;より簡単にJavaEEアプリケーションをスケールするような機能を考え、GlassFishというアプリケーション・サーバー上で実際に動作するサンプルも作成
&lt;ul&gt;
&lt;li&gt;外部からのフィードバックやスペックリードが集まって再検討した結果次期が早いと判断し見送り&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Column JavaEE7 におけるクラウド対応の見送り&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2012年8月12日 開発の遅れと、仕様化に対する十分な経験、検討が足りなかったため見送りを決定&lt;/li&gt;
&lt;li&gt;期待があった分失望の声もあったが&lt;/li&gt;
&lt;li&gt;有識者やベンダーの多くはこの決断を支持&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;新しいテーマを考えた&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTML5対応&lt;/li&gt;
&lt;li&gt;開発用意/生産性の向上&lt;/li&gt;
&lt;li&gt;エンタープライズニーズへの対応&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.2 Java EEの全体像&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Java EEに含まれる機能の全体像を把握してください&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JavaEEは企業システムのアプリケーション開発に必要なさまざまな機能を１つにまとめた包括仕様（umbrella specification）の総称&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;大小さまざまな39個の仕様から構成されています。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;主に&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;インテグレーションテクノロジー&lt;/li&gt;
&lt;li&gt;ビジネスロジックテクノロジー&lt;/li&gt;
&lt;li&gt;プレゼンテーションテクノロジー
&lt;ul&gt;
&lt;li&gt;を組み合わせながらシステムを構築する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;インテグレーションテクノロジー&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;外部システムと連携するための機能を提供&lt;/li&gt;
&lt;li&gt;外部システム
&lt;ul&gt;
&lt;li&gt;データベース&lt;/li&gt;
&lt;li&gt;メールサーバー&lt;/li&gt;
&lt;li&gt;メッセージングプロバイダ（OpenMQ,WebShereMQ）&lt;/li&gt;
&lt;li&gt;エンタープライズ情報システム（ERP,メインフレーム）等がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ビジネスロジックテクノロジー&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;外部システムと連携するプログラムの実装とユーザーインターフェースのプログラムの実装の間に入り、企業システムの業務で必要とされる処理を実装
&lt;ul&gt;
&lt;li&gt;トランザクションの処理や業務のフローの実装など&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;プレゼンテーションテクノロジー&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;様々なデバイスからアクセスされることを考慮する必要がある&lt;/li&gt;
&lt;li&gt;人だけでなく、物も含め、企業システムに対してアクセスするためのインターフェースを提供&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;1.2.2 Java EEに含まれる機能&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Java Persistence API(JPA)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ORM機能&lt;/li&gt;
&lt;li&gt;JavaSEでも利用可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Java Messagge Service(JMS)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;外部のメッセージングプロバイダを経由して非同期でテキストメッセージやバイナリメッセージを送受信&lt;/li&gt;
&lt;li&gt;JavaSEでも利用可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Batch Applications for the Java Platform&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;データをまとめて一括処理する場合に利用&lt;/li&gt;
&lt;li&gt;JavaSEでも利用可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Java Mail API&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;電子メールクライアントを作成するために必要な機能を提供&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Java EE Connector Architecture(JCA)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EAIを行うために必要な機能を提供&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DI/CDI&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JavaEEに含まれる技術を疎結合で結び合わせるための技術&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enterprise JavaBeans(EJB)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;もともと、分散コンポーネントを作成するための技術として作られました&lt;/li&gt;
&lt;li&gt;JavaEE5以降、EJBはビジネスロジックを簡単に実装するための技術として大きく生まれ変わりました&lt;/li&gt;
&lt;li&gt;XMLの設定は不要で、クラスに対して宣言的に定義できるようになっています。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Java Transaction API(JTA)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;トランザクション管理を行うための技術&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JavaServer Pages(JSP), JSP Standard Tag Library(JSTL)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JSPは動的ページ作成&lt;/li&gt;
&lt;li&gt;JSTLは、ページ内のループ処理やSQLを使用したデータベースアクセスなど、JSPで共通する機能を隠蔽して利用できるようにした専用タグ
&lt;ul&gt;
&lt;li&gt;JSFの導入以降は徐々に置き換えが進む&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JSON-P&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JavaEE7から新たに導入されたJavaEEでJSONを扱うための機能&lt;/li&gt;
&lt;li&gt;次期バージョンでは、JSONデータとJavaオブジェクトをマッピングするJSON Bindingの提供も予定されている
&lt;ul&gt;
&lt;li&gt;→ もう対応されている？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Expression Language(EL)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;簡単な式や変数などを用いて、記述内容の評価が行える言語として作られました&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Servlet&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ServletのプログラムはServletコンテナ（Webコンテナとも呼ばれる）と呼ばれる実行環境上でどうsあ&lt;/li&gt;
&lt;li&gt;HTTP/1.0及び1.1のリクエストに応答する&lt;/li&gt;
&lt;li&gt;ServletはHTTP処理に対する低レベルAPIしか提供しないため、現在はServletのAPIだけでプログラミングを行う場面は少ない&lt;/li&gt;
&lt;li&gt;JSFのようなServletコンテナ上で動作する上位フレームワークへ処理を以上するための仲介役として利用されることが多い&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;WebSocket&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTTPプロトコルをアップグレードした、双方向/全二重通信が可能なプロトコル&lt;/li&gt;
&lt;li&gt;HTTPと比べてメッセージ送受信の際のオーバーヘッドが少ないため、効果的にリアルタイムメッセージの送受信ができる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Java API for RESTful Web Services(JAX-RS)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RESTアーキテクチャに基づいてWebサービスを実装するための機能を提供&lt;/li&gt;
&lt;li&gt;従来、Webサービスの実装にはSOAP Webサービス(JAX-WS)とXMLを用いるのが主流だった&lt;/li&gt;
&lt;li&gt;現在は、分散システム間連携を行うために、RESTful WebサービスとJSONを組み合わせて実装する場面が多くなっている&lt;/li&gt;
&lt;li&gt;JAX-RSの仕様は、HTTPの仕様と密接に関連しており、HTTPメソッドに対応するアノテーションを用いて処理を実装する
&lt;ul&gt;
&lt;li&gt;JAX-WSからJAX-RSへと主流が変わってきたことを理解した&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JavaServer Faces(JSF)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コンポーネントベースで開発が可能なWebアプリケーション開発フレームワーク&lt;/li&gt;
&lt;li&gt;画面は、フェースレット（Facelets）と呼ばれるXHTML形式のテキストファイルに、HTMLタグやJSF専用タグを記入してデザイン&lt;/li&gt;
&lt;li&gt;バックエンドの処理はマネージドビーン（Managed Bean）と呼ばれるPOJOクラス、もしくはCDIクラスで処理を実装&lt;/li&gt;
&lt;li&gt;JSFは標準でHTML5やAjaxへも対応しており、Javascriptの知識がなくても簡単にAjaxプログラミングが行えます&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ビーンバリデーション&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;データの整合性を検証するための機能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Common Annotation&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JavaEE5でMetadata facility for Javaという機能が追加された&lt;/li&gt;
&lt;li&gt;これに関連して、JavaSE環境、JavaEE環境の両方で共通して利用可能なアノテーションが定期された&lt;/li&gt;
&lt;li&gt;例えば
&lt;ul&gt;
&lt;li&gt;インスタンスの生成時、破棄時になんらかの処理を行うことを規定したもの&lt;/li&gt;
&lt;li&gt;処理に対する実行権限を規定したもの&lt;/li&gt;
&lt;li&gt;データベース設定を規定したもの&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;これらのアノテーションを利用して宣言的にプログラミングを行う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Managed Bean&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Common Annotationの中に、Managed Beanというアノテーションがある&lt;/li&gt;
&lt;li&gt;JavaEE環境で管理されているBeanであることが明示される&lt;/li&gt;
&lt;li&gt;Managed Beanは、アプリケーション・サーバーで管理されているリソースの参照や、インスタンスのライフサイクル管理ができる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;通常、Managed Beanのアノテーションを付加したクラスを実装することはほとんど無い&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;しかし、Managed Beanの機能を持つ上位機能（CDI、EJB）でManaged Beanの機能を利用する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Interceptors&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;複数の機能間で横断的な関心事の実装を行うための機能です。&lt;/li&gt;
&lt;li&gt;例えば
&lt;ul&gt;
&lt;li&gt;ログの出力や各処理時間の計測、セキュリティの検査などは、特定部分の実装に限らず、システムの全体で必要な実装&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Concurrency Utilities for Java EE&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JavaEE環境で新たにスレッドを生成するための機能&lt;/li&gt;
&lt;li&gt;JavaEE6まではサーバー環境上で新たなスレッドを生成することは非推奨でした。なぜならば、作成されたスレッドがアプリケーション・サーバーから管理できないスレッドとして動作するためでした&lt;/li&gt;
&lt;li&gt;たとえば
&lt;ul&gt;
&lt;li&gt;セキュリティ情報や、トランザクション情報、コンテキスト情報などを一切含まないため、アプリケーション・サーバーから制御することは不可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;そこで、サーバーが管理できるスレッドを作るために、JavaEE7からConcurrency Utilities for Java EEが新たに導入された&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;1.2.3 Java EE の仕様策定&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Javaの仕様はJCP(Java Community Process)という団体で管理&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Java Specification Requests(JSR)と呼ぶ仕様のリクエストに対して、一意の番号を割り当てて管理している&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JSRをJCPに提出するために必要な成果物について記載（割愛）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;1.2.4 Java EEの実行環境とプロファイル&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;割愛&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.3 Java EEアプリケーション開発の基本&lt;/h3&gt;
&lt;h4&gt;1.3.1 Java EEアプリケーションモデル&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;3階層アプリケーションの開発モデルを採用している
&lt;ul&gt;
&lt;li&gt;ビジネスロジックとユーザーインターフェースを切り分けて実装することが大事&lt;/li&gt;
&lt;li&gt;柔軟性の高いシステムを構築していくことが大事&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.4 開発環境の準備&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;サンプルアプリケーション
&lt;ul&gt;
&lt;li&gt;JavaSE8&lt;/li&gt;
&lt;li&gt;JavaEE7&lt;/li&gt;
&lt;li&gt;GlassFishv4.1.1 (JavaEE参照実装)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;1.4.1 Oracle JDKのインストール&lt;/h4&gt;
&lt;h4&gt;1.4.2 NetBeansのインストール&lt;/h4&gt;
&lt;h4&gt;1.4.3 NetBeansの起動&lt;/h4&gt;
&lt;h3&gt;1.5 サンプルアプリケーションの概要&lt;/h3&gt;
&lt;h4&gt;1.5.1 ナレッジバンク&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;個人が保有する知識情報（ナレッジ）を共有するためのWebアプリケーション&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JavaEE7で一般的なWebアプリケーションを実装するために必要な機能を使用して構築されている&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;画面遷移などの説明&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;1.5.2 ナレッジバンクのセットアップ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;プロジェクトを読み込み&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.6 まとめ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;この章のまとめを記載（割愛）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Chapter 2 プレゼンテーション層の開発――JSFの基本&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;以下の３層に分けて開発を行う
&lt;ul&gt;
&lt;li&gt;プレゼンテーション層&lt;/li&gt;
&lt;li&gt;ビジネスロジック層&lt;/li&gt;
&lt;li&gt;インテグレーション層&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.1 JSF概要&lt;/h3&gt;
&lt;h4&gt;2.1.1 JavaSErver Faces(JSF)とは&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;JSFとはJavaEE5から追加されたプレゼンテーション層を作成するための仕様&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;今まではServletを使用していた
&lt;ul&gt;
&lt;li&gt;サーブレットとは：ブラウザとHTTP通信を行う基礎的な仕様で、最小限の機能を提供
&lt;ul&gt;
&lt;li&gt;入力値とJavaオブジェクトのマッピング&lt;/li&gt;
&lt;li&gt;入力値のチェック&lt;/li&gt;
&lt;li&gt;エラーメッセージのハンドリング
&lt;ul&gt;
&lt;li&gt;など多くの機能が不足していた&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Column MVC1.0&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;次のバージョンのJavaEE8には、「MVC1.0」というプレゼンテーション層を開発する新しい仕様が加わる予定&lt;/li&gt;
&lt;li&gt;Webアプリケーションを開発するフレームワークには、HTTPの通信に紐付けて処理を記述するアクションベースのフレームワーク&lt;/li&gt;
&lt;li&gt;入力フィールドやボタンに紐付けて処理を記述するコンポーネントベースのフレームワークがある&lt;/li&gt;
&lt;li&gt;本書で記述するJSFはコンポーネントベースのフレームワーク&lt;/li&gt;
&lt;li&gt;そのため開発者から、アクションベースの選択肢も必要という意見があがり、JavaEE8でアクションベースのフレームワークである「MVC1.0」を追加することになった&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.2 JSFの構成要素&lt;/h3&gt;
&lt;h4&gt;2.2.1 画面と処理（フェースレットとマネージドビーン）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;フェースレットとは&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;画面レイアウトを記述するXHTMLベースのテンプレートエンジン&lt;/li&gt;
&lt;li&gt;XHTMLとは、HTMLをXMLの文法に適合するように定義し直したもの&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;フェースレットとBeanがどのように紐付いているかを確認&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Column マネージドビーンとバッキングビーン&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;フェースレット似バインドするJavaクラスはマネージドビーンといいますが、&lt;/li&gt;
&lt;li&gt;フェースレットの裏側で処理を行うという意味で、バッキングビーンと呼ばれることもあります。&lt;/li&gt;
&lt;li&gt;マネージドビーンがCDIでも代用できるようになった頃からJSFで使用するマネージドビーンをバッキングビーンと呼ぶことが多くなった&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2.2.2 マネージドビーンとスコープ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;スコープ：マネージドビーンのデータをいつまで保有するかを指定する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;スコープの一覧の紹介&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.3 JSFの画面遷移&lt;/h3&gt;
&lt;h4&gt;2.3.1 画面遷移の方法&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;JSFで次の画面に遷移する場合、遷移先の名前を文字列で指定&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;この画面遷移に使用する文字列を「outcome値」といいます&lt;/li&gt;
&lt;li&gt;遷移するフェースレットのパスを指定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;静的な遷移&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;マネージドビーンの処理を行わずに直接次の画面に遷移する方法&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;動的な遷移&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;マネージドビーンで処理を行い、その結果を基に任意の画面へ遷移する方法&lt;/li&gt;
&lt;li&gt;EL式でメソッドをバインドしている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2.3.2 画面のリダイレクト&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;画面遷移&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;フォワード：処理後に直接Web画面を生成して結果を返す&lt;/li&gt;
&lt;li&gt;リダイレクト：一度ブラウザに処理を返した後にサーバーに再アクセスしてWeb画面を生成する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JSFではリダイレクトを使用して次の画面に遷移する方法を提供している&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;１画面前のURLを表示することを避けるためにこの機能を提供
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;?faces-redirect=true&lt;/code&gt;というパラメータを付与すると動くらしい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;問題：リクエストスコープが効かなくなる
&lt;ul&gt;
&lt;li&gt;対策：フラッシュスコープという特別なスコープを提供している&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.4 JSFの内部処理&lt;/h3&gt;
&lt;h4&gt;2.4.1 コンポーネント指向&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;JSFではWebアプリケーションをより直感的に開発するためにコンポーネントという考え方を導入している&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メリット&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Web画面と処理の紐付けを直感的に行える（HTTPの理解が不要）&lt;/li&gt;
&lt;li&gt;コンポーネントが再利用しやすい&lt;/li&gt;
&lt;li&gt;Web画面のプロトタイプ作成が容易に行える&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コンポーネントツリーとしてアクセスできるJavaクラスが存在するらしい&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2.4.2 ライフサイクル&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;ビューの復元(Restore View)&lt;/li&gt;
&lt;li&gt;リクエスト値の適用(Apply Request Values)&lt;/li&gt;
&lt;li&gt;入力チェック(Process Validations)&lt;/li&gt;
&lt;li&gt;モデル値の更新(Update Model Values)&lt;/li&gt;
&lt;li&gt;アプリケーションの実施(Invoke Application)&lt;/li&gt;
&lt;li&gt;画面の生成(REnder Response)&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;最初のアクセスの場合
&lt;ul&gt;
&lt;li&gt;①の復元フェーズ終了後に、⑥の画面生成フェーズに進み、画面を表示&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ポストバックの場合
&lt;ul&gt;
&lt;li&gt;すでにコンポーネントツリーがあり、値の入力やボタンの操作が実施されているので、&lt;/li&gt;
&lt;li&gt;①→⑥まで順番に実施&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.5 JSFの基本設定&lt;/h3&gt;
&lt;h4&gt;2.5.1 フォルダ構成&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;JSFを使用したWebアプリケーションを作成するにはWAR形式のプロジェクトを作成&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;EAR形式もある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;複数のWARファイルやJARファイルを１つにまとめてZIPにしたもの&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2.5.2 設定ファイル&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;必要な設定ファイル&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;web.xml&lt;/li&gt;
&lt;li&gt;faces-config.xml&lt;/li&gt;
&lt;li&gt;アプリケーションサーバーの設定ファイル&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;web.xml&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;デプロイメントディスクリプタというWebアプリケーションの設定を記述するファイル
&lt;ul&gt;
&lt;li&gt;webアプリケーションの初期設定&lt;/li&gt;
&lt;li&gt;サーブレットの設定&lt;/li&gt;
&lt;li&gt;セキュリティの設定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;WebアプリケーションでJSFを使用する場合は、web.xmlにJSFが提供するFacesServletを設定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;サーブレットの定義&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JSFは内部でサーブレットを使用している&lt;/li&gt;
&lt;li&gt;そのためJSFを使用するにはJSFのサーブレット指定が必要&lt;/li&gt;
&lt;li&gt;ロードオンスタートアップの指定はサーバーの起動時にサーブレットのインスタンス化と初期化を行うという指定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;サーブレットのマッピング定義&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;URLパターンとサーブレットの定義で指定したサーブレット名を指定&lt;/li&gt;
&lt;li&gt;URLパターンは「/faces/*」という指定がJSFでは一般的らしい&lt;/li&gt;
&lt;li&gt;facesで始まっている場合に、JSFのアクセスであるとみなされる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;faces-config.xml&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JSFの設定を記述するファイル
&lt;ul&gt;
&lt;li&gt;国際化のせてい&lt;/li&gt;
&lt;li&gt;フェーズリスなのクラス指定など&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;アプリケーション・サーバー用の設定ファイル&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2.5.3 リソースフォルダ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;JSFの仕様で&lt;code&gt;resources&lt;/code&gt;フォルダに配置するフォルダ構成が決められているらしい&lt;/li&gt;
&lt;li&gt;&lt;code&gt;resouces/[ローカルプレフィックス]/[ライブラリ名]/[ライブラリバージョン]/[リソース名]/[リソースバージョン]&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;→わかりにくいと感じた&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.6 フェースレットタグライブラリ&lt;/h3&gt;
&lt;h4&gt;2.6.1 タグライブラリの種類&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;タグライブラリ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;画面レイアウトで使用するタグを定義したもの&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;種類&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コアタグライブラリ：他のタグライブラリのサポート的な機能を提供するタグライブラリ&lt;/li&gt;
&lt;li&gt;HTMLタグライブラリ：HTMLのタグを生成するタグライブラリ&lt;/li&gt;
&lt;li&gt;フェースレットテンプレーティングタグライブラリ：画面のテンプレート処理や繰り返し処理などを提供するタグライブラリ&lt;/li&gt;
&lt;li&gt;コンポジットコンポーネントタグライブラリ：コンポジットコンポーネントの作成に使用するタグライブラリ&lt;/li&gt;
&lt;li&gt;JSTLコア/ファンクションタグライブラリ：JSPで使用するタグライブラリ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;最も使用頻度が高いのは「HTMLタグライブラリ&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JSTLコア/ファンクションタグライブラリ：JSPというJavaEEの仕様で使用するライブラリでJSFでも使用できるが、他のフェースレットが提供するタグライブラリとの実行タイミングが違うため不具合が発生しやすく、基本的に利用しない&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;※ここで再確認&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JSF
&lt;ul&gt;
&lt;li&gt;フェースレット
&lt;ul&gt;
&lt;li&gt;フェースレットタグライブラリ&lt;/li&gt;
&lt;li&gt;EL式&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;マネージドビーン&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;タグライブラリを利用するには、冒頭でネームスペースの宣言が必要&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2.6.2 HTMLタグライブラリ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;一覧を表で記載（割愛）&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2.6.3 ヘッダーとボディ&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;h:head&amp;gt;&lt;/code&gt;
&lt;code&gt;&amp;lt;h:body&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;2.6.4 リソース&lt;/h4&gt;
&lt;h4&gt;2.6.5 文字の出力&lt;/h4&gt;
&lt;h4&gt;2.6.6 リンクとボタン&lt;/h4&gt;
&lt;p&gt;(割愛)&lt;/p&gt;
&lt;h3&gt;2.7 EL（Expression Language）&lt;/h3&gt;
&lt;h4&gt;2.7.1 ELとは&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;ELとは、演算の結果や値の参照結果を返却するための簡易記法&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#&lt;/code&gt;または、&lt;code&gt;$&lt;/code&gt;で始まり、波括弧で囲んだ中に式を記述
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;$&lt;/code&gt;を使用した場合：ページがレンダリングされた時点で即時評価&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#&lt;/code&gt;を使用した場合：コンポーネントに式として渡され、ライフサイクルのタイミングで遅延評価される
&lt;ul&gt;
&lt;li&gt;JSFでは基本的に&lt;code&gt;$&lt;/code&gt;を使用せずに、&lt;code&gt;#&lt;/code&gt;を使用する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2.7.2 オブジェクトの参照&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@Named&lt;/code&gt;を付与したマネージドビーンの名前はEL式から参照できる&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2.7.3 暗黙オブジェクト&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;暗黙的に参照可能なオブジェクト一覧を記載（割愛）&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2.7.4 演算子&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;算術演算子&lt;/li&gt;
&lt;li&gt;関係演算子&lt;/li&gt;
&lt;li&gt;論理演算子&lt;/li&gt;
&lt;li&gt;三項演算子&lt;/li&gt;
&lt;li&gt;空演算子
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;empty a&lt;/code&gt; : aがNullまたは空文字の場合trueを返す&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2.7.5 メソッドの呼び出し&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;メソッドも呼び出せるよって言う説明（割愛）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Chapter 3 プレゼンテーション層の開発――JSFの応用 その1&lt;/h2&gt;
&lt;h3&gt;3.1 入力チェック&lt;/h3&gt;
&lt;h4&gt;3.1.1 入力チェック（バリデーション）とは&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;JSFのライフサイクルの中にある&lt;/li&gt;
&lt;li&gt;JSFでは入力した値をチェックする機能を提供している&lt;/li&gt;
&lt;li&gt;バリデーションの方法として以下の２つを提供
&lt;ul&gt;
&lt;li&gt;JSFの初期から提供されているJSFのバリデーション&lt;/li&gt;
&lt;li&gt;JavaEE6で導入されたビーンバリデーション★&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3.1.2 JSFのバリデーション&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;バリデーションタグを利用する（割愛）&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3.1.3 JSFのカスタムバリデータ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;細かなチェックをするために独自でバリデータを作成する方法
&lt;ul&gt;
&lt;li&gt;メソッドを作成する方法&lt;/li&gt;
&lt;li&gt;クラスを作成する方法&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3.1.4 ビーンバリデーションとは&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;ビーンのフィールドにアノテーションを付与するだけでチェックができる&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3.1.5 ビーンバリデーションのバリデータ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ビーンバリデーションのアノテーション一覧&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@NotNull&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Null&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Max&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Min&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.....&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;point: 入力値が空文字の場合NULL値として扱う場合、web.xmlにパラメータを追加する必要がある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;javax.faces.INTERPRET_EMPTY_STRING_SUBMITED_VALUES_AS_NULL&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3.1.6 ビーンバリデーションのエラーメッセージ変更&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;メッセージを変更する方法は２つある
&lt;ul&gt;
&lt;li&gt;アノテーションに、&lt;code&gt;message&lt;/code&gt;属性を指定する&lt;/li&gt;
&lt;li&gt;propertiesファイルで管理する
&lt;ul&gt;
&lt;li&gt;多言語対応などする場合、こちらが得策&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3.1.7 ビーンバリデーションのバリデータ統合&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;MEMO: ★このテクニックは覚えておきたい&lt;/li&gt;
&lt;li&gt;入力チェックに複数の条件がある場合には、フィールドに標準のアノテーションを複数設定するが、同じような条件を何度も設定するのは面倒なので、アノテーションを作成してまとめる&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3.1.8 ビーンバリデーションのカスタマイズバリデータ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;ビーンバリデーションのカスタマイズも可能
&lt;ul&gt;
&lt;li&gt;MEMO:（実装方法省略）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.2 コンバータ&lt;/h3&gt;
&lt;h4&gt;3.2.1 コンバータの役割&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Web画面に表示する文字列とマネージドビーンのプロパティで保持するJavaのオブジェクトを変換するための仕組み&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JSFにより自動的に変換されるオブジェクトも存在する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;short&lt;/li&gt;
&lt;li&gt;int&lt;/li&gt;
&lt;li&gt;long&lt;/li&gt;
&lt;li&gt;float&lt;/li&gt;
&lt;li&gt;double&lt;/li&gt;
&lt;li&gt;boolean&lt;/li&gt;
&lt;li&gt;byte&lt;/li&gt;
&lt;li&gt;char&lt;/li&gt;
&lt;li&gt;BigInteger&lt;/li&gt;
&lt;li&gt;BigDecimal&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JSFでは任意のフォーマットで画面表示を行うため、標準のコンバータを提供している&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3.2.2 標準のコンバータ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;JSFが標準で提供するコンバータは、日付や数値とおじ列を相互に変換するコンバータ
&lt;ul&gt;
&lt;li&gt;f:convertDateTime&lt;/li&gt;
&lt;li&gt;f:convertNumber&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3.2.3 カスタムコンバータ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;独自で作成したクラスなどの標準のコンバータでは対応できないクラスでは、独自にコンバータを作成する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JSFが提供する&lt;code&gt;javax.faces.convert.Converter&lt;/code&gt;インターフェースを実装したクラスを作成する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: 確かに変換が必要な場面は絶対あるはずなので、thymeleafとかがどのように変換を持っているか確認する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;他のフレームワークでも、convertを実装する方法を書いていた
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://qiita.com/alpha_pz/items/21c6eda2fe227abfa403&quot;&gt;https://qiita.com/alpha_pz/items/21c6eda2fe227abfa403&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: DBSlectした結果をList(category)にかかえているような書き方をしている&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.3 コンポーネントのカスタマイズ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;JSFではフェースレットが提供するコンポーネントを使用してWeb画面を作成&lt;/li&gt;
&lt;li&gt;独自のコンポーネントを作成することもできる&lt;/li&gt;
&lt;li&gt;方法として２つある
&lt;ul&gt;
&lt;li&gt;コンポーネントクラスを作成するカスタムコンポーネント&lt;/li&gt;
&lt;li&gt;フェースレットでコンポーネントを組み合わせて作成するコンポジットコンポーネント★&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3.3.1 コンポジットコンポーネント&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;１つのフェースレットファイルを作成するだけで、複数の画面で使い回せるコンポーネントを作成することができる
&lt;ul&gt;
&lt;li&gt;MEMO: thymeleafでincludeしている感じと同じ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3.3.2 より高度なコンポジットコンポーネント&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- テンプレート側 --&amp;gt;
&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;
      xmlns:h=&quot;http://xmlns.jcp.org/jsf/html&quot;
      xmlns:knowledge=&quot;http://xmlns.jcp.org/jsf/composite/knowledgecomp&quot;&amp;gt;
    &amp;lt;h:head&amp;gt;
        &amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;
        &amp;lt;h:outputStylesheet library=&quot;css&quot; name=&quot;style.css&quot; /&amp;gt;
        &amp;lt;h:outputScript name=&quot;jsf.js&quot; library=&quot;javax.faces&quot;/&amp;gt;
        &amp;lt;h:outputScript library=&quot;js&quot; name=&quot;application.js&quot; /&amp;gt;
        &amp;lt;title&amp;gt;Knowledge Bank&amp;lt;/title&amp;gt;
    &amp;lt;/h:head&amp;gt;
    &amp;lt;h:body&amp;gt;
        &amp;lt;div id=&quot;top_content&quot;&amp;gt;
            &amp;lt;h:form id=&quot;form&quot;&amp;gt;
                &amp;lt;h1&amp;gt;&amp;lt;h:graphicImage library=&quot;img&quot; name=&quot;logo.png&quot; /&amp;gt;&amp;lt;/h1&amp;gt;
                &amp;lt;div class=&quot;notice&quot;&amp;gt;
                    #{flash.notice}
                &amp;lt;/div&amp;gt;
                &amp;lt;knowledge:login userId=&quot;#{loginBean.userId}&quot; password=&quot;#{loginBean.password}&quot; loginButtonAction=&quot;#{loginBean.login()}&quot;/&amp;gt;
                &amp;lt;div&amp;gt;
                    &amp;lt;h:link outcome=&quot;account/register&quot; value=&quot;アカウント登録&quot;/&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/h:form&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/h:body&amp;gt;
&amp;lt;/html&amp;gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- 利用する側 --&amp;gt;
&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;
      xmlns:h=&quot;http://xmlns.jcp.org/jsf/html&quot;
      xmlns:knowledge=&quot;http://xmlns.jcp.org/jsf/composite/knowledgecomp&quot;&amp;gt;
    &amp;lt;h:head&amp;gt;
        &amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;
        &amp;lt;h:outputStylesheet library=&quot;css&quot; name=&quot;style.css&quot; /&amp;gt;
        &amp;lt;h:outputScript name=&quot;jsf.js&quot; library=&quot;javax.faces&quot;/&amp;gt;
        &amp;lt;h:outputScript library=&quot;js&quot; name=&quot;application.js&quot; /&amp;gt;
        &amp;lt;title&amp;gt;Knowledge Bank&amp;lt;/title&amp;gt;
    &amp;lt;/h:head&amp;gt;
    &amp;lt;h:body&amp;gt;
        &amp;lt;div id=&quot;top_content&quot;&amp;gt;
            &amp;lt;h:form id=&quot;form&quot;&amp;gt;
                &amp;lt;h1&amp;gt;&amp;lt;h:graphicImage library=&quot;img&quot; name=&quot;logo.png&quot; /&amp;gt;&amp;lt;/h1&amp;gt;
                &amp;lt;div class=&quot;notice&quot;&amp;gt;
                    #{flash.notice}
                &amp;lt;/div&amp;gt;
                &amp;lt;knowledge:login userId=&quot;#{loginBean.userId}&quot; password=&quot;#{loginBean.password}&quot; loginButtonAction=&quot;#{loginBean.login()}&quot;/&amp;gt;
                &amp;lt;div&amp;gt;
                    &amp;lt;h:link outcome=&quot;account/register&quot; value=&quot;アカウント登録&quot;/&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/h:form&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/h:body&amp;gt;
&amp;lt;/html&amp;gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Column: コンポーネントで利用可能な暗黙オブジェクト
&lt;ul&gt;
&lt;li&gt;カスタムコンポーネント内でよく利用する暗黙オブジェクト
&lt;ul&gt;
&lt;li&gt;cc: コンポジットコンポーネントの情報が取得できる&lt;/li&gt;
&lt;li&gt;component: 現在のコンポーネントの情報や、親や子のコンポーネントの情報にアクセスすることができる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.4 フェースレットテンプレート&lt;/h3&gt;
&lt;h4&gt;3.4.1 フェースレットテンプレートの利用&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;ヘッダーやサイドバーなどはテンプレート化して管理する説明
&lt;ul&gt;
&lt;li&gt;こっちがthymeleafのincludeに近い&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.5 HTML5フレンドリマークアップ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;JavaEE7(JSF2.2)からHTML5の進化へ対応するためにフレンドリマークアップという機能が導入された
&lt;ul&gt;
&lt;li&gt;以前のJSFでは任意の属性をHTMLとして出力する場合にコンポーネントをカスタマイズして提供していた&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;画面デザインをWebデザイナーが行い、リッチなWeb画面を作ることが一般化&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3.5.1 パススルーアトリビュート&lt;/h4&gt;
&lt;h4&gt;3.5.2 パススルーエレメント&lt;/h4&gt;
&lt;h3&gt;3.6 Ajax&lt;/h3&gt;
&lt;h4&gt;3.6.1 JSFのAjax対応&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;一般的なAjaxの作りでは、データの取得処理や画面の再描画処理をJavascriptで記述する必要がある&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JSFのAjax機能を利用するとJavascriptをほとんど記述せずにWeb画面の部分更新が可能&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ajax専用のタグを使用して、結果をRenderingしている&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: 専用のタグでAjax処理ができるのは、コンポーネントベースのフレームワークであるJSFの特徴だと感じた&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3.6.2 Ajaxを使用した入力チェック&lt;/h4&gt;
&lt;h4&gt;3.6.3 Ajaxのイベントハンドリング&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;イベント実行中や完了、エラー発生時の処理を記述するための方法&lt;/li&gt;
&lt;li&gt;共通化するための方法を紹介&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Chapter 4 プレゼンテーション層の開発――JSFの応用 その2&lt;/h2&gt;
&lt;h3&gt;4.1 認証／認可&lt;/h3&gt;
&lt;h4&gt;4.1.1 認証/認可の仕組み&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;JavaEEのログイン機能を実現するための認証認可の仕組みについて&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ログイン機能を利用する手順&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;アプリケーションサーバーの認証/認可設定をする。&lt;/li&gt;
&lt;li&gt;アプリケーションの認証/認可設定をする。&lt;/li&gt;
&lt;li&gt;プログラムでログイン/ログアウト機能を作成する。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4.1.2 アプリケーションサーバーの認証設定&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;アプリケーション・サーバーに認証の設定を行う必要がある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;認証データの指定先に
&lt;ul&gt;
&lt;li&gt;ファイル&lt;/li&gt;
&lt;li&gt;データベース&lt;/li&gt;
&lt;li&gt;LDAPサーバー　などを指定する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ナレッジバンクではデータベースを指定している&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Glasfishを使用した認証の設定方法を説明&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Glasfishの管理コンソール&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;http://localhost:4848/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;認証設定を行うには&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Configurations＞server-config＞Security＞Realms＞New&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ナレッジバンクではJDBCレルムを使用するので&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ClassNameにJDBCRealmを選択する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4.1.3 アプリケーションの認証設定&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;アプリケーションサーバーの認証設定が終了したら、&lt;/li&gt;
&lt;li&gt;今度はアプリケーションの認証設定を行う&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4.1.4 ログイン/ログアウト機能の作成&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Oracle18cで接続を試していたがどうしてもうまく行かなかった&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oracle11gだとすぐにうまく行った&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ログインの仕組みを作って、&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;実際にloginのfaceletでコンテキストのログインメソッドを呼び出して、認証を済ませる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MEMO: springsecurityみたいなやつ　認証設定は必ず実装しておく&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.2 国際化&lt;/h3&gt;
&lt;h4&gt;4.2.1 JSFの国際化&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;プロパティファイルでロケール管理して、&lt;code&gt;faces-config.xml&lt;/code&gt;で切り替え&lt;/li&gt;
&lt;li&gt;UIViewRootクラスのgetLocaleメソッドやsetLocaleメソッドでも切り替えることができるみたい
&lt;ul&gt;
&lt;li&gt;MEMO: ロケール切り替えは実装しておくべき&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.3 ブックマーカビリティ&lt;/h3&gt;
&lt;h4&gt;4.3.1 ブックマーカビリティとは&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;JSFでは最初にブラウザからアクセスが来た際に、処理をせずに画面を表示する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;しかし、Webアプリケーションでデータの一覧や詳細を表示する画面では、なにかしらの事前処理やデータの取得処理が必要&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;そこで、JSFでは初回アクセス時に処理を実施する機能を提供している&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使い方について説明（割愛）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.4 フェーズリスナ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;JSFのライフサイクル&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ビューの復元(Restore View)&lt;/li&gt;
&lt;li&gt;リクエスト値の適用(Apply Request Values)&lt;/li&gt;
&lt;li&gt;入力チェック(Process Validations)&lt;/li&gt;
&lt;li&gt;モデル値の更新(Update Model Values)&lt;/li&gt;
&lt;li&gt;アプリケーションの実施(Invoke Application)&lt;/li&gt;
&lt;li&gt;画面の生成(REnder Response)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;フェーズ前後で横断的に行う処理はフェーズリスナを使用する&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;package knowledgebank.web.listener;

import java.util.logging.Logger;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;

public class KnowledgePhaseListener implements PhaseListener {

    Logger logger = Logger.getLogger(KnowledgePhaseListener.class.getName());

    @Override
    public void beforePhase(PhaseEvent event) {
        logger.info(event.getPhaseId() + &quot; beforePhase&quot;);
    }

    @Override
    public void afterPhase(PhaseEvent event) {
        logger.info(event.getPhaseId() + &quot; afterPhase&quot;);
    }

    @Override
    public PhaseId getPhaseId() {
        return PhaseId.ANY_PHASE;
    }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4.5 Java EE 7で導入されたJSFの機能&lt;/h3&gt;
&lt;h4&gt;4.5.1 JSF 2.2 の追加機能&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;JSF2.2の仕様には大きな特徴として以下の４つが紹介されている
&lt;ul&gt;
&lt;li&gt;HTML5フレンドリマークアップ（パススルーアトリビュートと、パススルーエレメント）&lt;/li&gt;
&lt;li&gt;リソース・ライブラリコントラクト&lt;/li&gt;
&lt;li&gt;Faces Flows&lt;/li&gt;
&lt;li&gt;ステートレスビュー&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4.5.2 リソース・ライブラリコントラクト&lt;/h4&gt;
&lt;p&gt;リソースの塊を簡単に切り替えることができる仕組み&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;あまり便利に思わなかった&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4.5.3 Faces Flows&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;フロー処理について記載されている&lt;/li&gt;
&lt;li&gt;スコープを設定ファイルやJavaアノテーションで保持できるみたい
&lt;ul&gt;
&lt;li&gt;MEMO: 他のフレームワークではどのようにスコープ持っているのか確認&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4.5.4 ステートレスビュー&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;状態を保持しないビューを作成する機能&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JSFでは画面を表示する際にサーバー側似コンポーネントツリーを作成し、同一画面を表示している間はそのコンポーネントツリーを保持していると説明しました。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ステートレスビューを使用すると、そのコンポーネントツリーを毎回破棄市、アクセスが来るたびに再作成する動きに変わる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ステートレスなアプリを作る上で欠かせない&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MEMO: 他のフレームワークの場合は、redisなどでセッション管理している&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.6 まとめ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ここまでの内容を理解していれば、十分JSFを使用してWebアプリケーションを作成することができる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;紹介していないライブラリ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PrimeFaces&lt;/li&gt;
&lt;li&gt;RichFaces&lt;/li&gt;
&lt;li&gt;OmniFaces&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: 時間があれば見てみる程度で良いかも&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Chapter 5 ビジネスロジック層の開発――CDIの利用&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;本章と次章ではCDIとEJBについて解説&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本章ではCDI&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CDIとEJBの違いについて解説&lt;/li&gt;
&lt;li&gt;CDIがJavaEEに採用された経緯&lt;/li&gt;
&lt;li&gt;CDIの機能　について解説&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.1 CDIとEJB&lt;/h3&gt;
&lt;h4&gt;5.1.1 ビジネスロジック層の部品&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;CDI,EJB&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;いずれも「ビジネスロジック」を記述するための部品である&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CDI&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JavaEE6から採用された新しい技術&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;EJB&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Java2Enterprise Edition（J2EE）の頃から存在する歴史ある技術&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.1.2 CDIとEJBの違い&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;CDIとEJBの違いは「設計の柔軟性」&lt;/li&gt;
&lt;li&gt;CDIの方が自由度が高い&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.2 DI（Dependency Injection）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;CDIについて知る前にDIについて理解しておく必要がある&lt;/li&gt;
&lt;li&gt;DIが考案された歴史的な背景をたどって、CDIの意義について知ることにする&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.2.1 DIとは&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;DI&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;部品間の依存関係を少なくすることで、部品の分離と結合をコントロールするための考え方、及びその仕組みのこと&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;「依存」とは、クラス同士が強いつながりを持つことを意味している&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;直接クラスを宣言し、インスタンス化している強い依存関係は、それ自体で処理が完結しているプログラムモジュール、例えば、&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ビジネスロジック層でしか動かないクラス間の依存については問題ありません。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;一方で各層をまたがる依存関係はできる限り弱い方がよいという考えがある&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;依存関係を弱く保つことができれば、変更点は少なくてすむ&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.2.2 DIによる依存関係の解消&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;DIコンテナがあれば、実行時に動的にクラスを選択できる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用途としては以下&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ある条件において別の実装クラスを必要とするケース
&lt;ul&gt;
&lt;li&gt;処理の流れ自体は変わらないが、ユーザーやリクエストの状況に応じて手続きが異なる、あるいは出力先が異なる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;テストや開発中のモック入れ替え
&lt;ul&gt;
&lt;li&gt;層をまたぐ処理や開発中のクラスを利用しなければならないときに、仮となるモックを利用し、将来的に完成したクラスを入れ替える場合。&lt;/li&gt;
&lt;li&gt;あるいはテストデータを返却するテスト用のモックと完成したクラスを入れ替える場合&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;COLUMN ファクトリメソッドパターン&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DIが実現している実装の入れ替えは、ファクトリメソッドパターンと呼ばれるデザインパターンを採用することでも実現可能&lt;/li&gt;
&lt;li&gt;ファクトリメソッドパターンはオブジェクトの生成を管理するクラスを設けることで、任意の振る舞いを持つオブジェクトを取得する方式&lt;/li&gt;
&lt;li&gt;ただし、ファクトリメソッドパターンを利用していても、結局返却するインスタンスを選択する処理をソースコードに記述しておく必要があり、&lt;/li&gt;
&lt;li&gt;インスタンスをソースコード外で管理するには、プロパティファイルなどを用いる必要があるので、そうするよりはDIコンテナを利用するほうが楽&lt;/li&gt;
&lt;li&gt;MEMO: 再読&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.2.3 JavaEEへのDI取り込み&lt;/h4&gt;
&lt;p&gt;(
割愛
)&lt;/p&gt;
&lt;h3&gt;5.3 CDI&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;CDIとはJavaEE6から導入されたJavaEEアプリケーションサーバー上でDI機能を提供するための仕様&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CDIを使用するために必要な定義&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;インジェクションポイント：&lt;code&gt;@Inject&lt;/code&gt;が指定された変数&lt;/li&gt;
&lt;li&gt;CDIビーン：スコープに関するアノテーションが付与されたクラス&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Column 設定ファイル beans.xml&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JavaEE7 からCDIを使うための設定ファイルであるbeans.xmlは特定の用途を除き不要になりました&lt;/li&gt;
&lt;li&gt;beanx.xmlはインジェクションポイントとCDIビーンの関係性を記述するためのものでしたが、現在では自動的に解決する用になっている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CDIの利点&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;インジェクションを行うのが簡単（アノテーションのみで設定ファイル不要）&lt;/li&gt;
&lt;li&gt;DIを基礎とした様々な機能があらかじめ準備されている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.4 CDI基本編&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;CDI限定子：複数のインジェクション候補クラスが存在する場合に、クラスを特定するためのアノテーション &lt;code&gt;javax.inject.Qualifier&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.4.1 CDIコンテナによるインジェクション&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;CDIコンテナに存在するスコープを過ぎたオブジェクトは破棄される&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.4.2 CDIの型解決方法&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;CDIがインジェクションポイントに対して注入する対象となるインスタンスを解決する方法は２通りある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;インジェクションポイントと対象インスタンスが１対１の場合（自動解決）&lt;/li&gt;
&lt;li&gt;CDI限定子もしくは、beans.xml(@Alternative)で解決する方法&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;結論：CDI限定子（Qualifier）を使用して書いていくのがよい&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;設定ファイルも必要ないし、ソースコードを柔軟に変更しながら開発ができるため&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Column インターフェースを利用するべきか&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;結論：インターフェースは準備しておくべき&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.5 CDI応用編&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;CDIに関わる応用的な利用方法について記述&lt;/li&gt;
&lt;li&gt;CDIの付加機能
&lt;ul&gt;
&lt;li&gt;イベント処理：CDIビーン上である条件を満たした場合に、別のクラスに対して通知を行う機能&lt;/li&gt;
&lt;li&gt;ステレオタイプ：複数アノテーションをまとめて定義する機能&lt;/li&gt;
&lt;li&gt;プロデューサ/ディスポーザ：クラスではなく、フィールドそのものやメソッドの戻り値をインジェクションポイントに注入する機能&lt;/li&gt;
&lt;li&gt;インターセプター/デコレータ：処理の前後に別の処理を入れ込んだり、追加したりする機能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.5.1 イベント処理&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;イベント処理とは&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;設定した閾値を超えるなど、特定の条件を満たす情報が発生したとき、その通知と情報をやりとりすることを指す&lt;/li&gt;
&lt;li&gt;CDIではイベント発火はCDIビーン上で行い、それを処理するクラスを特別な呼び方として「オブザーバ」と呼ぶ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;イベント処理の実装&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;イベント情報を格納するクラスを準備する&lt;/li&gt;
&lt;li&gt;イベントを発火するCDIビーンを作成する&lt;/li&gt;
&lt;li&gt;オブザーバクラスを作成する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;イベント処理の留意事項&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;イベント発火からオブザーバの処理までがすべて同期で実行される&lt;/li&gt;
&lt;li&gt;非同期だと勘違いしないように&lt;/li&gt;
&lt;li&gt;参照関係を持たず、プログラムモジュール間似おける情報のやり取りを非同期で実行したい場合には、次章で説明するJMSを利用するなど別の方法を検討する必要がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.5.2 ステレオタイプの利用&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;複数のアノテーション定義をまとめて管理できる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;@StereoType&lt;/code&gt;を付与してまとめていく&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;上書きもできるが、あまり上書きしすぎると良くない&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: 管理方法について&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;パッケージ名を&lt;code&gt;stereotype&lt;/code&gt;で切って管理する&lt;/li&gt;
&lt;li&gt;クラス名称の接尾字に&lt;code&gt;Type&lt;/code&gt;をつけておくとアノテーションがステレオタイプで有ることを明示できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: Springでもまとめていくアノテーションあるか&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.5.3 プロデューサ/ディスポーザの利用&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;プロデューサを利用すると、インジェクションポイントに注入するオブジェクトをプログラム上で動的に変更することができる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;プロデューサにより作成されたオブジェクトが終了処理の必要なオブジェクトである場合、ディスポーザを利用することで終了処理を記述することができる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;プロデューサアノテーションをメソッドに付与して戻り値に&lt;code&gt;@Inject&lt;/code&gt;指定した変数と同じ型を指定してあげる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メソッドで処理されたあとのオブジェクトがDIコンテナに格納され、インジェクションされる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Disposesアノテーションは、Producerメソッドで提供されたクラスの終了処理を行うためのディスポーザ&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: Springにもこの概念があるかどうか確認&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.5.4 インターセプタとデコレータ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;インターセプターとデコレータについて解説&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;すでに作成済みのメソッドの処理に対して、外部のクラスを用いてその処理の前後や、処理内容に変更を加えることができる技術&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;インターセプター：対象となる処理の前後やライフサイクルに応じて処理を行うための仕組み&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;定義方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@Interceptor&lt;/code&gt;を付与したクラスを作成、メソッドに特定のアノテーション付与して機能に関与しない処理を実装&lt;/li&gt;
&lt;li&gt;利用側のメソッドで&lt;code&gt;@Interceptors()&lt;/code&gt;の引数に作成したインターセプタークラスを追加する&lt;/li&gt;
&lt;li&gt;または、beans.xmlに使用するインターセプターを定義する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Column どこでインターセプターを定義する？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;機能処理内にインターセプター（非機能処理）を記載するのはナンセンス&lt;/li&gt;
&lt;li&gt;beans.xmlで管理する方が良いのではという意見が記載されている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;デコレータ：機能追加をするための仕組み&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;共通のインターフェースを実装したクラスに処理を委譲する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: デコレータの使い所について確認&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Springで同様の機能あるかどうか&lt;/li&gt;
&lt;li&gt;インターセプター＝AOP？こちらも使い所についてまとめておく&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.6 まとめ&lt;/h3&gt;
&lt;p&gt;機能が非常に豊富であることと、ルール似基づいた設計と実装が必要であることをご理解いただけたと思います。&lt;/p&gt;
&lt;h2&gt;Chapter 6 ビジネスロジック層の開発――EJBの利用&lt;/h2&gt;
&lt;h3&gt;6.1 Enterprise Java Beans（EJB）&lt;/h3&gt;
&lt;h4&gt;6.1.1 EJBとは&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;アプリケーションサーバー上で動作するJavaのプログラムのうち、特に「ビジネスロジック」を担当する部品を指す&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;EJBは&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;サーブレットやJSF、Webサーバーなどアプリケーションサーバー外からのリクエストを受け付ける層と&lt;/li&gt;
&lt;li&gt;データベースなどへ情報の永続化を行う層の中間の層の部品として機能する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;機能 EJB3.2&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;トランザクション制御&lt;/li&gt;
&lt;li&gt;Java Persistence APIを介した永続化処理&lt;/li&gt;
&lt;li&gt;Java Messageing Serviceを介したメッセージ駆動処理&lt;/li&gt;
&lt;li&gt;非同期実行制御&lt;/li&gt;
&lt;li&gt;同期実行制御&lt;/li&gt;
&lt;li&gt;スケジュールに基づいた実行&lt;/li&gt;
&lt;li&gt;JNDIを介したインスタンス取得（現在はアノテーションを利用）&lt;/li&gt;
&lt;li&gt;リモートクライアントからの実行&lt;/li&gt;
&lt;li&gt;セキュリティ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;6.1.2 EJBの利点&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;JavaEETutorialを参考&lt;/li&gt;
&lt;li&gt;EJBの利点
&lt;ul&gt;
&lt;li&gt;EJBコンテナがシステムレベルのサービスを提供してくれるため、開発者はビジネスロジックの構築に集中できる&lt;/li&gt;
&lt;li&gt;クライアントとの分離。クライアントにはビジネスロジックを実装する必要がない&lt;/li&gt;
&lt;li&gt;JavaEE準拠のアプリケーションサーバー上であればどこでも動く&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;6.1.3 EJBの種類&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;３種類ある
&lt;ul&gt;
&lt;li&gt;セッションビーン&lt;/li&gt;
&lt;li&gt;メッセージドリブンビーン&lt;/li&gt;
&lt;li&gt;タイマー&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6.2 セッションビーン&lt;/h3&gt;
&lt;h4&gt;6.2.1 セッションビーンとは&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;EJBの中核を成すコンポーネント&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;6.2.2 セッションビーンの種類&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;セッションビーンの種類
&lt;ul&gt;
&lt;li&gt;ステートレスセッションビーン&lt;/li&gt;
&lt;li&gt;ステートフルセッションビーン&lt;/li&gt;
&lt;li&gt;シングルトン&lt;/li&gt;
&lt;li&gt;タイマー&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;6.2.3 ステートレスセッションビーン&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;一番良く利用されるEJBであり、ごくシンプルで基本的なEJB&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ステートレスセッションビーンのクラスに&lt;code&gt;@Stateless&lt;/code&gt;を付与&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;利用側は&lt;code&gt;@EJB&lt;/code&gt;を付与して使用する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;@Stateful&lt;/code&gt;アノテーションを利用する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;留意点&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;クライアントごとにステートフルセッションビーンのインスタンスが作成される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;サーブレットからステートフルセッションビーンを呼び出す場合、&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通常サーブレットは１リクエストスレッドにより１つのインスタンスが利用されるモデルであるため、&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;状態を保持できない&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ライフサイクルの制御&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;生成&lt;/li&gt;
&lt;li&gt;活性化&lt;/li&gt;
&lt;li&gt;非活性化&lt;/li&gt;
&lt;li&gt;破棄&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;非活性化されると、メモリ外にシリアライズ処理され出力される。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;必要になるとデシリアライズされ、メモリ上に復帰する&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;6.2.5 シングルトンセッションビーン&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;@Singleton&lt;/code&gt;アノテーションを付与&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;設定ファイルの読み出しの管理などで使う&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;COLUMN &lt;code&gt;@Startup&lt;/code&gt;アノテーション&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;デプロイされたアプリケーションが有効化されたタイミングですぐにオブジェクトを生成するよう、アプリケーションサーバーに支持するもの&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@DependsOn&lt;/code&gt;というアノテーションもある
&lt;ul&gt;
&lt;li&gt;初期化の依存関係を解消するためのもの&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;MEMO: Springの場合初期化のアノテーションは何を使っているか&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;6.2.6 非同期処理&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;実装には「&lt;code&gt;@Asynchronous&lt;/code&gt;アノテーション」を使用&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;クラスかメソッドに定義する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;クラスの場合はすべてのメソッドが非同期になる&lt;/li&gt;
&lt;li&gt;メソッドの場合は対象メソッドのみ非同期になる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: Futureインターフェースを介した操作について理解する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Column 非同期処理の再実行&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EJBの非同期実行には処理の再投入（再実行）のためのAPIは定義されていないので&lt;/li&gt;
&lt;li&gt;自前で実装するか、他のアーキテクチャを利用する方法も検討する&lt;/li&gt;
&lt;li&gt;キューを利用して後述のメッセージドリブンビーンを使うなどが考えられる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;6.2.7 トランザクション&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@TransactionManagement&lt;/code&gt;アノテーション&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@TransactionAttribute&lt;/code&gt;アノテーションを使用するらしい&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;詳しい使い方については割愛&lt;/p&gt;
&lt;h3&gt;6.3 メッセージドリブンビーン&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;メッセージドリブンビーン（Message Driven Bean: MDB）について解説していく
&lt;ul&gt;
&lt;li&gt;メッセージと呼ばれるものを受け取ることで起動するという用途が限定的なコンポーネント&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;6.3.1 メッセージドリブン便とは&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;MEMO: JMSも理解を深める必要あり&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JMS&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;キューまたはトピックと呼ばれる方式を利用して、主にシステム間やアプリケーション間の情報を受け渡しを行うための仕組み&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Column キューとトピック&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;キューとトピックの違いは、送信元と受取側の数の違いにある
&lt;ul&gt;
&lt;li&gt;キュー：１対１&lt;/li&gt;
&lt;li&gt;トピック：N対M（多対多）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メッセージの受取を担当するのがメッセージドリブンビーン&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MDBは常にキューまたはトピックにメッセージが配信されるのを待機し、監視している&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;6.3.2 実装例&lt;/h4&gt;
&lt;p&gt;割愛&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MEMO: JMSの使用方法とSpringJMSを使う&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6.4 タイマー&lt;/h3&gt;
&lt;h4&gt;6.4.1 タイマーとは&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;EJBには時間を指定して起動するための「タイマーサービス」というものが定義されている&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;タイマーはバッチ処理とは異なるので、むやみに使用するべきではない&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用方法は以下の２種類存在する
&lt;ul&gt;
&lt;li&gt;TimerServiceAPIから登録する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Schedule&lt;/code&gt;を使って登録する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;6.4.2 タイマーサービスのサンプル&lt;/h4&gt;
&lt;p&gt;割愛&lt;/p&gt;
&lt;h4&gt;6.4.3 @Scheduleの実装サンプル&lt;/h4&gt;
&lt;p&gt;割愛&lt;/p&gt;
&lt;h3&gt;6.5 EJBの設計&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;EJBというのはあくまでビジネスロジックの実装を任されているコンポーネント&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;アプリケーションはビジネスロジックだけでは成り立たない&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ブラウザの画面などのプレゼンテーション層&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Webサービスなどのロジック呼び出し部分、データベース接続などの永続化層、外部サービスの呼び出しなどもある&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;EJBはこれらの処理の中間に位置することになる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;EJBを設計する上でまず考える必要があるのは、この「外部の層との接点」&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;6.5.1 EJBメソッドの呼び出しに関する設計&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;（１）やり取りする情報を保持するクラスを作成し、サーブレットとEJB双方から共通のクラスとして参照する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;あまりにも多くの情報を保持し、データベースへの永続化が終わるリクエストの最後まで保持し続けるような長寿クラスにならないように注意する必要&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;（２）引数が増えた分についてはメソッドをオーバーロードして対応する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;注意：公開するメソッドが増えて、Webサービスのエンドポイントになるような場合はWSDLの変更が発生するため注意&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Column JSPからのEJB呼び出し&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;画面生成とビジネスロジックの分離ができないためやめた方がいい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;6.5.2 ローカル呼び出しとリモート呼び出し&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;リモート呼び出しは可能な限り使わないことをおすすめする&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;リモート呼び出しが必要なパターン&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;バッチの実装&lt;/li&gt;
&lt;li&gt;GUIを持つクライアントからのビジネスロジック呼び出し&lt;/li&gt;
&lt;li&gt;多段アプリケーションサーバー構成（処理量による業務分離、接続形態によるレイヤー分割）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;代替手段としてはEJBはローカル使用のみにしておき&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JAX-RSなどを使用した層を準備することが考えられる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: JAX-RS層について深堀り&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;6.5.3 同期/非同期&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;基本的に非同期にするメソッドはいかに絞るとよい
&lt;ul&gt;
&lt;li&gt;すぐに結果を必要としないもの&lt;/li&gt;
&lt;li&gt;結果を得るのに相応の時間がかかる処理&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;6.5.4 負荷量&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;MEMO: 設計する際の負荷について考えるべき&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;6.5.5 データベースアクセス&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;JPA&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JPA以外のO/RマッピングもしくはDAOフレームワーク&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JDBCの直接呼び出し&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通常はEJBと親和性が高いJPAをEJBトランザクション管理下に置くのが容易&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6.6 EJBのテスト&lt;/h3&gt;
&lt;h4&gt;6.6.1 EJBのテストの必要性と難しさ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;EJBの最大の弱点はテストがしづらいものであった&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JavaSEでも必要な資材を準備すれば動くようになったが、一部対応していないらしい&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;6.6.2 EJBテストの準備&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;EJBContainerからEJBモジュールを取得し、Junitなどでテストを実施する説明&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6.7 まとめ&lt;/h3&gt;
&lt;p&gt;CDIとEJBをうまく組み合わせて設計していこうという説明&lt;/p&gt;
&lt;h2&gt;Chapter 7 データアクセス層の開発――JPAの基本&lt;/h2&gt;
&lt;p&gt;本章と次章では、JavaEEのにおけるデータベースへのアクセス方法であるJPAについて解説&lt;/p&gt;
&lt;p&gt;エンティティやクエリといったJPAの構成要素と、JPQLとCriteriaAPIの２種類のクエリについて説明&lt;/p&gt;
&lt;h3&gt;7.1 JPAの基礎知識&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;永続化：Javaのプロセスが終了しても、データが消えずに残るような状態にすること&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.1.1 JPAの構成要素&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;エンティティクラス（データのレイアウトを規定）とエンティティオブジェクト（データを保持）&lt;/li&gt;
&lt;li&gt;エンティティマネージャ
&lt;ul&gt;
&lt;li&gt;エンティティオブジェクトとレコードの紐付けを管理&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;クエリ
&lt;ul&gt;
&lt;li&gt;データを操作&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;永続化ユニット
&lt;ul&gt;
&lt;li&gt;データベースへの接続情報などJPAの設定を記述する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.1.2 エンティティクラスとエンティティオブジェクト&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;そのまま、クラスとオブジェクトという理解&lt;/li&gt;
&lt;li&gt;テーブルとレコード　になぞらえて考えられる&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.1.3 エンティティマネージャ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;エンティティオブジェクトを取得したり、データベースへ反映、削除したりする&lt;/li&gt;
&lt;li&gt;永続化コンテキストの配下にないものは、データベースへは反映されない&lt;/li&gt;
&lt;li&gt;&lt;code&gt;persist()&lt;/code&gt;メソッドで管理下におくみたい&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.1.4 クエリ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;エンティティマネージャが持つ基本的なメソッドを利用する他に、より自由度の高いクエリを用いる方法がある&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JPAが用意しているクエリの定義方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JPQL: SQLに似た記法で記載でき、DBMSを意識しなくて良い&lt;/li&gt;
&lt;li&gt;Criteria API: APIを使ってクエリを組み立てて行く手法。DBMSを意識しなくて良い&lt;/li&gt;
&lt;li&gt;ネイティブクエリ: SQL文をかいていく必要があるので、DBMSが変わればここも変更しないと行けない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;理由がなければJPQLを用いるのが良いだろう&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.1.5 永続化ユニット&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;永続化似関する設定をまとめたもので、実態は&lt;code&gt;persistence.xml&lt;/code&gt;という名前のXMLファイル&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;設定項目としては以下のようなものがある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;永続化ユニットの名前&lt;/li&gt;
&lt;li&gt;トランザクションマネージャの設定&lt;/li&gt;
&lt;li&gt;永続化プロバイダ（JPAの実行エンジン）のクラス名&lt;/li&gt;
&lt;li&gt;永続化プロバイダに与えるプロパティ&lt;/li&gt;
&lt;li&gt;接続先データソースの名前★&lt;/li&gt;
&lt;li&gt;エンティティクラスの名前★&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;データベースの接続先を設定する方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アプリケーションサーバーで定義されているデータソースの名前を指定する方法&lt;/li&gt;
&lt;li&gt;永続化プロバイダのプロパティとして、接続先アドレスやユーザー名、パスワードなどを設定する方法　が挙げられる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JPAの実行エンジンにどれがエンティティクラスなのか検知してもらう設定も入れる&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.1.6 JPAのメリット&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;ResultSetからDTOにうつして..という処理を記述しなくてよい&lt;/li&gt;
&lt;li&gt;メソッドかクエリでアクセスできる&lt;/li&gt;
&lt;li&gt;コード量が従来よりも少ない&lt;/li&gt;
&lt;li&gt;メモリ上にキャッシュされたエンティティオブジェクトを利用できる
&lt;ul&gt;
&lt;li&gt;アプリ開発者はキャッシュの有無を意識する必要はない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;7.2 エンティティの基本&lt;/h3&gt;
&lt;p&gt;（割愛）&lt;/p&gt;
&lt;h4&gt;7.2.1 エンティティクラスの実装&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;エンティティクラスには&lt;code&gt;@Entity&lt;/code&gt;を付与する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;publicでなければならず、finalであってはならない&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;引数のないコンストラクタを作成しとくべき&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Column Serializableについて&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EJBのリモート呼び出し&lt;/li&gt;
&lt;li&gt;複数のアプリケーションサーバーでJPAの２次キャッシュを構成する場合&lt;/li&gt;
&lt;li&gt;MEMO: 他のORMはSerializableに定義しているか確認&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.2.2 ID&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;エンティティクラスはIDとして定義したフィールドを使用して&lt;code&gt;hashCode&lt;/code&gt;メソッド、&lt;/li&gt;
&lt;li&gt;&lt;code&gt;equals(Object)&lt;/code&gt;メソッドを実装しなければ行けない→通常IDEで自動生成できる&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toString()&lt;/code&gt;をオーバーライドしておくとデバッグに役立つ！&lt;/li&gt;
&lt;li&gt;MEMO: 他のORMでも&lt;code&gt;toString()&lt;/code&gt;オーバーライドしたりしてるか確認&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.2.3 リレーション&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;@OneToMany&lt;/code&gt;等によるエンティティの紐付け型を説明&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: 他のORMでも存在するか確認&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;１対１のリレーションについて&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;通常１対１のリレーションだと、同一エンティティに保持してしまうことが望ましい&lt;/li&gt;
&lt;li&gt;ただし、ライフサイクルが異なるデータだと、別のエンティティに分けた方が良いケースがある&lt;/li&gt;
&lt;li&gt;例）アカウント情報とアカウントに紐づく会社情報
&lt;ul&gt;
&lt;li&gt;アカウント情報：作成されてから削除されるまで&lt;/li&gt;
&lt;li&gt;会社情報：入社して初めてできる、会社に所属しなければレコードがない
&lt;ul&gt;
&lt;li&gt;などのような状況&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;7.3 エンティティマネージャの基本&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;エンティティマネージャの実態は &lt;code&gt;javax.persistence.EntityManager&lt;/code&gt;インターフェース&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;このインターフェースに用意されているメソッドを通してエンティティを操作する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;EntityManagerのインスタンスはCDIを用いてアプリケーションサーバーからインジェクションで取得する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;@PersistenceContext&lt;/code&gt;アノテーションを付与し、属性似unitNameを指定&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;persistence.xml&lt;/code&gt;の&lt;code&gt;&amp;lt;persistence-unit&amp;gt;&lt;/code&gt;タグのname属性と一致した名前を指定&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.3.1 エンティティのライフサイクル&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;ライフサイクル
&lt;ul&gt;
&lt;li&gt;NEW&lt;/li&gt;
&lt;li&gt;MANAGED&lt;/li&gt;
&lt;li&gt;REMOVED&lt;/li&gt;
&lt;li&gt;DETACHED&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.3.2 エンティティオブジェクトの作成と永続化&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// NEW状態でまだ永続化コンテキストと紐付いてない
Account account = new Account();

// MANAGED状態になる 次のコミットのタイミングでデータベースに反映される
EntiryManager em = xxx;
em.persist(account);
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;7.3.3 エンティティオブジェクトの取得と更新&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// 取得したいEntityクラスとIDを指定
// MANAGED状態で取得される
Account account = em.find(Account.class, 0);

// setter経由で値を設定するとデータベースに反映される（コミットしたタイミングで）
account.setName(&apos;てらだよしお&apos;);
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;7.3.4 エンティティの削除&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;em.remove(account);
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;7.3.5 デタッチ&lt;/h4&gt;
&lt;p&gt;EJBのメソッドの外へ出るとDETACHED状態になる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MEMO: 通常アプリでEntityクラスをそのまま画面で使用することは良くないと考える&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;7.4 クエリAPI&lt;/h3&gt;
&lt;p&gt;JPQLとCriteriaAPIを使ったQuery作成方法を記載&lt;/p&gt;
&lt;h4&gt;7.4.1 パラメータ&lt;/h4&gt;
&lt;p&gt;JPQLとCriteriaAPIはパラメータを取ることができる
パラメータは位置で指定する方法と名前で指定する方法があるが通常は名前で指定した方がよい&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MEMO: 名前で指定するルールを作った方が良さそう&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.4.2 サンプルデータ&lt;/h4&gt;
&lt;p&gt;ダウンロードデータの中にあるサンプルデータについての説明&lt;/p&gt;
&lt;h3&gt;7.5 JPQL&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;JPQL(Java Persistence Query Language)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.5.1 JPQLの基本構文&lt;/h4&gt;
&lt;h4&gt;7.5.5 フェッチ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;取得するエンティティにリレーションが定義されている場合、リレーション先のエンティティを&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;どのタイミングでデータベースから取得するかを決めることができる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;これを「フェッチ戦略」という&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Eagerフェッチ&lt;/li&gt;
&lt;li&gt;Lazyフェッチ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Eagerフェッチ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;findメソッド実行時に、リレーション定義されている参照先のオブジェクトも取得する&lt;/li&gt;
&lt;li&gt;リレーション先のエンティティオブジェクトを同時に使用することの多い場合は、&lt;/li&gt;
&lt;li&gt;Eagerフェッチを使用する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Lazyフェッチ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;取得処理時には、リレーション先のエンティティオブジェクトを取得せず、&lt;/li&gt;
&lt;li&gt;リレーション先にはじめてアクセスする際に取得する&lt;/li&gt;
&lt;li&gt;リレーション先のエンティティオブジェクトを頻繁に使用しない場合はLazyにすべき&lt;/li&gt;
&lt;li&gt;デメリット
&lt;ul&gt;
&lt;li&gt;どこでエンティティの取得が行われたか分かりづらい&lt;/li&gt;
&lt;li&gt;性能の劣化の場所を特定しづらい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;N+1問題とJOINフェッチ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;１回のクエリを発行したあとにN回のクエリの発行を必要とすることをN+1問題という&lt;/li&gt;
&lt;li&gt;リレーションが増えるほど、発行するクエリの数が増える&lt;/li&gt;
&lt;li&gt;これに対応するためにJOIN FETCH節を利用する&lt;/li&gt;
&lt;li&gt;JOIN句の後ろにFETCHがつくだけ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.5.6 エンティティオブジェクトの集計&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;シンプルにCountなどを使う方法&lt;/li&gt;
&lt;li&gt;型を意識する必要がある場合、コンストラクタ式を利用する必要があるらしい
&lt;ul&gt;
&lt;li&gt;割愛））&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.5.7 名前付きクエリ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;開発者はJPQLのクエリに名前をつけることができる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;名前をつけられたJPQLのクエリを「名前付きクエリ」と呼ぶ&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;@NamedQueries&lt;/code&gt;と&lt;code&gt;@NamedQuery&lt;/code&gt;を使って名前定義しておく方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MEMO: 他のORMはSQLファイルで管理するのではと思う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;7.6 CriteriaAPI&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Criteriaクエリを利用してクエリを構築していく&lt;/li&gt;
&lt;li&gt;JPQLと役割は同じであるため、JPQL同様に以下の要素から構成
&lt;ul&gt;
&lt;li&gt;SELECT&lt;/li&gt;
&lt;li&gt;FROM&lt;/li&gt;
&lt;li&gt;JOIN&lt;/li&gt;
&lt;li&gt;WHERE&lt;/li&gt;
&lt;li&gt;ORDERBY&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.6.1 Criteria APIの基本構文&lt;/h4&gt;
&lt;p&gt;（割愛）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;利用のメリットがあまりわかない
&lt;ul&gt;
&lt;li&gt;発行されているSQLが分かりづらい&lt;/li&gt;
&lt;li&gt;SQLNativeでかけない&lt;/li&gt;
&lt;li&gt;メソッドなど覚えなくては行けない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Chapter8 データアクセス層の開発 JPAの応用&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;エンティティとデータベースの関連付け&lt;/li&gt;
&lt;li&gt;キャッシュなどJPAの応用的な使い方について紹介&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;8.1 高度なエンティティの利用方法&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;日時を指定する日時型、&lt;/li&gt;
&lt;li&gt;連続した一意の数字を設定するシーケンス、&lt;/li&gt;
&lt;li&gt;リレーション先のエンティティへ処理を伝播するカスケードを紹介&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;8.1.1 フィールドに関する応用&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;日時&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JPAで日時を使用するには、エンティティクラスのフィールドに&lt;code&gt;java.util.Date型&lt;/code&gt;を指定&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Temporal&lt;/code&gt;アノテーションを付与して、引数にTemporalTypeを指定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;シーケンス&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;エンティティのIDにはサロゲートキーを使用するのが　一般的&lt;/li&gt;
&lt;li&gt;サロゲートキーは人工的に作成されたキーであり、業務上の意味がないもの&lt;/li&gt;
&lt;li&gt;MEMO: 一般的にサロゲートキーが使われているのか確認&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@SequenceGenerator&lt;/code&gt;アノテーションを付与し、作成したシーケンスからエンティティフィールドに自動で値を設定するには&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@GeneratedValue&lt;/code&gt;アノテーションを使用する&lt;/li&gt;
&lt;li&gt;MEMO: DBとどのように絡んでくるのか、DB定義側も自動的にシーケンス定義が作成されるのか
&lt;ul&gt;
&lt;li&gt;どのDBもだいたいシーケンス定義を作成できるのか&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;カスケード&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;エンティティオブジェクトに任意の操作をしたあと、リレーション先までその操作を反映させるための機能&lt;/li&gt;
&lt;li&gt;MEMO: 他のORMはどのようにこの機能を持っているか確認&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;複合ID&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@IdClass&lt;/code&gt;か&lt;code&gt;@EmbeddedId&lt;/code&gt;を使用して実装する
&lt;ul&gt;
&lt;li&gt;どちらも主キークラスとして定義する必要あり&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;8.2 ライフサイクルコールバック&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;JPAではコールバックメソッドを使用することで、エンティティオブジェクトの操作に対応した処理を実行することができる&lt;/li&gt;
&lt;li&gt;実装方法は２種類
&lt;ul&gt;
&lt;li&gt;エンティティクラスに実装
&lt;ul&gt;
&lt;li&gt;エンティティの値を変更する場合にとどめてく&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;エンティティリスナに実装
&lt;ul&gt;
&lt;li&gt;エンティティの値を変更する処理は実装せず、共通で使用するような処理にとどめておく&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;→あまり複雑にならないように注意&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;MEMO: 他のORMにはコールバックメソッドの仕組みある？どんな処理を実装するのがベター？&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;8.3 エンティティクラスとテーブル構造&lt;/h3&gt;
&lt;p&gt;Javaアプリケーション開発者がエンティティクラスを作成すると、JPAはエンティティクラスの定義を読み込み、
データベースへテーブルを作成する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MEMO: 他のORMはテーブル自動作成とかされるのか確認&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;8.3.1 テーブル名とカラム名&lt;/h4&gt;
&lt;p&gt;エンティティの変数とカラム名を変更する方法について記載&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;多対多の中間表の名前の付け方&lt;/li&gt;
&lt;li&gt;LOB定義 &lt;code&gt;@Lob&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;8.3.2 索引&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;索引を作成する方法について記載
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@Index(columnList =  &quot;xxxxx,xxxxx,xxxxxx&quot;)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;8.3.3 制約&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;精度とスケール、長さ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@Column(precision=15, scale=0)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Column(length=500)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;一意制約&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: 他のORMでもDBMSの方言を吸収しながらテーブル定義ができるか確認、できなければJPAってすごい&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;他のシステムも同じDBを参照していた場合、衝突する可能性あるので、AP:DBが対になるようなシステムであればよいかも&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;8.4 トランザクション&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;JavaEEには
&lt;ul&gt;
&lt;li&gt;EJBコンテナにより自動的に開始されるトランザクション&lt;/li&gt;
&lt;li&gt;Java開発者が任意で開始するトランザクション
&lt;ul&gt;
&lt;li&gt;がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;8.5 キャッシュ&lt;/h3&gt;
&lt;h4&gt;8.5.1 これまでのデータアクセス&lt;/h4&gt;
&lt;h4&gt;8.5.2 キャッシュを使用したデータアクセス&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Column 複数アプリケーションによるデータ更新
&lt;ul&gt;
&lt;li&gt;複数のアプリケーションが同一のデータベースを更新する場合や他のノードやデータベースでデータが更新されると、&lt;/li&gt;
&lt;li&gt;キャッシュされているエンティティに伝播されないので、整合性が取れなくなる&lt;/li&gt;
&lt;li&gt;MEMO: かなり致命的な問題だと思う... マスタテーブルに使うとか？&lt;/li&gt;
&lt;li&gt;MEMO: 今キャッシュされているエンティティ情報をログに出力する方法などがあれば可視化されてわかりやすいが、ある？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;8.5.5 プリロード&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;EJBの&lt;code&gt;@Startup&lt;/code&gt;などを利用してアプリケーション起動時に１回だけSQLを実行したり、&lt;/li&gt;
&lt;li&gt;JSFやWebサービスを利用して外から初期化処理を起動できるようにすること
&lt;ul&gt;
&lt;li&gt;１回読み込んでおくことでキャッシュに乗せて処理を早くする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;8.5.6 EclipseLink&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;GlassFishではJPAの実行エンジンとして、EclipseLinkを使用している&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;EclipseLinkには&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;エンティティキャッシュ
&lt;ul&gt;
&lt;li&gt;エンティティオブジェクトをキャッシュする機能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;問い合わせキャッシュ　の２種類が存在する
&lt;ul&gt;
&lt;li&gt;クエリの結果をキャッシュする機能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: EcllipseLink以外の実行エンジンなどが存在する？&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;8.6 永続化ユニット&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://itdoc.hitachi.co.jp/manuals/link/cosmi_v0870/APKC/EU070266.HTM&quot;&gt;http://itdoc.hitachi.co.jp/manuals/link/cosmi_v0870/APKC/EU070266.HTM&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;アプリケーションからJPAを使用する場合，次のような情報を定義する必要があります。&lt;/p&gt;
&lt;p&gt;アプリケーション内のエンティティクラスの情報
エンティティクラスとデータベーステーブルとのマッピング情報
JPAプロバイダがデータベースコネクションを取得するためのデータソースの情報
これらの情報を定義したものを永続化ユニットといいます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;APサーバーにJNDIを定義し、APサーバー経由で接続→こちらを推奨しますとのこと&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;設定ファイルをアプリケーションに保持して直接接続&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Column JavaSEでJPAを使う&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;jarファイルをクラスパスに追加して、persistence.xmlを用意すれば使えますとのこと&lt;/li&gt;
&lt;li&gt;EJBコンテナがないので、EntityManagerFactory経由でEntityManagerオブジェクトを取得する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;8.7 環境構築手順&lt;/h3&gt;
&lt;p&gt;割愛&lt;/p&gt;
&lt;h3&gt;8.8 アプリケーション開発手順&lt;/h3&gt;
&lt;h4&gt;8.8.2 JPQLの開発&lt;/h4&gt;
&lt;p&gt;IDE上で試しにSQL流せる機能&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MEMO: 他のORMにも同様の機能あるか確認する&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Chapter9 RESTful Webサービスの開発&lt;/h2&gt;
&lt;h3&gt;9.1 Webサービスの基礎&lt;/h3&gt;
&lt;h4&gt;9.1.1 Webサービスとは&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;サーバーで行われたなんらかの処理の結果をHTMLではなく、処理結果だけで返すものをWebサービスと呼びます&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Webサービスを実現するために使われる技術&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SOAP: 信頼性を必要とする企業間でのWebサービスで多用されている&lt;/li&gt;
&lt;li&gt;REST: 一般に公開されているWebサービスでよく使用されている
&lt;ul&gt;
&lt;li&gt;RESTベースのWebサービスをRESTfulWebサービスと呼ぶ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JavaEEでもSOAPとRESTを利用したWebサービスを作成するためのAPIを提供している&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SOAPを使用したWebサービスを作成するAPIがJAX-WS&lt;/li&gt;
&lt;li&gt;RESTful Webサービスを作成するAPIが、JAX-RS&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.1.2 RESTful Webサービスとは&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;RESTful Webサービスとは、RESTに則ったWebサービス&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;REST原則&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a.すべてのリソースに一意なアドレス（URI）を与える&lt;/li&gt;
&lt;li&gt;b.情報の操作には予め定義された命令体型（統一インターフェイスという）を使用する&lt;/li&gt;
&lt;li&gt;c.プラットフォームに応じて複数の表現（データ形式）を使用する&lt;/li&gt;
&lt;li&gt;d.セッションなどの状態管理を行わず、ステートレスに通信する&lt;/li&gt;
&lt;li&gt;e.アプリケーションはリンクによって、次の状態に遷移する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;上記のすべてを守る必要はないが、少なくとも、aとbは守っておくべき&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;制約がゆるいので、かんたんに実装できる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;一方、SOAPは定義が厳密なので実装ハードルが高い&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.1.3 RESTとHTTP&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;HTTPヘッダー&lt;/li&gt;
&lt;li&gt;HTTPメソッド
&lt;ul&gt;
&lt;li&gt;GET&lt;/li&gt;
&lt;li&gt;POST&lt;/li&gt;
&lt;li&gt;PUT&lt;/li&gt;
&lt;li&gt;DELETE&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;URI
&lt;ul&gt;
&lt;li&gt;MEMO: マトリックスパラメータは初めて聞いた&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ステータスコード&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;9.2 JAX-RSの基本&lt;/h3&gt;
&lt;h4&gt;9.2.1 JAX-RSとは&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;リクエストパラメータ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;マーシャル：XML形式やJSON形式→Javaオブジェクト&lt;/li&gt;
&lt;li&gt;アンマーシャル：Javaオブジェクト→XML形式やJSON形式&lt;/li&gt;
&lt;li&gt;JAX-RS2.0仕様の参照実装はJersey&lt;/li&gt;
&lt;li&gt;JerseyはGlassFishサーバーでも使用されている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;主に５つの機能を提供&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;１．HTTPメソッド/URIパターンとリソースメソッドとのバインド機能&lt;/li&gt;
&lt;li&gt;２．メッセージボディのデータ形式指定機能&lt;/li&gt;
&lt;li&gt;３．リクエスト情報のインジェクション機能&lt;/li&gt;
&lt;li&gt;４．リクエスト/レスポンスのメッセージボディの変換機能&lt;/li&gt;
&lt;li&gt;５．例外のレスポンスマッピング機能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.2.2 サンプルアプリケーションにおけるJAX-RSの機能&lt;/h4&gt;
&lt;h3&gt;9.3 RESTful Webサービス作成のための事前準備&lt;/h3&gt;
&lt;h4&gt;9.3.1 RESTful Webサービスの認証方式&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ナレッジバンクのRESTサービス機能ではWEBアプリケーション機能で採用しているFORM認証ではなく&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;BASIC認証で認証を行う&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;BASIC認証を行うための設定を記載&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;web.xmlに追記するみたい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: 他のフレームワークでBASIC認証を行う方法について整理&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.3.2 データクラス（DTO）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;クライアントからのリクエストをJavaオブジェクトに変換する際に受け皿クラスを作成
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@XMLRootElementアノテーション&lt;/code&gt;などを不要しないと行けないらしく、不便そう&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.3.3 Application サブクラス&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;作成するリソースクラスなど、JAX-RSで使用する一連のファイルをJAX-RSランタイムに通知するためにApplicationサブクラスをクラスパス上に配置&lt;/li&gt;
&lt;li&gt;このファイルの存在により、作成するリソースクラスをRESTful Webサービスとして公開できる&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ApplicationConfig.java&lt;/code&gt;に&lt;code&gt;@ApplicationPath(&quot;xxxxxx&quot;)&lt;/code&gt;を指定することでOK&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;9.4 RESTサービスクラス（サーバー側）の作成&lt;/h3&gt;
&lt;h4&gt;9.4.1 リソースクラスの構成要素&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;RESTful Webサービスで提供する処理を定義するRESTサービスクラスを作成します。&lt;/li&gt;
&lt;li&gt;RESTではすべてをリソースとして扱うため、リソースクラスとも呼ばれる
&lt;ul&gt;
&lt;li&gt;MEMO: Springの場合、Controller&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.4.2 エンドポイントURIの設定&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@Path(&quot;{id}&quot;)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;などと指定&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.4.3 HTTPメソッドとリソースメソッドのバインド&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@GET&lt;/code&gt;,&lt;code&gt;@POST&lt;/code&gt;などを指定&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.4.4 メッセージボディのデータ形式指定&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;@Consumes({})&lt;/code&gt;: クライアントから受け取るデータ形式&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;@Produces({})&lt;/code&gt;: クライアントに返却するデータ形式&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MINEタイプの抽象化：&lt;code&gt;javax.ws.rs.core.MediaType&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;APPLICATION_XML = &quot;application/xml&quot;;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;などの定義がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Column コンテンツネゴシエーション&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;クライアントがサーバーにリクエストする際に、返してもらいたいメッセージボディのデータ形式やエンコード方式などをリクエストヘッダーで要求できる&lt;/li&gt;
&lt;li&gt;これを「HTTPコンテンツネゴシエーション」といいます。&lt;/li&gt;
&lt;li&gt;コンテンツネゴシエーションはAcceptヘッダーに要求するデータ形式を指定して行う&lt;/li&gt;
&lt;li&gt;要求されたデータ形式をサーバーが提供できない場合、「406 Not Acceptable」のステータスコードをクライアントに返す
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Accept-Charset&lt;/code&gt;ヘッダー、&lt;code&gt;Accept-Language&lt;/code&gt;ヘッダー、&lt;code&gt;Accept-Encoding&lt;/code&gt;ヘッダーなど&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: 見たことはあったが用語として抑えれてなかったので覚えておく&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メッセージボディとJavaオブジェクトとのマッピング&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アンマーシャル：&lt;code&gt;javax.ws.rs.ext.MessageBodyReader&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;マーシャル：&lt;code&gt;javax.ws.rs.ext.MessageBodyWriter&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.4.5 リクエスト情報のインジェクション&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@javax.ws.rs.PathParam&lt;/code&gt;アノテーション：{id}などのパスパラメータを取得&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@javax.ws.rs.QueryParam&lt;/code&gt;アノテーション：クエリパラメータを取得&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@javax.ws.rs.MatrixParam&lt;/code&gt;アノテーション：URIのマトリクスパラメータを取得する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@javax.ws.rs.FormParam&lt;/code&gt;アノテーション：HTMLのフォームから送信された情報を取得する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@javax.ws.rs.HeaderParam&lt;/code&gt;アノテーション：リクエストヘッダーから値を取得する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@javax.ws.rs.CookieParam&lt;/code&gt;アノテーション：リクエストのCookieヘッダーから値を取得する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@javax.ws.rs.core.Context&lt;/code&gt;アノテーション：リクエストURIやリクエストヘッダー、セキュリティ情報などのコンテキスト情報を取得する汎用的なアノテーション&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@javax.ws.rs.BeanParam&lt;/code&gt;アノテーション：リクエストのパラメータ一式をビーンとして取得する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@javax.ws.rs.DefaultValue&lt;/code&gt;アノテーション：対象に値が入らなかった場合、デフォルト値を指定するアノテーション&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.4.6 リクエストのメッセージボディの受取&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;リクエストの引数にアノテーションを付与しなければ、メッセージボディを受け取れる&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.4.7 入力チェック&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;リクエストのメッセージボディにマッピングしているJavaオブジェクトをバリデーションするには&lt;code&gt;@Valid&lt;/code&gt;アノテーションを使用する&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.4.8 レスポンスの定義&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;return する時に &lt;code&gt;javax.ws.rs.core.Response&lt;/code&gt;クラスを用意している&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Response.created(URI.create(&quot;/knowledge&quot; + knowledge.getId())).build()&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;みたいな感じで生成して返却する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;レスポンスメッセージボディのみを指定するときは、Response型以外のオブジェクトを戻り値にするとよい&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;エンティティプロバイダ（&lt;code&gt;MessageBodyWriter&lt;/code&gt;インターフェース実装クラス）がリクエストのAcceptヘッダーに指定されているデータ形式に変換し、レスポンスのメッセージボディに書き出します&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;成功時のレスポンスにメッセージボディが含まれている場合、「200 OK」&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メッセージボディが含まれていない場合、「204 No Content」&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MEMO: レスポンスの 204 No Contentは覚えておく&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;9.5 HTTPメソッドに応じた処理&lt;/h3&gt;
&lt;h4&gt;9.5.1 ナレッジの検索（GETメソッドによる操作）&lt;/h4&gt;
&lt;h4&gt;9.5.2 ナレッジの登録（POSTメソッドによる操作）&lt;/h4&gt;
&lt;h4&gt;9.5.3 ナレッジの更新（PUTメソッドによる操作）&lt;/h4&gt;
&lt;h4&gt;9.5.4 ナレッジの削除（DELETEメソッドによる操作）&lt;/h4&gt;
&lt;h4&gt;9.5.5 例外クラス&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;JAX-RSの例外クラスを使用する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JAX-RS2.0の例外体系&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;非チェック例外である、&lt;code&gt;WebApplicationException&lt;/code&gt;を用意している
&lt;ul&gt;
&lt;li&gt;コンストラクタにステータスコードを指定すると、アプリケーションからスローされた際にステータスコードを含んだResponseインスタンスをクライントに返す&lt;/li&gt;
&lt;li&gt;何も指定しなかったら 500 Internal Server Error&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;JAX-RS2.0ではこのクラスを継承した例外クラスが追加された&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ClientErrorExceptionを継承した例外クラス&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;BadRequestException(400)&lt;/li&gt;
&lt;li&gt;NotAuthorizedException(401)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ServerErrorExceptionを継承した例外クラス&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;InternalServerErrorException(500)&lt;/li&gt;
&lt;li&gt;ServiceUnavailableException(503)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: 他のフレームワークでもこの標準エラーを使用しているような気がする。あとで確認しておく&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;独自例外の作成方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RuntimeExceptionを継承して例外クラスを作成&lt;/li&gt;
&lt;li&gt;マッパークラスを作成し、JAX-RSに認識させる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: 独自例外を作成することは必ず必要になってくるので、ここ後で見返しておく&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Responseが持っているステータスについても覚えておく&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: 標準提供の例外をマッピングすることも可能！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;標準のExceptionはステータスコードしかクライアントに返却しないため、ここでマッピングして再定義しておくと、メッセージも合わせて返却できるということ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;9.6 RESTクライアントクラス（クライアント側）の作成&lt;/h3&gt;
&lt;h4&gt;9.6.1 データクラス（DTO）&lt;/h4&gt;
&lt;h4&gt;9.6.2 RESTクライアントクラス&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;MEMO: Javaクライアント側でJAX-RSのWebサービスを利用したい場合の実装方法
&lt;ul&gt;
&lt;li&gt;BASIC認証にサードパーティのクラスを使う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;9.7 メッセージフィルタクラス&lt;/h3&gt;
&lt;h4&gt;9.7.1 メッセージフィルタとエンティティインターセプタ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;JAX-RS2.0では新たに、
&lt;ul&gt;
&lt;li&gt;メッセージフィルタ：リクエスト/レスポンスヘッダーの編集などに使用&lt;/li&gt;
&lt;li&gt;エンティティボディインターセプター：エンティティボディの編集などに使用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;割愛&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MEMO: Logging用のフィルタの実装について考える ベストプラクティスは？
&lt;ul&gt;
&lt;li&gt;FileterとInterceptorの違い&lt;a href=&quot;https://meetup-jp.toast.com/698&quot;&gt;https://meetup-jp.toast.com/698&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;9.8 まとめ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;JAX-RS
&lt;ul&gt;
&lt;li&gt;アノテーションでRESTful-Webサービスを作成できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Chapter10 バッチアプリケーションの開発&lt;/h2&gt;
&lt;p&gt;JavaEE7では、Javaにおけるバッチ処理の標準化仕様が盛り込まれました。&lt;/p&gt;
&lt;p&gt;この仕様はJSR352(Batch Applications for the Java Platform)で規定されている&lt;/p&gt;
&lt;p&gt;通称「jBatch」と呼ばれている&lt;/p&gt;
&lt;h3&gt;10.1 jBatchの基本&lt;/h3&gt;
&lt;h4&gt;10.1.1 バッチ処理とその特徴&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;バッチ処理とは&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;複数のデータや複数の処理を一括して実行する方式のこと&lt;/li&gt;
&lt;li&gt;一方、Webブラウザなどの画面を介して入力と応答が繰り返される処理をリアルタイム処理、オンライン処理と呼ぶ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;特徴&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一度に多くのデータが処理される&lt;/li&gt;
&lt;li&gt;実行時間が長い&lt;/li&gt;
&lt;li&gt;非対話型（人間による画面での入出力操作を伴わない）&lt;/li&gt;
&lt;li&gt;リクエストに従って起動されることよりも、実行する時刻を指定して起動されることが多い&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;10.1.2 jBatchとは&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;jBatchとは&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;前項で述べたような特徴を持つバッチ処理をJava言語で実装するためのフレームワーク&lt;/li&gt;
&lt;li&gt;業務システムにおけるバッチ処理は、全体的な処理の流れや設計時に注意すべきポイントなど、&lt;/li&gt;
&lt;li&gt;時代や言語を伴わない共通点が多く見られる&lt;/li&gt;
&lt;li&gt;jBatchはこうした業務システムのバッチ処理似求められる要素を盛り込んだ「以前から培われている雛形」を標準として提供&lt;/li&gt;
&lt;li&gt;jBatchを使わなくてもバッチ処理を実現できるが、活用することで、理解が容易で考慮漏れの少ないバッチ処理を効率よく提供刷ることができる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;jBatchの機能と構成要素&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;大まかに言うと
&lt;ul&gt;
&lt;li&gt;ジョブ&lt;/li&gt;
&lt;li&gt;ステップ
&lt;ul&gt;
&lt;li&gt;で構成される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ジョブ：全体の流れを記述&lt;/li&gt;
&lt;li&gt;ステップ：ここの処理を実装する&lt;/li&gt;
&lt;li&gt;ジョブとステップの分離により、業務の変更に対して柔軟に対応できる仕組みになっている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;jBatchのアーキテクチャはオープンソースのSpringBatchから多くを受け継いでいるが&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ジョブとステップの分離は、メインフレーム時代から受け継がれているもの&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メインフレームでは、全体の流れはジョブとしてJCLによって記述され、&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;業務ロジックはステップとして、COBOLやPL/Iなどの言語で記述されたプログラムを用いて実装される&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;jBatchの機能と構成要素&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;jBatchにはジョブとステップ以外にいくつか保s所的な機能がある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;リスナ：ジョブやステップの開始直前または終了直後に処理を差し込む&lt;/li&gt;
&lt;li&gt;ジョブリポジトリ：ジョブやステップの状態を永続的に保持する&lt;/li&gt;
&lt;li&gt;コンテキスト：一時的に保持する&lt;/li&gt;
&lt;li&gt;メトリック：統計的な情報を確認刷る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;10.1.3 ジョブ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ジョブはステップの入れ物&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;１つのジョブの中には１つ以上のステップが必要&lt;/li&gt;
&lt;li&gt;XMLで記述する
&lt;ul&gt;
&lt;li&gt;各ステップの呼び出し先クラス&lt;/li&gt;
&lt;li&gt;実行順序&lt;/li&gt;
&lt;li&gt;ジョブ全体や各ステップに対する設定、エラー発生時の挙動なども記述&lt;/li&gt;
&lt;li&gt;記述のルールを示した仕様は、JSL(Job Specification Language)と呼ばれる&lt;/li&gt;
&lt;li&gt;ジョブを記述したXMLファイルはJob XMLファイルと呼ばれる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;JSLには処理の実行順序を制御するために、以下のXML要素が用意されている
&lt;ul&gt;
&lt;li&gt;フロー（flow）&lt;/li&gt;
&lt;li&gt;スプリット（split）&lt;/li&gt;
&lt;li&gt;デシジョン（decision）&lt;/li&gt;
&lt;li&gt;遷移要素（Transition Elements）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;全体図が記載されている（書籍を見たほうが良い）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;フロー：複数のステップをまとめる要素&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;スプリット：複数のフローを同時実行させることができる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;デシジョン：ジョブ内部で次の遷移先を細かくカスタマイズするための機能&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;遷移要素&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;next: 遷移先には、ステップ、フロー、スプリット、デシジョンが指定できる&lt;/li&gt;
&lt;li&gt;end: 正常終了&lt;/li&gt;
&lt;li&gt;stop: 中断&lt;/li&gt;
&lt;li&gt;fail: 異常終了&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;リトライとスキップ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;リトライ：チャンク型ステップの処理中に特定の例外が発生した場合に、再度そのデータの処理を試みる&lt;/li&gt;
&lt;li&gt;スキップ：チャンク型ステップの処理中に特定の例外が発生した場合に、データを飛ばして次に進む&lt;/li&gt;
&lt;li&gt;リトライもしくはスキップ対象の例外クラスをJob XMLの中に定義&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ジョブオペレータ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ジョブ自体の開始や停止の全体的な制御を行う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ジョブオペレータの呼び出し方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;バッチ処理の特徴として、「実行する時刻を指定して起動されることが多い」という点をあげたが、&lt;/li&gt;
&lt;li&gt;jBatchの仕様にはバッチを決まった時間に起動する方式に関する規定や、それを実現するAPIも含まれていない&lt;/li&gt;
&lt;li&gt;この部分に関しては、ジョブスケジューラを連携させる方式が一般的に
&lt;ul&gt;
&lt;li&gt;Linuxなどであればcron&lt;/li&gt;
&lt;li&gt;Windowsであればタスクスケジューラ&lt;/li&gt;
&lt;li&gt;その他市販のジョブスケジューラを使用する...など&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ジョブを臨時で実行したい場合や、何らかの異常が発生し、人間が介入して原因を取り除いたあとに再実行する場合は、リクエストに従って起動することになります。（これを「アドホックな実行」と呼びます）
&lt;ul&gt;
&lt;li&gt;そういった場合、画面などのユーザーインターフェースがあると便利だが、この点に関してもjBatchは規定ない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;実装する際には、オペレータの運用も考える必要がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: 手動実行されたジョブか、スケジュールで実行されたジョブかを識別する方法を仕込んでおいた方が良いと思った&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;10.1.4 ステップ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;バッチ内部の個々の処理を実装する部分
&lt;ul&gt;
&lt;li&gt;ステップの実態は、jBatchのAPIの中で定義されているJavaインターフェースであり、実装テンプレートを提供している&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ステップには２種類ある
&lt;ul&gt;
&lt;li&gt;チャンク型：複数のデータを逐次的に処理するために使われる
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ItemReader&lt;/code&gt;,&lt;code&gt;ItemProcessor&lt;/code&gt;,&lt;code&gt;ItemWriter&lt;/code&gt;の３つで構成される&lt;/li&gt;
&lt;li&gt;ItemReaderとItemProcessorを繰り返したあと、ItemWriterが呼ばれる（デフォルトで１０回）&lt;/li&gt;
&lt;li&gt;この塊（１０回などの処理の塊）をチャンクと呼ぶ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;バッチレット型：単体で完結する処理で使われます
&lt;ul&gt;
&lt;li&gt;データの加工や計算を１件ずつ繰り返すような処理ではなく、データに依存しない処理やコマンド実行などの処理を担います。&lt;/li&gt;
&lt;li&gt;例えば、ディレクトリ作成やファイル圧縮、送受信処理などの処理&lt;/li&gt;
&lt;li&gt;「タスク志向のステップ」と呼ばれる場合もある&lt;/li&gt;
&lt;li&gt;MEMO: このような単純な処理であれば、スクリプトで完結しそうな気もする..&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;10.1.5 補助機能&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;リスナ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;リスナを用いることで、バッチ処理の進行に応じた特定のタイミングで任意の処理を実行することができる&lt;/li&gt;
&lt;li&gt;「特定のタイミング」には、ジョブやステップの開始及び終了、リトライやスキップの発生などがある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;各処理のタイミングごとにリスナが用意されている&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;リスナの設置は任意で、設置したい場合、リスナのクラス名をJob XMLの中で記述&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ジョブリポジトリ：開発者が意識して操作したりしない部分みたい&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;実行中のジョブの情報や、実行が終わったジョブに関する情報が保存される&lt;/li&gt;
&lt;li&gt;情報の更新はコンテナによって自動的に行われ、情報の取得は、前述のジョブオペレータや、後述するコンテキスト、メトリックAPIを利用する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コンテキスト&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;種類
&lt;ul&gt;
&lt;li&gt;ジョブコンテキスト&lt;/li&gt;
&lt;li&gt;ステップコンテキスト&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;それぞれ、実行中のジョブやステップに関する情報を提供する役割を担う
&lt;ul&gt;
&lt;li&gt;名前やID、ステータスなどがある&lt;/li&gt;
&lt;li&gt;コンテキストへのアクセスは、jBatchAPIのJobContext、StepContextインターフェースを経由して行います&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メトリック&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;チャンク型のステップに対して、実行時の統計情報を提供するのがメトリック&lt;/li&gt;
&lt;li&gt;情報
&lt;ul&gt;
&lt;li&gt;読み取りレコード数&lt;/li&gt;
&lt;li&gt;書き込みレコード数&lt;/li&gt;
&lt;li&gt;スキップが発生した数&lt;/li&gt;
&lt;li&gt;など、処理量に関するもの&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;メトリックへのアクセスには、jBatchAPI似あるMetricインターフェースを経由して行う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;10.2 jBatchの利用――基本編&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;実際に実装してみる
&lt;ul&gt;
&lt;li&gt;JobXMLの実装&lt;/li&gt;
&lt;li&gt;チャンク型ステップの実装&lt;/li&gt;
&lt;li&gt;バッチレット型ステップの実装&lt;/li&gt;
&lt;li&gt;ジョブ実行部分の実装&lt;/li&gt;
&lt;li&gt;実行結果の確認&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;10.2.1 JobXMLの実装&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;バッチの全体を表すJobXMLを作成刷る&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ファイル名から拡張子を取り除いた部分がそのままジョブの名前となります。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ジョブの名前は実行時にJobOperatorクラスのメソッドにわたす形で利用される&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;それぞれの要素説明&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;job&lt;/li&gt;
&lt;li&gt;step&lt;/li&gt;
&lt;li&gt;chunk&lt;/li&gt;
&lt;li&gt;batchlet&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;10.2.2 チャンク型ステップの実装&lt;/h4&gt;
&lt;h4&gt;10.2.5 バッチレット型ステップの実装&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Batchletを実装
&lt;ul&gt;
&lt;li&gt;prosess,stopを実装して処理を書くだけ&lt;/li&gt;
&lt;li&gt;保守性を高い状態に保つためにも、１機能の実装にとどめておくべき&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;10.2.6 ジョブ実行部分の実装&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;JobInstanceとJobExecution&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最初にジョブを実行すると、コンテナ内部ではこの２つのインスタンスが生成される
&lt;ul&gt;
&lt;li&gt;JobInstanceはジョブの１回分を表現&lt;/li&gt;
&lt;li&gt;JobExecutionはジョブの実行そのものを表現している&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;パッケージング&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;jBatchでもWebアプリケーションと同様に、構成するファイル群をwarファイル形式にまとめてコンテナにデプロイ刷る&lt;/li&gt;
&lt;li&gt;ここで注意が必要なのは、JobXMLファイルの配置場所
&lt;ul&gt;
&lt;li&gt;JobXMLは、warファイル内部の&lt;code&gt;WEB-INF/classes/META-INF/batch-jobs&lt;/code&gt;ディレクトリの配下に「ジョブ名.xml」という名前で配置しなければ行けない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: パッケージングする際には一般的にどのようにしているか確認、Gradleとかの前処理で調整している？&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;10.2.7 実行結果の確認&lt;/h4&gt;
&lt;p&gt;バッチログを掲載&lt;/p&gt;
&lt;h3&gt;10.3 jBatchの利用――応用編&lt;/h3&gt;
&lt;h4&gt;10.3.1 サンプル概要&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ナレッジ件数ランキング集計バッチ&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コメント件数ランキング集計バッチ&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Column キーブレイク処理について&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;マスタ表から１件読み込み、トランザクション表を操作して処理するという一連の流れ&lt;/li&gt;
&lt;li&gt;業務におけるバッチ処理では大変多く見られるパターンの１つ&lt;/li&gt;
&lt;li&gt;jBatchのチャンク形式のステップは、このようなキーブレイク処理を念頭においたものと言えるので、本書でも取り上げた&lt;/li&gt;
&lt;li&gt;MEMO: チャンク形式が業務で応用されている例を確認しておくべき
&lt;ul&gt;
&lt;li&gt;SQL一本で済ませる場合が多いのでは？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;10.4 ジョブの作成&lt;/h3&gt;
&lt;h4&gt;10.4.1 Job XMLの実装&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;property要素を利用する方法を記載
&lt;ul&gt;
&lt;li&gt;感覚的にはmavenみたいな感じ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;10.4.2 チャンクの実装&lt;/h4&gt;
&lt;p&gt;※実際に実装刷る際に必要なった時に見返す&lt;/p&gt;
&lt;h3&gt;10.5 ジョブのフロー制御&lt;/h3&gt;
&lt;p&gt;※実際に実装刷る際に必要なった時に見返す&lt;/p&gt;
&lt;h3&gt;10.6 まとめ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;終了！&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Web製作者のためのSassの教科書</title><link>https://tutttuwi.github.io/posts/2020-04_web%E8%A3%BD%E4%BD%9C%E8%80%85%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEsass%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2020-04_web%E8%A3%BD%E4%BD%9C%E8%80%85%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEsass%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8/</guid><pubDate>Thu, 09 Apr 2020 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Web製作者のためのSassの教科書&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;・Sassって聞いたことはあるけど、導入が面倒そう
・Sassをはじめたいけど、あと一歩が踏み出せない
・勉強コストとの天秤にかけて、Sassのメリットが見えない
・周りでSassを使いはじめた人がいて、焦りを感じている
・CSSを今よりも効率的に書きたいと思っている

こうした方がSassを導入するきっかけとなり、
ひと通りSassの機能を使いこなせるようになるのが本書の目標です。

本書では、HTML+CSSの基本的な知識は必須ですが、
Sassにまったく触れたことがない方も対象としています。

CSSをHTMLの構造に合わせて入れ子で書いていく「ネスト」や
便利な「変数」や「演算」などのSassの基本機能はもちろん、

筆者が実際に仕事の現場で使っている実践的なテクニックから
新機能もカバーした全機能リファレンスまで、この一冊で網羅しています。
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;発売日：2017/9/15&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ページ数：296&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;サイズ：B5変形判&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;著者：平澤 隆（Latele）　著/森田 壮　著&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ISBN：9784295002352&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;URL: &lt;a href=&quot;https://book.impress.co.jp/books/1117101020&quot;&gt;https://book.impress.co.jp/books/1117101020&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;目次&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第1章 Sassのキホン&lt;/li&gt;
&lt;li&gt;第2章 Sassの利用環境を整えよう&lt;/li&gt;
&lt;li&gt;第3章 これだけはマスターしたいSassの基本機能&lt;/li&gt;
&lt;li&gt;第4章 高度な機能を覚えてSassを使いこなそう&lt;/li&gt;
&lt;li&gt;第5章 現場で使える実践Sassコーディング&lt;/li&gt;
&lt;li&gt;第6章 もっとSassを便利にするフレームワークやツール&lt;/li&gt;
&lt;li&gt;第7章 Sass全機能リファレンス&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;公式サポートサイト：&lt;a href=&quot;https://book2.scss.jp/&quot;&gt;https://book2.scss.jp/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第1章 Sassのキホン&lt;/h2&gt;
&lt;h3&gt;1-1 まずはSassって何なのかを知ろう&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Sassは学習コストもあるけれど、CSSを覚え始めた頃のワクワク感や楽しさを思い出させてくれるよっている説明&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sass＝CSSを拡張したメタ言語&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sass(Syntactically Awesome Strylesheets)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sassには２つの記法がある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SASS記法：CSSと互換性が無い。インデントの深さで分ける&lt;/li&gt;
&lt;li&gt;SCSS記法：CSSと互換性がある。ネストで記載&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SCSSファイルはコンパイルが必要だよという説明&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;魅力的な機能&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;記述の簡略化（&lt;strong&gt;ネスト&lt;/strong&gt;）&lt;/li&gt;
&lt;li&gt;コメントに、&lt;code&gt;//&lt;/code&gt;が使える！&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;変数定義&lt;/strong&gt;で同じ値を使い回すことができる&lt;/li&gt;
&lt;li&gt;１度使ったセレクタを使い回せる（&lt;strong&gt;エクステンド&lt;/strong&gt;）&lt;/li&gt;
&lt;li&gt;コードの再利用が可能
&lt;ul&gt;
&lt;li&gt;スタイルをまとめてテンプレートやモジュールのように定義し、簡単に読み込んで使うことができる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ミックスイン&lt;/strong&gt;と呼ばれており、Sassの中でも最も強力な機能の１つ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;１つのCSSファイルにまとめることができる（&lt;strong&gt;パーシャル&lt;/strong&gt;）&lt;/li&gt;
&lt;li&gt;条件分岐などの&lt;strong&gt;プログラム的な処理&lt;/strong&gt;ができる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;関数で様々な処理を実行&lt;/strong&gt;できる
&lt;ul&gt;
&lt;li&gt;Sassにはかなり多くの関数が用意されている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CSSファイルを圧縮できる&lt;/li&gt;
&lt;li&gt;他にも魅力が沢山&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sassの歴史について説明（割愛）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1-2 Sassを導入する前の疑問や不安&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;環境構築に黒い画面を操作することに対しての不安説明&lt;/li&gt;
&lt;li&gt;運用時にSassは導入ハードルが高いのではという不安説明
&lt;ul&gt;
&lt;li&gt;expandedというフォーマットがあり、これを指定してコンパイルすると、普通にCSS書いたみたいになる&lt;/li&gt;
&lt;li&gt;&lt;code&gt;//&lt;/code&gt;コメントは削除されてしまう&lt;/li&gt;
&lt;li&gt;なので納品後はCSS編集という運用でも問題ない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1-3 何はともあれSassを触ってみよう&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;使ってみる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;「SassMeister」で検索&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.sassmeister.com&quot;&gt;https://www.sassmeister.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;meister = 師匠&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sassを入力するとCSSが出力されるプレイグラウンド&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sassに対応しているソースコード共有サービス
&lt;ul&gt;
&lt;li&gt;CodePen&lt;/li&gt;
&lt;li&gt;Create a new Fiddle - jsFiddle&lt;/li&gt;
&lt;li&gt;jsdo.it Share Javascript, HTML5 and CSS&lt;/li&gt;
&lt;li&gt;HTML5, CSS3, JS Demos, Creations and Experiments | CSSDeck&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第2章 Sassの利用環境を整えよう&lt;/h2&gt;
&lt;h3&gt;2-1 本書で使用する環境について&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;本書では、node-sasssを使用する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sassは大きく分けて２つのSassが存在する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ruby Sass：Rubyで開発されたもの&lt;/li&gt;
&lt;li&gt;LibSass：C/C++で開発されたもの&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;node-sass&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;LibSassをNode.jsで動作できるようにしたライブラリ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Node.jsについて：Javascriptで作られたサーバーサイド環境&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Gulp: タスクランナー&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2-2 Node.jsをインストールする&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Webからインストールする手順を記載&lt;/li&gt;
&lt;li&gt;バージョン管理ツールの説明
&lt;ul&gt;
&lt;li&gt;Windowsならnodist&lt;/li&gt;
&lt;li&gt;Macならndenv&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2-3 黒い画面を使ってみよう&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;コマンドプロンプトを開く手順を記載しているだけ（割愛）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2-4 セットアップ済みの環境をインストールする&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;サンプルファイルコピー&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://book2.scss.jp/dl/c2/&quot;&gt;https://book2.scss.jp/dl/c2/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;gulp-cliをインストール&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install --global gulp-cli&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;モジュールをインストールする&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2-5 Sass をコンパイルする&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;gulpfile.js&lt;/code&gt;に記載された処理を実行&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gulp sass&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;アウトプットスタイルを指定&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nested&lt;/li&gt;
&lt;li&gt;Expanded&lt;/li&gt;
&lt;li&gt;Compact&lt;/li&gt;
&lt;li&gt;Compressed&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ファイルの更新を監視する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gulp.watch(&apos;./sass/**/*.scss&apos;,[&apos;sass&apos;]);&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2-6 セットアップ済みの環境を作成する方法&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;npm と gulp の説明(割愛)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;gulpfile.jsのジェネレータについて&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://steelydylan.github.io/gulp-generator/&quot;&gt;https://steelydylan.github.io/gulp-generator/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2-7 GUIコンパイラ（Prepros）でSassを使う&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://prepros.io/&quot;&gt;https://prepros.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;割愛する&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2-8 DreamweaverでSassを使う&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;割愛する&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第3章 これだけはマスターしたいSassの基本機能&lt;/h2&gt;
&lt;h3&gt;3-1 ルールのネスト（Nested Rules）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ネストでCSS定義ができる&lt;/li&gt;
&lt;li&gt;セレクタも使える&lt;/li&gt;
&lt;li&gt;使いすぎるとインデントが深くなり可読性が悪くなる&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@media&lt;/code&gt;のネストもできる&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3-2 親セレクタの参照&amp;amp;（アンパサンド）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;amp;&lt;/code&gt;を使えば親セレクタを参照できる&lt;/li&gt;
&lt;li&gt;BEMやMindBEMingなどBEMの設計思想に近いCSS設計を行っている場合、記述量が大幅に削減される&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3-3 プロパティのネスト（Nested Properties）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;プロパティもネストさせてかけるよっていう説明&lt;/li&gt;
&lt;li&gt;ショートハンドでかけるところをネストさせる&lt;/li&gt;
&lt;li&gt;慣れないうちは可読性が下がる原因にもなるので、普通に書いたほうが無難&lt;/li&gt;
&lt;li&gt;Column: -(ハイフン)があるプロパティはすべてネストできる&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3-4 Sassで使えるコメント&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;javascriptのコメント&lt;code&gt;//&lt;/code&gt;が使える&lt;/li&gt;
&lt;li&gt;通常のCSSコメント &lt;code&gt;/* */&lt;/code&gt; だとコンパイルされても残る&lt;/li&gt;
&lt;li&gt;スタイルが「compressed」だとコメントは残らない
&lt;ul&gt;
&lt;li&gt;「compressed」でも残るコメント
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/*! */&lt;/code&gt; &lt;code&gt;!&lt;/code&gt;を追加すれば残るらしい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3-5 変数（Variables）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;変数宣言ができる&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// 赤色の変数を宣言
$red: #cf2d3a;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;変数名で使える文字と使えない文字&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;$width10: 10px;
$w-10: 10px;
$w_10: 10px;
$Ｗｉｄｔｈ１０: 10px;
$横幅10px: 10px;
$１０px: 10px;
$___w10___: 10px;
$-_-______----w:10px;
$変数はSassの便利な機能の１つです:black;

// 使えない文字
$10width: 10px; // 数字から始まっている
$@width10: 10px; // @など使えない記号
$--width: 10px; // 連続したハイフンから始まっている

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ルールセット内で変数を宣言することもできる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;変数を参照できる場所&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;セレクタから参照したり、他の文字列と結合してパスを作成したい場合などに気をつける必要あり&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;$セレクタ名: &apos;.pickupContentsArea, section.main&apos;;
$IMG_PATH: &apos;../img/bg/&apos;;

#{$セレクタ名} {
  background-color: url(#{$IMG_PATH}pickup.png);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3-6 演算&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;+ - * %&lt;/code&gt;などの演算子が使える&lt;/li&gt;
&lt;li&gt;コンパイル後は、演算結果が出力される&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// paddingの値が変わった時に変数として持っておくとwidthに反映できる
article {
  $padding: 7px;
  width: $main_width - $padding * 2;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;色の演算も算術演算子でできるが将来的には廃止予定らしい
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;rgba()&lt;/code&gt;を使おうとのこと&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3-7 Sassの@import&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SassではCSSで使える&lt;code&gt;@import&lt;/code&gt;の他に、Sass独自の&lt;code&gt;@import&lt;/code&gt;機能がある&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CSSファイルを生成しないパーシャル&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;importしたSassファイルなど、特定のSassファイルをCSSファイルとして生成したくない場合、&lt;/li&gt;
&lt;li&gt;Sassファイルのファイル名の最初に&lt;code&gt;_&lt;/code&gt;アンダースコアをつけることで、コンパイルしてもCSSファイルが生成されなくなる&lt;/li&gt;
&lt;li&gt;この機能のことをパーシャル(partial)という&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第4章 高度な機能を覚えてSassを使いこなそう&lt;/h2&gt;
&lt;h3&gt;4-1 スタイルの継承ができるエクステンド（@extend）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;エクステンド＝指定したセレクタのスタイルを継承することができる機能&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;あまり継承しすぎると、プロパティがバッティングしてしまう可能性が高くなる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;エクステンドの連鎖&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;継承を連鎖して記載可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;エクステンドが使えないセレクタの紹介&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.item p&lt;/code&gt; 子孫セレクタ&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#main &amp;gt; article&lt;/code&gt; 子セレクタ&lt;/li&gt;
&lt;li&gt;&lt;code&gt;h2 + h3&lt;/code&gt; 隣接セレクタ&lt;/li&gt;
&lt;li&gt;&lt;code&gt;h3 ~ h3&lt;/code&gt; 間接セレクタ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// 子孫セレクタ
.item p { ... }

// 子セレクタ
#main &amp;gt; article { ... }

// 隣接セレクタ
h2 + h3 { ... }

// 間接セレクタ
h3 ~ h3 { ... }
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;エクステンド専用のプレースホルダーセレクタ&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// エクステンド専用のプレースホルダーセレクタ
%boxBase {
    padding: 15px;
    border: 1px solid #999;
}

// プレースホルダーセレクタを継承
.item {
    @extend %boxBase;
    margin-bottom: 20px;
}
section {
    @extend %boxBase;
    margin-bottom: 60px;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@media&lt;/code&gt;内ではエクステンドは使用できない&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// これはコンパイルエラーになってしまう
%btnBase {
    display: inline-block;
    padding: 5px 10px;
    background: #eee;
}

@media all and (orientation:landscape) {
    a {
        @extend %btnBase;
    }
}

// こちらに書き直すとうまくいく
@media all and (orientation:landscape) {
    %btnBase {
        display: inline-block;
        padding: 5px 10px;
        background: #eee;
    }
    a {
        @extend %btnBase;
    }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;警告を抑止する &lt;code&gt;!optional&lt;/code&gt;フラグ&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;.btn {
    @extend %btnBase !optional;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4-2 柔軟なスタイルの定義が可能なミックスイン（@mixin）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;スタイルの集まりを定義しておき、それを他の場所で呼び出して使うことができる&lt;/li&gt;
&lt;li&gt;また、引数を指定することで、定義したミックスインの値を一部変更して使うといった、非常に柔軟で強力な処理が可能&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// ミックスインを定義
@mixin boxSet {
    padding: 15px;
    background: #999;
    color: white;
}
// 定義したミックスインを呼び出し
.relatedArea {
    @include boxSet;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;エクステンドと違ってコンパイル後に、展開されて出力されることを確認&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// 定義したミックスインを呼び出し
.relatedArea {
    @include boxSet;
}
// 別のルールセットでも呼び出し
.pickupArea {
    @include boxSet;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;.relatedArea {
  padding: 15px;
  background: #999;
  color: white;
}
.pickupArea {
  padding: 15px;
  background: #999;
  color: white;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;引数を使ったミックスイン&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// 引数を使ったミックスインを定義
@mixin kadomaru($value) {
    -moz-border-radius: $value;
    -webkit-border-radius: $value;
    border-radius: $value;
}
.box {
    @include kadomaru(3px);
    background: #eee;
}
.item {
    border: 1px solid #999;
    @include kadomaru(5px 10px);
}
// 可変でプロパティを定義できる
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;引数に初期値を設定することもできる&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;@mixin kadomaru($value: 3px) {
    -moz-border-radius: $value;
    -webkit-border-radius: $value;
    border-radius: $value;
}
.boxA {
    @include kadomaru;
    background: #eee;
}
.boxB {
    @include kadomaru();
    background: #f1f1f1;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;.boxA {
  -moz-border-radius: 3px;
  -webkit-border-radius: 3px;
  border-radius: 3px;
  background: #eee;
}
.boxB {
  -moz-border-radius: 3px;
  -webkit-border-radius: 3px;
  border-radius: 3px;
  background: #f1f1f1;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;引数を複数指定することもできる&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;@mixin boxBase($margin: 30px 0, $padding: 10px) {
    margin: $margin;
    padding: $padding;
}

.boxA {
    @include boxBase;
    background: #eee;
}
.boxB {
    @include boxBase(0 0 50px, 20px);
    background: #f1f1f1;
}

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;,(カンマ)を使うプロパティには可変長引数を利用する&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;@mixin shadow($value...) {
    text-shadow: $value;
}

h2 {
    @include shadow(8px 8px 0 #999, 15px -10px 0 #eee);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;複数の引数があるミックスインを読み込む際に可変長引数を使う&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;@mixin boxBase($w: 250px, $pd: 15px, $bg_c: #fff, $bd_c: #ccc) {
    width: $w;
    padding: $pd;
    background-color: $bg_c;
    border: 1px solid $bd_c;
}

$values: 300px, 20px; // こういう変数定義もできるんだと知った

.item {
    float: left;
    @include boxBase($values...);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;ミックスインのスコープ（利用できる範囲）を制限する&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;.main {
    @mixin margin {
        margin: 50px 0;
    }
    .item {
        @include margin;
    }
}
// あまりスコープを制限する例は無いが一応覚えておく
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;ミックスインにコンテントブロックを渡す &lt;code&gt;@content&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;→これは便利！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;@mixin media($width-media: 768px) {
    @media only screen and (max-width: $width-media) {
        @content;
    }
}
 
.item {
    .image {
        float: left;
        @include media {
            float: none;
        }
    }
    .text {
        overflow: hidden;
        margin-left: 15px;
        @include media {
            margin-left: 0;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;.item .image {
  float: left;
}

@media only screen and (max-width: 768px) {
  .item .image {
    float: none;
  }
}

.item .text {
  overflow: hidden;
  margin-left: 15px;
}

@media only screen and (max-width: 768px) {
  .item .text {
    margin-left: 0;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;ミックスイン名で使える文字と使えない文字&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;@mixin shadow1 { ～ }
@mixin shadow-1 { ～ }
@mixin shadow_1 { ～ }
@mixin 影 { ～ }
@mixin ｓｈａｄｏw { ～ }
@mixin _shadow { ～ }
@mixin -shadow { ～ }

// 使えない文字
@mixin 01shadow { ～ } // 数字から始まっている
@mixin shadow@2 { ～ } // @など使えない記号
@mixin --shadow { ～ } // 連続したハイフンから始まっている
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4-3 ネストしているセレクタをルートに戻せる @at-root&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;あまり使い所が無いと感じたが、使える場面があるらしい&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;.block {
    .element-A {
        width: 80%;
    }
    @at-root .element-B {
        width: 100%;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;.block .element-A {
  width: 80%;
}

.element-B {
  width: 100%;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;使い所は５章で確認する&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4-4 Sassのデータタイプについて&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Sassのデータ・タイプについて&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;.DataTypes {
    /* Number型 */
    property: type-of(10%);
    /* Color型 */
    property: type-of(red);
    /* String型 */
    property: type-of(sans-serif);
    /* Boolean型 */
    property: type-of(true);
    /* Null型 */
    property: type-of(null);
    /* List型 */
    property: type-of(1.5em 1em 0 2em);
    /* Map型 */
    $map:(key1: value1, key2: value2);
    property: type-of($map);
    /* Function型 */
    property: type-of(get-function(&quot;lighten&quot;));
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;.DataTypes {
  /* Number型 */
  property: number;
  /* Color型 */
  property: color;
  /* String型 */
  property: string;
  /* Boolean型 */
  property: bool;
  /* Null型 */
  property: null;
  /* List型 */
  property: list;
  /* Map型 */
  property: map;
  /* Function型 */
  property: function;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;@function example($value) {
    @if type-of($value) == number {
        処理
    }
}
// typeで判断して関数を作れますよという説明
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4-5 制御構文で条件分岐や繰り返し処理を行う&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@if&lt;/code&gt;,&lt;code&gt;@for&lt;/code&gt;,&lt;code&gt;@while&lt;/code&gt;,&lt;code&gt;@each&lt;/code&gt;を使って表現&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4-6 関数を使ってさまざまな処理を実行する&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Sassには予め用意された関数がある&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用頻度の高いものをピックアップして紹介&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;参照 &lt;a href=&quot;https://book2.scss.jp/code/c4/06.html&quot;&gt;https://book2.scss.jp/code/c4/06.html&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4-7 自作関数を定義する@function&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;自作関数の定義方法 そんなに変わったことはしていない&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;$width: 105px;
@function halfSize($value:$width) {
    @return round($value / 2);
}
.boxA {
    width: halfSize();
}
.boxB {
    width: halfSize(200px);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4-8 テストやデバックで使える@debug、@warn、@error&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;変数のデバッグに使用できる機能もある&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;@debug 10em + 12em;

&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;test.scss:1 DEBUG: 22em
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;// WARNで警告
$value: 1000px;
@function warnTest(){
    @if unitless($value) {
        $value: $value + px;
    }
    @else {
    @warn &quot;#{$value}は駄目！$valueに単位は入れないで！&quot;;
    }
    @return $value;
}
.box {
    width: warnTest();
}

// ERROR で処理を中断
$value: 1000px;
@function errorTest(){
    @if unitless($value) {
        $value: $value + px;
    }
    @else {
    @error &quot;#{$value}は駄目！$valueに単位は入れないで！&quot;;
    }
    @return $value;
}
.box {
    width: errorTest();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4-9 使いどころに合わせて補完（インターポレーション）してくれる#{}&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;インターポレーションとは&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;変数が参照できない場所でも使うことができるようにする機能&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#{}&lt;/code&gt;←これ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;演算しないようにする&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;font: #{$font-size}/#{$line-height}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;演算できない場所で演算する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.mt#{$i * 5} {&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4-10 変数の振る舞いをコントロールする !default と !global&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;!default&lt;/code&gt;フラグ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;デフォルト値とは上書きされることを前提にした変数の初期値&lt;/li&gt;
&lt;li&gt;このフラグを使用していると、先に宣言されている変数が優先される
&lt;ul&gt;
&lt;li&gt;→ライブラリで使用しているの確認済み。よく使われる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;!global&lt;/code&gt;フラグ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ローカル変数をグローバル変数にするフラグ&lt;/li&gt;
&lt;li&gt;グローバル変数とはドキュメントルートで宣言した、どこからでも参照できる変数のこと&lt;/li&gt;
&lt;li&gt;ネスト内からグローバル変数を上書きしたい場合や、ローカル変数をスコープ外から参照したい場合などに使用する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第5章 現場で使える実践Sassテクニック&lt;/h2&gt;
&lt;h3&gt;5-1 管理／運用・設計で使えるテクニック&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ネストが深すぎると生じる問題を把握して、バランスを見ながら利用する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ネストが深すぎて可読性が落ちてしまう&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;セレクタが長くなってしまうことの弊害&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CSSが肥大化する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Column: ネストは何階層までがよいか&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2～3階層程度にするのがよい&lt;/li&gt;
&lt;li&gt;HTMLのツリー構造に沿った形でCSSを指定するストラクチャタイプの設計の場合は、&lt;/li&gt;
&lt;li&gt;ある程度ネストを深くしたほうがよい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CSSとは違うパーシャルによるSassファイルの分割&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;_mixin.scss&lt;/code&gt;など分けて作成して、&lt;code&gt;@import&lt;/code&gt;でまとめる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;サイトの基本設定を変数にして一元管理する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;複数人で制作する場合は各自のSassファイルを用意する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gitなどが汚れるのではとも感じる...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コメントを活用してソースをわかりやすくする&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;大規模サイトで活用できる&lt;code&gt;@import&lt;/code&gt;のネスト&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;amp;(アンパサンド)を活用してBEM的な設計を快適に&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;.navigation {
    width: 100%;
    &amp;amp;__item {
        color: #666;
        &amp;amp;_state_active {
            color: #000;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@keyframes&lt;/code&gt;をルールセット内に書いて関係性をわかりやすくする&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;.example {
    @keyframes anima-example {
        0% {
            transform: translate(0%, -100%);
        }
        100% {
            transform: translate(0%, 0%);
        }
    }
    animation: anima-example 0.9s linear 500ms 1;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;@keyframes&lt;/code&gt;はルートに書き出してくれる&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.example {
  animation: anima-example 0.9s linear 500ms 1;
}
@keyframes anima-example {
  0% {
    transform: translate(0%, -100%);
  }
  100% {
    transform: translate(0%, 0%);
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;EditorConfigとStylelintでコーディングルールを統一する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EditorConfig：拡張機能を入れて、&lt;code&gt;.editorconfig&lt;/code&gt;ファイルを作成&lt;/li&gt;
&lt;li&gt;Stylelint：拡張機能を入れる
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install --global stylelint&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.stylelintrc&lt;/code&gt;という設定ファイルをおけばOK&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Column: 他の人を思いやってSass設計をしよう&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;本書のシリーズ「Web製作者のためのCSS設計の教科書」はFLOCSS（フロックス）を提唱しているらしい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5-2 レイアウト・パーツで使えるテクニック&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;clearfixをミックスインで活用する&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;@mixin clearfix {
    &amp;amp;::after {
        content: &quot;&quot;;
        display: block;
        clear: both;
    }
}
// include
.item {
  @include .clearfix;
  background: #eee;
  .image {
    float: left;
    width: 100px;
  }
  .text {
    float: left;
  }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;変数を使って、サイドバーの幅を自動的に計算する&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// 全体の幅
$wrap-width: 960px;
// メインエリアの幅
$main-width: 640px;
// サイドバーの幅
$side_width: $wrap_width - $main_width - 20;
#contents {
    width: $wrap_width;
}
#main {
    width: $main_width;
}
#side {
    width: $side_width;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;nullで簡単に条件分岐してレイアウトする&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;nullを指定するとコンパイルした時にプロパティごと生成されない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;calc と Sass を組み合わせて四則演算を便利に使う&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;calcと組み合わせる際の注意点について&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;@for&lt;/code&gt;を使って余白調整用のclassを生成する&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;$spaceClass: true !default;
$spacePadding: false !default;
$endValue: 10 !default;

@if $spaceClass {
    @for $i from 0 through $space_endValue {
        .mt#{$i * 5} {
            margin-top: 5px * $i !important;
        }
        .mb#{$i * 5} {
            margin-bottom: 5px * $i !important;
        }
        @if $spacePadding {
            .pt#{$i * 5} {
                padding-top: 5px * $i !important;
            }
            .pb#{$i * 5} {
                padding-bottom: 5px * $i !important;
            }
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;.mt0 {
  margin-top: 0px !important;
}
.mb0 {
  margin-bottom: 0px !important;
}
.mt5 {
  margin-top: 5px !important;
}
.mb5 {
  margin-bottom: 5px !important;
}
...（略）...
.mt50 {
  margin-top: 50px !important;
}
.mb50 {
  margin-bottom: 50px !important;
}
// あまり作成しすぎるとCSSコード量も増えるので程々に
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;リストマーカー用の連番を使った class名 を作成する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;連番を使ったclass名のゼロパディング（0埋め）をする&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;文字リンクカラーのミックスインを作る&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;@mixin link-color2($n) {
    color: $n;
    &amp;amp;:hover {
        color: lighten($n, 30%);
        text-decoration: none;
    }
}
a {
  @include link-color2(#f00);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;複数の値を&lt;code&gt;@each&lt;/code&gt;でループし、ページによって背景を変更する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;シンプルなグラデーションのミックスインを作る&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Map型と&lt;code&gt;@each&lt;/code&gt;を使ってSNSアイコンを管理する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;値が比較しづらい &lt;code&gt;z-index&lt;/code&gt; をMap型で一括管理する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メディアクエリ用のミックスインを作成して楽々レスポンシブ対応&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;$breakpoints: (
    xs: &quot;only screen and (max-width: 320px)&quot;,
    s: &quot;only screen and (max-width: 575px)&quot;,
    m: &quot;only screen and (max-width: 767px)&quot;,
    l: &quot;only screen and (max-width: 991px)&quot;,
    xl: &quot;only screen and (max-width: 1199px)&quot;,
);
@mixin media($breakpoint) {
    @media #{map-get($breakpoints, $breakpoint)} {
        @content;
    }
}
body {
    background-color: white;
    @include media(l) {
        background-color: blue;
    }
    @include media(m) {
        background-color: green;
    }
    @include media(xs) {
        background-color: red;
    }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5-3 スマホ・マルチデバイス、ブラウザで使えるテクニック&lt;/h3&gt;
&lt;h3&gt;5-4 gulpのタスクを追加してもっと便利な環境にする&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;パーシャルファイルを一括で読み込む&lt;/li&gt;
&lt;li&gt;ソースマップでコンパイル前のソース場所を知る&lt;/li&gt;
&lt;li&gt;エラー時にWatchを停止させずに、自動コンパイルを継続させる&lt;/li&gt;
&lt;li&gt;エラーに気づきやすくするために通知を出す&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5-5 PostCSSでSassをさらに便利にする&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;PostCSSとは&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Node.js製のCSSの変換ツール&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ベンダープレフィックスを自動付与する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;対象ブラウザを確認するには
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://browserl.ist/&quot;&gt;https://browserl.ist/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;画像名だけで画像のパスやサイズを取得する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CSSプロパティの記述順を自動でソートする&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;並び替えオーダーの種類
&lt;ul&gt;
&lt;li&gt;alphabetically&lt;/li&gt;
&lt;li&gt;smacss&lt;/li&gt;
&lt;li&gt;concentric-css&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;バラバラになったメディアクエリをまとめてコード量を削減してスッキリさせる&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第6章 もっとSassを便利にするフレームワークやツール&lt;/h2&gt;
&lt;h3&gt;6-1 Sassのフレームワーク紹介&lt;/h3&gt;
&lt;h3&gt;6-2 SassのGUIコンパイラ&lt;/h3&gt;
&lt;h2&gt;第7章 Sass全機能リファレンス&lt;/h2&gt;
&lt;h3&gt;7-1 Sassの基本と高度な機能&lt;/h3&gt;
&lt;h3&gt;7-2 Sassの関数一覧&lt;/h3&gt;
&lt;h3&gt;7-3 Sassの拡張&lt;/h3&gt;
&lt;h2&gt;付録&lt;/h2&gt;
&lt;h2&gt;コマンド一覧&lt;/h2&gt;
&lt;h2&gt;用語集&lt;/h2&gt;
</content:encoded></item><item><title>Javaによる関数型プログラミングJava8ラムダ式とStream</title><link>https://tutttuwi.github.io/posts/2020-04_java%E3%81%AB%E3%82%88%E3%82%8B%E9%96%A2%E6%95%B0%E5%9E%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0java8%E3%83%A9%E3%83%A0%E3%83%80%E5%BC%8F%E3%81%A8stream/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2020-04_java%E3%81%AB%E3%82%88%E3%82%8B%E9%96%A2%E6%95%B0%E5%9E%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0java8%E3%83%A9%E3%83%A0%E3%83%80%E5%BC%8F%E3%81%A8stream/</guid><pubDate>Wed, 01 Apr 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Javaによる関数型プログラミングJava8ラムダ式とStream&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;著者：vankat subramaniam&lt;/li&gt;
&lt;li&gt;訳：株式会社プログラミングシステム社&lt;/li&gt;
&lt;li&gt;2014年10月 発行&lt;/li&gt;
&lt;li&gt;オライリー本&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;まえがき&lt;/h2&gt;
&lt;h2&gt;はじめに&lt;/h2&gt;
&lt;h3&gt;対象者&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Java5経験者&lt;/li&gt;
&lt;li&gt;他の言語で関数型プログラミングを行っていて、Javaで実施したい人&lt;/li&gt;
&lt;li&gt;すでにラムダ式に詳しい人は、チームメンバーのトレーニングに使用できる&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;本書の内容&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;最初から最後まで通して読むことをおすすめする（前の章で紹介した内容を後ろの章で使ってる）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;使用するJavaのバージョン&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Java8&lt;/code&gt;が必要&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;サンプルコードの読み方&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;サンプル
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pragprog.com/titles/vsjava8/source_code&quot;&gt;https://pragprog.com/titles/vsjava8/source_code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;オンラインリソース&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;サンプルコード
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pragprog.com/book/vsjava8/functional-programming-in-java&quot;&gt;https://pragprog.com/book/vsjava8/functional-programming-in-java&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;1章　Hello、ラムダ式&lt;/h2&gt;
&lt;h3&gt;1.1 考え方を変える&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ラムダ式の紹介&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.2 関数型のコードによる大きな利益&lt;/h3&gt;
&lt;h3&gt;1.3 なぜ関数型で記述するのか&lt;/h3&gt;
&lt;h3&gt;1.4 革命ではなく、進化&lt;/h3&gt;
&lt;h3&gt;1.5 簡単にするためのほんの少しの砂糖&lt;/h3&gt;
&lt;h3&gt;1.6 まとめ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;第一章はラムダ式の紹介をしていたので流し読み&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;2章　コレクションの使用&lt;/h2&gt;
&lt;h3&gt;2.1 リストをイテレート&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;今までの書き方から徐々にエレガントに進化させていく&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// 自殺点パターンと呼ぶ
    for(int i = 0; i &amp;lt; friends.size(); i++) {
      System.out.println(friends.get(i));
    }
// 冗長でエラーが発生しやすいから
// &amp;lt;i だったかな？ &amp;lt;=i だったかな？と悩む

// 上記よりは儀式が少なくなっている
// 特定のインデックスに対する操作がなければ、上記より優れているパターン
    for(String name : friends) {
      System.out.println(name);
    }

// これら両方とも命令形のコードであり、モダンなJavaでは捨て去ることができる
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;関数型へ移行を進める理由&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;forループは本質的にシーケンシャルであり、並列化が極めて難しい&lt;/li&gt;
&lt;li&gt;このようなループはポリモーフィックではなく、命令した通りのことを実行される。コレクションに対して（ポリモーフィックな処理を行う）メソッドを呼び出すのではなく、forループに渡している&lt;/li&gt;
&lt;li&gt;設計レベルで、コードは「伝えろ、聞くな」という原則を破っている。forループではイテレーションの詳細をライブラリに任せるのではなく、特定のイテレーション処理を実行するよう要求している&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tell, Don&apos;t Ask &lt;a href=&quot;https://www.jabba.cloud/20150912232135/&quot;&gt;https://www.jabba.cloud/20150912232135/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;    System.out.println(&quot;//&quot; + &quot;START:INTERNAL_OUTPUT&quot;);
    friends.forEach((final String name) -&amp;gt; System.out.println(name));
    System.out.println(&quot;//&quot; + &quot;END:INTERNAL_OUTPUT&quot;);

    friends.forEach((name) -&amp;gt; System.out.println(name));

    // 型推論されたパラメータはfinalが保証されなくなる
    // 引数を変更しない習慣を開発者自身が身につける必要がある
    friends.forEach(name -&amp;gt; System.out.println(name));

    friends.forEach(System.out::println);
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.2 リストの変換&lt;/h3&gt;
&lt;h4&gt;2.2.1 ラムダ式を使う&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;map()メソッドについて：連続した入力を連続した出力に変換します&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// こうじゃなくて
    final List&amp;lt;String&amp;gt; uppercaseNames = new ArrayList&amp;lt;String&amp;gt;();
    friends.forEach(name -&amp;gt; uppercaseNames.add(name.toUpperCase()));
    System.out.println(uppercaseNames);

// こう書く
    friends.stream()
           .map(name -&amp;gt; name.toUpperCase())
           .forEach(name -&amp;gt; System.out.print(name + &quot; &quot;));

&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;2.2.2 メソッド参照を使用&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;    friends.stream()
           .map(String::toUpperCase)
           .forEach(name -&amp;gt; System.out.println(name));
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;メソッド参照の使い所
&lt;ul&gt;
&lt;li&gt;ラムダ式が非常に短い場合や、ラムダ式がインスタンスメソッドやstaticメソッドをシンプルで直接的に呼び出している場合における優れた代替手段&lt;/li&gt;
&lt;li&gt;映画「Offiece Space」のTom Smykowskiのようなもの...　著者が例えている&lt;/li&gt;
&lt;li&gt;→個人的に「Offiece-spaceパターン」とよんでいる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.3 要素の検索&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;fileter()
&lt;ul&gt;
&lt;li&gt;コレクションから要素を抜き出すために用いる&lt;/li&gt;
&lt;li&gt;map()メソッドと同様にイテレーターを返すが、同じ要素数返すとは限らない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;{
    final List&amp;lt;String&amp;gt; startsWithN = new ArrayList&amp;lt;String&amp;gt;();
    for(String name : friends) {
      if(name.startsWith(&quot;N&quot;)) {
        startsWithN.add(name);
      }
    }
    System.out.println(String.format(&quot;Found %d names&quot;, startsWithN.size()));
}
{
    final List&amp;lt;String&amp;gt; startsWithN =
      friends.stream()
             .filter(name -&amp;gt; name.startsWith(&quot;N&quot;))
             .collect(Collectors.toList());
    System.out.println(String.format(&quot;Found %d names&quot;, startsWithN.size()));
}

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.4 ラムダ式の再利用&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ラムダ式を定義しておいて重複をなくそうという説明&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;    final Predicate&amp;lt;String&amp;gt; startsWithN = name -&amp;gt; name.startsWith(&quot;N&quot;);

    final long countFriendsStartN =
      friends.stream()
             .filter(startsWithN)
             .count();
    final long countEditorsStartN =
      editors.stream()
             .filter(startsWithN)
             .count();
    final long countComradesStartN =
      comrades.stream()
              .filter(startsWithN)
              .count();
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;DRYの原則&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.5 静的スコープとクロージャ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ラムダ式内は実質的にfinalな変数しか使えない&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Predicate&amp;lt;T&amp;gt;&lt;/code&gt;は&lt;code&gt;T&lt;/code&gt;型を引数に取り、関数が行う検査の結果として&lt;code&gt;boolean&lt;/code&gt;を返却。候補値の取捨選択を行う際に利用できる。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Function&amp;lt;T,R&amp;gt;&lt;/code&gt;は&lt;code&gt;T&lt;/code&gt;型の引数を取り、&lt;code&gt;R&lt;/code&gt;型の結果を返す関数。常に&lt;code&gt;boolean&lt;/code&gt;を返却する&lt;code&gt;Predicate&amp;lt;T&amp;gt;&lt;/code&gt;より汎用的。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Optional&lt;/code&gt;クラスは、結果が存在しない可能性がある場合に便利&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;    final Function&amp;lt;String, Predicate&amp;lt;String&amp;gt;&amp;gt; startsWithLetter =
      letter -&amp;gt; name -&amp;gt; name.startsWith(letter);

    final long countFriendsStartN =
      friends.stream()
             .filter(startsWithLetter.apply(&quot;N&quot;)).count();
    final long countFriendsStartB =
      friends.stream()
             .filter(startsWithLetter.apply(&quot;B&quot;)).count();

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;MEMO: Functionで囲うメリットがいまいち理解できていない（2020-04-26 14:52:51）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.6 要素を 1つ選択&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Null初期化は、Nullであることを確認する作業が必要になって来る
&lt;ul&gt;
&lt;li&gt;これを忘れるとNullpointerExcepiton&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// エレガントな例
  public static void pickName(
    final List&amp;lt;String&amp;gt; names, final String startingLetter) {
    final Optional&amp;lt;String&amp;gt; foundName = 
      names.stream()
           .filter(name -&amp;gt;name.startsWith(startingLetter))
           .findFirst();
    System.out.println(String.format(&quot;A name starting with %s: %s&quot;,
      startingLetter, foundName.orElse(&quot;No name found&quot;)));
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;OptionalはNull脱臭剤&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.7 コレクションを単一の値に集約（reduce）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;本節では、要素の比較や計算状態をコレクションに渡って持ち越して使用する方法を学ぶ&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;System.out.println(&quot;//&quot; + &quot;START:SUM_OUTPUT&quot;);
      System.out.println(&quot;Total number of characters in all names: &quot; +
        friends.stream()
               .mapToInt(name -&amp;gt; name.length())
               .sum());
    }
System.out.println(&quot;//&quot; + &quot;END:SUM_OUTPUT&quot;);

System.out.println(&quot;//&quot; + &quot;END:AVERAGE_OUTPUT&quot;);
System.out.println(&quot;//&quot; + &quot;START:REDUCE_OUTPUT&quot;);
    final Optional&amp;lt;String&amp;gt; aLongName =
      friends.stream()
             .reduce((name1, name2) -&amp;gt;
                name1.length() &amp;gt;= name2.length() ? name1 : name2);
    aLongName.ifPresent(name -&amp;gt;
      System.out.println(String.format(&quot;A longest name: %s&quot;, name)));
System.out.println(&quot;//&quot; + &quot;END:REDUCE_OUTPUT&quot;);

    final String steveOrLonger =
      friends.stream()
             .reduce(&quot;Steve&quot;, (name1, name2) -&amp;gt;
                name1.length() &amp;gt;= name2.length() ? name1 : name2);

    System.out.println(steveOrLonger);
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.8 要素の結合&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;StringJoinerの説明&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;System.out.println(&quot;//&quot; + &quot;START:MAP_JOIN_OUTPUT&quot;);
    System.out.println(
      friends.stream()
             .map(String::toUpperCase)
             .collect(joining(&quot;, &quot;)));
System.out.println(&quot;//&quot; + &quot;END:MAP_JOIN_OUTPUT&quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.9 まとめ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;コレクションはプログラムにおいてはありふれたもので、&lt;/li&gt;
&lt;li&gt;ラムダ式によりJavaにおけるコレクションの利用は従来よりも遥かに簡単で単純になりました&lt;/li&gt;
&lt;li&gt;記述するコード量が減少し、保守性が高くなる&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;3章　文字列、コンパレータ、フィルタ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ラムダ式とメソッド参照を使用してSringをいてレートし、Comparatorを実装し、ディレクトリのファイルリストを取得し、&lt;/li&gt;
&lt;li&gt;そしてファイルやディレクトリを監視します&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.1 文字列のイテレーション&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;    System.out.println(&quot;//&quot; + &quot;START:ITERATE_OUTPUT&quot;);

    final String str = &quot;w00t&quot;;

    str.chars()
       .forEach(ch -&amp;gt; System.out.println(ch));
    System.out.println(&quot;//&quot; + &quot;END:ITERATE_OUTPUT&quot;);

    str.chars()
       .forEach(System.out::println);

    System.out.println(&quot;//&quot; + &quot;START:FIX_OUTPUT&quot;);
    str.chars()
       .forEach(IterateString::printChar);
    System.out.println(&quot;//&quot; + &quot;END:FIX_OUTPUT&quot;);

        str.chars()
           .mapToObj(ch -&amp;gt; Character.valueOf((char)ch))
           .forEach(System.out::println);

    System.out.println(&quot;//&quot; + &quot;START:FILTER_OUTPUT&quot;);
    str.chars()
       .filter(ch -&amp;gt; Character.isDigit(ch))
       .forEach(ch -&amp;gt; printChar(ch));
    System.out.println(&quot;&quot;);
    System.out.println(&quot;//&quot; + &quot;END:FILTER_OUTPUT&quot;);

    str.chars()
       .filter(ch -&amp;gt; Character.isDigit(ch));

    str.chars()
       .filter(Character::isDigit);

    str.chars()
       .filter(Character::isDigit)
       .forEach(IterateString::printChar);
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;インスタンスメソッドのメソッド参照（String::toUppercase）と、staticメソッドのメソッド参照（Character::isDigit）は構造的に同じように見えるが異なる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;インスタンスメソッド： &lt;code&gt;引数.toUppercase();&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;staticメソッド： &lt;code&gt;Character.isDigit(引数);&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;インスタンスメソッドとstaticメソッドの定義が衝突すると、&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;どちらを使用していいかコンパイラが判断できなくなりコンパイルエラーとなる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;→この場合はラムダ式を使う！&lt;/li&gt;
&lt;li&gt;ラムダ式とメソッド参照を自由自在に切り替えられるようになる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.2 Comparatorインタフェースを実装&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;List&lt;/code&gt;の&lt;code&gt;sort()メソッド&lt;/code&gt;だと戻り値が&lt;code&gt;void&lt;/code&gt;なので、リスト本体が変更されてしまう&lt;/li&gt;
&lt;li&gt;コピーを取得した上で、変更する必要があったが、面倒&lt;/li&gt;
&lt;li&gt;代わりにStreamの力を借りて処理する方法を考える&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;people.sorted((person1,person2) -&amp;gt; person1.ageDifference(person2)).collect(toList());
// ↓改善
people.stream().sorted(Person::ageDifference).collect(toList());
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;逆順にしたい場合&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;
people.stream().sorted((person1, person2) -&amp;gt; person2.ageDifference(person1)).collect(toList());
// パラメータの順番が引数受け渡しの規約に従っていないため、メソッド参照を使うようにリファクタリングすることはできません。

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;事前に&lt;code&gt;Comparator&lt;/code&gt;を定義しておいて、使用することで簡潔に記載できる&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;  
  public static void main(String[] args) {
    final List&amp;lt;Person&amp;gt; people = Arrays.asList(
      new Person(&quot;John&quot;, 20),
      new Person(&quot;Sara&quot;, 21),
      new Person(&quot;Jane&quot;, 21),
      new Person(&quot;Greg&quot;, 35));

{  
    System.out.println(&quot;//&quot; + &quot;START:AGE_ASCEND_OUTPUT&quot;);
    List&amp;lt;Person&amp;gt; ascendingAge = 
      people.stream()
            .sorted((person1, person2) -&amp;gt; person1.ageDifference(person2))
            .collect(toList());
    printPeople(&quot;Sorted in ascending order by age: &quot;, ascendingAge);
    System.out.println(&quot;//&quot; + &quot;END:AGE_ASCEND_OUTPUT&quot;);
}

{  
  // メソッド参照（Method Reference）
    System.out.println(&quot;//&quot; + &quot;START:AGE_ASCEND_MR_OUTPUT&quot;);
    List&amp;lt;Person&amp;gt; ascendingAge = 
      people.stream()
            .sorted(Person::ageDifference)
            .collect(toList());

    printPeople(&quot;Sorted in ascending order by age: &quot;, ascendingAge);
    System.out.println(&quot;//&quot; + &quot;END:AGE_ASCEND_MR_OUTPUT&quot;);
}

{
    System.out.println(&quot;//&quot; + &quot;START:AGE_DESCEND_OUTPUT&quot;);
    printPeople(&quot;Sorted in descending order by age: &quot;,
      people.stream()
            .sorted((person1, person2) -&amp;gt; person2.ageDifference(person1))
            .collect(toList()));
    System.out.println(&quot;//&quot; + &quot;END:AGE_DESCEND_OUTPUT&quot;);

    System.out.println(&quot;//&quot; + &quot;START:REVERSE_ORDER_OUTPUT&quot;);
    Comparator&amp;lt;Person&amp;gt; compareAscending = 
      (person1, person2) -&amp;gt; person1.ageDifference(person2);
      // reversed()を使うことで降順の関数を事前に用意できる
    Comparator&amp;lt;Person&amp;gt; compareDescending = compareAscending.reversed();

    printPeople(&quot;Sorted in ascending order by age: &quot;,
      people.stream()
            .sorted(compareAscending)
            .collect(toList())
    );
    printPeople(&quot;Sorted in descending order by age: &quot;,
      people.stream()
            .sorted(compareDescending)
            .collect(toList())
    );
    System.out.println(&quot;//&quot; + &quot;END:REVERSE_ORDER_OUTPUT&quot;);

    // 名前の昇順に並び替え
    System.out.println(&quot;//&quot; + &quot;START:NAME_ASCEND_OUTPUT&quot;);
    printPeople(&quot;Sorted in ascending order by name: &quot;,
      people.stream()
            .sorted((person1, person2) -&amp;gt; 
               person1.getName().compareTo(person2.getName()))
            .collect(toList()));
    System.out.println(&quot;//&quot; + &quot;END:NAME_ASCEND_OUTPUT&quot;);
}

{
    // min()メソッドはOptionalを返す！
    System.out.println(&quot;//&quot; + &quot;START:YOUNGEST_OUTPUT&quot;);
    people.stream()
          .min(Person::ageDifference)
          .ifPresent(youngest -&amp;gt; System.out.println(&quot;Youngest: &quot; + youngest));
System.out.println(&quot;//&quot; + &quot;END:YOUNGEST_OUTPUT&quot;);
}

{
    System.out.println(&quot;//&quot; + &quot;START:ELDEST_OUTPUT&quot;);
    people.stream()
          .max(Person::ageDifference)
          .ifPresent(eldest -&amp;gt; System.out.println(&quot;Eldest: &quot; + eldest));
    System.out.println(&quot;//&quot; + &quot;END:ELDEST_OUTPUT&quot;);
}

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3.3 複数のプロパティによる流暢な比較&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;
{
    // 名前のアルファベット順にするために以下の関数を用意した
    // 従来の内部クラス構文と比較すると非常に簡潔
    people.stream()
          .sorted((person1, person2) -&amp;gt; 
             person1.getName().compareTo(person2.getName()));

    printPeople(&quot;Sorted in ascending order by name: &quot;,
    people.stream()
          .sorted(comparing((Person person) -&amp;gt; person.getName()))
          .collect(toList()));

    // Comparatorインターフェースのコンビニエンス関数を使用することで、より自由にコードの目的を表現できる
    // Comparaotrインターフェースのcomparing()メソッドを静的にインポートしました。comparing()メソッドは与えられた
    // ラムダ式のロジックを使用してComparatorを生成する！
    // つまり、関数（Function）を引数に取り、関数（Comparator）を返す高階関数
    final Function&amp;lt;Person, String&amp;gt; byName = person -&amp;gt; person.getName();
    people.stream()
          .sorted(comparing(byName));
}

{
    System.out.println(&quot;//&quot; + &quot;START:SORT_NAME_AND_AGE_OUTPUT&quot;);
    
    final Function&amp;lt;Person, Integer&amp;gt; byAge = person -&amp;gt; person.getAge();
    final Function&amp;lt;Person, String&amp;gt; byTheirName = person -&amp;gt; person.getName();
    
    printPeople(&quot;Sorted in ascending order by age and name: &quot;,
      people.stream()
            .sorted(comparing(byAge).thenComparing(byTheirName))
            .collect(toList()));
    System.out.println(&quot;//&quot; + &quot;END:SORT_NAME_AND_AGE_OUTPUT&quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;このように、Comparatorの実装をラムダ式やJDKの新たなユーティリティクラスを使用して簡単に合成できる
&lt;ul&gt;
&lt;li&gt;MEMO: 少し納得してないので再度確認&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.4 collectメソッドとCollectorsクラスの使用&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;これまでに、Streamの要素をArrayListに変換する例でcollect()メソッドを数回使用している
&lt;ul&gt;
&lt;li&gt;このメソッドは、あるコレクションを可変コレクションなど他のデータ型へ変換する際に便利な集約処理を行います&lt;/li&gt;
&lt;li&gt;collect()関数はCollectorsクラスのユーティリティメソッドと組み合わせるととても便利&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// 20歳以上の人を抽出してリストを取得する
{  
    // 従来の書き方
    System.out.println(&quot;//&quot; + &quot;START:MUTABLE_OUTPUT&quot;);
    List&amp;lt;Person&amp;gt; olderThan20 = new ArrayList&amp;lt;&amp;gt;();
      people.stream()
            .filter(person -&amp;gt; person.getAge() &amp;gt; 20)
            .forEach(person -&amp;gt; olderThan20.add(person));
    System.out.println(&quot;People older than 20: &quot; + olderThan20);
    System.out.println(&quot;//&quot; + &quot;END:MUTABLE_OUTPUT&quot;);
    // 問題点：
    // ターゲットとするコレクションに要素を１つずつ追加する保s理はとても低レベルなもので、宣言型ではなく命令形のコード
    // 並列に実行させる場合にはスレッドセーフ問題を適切に処理しなければならない
    // 可変性を持つコードを並列化するのは難しいものです。
}

// この問題はcollect()を使うことで緩和できる
// collect()メソッドの以下の３つについて知っておく
// サプライヤ　　：結果を収めるコンテナの精製方法（例えば、ArrayList::new）
// アキュムレータ：結果コンテナに単一の要素を追加する方法（例えばArrayList::add）
// コンバイナ　　：結果コンテナを他のコンテナと結合する方法（例えばArrayList::addAll）

{  
    // 便利な書き方！
    System.out.println(&quot;//&quot; + &quot;START:COLLECT_OUTPUT&quot;);
    List&amp;lt;Person&amp;gt; olderThan20 = 
      people.stream()
            .filter(person -&amp;gt; person.getAge() &amp;gt; 20)
            .collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
    System.out.println(&quot;People older than 20: &quot; + olderThan20);
    System.out.println(&quot;//&quot; + &quot;END:COLLECT_OUTPUT&quot;);
}
// メリット：
// より明確で意図を持ったプログラミングを行っている→ArrayListに処理結果を集めることがこのコードの目的
// コード内で状態変更を行っていないため、イテレーションを簡単に並列化できる

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;次は基本の&lt;code&gt;collect()&lt;/code&gt;メソッドよりも簡潔で便利な、オーバーロードされたcollect()メソッドを見ていく&lt;/li&gt;
&lt;li&gt;このメソッドはCollectorを引数に取ります&lt;/li&gt;
&lt;li&gt;Collectorはcollect()メソッドに設定された３つの異なるパラメータをカプセル化した、より簡単で再利用可能なインターフェース&lt;/li&gt;
&lt;li&gt;様々なCollectorの実装を提供するCollectorsクラスにtoList()というコンビニエンスメソッドがある&lt;/li&gt;
&lt;li&gt;このメソッドはArrayListに要素を蓄積するメソッドで、Collectorインターフェースの実装&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;{  
    System.out.println(&quot;//&quot; + &quot;START:COLLECT_TO_LIST_OUTPUT&quot;);
    List&amp;lt;Person&amp;gt; olderThan20 = 
      people.stream()
            .filter(person -&amp;gt; person.getAge() &amp;gt; 20)
            .collect(Collectors.toList());
    System.out.println(&quot;People older than 20: &quot; + olderThan20);
    System.out.println(&quot;//&quot; + &quot;END:COLLECT_TO_LIST_OUTPUT&quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;他にも色々集計できるよっていう説明!
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.oracle.com/javase/jp/8/docs/api/java/util/stream/Collectors.html&quot;&gt;https://docs.oracle.com/javase/jp/8/docs/api/java/util/stream/Collectors.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;
{  
    System.out.println(&quot;//&quot; + &quot;START:GROUP_BY_OUTPUT&quot;);
    Map&amp;lt;Integer, List&amp;lt;Person&amp;gt;&amp;gt; peopleByAge = 
      people.stream()
            .collect(Collectors.groupingBy(Person::getAge));
    System.out.println(&quot;Grouped by age: &quot; + peopleByAge);
    System.out.println(&quot;//&quot; + &quot;END:GROUP_BY_OUTPUT&quot;);
}

{  
    System.out.println(&quot;//&quot; + &quot;START:GROUP_BY_AGE_NAME_OUTPUT&quot;);
    Map&amp;lt;Integer, List&amp;lt;String&amp;gt;&amp;gt; nameOfPeopleByAge = 
      people.stream()
            .collect(
              groupingBy(Person::getAge, mapping(Person::getName, toList())));
    System.out.println(&quot;People grouped by age: &quot; + nameOfPeopleByAge);
    System.out.println(&quot;//&quot; + &quot;END:GROUP_BY_AGE_NAME_OUTPUT&quot;);
}

{  
    System.out.println(&quot;//&quot; + &quot;START:OLDEST_IN_EACH_LETTER_OUTPUT&quot;);
    Comparator&amp;lt;Person&amp;gt; byAge = Comparator.comparing(Person::getAge);
    Map&amp;lt;Character, Optional&amp;lt;Person&amp;gt;&amp;gt; oldestPersonOfEachLetter = 
      people.stream()
            .collect(groupingBy(person -&amp;gt; person.getName().charAt(0),
               reducing(BinaryOperator.maxBy(byAge))));
    System.out.println(&quot;Oldest person of each letter:&quot;);
    System.out.println(oldestPersonOfEachLetter);
    System.out.println(&quot;//&quot; + &quot;END:OLDEST_IN_EACH_LETTER_OUTPUT&quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;MEMO: 集計関数を実際に色々使ってみる！！&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.5 ディレクトリの全ファイルをリスト&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;File&lt;/code&gt;クラスの&lt;code&gt;list()&lt;/code&gt;メソッドを使うと、ディレクトリにある全ファイル名を簡単にリスト化できる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ファイル名だけでなくすべてのファイルを取得する場合は&lt;code&gt;listFiles()&lt;/code&gt;メソッドが使える&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ファイルを取得したあとの処理が大変&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ここでは、従来のくどい外部イテレータを使用するのではなく、エレガントな関数型スタイルの機能を使ってリストをイテレートしていく&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;  // 以下の２つとも古いjavaより格段にシンプル
  Files.list(Paths.get(&quot;.&quot;))
       .forEach(System.out::println);
  }
  Files.list(Paths.get(&quot;.&quot;))
       .filter(Files::isDirectory) // filterはPredicateを期待する
       .forEach(System.out::println);
  }

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3.6 ディレクトリの特定のファイルだけをリスト&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;特定のファイル名取得のためにオーバーロードされたFileクラスのlist()メソッドを提供してきました&lt;/li&gt;
&lt;li&gt;このlist()メソッドはFilenameFilterインターフェースを引数に取ります&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;  final String[] files =
    new File(&quot;fpij&quot;).list(new java.io.FilenameFilter() {
      public boolean accept(final File dir, final String name) {
        return name.endsWith(&quot;.java&quot;);
      }
    });
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;これをラムダ式に置き換える！&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;    Files.newDirectoryStream(
         Paths.get(&quot;fpij&quot;), path -&amp;gt; path.toString().endsWith(&quot;.java&quot;))
     .forEach(System.out::println);
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3.7 flatMapで直下のサブディレクトリをリスト&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;与えられたディレクトリ直下のサブディレクトリを探索する方法を解説する&lt;/li&gt;
&lt;li&gt;最初に原始的な方法を説明し、次により便利なflatMap()メソッド（Streamクラス）を使用する&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;  public static void listTheHardWay() {
    List&amp;lt;File&amp;gt; files = new ArrayList&amp;lt;&amp;gt;();

    File[] filesInCurrentDir = new File(&quot;.&quot;).listFiles();
    for(File file : filesInCurrentDir) {
      File[] filesInSubDir = file.listFiles();
      if(filesInSubDir != null) {
        files.addAll(Arrays.asList(filesInSubDir));
      } else {
        files.add(file);
      }
    }

    System.out.println(&quot;Count: &quot; + files.size());
  }

  public static void betterWay() {
    List&amp;lt;File&amp;gt; files =
      Stream.of(new File(&quot;.&quot;).listFiles())
            .flatMap(file -&amp;gt; file.listFiles() == null ? 
                Stream.of(file) : Stream.of(file.listFiles()))
            .collect(toList());
    System.out.println(&quot;Count: &quot; + files.size());
  }

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;MEMO: モナド合成という言葉が出てきたが、いまいち意味がわからない&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.8 ファイルの変更を監視&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ファイルが生成・変更・削除される際のアラートも簡単に実現できる&lt;/li&gt;
&lt;li&gt;Java7で追加されたWatchServiceの機能を紹介&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;  public static void main(String[] args) throws Exception {
    new Thread(() -&amp;gt; watchFileChange()).start();
    final File file = new File(&quot;sample.txt&quot;);
    file.createNewFile();
    Thread.sleep(5000);
    file.setLastModified(System.currentTimeMillis());
  }
  
  public static void watchFileChange() {
    try {
      final Path path = Paths.get(&quot;.&quot;);
      final WatchService watchService = 
        path.getFileSystem()
            .newWatchService();
        
      path.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY);
      
      System.out.println(&quot;Report any file changed within next 1 minute...&quot;);

      final WatchKey watchKey = watchService.poll(1, TimeUnit.MINUTES);
      
      if(watchKey != null) {
        watchKey.pollEvents()
                .stream()
                .forEach(event -&amp;gt;
                   System.out.println(event.context()));
      }
    } catch(InterruptedException | IOException ex) {
      System.out.println(ex);
    }
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3.9 まとめ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;文字列操作やファイル処理、カスタムコンパレータの生成などの定型タスクはラムダ式とメソッド参照によって非常に楽に、簡潔になりました。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;4章　ラムダ式で設計する&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;本章では、ラムダ式が巧妙なデザインアイデアに生命を与える&lt;/li&gt;
&lt;li&gt;これまではオブジェクトを使用していた箇所を軽量関数で代用できる&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.1 ラムダ式を使った関心の分離&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;コードの再利用のためにクラスを生成することは良い心がけですが、それが常に正しいとは限らない&lt;/li&gt;
&lt;li&gt;クラスの代わりに高階関数を使うことで、クラス階層を必要とせずに同じことが達成できる&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4.1.1 デザイン問題の探求&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// JavaBean
public class Asset {
  public enum AssetType { BOND, STOCK }; 
  private final AssetType type;
  private final int value;
  public Asset(final AssetType assetType, final int assetValue) {
    type = assetType;
    value = assetValue;
  }
  public AssetType getType() { return type; }
  public int getValue() { return value; }
}
// Utilクラス
  public static int totalAssetValues(final List&amp;lt;Asset&amp;gt; assets) {
    return assets.stream()
                 .mapToInt(Asset::getValue)
                 .sum();
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;ラムダ式を使って、totalAssetValues()メソッドを書き、流暢なイテレータと好むべき不変性を使いました&lt;/li&gt;
&lt;li&gt;しかし今はメソッド自身の設計に目を向けましょう&lt;/li&gt;
&lt;li&gt;このメソッドでは
&lt;ul&gt;
&lt;li&gt;どのようにイテレーションを行うか&lt;/li&gt;
&lt;li&gt;何を合計するか&lt;/li&gt;
&lt;li&gt;どのように合計するか
&lt;ul&gt;
&lt;li&gt;といった３つの問題が絡み合っている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4.1.2 問題でがんじがらめ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;資産のうち、債券（bond）だけを合計したい場合を考える&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;  public static int totalBondValues(final List&amp;lt;Asset&amp;gt; assets) {
    return assets.stream()
                 .mapToInt(asset -&amp;gt; 
                    asset.getType() == AssetType.BOND ? asset.getValue() : 0)
                 .sum();
  }

  public static int totalStockValues(final List&amp;lt;Asset&amp;gt; assets) {
    return assets.stream()
                 .mapToInt(asset -&amp;gt; 
                    asset.getType() == AssetType.STOCK ? asset.getValue() : 0)
                 .sum();
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;こんなふうにコピペで増やしていって良いでしょうか？&lt;/li&gt;
&lt;li&gt;DRYの原則に従ってもう少しましな設計をしましょう&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4.1.3 主要な関心の分離&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;イテレーションと合計を求める方法は同じですが、「何を」合計するかが異なります&lt;/li&gt;
&lt;li&gt;この「何を合計するか」部分はメソッドから切り離す良い候補&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;  public static int totalAssetValues(final List&amp;lt;Asset&amp;gt; assets,
    final Predicate&amp;lt;Asset&amp;gt; assetSelector) {
    return assets.stream()
                 .filter(assetSelector)
                 .mapToInt(Asset::getValue)
                 .sum();
  }
  
  public static void main(final String[] args) {
    List&amp;lt;Asset&amp;gt; assets = Arrays.asList(
      new Asset(Asset.AssetType.BOND, 1000),
      new Asset(Asset.AssetType.BOND, 2000),
      new Asset(Asset.AssetType.STOCK, 3000),
      new Asset(Asset.AssetType.STOCK, 4000)
    );

    System.out.println(&quot;Total of all assets: &quot; + 
      totalAssetValues(assets, asset -&amp;gt; true));

    System.out.println(&quot;Total of bonds: &quot; + 
      totalAssetValues(assets, asset -&amp;gt; asset.getType() == AssetType.BOND));

    System.out.println(&quot;Total of stocks: &quot; + 
      totalAssetValues(assets, asset -&amp;gt; asset.getType() == AssetType.STOCK));
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;個々まではメソッドレベルでの関心の分離を行いましたが、次はクラスレベルで応用します&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.2 ラムダ式を使った委譲&lt;/h3&gt;
&lt;h3&gt;4.3 ラムダ式を使ったデコレーション&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cameraクラスのフィルター設定&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.4 defaultメソッドを覗く&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;interfaceがdefaultメソッドを持てる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;実装の衝突を防ぐためにルールが存在する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;実際にinterfaceにdefaultメソッドが記述できるメリットがあまり浮かばないような気がする&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.5 ラムダ式を使った流暢なインタフェース&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;MEMO: ここは参考になる実装だと感じた
&lt;ul&gt;
&lt;li&gt;用途例：メーラの設定、データベース設定パラメータの設定、インスタンスの連続した状態を管理下におきつつ構築する必要のある場合&lt;/li&gt;
&lt;li&gt;ローンパターンと言うらしい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;  private FluentMailer() {}
  
  public FluentMailer from(final String address) { /*... */; return this; }
  public FluentMailer to(final String address)   { /*... */; return this; }
  public FluentMailer subject(final String line) { /*... */; return this; }
  public FluentMailer body(final String message) { /*... */; return this; }
  
  public static void send(final Consumer&amp;lt;FluentMailer&amp;gt; block) {
    final FluentMailer mailer = new FluentMailer();
    block.accept(mailer);
    System.out.println(&quot;sending...&quot;);
  }

  //...
  public static void main(final String[] args) {
    FluentMailer.send(mailer -&amp;gt;
      mailer.from(&quot;build@agiledeveloper.com&quot;)
            .to(&quot;venkats@agiledeveloper.com&quot;)
            .subject(&quot;build notification&quot;)
            .body(&quot;...much better...&quot;));
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4.6 例外処理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ラムダ式の例外処理について
&lt;ul&gt;
&lt;li&gt;MEMO: 再読する必要あり&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.7 まとめ&lt;/h3&gt;
&lt;h2&gt;5章　外部リソースを扱う&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Java仮想マシン（JVM）は、自動的にガベージコレクション（GC）を行っているものだと信じているかもしれません。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;内部リソースだけを扱っている場合はJVMにGCを任せられることは事実&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;しかし、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;データベース接続&lt;/li&gt;
&lt;li&gt;ファイルやソケット&lt;/li&gt;
&lt;li&gt;ネイティブリソースといった外部リソースを使用する場合は
&lt;ul&gt;
&lt;li&gt;GCは開発者の責任範囲&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本章では、ラムダ式を使って、&lt;code&gt;execute around method(EAM)&lt;/code&gt;を実装します。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;連続操作をより効率的に制御できます。そしてこのパターンを使ってロック管理と書き込み例外テストを行います&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.1 リソースの解放&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;finalize()なんて使ったらGCされずに貯まるでしょ？&lt;/li&gt;
&lt;li&gt;close()メソッドで閉じる？→閉じ忘れたらどうするの？→エラー発生したらclose()呼ばれないままになるよね？&lt;/li&gt;
&lt;li&gt;try-with-resources構文使う？Java7から追加された便利な構文だけど、開発者が下記忘れたら元も子もない、AutoClosableの実装もしておかないと行けないでしょ？
&lt;ul&gt;
&lt;li&gt;→ラムダ式で解決しましょう！という説明&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.2 ラムダ式でリソース解放&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ラムダ式で設計して、開発者にこれを使うように共有すれば問題なし&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;
public class FileWriterEAM  {
  private final FileWriter writer;
  
  private FileWriterEAM(final String fileName) throws IOException {
    writer = new FileWriter(fileName);
  }
  private void close() throws IOException {
    System.out.println(&quot;close called automatically...&quot;);
    writer.close();
  }
  public void writeStuff(final String message) throws IOException {
    writer.write(message);
  }
  //...

  public static void use(final String fileName,
    final UseInstance&amp;lt;FileWriterEAM, IOException&amp;gt; block) throws IOException {

    final FileWriterEAM writerEAM = new FileWriterEAM(fileName);
    try {
      block.accept(writerEAM);
    } finally {
      writerEAM.close();
    }
  }

  public static void main(final String[] args) throws IOException {
  
    System.out.println(&quot;//&quot; + &quot;START:EAM_USE_OUTPUT&quot;);
    FileWriterEAM.use(&quot;eam.txt&quot;, writerEAM -&amp;gt; writerEAM.writeStuff(&quot;sweet&quot;));
    System.out.println(&quot;//&quot; + &quot;END:EAM_USE_OUTPUT&quot;);

    FileWriterEAM.use(&quot;eam2.txt&quot;, writerEAM -&amp;gt; {
        writerEAM.writeStuff(&quot;how&quot;);
        writerEAM.writeStuff(&quot;sweet&quot;);
      });

  }

}

// interface
// @FunctionalInterfaceは関数型インターフェースであることの宣言
// 例外を考慮する必要がなければ、Consumerインターフェースを使えばよかったが、ラムダ式は、合成されるabstratメソッドのシグネチャの一部として定義されたチェック例外を投げることができるため実装
@FunctionalInterface
public interface UseInstance&amp;lt;T, X extends Throwable&amp;gt; {
  void accept(T instance) throws X;
}

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;MEMO: &lt;code&gt;execute around method&lt;/code&gt;パターンの構造らしい
&lt;ul&gt;
&lt;li&gt;この仕組はファイル読み込みを行う際に見習うべき&lt;/li&gt;
&lt;li&gt;そもそも標準のjavaでファイル読み込み時に自動的に開放するような書き方ができないか確認すべき&lt;/li&gt;
&lt;li&gt;実際には読み込みファイルと書き込みファイル両方を開いて処理を行う場合が多いのでは？
&lt;ul&gt;
&lt;li&gt;そのような場合どうやって書いていく？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Transactionという形でUTIL作成して、複数ファイルをオープンして操作していけば行ける？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.3 ロックの管理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;コンカレントなJavaアプリケーションにおいてロックは重要な役割を果たす&lt;/li&gt;
&lt;li&gt;ここでは、ラムダ式を使って細かなロックの制御を行い、重要なセクションの適切なロックの単体テストの可能性を開く&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;public class Locker {
  public static void runLocked(Lock lock, Runnable block) {
    lock.lock();

    try {
      block.run();
    } finally {
      lock.unlock();
    }
  }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;MEMO: Lockの使い方確認 このロジックレベルでロックする使い所がいまいちピンとこない
&lt;ul&gt;
&lt;li&gt;使い所があれば、synchronizedを使用するより、こちらの方が単体テストもしやすいメリットがあるみたい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.4 簡潔な例外テストの生成&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Junitフレームワークなどでアノテーションを使用した、例外テストを実施する場合は、&lt;/li&gt;
&lt;li&gt;ラムダ式で書き換えた方が良いという例&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;public class RodCutter {
  private boolean mustFail;
  
  public RodCutter(final boolean fail) { mustFail = fail; }

  public void setPrices(final List&amp;lt;Integer&amp;gt; prices) {
    //...
    if(mustFail) 
      throw new RodCutterException();
  }

  public int maxProfit(final int length) {
    if (length == 0) throw new RodCutterException();
    
    return 0;
  }
}


public class RodCutterTest {
  private RodCutter rodCutter;
  private List&amp;lt;Integer&amp;gt; prices;
  
  protected RodCutter createCutter() {
    return new RodCutter(false);
  }
  
  @Before public void initialize() {
    rodCutter = createCutter();
    prices = Arrays.asList(1, 1, 2, 2, 3, 4, 5);
  }

  @Test public void VerboseExceptionTest() {
    rodCutter.setPrices(prices);
    try {
      rodCutter.maxProfit(0);
      fail(&quot;Expected exception for zero length&quot;);
    } catch(RodCutterException ex) {
      assertTrue(&quot;expected&quot;, true);
    }
  }

  @Test(expected = RodCutterException.class) 
  public void TerseExceptionTest() {
    rodCutter.setPrices(prices);
    rodCutter.maxProfit(0);
  }

  // Lamda式を利用したテスト方法
  @Test 
  public void ConciseExceptionTest() {
    rodCutter.setPrices(prices);
    assertThrows(RodCutterException.class, () -&amp;gt; rodCutter.maxProfit(0));
  }
  
  public static void main(String[] args) {
    junit.textui.TestRunner.run(new JUnit4TestAdapter(RodCutterTest.class));
  }
}


// HELPERの実装
public class TestHelper {
  public static &amp;lt;X extends Throwable&amp;gt; Throwable assertThrows(
    final Class&amp;lt;X&amp;gt; exceptionClass, final Runnable block) {

    try {
      block.run();
    } catch(Throwable ex) {
      if(exceptionClass.isInstance(ex))
        return ex;
    }
    fail(&quot;Failed to throw expected exception &quot;);
    return null;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;MEMO: 現在のフレームワークでラムダ式を利用したメソッドが提供されていないかどうか確認する&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.5 まとめ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;アプリケーションが外部リソースを使用する場合、全面的に自動ガベージコレクションに頼ることはできません。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;execute around method&lt;/code&gt;パターンは実行フローのきめ細かい制御や外部リソースの開放に役立つ
&lt;ul&gt;
&lt;li&gt;オブジェクト生存期間の制御&lt;/li&gt;
&lt;li&gt;ロック管理&lt;/li&gt;
&lt;li&gt;簡潔な例外テストの記述&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;6章　「遅延させる」ということ&lt;/h2&gt;
&lt;h3&gt;6.1 初期化の遅延&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;オブジェクト内部に重いリソースが存在する場合、その生成を後回しにできれば有益&lt;/li&gt;
&lt;li&gt;オブジェクトの一部の生成をアトマwしにするという設計上の決断は、オブジェクトを使う開発者にとって重荷になるべきではなく、シームレスであるべき&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;public class Holder {
  private Supplier&amp;lt;Heavy&amp;gt; heavy = () -&amp;gt; createAndCacheHeavy();
  
  public Holder() {
    System.out.println(&quot;Holder created&quot;);
  }

  public Heavy getHeavy() {
    return heavy.get();
  }
  //...

  private synchronized Heavy createAndCacheHeavy() {
    class HeavyFactory implements Supplier&amp;lt;Heavy&amp;gt; {
      private final Heavy heavyInstance = new Heavy();

      public Heavy get() { return heavyInstance; }
    }

    if(!HeavyFactory.class.isInstance(heavy)) {
      heavy = new HeavyFactory();
    }

    return heavy.get();
  }

  public static void main(final String[] args) {
    final Holder holder = new Holder();
    System.out.println(&quot;deferring heavy creation...&quot;);
    System.out.println(holder.getHeavy());
    System.out.println(holder.getHeavy());
  }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;virtual poroxyパターン&lt;/li&gt;
&lt;li&gt;オブジェクトの生成に１レベル挟む
次はラムダ式で実現する&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6.2 遅延評価&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;短絡評価： &lt;code&gt;fn1() || fn2()&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メソッドの引数の場合は渡されたものすべてが評価される&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;すべての引数を使用しない場合はその評価に費やした時間とリソースが無駄になる&lt;/li&gt;
&lt;li&gt;ここでもラムダ式を使って任意の引数の評価を遅らせることができる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メソッド実行時にある引数が使用されない可能性があることがわかっていれば、いくつかの引数、またはすべての引数を遅延実行するようにメソッドのインターフェースを変更できる&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;
public class Evaluation {
  public static boolean evaluate(final int value) {
    System.out.println(&quot;evaluating ...&quot; + value);
    simulateTimeConsumingOp(2000);
    return value &amp;gt; 100;
  }
  //...

  public static void simulateTimeConsumingOp(final int millseconds) {
    try { 
      Thread.sleep(2000); 
    } catch(Exception ex) { throw new RuntimeException(ex); }
  }

  public static void eagerEvaluator(
    final boolean input1, final boolean input2) {
    System.out.println(&quot;eagerEvaluator called...&quot;);
    System.out.println(&quot;accept?: &quot; + (input1 &amp;amp;&amp;amp; input2));
  }

  /**
  * 遅延評価のためのメソッド
  * ラムダ式を引数に取り、実行自体はこのメソッドの中で行う
  */
  public static void lazyEvaluator(
    final Supplier&amp;lt;Boolean&amp;gt; input1, final Supplier&amp;lt;Boolean&amp;gt; input2) {
    System.out.println(&quot;lazyEvaluator called...&quot;);
    System.out.println(&quot;accept?: &quot; + (input1.get() &amp;amp;&amp;amp; input2.get()));
  }
  
  public static void main(final String[] args) {

    System.out.println(&quot;//&quot; + &quot;START:EAGER_OUTPUT&quot;);
    eagerEvaluator(evaluate(1), evaluate(2));
    System.out.println(&quot;//&quot; + &quot;END:EAGER_OUTPUT&quot;);

    // ４秒かかっていた処理が２秒でfalseを返却するようになる
    System.out.println(&quot;//&quot; + &quot;START:LAZY_OUTPUT&quot;);
    lazyEvaluator(() -&amp;gt; evaluate(1), () -&amp;gt; evaluate(2));
    System.out.println(&quot;//&quot; + &quot;END:LAZY_OUTPUT&quot;);
  }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;デメリット&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ラムダ式をわざわざ書かないと行けないので面倒（場合によってはメソッド参照を利用できる）&lt;/li&gt;
&lt;li&gt;コード量は多くなる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: フレームワークで遅延処理を行うためにはどのようにするべきか&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6.3 Streamの遅延処理を活用&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Streamの遅延評価について説明&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;6.3.1 中間処理と終端処理&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Streamには２種類のメソッドがある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;中間処理&lt;/li&gt;
&lt;li&gt;終端処理&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Streamの遅さは複数の中間処理をチェーンし、最後に終端処理を行うことで実現している&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;  List&amp;lt;String&amp;gt; names = Arrays.asList(&quot;Brad&quot;, &quot;Kate&quot;, &quot;Kim&quot;, &quot;Jack&quot;, &quot;Joe&quot;,
    &quot;Mike&quot;, &quot;Susan&quot;, &quot;George&quot;, &quot;Robert&quot;, &quot;Julia&quot;, &quot;Parker&quot;, &quot;Benson&quot;);
  System.out.println(&quot;//&quot; + &quot;START:CHAIN_OUTPUT&quot;);
  {

  // ここの処理はコレクションの変換に多くの作業を費やしている働き者に見えますが、実は見かけによらず怠け者です。
  final String firstNameWith3Letters = 
    names.stream()
          .filter(name -&amp;gt; length(name) == 3)
          .map(name -&amp;gt; toUpper(name))
          .findFirst()
          .get();

  System.out.println(firstNameWith3Letters);
  }
  System.out.println(&quot;//&quot; + &quot;END:CHAIN_OUTPUT&quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;本当に必要な処理以外は実施していないらしい&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;その詳細を次で！述べる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;中間処理、終端処理まで考慮された上で、初めて処理が実行される&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;filter 12処理
&lt;ul&gt;
&lt;li&gt;map 2処理
&lt;ul&gt;
&lt;li&gt;findFirst 1処理&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ではなく！&lt;/li&gt;
&lt;li&gt;filter 3 処理！！
&lt;ul&gt;
&lt;li&gt;map 1処理
&lt;ul&gt;
&lt;li&gt;findFirst 1処理&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;という形で評価される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JDKが裏で結合（fusing）処理を行うことで実現している&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;データの通り道は１本ということ&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;要素の抽出、マッピング、選択が１度に行われる&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6.4 無限の「遅い」コレクションを生成&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;MEMO: スキップ&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6.5 まとめ&lt;/h3&gt;
&lt;h2&gt;7章　再帰の最適化&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;再帰は魅力的で強力な問題解決方法&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;再帰はとても表現力に富んでいます&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;大きな問題の再帰処理を可能とする末尾呼び出し最適化（tail-call optimization TCO）を説明&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;7.1 末尾呼び出し最適化を使う&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;再帰を使う上で最も高いハードルは、巨大な入力値によるスタックオーバーフローのリスク&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;しかし、末尾呼び出し最適化（TCO）という優れたテクニックがこの心配のタネを取り除く&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;末尾呼び出しとは&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最後の処理が自身の呼び出しとなるような再帰呼び出しのことを言います&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JavaはTCOをコンパイラレベルで直接サポートしていませんが、ラムダ式を使って数行で実装できる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;このソリューションはトランポリンとも呼ばれrます。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// 通常の実装
  public static int factorialRec(final int number) {
    if(number == 1)
      return number;
    else
      return number * factorialRec(number - 1); 
  }
  // 大きい数を渡すとStackOverflowErrorが発生
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;この再帰関数は大きな入力値を扱えず、落ちてしまう&lt;/li&gt;
&lt;li&gt;再帰が強力で表現力豊かであっても使えません。&lt;/li&gt;
&lt;li&gt;この問題は再帰そのものにあるわけではない&lt;/li&gt;
&lt;li&gt;再帰の完了を待つ間、部分的な計算結果をすべて保存しているためです。&lt;/li&gt;
&lt;li&gt;スタックに積み上げずに再帰を行う方法が必要&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.1.2 末尾再帰に変換する&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;遅延評価させるために
&lt;ul&gt;
&lt;li&gt;TailCall関数型インターフェース&lt;/li&gt;
&lt;li&gt;TailCallsクラスを設計する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;  public static TailCall&amp;lt;Integer&amp;gt; factorialTailRec(
    final int factorial, final int number) {
    if (number == 1)
      return done(factorial);
    else
      return call(() -&amp;gt; factorialTailRec(factorial * number, number - 1));
  }

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;MEMO: TCOについて理解できていない... 再帰処理設計が必要になったら読み返す&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;7.2 メモ化でスピードアップ&lt;/h3&gt;
&lt;h3&gt;7.3 まとめ&lt;/h3&gt;
&lt;h2&gt;8章　ラムダ式で合成&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Java8には、オブジェクト志向アプローチと関数型スタイルという２つの強力なツールがある&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;組み合わせて使っていこう！&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本章では、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;関数合成を詳しく説明し、実践的なMapReduceパターンを例として実装&lt;/li&gt;
&lt;li&gt;MapReduceパターンでは、独立した計算処理を分散し、それらの処理結果を集約して最終的な結果を計算します&lt;/li&gt;
&lt;li&gt;最後はJDKの力を借りて、この計算処理を簡単に並列化します。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;8.1 関数合成の利用&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;オブジェクト指向＋関数型スタイル複合アプローチでは、状態が変化するのではなく、軽量なオブジェクトが別のオブジェクトに変換される&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;可変性がないことで、エラー発生の可能性を減らし、並列実行家より簡単&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;リストからStreamを作成し、オリジナルのリストは変更されず、新しくオブジェクトを生成するということが言いたいだけ&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;8.2 MapReduceの使用&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;MapReduceパターンは２つの操作がある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コレクションの各要素で実行する操作&lt;/li&gt;
&lt;li&gt;これらの実行結果を組み合わせて最終結果を導き出す&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;このパターンでマルチコアプロセッサを有効活用可能であることから注目をされつつある&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Tickers.symbols.parallelStream()&lt;/code&gt;は裏側に隠れているスレッドプールで管理された複数のスレッドで、&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;map()やfilter()のようなメソッドを並列処理します。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;stream()とparallelStream()のどちらを使用するかを決める際には、いくつかの問題を考えなければいけません&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;本当にラムダ式を同時に実行したいのか？&lt;/li&gt;
&lt;li&gt;対象コードは副作用や競合状態が発生しない、独立した動作を行える？&lt;/li&gt;
&lt;li&gt;実行順序に影響を与えることはないか？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;map()やfilter()のように、計算を行って、その結果を次の処理に回すようなメソッドは並列化に向いている&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: 闇雲に並列化はしないほうがよい！！&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;並列ストリームを選択すべきか？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ライブラリは簡単に並列化を行ってくれるが、並列化が常に正しい選択であるとは限らない&lt;/li&gt;
&lt;li&gt;データと、実行する計算内容によっては、並列計算はシーケンシャルな計算より遅くなることもあり得る&lt;/li&gt;
&lt;li&gt;並列化実行処理のためのコストもかかる&lt;/li&gt;
&lt;li&gt;コレクションが小さいのであれば、シーケンシャル実行のほうが早くなるかも&lt;/li&gt;
&lt;li&gt;速度を計測して実装していくべき&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;8.3 並列化への飛躍&lt;/h3&gt;
&lt;h3&gt;8.4 まとめ&lt;/h3&gt;
&lt;h2&gt;9章　すべてをまとめて&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;本書を通してJava8のラムダ式を紹介しました&lt;/li&gt;
&lt;li&gt;コレクションのイテレーションを行い&lt;/li&gt;
&lt;li&gt;軽量でよりよい設計を実現し、コードを簡単に合成、そして並列化しました。&lt;/li&gt;
&lt;li&gt;この最終章ではまとめとして、関数型スタイルのプログラミングを使って、最大の効果を上げるために&lt;/li&gt;
&lt;li&gt;磨いておくべきことを説明し、関数型スタイルを採用して成功するための推奨事項を最後に取り上げる&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;9.1 関数型スタイルで成功するために実践すべきこと&lt;/h3&gt;
&lt;p&gt;新機能のメリットを十分に活かし、簡潔で軽量なアプリケーションを生成するには、設計、コーディング、そして考え方まで変えなければいけません。&lt;/p&gt;
&lt;p&gt;これまでのJavaを使ってきた命令形や、オブジェクト指向のパラダイムとは違うもの&lt;/p&gt;
&lt;p&gt;ここでは根本的に変えるべきアプリケーション開発手法や、その変更によって得られる利点について説明&lt;/p&gt;
&lt;h4&gt;9.1.1 宣言的により近く、命令型からより遠く&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;価格リストを与えられていて、その中から最大値を選ぶようにと依頼されたとしたときに、&lt;/li&gt;
&lt;li&gt;命令型のfor文で最大値を探すのではなく、ラムダ式を使ってstream経由で取得する&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.1.2 普遍性の尊重&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;状態変更が可能な(mutable)変数はあまり上品とは言えません。&lt;/li&gt;
&lt;li&gt;そしてそのような変数の共有は単なる害悪&lt;/li&gt;
&lt;li&gt;開発者は変数の状態変更によって混乱させられてしまい、時には変更を見逃してしまいます。&lt;/li&gt;
&lt;li&gt;したがって、変更可能な変数が多いほど、より多くのエラーが発生する可能性があるということ&lt;/li&gt;
&lt;li&gt;正確な並列化が非常に難しくなるということもデメリット&lt;/li&gt;
&lt;li&gt;関数型スタイルの導入がそれを簡単にしてくれる&lt;/li&gt;
&lt;li&gt;純粋な関数型言語は値しか持っていません。つまり１回しか書き込みができない、初期化後は全く変更を受け付けない変数です。&lt;/li&gt;
&lt;li&gt;しかしJavaはそのような言語とはことなり、不変性(immutability)を強制しないため、不変性を尊重する責任は開発者にある&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.1.3 副作用の削減&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;副作用を減らそう&lt;/li&gt;
&lt;li&gt;所感：時間や状態などの外部要員によって関数の処理結果が異なることが無いように作成すること&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.1.4 文より式を優先&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;文：アクションを実行するが何も返さない&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;式：アクションを実行して結果を返す&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;文は何も返さないため、目的を遂行するためには副作用を起こしメモリを書き換える必要がある&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;一方式は、参照透明性を保つように設計できるため、これまでに述べたメリットを得られる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;式を使うメリット&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;関数合成ができるということが挙げられる&lt;/li&gt;
&lt;li&gt;チェーンでコードを記述することで、文章を読むように簡単にコードを読めるようになる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;9.1.5 高階関数を利用して設計&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;これまでは匿名内部クラスを単一メソッドのインターフェースに渡していたような場所で、&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ラムダ式やメソッド参照を渡すことができる様になり、コードがより簡潔になります。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メーラーを関数で設計することでローンパターンを適用する例&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Colorフィルターを関数で表現する例&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;関数を引数に渡してDRYな設計をしよう&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;9.2 パフォーマンスの問題&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;命令型のコードと比較してもパフォーマンスは劣らない&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;メリット
&lt;ul&gt;
&lt;li&gt;直感的に見やすい&lt;/li&gt;
&lt;li&gt;並列化も容易&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;関数型を採用しましょう&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MEMO: 処理時間の違いはむやみに信頼できるものではないのでやめましょうと書かれている...&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;9.3 関数型スタイルを採用&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;実際に使ってみて、試して、より良い設計を考えていこう！&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;付録A 基本的な関数型インタフェース&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;JDK8には様々な関数型インターフェースを持っている&lt;/li&gt;
&lt;li&gt;ここでは頻繁に出現する基本的なインターフェースをいくつか紹介&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;A.1 Consumer&lt;code&gt;&amp;lt;T&amp;gt;&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;入力を受け入れ、戻り値を返さない操作を表すインターフェース&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;有効活用するためには副作用を伴う必要がある&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;抽象メソッド&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;accept()&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;defaultメソッド&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;andThen()&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;主な利用方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;forEach()メソッドの引数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;特注なプリミティブ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IntConsumer, LongConsumer, DoubleConsumerなど&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;package java8sample;

import java.util.function.Consumer;

public class Java8Sample {
    public static void main(String[] args) {
        Consumer&amp;lt;String&amp;gt; hoge = string -&amp;gt; System.out.println(&quot;hoge : &quot; + string);
        Consumer&amp;lt;String&amp;gt; fuga = string -&amp;gt; System.out.println(&quot;fuga : &quot; + string);

        Consumer&amp;lt;String&amp;gt; piyo = hoge.andThen(fuga);

        piyo.accept(&quot;piyo&quot;);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;A.2 Supplier&lt;code&gt;&amp;lt;T&amp;gt;&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;新しいインスタンス、またはあらかじめ生成しておいたインスタンスを返すファクトリ。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;抽象メソッド&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;get()&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;defaultメソッド&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;なし&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;主な利用方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;遅延実行を行う無限Streamの生成&lt;/li&gt;
&lt;li&gt;OptionalクラスのorElseGet()メソッドの引数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;特殊なプリミティブ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IntSupplier, LongSupplier, DoubleSupplierなど&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;package java8sample;

import java.util.function.Supplier;

public class Java8Sample {
    public static void main(String[] args) {
        Supplier&amp;lt;String&amp;gt; supplier = () -&amp;gt; &quot;hoge&quot;;
        System.out.println(supplier.get());
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;遅延初期化で少し出てきた程度&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;A.3 Predicate&lt;code&gt;&amp;lt;T&amp;gt;&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;入力値が何らかの条件に該当するかを確認するために有効。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;抽象メソッド&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;test()&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;defaultメソッド&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;and(), nagate(), or()&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;主な利用方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Streamのfilter()やanyMatch()メソッドなどの引数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;特殊なプリミティブ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IntPredicate, LongPredicate, DoublePredicateなど&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;anyMatchはリストのStreamのうちどれか１つでも一致する条件であればtrueを返却する動きになるみたい&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;→終端操作&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;filterは中間操作&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;A.4 Function&amp;lt;T, R&amp;gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;引数をとって適切な結果値を返す操作を表す変換インターフェース&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;抽象メソッド&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;apply()&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;defaultメソッド&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;andThen(), compose()&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;主な利用方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Streamのmap()メソッドの引数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;特殊なプリミティブ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IntFunction、LongFunction, DoubleFunction, IntToDoubleFunction, DoubleToIntFunction&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;package java8sample;

import java.util.function.Function;

public class Java8Sample {
    public static void main(String[] args) {
        Function&amp;lt;String, String&amp;gt; wrapDoubleQuotation = str -&amp;gt; &quot;\&quot;&quot; + str + &quot;\&quot;&quot;;
        Function&amp;lt;String, String&amp;gt; wrapSingleQuotation = str -&amp;gt; &quot;&apos;&quot; + str + &quot;&apos;&quot;;

        Function&amp;lt;String, String&amp;gt; wrapDoubleAndSingleQuotation = wrapDoubleQuotation.compose(wrapSingleQuotation);
        String result = wrapDoubleAndSingleQuotation.apply(&quot;hoge&quot;);

        System.out.println(result);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;付録B 構文の基礎&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;関数型インターフェスのクイック・リファレンス&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;B.1 関数型インタフェースの定義&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;関数型インターフェース
&lt;ul&gt;
&lt;li&gt;interface実装して、&lt;code&gt;@FunctionalInterface&lt;/code&gt;を付与する&lt;/li&gt;
&lt;li&gt;実装されていないabstractメソッドを必ず１つ持つ&lt;/li&gt;
&lt;li&gt;必要に応じて実装されたdefaultメソッドを持つ&lt;/li&gt;
&lt;li&gt;staticメソッドも持つことができる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;B.2 パラメータを持たないラムダ式の生成&lt;/h3&gt;
&lt;h3&gt;B.3 パラメータ 1つのラムダ式の生成&lt;/h3&gt;
&lt;p&gt;型推論は効くが、明示した場合は &lt;code&gt;(final String str) -&amp;gt; System.out.println(str);&lt;/code&gt;などとする&lt;/p&gt;
&lt;h3&gt;B.4 ラムダ式のパラメータ型を推論する&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;通常、型推論されるが、１つでも型を明示的に記載する必要がある場合、&lt;/li&gt;
&lt;li&gt;すべて引数の型を記載する必要がある&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;B.5 パラメータ 1つのラムダ式では括弧を省略可能&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;(name) -&amp;gt; ;&lt;/code&gt;とかいても &lt;code&gt;name -&amp;gt; ;&lt;/code&gt;とかいてもよい&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;B.6 複数パラメータを持つラムダ式の生成&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;複数のパラメータを持つ場合はカッコが必須 &lt;code&gt;frinends.stream().reduce((name1,name2) -&amp;gt; name1.length() &amp;gt;= name2.length() ? name1 : name2);&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;B.7 複数の型のパラメータを持つメソッドを呼び出す&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ラムダ式やメソッド参照を引数に渡せる&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;B.8 ラムダ式を変数に格納&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;再利用するためにラムダ式を変数に格納できる&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;B.9 複数行のラムダ式を生成&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ラムダ式は複数行に渡って記載できる&lt;/li&gt;
&lt;li&gt;必要に応じて、return文を記載しないといけない&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;B.10 ラムダ式を返す&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;メソッドの戻り値型として関数型インタフェースを指定できる&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;B.11 ラムダ式からラムダ式を返す&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ラムダ式を返すラムダ式をかける&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;B.12 クロージャにおける静的スコープ&lt;/h3&gt;
&lt;h3&gt;B.13 インスタンスメソッドのメソッド参照を渡す&lt;/h3&gt;
&lt;h3&gt;B.14 メソッド参照をstaticメソッドに渡す&lt;/h3&gt;
&lt;h3&gt;B.15 メソッド参照を他のインスタンスのメソッドに渡す&lt;/h3&gt;
&lt;h3&gt;B.16 複数の引数を取るメソッドの参照を渡す&lt;/h3&gt;
&lt;h3&gt;B.17 コンストラクタ参照を使う&lt;/h3&gt;
&lt;h3&gt;B.18 関数合成&lt;/h3&gt;
&lt;h2&gt;付録C Web上のリソース&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Cutting Stock問題&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Cutting_stock_problem&quot;&gt;https://en.wikipedia.org/wiki/Cutting_stock_problem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;メモ化テクニックを使って解決できる最適化問題&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;依存関係逆転の原則&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;クラスの実装で拡張するのではなく、抽象（インタフェース）とカップリングすることによる拡張方法を説明している&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DRY原則&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://ja.wikipedia.org/wiki/Don%27t_repeat_yourself&quot;&gt;https://ja.wikipedia.org/wiki/Don&apos;t_repeat_yourself&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本質と儀式について（Essence vs. Ceremony）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;→古いからやめようと思う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Execute Around Methodパターン&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ローンパターン(Loan Pattern)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Scalaにおけるローンパターンの紹介&lt;/li&gt;
&lt;li&gt;記事がなかった
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.scala-lang.org/&quot;&gt;https://docs.scala-lang.org/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;伝えろ。聞くな。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pragprog.com/articles/tell-dont-asks&quot;&gt;https://pragprog.com/articles/tell-dont-asks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;伝えろ、聞くなという原則を説明するコラム&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;書籍サイト&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pragprog.com/&quot;&gt;https://pragprog.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;付録D 参考文献&lt;/h2&gt;
&lt;h2&gt;訳者あとがき&lt;/h2&gt;
&lt;h2&gt;索引&lt;/h2&gt;
</content:encoded></item><item><title>１分で話せ</title><link>https://tutttuwi.github.io/posts/2020-03_%EF%BC%91%E5%88%86%E3%81%A7%E8%A9%B1%E3%81%9B/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2020-03_%EF%BC%91%E5%88%86%E3%81%A7%E8%A9%B1%E3%81%9B/</guid><pubDate>Sun, 01 Mar 2020 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;１分で話せ&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;立ち読みレベル&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;
プレゼンのゴールを設定する
相手に動いて欲しいのか？
相手に賛成、許可をして欲しいのか
意見が欲しいのか、教えて欲しいのか

ロジカルな１分ストーリーを考える
主張　結論がある
複数の根拠がある　意味が結論に通じている

根拠は３つ必要
あのお店美味しいから行こう！
じゃあ、美味しいお店は他にもあるよ、、
あのお店美味しくて、安くて、雰囲気いいから行こう！
そこまでいうなら行ってみようか！

より聞き手に伝わるように削った文章を話す
基本的に、は、例外を離さないならいらない
念頭に、は、~すべく
横文字は伝わりやすいか考える
先ほど述べたように、も、いらない

頑張ったことは話すな
結論だけ話すこと！

聞き手の数や会議室の広さを考えて
パワポの文字サイズを考える
1番後ろの席の人が見えるように

聞き手が行動するもう一歩をイメージさせる
ポイントについての深掘りをするために
たとえば、具体的に、などで繋げて話す

人は80%のことを聞いていない
キチリクルンの例
私という人間はどういう人間かを伝えることが大事
覚えてもらうことが大事
会社の上司に説明してもらうことが大事
そのためには短い言葉で印象に残らせる必要がある

人前で話すときの4つのポイント
視線　しっかり相手を見る
手振り　多少、動きをつける
声　相手と対話するように声を届ける
間合い　話の区切りで普段より3秒ほど長く間をとってみる

メタ認知は優秀なビジネスパーソンに共通するスキル

■人から話しかけられた時
◯状況判断
・目的は何なのか（連絡されるのか、相談されるのか、何かしてほしいのか）
・相手の目的を満たす回答をする
・この話はどれくらいかかるのかを考える（場合によっては後に回してもらう）

■人に話しかける時
◯目的別
・報告、連絡
・相談、解決策やアドバイスが欲しい
・依頼、何かをして欲しい
・説得、自分はこう思う、理由はこうです
・雑談
◯ジェスチャー、振る舞い
・視線 しっかり相手の目を見る
・手振り 多少動きをつける
・声 相手に声を確実に届ける、聞こえているか、理解しているかを確認しないままだらだら話さない
・間合い 話の区切りで3秒ほど長く間をとる
◯構成
・結論ファースト
・要点をまとめておく
◯振り返り
・メタ認知
・反省

&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>AngularWebアプリ開発スタートブック</title><link>https://tutttuwi.github.io/posts/2020-02_angular%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2020-02_angular%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0/</guid><pubDate>Sat, 15 Feb 2020 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Angularアプリケーションプログラミング&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;電子書籍購入&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;説明書&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;/pdf/Angular%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0.pdf&quot;&gt;学習ログ&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;こちらの書籍は 2019/06/19 紙版の3刷に対応するため更新をおこないました。
（概要）
本書は，JavaScriptの定番SPA開発フレームワーク「Angular」の解説書です。データバインディング，コンポーネント，依存性注入といったAngularを理解するための基本要素をはじめ，ディレクティブ／パイプ，フォーム，ルーティング，モジュール／コンポーネントの技術解説，ディレクティブ／パイプ／サービスの自作やテストなどの応用的なテーマまでを網羅。また，Angular 4に対応し，5以降のアップグレードにも留意した解説を行っています。Angularによる動的Webアプリケーション開発に必要となる知識が，この1冊で身に付きます！

（こんな方におすすめ）
・Angularを利用したSPAアプリケーション開発に興味のある人

（目次）
導入編
第1章イントロダクション

第2章Angular の基本

第3章データバインディング

基本編
第4章標準パイプ／ディレクティブ

第5章フォーム開発

第6章コンポーネント開発

第7章サービス開発

応用編
第8章ルーティング

第9章パイプ／ディレクティブの自作

第10章テスト

第11章関連ライブラリ／ツール

AppendixTypeScript簡易リファレンス

フォーマット： Kindle版
ファイルサイズ： 56752 KB
推定ページ数： 838 ページ
出版社: 技術評論社 (2017/8/4)
販売： Amazon Services International, Inc.
言語: 日本語
ASIN: B074M54GM5
Text-to-Speech（テキスト読み上げ機能）: 有効 
X-Ray:
有効
Word Wise: 有効にされていません
カスタマーレビュー: 5つ星のうち 4.7   14件のカスタマーレビュー
Amazon 売れ筋ランキング: Kindleストア 有料タイトル - 21,411位 (Kindleストア 有料タイトルの売れ筋ランキングを見る)
1165位 ─ 工学 (Kindleストア)

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;書籍情報ページ&lt;a href=&quot;https://wings.msn.to/index.php/-/A-03/978-4-7741-9130-0/&quot;&gt;https://wings.msn.to/index.php/-/A-03/978-4-7741-9130-0/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>AngularWebアプリ開発スタートブック</title><link>https://tutttuwi.github.io/posts/2019-12_angularweb%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2019-12_angularweb%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF/</guid><pubDate>Sun, 29 Dec 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;AngularWebアプリ開発スタートブック&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;電子書籍購入&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;/pdf/AngularWeb%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF.pdf&quot;&gt;学習ログ&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;書籍情報&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;著者&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;大澤 文孝&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;出版社&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ソーテック社; B5変形版 (2018/4/7)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;定価&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;3,025円&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;発売日&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2018/4/7&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ISBN-13&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;978-4-8026-1185-5&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ISBN-10&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;4800711975&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;目次&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chapter1 Angularって何?&lt;/li&gt;
&lt;li&gt;Chapter2 開発環境を整えよう&lt;/li&gt;
&lt;li&gt;Chapter3 Angularプロジェクトを作ろう&lt;/li&gt;
&lt;li&gt;Chapter4 Angularの基本&lt;/li&gt;
&lt;li&gt;Chapter5 入力フォームを作ってみよう&lt;/li&gt;
&lt;li&gt;Chapter6 入力エラーを検知するバリデータ&lt;/li&gt;
&lt;li&gt;Chapter7 リアクティブフォーム入門&lt;/li&gt;
&lt;li&gt;Chapter8 さまざまな入力コントロール&lt;/li&gt;
&lt;li&gt;Chapter9 ページの割り当てと遷移&lt;/li&gt;
&lt;li&gt;Chapter10 検索機能を実装する&lt;/li&gt;
&lt;li&gt;Chapter11 Webサーバで動かす&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;サンプルプログラム&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.sotechsha.co.jp/sp/1197/&quot;&gt;http://www.sotechsha.co.jp/sp/1197/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;こんな方に&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;○「将来、Webアプリ開発に取り組みたい」&lt;/li&gt;
&lt;li&gt;○「Angular特有の機能について学びたい」&lt;/li&gt;
&lt;li&gt;○「TypeScriptの作法について学びたい」&lt;/li&gt;
&lt;li&gt;○「新しいフレームワークの作法をざっと知りたい」&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;はじめに&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;次の２点を重点的に解説
&lt;ul&gt;
&lt;li&gt;Angularの動作の仕組み&lt;/li&gt;
&lt;li&gt;何をどのような書式で記述しなければならないのか&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>コンサル一年目が学ぶこと</title><link>https://tutttuwi.github.io/posts/2019_11_%E3%82%B3%E3%83%B3%E3%82%B5%E3%83%AB%E4%B8%80%E5%B9%B4%E7%9B%AE%E3%81%8C%E5%AD%A6%E3%81%B6%E3%81%93%E3%81%A8/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2019_11_%E3%82%B3%E3%83%B3%E3%82%B5%E3%83%AB%E4%B8%80%E5%B9%B4%E7%9B%AE%E3%81%8C%E5%AD%A6%E3%81%B6%E3%81%93%E3%81%A8/</guid><pubDate>Sun, 03 Nov 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;コンサル一年目が学ぶこと&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2019_11_consone.jpg&quot; alt=&quot;2019_11_consone&quot; title=&quot;2019_11_consone&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/pdf/%E3%82%B3%E3%83%B3%E3%82%B5%E3%83%AB%E4%B8%80%E5%B9%B4%E7%9B%AE%E3%81%8C%E5%AD%A6%E3%81%B6%E3%81%93%E3%81%A8.pdf&quot;&gt;学習ログ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;結論ファースト、PREP法で話す、言い訳から取り繕った話し方をしない（Talk Straight）&lt;/li&gt;
&lt;li&gt;出来ないときは出来る方法を提案することが大事（何があればできるのか、何人いればできるのか、いつまでならできるのか）&lt;/li&gt;
&lt;li&gt;相手の期待値を把握することの重要性&lt;/li&gt;
&lt;li&gt;数値を用いて説明する&lt;/li&gt;
&lt;li&gt;考えてから仕事を進める（道筋決めてから）&lt;/li&gt;
&lt;li&gt;ロジックツリーを使いこなす（ケース問題の紐解き方法と同じだと感じた）&lt;/li&gt;
&lt;li&gt;「雲雨傘」提案法 事実、解釈、アクションの区別をつける&lt;/li&gt;
&lt;li&gt;議事録のエッセンス（日時・場所・参加者・アジェンダ・決まったこと・決まらなかったこと・確認が必要な事・次回TODO・キーパーソンの意見）&lt;/li&gt;
&lt;li&gt;説明資料はワンスライド・ワンメッセージの構成にすること&lt;/li&gt;
&lt;li&gt;余計なことをやらない・価値のあることだけする&lt;/li&gt;
&lt;li&gt;しゃべらないなら会議に出るな&lt;/li&gt;
&lt;li&gt;コミットメント力の高い人の傍にいること&lt;/li&gt;
&lt;li&gt;フォロワーシップは部下としてのリーダーシップ&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;コンサルタントとしての考え方の基礎的な要素が知りたかった&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Azure実践ガイド</title><link>https://tutttuwi.github.io/posts/2019_03_azure%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2019_03_azure%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89/</guid><pubDate>Fri, 01 Mar 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Azure実践ガイド&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2019_03_azure.jpg&quot; alt=&quot;2019_03_azure&quot; title=&quot;2019_03_azure&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;※読書中..&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;/pdf/Microsoft-Azure%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89.pdf&quot;&gt;学習メモ&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;業務でAzure環境を使用することになり、基礎知識を養うために購入&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Github実践入門</title><link>https://tutttuwi.github.io/posts/2019_03_github%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2019_03_github%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80/</guid><pubDate>Fri, 01 Mar 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Github実践入門&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2019_03_github.jpg&quot; alt=&quot;2019_03_github&quot; title=&quot;2019_03_github&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;そもそも「Githubとは」という部分&lt;/li&gt;
&lt;li&gt;Githubの基本的な使い方を手を動かしながら確認できた&lt;/li&gt;
&lt;li&gt;途中、UIがそもそも変わっており、情報として古さを感じたため、さっと確認で済ませている&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;業務でGitの構成管理方針を決定する立場となったため、今一度基礎から情報を取得する必要があると考えたため&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Googleアシスタントアプリ開発入門</title><link>https://tutttuwi.github.io/posts/2019_01_google%E3%82%A2%E3%82%B7%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%88%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2019_01_google%E3%82%A2%E3%82%B7%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%88%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80/</guid><pubDate>Tue, 01 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Googleアシスタントアプリ開発入門&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2019_01_google_assistant_handson.jpg&quot; alt=&quot;2019_01_google_assistant_handson&quot; title=&quot;2019_01_google_assistant_handson&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;目次
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;●chapter1 GoogleアシスタントとAction&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1.1 AIアシスタント ～対話型のインタフェースで問題を解決～&lt;/li&gt;
&lt;li&gt;1.2 Googleアシスタントとは？&lt;/li&gt;
&lt;li&gt;1.3 Googleアシスタントから呼ばれる機能「Action」を使いこなそう&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;●chapter2 Googleアシスタントのアプリ「Action」の作り方&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2.1 アプリ開発エコシステム「Actions on Google」で快適開発&lt;/li&gt;
&lt;li&gt;2.2 簡単な会話アプリを作ってみる&lt;/li&gt;
&lt;li&gt;2.3 やまびこアプリを作ろう（会話アプリのはじめの一歩）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;●chapter3 しっかり作るGoogleアシスタントアプリ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;3.1 標準的なアプリ実行環境を知ろう&lt;/li&gt;
&lt;li&gt;3.2 基本的な処理フローをおさえよう&lt;/li&gt;
&lt;li&gt;3.3 アプリのテーマと会話内容を決めよう&lt;/li&gt;
&lt;li&gt;3.4 スピーカー向けアプリを作ろう1（静的会話をDialogflowで実装してみる）&lt;/li&gt;
&lt;li&gt;3.5 スピーカー向けアプリを作ろう2（「じゃんけんアプリ」に動的会話を実装）&lt;/li&gt;
&lt;li&gt;3.6 シミュレータや実機でしっかりテストしよう&lt;/li&gt;
&lt;li&gt;3.7 アプリの会話音声をチューニングしよう（SSMLを使う）&lt;/li&gt;
&lt;li&gt;3.8 UIを視覚的にリッチにしよう（Rich Responses）&lt;/li&gt;
&lt;li&gt;3.9 最終的なプログラムコードを確認しよう&lt;/li&gt;
&lt;li&gt;3.10 column：アプリのアルファリリース、ベータリリース&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;●chapter4 いろいろな機能を活用してアプリを作ってみよう&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;4.1 ToDoリストアプリを作ろう（データベースを利用する）&lt;/li&gt;
&lt;li&gt;4.2 位置情報を音声で返すアプリを作ろう（位置情報を利用する）&lt;/li&gt;
&lt;li&gt;4.3 天気予報アプリを作ろう（位置情報を利用して周囲の天気予報を応える）&lt;/li&gt;
&lt;li&gt;4.4 アラームアプリを作ろう（Push APIを使う）&lt;/li&gt;
&lt;li&gt;4.5 column：Actions on Googleのさまざまな機能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;●chapter5 アプリが世の中に出るまで／出たあと&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;5.1 作ったアプリを配信しよう（Google社の審査）&lt;/li&gt;
&lt;li&gt;5.2 Googleアシスタントにアプリをおすすめしてもらおう&lt;/li&gt;
&lt;li&gt;5.3 船出のあと……&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Googleアシスタントアプリ開発に必要な用語&lt;/li&gt;
&lt;li&gt;※業務で必要な箇所のみ拾い読み&lt;/li&gt;
&lt;li&gt;あとで再読したい&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Googleアシスタントアプリの運用/保守に携わっていく上で必要なスキルを習得するため&lt;/li&gt;
&lt;li&gt;スピーカー開発関連の知識を増やすため&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Javascript本格入門</title><link>https://tutttuwi.github.io/posts/2019_01_javascript%E6%9C%AC%E6%A0%BC%E5%85%A5%E9%96%80/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2019_01_javascript%E6%9C%AC%E6%A0%BC%E5%85%A5%E9%96%80/</guid><pubDate>Tue, 01 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Javascript本格入門&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2019_01_js_getting_started.jpg&quot; alt=&quot;2019_01_js_getting_started&quot; title=&quot;2019_01_js_getting_started&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Javascript開発の体系的な知識&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;細かく理解できていなかった構文に関する知識&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;/pdf/javascript%E6%9C%AC%E6%A0%BC%E5%85%A5%E9%96%80.pdf&quot;&gt;学習メモ&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Nodejs環境でがっちりJavascriptを開発していくにあたり、現在の知識確認とより効率的な開発方法の知識を得るため&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>徹底攻略AWS認定ソリューションアーキテクト-アソシエイト教科書</title><link>https://tutttuwi.github.io/posts/2019_01_%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5aws%E8%AA%8D%E5%AE%9A%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88%E6%95%99%E7%A7%91%E6%9B%B8/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2019_01_%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5aws%E8%AA%8D%E5%AE%9A%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88%E6%95%99%E7%A7%91%E6%9B%B8/</guid><pubDate>Tue, 01 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;徹底攻略AWS認定ソリューションアーキテクト-アソシエイト教科書&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2019_01_aws_saa_black.JPG&quot; alt=&quot;2019_01_aws_saa_black&quot; title=&quot;2019_01_aws_saa_black&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;AWS サービスについて、Well-architectedフレームワークに沿った５つの観点から説明されておりとても参考になった。（学習メモ参照）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;/pdf/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5AWS%E8%AA%8D%E5%AE%9A%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88%E6%95%99%E7%A7%91%E6%9B%B8_marked.pdf&quot;&gt;学習メモ&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;AWSサービスについて、どんなサービスがあって、どんな使われ方をして、どのように便利なのかなど、基本的な知識を習得するため&lt;/li&gt;
&lt;li&gt;AWS SAA資格取得のため&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>AmazonAlexa開発ガイド</title><link>https://tutttuwi.github.io/posts/2019_01_amazonalexa%E9%96%8B%E7%99%BA%E3%82%AC%E3%82%A4%E3%83%89/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2019_01_amazonalexa%E9%96%8B%E7%99%BA%E3%82%AC%E3%82%A4%E3%83%89/</guid><pubDate>Tue, 01 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;AmazonAlexa開発ガイド&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2019_01_alexa_handson.JPG&quot; alt=&quot;2019_01_alexa_handson&quot; title=&quot;2019_01_alexa_handson&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;目次
&lt;ul&gt;
&lt;li&gt;Chapter 1 Amazon AlexaとAmazon Echo&lt;/li&gt;
&lt;li&gt;Chapter 2 Amazon AlexaとAWSの準備&lt;/li&gt;
&lt;li&gt;Chapter 3 スキル開発入門&lt;/li&gt;
&lt;li&gt;Chapter 4 スキルのデバッグから公開&lt;/li&gt;
&lt;li&gt;Chapter 5 Webサービス連携アプリの開発&lt;/li&gt;
&lt;li&gt;Chapter 6 スマートホームスキルの開発&lt;/li&gt;
&lt;li&gt;Chapter 7 AVSを利用したアプリケーションの構築方法&lt;/li&gt;
&lt;li&gt;Appendix SSML/CLI&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;AmazonAlexaSkillKitを利用したスキル開発方法&lt;/li&gt;
&lt;li&gt;AWS Lambda にサンプルをデプロイし実際に動作させる方法&lt;/li&gt;
&lt;li&gt;AlexaSkillKitについての基礎知識
&lt;ul&gt;
&lt;li&gt;インテント・スロットなど&lt;/li&gt;
&lt;li&gt;SSML&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;※本書では、後半、AVSについても述べられているが、直近で必要な知識ではなかったため割愛&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Alexaスキル開発の基礎知識を習得するため&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;学習メモ&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;
# はじめに

□付属データ（amazon_alexa_sample.zip）の内容
付属データには、以下の内容が含まれています。

Chapter2～7、Appendixで紹介しているサンプルデータ
Chapter7の04節のコマンド入力用テキスト（一部修正用テキスト含む）
Chapter5の02節（P.137）：補足資料1「Twitter developer accountへのアプリ登録」（PDFファイル）
Chapter7の04節（P.210）：補足資料2「Raspberry Pi 3の初回起動時のセットアップ」（PDFファイル）
Chapter7の04節（P.248）：補足資料3「Lチカを行うための配線」（PDFファイル）
□付属データのテスト環境
OS：macOS 10.13.5
Node.js：8.11.1
npm：5.6.0
Alexa開発者コンソール
URL https://developer.amazon.com/alexa/console/
AWS
URL https://aws.amazon.com/jp/
ASK SDK for Node.js：2.0.5
Amazon Echoデバイス
Amazon Echo dot
URL https://www.amazon.co.jp/dp/B072B5BTLK
Homebrew: 1.6.7
AVS Device SDK：1.8.1
□Chapter7 04節で利用した機材
サンワサプライUSBマイクロホンMM-MCU02BK
URL https://direct.sanwa.co.jp/のサイトで「MM-MCU02BK」で検索
Raspberry Pi 3（Model B）
Raspberry Pi 3 Model Bケース+ヒートシンク
https://www.physical-computing.jpのサイトで「Raspberry Pi 3」で検索
ブレッドボード　マイコンボード用実験パーツセット　KP-PRTSET01
URL http://eleshop.jp/shop/g/g402534/
※補足1：上記の「ブレッドボード　マイコンボード用実験パーツセット」には、ジャンプワイヤ（オス・オス）しかありませんので、別途ジャンプワイヤ（オス・メス）をご購入ください。
ジャンプワイヤ（オス・メス）の購入先例
例：ELEGOO 50 PCS オスメスジャンパーワイヤ200mm (無料 170 タイポイント ブレッドボード)
URL https://www.amazon.co.jp/dp/B06ZZXH4XT/
□Chapter7 04節に関するコマンドやリンク先（著者提供サイト）
紙面コマンド &amp;amp; リンクまとめ
URL https://gist.github.com/ShinjiKobayashi/1383691df9d43edd60267e44f6e2e923

# Chapter 1 Amazon AlexaとAmazon Echo

##### Echo Show
2018/08時点では発売されていないがecho show という製品があったりする（画面がついている）

スマートフォンやブラウザ上で実行できるAlexaアプリへカードを表示する機能はあるが、別のデバイスに取り出す必要があり、シームレスな体験でない

##### Echo Look
360度の3Dスキャンが可能な衣装のコーディネートの良し悪しを判断してくれる機能をもつ製品

##### 車載Alexa
BMWやToyotaがプレスリリース

手がふさがっていてもVUIであれば操作可能

##### Alexa Mobile Accessory Kit
スマートフォンのAlexaアプリを介してAlexaの機能を利用できるようにするアプリ

##### Amazon Lex
AWSサービス

Alexaに採用されている深層学習の技術と同等の技術を利用できるサービス

### Alexaスキルキット（ASK）
開発者がAlexaを通じて公開できるアプリケーションのような機能

### Alexaの特色

- スキルの種類
    * カスタムスキル
        + 料理レシピやしりとりゲームな一般的なAlexaスキル
        + Alexaを通じて商品の購入ができるようになったりする
    * スマートホームスキル
        + カメラや証明、鍵等のスマートホームデバイスを制御するスキル
    * フラッシュブリーフィングスキル
        + ※言及なし

## 02カスタムスキルの開発事例
### Alexaスキルの動きを確認する
##### インテント
音声入力の内容を解釈して、キーワードに合わせたタグ付けのようなことを行い、対話モデルを作成

##### スロット
対話モデルをより柔軟に活用することができる（プログラミングにおける変数に近い役割）

「*東京タワー*の天気を教えて」という発話があった場合、*東京タワー*がPlaceスロットに格納されて、インテントと同じくタグ付けされる

この要素を参照すれば、ユーザがどこの天気を知りたいのか把握できる

##### マルチターン会話とダイアログ

まるで本当に会話している様に実装できる

### Alexaスキルの開発事例

##### 人気のあるスキルについて
スキル順位を記載している

##### ユーザーストーリーの作成

##### スキルの目的を決める
##### 明確なユーザ操作をイメージする


## チャプターまとめ
- Alexaを取り巻く世界観やスキルを用いて実現できること
- Alexaの機能や大まかな挙動
- スキル開発をするときに気をつけておくとよいこと

# Chapter 2 Amazon AlexaとAWSの準備

## 01Alexaの開発環境の準備
※割愛
### 全体の構成
### Amazon開発者コンソールの登録方法
### AWSの登録方法

## 02Amazon Echo を使って Hello World

### カスタムスキルの開発工程
- Amazon開発者コンソールの設定
- Lambdaの実装及び設定
- 動作確認

### Amazon 開発者コンソールの設定およびLambdaの実装
1. スキルの基本情報設定
2. Alexaデバイスの応答設定
3. Lambdaの設定及び実装
4. LambdaとAlexaデバイスの応答設定と紐付け

～実際に操作してハローワールドを表示～

# Chapter 3 スキル開発入門

## 01カスタムスキルの開発方法

### カスタムスキルの開発環境構築
### カスタムスキル開発の基本
- Amazon開発者コンソールの設定
- Lambdaの実装

### Amazon開発者コンソールの設定方法

命令文をインテントと呼ばれるものに変換して該当のスキルにわたす

アニマルブックスという架空のスキルを作成する例

### Lambdaの実装方法

npm install --loglevel=error ask-sdk-core ask-sdk-model

##### 実装について見ていく

### 対話型のカスタムスキル開発

repromptを使用して「本のおすすめでよろしいですか？」と聞き返す実装

### 会話内容の一部を扱うスキル開発

##### スロットの実装

## 02Alexaアプリにカードを表示させる
### カードの表示
Alexaではスキルでの発話と同時に発話内容の保管情報としてカードをAlexaアプリに表示することができます。

- カードの種類
    * シンプルカード
    * スタンダードカード

## 03AudioPlayerでスキルを開発する
### AudioPlayerとは
- MP3などのオーディオファイルをストリーミング再生するAlexaの仕組み
- 一時停止やシャッフル再生、ループ再生、キューイングなどもサポートしている
- 再生状態をモニタリングするための仕組みもある
- SSMLを用いることでオーディオファイルの再生をすることも可能だが、90秒の制限がある

### AudioPlayerを使ったスキルを作成する

# Chapter 4 スキルのデバッグから公開

## 01Alexaスキルのデバッグ方法
### Alexaスキルのデバッグ方法
- Alexa Skill Testing Toolについての説明

### Lambdaのデバッグ方法
- Cloud Watchで設定する
- 

## Alexaスキルの公開方法

## 多言語対応

# Chapter 5 Webサービス連携アプリの開発

## 01フラッシュブリーフィングの作り方
### フラッシュブリーフィングスキルとは
- 最新のニュースフィードを提供する機能
- インストールされているフラッシュブリーフィングスキルから提供される最新のニュースフィードをすべて収集し、ユーザに対して収集したニュースを提供する
- 作成手順について
    * フィード提供環境構築
    * フィードの登録

### フィード提供環境構築

amzon api gatewayの設定で躓いた！！

問いかけても「フラッシュニュースです」という内容しか返さない


## 02外部サービス連携アプリの作り方(Twitter連携)
※一旦とばす！

# Chapter 6 スマートホームスキルの開発
※一旦とばす！

# Chapter 7 AVSを利用したアプリケーションの構築方法
※一旦とばす！
端末メーカー様のコネクテット製品に、 簡単にAlexaを実装するためのSDK

# Appendix SSML/CLI


&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>AWS認定ソリューションアーキテクトアソシエイト</title><link>https://tutttuwi.github.io/posts/2018_12_aws%E8%AA%8D%E5%AE%9A%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2018_12_aws%E8%AA%8D%E5%AE%9A%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88/</guid><pubDate>Fri, 28 Dec 2018 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;書籍「AWS認定ソリューションアーキテクトアソシエイト」&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;著者　：大塚 康徳（日立インフォメーションアカデミー）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;単行本（ソフトカバー）: 168ページ&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;出版社: リックテレコム (2016/8/17)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;言語: 日本語&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ISBN-10: 486594043X&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ISBN-13: 978-4865940435&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;発売日： 2016/8/17&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2018_12_aws_saa_blue.jpg&quot; alt=&quot;2018_12_aws_saa_blue&quot; title=&quot;2018_12_aws_saa_blue&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h1&gt;第1章 AWSと認定プログラム ーAWSクラウドとは何か、そして認定プログラムとは何か？ー&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;割愛
&lt;ul&gt;
&lt;li&gt;試験概要、AWSとはについて説明しているだけ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;第2章 リージョン／アベイラビリティーゾーンとAWSサービス ーリージョンとAZ、そして各種サービスの提供レベルについてー&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;試験のポイント！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;サーバやデータはAZ間で冗長的に配置する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;サービス種別&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;リージョンサービス&lt;/li&gt;
&lt;li&gt;AZサービス&lt;/li&gt;
&lt;li&gt;グローバルサービス&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;※サービスの中のコンテンツ毎に種別が違ったりして掘り下げるとややこしい
参考）https://stay-ko.be/aws/solutionarchitect-pro-aws-global-vs-resion-vs-az-resources&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;章末問題
&lt;ul&gt;
&lt;li&gt;ELBはAZサービスでありリージョンをまたいで負荷分散できない！&lt;/li&gt;
&lt;li&gt;複数のAZにEC2を配置して、ELBで負荷分散するのが鉄則&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;第3章 責任分担セキュリティモデルとAWSにおける認証（IAM）&lt;/h1&gt;
&lt;h1&gt;責任分担セキュリティモデル&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;責任分担セキュリティモデル&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;利用者とAWSが協力してセキュリティを高める考え方&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;サービス種別&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;インフラストラクチャサービス
&lt;ul&gt;
&lt;li&gt;ハードウェア部分までAWSが管理&lt;/li&gt;
&lt;li&gt;EC2など&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;コンテナサービス
&lt;ul&gt;
&lt;li&gt;ハードウェア部分からミドルウェア部分までAWSが管理&lt;/li&gt;
&lt;li&gt;RDSなど&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;アブストラクトサービス
&lt;ul&gt;
&lt;li&gt;ハードウェア部分からソフトウェア部分までAWSが管理&lt;/li&gt;
&lt;li&gt;S3やDynamoDB&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;試験のポイント！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;インフラストラクチャサービス、コンテナサービス、アブストラクトサービスの各サービスについて、利用者の責任範囲を明確にする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;AWSにおける認証とアクセス制御&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;試験のポイント！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;日常の操作にはルートアカウントを使用せずに、IAMユーザを使用する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;試験のポイント！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;各IAMグループ、IAMユーザには、最小権限のアクセス権を与える。&lt;/li&gt;
&lt;li&gt;IAMポリシーは最も厳しいポリシー（拒否）が優先される。
&lt;ul&gt;
&lt;li&gt;アクセス許可と拒否が相反する場合、拒否が優先&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;試験のポイント！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EC2インスタンス上で実行されるプログラムの認証にはIAMロールを割り当てる
&lt;ul&gt;
&lt;li&gt;IAMロールを使用することでアクセスキーとシークレットアクセスキーがなくてもAWSサービスにアクセスできる&lt;/li&gt;
&lt;li&gt;キーを使わないアクセスで、キーの流出を防ぐことが狙い&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;IDフェデレーション&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;事例
&lt;ul&gt;
&lt;li&gt;要求
&lt;ul&gt;
&lt;li&gt;自社の従業員に各自の業務レポートを毎月月末にS3にアップロードさせるたい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;問題
&lt;ul&gt;
&lt;li&gt;S3バケットへのアクセス権を付与したいが、毎月１回だけのために全従業員分のIAMユーザを作成するのは非効率すぎて現実的ではない。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;解決策
&lt;ul&gt;
&lt;li&gt;AWS Security Token Service（STS）という一時的に認証情報を付与するサービスとIDブローカー（IDプロバイダー）を利用して、自社の認証基盤で認証が通ればS3バケットへのアップロードを一時的に許可することができる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;→これを「IDフェデレーション」という！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;他にも以下がある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Security Assertion Markup Language(SAML)を使用したシングルサインオン&lt;/li&gt;
&lt;li&gt;GoogleやFacebookといったウェブIDプロバイダーを使用したシングルサインオン&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;試験のポイント！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWSの使用頻度が低いユーザは、IDフェデレーションで社内の認証基盤とIAMを連携する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;章末問題&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;利用者の責任で実施しなければならないセキュリティ対策は？
&lt;ul&gt;
&lt;li&gt;S3上のデータの暗号化&lt;/li&gt;
&lt;li&gt;EC2インスタンス上のOSのセキュリティパッチの適用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AWSアカウント/認証情報の推奨される運用は？
&lt;ul&gt;
&lt;li&gt;S3バケットへのアップロードをEC2インスタンスで実行する場合は、S3バケットへのファイルアップロードが許可されたIAMロールをEC2インスタンスに割り当てる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;第4章 AWSにおけるネットワーク（VPC）&lt;/h1&gt;
&lt;h2&gt;VPCの機能と設定&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;VPC（Amazon Virtual Private Cloud）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;利用者毎にプライベートなネットワーク空間を提供するサービス&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;１．VPCの作成&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;２．サブネットの作成&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;重要！
&lt;ul&gt;
&lt;li&gt;サブネットはAZをまたがることはできない。サブネットを選択することはAZを選択することと同じ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;３．ゲートウェイの作成&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;インターネットゲートウェイ（IGW）をVPCにアタッチ&lt;/li&gt;
&lt;li&gt;オンプレと通信するためのゲートウェイはバーチャルプライベートゲートウェイ（VGW）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;４．ルートテーブルの設定&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;重要！
&lt;ul&gt;
&lt;li&gt;インターネットとのアクセスを許可するサブネット：パブリックサブネット&lt;/li&gt;
&lt;li&gt;インターネットとのアクセスを許可しないサブネット：プライベートサブネット&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;パブリックかプライベートはサブネットに適用されているルートテーブルによってきまる
&lt;ul&gt;
&lt;li&gt;パブリック：デフォルトゲートウェイ（送信先：0.0.0.0/0）のターゲットとしてIGWが設定&lt;/li&gt;
&lt;li&gt;プライベート：上記でない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;VPCの内の通信はルートテーブルでは制御できないので、VPC内のサブネットであれば、通信が可能になっている
&lt;ul&gt;
&lt;li&gt;Webサーバ、DBサーバ、その他のサーバ、でサブネットを分けていても、相互通信可能な状態になっている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;５．NATインスタンスの作成&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;プライベートサブネット内のパッチ当て等&lt;/li&gt;
&lt;li&gt;NATインスタンスの実態はEC2インスタンス（※注意※最新ではNATゲートウェイというAWSサービスが存在する！）
&lt;ul&gt;
&lt;li&gt;送信元/送信先チェック：宛先が自身のIPアドレスでなければトラフィックを破棄する設定。EC2インスタンスはデフォルトでON&lt;/li&gt;
&lt;li&gt;NATインスタンスはこの機能を無効化している&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;試験のポイント！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;プライベートサブネット内のインスタンスがインターネットにアクセスするための設定を押さえる！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;EC2インスタンスのIPアドレス&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;IPアドレスの種類&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Public IP&lt;/li&gt;
&lt;li&gt;Elastic IP&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;EC2インスタンスのプライベートIPアドレスとグローバルIPアドレスの紐付けは、VPCの仮想ネットワークで行われているので、EC2インスタンスのOSにログインし、ipconfigコマンドやifconfigコマンドを実行しても、プライベートIPしか確認できない&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;セキュリティグループとネットワークACL&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ファイアウォール機能
&lt;ul&gt;
&lt;li&gt;セキュリティグループ&lt;/li&gt;
&lt;li&gt;ネットワークACL&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;セキュリティグループ&lt;/th&gt;
&lt;th&gt;ネットワークACL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;適用単位&lt;/td&gt;
&lt;td&gt;EC2やRDS、ELBなどインスタンス毎&lt;/td&gt;
&lt;td&gt;サブネット単位&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;作成可能なルール&lt;/td&gt;
&lt;td&gt;許可のみ&lt;/td&gt;
&lt;td&gt;許可/拒否&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;デフォルトルール&lt;/td&gt;
&lt;td&gt;インバウンド：すべて拒否/アウトバウンド：すべて許可（ホワイトリスト方式）&lt;/td&gt;
&lt;td&gt;インバウンド：すべて許可/アウトバウンド：すべて許可（ブラックリスト方式）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;特徴&lt;/td&gt;
&lt;td&gt;ステートフル&lt;/td&gt;
&lt;td&gt;ステートレス&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;試験のポイント！
&lt;ul&gt;
&lt;li&gt;セキュリティグループとネットワークACLの違いを抑えて、ファイアウォールによるトラブルシューティングに対応できるようにする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;VPCピア接続&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;使い所&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;本番環境と開発環境で異なるVPCを構築したが、２つのVPCを接続して、プライベートIPで通信したい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;接続が確立されると、PCXというゲートウェイに相当するものが作成される&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ルートテーブルの設定で送信先のターゲットとして、PCXを設定することで、各VPC内のサブネット間でのプライベートIPでの通信が可能になる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ピア接続の制約&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;接続するVPCは同じリージョンに存在する必要がある&lt;/li&gt;
&lt;li&gt;接続するVPCのプライベートネットワークアドレス空間は重複していない
&lt;ul&gt;
&lt;li&gt;接続する可能性があるならはじめから分けておく必要性を示唆している&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;１対１の接続
&lt;ul&gt;
&lt;li&gt;ここはAWS対策講座でも強調して説明されていた&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;試験のポイント！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VPCピア接続の特徴/制約を押さえる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;章末問題&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VPC内のすべてのサブネット間の通信はデフォルトのルーティングルールで許可されており、変更や削除はできない&lt;/li&gt;
&lt;li&gt;セキュリティグループはステートフルのため戻りのトラフィックを確認する必要ない&lt;/li&gt;
&lt;li&gt;VPCピア接続にあたってVPCが同一のリージョンに存在する必要がある点&lt;/li&gt;
&lt;li&gt;VPCピア接続は１対１&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;第5章 AWSにおけるコンピューティング（EC2／AMI／EBS／インスタンスストア）&lt;/h1&gt;
&lt;h2&gt;EC2の初回起動と設定&lt;/h2&gt;
&lt;p&gt;【作成ステップについて】&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Amazon Machine Image(AMI)の選択&lt;/li&gt;
&lt;li&gt;インスタンスタイプの選択
3. インスタンスファミリー選択&lt;/li&gt;
&lt;li&gt;ネットワーク/IAMロール/ユーザデータなどの設定（インスタンスの詳細設定）
4. ユーザデータ：シェルスクリプト
5. メタデータ：インスタンス自身に関するデータ&lt;/li&gt;
&lt;li&gt;ストレージの設定
5. EBS
6. インスタンスストア：追加できるのはEC2インスタンスの初回起動時のみ&lt;/li&gt;
&lt;li&gt;タグ付け
6. タグ付けができる。おおよそ、Nameをキーにサーバー名を値に設定したりする&lt;/li&gt;
&lt;li&gt;セキュリティグループの設定
7. EC2には少なくとも１つのセキュリティグループを割り当てる必要がある&lt;/li&gt;
&lt;li&gt;個々までの設定の確認&lt;/li&gt;
&lt;li&gt;キーペアの選択&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;試験のポイント！
&lt;ul&gt;
&lt;li&gt;ユーザデータおよびメタデータの用途と、メタデータで参照できる主要なデータを押さえる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;EC2インスタンスのライフサイクル&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ステータスチェック&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;System Status Checks:インフラストラクチャ（HW、ハイパーバイザ）のチェック&lt;/li&gt;
&lt;li&gt;Instance Status Checks：OSのチェック&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;EC2のインスタンスがrunningになった時点から料金が発生し、stopped,terminatedになるまで発生&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;EBSとインスタンスストア&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Amazoon EBS(Elastic Block Store)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AZ内に作成されるネットワーク接続型のブロックストレージ&lt;/li&gt;
&lt;li&gt;不揮発性&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;インスタンスストア&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EC2インスタンスの物理ホストの内蔵ストレージで、揮発性（一時的なデータボリューム）&lt;/li&gt;
&lt;li&gt;揮発性：EC2が停止すると保存されていたデータは削除される&lt;/li&gt;
&lt;li&gt;EC2が停止して起動すると、物理ホストが変わるため、揮発性という特徴がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;重要！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ブロックストレージにはEBSとインスタンスストアの２種類があり、不揮発性と揮発性という違いがある！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OSがどこにインストールされるかによる違い&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EBS-backedインスタンス
&lt;ul&gt;
&lt;li&gt;EBSにOSがインストールされる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;instance store-backedインスタンス
&lt;ul&gt;
&lt;li&gt;インスタンスストアにインストラクターされる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;試験のポイント！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EBS-backedインスタンスとinstance store-backedインスタンスの特徴を押さえる！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;EBSのタイプ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;EBSのタイプとして３種類言及しているが、情報として古いので、最新を確認したほうがよい&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;EBS最適化オプション（Black Beltより最新情報を記載）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ネットワークのIO帯域とEBSのIO帯域を分け、EBS専用帯域を確保するオプション&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;試験のポイント！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EBSボリュームタイプの性能の違いとEBS最適化インスタンス(今はEBS最適化オプション？)の使い所を押さえる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;EBSスナップショット&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;試験のポイント！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EBSスナップショットの特徴を押さえる！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;試験のポイント！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EBSスナップショットを介したAZ/リージョン間のEBSボリュームの複製の流れを押さえる&lt;/li&gt;
&lt;li&gt;リージョン-a/AZ-a → リージョン-a/S3 にスナップショット取得&lt;/li&gt;
&lt;li&gt;リージョン-a/S3 → リージョン-a/AZ-b にスナップショット復元&lt;/li&gt;
&lt;li&gt;リージョン-a/S3 → リージョン-b/S3 にスナップショットコピー&lt;/li&gt;
&lt;li&gt;リージョン-b/S3 → リージョン-b/AZ-c にスナップショット復元
&lt;ul&gt;
&lt;li&gt;S3間はリージョンをまたいでスナップショットをコピーすることができる点&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;プレイスメントグループ&lt;/h2&gt;
&lt;p&gt;初めて聞いた...&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;試験のポイント！
&lt;ul&gt;
&lt;li&gt;プレイスメントグループ内にEC2インスタンスを起動することで、EC2インスタンス間のネットワーク接続を高速化できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Dedicatedインスタンス&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ソフトウェア・ライセンスの、ハードウェア制約を解消するために、EC2インスタンスを起動する物理ホストに、別のEC2インスタンスが起動しないことを保証&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dedicatedホストという、物理ホストをアカウントに割り当てておき、その中にEC2インスタンスを起動していくサービスが利用できるようになった&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS参考
https://aws.amazon.com/jp/ec2/purchasing-options/dedicated-instances/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;章末問題&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ユーザデータについて&lt;/li&gt;
&lt;li&gt;EC2の停止は「EBS-backedインスタンス」しかできない（instance store-backedインスタンスはできない）&lt;/li&gt;
&lt;li&gt;EC2の再起動は揮発性ボリュームデータを失わない&lt;/li&gt;
&lt;li&gt;スナップショット取得の留意事項（アンマウント＋取得後すぐにIO可能）&lt;/li&gt;
&lt;li&gt;EBSボリュームはAZ間コピーもリージョン間コピーもできない、S3にスナップショットを取得して適応する&lt;/li&gt;
&lt;li&gt;プレイスメントグループについて&lt;/li&gt;
&lt;li&gt;Dedicatedインスタンスについて&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;第6章 オブジェクトストレージ（S3／Glacier）&lt;/h1&gt;
&lt;h2&gt;S3バケット／オブジェクトとストレージクラス&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;S3（Amazon Simple Storage Service）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;スタンダード（標準）クラス&lt;/li&gt;
&lt;li&gt;低冗長化（Reduced Redundancy Storage;RRS）ストレージクラス&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;※この本では言及してないが、Black Beltで最新は以下の４種類&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ストレージクラス&lt;/th&gt;
&lt;th&gt;特徴&lt;/th&gt;
&lt;th&gt;耐久性&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;スタンダード&lt;/td&gt;
&lt;td&gt;複数箇所にデータを複製。デフォルトのストレージクラス&lt;/td&gt;
&lt;td&gt;99.999999999%(イレブン・ナイン)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;STANDARD-IA（標準低頻度アクセスストレージ）&lt;/td&gt;
&lt;td&gt;スタンダードに比べ格納コストが安価。いつでもアクセス可能だが、データの読み出し容量に対して課金。IA（Infrequent Access）&lt;/td&gt;
&lt;td&gt;99.999999999%(イレブン・ナイン)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Glacier（アーカイブ）&lt;/td&gt;
&lt;td&gt;最も低コストだが、データの取り出しにコストと時間を要する。ライフサイクルマネジメントにて指定する&lt;/td&gt;
&lt;td&gt;99.999999999%(イレブン・ナイン)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;低冗長化ストレージ（RRS）&lt;/td&gt;
&lt;td&gt;RRSはReduced Redundancy Storageの略。Glacierから取り出したデータの置き場所として利用&lt;/td&gt;
&lt;td&gt;99.99%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;試験のポイント！
&lt;ul&gt;
&lt;li&gt;S3のストレージクラスには、失われることが許されないデータを格納する用途に適したスタンダードクラスと、失われても再作成可能なデータを格納する用途に適した低冗長化クラスがある！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;S3の整合性&lt;/h2&gt;
&lt;p&gt;S3はオンラインで頻繁に更新されるデータの格納先には向かない&lt;/p&gt;
&lt;p&gt;格納されている静的データを何度も読み取るような用途に向いている&lt;/p&gt;
&lt;p&gt;新規オブジェクトの追加は「完了」と表示されれば、画面上、lsコマンド上で確認できる&lt;/p&gt;
&lt;p&gt;更新、削除は「完了」と表示されても、結果整合性をとるために、画面上、lsコマンド上で前のオブジェクトが表示されたり、削除できていなかったりする&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;試験のポイント！
&lt;ul&gt;
&lt;li&gt;S3の各操作とデータ整合性について押さえ、整合性を考慮したS3の利用用途を押さえる！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;S3のアクセス制限とセキュリティ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;アクセス管理の方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アクセスコントロールリスト（ACL）&lt;/li&gt;
&lt;li&gt;バケットポリシー&lt;/li&gt;
&lt;li&gt;IAM(ユーザ)ポリシー&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;その他&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;署名（期限）付きURL
&lt;ul&gt;
&lt;li&gt;アクセス許可設定をしていない特定のオブジェクトを指定した期間に限定して公開&lt;/li&gt;
&lt;li&gt;用途）商品購入後、期間限定でURLに署名をつけて購入者に渡してダウンロードしてもらう際などに用いられる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;オブエジェクトの暗号化とアクセスログ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;試験のポイント！
&lt;ul&gt;
&lt;li&gt;S3の暗号化やアクセスログの取得はデフォルトではなく、ユーザの責任の元に実施する！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;S3の静的Webサイトホスティング機能&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Webサイトホスティング機能&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;エンドポイント
&lt;ul&gt;
&lt;li&gt;バケット名.s3-website-リージョン名.amazonaws.com&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;準備&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Route53やDNSドメインサービスで名前解決する必要がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;S3のバージョニング機能&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;バージョニング機能&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;S3バケット単位で有効/無効にできる&lt;/li&gt;
&lt;li&gt;誤って上書き、削除した場合でも、操作前のオブジェクトを復元できる&lt;/li&gt;
&lt;li&gt;有効にした場合、キーの他にバージョンIDが付与される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;試験のポイント！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;S3のバージョニング機能を利用すれば、誤操作などにより上書きや削除をしてしまっても、元のデータを復元できる！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;S3のライフサイクル機能とGlacierへのアーカイブ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;普段アクセスしないものは、より安く運用できる「Glacier」へ移動&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;格納方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ライフサイクル機能
&lt;ul&gt;
&lt;li&gt;指定日数が経過したら、Glacierに格納、削除といった操作ができる機能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SDKを利用して直接格納&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;試験のポイント！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Glacierは参照する頻度の少ないデータを長期間保管するのに適している&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;章末問題
+&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;第7章 データベース（RDS／ElastiCache／DynamoDB）&lt;/h1&gt;
&lt;h2&gt;マネージド・サービス&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;マネージド・サービスとは&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;利用者が自身でOSやミドルウェア/ソフトウェアをインストールすることなくサービスを利用でき、サービスの可用性や拡張性、バックアップやパッチ適用といった管理作業の多くをAWSが管理してくれるサービスのこと&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RDSはマネージド・サービスで、他にもELBやSQSなどが存在する&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;マネージド型データベースサービス&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;AWSが提供するマネージド型データベースサービス
&lt;ul&gt;
&lt;li&gt;Amazon RDS：リレーショナルデータベースサービス&lt;/li&gt;
&lt;li&gt;Amazon DynamoDB：NoSQLデータベースサービス&lt;/li&gt;
&lt;li&gt;Amazon ElastiCache：インメモリキャッシュサービス&lt;/li&gt;
&lt;li&gt;Amazon Redshift：データウェアハウスサービス&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;※最新では、Amazon Neptuneというサービスも存在する（フルマネージドのグラフデータベースサービス）&lt;/p&gt;
&lt;h2&gt;RDS&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;種類&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Amazon Aurora
&lt;ul&gt;
&lt;li&gt;MySQLとPostgreSQLとの互換性のあるエンジン&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;MySQL&lt;/li&gt;
&lt;li&gt;MariaDB
&lt;ul&gt;
&lt;li&gt;MySQLから分岐（フォーク）して作成された&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;Oracle&lt;/li&gt;
&lt;li&gt;Microsoft SQL Server&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;特徴&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;１）マルチAZ配置
&lt;ul&gt;
&lt;li&gt;複数のAZにRDSインスタンスを配置して可用性を高める機能（マスタ-スレーブ構成）&lt;/li&gt;
&lt;li&gt;MySQL、MariaDB、PostgreSQL、Oracleでは同期物理レプリケーション、&lt;/li&gt;
&lt;li&gt;SQL Server では同期論理レプリケーションを使用してマスタからスレーブにデータ同期&lt;/li&gt;
&lt;li&gt;スレーブデータは完全にスタンバイ状態で、読み取りもできないので、読み取り性能を上げたい場合は、リードレプリカや、ElastiCacheを利用すること&lt;/li&gt;
&lt;li&gt;マスタに障害や停止が発生した場合、フェイルオーバーが開始される。フェイルオーバーの過程で、RDSインスタンスのCNAMEがマスタースレーブに付け替えられます&lt;/li&gt;
&lt;li&gt;AuroraのマルチAZ配置は、マスタ-スレーブ構成ではなく、３つのAZにまたがるクラスターボリュームが作成され、各AZにクラスターデータのコピーが格納される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;試験のポイント！
&lt;ul&gt;
&lt;li&gt;RDSのマルチAZ配置の特徴、フェイルオーバー時の挙動を押さえる！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;２）自動バックアップ機能
&lt;ul&gt;
&lt;li&gt;RDS標準機能で、１日１回自動的にデータのバックアップを取得する&lt;/li&gt;
&lt;li&gt;取得中は多少の読み書き遅延が発生する可能性があるので、利用者は、バックアップウィンドウと呼ばれる設定項目でバックアップが取得される時間帯を選択する&lt;/li&gt;
&lt;li&gt;バックアップの保持期間はデフォルトで７日間。０～３５日間の間で指定する（０を選択するとバックアップが取得されない）&lt;/li&gt;
&lt;li&gt;RDSはトランザクションログも自動的に取得しており、１日１回の自動バックアップとトランザクションログを利用して、設定している保存期間の特定時点のデータを持つRDSインスタンスを復元可能&lt;/li&gt;
&lt;li&gt;トランザクションログは５分に１回永続ボリュームに書き込まれている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;試験のポイント！
&lt;ul&gt;
&lt;li&gt;RDSの自動バックアップ機能のメリットを押さえる！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;３）パッチ適用
&lt;ul&gt;
&lt;li&gt;自動パッチ適用機能を有効にしておくと、メンテナンスウィンドウと呼ばれる設定項目で指定した曜日/時間帯にパッチが適用される。&lt;/li&gt;
&lt;li&gt;パッチ適用時に数分のダウンタイムが生じることがあるが、RDSをマルチAZ配置にすることで、先にスタンバイにパッチがてきようされ、フェイルオーバーした後に旧マスタ-でパッチが適用されるため、その影響を軽減できる&lt;/li&gt;
&lt;li&gt;利用者がパッチ適用を有効/無効に設定できるが、重要なセキュリティ脆弱性が発生した場合は自動的に適用されることがある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;４）ストレージ
&lt;ul&gt;
&lt;li&gt;RDSのストレージも、EBSのストレージと同様に、種類がある&lt;/li&gt;
&lt;li&gt;General Purpose SSD&lt;/li&gt;
&lt;li&gt;Provisioned IOPS SSD&lt;/li&gt;
&lt;li&gt;Magnetic（Black Beltに「下位互換のためサポート」と記載あり）&lt;/li&gt;
&lt;li&gt;（具体的な数値についてはBlack Beltを見たほうがよいため割愛）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;DynamoDB&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;マネージド型のNoSQLデータベースサービス&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;特徴&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ストレージ容量が必要に応じて自動的に拡張&lt;/li&gt;
&lt;li&gt;秒間あたりのI/O性能を指定できる&lt;/li&gt;
&lt;li&gt;ストレージはSSDのみで安定したI/O性能を提供&lt;/li&gt;
&lt;li&gt;データを３つのデータセンタに複製することで高可用性と高い耐久性を提供&lt;/li&gt;
&lt;li&gt;読み込み整合性の強弱を指定することで、性能と整合性のバランスを選択&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;拡張性&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;冗長性&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;整合性（結果整合性）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ユースケース&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;セッションデータ&lt;/li&gt;
&lt;li&gt;ゲームの点数&lt;/li&gt;
&lt;li&gt;買い物リスト（買い物かご）&lt;/li&gt;
&lt;li&gt;センサーデータ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;１つの項目の実データは最大400KBまで&lt;/p&gt;
&lt;p&gt;１つ１つの項目に対応する実データサイズが大きくなる場合は、実データをS3に保管して、DynamoDBにはS3の格納先URLや格納日付といったメタデータを格納するということもできる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;試験のポイント！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DynamoDBのメリットとユースケースを押さえる！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DynamoDBはリージョンサービス&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;プライベートサブネットからのアクセスはNATインスタンスを経由する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;試験のポイント！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DynamoDBのアクセス制御はIAMで行い、EC2インスタンス上で実行されるプログラムの認証には、IAMロールを活用する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;ElastiCache&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;種類&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Memcached
&lt;ul&gt;
&lt;li&gt;Key-Value Store形式&lt;/li&gt;
&lt;li&gt;キャッシュクラスタ構成&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Redis
&lt;ul&gt;
&lt;li&gt;Key-Value Store形式&lt;/li&gt;
&lt;li&gt;マスタースレーブ構成&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ElastiCacheはAZサービスでサブネットグループに配置&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;アクセス制御はセキュリティグループとサブネットのルーティングルール&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;試験のポイント！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ElastiCacheのメリット/ユースケースを押さえる！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;章末問題
+&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;第8章 AWSにおける監視と通知（CloudWatch／SNS）&lt;/h1&gt;
&lt;h2&gt;CloudWatchによるモニタリング&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;CloudWatchとは&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;モニタリングサービス&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メトリックス（監視項目）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EC2インスタンスのCPU利用料&lt;/li&gt;
&lt;li&gt;EBSのディスクI/O&lt;/li&gt;
&lt;li&gt;S33の格納オブジェクト総数&lt;/li&gt;
&lt;li&gt;RDSインスタンスのCPU利用率&lt;/li&gt;
&lt;li&gt;RDSインスタンスのメモリ空き容量&lt;/li&gt;
&lt;li&gt;RDSインスタンスのストレージ空き容量&lt;/li&gt;
&lt;li&gt;DynamoDBに書き込まれたユニット数&lt;/li&gt;
&lt;li&gt;など。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CloudWatchは各種AWSリソースから送られてきたモニタリングデータを保存し、メトリックス毎にグラフ化して表示することができる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;保持期間は２週間、それ以降のデータは破棄されてしまうため、月次のモニタリングレポート必要な場合は、保持期間内にCloudWatchからモニタリングデータをダウンロードしておく必要があります。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;EC2のモニタリング&lt;/h2&gt;
&lt;p&gt;CloudWatchはあくまで、AWSリソースから&lt;strong&gt;送られてきた&lt;/strong&gt;データを保存/可視化するサービスであるため、CloudWatchにデータを送る仕組み/機能をEC2インスタンスや、RDSインスタンスなどのAWSリソース側で用意する必要がある&lt;/p&gt;
&lt;p&gt;RDSはマネージドサービスであり、デフォルトで様様なモニタリングデータを収集して、CloudWatchに送信するエージェントがインスタンスに導入されている&lt;/p&gt;
&lt;p&gt;EC2はマネージドサービスではないため、デフォルトではハイパーバイザが収集できるモニタリングデータのみを収集してCloudWatchに送っている&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;標準（デフォルト）メトリックス：ハイパーバイザが取得してCloudWatchに送信するメトリックス
&lt;ul&gt;
&lt;li&gt;CPUクレジット利用数（CPUCreditUsage）&lt;/li&gt;
&lt;li&gt;CPUクレジット累積数（CPUCreditBalance）&lt;/li&gt;
&lt;li&gt;CPU利用率（CPUUtilization）&lt;/li&gt;
&lt;li&gt;１秒あたりのDisk読み込み回数（DiskReadOps）&lt;/li&gt;
&lt;li&gt;１秒あたりのDisk書き込み回数（DiskWriteOps）&lt;/li&gt;
&lt;li&gt;インスタンスストレージの読み取りバイト数（DiskReadBytes）&lt;/li&gt;
&lt;li&gt;インスタンスストレージの書き込みバイト数（DiskWriteBytes）&lt;/li&gt;
&lt;li&gt;受信したバイト数（NetworkIn）&lt;/li&gt;
&lt;li&gt;送信したバイト数（NetworkOut）&lt;/li&gt;
&lt;li&gt;OS/インフラストラクチャステータスチェックの成功(0)/失敗(1)（StatusCheckFailed）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;カスタムメトリックス：OSにインストールしたエージェントが取得して、CloudWatchに送信するメトリックス&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;参考）よくある質問「カスタムメトリックスとは」&lt;/p&gt;
&lt;p&gt;https://aws.amazon.com/jp/cloudwatch/faqs/&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;カスタムメトリクスとは、Amazon CloudWatch でモニタリングするためにお客様自身が用意するメトリクスのことです。&lt;/p&gt;
&lt;p&gt;カスタムメトリクスを使用してモニタリングできるものの例としては、ウェブページのロードに要する時間、リクエストエラー率、
インスタンス上のプロセスやスレッドの数、アプリケーションで実行された作業の量などがあります。&lt;/p&gt;
&lt;p&gt;カスタムメトリクスを使用するには、PutMetricData API を使用します。Windows および Linux 向けのモニタリングスクリプトのサンプル、CloudWatch プラグイン集が用意されているほか、AWS パ&amp;gt;ートナーからも多数のアプリケーションやツールが提供されています。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;基本モニタリング&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;３種類のステータスチェックは１分間隔、その他は５分間隔&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;詳細モニタリング&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;標準メトリックスをすべて１分間隔（ただし、追加料金が必要）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;試験のポイント！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EC2の標準メトリックスや基本/詳細モニタリングを押さえる！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;アラームとアクション&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;CloudWatchの各メトリックスに対して、アラームを設定することができる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;閾値を超えた時に所定のアクションを呼び出す&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;アクション例&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;メールなどの通知（Simple Notification Service）&lt;/li&gt;
&lt;li&gt;Auto Scalingポリシー（EC2インスタンス数の増減）&lt;/li&gt;
&lt;li&gt;EC2アクション（停止/削除/再起動/復旧）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;アラームの３つの状態&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OK&lt;/li&gt;
&lt;li&gt;アラーム（ALARM）&lt;/li&gt;
&lt;li&gt;不足（INSUFFICIENT_DATA）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;設定例&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EC2インスタンスの１分間のCPU利用率の平均が閾値の７０％を３期連続（３分間連続）で上回っている場合に、EC2インスタンスを２台増やすAutoScalingポリシーのアクションを呼び出す&lt;/li&gt;
&lt;li&gt;など。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;重要！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CloudWatchのアラームとアクションについて、特徴と代表的な利用の流れを押さえる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;SNS&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SNS(Amazon Simple Notification Service)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ユーザやアプリケーションにメッセージを送信できる&lt;/li&gt;
&lt;li&gt;CloudWatchのアラームアクションとしてメッセージを通知することもできる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;押さえるべき３つの用語&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;メッセージ
&lt;ul&gt;
&lt;li&gt;通知するメッセージ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;サブスクライバ
&lt;ul&gt;
&lt;li&gt;受信者を指し、サポートされているプロトコルは次の通り
&lt;ul&gt;
&lt;li&gt;Eメール&lt;/li&gt;
&lt;li&gt;SMS&lt;/li&gt;
&lt;li&gt;HTTP/HTTPS&lt;/li&gt;
&lt;li&gt;SQS（Simple Queue Service）&lt;/li&gt;
&lt;li&gt;Lambda（サーバ無しのプログラムコード実行サービス）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;トピック
&lt;ul&gt;
&lt;li&gt;単一/複数のサブスクライバをまとめたもの&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;利用例&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;１．SampleTopicというシステムのアラートが通知されるトピックを作成し、運用管理者のEメールアドレス/メーリングリストをサブスクライバとしてSampleTopicに登録&lt;/li&gt;
&lt;li&gt;２．CloudWatchでシステムのEC2インスタンスをモニタリングし、１分間の平均CPU利用率が８０％を１回超えたというアラームが発生すると、SampleTopicにメッセージを通知するアクションを設定&lt;/li&gt;
&lt;li&gt;３．該当するEC2インスタンスのCPU利用率が８０％を超えてあアラームが発生すると、「CPU利用率が８０％を超えてアラームの状態がOKからALARMに遷移した」というメッセージをSampleTopicに送信&lt;/li&gt;
&lt;li&gt;４．SNSはSampleTopicに登録されている運用管理者のEメールアドレス/メーリングリスト（サブスクライバ）にメッセージを送信&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;章末問題&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WEbサーバとして利用しているEC2インスタンスの標準メトリックスとして正しいものは？
&lt;ul&gt;
&lt;li&gt;[誤]メモリ使用率&lt;/li&gt;
&lt;li&gt;[誤]Webページへのロード時間&lt;/li&gt;
&lt;li&gt;[誤]Webサーバのプロセス/スレッド数&lt;/li&gt;
&lt;li&gt;[正]Network I/O&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;※デフォルトは、ハイパーバイザが取得できる値のみ。メモリの使用率は、OSで収集する必要があります。&lt;/p&gt;
&lt;h1&gt;第9章 AWSにおける拡張性と分散／並列処理（ELB／Auto Scaling／SQS／SWF）&lt;/h1&gt;
&lt;h2&gt;密結合と疎結合&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;通常のオンプレでWeb-AP-DBサーバーの3Tier構成を組むと、サーバー間が密結合担ってしまう。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWSではサーバ間を疎結合にするために、負荷分散装置を用いて、WEBサーバ、APサーバのインスタンスが入れ替わっても問題ないように３Tier構成を組む&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;そのためのサービスをELB（Elastic Load Balancing）という（マネージドサービス）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;重要！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コンポーネント間を疎結合にして伸縮自在性を実装し、AWSのメリットを活かすシステム構成にする！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;ELB&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;機能&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;複数のAZにまたがる負荷分散&lt;/li&gt;
&lt;li&gt;EC2インスタンスのヘルスチェック&lt;/li&gt;
&lt;li&gt;ELB自体の自動スケーリング&lt;/li&gt;
&lt;li&gt;SSLのオフロード&lt;/li&gt;
&lt;li&gt;Connection Draining&lt;/li&gt;
&lt;li&gt;アクセスログ記録&lt;/li&gt;
&lt;li&gt;スティッキーセクション&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;(1)複数のAZにまたがる負荷分散&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;(2)EC2インスタンスのヘルスチェック&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;補足）EC2インスタンスを再起動した際、ELBのヘルスチェック間隔によってインスタンス異常と判定され、そのインスタンスのトラフィックが行われなくなり、再起動後もトラフィックの再開をしなかったが、2015/12にEC2インスタンスのELBへの自動再登録が可能になった&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;(3)ELB自体の自動スケーリング&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ELBは、受信するトラフィックの流量に合わせて自動的にその実態を増減させる&lt;/li&gt;
&lt;li&gt;ELBの実態はサブネットの中に作成される&lt;/li&gt;
&lt;li&gt;割り当てられるIPアドレスはサブネットの中から採番されるが、同時にDNS名が付与され、DNS名で通信される&lt;/li&gt;
&lt;li&gt;実態はサブネットの中にあるが、AZ間をまたいで通信されるため、AZの間にELBのアイコンを書くことがおおい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;(4)SSLのオフロード&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SSL証明書はEC2インスタンスに配置するのではなく、ELBに配置して一元管理する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;(5)Connection Draining&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ELBが配下のEC2インスタンスの登録解除をするときに、新規のリクエストについてはそのインスタンスへのトラフィックの送信を停止し、登録解除前にそのインスタンスで処理中だったリクエストについては完了まで待つようにする機能です。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;(6)アクセスログ記録&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ELBにはアクセスログ収集機能があり、S3バケットに保存することで、アクセスログを一元管理できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;(7)スティッキーセクション&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ELBには、スティッキーセクションという、システムにアクセスしているクライアントを特定のEC2インスタンスに紐付けできる機能がある。&lt;/li&gt;
&lt;li&gt;例）ユーザ認証が必要な会員WebサイトをEC2インスタンス上に構築し、その前段にELBを配置するとする。クラアイアンとは会員Webサイトにアクセスした際に、ELBに割り振られたEC2インスタンスのWebサーバ上でユーザ認証手続きを行います。ユーザ認証に成功すると、Webサーバ側でセッション情報が保持されるため、クライアントが会員Webサイト内で別ページを閲覧して、再度Webサーバに要求が送られても、Webサーバはセッション情報を参照することで、認証済みであることが確認でき、改めてユーザ認証を行わずにすむ&lt;/li&gt;
&lt;li&gt;→ただし、この方法は「伸縮自在性を実装」に影響を及ぼすので、注意が必要。&lt;/li&gt;
&lt;li&gt;「各コンポーネントが特定の状態を持たいない（ステートレス）」であることが重要。スティッキーセクションの代わりに、DynamoDBや、ElastiCacheを利用するほうが懸命&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;試験のポイント！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ELBの機能/特徴を理解して、ELBによるシステムの可用性向上メリットを押さえる！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;分散／並列処理&lt;/h2&gt;
&lt;p&gt;ある１台のEC2インスタンスでは性能が不足する場合の対処方法２つ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;(1) スケールアップ：インスタンスタイプを変更し、より高スペックに&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;(2) スケールアウト：EC2インスタンスの台数を増やして分散処理させる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;スケールアップの問題点&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EC2インスタンスを一旦停止する必要があり、１台のインスタンスの場合は業務を停止する必要がある&lt;/li&gt;
&lt;li&gt;最終的にはスペックの限界がある&lt;/li&gt;
&lt;li&gt;１台のインスタンスでは「故障に備えた設計で障害を回避」を実践できない構成になる&lt;/li&gt;
&lt;li&gt;システム負荷が減少した際に、スケールアップしたインスタンスタイプではオーバースペックになる。スケールダウンするためには再度EC2インスタンスを一旦停止する必要がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;試験のポイント！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;分散/並列処理できる処理は並列化して業務を効率化する！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Auto Scaling&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Auto Scaling&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EC2のインスタンスでAuto Scalingグループというグループを構成し、設定に従って自動的にEC2インスタンスの台数を増減させる&lt;/li&gt;
&lt;li&gt;負荷が現象した際は、スケールインすることでコストメリットを図れる&lt;/li&gt;
&lt;li&gt;Auto Scalingの利用料金は無料で、起動したEC2インスタンスの利用料金のみ費用が発生する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ユースケース&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;負荷に基づいた利用&lt;/li&gt;
&lt;li&gt;スケジュールに基づいた利用&lt;/li&gt;
&lt;li&gt;正常なEC2インスタンスの台数を維持するための利用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Auto Scalingのコンポーネント&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;起動設定（Launch Configration）
&lt;ul&gt;
&lt;li&gt;どんなEC2インスタンスを起動するのか？という設定
&lt;ul&gt;
&lt;li&gt;AMI&lt;/li&gt;
&lt;li&gt;インスタンスタイプ&lt;/li&gt;
&lt;li&gt;IAMロール&lt;/li&gt;
&lt;li&gt;CloudWatch詳細モニタリング&lt;/li&gt;
&lt;li&gt;ユーザデータ&lt;/li&gt;
&lt;li&gt;IPアドレス&lt;/li&gt;
&lt;li&gt;ストレージ（EBS、インスタンスストア）&lt;/li&gt;
&lt;li&gt;セキュリティグループ&lt;/li&gt;
&lt;li&gt;キーペア&lt;/li&gt;
&lt;li&gt;など、、&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Auto Scaling Group（Auto Scalingグループとは異なり、設定項目）
&lt;ul&gt;
&lt;li&gt;どこに、どんな規模のグループ？という設定です&lt;/li&gt;
&lt;li&gt;EC2インスタンスが起動するサブネットや特定のELB配下など、どこに？の設定&lt;/li&gt;
&lt;li&gt;最小/最大台数などグループの規模を定める設定
&lt;ul&gt;
&lt;li&gt;スタートのグループサイズ（EC2インスタンス数）&lt;/li&gt;
&lt;li&gt;サブネット（AZ）&lt;/li&gt;
&lt;li&gt;ELB（ヘルスチェック設定も含む）&lt;/li&gt;
&lt;li&gt;最小/最大グループサイズ（EC2インスタンス数）&lt;/li&gt;
&lt;li&gt;など、、&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Auto Scaling ポリシー
&lt;ul&gt;
&lt;li&gt;いつ、何台増減させるか？という設定&lt;/li&gt;
&lt;li&gt;例えば、負荷に基づく設定であれば、CPU利用率のCloudWatchアラームを設定しておき、OKからアラームに状態遷移した際に、アクションとしてAuto Scalingポリシーを呼び出す
&lt;ul&gt;
&lt;li&gt;アラームXが発生した際&lt;/li&gt;
&lt;li&gt;N台追加/削除&lt;/li&gt;
&lt;li&gt;猶予時間（インスタンスの増減後に、次の増減アクションが発生するまでのクールダウン時間）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;補足&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2015/7にAuto Scalingポリシーに「Step Scaliing」というタイプが追加され、それまでのポリシーは「Simple Scaling」というタイプになった&lt;/li&gt;
&lt;li&gt;Step Scaling
&lt;ul&gt;
&lt;li&gt;複数ステップでの増減が可能。まずこうなったら１台増やす、さらに何秒後までに、何％だったら、もう１台増やすのような設定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Simple Scaling
&lt;ul&gt;
&lt;li&gt;条件が１つの設定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;試験のポイント！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Auto Scalingにおける３つの設定項目を押さえる！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Auto Scalingの２つの特徴&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;正常なEC2インスタンスを希望する台数（Desired Capacity）維持するため、インスタンスのヘルスチェックをかけている&lt;/li&gt;
&lt;li&gt;Auto Scalingグループが複数のAZにまたがるとき、AZ間でEC2インスタンス数を均等にする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Auto Scalingのシュミレーションが記載されている項目がある～&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;スケールアウト時のインスタンス削除ルール&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;１．起動している台数が最も多いAZのインスタンス（大原則）&lt;/li&gt;
&lt;li&gt;２．起動設定が最も古いインスタンス&lt;/li&gt;
&lt;li&gt;３．次の課金タイミングが最も近いインスタンス&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;試験のポイント！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Auto Scalingにおける大原則を押さえ、EC2インスタンスの増減がどの様に発生するかを押さえる！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;SQS (Amazon Simple Queue Service)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ELBと並んでコンポーネントを疎結合にする要素で、AWSで分散/並列処理を行う上で重要なサービス&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;特徴&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(1)Pull型（ポーリングされる必要がある）
&lt;ul&gt;
&lt;li&gt;アプリケーションにポーリングされる必要がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;(2)順序性の保証はしない（FirstInFirstOutが保証されない）
&lt;ul&gt;
&lt;li&gt;順序性は保たれない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;(3)最低１回配信保証
&lt;ul&gt;
&lt;li&gt;メッセージはあるアプリケーションによって取得されてもキューから削除されることはなく、アプリケーションがバッチ処理の最後で明示的に削除する必要がある&lt;/li&gt;
&lt;li&gt;メッセージを取得したアプリケーションがバッチ処理の最中で停止しても、他のノード上のアプリケーションが再度同じメッセージを取得して処理できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;(4)可視性タイムアウト
&lt;ul&gt;
&lt;li&gt;あるメッセージを取得したアプリケーションがバッチ処理を実行中に、他のノード上のアプリケーションがキューに残っている同じメッセージを取得して島わあないように、可視性タイムアウトという機能が備わっている。デフォルトで３０秒、利用者による設定も可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;(5)メッセージサイズは最大256KB
&lt;ul&gt;
&lt;li&gt;サイズが大きい場合はS3に保存して、SQSにはデータの格納先の情報を格納する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SQSはリージョンサービスで、プライベートサブネットからキューのポーリングやメッセージの格納といった操作を行うにはNATインスタンスが必要&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;EC2上でSQSへのアクセスがあるアプリケーションを動作させる場合は、IAMポリシーが設定されたIAMロールをEC2インスタンスにアタッチすることで安全に利用できる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;試験のポイント！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;分散/並列処理におけるSQSのメリット/特徴を理解し、SQSのユースケースを押さえる！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;SWF（Amazon Simple Workflow）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;マネージド型のタスクコーディネータ&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;重複が許されない、厳密に１回限りで順序性が求められる処理のコーディネータとしての利用に適している&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;構成要素&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ワークフロースターター
&lt;ul&gt;
&lt;li&gt;ワークフローを開始する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ディサイダー
&lt;ul&gt;
&lt;li&gt;ワークフロー中の各処理を調整する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;アクティビティ・ワーカー
&lt;ul&gt;
&lt;li&gt;ワークフロー中の各処理を実行する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;試験のポイント！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;分散/並列処理における厳密に１回限りで順序性が求められる処理というSWFのユースケースを押さえる！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;章末問題&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ELBのIPアドレスを直接指定してはいけない&lt;/li&gt;
&lt;li&gt;予測できない負荷にたいするテストに時間をかけるのではなく、負荷ベースのAuto Scalingを利用することで、負荷に対応する&lt;/li&gt;
&lt;li&gt;１台のインスタンスを４０時間稼働させる利用料金と４０台のインスタンスを１時間可動させる利用料金は同じなので、可能な限り並列処理を実施する&lt;/li&gt;
&lt;li&gt;一時的にAuto Scaling設定がされているEC2インスタンスの台数を増やしたいときに変更するのは？
&lt;ul&gt;
&lt;li&gt;Auto Scaling Group設定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;動画トランスコード処理はSQSを利用するべき&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;第10章 DNSとコンテンツ配信（Route 53／CloudFront）&lt;/h1&gt;
&lt;h2&gt;エッジロケーション&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;AWSにはリージョンとAZ以外に、エッジロケーションというデータセンタが世界に５０箇所以上あります。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;エッジロケーションには、EC2やS3、RDSといったサービスでなく、Amazon Route 53のDNSサーバやAmazon Cloud Frontのキャッシュサーバが動作している&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;エッジロケーションは数が多いので、&lt;a href=&quot;https://aws.amazon.com/jp/about-aws/global-infrastructure/&quot;&gt;AWSインフラストラクチャページ&lt;/a&gt;で確認する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;重要！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;世界５０箇所以上のエッジロケーションを利用して、DNSサービスやコンテンツ配信（CDN）サービスが提供されている！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Route 53&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;マネージド型のDNSサービス&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DNSサービスが53番ポートを利用することからその名前がついている&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Route53を使用してゾーン/ドメイン情報を登録すると、４箇所のエッジロケーションのDNSサーバにゾーン/ドメイン情報が格納される&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Route53が管理しているドメインに対してクエリが発生すれば、その４箇所のうちエンドユーザに最も近いDNSサーバが応答する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;４箇所のDNSサーバが同時に停止する可能性は限りなく低いため、Route53のSLAは１００％として提供されている&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;利用料金は、管理しているホストゾーン（従来のDNSゾーンファイル）の数とクエリ回数などの従量課金制となっており、低額から利用可能&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Route53 レコードタイプ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A&lt;/li&gt;
&lt;li&gt;AAAA(IPv6)&lt;/li&gt;
&lt;li&gt;CNAME&lt;/li&gt;
&lt;li&gt;MX&lt;/li&gt;
&lt;li&gt;NS&lt;/li&gt;
&lt;li&gt;PTR&lt;/li&gt;
&lt;li&gt;SOA（Ｓtart Ｏf Ａuthority）&lt;/li&gt;
&lt;li&gt;SPF&lt;/li&gt;
&lt;li&gt;SRV&lt;/li&gt;
&lt;li&gt;TXT&lt;/li&gt;
&lt;li&gt;ALIAS(エイリアス：AWS独自レコード)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Zone Apex（ゾーンエイペックス）：ゾーンの頂点のこと&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;試験のポイント！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Route53の独自レコードであるALIASレコードは、CNAMEレコードでは対応できないZone Apexの名前解決をサポートする！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;レコードに行える設定&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;荷重ラウンドロビン&lt;/li&gt;
&lt;li&gt;レイテンシーベースルーティング&lt;/li&gt;
&lt;li&gt;位置情報ルーティング&lt;/li&gt;
&lt;li&gt;ヘルスチェックとフェイルオーバー&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;試験のポイント！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Route53の各種機能による、リージョンレベルのユースケースを押さえる！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;CloudFront&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;CloudFrontはCDNサービス（Contents Delivery Network）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;全国５０箇所のエッジロケーションの中の地理的に近い場所からコンテンツをダウンロード&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;アクセス回数とデータ転送量による従量課金制、長期契約や最低利用料金はない&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CloudFrontではエッジロケーションにキャッシュさせる時間を設定できる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;静的なコンテンツについてはキャッシュ時間を長く&lt;/li&gt;
&lt;li&gt;動的なコンテンツについてはキャッシュ時間を短く　といった具合&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;サービス提供側のメリット&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;大量のアクセスが各地のエッジロケーションに分散され、オリジンサーバの負荷が大幅に減少&lt;/li&gt;
&lt;li&gt;オリジンサーバのリソース削減&lt;/li&gt;
&lt;li&gt;S3バケットに直接アクセスされるよりもAWSの利用料金を抑えることができる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;試験のポイント！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CloudFrontの特徴/メリットを理解し、ユースケースを押さえる！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CloudFrontを利用したコンテンツ配信においても、CloudFrontのSSL証明書、あるいは利用者独自のSSL証明書を利用した暗号化通信が可能&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CloudFront経由でエンドユーザに、S3へアクセスさせる際は、バケットポリシーでCloudFrontからのアクセスだけ許可する設定（OAI:Original Accesss Identity）を作成し、OAIからのアクセスだけを許可&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;試験のポイント！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CloudFrontを利用したコンテンツ配信におけるセキュリティ/アクセス制限を押さえる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;章末問題
+&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;第11章 AWSサービスのプロビジョニング／デプロイ／構成管理（CloudFormation／Elastic Beanstalk／OpsWorks）&lt;/h1&gt;
&lt;h2&gt;CloudFormation&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;CloudFormation&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;プロビジョニングサービス。利用者が用意した定義にしたがってAWSリソースを自動的にプロビジョニングする&lt;/li&gt;
&lt;li&gt;自動化により、AWSリソースの構築/管理を効率化できる&lt;/li&gt;
&lt;li&gt;インフラストラクチャをコード化して、インフラのバージョン管理が可能&lt;/li&gt;
&lt;li&gt;利用料は無料で、プロビジョニングされたリソースの利用料金のみ発生&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;押さえておく用語&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;テンプレート
&lt;ul&gt;
&lt;li&gt;プロビジョニングするリソースを規定するJSON形式のテキストファイル&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;スタック
&lt;ul&gt;
&lt;li&gt;CloudFormationによってプロビジョニングされるリソースの集合/管理単位&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;試験のポイント！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CloudFormationを利用したインフラストラクチャのバージョン管理イメージを押さえる！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;テンプレートの作成について&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWSから提供されるサンプルテンプレートを元に利用者が編集したり、CloudFormerというツールを利用して作成することもできる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CloudFormer&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;利用者のアカウントで現在作成されているAWSリソースを元にテンプレートを作成することができるツール&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JSONの書き方について～&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;試験のポイント！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CloudFormationで設定できる項目や、エラー発生時の動きなどを押さえる！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Elastic Beanstalk/ OpsWorks&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Amazon Elastic Beanstalk&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アプリケーションのデプロイツール&lt;/li&gt;
&lt;li&gt;アプリケーションのバージョニング管理ができ、既存の環境を以前のバージョンに戻すことができる&lt;/li&gt;
&lt;li&gt;CloudFormation同様、プロビジョニングされたリソースにたいする課金&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OpsWorks&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWS上のアプリケーションサーバの構成管理ツール&lt;/li&gt;
&lt;li&gt;ELBやEC2インスタンスを作成し、その後にChefのレシピを実行してソフトウェアのインストールや設定などを自動化できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;まとめると&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CloudFormation
&lt;ul&gt;
&lt;li&gt;VPC以下の構成をプロビジョニング&lt;/li&gt;
&lt;li&gt;Elastic BeanstalkとOpsWorksを呼び出して一気に設定できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Elastic Beanstalk
&lt;ul&gt;
&lt;li&gt;アプリケーションのデプロイ関連（アプリケーションのバージョン管理）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;OpsWorks
&lt;ul&gt;
&lt;li&gt;アプリの設定（chefのレシピを実行してソフトウェアのインストールや設定）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;章末問題
+&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;第12章 EC2の料金モデル（オンデマンドインスタンス／リザーブドインスタンス／スポットインスタンス）&lt;/h1&gt;
&lt;h2&gt;オンデマンドインスタンス&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;デフォルトの課金形式&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;インスタンスが起動しているときに１時間単位で支払いが発生&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;料金は次の３要素で決まる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;リージョン&lt;/li&gt;
&lt;li&gt;インスタンスタイプ&lt;/li&gt;
&lt;li&gt;OS(Amazon Linux/RHEL/Windows Serverなど)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用用途&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;開発/検証環境のサーバ&lt;/li&gt;
&lt;li&gt;Auto Scalingグループで増減するサーバ&lt;/li&gt;
&lt;li&gt;１年を通して常時稼働することが求められていないサーバ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;リザーブドインスタンス&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;１年あるいは３年契約を結ぶことにより、オンデマンドインスタンスより割安にEC2インスタンスやRDSインスタンス、ElastiCacheノードやRedshiftノードを利用できる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RI(Reserved Instance)と略した名称で呼ばれることもある&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DynamoDBやCloudFrontにも同様の割引方式がありますが、こちらはキャパシティを事前に予約するリザーブドキャパシティといいます&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;リザーブドインスタンスはEC2インスタンスの起動/停止にかかわらず、利用料金が発生&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;支払い方式&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;前払いなし&lt;/li&gt;
&lt;li&gt;一部前払い&lt;/li&gt;
&lt;li&gt;全額前払い&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用用途&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;いつでも確実にインスタンスを立ち上げたい&lt;/li&gt;
&lt;li&gt;長期間継続的に利用することが決まっている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;スポットインスタンス&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;入札形式のEC2インスタンスの利用/支払い方式で、需要と供給のバランスによって決まるスポット価格（市場価格）を入札価格が上回ると、EC2インスタンスが利用できる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;スポット価格の設定項目&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アベイラビリティゾーン（AZ）&lt;/li&gt;
&lt;li&gt;インスタンスタイプ&lt;/li&gt;
&lt;li&gt;OS(Amazon Linux/SUSE Linux/ Windows Serverなど)&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;入札価格をスポット価格が上回った時、インスタンスはターミネートされる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;計算クラスタノードの一部や、Auto Scalingの増加部分のインスタンスなど、突然削除されても問題ないところで利用します。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;スポットインスタンス上のデータについては、頻繁にチェックポイントを設けて、S3やEBS、DynamoDBといった不揮発性のストレージに書き出す必要があります。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;EC2インスタンスをターミネートする２分前に通知があるため、その通知をトリガーに外部ストレージに書き出す&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;重要！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;スポットインスタンスは、単独で使用するのではなく、オンデマンドやリザーブドインスタンスと組み合わせて利用する！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;試験のポイント！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;業務（提供サービス）の継続とEC2のコスト最適化の業法を考慮して、オンデマンド/リザーブド/スポットインスタンスそれぞれのユースケースを押さえる！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>HTML5プロフェッショナル認定試験 レベル１ 問題集</title><link>https://tutttuwi.github.io/posts/2018_06_html5/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2018_06_html5/</guid><pubDate>Fri, 01 Jun 2018 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;LPIC Level1 教科書&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2018_06_html5_exercise.jpg&quot; alt=&quot;2018_06_html5_exercise&quot; title=&quot;2018_06_html5_exercise&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;目次
&lt;ul&gt;
&lt;li&gt;1章　Webの基礎知識&lt;/li&gt;
&lt;li&gt;2章　CSS&lt;/li&gt;
&lt;li&gt;3章　要素&lt;/li&gt;
&lt;li&gt;4章　レスポンシブWebデザイン&lt;/li&gt;
&lt;li&gt;5章　APIの基礎知識&lt;/li&gt;
&lt;li&gt;6章　模擬試験&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;教科書で学んだことの復習&lt;/li&gt;
&lt;li&gt;問題傾向の整理&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;HTML5 Level1資格取得のため&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>LPIC Level1 教科書</title><link>https://tutttuwi.github.io/posts/2018_04_lpic_level1/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2018_04_lpic_level1/</guid><pubDate>Sun, 01 Apr 2018 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;LPIC Level1 教科書&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2018_04_lpic.JPG&quot; alt=&quot;2018_04_lpic&quot; title=&quot;2018_04_lpic&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;目次
&lt;ul&gt;
&lt;li&gt;序章　LPI認定試験の概要&lt;/li&gt;
&lt;li&gt;第1章　システムアーキテクチャ&lt;/li&gt;
&lt;li&gt;第2章　Linuxのインストールとパッケージ管理&lt;/li&gt;
&lt;li&gt;第3章　GNU＆UNIXコマンド&lt;/li&gt;
&lt;li&gt;第4章　ファイルとプロセスの管理&lt;/li&gt;
&lt;li&gt;第5章　デバイスとLinuxファイルシステム&lt;/li&gt;
&lt;li&gt;第6章　101模擬試験&lt;/li&gt;
&lt;li&gt;第7章　シェル、スクリプト、データ管理&lt;/li&gt;
&lt;li&gt;第8章　ユーザーインターフェイスとデスクトップ&lt;/li&gt;
&lt;li&gt;第9章　システム管理（1）&lt;/li&gt;
&lt;li&gt;第10章　システム管理（2）&lt;/li&gt;
&lt;li&gt;第11章　ネットワークの基礎&lt;/li&gt;
&lt;li&gt;第12章　セキュリティ&lt;/li&gt;
&lt;li&gt;第13章　102模擬試験&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;LinuxOSのシステムアーキテクチャ&lt;/li&gt;
&lt;li&gt;パッケージ管理システムについて&lt;/li&gt;
&lt;li&gt;OSの種類(Redhat系/Debian系)&lt;/li&gt;
&lt;li&gt;シェルスクリプト（一般的なコマンドのオプション含めた使い方）&lt;/li&gt;
&lt;li&gt;シェル起動時の環境設定ファイル&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;LinuxOSについて体系的な知識を身に着けるため&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>LPIC Level1 問題集</title><link>https://tutttuwi.github.io/posts/2018_04_lpic_level1_%E5%95%8F%E9%A1%8C%E9%9B%86/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2018_04_lpic_level1_%E5%95%8F%E9%A1%8C%E9%9B%86/</guid><pubDate>Sun, 01 Apr 2018 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;LPIC Level1 教科書&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2018_04_lpic_exercise.jpg&quot; alt=&quot;2018_04_lpic_exercise&quot; title=&quot;2018_04_lpic_exercise&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;目次&lt;/li&gt;
&lt;li&gt;第1部　101試験
&lt;ul&gt;
&lt;li&gt;1章　基本コマンドとファイルの操作
&lt;ul&gt;
&lt;li&gt;2章　正規表現とviエディタ&lt;/li&gt;
&lt;li&gt;3章　プロセス管理&lt;/li&gt;
&lt;li&gt;4章　ファイルシステムの管理&lt;/li&gt;
&lt;li&gt;5章　マウントとクォータ機能&lt;/li&gt;
&lt;li&gt;6章　ファイルの管理&lt;/li&gt;
&lt;li&gt;7章　ソフトウェア管理&lt;/li&gt;
&lt;li&gt;8章　システムアーキテクチャ&lt;/li&gt;
&lt;li&gt;模擬試験&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;第2部　102試験
&lt;ul&gt;
&lt;li&gt;1章　シェル、スクリプト、SQLの基礎&lt;/li&gt;
&lt;li&gt;2章　X Windows System&lt;/li&gt;
&lt;li&gt;3章　ユーザアカウントの管理&lt;/li&gt;
&lt;li&gt;4章　システムサービスの管理&lt;/li&gt;
&lt;li&gt;5章　ネットワークの基礎&lt;/li&gt;
&lt;li&gt;6章　セキュリティ&lt;/li&gt;
&lt;li&gt;模擬試験&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;教科書で得た知識の再確認&lt;/li&gt;
&lt;li&gt;問題の出題傾向の把握&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;LPIC Level1資格取得のため&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>データベーススペシャリスト 2017年版 EXAM PRESS</title><link>https://tutttuwi.github.io/posts/2018_01_%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%82%B9%E3%83%9A%E3%82%B7%E3%83%A3%E3%83%AA%E3%82%B9%E3%83%88/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2018_01_%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%82%B9%E3%83%9A%E3%82%B7%E3%83%A3%E3%83%AA%E3%82%B9%E3%83%88/</guid><pubDate>Mon, 01 Jan 2018 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;データベーススペシャリスト EXAM PRESS&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2018_01_db.jpg&quot; alt=&quot;2018_01_db&quot; title=&quot;2018_01_db&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;目次
&lt;ul&gt;
&lt;li&gt;序章　試験対策（学習方法と解答テクニック）&lt;/li&gt;
&lt;li&gt;第1章　概念データモデル&lt;/li&gt;
&lt;li&gt;第2章　関係スキーマ&lt;/li&gt;
&lt;li&gt;第3章　SQL&lt;/li&gt;
&lt;li&gt;第4章　重要キーワード&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;DBスペシャリストに出題される問題傾向&lt;/li&gt;
&lt;li&gt;今までの業務経験等である程度理解はしていたが、得られるものがあった&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;DB関連知識の深堀のため&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Photoshopレタッチ・加工</title><link>https://tutttuwi.github.io/posts/2017_09_photoshop%E3%83%AC%E3%82%BF%E3%83%83%E3%83%81%E5%8A%A0%E5%B7%A5/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2017_09_photoshop%E3%83%AC%E3%82%BF%E3%83%83%E3%83%81%E5%8A%A0%E5%B7%A5/</guid><pubDate>Fri, 01 Sep 2017 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Photoshopレタッチ・加工&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2017_09_photoshop.JPG&quot; alt=&quot;2017_09_photoshop&quot; title=&quot;2017_09_photoshop&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Photoshopの加工テクニックを抜粋して拾い読み&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;趣味で一眼レフにはまっており、row画像を加工・人の目を引く写真の作成方法を学習したかった&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>詳解 Amache Spark</title><link>https://tutttuwi.github.io/posts/2017_06_apachespark/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2017_06_apachespark/</guid><pubDate>Thu, 01 Jun 2017 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;詳解 Amache Spark&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2017_06_spark.jpg&quot; alt=&quot;2017_06_spark&quot; title=&quot;2017_06_spark&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://gihyo.jp/book/2016/978-4-7741-8124-0&quot;&gt;目次&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Sparkとは&lt;/li&gt;
&lt;li&gt;Spark環境構築&lt;/li&gt;
&lt;li&gt;Scalaを使用したハンズオン
&lt;ul&gt;
&lt;li&gt;RDD操作&lt;/li&gt;
&lt;li&gt;Sparkを取り巻くエコシステムについて理解&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;※もう一回読みたい書籍&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ApacheSparkを使ってデータ予測ができる成果物を作成する機会があり、実際に開発/使用することになったが、前提知識がなかったため購入&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>応用情報技術者試験 教科書</title><link>https://tutttuwi.github.io/posts/2017_06_ap/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2017_06_ap/</guid><pubDate>Thu, 01 Jun 2017 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;応用情報技術者試験 教科書&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2017_06_ap.jpg&quot; alt=&quot;2017_06_ap&quot; title=&quot;2017_06_ap&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;基本情報の派生形知識の習得&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;応用情報技術者資格取得のため&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>応用情報技術者試験 問題集</title><link>https://tutttuwi.github.io/posts/2017_06_ap_%E5%95%8F%E9%A1%8C%E9%9B%86/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2017_06_ap_%E5%95%8F%E9%A1%8C%E9%9B%86/</guid><pubDate>Thu, 01 Jun 2017 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;応用情報技術者試験 教科書&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2017_06_ap_exercise.JPG&quot; alt=&quot;2017_06_ap_exercise&quot; title=&quot;2017_06_ap_exercise&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;基本情報の派生形知識の習得&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;応用情報技術者資格取得のため&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>データサイエンティスト養成読本</title><link>https://tutttuwi.github.io/posts/2017_06_%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%82%B9%E3%83%88%E9%A4%8A%E6%88%90%E8%AA%AD%E6%9C%AC/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2017_06_%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%82%B9%E3%83%88%E9%A4%8A%E6%88%90%E8%AA%AD%E6%9C%AC/</guid><pubDate>Thu, 01 Jun 2017 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;データサイエンティスト養成読本&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2017_06_da.JPG&quot; alt=&quot;2017_06_da&quot; title=&quot;2017_06_da&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;データサイエンティストとは&lt;/li&gt;
&lt;li&gt;Pythonの環境構築/使用&lt;/li&gt;
&lt;li&gt;R言語の環境構築/使用&lt;/li&gt;
&lt;li&gt;※もう一回読みたい書籍&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ApacheSparkを使ったデータ分析をする機会があり、データ分析関連知識の習得のため&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>SEの基本</title><link>https://tutttuwi.github.io/posts/2017_04_se%E3%81%AE%E5%9F%BA%E6%9C%AC/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2017_04_se%E3%81%AE%E5%9F%BA%E6%9C%AC/</guid><pubDate>Sat, 01 Apr 2017 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;SEの基本&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2017_04_se.jpg&quot; alt=&quot;2017_04_se&quot; title=&quot;2017_04_se&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;目次
&lt;ul&gt;
&lt;li&gt;0章　SEって、いったい何をする人？&lt;/li&gt;
&lt;li&gt;1章　SEには、どんなテクニカルスキルが必要か&lt;/li&gt;
&lt;li&gt;2章　ソフトウェアエンジニアリングを意識したスキルを形成する&lt;/li&gt;
&lt;li&gt;3章　プロジェクトに必要なリーダーシップとチームワーク&lt;/li&gt;
&lt;li&gt;4章　プロジェクトを成功に導くマネジメントスキル&lt;/li&gt;
&lt;li&gt;5章　これだけはマスターしたいヒューマン系スキル&lt;/li&gt;
&lt;li&gt;6章　SEとしての自覚と心構え&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;テクニカルな情報というより、概念的、心構え的な知識を習得することが出来た&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;２年間SEとして動いてきて、そもそもSEとしての基本とはなにか、振り返り、答え合わせがしたかったので購入&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;学習メモ&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;【読書】SEの基本
1 SE、プログラマーって何？
様々な職種のエンジニアを技術的に統括し、システム開発全体を制御、管理する職種
2 様々なシステム開発に関わる職種
プロジェクトマネージャー
テクニカルリーダー
スタッフ
チームリーダーはプロジェクトマネージャーを指すことが多い
SEがカバーする範囲は広いので求められる期待値は大きい
皆、SEを目指すことになるだろう
3 スキル標準における位置づけを知ろう
ITSS 情報システムの企画から運用 保守に至るまで必要とされる実務能力を明確化、体系化した指標
いろんな使われ方をする。企業が、個人が、教育機関が、行政が、、
対象は下記4種
ITアーキテクト
プロジェクトマネージメント
ITスペシャリスト
アプリケーションスペシャリスト
全てを習得する必要はない。
しかし、最低限必要な技術力やマネジメント能力があることも確か。
最低限必要な「テクニカルスキル」「マネジメントスキル」「ヒューマンスキル」についてみていく
4 SEがする仕事の全体像
SEの仕事は「システムに対する要求をヒアリングする」ところから始まるわけではない
作業
顧客 経営戦略策定
SE 戦略的情報化企画
SE 開発
SE 運用・保守
SEに求められるスキルは
・顧客のビジネス戦略・課題に対するITソリューションを構築するスキル
・さまざまな技術を用いて要件を満たす情報システムを構築するスキル
・プロジェクトをマネジメントするスキル
・上記３つを実行するためのヒューマンスキル
5 SEが活躍する会社
ユーザ企業
SI企業（元請け）・SI企業（下請け企業）
ベンダー企業
それぞれ経験できる領域が異なる。
初めはプログラミングを経験できる環境が良いでしょう。
6SEの最大のミッション
第1章 SEにはどんなテクニカルスキルが必要か
1 工学的手法をもってソフトウエア開発に臨む
場当たりシステム開発からの脱却
◎プロフェッショナルな開発
ソフトウエアの構造について説明がつかなければいけない。
大工でいうと犬小屋ではなく、高層ビルを建てているのです。
◎ソフトウエア工学
ソフトウエア開発を量的、質的に向上させるための学術的分野
企画から運用までを明確な行程にわけて工程ごとに課題を解決する工学的手法によって質を向上
◎SWEBOK
ソフトウエア工学に関する理論、方法論、ツール、ノウハウといった知識体系が整理されIEEEにより制定
安定した品質を提供できるようになろう
2 業務分析がシステム開発のカギ
まず、システム化戦略の策定が必要
アプローチ方法
・トップダウン
ビジョン⇨戦略 ITを武器に戦略を策定
・ボトムアップ
戦略⇨ビジョン 阻害要因を排除するため
BSCを用いる
3 ビジネスモデリング
システム要件を導く論理的手法
ビジネス構造を表現するというもくてきで使用する場合
作成する図をビジネスモデル、ビジネスモデルを作成する過程をビジネスモデリングという
◎ビジネスモデリングで表現するもの
外部ビュー 顧客パートナーに対してどのようなサービスを提供しているか
内部ビュー 製品 社員などの関係
◎ビジネスモデリングの目的
重要なのはなんのために実施するのか
目的を持って実施することになる
◎業務を支える情報システムを検討
現状のビジネス構造をモデル化し、システムを導入することで業務プロセスを最適化するスタイルでなければシステムは使いづらく、問題解決に繋がりません
◎業務パッケージの導入
業務に成熟していない組織に対しては一定の効果が見込めるが、パッケージに依存した業務構造となりそこからビジネス構造を変えることが難しくなる
◎ビジネスモデリング例
■ビジネスユースケースモデル（外部ビュー）
■ビジネス分析モデル（内部ビュー）
4 分析術！ コンサルティングツールの選択と活用
「超上流」 システム開発に入るまでにビジネス課題に適合したシステムを検討する上流工程
◎3C分析
市場（customer）
競合（competitor）
自社（corporation）
市場と競合からその事業に対する成功要因KSFを分析し、自社の現状とギャップから市場にどのように打って出るかを検討し、ビジョンや戦略を導きだします。
◎SWOT分析
企業の内部と外部の環境を適合させた戦略を立案するためのツール
企業の目標が明確になっている必要がある
◎7S分析
企業における7つの経営資源の頭文字を表したもの
企業の戦略を考えるときに考慮すべきポイントとされている
●ハードのＳ
戦略
組織
システム
●ソフトのＳ
価値観
スキル
人材
スタイル
◎5Force
業界に影響する5つの力（脅威）を分析することで、業界の収益構造を理解し、適切な事業参画や経営資源の投入を判断するためのツール
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>HTML5プロフェッショナル認定Level1 マイナビ</title><link>https://tutttuwi.github.io/posts/2017_04_html5%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E8%AA%8D%E5%AE%9A_%E3%83%9E%E3%82%A4%E3%83%8A%E3%83%93/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2017_04_html5%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E8%AA%8D%E5%AE%9A_%E3%83%9E%E3%82%A4%E3%83%8A%E3%83%93/</guid><pubDate>Sat, 01 Apr 2017 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;HTML5プロフェッショナル認定Level1 マイナビ&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2017_04_html5.jpg&quot; alt=&quot;2017_04_html5&quot; title=&quot;2017_04_html5&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://book.mynavi.jp/ec/products/detail/id=38366&quot;&gt;目次&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;HTML/CSSの基礎&lt;/li&gt;
&lt;li&gt;HTML要素、CSSのクラス、疑似クラスなど&lt;/li&gt;
&lt;li&gt;セレクタの優先順位&lt;/li&gt;
&lt;li&gt;手を動かしながら、実際にサンプルページを自分で作成しつつ少しずつ覚えた&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;HTML5/CSSを活用したWeb開発のための知識習得&lt;/li&gt;
&lt;li&gt;資格認定の為&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;学習メモ&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;
######################################################################
# HTML5認定試験対策メモ
######################################################################


■Chapter1  HTMLの基礎知識
■====================================================================

■1-1.HTML5の基本文法
・空要素(void element)には終了タグを指定できない
・空要素のタグの&amp;gt;の直前にはスラッシュを入れても良い
・空白文字
半角スペース、タブ、改行(CR,LF,FFを含む)を纏めて空白文字と言います。
・属性を指定する際に「=」の前後には空白文字を入れることができ、属性値を
囲う引用符(「&quot;」または「&apos;」)は省略することが出来ます

・属性値を囲う引用符が省略できるのはその文書がHTML構文で書かれていて
属性値に空白文字の他に「=」「&quot;」「&apos;」「&amp;gt;」「&amp;lt;」「`(グレーブアクセント)」を含んでない場合に限ります
また属性値がからの場合は省略出来ません。

・HTML5文書の先頭にはオプションでBOM(バイトオーダーマーク)を入れることができる

・DOCTYPE宣言
ブラウザの表示モードを「標準モード」にする目的で指定することになっている

・文字参照
ソースコード内にそのまま記入出来ない文字などをテキストに書き入れられるようにするために、
HTMLでは文字参照という特別な書式を利用することが出来ます。

・グローバル属性
すべての要素に共通して指定できる属性のこと


◆練習問題
◆====================================================================
①HTML5のDOCTYPE宣言として妥当なもの
②状況によっては開始タグと終了タグの両方を省略できるものはどれか
・html
・head
・body
・colgroup
・tbody
のみ！
③空要素のタグ指定方法
/の後ろに空白スペースを記入できない
空要素には終了タグを記入できな
④DOCTYPE宣言の中でHTML5では使用できないもの

⑤HTML5のコメント記述方法として正しくないもの
「&amp;lt;!--」「--&amp;gt;」は続けて書く必要がある
コメント内部のテキストは - で終了することは出来ない

⑥論理型属性であるhidden属性の指定方法として間違っているものを選択
&amp;lt;div hidden=&quot;true&quot;&amp;gt; ～ &amp;lt;/div&amp;gt;
引用符も省略できるが、true,falseで指定することはできない

⑦HTML5のclass属性またはid属性の値の指定方法として間違っているものはどれか
id=&quot;&quot;
id=&quot;abc xyz&quot;
id属性は空文字は許さない
id属性は空白を含むことが出来ない


⑧HTML5で利用可能な属性のうち、任意の要素に指定可能でないものはどれか
data属性：object要素にしか指定できない





■Chapter2  HTML5で追加された要素
■====================================================================
◯セクショニングルート
・body要素
・blockquote要素
・fieldset要素
・figure要素
・td要素

◯セクションを表す要素の種類
・section
・article
記事を始めとする、「それだけで全部の/それだけで完結している」セクションを表す場合に使用します
単独で配布・再利用可能なコンテンツに対して使用し、記事のほかにもブログのコメントやフォーラムの投稿、
インタラクティブなウィジェットやガジェットなどをマークアップする際にも利用できます。
・aside
前後の内容とほぼ関係がなく、それらとは分離されたものであると考えられるセクション
・nav
そのページにおけるナビゲーションのリンクを含むセクションを表す場合に使用します。

◯構造を示す要素
・header要素

・footer要素

・main要素
main要素の内容には、そのページに特有のコンテンツのみを入れ、サイト内の複数のページで共有しているナビゲーションや
ロゴ、検索フォーム、著作権情報などのコンテンツは含めないようにする
main要素は1つのHTML文書につき1つしか配置出来ない

◯テキスト
・mark要素
黄色いマーカー線で表示して目立たせる
オリジナルの文書がそうなっていたわけではないが、
それを引用した人が読者に注目してもらいたいので目立つようにする場合などにも使用されます
その他、検索結果の一覧で、検索に使用した単語を目立つようにする場合などにも使用されます

・data要素
人が普通に読み取り可能な要素内容とともに機会読み取りが可能なデータも提供する要素
機械読み取りが可能なデータは、必須属性であるvalue属性の値として指定します

・time要素
data要素を日時での使用に特化させた要素

・wbr要素
通常、英単語やURLなどはいくら長くてもその途中で行を折り返すことはアリません。
英単語やURLの途中でも行を折り返すことができるようにする要素です。

・bdi要素
特定の範囲のテキストだけを意図的に分離・独立させることができる

◯ルビ
・ruby要素

・rt要素
ルビ(ひらがな)として小さい文字を表示させるテキスト
ruby関連要素の終了タグは省略可能

・rb要素
漢字の部分を示すための要素
なくてもいいが、細かく分ける場合は必要
&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;漢字&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;かんじ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;
&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;漢字&amp;lt;rt&amp;gt;かんじ&amp;lt;/ruby&amp;gt;
&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;漢&amp;lt;/rb&amp;gt;&amp;lt;rb&amp;gt;字&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;かん&amp;lt;/rt&amp;gt;&amp;lt;rt&amp;gt;じ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;
&amp;lt;ruby&amp;gt;漢&amp;lt;rb&amp;gt;字&amp;lt;rt&amp;gt;かん&amp;lt;rt&amp;gt;じ&amp;lt;/ruby&amp;gt;

・rp要素
ルビ未対応のブラウザで表示させるときに、()カッコくくりでルビを表示させるための要素

&amp;lt;ruby&amp;gt;漢字&amp;lt;rp&amp;gt;(&amp;lt;/rp&amp;gt;&amp;lt;rt&amp;gt;かんじ&amp;lt;/rt&amp;gt;&amp;lt;rp&amp;gt;)&amp;lt;/rp&amp;gt;&amp;lt;/ruby&amp;gt;
&amp;lt;ruby&amp;gt;漢字&amp;lt;rp&amp;gt;(&amp;lt;rt&amp;gt;かんじ&amp;lt;rp&amp;gt;)&amp;lt;/ruby&amp;gt;
&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;漢&amp;lt;/rb&amp;gt;&amp;lt;rb&amp;gt;字&amp;lt;/rb&amp;gt;&amp;lt;rp&amp;gt;(&amp;lt;/rp&amp;gt;&amp;lt;rt&amp;gt;かん&amp;lt;/rt&amp;gt;&amp;lt;rt&amp;gt;じ&amp;lt;/rt&amp;gt;&amp;lt;rp&amp;gt;)&amp;lt;/rp&amp;gt;&amp;lt;/ruby&amp;gt;
&amp;lt;ruby&amp;gt;漢&amp;lt;rb&amp;gt;字&amp;lt;rp&amp;gt;(&amp;lt;rt&amp;gt;かん&amp;lt;rt&amp;gt;じ&amp;lt;rp&amp;gt;)&amp;lt;/ruby&amp;gt;


・rtc要素
rt要素をグループ化する要素
ルビは↑だけでなく下(左)にもつけることが出来ます。

&amp;lt;ruby&amp;gt;漢字&amp;lt;rt&amp;gt;かんじ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;

◯動画・音声
・video要素
動画を再生させるための要素

・audio要素
音声を再生させるための要素

・source要素
代替データとして異なる形式のデータも併せて指定しておきたい場合

・track要素
動悸させる外部のテキストトラック(字幕などのテキストデータ)を指定する場合に使用します。

・embed要素
プラグインを使用する外部コンテンツを組み込む際に使用される要素


◯フォーム
・meter要素
メーターとして使用する要素です。
特定の範囲内での位置を示す場合に使用します。

・progress要素
タスク(コンピュータが行っている作業)の進み具合を表すための専用要素

・datalist要素
input要素にサジェスト機能を追加する(入力候補の選択肢を与える)要素
datalist要素の中に入れたoption要素が選択肢となります。

&amp;lt;p&amp;gt;
	&amp;lt;label&amp;gt;
		取得したい資格：
		&amp;lt;input type=&quot;text&quot; name=&quot;c&quot; list=&quot;certifications&quot;&amp;gt;
		&amp;lt;datalist id =&quot;certifications&quot;&amp;gt;
			&amp;lt;option value=&quot;HTML5プロフェッショナル認定試験&quot;&amp;gt;
			&amp;lt;option value=&quot;ウェブデザイン技能検定&quot;&amp;gt;
		&amp;lt;/datalist&amp;gt;
	&amp;lt;/label&amp;gt;
&amp;lt;/p&amp;gt;

・output要素
計算結果やユーザーの操作による結果を示すための要素
&amp;lt;form onsubmit=&quot;return false&quot; oninput=&quot;sum.value=a.valueAsNumber+b.valueAsNumber&quot;&amp;gt;
	&amp;lt;input name=&quot;a&quot; type=&quot;number&quot;&amp;gt; + 
	&amp;lt;input name=&quot;b&quot; type=&quot;number&quot;&amp;gt; = 
	&amp;lt;output for=&quot;a b&quot; name=&quot;sum&quot;&amp;gt;&amp;lt;/output&amp;gt;
&amp;lt;/form&amp;gt;


・keygen要素
公開鍵暗号における公開鍵・秘密鍵のペアを生成するフォーム部品
フォームを送信すると秘密鍵はローカルに保存され、公開鍵はサーバーに送られます
この要素は空要素です。


◯その他の新要素
・figure要素
figureという英単語は、図・図表、挿絵などの意味を持つ
それがメインコンテンツの本文から参照される図版のようなコンテンツであることを示します
具体的な要素内容としては、図表・写真・イラストソースコードの一部のような、
それ自身がまとまった一つの完結した内容になっているFlow content(一般コンテンツ)を入れます

&amp;lt;p&amp;gt;
CSSを使用すると、影を表示させることが出来ます。(&amp;lt;a href=&quot;#&quot;&amp;gt;図版01&amp;lt;/a&amp;gt;)
&amp;lt;/p&amp;gt;
&amp;lt;figure id =&quot;fig01&quot;&amp;gt;
&amp;lt;figcaption&amp;gt;図版01：CSSでボックスに影を表示させる例&amp;lt;/figcaption&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;.sample {
	box-shadow: 3px 3px 10px #999;
	}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;
&amp;lt;/figure&amp;gt;

・figcaption
figure要素で表す図版のキャプションや説明文部分をマークアップするための専用要素
figure要素の一番前か一番後ろにしか配置できない点に注意する

・template要素
その範囲がスクリプトによって生成(複製・挿入)される部分であることを示す要素

・canvas要素
スクリプトによって描画するビットマップの動的なグラフィックとなる要素






■Chapter3  HTML5で変更・廃止された要素
■====================================================================

◯HTML5で変更された要素
・hr要素
従来：横罫線を表示させるための空要素
コンテンツの内部的に「段落レベルで主題が変わるところ(区切り・変わり目)」を示す
話題が変わるところや、物語の場面が変わる所など

セクションはそれ自体が主題の区切りを示す為、セクショントセクションの間にhr要素を入れる必要はアリません
hr要素はセクション内部の段落レベルでの区切りを示すために使用します。

・small要素
従来：テキストを小さなフォントサイズで表示させるためのものでした
「一般的に小さな文字で示される付帯情報」をマークアップする為に使用します。
具体的には、Copyrightの表記や帰属、免責事項、警告と言った部分で使用されます


・strong要素
従来：em要素よりも強い協調を示す要素
「重要性」「重大性」「緊急性」のあるコンテンツをマークアップするために使用します

strong要素が重なれば重なる程その度合は強くなります。

・b要素
従来：テキストを太字で表示させるためのもの
重要性やその他の特別な意味合いは持たずに、実用的な意味で目立たせたほうが良いと思われる部分をマークアップする為に使用
具体的には、レビュー記事における製品名、概要説明に於けるキーワード、記事のリード文など

・i要素
従来：テキストをイタリックで表示させるためのもの
学名のほか英文中での船名、専門用語、言語が異なっている部分、小説などにおける頭のなかで考えていることの表現など、
普通のテキストとは違う性質のものに切り替わっているような部分を示す

・s要素
従来：取り消し線を引いた状態で表示させるためのもの
既に正しい情報ではなくなった部分、関係のない情報となってしまった部分を表すために使用します。

文書の編集によって削除された部分はs要素を使用せずに、del要素を使用します。


・u要素
従来：テキストに河川を引いた状態で表示させるための要素
耳で聞いてもわからないけれども表示上は明確に示される、テキスト以外で注釈的な表現をする
範囲をマークアップするために使用します。
用途は、中国語でテキストが固有名詞であることを示す場合や、スペルミスの箇所を示す場合などと限定的で、一般的なページでは
ほとんど利用されない要素

リンク付き要素とかぶってしまうため、それらの要素と混在するのは避けられる。


◯HTML5で廃止された要素
・center要素やfont要素といった表示指定の要素派廃止された
・small要素は利用可能だが、big要素は廃止された
・s要素は利用可能だが、strike要素は廃止された



◯HTML5で廃止された属性
・alignやbgcolorといった表示指定の属性は基本的にすべて廃止された
・一部の要素を覗いてname属性は廃止され、代わりにid属性が使用される
・あまり使われていなかった属性、他の機能で代用可能な属性の多くも廃止された



■Chapter4  HTML4.01以前からある要素
■====================================================================
◯基本構造
▼ココが重要
・html要素のversion属性は廃止され、新しくmanifest属性が追加された
・HTML5では、titile要素がなくても良いケースがある
・address要素はもっとも近いarticle要素またはbody要素の問合せ先

▼html要素
manifest属性：アプリケーションキャッシュマニフェスト(キャッシュさせるファイル、させないファイルなどの情報を
明記したテキスト形式のファイル)を指定するための属性

・補足
html要素の開始と終了タグは、その直後にコメントがなければ省略することも可能

・注意
HTML5にはHTML構文とXHTML構文がアリますが、タグの省略が可能なのはHTML構文だけである

▼head要素
HTML文書のMetadata content(文書情報コンテンツ)を入れるための要素

▼body要素
HTML文書のコンテンツを入れるための要素です。

▼title要素
HTML文書のタイトル、または名前であることを示す要素
head要素の中に記載する。

title要素は1つのhtml文書につき1つしか配置できない点に注意してください。


▼base要素
HTML文書内で指定されている相対URLの基準にするURLを設定する為の要素です。
必ずhead要素内で使用
target属性を使用することでデフォルトの表示先(ブラウジングコンテキスト)を
設定しておくことも出来ます。

・ブラウジングコンテキスト
HTML5の仕様書では、HTML文書を表示させるウィンドウやタブ、インラインフレームなどのことを
ブラウジングコンテキストと呼んでいます。

・注意
1つのHTML文書につき1つまで
少なくともhref属性かtarget属性のいずれか一方を指定する必要がある
base要素で指定した基準URLはhtml属性のmanifest属性で指定する
アプリケーションキャッシュマニフェストのURLには影響を与えない点に注意

▼meta要素
様々な種類のメタデータを指定できる要素
・メタデータ
あるデータに関するデータのことを指す一般的な用語で、
HTML文書でいうと、「HTML文書自身に関する情報」のことです。
HTMLのhead要素内に入れられる要素は基本的にすべてメタデータであるといえます。

・プラグマディレクティブ/プラグマ指示子
HTML文書の状態や挙動を支持する命令のこと
たとえばブラウザへの再読込や他文書への移動の命令、デフォルトのスタイルシート言語やスクリプト言語の設定、
文字コードの宣言などがこれに当たります。
meta要素にhttp-equiv属性が指定されているとき、そのmeta要素はプラグマディレクティブとなります。

▼address要素
自分自身に最も近いarticle要素またはbody要素の内容に関する問い合わせ先を示す要素

・ココに注意
address要素の内容に入れられるのは、問合せ先の情報だけです。
著作権情報や更新日のような問合せ以外の情報は入れられませんので注意してください

▼div要素
予め決められた役割や意味を持たない要素です。
似た要素としてspan要素があります
違いはインライン要素/ブロックライン要素でしたが、
HTML5ではそのような分類はされなくなりました。


▼span要素

◯テキスト
・h1～h6要素はセクションの見出しを表す
・blockquote要素の内部には、footer要素やcite要素を配置できる
・cite要素は作品のタイトル・作者名・参照先URLのいずれかを示す

▼h1～h6要素
セクションの見出しとなる要素

▼p要素
段落を表す要素

▼blockquote要素
要素内容が引用してきた文書であることを示す
ブロックレベル要素：blockquote
インライン要素　　：q
指定できる属性：cite属性


▼q要素
その要素内容が引用してきた文書であることを示す
インライン要素で使用

指定できる属性：cite属性

▼cite要素
創作物に言及する際にそのタイトルを示すための要素
要素内容には、作品の題名か作者の名前(個人・団体・組織も可)、参照先のURLのいづれかを含めなければなりません。

▼ins要素
文書に追加した部分(inserted text)を示す為に使用

◯指摘できる属性
・cite
・datetime

ins要素のコンテンツモデルはトランスペアレント

▼del要素
文書から削除した部分を示す

del要素のコンテンツモデル派トランスペアレント

▼em要素
強調されている部分を示すための要素

▼br要素
その位置で改行さえるための空要素
改行がコンテンツの一部であるような部分で使用します。
余白をとるために使用したり、段落のように見せるために改行として使用するものではアリません。


▼abbr要素
略語であることを示す。
省略していない状態の言葉を示すには、title属性を指定する。

※注意
title属性は補足情報を提供するグローバル属性ですが、
abbr要素で使用する場合、「省略してない状態の言葉を示す」以外の用途には使用できない点に注意

・すべての略語に対してabbr要素を指定する必要はない。使いたいときだけ！
・abbr要素の他にacronym要素も以前はあったが、使い分けに混乱が生じたので、廃止になった


▼dfn要素
その部分が定義の対象となっている用語であることを示す。

▼pre要素
その要素内容であるテキストが整形済み(performatted)であることを示す要素
ここで言う整形とは、半角スペースやタブ、改行を使って表示を整えているという意味で、
pre要素の要素内容は入力されているとおりにそのまま表示されます。
ただし具体的にどのように表示させるかはCSSで指定可能です。
・ソースコード
・アスキーアート
・メール内容

※注意
HTML構文の場合、pre要素の開始タグ直後にある改行は取り除かれる事になっている


▼code要素
その部分がコンピュータで使用されるソースコードであるということを示す要素

▼samp要素
コンピュータのプログラムやシステムからの(サンプル)出力であることを示す

▼kbd要素
ユーザーが入力する内容であることを示す要素

▼var要素
その部分が変数(variable)であることを示す要素

▼bdo要素
Unicodeの双方向アルゴリズムの文字表記の方向を上書きして指定する
要素内容のテキストを左から右へと表示するのか、右から左へと表示するのかをグローバル属性であるdir属性を使って設定する要素

▼sup要素
その部分が上付き文字要素であることを示す

▼sub要素
その部分が下付き文字要素であることを示す






◯リスト
※ココが重要
・HTML5ではul要素 / ol要素 / dl要素の内容はからでもOK
・HTML5のdl要素で用語をの定義をする場合、dfn要素も必要になる
・HTML5のdl要素は、会話・対談を表す場合には使用できない

▼ul要素
箇条書きのようなリスト

▼ol要素
連番つけられた項目を持つリスト

※指定可能な属性
・type
・start
・reversed

▼li要素
リストの各項目人なる要素

▼dl要素
内容となる各項目が「名前(dt要素)」「値(dd要素)」のペアになっている形式のリスト

※注意
・HTML5ではdl要素の要素内容はからでもOK。また必要に応じてtemplate要素とscript要素を配置することもできる

以前：dl要素 definition listを意味
HTML5:dl要素 description listを意味
これによってdl要素から「定義」の意味がなくなった為、dl要素を「用語の定義」に使用する場合には、
次のようにdfn要素(定義対象の用語であることを示す要素)を追加する必要がある点に注意

▼dt要素
名前(用語)などを示す

▼dd要素
値(説明文等)


◯リンク
※重要
・a要素のコンテンツモデル派条件付きのトランスペアレント
・a要素にはdownload属性が追加されている
・link要素にはsizes属性とcrossorigin属性が追加されている

▼a要素
要素内容がハイパーリンクになります。

▼link要素
関連する別の文書やファイルなどを示すための空要素href属性とrel属性は必ず指定する必要があります。
href属性とrel属性は必ず指定する必要があります。

◯画像とオブジェクト
※重要
・HTML5では、特別なケースにおいてはimg要素のalt属性を省略できる
・HTML5では、width属性とheight属性に％値は指定できない
・map要素とobject要素のコンテンツモデルはトランスペアレント

▼img要素
src属性で指定したアドレスの画像を表示させる空要素

▼map要素
イメージマップを定義するための要素

▼area要素
イメージマップでリンクする領域を定義する空要素

▼object要素
様々な形式の外部データを組み込むための要素
画像や別のHTML文書、プラグインを使用するデータなども組み込むことが出来ます。

▼param要素
object要素によって呼び出されるプラグインのパラメータを設定する要素

◯フォーム
※重要
・HTML5では、フォーム関連の属性が多数追加されている
・input要素で作成可能な部品の種類は、HTML5になって約2倍に増えた
・form要素の外部にある部品でも、form要素に関連付けることが可能となった
▼form要素
フォーム関連の要素をとりまとめ、ユーザーが入力・選択したデータをサーバーに送信するための要素

▼input要素
type属性で指定したキーワードによって様々な種類の入力・選択用部品となる要素

▼textarea要素
複数行のテキストフィールドとなる要素

▼button要素
要素内容がそのままラベルとして表示されるボタン

▼select要素
選択肢の中から選ぶ形式のフォーム部品になる要素

▼option要素
select要素またはdatalist要素の選択肢となる要素

▼optgroup要素
option要素をグループ化してそこにグループの名前をつける要素

▼label要素
その要素内容であるラベルとフォーム部品とを関連付けるための要素

▼fieldset要素
フォーム関連の要素をグループ化するための専用要素

▼legend要素
fieldset要素によってグループ化されたフォーム関連要素のグループ名(キャプション)を表示させるための要素
枠で囲われるやつね！


◯テーブル
※重要
・table要素のborder属性は、レイアウト用のテーブルではないことを示す
・tfoot要素は、tbody要素の前にでも後ろにでも配置できる
・table要素内で使用する要素の多くは、終了タグを省略できる

▼table要素
表形式のデータを表すための要素

※注意
table要素のborder属性は以前は表の線の太さを指定するために使用されていましたが、
HTML5ではレイアウト用のテーブルではないことを示す目的で使用されます。
その為、値には1か空文字以外は指定できなくなっている点に注意！！

※説明補足
HTML5の仕様書には、「テーブルをレイアウトのために使用するべきではない」と明確に記載されている
また、「もし、テーブルをレイアウトの為に使用するのであれば、role=&quot;presentation&quot;を指定しなければならない」
とも書かれています。

▼tr要素
表の横一列を表すために使用

▼th要素
表の見出し用のセルを表すために使用

▼td要素
データ用のセルを表す要素

▼thead要素
見出しとなっているtr要素をグループ化する要素
簡単に言えば表のヘッダーを表す要素

▼tbody要素
表の本体部分を表す

▼tfoot要素
表のフッター部分を表す

※注意
以前はtfoot要素は必ずtbody要素よりも前に配置する必要が有りました。
HTML5ではtfoot要素はtbody要素の前でも後ろでも配置出来ます。
ただし1つのtable要素内に複数のtfoot要素を配置することは出来ません。

▼caption要素
table要素のキャプション(表のタイトル)となる要素


▼col要素
span属性のないcolgroup要素内に配置して、1列分以上の縦列を表す空要素
col要素にspan属性を指定していなければ、１列分の縦列を表し、span属性を指定して値に１以上の整数を指定していればその列分の
縦列となります。

▼colgroup要素
1列分以上の縦列をグループ化する要素
※注意
colgroup要素にspan属性を指定している場合は、colgroup要素の要素内容は空にします。
span属性を指定していない場合は、0個以上のcol要素かtemplate要素を入れます。


◯その他
※重要
・iframe要素のsrcdoc属性には、HTML文書全体を記入できる
・script要素のtype属性のデフォルト値は「text/javascript」で省略も可能
・noscript要素はXHTML構文では使用できない

▼iframe要素
HTML文書の中で、別の文書を表示させる領域(ブラウジングコンテキスト)となる要素
「iframe」は「inline frame(インラインフレーム)」の略


▼script要素
HTML文書内にスクリプトまたはデータブロックを組み込む為の要素

▼noscript要素
スクリプトが向こうの場合に利用されるコンテンツを要素内容としてもつ要素









■Chapter5  CSSの基礎知識
■====================================================================

◯CSSの基本文法と組み込み方
※重要
・CSSの書式には自由に空白文字を入れられるが、セレクタだけは例外
・HTML5では、link要素とstyle要素のtype属性が省略可能となった
・link要素とstyle要素のmedia属性と@importにはメディアクエリが指定可能

▼基本的な書式と各部の名称

▼link要素でHTMLに組み込む
head要素の中にlink要素を指定してHTMLに埋め込む方法

▼style要素でHTMLに読み込む
要素内容としてスタイルシート言語を組み込むことのできる要素

▼style属性でHTMLに組み込む
グローバル属性であるstyle属性を指定して、その値としてCSSを組み込む方法

▼@importでCSSに組み込む
@importの書式を使用することで、CSSの中で更に外部スタイルシートを読み込ませる事もできます。
最も簡単な方法は、次のように@importの後に外部スタイルシートのURLを文字列として指定する方法
文字列として指定するので、ダブルクォーテーションまたはシングルクォーテーションが必要です。

@import &quot;style.css&quot;;

@import url(style.css);

URLの後には、link要素やstyle要素で指定可能なメディア型やメディアクエリを指定することもできる
@import &quot;style.css&quot; screen, print;


◯セレクタ
※重要
・属例セレクタと結合子の記号はしっかりと覚える
・擬似クラスの式「an+b」の指定方法をしっかりと覚える
・疑似要素の先頭のコロンはCSS3から2つになった


▼セレクタの種類と組み合わせのルール

▼タイプセレクタ
要素名をそのまま使って適用先を示すシンプルセレクタをタイプセレクタと言います。

▼ユニバーサルセレクタ
要素名の代わりに(*)を指定すると、すべての要素が適用対象となります。

▼クラスセレクタ

▼IDセレクタ

▼属性セレクタ　NEW!!
特定の属性が指定されている要素、またhあ特定の属性に特定の値が指定されている要素を適用対象として指定できるのが属性セレクタです。

img[src$=&quot;.jpg&quot;] { border: 3px solid #f00 }


▼リンク関連の擬似クラス
ある要素が特定の状態にあるときなどに限定して適用対象とするのが擬似クラス
CSS3では23種類の擬似クラスが定義されていますが、はじめに使用頻度の高いリンク関連の擬似クラスを説明
・:link     リンク先をまだ見ていない
・:visited  リンク先を既に見た状態
・:hover    カーソルが上にある状態
・:active   マウスのボタン等が押されている状態

※注意
同時になる状態がある場合は、後に指定されたほうが有効になるので、
基本的に上記の順序で指定しなければならない！！


▼その他の擬似クラス

▼疑似要素
要素ではない部分(タグのつけられていない範囲)を適用対象とする
CSS3では次の4種類の疑似要素が定義されている

・::first-line     ブロックレベル要素の一行目
・::first-letter   ブロックレベル要素の1文字目
・::before         要素の直前にコンテンツを追加
・::after          要素の直後にコンテンツを追加


▼結合子
組み合わせたシンプルセレクタ同士を区切って使用する結合子には次の4種類がある

・空白文字  セレクタAの中に含まれているセレクタB
・&amp;gt;         セレクタAの直接の子要素であるセレクタB

・+         セレクタAの直後に現れるセレクタB
・~         セレクタAよりも後に現れるセレクタB


◯CSS適用の優先順位
※重要
・ユーザーエージェント・ユーザー・制作者の優先度は!importantで逆転する
・詳細度が最も高いのはstyle属性による指定
・セレクタの詳細度は、IDセレクタ・属性系セレクタ・要素系セレクタの3桁で示す

▼CSSの指定元による優先順位


▼!importantで優先順位を高くする

▼セレクタの詳細度による優先順位の計算方法






































■Chapter6  CSS3の主な新機能
■====================================================================
◯色
※重要
・CSS3からは色の値が指定可能なすべての箇所でtransparentが使用可能
・不透明度は0.0~1.0までの単位をつけない数値で指定する
・hslは、hue(色相)・saturation(彩度)・lightness(明度)の意味

▼色を示す値：16進数

▼色を示す値：キーワード

▼色を示す値：rgb(),rgba()
rgb()という関数形式の書式を使用すると、RGBの値を10進数のまま指定可能

▼色を示す値：hsl(), hsla()
直感的に色を指定したり変更できるようにするために作られたもの


▼colorプロパティ
テキストの文字色を設定するプロパティです。


▼opacityプロパティ
要素の不透明度を設定するプロパティ


◯背景
※重要
・CSS3では複数の背景画像が指定できる
・CSS3では背景の表示領域を変更できる
・CSS3では背景画像のサイズが指定できる

▼ボックスの構造

▼長さを表す単位

▼background-colorプロパティ
ボックスの背景色を設定するプロパティ

▼background-imageプロパティ

▼background-clipプロパティ
背景をボックスのどの領域に表示させるのかを設定するプロパティ

▼background-repeatプロパティ
背景画像を縦または横に繰り返し表示させるかどうかを設定するプロパティ

▼background-sizeプロパティ
背景画像の表示サイズを設定するプロパティ
1つ目が幅　2つ目が高さ

▼background-originプロパティ
clipの画像版プロパティ的なもの

※注意
背景色も含めた背景の表示範囲を設定するbackground-clipプロパティの初期値は

▼background-positionプロパティ
背景画像を表示させる領域内での画像の配置位置を設定するプロパティ

▼background-attachmentプロパティ
背景画像を表示領域に固定して、ページの内容をスクロールしても動かないようにすることができる

▼backgroundプロパティ
背景関連のプロパティの値を纏めて指定できる

※注意
backgroundプロパティで指定されていない値は現状が維持されるのではなく初期値に戻されるので注意　
backgroundプロパティの値もカンマで区切ることで、複数の背景画像のレイヤーを指定できます。
その際に、background-colorプロパティは一番下のレイヤー(書式上はカンマで区切られた一番右側の値)にしか指定できません


◯アニメーション
※重要
・transform関連プロパティでは、ボックスの回転・拡大縮小・移動などを行う
・トランジションは、値の切り替わりを滑らかに連続した動きで見せる機能
・アニメーションは、キーフレームでトランジションを連続実行させるようなもの

▼回転・拡大縮小・移動など
transformプロパティを使用すると、要素のボックスを回転させたり、
拡大縮小させたり、移動させることなどが出来ます。
しかもそれらは平面的な2次元空間だけでなく3次元空間デモ行える様になっているため、立体的な3D表現も可能


▼transformプロパティ
要素のボックスを回転・拡大縮小・移動・変形さえるプロパティ
値は関数形式になっており、空白文字で区切って必要なだけ指定できます。

▼transform-originプロパティ
transformプロパティの原点を指定するプロパティ

1つ目は横方向の位置
2つ目は縦方向の位置

transform-origin: top loft;
transform: translate(200px, 100px) scale(1.5, 1,5) rotate(45deg);


▼CSS3のトランジションとは
例えば、セレクタの:hoverを使って表示を変更すると、その表示は瞬時に切り替わります。
それを連続した動きで滑らかに変化させるのがCSS3のトランジション


▼transition-propertyプロパティ
「どのプロパティ」の値が変更されたときにトランジションを実行させるのかを設定するプロパティ

▼transition-durationプロパティ
どれだけの時間をかけて変化させるのかを設定する

▼transition-timing-functionプロパティ
トランジション機能で表示を変化させる際、最初から最後まで一定のスピードになっていると、
変化の種類によっては機械的で不自然な印象を与えてしまいます。
そこでゆっくりと変化を開始して徐々にスピードを上げ、だんだんとスピードを落としながら終了すると言ったように
様々なパターンで速度に変化をつけられるようになっています。
その指定を行うのがtransition-timing-functionプロパティです。

▼transition-delayプロパティ
トランジションの開始を遅らせるプロパティ

▼transitionプロパティ
トランジション関連のプロパティの値を纏めて指定できるプロパティ

▼CSS3のアニメーションとは
CSS3のアニメーションとは、ひとことで言ってしまえばトランジションを連続して実行させるようなもの

キーフレームを指定する

▼@keyframes
css3のアニメーションでは、決められた時間の中の度のタイミングでどの値がどう変化するのかをキーフレームと呼ばれる
書式で記入します。

@keyframes 名前 {
  0% {
     プロパティ: 値;
     プロパティ: 値;
     …
  }
  ?% {
     プロパティ: 値;
     プロパティ: 値;
     …
  }
  ?% {
     プロパティ: 値;
     プロパティ: 値;
     …
  }
  100% {
     プロパティ: 値;
     プロパティ: 値;
     …
  }


}


※補足説明
キーフレームの「0%」は「from」、「100%」は「to」と書くことも出来ます。

▼animation-nameプロパティ
アニメーションを実行させるためには、キーフレームを名前で指定し、
アニメーションの再生時間を指定する必要がアリます。animation-nameプロパティは、
キーフレームを名前で指定して実行させるためのプロパティ

▼animation-durationプロパティ
アニメーションの再生時間を設定するプロパティ
transition-durationプロパティと同様に値には時間を設定します。初期値は0sです。


▼animation-timing-functionプロパティ
アニメーションの再生速度の変化パターンを設定するのがanimation-timing-functionプロパティ


▼animation-delayプロパティ
アニメーションの再生を遅らせるプロパティ

▼animation-iteration-countプロパティ
アニメーションを何回繰り返して再生させるのかを設定するプロパティ
初期値は１
inifiniteを指定すると、止めるかウィンドウを閉じるまで再生を繰り返します。


▼animation-directionプロパティ
再生の際に逆再生させるかどうか、または繰り返し再生する中で度のタイミングで逆再生させるのかを設定するプロパティ
初期値はnormalです。


▼animation-paly-stateプロパティ
アニメーションの再生を一時停止させる際に使用するプロパティ
pauseを指定すると一時停止し、runningを指定すると再生が開始されます。

初期値はrunningです。


▼animation-fill-modeプロパティ
animation-delayプロパティによって再生の開始が遅延されている間の表示、及び再生終了後の表示を設定するプロパティ
初期値はnone

▼animationプロパティ
アニメーション関連のプロパティを纏めて指定できるプロパティ


◯マルチカラムとフレキシブルボックス
※重要
・CSS3のマルチカラムレイアウトはボックスの内部を複数の段に分割する
・columnsプロパティで段数を指定するだけで段組みになる。
・display: flex;を指定すると、その子要素は左から順に横に並ぶ

▼マルチカラムレイアウト
複数のボックスを横に並べるタイプのレイアウトではなく、
１つのボックスの内部を複数の段に分割するタイプのレイアウトです。

▼column-countプロパティ
何段組するのかを設定するプロパティ
値には段数を１以上の整数で指定しまうす。
初期値はautoです。

body { column-count: 3; }

▼column-width
段の幅を設定するプロパティ
初期値はauto

▼columnsプロパティ
column-countプロパティとcolumn-widthプロパティを纏めて指定できるプロパティ


▼column-gapプロパティ
段と段の間隔を指定する
初期値はnormal 1em


▼column-ruleプロパティ
段と段の感化kの中央にはボックスのボーダーと同様の線を表示させることが出来ます。
その線種・色・太さを個別に設定するのが次の３つのプロパティ
・column-rule-styleプロパティ
・column-rule-colorプロパティ
・column-rule-widthプロパティ

纏めて設定できるのがcolumn-ruleプロパティです。


▼column-spanプロパティ
指定された要素を段の中におさめて表示させるのではなく、
段組が設定されているボックスの幅いっぱいに(すべての段をまたいで)表示させるプロパティです。
値にはallとnoneが指定でき、初期値はnoneです。

▼フレキシブルボックスレイアウト


◯その他の新機能
※重要
・border-radiusの角丸の値は、角を1/4円に見立てたときの半径を指定する
・box-shadowとtext-shadowの影の指定方法はほぼおなじ
・グラデーション指定の基本形は、方向または中心位置と色を２色指定すればOK

▼border-radiusプロパティ
ボックスの角を丸くするプロパティ

▼box-shadowプロパティ
ボックスに影を表示させるプロパティ

▼text-shadowプロパティ
テキストに影を表示させるプロパティ

▼直線上のグラデーション
CSSの書式で画像が指定可能なところであれば、url()の代わりにlinear-gradient()またはradial-gradient()という関数を使用して
グラデーションを表示させることができる

background: linear-gradient(#ddd, #333);

▼放射状のグラデーション























■Chapter7  CSSの各種プロパティと値
■====================================================================
◯フォント
※重要
・Webフォントを使用するには、@font-face{} の書式を指定する
・CSS3では、font-variantは関連プロパティの値を一括指定するプロパティ
・fontプロパティは、値の指定順序に注意する

▼Webフォント
@font-faceという書式を使用してWeb上にあるフォントを指定することで、そのフォントがインストールされていない
環境でもそのフォントを表示させられるようになります。


▼font-familyプロパティ
フォントの種類を設定するプロパティ
フォントはより前に(左側に)指定されているものが優先して適用されますので、キーワードは最後に指定するように
p{
   font-family: &quot;メイリオ&quot;, &quot;ヒラギノ角ゴ pro W3&quot;, Helvetica, sans-serif;
   
}

▼font-sizeプロパティ
フォントサイズを設定することができる
初期値はmidiumです。

▼font-weightプロパティ
太さの異なる書体を選択するためのプロパティ
初期値はnormal
400が標準の太さ


▼font-styleプロパティ
同じフォントファミリーの中のイタリックまたは斜体の書体を選択するためのプロパティ

・italic   イタリック体専用にデザインされたフォントで表示。ない場合「oblique」と同様
・oblique  斜体で表示。ない場合標準のフォントを斜めに変換して表示
・normal   イタリック体や斜体ではない標準のフォントで表示

▼font-variantプロパティ

▼fontプロパティ
フォント関連プロパティの値を纏めて指定できるプロパティ

◯テキスト
※重要
・CSS3からは、下線・上線・取消線の色や線種が指定できる
・word-breakプロパティは、行の折り返しに関する設定をする
・hyphensプロパティは、ハイフネーションに関する設定をする

▼text-decoration関連のプロパティ

▼word-breakプロパティ
行の折り返しに関する設定

▼hyphensプロパティ
ハイフネーションの設定を行うプロパティ

▼white-spaceプロパティ
「連続する空白文字を１つの半角スペースに変換するかどうか」と「自動的な行の繰り返しを行うかどうか」を制御する

▼text-alignプロパティ
ブロックレベル要素に指定し、その内容の行揃えを設定

▼vertical-alignプロパティ
インライン要素の縦方向の位置を設定する

▼line-heightプロパティ
行の高さを設定するプロパティ

▼text-indentプロパティ
ブロックレベル要素の１行目のインデントを設定する

▼letter-spacingプロパティ
文字間隔を設定するプロパティ

▼word-spacingプロパティ
単語と単語の間隔を設定するプロパティ

▼text-transformプロパティ
アルファベットの大文字小文字を変換して表示させるプロパティ

▼directionプロパティ
文字表記の方向を設定する

ltr：左から右
rtl：右から左

▼unicode-bidiプロパティ
文字表記の方向に関する指示を組み込んだり上書きすることのできるプロパティ
よくわからない。。。


◯ボックス
※重要
・幅と高さの適用される領域は、box-sizingプロパティで設定する
・clearプロパティはブロックレベルの要素に指定する
・displayプロパティは、テーブル関連・ルビ関連の表示形式も指定できる

▼margin関連プロパティ

▼padding関連プロパティ



&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>ORACLE MASTER Oracle Database12c DBA Bronze</title><link>https://tutttuwi.github.io/posts/2016_10_oracle-master_12c_dba_bronze/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2016_10_oracle-master_12c_dba_bronze/</guid><pubDate>Sat, 01 Oct 2016 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;ORACLE MASTER Oracle Database12c DBA Bronze&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2016_10_dba.jpg&quot; alt=&quot;2016_10_dba&quot; title=&quot;2016_10_dba&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;別書籍で知識を付けていたOracleDBAの再学習&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;プロセスやOracleが持っている機能について、別書籍では触れられていない部分を学ぶことが出来た。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;/pdf/OracleMasterBronzeDBA12c.pdf&quot;&gt;学習ログ&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Oracle Master Bronze資格取得のため&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Webを支える技術</title><link>https://tutttuwi.github.io/posts/2016_07_web%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B%E6%8A%80%E8%A1%93/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2016_07_web%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B%E6%8A%80%E8%A1%93/</guid><pubDate>Fri, 01 Jul 2016 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Webを支える技術&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2016_07_web.jpg&quot; alt=&quot;2016_07_web&quot; title=&quot;2016_07_web&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://gihyo.jp/book/2010/978-4-7741-4204-3&quot;&gt;目次&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;WEBの歴史的なところ&lt;/li&gt;
&lt;li&gt;リソースとURI&lt;/li&gt;
&lt;li&gt;使用すべきメソッド&lt;/li&gt;
&lt;li&gt;RESTについて&lt;/li&gt;
&lt;li&gt;理解が難しかったので、もう一回読みたい本..&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;業務でJavaからPUTで他社APIを呼び出す必要に迫られた際、なんでPUT？POSTじゃだめなの？と思い、理由を深堀すべく本書を見つけ、購入&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>ORACLE MASTER Oracle Database12c SQL Bronze</title><link>https://tutttuwi.github.io/posts/2016_04_oracle-master_12c_sql_bronze/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2016_04_oracle-master_12c_sql_bronze/</guid><pubDate>Fri, 01 Apr 2016 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;ORACLE MASTER Oracle Database12c Bronze&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2016_04_sql.JPG&quot; alt=&quot;2016_04_sql&quot; title=&quot;2016_04_sql&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;別書籍で知識を付けていたOracleDBAの再学習&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;プロセスやOracleが持っている機能について、別書籍では触れられていない部分を学ぶことが出来た。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;/pdf/OracleMasterBronzeSQL12c.pdf&quot;&gt;学習ログ&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Oracle Master Bronze資格取得のため&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Effective Java</title><link>https://tutttuwi.github.io/posts/2016_03_effective-java/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2016_03_effective-java/</guid><pubDate>Tue, 01 Mar 2016 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Effective Java　第二版&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;著者：Joshua Bloch　ジョンシュア・ブロック　（sun → google[Chief Java Architect]）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;訳　：柴田芳樹&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2016_03_effective_java.jpg&quot; alt=&quot;2016_03_effective_java&quot; title=&quot;2016_03_effective_java&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h2&gt;Effective Java によせて&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;言語を使用するために習得しなければならない３つの事項&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  1. 文法
  2. 語彙
  3. 日々の事柄を話すための慣習的で効果的な方法
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;教室では文法、語彙のみ教わることが多い&lt;/p&gt;
&lt;p&gt;慣習的な方法を習わずに必死に話を伝えようとするして、ネイティブに笑われる&lt;/p&gt;
&lt;p&gt;プログラミング言語も全く同じ&lt;/p&gt;
&lt;p&gt;本書は３番目の要求に取り組んでいる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;全体読んでわかったこと&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;基本的に言いたいことは、エラーについてコンパイル時に気づくことが正しく、実行時に気づくことは良くない&lt;/p&gt;
&lt;p&gt;パフォーマンスに言及している&lt;/p&gt;
&lt;p&gt;他、英語翻訳の片言的な書き方が目立つ&lt;/p&gt;
&lt;h1&gt;第１章　はじめに&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ライブラリ
- java.lang
- java.util
- java.util.concurrent
- java.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;対象者
- Java使いこなしている人&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;そうでない人は入門書をお読みください&lt;/p&gt;
&lt;h1&gt;第２章　オブジェクトの生成と消滅&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;    - どのようにオブジェクトを生成スべきか
    - いつどのように生成を回避スべきか
    - オブジェクトが適切なタイミングで消滅することをどのように保証するか
    - オブジェクト消滅前に実行しなければならない後処理をどのように行うか
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;項目１　コントラクタの変わりにstaticファクトリーメソッドを検討する&lt;/h2&gt;
&lt;p&gt;Staticファクトリーメソッド&lt;/p&gt;
&lt;p&gt;長所と短所が存在する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;長所&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;メソッド名がつけられるので分かりやすい&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; コンストラクタのように同じシグニチャを持つものが２つ以上存在できないという制約はないし、ドキュメントがなくても分かりやすい
 コンストラクタはドキュメントがないと、中身を見ないと何をしているかわからない
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メソッドが呼び出されるごとに新たなオブジェクトを生成する必要がない&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; 不必要に重複したオブジェクトの生成を回避できる
 Flyweightパターンに似てる
 何度呼び出されても同じオブジェクトを返すことができる　インスタンス制御されている（incetance-controlled）
 equalsメソッドの代わりに==演算子が使用可能
 →パフォーマンスが大幅に上がる　Enum型はこの保証を提供している
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;戻り値の型の任意のサブタイプのオブジェクトでも返すことができる&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; インターフェースに基づくフレームワーク（interface-based-framework）項目１８
 Collections Framework　コレクションのインターフェースの便利な実装が３２個ある
 概念的重みが軽くなっている　クライアントはインターフェースで返されたオブジェクトを受け取る
 EnumSetはenum型の要素数に応じて返却するインスタンスが異なる
 これらはクライアントには見えない

 Java Database Connectivity API (JDBC) などのサービス・プロバイダフレームワークの基本となるもの
 サービスインターフェース：プロバイダが実装する
 プロバイダ登録API：クライアント
 サービスアクセスAPI：サービスのインスタンスをクライアントが取得するためのもの
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;パラメータ化された型のインスタンス生成の面倒さを低減する&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; new でもダイヤモンド構文でJava1.7から簡単に記述可能
 あまりすごいメリットでもない
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;短所&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;publicあるいはprotectedのコンストラクタを持たないクラスのサブクラスを作れないこと&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  継承ではなくコンポジションを使おう
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;それらが容易に他のstaticメソッドと区別がつかないこと&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;項目２　数多くのコンストラクタパラメータに直面した時にはビルダーを検討する&lt;/h2&gt;
&lt;p&gt;staticファクトリメソッドもコンストラクタが持っている共通の制約&lt;/p&gt;
&lt;p&gt;数多くのパラメータに対してうまく対応できない&lt;/p&gt;
&lt;p&gt;これらの対処として、テレスコーピングコンストラクタパターンを利用していた&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;テレスコーピングパターン&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    パラメータの数が増えるとすぐに手に負えなくなる
    クライアントがパラメータの値の２つを逆にしてしまっても、コンパイラは何も警告しませんが誤った振る舞いをしてしまう
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JavaBeansパターン&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    パラメータなしのオブジェクトを生成して、setメソッドでセットしていく

    生成過程で不整合な状態にあるかもしれない
    バグを含んでいるコードから離れた場所で失敗するかも
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Builderパターン&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    テレスコーピングコンストラクタの安全性とJavaBeansパターンの可読性を併せ持つ
    AdaやPythonにみたいな名前付きオプションパラメータをビルダーパターンは模倣しています

    パフォーマンスに影響がある可能性があるが、パラメータが４つ以上ある場面では大抵の場合メリットのほうが大きい
    途中でBuilderに替えると使われなくなったコンストラクタやStaticメソッドはゴミになってしまうので、最初からビルダーで始めたほうがよい
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;項目３　privateのコンストラクタかenum型でシングルトン特性を強制する&lt;/h2&gt;
&lt;p&gt;シングルトンとは&lt;/p&gt;
&lt;p&gt;一度しかインスタンスが作成されないクラス&lt;/p&gt;
&lt;p&gt;＊割愛＊再確認&lt;/p&gt;
&lt;p&gt;現状、シングルトンを実装する最善の方法は、単一要素のenum型を用いること&lt;/p&gt;
&lt;h2&gt;項目４　privateのコンストラクタでインスタンス化不可能を強制する&lt;/h2&gt;
&lt;p&gt;ユーティリティクラスを作成する際は、public static メソッドを定義のうえ、&lt;/p&gt;
&lt;p&gt;コンストラクタをprivateにして、明示的にインスタンス化できないかつ継承できないことをコメントに記すべし&lt;/p&gt;
&lt;p&gt;コンストラクタの中に、throw new AssertionError(); を定義すると、誤ってクラス内からコンストラクタが呼び出されたときの保険になる&lt;/p&gt;
&lt;h2&gt;項目５　不必要なオブジェクトの生成を避ける&lt;/h2&gt;
&lt;p&gt;String s = new String(&quot;stringette&quot;); //　これは絶対にやってはいけない&lt;/p&gt;
&lt;p&gt;呼び出しごとに新しいインスタンスが生成されてしまう。&lt;/p&gt;
&lt;p&gt;不変な値であれば、クラス定数としてprivate static finalで定義しておき、&lt;/p&gt;
&lt;p&gt;初期化を　static{}でするべき&lt;/p&gt;
&lt;p&gt;一度も呼び出されない場合は無駄な初期化になりえるが、遅延初期化を実装するのはもっと大変なので避けてもよい&lt;/p&gt;
&lt;p&gt;自動ボクシング時にインスタンスが生成されるので気をつけて&lt;/p&gt;
&lt;p&gt;項目３９「防御的コピー」との対比&lt;/p&gt;
&lt;p&gt;必要な場所で防御的コピーをしなければ、悪質なバグやセキュリティホールを生み出しかねない&lt;/p&gt;
&lt;p&gt;不必要なオブジェクトを生成するのは、単にスタイルとパフォーマンスに影響するだけ&lt;/p&gt;
&lt;h2&gt;項目６　廃れたオブジェクト参照を取り除く&lt;/h2&gt;
&lt;p&gt;配列の廃れた参照に対する配慮&lt;/p&gt;
&lt;p&gt;スタックが大きくなったあとに小さくなるト、大きくなった部分のオブジェクトがガベージコレクトの対象にならない&lt;/p&gt;
&lt;p&gt;Queオブジェクトでよいよねー&lt;/p&gt;
&lt;h2&gt;項目７　ファイナライザを避ける&lt;/h2&gt;
&lt;p&gt;ファイナラーザは予測不可能で大抵の場合は必要ない&lt;/p&gt;
&lt;p&gt;不安定な振る舞い
低いパフォーマンス
移植性の問題原因&lt;/p&gt;
&lt;p&gt;実行される保証がない
ファイナライザを持つオブジェクトの生成と開放は430倍遅い
明示的に閉じる、inputStream,outputStreamオブジェクトもfinalizeメソッドを実装しており、GC対象になったときに呼び出されるが、あくまで保険的な意味合いなので、明示的にcloseするのが好ましい&lt;/p&gt;
&lt;p&gt;ファイナライザを使用する場面
安全ネット（closeシワスレの保険）
ネイティブ資源の開放&lt;/p&gt;
&lt;p&gt;結論
ファイナライザは使用しない&lt;/p&gt;
&lt;h1&gt;第３章　すべてのオブジェクトに共通のメソッド&lt;/h1&gt;
&lt;h2&gt;項目８　equalsをオーバーライドする時は一般契約に従う&lt;/h2&gt;
&lt;p&gt;equalsメソッドを誤ってオーバーライドしては行けない&lt;/p&gt;
&lt;p&gt;次の条件に当てはまるときはオーバーライドしないのが妥当&lt;/p&gt;
&lt;p&gt;クラスの個々のインスタンスは、本質的に一意である&lt;/p&gt;
&lt;p&gt;論理的等価性検査をクラスが提供するかどうか関心がない&lt;/p&gt;
&lt;p&gt;スーパークラスがすでにequalsをオーバーライドしており、スーパークラスの振る舞いがこのクラスに対して適切である&lt;/p&gt;
&lt;p&gt;AbstractSetやAbstractListが実装しており、SetやListは継承している&lt;/p&gt;
&lt;p&gt;クラスがprivateあるいはパッケージプライベートであり、そのequalsメソッドが決して呼び出されないことが確かである&lt;/p&gt;
&lt;p&gt;このような場合は、偶然呼び出された時を考慮して、 throw new AssertionError(); を実装するべき&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;equalsメソッドは同値関係を実装する
&lt;ul&gt;
&lt;li&gt;反射的&lt;/li&gt;
&lt;li&gt;対照的&lt;/li&gt;
&lt;li&gt;推移的&lt;/li&gt;
&lt;li&gt;整合的&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;咀嚼できていない&lt;/p&gt;
&lt;p&gt;そもそもequalsメソッドを実装（オーバーライド）することが稀&lt;/p&gt;
&lt;p&gt;いままでそのような処理を見たことがない&lt;/p&gt;
&lt;h2&gt;項目９　equalsをオーバーライドする時は、常にhashCodeをオーバーライドする&lt;/h2&gt;
&lt;p&gt;hashMapのキーにequalsメソッドを実装したクラスを設定する場合、new 対象オブジェクト名();で&lt;/p&gt;
&lt;p&gt;設定すると、equalsメソッドではtrueを返却する場面で、hashCodeメソッドはことなる値を返却するためMapの値が取れない現象が発生するらしい&lt;/p&gt;
&lt;p&gt;こちらも項目８同様あまり使用しないのではないか&lt;/p&gt;
&lt;p&gt;equalsメソッドをオーバーライドするときに気をつけよう！&lt;/p&gt;
&lt;p&gt;そもそもオブジェクトをキーにHashマップを作成する場面があまり想像できない&lt;/p&gt;
&lt;p&gt;hash値を算出するにあたって「31」を使用するべきらしい&lt;/p&gt;
&lt;p&gt;偶数だと乗算がオーバーフローしたときに情報が失われる？みたい&lt;/p&gt;
&lt;p&gt;https://www.thekingsmuseum.info/entry/2015/08/28/000748&lt;/p&gt;
&lt;p&gt;https://computinglife.wordpress.com/2008/11/20/why-do-hash-functions-use-prime-numbers/&lt;/p&gt;
&lt;h2&gt;項目10 toStringを常にオーバーライドする&lt;/h2&gt;
&lt;p&gt;デフォルトだと「クラス名@ハッシュコード」&lt;/p&gt;
&lt;p&gt;一般的にユーザが見てもなんのメリットもない情報&lt;/p&gt;
&lt;p&gt;返される文字列は「簡潔だが、人が読みやすくなっている有益な表現」であるべき！&lt;/p&gt;
&lt;p&gt;実用的な場合には、toStringメソッドはオブジェクトに含まれる興味のある情報をすべて！！返すべき！&lt;/p&gt;
&lt;p&gt;なお、返却する値の説明はJavadocコメントに記載すべき！&lt;/p&gt;
&lt;p&gt;フィールド値をすべて出力したい際は、&lt;/p&gt;
&lt;p&gt;commmons.langのToStringBuilder#reflectionToString(Object object)を使ってもよいのでは？&lt;/p&gt;
&lt;p&gt;パフォーマンスが懸念...&lt;/p&gt;
&lt;p&gt;どのくらい遅くてどんなデメリットがあるのか別途検証したい！&lt;/p&gt;
&lt;h2&gt;項目11　cloneを注意してオーバーライドする&lt;/h2&gt;
&lt;p&gt;cloneメソッドはObjectクラスで実装されている&lt;/p&gt;
&lt;p&gt;Cloneableインターフェース自体は空である。&lt;/p&gt;
&lt;p&gt;Cloneableインターフェースを実装しないと、cloneメソッド呼び出し時に&lt;/p&gt;
&lt;p&gt;CloneNotSupportedExceptionがスローされる&lt;/p&gt;
&lt;p&gt;Cloneableインターフェースを実装しているクラスは、適切に機能する、publicかprotectedのCloneメソッドを提供すべき&lt;/p&gt;
&lt;p&gt;返却されるオブジェクトは自クラスにキャストすべき&lt;/p&gt;
&lt;p&gt;x.clone () != x が true であり、&lt;/p&gt;
&lt;p&gt;x.clone().getClass() == x.getClass() も true であるインスタンスを生成すること。&lt;/p&gt;
&lt;p&gt;ただし、これらの項目は絶対的なものではなく、&lt;/p&gt;
&lt;p&gt;x.clone().equals(x) は通常 true である。&lt;/p&gt;
&lt;p&gt;ObjectクラスはJavaのNativeソースでCloneableの実装をしているみたい&lt;/p&gt;
&lt;p&gt;http://stackoverflow.com/questions/12032292/is-it-possible-to-find-source-for-java-native-method&lt;/p&gt;
&lt;p&gt;少し消化不良なので再確認&lt;/p&gt;
&lt;h2&gt;項目12　Comparableの実装を検討する&lt;/h2&gt;
&lt;p&gt;ソートしたい場合に検討&lt;/p&gt;
&lt;p&gt;Comparableインターフェース compareToメソッドを実装する&lt;/p&gt;
&lt;p&gt;自分自身が渡されたオブジェクトより小さければ負の値を返す&lt;/p&gt;
&lt;p&gt;自分自身が渡されたオブジェクトより大きければ正の値を返す&lt;/p&gt;
&lt;p&gt;自分自身が渡されたオブジェクトと等しければ 0 を返す&lt;/p&gt;
&lt;p&gt;ので、こちらを順序だてて実装&lt;/p&gt;
&lt;p&gt;ただ、実装クラスを拡張する場合は、継承ではなく移譲すること&lt;/p&gt;
&lt;p&gt;補足&lt;/p&gt;
&lt;p&gt;Comparatorインターフェースを実装することで並び替えを実現することもできる&lt;/p&gt;
&lt;p&gt;違い&lt;/p&gt;
&lt;p&gt;Comparableインターフェース：自クラスに実装&lt;/p&gt;
&lt;p&gt;Comparatorインターフェース：他クラスに実装&lt;/p&gt;
&lt;p&gt;Comparatorが比較処理を外だしできていい感じに思えるが、クラス作成するのが面倒。。&lt;/p&gt;
&lt;p&gt;JavaSE8から、「Comparator.comparingメソッド」が使えるようになったので、キー項目を単純にソートするだけならラムダ式でスマートに実装可能&lt;/p&gt;
&lt;p&gt;http://totech.hateblo.jp/entry/2017/01/10/123602&lt;/p&gt;
&lt;h1&gt;第４章　クラスとインタフェース&lt;/h1&gt;
&lt;h2&gt;項目13　クラスとメンバーへのアクセス可能性を最小限にする&lt;/h2&gt;
&lt;p&gt;うまい設計と下手な設計の違い&lt;/p&gt;
&lt;p&gt;どの程度内部データと実装の詳細を隠蔽しているか&lt;/p&gt;
&lt;p&gt;情報隠蔽またはカプセル化と呼ばれる&lt;/p&gt;
&lt;p&gt;ソフトウェアの再利用を促進&lt;/p&gt;
&lt;p&gt;大規模システム構築の場合のリスク軽減&lt;/p&gt;
&lt;p&gt;システムが成功しなくても、個々のモジュールとしては成功するかもしれません&lt;/p&gt;
&lt;p&gt;各クラスやメンバーをできる限りアクセスできないようにするべき&lt;/p&gt;
&lt;p&gt;メソッドをオーバーライドする際は、スーパークラスが実装しているメソッドより、広い範囲のアクセス修飾子を指定しないといけない&lt;/p&gt;
&lt;p&gt;インターフェース内のすべてのメソッドは暗黙にpublic&lt;/p&gt;
&lt;p&gt;インターフェースを実装するクラスは、オーバーライド時、絶対にpublicを指定しないと行けない&lt;/p&gt;
&lt;p&gt;インスタンスフィールドは決して、publicにしては行けない&lt;/p&gt;
&lt;p&gt;publicの可変フィールドを持つクラスはスレッドセーフではない！&lt;/p&gt;
&lt;p&gt;スレッドセーフ関連について深く理解できていないので再確認&lt;/p&gt;
&lt;p&gt;public static finalで可変オブジェクトを格納しているソースはありえない。しては行けない。&lt;/p&gt;
&lt;p&gt;そのフィールドに入る値の不変性を保証できなくなる&lt;/p&gt;
&lt;p&gt;配列をfinalで宣言しても変更できないのは配列のインスタンスであり、配列の要素を変更することは可能&lt;/p&gt;
&lt;p&gt;リストやマップも通常finalで宣言しても変更可能&lt;/p&gt;
&lt;p&gt;unmodifiableListを使わなければならない&lt;/p&gt;
&lt;p&gt;https://www.sejuku.net/blog/20977&lt;/p&gt;
&lt;p&gt;セキュリティホールになりうる例として紹介されている&lt;/p&gt;
&lt;h2&gt;項目14　publicのクラスでは、publicのフィールドではなく、アクセッサーメソッドを使う&lt;/h2&gt;
&lt;p&gt;セッターゲッタの話&lt;/p&gt;
&lt;p&gt;publicなクラスの場合、フィールドをpublicで公開すると、&lt;/p&gt;
&lt;p&gt;その内部的な表現を永久に変更できなくなる&lt;/p&gt;
&lt;p&gt;クラスがパッケージプライベートかprivateのネストしたクラスならpublicにすることは本質的に問題ない&lt;/p&gt;
&lt;p&gt;Javaライブラリーでいくつかのクラスはこの提言を無視している&lt;/p&gt;
&lt;p&gt;Java.awtのPointクラスやDimensionクラス&lt;/p&gt;
&lt;p&gt;フィールドが不変な場合、publicとして公開することは、害が少ないが、一般的にはゲッターとセッターを提供すべき&lt;/p&gt;
&lt;h1&gt;項目15　可変性を最小限にする&lt;/h1&gt;
&lt;p&gt;クラスを不変にするための５つの原則&lt;/p&gt;
&lt;p&gt;１・オブジェクトの状態を変更するためのいかなるメソッドも提供しない&lt;/p&gt;
&lt;p&gt;２．クラスが拡張できないことを保証する。&lt;/p&gt;
&lt;p&gt;finalでクラスを定義&lt;/p&gt;
&lt;p&gt;３．すべてのフィールドをfinalにする。&lt;/p&gt;
&lt;p&gt;４．すべてのフィールドをprivateにする。&lt;/p&gt;
&lt;p&gt;５．可変コンポーネントに対する独占的アクセスを保証する&lt;/p&gt;
&lt;p&gt;クラスが可変オブジェクトを参照しているフィールドを持っている場合、クライアントが参照できないことを保証すること&lt;/p&gt;
&lt;p&gt;この項目で言いたいことを掘り下げれてないのであとで見返す&lt;/p&gt;
&lt;h1&gt;項目16　継承よりコンポジションを選ぶ&lt;/h1&gt;
&lt;p&gt;継承はコードを再利用するための強力な方法&lt;/p&gt;
&lt;p&gt;不適切に使用されると継承はもろいソフトウェアを作り出します&lt;/p&gt;
&lt;p&gt;パッケージをまたがって普通の具象クラスから継承することは危険&lt;/p&gt;
&lt;p&gt;ここでいう継承は実装継承を意味します&lt;/p&gt;
&lt;p&gt;クラスがインターフェースを実装した場合や、&lt;/p&gt;
&lt;p&gt;インターフェースが他のインターフェースを拡張した場合のインターフェース継承には適用しない&lt;/p&gt;
&lt;p&gt;メソッド呼び出しと異なり、継承はカプセル化をやぶる&lt;/p&gt;
&lt;p&gt;スーパークラスに変更があった場合、サブクラスは一緒に変更しなければ行けない可能性がある&lt;/p&gt;
&lt;p&gt;HashSetを継承して、addメソッドが呼び出された回数をカウントするサブクラスを作成する&lt;/p&gt;
&lt;p&gt;add時にカウントアップ&lt;/p&gt;
&lt;p&gt;addAll時に、引数のサイズ分カウントアップしようとするが、HashSetクラスが内部的に&lt;/p&gt;
&lt;p&gt;addAllメソッドの中でaddメソッドを呼び出しているので、２重カウントとなってしまう&lt;/p&gt;
&lt;p&gt;このサブクラスはHashSetの実装に依存しており、脆いクラスになっていると言える&lt;/p&gt;
&lt;p&gt;スーパークラスのメソッド追加も、サブクラスの実装メソッドと同じシグニチャで、戻り値が異なる場合、&lt;/p&gt;
&lt;p&gt;サブクラスはコンパイルできなくなる&lt;/p&gt;
&lt;p&gt;propertiesクラスの例&lt;/p&gt;
&lt;p&gt;結論&lt;/p&gt;
&lt;p&gt;継承はなるべく使わないようにしよう&lt;/p&gt;
&lt;p&gt;経験則、Javaでバッチ処理を実装する際、ログを残すための設定、基本となる設定ファイルを読み込み値の保持をスーパークラスでやっているロジックをみたことがあるが、そういう場合は継承は効果的なの
かもしれない。（処理をがつがつ書いているスーパークラスじゃないから）&lt;/p&gt;
&lt;h1&gt;項目17　継承のために設計および文書化する、でなければ継承を禁止する&lt;/h1&gt;
&lt;p&gt;クラスはオーバーライド可能なメソッドの事故利用を文書化しないと行けない&lt;/p&gt;
&lt;p&gt;自己利用(self-use)の文書化&lt;/p&gt;
&lt;p&gt;継承は慎重に&lt;/p&gt;
&lt;p&gt;カプセル化を破壊する可能性がある&lt;/p&gt;
&lt;p&gt;咀嚼しきれてないので再度見直す&lt;/p&gt;
&lt;h2&gt;項目18　抽象クラスよりインタフェースを選ぶ&lt;/h2&gt;
&lt;p&gt;複数の実装を許す型を定義するために&lt;/p&gt;
&lt;p&gt;抽象クラスとインターフェースを定義している&lt;/p&gt;
&lt;p&gt;違いは、抽象クラスはいくつかの実装を含むことが許されていて、インターフェースは許されていないこと&lt;/p&gt;
&lt;p&gt;抽象クラスで定義された型を実装するためには、クラスはその抽象クラスのサブクラスでなければならない&lt;/p&gt;
&lt;p&gt;複数のインターフェースを混ぜ合わせて実装することをミックスインという&lt;/p&gt;
&lt;p&gt;このミックスインはインターフェースのみ許されていて、抽象クラスでは多重継承が許されていないため実現できない&lt;/p&gt;
&lt;p&gt;P92の組み合わせ爆弾について不明&lt;/p&gt;
&lt;p&gt;なんで抽象クラスではなく、インターフェースじゃないとだめなのか、具体的なデメリットが確立できていないので再確認が必要&lt;/p&gt;
&lt;p&gt;以下に調査を書いていたが結論でてない&lt;/p&gt;
&lt;p&gt;https://www.thekingsmuseum.info/entry/2015/09/26/165815&lt;/p&gt;
&lt;h2&gt;項目19　型を定義するためだけにインタフェースを使用する&lt;/h2&gt;
&lt;p&gt;インターフェースを実装するということは、そのクラスのインスタンスは何ができるかについて述べているべき&lt;/p&gt;
&lt;p&gt;定数インターフェースはこの限りでない。定数管理にインターフェースを使うのはよろしくない&lt;/p&gt;
&lt;p&gt;Javaのライブラリーにはjava.io.ObjectStreamConstantsなどの定数インターフェースがあるが、真似すべきではない！&lt;/p&gt;
&lt;p&gt;定数を提供する場合、&lt;/p&gt;
&lt;p&gt;クラスやインターフェースと強く結びついているならば、IntegerやFloatなどのように定数を提供&lt;/p&gt;
&lt;p&gt;定数が列挙型のメンバーとしてみなされるべきなら、Enum型で提供すべき&lt;/p&gt;
&lt;p&gt;そうでなければインスタンス化不可能なユーティリティクラスで定数を提供すべき&lt;/p&gt;
&lt;h2&gt;項目20　タグ付クラスよりクラス階層を選ぶ&lt;/h2&gt;
&lt;p&gt;タグ付きクラスは冗長で誤りやすく、非効率&lt;/p&gt;
&lt;p&gt;タグ付きクラス：インスタンスが２以上の特性を持っていて、その特性を示すためのタグフィールドを持ったクラスのこと&lt;/p&gt;
&lt;p&gt;円と四角形を表現したいと思い、２種類のタグ属性をフィールドに保持したクラス&lt;/p&gt;
&lt;p&gt;コンストラクタでオブジェクト生成時に、生成しようとしているオブジェクトはどちらのタグに当たるのかを判断して、&lt;/p&gt;
&lt;p&gt;フィールドに保持する。&lt;/p&gt;
&lt;p&gt;タグ付きクラスを使用する事によるデメリット&lt;/p&gt;
&lt;p&gt;一方のタグでは使わない、不要なフィールドにより、メモリ領域を抱えることになる&lt;/p&gt;
&lt;p&gt;処理にswitchを用いる事になり、タグが増加した場合の修正が大変&lt;/p&gt;
&lt;p&gt;タグフィールドを持つクラスを書きたくなったら、そのタグを取り除いてクラス階層で置き換えられないかを考えてください&lt;/p&gt;
&lt;p&gt;タグフィールドを持つクラスに出くわしたら、クラス階層になるようにリファクタリングできないか検討してください&lt;/p&gt;
&lt;p&gt;腑に落ちた。タグ付きクラスは設計しないようにする。できるだけ継承関係（階層）で表現する&lt;/p&gt;
&lt;h2&gt;項目21　戦略を表現するために関数オブジェクトを使用する&lt;/h2&gt;
&lt;p&gt;関数ポインタの主な使用方法は、戦略パターンを実装すること&lt;/p&gt;
&lt;p&gt;戦略を表すインターフェースと、個々の具象戦略に関してそのインターフェースを実装しているクラスを宣言&lt;/p&gt;
&lt;p&gt;具象クラスが１度しか使用されない場合はそのクラスは一般には無名クラスを使用して宣言及びインスタンス化すべき&lt;/p&gt;
&lt;p&gt;繰り返し使用される場合は、そのクラスは一般的にprivate staticのメンバークラスであり、戦略インターフェースの型を持つpublic static finalのフィールドを通して提供されます&lt;/p&gt;
&lt;p&gt;インターフェースを実装したフィールドを持たないステートレスなクラスを定義することは有用&lt;/p&gt;
&lt;p&gt;ステートレスなクラスは、シングルトンで設計すべき、メモリ節約&lt;/p&gt;
&lt;h2&gt;項目22　非staticのメンバークラスよりstaticのメンバークラスを選ぶ&lt;/h2&gt;
&lt;p&gt;ネストしたクラスは、他のクラス内に定義されたクラスのこと&lt;/p&gt;
&lt;p&gt;ネストしたクラスは、そのエンクロージングクラスに対して仕えるためだけに存在すべき&lt;/p&gt;
&lt;p&gt;ネストクラスとしては以下の４種類がある&lt;/p&gt;
&lt;p&gt;staticのメンバークラス&lt;/p&gt;
&lt;p&gt;非staticのメンバークラス（内部クラス）&lt;/p&gt;
&lt;p&gt;無名クラス（内部クラス）&lt;/p&gt;
&lt;p&gt;ローカルクラス（内部クラス）&lt;/p&gt;
&lt;p&gt;非staticな内部クラスはエンクロージングクラスへの参照を持っているので、&lt;/p&gt;
&lt;p&gt;参照する必要がなければ、staticなメンバークラスを定義するべき&lt;/p&gt;
&lt;h1&gt;第５章　ジェネリックス&lt;/h1&gt;
&lt;h2&gt;項目23　新たなコードで原型を使用しない&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;原型の使用は実行時例外の可能性があるため、使用しないこと&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ジェネリクスが提供されるコードとの互換性を保つためだけに、原型の使用がサポートされている&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;原型のまま使用することは可能であるが、できる限りやめたほうが懸命&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ジェネリクスの安全性と表現力をすべて失うことになる&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    結論
    ジェネリクスの型を使用するとコンパイル時に誤りに気づくことができ、メリットのほうが多いため、
    必ず型宣言すること。
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;項目24　無検査警告を取り除く&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;- 無検査キャスト警告
- 無検査メソッド呼び出し警告
- 無検査ジェネリック配列生成警告
- 無検査変換警告
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;このような警告を放置しているソースを見るが、取り除くことが可能なすべての無検査警告は取り除いたほうがよい&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;もし、警告を起こしているコードが型安全だｓと明確に示すことができれば、そのときに限って&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;@SuppressWarnings(&quot;unchecked&quot;)アノテーションで警告を抑止してください&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;安全だとわかっているのに警告を放置するのもだめだし、安全じゃない警告も取り除くべき&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SuppressWarningアノテーションを使用する際はできる限り最小のスコープで使用するべき&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;広範囲につけることも可能だが、意図せぬ警告を抑止してしまう可能性があるため&lt;/p&gt;
&lt;h4&gt;■まとめ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;無検査警告は重要、無視しないでください&lt;/li&gt;
&lt;li&gt;すべての無検査警告は実行時の ClassCastExceptionの可能性があることを表しています&lt;/li&gt;
&lt;li&gt;コードが安全だと明確に示せるのであれば、最小スコープで@SuppressWarningアノテーションで警告を抑止してください&lt;/li&gt;
&lt;li&gt;警告を抑止するときは抑止した理由をコメントで残してください&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;項目25　配列よりリストを選ぶ&lt;/h2&gt;
&lt;p&gt;配列は２つの重要な点でジェネリック型と異なる&lt;/p&gt;
&lt;p&gt;[１]. 配列は共変　SubがSuperのサブタイプである場合、配列型Sub[]がSuper[]のサブタイプだということ&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;実行時にわかるよりコンパイル時にエラーになることがわかったほうがよい
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;// 実行時に失敗する
Object[] objectArray = new Long[1];
objectArray[0] = &quot;I don&apos;t fit in&quot;; // ArrayStoreExceptionがスローされる

/**しかし、次のコードは許されていない **/

// コンパイルされない！
List&amp;lt;Object&amp;gt; ol = new ArrayList&amp;lt;Long&amp;gt;();
ol.add(&quot;I don&apos;t fit in&quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[２]. 配列は具象化されている&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ジェネリックはイレイジャ（erasure）で実装されているのでコンパイル時のみ型制約を強制し、
実行時には要素の型情報を廃棄（すなわちイレイズ）することを意味している
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;これらの基本的な相違点により、配列とジェネリックスはうまく調和しません。&lt;/p&gt;
&lt;p&gt;ジェネリック配列の生成は、型安全ではないから許されていない&lt;/p&gt;
&lt;p&gt;もし許されていると、他の正しいプログラム内にコンパイラが生成したキャストが、実行時にClassCastExceptionで失敗することになる&lt;/p&gt;
&lt;p&gt;これは、ジェネリック型システムが提供している、基本的な保証を破ることになる&lt;/p&gt;
&lt;p&gt;この２つを調和させることは難しいので、設計する際は配列ではなく、リストを使用する&lt;/p&gt;
&lt;h2&gt;項目26　ジェネリック型を使用する&lt;/h2&gt;
&lt;p&gt;ジェネリック型はクライアントのコードでキャストが必要である型より、安全で使いやすい&lt;/p&gt;
&lt;p&gt;新たな型を設計する場合、クライアントのコードでキャストが不要であることを確認してください&lt;/p&gt;
&lt;p&gt;たいていの場合、型はジェネリックにすることを意味している&lt;/p&gt;
&lt;p&gt;時間が許せば、既存の型をジェネリック化してください&lt;/p&gt;
&lt;p&gt;そうすることで、既存のクライアントヲ動作させたまま、それらの型の新たなユーザをもっと楽にしてくれます&lt;/p&gt;
&lt;p&gt;※再確認項目&lt;/p&gt;
&lt;h2&gt;項目27　ジェネリックメソッドを使用する&lt;/h2&gt;
&lt;p&gt;※再確認項目&lt;/p&gt;
&lt;h2&gt;項目28　APIの柔軟性向上のために境界ワイルドカードを使用する&lt;/h2&gt;
&lt;p&gt;ジェネリック型は本来であれば、継承関係問わずすべて一致していないと行けない&lt;/p&gt;
&lt;p&gt;PECS　Producer Extends Consumer Super&lt;/p&gt;
&lt;p&gt;APIの型を柔軟にしてくれる&lt;/p&gt;
&lt;p&gt;※再確認項目&lt;/p&gt;
&lt;h2&gt;項目29　型安全な異種コンテナーを検討する&lt;/h2&gt;
&lt;p&gt;※再確認項目&lt;/p&gt;
&lt;h1&gt;第６章　enumとアノテーション&lt;/h1&gt;
&lt;p&gt;Java1.5より以下が追加された&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enum型（あらたな種類のクラス）&lt;/li&gt;
&lt;li&gt;アノテーション型（新たな種類のインターフェース）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらを活用する方法を紹介&lt;/p&gt;
&lt;h2&gt;項目30　int定数の代わりにenumを使用する&lt;/h2&gt;
&lt;p&gt;理解度：★★★★☆&lt;/p&gt;
&lt;p&gt;int定数に対するenum型の利点は、否定できるものではなく、はるかに読みやすく、安全であり、強力&lt;/p&gt;
&lt;p&gt;多くのEnum：明示的なコンストラクタやメンバを必要としない&lt;/p&gt;
&lt;p&gt;他の多く：各定数にデータを関連付けたり、そのデータに依存して振る舞いが変わるメソッドを提供&lt;/p&gt;
&lt;p&gt;自分自身の値によってswitchを実装するよりは、abstractメソッドを実装するように強制したほうがよい&lt;/p&gt;
&lt;p&gt;複数のenum定数が共通の振る舞いヲ共有する場合は、abstractメソッドではなく、戦略enumパターンを検討するほうがよい&lt;/p&gt;
&lt;h2&gt;項目31　序数の代わりにインスタンスフィールドを使用する&lt;/h2&gt;
&lt;p&gt;理解度：★★★★★&lt;/p&gt;
&lt;p&gt;ordinalメソッドが提供されているが、それはEnumSetやEnumMapなどの汎用のenumに基づくデータ構造によりしようされるように設計されているため、そのようなデータ構造を書いているのでなければ、ordinalメソッドは全く使用しないことが最善&lt;/p&gt;
&lt;p&gt;フィールドに序数を関連付けたいときは、コンストラクタ引数を渡してインスタンスフィールドに保持すること！！&lt;/p&gt;
&lt;h2&gt;項目32　ビットフィールドの代わりにEnumSetを使用する&lt;/h2&gt;
&lt;p&gt;理解度：★★★★☆&lt;/p&gt;
&lt;p&gt;ビットフィールドを用いた実装方法&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public class Text {
    public static final int STYLE_BOLD   = 1 &amp;lt;&amp;lt; 0; // 1
    public static final int STYLE_ITALIC = 1 &amp;lt;&amp;lt; 1; // 2
    public static final int STYLE_UNDERLINE = 1 &amp;lt;&amp;lt; 2; // 4
    public static final int STYLE_STRIKETHROUGH = 1 &amp;lt;&amp;lt; 3; // 8

    public void applyStyles(int styles) {
        ...
    }
}

// 利用
text.applyStyles(STYLE_BOLD | STYLE_ITALIC);

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;定数の集合を引き回す必要がある場合にビットフィールドを使用することに固執している人もいる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;デメリット&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;int num定数のすべての短所を持っている（コンパイルされるとクラスに入り込む・名前空間がない）&lt;/li&gt;
&lt;li&gt;数値として表示された場合は解釈が困難&lt;/li&gt;
&lt;li&gt;ビットフィールドすべてをイテレートする簡単な方法も存在しない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;良い例）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// EnumSet - a modern replacement for bit fields (Page 170)
public class Text {
    public enum Style {BOLD, ITALIC, UNDERLINE, STRIKETHROUGH}

    // Any Set could be passed in, but EnumSet is clearly best
    public void applyStyles(Set&amp;lt;Style&amp;gt; styles) {
        System.out.printf(&quot;Applying styles %s to text%n&quot;,
                Objects.requireNonNull(styles));
    }

    // Sample use
    public static void main(String[] args) {
        Text text = new Text();
        text.applyStyles(EnumSet.of(Style.BOLD, Style.ITALIC));
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;まとめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;列挙型が集合の中で使用されるというだけで、それをビットフィールドで表現する理由はない&lt;/li&gt;
&lt;li&gt;短所としては、不変なEnumSetが生成できないことですが、1.6移行のリリースで改善できるだろう&lt;/li&gt;
&lt;li&gt;EnumSetをCollections.unmodifiableSetで包むことで対応可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;考察&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不変のEnumSetはJava8でも追加されていない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;項目33　序数インデックスの代わりにEnumMapを使用する&lt;/h2&gt;
&lt;p&gt;理解度：★★☆☆☆&lt;/p&gt;
&lt;p&gt;相転移マップを作成する際の例&lt;/p&gt;
&lt;p&gt;固体、液体、気体　の状態遷移&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;まとめ
&lt;ul&gt;
&lt;li&gt;配列インデックスのために序数を使用することが適切であることはめったにない&lt;/li&gt;
&lt;li&gt;代わりにEnumMapを使用すること&lt;/li&gt;
&lt;li&gt;表現使用している関係が多次元なら、EnumMap&amp;lt;..., EnumMap&amp;lt;...&amp;gt;&amp;gt;を使用してください&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;項目34　拡張可能なenumをインタフェースで模倣する&lt;/h2&gt;
&lt;p&gt;理解度：★★★☆☆&lt;/p&gt;
&lt;p&gt;項目２９の境界型トークンと境界ワイルドカード型らへんが理解できていないので再確認&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;まとめ
&lt;ul&gt;
&lt;li&gt;拡張可能なEnum型を書くことはできませんが、基本のenum型に伴うインターフェースを書いて、そのインターフェースをその基本のenum型に実装させることで模倣できる&lt;/li&gt;
&lt;li&gt;そのインターフェースを実装している独自のenum型を実装させることができる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;項目35　命名パターンよりアノテーションを選ぶ&lt;/h2&gt;
&lt;p&gt;理解度：★★★★☆&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;命名パターンとは&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;testで始まるメソッドをテスト対象として抽出する、、、みたいなルールをつけておくこと
&lt;ul&gt;
&lt;li&gt;これは簡単に破られる、実行時まで気づかない、下手すると実行時も気づかず、正常終了したと思いこむ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;アノテーションを使えば、アノテーションが付与されているものを抽出することが可能&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;まとめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;今はアノテーションが提供されているので命名パターンを使うのは避けること&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;標準提供のアノテーション例&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Override&lt;/li&gt;
&lt;li&gt;Deprecated&lt;/li&gt;
&lt;li&gt;SuppressWarnings&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;項目36　常にOverrideアノテーションを使用する&lt;/h2&gt;
&lt;p&gt;理解度：★★★★★&lt;/p&gt;
&lt;p&gt;常にOverrideすること&lt;/p&gt;
&lt;p&gt;問題のあるプログラム&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;package effectivejava.chapter6.item40;
import java.util.*;

// Can you spot the bug? (Page 188)
public class Bigram {
    private final char first;
    private final char second;

    public Bigram(char first, char second) {
        this.first  = first;
        this.second = second;
    }

    public boolean equals(Bigram b) {
        return b.first == first &amp;amp;&amp;amp; b.second == second;
    }

    public int hashCode() {
        return 31 * first + second;
    }

    public static void main(String[] args) {
        Set&amp;lt;Bigram&amp;gt; s = new HashSet&amp;lt;&amp;gt;();
        for (int i = 0; i &amp;lt; 10; i++)
            for (char ch = &apos;a&apos;; ch &amp;lt;= &apos;z&apos;; ch++)
                s.add(new Bigram(ch, ch));
        System.out.println(s.size());
    }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;eqalsメソッドのシグニチャがObjectではないため、オーバーライドではなく、オーバーロードになってしまっている&lt;/p&gt;
&lt;p&gt;このことにプログラマは気づけない&lt;/p&gt;
&lt;p&gt;常に@Overrideをつけることでこれを回避できる&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;package effectivejava.chapter6.item40;

import java.util.HashSet;
import java.util.Set;

// Fixed Bigram class (Page 189)
public class Bigram2 {
    private final char first;
    private final char second;

    public Bigram2(char first, char second) {
        this.first  = first;
        this.second = second;
    }

    @Override public boolean equals(Object o) {
        if (!(o instanceof Bigram2))
            return false;
        Bigram2 b = (Bigram2) o;
        return b.first == first &amp;amp;&amp;amp; b.second == second;
    }

    public int hashCode() {
        return 31 * first + second;
    }

    public static void main(String[] args) {
        Set&amp;lt;Bigram2&amp;gt; s = new HashSet&amp;lt;&amp;gt;();
        for (int i = 0; i &amp;lt; 10; i++)
            for (char ch = &apos;a&apos;; ch &amp;lt;= &apos;z&apos;; ch++)
                s.add(new Bigram2(ch, ch));
        System.out.println(s.size());
    }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;HashSetに格納しており、全てすべて異なるオブジェクトと判断されて、結果に誤りが生じているが、正しくequalsメソッドをオーバーライドすることで回避&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;例外&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;抽象クラスの抽象メソッドを実装するときは、実装していないことをコンパイラが警告してくれるので@overrideを記載しなくても大丈夫。記載して問題ない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;まとめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;スーパータイプの宣言をオーバーライドしているすべてのメソッド宣言にOverrideアノテーションを使用することでコンパイラは多くの誤りを指摘してくれる&lt;/li&gt;
&lt;li&gt;具象クラスでは、抽象メソッド宣言をオーバーライドしているメソッドにアノテーションをつける必要はない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;項目37　型を定義するためにマーカーインタフェースを使用する&lt;/h2&gt;
&lt;p&gt;理解度：★★★★☆&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;マーカーインターフェース&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;メソッド宣言を１つももたいないインターフェース&lt;/li&gt;
&lt;li&gt;そのインターフェースを実装しているクラスがなにか特別な性質を持っていることを示す&lt;/li&gt;
&lt;li&gt;マークされたクラスのインスタンスが実装している型を定義することに意味を持っている&lt;/li&gt;
&lt;li&gt;指摘：Serializableインターフェースを活用しなかった、ObjectOutputStream.write(Object)への指摘&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;マーカーアノテーション&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;型定義はしていない&lt;/li&gt;
&lt;li&gt;何らかの特性を示すためのアノテーション&lt;/li&gt;
&lt;li&gt;アノテーション自体がメタデータを示すものなので、アノテーション全部がマーカーの役割を担っている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;どちらを使うか決める方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;クラスやインターフェース以外のプログラム要素に対してマーカーが適用されるのであれば「マーカーアノテーション」&lt;/li&gt;
&lt;li&gt;このマークを持つオブジェクトだけを受け付ける１個以上のメソッドを書きたいのであれば「マーカーインターフェース」　Serializableト同じ用法&lt;/li&gt;
&lt;li&gt;このマーカーの使用を特定のインターフェースの要素に永久に制限したい「マーカーインターフェースのサブインターフェースで使用」&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;まとめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;マーカーインターフェースの使用を最初に検討&lt;/li&gt;
&lt;li&gt;使用できないのであれば、マーカーアノテーションを使用する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;第７章 メソッド&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;この章について
&lt;ul&gt;
&lt;li&gt;メソッド設計の側面について議論&lt;/li&gt;
&lt;li&gt;パラメータと戻り値をどの様に扱うか&lt;/li&gt;
&lt;li&gt;メソッドのシグニチャをどの様に設計するか&lt;/li&gt;
&lt;li&gt;メソッドをどの様に文書化するか&lt;/li&gt;
&lt;li&gt;多くは、メソッドだけでなく、コンストラクタにも適用される&lt;/li&gt;
&lt;li&gt;本章は利便性、頑強性、柔軟性に焦点を当てている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;項目38　パラメータの正当性を検査する&lt;/h2&gt;
&lt;p&gt;理解度：★★★★☆&lt;/p&gt;
&lt;p&gt;ほとんどのメソッド、コンストラクタはパラメータとして渡される値に関して、何らかの制約を持っている&lt;/p&gt;
&lt;p&gt;Nullであっては行けない、負の値であっては行けないとか&lt;/p&gt;
&lt;p&gt;このような制約は明確に文書化すべきであり、メソッド本体のはじめに検査することで制約を強制すべき&lt;/p&gt;
&lt;p&gt;そうしないと、予想外の場所でエラーになり原因特定が困難になる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;パラメタの検査をメソッドがしないと発生する問題
&lt;ul&gt;
&lt;li&gt;メソッドが処理の途中でわけのわからない例外で失敗する&lt;/li&gt;
&lt;li&gt;メソッドは正常に終了するが、何も言わずに誤った結果を計算する&lt;/li&gt;
&lt;li&gt;いくつかのオブジェクトを不正な状態にして、あとになって全くコードと関係のないところでエラーを引き起こす&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;publicのメソッドに対しては、パラメータ値に関する制約が守られていない場合にスローされる例外を、Javadocの@throwsタグを使用して文書化すべき（項目６４）&lt;/p&gt;
&lt;p&gt;アサート定義について&lt;/p&gt;
&lt;p&gt;通常の正当性検査とは異なり、アサーションは条件が成り立たなければAssertionErrorをスローします。通常の正当性検査とは異なり、javaのインタプリタに-ea（あるいは、-enableassertions）を渡してアサーションを有効にしない限り、アサーションはなんの効果もなく基本的にコストは発生しません。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;まとめ
&lt;ul&gt;
&lt;li&gt;メソッド、コンストラクタを書く場合は、その都度、そのパラメータにどのような制約が存在するのか考えるべき&lt;/li&gt;
&lt;li&gt;それらの制約を文書化すべきだし、メソッド本体のはじめで、明示的に検査することで制約を強制すべき&lt;/li&gt;
&lt;li&gt;このような習慣を身につけることが大事&lt;/li&gt;
&lt;li&gt;この地道な作業は、正当性検査に初めて引っかかったときに報われます&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;項目39　必要な場合には、防御的にコピーする&lt;/h2&gt;
&lt;p&gt;Java言語は安全な言語&lt;/p&gt;
&lt;p&gt;CやC++などの安全で内言語に感染するバッファーオーバーラン、配列オーバーラン、でたらめなポインタ、他のメモリ破壊エラーなどに対して、Java言語には免疫がある&lt;/p&gt;
&lt;p&gt;これはメモリをすべて１つの巨大な配列として扱っている言語では不可能です&lt;/p&gt;
&lt;p&gt;たとえ安全であっても、自分の方で何かしらの努力をしなければ他のクラスから防御されない&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;「クラスのクライアントは、クラスの不変式を破壊するために徹底した努力をすると想定して防御的にプログラムしなければなりません。」＝壊される想定で防御していかなければならない&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;あなたのプログラムを利用する、プログラマーの単純な間違いに対処するためにも、防御が必要&lt;/p&gt;
&lt;p&gt;攻撃の可能性例)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;package effectivejava.chapter8.item50;
import java.util.*;

// Broken &quot;immutable&quot; time period class (Pages 231-3)
public final class Period {
    private final Date start;
    private final Date end;

    /**
     * @param  start the beginning of the period
     * @param  end the end of the period; must not precede start
     * @throws IllegalArgumentException if start is after end
     * @throws NullPointerException if start or end is null
     */
    public Period(Date start, Date end) {
        if (start.compareTo(end) &amp;gt; 0)
            throw new IllegalArgumentException(
                    start + &quot; after &quot; + end);
        this.start = start;
        this.end   = end;
    }

    public Date start() {
        return start;
    }
    public Date end() {
        return end;
    }

    public String toString() {
        return start + &quot; - &quot; + end;
    }

//    // Repaired constructor - makes defensive copies of parameters (Page 232)
//    public Period(Date start, Date end) {
//        this.start = new Date(start.getTime());
//        this.end   = new Date(end.getTime());
//
//        if (this.start.compareTo(this.end) &amp;gt; 0)
//            throw new IllegalArgumentException(
//                    this.start + &quot; after &quot; + this.end);
//    }
//
//    // Repaired accessors - make defensive copies of internal fields (Page 233)
//    public Date start() {
//        return new Date(start.getTime());
//    }
//
//    public Date end() {
//        return new Date(end.getTime());
//    }

    // Remainder omitted
}

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;コンストラクタにオブジェクトを渡して、コンストラクタ側でメンバー変数として保持する場合、コンストラクタ内で新たにnewして（防御的にコピーして）メンバー変数に保持しなければならない&lt;/p&gt;
&lt;p&gt;これを利用した攻撃を、コンピュータセキュリティのコミッティでは&lt;strong&gt;time-of-check/time-of-use攻撃&lt;/strong&gt;と呼ばれている（TOCTOU攻撃）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;まとめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;クラスがそのクライアントから得たり、クライアントへ返したりする可変の要素を持っているならば、そのクラスはそれらの要素を防御的にコピーしなければならない&lt;/li&gt;
&lt;li&gt;もしコピーのコストが非常に高く、要素を不適切に変更しないということをでクラスがクライアントを信頼できるならば、影響を受ける要素を変更しないことがクライアントの責任であるとドキュメンテーションに概要を示すことで、防御的コピーの代わりとしても良いです。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;パフォーマンス懸念について調査&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ArrayListのデフォルトコンストラクタで生成されるインスタンスのデータ容量は１０であり、大量データをAddすることが確定している場合は最初からサイズ指定してコンストラクタを使うべき
&lt;ul&gt;
&lt;li&gt;参考）「Javaでプログラムを書く際に意識しておきたいこと」https://blog.y-yuki.net/entry/2017/06/07/130000&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;項目40　メソッドのシグニチャを注意深く設計する&lt;/h2&gt;
&lt;p&gt;理解度：★★★☆☆&lt;/p&gt;
&lt;p&gt;本項目はAPI設計のヒントを集めたもの&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;メソッド名を注意深く選ぶ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;標準命名規約（項目５６）に従うべき&lt;/li&gt;
&lt;li&gt;目標：理解可能で、同じパッケージ内の他の名前と矛盾のない名前を選ぶこと&lt;/li&gt;
&lt;li&gt;目標：存在する広範囲のコンセンサス（合致、合意）と矛盾がない名前を選ぶこと
&lt;ul&gt;
&lt;li&gt;疑問がある場合はガイダンスとして、JavaライブラリのAPIを参考にしてください、矛盾が沢山ありますが、大きさと範囲を考えると避けられない矛盾。&lt;/li&gt;
&lt;li&gt;かなりのコンセンサスがあることに注目してほしい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;便利なメソッドを提供しすぎない&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自分の役割を果たすべき&lt;/li&gt;
&lt;li&gt;頻繁に使用される場合だけ、ある操作に対する速記（shorthand）を提供することを検討すること&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;長いパラメタのリストは避ける（４個以下を目標にする）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ほとんどのプログラマは長いパラメータリストを覚えられない&lt;/li&gt;
&lt;li&gt;同じ型のパラメータが何個も続くのは特に有害&lt;/li&gt;
&lt;li&gt;長いパラメータを短くする方法
&lt;ul&gt;
&lt;li&gt;1.メソッドを分割して、各メソッドはパラメータのサブセットだけを必要とする&lt;/li&gt;
&lt;li&gt;2.パラメータの集まりを保持するヘルパークラスを作成する（Staticのメンバークラス）（項目２２）&lt;/li&gt;
&lt;li&gt;3.ビルダーパターンをオブジェクト生成からメソッド呼び出しに適用すること&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;パラメータ型に関しては、クラスよりインターフェースを選ぶ（項目５２）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HashMapパラメタに取るメソッドを作成する理由はなくて、Map型で定義しておく&lt;/li&gt;
&lt;li&gt;そうすれば、Hashtable、HashMap、TreeMapどれでも渡すことが可能となる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;booleanパラメータより２つの要素を持つenum型を使用する。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;public enum TemperatureScale { FAHRENHEIT, CELSIUS }

Thermometer.newInstatnce(true);

// より

Thermometer.newInstance(TemperatureScale.CELSIUS);

// のほうが分かりやすい
// TemperatureScaleに　KELVIN　を追加することも可能

&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;項目41　オーバーロードを注意して使用する&lt;/h2&gt;
&lt;p&gt;理解度：★★★☆☆&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 不完全！　このプログラムは何を表示するでしょうか

package effectivejava.chapter8.item52;
import java.util.*;
import java.math.*;

// Broken! - What does this program print?  (Page 238)
public class CollectionClassifier {
    public static String classify(Set&amp;lt;?&amp;gt; s) {
        return &quot;Set&quot;;
    }

    public static String classify(List&amp;lt;?&amp;gt; lst) {
        return &quot;List&quot;;
    }

    public static String classify(Collection&amp;lt;?&amp;gt; c) {
        return &quot;Unknown Collection&quot;;
    }

    public static void main(String[] args) {
        Collection&amp;lt;?&amp;gt;[] collections = {
                new HashSet&amp;lt;String&amp;gt;(),
                new ArrayList&amp;lt;BigInteger&amp;gt;(),
                new HashMap&amp;lt;String, String&amp;gt;().values()
        };

        for (Collection&amp;lt;?&amp;gt; c : collections)
            System.out.println(classify(c));
    }
}

// Unknown Collection　を３回表示することになる
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;まとめ
&lt;ul&gt;
&lt;li&gt;オーバーロードできるからと言ってオーバーロードスべきではない&lt;/li&gt;
&lt;li&gt;一般的には、同じ数のパラメータを持つ複数のシグニチャでメソッドをオーバーロードすることは控えるべき
&lt;ul&gt;
&lt;li&gt;場合によっては、コンストラクタが関与すると従えない可能性もある..&lt;/li&gt;
&lt;li&gt;そうなっても、キャストによって同じ組み合わせを異なるオーバーロードされたメソッドにわたすことができる状況は避けるべき&lt;/li&gt;
&lt;li&gt;避けられない場合は、オーバーロードされたメソッドが同じふるまいをすることを保証すべき&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;項目42　可変長引数を注意して使用する&lt;/h2&gt;
&lt;p&gt;理解度：★★★☆☆&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可変長引数メソッド
&lt;ul&gt;
&lt;li&gt;リリース1.5で言語に追加された&lt;/li&gt;
&lt;li&gt;０個以上の引数を受け付ける&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;可変長引数のあたいは配列として初期化される&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Java1.4の場合&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基本型配列はArrays.toList(Object[] obj)メソッドの引数にとれない&lt;/li&gt;
&lt;li&gt;渡すと、コンパイルエラーになる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Java1.5の場合&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コンパイルエラーにならない。しかし、、&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;配列はObject型のtoStringメソッドを継承しているので、呼び出すと、ハッシュ値が出力され、値が見れない&lt;/li&gt;
&lt;li&gt;解決方法は Arrays.toString()メソッドを使用すること&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;まとめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可変長引数メソッドは、可変長の引数を必要とするメソッドを定義する便利な方法だが乱用すべきではない&lt;/li&gt;
&lt;li&gt;不適切に使用すると可変長引数メソッドは困惑する可能性がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;項目43　nullではなく、空配列か空コレクションを返す&lt;/h2&gt;
&lt;p&gt;メッソドの戻り値（オブジェクト）がnullかどうかを判定するロジックを見たことがありますか？&lt;/p&gt;
&lt;p&gt;空（長さゼロ）配列や空コレクションの代わりに、nullを返すメソッドを使用する場合には必ず書かなければ行けない&lt;/p&gt;
&lt;p&gt;クライアント側を書いているプログラマは戻り値nullを処理する特別なコードを書き忘れてしまう危険性がある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;配列を生成するコストを回避できると主張されることもあるが、次の２点を理由に間違いだと言える
&lt;ul&gt;
&lt;li&gt;1.問題となっているメソッドがパフォーマンス上、本当の原因で有ることがプロファイリングにより示されない限り、ネックと言えない&lt;/li&gt;
&lt;li&gt;2.項目を１つも返さない呼び出しすべてが、同一の長さゼロ配列を返すことが可能
&lt;ul&gt;
&lt;li&gt;長さゼロ配列は不変であり、不変オブジェクトは制限なく共有して問題ないため&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// コレクションから配列を返す正しい方法
private final List&amp;lt;Cheese&amp;gt; cheesesInStock = ...; // ここが空であれば、常に同じから配列が返却される仕組みを作れる

private static final Cheese[] EMPTY_CHEESE_ARRAY = new Cheese[0];

/**
* @return 店にあるすべてのチーズを含む配列
*/
public Cheese[] getCheeses() {
  return cheeseInStock.toArray(EMPTY_CHEESE_ARRAY);
}

// ドキュメント
// https://docs.oracle.com/javase/jp/8/docs/api/java/util/List.html#toArray-T:A-

&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;// コレクションのコピーを返す正しい方法
public List&amp;lt;Cheese&amp;gt; getCheeseList() {
  if (cheeseInStock.isEmpty())
    return Collections.emptyList(); // 常に同一のリストを返す
  else 
    return new ArrayList&amp;lt;Cheese&amp;gt;(cheeseInStock);
}

// Collections.emptyList()のドキュメントは以下
// https://docs.oracle.com/javase/jp/8/docs/api/java/util/Collections.html#emptyList--
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;まとめ
&lt;ul&gt;
&lt;li&gt;配列やコレクションを返すメソッドが、空配列や空コレクションの代わりに、nullを返すべき理由は決してありません。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;項目44　すべての公開API要素に対してドキュメントコメントを書く&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;APIを適切に文書化するためには、すべての公開されているクラス、インターフェース、コンストラクタ、メソッド、フィールド宣言の前にドキュメントコメントを書かなければなりません。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メソッドに関するドキュメントコメントは、メソッドとそのクライアント間の契約を簡潔に記述すべき&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;メソッドが何を行っているかを記載するべき&lt;/li&gt;
&lt;li&gt;メソッドのすべての事前条件、事後条件を列挙すべき
&lt;ul&gt;
&lt;li&gt;事前条件：@param　（引数の説明）　に記載する&lt;/li&gt;
&lt;li&gt;事後条件：@throws に記載する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;↑この部分、書籍の記載不備だと思われ、咀嚼できていない&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;メソッドはいかなる&lt;strong&gt;副作用&lt;/strong&gt;も文書化すべき&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;たとえば、メソッドがバックグラウンドのスレッドを開始するとしたら、明記すべき&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ドキュメンテーションガイド&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;公式）https://www.oracle.com/technetwork/java/javase/documentation/index-137868.html&lt;/li&gt;
&lt;li&gt;Qiita）https://qiita.com/maku77/items/6410c67ce95e08d8d1bd&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;まとめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ドキュメンテーションコメントはAPIを標準化する最善で最も効率的な方法&lt;/li&gt;
&lt;li&gt;すべての公開APIでドキュメンテーションコメントは必須だとみなされるべき&lt;/li&gt;
&lt;li&gt;標準に沿って記載されるべきで、メタタグはエスケープされるべき&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;第８章　プログラミング一般&lt;/h1&gt;
&lt;h2&gt;項目45　ローカル変数のスコープを最小限にする&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ローカル変数のスコープを最小限にする最も強力な方法は、ローカル変数が使用される前に宣言されること&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ローカル変数は、初期化子を含んでいるべき&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ループ変数の内容が、ループが終了したあとに必要ないものであれば、whileループよりforループを選択スべき&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;forループであれば、２つのループで異なった変数名を使用する理由はありませんので、コピペによる誤りを犯すことはない（コンパイルエラーになるから）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;まとめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ローカル変数のスコープを最小限にすること
&lt;ul&gt;
&lt;li&gt;変数使用前に宣言すること&lt;/li&gt;
&lt;li&gt;whileよりforループをうまく活用すること&lt;/li&gt;
&lt;li&gt;メソッドを切り分けてスコープを制御すること&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;項目46　従来のforループよりfor-eachループを選ぶ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;for-eachループ＝拡張for文のことを言っている&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// コレクションと配列をいてレートするための好ましいイデオム
for (Element e : elements) {
  doSomething(e);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;for文がネストする際はなおさら、拡張For文の恩恵を受けられる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;for-eachループにより、コレクションと配列に対してイテレートできるだけでなく、Iterableインターフェースを実装した、いかなるオブジェクトに対してもイテレートできる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;利用できる場面であるならば利用するべき&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;利用できない場面については以下の通り&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1.フィルタリング：選択された要素を削除する必要がある場合&lt;/li&gt;
&lt;li&gt;2.変換：リストや配列をイテレートして、その要素のいくつかを変換、置換する場合&lt;/li&gt;
&lt;li&gt;3.並列イテレーション&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらのケースに該当する場合は、通常のfor文を使用して、最善の方法で実装しているという認識を持つこと&lt;/p&gt;
&lt;h2&gt;項目47　ライブラリーを知り、ライブラリーを使う&lt;/h2&gt;
&lt;p&gt;0からある上限値までの整数の乱数を生成したい時、自分で実装するとうまくいかないケースがある&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;private static final Random rnd = new Random();

// よく見かけるが、欠陥がある！！
static int random() {
  return Math.abs(rnd.nextInt()) % n;
}

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;※欠陥の内容については、数学的な内容になるのでここ（今回の学習）では触れない&lt;/p&gt;
&lt;p&gt;この機能を実現するためのライブラリーはもう既に提供されています。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Random.nextInt(int);
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;標準ライブラリを使用することで、それを書いた専門家の知識と、それをあなたよりも前に使用した人々の経験を利用することになる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;自分の課題に少しばかりだけ関連している問題に対する場当たり的な解決策を書くことで、時間を無駄にする必要がない。アプリケーションに時間を費やすべき&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;自分では何もしなくても、時間とともにパフォーマンスが改善されたりする&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Java標準ライブラリの中で知っておくべきもの(自分の道具箱に入れておくべきもの)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;java.lang&lt;/li&gt;
&lt;li&gt;java.util(コレクションフレームワーク)&lt;/li&gt;
&lt;li&gt;java.io&lt;/li&gt;
&lt;li&gt;java.util.concurrent&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;まとめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;無駄な努力はしないこと！&lt;/li&gt;
&lt;li&gt;ライブラリーに存在していないか、実装前に確認すること！&lt;/li&gt;
&lt;li&gt;一般的なライブラリーは、頭の片隅においておくこと！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;個人的な心がけ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;あえてライブラリーを実装していない、車輪の再開発実装を見かけたら、ライブラリーを使うとすると...ということを意識しておく&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;項目48　正確な答えが必要ならば、floatとdoubleを避ける&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;float型とdouble型は、特に金銭計算には適していない&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;正確に、0.1を表現することが不可能だから&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;この問題を解くために正しい方法は、金銭計算には、BigDecimal、int、あるいはlongを使用すること&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;留意事項&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;BigDecimalのデメリット
&lt;ul&gt;
&lt;li&gt;基本データの算術型を使用するよりは不便&lt;/li&gt;
&lt;li&gt;処理が遅い&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;まとめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;正確な答えを必要とする計算に、floatやdoubleを使用しないこと！&lt;/li&gt;
&lt;li&gt;BigDecimalの使用を検討する
&lt;ul&gt;
&lt;li&gt;BigDecimalは、小数点を扱っているかいなかという状態の管理と、処理速度が遅いというデメリットを持っている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;桁数が９桁を超えないのであればintを用いる&lt;/li&gt;
&lt;li&gt;桁数が１８桁を超えないのであればlongを用いる&lt;/li&gt;
&lt;li&gt;桁数が１８桁を超えるのであればBigDecimalを用いる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;項目49　ボクシングされた基本データより基本データ型を選ぶ&lt;/h2&gt;
&lt;p&gt;java1.5から、自動ボクシングと自動アンボクシングの機能が追加された&lt;/p&gt;
&lt;p&gt;これは基本データ型とボクシングされた基本データ型の違いを不明瞭にしたが、決して同じものと見てはいけない！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;３つの違い
- 基本データ型は値だけを持つが、ボクシングされた基本データのインスタンスは値とは別のアイデンティティを持っている
- 基本データ型は完全に機能する値だけを持っているが、ボクシングされた基本データ型は、機能する値＋nullを持つ
- 基本データ型は、ボクシングされた基本データ型より時間と空間に関して効率的&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ボクシングされた基本データ型に対して == 演算子を適用するのは、殆どの場合誤り&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;オブジェクトの同一性を確認してしまうため&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;まとめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基本的に基本データ型を使用すること&lt;/li&gt;
&lt;li&gt;自動ボクシングの機能に依存しないこと&lt;/li&gt;
&lt;li&gt;ボクシングされた基本データ型に対して==演算子を用いることはない&lt;/li&gt;
&lt;li&gt;ボクシングされた基本データ型とアンボクシングされた基本データを含む混合型の計算を行うと、アンボクシングが行われる
&lt;ul&gt;
&lt;li&gt;アンボクシングの際にNullPointerExceptionをスローする可能性がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;項目50　他の型が適切な場所では、文字列を避ける&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;文字列は、他の値型に対する代替としては貧弱&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;データが本質的に文字である場合にだけ文字列として扱うべき&lt;/li&gt;
&lt;li&gt;「はい/いいえ」の問に対する答えならboolean型&lt;/li&gt;
&lt;li&gt;数値なら、int float BigInteger&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;文字列は、列挙型に対する代替としては貧弱&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;文字列は、集合型に対する代替としては貧弱&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ある実態が複数の構成要素を持っているならば、その集合を示すクラスを定義することが懸命。たいていは private static のメンバークラスを書く&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;文字列は、ケイパビリティ（capability）に対する代替としては貧弱&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ThreadLocalに関する懸念点について咀嚼できていないので再確認する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;まとめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;何も考えずに文字列ばかりを使用しないこと&lt;/li&gt;
&lt;li&gt;基本データ型、enum、集合型が選べないか確認すること&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;所感&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;たまにテーブルで数値、タイムスタンプで持っているのに、Java処理で文字列型として扱っているプログラムを見るが、そのようなプログラムは適切ではないと判断することができるのではないか&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;項目51　文字列結合のパフォーマンスに用心する&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;n個の文字列を結合するのに、文字列結合演算子を繰り返し使用すると、nに関して2次の時間を必要としていまいます&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;この原因は、文字列が不変(immutable)であるという事実の不幸な結果&lt;/li&gt;
&lt;li&gt;結合時に両方の内容がコピーされます&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;許容できるパフォーマンスを達成するためには、Stringの代わりにStringBuilderを使用する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;パフォーマンスの違いは５０倍～８５倍ほど違い&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;処理速度検証参考&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;http://www.code-magagine.com/?p=2022&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;StringBufferは古い、StringBuilderを使用しましょうと記載があるが、スレッド処理をする場合はStringBuffer１択&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;上記の検証資料を見るとStringBufferもStringBuilderと速度の大差がない様に思う...&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;まとめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文字列結合はStringBuilder、またはStringBuilderを用いる&lt;/li&gt;
&lt;li&gt;繰り返さない、数の少ない結合に関しては+演算子を用いる場合もある
&lt;ul&gt;
&lt;li&gt;例えば、 &lt;code&gt;LOG.info(&quot;処理回数:&quot; + count + &quot;回目&quot;)&lt;/code&gt; とか局所的に使う場合&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;項目52　インターフェースでオブジェクトを参照する&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;適切なインターフェース型が存在するのであれば、パラメータ、戻り値、変数、およびフィールドはすべてインターフェース型を使用して宣言されるべき&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;型として、インターフェースを使用する癖を身に着けたならば、あなたのプログラムはかなり柔軟になる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;注意点&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;もとの実装がインターフェースの一般契約で要求されていない何らかの特別な機能を提供していて、コードがその機能に依存しているならば、新たな実装が同じ機能を提供することが重要&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;適切なインターフェースが存在しない場合には、インターフェースではなく、クラスでオブジェクトを参照することは適切&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;値クラス&lt;/li&gt;
&lt;li&gt;基本的なデータ型としてインターフェースではなくクラスであるフレームワークに属しているケース&lt;/li&gt;
&lt;li&gt;インターフェースは実装しているが、そのインターフェースにない特別なメソッドをクラスが提供しているケース&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;まとめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;適切なインターフェースが存在する場合はインターフェース型で実装&lt;/li&gt;
&lt;li&gt;適切なインターフェースが存在しない場合は、クラス改装中で必要な機能を提供しているクラスで実装&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;項目53　リフレクションよりインタフェースを選ぶ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;コアリフレクション機構：java.lang.reflect はロードされたクラスに関する情報へのプログラムによるアクセスを提供している&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Classインスタンスで表されているクラスの、コンストラクタ、メソッド、フィールドを表しているConstructorインスタンス、Methodインスタンス、Fieldインスタンスを取得可能&lt;/li&gt;
&lt;li&gt;さらにこれらを反射的に操作できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;リフレクションはコンパイルされた時点で存在さえしない他のクラスを使用することを可能にする&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コンパイル時の型検査の恩恵をすべて失います&lt;/li&gt;
&lt;li&gt;リフレクションによるアクセスを行うコードは、ぎこちなく、冗長&lt;/li&gt;
&lt;li&gt;パフォーマンスが悪くなる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;リフレクションは設計時のみ使用されるべき&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一般に、実行時に普通のアプリケーション内で、オブジェクトはリフレクションによりアクセスされるべきではない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;まとめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ある種の洗練されたシステムプログラミング処理に必要とされる強力な機構ですが、多くの短所を持っている&lt;/li&gt;
&lt;li&gt;コンパイル時に知られていないクラスと一緒に動作しなければならないプログラムを書くのであれば、できる限り、オブジェクトのインスタンス化のためだけにリフレクションを使用する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;所感&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;リフレクションはログ出力時に使用したい&lt;/li&gt;
&lt;li&gt;実運用では積極的な利用は避けるべきで、ツールとかで使う分であれば問題ない&lt;/li&gt;
&lt;li&gt;引数にクラス名を渡して、インスタンス化したあとに、スーパークラスやインターフェースに型を当てて使用する分には問題ないことを理解&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;項目54　ネイティブメソッドを注意して使用する&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;CやC++などのネイティブのプログラミング言語で書かれた特別なメソッドであるネイティブメソッドをJavaアプリケーションが呼び出すのを可能にするのがJava Native Interface(JNI)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JNIは以前パフォーマンスの改善等で使用されていたが、Java1.4以降のリリースあたりで、Javaで実装しチューニングしたクラスを提供し始めたため、現在あまり使われていない&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;リリース1.4&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;java.util.prefs レジストリの機能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;リリース1.6&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;java.awt.SyustemTray デスクトップのシステムトレイ領域へのアクセスを提供&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;古いコードへのアクセスにネイティブメソッドを使用することは正当ですが、パフォーマンスの改善のためにネイティブメソッドを使用することは、全く勧められません。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;BigIntegerも最初はCで書かれた高速な多倍精度算術ライブラリーを使用して実装されていた歴史があるが、リリース1.3でJavaに置き換えられて注意深くチューニングされた&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;まとめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;パフォマンスの改善のために使用しないこと&lt;/li&gt;
&lt;li&gt;古いコードへのアクセスで利用する場合は、最小限に留めること&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;所感&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ネイティブコードをJavaで意図的に使用するコーディングの実装経験がないが、以下で紹介されているようにC++のクラス、メソッドを呼び出しできるんだな程度で理解した
&lt;ul&gt;
&lt;li&gt;http://smys0515.hatenablog.com/entry/2015/05/27/075421&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;実務でネイティブメソッドを使用する場面は今後もないだろう。留意しておく&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;項目55　注意して最適化する&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;まとめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;早いプログラムを書く努力をしてはいけない、良いプログラムを書く努力をすること&lt;/li&gt;
&lt;li&gt;API設計、通信プロトコル、永続データ形式を設計しているときは、パフォーマンスについて意識すること&lt;/li&gt;
&lt;li&gt;システム構築を終えたあと、パフォーマンス測定し、十分に早ければそれでよい、早くなければプロファイラの力を借りて問題の特定、最適化&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;所感&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ビジネスレベルでパフォーマンスを意識した最適化をしようと思いすぎないこと&lt;/li&gt;
&lt;li&gt;API設計や、汎用的に使用されるようなクラスを作成する際は、パフォーマンスを意識すること（繰り返し呼び出される必要がある）
&lt;ul&gt;
&lt;li&gt;Javaプロファイラについて調査（jvisualvm）&lt;/li&gt;
&lt;li&gt;http://www.techscore.com/blog/2017/12/11/identifying_performance_bottlenecks_with_jvisualvm/&lt;/li&gt;
&lt;li&gt;Eclipse使用時、GUIでメソッドごとに処理時間を一覧できるため便利&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;項目56　一般的に受け入れられている命名規約を守る&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;命名規約&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;活字的規約&lt;/li&gt;
&lt;li&gt;文法的規約&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;パッケージ名&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ピリオドで区切られた要素をもち、階層的であるべき&lt;/li&gt;
&lt;li&gt;区切られた要素は小文字のアルファベット文字と稀に数字から構成されるべき&lt;/li&gt;
&lt;li&gt;組織外で使用されるパッケージの名前は、トップレベルドメインを最初にした、その組織のインターネットドメイン名で始まるべき
&lt;ul&gt;
&lt;li&gt;java,javaxで始まる名前をもつパッケージはこの規約の例外です&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;パッケージを記述する１つ以上の要素から構成されるべき、要素は短く一般的に８文字以下であるべき
&lt;ul&gt;
&lt;li&gt;意味を持った省略形は推奨されている。例えば、utilitiesesよりはutilなど&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;クラス名、インターフェース名（enum型名、アノテーション型名）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;１つかそれ以上の単語から構成されるべきであり、個々の単語の最初の文字は大文字（パスカルケース）&lt;/li&gt;
&lt;li&gt;メソッド名はキャメルケースにすべき&lt;/li&gt;
&lt;li&gt;定数フィールドは、大文字＋アンダースコア&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;まとめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;標準の命名規約を取り入れて学習することを意識する&lt;/li&gt;
&lt;li&gt;長く維持されてきた観葉的な用法が別に定義されている場合、これらの規約に盲目的に従うべきではない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;所感&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;命名が適切だと他者に伝わりやすい＋自分でも見返しやすい&lt;/li&gt;
&lt;li&gt;コーディング時に意識する&lt;/li&gt;
&lt;li&gt;参考）https://qiita.com/rkonno/items/1b30daf83854fecbb814&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;第９章　例外&lt;/h1&gt;
&lt;p&gt;最適に使用された場合、例外はプログラムの読みやすさ、信頼性、保守性を改善&lt;/p&gt;
&lt;p&gt;不適切に使用された場合、逆効果となる。ここでは例外を効率的に使用するためのガイドラインを定義&lt;/p&gt;
&lt;h2&gt;項目57　例外的状態にだけ例外を使用する&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;最悪な例&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// 例外のひどい乱用。決して、行ってはならない！！！
try {
  int i = 0;
  while(true) {
    range[i++].climb();
  }
} catch (ArrayIndexOutOfBoundsException e) {
}

/** 
* これを書いた人は、ループ終了検査が冗長で、遅くなるからこうかいた！と
* 主張するかもしれないが、今のJVMは最適化されていて、このように書くほうが遅くなるし
* 何を意味しているのか、読み手が理解し辛い
*/

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;まとめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;例外は例外的状態で使用されるために設計されている&lt;/li&gt;
&lt;li&gt;通常の制御の流れに対して例外を使用しないでください&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;所感&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;この項目は明白。あるべきタイミングで例外処理を実装すること。例外処理実装のパターンみたいなものに言及されていないが気になる。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;項目58　回復可能な状態にはチェックされる例外を、プログラミングエラーには実行時例外を使用する&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;３種類の例外&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;チェックされる例外&lt;/li&gt;
&lt;li&gt;チェックされない例外（実行時例外）&lt;/li&gt;
&lt;li&gt;チェックされない例外（エラー）
&lt;ul&gt;
&lt;li&gt;各例外がいつ使用するのが適切かについてプログラマの間で混乱がある。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;呼び出し側が適切に回復できるような状況に対してはチェックされる例外を使用すること&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;プログラミングエラーを示す場合は実行時例外を使用してください。実行時例外の殆どは事前条件違反を示しています。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;実装するすべてのチェックされない例外は、RuntimeExceptionをサブクラス化するべき&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Exception,RuntimeException,Errorのサブクラスではない例外を定義することは可能だが、得られるものはないし、ユーザを混乱させるだけなのでやめたほうがよい&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;まとめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;回復可能な状態にはチェックされる例外を使用&lt;/li&gt;
&lt;li&gt;プログラミングエラーには実行時例外を使用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;項目59　チェックされる例外を不必要に使用するのを避ける&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;まとめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;プログラマがこれ以上どうしようもないのであればチェックしない例外が適切。常にチェックされる例外を実装すべきではない&lt;/li&gt;
&lt;li&gt;チェックされる例外呼び出しをbooleanで定義して呼び分けをする方法もある
&lt;ul&gt;
&lt;li&gt;このリファクタリングが常に適切とは限らないが、リファクタリング前より見やすくなるのはわかると思う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;項目５７の状態検査メソッドと基本的に同じであり、同じ注意事項が課せられる
&lt;ul&gt;
&lt;li&gt;オブジェクトが外部同期なしに並行してアクセスされたり、外部要因により状態遷移したりするのであれば、このリファクタリングは適切でない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;所感&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;booleanを使った処理の成功、失敗の振り分けは実装したことあるが、戻り値がほしい場合はチェック例外を書かざるを得ない印象&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;項目60　標準例外を使用する&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ここでは一般的に再利用されている例外について議論する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;既存の例外を再利用することのメリット&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;APIを学んで使用するのが容易になる
&lt;ul&gt;
&lt;li&gt;プログラマが既に熟知している確立された慣例と一致するから&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;プログラムが見慣れない例外でごちゃごちゃしないので読みやすい&lt;/li&gt;
&lt;li&gt;例外クラスが少ないと、より少ないメモリ量と、クラスロードに費やされる時間が少ない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;一般的な例外&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IllegalArgumentException
&lt;ul&gt;
&lt;li&gt;パラメータ値が不適切&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;IllegalStateException
&lt;ul&gt;
&lt;li&gt;メソッド呼び出しに対してオブジェクト状態が不正&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;NullPointerException
&lt;ul&gt;
&lt;li&gt;パラメータ値が禁止されているnull&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ArrayIndexOutOfBoundsException
&lt;ul&gt;
&lt;li&gt;インデックスパラメータ値が範囲外&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ConcurrentModificationException
&lt;ul&gt;
&lt;li&gt;禁止されているオブジェクトの並行した変更を検出&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;UnsupportedOperationException
&lt;ul&gt;
&lt;li&gt;オブジェクトがメソッドをサポートしていない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;まとめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一般的な例外を、実装ケースに合わせて使用すること&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;所感&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;できるなら、個別に例外クラスを実装するような文化を作らないようにする（個別に定義した例外クラスだらけのシステム（独自ライブラリ）を見たことがあるがよくない）&lt;/li&gt;
&lt;li&gt;一般的な例外クラスを使いこなせる様にする
&lt;ul&gt;
&lt;li&gt;この場合はこの例外を使用するのが最適だと判断できるようにする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;項目61　抽象概念に適した例外をスローする&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;上位レイヤは下位レベルの例外をキャッチして、上位レイヤの中で上位レベルの抽象概念の観点から説明可能な例外をスローすべき&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;まとめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;下位レイヤからの例外を防いだり下位レイヤの例外から上位レイヤを隔離剃ることが実現不可能であり、下位レベルのメソッドがスローするどれかの例外が上位レイヤに対して不適切ならば、例外翻訳を使用すること。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;所感&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;例外翻訳は、メソッドで投げられた例外をキャッチして、別の例外をnewして投げ返すこと&lt;/li&gt;
&lt;li&gt;投げ返すに適切な例外があれば使用すること&lt;/li&gt;
&lt;li&gt;そもそも投げ返すパターンについて整理する必要があるなと感じた&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;項目62　各メソッドがスローするすべての例外を文書化する&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;例外がthrowされる条件をjavadocの@throwsタグに明記して、正確に文書化してください&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;まとめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;作成する各メソッドがスローする可能性のあるすべての例外を文書化、チェックされない例外に対しても。また、具象メソッドだけでなく抽象メソッドに対しても&lt;/li&gt;
&lt;li&gt;個々のチェックされる例外に対してthrows説を提供すること。チェックされない例外はthorows説を提供しないこと&lt;/li&gt;
&lt;li&gt;メソッドがthrowする可能性のある例外を文書化するのを忘れると、他の人がクラスやインターフェースを効果的に利用したりするのが困難だったり、不可能になる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;所感&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;@thorwsタグに、少なくともチェックされる例外の説明を記載する努力をする
&lt;ul&gt;
&lt;li&gt;どのような原因でその例外が発生するのかなど&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;項目63　詳細メッセージにエラー記録情報を含める&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;エラーを記録するためには、例外の文字列表現は、その例外の原因となったすべてのパラメータとフィールドの値を含んでいるべき&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;所感&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;どの様にエラー情報を提供するのかについて言及していないように思える&lt;/li&gt;
&lt;li&gt;再確認したい項目&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;項目64　エラーアトミック性に努める&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;エラーアトミック：一般的にいえば、失敗したメソッド呼び出しは、オブジェクトをそのメソッド呼び出しの前の状態にしておくべき&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;達成するためのアプローチ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不変オブジェクトを設計する&lt;/li&gt;
&lt;li&gt;可変オブジェクトに対しては
&lt;ul&gt;
&lt;li&gt;操作を行う前にパラメータの正当性を検査する。そうすることでパラメータの変更を行う前にエラーを投げることができる&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;public Object poo() {
  if (size == 0) 
    throw new EmptyStackException();
  Object result = elements[--size];
  elements[size] = null; // 廃れた参照を取り除く
  return result;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;このように、size０のリストに、サイズを確認せずに要素の取り出しを行うと例外がスローされ、sizeフィールドが不整合な負の状態になり、オブジェクトを扱えなくなる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;まとめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アトミック性をまもることは必須ではない。コスト、煩雑さとを伴うのであれば避ける&lt;/li&gt;
&lt;li&gt;APIドキュメントに、アトミック性を保持できないことを明記するべき
&lt;ul&gt;
&lt;li&gt;残念ながら、既存のAPIドキュメントの多くはこの規則に従っていない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;所感&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;そもそもアトミック性を保持しなければならないようなクラスを実装する機会があまりなかった(変化するフィールド（加算/減算/ステータス定義の変化）を持つクラスを使い回すシチュエーションがないような気がする。あっても既存のライブラリクラス。Dateとか)&lt;/li&gt;
&lt;li&gt;バッチ処理等でサービス/ビジネスクラス内に処理回数をインクリメントする変数を定義した場合、変数を加算する前に対象の処理が正常終了しているかどうかを確かめるとか...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;項目65　例外を無視しない&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;例外を無視するのはだめ！
&lt;ul&gt;
&lt;li&gt;火災警報器を無視して警報を切ってしまうのと同じ。誰も火災があるかどうかを知ることができない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;try {
    obj.action(args);
} catch (SomeException e) {
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;まとめ
&lt;ul&gt;
&lt;li&gt;例外を無視するべきではない&lt;/li&gt;
&lt;li&gt;例外を無視しても最低限コメントで説明をするべき&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;第10章　並行性&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;スレッドは同一プログラム内で複数の処理を並行して行うことを可能にしている&lt;/li&gt;
&lt;li&gt;今日では当たり前になった、マルチコアプロセッサの恩恵を受けるためにも並行処理は必須&lt;/li&gt;
&lt;li&gt;本章では明瞭で、正確で、きちんと文書化された並行プログラムを書くのに役立つ助言を含んでいます。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;項目66　共有された可変データへのアクセスを同期する&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;壊れた同期&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;package effectivejava.chapter11.item78.brokenstopthread;
import java.util.concurrent.*;

// Broken! - How long would you expect this program to run?  (Page 312)
public class StopThread {
    private static boolean stopRequested;

    public static void main(String[] args)
            throws InterruptedException {
        Thread backgroundThread = new Thread(() -&amp;gt; {
            int i = 0;
            while (!stopRequested)
                i++;
        });
        backgroundThread.start();

        TimeUnit.SECONDS.sleep(1);
        stopRequested = true;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;１秒後に、メインスレッドがサブスレッドを終了させると思うかもしれませんが、実際そうならない&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;問題&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;メインスレッドが行ったsropRequestedの値の変更をサブスレッドが検知できないため&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;以下、修正されたクラス&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;package effectivejava.chapter11.item78.fixedstopthread1;
import java.util.concurrent.*;

// Properly synchronized cooperative thread termination
public class StopThread {
    private static boolean stopRequested;

    private static synchronized void requestStop() {
        stopRequested = true;
    }

    private static synchronized boolean stopRequested() {
        return stopRequested;
    }

    public static void main(String[] args)
            throws InterruptedException {
        Thread backgroundThread = new Thread(() -&amp;gt; {
            int i = 0;
            while (!stopRequested())
                i++;
        });
        backgroundThread.start();

        TimeUnit.SECONDS.sleep(1);
        requestStop();
    }
}  

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;期待通りに１秒でクラスが終了します。&lt;/p&gt;
&lt;p&gt;読み込み操作と、書き込み動作の両方が同期されていなければ行けない。同期はなんの効果もない&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;以下のような書き方もできる&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;package effectivejava.chapter11.item78.fixedstopthread2;
import java.util.concurrent.*;

// Cooperative thread termination with a volatile field
public class StopThread {
    private static volatile boolean stopRequested;

    public static void main(String[] args)
            throws InterruptedException {
        Thread backgroundThread = new Thread(() -&amp;gt; {
            int i = 0;
            while (!stopRequested)
                i++;
        });
        backgroundThread.start();

        TimeUnit.SECONDS.sleep(1);
        stopRequested = true;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;だが、volatile修飾子では、加算処理などの同期がうまく取れないので、&lt;/p&gt;
&lt;p&gt;場合により、AtomicLongを使用すること&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 不完全、動機が必要！
private static volatile int nextSerialNumber = 0;

public static int generateSerialNumber () {
  return nextSerialNumber++;
}

// ++演算子がアトミックではないことが問題　これは安全性エラーです

private static final  AtomicLong nextSerialNumber = new AtomicLong();abstract

public static long generateSerialNumber() {
  return nextSerialNumber.getAndIncrement();
}

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;まとめ
&lt;ul&gt;
&lt;li&gt;複数のスレッドが可変データを共有する場合には、そのデータを読み書きするスレッドは同期を行わなければなりません。&lt;/li&gt;
&lt;li&gt;スレッド間通信だけが必要で、相互排他が必要なければ、volatile修飾子は同期として受け入れられる形式
&lt;ul&gt;
&lt;li&gt;正しく使用するのは難しい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;項目67　過剰な同期は避ける&lt;/h2&gt;
&lt;p&gt;項目６６では不十分な同期の危険性を示唆したが、本項目はその逆&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;活性エラーと安全性エラーを回避するためには、同期されたメソッドやブロック内で決して制御をクライアントに譲ってはいけません。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;項目68　スレッドよりエグゼキューターとタクスを選ぶ&lt;/h2&gt;
&lt;h2&gt;項目69　waitとnotifyよりコンカレンシーユーティリティを選ぶ&lt;/h2&gt;
&lt;h2&gt;項目70　スレッド安全性を文書化する&lt;/h2&gt;
&lt;h2&gt;項目71　遅延初期化を注意して使用する&lt;/h2&gt;
&lt;h2&gt;項目72　スレッドスケジューラに依存しない&lt;/h2&gt;
&lt;h2&gt;項目73　スレッドグループを避ける&lt;/h2&gt;
&lt;h1&gt;第11章　シリアライズ&lt;/h1&gt;
&lt;h2&gt;項目74　Serializableを注意して実装する&lt;/h2&gt;
&lt;h2&gt;項目75　カスタムシリアライズ形式の使用を検討する&lt;/h2&gt;
&lt;h2&gt;項目76　防御的にreadObjectを書く&lt;/h2&gt;
&lt;h2&gt;項目77　インスタンス制御に対しては、readResolveよりenum型を選ぶ&lt;/h2&gt;
&lt;h2&gt;項目78　シリアライズされたインスタンスの代わりに、シリアライズ・プロキシを検討する&lt;/h2&gt;
&lt;h1&gt;付録　初版に対応する項目&lt;/h1&gt;
</content:encoded></item><item><title>AccessVBAエキスパート</title><link>https://tutttuwi.github.io/posts/2016_02_accessvba%E3%82%A8%E3%82%AD%E3%82%B9%E3%83%91%E3%83%BC%E3%83%88/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2016_02_accessvba%E3%82%A8%E3%82%AD%E3%82%B9%E3%83%91%E3%83%BC%E3%83%88/</guid><pubDate>Mon, 01 Feb 2016 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;AccessVBAエキスパート&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2016_02_vba_access_standard.jpg&quot; alt=&quot;2016_02_vba_access_standard&quot; title=&quot;2016_02_vba_access_standard&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/pdf/AccessVBA%E3%82%A8%E3%82%AD%E3%82%B9%E3%83%91%E3%83%BC%E3%83%88.pdf&quot;&gt;学習ログ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;VBAの基礎構文&lt;/li&gt;
&lt;li&gt;Excel版で掲載されていなかった多くのメソッドを学べた&lt;/li&gt;
&lt;li&gt;AccessオブジェクトをVBAで扱う方法&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Excelの学習の延長と思い学習することにした&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>ExcelVBAエキスパート</title><link>https://tutttuwi.github.io/posts/2016_01_excelvba%E3%82%A8%E3%82%AD%E3%82%B9%E3%83%91%E3%83%BC%E3%83%88/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2016_01_excelvba%E3%82%A8%E3%82%AD%E3%82%B9%E3%83%91%E3%83%BC%E3%83%88/</guid><pubDate>Fri, 01 Jan 2016 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;ExcelVBAエキスパート&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2016_01_vba_excel_standard.jpg&quot; alt=&quot;2016_01_vba_excel_standard&quot; title=&quot;2016_01_vba_excel_standard&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/pdf/ExcelVBA%E3%82%A8%E3%82%AD%E3%82%B9%E3%83%91%E3%83%BC%E3%83%88.pdf&quot;&gt;学習ログ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;VBAの基礎構文&lt;/li&gt;
&lt;li&gt;ExcelオブジェクトをVBAで扱う方法&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;業務でVBAコードを書ければ自動化できるタスクがあったため、将来的にもExcelは使用していくことを考えて知識が欲しい&lt;/li&gt;
&lt;li&gt;簡単なマクロなら数時間で実装できるスキルが欲しい&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>HTML5デザイン</title><link>https://tutttuwi.github.io/posts/2016_01_html5%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2016_01_html5%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3/</guid><pubDate>Fri, 01 Jan 2016 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;HTML5デザイン&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2016_01_html5_design.jpg&quot; alt=&quot;2016_01_html5_design&quot; title=&quot;2016_01_html5_design&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://books.mdn.co.jp/books/3213303023/&quot;&gt;目次&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;未読
&lt;ul&gt;
&lt;li&gt;優先度下げてしまってまだ全部読めてない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;触りだけ読んだが、必要に迫られたときに持ち寄りたい&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;HTML/CSS/JSのデザイン知識を蓄えたい&lt;/li&gt;
&lt;li&gt;可能なことについて理解しておきたい&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Junit実践入門</title><link>https://tutttuwi.github.io/posts/2016_01_junit%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2016_01_junit%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80/</guid><pubDate>Fri, 01 Jan 2016 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Junit実践入門&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2016_01_junit.jpg&quot; alt=&quot;2016_01_junit&quot; title=&quot;2016_01_junit&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://books.mdn.co.jp/books/3213303023/&quot;&gt;目次&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;アサーションメソッド
&lt;ul&gt;
&lt;li&gt;評価する仕組みについて&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;テストランナー
&lt;ul&gt;
&lt;li&gt;Enclosedクラス&lt;/li&gt;
&lt;li&gt;Theoriesクラス&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;※業務で必要となった箇所だけ拾い読みレベル&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Junitのフレームワークについて理解できていなかったため、体系的な知識を付ける目的で購入&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>JakartaCommonsクックブック</title><link>https://tutttuwi.github.io/posts/2016_01_apache_commons/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2016_01_apache_commons/</guid><pubDate>Fri, 01 Jan 2016 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;JakartaCommonsクックブック&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2016_01_commons.jpg&quot; alt=&quot;2016_01_commons&quot; title=&quot;2016_01_commons&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.oreilly.co.jp/books/4873112427/&quot;&gt;目次&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;未読
&lt;ul&gt;
&lt;li&gt;優先度下げてしまってまだ全部読めてない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;触りだけ読んだが、必要に迫られたときに持ち寄りたい&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Commonsのライブラリーを業務で有効活用できておらず、どのようなものがあるか体系的に知りたかった&lt;/li&gt;
&lt;li&gt;車輪の再開発反対派&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Java言語で学ぶデザインパターン入門</title><link>https://tutttuwi.github.io/posts/2015_10_java%E8%A8%80%E8%AA%9E%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2015_10_java%E8%A8%80%E8%AA%9E%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80/</guid><pubDate>Thu, 01 Oct 2015 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Java言語で学ぶデザインパターン入門&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2015_10_java_design.jpg&quot; alt=&quot;2015_10_java_design&quot; title=&quot;2015_10_java_design&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;目次&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;はじめに&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;UMLについて&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;デザインパターンを学ぶ前に&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;デザインパターンに慣れる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第1章 Iterator ― 1つ1つ数え上げる&lt;/li&gt;
&lt;li&gt;第2章 Adapter ― 一皮かぶせて再利用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;サブクラスにまかせる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第3章 Template Method ― 具体的な処理をサブクラスにまかせる&lt;/li&gt;
&lt;li&gt;第4章 FactoryMethod ― インスタンス作成をサブクラスにまかせる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;インスタンスを作る&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第5章 Singleton ― たった1つのインスタンス&lt;/li&gt;
&lt;li&gt;第6章 Prototype ― コピーしてインスタンスを作る&lt;/li&gt;
&lt;li&gt;第7章 Builder ― 複雑なインスタンスを組み立てる&lt;/li&gt;
&lt;li&gt;第8章 Abstract Factory ― 関連する部品を組み合わせて製品を作る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;分けて考える&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第9章 Bridge ― 機能の階層と実装の階層を分ける&lt;/li&gt;
&lt;li&gt;第10章 Strategy ― アルゴリズムをごっそり切り替える&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;同一視&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第11章 Composite ― 容器と中身の同一視&lt;/li&gt;
&lt;li&gt;第12章 Decorator−飾り枠と中身の同一視&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;構造を渡り歩く&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第13章 Visitor ― 構造を渡り歩きながら仕事をする&lt;/li&gt;
&lt;li&gt;第14章 Chain of Responsibility ― 責任のたらい回し&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;シンプルにする&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第15章 Facade ― シンプルな窓口&lt;/li&gt;
&lt;li&gt;第16章 Mediator ― 相手は相談役1人だけ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;状態を管理する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第17章 Observer ― 状態の変化を通知する&lt;/li&gt;
&lt;li&gt;第18章 Memento ― 状態を保存する&lt;/li&gt;
&lt;li&gt;第19章 State ― 状態をクラスとして表現する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;無駄をなくす&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第20章 Flyweight ― 同じものを共有して無駄をなくす&lt;/li&gt;
&lt;li&gt;第21章 Proxy ― 必要になってから作る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;クラスで表現する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第22章 Command ― 命令をクラスにする&lt;/li&gt;
&lt;li&gt;第23章 Interpreter ― 文法規則をクラスで表現する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;付録A 練習問題の解答&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;付録B サンプルプログラムの実行手順&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;付録C GoFによるデザインパターンの分類&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;付録D デザインパターンＱ＆Ａ&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;付録E 参考文献&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;/pdf/Java%E8%A8%80%E8%AA%9E%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80.pdf&quot;&gt;学習ログ&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;デザインパターンとは、について&lt;/li&gt;
&lt;li&gt;オブジェクト指向プログラミングの楽しさ&lt;/li&gt;
&lt;li&gt;EffectiveJavaに通じるところがある&lt;/li&gt;
&lt;li&gt;実際に現場で口にされるパターンは限りがある
&lt;ul&gt;
&lt;li&gt;フレームワーク(Struts2やSpringなど)がうまいようにやってくれているので...&lt;/li&gt;
&lt;li&gt;フレームワーク内で様々なパターンを使用して実装しているな、というのがつかめれたのでよかった&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;時間を開けてもう一回読みたい&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;初学者として、Javaを学んできたので、Javaを使ったデザインパターンの考え方を知りたかった&lt;/li&gt;
&lt;li&gt;どんなパターンがあって、というのは共通語として押さえておきたかった&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>オラクル認定資格教科書JavaプログラマGoldSE7スピードマスター問題集</title><link>https://tutttuwi.github.io/posts/2015_07_%E3%82%AA%E3%83%A9%E3%82%AF%E3%83%AB%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E6%95%99%E7%A7%91%E6%9B%B8java%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9Egoldse7%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E5%95%8F%E9%A1%8C%E9%9B%86/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2015_07_%E3%82%AA%E3%83%A9%E3%82%AF%E3%83%AB%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E6%95%99%E7%A7%91%E6%9B%B8java%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9Egoldse7%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E5%95%8F%E9%A1%8C%E9%9B%86/</guid><pubDate>Wed, 01 Jul 2015 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;オラクル認定資格教科書 Javaプログラマ Gold SE 7 スピードマスター問題集&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2015_07_java_gold_excercise.jpg&quot; alt=&quot;2015_07_java_gold_excercise&quot; title=&quot;2015_07_java_gold_excercise&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;目次
&lt;ul&gt;
&lt;li&gt;1章　Javaクラスの設計&lt;/li&gt;
&lt;li&gt;2章　高度なクラス設計&lt;/li&gt;
&lt;li&gt;3章　オブジェクト指向の設計原理&lt;/li&gt;
&lt;li&gt;4章　ジェネリックスとコレクション&lt;/li&gt;
&lt;li&gt;5章　文字列処理&lt;/li&gt;
&lt;li&gt;6章　例外とアサーション&lt;/li&gt;
&lt;li&gt;7章　Java I/Oの基礎&lt;/li&gt;
&lt;li&gt;8章　JavaファイルI/O (NIO.2)&lt;/li&gt;
&lt;li&gt;9章　JDBCによるデータベースアプリケーションの作成&lt;/li&gt;
&lt;li&gt;10章　スレッド&lt;/li&gt;
&lt;li&gt;11章　並列処理&lt;/li&gt;
&lt;li&gt;12章　口ーカライゼーション&lt;/li&gt;
&lt;li&gt;模擬試験&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Gold教科書で学んだことの整理&lt;/li&gt;
&lt;li&gt;プラス、問題として問われやすいところの整理&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Gold資格取得&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>オラクル認定資格教科書JavaプログラマGoldSE7</title><link>https://tutttuwi.github.io/posts/2015_04_%E3%82%AA%E3%83%A9%E3%82%AF%E3%83%AB%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E6%95%99%E7%A7%91%E6%9B%B8java%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9Egoldse7/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2015_04_%E3%82%AA%E3%83%A9%E3%82%AF%E3%83%AB%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E6%95%99%E7%A7%91%E6%9B%B8java%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9Egoldse7/</guid><pubDate>Wed, 01 Apr 2015 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;オラクル認定資格教科書JavaプログラマGoldSE7&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2015_04_java_gold.JPG&quot; alt=&quot;2015_04_java_gold&quot; title=&quot;2015_04_java_gold&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.shoeisha.co.jp/book/detail/9784798133379&quot;&gt;目次&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Silverのステップアップとして、JavaGold取得を決意&lt;/li&gt;
&lt;li&gt;列挙型の使用方法&lt;/li&gt;
&lt;li&gt;ネストクラスと匿名クラスについて
&lt;ul&gt;
&lt;li&gt;１回読んだときはまだメリットについてあまり理解できなかった&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;デザインパターンの基礎知識
&lt;ul&gt;
&lt;li&gt;コンポジション&lt;/li&gt;
&lt;li&gt;シングルトン&lt;/li&gt;
&lt;li&gt;DAOパターン&lt;/li&gt;
&lt;li&gt;ファクトリパターン&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;StringBuilder、StringBufferの違い&lt;/li&gt;
&lt;li&gt;正規表現処理&lt;/li&gt;
&lt;li&gt;コレクション、List、Set、Queue、Mapの利用&lt;/li&gt;
&lt;li&gt;ジェネリックについて
&lt;ul&gt;
&lt;li&gt;はじめ何のメリットがあってこんな複雑な事しているのかわからなかった&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;配列とリストについて&lt;/li&gt;
&lt;li&gt;例外処理 SE7から追加された書き方など（try-with-resources）&lt;/li&gt;
&lt;li&gt;ファイルIOライブラリー&lt;/li&gt;
&lt;li&gt;JDBC、ResultSet&lt;/li&gt;
&lt;li&gt;スレッド、排他制御、同期処理&lt;/li&gt;
&lt;li&gt;Executorフレームワーク、アトミックとロック、Fork/Joinフレームワーク
&lt;ul&gt;
&lt;li&gt;Javaにおいて業務であまり使用しないのでためになった&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Silverのステップアップとして、JavaGold取得を決意&lt;/li&gt;
&lt;li&gt;より実用的な深い知識を習得するため&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>完全合格ORACLE-MASTER-DBA12c_Bronze</title><link>https://tutttuwi.github.io/posts/2015_05_%E5%AE%8C%E5%85%A8%E5%90%88%E6%A0%BCoracle-master-dba12c_bronze/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2015_05_%E5%AE%8C%E5%85%A8%E5%90%88%E6%A0%BCoracle-master-dba12c_bronze/</guid><pubDate>Wed, 01 Apr 2015 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;完全合格ORACLE-MASTER-DBA12c_Bronze&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2015_05_dba.JPG&quot; alt=&quot;2015_05_dba&quot; title=&quot;2015_05_dba&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;OracleDBの仕組み&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;データベース管理概要&lt;/li&gt;
&lt;li&gt;ソフトウェアのインストール&lt;/li&gt;
&lt;li&gt;Oracle Enterprise Manager Database ExpressおよびSQL管理ツール&lt;/li&gt;
&lt;li&gt;Oracleネットワーク環境&lt;/li&gt;
&lt;li&gt;インスタンス管理&lt;/li&gt;
&lt;li&gt;データベース領域構造&lt;/li&gt;
&lt;li&gt;ユーザおよびセキュリティ&lt;/li&gt;
&lt;li&gt;バックアップリカバリ&lt;/li&gt;
&lt;li&gt;データベースの監視&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DBMS機能ってこんなのがあるんだということを把握&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;この時期に発売されていた 12c の教科書がこれしかなかったので本書を選んだが、記載方法が自分好みではなかった..&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;/pdf/%E5%AE%8C%E5%85%A8%E5%90%88%E6%A0%BCORACLE-MASTER-DBA12c_Bronze.pdf&quot;&gt;学習ログ&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;DBMSの一般的な知識がつけたかった&lt;/li&gt;
&lt;li&gt;Oracleは１年目に業務で触っていたため、書籍で勉強を進めていくのに一番よいと判断した&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>電話はなぜつながるのか</title><link>https://tutttuwi.github.io/posts/2015_01_%E9%9B%BB%E8%A9%B1%E3%81%AF%E3%81%AA%E3%81%9C%E3%81%A4%E3%81%AA%E3%81%8C%E3%82%8B%E3%81%AE%E3%81%8B/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2015_01_%E9%9B%BB%E8%A9%B1%E3%81%AF%E3%81%AA%E3%81%9C%E3%81%A4%E3%81%AA%E3%81%8C%E3%82%8B%E3%81%AE%E3%81%8B/</guid><pubDate>Sun, 01 Feb 2015 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;電話はなぜつながるのか&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2015_02_why_tel.JPG&quot; alt=&quot;2015_02_why_tel&quot; title=&quot;2015_02_why_tel&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;電話回線網の仕組み&lt;/li&gt;
&lt;li&gt;なぜ、「ぷー、ぷー」という音が鳴るのか&lt;/li&gt;
&lt;li&gt;電話交換機の役割&lt;/li&gt;
&lt;li&gt;IP電話について&lt;/li&gt;
&lt;li&gt;携帯電話技術の世代&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;業務で、電話回線を使用したダイヤルアップ接続をしなければいけない場面があり、そもそもの電話回線の仕組みに興味を持った&lt;/li&gt;
&lt;li&gt;これまで何本か本を読んできて、なぜ～シリーズの本が読みやすいと感じたので&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Javaでなぜつくるのか</title><link>https://tutttuwi.github.io/posts/2015_01_java%E3%81%A7%E3%81%AA%E3%81%9C%E3%81%A4%E3%81%8F%E3%82%8B%E3%81%AE%E3%81%8B/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2015_01_java%E3%81%A7%E3%81%AA%E3%81%9C%E3%81%A4%E3%81%8F%E3%82%8B%E3%81%AE%E3%81%8B/</guid><pubDate>Thu, 01 Jan 2015 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Javaでなぜつくるのか&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2015_01_why_java.jpg&quot; alt=&quot;2015_01_why_java&quot; title=&quot;2015_01_why_java&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Javaとは
&lt;ul&gt;
&lt;li&gt;プログラミング言語、というくくりだけでなくもっと広い捉え方をした方がよい&lt;/li&gt;
&lt;li&gt;「仮想コンピュータの仕様とそれをとりまく社会環境」らしい 反感買いそう..&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Javaの歴史的部分&lt;/li&gt;
&lt;li&gt;Javaの長所短所&lt;/li&gt;
&lt;li&gt;コンパイラ言語ということ&lt;/li&gt;
&lt;li&gt;JVMで動作するということ
&lt;ul&gt;
&lt;li&gt;ヒープ領域などについて&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;オブジェクト指向について&lt;/li&gt;
&lt;li&gt;基礎的な概念をまんべんなく学んだ印象&lt;/li&gt;
&lt;li&gt;書籍は読みやすいので、遅くても2,3時間で読み切れると思う&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Javaの基礎的なところ、概念的なところについて理解を深めたかった&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Windows7 上級マニュアル ネットワーク編</title><link>https://tutttuwi.github.io/posts/2015_01_windows7%E4%B8%8A%E7%B4%9A%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB-%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E7%B7%A8/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2015_01_windows7%E4%B8%8A%E7%B4%9A%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB-%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E7%B7%A8/</guid><pubDate>Thu, 01 Jan 2015 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Windows7 上級マニュアル ネットワーク編&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2015_01_windows7_nw.JPG&quot; alt=&quot;2015_01_windows7_nw&quot; title=&quot;2015_01_windows7_nw&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Windowsのネットワーク設定周りの理解を深めることができた&lt;/li&gt;
&lt;li&gt;DLNAについて&lt;/li&gt;
&lt;li&gt;自宅でネットワーク周りを整理するための知識&lt;/li&gt;
&lt;li&gt;ルーター設定&lt;/li&gt;
&lt;li&gt;PCの共有サーバー化&lt;/li&gt;
&lt;li&gt;リモートデスクトップについて&lt;/li&gt;
&lt;li&gt;FTPデーモンについて&lt;/li&gt;
&lt;li&gt;ローカルPCにデーモンを入れ、ドメインを取得しインターネット公開する方法&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;より、私生活により沿ったネットワーク関連の知識を深めたい&lt;/li&gt;
&lt;li&gt;ネットワーク面でより効率的な自宅環境を構築したい&lt;/li&gt;
&lt;li&gt;WindowsOSは業務で使っているのでなじみある&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>コンピュータはなぜ動くのか</title><link>https://tutttuwi.github.io/posts/2015_01_%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AF%E3%81%AA%E3%81%9C%E5%8B%95%E3%81%8F%E3%81%AE%E3%81%8B/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2015_01_%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AF%E3%81%AA%E3%81%9C%E5%8B%95%E3%81%8F%E3%81%AE%E3%81%8B/</guid><pubDate>Thu, 01 Jan 2015 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;コンピュータはなぜ動くのか&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2015_01_why_pc.JPG&quot; alt=&quot;2015_01_why_pc&quot; title=&quot;2015_01_why_pc&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;PCが動作する仕組みをハード面からソフト面まで説明&lt;/li&gt;
&lt;li&gt;UML、DB操作、TCP/IP、暗号化技術、XMLなどについて説明&lt;/li&gt;
&lt;li&gt;まんべんなく、浅く広くという印象&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;PCの動作する仕組みについて深く理解できていないと感じ購入&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>基礎からのサーブレットJSP</title><link>https://tutttuwi.github.io/posts/2015_01_%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%96%E3%83%AC%E3%83%83%E3%83%88jsp/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2015_01_%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%96%E3%83%AC%E3%83%83%E3%83%88jsp/</guid><pubDate>Thu, 01 Jan 2015 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;基礎からのサーブレットJSP&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2015_01_basic_servlet.jpg&quot; alt=&quot;2015_01_basic_servlet&quot; title=&quot;2015_01_basic_servlet&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;目次&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;PART01 入門編&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CHAPTER01 サーブレット/JSPって何?&lt;/li&gt;
&lt;li&gt;CHAPTER02 開発環境の準備&lt;/li&gt;
&lt;li&gt;CHAPTER03 Webアプリケーションの動作原理を知る&lt;/li&gt;
&lt;li&gt;CHAPTER04 はじめてのサーブレット&lt;/li&gt;
&lt;li&gt;CHAPTER05 日本語の表示とコンテンツタイプ&lt;/li&gt;
&lt;li&gt;CHAPTER06 web.xmlの基本&lt;/li&gt;
&lt;li&gt;CHAPTER07 サーブレットを簡単に作る&lt;/li&gt;
&lt;li&gt;CHAPTER08 はじめてのJSP&lt;/li&gt;
&lt;li&gt;CHAPTER09 コンテキストパスを理解する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PART02 基礎編&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CHAPTER10 入力パラメータの取得&lt;/li&gt;
&lt;li&gt;CHAPTER11 入力チェックと値の変換&lt;/li&gt;
&lt;li&gt;CHAPTER12 フィルタの活用&lt;/li&gt;
&lt;li&gt;CHAPTER13 画面遷移を行う&lt;/li&gt;
&lt;li&gt;CHAPTER14 オブジェクトのスコープとリクエスト属性&lt;/li&gt;
&lt;li&gt;CHAPTER15 セッションを使う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PART03 もっとサーブレット&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CHAPTER16 サーブレットクラスの詳細&lt;/li&gt;
&lt;li&gt;CHAPTER17 外部ファイルから値を読み込む&lt;/li&gt;
&lt;li&gt;CHAPTER18 HTTPリクエストとレスポンス&lt;/li&gt;
&lt;li&gt;CHAPTER19 クッキーの利用&lt;/li&gt;
&lt;li&gt;CHAPTER20 WARファイルのデプロイ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PART04 クラスとオブジェクト&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CHAPTER21 アクションクラスとディレクティブ&lt;/li&gt;
&lt;li&gt;CHAPTER22 JSPの構成要素&lt;/li&gt;
&lt;li&gt;CHAPTER23 JavaBeansとEL式&lt;/li&gt;
&lt;li&gt;CHAPTER24 カスタムタグとJSTL&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PART05 データベースの利用&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CHAPTER25 データベースの基礎知識&lt;/li&gt;
&lt;li&gt;CHAPTER26 JDBCを使う&lt;/li&gt;
&lt;li&gt;CHAPTER27 Webアプリケーションとデータベース&lt;/li&gt;
&lt;li&gt;CHAPTER28 データベースアクセスの利用&lt;/li&gt;
&lt;li&gt;CHAPTER29 データソースの利用&lt;/li&gt;
&lt;li&gt;CHAPTER30 オリジナルアプリケーションの作成&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;APPENDIX&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;APPENDIX01 EclipseによるWebアプリケーション開発&lt;/li&gt;
&lt;li&gt;APPENDIX02 web.xmlの要素&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;/pdf/%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%96%E3%83%AC%E3%83%83%E3%83%88-JSP.pdf&quot;&gt;学習ログ&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Tomcatとは&lt;/li&gt;
&lt;li&gt;Tomcat使い方&lt;/li&gt;
&lt;li&gt;JavaWeb開発の基礎&lt;/li&gt;
&lt;li&gt;アプリ開発の手順を順を追って理解できた&lt;/li&gt;
&lt;li&gt;Web.xmlの役割について理解できた&lt;/li&gt;
&lt;li&gt;JSPのタグ式の書き方&lt;/li&gt;
&lt;li&gt;JSPからサーブレット、サーブレットからサーブレット、サーブレットからJSPまでのつながりが理解できた&lt;/li&gt;
&lt;li&gt;実践的な内容まで踏み込めていない（FW未使用）ため、基礎的な事を習得しただけではある&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;JavaSilverレベルの知識が身についたところで、Javaを使用したWebアプリの開発方法について理解したかった&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Windowsはなぜ動くのか</title><link>https://tutttuwi.github.io/posts/2015_02_windows%E3%81%AF%E3%81%AA%E3%81%9C%E5%8B%95%E3%81%8F%E3%81%AE%E3%81%8B/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2015_02_windows%E3%81%AF%E3%81%AA%E3%81%9C%E5%8B%95%E3%81%8F%E3%81%AE%E3%81%8B/</guid><pubDate>Thu, 01 Jan 2015 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Windowsはなぜ動くのか&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2015_02_why_win.jpg&quot; alt=&quot;2015_02_why_win&quot; title=&quot;2015_02_why_win&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;PCが動作する仕組みをハード面からソフト面まで説明&lt;/li&gt;
&lt;li&gt;UML、DB操作、TCP/IP、暗号化技術、XMLなどについて説明&lt;/li&gt;
&lt;li&gt;まんべんなく、浅く広くという印象&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;PCの動作する仕組みについて深く理解できていないと感じ購入&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>BIOS/UEFI 完全攻略</title><link>https://tutttuwi.github.io/posts/2014_12_bios-uefi%E5%AE%8C%E5%85%A8%E6%94%BB%E7%95%A5/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2014_12_bios-uefi%E5%AE%8C%E5%85%A8%E6%94%BB%E7%95%A5/</guid><pubDate>Mon, 01 Dec 2014 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;BIOS/UEFI 完全攻略&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2014_12_bios.jpg&quot; alt=&quot;2014_12_bios&quot; title=&quot;2014_12_bios&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;BIOSの仕組み&lt;/li&gt;
&lt;li&gt;UEFIはBIOSの後継。GUI操作ができる。&lt;/li&gt;
&lt;li&gt;すべて読み切れていないので時間あるときに戻ってくる&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;業務でBIOS設定の変更などを行っていて興味がわいたから&lt;/li&gt;
&lt;li&gt;LAN起動させるためにマジックパケットを許容する設定とかしていた&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Windows 7 レジストリ徹底活用マニュアル</title><link>https://tutttuwi.github.io/posts/2014_12_windows7%E3%83%AC%E3%82%B8%E3%82%B9%E3%83%88%E3%83%AA%E5%BE%B9%E5%BA%95%E6%B4%BB%E7%94%A8%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2014_12_windows7%E3%83%AC%E3%82%B8%E3%82%B9%E3%83%88%E3%83%AA%E5%BE%B9%E5%BA%95%E6%B4%BB%E7%94%A8%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB/</guid><pubDate>Mon, 01 Dec 2014 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Windows 7 レジストリ徹底活用マニュアル&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2014_12_reg.JPG&quot; alt=&quot;2014_12_reg&quot; title=&quot;2014_12_reg&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://gihyo.jp/book/2010/978-4-7741-4402-3#toc&quot;&gt;目次&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Windowsレジストリ操作で出来ること&lt;/li&gt;
&lt;li&gt;驚きはあったが実用性はいまいちという印象&lt;/li&gt;
&lt;li&gt;WindowsOSに対する理解は進んだと思う&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;業務でレジストリ領域をいじる機会(※１)があり、興味を持ったため
&lt;ul&gt;
&lt;li&gt;※１OracleDBが参照しているレジストリ領域をいじらなければ解決していない事象があり..&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>ネットワークの知識と実務</title><link>https://tutttuwi.github.io/posts/2014_11_%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AE%E7%9F%A5%E8%AD%98%E3%81%A8%E5%AE%9F%E5%8B%99/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2014_11_%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AE%E7%9F%A5%E8%AD%98%E3%81%A8%E5%AE%9F%E5%8B%99/</guid><pubDate>Sat, 01 Nov 2014 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;ベテランが丁寧に教えてくれる ネットワークの知識と実務 (IT ENGINEER’S Basic)&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2014_11_networking_technorogy.jpg&quot; alt=&quot;2014_11_networking_technorogy&quot; title=&quot;2014_11_networking_technorogy&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ネットワーク周りの基本知識の取得&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;業務でTCP/IP関連の知識を必要とした&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>オラクル認定資格教科書JavaプログラマSilverSE7</title><link>https://tutttuwi.github.io/posts/2014_07_%E3%82%AA%E3%83%A9%E3%82%AF%E3%83%AB%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E6%95%99%E7%A7%91%E6%9B%B8java%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9Esilverse7/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2014_07_%E3%82%AA%E3%83%A9%E3%82%AF%E3%83%AB%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E6%95%99%E7%A7%91%E6%9B%B8java%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9Esilverse7/</guid><pubDate>Tue, 01 Jul 2014 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;オラクル認定資格教科書 Javaプログラマ Silver SE 7&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2014_07_java_silver.JPG&quot; alt=&quot;2014_07_java_silver&quot; title=&quot;2014_07_java_silver&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;目次
&lt;ul&gt;
&lt;li&gt;第1章　Javaプログラミング基礎&lt;/li&gt;
&lt;li&gt;第2章　配列&lt;/li&gt;
&lt;li&gt;第3章　演算子と分岐文&lt;/li&gt;
&lt;li&gt;第4章　繰り返し文と繰り返し制御文&lt;/li&gt;
&lt;li&gt;第5章　クラス定義とオブジェクトの生成・使用&lt;/li&gt;
&lt;li&gt;第6章　継承とポリモフィズム&lt;/li&gt;
&lt;li&gt;第7章　例外処理&lt;/li&gt;
&lt;li&gt;模擬試験&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Bronze本に引き続いて、Javaプログラミングの基礎知識を固めることができた&lt;/li&gt;
&lt;li&gt;例外クラスの種別について意識しながら学ぶことができた&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;JavaBronze本からのステップアップ&lt;/li&gt;
&lt;li&gt;Javaプログラミングのスキルアップ&lt;/li&gt;
&lt;li&gt;Silver資格取得&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第1章　Javaプログラミング基礎&lt;/h2&gt;
&lt;h2&gt;第2章　配列&lt;/h2&gt;
&lt;h2&gt;第3章　演算子と分岐文&lt;/h2&gt;
&lt;h2&gt;第4章　繰り返し文と繰り返し制御文&lt;/h2&gt;
&lt;h2&gt;第5章　クラス定義とオブジェクトの生成・使用&lt;/h2&gt;
&lt;h2&gt;第6章　継承とポリモフィズム&lt;/h2&gt;
&lt;h2&gt;第7章　例外処理&lt;/h2&gt;
&lt;h2&gt;模擬試験&lt;/h2&gt;
</content:encoded></item><item><title>オラクル認定資格教科書JavaプログラマSilverSE7スピードマスター問題集</title><link>https://tutttuwi.github.io/posts/2014_07_%E3%82%AA%E3%83%A9%E3%82%AF%E3%83%AB%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E6%95%99%E7%A7%91%E6%9B%B8java%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9Esilverse7%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E5%95%8F%E9%A1%8C%E9%9B%86/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2014_07_%E3%82%AA%E3%83%A9%E3%82%AF%E3%83%AB%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E6%95%99%E7%A7%91%E6%9B%B8java%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9Esilverse7%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E5%95%8F%E9%A1%8C%E9%9B%86/</guid><pubDate>Tue, 01 Jul 2014 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;オラクル認定資格教科書 Javaプログラマ Silver SE 7 スピードマスター問題集&lt;/h1&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align:center; margin-bottom: 40px&quot;&amp;gt;
&amp;lt;img src=&quot;/img/cover/2014_07_java_silver_exercise.jpg&quot; alt=&quot;2014_07_java_silver_exercise&quot; title=&quot;2014_07_java_silver_exercise&quot; style=&quot;width:980px&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;目次
&lt;ul&gt;
&lt;li&gt;1章 Javaの基本&lt;/li&gt;
&lt;li&gt;2章 Javaのデータ型の操作&lt;/li&gt;
&lt;li&gt;3章 演算子と決定構造の使用&lt;/li&gt;
&lt;li&gt;4章 配列の作成と使用&lt;/li&gt;
&lt;li&gt;5章 ループ構造の使用&lt;/li&gt;
&lt;li&gt;6章 メソッドとカプセル化を操作する&lt;/li&gt;
&lt;li&gt;7章 継承の操作&lt;/li&gt;
&lt;li&gt;8章 例外の処理&lt;/li&gt;
&lt;li&gt;模擬試験&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Silver教科書で学んだことの整理&lt;/li&gt;
&lt;li&gt;プラス、問題として問われやすいところの整理&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Silver資格取得&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;1章 Javaの基本&lt;/h2&gt;
&lt;h2&gt;2章 Javaのデータ型の操作&lt;/h2&gt;
&lt;h2&gt;3章 演算子と決定構造の使用&lt;/h2&gt;
&lt;h2&gt;4章 配列の作成と使用&lt;/h2&gt;
&lt;h2&gt;5章 ループ構造の使用&lt;/h2&gt;
&lt;h2&gt;6章 メソッドとカプセル化を操作する&lt;/h2&gt;
&lt;h2&gt;7章 継承の操作&lt;/h2&gt;
&lt;h2&gt;8章 例外の処理&lt;/h2&gt;
&lt;h2&gt;模擬試験&lt;/h2&gt;
</content:encoded></item><item><title>オラクル認定資格教科書JavaプログラマBronzeSE7</title><link>https://tutttuwi.github.io/posts/2014_06_%E3%82%AA%E3%83%A9%E3%82%AF%E3%83%AB%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E6%95%99%E7%A7%91%E6%9B%B8java%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9Ebronzese7/</link><guid isPermaLink="true">https://tutttuwi.github.io/posts/2014_06_%E3%82%AA%E3%83%A9%E3%82%AF%E3%83%AB%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E6%95%99%E7%A7%91%E6%9B%B8java%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9Ebronzese7/</guid><pubDate>Sun, 01 Jun 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;オラクル認定資格教科書 Javaプログラマ Bronze SE7&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/cover/2014_06_java_bronze.jpg&quot; alt=&quot;2014_06_java_bronze&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;目次
&lt;ul&gt;
&lt;li&gt;第1章　Java言語のプログラムの流れ&lt;/li&gt;
&lt;li&gt;第2章　データの宣言と使用&lt;/li&gt;
&lt;li&gt;第3章　演算子と分岐文&lt;/li&gt;
&lt;li&gt;第4章　繰り返し文と繰り返し制御文&lt;/li&gt;
&lt;li&gt;第5章　オブジェクト指向コンセプト&lt;/li&gt;
&lt;li&gt;第6章　クラス定義とオブジェクトの生成・使用&lt;/li&gt;
&lt;li&gt;第7章　継承&lt;/li&gt;
&lt;li&gt;第8章　ポリモフィズムとパッケージ&lt;/li&gt;
&lt;li&gt;模擬試験&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;学んだこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;基本型、参照型の違い&lt;/li&gt;
&lt;li&gt;条件分岐の基本的な使い方&lt;/li&gt;
&lt;li&gt;三項演算子、インクリメント&lt;/li&gt;
&lt;li&gt;&lt;code&gt;final&lt;/code&gt;,&lt;code&gt;static&lt;/code&gt;,&lt;code&gt;void&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;継承の概念、インターフェース定義の概念&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手に取った理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Javaの事始めとして、Bronzeの受験はしないが購入&lt;/li&gt;
&lt;li&gt;Silver取得を目指すため&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第1章　Java言語のプログラムの流れ&lt;/h2&gt;
&lt;h2&gt;第2章　データの宣言と使用&lt;/h2&gt;
&lt;h2&gt;第3章　演算子と分岐文&lt;/h2&gt;
&lt;h2&gt;第4章　繰り返し文と繰り返し制御文&lt;/h2&gt;
&lt;h2&gt;第5章　オブジェクト指向コンセプト&lt;/h2&gt;
&lt;h2&gt;第6章　クラス定義とオブジェクトの生成・使用&lt;/h2&gt;
&lt;h2&gt;第7章　継承&lt;/h2&gt;
&lt;h2&gt;第8章　ポリモフィズムとパッケージ&lt;/h2&gt;
&lt;h2&gt;模擬試験&lt;/h2&gt;
</content:encoded></item></channel></rss>