asakusa framework 演算子の処方箋

49
2014/1/29 平松 雅宏 演算子の処方箋

Upload: hmasa

Post on 28-Jun-2015

1.193 views

Category:

Technology


0 download

DESCRIPTION

Asakusa Framework 演算子の処方箋 です。

TRANSCRIPT

Page 1: Asakusa Framework 演算子の処方箋

2014/1/29 平松 雅宏

演算子の処方箋

Page 2: Asakusa Framework 演算子の処方箋

自己紹介

職業 : ITエンジニアという名のなんでも屋。 ( 今日は、個人的な立場で本イベント参加 ) 近況 : Hadoopを(中心に)見たり、さわったり、構築したりしています。 Asakusa Frameworkとの出会い : 1年ほど前に、同僚から紹介されて知りました。 ↓ MapReduceを書きたくなかったので、 DSLでデータフローを記述すれば良いと言われ、喜びました。 ↓ DSLをJavaで記述しなくてはいけないと知り、少し悲しくなりました。 ( でも、MapReduceで書くよりは良いし、バッチ処理って他のツールでは扱いにくいから、と思い、ちょっと勉強 )

↓ しかし、Hishidamaさんがなんとかしてくれるみたいで、少し立ち直りました。

1

Page 3: Asakusa Framework 演算子の処方箋

アジェンダ

[1] Asakusa Frameworkの開発環境の作り方 [2] サンプルを使って演算子を理解しよう [3] 演算子リファレンスとの戦い方 [4] まとめ

2

Page 4: Asakusa Framework 演算子の処方箋

アジェンダ

[1] Asakusa Frameworkの開発環境の作り方 [2] サンプルを使って演算子を理解しよう [3] 演算子リファレンスとの戦い方 [4] まとめ

3

Page 5: Asakusa Framework 演算子の処方箋

Asakusa Frameworkの開発環境の作り方

Jinrikisha(人力車)を使う方法が簡単です。

Jinrikishaは、Asakusa Framework開発環境用のインストーラパッケージです。

以下のソフトウェアをインストールしてくれます。

(1)Apache Maven

(2)Apache Hadoop

(3)Eclipse

(4)Asakusa Framework

以下のURLからダウンロードできます。 http://asakusafw.s3.amazonaws.com/documents/jinrikisha/ja/html/index.html

( Googleで、asakusa framework jinrikisha と検索すると、最初に出てきます。)

※ 個別にインストールする手順もあります。 [Asakusa Framework スタートガイド]

http://asakusafw.s3.amazonaws.com/documents/latest/release/ja/html/introduction/start-guide.html

4

Page 6: Asakusa Framework 演算子の処方箋

Asakusa Frameworkの開発環境の作り方

Jinrikisha(人力車)を使う際のご注意

・ 事前にJDK($JAVA_HOME)のインストールが必要です。

・ インターネット接続環境が必要です。

5

Page 7: Asakusa Framework 演算子の処方箋

アジェンダ

[1] Asakusa Frameworkの開発環境の作り方 [2] サンプルを使って演算子を理解しよう [3] 演算子リファレンスとの戦い方 [4] まとめ

6

Page 8: Asakusa Framework 演算子の処方箋

サンプルを使って演算子を理解しよう

AsakusaFrameworkのサンプルを使います。

7

ゴール設定 1 : サンプルからAsakusaのバッチ開発の流れを理解する。

ゴール設定 2 : 演算子について理解する。 ( 演算子リファレンスの読み方を理解する )

Page 9: Asakusa Framework 演算子の処方箋

Asakusaの開発の流れ

サンプルをながめる前に、Asakusaの開発の流れについて

[1] Batch DSL

[2] Flow DSL

[3] Operator DSL 3つのDSL(+DMDL)を定義・実装していくことになります。

8

# Asakusa DSL 定義すること

1 Batch バッチ業務単位に使用するFlowを定義

2 Flow データフロー(ジョブフロー)を定義 ( 実装したOperatorを呼び出す役割 )

3 Operator データモデルの操作 (分岐/加工/集計/更新 etc …)を定義

4 DMDL バッチ処理内で使用するデータモデルを定義 ( データモデルのJavaクラスは自動生成 )

Page 10: Asakusa Framework 演算子の処方箋

サンプルの入出力データモデル

サンプル : 商品のカテゴリ別の売上集計

