2013/09/27

Napa へ

このエントリーをはてなブックマークに追加

帰国するのは日曜日なので、今日と明日はオフ。

ということで、去年にひきつづき、車で Napa へ。今年は大山さん、谷本さん、高山さんと私の 4 人。

今年は行きは大山さんの運転。

今年も Robert Mondavi -> Rutherford Hill へ。

大山さんはいつものごとく Rutherford Hill でお買い物。上の写真が Rutherford Hill Winery です。谷本さんはお酒飲めないのですが、お土産用に買うのだとここで同じようにワイン購入。

まだランチの予約時間までちょっと時間があったので、Rutherford Hill のそばの Rutherford Ranch へ。

でも、ここはおいしくなかったらしいです。大山さん、高山さんが試飲している時は暇なので、2 人の写真を撮っていたら店員さんにパパラッチなのかといわれてしまいました ><











Robert Mondave Winery

ワインのラベルと同じ画角で撮ってみたのですが、どうでしょう?










Rutherford Hill Winery



何を運んでいるかと思ったら



ブドウの絞りかすでした





Rutherford Ranch Winery




Auberge du Soleil

このエントリーをはてなブックマークに追加

今年もランチは Auberge du Soleil へ。

他にも行ってみたいところはあるのですが、Auberge du Soleil は景色もいいので、ついこちらを選んでしまいます。といっても、スーツ着なくちゃいけないところは、行かないと思うけどww

天気がいいので、ほんといい景色です。

今年は前菜に Kona Kampach Crudo、メインは Wolfe Ranch Quail、デザートに Gravenstein Apple Tart です。

Kona Kampach Crudo の Kampach はカンパチのこと。まさか寿司だとは ^ ^;;

メインの Quail はウズラのこと。ウズラおいしかった。皮はパリッとして、中はジューシー。アメリカは鶏肉は胸肉なのでぱさぱさしがちなのですが、これはおいしかった。

デザートの Apple Tart はハズした >< 以前もこれ頼んでハズしたと思ったことがあったのに、学習能力がまったくありません。困ったもんだ。














Sonoma

このエントリーをはてなブックマークに追加

ランチの後、微妙に時間があいてしまったので、Sonoma へ行ってみました。中心街をブラブラと。もうちょっと時間があったらよかったなぁ。


















Buckhorn Grill

このエントリーをはてなブックマークに追加

SF に帰ってきてから夕飯。みな全然おなかが減っていないというので、軽く Westfield の地下のフードコートへ。

私は Buckhorn Grill の Philly Buck。いわゆるチーズステーキです。

チーズステーキって、日本でもいけると思うんですけど、全然店がないんですよね。なんでなんだろう?

今日のおやつ - Cafe Madeleine

このエントリーをはてなブックマークに追加

今日も Walgreens で Cafe Madeleine のケーキ購入。今年は Cafe Madeleine の店にはいってないけど、よく食べましたww

フレッシュフルーツタルトとオペラ。というか、なんでこれがオペラなの? という感じ。

タルトには土台としてチョコが使われているんだけど、アーモンドプードルの層はないの?

まぁ、いいんだけどね。.






2013/09/26

JavaOne 2013 SF 最終日

このエントリーをはてなブックマークに追加

長いようで短かった JavaOne も今日でおしまいです。今日は朝から Communitiy Keynote。今年はちゃんと起きて、聞きに行くことができました (笑)。

今年も、朝ご飯に出会えたのが最終日だけ。毎年思うのですが、朝ご飯ははじめのセッションの前に出してほしい!!!! #てらだよしおがんばれ といえば、改善するかなぁ?

さて、今日聴講したのは、以下のセッションです。

ほんとは、後 2 つほどセッションをとるつもりだったのですが、Keynote 直後の JVM Advanced Tuning は Keynote が伸びて、満席で入れませんでした。もう 1 つ、Swing から JavaFX のマイグレーションに関するセッションもとるつもりだったのですが、こちらは昼ご飯を食べに行っていたら、間に合わなかったという ><

まぁ、最終日はこんなものです。

KEY11027 Java Community Keynote


JavaOne 最終日は Community Keynote が定番になってきました。

前半はスポンサーキーノートで Freescale の Geoff Less。初日の IBM の話に比べると、かなりおもしろいです。

だいたいスポンサーキーノートは聞いている方も適当に流すのですが、めずらしく今日のキーノートはみなちゃんと聞いていた感がありました。職に結びついた話だからかもしれませんが。






さて、Community Keynote です。

Community Keynote では次の 5 つのテーマについて、それぞれなにがしかの人が登壇して喋るという形式。

  • Education
  • Safety
  • Environment
  • Space
  • Oceans

一番はじめの Education は分かるものの、その他のトピックってどこがコミュニティに関係するんだろうというものばかりですね。最後の Space と Oceans なんて、かなりとってつけた感があります。

こんな感じなので、それほど盛り上がらず。

一番、盛り上がったのが 10 歳のプログラマの少年が壇上に上がった時。彼は Oracle のエバンジェリストの Arun Gupta の息子なのですが、Ecliipse を起動して「これが Eclipse です」というだけで盛り上がるのです。たぶん、言っている本人はなんで大人たちが Eclipse でこんなに大騒ぎしているかまったく理解できないでしょうねww

このときには、まさか JavaOne の後に Arun が辞めてしまうとは思いもよりませんでした。

そういえば、寺田さんが世界デビューで (昨日、セッションがあったので、本質的にはそちらが世界デビューですけど)、なんと T-Shirt 投げをしましたよ! 寺田さんが T-Shirt を投げている、すぐそばに座っていたのに、こっちには投げてくれなかった (泣)。

最後には、James Gosling が出てきて喋ったんですが、彼が喋ったのは初日にあった NetBeans のセッションと同じ内容 ><

Gosling がでてきたから、Oceans だったわけです。


















寺田佳央走る





寺田佳央投げる






































CON4904 Advancements in Text and Internationalization for JavaFX 8


スピーカは Oracle の Felipe Heldrich。JavaFX 8 の新機能である、リッチテキストに関するセッションです。

リッチテキストを著すための中心となるのが、Text クラス専門のコンテナである TextFlow クラスです。TextFlow クラスでは複数行の文字列を表示可能で、改行処理も常に行います。

