読者です 読者をやめる 読者になる 読者になる

ITお絵かき修行

3歩歩いても忘れないために

Rakuten Technology Conference 2016参加メモ

Rakuten Technology Conference 2016に参加した。

tech.rakuten.co.jp

会場が楽天クリムゾンハウスで、全セッションが英語での開催とのことだったので割を気合いをいれて会場に行ったが、受付の外国人のお兄さん(エンジニア?)が「受付はこちらでーす」と日本語で呼び込みをしていたので、心配は杞憂だった。

受付に限らず、参加者に対する案内は英語と日本語の両方でなされていたので、会場で過ごすこと自体に支障はなかった。

肝心のセッション内容については下記に参加メモを書く。*1

※正確な情報・見解は後日公開される(であろう)登壇者のスライドや公式資料を参照してください。
 またYouTubeに各講演の動画がアップされているので、そちらも併せて参照してください。


■Managing Creativity
Shuzo John Shiota
President and CEO, Polygon Pictures Inc.
Rakuten Technology Conference 2016: Managing Creativity

・Polygon Pictures Inc.のCEOによる講演。
・『シドニアの騎士』のテレビシリーズの制作を通じて、「Managing Creativity」を解説していた。
www.knightsofsidonia.com
モーションキャプチャの収録や3Dモデリングの様子を収めた動画を多用されていたので、非常に見ていて楽しかった。
・アニメーションの製作は細かな工程に分かれており、非常にたくさんの人が担当している。
→178名、12か国のメンバーをマネージメントする必要があった。
・製作現場ではスクラムボードを使って、各個人の作業進捗がわかるようにしていた。
・Motivation Management等、動機付け?に関するお話もしていた。


■Rakuten, Inc. Keynote Speech
Yasufumi Hirai
Group Executive Vice President, CIO & CISO, Rakuten, Inc.
Rakuten Technology Conference 2016: Rakuten, Inc. Keynote Speech
f:id:hhhhhskw:20161030192438j:plain
※写っているのは前に講演したTerje Marthinussen氏
・基調講演。
楽天グループが提供するサービスと、サービスから生み出されるデータを利用した、IoTやブロックチェーンといった分野のサービスを提供し、「Best Customer Experience」を提供します、というような内容だった。
・エンジニアの構成比を紹介していた。
→48%がアプリケーションエンジニア。女性エンジニアが22%を占める、などのデータを示していた。
楽天におけるAIの導入ステップとして、下記の3つのフェーズを経て導入しているとのこと。
「Routine(ルーチンワークの置き換え)」→「Desicion(意思決定支援)」→「Collabolation(コラボレーション)」
・『TIPPING POINT』という本に感銘を受けたとのこと。

The Tipping Point: How Little Things Can Make a Big Difference

The Tipping Point: How Little Things Can Make a Big Difference


■Huge Enterprise Systems Architecture Design with Java EE
Hirofumi Iwasaki
Group Manager, Rakuten Card Co.,Ltd.
Rakuten Technology Conference 2016: Huge Enterprise Systems Architecture Des...

JavaEEエンタープライズ向けのシステムを「今」作るとしたらどのような技術要素を選択すればよいか、という内容の講演。
JavaEEとは~JavaEEの歴史は~というJavaに関わってない人にも向けた講演内容だった。*2
StrutsからJSFへの、FrontEnd側の実装にパラダイムシフトが起こった、と解説されていたスライドが個人的には非常にわかりやすかった。
Strutsだと1viewに複数Actionが紐づけられるので実装が複雑になるが、JSFだとそのような作り方をしない、等
IDENetBeans使ってます、とのことだった。


■Creating a team of DevOps “Super Sentai”
Damien Caro
Tsuyoshi Ushio
Rakuten Technology Conference 2016: Creating a team of DevOps “Super Sentai”

・牛尾さんの「DevOps!!」というコールから始まった。
・牛尾さんの話はなく、牛尾さんの上司であるDamien Caro氏によるMicrosoft社内でのDevOps話がメインだった。
 →「日本にいれば私の話はいつでも聞けるでしょ」的なことを仰っていた気がする