9

売上明細

売上日時

店舗コード

商品コード

数量

販売単価

販売金額

ファイル名

商品マスタ

商品コード

商品名

商品部門コード

商品部門名

商品カテゴリコード

商品カテゴリ名

商品単価

マスタ登録日

マスタ適用開始日

マスタ適用終了日

入力データモデル(CSV)

店舗マスタ

店舗コード

店舗名称

カテゴリ別売上集計

カテゴリコード

販売数量

売上合計

エラー情報

ファイル名

売上日時

店舗コード

商品コード

エラーメッセージ

出力データモデル(CSV)

Page 11: Asakusa Framework 演算子の処方箋

サンプルのデータフローを考える

データフローを考えよう。

10

売上明細…

売上日時

店舗コード

商品コード

店舗マスタ

店舗コード

店舗名称

商品マスタ…

商品コード

商品名

カテゴリコード

カテゴリ別売上集計 …

カテゴリコード

販売数量

売上合計

エラー情報 …

店舗コード

商品コード

エラーメッセージ

⑤ 操作:集計

操作:エラーチェック

操作:結合

Page 12: Asakusa Framework 演算子の処方箋

Asakusa DSLで定義することを考える

各DSLで必要な定義項目を考えよう。

11

# Asakusa DSL 定義すること

1 Batch バッチ業務単位に使用するFlowを定義 バッチ:カテゴリ別売上集計ジョブの呼出

2 Flow データフロー(ジョブフロー)を定義 フロー:各操作の呼出

3 Operator (演算子)

データモデルの操作 (分岐/加工/集計/更新 etc …)を定義 操作:エラーチェック処理 操作:結合処理 / 集計処理

4 DMDL バッチ処理内で使用するデータモデルを定義 ① 売上明細 ② 店舗マスタ ③ 商品マスタ ④ エラー情報 ⑤ カテゴリ別売上集計

Page 13: Asakusa Framework 演算子の処方箋

DMDLの定義をながめる

各DSLの定義例 ( DMDL編 –[売上明細]の場合 )

12

■ POINT1 DMDLは拡張子が.dmdlであれば、 どんな名前でも良い。 ■ POINT2 1つのdmdlファイルに 複数のデータモデルを定義可能

■ POINT3 DMDLからコード生成は、 pom.xmlから[右クリック]で。

Page 14: Asakusa Framework 演算子の処方箋

演算子の定義方法について考える

各DSLの定義例 ( Operator編 )

13

Q1. エラーチェック処理と、集計処理はどうやって実装すれば良いか?

A1. 演算子(Operator)を使って、データモデルを操作して、実装します。

Q2. どのような演算子(Operator)があるのか?

Page 15: Asakusa Framework 演算子の処方箋

演算子のご紹介

14

グループ整列演算子 (@GroupSort)

分割演算子 (Split)

チェックポイント演算子 (checkpoint)

ロギング演算子 (Logging)

空演算子 (empty)

停止演算子 (stop)

畳み込み演算子 (@Fold)

単純集計演算子 (@ Summarize )

マスタ結合演算子 (@MasterJoin)

マスタ分岐演算子 (@MasterBranch)

マスタつき更新演算子 (@MasterJoinUpdate)

マスタ確認演算子 (@MasterCheck)

分岐演算子 (@Branch)

合流演算子 (confluent)

再構築演算子 (restructure)

更新演算子 (@Update)

射影演算子 (project)

拡張演算子 (extend)

特殊演算子

フロー演算子

データ操作 演算子

結合演算子

集計演算子

グループ結合演算子 (@CoGroup)

変換演算子 (@Convert )

抽出演算子 (@Extract)

Page 16: Asakusa Framework 演算子の処方箋

演算子の定義方法について考える

各DSLの定義例 ( Operator編 )

15

Q1. エラーチェック処理と、集計処理はどうやって実装すれば良いか?

A1. 演算子(Operator)を使って、データモデルを操作して、実装します。

Q2. どのような演算子(Operator)があるのか?

A2. たくさんあります。

では、エラーチェック処理で使う演算子は?

Page 17: Asakusa Framework 演算子の処方箋

エラーチェック処理で使用する演算子は?

16

グループ整列演算子 (@GroupSort)

分割演算子 (Split)

チェックポイント演算子 (checkpoint)

