SlideShare a Scribd company logo
1 of 102
REDUX &
ANGULAR 2.0
Nir Kaufman
Nir Kaufman
Head of Angular Development @ 500Tech
- AngularJS evangelist
- International speaker
- Guitar player
*Photoshop
THE CHALLENGE
SPA BECOME
INCREASINGLY
COMPLICATED
THERE IS NOTHING
WRONG WITH THE
MVC PATTERN
IF YOU ARE
BUILDING A CRUD
APPLICATION
BUT WE ARE
PUSHING THE
ENVELOPE AS MUCH
AS WE CAN
MANAGING AN
EVER-CHANGING STATE
IS A HARD TASK
EVERYTHING IS
CONNECTED TO
EVERYTHING
VIEW
VIEW
CONTROLLER
VIEW
CONTROLLER
MODEL MODEL
VIEW
CONTROLLER
MODEL MODEL MODEL
VIEW
CONTROLLER
MODEL MODEL MODEL
MODEL
VIEW
CONTROLLER
MODEL MODEL MODEL MODEL
MODEL
VIEW
CONTROLLER
MODEL
LIBRARY
MODEL MODEL MODEL
MODEL MODEL
VIEW
CONTROLLER
MODEL
LIBRARYLIBRARY
MODEL MODEL MODEL
MODEL MODEL MODEL MODEL
CHANGING SOMETHING
BREAKS SOMETHING
SOMEWHERE
ENTER REDUX
https://github.com/nirkaufman/redux-playground
http://tinyurl.com/hq23lsa
PLAY ALONG
REDUX IS A LIBRARY
FOR IMPLEMNETING A
DESIGN PATTERN
REDUX ATTEMPTS TO
MAKE STATE MUTATIONS
PREDICTABLE
INSPIRED BY
FLUX, CQRS &
EVENT SOURCING
REDUX INTREDUCE
THREE PRINCIPLES
SINGLE SOURCE
OF TRUTH
the state of your whole application is stored in
an object tree within a single store
THE TRUTH IS OUT THERE
class SideBarComponent {



private visible: boolean;



toggle(){

this.visible = !this.visible

}

}
Stateful components
class TabsComponent {



private activeTab:Tab;



activateTab(tab) {

this.activeTab = tab;

}

}
Stateful components
class Accounts {



private accounts: Account[];



getAccounts() {

return this.accounts;

}

}
Data Models
const state = {

tabs: [],

accounts: [],

sidebar: {}

};
Application state
app state
STOREUI
stateless UI
THE STATE IS
READ ONLY
the only way to mutate the state is to emit an
action, an object describing what happened
class Store {



private state: Object;



getState(){

return this.state;

} 

}
Read-only State
STOREUI
STATEgetState()
STOREUI
STATEgetState()
ACTIONdispatch(action)
PURE FUNCTIONS
to specify how the state tree is transformed
by actions, you write pure functions.
PURE FUNCTION
return value is only determined by its input values,
without observable side effects.
PURE
FUNCTION
Current State
Action
Next State
Calculate the next state
PURE
FUNCTION
Current State
Action
Next State
Reducer
Calculate the next state
Uni directional data flow
UI STOREactions
state
ENTER THE STORE
THE STORE IS THE
HEART OF REDUX
TO CREATE A STORE
WE NEED A REDUCER
import { createStore } from 'redux';



const store = createStore(reducer);
import { createStore } from 'redux';



const store = createStore(reducer);
REDUCE METHOD
applies a function against an accumulator and
each value of the array (from left-to-right) to
reduce it to a single value.
function sum (previousVal, currentVal) {

return previousVal + currentVal;

}



[0, 1, 2, 3, 4].reduce(sum);
// => 10
Reduce in action
EVENT SOURCING
capture all changes to an application state as a
sequence of events.
function counter (state, action) {

switch (action) {

case 'up':

return state + 1;

case 'down':

return state - 1;

default:

return state;

}

}



