2023/09/12

Who's Who in Java 現代編

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

 Who's Who in Javaの続きです。

前回はJavaを作っていた人たちを紹介しました。本エントリーでは現在、Javaを作っている人たちを紹介します。

発表資料でいうと、ここからです。

本エントリーで紹介する人は、今のところすべてOracleの社員です。オープンソースになったとはいっても、Javaの方向性を決めて、実装しているのは、やはりOracleの人が中心です。


Mark Reinhold

まずはじめに紹介するのが、JavaのチーフアーキテクトであるMark Reinholdです。

Markが表舞台に登場したのは、J2SE 1.4で導入されたNIOです。

J2SE 1.4のころの大きめの標準APIは、JCPで標準策定が行われていました。NIOはJSR 51です。JSRはJava Specification Requestの略です。

そのJSR 51のスペックリードがMarkでした。

NIOも結構もめたらしいのですが、それをまとめたのがMarkだったということをJSR 51のエキスパートグループにいらした方から聞いた覚えがあります。JSR 51のエキスパートグループを見てみれば分かりますが、日本の某企業も加わっているのが分かりますね。

その後、MarkはJava 5のスペックリードになります (JSR 176)。彼は技術力だけでなく、交渉をまとめる調整力があったからだと思います。

Java 6ではMarkはスペックリードを外れます。Java 6からJava 7のころは、SunがOracleに買収されたり、オープンソース化や、関数型の導入などでゆれにゆれていた時期です。

そこで、Java 6のスペックリードがまとめきれなくなったのか、途中からMarkが再登板します。

Java 7のリリース予定が遅れまくっていた時に、ラムダ式はJava 8にスリップさせることを決めたのもMarkです。

Javaを作っている開発者や、JCPのエキスパートグループなどから全幅の信頼を持たれていたMarkだからこそ、まとめられたのだと思います。

このころ、SunでJavaを作っていた日本人開発者の方から聞いた話なのですが、「Markが言うことなら信用できる」と多くの開発者が言っていたらしいです。

そして、激動期のJavaのスペックリードをJava 9までつとめます。Java 10からはこの後に紹介するBrian Goetzがスペックリードとなりました。

現在では大きな方針変更のたびにMarkが引っ張り出されています。たとえば、LTSの期間を変えるとか、JVMLSのエントリーで紹介したProject Leydenなどです。


彼がスペックリードだった時代、JavaOneのテクニカルキーノートといえばMarkでした。

"Welcome to JavaOne"で始めるのが恒例で、彼の口癖にa lot ofではなくa bunch ofがあります。こういう言い方を知ったのも彼のセッションでしたね。

しかし、彼はSunもしくはOracleが主催のイベント以外では登壇をほとんどしていません。たぶん、Devoxxぐらいじゃないかなぁ。

日本でJavaOneをする時に、Markに来日してもらおうと、当時Oracleだった寺田さんが奮闘していたのですが、結局果たされず。ぜひ、一度は日本にも来てほしいですね。


Brian Goetz

Mark ReinholdからJavaのスペックリードを受け継いだのがBrian Goetzです。肩書としてはJava Language Architectです。

Brianはもともと自分の会社を持っていました。その当時、IBMのDeveloperWorksという技術コミュニティサイトがあって(今はIBM Developerになっています)、そこに多くの記事を書いていました。DeveloperWorksは日本語サイトもあって、Brianの記事も訳されていて、さくらばも読んでました。残念なことにDeveloperに衣替えした時に、日本語のサイトはなくなってしまったようです。

また、彼はJSR 166 Concurrency Utilitiesのエキスパートグループのメンバーでもありました。JSR 166がJ2SE 5に導入された後、Brianが中心になってJava Concurrency in Practice (日本版はJava並行処理プログラミング)を書き上げています。

もう20年近く前の本ですが、今でもJavaでパラレル処理について一番おススメできる書籍です。残念ながら、日本語版は絶版になってしまいましたが...

さて、この本が出版されたころに、BrianはSunに入ります。

彼が担当したのが、Project Lambdaです。

Project Lambdaはほんといろいろあったプロジェクトです。

関数型をJavaに導入するということで、Project Lambdaの前に前哨戦があり、いくつもの提案がされていますし、もちろん反対派も多かったのです。

たとえば、前のエントリーで紹介したJoshua BlochとNeal Gafterはそれぞれ別の方式を支持し、そのせいで仲たがいしてしまったという噂もあります。

Project Lambdaになってからも、二転三転してやっとまとまったのがJava 8だったわけです。

Brainはプロジェクトリードとして、Project Lambdaをまとめたわけです。

その後も、Project AmberやProject Valhallaのプロジェクトリードになり、Java 10からはJavaのスペックリードになりました。

これからのJavaの方向性を決めているのが彼だと言い切っても間違いではないです。

BrianはOpenJDKでも、そのつどつどでドキュメントを書いていますし、InfoQなどにも記事を書いています。それだけでなく、メーリングリストでもたびたび投稿を行っており、他の開発者からの質問にも丁寧に答えています。

すごい忙しい人だと思うのですが、よくこれだけやるなぁと本当に頭が下がります。


John Rose

Brian GoetzがJava言語の人だとしたら、JVMの人といえばJohn Roseです。

John RoseはJavaOneのキーノートへの登壇こそないものの、JVMのセッションでおなじみです。

さくらばがJohnのことを知ったのは、JSR 292 Supporting Dynamically Typed Languages on the Java Platformのスペックリードとしてです。

JSR 292は新しいバイトコードであるinvokeDynamic、いわゆるindyを導入したプロジェクトです。indyはJVM上で動的型付け言語の実装を行いやすいように、実行時に実行するメソッドを動的に決定することのできるバイトコードです。

また、これに伴いDa Vinci Machine Project (Multi-Language VM)のプロジェクトリードにもなっています。

そして、これがJVMLSにつながるわけです。

現在はProject Panamaのプロジェクトリードにもなっています。


スペックリードたち

ほんとにJavaを作っている人たちをあげていくとキリがないのですが、その中から今活躍している4人を紹介します。


左上のPaul SandozはJVMからJavaの言語仕様まで広く活躍しています。

今のメインはProject PanamaのVector APIですね。

Project Panamaは大別して、2つのサブプロジェクトがあって、1つがPaulが主導しているVector API、他方が次に紹介するMaurizioが主導するForeign Function & Memory API (FFM)です。

JavaOneでも彼のセッションはおなじみで、柔らかい口調で、楽しくてしょうがない感じで話すのが印象的です。


左下のMaurizio Cimadamoreは前述したFFMを主導しています。

もともとコンパイラが得意で、javacにおけるラムダ式の部分はほとんど彼が書いたらしいです。これはOpenJDKのコミッターである @bitter_fox さんに聞いたので、たしかなはず。

他の開発者はMarkとかBrianというようにファーストネームで呼んでますけど、@bitter_foxさんがMaurizioさんといつも呼ぶので、なんとなくMaurizioさんと私もさんづけで呼ぶようになってしまいましたw


右上のRon PresslerはVirtual Threadを策定したProject Loomのプロジェクトリードです。

リードをするのはLoomがはじめてのはず。というか、それ以前に彼が何をやっていたのかさくらばはよく知らないのです。

Project Loomはもうそろそろ終わりが見えてきたので、次にRonが何をはじめるのか楽しみです。


ここまでの3人はどちらかというとJVM側の開発者でしたが、ライブラリを作っている人もいます。右下のStuart Marksもその1人。

彼もProject Lambdaなどのプロジェクトにも参画していましたが、今はコアライブラリチームの活動が主体のようです。特にコレクションフレームワークですね。

むきむきJavaでイシダさんがSequenced Collectionsについてプレゼンしてくれたのですが、そのSequenced CollectionsのJEPを書いたのも、プルリクしたのもStuartでした。

