Appresso Engineer Blog

アプレッソのエンジニアが書く技術ブログです。

JavaOne 2015 2 日目 - Scala からプロファイラ、スレッドダンプまで

こんにちは、アプレッソ開発部の野口です。

JavaOne 2 日目のレポートをしてまいります!
なんせ計 5 日間もあるので、バシバシいきます。

なお 1 日目の記事はこちら。

appresso.hatenablog.com

今日は以下の 6 セッションに参加しました。

  • Intro to Scala for Java Developers
  • Beyond Text: The Future of IDEs
  • Combining Concurrency and Collections
  • James Writes Java: What I Have Learned by Reading James Gosling’s Code
  • Is Your Profiler Speaking the Same Language as You?
  • Troubleshooting Slowdowns, Freezes, Deadlocks: Introduction to Thread

朝から晩までセッション三昧でしたがどうにか今日も乗り切れました。

順にふりかえっていきます!
6 セッションもあるだけあって結構大ボリュームになるので、タイトルから興味のあるものだけでも読んでいただければと思います。

Intro to Scala for Java Developers

表題の通り、Scala のエッセンスを紹介する入門編でした。
スピーカーは James Ward(http://www.jamesward.com)。

キャンセル待ちも出て、会場は超満員。
Java エンジニアの(Java エンジニア以外もかもですが)Scala への関心の高さを感じます。

スクリーンが小さい&位置が低くて焦ったのですが、スライドが公開されているのを見つけて事なきを得ました。*1

presos.jamesward.com

内容は、上のスライドを見てもらえばわかりますが本当に入門で、

  • なぜ Scala を使うのか
  • (James が)どうやって Scala を使うようになったか
  • Typesafe Activator で Scala を始める方法

といったところから、

といった具体的な Scala の特徴までを一通り眺めるものでした。

ここしばらく滞っている Scala 学習の入門編を一通り眺めなおせた感じで、Scala 書けるようになりたいな~という気持ちが再び湧いてきたし、個人的には出てよかったと思います。

まあ、裏で Project Jigsaw の互換性のセッションもやってたのでそちらも気になっていたのですが(満員でした)、そちらは日本人で出た人もたくさんいるようなので、どなたかまとめてくださるでしょうということで……。

Beyond Text: The Future of IDEs

Kent 大学のお二人による、Greenfoot(http://www.greenfoot.org/)という教育用 IDE の話でした。

セッションのタイトルから「Eclipse とか IntelliJ IDEA とかの新しい機能を比較したりしながら IDE のこれからを探っていくのかな~」と勝手に思っていましたが全然違ってオッとなりましたが、サマリを見直したらちゃんと書いてました。

The implementation in the Greenfoot IDE is aimed at education, ...

  • 教訓その 4 : 出る前に一度、セッションのサマリはよく読みましょう。

Greenfoot は実際けっこう面白い、色々と挑戦的な IDE で、ざっくり言って以下のような特徴があります。

  • 使用できるプログラミング言語Java によく似た Stride というもの(というか、ほとんど Java そのもの? )
  • 変数宣言やメソッド呼び出し、if / while といった制御構文等は Java と同じ
  • スコープを示すのに { } は使用せず、枠と色分けによってビジュアルに示す(!)
  • それぞれのスコープがまるごとオブジェクトとして扱われ、 D & D やキーボード操作で簡単に移動できる(!!)
  • ほか、以下のように小回りもきく
    • コード補完ではちょっとしたミスタイプをいい感じにとりなしてくれる
    • ファイル単位とかではなく特定の要素を選択して Undo できる
    • スペースやインデントは自分で入力するのではなく、自動的に入力される

大きな方向性としては、選択肢を減らして(あるいは、操作を高度に抽象化して)、正しい・よいコードを自然と書けるようにするという考え方みたいです。
また、プログラミング初心者にとって、セミコロンがなくてコンパイルエラーだとか、スペルミスでエラーだとか、そういうあまり本質的でない問題を避けながら効率よくプログラミングを学べるというのも利点だといえます。

スペースの入力とかそういう些細なことにプログラミングの時間を使うのには意味がないし、未来の IDE はこういったものになっていくのでは、といったことも言っていました。
なるほど、ただの教育用 IDE の紹介じゃなかったです。て、それもセッションのサマリに書いてありました。

... but the principles are just as applicable to Java and professional programming. If this technology is successful, your IDE might one day look like this. Come and decide if this is the future of programming.

まあたしかにそうかもとも思いつつ、コードブロックをスコープ単位で D & D できるとか、ちょっとやりすぎ感もあるので、プログラマ向けにはバランスを取っていく必要があるだろうなとは思います。
今の IDE にも自動整形機能とかありますけど使われたり、使われなかったりですし。使われない理由も色々あると思います。

ふたたび教育用 IDE として見ると、Java と地続きなのがいいところで、専用の簡易言語を使った、あるいはよりグラフィカルな教育用プログラミング環境に比べると、Java への移行がずっとスムーズです。
でも、やっぱりその分初期から必要になる知識が多くなりそうではありますが……。あくまで最終的には Java を学ぶための「プログラマ養成ギプス」として見れば、悪くなさそうです。

Combining Concurrency and Collections

Michael Duigou によるセッション。

Java のマルチスレッド環境でコレクションを扱う方法、色々ありすぎて、Java8 ではどういうときにどれを使うのが一番とかイマイチわかってないんだよなー、バシッと最新の情報が得られるといいなー、と思っていたら、「シングルスレッドならそもそも問題は起きない」とか「volatile とは何か」とかえらい基礎的なところから始まってアレッと思ってサマリを見直したらちゃんと書いてました

This introductory/refresher session reveals the fundamentals of threading, ...

  • ふたたび教訓その 4 : 出る前に一度、セッションのサマリはよく読みましょう。

とはいえ、"fundamentals"(基礎)という言葉が使われているように、上っ面を舐めるようなものではなく、"refresher"(おさらい)としては十分役に立ったので、結果オーライです。

内容自体は本当にマルチスレッド関連の良書を読めば必ず出てくるようなものなので割愛します。
興味のある方はこのあたりをどうぞ。

と言いつつ、この辺の本をちゃんと読まないと得られない知識のエッセンスをわずか 1 時間で得られるのがこういうセッションのいいところですね、やはり。

名場面その 4 : "playing with gasoline"

印象的だったのは Immutable の説明のところで "gentleman's agreement"(紳士協定)という言葉が使われていたのと(Java ではパフォーマンスとの兼ね合いでそうなる場面はありますよね)、volatile の説明で再三 "adds some gasoline" とか "playing with gasoline" とか言ってたことで、 volatile 極力使わんどこ*2という気持ちが強く胸に刻まれました。

f:id:enk_enk:20151027071832j:plain ▲volatile を執拗にけなす様子(これで三度目)

James Writes Java: What I Have Learned by Reading James Gosling’s Code

引き続き Michael Duigou によるセッション。

言わずと知れた Java 言語 / JVM の設計・開発者である James Gosling と一緒に働いた経験のある Duigou 氏が James Gosling のコードについて面白おかしく語ってくれました。

話が始まる前はなんとなくイメージだけで「言語設計者ならではの鋭いテクニックが見つかったりするのかな」と期待してしまっていたのですが、「あくまでこういうコードがあるよというだけで、こういうコードを書くことをおすすめするものではない」と最初に断られてしまいました。笑

f:id:enk_enk:20151026155026j:plain ▲この威厳あるタイトルのセッションがまさかあんな内容だなんて……。

名場面その 5 "atypical Java idioms"

あれ、でもサマリにはそんなこと書いてなかったような……と思ったら

... including some atypical Java idioms ...

19 行あるサマリのうちの 1 行にぽつりと。

atypical
音節a・typ・i・cal 発音記号/eɪtípik(ə)l/
【名詞】
不定型の,異常な,アブノーマルな; 不規則な.
atypicalの意味 - 英和辞典 Weblio辞書

で、肝心のコードなのですが常軌を逸して文字が小さく、真ん中より少し後ろの席からはどう頑張っても読めず、英語力も乏しいため説明からコードを補う(想像する)こともできず、割とかなしい一時間でした……。

  • 教訓その 5 : スライドの字は君が思うよりもいつも(とは言わないが)小さい。*3狭いところに入れてもらってでも、可能な限り前に座ろう。

コード以外のところはだいたいわかったのですが、「James は NetBeans を使っている」とか、「コメントも javadoc もほとんど書かない」とか、「Java の標準ライブラリとよく似たものとか、自分しか使わないようなライブラリを好んで書く」とか。NetBeans はともかく、なかなか褒められたものではありませんね! この話だけ聞くと!

コメントや javadoc はたくさん書くのがよいとも限りませんが、ほぼ唯一読み取れた次のようなコード例を見るに推して知るべしという気がします。

if (cond) try {
    // do something
} catch(Exception e) {
    // handle exception
} finally {
    // cleanup
}

うーん。
なんかちょっと美しい感じもして面白いですけどね。何かの拍子に多くの人が使うようになればあるいは……。

Is Your Profiler Speaking the Same Language as You?

Java Champion であり、Java RockStar でもある Simon Maple のセッション。

その肩書に恥じない、わかりやすく、聞き取りやすく、魅力的なプレゼンテーションでした。
スライドのデザインも(私が読んだことのある本の中では)『ノンデザイナーズ・デザインブック』に出てくるお手本のような、美しく、一目で情報を読み取れるデザインで、目標にしたくなりました。*4

f:id:enk_enk:20151027093443j:plain ▲いかしたルックスです

さて、内容としては、以下のようなものでした。

  • アンケートによると、開発・運用のさまざまな段階でプロファイルやパフォーマンスチューニングを行っている。
  • ほとんどの場合、問題を修正するのは(運用担当者等ではなく)開発者。
  • 「パフォーマンスチーム」による修正には時間がかかる。もともとの開発者自身がやるのが一番早い。
  • 開発のある段階からは、パフォーマンスの向上はコードの複雑さとのトレードオフになる。(釣り針型のカーブを描く)
  • プロファイリングの対象には CPU とメモリがあり、それぞれにトレースかサンプリングか、いずれかの手法が選択される。
  • トレースにはオーバーヘッドの存在やコールスタックの深さによってオーバーヘッドに差が出ること、サンプリングには safepoint sample bias といった問題がある。(safepoint sample bias を回避するプロファイラの例 : RichardWarburton/honest-profiler · GitHub

f:id:enk_enk:20151027093935j:plain ▲パフォーマンスとコードの複雑さのトレードオフ

f:id:enk_enk:20151027095853j:plain ▲トレースの問題(スタックの深さによる偏り)

f:id:enk_enk:20151027094447j:plain ▲サンプリングの問題(safepoint sample bias)

といった話を 40 分ほどしたところで、Simon が勤務する ZeroTurnaround の製品 XRebel の紹介に移行しました。
XRebel の紹介への移行が不意打ちかつ自然すぎて逆に「宣伝だったのね!」という謎の裏切られ感を覚えてしまいましたが、色々わかりやすく教えていただいたので実のところ文句はありません。

疑心暗鬼になった私は念のためサマリも見直してみましたが、あえて該当するものを探すなら最後の最後に

And more.

の一言があるばかりでした。ここからそれ(XRebel の紹介)を読み取るのは……ちょっとむずかしいですね。

XRebel はもちろんこのプレゼンで挙げられた課題を解決するものでしょうし、Oracle の Flight Recorder に比べると価格もだいぶ安い*5ようなので、一度は試してみたいですね。

2 週間無料で試せるようです。

zeroturnaround.com

Troubleshooting Slowdowns, Freezes, Deadlocks: Introduction to Thread

今日の締めくくり *6 は、サムライズムの山本裕介さん(@yusuke)によるスレッドダンプについてのセッションです。

ある意味で、私がスレッドダンプについての記事を書くきっかけになった(記事を書いた)人の話だったので、とても楽しみにしていました。

内容はというと、前半は、まさに前述の私の記事もターゲットとしていたようなスレッドダンプの初歩の初歩のところ。
そして後半は、山本さんが開発されているスレッドダンプ解析ツール「侍」の紹介でした。こちらはオープンソースだしサマリにも書いてあるので「宣伝だったのね!」感は薄い……、と思います。実際、侍を使い始めてみるには有用な内容でした。

個人的に便利だなと思ったのが、前半の jps のティップス。
jpsJava プロセスのプロセス ID を取得するコマンドですが、

C:\>jps -l
6420 sun.tools.jps.Jps

という風に -l オプションをつけることで、起動クラス名が取得できます。
また、-m(コマンドライン引数の表示)と -v(VM 引数の表示)オプションもつけることでほぼ完全に特定が可能になります。

C:\>jps -mlv
5244 sun.tools.jps.Jps -mlv -Dapplication.home=C:\Program Files\Java\jdk1.8.0_66 -Xms8m

IntelliJ IDEA から起動したアプリケーションは起動クラス名が引数として与えられるため、この jps の出力を起動クラス名で grep することで、目的のプロセスが見つけられる……というのは、地味に便利です。

名場面その 6 : かわいいドクロ

侍の使い方の説明で、デッドロックしているときにドクロマークが出るのですが、ドクロがめっちゃかわいいためか会場に笑いが起きていました。

写真を取り損ねて残念ですが……かわいいんですよ。使ったことある方はわかると思いますが。ファンシーなんです。見た目は。
ぜひ侍を使って、見てみてください。生ドクロ。(本番環境以外で)

f:id:enk_enk:20151027114259j:plain ▲セッション終了後質問攻めにあう山本さん

また明日

f:id:enk_enk:20151027121940j:plain ▲サンフランシスコの夜

6 セッションまとめてたらさすがに疲れました。
明日もたっぷり 6 セッションの予定です。

明日もがんばります!

(追記)3 日めの記事はこちら!

appresso.hatenablog.com

*1:厳密にはまだ公開されていなかったかもしれませんが、スクリーンに出ているブラウザの URL を入れたら出ました

*2:というか、意味と機能を理解して、使うときにはよく考えましょう

*3:ついでに声も小さい場合がある。

*4:ただ『ノンデザイナーズ・デザインブック』では非推奨とされていた「ぜんぶ大文字のタイトル/センテンス」が多用されていましたが、それでも読みやすかったので、原則をうまく破った例、と考えていいでしょう

*5:開発者一人当たり年間 365 ドル。もしこれが(組織全体の開発者とかでなく)「ソフトを使用する開発者」のみへの課金だとすれば、機能にもよりますがかなり安いと思うので、魅力的です

*6:ほんとはもう 1 セッションいけるのですが、体力の都合により