['up', 'up', 'down'].reduce( counter, 0 );
Simple counter app
THE REDUCER RETURNS
THE NEXT STATE
BASED ON A SEQUENCE
OF ACTIONS
THE SAME SEQUENCE
OF ACTIONS
WILL PRODUCE THE
SAME STATE
PREDICTABLE
STATE CONTAINER
HANDS ON!
implementing a working store
in less then 30 lines of code.
function createStore(reducer) {

let state = null;

const listeners = [];



function getState() {

return state;

}



function dispatch(action) {

state = reducer(state, action);

listeners.forEach( listener => listener() )

}



function subscribe(listener) {

listeners.push(listener);

return function unsubscribe() {

let index = listeners.indexOf(listener);

listeners.splice(index, 1)

}

}



return { getState, dispatch, subscribe }

}
STORE API
dispatch(action)
subscribe(listener)
getState()
replaceReducer(reducer)
ASYNC DATA FLOW
MIDDLEWARE
extension point between dispatching an action,
and the moment it reaches the reducer.
Async flow with middlewares
UI STOREaction
state
Async flow with middlewares
UI STORE
state
MIDDLEWARE
action action
export const middleware = store => next => action => {

return next(action)

};
Middleware
- get the current state from the store
- pass an action to the next middleware
- access the provided action
ANGULAR & REDUX
ANGULAR IS A NEW
PLATFORM FOR BUILDING
COMPLEX MODERN SPA’S
https://github.com/nirkaufman/angular2-redux-workshop.git
http://tinyurl.com/h4bqmut
GET THE CODE
git checkout master
AN ANGULAR APP IS A
TREE OF COMPONENTS
WE MAP PROPERTIES
TO THE STATE
WE DISPATCH ACTIONS
IN REACTION TO EVENTS
COMPONENT
COMPONENT
STORE
[properties](events)
actions
state
git checkout 01_project-structure
ANGULAR 2.0
ENCOURAGING AN
OOP APPROACH
TO USE DEPENDENCY
INJECTIONS WITH REDUX
WE WRAP STUFF IN
PROVIDERS
import {createStore} from “redux";
import {RootReducer} from './reducers/root';


export class Store {



private store = createStore(rootReducer);



get state() {

return this.store.getState();

}



dispatch(action){

this.store.dispatch(action)

}

}
WE COMBINE MULTIPLY
REDUCERS TO ONE
ROOT REDUCER
import {combineReducers} from 'redux';



export const RootReducer = combineReducers({

app: (state = 0) => state

});
combineReducers in action
WE NEED TO REGISTER
OUR STORE PROVIDER
ON THE MODULE
@NgModule({

declarations: [AppComponent],

imports : [BrowserModule, HttpModule],

providers : [Store],

bootstrap : [AppComponent]

})
NOW WE CAN INJECT
IT TO OUR COMPONENT
AND GET THE STATE!
export class AppComponent {



constructor(store: Store) {

console.log(store.state);

}

}
git checkout 02_wiring
COMMON SCENARIOS
REQUIREMENTS
CRUD operations
Authentication
Notifications
Persistance
View modes
Logging
@Injectable()

export class ListActions {



private store:Store;



constructor(_store:Store) {

this.store = _store;

}



add(item) {

this.store.dispatch({

type : LIST.ADD_ITEM,

payload: item

})

}



remove(item) {

this.store.dispatch({

type : LIST.REMOVE_ITEM,

payload: item

})

}

}
The list actions class is
an helper for dispatching
actions to the store
git checkout 03_crud
@Injectable()

export class Auth {

private http:Http;

private URL:string;



constructor(_http:Http) {

this.http = _http;

this.URL = 'http://localhost:4000/api/login';

}



middleware = store => next => action => {



if (action.type !== USER.LOGIN) {

return next(action)


} else if (action.type === USER.LOGIN) {



const successHandler = result => next({

type : USER.LOGIN_SUCCESS,

payload: result.json()

});



const errorHandler = error => next({

type : USER.LOGIN_FAILED,

payload: error.json()

});



this.http.post(this.URL, action.payload)

.subscribe(successHandler, errorHandler);



return next({type: APP.LOADING})

}

}

}
By wrapping the
middleware in provider
we can use angular
services such as Http
git checkout 04_authentication
const initialState = {

loading: false

};



