SlideShare a Scribd company logo
1 of 78
Download to read offline
garth.gilmour@instil.co
@GarthGilmour
Limerick KUG - February 2019
© Instil Software 2018
Kotlin - The Whole Damn Family
https://bitbucket.org/GarthGilmour/limerick-kug-feb-2019
Develop	
Consult	
Train
About Instil
We’ve bought into Kotlin in a big way
About Instil
We held a workshop at the conference
•  React Web App with Kotlin on
Server & Browser
About Instil
Excellent interoperability
•  Call legacy Java code easily
•  Make calls into Kotlin from Java
Really clear, yet concise syntax
•  Reduces your codebase by 1/3+
Beloved by frameworks
•  First class language on Android
•  Mainstream language for Spring via
the Spring Initializr and Spring Fu
•  New language for the Gradle DSL
•  Kotlin specific frameworks emerging
•  Notably Arrow and Ktor
Why Kotlin? Null	Safety	
String	Templates	
Default	parameters	
Extensions	
Free	Functions	
Coroutines	
Single	Expression	
Functions	
Reified	generics	
Data	classes	and	
Properties	
Type	Inference	
Smart	Casts	
Operator	
overloading
C	
C++	
Java	
C#	
Pascal	
Delphi	
Basic	
Visual	Basic	
VB	.NET	
Perl	
F#	
Java	
Script	
CoffeeScript	
1990
2000
2010
TypeScript	
Jython	
JRuby	
PowerShell	
Dart	
Scala	
Clojure	
Kotlin	
Groovy	
Go	
Objective	C	
Shell	
Scripting	
Swift	
Python	
Ruby
Java is a legacy language!
But in Java 11…
Kotlin has it today!!
Scala had it
years ago!!
No one gives
a **** about
modules!!
Kotlin was originally for the desktop and server
•  As JetBrains own internal language
Then it exploded amongst the Android community
•  This is still where it is most commonly found
Now its going further
•  Kotlin Native builds apps to run outside the VM
•  Kotlin JS is transpiled to run inside the browser
Kotlin On Other Platforms
Let the buyer beware!
•  Everything you see is the
result of my own hacking
•  I am very much still in the
learning stages myself…
A Warning…
© Instil Software 2018
•  Building Native Applications
Part 1a
Kotlin Native compiles Kotlin code to native binaries
•  It produces executables that run without a virtual machine
The binary output is not portable, but the source is
•  The compiler can compile the same source to multiple outputs
•  The source can be placed into a multiplatform project
Introducing Kotlin Native
Kotlin	Native	
Compiler	
LLVM	Source LLVM
IR
Native
Binary
Supported platforms include,
•  iOS (arm32, arm64, emulator x86_64)
•  MacOS (x86_64)
•  Android (arm32, arm64)
•  Windows (mingw x86_64)
•  Linux (x86_64, arm32, MIPS, MIPS little endian)
•  WebAssembly (wasm32)
There is interop with C, Objective-C and Swift
•  Kotlin code can call into any of these and vice versa
•  Tools like ‘cinterop’ generate Kotlin declarations
based on C declarations found in header files
Introducing Kotlin Native
Common things such as Kotlin.io aren’t available
You can use POSIX and interop to achieve functionality or
use other multiplatform libraries
Introducing Kotlin Native
import	kotlinx.cinterop.*	
import	platform.posix.*	
import	kotlinx.io.*
Let’s Get Crazy
Anyone Ever Heard of Pthreads?
From the main thread we wish to start two Pthreads
•  With the names ‘Thread No1’ and ‘Thread No2’
•  This can be accomplished via ‘pthread_create’
Each thread will print out twenty messages
•  In turn each message will be divided into three parts
We want the parts of each message to be atomic
•  We do this by creating a mutex and passing it to the threads
•  Each thread will:
•  Acquire the mutex via ‘pthread_mutex_lock’
•  Print the three parts of the message and releases it
•  Release the mutex via ‘pthread_mutex_unlock’
The main thread will waits for the Pthreads
•  This can be accomplished via ‘pthread_join’
A Demo of Pthreads
A Demo of Pthreads
Pthread	Thread	No1	message	1	part	A	
Pthread	Thread	No1	message	1	part	B	
Pthread	Thread	No1	message	1	part	C	
Pthread	Thread	No2	message	1	part	A	
Pthread	Thread	No2	message	1	part	B	
Pthread	Thread	No2	message	1	part	C	
Pthread	Thread	No1	message	2	part	A	
Pthread	Thread	No1	message	2	part	B	
Pthread	Thread	No1	message	2	part	C	
Pthread	Thread	No2	message	2	part	A	
Pthread	Thread	No2	message	2	part	B	
Pthread	Thread	No2	message	2	part	C	
Pthread	Thread	No1	message	3	part	A	
Pthread	Thread	No1	message	3	part	B	
Pthread	Thread	No1	message	3	part	C	
Pthread	Thread	No2	message	3	part	A	
Pthread	Thread	No2	message	3	part	B	
Pthread	Thread	No2	message	3	part	C	
...	
...	
…	
Thread 1 holding mutex
Thread 2 holding mutex
Thread 1 holding mutex
Thread 2 holding mutex
Thread 1 holding mutex
Thread 2 holding mutex
Creating a Project in Clion (with Kotlin Native Plugin)
plugins	{	
				kotlin("multiplatform")	version	"1.3.21"	
}	
	
repositories	{	
				mavenCentral()	
}	
	
kotlin	{	
				macosX64("KotlinNativePThreads")	{	
								binaries	{	
												executable("KotlinNativePThreadsApp")	{	
																entryPoint	=	"limerick.kug.main"	
												}	
								}	
				}	
}	
build.gradle.kts
The Gradle Build File
------------------------------------------------------------	
All	tasks	runnable	from	root	project	
------------------------------------------------------------	
	
Build	tasks	
-----------	
assemble	-	Assembles	the	outputs	of	this	project.	
build	-	Assembles	and	tests	this	project.	
buildDependents	-	Assembles	and	tests	this	project	and	all	projects	that	depend	on	it.	
buildNeeded	-	Assembles	and	tests	this	project	and	all	projects	it	depends	on.	
clean	-	Deletes	the	build	directory.	
	
	
Run	tasks	
---------	
runKotlinNativePThreadsAppDebugExecutableKotlinNativePThreads	-	Executes	Kotlin/Native	
executable	KotlinNativePThreadsAppDebugExecutable	for	target	KotlinNativePThreads	
runKotlinNativePThreadsAppReleaseExecutableKotlinNativePThreads	-	Executes	Kotlin/Native	
executable	KotlinNativePThreadsAppReleaseExecutable	for	target	KotlinNativePThreads	
	
