読書会(Java 8 Lambdas: Pragmatic Functional Programming)第3回議事録
[ 戻る ]
================================================================================
Java読書会BOF 「Java 8 Lambdas: Pragmatic Functional Programming」を読む会 第3回
================================================================================
"日時", "2014年7月12日 10:00 - 17:00"
"場所", "川崎市教育文化会館 第3会議室"
"出席者(敬称略)", "高橋(徹)、高橋(智)、遠藤、岩室、吉本、田辺、中澤、小棚木、村山、井上(書記)"
議事
====
Chapter 5 : Advanced Collections and Collectors(続き)
=======================================================
Partitioning the Data(データの分割) P.64
---------------------------------------
* Example 5-8.
* partitioningByを使用するためにstatic importする必要があるのか?
* java.util.stream.Collectorsのstaticメソッドとして定義されている。
* Example 5-10.
* このメソッドの戻り値であるMapのキーは、どう設定される?
* groupingByメソッドの引数に指定したラムダ式の戻り値の型と一致するっぽい。
* Example 5-12.
* Collectors.joiningで、なぜここだけCollectorsと明示的に指定してあるのか?
* static importしてればクラス名の指定はいらないはず。
* ちなみに、クラス名がsで終わってるクラスは、utilityクラスなことが多い。
Composing Collectors(Collectorの構築) P.67
------------------------------------------------
* Example 5-14.
* groupingByの引数がExample5-10に比べて1つ増えているが、違いは?
* 引数にcounting()の指定が無ければ、戻り値はAlbumのListを返す。
* 引数にcounting()の指定が有れば、そのListの件数を返す。
* SQLで、group byしてcount(*)するイメージに近いのでは。
* Exapmle 5-15.
* alubum that artist has producedの訳
* ×:「アーティストが生成したアルバム」
* ○:「アーティストがプロデュースしたアルバム」
Refuctoring and Custom Collections(リファクタリングとカスタムコレクション) P.69
------------------------------------------------------------------------------------
* 配布した訳の冒頭「build-in」
* build-inではなく、built-inの間違い。「組み込まれた」という意味である。
* 「an instructive example」の訳について(Example 5-17.の直前)
* ×:「教育的な例」
* ○:「手順を追って説明した例」
* Example 5-17.
* if文で builder.length() > 1 としているが、 > 0 ではないのか?
** 文字列の最初に "[" を付与していることを考慮して > 1 としている。
* Example 5-20.
* StringCombinerは何者?
* カスタムクラスっぽい。著者のGitHub参照。
* StringCombiner::addは引数を2つ受け取るはず。
* addをメソッド参照で書いてるが、 -> で書き直すと、どう書く?
* reduceメソッドは引数を3つ取っている。
* @skrb 氏によると、3引数のreduceメソッドはパラレル用らしい。
* 第3引数のmergeメソッドの挙動調査(呼ばれる回数の調査 etc)を宿題とする。
* GitHubでソース見てデバッガで追いましょう。
* Example 5-30.
* この例は、アンチパターンとして紹介されている。
Chapter 6 : Data Parallelism(データ並列性)
=======================
* ParallelとConcurrencyの訳
* Parallel : 並列性
* Concurrency : 並行性
* とりあえず上記の使い分けで訳す。
Simulation(シミュレーション) P.85
---------------------------------------
* random seeds
* モンテカルロ法はseedが重要なので、訳は「乱数」じゃなくて「乱数シード」の方が良い。
* 一般に、乱数シードには「時間」を採用することが多い。
* シードの周期が十分に長くないと、パターンが絞れてしまう。
* java.util.Randomが生成する乱数は偏りがある。
* java.security.SecureRandomを使った方が良い、という話が以前あった。
*「Java言語で学ぶデザインパターン入門」読書会の第3回でも乱数が話題だった。
* Example 6-4.
* availableProcessorsメソッド
* Java仮想マシンが使用できるプロセッサの数を返す。
* このサンプルでは「コア数 = スレッド数」としている。
* ThreadLocalRandomのシードってどうなってる?
* fractionがintじゃなくdoubleなのは、1億回のループでもオーバーフローしないようにするため?
* 整数じゃなく浮動小数点にすると累積誤差が発生するが、トレードオフで我慢している?
Caveats(警告) P.88
------------------------
* the identity value
* ここでは「単位源」と訳した。並列演算しても初期値が重複して計算されないという意味。
* 「単位源」という用語はStream#reduce()のJavadocの説明文から取ってきた。
* Example 6-5.
* 結合則は、浮動小数点だと演算順序によっては誤差が発生して成り立たないことがあるかもしれない。
* 並列処理するには、結合性だけでなく可換性もないとダメかも?
Performance(パフォーマンス) P.89
-------------------------------------
* The okayの説明文の訳(P.91)
* ×:「分割することは容易」
* ○:「簡単には分割できない」
* stateless and stateless(P.91)
* 状態遷移のstatefull / statlessとはちょっと違うイメージで使われている。
* データ全体が見えてないと処理できないものはstatefullと表現する。
* sorted, distinct, limitは、全体がわからないと処理できない。
* Example 6-9の上. 単純移動平均の計算
* 0, 1, 2, 3, , 3.5の、size 3の単純移動計算の方法
* 先頭3つ「0,1,2」の平均は1
* 窓を1ずらして、次の3つ「1, 2, 3」の平均は2
* 窓を1ずらして、次の3つ「2, 3, 4」の平均は3
* 窓を1ずらして、次の3つ「3, 4, 3.5」の平均は3.5
* Table 6-1.
* Java8でこれらのメソッドがどうパラレル処理するのかを確認しましょう。(次回までの宿題)
* Example 6-7 とか Example 6-8 とかに巨大なデータを渡して、CPUが並列で使われているかを調査する。
* parallelPrefixとparallelSetAllに4GBくらいのデータ渡して検証してみましょう。
* キーポイント
* whether the values are packedの訳は、「値が纏まっているか」としたが、要するに「ボクシングしているかしてないか」。
Chapter 7 : Testing, Debugging, and Refactoring(テスト、デバッグ、リファクタリング)
=======================================================
The Lonely Override(P.98)
-------------------------------------
* Example 7-4 の下の文「It's also shorter 〜 equal. 」の訳がよくわからない。
* 同じなら短い方が良い、ということ?
[ 戻る ]