TextFlow に貼る個々の Text オブジェクトのプロパティもしくは CSS を変化させておけば、それに応じたリッチテキストが表示できるというわけです。

同じような機能を持つコンテナとして FlowPane がありますが、TextFlow では改行を扱えることや、BIDI を扱うことができます。

ただし、表示するだけなので編集の機能はありません。

また、Text の wrappingWidth や textAlignment、x、y などのプロパティは無視されます。

TextFlow の描画にはネイティブのものと T2K の両方を扱えます。たとえば、ネイティブの例として、Windows では DirectWrite、OS Xでは CoreText が使用されます。Linux ではデフォルトで T2K になるそうです。

JavaFX 8 では BIDI が正式にサポートされ、文字列が左から右だけではなく、アラビア語のように右から左に書くことも可能になります。

どうやら、Internationalization といっていたのは、この BIDI のことだけのようです。なんだかなぁ....

というわけで、今年も JavaOne もおしまいです。

Hog Island Oyster Co.

このエントリーをはてなブックマークに追加

ランチは JavaOne では恒例の Ferry Building Marketplace にある Hog Island Oyster Co. へ。今年はここにくる時間がなかなか取れなくて、最終日になってしまいました。

歩いて行ったり、少し待ったりしたせいで、午後のセッションを 1 つすっ飛ばしたのはよくあることです ^ ^;;

やっぱり牡蠣おいしいよね。



























牡蠣食べている時にクマモトという牡蠣の話になって、料理にはいっぱい日本語が使われている話になったのです。キノコはシイタケもシメジもマイタケも使われているし。Ferry Building の中にはキノコやさんがあって、そこもシイタケとかそのまま売っているという話をしたら、誰もキノコ屋があるのを知らない。みんな何度も Ferry Building に来ているんじゃないの?

ということで、食後はキノコ屋へ。ほらシイタケもシメジもナメコもあるでしょ。


Ocean Beach 撮影会

このエントリーをはてなブックマークに追加

@yusuke が今年も蟹の前に走りに行くといっていたので、それに対抗するわけではないけど、Ocean Beach で日没撮影会。

蟹パーティの開始が後 30 分遅いともうちょっと余裕を持って撮れたんだけどなぁ...

まぁ、それでも完全に日没するところは撮れたからいいとしましょう。

































蟹パーティ 2013 @ Thanh Long

このエントリーをはてなブックマークに追加

恒例の蟹パーティ at Thanh Long。今年は 50 人越え。これ以上になると、2F を貸し切らないと入らないけど、それでも後 10 人ぐらいだよなぁ。来年はどうするんだろう?







































































2013/09/25

JavaOne 2013 SF 第4日目

このエントリーをはてなブックマークに追加

ランチがおいしくないのはいつものことなのですが、今年みながそろってまずいと言っているのがサンドウィッチについてくる豆料理。

レンティスやひよこ豆、フェイジャオンなどを使った煮込み料理なのですが (日によってレシピが違っています)、日本の豆料理とはかけ離れているからかもしれません。でも、アラビアなどで普通に食べられている料理なので、櫻庭にはそれほど違和感がないんですよね。というか意外においしいと思っていました。でも、食べ慣れていないものを食べると、そんなものなのかもしれませんね。

さて、今日は夕方から Treasure Island でライブがあるので、セッションも早じまいです。ということで、今日は BOF はなしで、以下の 4 セッションを聴講しました。

今日の最後の Date & Time API は、月曜日の Date & Time API のセッションとあまり変わらず... まぁ、そんなものか...

CON2624 Modeling, Texturing, and Lighting Mesh Geometry in JavaFX 3D

スピーカは John Yoon。この人は Keynote で紹介された 3D の Duke のチェスをモデリングした人らしいです。

といことで、あまり Java のコードは出てきません。外部のモデリングツールで作成したものを、どうやって Java に持ってくるかところが中心になります。このセッションでは Blender と Maya でデモをしていました。

ところで、今年の JavaOne は部屋が明るくしてあります。去年までは部屋をかなり暗くしていて、スピーカがいることは分かっても、細かい表情などは全然分からないぐらい。それが不評だったのか、今年は一転して明るくなりました。

一部のセッションでは、資料のコントラストが低くて見にくい部分もあったのですが、全般的にはよかったと思います。

ところが、このセッションだけは以前のようにまっくら。初日、2 日目とやってきて明るすぎと文句が出たのかと思いましたけど、全体を通しても暗かったのはこのセッションだけ。やっぱり、Blender や Maya の画面をよく見せるというためなのかもしれません。そのせいもあって、このセッションは写真なし。いちおう撮ったのですが、何が写っているのか判別するのが大変なぐらいだったのです。

ついでですけど、今年使用しているプロジェクタがとても静か。今までのはファンがかなりうるさかったのですが、ファンの音も気にしなければ全然気がつかないぐらい。いろんなところで技術革新は行われているんですね。

さて、本題に戻って。

まずはじめに、Java で 3D のモデルを書いていく方法から。頂点を指定して、テクスチャをマッピングして、表面を指定してとやっていくのですが、単純なオブジェクトでも結構大変。これで複雑なモデルを Java で書くのは考えられないよね、ということで Blender と Maya です。

Blender や Maya で作成したモデルは、Keynote でも使用していた 3D Viewer で読み込みます。

かれはモデリングを切り紙にたとえていっていました。切り紙って伝わらないと思うんだけど、大丈夫なのかなぁ。いちおう、切り紙と折り紙は違うものでと話していましたが。

切り紙にたとえたメインは U-V マッピング。確かにこれは切り紙かもしれません。

後半はコードが全然出ないで、Blender と Maya でどうやってモデルを作っていくかのチュートリアルになってしまいましたが、こういうのを見る機会がなかなかないので、個人的にはおもしろかったです。

 

CON7942 Java 8 Streams: Lambda in Top Gear

スピーカは Brian Goetz と Paul Sandoz。Brian Goetz のセッションは 3 つ目ですが、このセッションは Stream に絞ったものです。

それにしても、このセッションはすごい行列。やはりみなの関心が高いんですね。

コレクションなどに対する Aggregate Operation (集約的操作とでも訳すのでしょうか) には、歴史的にループが使われてきました。しかし、基本的にはシーケンシャルでスケールしません。

これに対する Java SE 8 の答えが Stream というわけです。

はじめの例として NY のバイヤーが売り上げた合計を求めるには、外部イテレータでは次のように記述してきました。