Verification	tasks	
------------------	
check	-	Runs	all	checks.	
KotlinNativePThreadsTest	-	Executes	Kotlin/Native	unit	tests	for	target	
KotlinNativePThreads.	
	
	
Some Tasks Available via the Build File
package	limerick.kug	
	
import	kotlinx.cinterop.*	
import	platform.posix.*	
	
fun	napTime(microseconds:	Int=250)		
															=	usleep(microseconds.toUInt()	*	1000.toUInt())	
	
fun	foobar(input:	COpaquePointer?):	COpaquePointer?	{	
					
	
	
}	
	
fun	main()	{	
	
	
	
}	
Demo.kt
The Demo Code
Code	to	run	in	Pthread	goes	here…	
Code	to	launch	Pthreads	goes	here…
fun	foobar(input:	COpaquePointer?):	COpaquePointer?	{	
				kotlin.native.initRuntimeIfNeeded()	
				memScoped	{	
								val	data	=	input?.asStableRef<Pair<CPointer<ByteVar>,		
	pthread_mutex_t>>()	
								val	name	=	data?.get()?.first?.toKString()	?:	"No	Name"	
								val	dummy	=	alloc<pthread_mutex_t>()	
								val	mutex	=	data?.get()?.second	?:	dummy	
	
								for	(x	in	1..20)	{	
												doWork(mutex,	name,	x)	
								}	
				}	
				return	StableRef.create(0).asCPointer()	
}	
Demo.kt
The Demo Code
private	fun	doWork(mutex:	pthread_mutex_t,	name:	String,	x:	Int)	{	
				pthread_mutex_lock(mutex.ptr)	
				print("Pthread	$name	message	$x	part	An")	
				napTime()	
				print("Pthread	$name	message	$x	part	Bn")	
				napTime()	
				print("Pthread	$name	message	$x	part	Cn")	
				napTime()	
				pthread_mutex_unlock(mutex.ptr)	
				napTime()	
}	
Demo.kt
The Demo Code
fun	main()	{	
				memScoped	{	
								val	mutex	=	alloc<pthread_mutex_t>()	
								pthread_mutex_init(mutex.ptr,null)	
	
								val	threadHandle1	=	alloc<pthread_tVar>()	
								val	threadHandle2	=	alloc<pthread_tVar>()	
								val	attrs	=	null	
	
								val	data1	=	StableRef.create("Thread	No1".cstr.ptr	to	mutex)	
								val	data2	=	StableRef.create("Thread	No2".cstr.ptr	to	mutex)	
	
								pthread_create(threadHandle1.ptr,	
																attrs,	
																staticCFunction(::foobar),	
																data1.asCPointer())	
Demo.kt
The Demo Code
pthread_create(threadHandle2.ptr,	
																attrs,	
																staticCFunction(::foobar),	
																data2.asCPointer())	
	
								val	result	=	null	
								pthread_join(threadHandle1.value,	result)	
								pthread_join(threadHandle2.value,	result)	
	
								pthread_mutex_destroy(mutex.ptr)	
				}	
	
				println("End	of	main...n")	
}	
	
Demo.kt
The Demo Code
Wait a Minute…
Let’s look at some function signatures…
Comparing Signatures for ‘pthread_create’
int pthread_create(pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine)(void*),
void *arg);
public fun pthread_create(
arg0: CValuesRef<pthread_tVar>?,
arg1: CValuesRef<pthread_attr_t>?,
arg2: Cpointer<CFunction<(COpaquePointer?) -> COpaquePointer? >>?,
arg3: CValuesRef<*>?
): kotlin.Int
Comparing Signatures for ‘pthread_join’
int pthread_join(pthread_t thread,
void **retval);
public fun pthread_join(
arg0: pthread_t?,
arg1: CValuesRef<COpaquePointerVar>?
): kotlin.Int
Comparing Signatures for Mutex functions
int pthread_mutex_init(
pthread_mutex_t *mutex,
const pthread_mutexattr_t *attr
);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
public fun pthread_mutex_init(
arg0: CValuesRef<pthread_mutex_t >?,
arg1: CValuesRef<pthread_mutexattr_t >?
): kotlin.Int
public fun pthread_mutex_destroy(
arg0: CValuesRef<pthread_mutex_t>?
): kotlin.Int
The ‘cinterop’ tool generates Kotlin types from C types
•  For structures the Kotlin name is the same as the C name
•  For other types (e.g. opaque types) it is ‘${type}Var’
A void pointer is represented by the ‘COpaquePointer’ type
•  An in-memory instance is represented by ‘COpaquePointerVar’
Pointers are represented in two ways:
•  For variables use ‘CPointer<T>’ and ‘CPointerVar<T>’
•  For parameters use ‘CValuesRef<T>’
What Have We Learned
Now lets look back at the code…
Memory is allocated via ‘alloc’ functions
•  There are versions for single types, arrays, pointers etc…
The memory allocated must be freed
•  This can be managed for you via ‘memScoped { … }’
Null in Kotlin is translated into NULL in C
•  I.e. the address denoted by zero where nothing lives
•  NB Pthreads uses NULL to mean ‘go with the defaults’
Explaining the Demo Code
val mutex = alloc<pthread_mutex_t>()
pthread_mutex_init(mutex.ptr,null)
val threadHandle1 = alloc<pthread_tVar>()
val threadHandle2 = alloc<pthread_tVar>()
Kotlin strings are interoperable with C Strings
•  The compiler converts between Strings and ‘const	char	*’
Manual conversion methods are available
•  Calling ‘cstr’ on a String returns ‘CValuesRef<ByteVar>’
•  You can call ‘toKString’ on a ‘CPointer<ByteVar>’
The ‘StableRef’ type is used to pass values through C
•  This typically happens when you are writing a function in Kotlin
which will be called at a later date from C with cached data
•  The Pthreads library is a good example of where this is useful
Explaining the Demo Code
val data1 = StableRef.create("Thread No1".cstr.ptr to mutex)
val data2 = StableRef.create("Thread No2".cstr.ptr to mutex)
When working with generated types
•  Use ‘ptr’ to get the address in memory of a value
•  Use ‘value’ to get the value from an address in memory
Standard Kotlin functions can be used as C callbacks
•  As long as you convert the reference via ‘staticCFunction’
•  Within the function you must call ‘initRuntimeIfNeeded()’
Explaining the Demo Code
pthread_create(threadHandle1.ptr,	
																attrs,	
																staticCFunction(::foobar),	
																data1.asCPointer())
