SlideShare a Scribd company logo
Contract first,
session types later
Marco Borst
::
vlsi -> java -> scala
Slava Schmidt
Play-Swagger plugin
@
Play-Swagger plugin
API-First single source of truth
code generation framework
=>
Specification
URLs
Verbs
Parameters
Security
Definitions Validations
Model
Test Data
Validations
Play Routes
Marshallers
Tests
Controllers
Security
Richardson Maturity Model
Level 0 - Wild Wild Web
Level 1 - Resources
Level 2 - HTTP Verbs
Level 3 - Hypermedia Controls
Level 2
of Richardson Maturity Model
Level 3
HATEOAS (Hypertext As The Engine Of Application State)
Specification
URLs
Verbs
Parameters
Definitions Mime-Types
Hypermedia
Controls
Server
Mime-Types
Hypermedia
Controls Client
Code
Client
Mime-Types
Hypermedia
Controls
Rules
Specification
Swagger RAML Apiary Blueprint
Spec formats
Swagger RAML Apiary Blueprint
Spec formats
Level 2 capable
Stateless REST communication
but
Stateful Resources
Stateful Clients
Stateful Sessions
Interacting state machines
Time
The arrows form a contract
between the server and its clients
Misbehaving state machines
Time
How to ensure right behaviour?
UBF - “who checks what goes over the wire”
UBF contract checker
Contract checker
CC
RS
AS
RS’
AS
RS’
AS’
S{HC} HC
HATEOAS
only allows us to check the
client behaviour
For the server we need
additional information
State
transitions
x-api-first-transitions:
packaged:
sending:
condition: Post is open
self:
sending:
moving:
condition: Accepted at the post
self:
moving:
delivering:
condition: Receiver is at home
lost:
self:
destroyed:
delivering:
delivered:
condition: Package undamaged
self:
lost:
moving:
State
transitions
UBF Session State
HATEOAS - State Locations
Contract checker
CC CC
RS
AS
RS’
AS
RS’
AS’
RS RS’ S{HC} HC
Contract checker is stateful
and
acts at runtime
Encode State => Type System
Runtime =>
Compile Time
Session types
session types do the same
for communication
as types do for data
http://groups.inf.ed.ac.uk/abcd/
Session types
codify structure
(communication, data)
and make it available to
programming tools
Scala Example
States
		sealed	trait	State	
		case	class	Packaged				(byWhom:							String)	extends	State	
		case	class	Sending						(whoAccepts:			String)	extends	State	
		case	class	Received				(whoDelivers:		String)	extends	State	
		case	class	Delivered			(toWhom:							String)	extends	State	
		case	class	Lost								(witness:						String)	extends	State	
		case	class	Moving						(tracking:					Long			)	extends	State	
		case	class	Destroyed			(when:			 	 	 				Long			)	extends	State
State Transitions
		sealed	abstract	class	~>[-A,+B]	
		implicit	case	object	GoToThePost			 	 	 	extends	~>[Packaged,Sending]	
		implicit	case	object	AcceptFromSender		 extends	~>[Sending,Moving]	
		implicit	case	object	BringToTheAddress		extends	~>[Moving,Received]	
		implicit	case	object	GiveToReceiver			 	extends	~>[Received,Delivered]	
		implicit	case	object	GetAngry			 	 	 	 	 	extends	~>[Moving,Destroyed]	
		implicit	case	object	DrinkAlcohol			 	 	extends	~>[Moving,Lost]	
		implicit	case	object	StopDrinking			 	 	extends	~>[Lost,Moving]
Resource
	case	class	Parcel[+S<:State](content:	Content,	receiver:	Receiver,	address:	Address)
Server part
			
def	server	=	
				In	{	p:	Parcel[Packaged]	=>	
						val	content	=	"Changed	by	server	"	+	p.content	
						val	result	=	Parcel[Sending](content,	p.receiver,	p.address)	
						val	stop	=	Stop("With	server	result:	"	+	result)	
						(stop,	result)	
				}
Client part
			
		def	client	=	{	
				val	parcel	=	Parcel[Packaged]("Content",	"Receiver",	"Address")	
				val	finish	=	Stop("With	client	result:	"	+	parcel)		
				Out(parcel,	finish)	
		}