int sum = 0;
    for (Transaction t: txns) {
        if (t.getBuyer().getState().equals("NY")) {
            sum += t.getPrice();
        }
    }

これに対して、Stream では次のように記述します。

int sum = txns.stream()
                  .filter(t -> t.getBuyer().getState().equals("NY"))
                  .mapToInt(t -> t.getPrice())
                  .sum();

パラレルに処理するのであれば、stream() を parallelStream() に変更するだけです。

Brian は Stream の方が読みやすいというのですが、これは慣れないと読みにくいですね。慣れればなんともないですけど。

今までの手法と Stream を比較すると、今までのループはコレクションの個々の要素について扱っているのに対し、Stream ではデータセットに対して扱っているという違いがあります。

また、従来が how だったのに対し、Stream は what だといいます。

ここから Stream の内部構造に入っていきます。

先ほどの例だと、Stream に対して filter と map、sum が使われていました。しかし、中間の filter と map はその場では処理されません。最後の sum ですべの処理が行われます。

つまり、filter, map, sum で 3 回のループが回るのではなく、filter と map は処理が遅延され、最後の map の 1 回だけイテレーションされます。

このような Stream に対する処理の連なりを、Brian はパイプラインと呼んでいます。

各パイプラインはソースを持っています。ソースは Stream の生成の方法によって異なります。Collection に対して Stream を生成した場合は、Collection のコンクリートクラスが、たとえば ArrayList などがソースになります。

このソースによって、Stream の性質が決まります。たとえば、ArrayList であれば SIZED と ORDERED。つまり、サイズと順番があるというわけです。

中間のオペレーションは処理が遅延されます。このオペレーションによっては Stream の性質を変更します。たとえば、map は SIZED は保持しますが、SORTED などは保持されません。

そして、最後のオペレーションでソースをたどって処理を行っていきます。終端のオペレーションとなるのは reduce, collect, sum, min, forEach などがあります。

もし、Stream でステートを持つような処理を行っている場合は、reduce もしくは collect を使用してステートレスにします。

たとえば、トランザクションから Seller だけを新たなリストにしたい場合を考えます。

List<Person> sellers = new ArrayList<>();
    txns.maps(Txn::getSeller)
        .forEach(s -> sellers.add(s));

と記述すると、ステートを持ってしまいます。このコードは下のように書き換えます。

List<Person> sellers = txns.maps(Txn::getSeller)
                               .collect(Collectors.toList());

Collectors クラスには toList 以外にも groupingBy などのメソッドが定義されています。

後半は Paul Sandoz がパラレル化について。

Java SE 7 で導入された
Fork/Join は低レベルすぎて、なかなか使いどころが難しい。

そこで、ParallelStream が登場します。

ParallelStream を考えた場合、デターミニスティックかどうかが重要になります。つまり、以下のコードで得られた結果は同一にならなくてはなりません。