Microsoft社内の社風が変わりつつあるという話で、ハッカソンを定期的に開催している話をされていた。
 →顧客も巻き込んで実施しているとのこと。


■感想
・英語で聞いて英語で理解する訓練が必要だと感じさせられた。
→発表中ならまだ単語を認識することができたが、QAやLT中の"普通"の速度で話されると全く聞き取れなかった。
・参加したセッションによるが、全体的に技術の話がメイン、というよりはサービス運営やサービスの活用といった話がメインだった。
・日本人の参加者も多かったが、日本語を話してるとなんとなくダサいと感じる雰囲気があったので、英語勉強しようという気にさせられた。
f:id:hhhhhskw:20161030192442j:plain

一億人の英文法 ――すべての日本人に贈る「話すため」の英文法(東進ブックス)

一億人の英文法 ――すべての日本人に贈る「話すため」の英文法(東進ブックス)

*1:記述内容については、私の英語力による文章なので、情報の過少や内容が間違っている可能性があるのでご容赦くださいm(_ _)m

*2: (自分のような)Java信奉者にとっては若干物足りない内容と感じるかもしれない。

Developers Summit 2016 Summerメモ【[A-3]共創と競争から生まれる新たなエコシステム】

Developers Summit 2016 Summerに参加した。
下記セッションに参加したので、参加メモを書いておく。
※正確な情報・見解は後日公開される(であろう)登壇者のスライドや公式資料等を参照のこと。

Developers Summit 2016 Summer
Developers Summit 2016 Summer [Enterprise] #devsumi

[A-3]共創と競争から生まれる新たなエコシステム

小笠原 治 (さくらインターネット)
Developers Summit 2016 Summer [Enterprise] #devsumi

【概要】

「さくらのIoT Platform α」のパートナーの取組みの紹介

【内容】

1.スマートロックに関する取組み
・賃貸物件の引っ越し時の際、一般的には12000円位支払って鍵交換をしている。
 スマートロックは月額500円位で運用することができ、鍵交換の際は電子データの書き換えで対応することができる。
 これにより、鍵交換をめぐるビジネスをサービス化することができる。
【参考】
ASCII.jp:賃貸で月額課金型スマートロック!さくらインターネットとシステムソフトが賃貸住宅向けホームIoTの合弁会社設立


2.IoT Matrix
・世間でいうところの「IoT」を2つの区分に分けていた。
 「狭義のIoT」:工業の効率化。受益者が「企業」。
 「広義のIoT」:人々の生活に新たな価値を与える。受益者が「消費者」。
・『IoT Matrix』とは、縦軸が「Internet」「Devise」「Things」、横軸が「Input」「Logic」「Output」のIoTのサービス特性を分析するマトリクス。
 広義のIoTを目指すサービスを提供するベンチャー企業は「Input」の「Internet」「Devise」の部分が弱い傾向がある。
 さくらのIoTはその部分をカバーするのが狙い。
・何をセンシングして、何をフィードバックし、何を提供するか、を考えることが重要。


3.水田ソリューションに関する取組み
・水田から取得したデータを農家から有料で買い取り、企業に売る。さくらは情報のとりまとめを行う。
・実証実験はさくらインターネット研究所が行い、その後事業化した。


4.人選(採用)の基準について
・ロボットに関わったことのある人、を基準にしている。
 色んな人と協力して物事を進めること、がわかっている人が多いため。学生ならアルバイトでもいいから雇う。
・ハード屋とソフト屋が共創するには、それぞれが普段使っているプラットフォームで開発できるようにする必要がある。


5.IoTのセキュリティ
・閉塞域でNW構築する必要があり、非常に面倒。
→NWの全てをさくらが提供する。


6.天草Xアスロン
・パラグライダーのリアルタイムでの位置情報把握を行うプロジェクトの話
・パラグライダーという競技自体がかなりハードな競技だったので、サービスの要求水準が高かった。
・電波法
 ・本番1か月前に、基地局は空をとんではいけないという決まりがあることを知った。
 ・そのためハードウェアとソフトウェアの大幅な見直しを行う必要があった。
 ・プロジェクトに参画していたハードウェアメーカーと協力して対応することができた。(納期1ヵ月)
