SlideShare a Scribd company logo
1 of 56
Download to read offline
R 
 
50
M
Maarten
Mulders
(@mthmulders)#reactin50mins
“React
is
a
library
for
declaratively
building
user
interfaces
using
JavaScript
and
(optionally)
XML.
Maarten
Mulders
(@mthmulders)#reactin50mins
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)#reactin50mins
M 
J S
Maarten
Mulders
(@mthmulders)#reactin50mins
C
class
Amount
{




constructor(currency,
value)
{








this.currency
=
currency;








this.value
=
value;




}




getCurrency()
{








return
this.currency;




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



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



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




constructor(currency,
value)
{








this.currency
=
currency;








this.value
=
value;




}




toString()
{








return
``;




}
}
const
text
=
new
Amount('USD',
150).toString();
document.getElementById('app').innerText
=
text;
1
2
3
4
5
6
7
8
9
10
11
12
13
Maarten
Mulders
(@mthmulders)#reactin50mins
B 
JSX
Maarten
Mulders
(@mthmulders)#reactin50mins
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
Needs
to
be
transpiled
to
JavaScript
e.g.
React.createElement(...)
Maarten
Mulders
(@mthmulders)#reactin50mins
E
Elements
can
be
regular
DOM
elements...
(for
now,
but
not
for
long)
const
element
=
<div></div>
ReactDOM.render(element,
document.getElementById('app'));
1
2
Maarten
Mulders
(@mthmulders)#reactin50mins
A
Elements
can
have
attributes...
const
element
=
<div
id='example'></div>
ReactDOM.render(element,
document.getElementById('app'));
1
2
Maarten
Mulders
(@mthmulders)#reactin50mins
...
but
they
can
have
different
names
than
HTML
attributes:
const
element
=
<div
className='red­text'></div>
ReactDOM.render(element,
document.getElementById('app'));
1
2
Maarten
Mulders
(@mthmulders)#reactin50mins
...
and
they
can
behave
differently:
const
style
=
{
color:
'red',
fontWeight:
'bold'
};
const
element
=
<div
style={
style
}></div>
ReactDOM.render(element,
document.getElementById('app'));
1
2
3
Maarten
Mulders
(@mthmulders)#reactin50mins
S 
R 
N
Values
must
have
a
single
root
node
(or
an
array)
const
element
=
<div>x</div><div>y</div>
ReactDOM.render(element,
document.getElementById('app'));
unknown:
Adjacent
JSX
elements
must
be
wrapped
in
an
enclosing
tag.
Did
you
want
a
JSX
fragment
<>


>
1
|
const
element
=
<div>x</div><div>y</div>





|




























^



2
|
ReactDOM.render(element,
document.getElementById('app'));



3
|

1
2
3
Maarten
Mulders
(@mthmulders)#reactin50mins
C
Function
that
takes
props
(think:
arguments)
and
returns
a
React
element.
Hello,
OpenValue!
const
Greeter
=
(props)
=>
<div>Hello,
OpenValue!</div>
ReactDOM.render(<Greeter
/>,
document.getElementById('app'));
1
2
Maarten
Mulders
(@mthmulders)#reactin50mins
A 
JSX
Maarten
Mulders
(@mthmulders)#reactin50mins
E 
 
JSX
The
answer
to
the
ultimate
question
of
life,
universe
and
everything:
 
const
answerToQuestionOfLife
=
40
+
2;
const
askQuestionOfLife
=
()
=>
answerToQuestionOfLife;
const
Example
=
()
=>
<div>




The
answer
to
the
ultimate
question
of
life,




universe
and
everything:




&nbsp;




<strong>{

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

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

Alternatively,
using
object
decomposition:
Hello
!
const
Greeter
=
({
name
})
=>
<div>Hello
{
}!</div>
ReactDOM.render(<Greeter
name='OpenValue'
/>,
document.getElementById('app'));
1
2
Maarten
Mulders
(@mthmulders)#reactin50mins
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)#reactin50mins
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)#reactin50mins
R 
 M
Maarten
Mulders
(@mthmulders)#reactin50mins
A 
 

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