export function appReducer(state = initialState, action) {



switch (action.type) {

case APP.LOADING:

return Object.assign({}, state, {loading: true});



case APP.READY:

case USER.LOGIN_SUCCESS:

return Object.assign({}, state, {loading: false});



default:

return state;

}

}
‘application level’ reducer can handle
git checkout 05_spinner
GET READY FOR
TIME TRAVEL
DEBUGGING
class Model {



private items = [];





addItem(item) {}



updateIten(item) {...}



removeItem(item) {...}



}
separation of state from mutation methods
class ModelCrud {



static addItem(model, item) {…}



static updateIten(model, item) {…}



static removeItem(model, item) {…}



}
separation of state from mutation methods
const Model = {

items: []

};
git checkout 06_debugger
NEXT STEPS
Angular & Redux Workshop
https://leanpub.com/redux-book
THE COMPLETE
REDUX BOOK
Angular & Redux Workshop
RESOURCES
REDUX
http://redux.js.org/
https://egghead.io/series/getting-started-with-redux
CQRS & EVENT SOURCING
https://msdn.microsoft.com/en-us/library/dn568103.aspx
https://msdn.microsoft.com/en-us/library/dn589792.aspx
ANGULAR 2
angular-2-change-detection-explained.html
https://github.com/ngrx/store
https://github.com/angular-redux/ng2-redux
NIR KAUFMAN
nir@500tech.com
Head of Angular Development @ 500Tech
@nirkaufman
github.com/nirkaufman
meetup.com/Angular-AfterHours/
keep in touch!

More Related Content

What's hot

What's hot (20)

Redux in Angular2 for jsbe
Redux in Angular2 for jsbeRedux in Angular2 for jsbe
Redux in Angular2 for jsbe
 
Boosting Angular runtime performance
Boosting Angular runtime performanceBoosting Angular runtime performance
Boosting Angular runtime performance
 
Angular redux
Angular reduxAngular redux
Angular redux
 
Workshop 20: ReactJS Part II Flux Pattern & Redux
Workshop 20: ReactJS Part II Flux Pattern & ReduxWorkshop 20: ReactJS Part II Flux Pattern & Redux
Workshop 20: ReactJS Part II Flux Pattern & Redux
 
React + Redux. Best practices
React + Redux.  Best practicesReact + Redux.  Best practices
React + Redux. Best practices
 
Ngrx
NgrxNgrx
Ngrx
 
Intro to Redux | DreamLab Academy #3
Intro to Redux | DreamLab Academy #3 Intro to Redux | DreamLab Academy #3
Intro to Redux | DreamLab Academy #3
 
Modern Web Developement
Modern Web DevelopementModern Web Developement
Modern Web Developement
 
Workshop 13: AngularJS Parte II
Workshop 13: AngularJS Parte IIWorkshop 13: AngularJS Parte II
Workshop 13: AngularJS Parte II
 
Workshop 19: ReactJS Introduction
Workshop 19: ReactJS IntroductionWorkshop 19: ReactJS Introduction
Workshop 19: ReactJS Introduction
 
Introduction to React & Redux
Introduction to React & ReduxIntroduction to React & Redux
Introduction to React & Redux
 
React & Redux
React & ReduxReact & Redux
React & Redux
 
Workshop 22: React-Redux Middleware
Workshop 22: React-Redux MiddlewareWorkshop 22: React-Redux Middleware
Workshop 22: React-Redux Middleware
 
Creating a WYSIWYG Editor with React
Creating a WYSIWYG Editor with ReactCreating a WYSIWYG Editor with React
Creating a WYSIWYG Editor with React
 
Using React, Redux and Saga with Lottoland APIs
Using React, Redux and Saga with Lottoland APIsUsing React, Redux and Saga with Lottoland APIs
Using React, Redux and Saga with Lottoland APIs
 
