SlideShare une entreprise Scribd logo
1  sur  37
Télécharger pour lire hors ligne
Quarkus 入門
GlassFish User Group Japan
May 16th, 2019
上妻 宜人 (あげつま のりと)
●
日本GlassFishユーザ会 理事
●
JBoss EAPのテクニカルサポートエンジニア
QuarkusSupersonic Subatomic Java
高速軽量なWebランタイム
Graal対応/100ミリ秒未満で起動
Quarkusは圧倒的に高速起動
WildFly16
JDK8u211
Thorntail-2.4
JDK8u211
Quarkus0.14.0
JDK8u211/java -jar
Quarkus0.14.0
GraalVM1.0.0RC16
native-image
9888ms
18224ms
2802ms
71ms
JAX-RS/CDI/JPAサンプルアプリケーションで測定
https://github.com/nagetsum/quarkus-glassfishjp
本日の内容
●
Quarkusが生まれた背景
●
デモ
●
Quarkusとは何か
●
Quarkusの注意点
●
まとめ
Quarkusが生まれた背景 1
k8sでもやっぱりJavaでコードを書きたい
●
コンテナ用途に小さくて軽いJavaが欲しい
●
APサーバではJVMプロセスは1サーバに数個〜10程度
●
k8sの1ノードでJavaプロセスを20以上起動したい
●
uber-jar登場により1war = 1プロセスが主流に
●
1プロセスに複数warをデプロイしなくなった
Quarkusが生まれた背景 1
k8sでもやっぱりJavaでコードを書きたい
●
もっと小さく
●
JDK8 HotSpotJVM メモリフットプリント 200MB 〜
●
WildFly16コンテナのイメージサイズ 371MB
●
Throntail uber-jar 125MB
●
もっと軽く
●
大きなアプリケーションではPod起動に20秒以上
●
起動速度はPodスケールのネックになる
(JAX-RS/CDI/JPA)
Quarkusが生まれた背景 2
GraalVMネイティブコンパイル登場
●
ネイティブバイナリは非常にコンパクト
●
Javaで書いて52MBの Mach-O or ELF シングルバイナリ
●
起動時メモリ使用量 (ps RSS) 30MB ※いずれも数値はQuarkusデモAPの場合
●
$GRAALVM_HOME/bin/native-image -jar <uber-jar>
ネイティブコンパイルを試みる
●
Undertow
●
WildFlyのWebサーバ実装
●
Java SEでも動く
import io.undertow.Undertow;
import io.undertow.util.Headers;
public class Main {
public static void main(final String[] args) {
Undertow server = Undertow.builder()
.addHttpListener(8080, "localhost")
.setHandler(exchange -> {
exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");
exchange.getResponseSender().send("Hello World");
}).build();
server.start();
}
}
native-imageが通らない
●
ネイティブイメージ作成時の制約事項に引っかかる
●
java.nio.ByteBuffer#allocateDirectは使えない
●
Undertowの内部実装AjpServerRequestConduitクラスで利用
$ native-image -jar undertow-standalone.jar
Warning: Abort stand-alone image build. Unsupported features in 3 methods
Detailed message:
Error: com.oracle.graal.pointsto.constraints.UnsupportedFeatureException:
Detected a direct/mapped ByteBuffer in the image heap. A direct ByteBuffer has a pointer
to unmanaged C memory, and C memory from the image generator is not available at image run time. A mapped
ByteBuffer references a file descriptor, which is no longer open and mapped at run time. The object was probably
created by a class initializer and is reachable from a static field. By default, all class initialization is done during
native image building.You can manually delay class initialization to image run time by using the option --delay-
class-initialization-to-runtime=<class-name>. Or you can write your own initialization methods and call them
explicitly from your main entry point.
Trace:
at parsing io.undertow.server.protocol.ajp.AjpServerRequestConduit.read
(AjpServerRequestConduit.java:195)
Call path from entry point to io.undertow.server.protocol.ajp.AjpServerRequestConduit.read(ByteBuffer):
at io.undertow.server.protocol.ajp.AjpServerRequestConduit.read(AjpServerRequestConduit.java:183)
at org.xnio.conduits.ConduitStreamSourceChannel.read(ConduitStreamSourceChannel.java:127)
Quarkusが生まれた背景 2
再掲: GraalVMネイティブコンパイル登場
●
ネイティブバイナリは非常にコンパクト
●
Javaで書いて 52MB の ELF or Mach-O シングルバイナリ
●
起動時メモリ使用量(ps RSS) 30MB (いずれも数値はQuarkusデモAPの場合)
●
シングルバイナリによりJVM不要の小さなイメージが作れる
●
native-imageコマンド
●
$GRAALVM_HOME/bin/native-image -jar <uber-jar>
●
Java EEでも簡単にnative-imageコマンドを通したい
本日の内容
●
Quarkusが生まれた背景
●
デモ
●
Quarkusとは何か
●
Quarkusの注意点
●
まとめ
Quarkus Demo
https://github.com/nagetsum/quarkus-glassfishjp
Quarkusデモのまとめ 1/2
●
Java EE APIでコードが書ける
●
mvn io.quarkus:quarkus-maven-plugin:0.14.0:create で
プロジェクト作成
●
mvn compile quarkus:dev でホットスワップ
●
HTTPリクエスト受信時にコード変更チェック
●
mvn package -Pnative でネイティブビルド
Quarkusデモのまとめ 2/2
●
JAX-RS
●
javax.ws.rs.core.Application継承クラスは省略可
●
JPA
●
Panacheによるボイラープレートコードの削減
●
テスト
●
@QuarkusTestとrest-assuredベースのテスト
●
@SubstrateTestによるネイティブバイナリへのテスト
本日の内容
●
Quarkusが生まれた背景
●
デモ
●
Quarkusとは何か
●
Quarkusの注意点
●
まとめ
Quarkusとは
●
ネイティブビルドが可能なWebフレームワーク
●
2019年3月にBeta版として公開 (現在もBeta)
●
Red HatがスポンサーのOSSプロジェクト
●
Apache Software License 2.0
Quarkusが実装したこと
●
既存ライブラリをネイティブビルド可能とした
●
RESTEasy / Hibernate / Smallrye(MicroProfile) 等
●
Extensionsと呼ばれる https://quarkus.io/extensions/
●
新たなCDI実装 “arc” の開発
●
Weldは実行時に内部処理で動的バイトコード生成を行う
●
SubstrateVM制約でクラス動的ロードができない為、
arcではビルド時にバイトコード生成
●
既存ライブラリやarcにおいて、元々デプロイ時に
実行していた処理をビルド時に実行して起動高速化
例: arcビルド時コード生成
@Injectをどうやって実現するか
@ApplicationScoped
public class SantaclausService {
@Inject
GiftDao giftDao;
}
public interface GiftDao {}
@ApplicationScoped
public class GiftDaoImpl implements GiftDao {}
例: arcビルド時コード生成
@Injectをどうやって実現するか
@ApplicationScoped
public class SantaclausService {
@Inject
GiftDao giftDao;
}
public interface GiftDao {}
@ApplicationScoped
public class GiftDaoImpl implements GiftDao {}
1. Bean定義アノテーションのスキャン
jar内の全クラスを探索し、Bean定義を示す
スコープアノテーションが付与されてるか探索。
アーカイブ内のBean一覧を作成。
1. Bean定義
アノテーションの
スキャン
例: arcビルド時コード生成
@Injectをどうやって実現するか
@ApplicationScoped
public class SantaclausService {
@Inject
GiftDao giftDao;
}
public interface GiftDao {}
@ApplicationScoped
public class GiftDaoImpl implements GiftDao {}
2. @Injectのスキャン
Beanクラスに@Injectがあるかチェックし、
依存性注入が必要な箇所を抽出。
2. @Inject
スキャン
1. Bean定義
アノテーションの
スキャン
例: arcビルド時コード生成
@Injectをどうやって実現するか
@ApplicationScoped
public class SantaclausService {
@Inject
GiftDao giftDao;
}
public interface GiftDao {}
@ApplicationScoped
public class GiftDaoImpl implements GiftDao {}
3. 依存性の解決 (実装クラスの探索)
インタフェースに対応する実装型を、
1.で抽出したBean定義一覧の中から特定
(この例の場合はGiftDaoImplクラス)
3. 依存性の
解決
2. @Inject
スキャン
1. Bean定義
アノテーションの
スキャン
例: arcビルド時コード生成
@Injectをどうやって実現するか
@ApplicationScoped
public class SantaclausService {
@Inject
GiftDao giftDao; //=GiftDao$Proxy$_$$_WeldClientProxy
}
public interface GiftDao {}
@ApplicationScoped
public class GiftDaoImpl implements GiftDao {}
4. クライアントプロキシのバイトコード生成
newしたGiftDaoImplインスタンスを注入して
参照関係を直接持たせると、スコープ完了時にGCできない。
プロキシクラスを動的バイトコード生成して注入。
3. 依存性の
解決
2. @Inject
スキャン
1. Bean定義
アノテーションの
スキャン
4. プロキシ
バイトコード
生成
例: arcビルド時コード生成
@Injectをどうやって実現するか
@ApplicationScoped
public class SantaclausService {
@Inject
GiftDao giftDao; //=GiftDao$Proxy$_$$_WeldClientProxy
}
public interface GiftDao {}
@ApplicationScoped
public class GiftDaoImpl implements GiftDao {}
5. Beanインスタンスの生成
各Beanの初回コール時にインスタンスを生成。
3. 依存性の
解決
2. @Inject
スキャン
1. Bean定義
アノテーションの
スキャン
5. Bean
生成
4. プロキシ
バイトコード
生成
例: arcビルド時コード生成
Weld(CDI参照実装)の場合
3. 依存性の
解決
2. @Inject
スキャン
1. Bean定義
アノテーションの
スキャン
5. Bean
生成
4. プロキシ
バイトコード
生成
デプロイ時に実行 初回コール時実行
例: arcビルド時コード生成
arc – QuarkusのCDI実装 の場合
3. 依存性の
解決
2. @Inject
スキャン
1. Bean定義
アノテーションの
スキャン
5. Bean
生成
4. プロキシ
バイトコード
生成
ビルド時に実行 (Quarkus Maven Plugin)
初回コール
時実行
Quarkusが速い理由
WildFly16
JDK8u211
Thorntail-2.4
JDK8u211
Quarkus0.14.0
JDK8u211/java -jar
Quarkus0.14.0
GraalVM1.0.0RC16
native-image
9888ms
18224ms
2802ms
71ms
●
Quarkusが速い理由はGraalVMの恩恵だけでない
●
Java EEランタイムのレイヤでもビルド時最適化を実装
●
だから java -jar でも速い
Quarkusの構成
RESTEasy
Maven/Gradle Plugin
Quarkus Core Deployment
(Build time processor framework)
Quarkus Core Runtime
(Launcher, Thread Pool, Logging etc..)
arc
(CDI implementation on Quarkus)
Quarkus Development Mode
(hot swap)
HotSpotJVM or GraalVM(SubstrateVM)
extension-resteasy
Hibernate
extension-hibernate-orm
H2/MariaDB/PostgreSQL
JDBC
extension-jdbc
Small-rye
(Microprofile impl)
extension-small-rye
… and mores
Quarkus extensions
Undertow
extension-undertow
既存のライブラリ
Quarkusで新たに
実装されたもの
VM
Quarkus Core
本日の内容
●
Quarkusが生まれた背景
●
デモ
●
Quarkusとは何か
●
Quarkusの注意点
●
まとめ
Quarkusで注意すること
●
ネイティブビルドの制約を意識してコードを書く
●
動的バイトコード生成しない (Objenesis, cglib etc..)
●
クラスパスから設定ファイルをロードしない
(ClassLoader#getResourceAsStreamを使わない)
●
ビルド時に存在しないクラスをリフレクションしない
●
staticイニシャライザはビルド時に動くことに注意
(最新のGraalVM19.0.0からランタイム時実行に変更になりました)
https://github.com/oracle/graal/blob/master/substratevm/LIMITATIONS.md
●
上記の制約は依存ライブラリにも適用される
●
引っかかる場合はネイティブ化は諦めて java -jar 利用
●
またはQuarkus Extensionを自作
Quarkusの気になるところ
●
非OSSに対するextention開発が難しい
●
エンプラ領域ではOracle JDBCは避けて通れない
●
extensionによりバージョンが固定される
●
依存先ライブラリではなくextensionを読み込む仕組み
●
例: pgjdbcバージョンアップにextensionが追従できるか
●
mvn package -Pnativeに時間が掛かる
●
GraalVMのネイティブコンパイル高速化に期待
●
ネイティブAPでもOOMエラーは起こる
●
DBからの大量レコードフェッチ、巨大なListやMap
●
Full GC連発の末にOOMエラー
●
メモリフットプリントは小さいが、アプリが大量に
要求するとメモリ使用量は増えることに注意
./quarkus-oom-0.1-runner -Xms256m -Xmx256m -XX:+PrintGC -XX:+PrintGCSummary
-XX:+PrintGCTimeStamps
...
[28878 msec: Incremental GC (CollectOnAllocation.Sometimes) 26650K->7973K, 0.0460786 secs]
[28985 msec: Incremental GC (CollectOnAllocation.Sometimes) 34312K->19966K, 0.0749783 secs]
...
[38259 msec: Full GC (CollectOnAllocation.Sometimes) 267658K->253378K, 1.8340780 secs]
[40128 msec: Full GC (CollectOnAllocation.Sometimes) 279897K->266638K, 1.8257359 secs]
2019-05-10 01:10:43,433 ERROR [io.und.request] (executor-thread-1) UT005023: Exception handling
request to /echo:
java.lang.OutOfMemoryError: Garbage-collected heap size exceeded.
バイナリ実行で
OutOfMemoryError
SubstrateVMのヒープ設定
●
最大ヒープサイズ
●
-Xmx または -XX:MaximumHeapSizePercent=xx
●
デフォルトは利用可能メモリの80% (物理 or cgroups)
●
コンテナのメモリを使い切るデフォルト値のため、
以前と比べてチューニングの機会は少ないのでは?
●
詳細はソースコード参照
●
https://github.com/oracle/graal/blob/master/substratevm/src/com.oracle.svm.core.genscavenge/
src/com/oracle/svm/core/genscavenge/HeapPolicyOptions.java
本日の内容
●
Quarkusが生まれた背景
●
デモ
●
Quarkusとは何か
●
Quarkusの注意点
●
まとめ
Quarkusを学ぶには
●
公式サイト
●
https://quarkus.io
●
Quarkus Youtubeチャネル
●
https://www.youtube.com/channel/UCaW8QG_QoIk_FnjLgr5eOqg
●
SubstrateVM (Graal)
●
https://github.com/oracle/graal/tree/master/substratevm
まとめ
●
Quarkusは高速起動が特徴のフレームワーク
●
100ミリ秒未満で起動
●
起動停止が頻繁発生するコンテナ環境に効果的
●
速い理由
●
デプロイ時 or 実行中に行なっていた処理を
可能な限りビルド時に実行して高速化
●
GraalVMによるネイティブイメージ作成で高速化

Contenu connexe

Tendances

Amazon EKS によるスマホゲームのバックエンド運用事例
Amazon EKS によるスマホゲームのバックエンド運用事例Amazon EKS によるスマホゲームのバックエンド運用事例
Amazon EKS によるスマホゲームのバックエンド運用事例gree_tech
 
とにかく分かりづらいTwelve-Factor Appの解説を試みる
とにかく分かりづらいTwelve-Factor Appの解説を試みるとにかく分かりづらいTwelve-Factor Appの解説を試みる
とにかく分かりづらいTwelve-Factor Appの解説を試みるMasatoshi Tada
 
ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方Yoshiyasu SAEKI
 
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)NTT DATA Technology & Innovation
 
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)NTT DATA Technology & Innovation
 
