SlideShare a Scribd company logo
1 of 48
Java
Puzzlers
櫻庭 祐一
寺田 佳央
Dedicated to John
Carpenter
We are Click and Hack the Type-It brothers !!
コード中に発生する勘違い
Java プログラミングにおける
奇妙な振る舞いをする小さなプログラム
複数の選択肢から、何が表示される?
ミステリーの解明
問題の解決方法
教訓
Java Puzzlers のルール
public class JavaPuzzlers {
public static void main(String... args) {
System.out.println(“Japan Java User
Group Presents!”);
}
}
1.Japan Java User Group Presents!
2.Java Puzzlers
3.0xCAFEBABE
4.その他
1問目
問題1:They Live
public class TheyLive {
public static void main(String... args) {
int sum = 0;
for (int i = Integer.MIN_VALUE;
i < Integer.MAX_VALUE; i++) {
if (i != 0) sum += i / Math.abs(i);
}
System.out.println(sum);
}
}
選択肢1:They Live
選択肢
1. -1
2. 0
3. 1
4. その他
public class TheyLive {
public static void main(String... args) {
int sum = 0;
for (int i = Integer.MIN_VALUE;
i < Integer.MAX_VALUE; i++) {
if (i != 0) sum += i / Math.abs(i);
}
System.out.println(sum);
}
}
正解は ?!
解答1:They Live
選択肢
1. -1
2. 0
3. 1
4. その他
public class TheyLive {
public static void main(String... args) {
int sum = 0;
for (int i = Integer.MIN_VALUE;
i < Integer.MAX_VALUE; i++) {
if (i != 0) sum += i / Math.abs(i);
}
System.out.println(sum);
}
}
解説1:何が悪いのか?
-2147483648/abs(-2147483648) = -1
-2147483647/abs(-2147483648) = -1
2147483646/abs(2147483646) = +1+)
……
-2
解説1:何が悪いのか?
-2147483648/abs(-2147483648) = +1
-2147483647/abs(-2147483648) = -1
2147483646/abs(2147483646) = +1+)
……
0
解決1:どうやって直すのか
public class TheyLive {
public static void main(String... args) {
int sum = -1;
for (int i = Integer.MIN_VALUE+1;
i < Integer.MAX_VALUE; i++) {
if (i != 0) sum += i / Math.abs(i);
}
System.out.println(sum);
}
}
教訓1:
• 意図しない動作をするメソッドが存在する
• 使用時には必ずJavadocをチェックしよう
• メソッドを作成する場合には、
想像しやすい動作になるよう心がけよう
2問目
問題2:MarshmallowMan
public class MarshmallowMan{
public static void main(String... args) {
int sum = 0;
for (int i = 1; i <= 10; i++) {
sum += foo(i);
}
System.out.println(sum);
}
public static long foo(long l) {return l;}}
選択肢2:MarshmallowMan
public class MarshmallowMan {
public static void main(String... args) {
int sum = 0;
for (int i = 1; i <= 10; i++) {
sum += foo(i);
}
System.out.println(sum);
}
public static long foo(long l) {return l;}}
選択肢
1. 0
2. 45
3. 55
4. コンパイルエラー
正解は ?!
選択肢2:MarshmallowMan
public class Sum {
public static void main(String... args) {
int sum = 0;
for (int i = 1; i <= 10; i++) {
sum += foo(i);
}
System.out.println(sum);
}
public static long foo(long l) {return l;}}
選択肢
1. 0
2. 45
3. 55
4. コンパイルエラー
解説2:
sum = sum + data コンパイルエラー
sum += data コンパイルエラーにはならない
int sum = 0;
long data = 10;
System.out.println(sum += data);
この問題と同じ
解説2:
JLS §15.26.2. Compound Assignment Operators
E1 op= E2
E1 = (T) ((E1) op (E2)) ※ T は E1 の型
つまり
sum = (int) (sum + data)
https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.26.2
解決2:Java 8 以降での計算処理
IntStream.rangeClosed(1, 10).sum()
桁があふれた際に ArithmeticException を出力
java.lang.StrictMath#addExact
java.lang.Math#addExact
java.util.concurrent.atomic.LongAdder
java.util.concurrent.atomic.DoubleAdder
複数スレッドからの更新で Atomic 性を保つ場合
AtomicLong よりおすすめ
教訓2:
• 演算子の振る舞いについて正しく理解しましょう
• 何が最適な解決方法か考えましょう
3問目
問題3:The Thing
public class TheThing {
public static void main(String... args) {
StringBuilder builder
= new StringBuilder("J");
builder = builder.append("a");
Stream.of("v", "a")
.forEach(builder::append);
System.out.println(builder);
}
}
選択肢3:The Thing
public class TheThing {
public static void main(String... args) {
StringBuilder builder
= new StringBuilder("J");
builder = builder.append("a");
Stream.of("v", "a")
.forEach(builder::append);
System.out.println(builder);
}
}
選択肢
1. Ja
2. Java
3. Compile Error
4. Exception
正解は ?!
選択肢3:The Thing
public class TheThing {
public static void main(String... args) {
StringBuilder builder
= new StringBuilder("J");
builder = builder.append("a");
Stream.of("v", "a")
.forEach(builder::append);
System.out.println(builder);
}
}
選択肢
1. Ja
2. Java
3. Compile Error
4. Exception
解説3:何が悪いのか?
ラムダ式:
final 以外のローカル変数にアクセスできない
StringBuilder builder = new StringBuilder("J");
builder = builder.append("a");
// NG
Stream.of("v", "a")
.forEach(c -> builder.append(c));
解説3:何が悪いのか?
ラムダ式:
final 以外のローカル変数にアクセスできない
// Effectively Final
StringBuilder builder = new StringBuilder("Ja");
// OK
Stream.of("v", "a")
.forEach(c -> builder.append(c));
解説3:何が悪いのか?
メソッド参照:
finalでないローカル変数にアクセスできるい
StringBuilder builder = new StringBuilder("J");
builder = builder.append("a"); // Not-Final
// OK
Stream.of("v", "a")
.forEach(builder::append);
教訓3:
• ラムダ式とメソッド参照はほぼ同じだが、若干の違
いがあることを意識しよう
• ラムダ式と匿名クラスも違いがあるので、気をつけ
よう
• thisの扱いが異なる
• メソッド参照の使いすぎに注意しよう
• 他の人が読めないコードになりがち
4問目
問題4:OpenSesame
public class OpenSesame {
public static void main(String... argv){
List<Integer> integerList = Arrays.asList(1,2,3,4,5);
List<Integer> filterdData = integerList.stream()
.filter((int i) -> (i > 2))
.collect(Collectors.toList());
System.out.println(filterdData);
}
}
選択肢4:OpenSesame
public class OpenSesame {
public static void main(String... argv){
List<Integer> integerList = Arrays.asList(1,2,3,4,5);
List<Integer> filterdData = integerList.stream()
.filter((int i) -> (i > 2))
.collect(Collectors.toList());
System.out.println(filterdData);
}
}
選択肢
1. 1,2
2. 3,4,5
3. 何も表示されない
4. コンパイルエラー
正解は ?!
解答4:OpenSesame
public class OpenSesame {
public static void main(String... argv){
List<Integer> integerList = Arrays.asList(1,2,3,4,5);
List<Integer> filterdData = integerList.stream()
.filter((int i) -> (i > 2))
.collect(Collectors.toList());
System.out.println(filterdData);
}
}
選択肢
1. 1,2
2. 3,4,5
3. 何も表示されない
4. コンパイルエラー
解説4:何が悪いのか?
public class OpenSesame {
public static void main(String... argv){
List<Integer> integerList = Arrays.asList(1,2,3,4,5);
List<Integer> filterdData = integerList.stream()
.filter((int i) -> (i > 2))
.collect(Collectors.toList());
System.out.println(filterdData);
}
}
期待する型が見つからない
クラス Test のメソッド filter は指定された型に適用できません
期待値:List<T>, Predicate<T>
検出値:List, (int i) -> (i>2)
解決4:IntStream を使いましょう
public class OpenSesame {
public static void main(String... argv){
int[] filterdData =
IntStream.range(1, 6)
.filter(i -> i > 2)
.toArray();
System.out.println(Arrays.toString(filterdData));
}
}
教訓4:
• Lambda 式を記述する場合、部分的に型を
書くくらいならば 型を省略しましょう
• primitive 型を使用する場合、対応する
Stream を使いましょう
5問目
問題5:The Fog
class Ship<T> {
private T t;
public Ship(T t) { this.t = t; }
public void setCrew(T t) { this.t = t; }
public int hashCode() { return Objects.hashCode(t); }
}
public class TheFog {
public static void main(String... args) {
Map<Ship<String>, String> map = new HashMap<>();
Ship<String> a = new Ship<>("A");
Ship<String> b = new Ship<>("B");
map.put(a, "a"); a.setCrew("B");
map.put(b, "b");
System.out.println(map.values().size());
}}
選択肢5:The Fog
class Ship<T> {
private T t;
public Ship(T t) { this.t = t; }
public void setCrew(T t) { this.t = t; }
public int hashCode() { return Objects.hashCode(t); }
}
public class TheFog {
public static void main(String... args) {
Map<Ship<String>, String> map = new HashMap<>();
Ship<String> a = new Ship<>("A");
Ship<String> b = new Ship<>("B");
map.put(a, "a"); a.setCrew("B");
map.put(b, "b");
System.out.println(map.values().size());
}}
選択肢
1. 0
2. 1
3. 2
4. Exception
正解は ?!
解答5:The Fog
class Ship<T> {
private T t;
public Ship(T t) { this.t = t; }
public void setCrew(T t) { this.t = t; }
public int hashCode() { return Objects.hashCode(t); }
}
public class TheFog {
public static void main(String... args) {
Map<Ship<String>, String> map = new HashMap<>();
Ship<String> a = new Ship<>("A");
Ship<String> b = new Ship<>("B");
map.put(a, "a"); a.setCrew("B");
map.put(b, "b");
System.out.println(map.values().size());
}}
選択肢
1. 0
2. 1
3. 2
4. Exception
解説5:
• MapはKeyのハッシュ値を使用する
• 同じハッシュ値をputすると、上書きする
• ハッシュ値が後から変更された場合、同じハッシュ値の
エントリがあっても存在し続ける
• しかし、そのエントリにはアクセスできない
• MutableなオブジェクトをMapのキーにすることは危険
解決5class Ship<T> {
private T t;
public Ship(T t) { this.t = t; }
// public void setCrew(T t) { this.t = t; }
public int hashCode() { return Objects.hashCode(t); }
}
public class TheFog {
public static void main(String... args) {
Map<Ship<String>, String> map = new HashMap<>();
Ship<String> a = new Ship<>("A");
Ship<String> b = new Ship<>("B");
map.put(a, "a"); // a.setCrew("B");
map.put(b, "b");
System.out.println(map.values().size());
}}
教訓5:
• MutableなオブジェクトをMapのキーにしない
• Imutableなオブジェクトを使い慣れよう
• hashCodeメソッドをオーバーライドする場合、必ず
equalsメソッドもオーバーライドする
Java
Puzzlers
櫻庭 祐一
寺田 佳央
Dedicated to John
Carpenter