・パラグライダーという競技を、「鑑賞できるスポーツ」に変えることができた。
・今後の目標:今回開発したモジュールをパラグライダー競技の標準装備にする。

【天草Xアスロン2016 公式サイト】
kuratakepara.info

OCJP Gold SE8へアップグレードした

Upgrade Java SE 7 to Java SE 8 OCP Programmer(1Z0-810)に合格した。
OCJP Gold SE7から同SE8への移行試験だったので、純粋なOCJP Gold SE8の試験(1Z0-809)とは内容が異なる。

点数は66点だった。(※合格点は65点)前回のSE7試験の時と同様に、超ギリギリだった。
なので今回も感想文もとい反省文を書く。

【試験】
Upgrade Java SE 7 to Java SE 8 OCP Programmer | Oracle Certification Exam
移行試験は公式*1でも言われている通り、ラムダまつりだった。
試験の8~9割はラムダ式とStreamAPIで占められており、たまにDate and Time APIが出現する問題構成だった。


【勉強方法】
1Z0-809試験に対応する英語の参考書は存在するが、1Z0-810試験に対応した参考書が日本語英語ともに存在しないという状態だった。(2016/5月時点)
1Z0-809用の参考書も検討したが、ラムダ式・StreamAPIの分量が少なく、また内容も基礎的な部分のみ試験対象とされていたので、参考書は使用せずWeb上の情報を中心に勉強を進めた。


【使用した教材 Web】

1.Exam 1Z0-810: Upgrade Java SE 7 to Java SE 8 OCP Programmer Study Guide

java.boot.by
初めは記述内容が合っているか不安だったが、記述内容は正確だった。*2
1Z0-810試験の試験項目に合わせた章立てとなっている。
各単元ごとに参照先のページが示されていたので、そこから一次情報を追うことができた。Oracle Tutorialからの引用が多かった印象。
docs.oracle.com
出典のページが最後にまとめられていたのが便利だった。
Bibliography

勉強手順としては、読む→サンプルコード写経→和訳してブログに書く という手順を繰り返した。
途中で和訳がしんどくなったので、読む→サンプルコード写経→大事そうな部分をメモる という手順に変えたが、効果はあったと感じている。
特にCollectionの辺りは他の方のブログやサイトのコードも写経した。
Javaラムダ式メモ(Hishidama's Java8 Lambda Expression Memo)

2.MyExamCloud

1Z0-810 OCPJP 8 Upgrade Practice Mock Exam 1 MyExamCloud online exam
IT系資格の模擬試験を提供するサイト。
「Time Offer(50% Discount)」などと書かれており、非常にうさんくさい。しかし無料の模擬試験を受けたところ、割といい感じと思えたので、「1Z0-810 OCPJP 8 Upgrade Practice Mock Exam 1~5」 を購入した。*3
難易度的には本番より少し易しめ~同程度だが、試験的中率はそこまで高くなかった印象*4。ただ、試験問題の雰囲気をつかむことはできる。

4.受ける前に見ておきたかった資料

自分の受験後に見つけた、Oracle Universityより公開された資料。

http://www.oracle.co.jp/jdt2016/pdf/HO-1.pdf
Java Day Tokyo 2016での試験対策セッション資料。非常にわかりやすく、練習問題も本番の感じに近い。

Oracle Certified Java Programmer, Gold SE 8 認定資格移行試験(1Z0-810)対 策ポイント解説セミナー(1) - YouTube
Oracle Certified Java Programmer, Gold SE 8 認定資格移行試験(1Z0-810)対 策ポイント解説セミナー(2) - YouTube
1Z0-810試験対策セミナー動画。これで睡眠学習ができる。


【使用した教材 書籍】
1.『現場で使える[最新]Java SE 7/8 速攻入門』

現場で使える[最新]Java SE 7/8 速攻入門

現場で使える[最新]Java SE 7/8 速攻入門

書籍はこの1冊しか使わなかった。
英語の情報をあたっているときに意味不明な箇所が出てきたら辞書的に引く、という使い方をした。この1冊を覚えるだけでも十分かもしれない。
Date and Time APIについては、日本語書籍の中では一番詳しく解説されていると思う。ただしアメリカの夏時間の取り扱いなど、微妙に触れきれていない部分もあるので、Web上の情報も併用して試験対策にあたった方が良いと思われる。


【試験の感想】
・Map、List、Collectionクラスに追加された新規メソッドはどれ?や正しい使い方はどれ?といった問題に苦戦した。
・内部クラス、無名内部クラス系の変数のスコープ問題にも苦戦した。
・StreamとIntStream、LongStreamなどのプリミティブなデータ型を使うStreamとの違い、はそもそもほとんど覚えられていなかった。
・Instant、Period、Durationはネット上でも積極的に取り上げている人が少なく、APIの利用方法を問われると弱かった。(さらにLocalDate、LocalDateTimeの違いや夏時間の計算、各種定数クラスを絡められたので非常にとてもつらかった)


【総括】
・非常にしんどかった。1回目の受験で合格できたが、落ちてたら挫折していたと思う。。
・全体的に間違いが多かったので、集合に対する操作にはラムダ式を意識してソースを書くよう心掛ける。
→試験のおかげで、関数に対する心理的な障壁はかなり無くなった、と感じている。

*1:http://www.oracle.co.jp/jdt2016/pdf/HO-1.pdf

*2:一部サンプルコードでコンパイルエラーが出るが、英語参考書のサンプルコードに比べればマシ、と個人的には感じている

*3:ステマではない。1~5までのセットで$30くらいだった。1を買うと1~5まで利用することができる。カード払いでVISAかMaster Cardが使える。

*4:2、3問ほぼ同じ問題が出た。全体的に「惜しい」と感じた

AWS Summit Tokyo 2016メモ【The State of The Art - AWS / EC2 Networking (同時通訳)】

AWS Summit Tokyo 2016に参加した。
下記セッションに参加したので、参加メモを書いておく。
※正確な情報・見解は後日公開される(であろう)登壇者のスライドや公式資料等を参照のこと。
www.awssummit.tokyo

The State of The Art - AWS / EC2 Networking (同時通訳)]