Spring Boot ユーザの方のための Quarkus 入門
Spring Boot ユーザの方のための Quarkus 入門Spring Boot ユーザの方のための Quarkus 入門
Spring Boot ユーザの方のための Quarkus 入門tsukasamannen
 
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門増田 亨
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Taku Miyakawa
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織Takafumi ONAKA
 
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)NTT DATA Technology & Innovation
 
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理NTT DATA Technology & Innovation
 
BuildKitの概要と最近の機能
BuildKitの概要と最近の機能BuildKitの概要と最近の機能
BuildKitの概要と最近の機能Kohei Tokunaga
 
JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」
JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」
JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」y torazuka
 
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかShogo Wakayama
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているKoichi Tanaka
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドAkihiro Suda
 
はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)Masatoshi Tada
 

Tendances (20)

Amazon EKS によるスマホゲームのバックエンド運用事例
Amazon EKS によるスマホゲームのバックエンド運用事例Amazon EKS によるスマホゲームのバックエンド運用事例
Amazon EKS によるスマホゲームのバックエンド運用事例
 
とにかく分かりづらいTwelve-Factor Appの解説を試みる
とにかく分かりづらいTwelve-Factor Appの解説を試みるとにかく分かりづらいTwelve-Factor Appの解説を試みる
とにかく分かりづらいTwelve-Factor Appの解説を試みる
 
ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方
 
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
 
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
 