/**
transpiles
into
 



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

Maarten
Mulders
(@mthmulders)#reactin50mins
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)#reactin50mins
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.
Maarten
Mulders
(@mthmulders)#reactin50mins
1 
E 
 
 


Hallo,
OpenValue!
const
DutchGreeter
=
({
name
})
=>
<div> 
Hallo,
{
name
}!</div>;
const
EnglishGreeter
=
({
name
})
=>
<div> 
Hello,
{
name
}!</div>;
const
SpanishGreeter
=
({
name
})
=>
<div> 
¡Hola,
{
name
}!</div>;
const
App
=
({
lang,
name
})
=>
{


switch(lang)
{




case
'es':
return
<SpanishGreeter
name={
name
}
/>




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




case
'en':




default

:
return
<EnglishGreeter
name={
name
}
/>


}
};
ReactDOM.render(<App
name='OpenValue'
lang='nl'
/>,


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

HEIA
PHIA
const
Ticker
=
({
symbol
})
=>
<div>{
symbol
}</div>;
const
TickerList
=
({
symbols
})
=>
symbols.map(

(symbol)
=>
<Ticker
key={
symbol
}
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)#reactin50mins
Y 
E
1.
Keeping
state
2.
Reacting
to
events
3.
Fetching
data
over
HTTP
4.
Storing
data
Maarten
Mulders
(@mthmulders)#reactin50mins
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)#reactin50mins
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)#reactin50mins
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)#reactin50mins
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)#reactin50mins
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)#reactin50mins
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)#reactin50mins
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)#reactin50mins
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)#reactin50mins
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)#reactin50mins
2 
A
 
 
 
 
 

Loading...
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();








//
?




}




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)#reactin50mins
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)#reactin50mins
D 
A
1.
Debugging
2.
Testing
3.
Building
Maarten
Mulders
(@mthmulders)#reactin50mins
D
Install
the
React
Developer
Tools
for
your
browser
of
choice.
Maarten
Mulders
(@mthmulders)#reactin50mins
I 
C 
T
Maarten
Mulders
(@mthmulders)#reactin50mins
D
Maarten
Mulders
(@mthmulders)#reactin50mins
T 
 

Use
Jest
(testing
platform
&
library)
and
Enzyme,
a
testing
utility
for
React
Render
a
React
component
in
a
unit
test
Make
assertions
about
its
output
and
behaviour
Maarten
Mulders
(@mthmulders)#reactin50mins
T 
 
 
C
import
{
shallow
}
from
'enzyme';



describe('<Greeter
 ',
()
 
{





it('should
render
text',
()
 
{









const
wrapper
=
shallow(<Greeter
name='DevNexus'
 );









expect(wrapper.text()).toBe('Hello
DevNexus');





});

});

Maarten
Mulders
(@mthmulders)#reactin50mins
T 
B 
 
 
C
import
{
shallow
}
from
'enzyme';



describe('<AwesomeButton
 ',
()
 
{





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









const
callback
=
jest.mock();









const
wrapper
=
mount(<AwesomeButton
action={
callback
}
 );









wrapper.f nd('a').simulate('click');









expect(dummy).toHaveBeenCalled();





});

});

Maarten
Mulders
(@mthmulders)#reactin50mins
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)#reactin50mins
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)#reactin50mins
G 
B
Maarten
Mulders
(@mthmulders)#reactin50mins
T 
R 
 
(C )
H
1.
Name
must
start
with
use!
2.
Only
use
in
React
function
components
not
in
classes
not
outside
React
components
Maarten
Mulders
(@mthmulders)#reactin50mins
C 
H
I
tried
to
organize
a
Hide
and
Seek
tournament,
but
I
eventually
gave
up.
Good
players
are
hard
to
find.
const
useRandomJoke
=
()
=>
{




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




const
fetchRandomJoke
=
async
()
=>
{








const
joke
=
await
getJoke();








setState({
loading:
false,
joke
});




}




React.useEffect(()
=>
{
fetchRandomJoke()
},
[
]);




return
{
loading,
joke
};
};
const
RandomJoke
=
({

})
=>
{




const
{
joke,
loading
}
=
useRandomJoke()




if
(loading)
return
<div>Loading...</div>;
1
2
3
4
5
6
7
8
9
10
11
12
13
14


Maarten
Mulders
(@mthmulders)#reactin50mins
T 

Use
Create
React
App
Think
in
(small)
components
Think
declaratively
I
❤

your
feedback
@

U 

Create
React
App:

Dad
Jokes
API:

schedule.devnexus.com
https://bit.ly/c-r-a
https://bit.ly/dad-joke-api
Maarten
Mulders
(@mthmulders)#reactin50mins

More Related Content

Similar to React in 50 Minutes (OpenValue)

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
Mario Fusco
 
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
martincronje
 
ASPNET_MVC_Tutorial_06_CS
ASPNET_MVC_Tutorial_06_CSASPNET_MVC_Tutorial_06_CS
ASPNET_MVC_Tutorial_06_CS
tutorialsruby
 
ASPNET_MVC_Tutorial_06_CS
ASPNET_MVC_Tutorial_06_CSASPNET_MVC_Tutorial_06_CS
ASPNET_MVC_Tutorial_06_CS
tutorialsruby
 

Similar to React in 50 Minutes (OpenValue) (20)

React in 45 Minutes (Jfokus)
React in 45 Minutes (Jfokus)React in 45 Minutes (Jfokus)
React in 45 Minutes (Jfokus)
 
Building web applications with React (Jfokus)
Building web applications with React (Jfokus)Building web applications with React (Jfokus)
Building web applications with React (Jfokus)
 
Vývojařská Plzeň - React
Vývojařská Plzeň - ReactVývojařská Plzeň - React
Vývojařská Plzeň - React
 
React - An Introduction
React - An IntroductionReact - An Introduction
React - An Introduction
 
13-IntroJavascript.pptx
13-IntroJavascript.pptx13-IntroJavascript.pptx
13-IntroJavascript.pptx
 
13-IntroJavascript.pptx
13-IntroJavascript.pptx13-IntroJavascript.pptx
13-IntroJavascript.pptx
 
13-IntroJavascript.pptx
13-IntroJavascript.pptx13-IntroJavascript.pptx
13-IntroJavascript.pptx
 
ADO.NET Entity Framework by Jose A. Blakeley and Michael Pizzo
ADO.NET Entity Framework by Jose A. Blakeley and Michael PizzoADO.NET Entity Framework by Jose A. Blakeley and Michael Pizzo
ADO.NET Entity Framework by Jose A. Blakeley and Michael Pizzo
 
React js - The Core Concepts
React js - The Core ConceptsReact js - The Core Concepts
React js - The Core Concepts
 
Rails World 2023: Powerful Rails Features You Might Not Know
Rails World 2023: Powerful Rails Features You Might Not KnowRails World 2023: Powerful Rails Features You Might Not Know
Rails World 2023: Powerful Rails Features You Might Not Know
 
Reactive programming every day
Reactive programming every dayReactive programming every day
Reactive programming every day
 
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
 
Asp.NET MVC
Asp.NET MVCAsp.NET MVC
Asp.NET MVC
 
MvvmCross Quickstart
MvvmCross QuickstartMvvmCross Quickstart
MvvmCross Quickstart
 
Advanced Interfaces and Repositories in Laravel
Advanced Interfaces and Repositories in LaravelAdvanced Interfaces and Repositories in Laravel
Advanced Interfaces and Repositories in Laravel
 
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
 
POLITEKNIK MALAYSIA
POLITEKNIK MALAYSIAPOLITEKNIK MALAYSIA
POLITEKNIK MALAYSIA
 
Introduction of javascript
Introduction of javascriptIntroduction of javascript
Introduction of javascript
 
ASPNET_MVC_Tutorial_06_CS
ASPNET_MVC_Tutorial_06_CSASPNET_MVC_Tutorial_06_CS
ASPNET_MVC_Tutorial_06_CS
 
ASPNET_MVC_Tutorial_06_CS
ASPNET_MVC_Tutorial_06_CSASPNET_MVC_Tutorial_06_CS
ASPNET_MVC_Tutorial_06_CS
 

More from 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

%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
masabamasaba
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
masabamasaba
 
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Medical / Health Care (+971588192166) Mifepristone and Misoprostol tablets 200mg
 

Recently uploaded (20)

%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
 
Harnessing ChatGPT - Elevating Productivity in Today's Agile Environment
Harnessing ChatGPT  - Elevating Productivity in Today's Agile EnvironmentHarnessing ChatGPT  - Elevating Productivity in Today's Agile Environment
Harnessing ChatGPT - Elevating Productivity in Today's Agile Environment
 
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdfPayment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial Goals
 
%in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park %in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park
 
tonesoftg
tonesoftgtonesoftg
tonesoftg
 
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
 
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdf
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionIntroducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview Questions
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
WSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go PlatformlessWSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go Platformless
 
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
 
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
 
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
 
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
 
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
 

React in 50 Minutes (OpenValue)