ところで、上の写真でStuartが白衣に聴診器をつけてます。これは、2016年のJavaOneのコミュニティキーノートでSteven Chinの企画で寸劇をしたのですが、その時にDr. Deprecatorという役でStuartが演じたものでした。

彼はこれが気に入ってしまったようで、毎年Dr. DeprecatorとしてJavaOneに登場してます。


Javaコミュニティ

ここで紹介する3人は、マネージメント側の人たち。特にJavaコミュニティに関わる人たちです。

3人とも同じTシャツを着ているのは、2022年のJavaOneのキーノートセッションで撮ったからです。


一番左側のGeorges SaabはJava Platform Groupの上級副社長です。そして、JavaOneのキーノートといえばGeorgesです。

Georgesは元々は開発者でJavaのGUIであるAWTを作っていました。

その後、BEAに転職して、そのBEAがOracleに買収されて、Oracleに戻ってきました。Oracleに戻ってきた時にはBEAのJRockit担当の副社長だったのですが、今ではJava全般を担当しています。


真ん中のChad Arimuraも副社長で、Javaのデベロッパーリレーション担当です。Java Championの事務局も彼に担当していただいてます。

彼も元々開発者で、サーバーレスのFn Projectなどを作っていました。

Arimuraという名字でお分かりのように日系の方なのですが、日本語は全然喋れないです。

そういえば、2019年に東京で開催されたOracle Codeで @bitter_fox さんと私でVector APIとVirtual Thread (当時はFiber)のデモをキーノートセッションで行いました。この無茶ぶりをしてきたのが、Chadですww


右側のSharat Chanderは肩書はプロダクトマネージャーですが、Sunの頃からJavaOneなどのイベントの取りまとめなどJavaコミュニティに関する業務を一手に引き受けている感じです。

2015年からはJavaOne (or Code One)のMCも彼が担当してますね。

X (元Twitter)でも、Javaに関するツィートをいっぱいしてます(それ以外のツィートも多いですけどw)。


Duke

最後に忘れてはならないのが、Dukeです!

言語でマスコットを使ったのはJavaのDukeがはじめてだと思います(さくらばが他を知らないだけかもしれませんが...)

前回のJames Goslingの説明で、Javaは元々情報家電向けのOakという言語だったことを書きました。このOak時代に、プロトタイプとしてStar 7というタブレットの分厚いののようなマシンを作成していました。

下の写真はComputer History Museumで展示されていた、Star 7 (* 7)です。

_DSC5804

このStar 7で、動いていたのがDukeです!この時から側転してましたww

つまり、Dukeの方がJavaよりも古くから存在するわけです。DukeのデザインをしたのがJoe Parlang。彼はのちにシュレックなどにも参画しています。

この当時は、Dukeには特に名前はなく、その形状からFang (牙)と呼ばれていました。しかし、当時のマーケの人が、「Fangなんてかわいそうな名前ではなくて、Dukeにしましょう!」と言ったとか言わないとか...

JDK 1.0のアルファ版からサンプルとしてDukeが側転するアプレットが含まれていたので、Javaを触る人は誰もがDukeを目にしていたわけです。

時代が変わって、JavaがOpenJDKでオープンソース化された時、Dukeもオープンソース化されました。JavaのライセンスはGPL Classpath Exceptionですが、DukeはBSDライセンスです。したがって、改変することも自由、商用利用も可能です。

ちなみに、Dukeはコミックにもなっていて、JavaOneで配布していました。そのコミックは The Amazing Adventures of Duke で読めます。


むきむきJavaではDukeを使ったものとして、下の4つの写真を紹介しました。

まずはやっぱりぬいぐるみ。

さくらばも各種Dukeのぬいぐるみ持ってます。ハンドパペットも持っていたりしてw

左下のDukeおにぎりはもちろん日本のものです。最古のDukeおにぎりは日本ではじめて横浜で開催されたJavaOneの時だと記憶しているのですが、もしかしたら違うかもしれません。

この時の企画は、当時SunのIさんでしたね。

その後、日本のJavaのイベントではDukeおにぎりはおなじみになってます。上の写真のDukeおにぎりは造形がイマイチですけどw

右上のギターのような楽器はウクレレです。Dukeleleといいます。

これも日本の企画でした。

Java 10周年の年である2005年に東京でJava Computing 2005 Springというイベントが開催されました。この時に、前述のIさんが記念になるノベルティを企画していたのです。

その当時、Javaで書かれた3DのウィンドウシステムであるProject Looking Glass (LG3D)が話題になっていました。

作者の川原さんはウクレレが好きで、登壇する時もウクレレを持ちながら登壇していました。また、LG3Dのコミュニティにやはりウクレレが好きなKさんが、三角形のFlukeというウクレレを見つけてきて、これだったらDukeになるんじゃないかとIさんに提案したのです。

そこからとんとん拍子に話が進んでDukeleleが誕生したわけです。

私がサムネイルに使っている写真で手に抱えているのがDukeleleです。

DukeleleはアメリカのJavaOneでも販売されたのですが、2005年と2006年だけ。持っている人はかなりレアですよ。

右下のずんぐりしたDukeは、Javaの20周年のパーティーを東京で行った時のDukeケーキです。このためにだけ、寺田さんが特注オーダーで作ってもらったものです。

この形にするために、かなりずっしりとしたケーキで、外側はマジパンで成形されてます。ちゃんと食べられるんですよ、このケーキw

これ以外にもいろいろなノベルティなどにDukeは使われていますね。


最後のDuke's Choice Awardというのは、毎年JavaOneでその年にJavaで作られた製品やサービスを表彰するというものです。

日本からもDuke's Choice Awardを受賞しています。たとえば、古くはNTTドコモのi-Modeなんてのも受賞していました。さくらばの友人だと、九州大学(当時は九州工業大学)の小出先生(2005年)や、サムライズムの山本ユースケさん(2019年)が受賞しています。

Duke's Choice Award _DSC3612


この他にも、AlanやAlex, Joe, Michael, Charlie、佐藤さんと、あげていけばキリがありません。そうそう、日本でJDKを作っているDavidも!

普段はJavaを作っている人たちはあまり表には出てきませんが、このエントリーで少しでも親しみを持っていただければと思います。


むきむきJava ふりかえり

最後にちょっとだけむきむきJavaの感想など。

ほぼはじめてだと思われる3人のプレゼンを聞いたのですが、はじめてだとしたら、まぁよかったのではないでしょうか。

JJUGのLT大会でShiryuさんが伝えることが多すぎて失敗したと嘆いていましたし、司会の cero_t さんからはメッセージは1つに絞った方がいいよとアドバイスもらっていたので、それ以外の視点で1つだけコメントしておきます。


Shiryuさんと、Kageiさん、イシダさんの3人のうち、一番わかりやすいと感じたのはイシダさんのSequenced Collectionsの話でした。

では、イシダさんと他の2人はどこに違いがあったのでしょう。

それは、ShiryuさんとKageiさんは自分が分かっていることを知らない人に説明したのに対し、イシダさんは自分の知らないことを調べてそれを知らない人に説明したという点です。

これはベテランの人でもやりがちなのですが、自分が分かっている分野だと、無意識のうちにその分野の言葉を使ってしまうのです。

もちろん、聞いている方はその分野は知らない世界なので、言葉も分かりません。そのためにプレゼンの理解が妨げられてしまうわけです。

プレゼンのターゲットが異なれば、言葉も変えていかなくてはならないのですが、普段、普通に使っている言葉だと、その言葉が相手に通じるかどうかすら考えなくなってしまうのです。

専門用語であれば「これは通じるかな?」と考えるかもしれないですけど、意識せずに使っているその世界の言葉はなかなか気づきにくいです。

以前、知人と雑談していた時に、家電の設定の初期値のことをデフォルトと言った時にまったく通じなかったことがあります。デフォルトってプログラムを書いている人であれば当たり前のように使っている言葉ですけど、この業界以外では通じない言葉です。