Spring Boot ユーザの方のための Quarkus 入門
Spring Boot ユーザの方のための Quarkus 入門Spring Boot ユーザの方のための Quarkus 入門
Spring Boot ユーザの方のための Quarkus 入門
 
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
 
Helidon 概要
Helidon 概要Helidon 概要
Helidon 概要
 
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
 
BuildKitの概要と最近の機能
BuildKitの概要と最近の機能BuildKitの概要と最近の機能
BuildKitの概要と最近の機能
 
JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」
JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」
JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」
 
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するか
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
 
ゼロからはじめるKVM超入門
ゼロからはじめるKVM超入門ゼロからはじめるKVM超入門
ゼロからはじめるKVM超入門
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
 
はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)
 
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。 【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
 

Similaire à Quarkus入門

SDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireSDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireAkio Katayama
 
これからのJDK/JVM 何を選ぶ?どう選ぶ?
これからのJDK/JVM 何を選ぶ?どう選ぶ?これからのJDK/JVM 何を選ぶ?どう選ぶ?
これからのJDK/JVM 何を選ぶ?どう選ぶ?Takahiro YAMADA
 
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarcon
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarconSeasar ユーザだったプログラマが目指す OSS の世界展開 #seasarcon
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarconKazuhiro Sera
 
Scalaでのプログラム開発
Scalaでのプログラム開発Scalaでのプログラム開発
Scalaでのプログラム開発Kota Mizushima
 