Kevin Miller (Director, Software Development, EC2 Networking, Amazon Web Services, Inc.)

【概要】

EC2における、LinuxカーネルレベルでのTCPネットワークパラメータチューニングの話。
AWS,EC2に拘った内容というよりは、Linux全般でのTCPチューニングの話だった。
とにかく話が早くあっという間に終わった。

【内容】

TCPの性能

TCPSSH、HTTP等のベースプロトコルであり、送信側と受信側それぞれが互いに接続しあう。
TCPの特徴として、異なる大きさの送信/受信ウィンドウを持つ。
輻輳制御ウィンドウ:送信側が制御する。輻輳制御アルゴリズムで制御する。
・パケットの損失(パケットロス)がスループットに与える影響について触れていた。
 TCPの統計値取得   :netstat -s | grep retransit
 ソケットレベルの診断:ss -ite
・パケットの再送状況をリアルタイムに取得できるコマンドがgithub上にあるとのこと。詳しくは下記を参照。
github.com

Linux輻輳制御アルゴリズム
1.BIC (Linux2.6.6~2.6.18)
2.CUBIC(Linux2.6.19以降)
TCP Renoに代わるアルゴリズム

・再送タイマー
パケットロスした、とみなす時間の設定。
短すぎると:過剰反応してしまい、パフォーマンスが落ちる。
長すぎると:パケットロスの検知が遅れ、パフォーマンスが落ちる。
デフォルトは200ミリ秒。

・ip route list
AWSの場合、サブネット内の他のインスタンスへルーティングしている場合があるので、そこの再送時間の設定を変える。(例えば10ミリ秒にする等)

・ネットワークパスのチューニング
パス上のルータにネットワークバッファがある。
→NWへの負荷が高まると、再送が多くなり、結果としてタイムアウトを引き起こす原因となる。

・ネットワークバッファのアクティブキュー管理
→tc qdisc list
・fq_codel
→チューニングが不要な、qdiscのアルゴリズム