In the code below we:
•  Convert the opaque pointer to a StableRef of a Pair of values
•  Convert the first value in the pair from a byte pointer to a String
•  Specify default values for either item if it is missing
•  Run the job of work to be done asynchronously
Explaining the Demo Code
val data = input?.asStableRef<Pair<CPointer<ByteVar>, pthread_mutex_t>>()
val name = data?.get()?.first?.toKString() ?: "No Name”
val dummy = alloc<pthread_mutex_t>()
val mutex = data?.get()?.second ?: dummy
for (x in 1..20) {
doWork(mutex, name, x)
}
Let Us Return To Normality
Let’s return to the normal world of sane people…
Kotlin Native has its own concurrency model
•  Possible as JetBrains now has control of the underlying runtime
The main abstraction is a ‘Worker’
•  Workers are similar to Actors in frameworks like Akka
You pass data and jobs to a worker via its ‘execute’ method
•  The producer lambda returns a graph of objects whose
ownership will now be transferred to the target worker
•  The calling thread won’t be able to access those objects
The Kotlin Native Concurrency Model
fun	<T1,	T2>	execute(mode:	TransferMode,		
	producer:	()	->	T1,		
	job:	(T1)	->	T2):	Future<T2>
Objects in Kotlin Native can be frozen
•  This is an operation that is performed at runtime
•  All objects in a graph are marked as immutable
•  Any writes result in an ‘InvalidMutabilityException’
Frozen objects can safely be shared between Workers
•  Kotlin Native does not allow Workers to share mutable state
There are multiple ways to freeze an object:
•  Singleton objects and enums are automatically frozen
•  Arbitrary objects can be frozen via the ‘freeze’ method
•  Global variables can be marked with ‘SharedImmutable’
Global variables can also be marked with ‘@ThreadLocal’
•  In which case each Worker gets its own copy of the data
The Kotlin Native Concurrency Model
package	native.workers	
	
import	kotlin.native.concurrent.TransferMode	
import	kotlin.native.concurrent.Worker	
	
fun	main()	{	
				fun	job(name:	String):	String	{	
						for(x	in	1..20)	{	
								print("$name	message	$xn")	
						}	
						return	"$name	Done!"	
				}	
				val	w1	=	Worker.start()	
				val	w2	=	Worker.start()	
	
				val	future1	=	w1.execute(TransferMode.SAFE,	{"Worker	No1"},	::job)	
				val	future2	=	w2.execute(TransferMode.SAFE,	{"Worker	No2"},	::job)	
	
				println(future1.result)	
				println(future2.result)	
}	
Demo.kt
Using Kotlin Native Workers
Using Kotlin Native Workers
Worker	No1	message	1	
Worker	No2	message	1	
Worker	No1	message	2	
Worker	No2	message	2	
Worker	No2	message	3	
Worker	No1	message	3	
Worker	No2	message	4	
Worker	No1	message	4	
Worker	No2	message	5	
Worker	No1	message	5	
Worker	No2	message	6	
Worker	No1	message	6	
Worker	No2	message	7	
Worker	No1	message	7	
Worker	No2	message	8	
Worker	No1	message	8	
Worker	No2	message	9	
Worker	No1	message	9	
Worker	No2	message	10	
Worker	No1	message	10	
Worker	No2	message	11	
Worker	No1	message	11	
Worker	No2	message	12	
Worker	No1	message	12	
Worker	No1	message	13	
Worker	No2	message	13	
Worker	No1	message	14	
Worker	No2	message	14	
Worker	No1	message	15	
Worker	No2	message	15	
Worker	No1	message	16	
Worker	No2	message	16	
Worker	No1	message	17	
Worker	No2	message	17	
Worker	No1	message	18	
Worker	No2	message	18	
Worker	No1	message	19	
Worker	No2	message	19	
Worker	No1	message	20	
Worker	No2	message	20	
Worker	No1	Done!	
Worker	No2	Done!
© Instil Software 2018
•  Multiplatform Projects
Part 1b
Multiplatform Libraries
Kotlin	/	JVM	
Kotlin	/	JS	
Kotlin	/	Native	
Common
Multiplatform Libraries
Multiplatform Libraries - Compatability
© Instil Software 2018
•  Building Web Applications
Part 2
Imagine a Developer Was Frozen in the 1990’s
What Would They Expect?
What Do We Have Instead?
What Do We Have Instead?
The Myth Of The Full Stack Developer…
But Salvation Is At Hand!!!
But Salvation Is At Hand!!!
React 101
<Ticker name=“Fred”/>
class	Ticker	extends	React.Component	{	
				constructor(props)	{	
								super(props);	
								this.state	=	{secondsElapsed:	0};	
				}	
				componentDidMount()	{	
								this.interval	=	setInterval(()	=>	this.tick(),	1000);		
				}	
				componentWillUnmount()	{	
								clearInterval(this.interval);		
				}	
				tick()	{	
								this.setState({secondsElapsed:	this.state.secondsElapsed	+	1});	
				}	
				render()	{	
								return	(	
												<div>	
																<h1>Hello,	{this.props.name}!</h1>	
																<p>Page	open	{this.state.secondsElapsed}	seconds.</p>	
												</div>	
								);	
				}	
}
class	Ticker	extends	React.Component	{	
				constructor(props)	{	
								super(props);	
								this.state	=	{secondsElapsed:	0};	
				}	
				componentDidMount()	{	
								this.interval	=	setInterval(()	=>	this.tick(),	1000);		
				}	
				componentWillUnmount()	{	
								clearInterval(this.interval);		
				}	
	