JavaFX & GlassFish 勉強会 Project Visage
JavaFX & GlassFish 勉強会 Project VisageJavaFX & GlassFish 勉強会 Project Visage
JavaFX & GlassFish 勉強会 Project VisageYuichi Sakuraba
 
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-PE-BANK
 
試して学べるクラウド技術! OpenShift
試して学べるクラウド技術! OpenShift試して学べるクラウド技術! OpenShift
試して学べるクラウド技術! OpenShiftEtsuji Nakai
 
実行可能JavaFXアプリケーションJAR(発表直前版)
実行可能JavaFXアプリケーションJAR(発表直前版)実行可能JavaFXアプリケーションJAR(発表直前版)
実行可能JavaFXアプリケーションJAR(発表直前版)torutk
 
Scalaの現状と課題
Scalaの現状と課題Scalaの現状と課題
Scalaの現状と課題Kota Mizushima
 
【LT】 怖くない恐怖のScala.js
【LT】 怖くない恐怖のScala.js【LT】 怖くない恐怖のScala.js
【LT】 怖くない恐怖のScala.jsYuto Suzuki
 
JDKの選択肢とサーバーサイドでの選び方
JDKの選択肢とサーバーサイドでの選び方JDKの選択肢とサーバーサイドでの選び方
JDKの選択肢とサーバーサイドでの選び方Takahiro YAMADA
 