More Related Content

What's hot

Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義
JPCERT Coordination Center
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya
 
Javaセキュアコーディングセミナー東京第1回演習の解説
Javaセキュアコーディングセミナー東京第1回演習の解説Javaセキュアコーディングセミナー東京第1回演習の解説
Javaセキュアコーディングセミナー東京第1回演習の解説
JPCERT Coordination Center
 
あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)
Takuya Tsuchida
 

What's hot (20)

Java SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRubyJava SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRuby
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
 
Metaprogramming in JuliaLang
Metaprogramming in JuliaLangMetaprogramming in JuliaLang
Metaprogramming in JuliaLang
 
Java x Groovy: improve your java development life
Java x Groovy: improve your java development lifeJava x Groovy: improve your java development life
Java x Groovy: improve your java development life
 
Xtend30分クッキング やきに駆動
Xtend30分クッキング   やきに駆動Xtend30分クッキング   やきに駆動
Xtend30分クッキング やきに駆動
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案
 
Synthesijer and Synthesijer.Scala in HLS-friends 201512
Synthesijer and Synthesijer.Scala in HLS-friends 201512Synthesijer and Synthesijer.Scala in HLS-friends 201512
Synthesijer and Synthesijer.Scala in HLS-friends 201512
 
Frege, What a Non-strict Language
Frege, What a Non-strict LanguageFrege, What a Non-strict Language
Frege, What a Non-strict Language
 
