PHPerKaigi 2019でJVMのお話を聞いてきました! #phperkaigi

こんにちは。
スタジオ・アルカナの吉田でございます。
 
2019/3/29 – 3/31に開催されたPHPerKaigi 2019に参加をしてきましたので、そのことについてレポートをしたいと思います。
 
なお、タイトルからお察しかもしれませんが、特定のセッションに対する非常に偏りのあるレポートとなっておりますことをご承知おきいただければと存じます。マサカリなげないで。
 
本記事はJavaの話が多いかもしれませんが、PHPerKaigi は PHPer による PHPer のためのお祭りです!
 
We ❤️ PHP!
 
 
 

スポンサー協賛

 
さて、この度のPHPer Kaigi 2019につきましては、スタジオ・アルカナは些細ながらもゴールドスポンサーとしての協賛をさせていただきました。
 
19.03.30_019
 
実行委員長の長谷川さんが「第130回 PHP勉強会@東京」でシェアしてくれていた資料の抜粋となりますが、スポンサー募集の告知から我々の申し込みまで157分もかかってしまっていたようでして、今後はより迅速な判断をしていきたい所存でございます。
 

  
 
アルカナの社員も当日スタッフとして参加させていただいていたようで、かぐやるな(?)というVTuberの格好をして参加していたようです。もしかしたら見かけた方もいらっしゃるかもしれません。「ストロングゼロの擬人化」という呼称があるにも関わらず、ストロングゼロをお持ちでなかったことについて大変悔やまれる思いです。
 
 
_DSC5183
親分を気遣っている様子。
 
 

ジョブボードと配布物

 
スポンサー協賛をさせて頂いたのですが、PHPerkaigiでは協賛のプランに応じてジョブブードや配布物を封入することができました。
 
弊社で配布するものがパッと思いあたらなかったので、グループ会社がサービスを提供している新卒向け逆求人サービス『キミスカ』のチラシを封入させていただきました。
エンジニア向けのチラシではなかったので、今後は工夫していかねばなりません。
 
でも、『キミスカ』は、がっつり PHP&Laravel で作られているので、ご容赦いただければと思います!
結構、優秀な新卒を見つけたりすることができるので、ご興味あれば人事の方にご紹介してみてください!
 
d8227-17-194198-0
https://kimisuka.com/
 
 
ジョブボードのチラシに関しては、QRコードを貼り付けるだけという雑な仕様で作成してしまいましたため、こちらも今後は改善していきたいポイントでございます。
20190329_174553
一番右のやつや。 
 
 

印象深いセッション

 
わたくしは、前夜祭、PHPreParty、本編、と参加をさせていただきましたが、様々なセッションがあり楽しかったですね!
 
個人的にはJVMのセッションの印象が強すぎてしまいましたので、本記事ではJVMについての思い出を綴りたいと思います。
 
すまんPHP。お主のことも好きなんだぜ。
 
もちろん、他にも低レイヤの話(ネットワークやコンパイラなど)があって、普段のWebアプリケーション開発では意識の届きにくい内容に触れる機会となり、よい刺激になったのではないでしょうか。
 
 

JVMのセッション

 
@m3m0r7 さんの『PHPでJVMに入門する』というセッションですが、紹介文をみて「マジやっべーのあるんじゃね!?(褒め言葉)」という気持ちになりテンションがあがります。
 
(引用)
Java Virtual Machine Specificationを読み解きながら、PHPでJavaのバイトコードを解釈し実際にJVMがどのようにして動いているのかを感じてもらいつつ、30億のデバイスで走るJavaの気持ちになれるようなトークをします。
 PHPでJavaを動かすことによってPHPもまた、30億のデバイスで走る言語の一つとなります。
 
「30億のデバイスで走るJavaの気持ちになる??なんでそんなことしたの?しかもPHPerKaigiで??えっ??えっ???PHPerってなんだっけ??」ってなりますよね!?
 
スライドはご本人様のサイトに掲載がされているので、そちらをご参照くださいませ。楽しいですよ?
https://note.mu/m3m0r7/n/n108c7a6471f6
 
私は、マジでゲラゲラ笑いながら聞いておりましたが、ゲラゲラしている人は少数派だったかもしれません。 。
 

Javaとの思い出

  
Javaという単語を聞いたときに脊髄反射的に思い浮かぶHEXの羅列といえば 0xCAFEBABE ですよね。この愛くるしい8バイトは忘れたくても忘れらないのが人間の性というものです。
 
このマジックナンバーですが、由来に関しては下記にその背景が紹介されています。ご興味があれば見てみてください。
 