しかも、その知人は保険屋さんだったので、デフォルトがまったく違う意味で使われており、家電に対して使うという意味が分からなかったらしいです。金融系であれば、デフォルトは債務不履行のことなので、私たちが使う意味とは全然違いますよね。


これに対し、イシダさんは自分が知らないことを調べてプレゼンしたので、知らない世界の言葉は使わずに (というか使えなかったのだとは思いますが)、自分の言葉で説明しようとしていました。

ここが聞く側の分かりやすさの違いになっていたと思います。

プレゼンするときは、ターゲットによって言葉を変える。そして、説明する言葉が相手に理解できるかどうかを考えるというのが重要になってきます。

この点に気をつければ、次のプレゼンはもっとよくなると思いますよ。

2023/09/10

Who's Who in Java 過去編

このエントリーをはてなブックマークに追加
James Gosling, Community Keynote, JavaOne 2015 San Francisco

むきむきJava という若手中心のJavaのコミュニティが立ち上がり、第1回目のイベントをやるというので、ぜんぜん若手ではないのですが、プレゼンさせてもらいました。

コミュニティの趣旨であるJava筋をむきむきにするようなのは若者にまかせて、Javaの初期から関わっているおじさんとして技術ではない部分で興味を持ってもらおうという内容にしました。

題して、Who's Who in Java です。発表資料はこちら。

Who's Whoというのは日本語で言うと紳士録とか名士録というものです。最近だと使わない言葉ですね。

ようするに、Javaで有名な人を紹介するということです。というか、Javaを作ってきた/作っている人を紹介するプレゼンをしました。

話しだすと止まらないぐらいエピソードがいっぱいあって、時間を盛大にオーバーしてしまってすみませんでした。

できれば、1人ぐらいは覚えておいてほしいですね。

せっかくなので、ここで紹介しましょう。まずは作っていた人たちから。


James Gosling

1人目は "Javaの父" ことJames Goslingです。

彼はカーネギーメロン大学在籍中にEmacsを作った人として有名ですけど、結局Gosling EmacsはGNU Emacsにとってかわられてしまいました。

また、Sun Microsystemsに入社した後もSunOS向けのウィンドウシステムであるNeWSを作成したりしています。NeWSはDisplay PostScriptとは違いますが、PostScriptを使って描画するというかなり画期的ウィンドウシステムだったのですが、結局はX Windowにとってかわられてしまいました。(昔、SonyのワークステーションがNEWSで、NeWSとよくゴッチャになりやすいというのもありましたw)

3度目の正直ではないですけど、彼が情報家電向きに作った言語がOakです。

でも、結局情報家電向けには受け入れられず、方向性を変えてJavaとなったわけです。

彼は常にTシャツにジーンズといういでたち。

上の写真は2015年のJavaOneのコミュニティキーノートでのGoslingです。この時もTシャツ、ジーンズでしたが、ほんとにいつでもTシャツ、ジーンズです。

Sun Microsystemsだったころには、JavaOnのドレスコードの記載があって正装がTシャツとジーンズと書かれていたぐらいです。こういう遊び心はなかなか見かけなくなってしまいましたね。

そして、JavaOneでは毎年新しいTシャツを作っていて、それをキーノートの最後に投げるというT Shirt Tossも恒例になっていました。

2004年や2005年のJavaOneではT Shirt Toss Machineのコンテストがあったりしました。2005年は確か下の写真のマシンが優勝したような気がするのですが、詳細は覚えてないです... 

JavaOne 2005 San Francisco

James GoslingはOracleをやめた後、ベンチャーにいったりしてましたが、現在はAWSに所属しています。

そして、2019年にはマウンテンビューにあるComputer History Museumで殿堂入りしました。

たまたま、この年にComputer History Muesumに行ったら、ミュージアムのロビーにこの年に殿堂入りした4人が大きく取り上げられていてビックリしましたw

ちなみに、さくらばはJamesが来日した時に日本のSunの人に誘っていただいて、ランチを一緒に食べに行ったことがあります。

その時に、「Java言語仕様」を持って行って、サインしてもらったのもいい思い出です。

下の写真がサインをしてもらっている時に撮ったものです。

James Gosling, JJUG Cross Community Conference


Bill Joy

次はBill Joyです。

Bill JoyはあまりJavaのイメージはなくて、BSDのイメージの方が強いとは思いますが、初期のJavaの強力な推進者でもありました。

ちなみに、むきむきJavaの参加していた人たちはLinuxがUnixだと思っていたぐらいなので、BSDと言っても「はぁ?」という感じなんでしょうね。


Javaがリリースされたころ、すでにBill Joyは伝説のプログラマでした。

Bill JoyはBSDのcshやviを作った人で、TCP/IPのスタックを作ったのも彼でした。週末に1人でBSDのカーネルを書き換えたという伝説もあったりします。

で、そのBill Joyですが、OakのころからJavaに関与しています。Java言語仕様の作者としてもGoslingの次にクレジットされています。

ただし、彼がJVMを作っていたというわけではないです。

Javaが発表された1995年に、日本のJavaのお披露目的なイベントがたしかニューオータニでやったのですが、そこでプレゼンしたのがBill Joyでした。

その時に、Javaのカップをもらって、いまだに手元にあります。

その後、JavaのJiniやJXTAを進めていたのですが、これらはイマイチでしたね。どちらも分散オブジェクトシステムだったのですが、今となって考えるとオブジェクトを分散させて使う意味はほとんどなかったですね。

そういえば、JavaOneの前日にチュートリアルのJava Universityというイベントがあったのですが、そこでさくらばがJiniのコースを受けたことがあります。

コースの最後になって、なんとBill Joyがやってきたのです。抽選でJiniの本をくれるということになったのですが、そこで、あててしまったのですよ。

で、その場でJiniの本にBill Joyにサインしてもらいました!!

ちなみに、上の写真は2005年のJavaOneで撮ったのですが、このすぐ後にSunを退職されてしまいました。今はベンチャーキャピタルのパートナーになっています。

また、彼もComputer History Museumの殿堂入りしています。


Joshua Bloch

Joshua Blochといえば、Effective Javaの著者として有名ですね。Javaを使っている開発者であれば、ぜひ読んでほしい本です。

そのJoshua Blochですが、コレクションフレームワークなどを作っていた人でもあります。今でもJavaのソースコードを読んでいると、Joshua Blochがクレジットされているコードがいっぱいあります。

さて、彼はプレゼンの名手でもあります。Effective JavaもJavaOneのセッションとしても有名でした。

そして、当時の同僚であるNeal Gafterと一緒にJava Puzzlersというセッションも担当していました。

このJava Puzzlersは、簡単にいうとJavaのクイズです。言語仕様やAPIの分かりにくいところをクイズにして、答えてもらうセッションです。しかし、単なるクイズではなく、どうすればその間違いを防ぐことができるか、そして最後には教訓まで含めるという、とても教育的なセッションでした。

たとえば、こんな問題です。オリジナルはDateクラスを使っていたのですが、Date & Time APIに書きかえてあります。

このクイズの答えは2です。

なぜかというと、staticであるクラス変数は上から初期化されます。

つまり、INSTANCEの方がCURRENT_YEARより先に初期化されます。

INSTANCEの初期化でElvisのコンストラクタがコールされますが、コンストラクタ内のCURRENT_YEARはまだ初期化されていません。そのため、CURRENT_YEARは0のままになっています。

そのために、beltSizeは-1930になってしまうわけです。

この問題の教訓はクラス変数の初期化に他のクラス変数は使わないようにすることと、初期化の順番に依存してしまうようなコードは書かないようにしましょうということです。

このクイズのタイトルであるElvis LivesのElvisは、もちろんElvis Presleyのことです。晩年のElvisはどんどん太ってしまっていたのですが、そのElvisが生きていたらウェストがどのくらいになっていただろうねというジョークになっているわけです。

この問題に限らず、Joshuaのパズルはウィットに富んでいます。