ロギング演算子 (Logging)

空演算子 (empty)

停止演算子 (stop)

畳み込み演算子 (@Fold)

単純集計演算子 (@ Summarize )

マスタ結合演算子 (@MasterJoin)

マスタ分岐演算子 (@MasterBranch)

マスタつき更新演算子 (@MasterJoinUpdate)

マスタ確認演算子 (@MasterCheck)

分岐演算子 (@Branch)

合流演算子 (confluent)

再構築演算子 (restructure)

更新演算子 (@Update)

射影演算子 (project)

拡張演算子 (extend)

特殊演算子

フロー演算子

データ操作 演算子

結合演算子

集計演算子

グループ結合演算子 (@CoGroup)

変換演算子 (@Convert )

抽出演算子 (@Extract)

Page 18: Asakusa Framework 演算子の処方箋

エラーチェック処理で使用する演算子は?

17

グループ整列演算子 (@GroupSort)

分割演算子 (Split)

チェックポイント演算子 (checkpoint)

ロギング演算子 (Logging)

空演算子 (empty)

停止演算子 (stop)

畳み込み演算子 (@Fold)

単純集計演算子 (@ Summarize )

マスタ結合演算子 (@MasterJoin)

マスタ分岐演算子 (@MasterBranch)

マスタつき更新演算子 (@MasterJoinUpdate)

マスタ確認演算子 (@MasterCheck)

分岐演算子 (@Branch)

合流演算子 (confluent)

再構築演算子 (restructure)

更新演算子 (@Update)

射影演算子 (project)

拡張演算子 (extend)

特殊演算子

フロー演算子

データ操作 演算子

結合演算子

集計演算子

グループ結合演算子 (@CoGroup)

変換演算子 (@Convert )

抽出演算子 (@Extract)

Page 19: Asakusa Framework 演算子の処方箋

?

エラーチェック処理で使用する演算子は?

各DSLの定義例 ( Operator編 )

18

Q3. MasterCheck演算子を使って、売上明細のレコードから

店舗マスタに存在しないレコードだけを取り出しました。

取り出したレコードのデータモデルを、

どうやって[エラー情報]のデータモデルにマッピングしますか?

売上明細

売上日時

店舗コード

商品コード

数量

販売単価

販売金額

ファイル名

エラー情報

ファイル名

売上日時

店舗コード

商品コード

エラーメッセージ

MasterCheck

店舗マスタ

店舗コード

店舗名称

Page 20: Asakusa Framework 演算子の処方箋

エラーチェック処理で使用する演算子は?

19

グループ整列演算子 (@GroupSort)

分割演算子 (Split)

チェックポイント演算子 (checkpoint)

ロギング演算子 (Logging)

空演算子 (empty)

停止演算子 (stop)

畳み込み演算子 (@Fold)

単純集計演算子 (@ Summarize )

マスタ結合演算子 (@MasterJoin)

マスタ分岐演算子 (@MasterBranch)

マスタつき更新演算子 (@MasterJoinUpdate)

マスタ確認演算子 (@MasterCheck)

分岐演算子 (@Branch)

合流演算子 (confluent)

再構築演算子 (restructure)

更新演算子 (@Update)

射影演算子 (project)

拡張演算子 (extend)

特殊演算子

フロー演算子

データ操作 演算子

結合演算子

集計演算子

グループ結合演算子 (@CoGroup)

変換演算子 (@Convert )

抽出演算子 (@Extract)

Page 21: Asakusa Framework 演算子の処方箋

エラーチェック処理で使用する演算子は?

20

グループ整列演算子 (@GroupSort)

分割演算子 (Split)

チェックポイント演算子 (checkpoint)

ロギング演算子 (Logging)

空演算子 (empty)

停止演算子 (stop)

畳み込み演算子 (@Fold)

単純集計演算子 (@ Summarize )

マスタ結合演算子 (@MasterJoin)

マスタ分岐演算子 (@MasterBranch)

マスタつき更新演算子 (@MasterJoinUpdate)

マスタ確認演算子 (@MasterCheck)

分岐演算子 (@Branch)

合流演算子 (confluent)

変換演算子 (@Convert )

再構築演算子 (restructure)

更新演算子 (@Update)

射影演算子 (project)

拡張演算子 (extend)

特殊演算子

フロー演算子