Xtend30分クッキング
Xtend30分クッキングXtend30分クッキング
Xtend30分クッキング
 
C++14 Overview
C++14 OverviewC++14 Overview
C++14 Overview
 
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
 
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義
 
C# LINQ ~深く知って、使いまくろう~
C# LINQ ~深く知って、使いまくろう~C# LINQ ~深く知って、使いまくろう~
C# LINQ ~深く知って、使いまくろう~
 
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
 
Javaセキュアコーディングセミナー東京第1回演習の解説
Javaセキュアコーディングセミナー東京第1回演習の解説Javaセキュアコーディングセミナー東京第1回演習の解説
Javaセキュアコーディングセミナー東京第1回演習の解説
 
60分で体験する Stream / Lambda
 ハンズオン
60分で体験する Stream / Lambda
 ハンズオン60分で体験する Stream / Lambda
 ハンズオン
60分で体験する Stream / Lambda
 ハンズオン
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
 
Juliaで並列計算
Juliaで並列計算Juliaで並列計算
Juliaで並列計算
 
あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)
 

Similar to Java Puzzlers JJUG CCC 2016

Javaセキュアコーディングセミナー東京第3回演習の解説
Javaセキュアコーディングセミナー東京第3回演習の解説Javaセキュアコーディングセミナー東京第3回演習の解説
Javaセキュアコーディングセミナー東京第3回演習の解説
JPCERT Coordination Center
 
