著者:井上 誠一郎[いのうえ・せいいちろう]
著者:槙 俊明[まき・としあき]
著者:上妻 宜人[あげつま・のりと]
著者:菊田 洋一[きくた・よういち]
イラスト: 駄場 寛[だば・かん](1956-) イラストレーション、CGデザイン。
装丁:三浦 かなえ[みうら・かなえ]
本文デザイン・DTP:技術評論社制作業務部
編集:原田 崇晴
【簡易目次】
Part 1 JavaEE overview
1章 Java EE概論 016
Part 2 DI
2章 コンテナアーキテクチャとDI 030
3章 CDI(基礎編) 037
4章 CDI(応用編) 094
Part 3 Web層
5章 サーブレット 126
6章 JAX-RS 174
7章 ELとJSTL 222
8章 WebSocket 248
9章 JSF(基礎編) 280
10章 JSF(実践編) 324
11章 Bean Validation 355
12章 MVC 380
Part 4 データアクセス層
13章 JPA(基礎編) 400
14章 JPA(発展編) 453
15章 トランザクション管理 525
16章 EJB Lite 550
付録 JSP 581
【目次】
ご注意 [002]
はじめに(2016年7月 井上誠一郎) [003]
目次 [004-014]
Part 1 JavaEE ~ overview
1章 Java EE概論 016
1-1 Java EEとは 016
1-1-1 Java EE概論
1-1-2 Java EEの歴史
1-1-3 Java EEの規格
1-1-4 規格と実装
1-2 Webアプリのアーキテクチャ 019
1-2-1 Webアプリの構造
1-2-2 Java EEの役割
1-2-3 コンテナアーキテクチャ
JNDI[Java Naming and Directory Interface]とDI[Dependency Injection]
コンテキストとスコープ
1-2-4 レイヤアーキテクチャ
1-2-5 MVCアーキテクチャ
1-2-6 並行処理アーキテクチャ
1-3 Java EEアプリ開発の準備 023
1-3-1 GlassFish4の準備
1-3-2 Java EEアプリ開発の構成管理
[COLUMN]構成管理とは 024
1-3-3 自作Webアプリを動かす工程
mvnコマンドで開発ソースツリーの雛形を作成
ソースコードを記述
mvnコマンドでビルド
デプロイと動作確認
動作確認
Part 2 DI
2章 コンテナアーキテクチャとDI 030
2-1 DI[Dependency Injection]とは何か 030
2-1-1 DIのメリット①(テスタビリティの向上)
2-1-2 DIのメリット②(コンテナ管理インスタンスへのアクセス性向上)
2-1-3 DIの使いどころ
2-2 DIコンテナ 034
2-3 Java EEにおけるコンポーネントモデルとDI 035
2-3-1 Java EEのDI対応
3章 CDI(基礎編) 037
3-1 CDI[Context and Dependency Injection]とは 037
3-2 はじめてのCDI 037
3-2-1 CDIによる解決
3-3 CDIのDI機能 043
3-3-1 CDIの管理対象クラス
CDI管理Bean
CDIでインジェクト可能なコンテナ管理リソース
3-3-2 CDIのインジェクトポイント
[COLUMN]どのインジェクトポイントを利用すべきか 047
3-3-3 タイプセーフな依存性解決
3-3-4 限定子による依存性解決
複数限定子の組み合わせ
限定子とアノテーション要素
@Nonbinding
組み込み限定子
3-3-5 プロデューサメソッド
プロデューサメソッドの実装例
ディスポーザメソッド
プロデューサによるJava EEリソースの注入
InjectionPointインスタンスのインジェクト
3-4 スコープ 063
3-4-1 スコープの仕組み
3-4-2 ノーマルスコープと疑似スコープ
3-4-3 CDIに含まれるスコープ
@ConversationScoped
@Dependent
@Singleton
3-5 ライフサイクルコールバックメソッド 074
3-6 @Named ―― EL式からのBean参照 075
3-7 ステレオタイプ 076
3-7-1 ステレオタイプのグループ化対象
3-7-2 @Model ――組み込みステレオタイプ
3-8 インターセプタ 079
3-8-1 インターセプタの実装例
3-8-2 インターセプタの適用対象
3-8-3 インターセプタの順序制御
@Priorityインターセプタの順序制御
beans.xmlによるインターセプタの順序制御
3-8-4 ステレオタイプによるインターセプタのグループ化
3-8-5 インターセプタ利用の注意点
3-9 CDIパッケージング 088
3-9-1 Java EE 6以前のCDI有効化方法
3-9-2 Java EE 7以降のCDI有効化方法
Beanディスカバリモードの設定
CDI管理対象からの除外
@Vetoedによるフィルタリング
beans.xmlによるフィルタリング
3-10 CDI(基礎編)のまとめ 093
4章 CDI(応用編) 094
4-1 CDIによるクラス間依存性解決の応用 094
4-1-1 応用的なBean型
4-1-2 Bean型とジェネリクス
4-1-3 Alternative
@Priorityによる代替Beanの有効化
ステレオタイプによる代替Beanの有効化
4-2 応用的なインターセプタ 103
4-2-1 コンストラクタへのインターセプタ適用
4-2-2 @Interceptors
4-2-3 デコレータ
4-3 CDIイベント 111
4-3-1 イベントオブジェクト
4-3-2 @Observesによるオブザーバ実装
4-3-3 Eventによるイベント通知
4-3-4 限定子によるイベントの選択
4-3-5 オブザーバメソッドの応用
パラメータ付きイベント限定子
EventMetadata
オブザーバメソッドの例外ハンドリング
条件付きオブザーバメソッド
トランザクションオブザーバ
4-4 CDI(応用編)のまとめ 124
Part 3 Web層
5章 サーブレット 126
5-1 簡単なサーブレットアプリ 126
5-1-1 サーブレットアプリのコードの読解
リクエストURLの構造
5-1-2 サーブレットAPIの概要
5-2 サーブレットクラス 128
5-2-1 doメソッドのオーバーライド
5-2-2 サーブレットクラスのインスタンスと同期処理
5-2-3 initメソッドのオーバーライド
5-2-4 URLマッピング
@WebServletアノテーションを使うURLマッピング
web.xml を使うURLマッピング
ServletContextオブジェクトを使うURLマッピング
5-2-5 URLパターンの文法
5-2-6 ファイルシステム(リソースパスーへのマッピング
5-2-7 WEB-INFとMETA-INFディレクトリ
5-3 リクエスト処理 134
5-3-1 リクエストURL
5-3-2 リクエストヘッダ
5-3-3 クエリパラメータ
クエリパラメータ用メソッド
[COLUMN]GETとPOSTのメソッドの使い分けの指針
5-3-4 リクエストボディ
フォームのポストデータ
ファイルアップロード
HTTPボディ部のI/Oストリーム処理
5-4 レスポンス処理 139
5-4-1 レスポンスステータス
特別なステータスコード
5-4-2 レスポンスヘッダ
5-4-3 レスポンスボディ
5-4-4 フォワード処理
フォワード処理の方法
他アプリへのフォワード処理
5-4-5 インクルード処理
5-4-6 リダイレクト処理
5-4-7 リダイレクト処理とフォワード処理の使い分け
リダイレクト処理を使うべき時
5-5 状態管理 145
5-5-1 属性用コンテナ
5-5-2 属性とスコープ
5-6 セッション管理 147
5-6-1 セッション管理が必要な理由
5-6-2 セッション管理の仕組み
5-6-3 クッキーによるセッション管理の仕組み
クッキー値のセット方法
5-6-4 セッションオブジェクト
セッションオブジェクト取得API
[COLUMN]セッション用途以外でクッキーを直接扱う方法
5-6-5 jsessionidクエリパラメータによるセッション管理
5-6-6 セッションタイムアウト
5-6-7 セッション管理のその他の話題
セッションと状態管理
複数台構成のWebアプリ
ステートレスなWebアプリ
ユーザ認証
5-6-8 セキュリティAPI
5-6-9 ユーザ認証方法の設定
5-7 フィルタとリスナ 157
5-7-1 フィルタとは
5-7-2 フィルタの割り込み先の指定方法
@WebFilterアノテーションを使うフィルタ処理
web.xmlを使うフィルタ処理
ServletContextを使うフィルタ処理
5-7-3 フィルタの並行処理
5-7-4 リスナとは
リスナの登録方法
リスナの平行処理
HttpSessionBindingListenerインターフェース
5-8 非同期処理 164
5-8-1 同期処理と非同期処理
5-8-2 非同期サーブレット
5-8-3 フォワード処理の非同期処理
非同期処理とフィルタ
5-8-4 非同期処理のリスナ
5-8-5 ノンブロッキングI/O処理
5-9 モジュール化 170
5-9-1 ライブラリjar
5-9-2 jarファイル側の初期化処理
ServerContainerInitializerインターフェース
5-9-3 jarファイルのリソースファイル
5-9-4 jarファイルのweb-fragment.xmlファイル
6章 JAX-RS 174
6-1 JAX-RSとREST 174
[COLUMN]サーブレットのURLマッピングの無効化
6-1-1 自作JAX-RSアプリを GlassFishで動かす工程
6-1-2 JAX-RSアプリのコードの読解
[COLUMN]JAX-RSのクライアント API
6-2 リソースクラス 178
6-2-1 リソースクラス
6-2-2 URLマッピング
6-2-3 Application サブクラスと@ApplicationPathアノテーション
6-2-4 複数のApplicationサブクラス
6-2-5 web.xmlによるベースパス設定
6-2-6 @Pathアノテーション
URLテンプレート
6-2-7 リソースメソッド
リソースメソッドの引数
リソースメソッドの返り値
6-2-8 リソースクラスと同期処理
リソースクラスのシングルトンオブジェクト化
6-2-9 リソースクラスのコンストラクタ
6-2-10 フィールドおよびJava Beansプロパティ
6-2-11 サブリソースロケータによる処理の委譲
6-2-12 リソースクラスからサーブレット APIの利用
6-2-13 @Contextアノテーション
6-2-14 リソースクラスの例外とException Mapper
6-3 リクエスト処理 188
6-3-1 JAX-RSのリクエスト処理
@DefaultValueおよび@Excodedアノテーション
ParamConverter
UriInfoとHttpHeaders
6-3-2 フォーム処理
6-3-3 フォームビーン
6-3-4 @BeanParam
6-3-5 JSON形式でポストされたリクエストの受信処理
6-3-6 @Consumesアノテーション
6-3-7 MessageBodyReader
6-3-8 リクエストフィルタ
フィルタのバインディング
プログラマブルにバインディングする
フィルタの優先順
6-3-9 インタセプタ
6-4 レスポンス処理 206
6-4-1 レスポンス処理の基本
6-4-2 @Producesアノテーション
6-4-3 JSON形式のレスポンス
6-4-4 XML形式のレスポンス
6-4-5 Responseオブジェクト
キャッシュ制御
6-4-6 MessageBodyWriter
6-4-7 リダイレクト処理
UriInfoインターフェースとUriBuilderクラス
UriBuilderのURLテンプレート機能
6-4-8 レスポンスフィルタ
6-4-9 インタセプタ
6-5 非同期処理 217
6-5-1 JAX-RSの非同期処理の準備(Concurrency Utilities for Java EE)
6-5-2 JAX-RSの非同期処理
タイムアウト処理
7章 ELとJSTL 222
7-1 EL 222
7-1-1 ELの概要
7-2 ELの文法 223
7-2-1 リテラル
文字列リテラル
数値リテラル
真偽値リテラル
null(リテラル)
7-2-2 エスケープ
7-2-3 演算子
算術演算子
浮動小数点数での注意点
文字列結合演算子
比較演算子
数値の比較
文字列の比較
empty演算
論理演算子と3項演算子
7-2-4 プロパティと配列
プロパティ
ドット演算子の連結
配列
ブラケット演算子
7-2-5 例外
7-2-6 スコープ
7-2-7 暗黙オブジェクト
pageScope、requestScope、sessionScope、applicationScope
param、paramValue
7-2-8 コレクション処理
7-2-9 ラムダ式とストリーム処理
7-2-10 関数
7-2-11 暗黙の型変換
オートボクシング
文字列
数値
真偽値
7-3 JSTL 239
7-3-1 JSTL[JSP Standard Tag Library]とは
7-3-2 コアタグライブラリ
< c: out >
< c: set >
< c: remove >
< c: if >
< c: choose >
< c: foreach >
Mapのイテレーション
範囲指定
繰り返し中のステータス
<c: forTokens >
<c: catch >
7-3-3 書式タグライブラリ
7-3-4 関数タグライブラリ
8章 WebSocket 248
8-1 WebSocketとは 248
8-1-1 WebSocketとURL
[COLUMN]HTTPでのサーバプッシュ通信
8-1-2 WebSocketとHTTP
8-2 簡単なWebSocketアプリ 250
8-2-1 JavaScriptコード
8-2-2 WebSocketコードの読解
サーバサイド
クライアントサイド
8-3 WebSocket API 255
8-3-1 アノテーションAPIの使い方
イベントハンドラメソッドの型
8-3-2 プログラマブルAPIの使い方
8-3-3 EndPointクラスのオブジェクト生成
8-3-4 URLマッピング
URLテンプレート
URLテンプレートのマッチ部分文字列の取得
8-3-5 Sessionオブジェクト
Sessionオブジェクトの利用方法
クローズ処理
WebSocketContainerオブジェクト
Sessionオブジェクトと複数スレッド
8-4 受信処理と送信処理 265
8-4-1 受信処理
8-4-2 分割受信
8-4-3 カスタムペイロード
デコーダクラス
[COLUMN]WebSocket上のメッセージングプロトコル 267
8-4-4 送信処理
8-4-5 同期送信処理
8-4-6 非同期送信処理
8-4-7 カスタムペイロード
エンコーダクラス
8-4-8 ブロードキャスト送信
8-4-9 状態管理
8-4-10 サーブレットアプリと共存
ログインユーザ情報の共有
9章 JSF(基礎編) 280
9-1 JSF[JavaServer Faces]とは 280
9-1-1 JSFアプリケーションの作成
9-2 Facelets 287
9-2-1 HTMLタグライブラリ
基本コンポーネント
テーブルコンポーネント
ファイルアップロード
レイアウト
9-2-2 UIComponentクラス
9-2-3 コンポーネントの属性
id属性
① Facelets内でコンポーネントを指定する
② Javaのコードでコンポーネントを扱う
③ Faceletsから出力されるHTMLをJavaScriptで扱う
binding属性
rendered属性
9-2-4 HTML5への対応
① Pass-through Attributesのコアライブラリを利用する
② <f:passThroughAttribute >タグを利用する
③ <f:passThroughAttributes >タグを利用する
9-2-5 リソース
CSS,JavaScipt,画像ファイルの利用方法
リソースのバージョン管理
Resource Library Contract
9-3 管理Bean 308
9-3-1 @RequestScoped
9-3-2 @ViewScoped、@SessionScoped、 @ApplicationScoped
9-3-3 @FlowScoped
9-4 EL式 315
9-5 ライフサイクル 316
9-5-1 Restore View
9-5-2 Apply Request Values
9-5-3 Process Validations
9-5-4 Update Model Values
9-5-5 Invoke Application
9-5-6 Render Response
9-6 ナビゲーション 320
9-6-1 POSTによるナビゲーション
9-6-2 GETによるナビゲーション
9-7 パラメータの渡し方 321
9-7-1 クエリ文字列の利用
9-7-2 Flashオブジェクトの利用
9-7-3 @SessionScopedな管理Beanの利用
10章 JSF(実践編) 324
10-1 Ajax(Asynchronous JavaScript + XML) 324
10-2 コンバータ 328
10-2-1 標準コンバータ
10-2-2 カスタムコンバータ
10-3 バリデータ 331
10-3-1 標準バリデータ
10-3-2 カスタムバリデータ
10-4 テンプレート 334
10-5 複合コンポーネント 336
10-6 カスタムコンポーネント 341
10-7 リッチコンポーネントライブラリ 342
10-8 例外ハンドリング 348
10-8-1 エラーページ
10-8-2 ExceptionHandler
10-9 その他 351
10-9-1 セキュリティ
HTMLエスケープ
CSRF[Cross-Site Request Forgeries]
セッションIDの変更
SQLインジェクト
10-9-2 パフォーマンス
Project Stage
Skip Comments
Reflesh Period
Stateless View
その他
11章 Bean Validation 355
11-1 Bean Validationとは 355
11-1-1 Bean Validationの利用方法
11-2 Bean Validationの定義 358
11-2-1 Built-in constraints
@Null/@NotNull
@AssertFalse/@AssertTrue
@Size
@Min/@Max
@DecimalMin/@DecimalMax
@Digits
@Past/@Future
@Pattern
11-2-2 Bean Validationのアノテーション定義
11-2-3 Bean Validationの宣言方法
フィールド
プロパティ
クラス
コンストラクタ/メソッド
[COLUMN]validatedByの指定が空となっている理由 363
11-2-4 Bean Validationのメッセージ
11-3 Bean Validationの機能 367
11-3-1 Custom Constraints
11-3-2 Object graph validation
11-3-3 Constraint Composition
11-3-4 Grouping constraints
11-3-5 GroupSequence
11-3-6 Multi-valued constraint
11-3-7 Cross-Parameter Constraints
11-4 Java EEとBean Validation 377
12章 MVC 380
12-1 MVC1.0登場の背景 380
12-2 MVC1.0(JSR-371)の基本 381
12-3 Controller 382
12-4 Model 384
12-5 View 386
12-6 リダイレクト 388
12-7 入力チェック 390
12-8 例外ハンドリング 394
12-9 セキュリティ対策 395
12-9-1 CSRF(Cross-site Request Forgery)
12-9-2 XSS(Cross-site Scripting)
12-10 参照実装Ozark
[COLUMN]本当にJava EEで良いですか?
Part 4 データアクセス層
13章 JPA(基礎編) 400
13-1 JPAの基礎 400
13-1-1 JPA[Java Persistence API]とは
13-1-2 JPAの構成要素
エンティティ
EntityManager
永続性コンテキスト
EntityManagerFactory
永続性ユニット
13-2 はじめてのJPA 405
13-2-1 プロジェクトの作成
13-2-2 データベースの作成
13-2-3 エンティティの作成
13-2-4 persistence.xml IEE
13-2-5 EntityManagerを使用したJPAプログラミング
13-2-6 Web向けエンドポイントの作成
13-2-7 アプリケーションのデプロイと実行
13-3 エンティティ 419
13-3-1 Entityの定義
13-3-2 永続化属性の定義
13-3-3 主キーの設定
RDBMS[Relational Database Management System]固有の自動生成機能を使用する方法
シーケンスを使用する方法
テーブルを使用する方法
どの方法を使用するかを永続プロバイダに任せる方法
13-3-4 複合キーの使用
13-3-5 埋め込みクラスの利用
13-3-6 日時を扱う属性の定義
13-3-7 精度を持つ数値属性の定義
13-3-8 ラージオブジェクトの利用
13-3-9 列挙型の利用
13-3-10 永続化対象外のフィールド
13-3-11 インデックスの定義
13-4 EntityManagerの利用 435
13-4-1 EntityManagerの生成
13-4-2 エンティティの状態とライフサイクル
13-4-3 新規状態のエンティティ
13-4-4 管理状態のエンティティ
主キー検索/クエリ検索による管理状態
13-4-5 分離状態のエンティティ
13-4-6 削除済みのエンティティl
13-5 永続性ユニットの設定 445
13-6 コールバック 448
13-6-1 コールバック用アノテーション
13-6-2 エンティティリスナー
14章 JPA(発展編) 453
14-1 関連 453
14-1-1 1方向の1対1
14-1-2 双方向の1対1
14-1-3 1方向の多対1
14-1-4 1方向の1対多
14-1-5 双方向の1対多/多対1
14-1-6 1方向の多対多
14-1-7 双方向の多対多
14-1-8 関連のソート
14-1-9 関連エンティティのフェッチ
14-1-10 関連エンティティへのイベントの伝播
[COLUMN]Cascade Type.PERSISTEの注意点
14-1-11 関連エンティティと主キーを共有
14-2 JPQL[Java Persistence Query Language] 473
14-2-1 SELECT文
SELECT句
FROM句
内部結合
外部結合
フェッチ結合
WHERE句
バインドパラメータ
演算子
リテラル
BETWEEN述語
IN述語
LIKE述語
サブクエリ
EXISTS述語
ALL/ANY述語
ORDER BY句
GROUP BY句/HAVING句
集約関数
組み込み関数
CASE式
[COLUMN] ネストしたJOIN FETCH 482
14-2-2 UPDATE文/DELETE文
Named Query
14-3 Criteria Query 492
Metamodel APIを用いたタイプセーフなクエリ
Criteria QueryのJOIN
Criteria QueryのAND/OR条件
Criteria Queryで動的なクエリ作成
Criteria APIによるUPDATE/DELETE
14-4 Native Query 500
14-5 ストアドプロシージャ 501
14-6 JPAでサポートされていないフィールド型のマッピング 504
14-7 エンティティグラフ 506
14-7-1 アノテーションによる静的なエンティティグラフの定義
14-7-2 エンティティグラフの使用方法
14-7-3 Entity Graph APIによる動的なエンティティグラフの定義
14-9 同時実行制御 516
14-9-1 エンティティのバージョンニングによる楽観的ロック
14-9-2 ロックモード指定による明示的なロック
ロックモード指定による楽観的ロック
ロックモード指定による悲観的ロック
14-10 キャッシュ 522
15章 トランザクション管理 525
15-1 トランザクションとは 525
15-2 JDBCによるトランザクション管理 526
15-2-1 JDBCによるトランザクション管理の課題
JDBCの課題① 複数クラスをまたがるトランザクション管理コードが煩雑
JDBCの課題② 複数データベースにまたがるトランザクションが実行できない
15-3 JTA[Java Transaction API]の概要 531
APIやアノテーションによる、トランザクション境界を定義する機能
X/Open XA仕様の実装による、グローバルトランザクション機能
外部のトランザクションマネージャとの連携機能
15-4 JTAによるトランザクション境界の定義 533
15-4-1 @Transactionalによる宣言的トランザクション
JTAとJDBCの連携
JTAとJPAの連携
@Transactionalのロールバックポリシー
トランザクション属性
TxType.REQUIRED(デフォルト)
TxType.REQUIRES_NEW
TxType.MANDATORY
TxType.SUPPORTS
TxType.NOT_SUPPORTED
TxType.NEVER
@Transactionalの仕組み
@Transactionalの注意点
15-4-2 UserTransactionによるトランザクション管理
15-6 JTAによるグローバルトランザクション 545
15-6-1 グローバルトランザクションとXAResourceインターフェース
15-6-2 XAリカバリ
トランザクションログが失われた場合
リソースマネージャによりヒューリスティックな決定がなされた場合
15-6-3 グローバルトランザクションの注意点
性能の劣化
一貫性を完全に保証するものではない
DBサーバ固有の考慮が必要
16章 EJB Lite 550
16-1 EJB[Enterprise JavaBeans]とは 550
16-1-1 EJB Liteとは
16-2 セッションBean 552
16-2-1 ステートレスセッションBean
16-2-2 ステートフルセッションBean
ステートフルセッションBeanのライフサイクル
パッシブ化
ステートフルセッションBeanの平行アクセス
ステートフルセッションBeanの用途
16-2-3 シングルトンセッションBean
シングルトンセッションBeanの平行アクセス制御
@Startupによるアプリケーション起動時初期化
16-3 クライアントビューとビジネスインターフェース 562
16-4 セッションBeanの例外ハンドリング 564
16-4-1 アプリケーション例外
16-4-2 システム例外
16-5 セッションBeanのコンテナ管理トランザクション機能 566
16-6 グローバルJNDI名 568
例① sample.warにセッションBeanの実装クラスjp.co.gihyo.perfect.javaee.SampleBeanが含まれている場合
例② 例①の条件に加えて、SampleBeanクラスがインターフェースjp.co.gihyo.perfect.javaee.Sampleを実装している場合
例③ 例①の条件に加えて、sample.warがapp.earに含められている場合
16-7 セッションBeanへのインターセプタ適用 570
16-8 EJBタイマーサービス 570
16-8-1 @Scheduleによる定時起動タイマ
16-8-2 TimerServiceによるAPIを用いたタイマ定義
16-8-3 タイマーの永続化
16-9 @Aynchronousによる非同期メソッドの実行 577
16-9-1 非同期メソッドのキャンセル
16-9-2 非同期メソッドのトランザクションコンテキスト
[COLUMN]CDI & EJBの使い分け 580
付録 JSP 581
A-1 JSPとは 581
JSPの文法
ディレクティブ
スクリプト
アクション
JSPの暗黙オブジェクト
本書のJSPの前提
索引 [584-589]
著者略歴 [590-591]
【関連記事】
・本書の前提にある、Java SE[Standard Edition]編。
『パーフェクトJava[改訂2版]』(井上誠一郎, 永井雅人 技術評論社 2014//2009) - contents memorandum はてな