20130803 OSC@Kyoto CloudStackユーザー会
20130803 OSC@Kyoto CloudStackユーザー会20130803 OSC@Kyoto CloudStackユーザー会
20130803 OSC@Kyoto CloudStackユーザー会samemoon
 
Skinny framework勉強会
Skinny framework勉強会Skinny framework勉強会
Skinny framework勉強会Yusuke Arakaki
 
ネクスト・ジェネレーションクラウドネットワーク~雲の中のリストラクチャリング~
ネクスト・ジェネレーションクラウドネットワーク~雲の中のリストラクチャリング~ネクスト・ジェネレーションクラウドネットワーク~雲の中のリストラクチャリング~
ネクスト・ジェネレーションクラウドネットワーク~雲の中のリストラクチャリング~Sunao Tomita
 
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5Takahiro YAMADA
 
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1Y Watanabe
 

Similaire à Quarkus入門 (20)

SDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireSDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 Whire
 
これからのJDK/JVM 何を選ぶ?どう選ぶ?
これからのJDK/JVM 何を選ぶ?どう選ぶ?これからのJDK/JVM 何を選ぶ?どう選ぶ?
これからのJDK/JVM 何を選ぶ?どう選ぶ?
 
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarcon
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarconSeasar ユーザだったプログラマが目指す OSS の世界展開 #seasarcon
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarcon
 