				tick()	{	
								this.setState({secondsElapsed:	this.state.secondsElapsed	+	1});	
				}	
				render()	{	
								return	(	
												<div>	
																<h1>Hello,	{this.props.name}!</h1>	
																<p>Page	open	{this.state.secondsElapsed}	seconds.</p>	
												</div>	
								);	
				}	
}
Initial State
Lifecycle
Methods
Changing state marks component as dirty
Rendering uses embedded JSX templating language
Kotlin.js Support in IntelliJ
Kotlin.js React Support
Kotlin Wrappers Repo
The ‘create-react-kotlin-app’ script
NPM Issues….
class	WidgetDisplay	extends	React.Component	{	
}	
	
	
	
	
class	WidgetDisplay(props:	WidgetDisplayProps)		
	:	RComponent<WidgetDisplayProps,	
																 	WidgetDisplayState>(props)	{	
}	
	
//Properties	are	strongly	typed	
class	WidgetProps(var	foo:	String,	
																		var	bar:	Int)	:	RProps	
	
//State	is	also	strongly	typed	
interface	WidgetState:	RState	{	
				var	widgets:	List<Widget>	
}		
Sample.kt
React Components in JS and Kotlin
JavaScript
Kotlin
class	WidgetDisplay	extends	React.Component	{					
			render()	{	
								return	(	
												<div>	
																<h1>Hello,	{this.props.foo}!</h1>	
												</div>	
								);	
				}	
}	
	
	
	
class	WidgetDisplay(props:	WidgetDisplayProps)		
	:	RComponent<WidgetDisplayProps,	
																 	WidgetDisplayState>(props)	{	
				override	fun	RBuilder.render()	{	
								div	{	
					h1	{	+props.foo	}	
								}	
				}	
}	
	
	
	
Sample.kt
React Components in JS and Kotlin
JavaScript
Kotlin
class	WidgetDisplay	extends	React.Component	{					
				render:	function	()	{	
								return	<div>	
												<button	onClick={this.eventHandlerFunc}>	
																Something	
												</button>	
								</div>;	
				}	
}	
	
class	WidgetDisplay(props:	WidgetDisplayProps)		
								:	RComponent<WidgetDisplayProps,WidgetDisplayState>(props)	{	
				override	fun	RBuilder.render()	{	
								div	{	
												button	{		
																+props.foo	
																attrs	{	onClickFunction	=	::eventHandlerFunc	}	
												}	
								}	
				}	
}	
	
	
	
Sample.kt
React Components in JS and Kotlin
JavaScript
Kotlin
We Need Services and a Data Source
Having defined the problem, the first step
towards a solution is the acquisition of data.
The Neo4J Desktop and Movies DB
The Two Projects
interface	MovieRepository	:	Neo4jRepository<Movie,	Long>	{	
				@Query("""	
				MATCH	(a:Actor)-[:ACTS_IN]->(m:Movie)	
				WITH	a,	collect(m)	AS	filmograpy	
				WHERE	size(filmograpy)	>=	{0}	
				RETURN	a	
				""")	
				fun	findActorsByFilmography(minMovies:	Long):	List<Actor>	
	
				@Query("""	
				MATCH	(m:Movie)<-[:ACTS_IN]-(a:Actor)	
				WHERE	a.name	STARTS	WITH	{0}	
				RETURN	m	SKIP	{1}	LIMIT	{2}	
				""")	
				fun	findByActorName(actorName:	String,		
	skip:	Long,		
	limit:	Long):	List<Movie>	
}	
MovieRepository.kt
A Spring Data Repo to Talk to Neo4J
@CrossOrigin	
@RestController	
@RequestMapping("/movies")	
class	Neo4JMoviesService(val	repo:	MovieRepository)	{	
	
				@GetMapping("/byFilmography/{minMovies}")	
				fun	byActorId(@PathVariable("minMovies")	minMovies:	Long):	Flux<Actor>	{	
								return	Flux.fromIterable(repo.findActorsByFilmography(minMovies))	
				}	
	
				@GetMapping("/byActorName/{name}/{skip}/{limit}")	
				fun	byActorName(	
								@PathVariable("name")	name:	String,	
								@PathVariable("skip")	skip:	Long,	
								@PathVariable("limit")	limit:	Long	
				):	Flux<Movie>	{	
								return	Flux.fromIterable(repo.findByActorName(name,	skip,	limit))	
				}	
}	
Neo4JMoviesService.kt
A RESTful Service Written in WebFlux
The Movies SPA
class	MovieTableProps(var	movies:	List<Movie>,	
																						var	selectedHandler:	(Movie)	->	Unit)	:	Rprops	
	
interface	MovieTableState:	RState	{	
				var	movies:	List<Movie>	
}	
MovieTable.kt
A Sample Component
class	MovieTable(props:	MovieTableProps)	:		
	RComponent<MovieTableProps,	MovieTableState>(props)	{	
					
				init	{	
								state.movies	=	props.movies	
				}	
	
				override	fun	componentWillReceiveProps(nextProps:	MovieTableProps)	{	
								state.movies	=	nextProps.movies	
				}	
					
				private	fun	sortMovies(selector:	(Movie)	->	String)	{	
								val	sortedMovies	=	state.movies.sortedBy(selector)	
								setState	{	movies	=	sortedMovies	}	
				}	
	
				private	fun	sortByTitle(e:	Event)	=	sortMovies	{	it.title	}	
	
				private	fun	sortByGenre(e:	Event)	=	sortMovies	{	it.genre	}
	
MovieTable.kt
A Sample Component
override fun RBuilder.render() {
table(classes = "table table-striped table-bordered") {	
													thead {	
																	tr {
th {
+"Title"
span(classes="fas fa-sort ml-2") {}
attrs { onClickFunction = ::sortByTitle }
}	
																						th {
+"Genre"
span(classes="fas fa-sort ml-2") {}
attrs { onClickFunction = ::sortByGenre }
}
th { +"Tagline" }
}
}
	
MovieTable.kt
A Sample Component
tbody {
state.movies.map { movie ->
tr {
td { +movie.title }
td { +movie.genre }
td { +movie.tagline }
attrs {
onClickFunction = {
props.selectedHandler(movie)
}
}
}
}
}
}
}
}	
MovieTable.kt
A Sample Component
© Instil Software 2018
•  Some Conclusions
Part 3
Summing Up
Any Questions?

More Related Content

What's hot

