SlideShare une entreprise Scribd logo
1  sur  127
Télécharger pour lire hors ligne
( )
Netty
JJUG CCC 2018 Spring
#jjug #ccc_i7
@mike_neck
•
•twitter: @mike_neck
•https://github.com/mike-neck
•L is B
• Swift
Netty
Netty
•
•Netty
•
1.Netty
2.Java API Netty
1.OIO(Old Blocking I/O)
2.NIO(Non-blocking I/O)
3.Netty
3.Netty
4.Netty
5.
• I/O(Input/Output)
I/O I/O
•
•
Netty
Netty
•
•Java : java version “10” 2018-03-20
•Netty : 4.1.24.Final
1. Netty
Netty (1)
•Netty
/
•
• /CPU
Netty (2)
•
•Elasticsearch
•Akka
•Finagle
•Gatling
Netty (3)
•blocking I/O non-
blocking I/O
•
•
Norman Maurer in Netty in Action 2016
Our primary goal has been to make Netty
accessible to the broadest range of
developers.
2. Java API
Netty
Netty
Java API I/O(1)
•JDK 1.0 java.net
API
•accept / read / write
API
•
(block)
• OIO (Old blocking I/O)
Java API I/O(2)
•Java 1.4 java.nio.channels
API
•select( epoll/kqueue)
API
•
• NIO(New Non-blocking I/O)
2-1. OIO
(Old blocking I/ O)
Java API Netty
OIO Echo
1.
2. (accept)
3. (read)
4.
5. (write)
6.
OIO Echo
class EchoServer {
public static void main(String[] args) {
var serverSocket = new ServerSocket(8000); //(1)
while(true) {
Socket socket = serverSocket.accept(); // (2)
var reader = toBufferedReader(socket.getInputStream());
var writer = toPrintWriter(socket.getOutputStream());
String line = reader.readLine(); // (3)
System.out.println(line); // (4)
writer.println(line); // (5)
socket.close(); // (6)
}
}
}
OIO Echo
ServerSocketaccept
ServerSocket accept
OIO Echo
ServerSocketaccept
accept
Socket
Socket
OIO Echo
ServerSocketaccept
Socket read
Socket
read
OIO Echo
ServerSocketaccept
Socket
read
App
OIO Echo
ServerSocketaccept
Socket write
write
Socket
read
App
write
OIO Echo
ServerSocketaccept
write
Socket close
close
Socket
read
App
write
close
OIO Echo
ServerSocketaccept
Socket
read
App
write
1 ServerSocket
OIO Echo
(?)
ServerSocketaccept
Socket
read
App
write
accept 1
read/write
ExecutorService exec = Executors.newFixedThreadPool(THREAD_NUM);
var serverSocket = new ServerSocket(8000); //(1)
while(true) {
Socket socket = serverSocket.accept(); // (2)
exec.submit(() -> {
var reader = toBufferedReader(socket.getInputStream());
var writer = toPrintWriter(socket.getOutputStream());
String line = reader.readLine(); // (3)
System.out.println(line); //(3)
writer.println(line); // (4)
socket.close();
});
}
OIO Echo
(?)
Thread
Socket App
Thread
Socket App
Thread
Socket App
Thread
…
Thread
Socket App
Thread
Socket App
Thread
Socket App
Thread
…
Thread
Socket App
Thread
Socket App
Executor Queue
Socket
App
Socket
App
Socket
App
Executor
=
Thread …
Thread
Socket App
Thread
Socket App
Executor Queue
Socket
App
Socket
App
Socket
App
read / write Thread
Socket
App
…
Thread
Socket App
Thread
Socket App
Executor Queue
Socket
App
Socket
App
Socket
App
Socket
App
OIO
• ( )
• read/write/close
•
read/write
( )
• /CPU
2-2. NIO
(Non-blocking I/ O)
Java API Netty
OIO(blocking )
…
• NIO (select
)
• I/O ( I/O
)
• I/O (accept /read /write )
( )
NIO Echo
1. ( ) I/O (OP_ACCEPT/OP_READ/
OP_WRITE)
2.
3. OP_ACCEPT
(OP_READ)
4. OP_READ
(OP_WRITE)
5. OP_WRITE
(OP_WRITE)
I/O
•Selector 4
•OP_READ - Channel
•OP_WRITE - Channel
•OP_CONNECT - Channel
(
)
•OP_ACCEPT - ServerSocketChannel (
) (
listen )
class EchoServer {
public static void main(String[] args) {
var channel = ServerSocketChannel.open();
channel.setOption(SO_REUSEADDR, true);
channel.bind(new InetSocketAddress(PORT));
channel.configureBlocking(false);
var selector = Selector.open();
channel.register(selector, SelectionKey.OP_ACCEPT);
runLoop(selector);
}
void runLoop(Selector selector) {
while(true) {
selector.select();
Set<SelectionKey> selectionKeys =
selector.selectedKeys();
for (var key: selectionKeys) {
if (key.isAcceptable()) accept(key, selector);
if (key.isReadable()) read(key);
if (key.isWritable()) write(key);
selectionKeys.remove(key);
}
}
OP_ACCEPT
void access(SelectionKey key, Selector selector) {
var serverSocketChannel =
(ServerSocketChannel) key.channel();
SocketChannel channel = serverSocketChannel.accept();
channel.configureBlocking(false);
channel.register(
selector,
SelectionKey.OP_READ,
ByteBuffer.allocate(1024));
}
OP_READ
OP_READ
void read(SelectionKey key) {
SocketChannel channel =
(SocketChannel) key.channel;
var buf = (ByteBuffer) key.attachment();
int size = channel.read(buf);
var bytes = new byte[size];
buf.flip().get(bytes);
buf.clear();
buf.put(handleMessage(bytes));
// read 1
key.interestOps(SelectionKey.OP_WRITE);
}
OP_WRITE
OP_WRITE
void write(SelectionKey key) {
SocketChannel channel = (SocketChannel) key.channel;
var buf = ((ByteBuffer) key.attachment()).flip();
channel.write(buf);
buf.compact();
if (buf.position() > 0) { // NW 1
key.interestOps(SelectionKey.OP_WRITE);
} else {
buf.clear();
channel.close();
}
}
NIO Echo
Selector
ServerSocketChannel
OP_ACCEPT
Selector ServerSocketChannel
(OP_ACCEPT)
NIO Echo
Selector
ServerSocketChannel
OP_ACCEPT
Selector#select I/O
select
NIO Echo
Selector
ServerSocketChannel
ServerSocketChannel
Selector
OP_ACCEPT
select
NIO Echo
Selector
ServerSocketChannel
accept SocketChannel
OP_READ Selector
SocketChannel
OP_ACCEPT
OP_READ
accept
NIO Echo
Selector
ServerSocketChannel
Selector#select I/O
SocketChannel
OP_ACCEPT
OP_READ
select
NIO Echo
Selector
ServerSocketChannel
OP_READ
Selector
SocketChannel
OP_ACCEPT
OP_READ
select
NIO Echo
Selector
ServerSocketChannelSelectionKey
SocketChannel
OP_ACCEPT
Application
OP_READ
ByteBuffer
read
NIO Echo
Selector
ServerSocketChannel
Socket Channel OP_WRITE
Selector
SocketChannel
OP_ACCEPT
Application
OP_WRITE
ByteBuffer
NIO Echo
Selector
ServerSocketChannel
Selector#select Socket writability
SocketChannel
OP_ACCEPT
Application
OP_WRITE
ByteBuffer
select
NIO Echo
Selector
ServerSocketChannel
Selector#select Socket
SocketChannel
OP_ACCEPT
Application
select
OP_WRITE
ByteBuffer
NIO Echo
Selector
ServerSocketChannel
(write)
SocketChannel
OP_ACCEPT
Application
select
OP_WRITE
ByteBuffer
NIO Echo
Selector
ServerSocketChannel
Selector
writability
SocketChannel
OP_ACCEPT
Application
OP_WRITE
ByteBuffer
NIO
Selector
read/write
SocketChannel App
select
OP_WRITE
SocketChannel App
SocketChannel App
OP_READ
OP_READ
NIO
•
• 1
• ByteBuffer
•OIO NIO
NIO
•
•
•ByteBuffer
•OIO NIO
•
…
API
NIO
Netty
Java API(NIO)
Netty
2-3. Netty
Java API Netty
Netty Echo
1. ChannelInboundHandlerAdapter
2. 1.
ChannelPipeline
3. 2.
Bootstrap
1. ChannelInboundHandlerAdapter
class EchoHandler extends ChannelInboundHandlerAdapter {
@Override public void channelRead(
ChannelContext ctx, Object msg) {
var buf = (ByteBuf) msg;
String message = buf.toString(UTF_8);
ByteBuf res = ctx.alloc().buffer();
res.writeCharSequence(message, UTF_8);
ctx.writeAndFlush(res);
}
}
channelRead OP_READ
byte[] String
ByteBuf
Netty
2. EchoHandler
ChannelPipeline
class InitHandler
extends ChannelInitializer<Channel> {
@Override
protected void initChannel(Channel ch) {
ch.pipeline()
.addLast(new EchoHandler());
}
}
ChannelPipeline 1
3.
ServerBootstrap
class EchoServer {
public static void main(String[] args) {
var parent = new NioEventLoopGroup();
var child = new NioEventLoopGroup();
var bootstrap = new ServerBootstrap();
bootstrap.group(parent, child)
.channel(NioServerSocketChannel.class)
.localAddress(8000)
.childHandler(new InitHandler());
ChannelFuture future = bootstrap.bind().sync();
future.channel().closeFuture().sync();
}
}
ServerBootstrap
blocking I/O
NIO
3.
ServerBootstrap
class EchoServer {
public static void main(String[] args) {
var parent = new NioEventLoopGroup();
var child = new NioEventLoopGroup();
var bootstrap = new ServerBootstrap();
bootstrap.group(parent, child)
.channel(NioServerSocketChannel.class)
.localAddress(8000)
.childHandler(new InitHandler());
ChannelFuture future = bootstrap.bind().sync();
future.channel().closeFuture().sync();
}
}
Netty …
3. Netty
Netty
•Channel
•ChannelFuture
•ChannelHandler & ChannelPipeline
•EventLoop
•ByteBuf
•Bootstrap
Netty
•Channel
•ChannelFuture
•ChannelHandler & ChannelPipeline
•EventLoop
•ByteBuf
•Bootstrap
Channel
• (SocketChannel)
(ServerSocketChannel)
• I/O (accept/bind/
connect/read/write)
Channel
NioServerSocketChannel
Channel
ServerSocketChannel SocketChannel
NioSocketChannel
extends extends
implements implements
(accept)
Channel Channel(read/write/close/connect)
Netty
•Channel
•ChannelFuture
•ChannelHandler & ChannelPipeline
•EventLoop
•ByteBuf
•Bootstrap
ChannelFuture
•NIO non-blocking API I/O
•Netty
Future(ChannelFuture)
• (write/close)
ChannelFutureListener
ChannelFuture
ChannelFuture
Channel
(1)1 

write
ChannelFuture
Channel
(1)1 

write
ChannelFuture
(2) return
ChannelFuture
Channel
(1)1 

write
ChannelFuture
(2) return
write
write
1
2
(3) I/O write
ChannelFuture
Channel
(1)1 

write
ChannelFuture
(2) return
write
write
1
2 (4)
or
(3) I/O write
ChannelFuture
Channel
(1)1 

write
ChannelFuture
(2) return
write
write
1
2 (4)
or
(3) I/O write
ChannelFutureListener
(5)
Netty
•Channel
•ChannelFuture
•ChannelHandler & ChannelPipeline
•EventLoop
•ByteBuf
•Bootstrap
ChannelHandler
•ChannelHandler SocketChannel (OP_READ/OP_WRITE)
• TCP/UDP
(HTTP/WebSocket/SSL)
• ChannelHandler
•ChannelHandler I/O
•ChannelInboundHandler : I/O (read)
•ChannelOutboundHandler : I/O (write)
ChannelPipeline
•ChannelPipeline 1 Channel 1
•Channel
•ChannelHandlerContext
ChannelHandler
•ChannelPipeline Channel
ChannelHandler
Channel
ChannelPipeline
Channel
ServerSocketChannel accept Channel
ChannelPipeline
Channel
ChannelPipeline
Channel
Inbound
Inbound
Outbound
Outbound
Inbound
ChannelInitializer ChannelHandler
Channel
ChannelPipeline
Channel
Inbound
Outbound
Channel EventLoopGroup 1 EventLoop
Inbound
Outbound
Inbound
EventLoop
Channel
ChannelPipeline
Channel
Outbound
Selector OP_READ
Outbound
EventLoop
OP_READ
Inbound
Inbound
Inbound
Channel
ChannelPipeline
Channel
Inbound
OP_WRITE EventLoop
Inbound
Inbound
EventLoop
OP_WRITE
Outbound
Outbound
ChannelInboundHandler
channelRegistered
accept Channel
EventLoop
channelRead
OP_READ ->
(1 )
channelReadComplete
(channelRead)
exceptionCaught
ChannelInboundHandler
ChannelInboundHandler
byte[]
ChannelInboundHandler
channelRead
ChannelHandlerContext
ChannelInboundHandler
ChannelInboundHandler
byte[]
ChannelInboundHandler
channelRead
channelRead byte[]
ChannelHandlerContext
ChannelInboundHandler
ChannelInboundHandler
String
byte[]
ChannelInboundHandler
channelRead
channelRead
channelReadComplete
byte[]
ChannelHandlerContext
ChannelInboundHandler
ChannelInboundHandler
String
byte[]
ChannelInboundHandler
byte[]
ChannelHandlerContext
fireChannelRead
String
channelRead
channelRead
channelReadComplete
ChannelInboundHandler
ChannelInboundHandler
String
byte[]
ChannelInboundHandler
byte[]
ChannelHandlerContext
fireChannelRead
String
String
channelRead
channelRead
channelReadComplete
channelRead
ChannelInboundHandler
ChannelInboundHandler
String
byte[]
ChannelInboundHandler
byte[]
ChannelHandlerContext
fireChannelRead
String channelRead
Method: POST
Path: /api/users
Content-Type: x-www-
form-urlencoded
name=Tom
String
channelRead
channelRead
channelReadComplete
ChannelOutboundHandler
ChannelOutboundHandler ChannelOutboundHandler
ChannelHandlerContext
class User
id=100
name=Tom
write
JSON
JSON
write
JSONwrite
byte[]
ChannelPipeline
ChannelHandler
•ChannelHandler
•ChannelInboundHandler head tail
•ChannelOutboundHandler tail head
•ChannelHandler ChannelHandlerContext
ChannelHandler
ChannelHandler
ChannelPipeline
ChannelHandler
ChannelPipeline
(1)
ChannelInboundHandler
(3)
ChannelInboundHandler
(2)
ChannelOutboundHandler
(4)
ChannelOutboundHandler
H T
ChannelInboundHandler
(1) -> (3)
ChannelOutboundHandler
(2) <- (4)
ChannelHandlerContext
ChannelPipeline
Inbound
Inbound
Outbound
Outbound
H T
Context Context Context Context
fireRead Tail ChannelInboundHandler
ChannelHandlerContext
ChannelPipeline
Inbound
Inbound
Outbound
Outbound
H T
Context Context Context Context
write Head ChannelOutboundHandler
Netty
•Channel
•ChannelFuture
•ChannelHandler & ChannelPipeline
•EventLoop
•ByteBuf
•Bootstrap
EventLoop
•EventLoop 1 Thread Channel
•EventLoop EventLoopGroup
• 2 EventLoopGroup
• 1 EventLoopGroup
• EventLoop Selector
ChannelPipeline
EventLoop Channel
EventLoopGroup
ThreadEventLoop
ThreadEventLoop
ThreadEventLoop
EventLoopGroup
EventLoop
EventLoop Channel
EventLoopGroup
ThreadEventLoop
Channel
ThreadEventLoop
ThreadEventLoop
Channel
EventLoop 1
ThreadEventLoop
EventLoop Channel
EventLoopGroup
ThreadEventLoop
Channel
ThreadEventLoop
ThreadEventLoop
1 EventLoop
Channel
ThreadEventLoopChannel
Channel
EventLoop
•EventLoop 1 Channel
•ChannelHandler
EventLoop Channel
Netty
• 1 Thread Channel
ThreadLocal
Netty
•Channel
•ChannelFuture
•ChannelHandler & ChannelPipeline
•EventLoop
•ByteBuf
•Bootstrap
ByteBuf
•ByteBuf Java ByteBuffer
byte
•Java ByteBuffer 1
ByteBuf /
• ByteBuffer 1 ByteBuffer
( ) CompositeByteBuf
ByteBuf 1 ByteBuf
ByteBuffer
position limit
/ byte
/ byte
( ) byte
capacity
ByteBuf
readerIndex writerIndex
byte
byte
byte
capacity
ByteBuffer
ByteBuffer first = …
ByteBuffer second = …
var byteBuffer = ByteBuffer.allocate(
first.remaining(), second.remaining());
byteBuffer.put(first);
byteBuffer.put(second);
byteBuffer.flip();
ByteBuffer
ByteBuffer
contents1
ByteBuffer
contents2
ByteBuffer
contents1 contents2
(1) 

ByteBuffer
(2) ByteBuffer
ByteBuf
ByteBuf first = …
ByteBuf second = …
var byteBuf = Unpooled.compositeBuffer();
byteBuf.addComponents(true, first, second);
ByteBuf
CompositeByteBuf
ByteBuf
contents1
ByteBuf
contents2
1 ByteBuf
CompositeByteBuf
ByteBuf
or
channelRead
1. channelRead 2. channelRead 3. channelRead
channelReadComplete fireChannelRead
Netty
•Channel
•ChannelFuture
•ChannelHandler & ChannelPipeline
•EventLoop
•ByteBuf
•Bootstrap
Bootstrap
•
• or
•Bootstrap
• ( )
•Channel
•EventLoopGroup
• or
Bootstrap
• or
• ServerBootstrap
• Bootstrap
( )
• / Channel EventLoop
•
•TCP -
•UDP -
•SCTP -
•
•OIO - (Java I/O )
•NIO - (select epoll kqueue)
•epoll - (edge trigger/ Linux OS )
•kqueue - BSD OS
( )
•Channel
• /TCP/NIO : NioServerSocketChannel
• /TCP/NIO : NioSocketChannel
• /TCP/epoll : EpollServerSocketChannel
•EventLoop
• /NIO : NioEventLoopGroup x 2
• /OIO : OioEventLoopGroup x 1
• /epoll : EpollEventLoopGroup x 2
ServerBootstrap ( )
class EchoServer {
public static void main(String[] args) {
var parent = new NioEventLoopGroup();
var child = new NioEventLoopGroup();
var bootstrap = new ServerBootstrap();
bootstrap.group(parent, child)
.channel(NioServerSocketChannel.class)
.localAddress(8000)
.childHandler(new InitHandler());
ChannelFuture future = bootstrap.bind().sync();
future.channel().closeFuture().sync();
}
}
4. Netty
HTTP
SimpleChannelInboundHandler
class HttpEchoHandler extends
SimpleChannelInboundHandler<HttpRequest> {
@Override
protected void channelRead0(
ChannelHandlerContext ctx, HttpRequest req) {
//
}
}
HttpRequest
•uri
•method
•protocolVersion
•httpHeaders
•(POST
HttpPostRequestDecoder )
Initializer
class HttpEchoInitializer extends
ChannelInitializer<SocketChannel> {
@Override
public void initChannel(SocketChannel ch) {
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(new HttpServerCodec());
pipeline.addLast(new HttpObjectAggregator(65535));
pipeline.addLast(new ChunkedWriteHandler());
pipeline.addLast(new HttpEchoHandler());
}
}
• Netty
•HTTP
POST Body
•HTTP Real World HTTP
• 1 /
•
5.
• Netty OIO NIO
• Netty NIO
• Netty
/ /
(
)
• Spring WebFlux/Play-Akka
•Netty In Action
•Norman Maurer/Marvin Allen Wolfthal
•Manning 2016
•Java
•Scott Oaks
•Acroquest Technology/
•
• 2015
URL
•Netty Project
•http://netty.io/index.html
•https://github.com/netty/
netty

Contenu connexe

Tendances

冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safe
Kumazaki Hiroki
 

Tendances (20)

今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
 
コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safe
 
CNIふぉーびぎなーず
CNIふぉーびぎなーずCNIふぉーびぎなーず
CNIふぉーびぎなーず
 
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみたOPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
 
急速に進化を続けるCNIプラグイン Antrea
急速に進化を続けるCNIプラグイン Antrea 急速に進化を続けるCNIプラグイン Antrea
急速に進化を続けるCNIプラグイン Antrea
 
第二回CTF勉強会資料
第二回CTF勉強会資料第二回CTF勉強会資料
第二回CTF勉強会資料
 
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajpAt least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
 
BuildKitの概要と最近の機能
BuildKitの概要と最近の機能BuildKitの概要と最近の機能
BuildKitの概要と最近の機能
 
ZabbixのAPIを使って運用を楽しくする話
ZabbixのAPIを使って運用を楽しくする話ZabbixのAPIを使って運用を楽しくする話
ZabbixのAPIを使って運用を楽しくする話
 
Serf / Consul 入門 ~仕事を楽しくしよう~
Serf / Consul 入門 ~仕事を楽しくしよう~Serf / Consul 入門 ~仕事を楽しくしよう~
Serf / Consul 入門 ~仕事を楽しくしよう~
 
ネットワークコンフィグ分析ツール Batfish との付き合い方
ネットワークコンフィグ分析ツール Batfish との付き合い方ネットワークコンフィグ分析ツール Batfish との付き合い方
ネットワークコンフィグ分析ツール Batfish との付き合い方
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
NGINXセミナー(基本編)~いまさら聞けないNGINXコンフィグなど基本がわかる!
NGINXセミナー(基本編)~いまさら聞けないNGINXコンフィグなど基本がわかる!NGINXセミナー(基本編)~いまさら聞けないNGINXコンフィグなど基本がわかる!
NGINXセミナー(基本編)~いまさら聞けないNGINXコンフィグなど基本がわかる!
 
Spring Boot ユーザの方のための Quarkus 入門
Spring Boot ユーザの方のための Quarkus 入門Spring Boot ユーザの方のための Quarkus 入門
Spring Boot ユーザの方のための Quarkus 入門
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
 
오픈스택: 구석구석 파헤쳐보기
오픈스택: 구석구석 파헤쳐보기오픈스택: 구석구석 파헤쳐보기
오픈스택: 구석구석 파헤쳐보기
 

Similaire à JJUG CCC 2018 Spring - I-7 (俺が)はじめての Netty

What's new in Xamarin.iOS, by Miguel de Icaza
What's new in Xamarin.iOS, by Miguel de IcazaWhat's new in Xamarin.iOS, by Miguel de Icaza
What's new in Xamarin.iOS, by Miguel de Icaza
Xamarin
 

Similaire à JJUG CCC 2018 Spring - I-7 (俺が)はじめての Netty (20)

swift-nio のアーキテクチャーと RxHttpClient
swift-nio のアーキテクチャーと RxHttpClientswift-nio のアーキテクチャーと RxHttpClient
swift-nio のアーキテクチャーと RxHttpClient
 
Back to the future with Java 7 (Geekout June/2011)
Back to the future with Java 7 (Geekout June/2011)Back to the future with Java 7 (Geekout June/2011)
Back to the future with Java 7 (Geekout June/2011)
 
Qt Application Programming with C++ - Part 2
Qt Application Programming with C++ - Part 2Qt Application Programming with C++ - Part 2
Qt Application Programming with C++ - Part 2
 
Asynchronous, Event-driven Network Application Development with Netty
Asynchronous, Event-driven Network Application Development with NettyAsynchronous, Event-driven Network Application Development with Netty
Asynchronous, Event-driven Network Application Development with Netty
 
What Lies Beneath
What Lies BeneathWhat Lies Beneath
What Lies Beneath
 
Nodejs and WebSockets
Nodejs and WebSocketsNodejs and WebSockets
Nodejs and WebSockets
 
Java
JavaJava
Java
 
NIO and NIO2
NIO and NIO2NIO and NIO2
NIO and NIO2
 
Nio nio2
Nio nio2Nio nio2
Nio nio2
 
How to Connect SystemVerilog with Octave
How to Connect SystemVerilog with OctaveHow to Connect SystemVerilog with Octave
How to Connect SystemVerilog with Octave
 
55 new things in Java 7 - Devoxx France
55 new things in Java 7 - Devoxx France55 new things in Java 7 - Devoxx France
55 new things in Java 7 - Devoxx France
 
Rapid Network Application Development with Apache MINA
Rapid Network Application Development with Apache MINARapid Network Application Development with Apache MINA
Rapid Network Application Development with Apache MINA
 
Non blocking io with netty
Non blocking io with nettyNon blocking io with netty
Non blocking io with netty
 
What's new in Xamarin.iOS, by Miguel de Icaza
What's new in Xamarin.iOS, by Miguel de IcazaWhat's new in Xamarin.iOS, by Miguel de Icaza
What's new in Xamarin.iOS, by Miguel de Icaza
 
Cncf k8s_network_part1
Cncf k8s_network_part1Cncf k8s_network_part1
Cncf k8s_network_part1
 
jQuery Mobile & PhoneGap
jQuery Mobile & PhoneGapjQuery Mobile & PhoneGap
jQuery Mobile & PhoneGap
 
Adam Sitnik "State of the .NET Performance"
Adam Sitnik "State of the .NET Performance"Adam Sitnik "State of the .NET Performance"
Adam Sitnik "State of the .NET Performance"
 
State of the .Net Performance
State of the .Net PerformanceState of the .Net Performance
State of the .Net Performance
 
2015 bioinformatics bio_python
2015 bioinformatics bio_python2015 bioinformatics bio_python
2015 bioinformatics bio_python
 
Java NIO.2
Java NIO.2Java NIO.2
Java NIO.2
 

Plus de Shinya Mochida

gradle2.4のルールベースモデルコンフィギュレーション
gradle2.4のルールベースモデルコンフィギュレーションgradle2.4のルールベースモデルコンフィギュレーション
gradle2.4のルールベースモデルコンフィギュレーション
Shinya Mochida
 
Intelli j vs-eclipse-by-mike-neck #jbugj
Intelli j vs-eclipse-by-mike-neck #jbugjIntelli j vs-eclipse-by-mike-neck #jbugj
Intelli j vs-eclipse-by-mike-neck #jbugj
Shinya Mochida
 

Plus de Shinya Mochida (20)

サーバーサイド Kotlin のテストフレームワーク事情
サーバーサイド Kotlin のテストフレームワーク事情サーバーサイド Kotlin のテストフレームワーク事情
サーバーサイド Kotlin のテストフレームワーク事情
 
IntelliJ IDEA を完全にマスターする話
IntelliJ IDEA を完全にマスターする話IntelliJ IDEA を完全にマスターする話
IntelliJ IDEA を完全にマスターする話
 
クリーンアーキテクチャーを強制する方法を考えてみた(N番煎じ) #すえなみチャンス暑気払い
クリーンアーキテクチャーを強制する方法を考えてみた(N番煎じ) #すえなみチャンス暑気払いクリーンアーキテクチャーを強制する方法を考えてみた(N番煎じ) #すえなみチャンス暑気払い
クリーンアーキテクチャーを強制する方法を考えてみた(N番煎じ) #すえなみチャンス暑気払い
 
jjug-ccc 2019 Spring 発表資料 Collections Framework 入門 #jjug #jjug_ccc #ccc_c1
jjug-ccc 2019 Spring 発表資料 Collections Framework 入門 #jjug #jjug_ccc #ccc_c1jjug-ccc 2019 Spring 発表資料 Collections Framework 入門 #jjug #jjug_ccc #ccc_c1
jjug-ccc 2019 Spring 発表資料 Collections Framework 入門 #jjug #jjug_ccc #ccc_c1
 
swift-log について
swift-log についてswift-log について
swift-log について
 
Vim 入門
Vim 入門Vim 入門
Vim 入門
 
Java プログラマーのための Swift 入門 #中央線Meetup
Java プログラマーのための Swift 入門 #中央線MeetupJava プログラマーのための Swift 入門 #中央線Meetup
Java プログラマーのための Swift 入門 #中央線Meetup
 
JJUG CCC 2018 Spring LT Spring Boot アプリケーションの起動を速くする 108 の Tips #jjug_ccc #jjug
JJUG CCC 2018 Spring LT Spring Boot アプリケーションの起動を速くする 108 の Tips #jjug_ccc #jjugJJUG CCC 2018 Spring LT Spring Boot アプリケーションの起動を速くする 108 の Tips #jjug_ccc #jjug
JJUG CCC 2018 Spring LT Spring Boot アプリケーションの起動を速くする 108 の Tips #jjug_ccc #jjug
 
Spring Boot アプリケーションの起動をほんの少し気持ちだけ速くしてみた
Spring Boot アプリケーションの起動をほんの少し気持ちだけ速くしてみたSpring Boot アプリケーションの起動をほんの少し気持ちだけ速くしてみた
Spring Boot アプリケーションの起動をほんの少し気持ちだけ速くしてみた
 
Javaモジュールシステム雑なまとめ
Javaモジュールシステム雑なまとめJavaモジュールシステム雑なまとめ
Javaモジュールシステム雑なまとめ
 
Kotlin as an AltJS
Kotlin as an AltJSKotlin as an AltJS
Kotlin as an AltJS
 
JavaのStreamで学ぶ遅延処理実装パターン
JavaのStreamで学ぶ遅延処理実装パターンJavaのStreamで学ぶ遅延処理実装パターン
JavaのStreamで学ぶ遅延処理実装パターン
 
gradle2.4のルールベースモデルコンフィギュレーション
gradle2.4のルールベースモデルコンフィギュレーションgradle2.4のルールベースモデルコンフィギュレーション
gradle2.4のルールベースモデルコンフィギュレーション
 
On stream-lazy-computation
On stream-lazy-computationOn stream-lazy-computation
On stream-lazy-computation
 
Stream脳の作り方
Stream脳の作り方Stream脳の作り方
Stream脳の作り方
 
Java8のstreamをダラダラまとめてみる
Java8のstreamをダラダラまとめてみるJava8のstreamをダラダラまとめてみる
Java8のstreamをダラダラまとめてみる
 
ドラクエの金銭感覚
ドラクエの金銭感覚ドラクエの金銭感覚
ドラクエの金銭感覚
 
30億のデバイスで走るjavaを支えるjavaエコシステム
30億のデバイスで走るjavaを支えるjavaエコシステム30億のデバイスで走るjavaを支えるjavaエコシステム
30億のデバイスで走るjavaを支えるjavaエコシステム
 
Intelli j vs-eclipse-by-mike-neck #jbugj
Intelli j vs-eclipse-by-mike-neck #jbugjIntelli j vs-eclipse-by-mike-neck #jbugj
Intelli j vs-eclipse-by-mike-neck #jbugj
 
i-Phone unit-test
i-Phone unit-testi-Phone unit-test
i-Phone unit-test
 

Dernier

Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 

Dernier (20)

MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 

JJUG CCC 2018 Spring - I-7 (俺が)はじめての Netty