Workshop 14: AngularJS Parte III
Workshop 14: AngularJS Parte IIIWorkshop 14: AngularJS Parte III
Workshop 14: AngularJS Parte III
 
Workshop 23: ReactJS, React & Redux testing
Workshop 23: ReactJS, React & Redux testingWorkshop 23: ReactJS, React & Redux testing
Workshop 23: ReactJS, React & Redux testing
 
Quick start with React | DreamLab Academy #2
Quick start with React | DreamLab Academy #2Quick start with React | DreamLab Academy #2
Quick start with React | DreamLab Academy #2
 
Redux training
Redux trainingRedux training
Redux training
 
React with Redux
React with ReduxReact with Redux
React with Redux
 

Viewers also liked

Viewers also liked (20)

Webstorm
WebstormWebstorm
Webstorm
 
Angular Pipes Workshop
Angular Pipes WorkshopAngular Pipes Workshop
Angular Pipes Workshop
 
Angular2 - getting-ready
Angular2 - getting-ready Angular2 - getting-ready
Angular2 - getting-ready
 
Angular2 workshop
Angular2 workshopAngular2 workshop
Angular2 workshop
 
Up & running with ECMAScript6
Up & running with ECMAScript6Up & running with ECMAScript6
Up & running with ECMAScript6
 
Angularjs - lazy loading techniques
Angularjs - lazy loading techniques Angularjs - lazy loading techniques
Angularjs - lazy loading techniques
 
Building Universal Applications with Angular 2
Building Universal Applications with Angular 2Building Universal Applications with Angular 2
Building Universal Applications with Angular 2
 
Data Structures in javaScript 2015
Data Structures in javaScript 2015Data Structures in javaScript 2015
Data Structures in javaScript 2015
 
Solid angular
Solid angularSolid angular
Solid angular
 
Angularjs - Unit testing introduction
Angularjs - Unit testing introductionAngularjs - Unit testing introduction
Angularjs - Unit testing introduction
 
Angular js routing options
Angular js routing optionsAngular js routing options
Angular js routing options
 
AngularJS performance & production tips
AngularJS performance & production tipsAngularJS performance & production tips
AngularJS performance & production tips
 
Angular 2 - Better or worse
Angular 2 - Better or worseAngular 2 - Better or worse
Angular 2 - Better or worse
 
Angular 2 - Core Concepts
Angular 2 - Core ConceptsAngular 2 - Core Concepts
Angular 2 - Core Concepts
 
How to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your NicheHow to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your Niche
 
Webpack and angularjs
Webpack and angularjsWebpack and angularjs
Webpack and angularjs
 
AngularJS - Services
AngularJS - ServicesAngularJS - Services
AngularJS - Services
 
Angular js - 10 reasons to choose angularjs
Angular js - 10 reasons to choose angularjs Angular js - 10 reasons to choose angularjs
Angular js - 10 reasons to choose angularjs
 
Xamarin Dev Days - Introduction to Xamarin.Forms, Insights, Test Cloud
Xamarin Dev Days -  Introduction to Xamarin.Forms, Insights, Test CloudXamarin Dev Days -  Introduction to Xamarin.Forms, Insights, Test Cloud
Xamarin Dev Days - Introduction to Xamarin.Forms, Insights, Test Cloud
 
20140207 xamarin-red fabriq-microsoft-techdays-nativemobileappdevelopmentwith...
20140207 xamarin-red fabriq-microsoft-techdays-nativemobileappdevelopmentwith...20140207 xamarin-red fabriq-microsoft-techdays-nativemobileappdevelopmentwith...
20140207 xamarin-red fabriq-microsoft-techdays-nativemobileappdevelopmentwith...
 

Similar to Redux with angular 2 - workshop 2016

Redux. From twitter hype to production
Redux. From twitter hype to productionRedux. From twitter hype to production
Redux. From twitter hype to production
FDConf
 

Similar to Redux with angular 2 - workshop 2016 (20)

