エムスリーテックブログ

エムスリー(m3)のエンジニア・開発メンバーによる技術ブログです

JJUG CCC 2019 Spring - Java クイズ

[ Scroll down to read in English ]

こんにちは、CTO の矢崎 (@saiya_moebius) です。

只今開催中の JJUG CCC 2019 Spring というイベントで Java のクイズを配布しております。

問題文自体はシンプルですが、JVM の意外な挙動や Java の言語仕様が関わっており、実は一筋縄ではいかないクイズとなっております。

イベントでは紙で配布しているのですが、イベントに来られていない方に twitter などでシェアしたいというお声をいただきましたので、こちらの blog でも問題文を共有いたします。イベントへの来場に関係なく楽しんでいただける Quiz になっているかと思いますので、ぜひ考えてみていただければと思います。

M3 Java Quiz (2019 Spring)

以下が JJUG 会場で頒布いたしております Quiz ペーパーの内容です (再掲載)。初見の方は、ぜひ以下を見ながら考えてみてください。

環境は 64bit 環境の OpenJDK 11 で特に JVM オプションを付けない状態を想定します。

Q1: String のインスタンス

public static final String A = "hoge"; 
public static final String B = "hoge";

のときに、以下それぞれで A == Btrue / false どちらでしょうか:

  • A と B が同じ .class ファイルにある
  • A と B が異なる class, 同じ jar にある
  • A と B が異なる jar, 同じ ClassLoader にある
  • A と B が異なる ClassLoader にある

Q2: Integer のインスタンス

return (Integer)(new Random().nextInt(100));   // Integer 型を返すメソッド

100,000 回実行すると、上記コードが Integer 型のインスタンスをいくつ新規作成するでしょうか:

  1. 0 個
  2. 1〜100 個
  3. 256 個 (-128 から +127 の整数)
  4. 100,000 個

※インライン化などの最適化で int → Integer の型変換が消えることはない前提とします

Q3: Exception のインスタンス - その 1

String str = null;
str.length();   // NullPointerException (NPE) が発生する

100,000 回実行すると、上記コードが NPE のインスタンスをいくつ新規作成するでしょうか:

  1. 0 個
  2. 1 個
  3. 2〜99,999 個
  4. 100,000 個

Q4: Exception のインスタンス - その 2

throw new UnauthorizedException("ログインが必要です");

100,000 回実行すると、上記コードが例外のインスタンスをいくつ新規作成するでしょうか:

  1. 0 個
  2. 1 個
  3. 2〜99,999 個
  4. 100,000 個

以上が今回の Quiz です。

普通に JVM を利用している限りあまり意識しない挙動だと思いますが、 パフォーマンスを考える上で気になる点ではないでしょうか。

解答と解説

05/20 追記: Java Quiz 解答・解説 - エムスリーテックブログ に解説記事を掲載いたしました。

解説記事を後日この blog にアップロードいたしますので、以下の twitter のフォローよろしくお願いいたします。解説記事の投稿時にお知らせいたします:

twitter.com

English version

Hi. I am Seiya Yazaki (@saiya_moebius), CTO of Japan M3, Inc.

We distributed a printout of Java Quiz in the event JJUG CCC 2019 Spring.

It is a simple but deep quiz. Background of the quiz is based on interesting JVM behavior and/or Java language specification.

Today I translated the quiz for English friends, please enjoy this quiz!

M3 Java Quiz (2019 Spring)

Environment for this quiz is OpenJDK 11 in 64bit without any JVM option.

Q1: String instance(s)

public static final String A = "hoge"; 
public static final String B = "hoge";

In each of the following cases, does A == B is true? Or false?

  • Constant A and B are placed in same class
  • Constant A and B are placed in different class, but in same jar
  • Constant A and B are placed in different jar, but in same ClassLoader
  • Constant A and B are placed in different ClassLoader

Q2: Integer instance(s)

return (Integer)(new Random().nextInt(100));   // Method that returns Integer

If we call above code 100,000 times, how many Integer instance(s) does this code creates?

  1. 0 instance
  2. 1〜100 instance(s)
  3. 256 instances (From -128 to +127)
  4. 100,000 instances

Note: In this question, please assume that JIT does NOT remove int→Integer type conversion

Q3: Exception instance(s) - 1

String str = null;
str.length();   // throws NullPointerException (NPE)

If we call above code 100,000 times, how many NPE instance(s) does this code creates?

  1. 0 instance
  2. 1 instance
  3. 2〜99,999 instances
  4. 100,000 instances

Q4: Exception instance(s) - 2

throw new UnauthorizedException("You need to login");

If we call above code 100,000 times, how many exception instance(s) does this code creates?

  1. 0 instance
  2. 1 instance
  3. 2〜99,999 instances
  4. 100,000 instances

Please enjoy this quiz!

エムスリーは JJUG CCC 2019 Spring にゴールド&ブーススポンサーとして協賛します & CTOが登壇します

こんにちは、マルチデバイスチーム エンジニアの金丸 (@maru333) です。

来たる 5/18(土)、ベルサール新宿グランドにてJJUG CCC 2019 Springが開催されます。