Cilium: Kernel Native Security & DDOS Mitigation for Microservices with BPF
Cilium: Kernel Native Security & DDOS Mitigation for Microservices with BPFCilium: Kernel Native Security & DDOS Mitigation for Microservices with BPF
Cilium: Kernel Native Security & DDOS Mitigation for Microservices with BPFDocker, Inc.
 
Building kubectl plugins with Quarkus | DevNation Tech Talk
Building kubectl plugins with Quarkus | DevNation Tech TalkBuilding kubectl plugins with Quarkus | DevNation Tech Talk
Building kubectl plugins with Quarkus | DevNation Tech TalkRed Hat Developers
 
Kubernetes - A Comprehensive Overview
Kubernetes - A Comprehensive OverviewKubernetes - A Comprehensive Overview
Kubernetes - A Comprehensive OverviewBob Killen
 
Introduction to CRI and OCI
Introduction to CRI and OCIIntroduction to CRI and OCI
Introduction to CRI and OCIHungWei Chiu
 
Automated Image Builds in OpenShift and Kubernetes
Automated Image Builds in OpenShift and KubernetesAutomated Image Builds in OpenShift and Kubernetes
Automated Image Builds in OpenShift and KubernetesGraham Dumpleton
 
Setting up CI/CD pipeline with Kubernetes and Kublr step-by-step
Setting up CI/CD pipeline with Kubernetes and Kublr step-by-stepSetting up CI/CD pipeline with Kubernetes and Kublr step-by-step
Setting up CI/CD pipeline with Kubernetes and Kublr step-by-stepOleg Chunikhin
 
K8s in 3h - Kubernetes Fundamentals Training
K8s in 3h - Kubernetes Fundamentals TrainingK8s in 3h - Kubernetes Fundamentals Training
K8s in 3h - Kubernetes Fundamentals TrainingPiotr Perzyna
 
Orchestrating Microservices with Kubernetes
Orchestrating Microservices with Kubernetes Orchestrating Microservices with Kubernetes
Orchestrating Microservices with Kubernetes Weaveworks
 
Kubernetes Architecture - beyond a black box - Part 2
Kubernetes Architecture - beyond a black box - Part 2Kubernetes Architecture - beyond a black box - Part 2
Kubernetes Architecture - beyond a black box - Part 2Hao H. Zhang
 
Continuous Delivery the Hard Way with Kubernetes
Continuous Delivery the Hard Way with Kubernetes Continuous Delivery the Hard Way with Kubernetes
Continuous Delivery the Hard Way with Kubernetes Weaveworks
 
Docker Platform Internals: Taking runtimes and image creation to the next lev...
Docker Platform Internals: Taking runtimes and image creation to the next lev...Docker Platform Internals: Taking runtimes and image creation to the next lev...
Docker Platform Internals: Taking runtimes and image creation to the next lev...Docker, Inc.
 
KubeCon EU 2016: Kubernetes and the Potential for Higher Level Interfaces
KubeCon EU 2016: Kubernetes and the Potential for Higher Level InterfacesKubeCon EU 2016: Kubernetes and the Potential for Higher Level Interfaces
KubeCon EU 2016: Kubernetes and the Potential for Higher Level InterfacesKubeAcademy
 
Kubernetes and bluemix
Kubernetes  and  bluemixKubernetes  and  bluemix
Kubernetes and bluemixDuckDuckGo
 
Ansible, integration testing, and you.
Ansible, integration testing, and you.Ansible, integration testing, and you.
Ansible, integration testing, and you.Bob Killen
 
Pluggable Infrastructure with CI/CD and Docker
Pluggable Infrastructure with CI/CD and DockerPluggable Infrastructure with CI/CD and Docker
Pluggable Infrastructure with CI/CD and DockerBob Killen
 
An OpenShift Primer for Developers to get your Code into the Cloud (PTJUG)
An OpenShift Primer for Developers to get your Code into the Cloud (PTJUG)An OpenShift Primer for Developers to get your Code into the Cloud (PTJUG)
An OpenShift Primer for Developers to get your Code into the Cloud (PTJUG)Eric D. Schabell
 
GlueCon kubernetes & container engine
GlueCon kubernetes & container engineGlueCon kubernetes & container engine
GlueCon kubernetes & container enginebrendandburns
 
Network plugins for kubernetes
Network plugins for kubernetesNetwork plugins for kubernetes
Network plugins for kubernetesinwin stack
 

What's hot (20)

Cilium: Kernel Native Security & DDOS Mitigation for Microservices with BPF
Cilium: Kernel Native Security & DDOS Mitigation for Microservices with BPFCilium: Kernel Native Security & DDOS Mitigation for Microservices with BPF
Cilium: Kernel Native Security & DDOS Mitigation for Microservices with BPF
 
Building kubectl plugins with Quarkus | DevNation Tech Talk
Building kubectl plugins with Quarkus | DevNation Tech TalkBuilding kubectl plugins with Quarkus | DevNation Tech Talk
Building kubectl plugins with Quarkus | DevNation Tech Talk
 
Kubernetes - A Comprehensive Overview
Kubernetes - A Comprehensive OverviewKubernetes - A Comprehensive Overview
Kubernetes - A Comprehensive Overview
 
Introduction to CRI and OCI
Introduction to CRI and OCIIntroduction to CRI and OCI
Introduction to CRI and OCI
 
Automated Image Builds in OpenShift and Kubernetes
Automated Image Builds in OpenShift and KubernetesAutomated Image Builds in OpenShift and Kubernetes
Automated Image Builds in OpenShift and Kubernetes
 
Setting up CI/CD pipeline with Kubernetes and Kublr step-by-step
Setting up CI/CD pipeline with Kubernetes and Kublr step-by-stepSetting up CI/CD pipeline with Kubernetes and Kublr step-by-step
Setting up CI/CD pipeline with Kubernetes and Kublr step-by-step
 
K8s in 3h - Kubernetes Fundamentals Training
K8s in 3h - Kubernetes Fundamentals TrainingK8s in 3h - Kubernetes Fundamentals Training
K8s in 3h - Kubernetes Fundamentals Training
 
Orchestrating Microservices with Kubernetes
Orchestrating Microservices with Kubernetes Orchestrating Microservices with Kubernetes
Orchestrating Microservices with Kubernetes
 
Kubernetes Architecture - beyond a black box - Part 2
Kubernetes Architecture - beyond a black box - Part 2Kubernetes Architecture - beyond a black box - Part 2
Kubernetes Architecture - beyond a black box - Part 2
 