Java in the World of Container by David Buck
Java in the World of Container by David BuckJava in the World of Container by David Buck
Java in the World of Container by David Buck
 
Scalaでのプログラム開発
Scalaでのプログラム開発Scalaでのプログラム開発
Scalaでのプログラム開発
 
JavaFX & GlassFish 勉強会 Project Visage
JavaFX & GlassFish 勉強会 Project VisageJavaFX & GlassFish 勉強会 Project Visage
JavaFX & GlassFish 勉強会 Project Visage
 
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
 
試して学べるクラウド技術! OpenShift
試して学べるクラウド技術! OpenShift試して学べるクラウド技術! OpenShift
試して学べるクラウド技術! OpenShift
 
Ptt391
Ptt391Ptt391
Ptt391
 
実行可能JavaFXアプリケーションJAR(発表直前版)
実行可能JavaFXアプリケーションJAR(発表直前版)実行可能JavaFXアプリケーションJAR(発表直前版)
実行可能JavaFXアプリケーションJAR(発表直前版)
 
Scalaの現状と課題
Scalaの現状と課題Scalaの現状と課題
Scalaの現状と課題
 
【LT】 怖くない恐怖のScala.js
【LT】 怖くない恐怖のScala.js【LT】 怖くない恐怖のScala.js
【LT】 怖くない恐怖のScala.js
 
JDKの選択肢とサーバーサイドでの選び方
JDKの選択肢とサーバーサイドでの選び方JDKの選択肢とサーバーサイドでの選び方
JDKの選択肢とサーバーサイドでの選び方
 