・0xCAFEBABE & 0xFEEDFACE – BBUM’S RANTS, CODE & REFERENCES
http://radio-weblogs.com/0100490/2003/01/28.html
 
・Javaクラスファイル: マジックナンバー – Wikipedia
https://ja.wikipedia.org/wiki/Java%E3%82%AF%E3%83%A9%E3%82%B9%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB#.E3.83.9E.E3.82.B8.E3.83.83.E3.82.AF.E3.83.8A.E3.83.B3.E3.83.90.E3.83.BC
 
 
これまで、いくつかのプロジェクトでJavaと戯れてきたことがあるのですが、その中でも印象深かった思い出をご紹介したいと思います。おじさんなので古い話ばかりで恐縮です。。
 
 

アプリケーションサーバがバグってるマン

 
むかしむかし、あるプロジェクトで、とあるアプリケーションサーバを利用していたのですが、SSO系の認証がどーしても通らないことがあり、頭を悩ませておりました。
 
別のアプリケーションサーバの場合は問題なく通るにもかかわらず、そのアプリケーションサーバだけが動かない。
 
IT戦士としては納期もあるわけで、うーむ、これは困ったぞということで、jarファイルをデコンパイルして不具合の特定にのりだしました。
 
デコンパイルしたところ、どうもSAMLで通信しているXMLの署名検証処理のロジックで条件が間違っているような雰囲気です。
 
デコンパイルしたコードをデバッグして修正し、コンパイルし直すとSSOが上手く通るではありませんか。
 
開発元ベンダーのUSチームにフィードバック送って、その後、修正がされて一件落着となりました。
 
JVM仕様やデコンパイルの知識があると、たまーに役に立つこともあるので、低レイヤとも仲良くすると希望に満ち溢れた人生を謳歌できるのではないでしょうか。
 
 

JMXでアプリケーションの監視をするマン

 
Javaに は JMX(Java Management Extensions) という仕組みがあって、JVMのプロセスを通信をすることでJVM内部の状態を監視することができる仕組みです。
 
ヒープの状態やCGの状態やらなんやら、様々なメトリクスを取得することができたりします。
 
デフォルトで取得できるメトリクスもあるのですが、アプリケーション独自のメトリクスを収集したい場合は独自のMBean(Management Bean)をというものを用意することでオリジナリティあふれる監視ができるようになたりもします。
 
PHPもプロセスの内部の状態(メモリの状態など)をメトリクスで取得できるといいですよね〜。ご存知の方いたら是非教えてください!
 
 

JVMの種類がたくさんあるマン

 
普段、JVMのことなんて意識することあまりないと思いますが、JVMにもベンダーによって様々なJVMが存在していました。
 
JVMというものは、Java Virtual Machine の仕様を満たしていれば、それはJVMなのです。もし、ハードウェアでJVMのスペックが満たされていれば、それはJVMなのです。なので、JVMの挙動としては同じだけど、JVMによって内部のアルゴリズムは異なっていたりします。
 
「JVM」と一言で言っても、各種ベンダーさんごとにJVMが存在するので、いくつかご紹介したいと思います。昔話ですが。
 
 

Oracle JVM / Open JDK JVM

 もともとSun Microsystemsで開発されていたJVMは、Oracle JVMという名前で親しまれております。 
Open JDKもOracle JDKのOSSなので、JVMとしての挙動は同じなのかな?(ここはちょっと自信がありませんが…)
 
Oracle JVMについては、下記のサイトを参照いただければと思います。
 
Java Developer’s Guide – Oracle JVMの概要
https://docs.oracle.com/cd/E82638_01/jjdev/Oracle-JVM-overview.html#GUID-391B265A-D656-4589-A4F5-C4F801340886
 
 

Oracle JRockit JVM

 もともとBEA Systemsが持っていたJVM(BEAはOracleに買収された)で、サーバーサイドJVMとして内部のメモリ管理手法などチューニングされており、スペックが良かった印象です。Oracle WebLogic Server についてくるJVMで、GCも秀逸だったような気がします。現在はHotSpot JVMに統合されたと思います。
 
Oracle JRockit JVM
https://docs.oracle.com/cd/E22646_01/doc.40/b61437/aboutjrockit.htm#i1077372
 
HotSpot
https://en.wikipedia.org/wiki/HotSpot
 
 

日立のJVM

 CosminexusというアプリケーションサーバにくっついてくるJVMですね。チューニングの試行錯誤が滲み出ているようなJVMだったような気がします。
http://itdoc.hitachi.co.jp/manuals/link/cosmi_v0870/APKT/EU100268.HTM
 
 