彼らはJava Puzzlersのセッションには、おそろいのつなぎを着て、セッションの開始する時に"We are Click and Hack, The Type-it Brothers!"と言ってはじめるのです。

これも元ネタがあって、アメリカのラジオ番組の「Car Talk」のパズルコーナーから来ているらしいです。オリジナルは"Click and Clack, the Tappet Brothers"なんだそうです。

Java Puzzlersも書籍になっていて(日本語の翻訳はすでに絶版なのですが...)、その日本語版には訳者の柴田さんが、クイズの元ネタや英語ならではのジョークの解説を書いてくれています。こういうジョークを思いつくJoshuaもすごいですけど、柴田さんも裏をとるのが大変だったでしょうね。

ちなみに、彼はSunを退社した後、Googleにいましたが、現在はカーネギーメロン大学の教授をしています。


Scott McNealy, John Gage

過去の人の最後はScott McNealyとJohn Gageです。

彼らはJavaを作っていたわけではないのですが、Javaにとってとても重要な人たちです。

Scott McNealyは、Javaがリリースした当時のSun MicrosystemsのCEOです。

英語でべらんめえ調というのも変な感じですけど、ほんとそんな感じで話す人でした。上の写真でも彼は手にカードを持っていますが、あれはカンペです。

プレゼンでカンペ持って喋ってもいいと教えてくれたのが(もちろん、直接教えてもらったわけではないですけどw)彼でした。でも、カンペを見ながら話すことはないですね。

Scott's Top 10というのは、彼のジョークのことです。JavaOneなどのキーノートで10個のジョークを言っていくわけです。カンペに1つずつジョークが書いてあって、受けたらそれをとっておいて、受けなかったら捨ててしまうという。

変なCEOですよね。


そして、John Gageです。

彼のSunでの肩書はScientistでした。Sunのスローガンに"The Network is The Computer"というのがあります。このフレーズを考え出したのが、John Gageでした。

現代ではネットがなければ、ほんとに何もできないので、このフレーズも納得なのですが、ネットワークの普及期にこれを提唱するというのはほんとに先見性があったのだと思います。

さて、彼は長らくJavaOneのMCでありました。彼がいなければ、当時JavaOneがあれだけ盛り上がらなかったと思います。

彼が必ずJavaOneで言うフレーズに"Don't be Shy!"というのがあります。知らない人たちの集まりではあるけども、Javaという共通の話題があるのだから恥ずかしがらずに話しましょうということです。

彼のMCにおけるポスチャーはさくらばのお手本でした。ポスチャーに関しては彼から学んだことがほんと多いですね。


つらつらと書いていたら、やっぱり長くなってしまいました。

ほんとはTim LindholmやGraham Hamilton、2020年に亡くなってしまったBill Shannon、Roberto Chinninci、Chet Haase、そして奥津さんなど、取り上げたい人はいっぱいいるのですが、このエントリーではこのへんでやめておきます。

そして、今Javaを作っている人たちは次のエントリーで!

2023/09/07

JVM Language Summit 2023 その2

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

JVMLSの続き。

前のエントリーでは行き方や、宿泊などについて書きましたので、本エントリーではJVMLSの本編について紹介します。


JVMLSは3日間行われますが、最終日は午前だけなので、実質2.5日です。

また、基本的にはシングルトラックで、Workshopという名のQ&Aセッションだけは2つのトラックに分かれます。

タイムテーブルはこちら


LTでも話したのですが、全体的な感想は

上に書いてあるProject Panamaは主にForeign Function & Memory (FFM)の方です。Vector APIの方はだいたいできているので。

2番目の起動時間は2019年の時にも話題にはなっていましたが、Project Leydenが立ち上がったことで、本腰を入れた感じですね。

3番目ですが、今年はProject Amberのセッションがありませんでした。Pattern Matchingでまだ残っているものもありますが、DOPに関する機能に関しては終わりが見えてきた感じがあります。

そこで、Brian Goetzが新しいことを始める予感が...

Project Valhallaは最終日にセッションがありましたが、まだまだ決めなくてはいけないことが多そうな感じです。

それにしても、みんな年取りましたね。それでも、みなさん元気な様子でよかったです。


セッションはYouTubeで公開しているので、興味があるものがあればぜひ見てみてください。


さて、セッションの中で櫻庭が気になったセッションを簡単に紹介します。


A Classfile API for the JDK

Brian Goetzのセッションで、Classfile APIというのははじめて聞きました。

Classfile APIというのは、簡単に言えばクラスファイルやバイトコードをいじるためのAPIです。

JDKの内部ではクラスファイルを扱うためにASMが使われていました。しかし、ASMはOpenJDKの外部で作られているライブラリで、最新のクラスファイルに対応するまでには時間がかかってしまいます。

OpenJDKでは最近でもクラスファイルのアトリビュートが追加されたり、定数を扱うためのCondyが登場したり、さらにValhallaなどでバイトコードが追加されるかもしれません。

そこで、標準でクラスファイルやバイトコードを扱うためのAPIを作りましょうというのがBrianのセッションです。

すでにプロトタイプはあるようで、コード例も紹介されていました。


Continuations - Under the Covers

Continuationは日本語では継続です。

Virtual Threadでは頻繁にスレッドの切り替え(コンテキストスイッチ)が行われます。これを従来のスレッドのコンテキストスイッチで行っていたら、メモリも食うし、時間もかかるでよいことはありません。

そこで、Virtual Threadでは継続(実際には限定継続)を使用して、処理の中断、復帰を高速に行っています。

この継続のコードはほとんどがJavaで書かれています。処理の中断、復帰にはJVMスタックを退避したり、戻したりする必要があるのですが、それをJavaで書いてあるわけです。しかも、JVMスタックのすべてを退避させるのではなく、部分的な退避、復帰で済ませるような工夫もされています。

このセッションではその限定継続のアルゴリズムについての解説を行っています。


Project Leyden

Project LeydenはGraalVMのネイティブイメージを作成するAOTコンパイラを、OpenJDKに正式に導入しようというプロジェクトです。

GraalVMのAOTを持ってくるだけなんじゃないかと思ったら、やっぱりいろいろと考えなくてはいけないことがあるというのが、このセッションです。

スピーカーはなんとMark ReinholdとJohn Roseの二大巨頭!!


Value Objects in Valhalla

Project ValhallaはJavaの型システムを考え直すというプロジェクトです。

歴史的経緯もあって、Javaはプリミティブ型と参照型という2つの型があるわけですが、その中間に位置するのが本セッションのValue Objectです。

とはいっても、やっぱり簡単には導入できなくて、なかなか進んでいない感じがしますし、まだまだ時間がかかるかなぁという感じもします。

Value Objectってどういう時に使えばいいか個人的にはよく分からないんですよね。型が増えると、考えなくてはならないことも増えそうです。

それでも、現状がどうなっているのかを知るにはいい機会になりました。


他にもおもしろいセッションがいろいろあるので、JVMが好きな人はぜひセッション動画を見てみてください。

そして、来年、一緒にJVMLSに参加しましょう!

2023/09/04

JVM Language Summit 2023 その1

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

4年ぶりに開催されたJVM Language Summit (JVMLS)に参加してきました。

上の資料は8月31日に開催されたJJUGナイトセミナーの夏のLT大会でプレゼンした時の資料です。5分しかないLTなので、このエントリーで補足していきます。

JVM Language Summitとは

JVMLSは2008年から開催されたカンファレンスで、今年は4年ぶり13回目の開催になります。

2008年というとJVM上で動作する言語がいろいろでてきて、JVMでも動的型づけ言語をサポートするバイトコードを導入するかどうか議論をしていたころです。ちなみに、このバイトコードはinvokeDynamic (通称 indy)となり、Java 7から使えるようになりました。

そんな時に開催されたのが1回目のJVMLSです。

タイムテーブルを見ると、JRubyやScala、GroovyなどのJVM言語のセッションが並んでいることが分かります。

つまり、当時のJVMLSはJVM言語の人たちが一堂に会したカンファレンスでした。これがSummitになっている理由です。