20130803 OSC@Kyoto CloudStackユーザー会
20130803 OSC@Kyoto CloudStackユーザー会20130803 OSC@Kyoto CloudStackユーザー会
20130803 OSC@Kyoto CloudStackユーザー会
 
Skinny framework勉強会
Skinny framework勉強会Skinny framework勉強会
Skinny framework勉強会
 
ネクスト・ジェネレーションクラウドネットワーク~雲の中のリストラクチャリング~
ネクスト・ジェネレーションクラウドネットワーク~雲の中のリストラクチャリング~ネクスト・ジェネレーションクラウドネットワーク~雲の中のリストラクチャリング~
ネクスト・ジェネレーションクラウドネットワーク~雲の中のリストラクチャリング~
 
Grailsのススメ(仮)
Grailsのススメ(仮)Grailsのススメ(仮)
Grailsのススメ(仮)
 
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
 
Software forwarding path
Software forwarding pathSoftware forwarding path
Software forwarding path
 
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
 

Plus de Norito Agetsuma

Java EEを補完する仕様 MicroProfile
Java EEを補完する仕様 MicroProfileJava EEを補完する仕様 MicroProfile
Java EEを補完する仕様 MicroProfileNorito Agetsuma
 
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4cCDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4cNorito Agetsuma
 
JavaOne2015報告会 Java EE アップデート #j1jp
JavaOne2015報告会 Java EE アップデート #j1jpJavaOne2015報告会 Java EE アップデート #j1jp
JavaOne2015報告会 Java EE アップデート #j1jpNorito Agetsuma
 
Java EE パフォーマンスTips #glassfish_jp
Java EE パフォーマンスTips #glassfish_jpJava EE パフォーマンスTips #glassfish_jp
Java EE パフォーマンスTips #glassfish_jpNorito Agetsuma
 
Jbatch実践入門 #jdt2015
Jbatch実践入門 #jdt2015Jbatch実践入門 #jdt2015
Jbatch実践入門 #jdt2015Norito Agetsuma
 
Tomcatの実装から学ぶクラスローダリーク #渋谷Java
Tomcatの実装から学ぶクラスローダリーク #渋谷JavaTomcatの実装から学ぶクラスローダリーク #渋谷Java
Tomcatの実装から学ぶクラスローダリーク #渋谷JavaNorito Agetsuma
 
Javaトラブルに備えよう #jjug_ccc #ccc_h2
Javaトラブルに備えよう #jjug_ccc #ccc_h2Javaトラブルに備えよう #jjug_ccc #ccc_h2
Javaトラブルに備えよう #jjug_ccc #ccc_h2Norito Agetsuma
 
Unixカーネルの設計 7 プロセスの制御
Unixカーネルの設計 7 プロセスの制御Unixカーネルの設計 7 プロセスの制御
Unixカーネルの設計 7 プロセスの制御Norito Agetsuma
 
JJUG 11月ナイトセミナー CDIをはじめよう
JJUG 11月ナイトセミナー CDIをはじめようJJUG 11月ナイトセミナー CDIをはじめよう
JJUG 11月ナイトセミナー CDIをはじめようNorito Agetsuma
 
AeroGear & Java EE 7 で簡単プッシュ
AeroGear & Java EE 7 で簡単プッシュAeroGear & Java EE 7 で簡単プッシュ
AeroGear & Java EE 7 で簡単プッシュNorito Agetsuma
 
プロになるためのJavaScript入門読書会 レジュメ
プロになるためのJavaScript入門読書会 レジュメプロになるためのJavaScript入門読書会 レジュメ
プロになるためのJavaScript入門読書会 レジュメNorito Agetsuma
 
SQLアンチパターン読書会 レジュメ
SQLアンチパターン読書会 レジュメSQLアンチパターン読書会 レジュメ
SQLアンチパターン読書会 レジュメNorito Agetsuma
 