Kubernetes basics and hands on exercise
Kubernetes basics and hands on exerciseKubernetes basics and hands on exercise
Kubernetes basics and hands on exercise
 
Continuous Delivery the Hard Way with Kubernetes
Continuous Delivery the Hard Way with Kubernetes Continuous Delivery the Hard Way with Kubernetes
Continuous Delivery the Hard Way with Kubernetes
 
Docker Platform Internals: Taking runtimes and image creation to the next lev...
Docker Platform Internals: Taking runtimes and image creation to the next lev...Docker Platform Internals: Taking runtimes and image creation to the next lev...
Docker Platform Internals: Taking runtimes and image creation to the next lev...
 
KubeCon EU 2016: Kubernetes and the Potential for Higher Level Interfaces
KubeCon EU 2016: Kubernetes and the Potential for Higher Level InterfacesKubeCon EU 2016: Kubernetes and the Potential for Higher Level Interfaces
KubeCon EU 2016: Kubernetes and the Potential for Higher Level Interfaces
 
Kubernetes and bluemix
Kubernetes  and  bluemixKubernetes  and  bluemix
Kubernetes and bluemix
 
Ansible, integration testing, and you.
Ansible, integration testing, and you.Ansible, integration testing, and you.
Ansible, integration testing, and you.
 
Pluggable Infrastructure with CI/CD and Docker
Pluggable Infrastructure with CI/CD and DockerPluggable Infrastructure with CI/CD and Docker
Pluggable Infrastructure with CI/CD and Docker
 
An OpenShift Primer for Developers to get your Code into the Cloud (PTJUG)
An OpenShift Primer for Developers to get your Code into the Cloud (PTJUG)An OpenShift Primer for Developers to get your Code into the Cloud (PTJUG)
An OpenShift Primer for Developers to get your Code into the Cloud (PTJUG)
 
GlueCon kubernetes & container engine
GlueCon kubernetes & container engineGlueCon kubernetes & container engine
GlueCon kubernetes & container engine
 
Kubernetes Introduction
Kubernetes IntroductionKubernetes Introduction
Kubernetes Introduction
 
Network plugins for kubernetes
Network plugins for kubernetesNetwork plugins for kubernetes
Network plugins for kubernetes
 

Similar to Kotlin The Whole Damn Family

Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019UA Mobile
 
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019Eugene Kurko
 
Continuous Delivery the hard way with Kubernetes
Continuous Delivery the hard way with KubernetesContinuous Delivery the hard way with Kubernetes
Continuous Delivery the hard way with KubernetesLuke Marsden
 
Beachhead implements new opcode on CLR JIT
Beachhead implements new opcode on CLR JITBeachhead implements new opcode on CLR JIT
Beachhead implements new opcode on CLR JITKouji Matsui
 
Continuous Delivery the Hard Way with Kubernetes
Continuous Delivery the Hard Way with Kubernetes Continuous Delivery the Hard Way with Kubernetes
Continuous Delivery the Hard Way with Kubernetes Weaveworks
 
2#Kotlin programming tutorials(data types and hello world)
2#Kotlin programming tutorials(data types and hello world)2#Kotlin programming tutorials(data types and hello world)
2#Kotlin programming tutorials(data types and hello world)Naveen Davis
 
Desarrollo multiplataforma con kotlin | UPV 2018
Desarrollo multiplataforma con kotlin  | UPV 2018Desarrollo multiplataforma con kotlin  | UPV 2018
Desarrollo multiplataforma con kotlin | UPV 2018Víctor Bolinches
 
2014 11-05 hpcac-kniep_christian_dockermpi
2014 11-05 hpcac-kniep_christian_dockermpi2014 11-05 hpcac-kniep_christian_dockermpi
2014 11-05 hpcac-kniep_christian_dockermpiQNIB Solutions
 
ASP.NET Session 1
ASP.NET Session 1ASP.NET Session 1
ASP.NET Session 1Sisir Ghosh
 
Kubernetes buildpacks - from a source code to the running OCI container with ...
Kubernetes buildpacks - from a source code to the running OCI container with ...Kubernetes buildpacks - from a source code to the running OCI container with ...
Kubernetes buildpacks - from a source code to the running OCI container with ...PROIDEA
 
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...tdc-globalcode
 
A TypeScript Fans KotlinJS Adventures
A TypeScript Fans KotlinJS AdventuresA TypeScript Fans KotlinJS Adventures
A TypeScript Fans KotlinJS AdventuresGarth Gilmour
 
Why to Choose Kotlin in 2023 to Build Mobile Apps Faster?
Why to Choose Kotlin in 2023 to Build Mobile Apps Faster?Why to Choose Kotlin in 2023 to Build Mobile Apps Faster?
Why to Choose Kotlin in 2023 to Build Mobile Apps Faster?9 series
 

Similar to Kotlin The Whole Damn Family (20)

Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
 
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
 
Why Kotlin?
Why Kotlin?Why Kotlin?
Why Kotlin?
 
Continuous Delivery the hard way with Kubernetes
Continuous Delivery the hard way with KubernetesContinuous Delivery the hard way with Kubernetes
Continuous Delivery the hard way with Kubernetes
 
Beachhead implements new opcode on CLR JIT
Beachhead implements new opcode on CLR JITBeachhead implements new opcode on CLR JIT
Beachhead implements new opcode on CLR JIT
 
Continuous Delivery the Hard Way with Kubernetes
Continuous Delivery the Hard Way with Kubernetes Continuous Delivery the Hard Way with Kubernetes
Continuous Delivery the Hard Way with Kubernetes
 
2#Kotlin programming tutorials(data types and hello world)
2#Kotlin programming tutorials(data types and hello world)2#Kotlin programming tutorials(data types and hello world)
2#Kotlin programming tutorials(data types and hello world)
 
Kubernetes 101
Kubernetes 101Kubernetes 101
Kubernetes 101
 
Monkey space 2013
Monkey space 2013Monkey space 2013
Monkey space 2013
 
Desarrollo multiplataforma con kotlin | UPV 2018
Desarrollo multiplataforma con kotlin  | UPV 2018Desarrollo multiplataforma con kotlin  | UPV 2018
Desarrollo multiplataforma con kotlin | UPV 2018
 