・EC2拡張NW機能
EC2で提供するAmazonLinux,Windows(WindowsServer?)に組み込まれたドライバにて利用することができる。詳しくは下記を参照。
www.youtube.com

・MTU

Maximum Transmission Unit (MTU)は、ネットワークにおいて1回の転送(1フレーム)で送信できるデータの最大値を示す伝送単位のこと。
Maximum Transmission Unit - Wikipedia

多くのドライバは1500バイトを設定することができる。しかし上記の「EC2拡張NW機能」のドライバを使うと9000バイトまで設定することができる。よってオーバヘッドを減らすことができる。
→MTUの設定値は「ip route list」から確認することができる。

②応用

実際に上記で取り上げた要素を使って、測定を行った結果を紹介していた。

まとめ

・ネットワークはブラックボックスではない。Linuxの各種ツールを使用することで理解することができる。
・設定の調整により、性能を飛躍的に向上させることができる。
・ネットワークからアプリケーションのニーズを捉え、調整することが重要。

JavaDayTokyo2016メモ【3-E: Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか】

JavaDayTokyo2016に参加した。
下記セッションに参加したので、参加メモを書いておく。
www.oracle.co.jp

[3-E: Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか]

TIS株式会社
アプリケーション開発センター シニアエキスパート
川島 義隆 氏

【概要】

Java9で追加された新機能を使った設計・実装の紹介
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか

【内容】

1.nullチェック

・Optionalクラスを使いましょう、という話。
・Optionalクラスの使い方としては、nullが発生しうる実装個所を包み込むように実装すべき。
Javaの個々のAPIはnullチェックを意識した戻り値となっていないので、
Optionalを使ってAPI単位でのnullチェックを行うべき。

2.Mixin

mixin とはオブジェクト指向プログラミング言語において、サブクラスによって継承されることにより機能を提供し、単体で動作することを意図しないクラスである。
Mixin - Wikipedia

Javaは多重継承が認められていない。そのため、ミドルウェアパターンの実装を行う場合は、ミドルウェアに対応するサブクラスを実装する。(例:ResultSet)
Javaミドルウェアパターンを実装するときは、事前に(※I/F側に)多くのメソッドを予め用意しておく場合が多い。
・Java8以降ではI/Fにデフォルトメソッドを持つことが可能となったので、共通的な実装をI/F側で持つことができるようになった。
→ただし状態を持つことはできないので、デフォルトメソッド内からI/Fの別メソッドを参照するような実装をしておき、実装クラス側からオブジェクトを渡すよう強制する、といった方法をとることができる。
・動的mixinの方法として、MethodHandleというクラスがJava7から追加された。
→ただし従来のリフレクションの10~100倍遅い。

3.システム挙動の動的な変更(using REPL)

・アプリケーションに管理用APIを用意するには、という話。
・enkanというFWでは疑似REPLが用意されており、REPLからMWの状態を変更することが可能。
→enkanではJShellを取り込む、とのこと。

4.Java9時代の無停止デプロイ

●従来
①LBでサーバごと切り替え
→問題点:サーバが2台ないし3台必要。
②APサーバ(コンテナ)で対応
→問題点:メモリリーク

●これから
JVMのプロセス単位で切り替え