Javaセキュアコーディングセミナー東京第3回演習
Javaセキュアコーディングセミナー東京第3回演習Javaセキュアコーディングセミナー東京第3回演習
Javaセキュアコーディングセミナー東京第3回演習
JPCERT Coordination Center
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
 
ATN No.2 大阪から来たJavaPuzzlers
ATN No.2 大阪から来たJavaPuzzlersATN No.2 大阪から来たJavaPuzzlers
ATN No.2 大阪から来たJavaPuzzlers
AdvancedTechNight
 
Java8から始める関数型プログラミング
Java8から始める関数型プログラミングJava8から始める関数型プログラミング
Java8から始める関数型プログラミング
stylefreeslide
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
Akira Takahashi
 
Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第4回講義Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第4回講義
JPCERT Coordination Center
 
Javaセキュアコーディングセミナー東京第2回演習の解説
Javaセキュアコーディングセミナー東京第2回演習の解説Javaセキュアコーディングセミナー東京第2回演習の解説
Javaセキュアコーディングセミナー東京第2回演習の解説
JPCERT Coordination Center
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
yoshiaki iwanaga
 
Effective java 勉強会
Effective java 勉強会Effective java 勉強会
Effective java 勉強会
Takinami Kei
 

Similar to Java Puzzlers JJUG CCC 2016 (20)

Javaセキュアコーディングセミナー東京第3回演習の解説
Javaセキュアコーディングセミナー東京第3回演習の解説Javaセキュアコーディングセミナー東京第3回演習の解説
Javaセキュアコーディングセミナー東京第3回演習の解説
 
Javaセキュアコーディングセミナー東京第3回演習
Javaセキュアコーディングセミナー東京第3回演習Javaセキュアコーディングセミナー東京第3回演習
Javaセキュアコーディングセミナー東京第3回演習
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
C#6.0の新機能紹介
C#6.0の新機能紹介C#6.0の新機能紹介
C#6.0の新機能紹介
 
Introduction of Python
Introduction of PythonIntroduction of Python
Introduction of Python
 
ATN No.2 大阪から来たJavaPuzzlers
ATN No.2 大阪から来たJavaPuzzlersATN No.2 大阪から来たJavaPuzzlers
ATN No.2 大阪から来たJavaPuzzlers
 
15分でざっくり分かるScala入門
15分でざっくり分かるScala入門15分でざっくり分かるScala入門
15分でざっくり分かるScala入門
 
Enshu8
Enshu8Enshu8
Enshu8
 
Java8から始める関数型プログラミング
Java8から始める関数型プログラミングJava8から始める関数型プログラミング
Java8から始める関数型プログラミング
 
Rの高速化
Rの高速化Rの高速化
Rの高速化
 
10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
 
Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第4回講義Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第4回講義
 
Javaセキュアコーディングセミナー東京第2回演習の解説
Javaセキュアコーディングセミナー東京第2回演習の解説Javaセキュアコーディングセミナー東京第2回演習の解説
Javaセキュアコーディングセミナー東京第2回演習の解説
 
プログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコードプログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコード
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
2023_freshman
2023_freshman2023_freshman
2023_freshman
 
boost tour 1.48.0 all
boost tour 1.48.0 allboost tour 1.48.0 all
boost tour 1.48.0 all
 
Effective java 勉強会
Effective java 勉強会Effective java 勉強会
Effective java 勉強会
 
ディープニューラルネット入門
ディープニューラルネット入門ディープニューラルネット入門
ディープニューラルネット入門
 

More from Yoshio Terada

More from Yoshio Terada (20)

AI-Java-for-Financial.pdf
AI-Java-for-Financial.pdfAI-Java-for-Financial.pdf
AI-Java-for-Financial.pdf
 
Java-Virtual-Thread-LT.pdf
Java-Virtual-Thread-LT.pdfJava-Virtual-Thread-LT.pdf
Java-Virtual-Thread-LT.pdf
 
Cloud Native Architecture ことはじめ 最適な実行環境を選ぶポイント
Cloud Native Architecture ことはじめ 最適な実行環境を選ぶポイントCloud Native Architecture ことはじめ 最適な実行環境を選ぶポイント
Cloud Native Architecture ことはじめ 最適な実行環境を選ぶポイント
 
Jakarta EE Microproile Update JJUG 2020 May
Jakarta EE Microproile Update JJUG 2020 MayJakarta EE Microproile Update JJUG 2020 May
Jakarta EE Microproile Update JJUG 2020 May
 
Azure RedHat OpenShift - Red Hat Forum 2019
Azure RedHat OpenShift - Red Hat Forum 2019Azure RedHat OpenShift - Red Hat Forum 2019
Azure RedHat OpenShift - Red Hat Forum 2019
 
JakartaOne 2020 Japan Announce
JakartaOne 2020 Japan AnnounceJakartaOne 2020 Japan Announce
JakartaOne 2020 Japan Announce
 
Jjug CCC 2019 Fall Azure Spring Cloud
Jjug CCC 2019 Fall Azure Spring CloudJjug CCC 2019 Fall Azure Spring Cloud
Jjug CCC 2019 Fall Azure Spring Cloud
 
Sapporo Developer Festa 2019
Sapporo Developer Festa 2019Sapporo Developer Festa 2019
Sapporo Developer Festa 2019
 
AKS (k8s) Hands on Lab Contents
AKS (k8s) Hands on Lab ContentsAKS (k8s) Hands on Lab Contents
AKS (k8s) Hands on Lab Contents
 
Java on Azure 2019
Java on Azure 2019Java on Azure 2019
Java on Azure 2019
 
Java on Azure 2019
Java on Azure 2019Java on Azure 2019
Java on Azure 2019
 
Oisix ra Daichi Microservice with Kubernetes
Oisix ra Daichi Microservice with Kubernetes Oisix ra Daichi Microservice with Kubernetes
Oisix ra Daichi Microservice with Kubernetes
 
Virtual Kubelet and Virtual Node
Virtual Kubelet and Virtual NodeVirtual Kubelet and Virtual Node
Virtual Kubelet and Virtual Node
 
Japan Container Day 2018
Japan Container Day 2018Japan Container Day 2018
Japan Container Day 2018
 
Java on Kubernetes on Azure
Java on Kubernetes on AzureJava on Kubernetes on Azure
Java on Kubernetes on Azure
 
The Experience of Java on Kubernetes with Microservices from HackFest
The Experience of Java on Kubernetes with Microservices from HackFestThe Experience of Java on Kubernetes with Microservices from HackFest
The Experience of Java on Kubernetes with Microservices from HackFest
 
Application Development Vision
Application Development VisionApplication Development Vision
Application Development Vision
 
How to face the Kubernetes ?
How to face the Kubernetes ? How to face the Kubernetes ?
How to face the Kubernetes ?
 
JavaOne 2016 Report for Java EE
JavaOne 2016 Report for Java EEJavaOne 2016 Report for Java EE
JavaOne 2016 Report for Java EE
 
Istio on k8s on Azure (AKS)
Istio on k8s on Azure (AKS)Istio on k8s on Azure (AKS)
Istio on k8s on Azure (AKS)
 

Recently uploaded

Recently uploaded (7)

Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 

Java Puzzlers JJUG CCC 2016