List s = ...;
    List r1 = s.stream().map(...).collect(Collectors.toList());
    List r2 = s.parallelStream().map(...).collect(Collectors.toList();
 
    assertEquals(r1, r2);

これに対して、以下の例はデターミニスティックである必要はありません。

Txn t1 = s.stream().filter(t -> t.getPrice() > 100).findAny();
    Txn t2 = s.parallelStream().filter(t -> t.getPrice() > 100).findAny();

もちろん、デターミニスティックな場合の方がパラレル処理が難しくなります。

Stream のパラレル処理は、Fork/Join をベースとして作られているので、分割統治法で処理されます。実際に、sum や reduce などがどのように処理されるのかを解説しました。

toArray などの出たーミニスティ行くな処理をする場合には、分割した個々の要素が対応するインデックスを保持しておき、結果用の Array の適切なインデックスに結果を書き写していくということを行います。

ここでパフォーマンスの話。

パラレル処理したとしても、すべての場合でパフォーマンスが向上するわけではありません。シーケンシャルの方が速いこともあります。

Stream の終端の処理のマージ処理が大変であったりすると、パフォーマンスが落ちます。また、Stream の性質にも影響されます。オートボクシングもパフォーマンスに影響を与えます。たとえば、プリミティブを使用するのであればプリミティブに対応した IntStream のような Stream を使うべきです。

8 スレッドの MacBook Pro で行ったマイクロベンチマークの場合、ArrayList と IntSraem では要素数が多くなればパフォーマンスが向上しましたが、LinkedList ではあまりパフォーマンスが向上しませんでした。

これはマイクロベンチマークなので、すべての場合に当てはまるわけではないのですが、このように Stream のソースによっても大きくパフォーマンスが変わるということだと思います。

最後に分割統治法を行う Spliterator について。Iterator のパラレル版というようなもので、split メソッドが追加されています。ArrayList などだけではなく、HashSet などでも Spliterator を使用することができます。この場合は、Key によって分割を行っていきます。

こういう話はやっぱりおもしろいですね。こういう話を聞けるのが JavaOne の醍醐味です。





CON5091 Java Flight Recorder Behind the Scenes


スピーカは Oracle の Staffan Larsen。

Flight Recorder はトレースとプロファイルを行うツールで、JVM の中に組み込まれています。Java SE 7u40 から正式に使用することができるようになりました。

Flight Recorder でキャプチャできるのは、GC, Synchronization, Compiler, CPU Usage, Exception, I/O などがあります。サンプリングがベースなのでオーバーヘッドも小さく、正確らしいです。

プロファイルもオンデマンドで行うことができ、Mission Control もしくはコマンドラインからプロファイルを開始できます。

Flight Recorder というと、GUI がカッコいいことばかりに目が向きますけど、内部もかなりすごいらしいです。

Flight Recorder を使用可能にするには、Java の起動オプションで -XX:+UnlockCommercialFeatures -XX:+FlightRecorder を指定します。実際に起動するには、起動オプションの -XX:StartFlightRecording=filename=<path>,duration=<time> を指定します。

もしくは jcmd からでも起動できます。

後半は、Flight Recorder の内部構成について。

Compiler や GC などから収集したデータは ThreadLocal のバッファに一時的に収集し、それを Global Buffer に移し、最終的にディスクに保存します。

内部的にはすべての情報はイベントとして保持されます。また、イベントは XML で保持されるようです。

メモリリークを起こさないようにするためにも、収集したデータはずっと保持するのではありません。これにはコンスタントプールを使用して、なるべく使用するメモリを減らすようにしています。たとえば、クラスやメソッド、スレッドはプールします。

おもしろいのがスタックトレースもプールすること。同じスタックトレースであれば、プールしておくということなのでしょうけど、そんなに需要があるんでしょうか?

このセッションは一緒に谷本さんも聴講していたのですが、彼は Flight Recorder 対抗の解析ツールを作っているので、かなり刺激になったようです。確かに、解析ツールについてもうちょっと理解していたら、もっとおもしろかったかもしれません。

Oracle Appliciation Event - MIX

今日のメインイベント。


今年は、Maroon 5 と The Black Keys。

シャトルバスでヒルトンからトレジャーアイランドへ。バスの中ではみなと一緒なのですが、みなライブには興味がなくて、ライブに向かうのはいつも 1 人。でも、今年は北野さんが Maroon 5 の大ファンだということで、2 人でライブへ。

いつものごとく、一般人が入れる一番前に陣取ります。一番前は VIP たちのエリアになっているのもいつも通り。

MC の人が、今日 America's Cup で Oracle Team が優勝したと告げると、観客から USA コールが。

The Black Keys からなのかと思っていたら、いきなり Maroon 5。

Maroon 5 はベテランということもあって、やっぱりステージワークうまいですね。選曲は最新アルバムが一番の多いのですが、デビューのころからのヒット曲はもれなくやってました。ヒット曲入れると盛り上がるんですよね。

北野さんは最近聞き出したらしく、最近のヒットの Moves Like Jagger がお気に入りのようなんですが、私はやっぱり 1st の This Love か Sunday Morning ですね。もちろん、この 3 曲とも演奏してくれました。

そういえば、ボーカルの Adam は歌っている時のバリエーションが少ない。しかもいつも目をつぶってしまっています。写真を撮っているといつも同じような写真になっちゃうんですよね ^ ^;;









































Maroon 5 のライブの後、とりあえず食べ物のところへ。そこで、北野さんとはぐれてしまいました。すごい人数だからちょっと目をはなすとすぐに分からなくなってしまいます。

で、続いて The Black Keys。彼らはアルバムは持っているものの、そこまで聞き込んではいませんでした。

The Black Keys って 2 人組なのですが、おもしろいことにギターとドラム。CD だとそれほどでもないのですが、かなり重低音サウンド。それを担っているのが、ドラムの Patrick Carney。なんとダブルバスタム。ダブルバスドラはなんども見たことありますけど、ダブルバスタブははじめて、スネアよりもバスタムの方を多用しているので、重低音のサウンドになっているのでした。

そして、ギターがまた歪んだいい音を出しています。CD だとこれが分からないのですが、ライブだといいですよ、このバンド。

ところで、この 2 人、立ち位置がかなり離れているのです。ギターの Dan Auerbach を撮ろうとすると、ドラムの Patrick Carney がフレームアウトしてしまうのです。

しかも、Dan を撮りやすい位置だと、Patrick はシンバルで顔が見えなくなってしまうのです。で、はじめて一番前ではないところに移動。後半は後ろの方にある階段状のイス席で見たのでした。




















ライブが終わったのが 23:30 ぐらい。その後、ゲームのコーナーなどの写真を撮りつつ、まだ残っていた料理を食べたりして過ごしたのですが、ここで痛恨のデジカメのバッテリー切れ。すでに、12 時も過ぎていたので、すごすごと帰りました。

ホテルにもどったのは 1 時過ぎ。明日、起きられるか?






















2013/09/24

JavaOne 2013 SF 第3日目

このエントリーをはてなブックマークに追加

3 日目のメインイベントはなんといっても、明日のライブのチケットを取得すること。えっ、違う?

チケットは夕方から受け取れるのですが、これがないと明日のライブに入れません。ということで、ちゃんと受け取りました ^ ^;;

さて、今日聴講したのは、以下のセッションです。

今日のはじめの Samll Chage and Big Files .... は Joe Darcy と Alan Bateman というスペックリード 2 人のセッションなのですが、Java SE 7 の Project Coin と New File System API を紹介しただけ。

もう Java SE 7 がリリースされてからかなり時間がたっているんだから、いつもと同じ話ではなく、もうちょっと深いところとか、実装がどうなっているかとか、それ以降の予定とか、何でもいいから違った観点から喋ってもらいたかったです。

Collection も、Stream とか最近の話題をもうちょっと取り入れてほしかったです。ただ、このセッションも人気があって、5 分前に部屋に入ったら、もう席が残りすくないぐらいでした。

JavaFX の Widget はもともとあまり期待していなかったのですが... もっとセッションの構成をしっかりしていればおもしろくなるんですけどねぇ。説明不足だということが分からないのかなぁ....




Alan Bateman



Joe Darcy



Hendrik Ebbers と Mark Heckler
 

CON7941 Lambda: A Peek Under the Hood


スピーカは Brain Goetz。

去年も同タイトルのセッションがありましたが、内容は同じです。でも、去年よりも InvokeDynamic について分かってきたのか、今年の方がより理解が深まりました。

大きな問題として、Lambda 式の型をどうするかという点があります。初期のプランでは関数型だったのですが、いろいろと問題があって却下されました。そこで、導入されたのが Functional Interface です。

Functional Interface であれば、いままでの Java とのコンパチビリティも保たれます。

その次に問題になるのが、Lambda 式の表現です。一番簡単なのは内部無名クラスとして表すことです。初期の Project Lambda の実装では実際に内部クラスで表現されていました。

しかし、内部クラスだと、Lambda 式ごとにクラス生成を行う必要があります。また、毎回新しいインスタンスをアロケーションしてしまうという問題もあります。

そこで、新しい表現である MethodHandle で表すという案が浮かびます。Lambda 式は言語レベルのメソッドオブジェクトですが、MethodHandle は VM レベルのメソッドオブジェクトと考えられます。

そこで、Lambda 式を脱シュガーして、メソッドを取り出し、MethodHandle で表すということです。

しかし、Lambda 式を直接 MethodHandle に置き換えるにも問題があります。たとえば、メソッドのシグネチャが変化してしまうなどです。

最終的には InvokeDynamic で Lambda 式を表現するということになっています。

InvokeDynamic で扱うには、Lambda 式を脱シュガー化して static のメソッドに変換します。この変換は Lambda 式がはじめにコールされた時の bootstrap で動的に行います。

フォーマンスには以下の 3 つの観点があります。

  • Linkage cost: Lambdaをキャプチャする時に一度だけ
  • Capture cost: Lambdaのインスタンスする時のコスト
  • Invocation cost: Lambdaのメソッド実行のコスト

Linkage Cost は無名クラスに比べると早くなっており、Capture Cost は無名クラスと同等です。ただし、キャプチャしない場合は無名クラスよりパフォーマンスがよくなります。

CON9732 The Modular Java Platform and Project Jigsaw


スピーカは Java SE のチーフアーキテクトであり、Jigsaw のスペックリードである Mark Reinhold です。

昨年の JavaOne でも Jigsaw のセッションがあったのですが、一昨年とまったく同じ内容でした。これでは、Java SE 8 からドロップするのもしかたがないと思ったのでした。

まさか、3 年連続で同じ内容にはならないとは思っていましたが、若干の不安が。しかし、今年はずいぶん内容が変わりました。

昨年まで、モジュールを Java の文法的にどうやって表すかということが、セッションの半分を占めていましたが、今年はまったく出てきません。これが、モジュールを Java で表すことにあきらめたのか、それとも変化がないから解説しなかったのかは、Jigsaw の ML などでチェックしないと分からないです。

今回のセッションの中心はモジュールファイルをどのようにリンクするかということでした。

その前に、Java SE 8 のコンパクトプロファイルの話です。

コンパクトプロファイルには Compact 1, Compact 2, Compact 3 の 3 種類があり、それぞれランタイムのライブラリが 11MB、16MB、30MB となります。JRE 全体だと 54MB です。

コンパクトプロファイルは基本的には Java SE Embedded で使用されるものですが、ネイティブパッケージングなどにも使用することができます。

後半はモジュールファイルのリンケージについて。

Project Jigsaw ではモジュールを *.jmod ファイルで表します。この jmod ファイルを JRE にリンクさせるのが jlink コマンドです。

jlink -mods [モジュール名] -d $JRE のように使用します。また、javac コマンドに -mods オプションでも大丈夫です。実行時にリンクするのであれば、java コマンドに -mods オプションを使用します。

jlink の入力は jmod だけではなく、jar や class も使用できます。出力先は $JRE、もしくは JVM のイメージ、また jmod や jar も可能です。

JVM のイメージは .jai ファイルです。これを実行するには java -jai app.jar のようにします。

続いてセキュリティの話題。

今まで、Java では java もしくは javax ではじまるパッケージ以外にも sun.misc パッケージなどのクラスを使うことがありました。たとえば BASE64Encoder とか。

これらのクラスを使用してコンパイルすると警告が出たのですが、今後は使用することができなくなります。特にもモジュールを使用する場合は、アプリケーションの起動時に検出して IllegalAccessError を発生させます。

これに関して実際にデモが行われました。

CON6727 The invokedynamic Instruction in 45 Minutes


JRuby の Charles Nutter による invokedynamic の紹介セッション。

JVM での Java 以外の言語の取り組みというのはいろいろと行われてきましたが、2006 年までは Sun からの公式なサポートはありませんでした。

その後、JRuby チームを雇用したり、Java と他の言語との連携を行うフレームワークの導入など、サポートが行われ来ました。そして、JSR 292 InvokeDynamic が発足し、Java SE 7 に導入されています。

InvokeDynamic は動的言語だけと思われがちで、新しいインボケーションの仕組み、もしくは新しいバイトコードだと思われています。しかし、実際はそれにはとどまりません。

Charles は InvokeDynamic とはユーザがカスタマイズできるバイトコードとメソッドへのポインタの組み合わせといいます。

まず、メソッドへのポインタについて。これには MethodHandle クラスが使用されます。実際にはメソッドだけではなく、フィールドや配列へのポインタも含み、引数を操作したり、処理の順番を変えたりということもできます。

MethodHandles は MethodHandle のためのユーティリティクラスで、static な内部クラスにメソッドはフィールドを探索する MethodHandles.Lookup クラスがあります。その後、インボケーションを行いますが、これはリフレクションと同じように行います。

また、MethodHandles クラスには引数の操作などを行うメソッドも定義されています。これらを使うことにより、メソッドインボケーションをカスタマイズしていきます。

今までメソッドインボケーションを行うバイトコードは 4 種類ありましたが、新しく invokedynamic が加わりました。

invokedynami であるメソッドをはじめてコールする場合、まず bootstrap メソッドが実行されます。bootstrap では CallSite オブジェクトを作成し、そこには MethodHandle オブジェクトを保持させるようにします。そして、MethodHandle が指すメソッドの実行が行われます。

2 度目以降は bootstrap は実行されず、直接 MethodHandle が指すメソッドが実行されることになります。

BOF5802 No Guts, No Glory! A Deep Dive into the Internals of JavaFX

Richar Bair, Stephen Northover, Kevin Rushforth という JavaFX のコア部分を作成している 3 人による、JavaFX の内部構造に関するセッション。Jasper Potts がいないのは、私が予想するに、彼は比較的上位層の Controls などを担当しているからだと思います。

JavaFX にはいろいろとモジュールがあり、Base, Graphics, Controls などがあります。このセッションでは最大のモジュールである Graphics に関する解説が行われました。

Graphics モジュールは Glass, Prism, Quantum を含み、アプリケーションのライフサイクルから、実際の描画処理までを担当します。

Glass は OS や Window System に対する仮想レイヤになり、OS が異なっていても同じように使用できるためのレイヤとなります。Glass は UI-Thread で動作し、Window や View (Scene) を相当します。また、ネイティブのクリップボードやドラッグ & ドロップ、イベントなどに対する仮想化も行います。

実際に描画を行うのが Prism です。Glass は UI-Thread で動作しますが、Prism は Render Thread で動作し、Glass で Sync のイベントが処理される時に Prism でレンダリングが開始されます。

Quantum は AWT における Toolkit に相当します。

次にスレッドの話。

Glass では Scene Graph を Node で表しますが、これを Prism の Render Thread では NG Nodes として表し、描画を行います。この時に Lock が重要になり、Scene の状態によって synchronize を行うという方法で解決しています。

Prism ではハードウェアアクセラレーションを多用して描画行います。NG Nodes のツリーを ViewPainters がトラバースして描画を行います。イメージなどはテクスチャとして描画していきます。

GPU がマルチコアで構成されているのに対し、JavaFX 側では UI-Thread と Render Thread の 2 つのスレッドしか使用していません。そこで Command Buffer を使用してパフォーマンスを向上させています。

かなり内部のことに言及していて、かついろいろと話題が飛ぶので、追いつくのがやっとだったのですが、こういうセッションこそ JavaOne という感じがするセッションでした。




Stephen Northover



Richard Bair



Kevin Rushforth


BOF6223 Project Sumatra Update

Oracle の John Rose と、AMD の Gary Frost によるセッション。

Sumatra は昨年の JavaOne で発表された、GPU を高速演算に使用するためのプロジェクトです。

このような用途には OpenCL と CUDA という標準があり、Java からシームレスにこれらを使用していくようにします。GPU は多くの演算コアも持っており、これらを Java から使用していきます。

Java でマルチコアを扱う場合、スレッドを用います。しかし、スレッドは Java フレームやスタックなどを持ち、またシェアードメモリも使用します。このモデルは GPU での演算には向いていません。より小さい単位での処理を GPU で行わせます。

このセッションでは CUDA 用のアセンブラである PTX への変換と、AMD の HSA について解説されました。

Java のコードと変換後の PTX のコードを見せられたのですが、PTX はよく分かりません。アセンブラなので、ロードやらストアやらの命令が並んでいます。

現状は実験的な状態であるらしく、ゆくゆくは ParallelStream の演算をほぼ自動で変換していくことを目標にしています。

後半は AMD の HSA (Heterogeneous System Architecture) について。こちらは AMD の Gary Frost がプレゼンしています。

現在のプロトタイプでは Stream の forEach を HSA のオフロードコードに変換しているらしいです。こちらも HSA のコードが出されたのですが、いまいちよく分からず。

ここら辺は個人的にも、もうちょっと勉強しないと。

Gary Frost



John Rose


BOF7862 What and How Java Troubleshooters Think: Eight Years of Troubleshooting Java


今日の最後はアクロクエストの谷本さん、勝本さんによるトラブルシューティングについてのセッション。意外といっては失礼ですけど、結構人が入っていました。その中には Rockit の開発者というか、Flight Recorder の開発者の Marcus Hirt も!!

内容的には昨年の JavaOne Tokyo での焼き直し的な内容。そこそこ笑いもとっていたので、よかったのではないでしょうか。

ちなみに上の写真はやらせです。セッションの後に撮ってます ^ ^;; セッション後なので、この笑顔な分けです。

セッション前は、谷本さんにはめずらしく、ガチガチに緊張してました。セッション中もかなり脇汗が目立ってましたww それにもまして緊張していたように見えたのが勝本さん。まぁ、しかたないですけどね。

個人的に感じたことをいくつか書いておきます。

Java Puzzlers のようにクイズ形式で勧めていくのですが、選択肢にないものが答えだったりするのはどうかなと思いました。1 回はいいんです。そこで笑いをとれますから。でも、それを繰り返すと、聞いている方はどうせ答えは違うものだと考えて、思考停止してしまうと思います。

また、クイズ形式の構成が、状況の説明、選択肢とその回答、解説、モラルと進んでいくのですが、特に解説、モラル、とその次の問題に移行する時の間が悪いように感じました。モラルを解説しているのかと思うと、すでに次の問題に進んでいたりすることもあったので、ここからがモラルですよ、これから次の問題ですよとすぐに分かるように間を入れていくことが必要ではないかと思います。

まぁ、ネイティブではない英語で喋っているためというのはあると思うのですが、ちょっと浮き足立ってしまっていた部分もあったのかもしれません。

それにしても、ネイティブではない英語なのですから、全部を覚えようと思わずにカンペを使えばいいのではないかと感じます。

プレゼンでカンペを使うのは全然問題ありません。たとえば、今はなき Sun Microsystems の CEO だった Scott McNealy などは、スピーチに常にカンペを使っていました。

カンペを見ながら喋るのはダメですが、カンペを見て、それから顔を上げて喋るのは OK です。

それに、プレゼン用のカンペのカードって売っているんですよ。携帯電話ぐらいの大きさのカードを使うのですが、そこに書くこともルールがあります。

そこにすべての文章を書いてはダメです。自分もやったことがあるのですが、カードから目を離すと自分がいま読んでいる部分が分からなくなってしまうということがよくあるんです。そうなると頭が真っ白です。

私がネイティブの人に教えられたのは、原稿の名刺だけ写せというもの。日本人としては動詞も写しておきたいのですが、ダメだそうです。名詞がキーワードになるからなんでしょうね。

そして、1 枚のカードに 2 から多くて 5 センテンスを書いていきます。このぐらいの量であれば、かなり大きい文字で書けるので、今話している部分が分からなくなるということも少なくなります。

でも、谷本さんの場合は、直前まで資料を作っていたりするので、まずは余裕を持って準備をするということから始めなくてはダメでしょうね ^ ^;;




緊張で目が潤んでる






おまけ


今日の昼間、Taylor Street Cafe にいったら、四角いコンクリの塊がドーンと置いてありました。なにこれと思ったのですが、ロープの先を見てみると、テントの屋根につながっています。

ようするに、風でテントが飛ばされないようにするためのおもりだったわけです。

普段はビニールのカバーがかかっているので、気がつかなかったのですが、こうなっていたわけですね。




ロープの先を見てみると...






King of Thai Noodle House

このエントリーをはてなブックマークに追加

Takao さんがランチがおいしくなくてつらいと Twitter でやりとりしていたので、じゃあということで今日は外でランチ。

1 時間でいって帰れるところということで、Geary St. の King of Thai Noodle House へ。私はパッタイとガパオガイ。Takao さんたちは麺を頼んでいました。ここは手早く食べられるけど、味はまあまあ。便利だからいいんだけどね。





天成酒家 Tian Sing Chinese Restaurant

このエントリーをはてなブックマークに追加

谷本さん (@cero_t)、勝本さんのセッションの後、みんなでごはん。

大山さんたちはもうご飯を食べたというので、ビールが飲める Jasper's Corner Tap にいってみたら、満席。で、 @yusuke がお勧めする天成酒家 へ。

でも、ここおいしくない ><

典型的な観光客向けの店。ここはおいしくないだろうなぁと思っていたところだったのですが、ほんとにおいしくなかった。Yelp の評価もかなり悪いし。

@yusuke がお勧めするところでおいしかった記憶がないんだよなぁ... あぁ、Hog Island Oyster Co. があるけど、あそこは例外かなww

写真を載せたくないレベルなんだよねぇ... 載せるけど。

それでも、@cero_t は Flight Recorder の作者の Marcus Hirt と熱く議論してたので、よかったんじゃない ^ ^;;



















ボケとツッコミではありませんww

今日のおやつ - La Boulange

このエントリーをはてなブックマークに追加

Keynote の後にも行った La Boulange は、去年 Starbucks に買収されたのでした。

そんなこともあって、種類や量は限られているのですが、Starbucks でも La Boulange のパンやケーキが置かれるようになっています。

ということで、Starbucks で買った Cheesecake Brownie。

Cafe Madeleine よりはましですが、ドングリのせいくらべレベルかな。それでも、夜中に買えるというのはすごいメリット。

2013/09/23

JavaOne 2013 SF 第2日目

このエントリーをはてなブックマークに追加
JavaOne 2013 San Francisco

JavaOne は昨日から始まっていますが、カンファレンスセッションと BOF は今日から。

去年からトピックごとに会場が決まっていて、Java SE 関連は Hilton、Java EE は Parc 55、Java ME は Nikko という振り分けです。

あいかわらず、Java SE 関連のセッションしか聞かない櫻庭なので、ずっと Hilton にいます。この Hilton がほんとに迷路なんです。何年たっても、場所がよく覚えられません ><

そういえば、去年まで普通のセッションってテクニカルセッションという名前だったと思うのですが、今年からカンファレンスセッションになってました。

さて、今日聴講したセッションです。

今日のチョイスの失敗は Porting OpenJFX to New Devices と JVM Performance でした。

Porting OpenJFX は参加者数人。いちおう資料もあったのですが、資料がおざなり。ほとんど前の方に座っている人たちと議論してました。こちらは移植について全然知識がないので、純粋に興味本位でいったのですが、まったくついて行けなかったです。

もう 1 つの JVM Performance は Q&A セッションでした。英語が得意でない櫻庭にとっては鬼門のセッション。ほんと分からないんですよね。英語勉強しないとと、毎年思うのですが....

また、G1GC のセッションも難しかった。こちらは技術的に難しくて.... これはもう一度資料を見直して、書けるようであれば、書くことにします。

 

CON7859 The Road to Lambda

Brian Goetz, CON7859 The Road to Lambda, JavaOne 2013 San Francisco

もちろん、Brian Goetz のセッションです。

内容的には新しいことはないのですが、話のもって行き方がおもしろいので、飽きさせないプレゼンです。Brian はむちゃくちゃ早口なのですが、彼の早口にもようやく慣れてきましたww 彼は早口なんですけど、英語はきれいなので、慣れれば聞きやすいです。

Java の近代化の話から始まって、他の言語では Closure をサポートしているのに Java ではされていないということや、内部イテレーションと外部イテレーションの話など。

そして、Functional Interface。問題になるのはインタフェースの拡張で、これはデフォルトメソッドで解決できるとしています。

デフォルトメソッドはステートレスなので、Scala のトレイトなどとは違うということや、多重継承のルールなどについて説明がありました。

Lambda Exp. とデフォルトメソッドを導入することで、API も革新されるとして、その結果が Stream になるわけです。このセッションでは Stream についてはサンプルコードだけで具体的な説明はしませんでしたが、その代わりに Stream のセッションが水曜日にあります。

最後にパラレル処理について。Fork-Join は使うのが難しいが、Stream と合わせることで容易にパラレルにすることができるとしています。しかし、ほんとにパラレルにするのであれば、いろいろと考えないといけないと思うんですけどね。

CON5767 What's New in JavaFX 8

Jasper Potts and Richard Bair, CON5767 What's New in JavaFX 8, JavaOne 2013 San Francisco

スピーカは JavaFX のチーフアーキテクトの Richard Bair と、相棒の Jasper Potts。

JavaFX 8 の機能は 3D や Rich Text などの大きな機能の追加については、今までもいろいろなところで言及されていましたが、このセッションはかなり細かい。

でも、なぜか JavaFX 8 の機能ではなくて、Java SE 8 の機能から。

Lambda と Nashorn について。もともと、JavaFX のイベント処理は Functional Interface だったので、Lambda によってかなり簡単に書けるようになります。

Nashorn の紹介では、JavaScript で JavaFX のアプリケーションを書いていましたけど、こういう使い方は特にうれしいとは思えないですね。それよりも、FXML で使える JavaScript が高速化したり、WebView の JavaScript の実行が高速化されることの方が利点があると思います。

続いてコレクション。

JavaFX ではコレクションとして ObservableList クラスなどが提供されていましたが、それに加えて FilteredList クラスや SortedList クラスなどが追加されるそうです。しかも、FilteredList クラスなどはデフォルトで処理が遅延されそうな API ですね。実際はコード見てみないと分からないですけど。

コレクションのすべての要素をバインドさせるなどの拡張も行われています。

ここからグラフィクスに関して。

フルスクリーンの解除にショートカットキーを登録できることや、はじめからツールバーなどがついている Unified Stage Style など。また、JavaFX に Swing の部品を貼るための SwingNode クラスも提供されます。

最後に Rich Text、印刷、3D、コントロールの追加など。

印刷は当初は AWT の印刷の機能を使って実装されるらしいですが、徐々に独自のものに置き換えるということです。

3D に関しては、昨日のキーノートでも紹介されていましたが、Maya や 3D Studio Max のファイルを読み込むことができるようです。こういうローダがないと、結局使えなくなってしまうので、いいですね。とはいうものの、3D は OpenGL を直接扱えるようにした方がいいのではと、今でも思っています。

コントロールの追加では DatePicker クラスが紹介されました。JSR 310 が導入されたので、Date Picker も JSR 310 対応です。

それにしても、ほんと盛りだくさんですね。

CON1861 Enhanced Metadata in Java SE 8

JSR 308 Annotations on Java Types に関するセッション。スピーカは Alex Buckley、Joseph Darcy、Michael Ernst

Alex は JDK の Core チーム、Joe は Project Coin をやっていた人で言語仕様のとりまとめ、Michael はワシントン大学の先生です。

Alex はいつも黒のシャツ。そして、Joe はいつも赤のシャツ。同じ服を何枚も持っているのでしょうか?

Type Annotation は型を修飾するためのアノテーションで、今までアノテーションを書けなかった、ジェネリクスのパラメータなどに対してアノテーションを付加することができます。

これに応じて、リフレクションのクラスやメソッドがかなり手を入れられています。ずらずらと並べられたのですが、そんなに並べるだけだとぜんぜん追いつけないです。後でゆっくり Javadoc みます ^ ^;;;

でも、Type Annotation を活かすには、そのアノテーションを解釈するためのツールが必要になります。たとえば、@NonNull というアノテーションで修飾されている場合、その変数がほんとに null を代入していないかどうかを調べないといけないわけです。

そこで、紹介されたのが Michael Ernst が開発している The Checker Framework です。

The Checker Framework が役に立つのは分かるのですが、本来ならこういうフレームワークを標準化してやらなければ、Type Annotation も使われないと思うんですけどねぇ... どうなんでしょう。


Alex Buckley, CON1861 Enhanced Metadata in Java SE 8, JavaOne 2013 San Francisco

Alex Buckley

Joseph Darcy, CON1861 Enhanced Metadata in Java SE 8, JavaOne 2013 San Francisco

Joseph Darcy

Michael Ernst, CON1861 Enhanced Metadata in Java SE 8, JavaOne 2013 San Francisco

Michael Ernst


CON6064 Introducing the Java Time API in JDK 8

Java SE 8 に導入される JSR 310 Date & Time API のセッション。スピーカは JSR 310 のスペックリードの Stephen Coleboune と、Oracle の Roger Riggs。

Date & Time API は Joda Time をリファインしたものと思われていることが多いのですが、Joda Time を参考にして、スクラッチで作った API です。それにしても、かなり複雑なのは、どうにかならないものでしょうか....

日時を表すクラスだけでも LocalDateTime、ZonedDateTime、OffsetDateTime と 3 種類もあります。これ以外にも Instant や Duration、Period など用途に合わせて多くのクラスが定義されています。

しかも、単純にこういうクラスをずらずらと並べて説明するだけなので、とても分かりにくい説明。去年の JJUG CCC の蓮沼さんの Date & Time API のセッションの方が何倍もわかりやすかったですね。


Stephen Cleboune, CON6064 Introducing the Java Time API in JDK 8, JavaOne 2013 San Francisco

Roger Riggs, CON6064 Introducing the Java Time API in JDK 8, JavaOne 2013 San Francisco

BOF4244 Swing 2 JavaFX

スピーカは Oracle の Anton Tarasov とSteve Northover。

てっきり Swing から JavaFX のマイグレーションのセッションかと思いましたが、そうではなくて SwingNode のセッションでした。

SwingNode クラスは、JavaFX に Swing の部品を貼るための JavaFX のコントロールで、JavaFX 8 から使うことができます。今まで JFXPanel という Swing に JavaFX を貼る部品は提供されていたのですが、逆はなかったのです。

前半は Anton で SwingNode の使い方など。Anton は英語がネイティブではないようで、かなり訥々と喋っていました。

使い方は予想通り。特に難しいことはありません。ただ、Swing と JavaFX のスレッドが異なるので、情報をやりとりする時などは注意が必要です。とはいうものの、JFXPanel クラスの場合もそうだったので、JFXPanel クラスを使ったことがあれば、だいたい分かるはずです。

現状、SwingNode では DnD や IME に対応していないらしいです。

後半は Steve から、Swing と JavaFX のスレッドの統合化に関して。

前述しましたけど、現状では Swing と JavaFX のスレッドが異なっているため、扱いがやっかいでした。これに対して、スレッドを統一して、同じスレッドで Swing も JavaFX も動かすことができるようになるというものです。

しかし、実際にはかなり難しいらしく、JavaFX 8 ではいちおう提供はされるものの、実験的な機能で、デフォルトではオフになっているようです。

ちなみに、当初はこのセッションを聞く気はなくて、裏番組の Richard Bair の Build and Test with OpenJFX を聞く気だったのですが、会場に人がすごい少ない。これはその前のセッションの二の舞になってしまうと危惧して、セッションを移ったわけです。マイグレーションの話ではなかったですけど、それなりにおもしろかったです。

でも、スピーカの 1 人の Anton のプレゼンがダメダメ。座ったまま話すし、かなりボソボソとしたしゃべり方。たぶん、英語がネイティブではないのだと思いますが、それでもダメなものはダメですね。


Steve Northover, BOF4244 Swing 2 JavaFX, JavaOne 2013 San Francisco

Anton Tarasov, BOF4244 Swing 2 JavaFX, JavaOne 2013 San Francisco

おまけ

Duke, JavaOne 2013 San Francisco

今年も Duke は会場をウロウロしてます。Sun の時と違って、ここに現れるという予告がないので、どこにいけば会えるのかいまいちよく分からず。

パビリオンにいることが多いようですが。

さて、その Duke、去年とは性格も運動能力も変わってしまったらしく、今年はいたって静かな Duke でした。去年はまるでフナッシーかとおもうぐらいはしゃいでましたが、それが普通ではなかったということなんでしょう。


Duke, JavaOne 2013 San Francisco

Duke, JavaOne 2013 San Francisco

今年もお昼休みはなし。ランチはセッションの合間の 30 分間で食べなくてはいけません。逆に 2 時から 3 時までは 1 時間の休憩が挟まってます。でも、ランチボックスの配布時間は 2 時まで。なんだかなぁ...

もちろん、ランチボックスは今年もおいしくない。もっと景気がよくなれば、ランチにも予算をかけられるのでしょうか?

ホテルによってランチは異なるのですが、今日の Hilton はベトナムサンドウィッチのバインミーと、チキンラップ、ベジタリアン用のサラダのサンドウィッチの 3 種類。

私はもちろんバインミー。

Twitter を見ていると、@cero_t がパクチーはいってると大騒ぎしています。それはバインミーを選択したのが悪いんだよ。ベトナムなんだからパクチーが入るのは当たり前。


Beef Bánh mì, JavaOne 2013 San Francisco

Beef Bánh mì, JavaOne 2013 San Francisco