Communication steps
	 	
		case	class	Stop(msg:	String)	
	 case	class	In	[R[S<:State],A<:State,B<:State,+C](recv:	R[A]	=>	(C,R[B]))	
(implicit	stateTransition:	~>[A,B])	
		case	class	Out[+R[S<:State],A<:State,+C](data:	R[A],	cont:	C)
Running Session
			
runSession(server,	client)
Session Runner
			
		trait	Session[S]	{	
				type	Self	=	S	
				type	Dual	
				type	DualOf[D]	=	Session[Self]	{	type	Dual	=	D	}	
				def	run	(self:	Self,	dual:	Dual):	Unit	
		}	
		
	def	runSession[AS,D:Session[AS]#DualOf](session:	AS,	dual:	D)	=	
				implicitly[Session[AS]#DualOf[D]].run(session,	dual)
Stop Dual
	 	
	implicit	object	StopDual	extends	Session[Stop]	{	
	 	 type	Dual	=	Stop	
	 	 def	run	(self:	Self,	dual:	Dual):	Unit	=	{}	
	 }
In Dual
	 	
		implicit	def	InDual[R[S<:State],RA<:State,RB<:State,C](implicit	cont:	Session[C])		
				=	new	Session[In[R,RA,RB,C]]	{	
					type	Dual	=	Out[R,RA,cont.Dual]	
					def	run(self:	Self,	dual:	Dual)	=	cont.run(self.recv(dual.data)._1,	dual.cont)	
			}
Type of In Dual
	 	
		implicit	def	InDual[R[S<:State],RA<:State,RB<:State,C](implicit	cont:	Session[C])		
				=	new	Session[In[R,RA,RB,C]]	{	
					type	Dual	=	Out[R,RA,cont.Dual]	
					def	run(self:	Self,	dual:	Dual)	=	cont.run(self.recv(dual.data)._1,	dual.cont)	
			}
Out Dual
			
	implicit	def	OutDual[R[S<:State],RA<:State,RB<:State,C](implicit	cont:	Session[C])		
			=	new	Session[Out[R,RA,C]]	{	
				type	Dual	=	In[R,RA,RB,cont.Dual]	
				def	run(self:	Self,	dual:	Dual)	=	cont.run(self.cont,	dual.recv(self.data)._1)	
		}
Source Code
http://bit.ly/1VnWX2R
Run
scala>	:load	SessionTypes.scala	
Loading	SessionTypes.scala...	
defined	module	SessionTypes	
scala>	SessionTypes.doRun	
Client	results:	Parcel(First,Receiver,Address)	and	
Parcel(Second,Receiver,Address)	
Server	result:	Parcel(Changed	by	server	First,Receiver,Address)	
scala>
Close the post
		sealed	abstract	class	~>[-A,+B]	
		//implicit	case	object	GoToThePost			 	 	 	extends	~>[Packaged,Sending]	
		implicit	case	object	AcceptFromSender		 extends	~>[Sending,Moving]	
		implicit	case	object	BringToTheAddress		extends	~>[Moving,Received]	
		implicit	case	object	GiveToReceiver			 	extends	~>[Received,Delivered]	
		implicit	case	object	GetAngry			 	 	 	 	 	extends	~>[Moving,Destroyed]	
		implicit	case	object	DrinkAlcohol			 	 	extends	~>[Moving,Lost]	
		implicit	case	object	StopDrinking			 	 	extends	~>[Lost,Moving]
Run
scala>	:load	SessionTypes.scala	
Loading	SessionTypes.scala...	
<console>:75:	error:	state	transition	from	SessionTypes.Packaged	to	
SessionTypes.Sending	is	not	allowed	
											In	{	p:	Parcel[Packaged]	=>	
														^	
scala>
Avoid the post
			
def	server	=	
				In	{	p:	Parcel[Packaged]	=>	
						val	content	=	"Changed	by	server	"	+	p.content	
						val	result	=	Parcel[Moving](content,	p.receiver,	p.address)	
						val	stop	=	Stop("With	server	result:	"	+	result)	
						(stop,	result)	
				}
Run
scala>	:load	SessionTypes.scala	
Loading	SessionTypes.scala...	
<console>:75:	error:	state	transition	from	SessionTypes.Packaged	to	
SessionTypes.Moving	is	not	allowed	
											In	{	p:	Parcel[Packaged]	=>	
														^	
scala>
Wrong initial state
			
def	server	=	
				In	{	p:	Parcel[Sending]	=>	
						val	content	=	"Changed	by	server	"	+	p.content	
						val	result	=	Parcel[Moving](content,	p.receiver,	p.address)	
						val	stop	=	Stop("With	server	result:	"	+	result)	
						(stop,	result)	
				}
Run
scala>	:load	SessionTypes.scala	
Loading	SessionTypes.scala...	
<console>:110:	error:	could	not	find	implicit	value	for	evidence	
parameter	of	type	
SessionTypes.Session[SessionTypes.In[SessionTypes.Parcel,SessionTypes
.Sended,SessionTypes.Moving,SessionTypes.Stop]]{type	Dual	=	
SessionTypes.Out[SessionTypes.Parcel,SessionTypes.Packaged,SessionTyp
es.Stop]}	
									def	run	=	runSession(server,	client)	
																													^	
scala>
Misaligned step
			
def	server	=	
				In	{	p:	Parcel[Sending]	=>	
						val	content	=	"Changed	by	server	"	+	p.content	
						val	result	=	Parcel[Moving](content,	p.receiver,	p.address)	
						val	stop	=	Stop("With	server	result:	"	+	result)	
						(Out(result,	stop),	result)	
				}
Run
scala>	:load	SessionTypes.scala	
Loading	SessionTypes.scala...	
<console>:110:	error:	could	not	find	implicit	value	for	evidence	
parameter	of	type	
SessionTypes.Session[SessionTypes.In[SessionTypes.Parcel,SessionTypes
.Sended,SessionTypes.Moving,SessionTypes.Out[SessionTypes.Parcel,Sess
ionTypes.Moving,SessionTypes.Stop]]]{type	Dual	=	
SessionTypes.Out[SessionTypes.Parcel,SessionTypes.Packaged,SessionTyp
es.Stop]}	
									def	run	=	runSession(server,	client)	
																													^	
scala>
?
Session Types Primitives
Sending
Receiving
Sequence
Choice
Recursion
Oops….
Session Types Primitives
Sending
Receiving
Sequence
Choice
Recursion
Session
Types
REST
Contract first, session types never?
• No API Specification standard is about REST
• REST “allows” for client-side contract checking
• Session Types don’t fit RESTful communications
Questions ?
Thank you!

More Related Content

What's hot

API Security and Management Best Practices
API Security and Management Best PracticesAPI Security and Management Best Practices
API Security and Management Best Practices
CA API Management
 
Checkmarx meetup API Security - API Security in depth - Inon Shkedy
Checkmarx meetup API Security - API Security in depth - Inon ShkedyCheckmarx meetup API Security - API Security in depth - Inon Shkedy
Checkmarx meetup API Security - API Security in depth - Inon Shkedy
Adar Weidman
 
Microservices with Swagger, Flask and Docker
Microservices with Swagger, Flask and DockerMicroservices with Swagger, Flask and Docker
Microservices with Swagger, Flask and Docker
Dhilipsiva DS
 
Mobile Application Security Testing (Static Code Analysis) of Android App
Mobile Application Security Testing (Static Code Analysis) of Android AppMobile Application Security Testing (Static Code Analysis) of Android App
Mobile Application Security Testing (Static Code Analysis) of Android App
Abhilash Venkata
 
Protecting Your APIs Against Attack & Hijack
Protecting Your APIs Against Attack & Hijack Protecting Your APIs Against Attack & Hijack
Protecting Your APIs Against Attack & Hijack
CA API Management
 
Securty Testing For RESTful Applications
Securty Testing For RESTful ApplicationsSecurty Testing For RESTful Applications
Securty Testing For RESTful Applications
Source Conference
 
Guide on scaling web app
Guide on scaling web appGuide on scaling web app
Guide on scaling web app
Ashok Pundit
 
Using & Abusing APIs: An Examination of the API Attack Surface
Using & Abusing APIs: An Examination of the API Attack SurfaceUsing & Abusing APIs: An Examination of the API Attack Surface
Using & Abusing APIs: An Examination of the API Attack Surface
CA API Management
 
WEBINAR: Positive Security for APIs: What it is and why you need it!
 WEBINAR: Positive Security for APIs: What it is and why you need it! WEBINAR: Positive Security for APIs: What it is and why you need it!
WEBINAR: Positive Security for APIs: What it is and why you need it!
42Crunch
 
API Test Automation
API Test Automation API Test Automation
API Test Automation
SQALab
 
APISecurity_OWASP_MitigationGuide
APISecurity_OWASP_MitigationGuide APISecurity_OWASP_MitigationGuide
APISecurity_OWASP_MitigationGuide
Isabelle Mauny
 
Are You Properly Using JWTs?
Are You Properly Using JWTs?Are You Properly Using JWTs?
Are You Properly Using JWTs?
42Crunch
 
Best Practices You Must Apply to Secure Your APIs - Scott Morrison, SVP & Dis...
Best Practices You Must Apply to Secure Your APIs - Scott Morrison, SVP & Dis...Best Practices You Must Apply to Secure Your APIs - Scott Morrison, SVP & Dis...
Best Practices You Must Apply to Secure Your APIs - Scott Morrison, SVP & Dis...
CA API Management
 
API Security & Federation Patterns - Francois Lascelles, Chief Architect, Lay...
API Security & Federation Patterns - Francois Lascelles, Chief Architect, Lay...API Security & Federation Patterns - Francois Lascelles, Chief Architect, Lay...
API Security & Federation Patterns - Francois Lascelles, Chief Architect, Lay...
CA API Management
 
OWASP API Security Top 10 - API World
OWASP API Security Top 10 - API WorldOWASP API Security Top 10 - API World
OWASP API Security Top 10 - API World
42Crunch
 
Nullcon Goa 2016 - Automated Mobile Application Security Testing with Mobile ...
Nullcon Goa 2016 - Automated Mobile Application Security Testing with Mobile ...Nullcon Goa 2016 - Automated Mobile Application Security Testing with Mobile ...
Nullcon Goa 2016 - Automated Mobile Application Security Testing with Mobile ...
Ajin Abraham
 
Security enforcement of Java Microservices with Apiman & Keycloak
Security enforcement of Java Microservices with Apiman & KeycloakSecurity enforcement of Java Microservices with Apiman & Keycloak
Security enforcement of Java Microservices with Apiman & Keycloak
Charles Moulliard
 
Best Practices in Building an API Security Ecosystem
Best Practices in Building an API Security EcosystemBest Practices in Building an API Security Ecosystem
Best Practices in Building an API Security Ecosystem
Prabath Siriwardena
 
apidays LIVE Hong Kong - Orchestrating APIs at Scale by Hieu Nguyen Nhu
apidays LIVE Hong Kong - Orchestrating APIs at Scale by Hieu Nguyen Nhuapidays LIVE Hong Kong - Orchestrating APIs at Scale by Hieu Nguyen Nhu
apidays LIVE Hong Kong - Orchestrating APIs at Scale by Hieu Nguyen Nhu
apidays
 
Realtime web experience with signalR
Realtime web experience with signalRRealtime web experience with signalR
Realtime web experience with signalR
Ran Wahle
 

What's hot (20)

API Security and Management Best Practices
API Security and Management Best PracticesAPI Security and Management Best Practices
API Security and Management Best Practices
 
Checkmarx meetup API Security - API Security in depth - Inon Shkedy
Checkmarx meetup API Security - API Security in depth - Inon ShkedyCheckmarx meetup API Security - API Security in depth - Inon Shkedy
Checkmarx meetup API Security - API Security in depth - Inon Shkedy
 
Microservices with Swagger, Flask and Docker
Microservices with Swagger, Flask and DockerMicroservices with Swagger, Flask and Docker
Microservices with Swagger, Flask and Docker
 
Mobile Application Security Testing (Static Code Analysis) of Android App
Mobile Application Security Testing (Static Code Analysis) of Android AppMobile Application Security Testing (Static Code Analysis) of Android App
Mobile Application Security Testing (Static Code Analysis) of Android App
 
Protecting Your APIs Against Attack & Hijack
Protecting Your APIs Against Attack & Hijack Protecting Your APIs Against Attack & Hijack
Protecting Your APIs Against Attack & Hijack
 
Securty Testing For RESTful Applications
Securty Testing For RESTful ApplicationsSecurty Testing For RESTful Applications
Securty Testing For RESTful Applications
 
Guide on scaling web app
Guide on scaling web appGuide on scaling web app
Guide on scaling web app
 
Using & Abusing APIs: An Examination of the API Attack Surface
Using & Abusing APIs: An Examination of the API Attack SurfaceUsing & Abusing APIs: An Examination of the API Attack Surface
Using & Abusing APIs: An Examination of the API Attack Surface
 
WEBINAR: Positive Security for APIs: What it is and why you need it!
 WEBINAR: Positive Security for APIs: What it is and why you need it! WEBINAR: Positive Security for APIs: What it is and why you need it!
WEBINAR: Positive Security for APIs: What it is and why you need it!
 
API Test Automation
API Test Automation API Test Automation
API Test Automation
 
APISecurity_OWASP_MitigationGuide
APISecurity_OWASP_MitigationGuide APISecurity_OWASP_MitigationGuide
APISecurity_OWASP_MitigationGuide
 
Are You Properly Using JWTs?
Are You Properly Using JWTs?Are You Properly Using JWTs?
Are You Properly Using JWTs?
 
Best Practices You Must Apply to Secure Your APIs - Scott Morrison, SVP & Dis...
Best Practices You Must Apply to Secure Your APIs - Scott Morrison, SVP & Dis...Best Practices You Must Apply to Secure Your APIs - Scott Morrison, SVP & Dis...
Best Practices You Must Apply to Secure Your APIs - Scott Morrison, SVP & Dis...
 
API Security & Federation Patterns - Francois Lascelles, Chief Architect, Lay...
API Security & Federation Patterns - Francois Lascelles, Chief Architect, Lay...API Security & Federation Patterns - Francois Lascelles, Chief Architect, Lay...
API Security & Federation Patterns - Francois Lascelles, Chief Architect, Lay...
 
OWASP API Security Top 10 - API World
OWASP API Security Top 10 - API WorldOWASP API Security Top 10 - API World
OWASP API Security Top 10 - API World
 
Nullcon Goa 2016 - Automated Mobile Application Security Testing with Mobile ...
Nullcon Goa 2016 - Automated Mobile Application Security Testing with Mobile ...Nullcon Goa 2016 - Automated Mobile Application Security Testing with Mobile ...
Nullcon Goa 2016 - Automated Mobile Application Security Testing with Mobile ...
 
Security enforcement of Java Microservices with Apiman & Keycloak
Security enforcement of Java Microservices with Apiman & KeycloakSecurity enforcement of Java Microservices with Apiman & Keycloak
Security enforcement of Java Microservices with Apiman & Keycloak
 
Best Practices in Building an API Security Ecosystem
Best Practices in Building an API Security EcosystemBest Practices in Building an API Security Ecosystem
Best Practices in Building an API Security Ecosystem
 
apidays LIVE Hong Kong - Orchestrating APIs at Scale by Hieu Nguyen Nhu
apidays LIVE Hong Kong - Orchestrating APIs at Scale by Hieu Nguyen Nhuapidays LIVE Hong Kong - Orchestrating APIs at Scale by Hieu Nguyen Nhu
apidays LIVE Hong Kong - Orchestrating APIs at Scale by Hieu Nguyen Nhu
 
Realtime web experience with signalR
Realtime web experience with signalRRealtime web experience with signalR
Realtime web experience with signalR
 

Similar to Contract first, session types later?

Apidays Paris 2023 - Securing Microservice-based APIs, Michal Trojanowski, Cu...
Apidays Paris 2023 - Securing Microservice-based APIs, Michal Trojanowski, Cu...Apidays Paris 2023 - Securing Microservice-based APIs, Michal Trojanowski, Cu...
Apidays Paris 2023 - Securing Microservice-based APIs, Michal Trojanowski, Cu...
apidays
 
Web application
Web applicationWeb application
Web application
Eve_Srithong
 
WSO2Con USA 2014 - Identity Server Tutorial
WSO2Con USA 2014 - Identity Server TutorialWSO2Con USA 2014 - Identity Server Tutorial
WSO2Con USA 2014 - Identity Server Tutorial
Prabath Siriwardena
 
[Spring Camp 2018] 11번가 Spring Cloud 기반 MSA로의 전환 : 지난 1년간의 이야기
[Spring Camp 2018] 11번가 Spring Cloud 기반 MSA로의 전환 : 지난 1년간의 이야기[Spring Camp 2018] 11번가 Spring Cloud 기반 MSA로의 전환 : 지난 1년간의 이야기
[Spring Camp 2018] 11번가 Spring Cloud 기반 MSA로의 전환 : 지난 1년간의 이야기
YongSung Yoon
 
Real Time Web with SignalR
Real Time Web with SignalRReal Time Web with SignalR
Real Time Web with SignalR
Bilal Amjad
 
Intro to signalR
Intro to signalRIntro to signalR
Intro to signalR
Mindfire Solutions
 
Xamarin Workshop Noob to Master – Week 5
Xamarin Workshop Noob to Master – Week 5Xamarin Workshop Noob to Master – Week 5
Xamarin Workshop Noob to Master – Week 5
Charlin Agramonte
 
re:Invent ARC307 - Serverless architectural patterns and best practices.pdf
re:Invent ARC307 - Serverless architectural patterns and best practices.pdfre:Invent ARC307 - Serverless architectural patterns and best practices.pdf
re:Invent ARC307 - Serverless architectural patterns and best practices.pdf
Heitor Lessa
 
Dive in burpsuite
Dive in burpsuiteDive in burpsuite
Dive in burpsuite
Nadim Kadiwala
 
Access control patterns
Access control patterns Access control patterns
Access control patterns WSO2
 
RoR 101: Session 3
RoR 101: Session 3RoR 101: Session 3
RoR 101: Session 3
Rory Gianni
 
APIs enabling IoT
APIs enabling IoT APIs enabling IoT
APIs enabling IoT
Harish Vadada
 
Building Realtime Web Applications With ASP.NET SignalR
Building Realtime Web Applications With ASP.NET SignalRBuilding Realtime Web Applications With ASP.NET SignalR
Building Realtime Web Applications With ASP.NET SignalRShravan Kumar Kasagoni
 
OpenFabrics Interfaces introduction
OpenFabrics Interfaces introductionOpenFabrics Interfaces introduction
OpenFabrics Interfaces introduction
ofiwg
 
SignalR or gRPC: Choosing the Right Technology for Real-Time Communication in...
SignalR or gRPC: Choosing the Right Technology for Real-Time Communication in...SignalR or gRPC: Choosing the Right Technology for Real-Time Communication in...
SignalR or gRPC: Choosing the Right Technology for Real-Time Communication in...
Tien Nguyen
 
Beginning Microservices with .NET & RabbitMQ
Beginning Microservices with .NET & RabbitMQBeginning Microservices with .NET & RabbitMQ
Beginning Microservices with .NET & RabbitMQ
Paul Mooney
 
DevDay: Developer Updates: Visual Studio Code, Java 11 and OpenAPI (oh my), L...
DevDay: Developer Updates: Visual Studio Code, Java 11 and OpenAPI (oh my), L...DevDay: Developer Updates: Visual Studio Code, Java 11 and OpenAPI (oh my), L...
DevDay: Developer Updates: Visual Studio Code, Java 11 and OpenAPI (oh my), L...
R3
 
Distributed objects
Distributed objectsDistributed objects
Distributed objects
Sharafat Husen
 
Application Security Workshop
Application Security Workshop Application Security Workshop
Application Security Workshop
Priyanka Aash
 

Similar to Contract first, session types later? (20)

Apidays Paris 2023 - Securing Microservice-based APIs, Michal Trojanowski, Cu...
Apidays Paris 2023 - Securing Microservice-based APIs, Michal Trojanowski, Cu...Apidays Paris 2023 - Securing Microservice-based APIs, Michal Trojanowski, Cu...
Apidays Paris 2023 - Securing Microservice-based APIs, Michal Trojanowski, Cu...
 
Web application
Web applicationWeb application
Web application
 
WSO2Con USA 2014 - Identity Server Tutorial
WSO2Con USA 2014 - Identity Server TutorialWSO2Con USA 2014 - Identity Server Tutorial
WSO2Con USA 2014 - Identity Server Tutorial
 
[Spring Camp 2018] 11번가 Spring Cloud 기반 MSA로의 전환 : 지난 1년간의 이야기
[Spring Camp 2018] 11번가 Spring Cloud 기반 MSA로의 전환 : 지난 1년간의 이야기[Spring Camp 2018] 11번가 Spring Cloud 기반 MSA로의 전환 : 지난 1년간의 이야기
[Spring Camp 2018] 11번가 Spring Cloud 기반 MSA로의 전환 : 지난 1년간의 이야기
 
Real Time Web with SignalR
Real Time Web with SignalRReal Time Web with SignalR
Real Time Web with SignalR
 
Intro to signalR
Intro to signalRIntro to signalR
Intro to signalR
 
Xamarin Workshop Noob to Master – Week 5
Xamarin Workshop Noob to Master – Week 5Xamarin Workshop Noob to Master – Week 5
Xamarin Workshop Noob to Master – Week 5
 
re:Invent ARC307 - Serverless architectural patterns and best practices.pdf
re:Invent ARC307 - Serverless architectural patterns and best practices.pdfre:Invent ARC307 - Serverless architectural patterns and best practices.pdf
re:Invent ARC307 - Serverless architectural patterns and best practices.pdf
 
Dive in burpsuite
Dive in burpsuiteDive in burpsuite
Dive in burpsuite
 
Access control patterns
Access control patterns Access control patterns
Access control patterns
 
RoR 101: Session 3
RoR 101: Session 3RoR 101: Session 3
RoR 101: Session 3
 
APIs enabling IoT
APIs enabling IoT APIs enabling IoT
APIs enabling IoT
 
Building Realtime Web Applications With ASP.NET SignalR
Building Realtime Web Applications With ASP.NET SignalRBuilding Realtime Web Applications With ASP.NET SignalR
Building Realtime Web Applications With ASP.NET SignalR
 
OpenFabrics Interfaces introduction
OpenFabrics Interfaces introductionOpenFabrics Interfaces introduction
OpenFabrics Interfaces introduction
 
SignalR or gRPC: Choosing the Right Technology for Real-Time Communication in...
SignalR or gRPC: Choosing the Right Technology for Real-Time Communication in...SignalR or gRPC: Choosing the Right Technology for Real-Time Communication in...
SignalR or gRPC: Choosing the Right Technology for Real-Time Communication in...
 
Beginning Microservices with .NET & RabbitMQ
Beginning Microservices with .NET & RabbitMQBeginning Microservices with .NET & RabbitMQ
Beginning Microservices with .NET & RabbitMQ
 
DevDay: Developer Updates: Visual Studio Code, Java 11 and OpenAPI (oh my), L...
DevDay: Developer Updates: Visual Studio Code, Java 11 and OpenAPI (oh my), L...DevDay: Developer Updates: Visual Studio Code, Java 11 and OpenAPI (oh my), L...
DevDay: Developer Updates: Visual Studio Code, Java 11 and OpenAPI (oh my), L...
 
Distributed objects
Distributed objectsDistributed objects
Distributed objects
 
Real-time ASP.NET with SignalR
Real-time ASP.NET with SignalRReal-time ASP.NET with SignalR
Real-time ASP.NET with SignalR
 
Application Security Workshop
Application Security Workshop Application Security Workshop
Application Security Workshop
 

Recently uploaded

APIs for Browser Automation (MoT Meetup 2024)
APIs for Browser Automation (MoT Meetup 2024)APIs for Browser Automation (MoT Meetup 2024)
APIs for Browser Automation (MoT Meetup 2024)
Boni García
 
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Globus
 
Prosigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology SolutionsProsigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology Solutions
Prosigns
 
Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604
Fermin Galan
 
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Shahin Sheidaei
 
How to Position Your Globus Data Portal for Success Ten Good Practices
How to Position Your Globus Data Portal for Success Ten Good PracticesHow to Position Your Globus Data Portal for Success Ten Good Practices
How to Position Your Globus Data Portal for Success Ten Good Practices
Globus
 
GOING AOT WITH GRAALVM FOR SPRING BOOT (SPRING IO)
GOING AOT WITH GRAALVM FOR  SPRING BOOT (SPRING IO)GOING AOT WITH GRAALVM FOR  SPRING BOOT (SPRING IO)
GOING AOT WITH GRAALVM FOR SPRING BOOT (SPRING IO)
Alina Yurenko
 
2024 RoOUG Security model for the cloud.pptx
2024 RoOUG Security model for the cloud.pptx2024 RoOUG Security model for the cloud.pptx
2024 RoOUG Security model for the cloud.pptx
Georgi Kodinov
 
Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024
Globus
 
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Globus
 
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of CodeA Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
Aftab Hussain
 
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing SuiteAI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
Google
 
Atelier - Innover avec l’IA Générative et les graphes de connaissances
Atelier - Innover avec l’IA Générative et les graphes de connaissancesAtelier - Innover avec l’IA Générative et les graphes de connaissances
Atelier - Innover avec l’IA Générative et les graphes de connaissances
Neo4j
 
May Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdfMay Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdf
Adele Miller
 
Graspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code AnalysisGraspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code Analysis
Aftab Hussain
 
How Recreation Management Software Can Streamline Your Operations.pptx
How Recreation Management Software Can Streamline Your Operations.pptxHow Recreation Management Software Can Streamline Your Operations.pptx
How Recreation Management Software Can Streamline Your Operations.pptx
wottaspaceseo
 
GlobusWorld 2024 Opening Keynote session
GlobusWorld 2024 Opening Keynote sessionGlobusWorld 2024 Opening Keynote session
GlobusWorld 2024 Opening Keynote session
Globus
 
First Steps with Globus Compute Multi-User Endpoints
First Steps with Globus Compute Multi-User EndpointsFirst Steps with Globus Compute Multi-User Endpoints
First Steps with Globus Compute Multi-User Endpoints
Globus
 
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoamOpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
takuyayamamoto1800
 
Navigating the Metaverse: A Journey into Virtual Evolution"
Navigating the Metaverse: A Journey into Virtual Evolution"Navigating the Metaverse: A Journey into Virtual Evolution"
Navigating the Metaverse: A Journey into Virtual Evolution"
Donna Lenk
 

Recently uploaded (20)

APIs for Browser Automation (MoT Meetup 2024)
APIs for Browser Automation (MoT Meetup 2024)APIs for Browser Automation (MoT Meetup 2024)
APIs for Browser Automation (MoT Meetup 2024)
 
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
 
Prosigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology SolutionsProsigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology Solutions
 
Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604
 
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
 
How to Position Your Globus Data Portal for Success Ten Good Practices
How to Position Your Globus Data Portal for Success Ten Good PracticesHow to Position Your Globus Data Portal for Success Ten Good Practices
How to Position Your Globus Data Portal for Success Ten Good Practices
 
GOING AOT WITH GRAALVM FOR SPRING BOOT (SPRING IO)
GOING AOT WITH GRAALVM FOR  SPRING BOOT (SPRING IO)GOING AOT WITH GRAALVM FOR  SPRING BOOT (SPRING IO)
GOING AOT WITH GRAALVM FOR SPRING BOOT (SPRING IO)
 
2024 RoOUG Security model for the cloud.pptx
2024 RoOUG Security model for the cloud.pptx2024 RoOUG Security model for the cloud.pptx
2024 RoOUG Security model for the cloud.pptx
 
Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024
 
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
 
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of CodeA Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
 
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing SuiteAI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
 
Atelier - Innover avec l’IA Générative et les graphes de connaissances
Atelier - Innover avec l’IA Générative et les graphes de connaissancesAtelier - Innover avec l’IA Générative et les graphes de connaissances
Atelier - Innover avec l’IA Générative et les graphes de connaissances
 
May Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdfMay Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdf
 
Graspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code AnalysisGraspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code Analysis
 
How Recreation Management Software Can Streamline Your Operations.pptx
How Recreation Management Software Can Streamline Your Operations.pptxHow Recreation Management Software Can Streamline Your Operations.pptx
How Recreation Management Software Can Streamline Your Operations.pptx
 
GlobusWorld 2024 Opening Keynote session
GlobusWorld 2024 Opening Keynote sessionGlobusWorld 2024 Opening Keynote session
GlobusWorld 2024 Opening Keynote session
 
First Steps with Globus Compute Multi-User Endpoints
First Steps with Globus Compute Multi-User EndpointsFirst Steps with Globus Compute Multi-User Endpoints
First Steps with Globus Compute Multi-User Endpoints
 
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoamOpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
 
Navigating the Metaverse: A Journey into Virtual Evolution"
Navigating the Metaverse: A Journey into Virtual Evolution"Navigating the Metaverse: A Journey into Virtual Evolution"
Navigating the Metaverse: A Journey into Virtual Evolution"
 

Contract first, session types later?