データ操作 演算子

結合演算子

集計演算子

グループ結合演算子 (@CoGroup)

抽出演算子 (@Extract)

Page 22: Asakusa Framework 演算子の処方箋

エラーチェック処理で使用する演算子は?

各DSLの定義例 ( Operator編 )

21

Q3. MasterCheck演算子を使って、売上明細のレコードから

店舗マスタに存在しないレコードだけを取り出しました。

取り出したレコードのデータモデルを、

どうやって[エラー情報]のデータモデルにマッピングしますか?

A3. データ操作演算子を使います。

サンプルを確認してみましょう。

Page 23: Asakusa Framework 演算子の処方箋

エラーチェック処理のフロー

各DSLの定義例 ( Operator編 )

22

Update

売上明細

売上日時

店舗コード

商品コード

数量

販売単価

販売金額

ファイル名

エラー情報

ファイル名

売上日時

店舗コード

商品コード

エラーメッセージ

MasterCheck

店舗マスタ

店舗コード

店舗名称

Restructure

売上明細とエラー情報の同一カラムは自動的にマッピングする演算子

エラーメッセージを 更新する演算子

Page 24: Asakusa Framework 演算子の処方箋

エラーチェック処理の演算子の実装

各DSLの定義例 ( Operator編 – エラーチェック処理 )

23

Point : エラーチェック処理を実現するには、複数の演算子を使用します。

1. 店舗マスタと売上明細の突合せ ( MasterCheck )

2. 1.の結果不適合なレコードを、[エラー情報]へ再構築 ( Restructure )

3. エラーレコードにエラーメッセージを設定 ( Update )

Page 25: Asakusa Framework 演算子の処方箋

コア演算子とユーザ演算子

24

グループ整列演算子 (@GroupSort)

分割演算子 (Split)

チェックポイント演算子 (checkpoint)

ロギング演算子 (Logging)

空演算子 (empty)

停止演算子 (stop)

畳み込み演算子 (@Fold)

単純集計演算子 (@ Summarize )

マスタ結合演算子 (@MasterJoin)

マスタ分岐演算子 (@MasterBranch)

マスタつき更新演算子 (@MasterJoinUpdate)

マスタ確認演算子 (@MasterCheck)

分岐演算子 (@Branch)

合流演算子 (confluent)

再構築演算子 (restructure)

更新演算子 (@Update)

射影演算子 (project)

拡張演算子 (extend)

特殊演算子

フロー演算子

データ操作 演算子

結合演算子

集計演算子

グループ結合演算子 (@CoGroup)

変換演算子 (@Convert )

抽出演算子 (@Extract)

Page 26: Asakusa Framework 演算子の処方箋

結合処理 / 集計処理 で使用する演算子は?

各DSLの定義例 ( Operator編 )

25

Q4. 売上明細と商品マスタからカテゴリ別売上集計を出力したい。

どの演算子を使えば実現できるか?

売上明細

売上日時

店舗コード

商品コード

数量

販売単価

販売金額

商品マスタ

商品コード

商品名

商品部門コード

商品部門名

商品カテゴリコード

商品カテゴリ名

商品単価

マスタ登録日

マスタ適用開始日

マスタ適用終了日

カテゴリ別売上集計

カテゴリコード

販売数量

売上合計

?

?

?

Page 27: Asakusa Framework 演算子の処方箋

結合処理 / 集計処理 で使用する演算子は?

26

グループ整列演算子 (@GroupSort)

分割演算子 (Split)

チェックポイント演算子 (checkpoint)

ロギング演算子 (Logging)

空演算子 (empty)

停止演算子 (stop)

畳み込み演算子 (@Fold)

単純集計演算子 (@ Summarize )

マスタ結合演算子 (@MasterJoin)

マスタ分岐演算子 (@MasterBranch)

マスタつき更新演算子 (@MasterJoinUpdate)

マスタ確認演算子 (@MasterCheck)

分岐演算子 (@Branch)

合流演算子 (confluent)

再構築演算子 (restructure)

更新演算子 (@Update)

射影演算子 (project)

拡張演算子 (extend)

特殊演算子

フロー演算子

データ操作 演算子

結合演算子

集計演算子

グループ結合演算子 (@CoGroup)

変換演算子 (@Convert )

抽出演算子 (@Extract)