JSR 352 “Batch Applications for the Java Platform”
JSR 352 “Batch Applications for the Java Platform”JSR 352 “Batch Applications for the Java Platform”
JSR 352 “Batch Applications for the Java Platform”Norito Agetsuma
 
Java Batch 仕様 (Public Review時点)
Java Batch 仕様 (Public Review時点) Java Batch 仕様 (Public Review時点)
Java Batch 仕様 (Public Review時点) Norito Agetsuma
 
Lt agetsuma 拡大するcdi
Lt agetsuma 拡大するcdiLt agetsuma 拡大するcdi
Lt agetsuma 拡大するcdiNorito Agetsuma
 

Plus de Norito Agetsuma (16)

Java EEを補完する仕様 MicroProfile
Java EEを補完する仕様 MicroProfileJava EEを補完する仕様 MicroProfile
Java EEを補完する仕様 MicroProfile
 
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4cCDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
 
JavaOne2015報告会 Java EE アップデート #j1jp
JavaOne2015報告会 Java EE アップデート #j1jpJavaOne2015報告会 Java EE アップデート #j1jp
JavaOne2015報告会 Java EE アップデート #j1jp
 
Java EE パフォーマンスTips #glassfish_jp
Java EE パフォーマンスTips #glassfish_jpJava EE パフォーマンスTips #glassfish_jp
Java EE パフォーマンスTips #glassfish_jp
 
Jbatch実践入門 #jdt2015
Jbatch実践入門 #jdt2015Jbatch実践入門 #jdt2015
Jbatch実践入門 #jdt2015
 
Tomcatの実装から学ぶクラスローダリーク #渋谷Java
Tomcatの実装から学ぶクラスローダリーク #渋谷JavaTomcatの実装から学ぶクラスローダリーク #渋谷Java
Tomcatの実装から学ぶクラスローダリーク #渋谷Java
 
Java EE8 Report
Java EE8 ReportJava EE8 Report
Java EE8 Report
 
Javaトラブルに備えよう #jjug_ccc #ccc_h2
Javaトラブルに備えよう #jjug_ccc #ccc_h2Javaトラブルに備えよう #jjug_ccc #ccc_h2
Javaトラブルに備えよう #jjug_ccc #ccc_h2
 
Unixカーネルの設計 7 プロセスの制御
Unixカーネルの設計 7 プロセスの制御Unixカーネルの設計 7 プロセスの制御
Unixカーネルの設計 7 プロセスの制御
 
JJUG 11月ナイトセミナー CDIをはじめよう
JJUG 11月ナイトセミナー CDIをはじめようJJUG 11月ナイトセミナー CDIをはじめよう
JJUG 11月ナイトセミナー CDIをはじめよう
 
AeroGear & Java EE 7 で簡単プッシュ
AeroGear & Java EE 7 で簡単プッシュAeroGear & Java EE 7 で簡単プッシュ
AeroGear & Java EE 7 で簡単プッシュ
 
プロになるためのJavaScript入門読書会 レジュメ
プロになるためのJavaScript入門読書会 レジュメプロになるためのJavaScript入門読書会 レジュメ
プロになるためのJavaScript入門読書会 レジュメ
 
SQLアンチパターン読書会 レジュメ
SQLアンチパターン読書会 レジュメSQLアンチパターン読書会 レジュメ
SQLアンチパターン読書会 レジュメ
 
JSR 352 “Batch Applications for the Java Platform”
JSR 352 “Batch Applications for the Java Platform”JSR 352 “Batch Applications for the Java Platform”
JSR 352 “Batch Applications for the Java Platform”
 
Java Batch 仕様 (Public Review時点)
Java Batch 仕様 (Public Review時点) Java Batch 仕様 (Public Review時点)
Java Batch 仕様 (Public Review時点)
 
Lt agetsuma 拡大するcdi
Lt agetsuma 拡大するcdiLt agetsuma 拡大するcdi
Lt agetsuma 拡大するcdi
 

Quarkus入門