しかし、だんだんとJVM言語のセッションは減っていき、その代わりにJVMとJavaの言語仕様などのセッションが増えてきました。今ではSummitは名前だけで、最新のJavaとJVMのカンファレンスになっています。

なお、今でもJVM言語関連でセッションを持つのはJRubyのCharles Nutterと、Graalの人たちぐらいになってしまいました。今年もCharlesはJRubyのセッションをするはずだったのですが、急用があったということでキャンセルになってしまいました。残念。

JVMLSの会期は3日間。その後にOpenJDKのコミッターによるアンカンファレンスのOpenJDK Committers' Workshopがあります。このワークショップは表向きはコミッターに限定しているようですが、実際にはコミッターでなくても参加できます。


櫻庭は2018年、2019年に引き続き、今回 3回目のJVMLSです。


JVMLSへの行き方

JVMLSの会場はOracleのサンタクララ キャンパスです。いわゆるシリコンバレーと呼ばれるところですね。

日本からだと、
  1. サンノゼ空港直行便
  2. 乗り継ぎでサンノゼ空港
  3. サンフランシスコ空港から陸路
のいずれかの方法で現地入りします。

日本からサンノゼへの直行便は今のところZIPAIRだけです。コロナ前まではANAにもあったのですが、今は運休中です。

乗り継ぎの場合、ロスアンジェルスかシアトルが一般的ですね。

サンノゼ空港からオラクルのキャンパスはそばなのですが、歩いたら1時間ぐらいかかります。バスや鉄道もあるにはあるのですが、本数がとても少ないです。

なので、ホテルまではUberかLyftを使うのがお勧めです。

今回、私は最後のサンフランシスコ空港を使う方法で現地入りしました。サンフランシスコ空港からサンタクララまではBARTとCaltrainという鉄道を乗りついで向かいます。ただ、Caltrainは本数が少ないので、駅で1時間ぐらい待つこともあります。

Caltrainの駅からは、UberかLyftを使うのがお勧めです。車社会なのですが、タクシーはほとんど走っていないので、UberもしくはLyftは必須のアプリです。

宿泊

Oracleのサンタクララキャンパスは市街地ではなく、まわりにはテック系企業の建物がポツン、ポツンとある程度です。

そのため、ホテルもまばらにある感じです。


青いスーツケースのピンがOracleの会場になります。

宿泊するホテルの候補になりそうなのが次の5ホテルぐらい。


一番近いのが、1番のHyatt House。Hyatt Houseは小規模のショッピングモールであるRivermark Plazaにあります。上の地図だと一番右にあるホテルです。

Rivermark Plazaには、スーパーのSafewayやメキシカンのファストフードのChipotleなどもあり、利便性も高いです。

次に近いのがElementです。Elementはまだできたばかりの新しいホテルです。

Elementと一緒にStarbucksなどの複数の店舗も一緒にオープンしたのですが、イマイチ使い勝手はよくないです。スタバも妙に早く閉まるし...

どちらもビジネスホテル的なホテルですけど、日本の価格から考えるとかなり高いです。

Delta Hotelsはコロナ前まではBaltimore Hotelだったのですが、マリオットに買収されて名前が変わっていました。買収前はもっと安かったのですが、マリオット系列になって高くなってしまいました。

ここはハイウェイに面しているので、モーテル的な感じです。ホテルがポツンとあるだけで、Elementの方に行かないと店はない感じです。

Avatarはリーズナブルなホテルだったのですが、残念ながら休業中。ちなみに、Avatarから会場まで、徒歩で40分ぐらいかかります。

Avatarに隣接して、Avatarの朝食会場でもあるIHOPがあったのですが、廃業してました。IHOPのホットケーキ甘すぎなんですけど、たまに食べてみたくなるんですよね。

Avatarから会場に向かう途中にあるのが、Marriottです。敷地も広く、ホテル内にもいろいろ店があるのでいいのですが、なにぶんにも高い。会社が宿泊費を出してくれることでもないかぎり泊まれない感じですね。


今回、櫻庭はElementに宿泊しました。新しいのはいいのですが、やっぱりスーパーが近くにないのはちょっと痛い。

会場まで直線距離だと近いのですが、鉄道が通っているため迂回しなくてはならず、だいたい徒歩で20分ぐらいかかります。

気候

サンタクララは一年中暖かく、乾燥しているので、カラッとした気候です。日中は30℃を超えますが、夜は20℃ぐらいまで下がります。

JVMLSの会場も冷房がきついので、一枚羽織るものを持っていくといいと思います。

会場

会場のOracle AuditoriumはAgnews Historic Parkという公園の一角にあります。
_DSC0442

ここは元々病院だった建物を歴史的建造物として保存してある公園です。とはいうものの、病院のメインの建物から裏側はOracleのサンタクララキャンパスになっています(ちゃんと新しい建物もたってます)。
_DSC0959

このサンタクララキャンパスは以前はSun Microsystemsだったのですが、今はOracleです。Sunの時代の名残として、キャンパスをぐるりと一周する道はNetwork Circleで、Sun Fire Wayという道もあります。
_DSC0634 _DSC0462
会場のAuditoriumは古い講堂で、内部はドーム型になってます。なかなか趣のある建物です。
_DSC1170 _DSC2002

食事

JVMLSでは朝食とランチが出ます。また、2日目の夜にはレセプションがありますが、会場で軽食を食べるぐらいです。

なので、期間中は夕ご飯だけ自分で食べに行かないといけません。

ホテルがポツン、ポツンとあるのと同じようにレストランも散らばっています。Hyatt HouseのあるRivermark PlazaにはChipotoleなどのファストフードや、普通のレストランもあります。

これ以外だと、基本的にUber/Lyftで行く感じです。

今回何を食べたか列挙しておきます。

6日のBirks以外はすべてUber/Lyft利用です。

Birksはステーキ。ここは最近オープンした店のようです。
_DSC0556

7日のBanana LeafはJenkinsの作者であり、LaunchableのCEOである川口耕さんに連れて行っていただきました。
_DSC0971 _DSC1044

8日と9日はどちらもベトナム料理なのですが、8日にサンノゼのリトルサイゴンにあるPho Ha Noiにフォーを食べに行ったのですが、閉まっていたので近くにあるBanh Canh 3 Mienに行ったのでした。Bahn Cahnという麺ははじめてだったのですが、伊勢うどんみたいな感じ。

この旅行中、現金を使ったのはこのBanh Canh 3 Mienだけでした。リトルサイゴンは小さい家族経営の店が多いようで、現金だけのところが多いような感じです。

_DSC1569

ところが、後から分かったのですが、リトルサイゴンにはPho Ha Noiは2店舗あり、閉まっていたのは支店で本店の方は開いていたのでした。

で、9日にスタンフォード大学に遊びに行った後、パロアルトでご飯を食べようと街を歩いていたら、昨日行けなかったPho Ha Noiの支店が目の前に。

ということで、2日連続でベトナム料理となったわけです。

ちなみに、10日はOpenJDK Committers' Workshopに参加していた人たちはChipotleに行ったらしいです。



長くなってしまったので、JVMLS本編に関しては次のエントリーで。

2023/07/04

JJUG Java仕様勉強会 「Javaの並列/並行処理の基本」

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

6/29にJJUGのJava資料勉強会で並列/並行処理についてプレゼンしてきました。資料はこちら。

 

Javaの並列/並行処理についてですが、Virtual Thread以前の仕様に関してまとめた感じです。

Javaの並列/並行処理のAPIはjava.util.concurrentパッケージ、いわゆるConcurrency Utilitiesにまとめられており、それほどいっぱいあるわけではないです。ただ、使う上でのノウハウ的なものがいっぱいあるので、言語仕様やAPIの仕様とは離れますが、そのノウハウ的なものもさわりだけ紹介しました。

 

Threadの基本

Javaで並列/並行処理を行う時に必ず使うことになるのが、Threadクラスです。