昨年( *1 )に引き続き、エムスリーはゴールド&ブーススポンサーとして、本イベントの開催を後押しさせて頂きます。
当日は弊社の Java エンジニアも参加し、ブース出展もする予定です。 ブースではUSB Type-C アダプタやマスクなどの弊社ノベルティを配ったり、Javaクイズなどの出し物も企画してますので、是非お立ち寄りください!
エムスリーのサービスや開発についても、気になる点があれば何でも質問していただければと思います。

JJUG CCCとは

JJUG CCCとは、日本最大のJavaコミュニティである日本Javaユーザーグループ(Japan Java User Group = JJUG)による国内最大のJavaコミュニティイベントです。 CCCとは、Cross Community Conferenceの略 です。

続きを読む

数値で振り返る技術書典6とエムスリーテックブック

f:id:juntaki1:20190421095524j:plain

エンジニアリンググループの滝安(@juntaki)です。 技術書典6で「エムスリーテックブック#1」を頒布してきました!ご購入いただいた方、お立ち寄りいただいた方、ありがとうございました! 執筆自体にもたくさん学びはあったのですが、単純に参加して売るというプロセスにも多くの発見がありました。「#2」に向けて知見を残すため、サークルチェック数、売れ行きなど数値で記録したものを中心に振り返ります。

続きを読む

世界のシステムに令和が反映されるまで

こんにちは、Androidエンジニアの星川 (id:oboenikui) です。

いよいよあと5日で令和となりますね。幸いにもAndroidではアプリ側で扱おうとしない限り和暦は使用されないので安心して改元を迎えられそうです。
(iOSにはシステム設定で和暦表示に切り替える機能があるので若干無視できなかったりします)

さて、この改元ですが、ほぼ日本国内でしか使われていないものではあるものの、OSをはじめ世界中で使われているプロダクトにも影響を与えることは皆さまご存知の通りかと思います。今回はUnicode CLDR (Common Locale Data Repository) のチケットから、どのような流れでこの改元に対応したのか、また改元に合わせてどのような変更が行われたのかを見ていきたいと思います。

f:id:oboenikui:20190425120244p:plain
By 内閣官房内閣広報室 - 首相官邸ホームページ, CC 表示 4.0, Link

続きを読む

難読Rubyコードクイズ問題と解説 in RubyKaigi 2019

f:id:owl-m3:20190423134156p:plain

RubyKaigi 2019に参加された方もそうでない方もお疲れ様でした。あと数日で到達するゴールデンウィークを指折り数えるowlです。

RubyKaigiでは多彩なセッションにより豊富な知見が得られた他に、Rubyist同士の交流も商店街を貸し切ってのパーティや無料屋台などのイベントによるところもあって例年にないほどの賑わいでした。

さて、そんなRubyKaigiの様子やセッションの知見をみなさんに共有するのは他の参加者による才筆へ委ねることにして、この記事では弊ブースで自分が三日間日替わりに出題していた難読Rubyコードクイズの紹介と解説をしていきます。

毎日このクイズを解きに足を運んでくださった方には感謝しております。お目汚しですが自分が考えたクイズをMatzさん始めコミッターの方にまでご覧頂けたのは光栄です。

<!-- 儀礼的でちょっと退屈な口上はここまで -->

出題

まずRubyKaigiへ参加できなかった方にも楽しんで頂くために出題リストだけを先にお見せします。ぜひ答えを想像してから解説をお読み下さい。

原則としてどの問題もirb上で提示されたコードを実行した際に何が評価値になるかを答えます。

Day1 - 1

難易度:★☆☆


irb> !????!:!?!
=> ?

選択肢:「false」 「“?”」 「:!」 「SyntaxError」

Day2 - 1

難易度:★★★


irb> %%%%%%..%%[0].size[0]
=> ?

選択肢:「1」 「0」 「""」

(お詫び: 掲載当初は問題文がRubyKaigiで出題されたものと異なっていました)

Day3 - 1

難易度:★★☆


irb> puts = :puts
irb> puts = send(puts, puts) || puts(puts) { puts = “puts” }
irb> puts
=> ?

選択肢:「"puts"」 「:puts」 「nil」

Day3 - 2

難易度:★★☆


irb> %%%%%%%%?????:??
=> ?

選択肢:「""」 「"%"」 「"?"」 「":"」

Day3 - 3

難易度:★★★


irb> a = 0.0/0; a == a ? a : irb.quit
直後に何が発生しますか?

選択肢:「ZeroDivisionError」 「undefined local variable」 「irbが終了する」 「irbが起動する」

続きを読む

「RubyKaigi 2019」にPlatinum Sponsorとして参加しました!(ブース・セッションレポート)

エンジニアリンググループの山口です。4/18(木)〜4/20(土)に開催された「RubyKaigi 2019」に、Platinum Sponsorとして参加しました。

エムスリーのスポンサー協賛は4年目。私は初参加でしたが、参加者の方々のRuby愛を強く感じた3日間でした。

sponsor_booths[:m3].inspect # ブースの様子

エムスリーブースは5階エレベータ上がって右手の位置で展開していました。

f:id:t-yamag:20190423161509j:plain
エムスリーブースの様子

ブースでは、特に「Rubyクイズ」が一番盛り上がりました!

続きを読む