2014 11-05 hpcac-kniep_christian_dockermpi
2014 11-05 hpcac-kniep_christian_dockermpi2014 11-05 hpcac-kniep_christian_dockermpi
2014 11-05 hpcac-kniep_christian_dockermpi
 
.Net Core
.Net Core.Net Core
.Net Core
 
ASP.NET Session 1
ASP.NET Session 1ASP.NET Session 1
ASP.NET Session 1
 
Introduction to Kotlin - Android KTX
Introduction to Kotlin - Android KTXIntroduction to Kotlin - Android KTX
Introduction to Kotlin - Android KTX
 
Kubernetes buildpacks - from a source code to the running OCI container with ...
Kubernetes buildpacks - from a source code to the running OCI container with ...Kubernetes buildpacks - from a source code to the running OCI container with ...
Kubernetes buildpacks - from a source code to the running OCI container with ...
 
ISC HPCW talks
ISC HPCW talksISC HPCW talks
ISC HPCW talks
 
Kotlin 1.1
Kotlin 1.1Kotlin 1.1
Kotlin 1.1
 
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
 
A TypeScript Fans KotlinJS Adventures
A TypeScript Fans KotlinJS AdventuresA TypeScript Fans KotlinJS Adventures
A TypeScript Fans KotlinJS Adventures
 
Why to Choose Kotlin in 2023 to Build Mobile Apps Faster?
Why to Choose Kotlin in 2023 to Build Mobile Apps Faster?Why to Choose Kotlin in 2023 to Build Mobile Apps Faster?
Why to Choose Kotlin in 2023 to Build Mobile Apps Faster?
 

More from Garth Gilmour

Kotlin / Android Update
Kotlin / Android UpdateKotlin / Android Update
Kotlin / Android UpdateGarth Gilmour
 
TypeScript Vs. KotlinJS
TypeScript Vs. KotlinJSTypeScript Vs. KotlinJS
TypeScript Vs. KotlinJSGarth Gilmour
 
Shut Up And Eat Your Veg
Shut Up And Eat Your VegShut Up And Eat Your Veg
Shut Up And Eat Your VegGarth Gilmour
 
Lies Told By The Kotlin Compiler
Lies Told By The Kotlin CompilerLies Told By The Kotlin Compiler
Lies Told By The Kotlin CompilerGarth Gilmour
 
The Heat Death Of Enterprise IT
The Heat Death Of Enterprise ITThe Heat Death Of Enterprise IT
The Heat Death Of Enterprise ITGarth Gilmour
 
Lies Told By The Kotlin Compiler
Lies Told By The Kotlin CompilerLies Told By The Kotlin Compiler
Lies Told By The Kotlin CompilerGarth Gilmour
 
Type Driven Development with TypeScript
Type Driven Development with TypeScriptType Driven Development with TypeScript
Type Driven Development with TypeScriptGarth Gilmour
 