ThreadクラスはOSスレッドのラッパーであり、ThreadオブジェクトとOSスレッドは1対1に対応しています。ただし、Java 21で導入されるVirtual ThreadはJVMが管理する軽量スレッドなので、OSスレッドとは直接結びつきません。

このセッションでは、Virtual Threadについては触れないので、Threadと行った時はOSスレッドに結びついている従来のThreadをあつかいます。なお、この従来からあるThreadをVirtual Threadと区別するためにPlatform Threadと呼びます。

 

並列処理と並行処理という2つの言葉がありますが、Javaの世界からはこの2つは区別されません。使用できるCPUのコアが少なく、それに対しスレッドが多く存在する場合は並列(Concurrent)として実行されます。一方で、コアが十分にあるのであれば、並行(Parallel)として処理されます。

つまり、同じThreadクラスで書いておけば並列にも並行にも処理されることがあるということです。

そして、Threadオブジェクトに対して行う操作は、OSスレッドに対する操作になります。

 

Threadを使う上で意識しなければいけないのが、Threadのライフサイクルと、Threadの実行順序(スレッドスケジューリング)です。

Threadのライフサイクルとは、生成から廃棄まで。

new演算子でThreadオブジェクトを生成するとOSのスレッドも作成されます。このこともあって、Threadオブジェクトの生成には時間もかかりますし、メモリ使用量も大きくなります。

一方のスレッドスケジューリングはどのような順番でスレッドを実行するかを決めます。使用できるコア数がスレッドよりも少ない場合、どこかでスレッドの切り替え(コンテキストスイッチ)が発生します。

コンテキストスイッチも時間もかかり、メモリも多く使用する処理です。このため、初期のJavaではなるべくコンテキススイッチが発生しないようにスケジューリングされていました。

しかし、プログラム内でThread.yeildやObject.waitなどが使用されると、コンテキストスイッチが発生します(本当にコンテキストスイッチを行うかどうかはスケジューラーが決めます)。頻繁なコンテキストスイッチはパフォーマンス劣化の原因になります。

このようなことから、スレッドの生成/廃棄の管理や、スレッドスケジューリングはなるべくJVM側で管理させ、私たち開発者は非同期に処理されるタスクを記述することに注力すべきです。

そこで、登場したのがConcurrency Utilitiesというわけです。

 

Conccurency Utilities

Conccurency Utilitiesが導入されたのはJava 5。2004年なので、もう20年近く前です。当時はマルチコアのCPUがようやく出てきたころで、ParallelよりはConcurrentの時代です。

Concurrency Utilitesが提供しているのは大別して次の4種類のAPIです。

  • 非同期タスクの実行・管理
  • 並列コレクション
  • アトミック操作
  • ロック

この時は非同期タスクの実行・管理に絞って説明しました。

非同期タスクの実行・管理に関する主なインタフェースとクラスは以下の4種類だけです。

  • ExecutorService: 非同期タスクの実行
  • Executors: ExectuorServiceのファクトリ
  • Runnable/Callable: 非同期タスク
  • Future: 非同期タスクの管理

Executorsだけがクラスで、他はインタフェースです。

他にもExecutorインタフェースやFutureTaskクラスなどがありますが、直接使うことは稀です。

ExecutorsクラスはExecutorServiceオブジェクトのファクトリメソッドを定義したクラスです。主に使われるファクトリメソッドは

  • newFixedThreadPool
  • newChacedThreadPool

の2メソッドです。いずれもスレッドを使いまわすスレッドプールを提供するExecutorServiceオブジェクトを生成します。

newFixedThreadPoolメソッドは固定のスレッド数だけでスレッドプールを作成します。スレッド数は引数で指定します。どちらかというと非同期タスクの応答性を重視したスレッドプールになります。

一方のnewCachedThreadPoolメソッドで生成するスレッドプールは、必要に応じてスレッドを生成するスレッドプールです。もし、使われていないスレッドがあれば使いまわします。こちらはスループット重視型のスレッドプールです。

他にもシングルスレッドで動作するnewSingleThreadExecutorメソッドや、タイマーなど周期的なタスク実行を行うためのnewScheduledThreadPoolメソッドがあります。

また、Java 8で、後述するWork-Stealingを使用したスレッドプールを提供するnewWorkStealingPoolメソッドが追加されました。次のJava 21ではVirtual Threadを使用するnewVirtualThreadPerTaskExecutorメソッドも提供される予定です。

 

ExecutorServiceインタフェースは非同期タスクの実行を行うためのインタフェースです。どのようにタスクの実行を行うかは実装クラスによって異なります。

基本的には使用するメソッドは2種類だけです。

  • Future<T> submit(Callable<T> task)
  • Future<T> submit(Runnable task, T result)
  • Future<T> submit(RUnnable task)
  • void close()

タスクの実行を行うのがsubmitメソッドです。タスクがCallableインタフェースかRunnableインタフェースの違いでオーバーロードが3種類あります。

closeメソッドはJava 19で追加されたメソッドです。なぜ今ごろになってcloseメソッドが追加されたかというと、try-with-resources構文が使えるようになったからです。

これまではshutdownメソッドもしくはshutdownNowメソッドを使う必要がありましたが、これからはtry-with-resourcesですね。

また、複数のタスクをまとめて登録できるinvokeAllメソッドとinvokeAnyメソッドもありますが、これらのメソッドは結果がでるまでブロックします。このため、ちょっと使いにくいメソッドでした。

Virtual Threadの導入に合わせてStructured Concurrencyが提案されており、invokeAll/invokeAnyメソッドはこちらに置き換えられていくと思います。ただ、Java 21ではまだPreview JEPなので、次の次のLTSに間に合うぐらいです。

 

さて、非同期タスクを記述するのがRunnableインタフェース/Callableインタフェースです。

両者の違いは戻り値があるかないかだけと思っている方が多いと思いますが、もう1点大きな違いがあります。

それは、RunnableインタフェースのrunメソッドはChecked Exceptionをスローできないのですが、Callableインタフェースのcallメソッドはできるという点です。

このため、Runnableインタフェースを使う場合、例外をスローさせるにはRuntime Exceptionでくるんでスローするしかありませんでした。しかも、Runtime Exceptionがスローされると、その例外はUncaught Exceptionとして扱われ、スレッドは何も言わずに死んでしまうのです。

UncaughtExceptionHandlerが登録してあれば検知できますが、それでも直接例外が発生したことは分かりません。

これに対し、CallableインタフェースであればChecked Exceptionもスローできます。また、例外が発生した場合、FutureインタフェースのgetメソッドなどでExecutionException例外としてcatchすることができます。

 

最後がFutureインタフェースです。

FutureインタフェースはExecutorServiceインタフェースのsubmitメソッドの戻り値になり、submitメソッドで登録した非同期タスクの管理を行います。

型パラメータはタスクの戻り値の型です。Runnableインタフェースを使用した場合はFuture<?>となります。

主に使うメソッドは

  • T get()
  • cancel()
  • Future.State state()

ぐらいでしょうか。

一番使うメソッドは、タスクの結果を取得するgetメソッドだと思います。ただ、getメソッドは結果が出るまでブロックすることに注意が必要です。

cancelメソッドはタスクのキャンセルのためのメソッドです。ただし、cancelメソッドでキャンセルできるかどうかは、タスクの書き方に依存します。

stateメソッドはJava 19で追加されたメソッドで、それまではisDone/isCancelledメソッドで状態を調べていました。stateメソッドを使うことで、もう少し詳しく状態を調べることができます。

Java 19では、resultNowメソッドとexceptionNowメソッドも追加されました。

この2つのメソッドはブロックをしないのですが、タスクが完了していないとIllegalStateException例外がスローされます。

 

後半は非同期タスクの書き方。

非同期タスクを書く上で安全性とスケーラビリティが重要になります。並列度が低い時代には安全性が重視されていましたけど、現在のように多くのコアが使えるようになるとスケーラビリティが重要になってきます。

