SlideShare a Scribd company logo
1 of 52
Download to read offline
R 
 
40
M
Maarten
Mulders
(@mthmulders)
#reactin40mins
“React
is
a
library
for
declaratively
building
user
interfaces
using
JavaScript
and
(optionally)
XML.
Maarten
Mulders
(@mthmulders)
#reactin40mins
R 
 

No
two-way
data
binding
No
templating
language
Just
user
interface
(no
routing,
no
HTTP
client)
Plain
JavaScript
(or
add
JSX,
TypeScript,
...)
Virtual
DOM
vs.
actual
DOM
Maarten
Mulders
(@mthmulders)
#reactin40mins
M 
J S
Maarten
Mulders
(@mthmulders)
#reactin40mins
C
EUR
class
Amount
{




constructor(currency,
value)
{








this.currency
=
currency;








this.value
=
value;




}




getCurrency()
{








return
this.currency;




}
}
const
text
=
new
Amount('EUR',
15).getCurrency();
document.getElementById('app').innerText
=
text;
1
2
3
4
5
6
7
8
9
10
11
12
13
Maarten
Mulders
(@mthmulders)
#reactin40mins
F
false
function
isEven(number)
{



return
number
%
2
==
0;
}
const
text
=
isEven(3);
document.getElementById('app').innerText
=
text;
1
2
3
4
5
6
Maarten
Mulders
(@mthmulders)
#reactin40mins
A 
F
false
const
isEven
=
(number)
=>
{



return
number
%
2
==
0;
}
const
text
=
isEven(3);
document.getElementById('app').innerText
=
text;
1
2
3
4
5
6
Maarten
Mulders
(@mthmulders)
#reactin40mins
O 
D
Jane
Doe
const
person
=
{
name
:
'Jane
Doe',
age:
42,
occupancy:
'JavaScript
dev'
};
const
{
name,
age
}
=
person;
const
text
=
name;
document.getElementById('app').innerText
=
text;
1
2
3
4
5
Maarten
Mulders
(@mthmulders)
#reactin40mins
A 
D
two
const
numbers
=
[
'one',
'two',
'three'
];
const
[
first,
second
]
=
numbers;
const
text
=
second;
document.getElementById('app').innerText
=
text;
1
2
3
4
5
Maarten
Mulders
(@mthmulders)
#reactin40mins
O 
S 
N
{"name":"Jane
Doe","age":42}
const
name
=
'Jane
Doe';
const
age
=
42;
const
person
=
{
name,
age
};
const
text
=
JSON.stringify(person);
document.getElementById('app').innerText
=
text;
1
2
3
4
5
6
Maarten
Mulders
(@mthmulders)
#reactin40mins
S 
I
EUR
150
class
Amount
{




constructor(currency,
value)
{








this.currency
=
currency;








this.value
=
value;




}




toString()
{








return
`this.currency{this.currency}
{this.value}`;




}
}
const
text
=
new
Amount('EUR',
150).toString();
document.getElementById('app').innerText
=
text;
1
2
3
4
5
6
7
8
9
10
11
12
13
Maarten
Mulders
(@mthmulders)
#reactin40mins
B 
JSX
Maarten
Mulders
(@mthmulders)
#reactin40mins
W 
 
JSX
A
syntax
extension
to
JavaScript
real
XML,
not
a
string
of
characters
allows
embedded
expressions
supports
attributes
Can
be
nested
Automatic
XSS
prevention
But
it
has
its
limitations
Needs
to
be
transpiled
to
JavaScript
e.g.
React.createElement(...)
Maarten
Mulders
(@mthmulders)
#reactin40mins
E
Elements
can
be
regular
DOM
elements...
(for
now,
but
not
for
long)
Hello,
Romania
const
element
=
<div>Hello,
Romania</div>
ReactDOM.render(element,
document.getElementById('app'));
1
2
Maarten
Mulders
(@mthmulders)
#reactin40mins
A
Elements
can
have
attributes,
but
they
can
have
different
names
than
HTML
attributes:
Red
const
element
=
<div
className='red­text'>Red</div>
ReactDOM.render(element,
document.getElementById('app'));
1
2
Maarten
Mulders
(@mthmulders)
#reactin40mins
...
and
they
can
behave
differently:
Red
and
bold
const
style
=
{
color:
'red',
fontWeight:
'bold'
};
const
element
=
<div
style={
style
}>Red
and
bold</div>
ReactDOM.render(element,
document.getElementById('app'));
1
2
3
Maarten
Mulders
(@mthmulders)
#reactin40mins
S 
R 
N
Values
must
have
a
single
root
node
(or
an
array)
x
y
const
element
=
<><div>x</div><div>y</div></>
ReactDOM.render(element,
document.getElementById('app'));
1
2
3
Maarten
Mulders
(@mthmulders)
#reactin40mins
C
Function
that
returns
a
React
element.
Hello,
world!
const
Greeter
=
(props)
=>
<div>Hello,
world!</div>
ReactDOM.render(<Greeter
/>,
document.getElementById('app'));
1
2
Maarten
Mulders
(@mthmulders)
#reactin40mins
A 
JSX
Maarten
Mulders
(@mthmulders)
#reactin40mins
E 
 
JSX
The
answer
to
the
ultimate
question
of
life,
universe
and
everything:
 42
const
answerToQuestionOfLife
=
40
+
2;
const
askQuestionOfLife
=
()
=>
answerToQuestionOfLife;
const
Example
=
()
=>
<div>




The
answer
to
the
ultimate
question
of
life,




universe
and
everything:




&nbsp;




<strong>{
askQuestionOfLife()
}</strong>
</div>;
ReactDOM.render(<Example
/>,
document.getElementById('app'));
1
2
3
4
5
6
7
8
9
10
Maarten
Mulders
(@mthmulders)
#reactin40mins
O 
 
 
 
/

Hello
Romania!
const
Greeter
=
(props)
=>
<div>Hello
{
props.name
}!</div>
ReactDOM.render(<Greeter
name='Romania'
/>,
document.getElementById('app'));
1
2
Maarten
Mulders
(@mthmulders)
#reactin40mins
O 
 
 
 
/

Alternatively,
using
object
decomposition:
Hello
Romania!
const
Greeter
=
({
name
})
=>
<div>Hello
{
name
}!</div>
ReactDOM.render(<Greeter
name='Romania'
/>,
document.getElementById('app'));
1
2
Maarten
Mulders
(@mthmulders)
#reactin40mins
C 
 
 
JSX
Clapping
hands...
const
ClapHands
=
()
=>
<span>Clapping
hands...</span>;
const
DryTears
=
()
=>
<span>Drying
tears...</span>;
const
ShowEmotion
=
({
happy
})
=>
happy
?
<ClapHands
/>
:
<DryTears
/>;
ReactDOM.render(<ShowEmotion
happy={
true
}
/>,

document.getElementById('app'));
1
2
3
4
5
6
7
Maarten
Mulders
(@mthmulders)
#reactin40mins
C 
 
 
JSX
(2)
HEIA
PHIA
const
Ticker
=
({
symbol
})
=>
<div>{
symbol
}</div>;
const
TickerList
=
({
symbols
})
=>
symbols.map(

(symbol)
=>
<Ticker
symbol={
symbol
}
/>
);
const
symbols
=
['HEIA',
'PHIA'];
ReactDOM.render(<TickerList
symbols={
symbols
}
/>,

document.getElementById('app'));
1
2
3
4
5
6
7
8
9
Maarten
Mulders
(@mthmulders)
#reactin40mins
R 
 M
Maarten
Mulders
(@mthmulders)
#reactin40mins
A 
 

So
far,
we've
written
components
and
wired
them
together.
Babel
or
tsc
transpiles
them
to
React.createElement(...)
invocations:
<Greeter
name={
'World'
}
 



/**
transpiles
into
 



React.createElement(Greeter,
{
name:
'World'
},
null)

Maarten
Mulders
(@mthmulders)
#reactin40mins
A 
 

The
React.createElement
invocations
form
a
tree
of
components.
React
maintains
a
virtual
DOM
based
on
your
component
tree.
The
virtual
DOM
is
compared
to
the
actual
DOM.
Only
necessary
changes
are
executed.
Maarten
Mulders
(@mthmulders)
#reactin40mins
R
React
syncs
the
virtual
and
the
actual
DOM
based
on
two
assumptions:
1.
If
two
elements
are
of
different
type,
the
(sub)
tree
will
be
different.
2.
The
key
prop
identifies
child
elements
over
re-renders.
This
tells
React
what
makes
two
elements
"the
same".
Maarten
Mulders
(@mthmulders)
#reactin40mins
1 
E 
 
 


Hei,
Romania!
const
DutchGreeter
=
({
name
})
=>
<div> 
Hallo,
{
name
}!</div>;
const
EnglishGreeter
=
({
name
})
=>
<div> 
Hello,
{
name
}!</div>;
const
RomanianGreeter
=
({
name
})
=>
<div> 
Hei,
{
name
}!</div>;
const
App
=
({
lang,
name
})
=>
{


switch(lang)
{




case
'ro':
return
<RomanianGreeter
name={
name
}
/>




case
'nl':
return
<DutchGreeter
name={
name
}
/>




case
'en':




default

:
return
<EnglishGreeter
name={
name
}
/>


}
};
ReactDOM.render(<App
name='Romania'
lang='ro'
/>,


document.getElementById('app'));
1
2
3
4
5
6
7
8
9
10
11
12
13
Maarten
Mulders
(@mthmulders)
#reactin40mins
2 
T 
KEY

 
const
randomPrice
=
()
=>
100
+
Math.floor(Math.random()
*
900)
const
Ticker
=
({
symbol
})
=>
<span>{
symbol
}:
{
randomPrice()
}
&mdash;
</spa
const
symbols
=
['HEIA',
'PHIA',
'ASML',
'KLMR'].map(

(symbol)
=>
<Ticker
key={
key
}
symbol={
symbol
}
/>
);
ReactDOM.render(<Shuffle
children={
symbols
}
/>,

document.getElementById('app'));
1
2
3
4
5
6
7
8
9
Maarten
Mulders
(@mthmulders)
#reactin40mins
Y 
E
1.
Keeping
state
2.
Reacting
to
events
3.
Fetching
data
over
HTTP
4.
Storing
data
Maarten
Mulders
(@mthmulders)
#reactin40mins
L 
S 
 
 
C
Counter:
0
const
Counter
=
()
=>
{



const
[
counter,
setCounter
]
=
React.useState(0);



return
<div>Counter:
{
counter
}</div>
}
ReactDOM.render(<Counter
/>,
document.getElementById('app'));
1
2
3
4
5
6
7
Maarten
Mulders
(@mthmulders)
#reactin40mins
R 
 
E
Similar
to
DOM
event
handling,
but
1.
event
names
are
different:
onClick
vs
onclick.
2.
event
handlers
are
always
functions,
never
strings.
3.
event
handlers
are
bound
to
a
component,
should
not
live
globally.
4.
event
handlers
receive
an
synthetic
event
-
browser-agnostic!
Maarten
Mulders
(@mthmulders)
#reactin40mins
C 
C
Counter:
0

+ 
  ‑
const
Counter
=
()
=>
{




const
[
counter,
setCounter
]
=
React.useState(0);




const
increase
=
()
=>
setCounter();




const
decrease
=
()
=>
setCounter();




return
<div>Counter:
{
counter
}<br
/>
















<button
onClick={
increase
}>


+


</button>
&nbsp;
















<button
onClick={
decrease
}>


­


</button>











</div>
}
ReactDOM.render(<Counter
/>,
document.getElementById('app'));
1
2
3
4
5
6
7
8
9
10
11
12
Maarten
Mulders
(@mthmulders)
#reactin40mins
C 
C


Greet!
const
Greeter
=
()
=>
{




const
[
name,
setName
]
=
React.useState('');




const
updateName
=
(e)
=>
setName(e.target.value);




const
callback
=
()
=>
alert(``);




return
<div><input
type='text'
onChange={
updateName
}
></input><br
/>
















<button
onClick={
callback
}>Greet
{
name
}!</button></div>
}
ReactDOM.render(<Greeter
/>,
document.getElementById('app'));
1
2
3
4
5
6
7
8
9
10
Maarten
Mulders
(@mthmulders)
#reactin40mins
F 
 
 
HTTP
What
we
need:
1.
A
bit
of
Plain
Old
JavaScript
to
fetch
some
data
2.
A
component
to
show
the
fetched
data
Maarten
Mulders
(@mthmulders)
#reactin40mins
1 
A
 
 
API




















const
url
=
'https: hqd7fvgovgs2jyoosjgryaylcy.apigateway.eu frankfurt-1.oci














.customer oci.com/v1/joke';

const
getJoke
=
()
 
{





return
fetch(url);







};

Maarten
Mulders
(@mthmulders)
#reactin40mins
1 
A
 
 
API
const
checkStatus
=
(response)
 
{





if
(response.status
 
200
 
response.status
<
300)
{









return
Promise.resolve(response);





}
else
{









return
Promise.reject(`HTTP
${response.status}:
${response.statusText}`);





}

};







const
url
=
'https: hqd7fvgovgs2jyoosjgryaylcy.apigateway.eu frankfurt-1.oci














.customer oci.com/v1/joke';

const
getJoke
=
()
 
{





return
fetch(url)

















.then(checkStatus);





};

Maarten
Mulders
(@mthmulders)
#reactin40mins
1 
A
 
 
API
const
checkStatus
=
(response)
 
{





if
(response.status
 
200
 
response.status
<
300)
{









return
Promise.resolve(response);





}
else
{









return
Promise.reject(`HTTP
${response.status}:
${response.statusText}`);





}

};



const
parseJson
=
(response)
 
response.json();



const
url
=
'https: hqd7fvgovgs2jyoosjgryaylcy.apigateway.eu frankfurt-1.oci














.customer oci.com/v1/joke';

const
getJoke
=
()
 
{





return
fetch(url)

















.then(checkStatus)

















.then(parseJson);



};

Maarten
Mulders
(@mthmulders)
#reactin40mins
1 
A
 
 
API
const
checkStatus
=
(response)
 
{





if
(response.status
 
200
 
response.status
<
300)
{









return
Promise.resolve(response);





}
else
{









return
Promise.reject(`HTTP
${response.status}:
${response.statusText}`);





}

};



const
parseJson
=
(response)
 
response.json();



const
url
=
'https: hqd7fvgovgs2jyoosjgryaylcy.apigateway.eu frankfurt-1.oci














.customer oci.com/v1/joke';

const
getJoke
=
()
 
{





return
fetch(url)

















.then(checkStatus)

















.then(parseJson)

















.then(response
 
response.joke);

};

Maarten
Mulders
(@mthmulders)
#reactin40mins
2 
A
 
 
 
 
 

If
you
put
your
left
shoe
on
the
wrong
foot,
it's
on
the
right
foot.
const
RandomJoke
=
()
=>
{




const
[
{
joke,
loading
},
setState
]
=
React.useState({
loading:
true
});




const
fetchRandomJoke
=
async
()
=>
{








//
Does
the
actual
API
call
to
Oracle
Cloud
function,
see
before.








const
joke
=
await
getJoke();








setState({
joke,
loading:
false
})




}




React.useEffect(()
=>
{








fetchRandomJoke()




},
[
]);




if
(loading)
return
<div>Loading...</div>




return
<div>{
joke
}</div>;
};
ReactDOM.render(<RandomJoke
/>,
document.getElementById('app'));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Maarten
Mulders
(@mthmulders)
#reactin40mins
S 
 
 
 

Local
Storage
&
Session
Storage
Part
of
the

Stores
and
retrieves
string
values
Serialise
objects
with
JSON.stringify()
Deserialise
with
JSON.parse()
Persistent
during
browser
session
with
sessionStorage
over
browser
shutdowns
with
localStorage
Web
Storage
API
Maarten
Mulders
(@mthmulders)
#reactin40mins
D 
A
1.
Debugging
2.
Testing
3.
Building
Maarten
Mulders
(@mthmulders)
#reactin40mins
D
Install
the
React
Developer
Tools
for
your
browser
of
choice.
Maarten
Mulders
(@mthmulders)
#reactin40mins
I 
C 
T
Maarten
Mulders
(@mthmulders)
#reactin40mins
D
Maarten
Mulders
(@mthmulders)
#reactin40mins
T 
 

Use
Jest
(test
platform
&
library)
and
(React)
Testing
Library
(testing
utilities)
Render
a
React
component
in
a
unit
test
Make
assertions
about
its
output
and
behaviour
Maarten
Mulders
(@mthmulders)
#reactin40mins
T 
 
 
C
import
{
render,
screen
}
from
'@testing library/react'



describe('<Greeter
 ',
()
 
{





it('should
render
text',
()
 
{









render(<Greeter
name='Romania'
 );









expect(screen.getByText(/hello,
Romania/i)).toBeVisible();





});

});

Maarten
Mulders
(@mthmulders)
#reactin40mins
T 
B 
 
 
C
import
{
f reEvent,
render,
screen
}
from
'@testing library/react'



describe('<AwesomeButton
 ',
()
 
{





it('should
invoke
action
on
click',
()
 
{









const
callback
=
jest.mock();









render(<AwesomeButton
action={
callback
}
 );









f reEvent.click(screen.getByRole('link'));









expect(callback).toHaveBeenCalled();





});

});

Maarten
Mulders
(@mthmulders)
#reactin40mins
D 
 
S 
 

tl;dr:
use
 
(CRA)
Uses
Webpack,
Babel,
ESLint
and
a
dozen
of
other
tools
Tested
to
work
together
Live-reloading
of
changed
code
Source
maps
for
easy
debugging
Have
an
ready-to-go
app
in
one
command
Create
React
App
npx
create react app
my next killer app




or



npm
i
 g
create react app

create react app
my next killer app

Maarten
Mulders
(@mthmulders)
#reactin40mins
U 
CRA
npm
run
start
to
start
developing
npm
run
build
to
create
a
production
build
npm
run
test
to
run
unit
tests
Maarten
Mulders
(@mthmulders)
#reactin40mins
T 

Use
Create
React
App
Think
in
(small)
components
Think
declaratively
U 

Create
React
App:

Dad
Jokes
API:

Philippe
De
Ryck
on
"Building
Secure
React
Applications":
https://bit.ly/c-r-a
https://bit.ly/dad-joke-api
http://bit.ly/secure-react
Maarten
Mulders
(@mthmulders)
#reactin40mins

More Related Content

Similar to React in 40 minutes (Voxxed Days Romania)

Reactive programming every day
Reactive programming every dayReactive programming every day
Reactive programming every dayVadym Khondar
 
Transitioning from SQL to MongoDB
Transitioning from SQL to MongoDBTransitioning from SQL to MongoDB
Transitioning from SQL to MongoDBMongoDB
 
Functional Programming in Java - Code for Maintainability
Functional Programming in Java - Code for MaintainabilityFunctional Programming in Java - Code for Maintainability
Functional Programming in Java - Code for MaintainabilityMarcin Stepien
 
Benefits of Using MongoDB Over RDBMSs
Benefits of Using MongoDB Over RDBMSsBenefits of Using MongoDB Over RDBMSs
Benefits of Using MongoDB Over RDBMSsMongoDB
 
Functional patterns and techniques in C#
Functional patterns and techniques in C#Functional patterns and techniques in C#
Functional patterns and techniques in C#Péter Takács
 
10 ways to make your code rock
10 ways to make your code rock10 ways to make your code rock
10 ways to make your code rockmartincronje
 
Metamodeling vs Metaprogramming, A Case Study on Developing Client Libraries ...
Metamodeling vs Metaprogramming, A Case Study on Developing Client Libraries ...Metamodeling vs Metaprogramming, A Case Study on Developing Client Libraries ...
Metamodeling vs Metaprogramming, A Case Study on Developing Client Libraries ...Markus Scheidgen
 
Concurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STM
Concurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STMConcurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STM
Concurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STMMario Fusco
 
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome Massimiliano Dessì
 
Mobility insights at Swisscom - Understanding collective mobility in Switzerland
Mobility insights at Swisscom - Understanding collective mobility in SwitzerlandMobility insights at Swisscom - Understanding collective mobility in Switzerland
Mobility insights at Swisscom - Understanding collective mobility in SwitzerlandFrançois Garillot
 
Spark Summit EU talk by Francois Garillot and Mohamed Kafsi
Spark Summit EU talk by Francois Garillot and Mohamed KafsiSpark Summit EU talk by Francois Garillot and Mohamed Kafsi
Spark Summit EU talk by Francois Garillot and Mohamed KafsiSpark Summit
 
Blockchain Developers Malaysia Meetup #4 - CRUDy Ethereum Contracts, Wallet W...
Blockchain Developers Malaysia Meetup #4 - CRUDy Ethereum Contracts, Wallet W...Blockchain Developers Malaysia Meetup #4 - CRUDy Ethereum Contracts, Wallet W...
Blockchain Developers Malaysia Meetup #4 - CRUDy Ethereum Contracts, Wallet W...Mark Smalley
 
Is your C# optimized
Is your C# optimizedIs your C# optimized
Is your C# optimizedWoody Pewitt
 
React js - The Core Concepts
React js - The Core ConceptsReact js - The Core Concepts
React js - The Core ConceptsDivyang Bhambhani
 
Advanced Interfaces and Repositories in Laravel
Advanced Interfaces and Repositories in LaravelAdvanced Interfaces and Repositories in Laravel
Advanced Interfaces and Repositories in LaravelJonathan Behr
 
"An introduction to object-oriented programming for those who have never done...
"An introduction to object-oriented programming for those who have never done..."An introduction to object-oriented programming for those who have never done...
"An introduction to object-oriented programming for those who have never done...Fwdays
 
Java Svet - Communication Between Android App Components
Java Svet - Communication Between Android App ComponentsJava Svet - Communication Between Android App Components
Java Svet - Communication Between Android App ComponentsAleksandar Ilić
 
Java Svet - Communication Between Android App Components
Java Svet - Communication Between Android App ComponentsJava Svet - Communication Between Android App Components
Java Svet - Communication Between Android App ComponentsPSTechSerbia
 

Similar to React in 40 minutes (Voxxed Days Romania) (20)

Reactive programming every day
Reactive programming every dayReactive programming every day
Reactive programming every day
 
Transitioning from SQL to MongoDB
Transitioning from SQL to MongoDBTransitioning from SQL to MongoDB
Transitioning from SQL to MongoDB
 
Functional Programming in Java - Code for Maintainability
Functional Programming in Java - Code for MaintainabilityFunctional Programming in Java - Code for Maintainability
Functional Programming in Java - Code for Maintainability
 
Benefits of Using MongoDB Over RDBMSs
Benefits of Using MongoDB Over RDBMSsBenefits of Using MongoDB Over RDBMSs
Benefits of Using MongoDB Over RDBMSs
 
Functional patterns and techniques in C#
Functional patterns and techniques in C#Functional patterns and techniques in C#
Functional patterns and techniques in C#
 
10 ways to make your code rock
10 ways to make your code rock10 ways to make your code rock
10 ways to make your code rock
 
Metamodeling vs Metaprogramming, A Case Study on Developing Client Libraries ...
Metamodeling vs Metaprogramming, A Case Study on Developing Client Libraries ...Metamodeling vs Metaprogramming, A Case Study on Developing Client Libraries ...
Metamodeling vs Metaprogramming, A Case Study on Developing Client Libraries ...
 
Concurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STM
Concurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STMConcurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STM
Concurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STM
 
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
 
Mobility insights at Swisscom - Understanding collective mobility in Switzerland
Mobility insights at Swisscom - Understanding collective mobility in SwitzerlandMobility insights at Swisscom - Understanding collective mobility in Switzerland
Mobility insights at Swisscom - Understanding collective mobility in Switzerland
 
Spark Summit EU talk by Francois Garillot and Mohamed Kafsi
Spark Summit EU talk by Francois Garillot and Mohamed KafsiSpark Summit EU talk by Francois Garillot and Mohamed Kafsi
Spark Summit EU talk by Francois Garillot and Mohamed Kafsi
 
Blockchain Developers Malaysia Meetup #4 - CRUDy Ethereum Contracts, Wallet W...
Blockchain Developers Malaysia Meetup #4 - CRUDy Ethereum Contracts, Wallet W...Blockchain Developers Malaysia Meetup #4 - CRUDy Ethereum Contracts, Wallet W...
Blockchain Developers Malaysia Meetup #4 - CRUDy Ethereum Contracts, Wallet W...
 
Is your C# optimized
Is your C# optimizedIs your C# optimized
Is your C# optimized
 
ajax_pdf
ajax_pdfajax_pdf
ajax_pdf
 
ajax_pdf
ajax_pdfajax_pdf
ajax_pdf
 
React js - The Core Concepts
React js - The Core ConceptsReact js - The Core Concepts
React js - The Core Concepts
 
Advanced Interfaces and Repositories in Laravel
Advanced Interfaces and Repositories in LaravelAdvanced Interfaces and Repositories in Laravel
Advanced Interfaces and Repositories in Laravel
 
"An introduction to object-oriented programming for those who have never done...
"An introduction to object-oriented programming for those who have never done..."An introduction to object-oriented programming for those who have never done...
"An introduction to object-oriented programming for those who have never done...
 
Java Svet - Communication Between Android App Components
Java Svet - Communication Between Android App ComponentsJava Svet - Communication Between Android App Components
Java Svet - Communication Between Android App Components
 
Java Svet - Communication Between Android App Components
Java Svet - Communication Between Android App ComponentsJava Svet - Communication Between Android App Components
Java Svet - Communication Between Android App Components
 

More from Maarten Mulders

What's cooking in Maven? (Devoxx FR)
What's cooking in Maven? (Devoxx FR)What's cooking in Maven? (Devoxx FR)
What's cooking in Maven? (Devoxx FR)Maarten Mulders
 
Making Maven Marvellous (Devnexus)
Making Maven Marvellous (Devnexus)Making Maven Marvellous (Devnexus)
Making Maven Marvellous (Devnexus)Maarten Mulders
 
Making Maven Marvellous (Java.il)
Making Maven Marvellous (Java.il)Making Maven Marvellous (Java.il)
Making Maven Marvellous (Java.il)Maarten Mulders
 
Making Maven Marvellous (JavaZone)
Making Maven Marvellous (JavaZone)Making Maven Marvellous (JavaZone)
Making Maven Marvellous (JavaZone)Maarten Mulders
 
Dapr: Dinosaur or Developer's Dream? (v1)
Dapr: Dinosaur or Developer's Dream? (v1)Dapr: Dinosaur or Developer's Dream? (v1)
Dapr: Dinosaur or Developer's Dream? (v1)Maarten Mulders
 
Dapr: Dinosaur or Developer Dream? (J-Fall)
Dapr: Dinosaur or Developer Dream? (J-Fall)Dapr: Dinosaur or Developer Dream? (J-Fall)
Dapr: Dinosaur or Developer Dream? (J-Fall)Maarten Mulders
 
SSL/TLS for Mortals (Devoxx UK)
SSL/TLS for Mortals (Devoxx UK)SSL/TLS for Mortals (Devoxx UK)
SSL/TLS for Mortals (Devoxx UK)Maarten Mulders
 
SSL/TLS for Mortals (JavaLand)
SSL/TLS for Mortals (JavaLand) SSL/TLS for Mortals (JavaLand)
SSL/TLS for Mortals (JavaLand) Maarten Mulders
 
Making Maven Marvellous (J-Fall)
Making Maven Marvellous (J-Fall)Making Maven Marvellous (J-Fall)
Making Maven Marvellous (J-Fall)Maarten Mulders
 
Building a DSL with GraalVM (Oracle Groundbreaker APAC Virtual Tour)
Building a DSL with GraalVM (Oracle Groundbreaker APAC Virtual Tour)Building a DSL with GraalVM (Oracle Groundbreaker APAC Virtual Tour)
Building a DSL with GraalVM (Oracle Groundbreaker APAC Virtual Tour)Maarten Mulders
 
SSL/TLS for Mortals (Oracle Groundbreaker EMEA Virtual Tour)
SSL/TLS for Mortals (Oracle Groundbreaker EMEA Virtual Tour)SSL/TLS for Mortals (Oracle Groundbreaker EMEA Virtual Tour)
SSL/TLS for Mortals (Oracle Groundbreaker EMEA Virtual Tour)Maarten Mulders
 
SSL/TLS for Mortals (UtrechtJUG)
SSL/TLS for Mortals (UtrechtJUG)SSL/TLS for Mortals (UtrechtJUG)
SSL/TLS for Mortals (UtrechtJUG)Maarten Mulders
 
Building a DSL with GraalVM (javaBin online)
Building a DSL with GraalVM (javaBin online)Building a DSL with GraalVM (javaBin online)
Building a DSL with GraalVM (javaBin online)Maarten Mulders
 
SSL/TLS for Mortals (Lockdown Lecture)
SSL/TLS for Mortals (Lockdown Lecture)SSL/TLS for Mortals (Lockdown Lecture)
SSL/TLS for Mortals (Lockdown Lecture)Maarten Mulders
 
SSL/TLS for Mortals (Devoxx)
 SSL/TLS for Mortals (Devoxx) SSL/TLS for Mortals (Devoxx)
SSL/TLS for Mortals (Devoxx)Maarten Mulders
 
Building a DSL with GraalVM (CodeOne)
Building a DSL with GraalVM (CodeOne)Building a DSL with GraalVM (CodeOne)
Building a DSL with GraalVM (CodeOne)Maarten Mulders
 
Building a DSL with GraalVM (Full Stack Antwerpen)
Building a DSL with GraalVM (Full Stack Antwerpen)Building a DSL with GraalVM (Full Stack Antwerpen)
Building a DSL with GraalVM (Full Stack Antwerpen)Maarten Mulders
 
Building a DSL with GraalVM (Devoxx PL)
Building a DSL with GraalVM (Devoxx PL) Building a DSL with GraalVM (Devoxx PL)
Building a DSL with GraalVM (Devoxx PL) Maarten Mulders
 
Building a DSL with GraalVM (VoxxedDays Luxembourg)
Building a DSL with GraalVM (VoxxedDays Luxembourg)Building a DSL with GraalVM (VoxxedDays Luxembourg)
Building a DSL with GraalVM (VoxxedDays Luxembourg)Maarten Mulders
 
Mastering Microservices with Kong (DevoxxUK 2019)
Mastering Microservices with Kong (DevoxxUK 2019)Mastering Microservices with Kong (DevoxxUK 2019)
Mastering Microservices with Kong (DevoxxUK 2019)Maarten Mulders
 

More from Maarten Mulders (20)

What's cooking in Maven? (Devoxx FR)
What's cooking in Maven? (Devoxx FR)What's cooking in Maven? (Devoxx FR)
What's cooking in Maven? (Devoxx FR)
 
Making Maven Marvellous (Devnexus)
Making Maven Marvellous (Devnexus)Making Maven Marvellous (Devnexus)
Making Maven Marvellous (Devnexus)
 
Making Maven Marvellous (Java.il)
Making Maven Marvellous (Java.il)Making Maven Marvellous (Java.il)
Making Maven Marvellous (Java.il)
 
Making Maven Marvellous (JavaZone)
Making Maven Marvellous (JavaZone)Making Maven Marvellous (JavaZone)
Making Maven Marvellous (JavaZone)
 
Dapr: Dinosaur or Developer's Dream? (v1)
Dapr: Dinosaur or Developer's Dream? (v1)Dapr: Dinosaur or Developer's Dream? (v1)
Dapr: Dinosaur or Developer's Dream? (v1)
 
Dapr: Dinosaur or Developer Dream? (J-Fall)
Dapr: Dinosaur or Developer Dream? (J-Fall)Dapr: Dinosaur or Developer Dream? (J-Fall)
Dapr: Dinosaur or Developer Dream? (J-Fall)
 
SSL/TLS for Mortals (Devoxx UK)
SSL/TLS for Mortals (Devoxx UK)SSL/TLS for Mortals (Devoxx UK)
SSL/TLS for Mortals (Devoxx UK)
 
SSL/TLS for Mortals (JavaLand)
SSL/TLS for Mortals (JavaLand) SSL/TLS for Mortals (JavaLand)
SSL/TLS for Mortals (JavaLand)
 
Making Maven Marvellous (J-Fall)
Making Maven Marvellous (J-Fall)Making Maven Marvellous (J-Fall)
Making Maven Marvellous (J-Fall)
 
Building a DSL with GraalVM (Oracle Groundbreaker APAC Virtual Tour)
Building a DSL with GraalVM (Oracle Groundbreaker APAC Virtual Tour)Building a DSL with GraalVM (Oracle Groundbreaker APAC Virtual Tour)
Building a DSL with GraalVM (Oracle Groundbreaker APAC Virtual Tour)
 
SSL/TLS for Mortals (Oracle Groundbreaker EMEA Virtual Tour)
SSL/TLS for Mortals (Oracle Groundbreaker EMEA Virtual Tour)SSL/TLS for Mortals (Oracle Groundbreaker EMEA Virtual Tour)
SSL/TLS for Mortals (Oracle Groundbreaker EMEA Virtual Tour)
 
SSL/TLS for Mortals (UtrechtJUG)
SSL/TLS for Mortals (UtrechtJUG)SSL/TLS for Mortals (UtrechtJUG)
SSL/TLS for Mortals (UtrechtJUG)
 
Building a DSL with GraalVM (javaBin online)
Building a DSL with GraalVM (javaBin online)Building a DSL with GraalVM (javaBin online)
Building a DSL with GraalVM (javaBin online)
 
SSL/TLS for Mortals (Lockdown Lecture)
SSL/TLS for Mortals (Lockdown Lecture)SSL/TLS for Mortals (Lockdown Lecture)
SSL/TLS for Mortals (Lockdown Lecture)
 
SSL/TLS for Mortals (Devoxx)
 SSL/TLS for Mortals (Devoxx) SSL/TLS for Mortals (Devoxx)
SSL/TLS for Mortals (Devoxx)
 
Building a DSL with GraalVM (CodeOne)
Building a DSL with GraalVM (CodeOne)Building a DSL with GraalVM (CodeOne)
Building a DSL with GraalVM (CodeOne)
 
Building a DSL with GraalVM (Full Stack Antwerpen)
Building a DSL with GraalVM (Full Stack Antwerpen)Building a DSL with GraalVM (Full Stack Antwerpen)
Building a DSL with GraalVM (Full Stack Antwerpen)
 
Building a DSL with GraalVM (Devoxx PL)
Building a DSL with GraalVM (Devoxx PL) Building a DSL with GraalVM (Devoxx PL)
Building a DSL with GraalVM (Devoxx PL)
 
Building a DSL with GraalVM (VoxxedDays Luxembourg)
Building a DSL with GraalVM (VoxxedDays Luxembourg)Building a DSL with GraalVM (VoxxedDays Luxembourg)
Building a DSL with GraalVM (VoxxedDays Luxembourg)
 
Mastering Microservices with Kong (DevoxxUK 2019)
Mastering Microservices with Kong (DevoxxUK 2019)Mastering Microservices with Kong (DevoxxUK 2019)
Mastering Microservices with Kong (DevoxxUK 2019)
 

Recently uploaded

Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Angel Borroy López
 
UI5ers live - Custom Controls wrapping 3rd-party libs.pptx
UI5ers live - Custom Controls wrapping 3rd-party libs.pptxUI5ers live - Custom Controls wrapping 3rd-party libs.pptx
UI5ers live - Custom Controls wrapping 3rd-party libs.pptxAndreas Kunz
 
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsSensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsChristian Birchler
 
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...Akihiro Suda
 
Odoo 14 - eLearning Module In Odoo 14 Enterprise
Odoo 14 - eLearning Module In Odoo 14 EnterpriseOdoo 14 - eLearning Module In Odoo 14 Enterprise
Odoo 14 - eLearning Module In Odoo 14 Enterprisepreethippts
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaHanief Utama
 
Innovate and Collaborate- Harnessing the Power of Open Source Software.pdf
Innovate and Collaborate- Harnessing the Power of Open Source Software.pdfInnovate and Collaborate- Harnessing the Power of Open Source Software.pdf
Innovate and Collaborate- Harnessing the Power of Open Source Software.pdfYashikaSharma391629
 
Introduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdfIntroduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdfFerryKemperman
 
MYjobs Presentation Django-based project
MYjobs Presentation Django-based projectMYjobs Presentation Django-based project
MYjobs Presentation Django-based projectAnoyGreter
 
SpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at RuntimeSpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at Runtimeandrehoraa
 
Implementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureImplementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureDinusha Kumarasiri
 
Powering Real-Time Decisions with Continuous Data Streams
Powering Real-Time Decisions with Continuous Data StreamsPowering Real-Time Decisions with Continuous Data Streams
Powering Real-Time Decisions with Continuous Data StreamsSafe Software
 
CRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. SalesforceCRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. SalesforceBrainSell Technologies
 
Cloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEECloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEEVICTOR MAESTRE RAMIREZ
 
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
 
What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...Technogeeks
 
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
 
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...OnePlan Solutions
 
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
 

Recently uploaded (20)

Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
 
UI5ers live - Custom Controls wrapping 3rd-party libs.pptx
UI5ers live - Custom Controls wrapping 3rd-party libs.pptxUI5ers live - Custom Controls wrapping 3rd-party libs.pptx
UI5ers live - Custom Controls wrapping 3rd-party libs.pptx
 
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsSensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
 
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...
 
Odoo 14 - eLearning Module In Odoo 14 Enterprise
Odoo 14 - eLearning Module In Odoo 14 EnterpriseOdoo 14 - eLearning Module In Odoo 14 Enterprise
Odoo 14 - eLearning Module In Odoo 14 Enterprise
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief Utama
 
Innovate and Collaborate- Harnessing the Power of Open Source Software.pdf
Innovate and Collaborate- Harnessing the Power of Open Source Software.pdfInnovate and Collaborate- Harnessing the Power of Open Source Software.pdf
Innovate and Collaborate- Harnessing the Power of Open Source Software.pdf
 
Introduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdfIntroduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdf
 
MYjobs Presentation Django-based project
MYjobs Presentation Django-based projectMYjobs Presentation Django-based project
MYjobs Presentation Django-based project
 
SpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at RuntimeSpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at Runtime
 
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort ServiceHot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
 
Implementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureImplementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with Azure
 
Powering Real-Time Decisions with Continuous Data Streams
Powering Real-Time Decisions with Continuous Data StreamsPowering Real-Time Decisions with Continuous Data Streams
Powering Real-Time Decisions with Continuous Data Streams
 
CRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. SalesforceCRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. Salesforce
 
Cloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEECloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEE
 
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
 
What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...
 
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
 
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
 
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
 

React in 40 minutes (Voxxed Days Romania)