IBMのJVM

 IBMはJavaのアプリケーションサーバとして「WebSphere Application Server (WAS)」という製品を出していて、これにくっついてくるJVMがIBMのJVMです。
https://www.ibm.com/support/knowledgecenter/ja/SSYKE2_7.0.0/com.ibm.java.lnx.70.doc/user/java_jvm.html
 
現在は、Eclipse J9という名前のJVMになっていると思います。
https://en.wikipedia.org/wiki/OpenJ9
 
 
 
それぞれ内部的な挙動に特徴があったり、独自の拡張されたJVMパラメーターなどがあったりして、仲良くなるには時間を要した気がしますが、それも良い思い出。
 
JVMも本当にたくさんの種類があるので、興味のある方はこちらのリストを見てみてください。
https://en.wikipedia.org/wiki/List_of_Java_virtual_machines
https://en.wikipedia.org/wiki/Comparison_of_Java_virtual_machines
 
改めて見ると、本当にたくさんありますねぇ。。
いろいろありますが、。ほとんどの場合は HotSpot JVM を使っているんじゃないかなぁと思います。
 
 

Java関連で好きだった技術書

 
Javaから離れてしまって久しいので、古いものばかりかもしれませんが、当時読んでいて好きだったJava関連の技術書を紹介したいと思います。
 

『デコンパイリングJava ――逆解析技術とコードの難読化』

https://www.oreilly.co.jp/books/9784873114491/
 
Javaのクラスファイルをデコンパイルして解析したり、解析させないためのオブファスケータに関するトピックだったり、低レイヤーの言語でテンションの上がる方であれば、かなり面白く読めると思います。「デコンパイル(しても理解)なんかさせねーよ!?」という意気込みを持ってコンパイラ開発するのとか面白そうですよね。うん。
 
 

『Java仮想マシン仕様 (The Java series)』

https://www.amazon.co.jp/dp/489471356X/
 
基本的にWebで公開されているので必要ありませんが、私は紙の本で技術書を読むことが好きなので、JVMと仲良くなりたいがために暇な時間があれば眺めていたような気がしております。Javaのクラスファイルをデコンパイルしたときに、うまく理解できなかった時はバイナリを読んだりすることもあると思うので、なんとなくでも仮想マシンのお気持ちを察することができると手助けになりますね。『JAVAバーチャルマシン (THE JAVA SERIES)』もよかったです。
 
『JAVAバーチャルマシン (THE JAVA SERIES)』

 

 

『Effective Java 第3版』

https://www.amazon.co.jp/dp/4621303252/
 
Javaの実装の手法に関する技術書ですが、Java言語固有の地雷を避けるための実装方法であったり、効率的な実装の方法が書かれていたりで、初めて読んだ時は本当にワクワクしましたね。第3版のリンクを載せましたが当時は初版だったような。。。
 
KentBeckの「実装パターン」も結構好きでした。
 
『実装パターン』
https://www.amazon.co.jp/dp/4894712873
 
 

『Release It! 本番用ソフトウェア製品の設計とデプロイのために』

https://www.amazon.co.jp/dp/4274067491/
 
これは、どちらかというとエンタープライズ級のミッションクリティカルなシステムに携わっている人が読むと楽しめる感じの本ですが、タイトルがちょっと誤解を生んでしまっていて勿体ない。内容はJavaで開発されているシステムに関する言及がなされていて、かなりレベルの高い内容になっています。
一言では伝わらないのですが、素晴らしいレビュー記事があったので、こちらもご参照いただきたい次第です。
 

Release Itの魅力を伝える – 京都行きたい

https://progret.hatenadiary.com/entry/2019/01/24/120000
 
 

さいごに

 
PHPerKaigi運営スタッフの皆様は、大変お疲れさまでございました。
そして、素晴らしい場を作っていただき大変感謝を申し上げます。
 
また、お写真の一部はこちらのものを利用させてきただきました。ありがとうございます。
http://phperkaigi.hatenablog.com/entry/2019/04/09/143141
 
来年も協賛できればと思いますし、最速で申し込みができるよう精進して参りたい所存でございます。
 
 

We are hiring! 

 
PHPerKaigiのレポートにも関わらず、JVMという単語の出現頻度が高いブログとなってしまいましたが、弊社はPHPとJavaScriptをメインに開発をしている会社でございます。
 
PHPエンジニアやプロジェクトマネージャーを募集しておりますので、ご興味があれば是非遊びに来ていただければ幸いです。
 
https://www.wantedly.com/projects/170327
 
 
 

にゃー!!

 
_DSC4940
懇親会にいたアルカナ勢(他にも参加していたアルカナのスタッフいたのだけど、これしか残ってなかった…)
 
 
でわでわ。