ようするにスレッドセーフなクラスであったとしても、スケールできないものは使いものにならないわけです。とはいうものの、安全性がないがしろにされていいわけではありません。

安全性を確保しつつ、スケールするタスクを記述する必要があります。

まぁ、言うのは簡単ですけど、実際に書くのはむずかしいですね。

 

おまけでFork/Join FrameworkとCompletableFutureについても紹介しました。

特にFork/Join Frameworkは開発者が直接使うことはほぼないと思うので、使いかたよりも動作原理について紹介しました。

また、CompletableFutureは関数を連ねて処理を記述できる人であればとても使いやすいAPIなのですが、例外が扱いにくかったり、デバッグが難しいという点もあります。Virtual Threadであれば、例外やデバッグが容易になるので、書きやすい方で書けばよいと思います。

2023/06/19

合同勉強会 in 大都会 2023 Summer

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

イベント続きの最後は、大都会での合同勉強会です。

久しぶりのIn Personの合同勉強会です。Javaな人は少数派なので、もうちょっと一般的な話ということでプレゼンの話をしてきました。

 

時間が20分と短いので、ほんとに導入編という感じです。

ちゃんとプレゼンテーションの目的意識を持ちましょうということをはじめに話しました。

誰(ターゲット)に対して話すのかということと、その人にどうしてもらいたいのか(アクション)を明確にしましょうということです。

ターゲットが変われば使う言葉も変わります。アクションもそうです。社内で予算確保のためのプレゼンであれば、ターゲットは予算を持っている上司、アクションは予算承認になります。予算承認のためのプレゼンで技術のおもしろさを説いてもしかたないですよね。その技術を使えば、どのくらい工数が減るとか、品質が上がるとか、なんらかの会社に対するメリットを説明するはずです。

ということで、ターゲットとアクションをちゃんと意識しましょうということです。

後半は資料の組み立てという体裁で話しましたが、どちらかというとプレゼンのストーリーの組み立てについてです。

ちゃんとストーリーを考えましょうということで、いきなりパワーポイントで資料を作り始めるのではなく、下書きをしましょうということです。

個人的には、プレゼンは準備8割、本番2割ぐらいに感じています。

もちろん準備8割の中に資料作成も含まれているのですが、あくまでも資料は話の補助的な役割であると思っています。

でも、資料先行しちゃう人が多いんですよね。

ということで、今回のまとめはこちら。

とりあえず、好評だったようでよかったです!

2023/06/18

JJUG CCC 2023 Spring

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

2019年からずっと登壇してなかったのですが、久しぶりにJJUG CCCで登壇することになりました。

 

今回のお題はVirtual Threadsです。

話の流れなどは、今年の1月に行われたブリ会議で話したことをベースにしています。ただ、ブリ会議が20分のセッションだったのが、CCCでは45分なので、コンテンツ的にはかなり変更してあります。

 

前半はVirtual Threads導入の背景、後半がVirtual Threadsの使い方になっています。

なぜ今になってVirtual Threadsが導入されたかというのは、歴史的経緯があるので、そこをちゃんと抑えましょうということです。

というのも、Virtual Threadsの目的はスループット向上なのですが、現状の技術でスループットは向上できるからです。たとえば、CompletableFutureやリアクティブ系のライブラリやフレームワークを使えばスループットは向上できます。

これらの技術を使いこなせればいいのですが、なかなか難しい点もあります。たとえば、

  • 関数を連ねて処理を記述するので、従来とは考え方を変えなければならない
  • 例外処理が難しい
  • デバッグが難しい

最初の考え方は慣れてもらうしかないのですが、最後のデバッグはなかなか難しい問題です。というのも、処理が複数のスレッドに分割して実行されるので、スタックトレースが切れてしまうからです。

スタックトレースはスレッドごとに存在するので、スレッドをまたがって処理を行えば当然スタックトレースは分割されてしまいます。それがデバッグを難しくしてしまいます。

そういう問題を解決するのがVirtual Threadsというわけです。

 

とはいっても、Virtual Threadsは今までのスレッドと使い方が同じなので、特にこうしましょうというのはないです。

サーバー系のシステムでリクエストに応じてスレッドをよしなに作ってくれるようなフレームワークを使っているのであれば、なおさらVirtual Threadsを意識する必要はないです。

というわけで、そういうフレームワークがVirtual Threadsに対応してくれるのを待ちましょうというのが結論ですw

フレームワークがVirtual Threadsに対応したら、何もしなくてもスループットが向上するかもしれません。

というようなことをセッションで話したら、今週になってTomcatがVirtual Threadsに対応したというじゃないですか。

Tomcatでさえ対応したのだから、他のフレームワークもVirtual Threadに対応するのは意外に早いかもしれません。

 

ただし、Virtual Threadsに限らず並行処理で注意する点というのもあります。

並行処理で重要になるのは、安全に処理できるかということと、スケールするかどうかということです。しかも、この両者はなかなか両立しません。

同期化やロックなどを使用して安全な処理を記述すると、その部分はスケールせずに並列処理のボトルネックになってしまいがちです。

特にVirtual Threadsを使い始めると、スレッド数が今までとは桁違いに多くなるため、スケールできるかというのは重要になります。

では、どうすればいいか。

設計を見直して、synchronizedを使った同期化をなるべく減らしていくしかありません。そのためには、イミュータブルなデータをベースに考えるようにすればいいと思います。特にJava 16で導入されたRecord型が役に立つはずです。

どうしてもsynchronziedが外せない処理があるのであれば、そこはロックAPIのReentrantLockに書き換えましょう。というのも、synchronizedを使用するとVirtual Threadsが動作するOSのスレッドをブロックしてしまうためです。

ReentrantLockであれば、ブロックするのはVirtual Threadsだけになります。

というようなことを45分で喋ってきました。あまりにも、ギリギリまで喋ってしまったので、質疑応答の時間が取れなくなってしまいました。ごめんなさい。

 

当日は気持ちの余裕がなくて、あまり他のセッションは聞けなかったのですが、ちょっとした感想を書いておきます。

 

Apache Commons Math を使って、機械学習をやってみた

浅野さんの機械学習のセッション。といっても、扱っているの古典的なクラスタリングのk-means。

k-meansぐらいならライブラリ使わなくても、自力で書けるぐらいですね。というか、書いたことがありましたww

やっぱりPythonと比べると記述量が多くなってしまうのはしかたないですね。でも、OpenCVSとか使えば、もうちょっと減らせると思います。

 

浅野さんが列挙してくれた機械学習系のライブラリの1つにWekaがあるのですが、これは使ったことがありました。

でも、Wekaはソースがひどいんですよねぇ...

アルゴリズムをそのままコードに落とした感じで、読みやすさとかそういうのはまったく考慮してない感じ。まぁ、大学で作ってるし、しかたないんですけどね。

 

AI を利用した Java 開発の最新情報

てらださんのOpenAI系のお話なんだけど、なんだかなぁ...

てらださん、もうちょっとプレゼンのしかた考えようよ...

 

Java Bytecode Crash Course

もともとChristoph Engelbertさんのセッションだったのですが彼が体調不良ということで、急遽David Buckさんのセッションに差し替え。

バイトコードの読み方入門的な内容でした。内容的にはほとんど知っていることでしたが、やっぱりこういうのはおもしろいよね。人を選ぶとは思いますがw

 

今回のJJUG CCCは現地開催でストリーミングありでしたが、なかなか大変そうでした。コストもかかるしね。

今回ストリーミングで見ていただいた方も、次回はぜひ現地でお会いしましょう!

2023/06/17

JOnsen 2023

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

コロナのおかげで開催できなかったJOnsenですが、4年ぶりに6月1日から2泊3日の日程で開催されることになりました。なお、今回からJJUGが主催のイベントになっています。

JOnsenは温泉に入りながらJavaについて語り合うアンカンファレンスで、今回で4回目の開催です。