Page 28: Asakusa Framework 演算子の処方箋

結合処理 / 集計処理 の フロー

各DSLの定義例 ( Operator編 )

27

売上明細

売上日時

店舗コード

商品コード

数量

販売単価

販売金額

ファイル名

MasterJoin summarize

商品マスタ

商品コード

商品名

商品部門コード

商品部門名

商品カテゴリコード

商品カテゴリ名

商品単価

マスタ登録日

マスタ適用開始日

マスタ適用終了日

カテゴリ別売上集計

カテゴリコード

販売数量

売上合計

Page 29: Asakusa Framework 演算子の処方箋

結合処理 / 集計処理の演算子の実装

各DSLの定義例 ( Operator編 – 結合 / 集計処理 )

28

Point : 結合 / 集計処理を実現するには、以下の演算子を使用します。

1. 売上明細と商品マスタを結合します ( MasterJoin + DMDL )

2. 1.の結果から、カテゴリ別の売上を集計します( Summarize + DMDL )

Page 30: Asakusa Framework 演算子の処方箋

結合処理 / 集計処理の演算子の実装

各DSLの定義例 ( Operator編 – 結合 / 集計処理 )

29

Point : 結合 / 集計処理を実現するには、以下の演算子を使用します。

1. 売上明細と商品マスタを結合します ( MasterJoin + DMDL )

2. 1.の結果から、カテゴリ別の売上を集計します( Summarize + DMDL )

Page 31: Asakusa Framework 演算子の処方箋

結合処理 / 集計処理の演算子の実装

各DSLの定義例 ( Operator編 – 結合 / 集計処理 )

30

Point : 結合 / 集計処理を実現するには、以下の演算子を使用します。

1. 売上明細と商品マスタを結合します ( MasterJoin + DMDL )

2. 1.の結果から、カテゴリ別の売上を集計します( Summarize + DMDL )

Page 32: Asakusa Framework 演算子の処方箋

Asakusa DSLで定義することを細かく考える

各DSLで必要な定義項目を考えよう。

31

# Asakusa DSL 定義すること

3 Operator (演算子)

データモデルの操作 (分岐/加工/集計/更新 etc …)を定義 操作:エラーチェック処理 MasterCheck / Restructure / Update 演算子 操作:結合処理 / 集計処理 MasterJoin / Summarize 演算子

4 DMDL バッチ処理内で使用するデータモデルを定義 ① 売上明細 ② 店舗マスタ ③ 商品マスタ ④ エラー情報 ⑤ カテゴリ別売上集計 ( summarize ) ⑥ 売上明細+商品マスタ ( joined )

Page 33: Asakusa Framework 演算子の処方箋

Flow(ジョブフロー)の実装

各DSLの定義例 ( Flow編 – 演算子を呼び出します )

32

describeメソッドの実装 ■ POINT1 演算子はFactoryクラスを、 インスタンス化して使用します。

■ POINT2 Factoryクラスは、 自動生成されます

Page 34: Asakusa Framework 演算子の処方箋

Flow(ジョブフロー)の実装

各DSLの定義例 ( Flowの実装の面倒なところ決まり事 )

33

■ POINT1 Flowに必要なINPUTとOUTPUTを 宣言する必要があります。

■ POINT2 Flowに必要なINPUTとOUTPUTを 実装する必要があります。

■ POINT3 salesDetail+storeInfoの結合モデルは、 ファイル出力しないから宣言不要

Page 35: Asakusa Framework 演算子の処方箋

Batchの実装

各DSLの定義例 ( Batch編 –ジョブフローを呼び出します)

34

Page 36: Asakusa Framework 演算子の処方箋

Asakusa DSLで定義することを細かく考える

各DSLで必要な定義項目を考えよう。

35

# Asakusa DSL 定義すること

1 Batch バッチ業務単位に使用するFlowを定義 バッチ:カテゴリ別売上集計ジョブの呼出

2 Flow データフロー(ジョブフロー)を定義 フロー:各操作の呼出 MasterCheck / Restructure / Update MasterJoin / Summarize 演算子の呼出 インポータ(INPUT) エクスポータ(OUTPUT)の実装と宣言 INPUT : ① 売上明細 ② 店舗マスタ ③ 商品マスタ OUTPUT : ④ エラー情報 ⑤ カテゴリ別売上集計