Generics On The JVM (What you don't know will hurt you)
Generics On The JVM (What you don't know will hurt you)Generics On The JVM (What you don't know will hurt you)
Generics On The JVM (What you don't know will hurt you)Garth Gilmour
 
Using Kotlin, to Create Kotlin, to Teach Kotlin, in Space
Using Kotlin, to Create Kotlin,to Teach Kotlin,in SpaceUsing Kotlin, to Create Kotlin,to Teach Kotlin,in Space
Using Kotlin, to Create Kotlin, to Teach Kotlin, in SpaceGarth Gilmour
 
Is Software Engineering A Profession?
Is Software Engineering A Profession?Is Software Engineering A Profession?
Is Software Engineering A Profession?Garth Gilmour
 
Social Distancing is not Behaving Distantly
Social Distancing is not Behaving DistantlySocial Distancing is not Behaving Distantly
Social Distancing is not Behaving DistantlyGarth Gilmour
 
The Great Scala Makeover
The Great Scala MakeoverThe Great Scala Makeover
The Great Scala MakeoverGarth Gilmour
 
Transitioning Android Teams Into Kotlin
Transitioning Android Teams Into KotlinTransitioning Android Teams Into Kotlin
Transitioning Android Teams Into KotlinGarth Gilmour
 
Simpler and Safer Java Types (via the Vavr and Lambda Libraries)
Simpler and Safer Java Types (via the Vavr and Lambda Libraries)Simpler and Safer Java Types (via the Vavr and Lambda Libraries)
Simpler and Safer Java Types (via the Vavr and Lambda Libraries)Garth Gilmour
 
The Three Horse Race
The Three Horse RaceThe Three Horse Race
The Three Horse RaceGarth Gilmour
 
The Bestiary of Pure Functional Programming
The Bestiary of Pure Functional Programming The Bestiary of Pure Functional Programming
The Bestiary of Pure Functional Programming Garth Gilmour
 
BelTech 2019 Presenters Workshop
BelTech 2019 Presenters WorkshopBelTech 2019 Presenters Workshop
BelTech 2019 Presenters WorkshopGarth Gilmour
 
The Philosophy of DDD
The Philosophy of DDDThe Philosophy of DDD
The Philosophy of DDDGarth Gilmour
 
10 Big Ideas from Industry
10 Big Ideas from Industry10 Big Ideas from Industry
10 Big Ideas from IndustryGarth Gilmour
 

More from Garth Gilmour (20)

Compose in Theory
Compose in TheoryCompose in Theory
Compose in Theory
 
Kotlin / Android Update
Kotlin / Android UpdateKotlin / Android Update
Kotlin / Android Update
 
TypeScript Vs. KotlinJS
TypeScript Vs. KotlinJSTypeScript Vs. KotlinJS
TypeScript Vs. KotlinJS
 
Shut Up And Eat Your Veg
Shut Up And Eat Your VegShut Up And Eat Your Veg
Shut Up And Eat Your Veg
 
Lies Told By The Kotlin Compiler
Lies Told By The Kotlin CompilerLies Told By The Kotlin Compiler
Lies Told By The Kotlin Compiler
 
The Heat Death Of Enterprise IT
The Heat Death Of Enterprise ITThe Heat Death Of Enterprise IT
The Heat Death Of Enterprise IT
 
Lies Told By The Kotlin Compiler
Lies Told By The Kotlin CompilerLies Told By The Kotlin Compiler
Lies Told By The Kotlin Compiler
 
Type Driven Development with TypeScript
Type Driven Development with TypeScriptType Driven Development with TypeScript
Type Driven Development with TypeScript
 
Generics On The JVM (What you don't know will hurt you)
Generics On The JVM (What you don't know will hurt you)Generics On The JVM (What you don't know will hurt you)
Generics On The JVM (What you don't know will hurt you)
 
Using Kotlin, to Create Kotlin, to Teach Kotlin, in Space
Using Kotlin, to Create Kotlin,to Teach Kotlin,in SpaceUsing Kotlin, to Create Kotlin,to Teach Kotlin,in Space
Using Kotlin, to Create Kotlin, to Teach Kotlin, in Space
 
Is Software Engineering A Profession?
Is Software Engineering A Profession?Is Software Engineering A Profession?
Is Software Engineering A Profession?
 
Social Distancing is not Behaving Distantly
Social Distancing is not Behaving DistantlySocial Distancing is not Behaving Distantly
Social Distancing is not Behaving Distantly
 
The Great Scala Makeover
The Great Scala MakeoverThe Great Scala Makeover
The Great Scala Makeover
 
Transitioning Android Teams Into Kotlin
Transitioning Android Teams Into KotlinTransitioning Android Teams Into Kotlin
Transitioning Android Teams Into Kotlin
 
Simpler and Safer Java Types (via the Vavr and Lambda Libraries)
Simpler and Safer Java Types (via the Vavr and Lambda Libraries)Simpler and Safer Java Types (via the Vavr and Lambda Libraries)
Simpler and Safer Java Types (via the Vavr and Lambda Libraries)
 
The Three Horse Race
The Three Horse RaceThe Three Horse Race
The Three Horse Race
 
The Bestiary of Pure Functional Programming
The Bestiary of Pure Functional Programming The Bestiary of Pure Functional Programming
The Bestiary of Pure Functional Programming
 
BelTech 2019 Presenters Workshop
BelTech 2019 Presenters WorkshopBelTech 2019 Presenters Workshop
BelTech 2019 Presenters Workshop
 
The Philosophy of DDD
The Philosophy of DDDThe Philosophy of DDD
The Philosophy of DDD
 
10 Big Ideas from Industry
10 Big Ideas from Industry10 Big Ideas from Industry
10 Big Ideas from Industry
 

Recently uploaded

Ahmed Motair CV April 2024 (Senior SW Developer)
Ahmed Motair CV April 2024 (Senior SW Developer)Ahmed Motair CV April 2024 (Senior SW Developer)
Ahmed Motair CV April 2024 (Senior SW Developer)Ahmed Mater
 
Sending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdfSending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdf31events.com
 
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...Natan Silnitsky
 
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfGOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfAlina Yurenko
 
Unveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsUnveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsAhmed Mohamed
 
Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Velvetech LLC
 
What is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWhat is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWave PLM
 
MYjobs Presentation Django-based project
MYjobs Presentation Django-based projectMYjobs Presentation Django-based project
MYjobs Presentation Django-based projectAnoyGreter
 
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdfExploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdfkalichargn70th171
 
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024StefanoLambiase
 
Machine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringMachine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringHironori Washizaki
 
PREDICTING RIVER WATER QUALITY ppt presentation
PREDICTING  RIVER  WATER QUALITY  ppt presentationPREDICTING  RIVER  WATER QUALITY  ppt presentation
PREDICTING RIVER WATER QUALITY ppt presentationvaddepallysandeep122
 
How to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationHow to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationBradBedford3
 
cpct NetworkING BASICS AND NETWORK TOOL.ppt
cpct NetworkING BASICS AND NETWORK TOOL.pptcpct NetworkING BASICS AND NETWORK TOOL.ppt
cpct NetworkING BASICS AND NETWORK TOOL.pptrcbcrtm
 
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company OdishaBalasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odishasmiwainfosol
 
Intelligent Home Wi-Fi Solutions | ThinkPalm
Intelligent Home Wi-Fi Solutions | ThinkPalmIntelligent Home Wi-Fi Solutions | ThinkPalm
Intelligent Home Wi-Fi Solutions | ThinkPalmSujith Sukumaran
 
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...OnePlan Solutions
 

Recently uploaded (20)

Ahmed Motair CV April 2024 (Senior SW Developer)
Ahmed Motair CV April 2024 (Senior SW Developer)Ahmed Motair CV April 2024 (Senior SW Developer)
Ahmed Motair CV April 2024 (Senior SW Developer)
 
Sending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdfSending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdf
 
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
 
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfGOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
 
Unveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsUnveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML Diagrams
 
Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...
 
What is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWhat is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need It
 
MYjobs Presentation Django-based project
MYjobs Presentation Django-based projectMYjobs Presentation Django-based project
MYjobs Presentation Django-based project
 
Odoo Development Company in India | Devintelle Consulting Service
Odoo Development Company in India | Devintelle Consulting ServiceOdoo Development Company in India | Devintelle Consulting Service
Odoo Development Company in India | Devintelle Consulting Service
 
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdfExploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
 
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
 
Machine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringMachine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their Engineering
 
PREDICTING RIVER WATER QUALITY ppt presentation
PREDICTING  RIVER  WATER QUALITY  ppt presentationPREDICTING  RIVER  WATER QUALITY  ppt presentation
PREDICTING RIVER WATER QUALITY ppt presentation
 
Advantages of Odoo ERP 17 for Your Business
Advantages of Odoo ERP 17 for Your BusinessAdvantages of Odoo ERP 17 for Your Business
Advantages of Odoo ERP 17 for Your Business
 
How to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationHow to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion Application
 
cpct NetworkING BASICS AND NETWORK TOOL.ppt
cpct NetworkING BASICS AND NETWORK TOOL.pptcpct NetworkING BASICS AND NETWORK TOOL.ppt
cpct NetworkING BASICS AND NETWORK TOOL.ppt
 
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company OdishaBalasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
 
2.pdf Ejercicios de programación competitiva
2.pdf Ejercicios de programación competitiva2.pdf Ejercicios de programación competitiva
2.pdf Ejercicios de programación competitiva
 
Intelligent Home Wi-Fi Solutions | ThinkPalm
Intelligent Home Wi-Fi Solutions | ThinkPalmIntelligent Home Wi-Fi Solutions | ThinkPalm
Intelligent Home Wi-Fi Solutions | ThinkPalm
 
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
 

Kotlin The Whole Damn Family