第1回から参加しているさくらばは、当然今回も参加することにしました。

 

今回の開催場所はリゾナーレ八ヶ岳。参加人数は13人で、ちょっと少ないです。まぁ、コロナがあって、こういうイベントに参加するのを躊躇してしまう人も多いと思うので、しかたないですね。

 

初日

初日のスタートは14時から。他の参加者はみなお昼ぐらいに到着して、ランチを食べてから参加という感じですが、私だけちょっと早く現地入りしました。というのも、リゾナーレ内にあるマルサマルシェというフルーツパーラーでパフェ作り体験ができるからなのでした。

事前に予約しておいて、Bigパフェを作ってきました。

平日ということもあって、リゾナーレは未就学児を連れた家族連ればかり。パフェ体験も子供たちと一緒に作っている人たちばかりで、おじさんが1人で作っているなんて私だけですよw

下の写真のようにフルーツとパフェグラス渡されます。後は、冷蔵庫にあるホイップクリームとコンフィチュール、またコーンフレークやスプリンクルなどは使い放題です。

_DSC8361

事前にいろいろ考えてきたのですが、実際にパフェを作るのなんてはじめてなので、悪戦苦闘。ホイップクリームだけでなく、せめてジュレがほしかった...

ということで、パフェできました!

_DSC8402

 

さて、JOnsenの本編です。

会場はリゾナーレのイスキアという普段は宴会などに使われる場所です。

だいたいの日程は初日の午後と、2日目の午前、最終の午前にアンカンファレンス。2日目の午後はアクティビティを行うというものです。

ただ、2日目は台風の接近に伴う大雨の予定。雨でなければ乗馬などのアクティビティもあったのですが、急遽インドアのアクティビティになることになりました。

で、パフェ作りの人気が高いww さすがに2日連続でパフェというのも変なので、私はトンボ玉作成にしました。

_DSC8541 _DSC8546

 

アクティビティを決めた後に、まずは全員の自己紹介タイム。そして、アンカンファレンスで議論するトピック出しと続きます。最低でも1人1トピック。

トピックを付箋に書き出したら、各々トピックの説明を行います。もちろん、全部英語です。

_DSC8582 _DSC8584

付箋はホワイトボードに貼りだして、似ているトピックをグルーピング。その後、どのトピックを議論するかの投票です。

_DSC8639

実際に提案されたトピックがこちら。丸いシールが投票された票です。

_DSC8666

人気があったトピックからディスカッションしていきます。

今回は、人数も少ないので2グループに分けて、だいたい一方が技術的なトピックで、もう一方がコミュニティや働き方などの非技術的なトピックになっていました。

さくらばは結局、全部技術的なトピックの方に参加してました。

 

ディスカッションは写真のように丸テーブルで。そんなに固い感じではなく、緩い感じで。それにしても、久しぶりの英語だったので、ぜんぜん英語が出てこない。やっぱり日ごろから練習していないとダメですね。

_DSC8670 _DSC8686

 

そういえば、Steve Chinさんが車で参加予定だったのですが、いろいろと遅れて、1日目のディカッションの最後にやっとあらわれました。とりあえず、無事についてよかったです。

 

1日目のディナーはリゾナーレ内のイタリアン。なかなか本格的なイタリアンでした。

_DSC8714 _DSC8791 _DSC8819 _DSC8834

 

ディナー後にまたどこかで集まって飲んだりするのかなぁと思ったら、何もなく。みんな疲れたのか、そのまま就寝してしまいました。

でも、さくらばはJJUG CCC用の資料が終わってなかったので、泣く泣く資料作成。CCCの前のJOnsenはつらい...

 

2日目

朝からあいにくの雨。

朝ごはんはリゾナーレ内のYY Grillのビュッフェ。平日ということもあって、未就学児を連れたファミリーが多いです。

朝からしっかり食べましたよ。しかも、ここには自由に使えるソフトクリーマーがあるので、朝からソフトクリーム。

でも、ソフトクリームが固すぎて、うまく巻けませんでした...

_DSC8929 _DSC8935 _DSC8958

朝ごはんは同室のDavid Buckさんと行ったのですが、彼は実際にJavaを作っている人。しかも、HotSpotを作っているのです!

ちょうどJJUG CCCでVirtual Threadについてプレゼンするので、自分がVirtual Threadに関して考えていたことを聞いてもらい、間違いがないか確かめてもらいました。

この朝のセッションが、JOnsenで一番役に立ったかもしれませんw

 

さて、2日目の午前中はアクティビティの時間。

というわけで、トンボ玉を作る場所へ向かってみると... なんと今日はトンボ玉を作る先生がお休み!

他にも作る系のアクティビティは先生が休みのところ多くて、行き場を失った私たちは結局パフェの人たちを冷やかしにいくことに。

と思ったら、急にキャンセルが出たらしくテーブルが空いていたので、急遽クレープ作り体験ができることになりました!

とはいっても、クレープはすでに焼いてあって、それを飾り付けする感じです。

それにしても、普段はお客の大半がファミリーの店で、大人がほぼ占拠しているというのはなかなかレアな感じですね。ちなみに、私は店員さんにしっかり覚えられていましたw

_DSC8962 _DSC8970 _DSC8993 _DSC9003 _DSC9005 _DSC9012

それぞれ、パフェとクレープを作ってから、三々五々とランチへ。

私は、やはりリゾナーレ内にあるジビエの店で鹿肉バーガー。竹炭入りの黒いバンズというのはなかなかインパクトありますね。

_DSC9035 _DSC9045

 

さて、午後のアンカンファレンスも昨日と同じように2グループに分かれて行います。だいたい1つのトピックで40~50分ぐらい。

今日はProject CRaCや、関数型についてなどのディスカッションに参加。

Project CRaCは全然知らなかったのですが、起動時間を短縮させるためのプロジェクトなんですね。Graalのネイティブイメージとの比較などが議論の中心でした。

_DSC9117 _DSC9119 _DSC9129 _DSC9138

 

2日目のディナーはリゾナーレのすぐそばにあるジビエの八ヶ岳小僧という店。

店主が自ら狩りを行って、季節、季節のジビエを食べさせてくれるのだそうです。

で、私は鹿、猪、熊の盛り合わせと、鹿ユッケ。ご飯はたけのこご飯です。

鹿や猪は食べたことありますけど、熊ははじめて。脂がうまいww

_DSC9164 _DSC9188 _DSC9180 _DSC9208

 

最終日

最終日、朝ごはんを食べに行った時はまだパラパラと雨が降ってましたが、食べ終わったことろには晴れてきました。

そして、この日もソフトクリーム。昨日よりはうまく巻けたとは思いますが、やっぱり硬くてやりにくい...

_DSC9253

 

最終日のディスカッションは1トピックだけで、その後はラップアップ。

最後のディスカッションはVirtual Threadに関してですが、自分的には昨日の朝のDavidさんとの議論で話したいことを話してしまったのでしたw

Virtual Threadの技術的なこともそうですが、BrianのJava並行処理プログラミングの本が絶版で困るようねぇとか。本が売れないから再販もないだろうねぇとか。

_DSC9282 _DSC9278 _DSC9266 _DSC9275

そして、最後のラップアップで、ディスカッションのまとめを各々が発表する感じです。

_DSC9293 _DSC9306 _DSC9308 _DSC9326

 

JOnsenは全部英語なのでなかなかつらいのですが、それでも日本人ばかりなのでスピードはゆっくり。

ネイティブの人たちばかりだとスピードも速いし、話している間もかぶせてくるので、なかなか議論に参加するだけでもたいへん。その点、JOnsenはゆったりしているし、ちゃんと意見を言い終わるまで待ってくれるし、英語でのディスカッションに慣れていない身としては、とてもありがたいです。

今年はいつものメンバーになってしまったのはしかたないですけど、来年はぜひ他の人も参加してほしいなぁ。

というわけで、最後に記念写真を撮っておしまい。

_DSC9333