Page 37: Asakusa Framework 演算子の処方箋

サンプルを使って演算子を理解しよう

まとめ

1.最初に、データフローを定義することから

Asakusa Frameworkの開発は始まります。

2. フローが決まれば、データモデル(DMDL)、演算子(Operator)

ジョブフロー(Flow)、バッチ(Batch)と実装していきます。

3. 演算子は多数あります。

[point1] : コア演算子/ユーザ演算子があります。

[point2] : DMDLに定義が必要な演算子もあります。

[point3] : フロー/集計/データ操作/結合演算子があります。

36

Page 38: Asakusa Framework 演算子の処方箋

アジェンダ

[1] Asakusa Frameworkの開発環境の作り方 [2] サンプルを使って演算子を理解しよう [3] 演算子リファレンスとの戦い方 [4] まとめ

37

Page 39: Asakusa Framework 演算子の処方箋

演算子リファレンスとの戦い方

Asakusa Frameworkの演算子リファレンス

Asakusa Framework Documentationのサイトマップにリンクがあります。 (http://asakusafw.s3.amazonaws.com/documents/latest/release/ja/html/index.html )

38

Page 40: Asakusa Framework 演算子の処方箋

演算子リファレンスとの戦い方

39

Asakusa Frameworkの演算子リファレンスを読み解こう!(最難関)

各演算子の説明がありますが、読み方には心得が必要です。

まず、更新演算子(Update)を例にとってみましょう。

Page 41: Asakusa Framework 演算子の処方箋

演算子リファレンスとの戦い方

Asakusa Frameworkの演算子リファレンスを読み解こう!(最難関)

各演算子の説明がありますが、読み方には心得が必要です。

まず、更新演算子(Update)を例にとってみましょう。

40

Page 42: Asakusa Framework 演算子の処方箋

演算子リファレンスとの戦い方

41

Flow DSLからUpdate演算子の呼出

Asakusa Frameworkの演算子リファレンスを読み解こう!(最難関)

各演算子の説明がありますが、読み方には心得が必要です。

まず、更新演算子(Update)を例にとってみましょう。

Page 43: Asakusa Framework 演算子の処方箋

演算子リファレンスとの戦い方

Asakusa Frameworkの演算子リファレンスを読み解こう!(最難関パート2)

各演算子の説明がありますが、読み方には心得が必要です。

次に、結合演算子(MasterJoin)を例にとってみましょう。

42

Page 44: Asakusa Framework 演算子の処方箋

演算子リファレンスとの戦い方

43

Asakusa Frameworkの演算子リファレンスを読み解こう!(最難関パート2)

各演算子の説明がありますが、読み方には心得が必要です。

次に、結合演算子(MasterJoin)を例にとってみましょう。

Page 45: Asakusa Framework 演算子の処方箋

演算子リファレンスとの戦い方

44

Asakusa Frameworkの演算子リファレンスを読み解こう!(最難関パート2)

各演算子の説明がありますが、読み方には心得が必要です。

次に、結合演算子(MasterJoin)を例にとってみましょう。

Page 46: Asakusa Framework 演算子の処方箋

演算子リファレンスとの戦い方

45

Asakusa Frameworkの演算子リファレンスを読み解こう!(最難関パート2)

各演算子の説明がありますが、読み方には心得が必要です。

次に、結合演算子(MasterJoin)を例にとってみましょう。

Page 47: Asakusa Framework 演算子の処方箋

演算子リファレンスとの戦い方

まとめ

演算子を知るには、演算子リファレンスを読み解く必要があります。

少し敷居が高いので、サンプルなどをヒントに撃破しましょう。

Asakusa Framework Documentationのサイトマップに

サンプルプログラム集のリンクがあります。 (http://asakusafw.s3.amazonaws.com/documents/latest/release/ja/html/index.html )

46

Page 48: Asakusa Framework 演算子の処方箋

アジェンダ

[1] Asakusa Frameworkの開発環境の作り方 [2] サンプルを使って演算子を理解しよう [3] 演算子リファレンスとの戦い方 [4] まとめ

47

Page 49: Asakusa Framework 演算子の処方箋

まとめ

48

ゴール設定 1 : サンプルからAsakusaのバッチ開発の流れを理解する。

ゴール設定 2 : 演算子について理解する。 ( 演算子リファレンスの読み方を理解する )