エムスリーテックブログ

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

エンジニアリンググループが大学に行ってきたよ

こんにちは、エンジニアリンググループ新卒2年目の青木です。 現在はクラウド電子カルテ「エムスリーデジカル」の開発に携わっています。

先日、慶應義塾大学で行われた講義にエンジニアリンググループとして参加させていただきました! 今回はその時の内容を振り返ってみようと思います。

f:id:blue0513:20190613120402j:plain
大学の講義室なう

続きを読む

SRE Lounge #9 で弊社の取り組みについて話しました

こんにちは、エンジニアリンググループ SREチームの高橋(@tshohe1)です。

5/29に開催されたSRE Loungeというイベントで「エムスリーはどのようにしてSREをはじめたか」というタイトルで登壇させていただきました!

登壇の場を提供していただいたSRE Lounge運営スタッフの方々、スポンサー&会場提供していただいたサイバーエージェントさん、ありがとうございました。

本記事ではイベントの簡単なまとめと、時間の都合上語れなかった弊社の他の取り組みを少し書いていきたいと思います。

f:id:tshohe:20190605102051j:plain ANA Lounge Haneda by LWYang is licensed under CC BY 2.0

続きを読む

Marp CLI (Marp Next) をとりあえず知る・使い始めるためのまとめ記事

Marp

Marp は markdown 形式でプレゼンテーションを作成できるソフトウエアです。Markdown で記述したスライドをブラウザ上で描画したり PDF に出力したりできます。

その性質上、万人向けのツールではないところがあります *1。しかし、以下のようなニーズに対してはとても素晴らしいツールだと思います:

  • WYSIWYG エディタにマウスで格闘するより、テキストエディタを使いたい
  • Git と相性の良い、テキストベースのフォーマットで書きたい
  • 一つの markdown のファイルからプレゼンテーションもドキュメントも生成したい

筆者は既に社内外や個人で複数のスライドを Marp で作成しており、非常に便利なツールで助かっています。

実際に 私が Speaker Deck で公開しているスライド は 2018 年以降 Marp で全て作成しています。数百名の方向けの登壇発表などでも特に不自由もなく利用できています。

このように便利なツールなのですが、Marp Next (Marp CLI) を使い始めるまでの手順がまとまった資料があまりなかったため、分かる範囲でまとめてみました。

この記事の想定読者レベル

  • markdown 記法に抵抗がない
  • フロントエンド系の開発環境や node.js に詳しくはないが、コマンドライン環境の基本的な操作はできる
    • フロントエンドに詳しい方は @marp-team/marp-cli の README 等を見ながら好きな方法でセットアップすればよいと思います
    • 本稿では node.js 等に詳しくない読者を想定して書いています (Marp の布教のために)

*1:Slack ですら「大多数のユーザーのニーズに対応する」ために Markdown 記法をあえて採用していないぐらいです: https://get.slack.help/hc/ja/articles/202288908

続きを読む

Java Quiz 解答・解説

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

JJUG というイベントにて Java Quiz の配布をいたしました。設問はシンプルですが、特に 2 問目からは悩ましい問題だったのではないでしょうか。意識せずに使っている JVM の挙動を知るよいきっかけをご提供できて幸いです。問題文は本 blog に投稿済み ですので、Quiz をご覧になっていなかった方もご覧いただけます。

f:id:Saiya:20190520124330j:plain
@kis (id:nowokay)さんがその場で quiz の検証コードを書いていただいたり、来日された Java Champion の方が話しかけてくださり、楽しく議論したりもしていました

以下、問題文 と同じく、64bit 環境の OpenJDK 11 前提で解説いたします。

続きを読む

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の略 です。

続きを読む