Redux. From twitter hype to production
Redux. From twitter hype to productionRedux. From twitter hype to production
Redux. From twitter hype to production
 
Understanding redux
Understanding reduxUnderstanding redux
Understanding redux
 
React state managmenet with Redux
React state managmenet with ReduxReact state managmenet with Redux
React state managmenet with Redux
 
Redux. From twitter hype to production
Redux. From twitter hype to productionRedux. From twitter hype to production
Redux. From twitter hype to production
 
Prescribing RX Responsibly
Prescribing RX ResponsiblyPrescribing RX Responsibly
Prescribing RX Responsibly
 
Ngrx slides
Ngrx slidesNgrx slides
Ngrx slides
 
Maintaining sanity in a large redux app
Maintaining sanity in a large redux appMaintaining sanity in a large redux app
Maintaining sanity in a large redux app
 
The evolution of redux action creators
The evolution of redux action creatorsThe evolution of redux action creators
The evolution of redux action creators
 
React redux
React reduxReact redux
React redux
 
Introduction to ReactJS and Redux
Introduction to ReactJS and ReduxIntroduction to ReactJS and Redux
Introduction to ReactJS and Redux
 
Side effects-con-redux
Side effects-con-reduxSide effects-con-redux
Side effects-con-redux
 
State of the state
State of the stateState of the state
State of the state
 
Introducing Vuex in your project
Introducing Vuex in your projectIntroducing Vuex in your project
Introducing Vuex in your project
 
State manager in Vue.js, from zero to Vuex
State manager in Vue.js, from zero to VuexState manager in Vue.js, from zero to Vuex
State manager in Vue.js, from zero to Vuex
 
Inversion Of Control
Inversion Of ControlInversion Of Control
Inversion Of Control
 
Let's start with REDUX
Let's start with REDUXLet's start with REDUX
Let's start with REDUX
 
React js programming concept
React js programming conceptReact js programming concept
React js programming concept
 
From mvc to redux: 停看聽
From mvc to redux: 停看聽From mvc to redux: 停看聽
From mvc to redux: 停看聽
 
React lecture
React lectureReact lecture
React lecture
 
Pieter De Baets - An introduction to React Native
Pieter De Baets - An introduction to React NativePieter De Baets - An introduction to React Native
Pieter De Baets - An introduction to React Native
 

More from Nir Kaufman

More from Nir Kaufman (9)

Angular Dependency Injection
Angular Dependency InjectionAngular Dependency Injection
Angular Dependency Injection
 
Angular Prestige: Less-known API and techniques
Angular Prestige: Less-known API and techniquesAngular Prestige: Less-known API and techniques
Angular Prestige: Less-known API and techniques
 
Angular CLI custom builders
Angular CLI custom buildersAngular CLI custom builders
Angular CLI custom builders
 
Electronic music 101 for developers
Electronic music 101 for developersElectronic music 101 for developers
Electronic music 101 for developers
 
Nestjs MasterClass Slides
Nestjs MasterClass SlidesNestjs MasterClass Slides
Nestjs MasterClass Slides
 
Angular EE - Special Workshop by Nir Kaufman
Angular EE - Special Workshop by Nir KaufmanAngular EE - Special Workshop by Nir Kaufman
Angular EE - Special Workshop by Nir Kaufman
 
Decorators in js
Decorators in jsDecorators in js
Decorators in js
 
Styling recipes for Angular components
Styling recipes for Angular componentsStyling recipes for Angular components
Styling recipes for Angular components
 
Introduction To Angular's reactive forms
Introduction To Angular's reactive formsIntroduction To Angular's reactive forms
Introduction To Angular's reactive forms
 

Recently uploaded

Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 

Recently uploaded (20)

Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Top 10 Most Downloaded Games on Play Store in 2024
Top 10 Most Downloaded Games on Play Store in 2024Top 10 Most Downloaded Games on Play Store in 2024
Top 10 Most Downloaded Games on Play Store in 2024
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 

Redux with angular 2 - workshop 2016