・SO_REUSEPORT((Linux kernel 3.9~より利用可能。同じuidから利用可。Windowsでは不可)という仕組みを利用して、同一ポートに対してリッスンするプロセスを複数立ち上げる。
・SO_REUSEPORTの利用には、ServerSocketChannelクラスのメソッドを実装したAPサーバが必要。現状だとJettyくらいしか選択肢がない。
・falchion-containerというJVMプロセスをプールするコンテナを作られたそう。
JMX・JStatで監視。

5.まとめ

・過剰設計が必要だったJavaも、必要なものだけを作ればよいという時代になった。
シンタックスのキャッチアップだけではなく、設計手法のアップデートもしよう。

JavaDayTokyo2016メモ【2-A: Project Jigsawではじめるモジュール開発】

Java JavaDayTokyo

JavaDayTokyo2016に参加した。
下記セッションに参加したので、参加メモを書いておく。
※正確な情報・見解は後日公開される(であろう)登壇者のスライドや公式資料等を参照のこと。
www.oracle.co.jp

[2-A: Project Jigsawではじめるモジュール開発]

Java in the Box 櫻庭 祐一 氏

【概要】

Project Jigsawの導入背景、モジュールの作成方法・使用方法の紹介

【内容】

1.導入背景

(1)現状
・現在のJavaには「クラスパスが複雑」「rt.jarの肥大化」という2つの課題を抱えている。
・上記に関連し、「JAR HELL」と呼ばれるような.jarファイル間の依存関係の複雑さも発生している。

(2)(1)の原因
・クラスパス・JARのパッケージング機構における、
「依存関係」「バージョン」「公開範囲」をコントロールする仕組みが不足しているため。
・特にクラスのpublic属性のアクセス範囲が広すぎることが大きな原因とみられている。
 →『public is TOO public』

(3)歴史
・2005年頃から提言はされていた。
・JSR277、JSR294といったJSRを経てProject Jigsawが発足し、Java9で採用。

2.モジュールの作成

・モジュールを作成する際の定義内容は以下の3要素。

Module extends JAR{
    dependency …「依存関係」
    export   …「公開範囲」
    version   …「バージョン」 ※バージョンに対応する仕組みはまだない。今後どうなるか不明とのこと。
}

・モジュールはJARの拡張。JARと同じくクラスパスに追加しクラスを読み込ませることは可能。

・今までのpublicクラスは誰からでもアクセス可能だった。これからの(※モジュール内の)publicクラスは、公開範囲に対応するクラスからしかアクセスできなくなる。
 →今後はmainメソッドを含むクラスを明示的に公開しないと、アプリが起動できなくなる。

・モジュールの定義内容は「modules-info.java」に記述する。「modules-info.java」は「src」フォルダ直下に置く。(※読み込み効率、複数ファイル対応etcの為)
例:modules-info.java

module fxdemo {
    requires javafx.controls;
    requires javafx.graphics;
}
3.モジュールの使用

(1)コンパイル
・jarコマンドに「--create」などのオプションを付与して実行する。tarっぽいらしい。

(2)実行
・実行時はオプションを指定して実行する。
 「モジュールのみ使用」「モジュールとクラスパス」といった使い方が可能。
例:実行コマンドの先頭部

java -mp mods -addmods ・・・

・mainメソッドの実行コマンドは「モジュール名/クラス名」となる。

4.MISC about Module

・「jdeps」…自分たちでモジュール(modules-info.java)を作成する際に使用できるツール。クラス、jarファイルの依存関係を出力できる。
・「jlink」…JREのカスタマイズが可能となるツール。組み込み用のライブラリのみ抜き出す、コアライブラリのみ抜き出すといったことが可能となる。


[感想など]
・モジュールを使った構成管理のプロセスが、antやGradleといったビルドツールで実現可能なのかが気になった。
・発表資料は毎回JavaFXで作成されているとのこと。

Upgrade Java SE 7 to Java SE 8 OCP Programmer(1Z0-810)対策 第三章 ラムダ式を使用するコレクション(1)

第三章よりラムダ式を使用したstreamに対するフィルタリングを取り扱う。

■注意
正確な情報は下記リンクを参照してください。

■試験対策ページ
java.boot.by

■試験
Upgrade Java SE 7 to Java SE 8 OCP Programmer | Oracle Certification Exam

3.1. forEach()メソッドメソッド・チェーンを使用したコレクションの反復処理

繰り返し処理を制御するイテレータには一般的に2つの実装アプローチが存在する。

Activeな(外部)イテレータ
Activeなイテレータでは、イテレータの制御者が、次の要素へ処理が移ったことを伝えたり、各要素へアクセスした際に処理を行ったり等、制御者自身が生成した繰り返し処理を細かく制御できる。
Java1.0、1.1ではVectorとHashtableというコレクションクラスと、Iteratorデザインパターンを実装したEnumrationと呼ばれるクラスがあった。

Vector names = new Vector();
names.add("George");
names.add("Fred");
names.add("Ron");

Enumeration e = names.elements();
while (e.hasMoreElements()) {
    String name = (String) e.nextElement();
    System.out.println(name);
}

Java1.2ではIteratorデザインパターンIteratorというクラスに実装された。Iteratorでは未だに返却値のキャストが必要とされていた。Java1.2から1.4にかけて文字列の繰り返し処理はは下記のようなコードだった。

List names = new ArrayList();
names.add("George");
names.add("Fred");
names.add("Ron");

Iterator i = names.iterator();
while (i.hasNext()) {
    String name = (String) i.next();
    System.out.println(name);
}

Java5ではジェネリクスが導入され、Iteratorインタフェースクラスとforループの実装が改修された。

// Java SE 5 !!!
package java.lang;

import java.util.Iterator;

public interface Iterable<T> {
    public Iterator<T> iterator();
}
package java.util;

public interface Iterator<E> {
    public boolean hasNext();
    public E next();
    public void remove();
}

メモ:forループの内部では Iterator.hasNext() と Iterator.next()が呼ばれている。そのためActiveなイテレータとみなす事ができる。

List<String> names = new ArrayList<String>();
names.add("George");
names.add("Fred");
names.add("Ron");

for (String name : names) {
    System.out.println(name);
}


Passiveな(内部)イテレータ
Passiveなイテレータではイテレータ自身が繰り返し処理を制御する。イテレータの制御者は基本的に、コレクション内の要素に対するいくつかの操作をイテレータに行うよう指示します。Java8ではこのアプローチが利用可能である。

Java8ではjava.lang.IterableインタフェースクラスがforEachメソッドを持つ

package java.lang;

import java.util.Iterator;
import java.util.function.Consumer;

public interface Iterable<T extends Object> {

    public Iterator<T> iterator();

    public default void forEach(Consumer<? super T> cnsmr) {
        // ...
    }

    ...
}

java.util.Collectionインタフェースクラスはjava.lang.Iterableクラスを継承している。そのためjava.util.List もしくは java.util.Setインタフェースクラスの実装クラスは自動的にforEachメソッドを持っている。
java.util.Mapインタフェースクラスはjava.util.Collectionインタフェースクラスを継承していない。しかしJava8からは一貫性のためにforEachメソッドを持つ。
このメソッドはひとつのパラメータをとる関数型インタフェースである。そのため実体のパラメータを通すforEachメソッドラムダ式の候補となる。

List<String> names = new ArrayList<>();
names.add("George");
names.add("Fred");
names.add("Ron");

names.forEach(name -> System.out.println(name));

もしくはメソッド参照を使用する。

...
names.forEach(System.out::println);
...

上記のPassiveなイテレータと前セクションのActiveなイテレータとの差異を述べる。
Activeなイテレータのリスティング処理では、イテレーションのループ構造がイテレーションを制御し、ループを通過する度にループ内のオブジェクトはリストより回収され、文字列を出力する。
Passiveなイテレータのリスティング処理では、明確なループ処理は存在しない。単純に、リスト内におけるオブジェクトの処理(─今回の場合は単純な文字列の出力)をforEachメソッドにて呼び出す。
イテレーションの制御はforEachメソッドに依存する。

java.util.ListクラスにおけるforEachメソッドシグネチャ

package java.util;

public interface List<E extends Object> extends Collection<E> {

    /**
     * Performs the given action for each element of the Iterable until all elements have been
     * processed or the action throws an exception.
     */
    public default void forEach(Consumer<? super T> cnsmr) {
        ...
    }

    ...
}

java.util.SetインタフェースクラスにおけるforEachメソッドシグネチャ

package java.util;

public interface Set<E extends Object> extends Collection<E> {

    /**
     * Performs the given action for each element of the Iterable until all elements have been
     * processed or the action throws an exception.
     */
    public default void forEach(Consumer<? super T> cnsmr) {
        ...
    }

    ...
}


java.util.MapインタフェースクラスにおけるforEachメソッドシグネチャ

package java.util;

public interface Map<K extends Object, V extends Object> {

    /**
     * Performs the given action for each entry in this map until all entries have
     * been processed or the action throws an exception.
     */
    public default void forEach(BiConsumer<? super K, ? super V> bc) {
        ...
    }

    ...
}