SlideShare a Scribd company logo
1 of 102
Download to read offline
Reduxing
Like a pro!
Boris Dinkevich boris@500tech.com
WHAT WILL WE LEARN?
1. Cool stuff
WHAT IS COOL STUFF?
WHAT IS COOL STUFF?
What is Redux

How it works

Connect()

Reducers

Immutability

seamless-immutable

Reducers

Action creators

Consts

redux-actions

Middleware

redux-thunk

API

more?
TOOLS
https://github.com/markerikson/redux-ecosystem-links
Boris Dinkevich
- 4 years Dev Ops
- 4 years Embedded C
- 4 years Ruby on Rails
- 4 years JavaScript (Angular/React)
Developing stuff
FLUX
MVC
FLUX
Chat
Notifications
Messages
Page Title
Chat
Notifications
Messages
Page Title
Data
Components
Dispatcher
ActionsStores
REDUX
ONE STORE
ONE STATE
Components
Reducer
ActionsStore
Current State
Next State
Reducers
(processors)
Action
ADDING REDUX
Installation
npm install —save redux
Store
import { createStore } from 'redux';



const store = createStore(x => x, {});
REDUX BASE
The Store
getState()
dispatch(action)
subscribe(listener)
replaceReducer(nextReducer)
The Store
getState()
dispatch(action)
subscribe(listener)
replaceReducer(nextReducer)
The Store
getState()
dispatch(action)
subscribe(listener)
replaceReducer(nextReducer)
observable
USING THEM?
Mini App
const reducer = (state, { type }) => type === 'INC' ? state + 1 : state;

const store = Redux.createStore(reducer, 0);


const render = () => $('body').html(store.getState());

store.subscribe(render);



setInterval(

() => store.dispatch({ type: 'INC' }),

300

);
Mini App
const reducer = (state, { type }) => type === 'INC' ? state + 1 : state;
const store = Redux.createStore(reducer, 0);


const render = () => $('body').html(store.getState());

store.subscribe(render);



setInterval(

() => store.dispatch({ type: 'INC' }),

300

);
Mini App
const reducer = (state, { type }) => type === 'INC' ? state + 1 : state;

const store = Redux.createStore(reducer, 0);
const render = () => $('body').html(store.getState());

store.subscribe(render);



setInterval(

() => store.dispatch({ type: 'INC' }),

300

);
Mini App
const reducer = (state, { type }) => type === 'INC' ? state + 1 : state;

const store = Redux.createStore(reducer, 0);


const render = () => $('body').html(store.getState());

store.subscribe(render);



setInterval(

() => store.dispatch({ type: 'INC' }),

300

);
IMPLEMENTATION?
https://codepen.io/borisd/pen/bWEovO
class Store {
constructor(reducer, state) {
Object.assign(this, { state, reducer, cbs: [] });
}
getState() {
return this.state
}
dispatch(action) {
this.state = this.reducer(this.state, action);
this.cbs.forEach(cb => cb());
}
subscribe(cb) {
this.cbs.push(cb);
return () => this.cbs = this.cbs.filter(i => i !== cb);
}
}
const createStore = (reducer, initialState) =>
new Store(reducer, initialState);
FIRST, REACT
CHANGE DETECTION
Change Detection
<Recipe />
<Recipes />
State
Id: 1
Recipes[]
Recipe
Title: ‘Two’
Recipe
Id: 2Title: ‘One’
<Recipes />
Change Detection
<Recipe />
<Recipes />
State
Id: 1
Recipes[]
Recipe
Title: ‘Five’
Recipe
Id: 2Title: ‘One’
<Recipes />
setState({ recipes: newRecipes })
Change Detection
<Recipe />
<Recipes />
State
Id: 1
Recipes[]
Recipe
Title: ‘Five’
Recipe
Id: 2Title: ‘One’
<Recipes />
setState({ recipes: newRecipes })
Change Detection
<Recipe />
<Recipes />
State
Id: 1
Recipes[]
Recipe
Title: ‘Five’
Recipe
Id: 2Title: ‘One’
<Recipes />
Change Detection
<Recipe />
<Recipes />
State
Id: 1
Recipes[]
Recipe
Title: ‘Five’
Recipe
Id: 2Title: ‘One’
<Recipes />
MUTATE STATE
OUR STATE
State
Recipes
Omelette Pancaek
User
Boris
T1
REFERENCE TREES
State
Recipes
Omelette Pancaek
User
Boris
T1
Pancake
T2
REFERENCE TREES
State
Recipes
Omelette Pancaek
User
Boris
T1
Recipes
Omelette Pancake
T2
REFERENCE TREES
State
Recipes
Omelette Pancaek
User
Boris
T1
State
Recipes
Omelette Pancake
User
Boris
T2
IN MEMORY
State
Recipes
Omelette Pancaek
User
Boris
State
Recipes
Pancake
T1 T2
ACTION #2
State
Recipes
Omelette Pancaek
User
Boris
State
Recipes
Omelett Pancake
User
Boris
T1 T2
State
Recipes
Bacon Pancake
User
Boris
T3
IN MEMORY
State
Recipes
Omelette Pancaek
User
Boris
State
Recipes
Pancake
State
Recipes
Bacon
T1 T2 T3
Why not direct?
state.recipes[recipeId].name = newName;
OH, NO!
State
Recipes
Omelette Pancaek
User
Boris
State
Recipes
Pancake
State
Recipes
Bacon
T1 T2 T3
Omelett
User
Boris
User
Cat Pancake
OUT SIDE CHANGE
State
Recipes
Omelette Pancaek
User
Cat
State
Recipes
Pancake
State
Recipes
Bacon
T1 T2 T3
OH, NO!
State
Recipes
Omelette Pancaek
User
Cat
State
Recipes
Pancake
State
Recipes
Bacon
T1 T2 T3
Omelett
User
Cat
User
Cat Pancake
Immutability Libraries
The common ones
ImmutableJS
Seamless Immutable
Multiple Reducers
Redux Actions
Middleware
MIDDLEWARE?
Middleware skeleton
function myMiddleware({ dispatch, getState }) {

return function(next) {

return function(action) {

return next(action);

}

}

}
Middleware skeleton
const myMiddleware = ({ dispatch }) => next => action => {

return next(action);

}
How long do actions take?
const benchmarkMiddleware = store => next => action => {

console.time(action.type);

next(action);

console.timeEnd(action.type);

};
> SET_USER: 0.645ms
Analytics
const analyticsMiddleware = () => next => action => {
const { analytics }= (action.meta || {});
next(action);
if (analytics) {
ga(analytics);
clickTable(analytics);
}
};
const addTodo = (name) => ({
type: ADD_TODO,
…
meta: {
analytics: 'add todo'
}
});
Auto Complete
dispatch(autoComplete('b')); // => 100ms: 1000 items
dispatch(autoComplete('bo')); // => 70ms: 70 items
dispatch(autoComplete('bor')); // => 3ms: 2 items
const autoComplete = (string) => ({
type: AUTO_COMPLETE,
payload: string,
meta: {
debounce: 500
}
});
API
REDUX THUNK?
Async Action Creators


const fetchUsers = () => (dispatch, getState) => {



};
Async Action Creators


const fetchUsers = () => (dispatch, getState) => {

// Get headers (like auth) from state

// Calc URL 

// etc

fetch(BASE_URL + ‘/users’).then(

(data) => dispatch(setUsers(data)),

(error) => console.log(error)

);

};
Async Action Creators


const fetchUsers = () => (dispatch, getState) => {

// Get headers (like auth) from state

// Calc URL 

// etc

fetch(BASE_URL + ‘/users’).then(

(data) => dispatch(setUsers(data)),

(error) => console.log(error)

);

};
const fetchComments = () => (dispatch, getState) => {



};
Async Action Creators


const fetchUsers = () => (dispatch, getState) => {

// Get headers (like auth) from state

// Calc URL 

// etc

fetch(BASE_URL + ‘/users’).then(

(data) => dispatch(setUsers(data)),

(error) => console.log(error)

);

};
const fetchComments = () => (dispatch, getState) => {

// Get headers (like auth) from state

// Calc URL

// etc

fetch(BASE_URL + ‘/comments’).then(

(data) => dispatch(setComments(data)),

(error) => console.log(error)

);

};
Async Action Creators


const fetchUsers = () => (dispatch, getState) => {

// Get headers (like auth) from state

// Calc URL 

// etc

fetch(BASE_URL + ‘/users’).then(

(data) => dispatch(setUsers(data)),

(error) => console.log(error)

);

};
const fetchComments = () => (dispatch, getState) => {

// Get headers (like auth) from state

// Calc URL

// etc

fetch(BASE_URL + ‘/comments’).then(

(data) => dispatch(setComments(data)),

(error) => console.log(error)

);

};
Async Action Creators


const fetchUsers = () => (dispatch, getState) => {

// Get headers (like auth) from state

// Calc URL 

// etc

fetch(BASE_URL + ‘/users’).then(

(data) => dispatch(setUsers(data)),

(error) => console.log(error)

);

};
Async Action Creators


const fetchUsers = () => (dispatch, getState) => {

// Get headers (like auth) from state

// Calc URL 

// etc

fetch(BASE_URL + ‘/users’).then(

(data) => dispatch(setUsers(data)),

(error) => console.log(error)

);

};
const fetchUsers = () => ({
type: API,
payload: {
url: '/users',
success: setUsers
}
});
Async Action Creators


const fetchUsers = () => (dispatch, getState) => {

// Get headers (like auth) from state

// Calc URL 

// etc

fetch(BASE_URL + ‘/users’).then(

(data) => dispatch(setUsers(data)),

(error) => console.log(error)

);

};
const fetchUsers = () => ({
type: API,
payload: {
url: '/users',
success: setUsers
}
});
Middleware
const apiMiddleware = ({ dispatch }) => next => action => {
};
Middleware
const apiMiddleware = ({ dispatch }) => next => action => {
if (action.type !== API) return next(action);
// Do something!
};
Middleware
const apiMiddleware = ({ dispatch }) => next => action => {
if (action.type !== API) return next(action);
const { url, success } = action.payload;
return fetch(BASE_URL + url)
.then(response => response.json())
.then(payload => dispatch({ type: success, payload }));
};
Middleware
const apiMiddleware = ({ dispatch }) => next => action => {
if (action.type !== API) return next(action);
const { url, success } = action.payload;
return fetch(BASE_URL + url)
.then(response => response.json())
.then(payload => dispatch({ type: success, payload }))
.catch(error => dispatch({ type: API_ERROR, error }));
};
SYNC Action Creators
const fetchUsers = () => ({
type: API,
payload: {
url: '/users',
success: setUsers
}
});
const fetchComments = () => ({
type: API,
payload: {
url: '/comments',
success: setComments
}
});
API With Params
const fetchUser = (id) => ({
type: API,
payload: {
url: `/users/${ id }`,
success: setUser
}
});
API POST
const updateUser = (id, data) => ({
type: API,
payload: {
method: 'UPDATE',
url: `/users/${ id }`,
data
}
});
const deleteComment = (id) => ({
type: API,
payload: {
method: 'DELETE',
url: `/comments/${ id }`
}
});
Middleware + Auth
const apiMiddleware = ({ dispatch, getState }) => next => action => {
if (action.type !== API) return next(action);
const { url, success } = action.payload;
return fetch(BASE_URL + url)
.then(response => response.json())
.then(payload => dispatch({ type: success, payload }))
.catch(error => dispatch({ type: API_ERROR, error }));
};
Middleware + Auth
const apiMiddleware = ({ dispatch, getState }) => next => action => {
if (action.type !== API) return next(action);
const { url, success } = action.payload;
const { authToken } = getState().user;
if (authToken) {
// Set headers
}
return fetch(BASE_URL + url)
.then(response => response.json())
.then(payload => dispatch({ type: success, payload }))
.catch(error => dispatch({ type: API_ERROR, error }));
};
API With Params
const fetchUsers = () => ({
type: API,
payload: {
url: '/users',
success: setUsers,
preProcess: preProcessIncomingData,
customSpinner: 'users',
error: customErrorHandler,
timeout: 5000,
useAuth: false
}
});
Testing?
const fetchUsers = () => ({
type: API,
payload: {
url: '/users',
success: setUsers,
preProcess: preProcessIncomingData,
customSpinner: 'users',
error: customErrorHandler,
timeout: 5000,
useAuth: false
}
});
Reducer Action Middleware
State partial with thunk ✓
Dispatch - with thunk ✓
Mutate Action - - ✓
Cancel Action - - ✓
POWER!
Why is that cool?
Dude where is my logic?
Oh right, middleware
INSIDE REDUX
MIDDLEWARE!
const lsMiddleware = ({ getState }) => next => action => {

next(action);



if (action.type === 'SET_LOCAL_STORAGE') {

localStorage.setItem(
'redux',
JSON.stringify(getState())
);

}

};
How do we get it back?
Can’t SET STATE in middleware…
who can though?
Reducer decorators
• Whitelist actions
• Undo/Redo
• Speed test
• Tree relocation
• And much more
HIGHER ORDER REDUCERS




const reducer = combineReducers({

users,

recipes,

comments

});
HIGHER ORDER REDUCERS
import undoable from 'redux-undo';



const reducer = combineReducers({

users,

recipes,

comments: undoable(comments)

});
HIGHER ORDER REDUCERS
import undoable from 'redux-undo';



const reducer = combineReducers({

users,

recipes,

comments: undoable(comments)

});
import { ActionCreators } from 'redux-undo';



store.dispatch(ActionCreators.undo())
Reducer decorators?
Or is it Enhancers?
Or higher order Reducers?
MORE!
import undoable from 'redux-undo';

import { ignoreActions } from 'redux-ignore';



const reducer = combineReducers({

users,

recipes,

comments: undoable(comments)

});
MORE!
import undoable from 'redux-undo';

import { ignoreActions } from 'redux-ignore';



const reducer = combineReducers({

users,

recipes,

comments: undoable(comments)

});
MORE!
import undoable from 'redux-undo';

import { ignoreActions } from 'redux-ignore';



const reducer = combineReducers({

users,

recipes: ignoreActions(recipes, [ SCROLL_PAGE ]),

comments: undoable(comments)

});
Endless cool stuff
Middlware decorators
Action creator decorators
Reducer decorators
Hell.. action constant creators!
CONSTATS CREATOR?
SUMMARY
https://redux-book.com
The Complete Redux Book
SHAMLESS PLUG
Using Redux and not sure if correct?
Invite us for an hour to talk code.
boris@500tech.com
And read our blog:
http://blog.500tech.com
Keep calm, Redux
@BorisDinkevich / boris@500Tech.com

More Related Content

What's hot

Switch to React.js from AngularJS developer
Switch to React.js from AngularJS developerSwitch to React.js from AngularJS developer
Switch to React.js from AngularJS developerEugene Zharkov
 
Intro to Redux | DreamLab Academy #3
Intro to Redux | DreamLab Academy #3 Intro to Redux | DreamLab Academy #3
Intro to Redux | DreamLab Academy #3 DreamLab
 
React state managmenet with Redux
React state managmenet with ReduxReact state managmenet with Redux
React state managmenet with ReduxVedran Blaženka
 
Designing applications with Redux
Designing applications with ReduxDesigning applications with Redux
Designing applications with ReduxFernando Daciuk
 
Integrating React.js with PHP projects
Integrating React.js with PHP projectsIntegrating React.js with PHP projects
Integrating React.js with PHP projectsIgnacio Martín
 
Getting started with ReactJS
Getting started with ReactJSGetting started with ReactJS
Getting started with ReactJSKrishna Sunuwar
 
Academy PRO: React JS. Redux & Tooling
Academy PRO: React JS. Redux & ToolingAcademy PRO: React JS. Redux & Tooling
Academy PRO: React JS. Redux & ToolingBinary Studio
 
Introduction to react and redux
Introduction to react and reduxIntroduction to react and redux
Introduction to react and reduxCuong Ho
 
ReactJs presentation
ReactJs presentationReactJs presentation
ReactJs presentationnishasowdri
 
ProvJS: Six Months of ReactJS and Redux
ProvJS:  Six Months of ReactJS and ReduxProvJS:  Six Months of ReactJS and Redux
ProvJS: Six Months of ReactJS and ReduxThom Nichols
 
Let's discover React and Redux with TypeScript
Let's discover React and Redux with TypeScriptLet's discover React and Redux with TypeScript
Let's discover React and Redux with TypeScriptMathieu Savy
 
Evan Schultz - Angular Camp - ng2-redux
Evan Schultz - Angular Camp - ng2-reduxEvan Schultz - Angular Camp - ng2-redux
Evan Schultz - Angular Camp - ng2-reduxEvan Schultz
 
Better web apps with React and Redux
Better web apps with React and ReduxBetter web apps with React and Redux
Better web apps with React and ReduxAli Sa'o
 
State Models for React with Redux
State Models for React with ReduxState Models for React with Redux
State Models for React with ReduxStephan Schmidt
 
Better React state management with Redux
Better React state management with ReduxBetter React state management with Redux
Better React state management with ReduxMaurice De Beijer [MVP]
 

What's hot (20)

Switch to React.js from AngularJS developer
Switch to React.js from AngularJS developerSwitch to React.js from AngularJS developer
Switch to React.js from AngularJS developer
 
Intro to Redux | DreamLab Academy #3
Intro to Redux | DreamLab Academy #3 Intro to Redux | DreamLab Academy #3
Intro to Redux | DreamLab Academy #3
 
React state managmenet with Redux
React state managmenet with ReduxReact state managmenet with Redux
React state managmenet with Redux
 
Designing applications with Redux
Designing applications with ReduxDesigning applications with Redux
Designing applications with Redux
 
Integrating React.js with PHP projects
Integrating React.js with PHP projectsIntegrating React.js with PHP projects
Integrating React.js with PHP projects
 
React on es6+
React on es6+React on es6+
React on es6+
 
Getting started with ReactJS
Getting started with ReactJSGetting started with ReactJS
Getting started with ReactJS
 
React with Redux
React with ReduxReact with Redux
React with Redux
 
Introduction to Redux
Introduction to ReduxIntroduction to Redux
Introduction to Redux
 
React redux
React reduxReact redux
React redux
 
Academy PRO: React JS. Redux & Tooling
Academy PRO: React JS. Redux & ToolingAcademy PRO: React JS. Redux & Tooling
Academy PRO: React JS. Redux & Tooling
 
Introduction to react and redux
Introduction to react and reduxIntroduction to react and redux
Introduction to react and redux
 
React & Redux
React & ReduxReact & Redux
React & Redux
 
ReactJs presentation
ReactJs presentationReactJs presentation
ReactJs presentation
 
ProvJS: Six Months of ReactJS and Redux
ProvJS:  Six Months of ReactJS and ReduxProvJS:  Six Months of ReactJS and Redux
ProvJS: Six Months of ReactJS and Redux
 
Let's discover React and Redux with TypeScript
Let's discover React and Redux with TypeScriptLet's discover React and Redux with TypeScript
Let's discover React and Redux with TypeScript
 
Evan Schultz - Angular Camp - ng2-redux
Evan Schultz - Angular Camp - ng2-reduxEvan Schultz - Angular Camp - ng2-redux
Evan Schultz - Angular Camp - ng2-redux
 
Better web apps with React and Redux
Better web apps with React and ReduxBetter web apps with React and Redux
Better web apps with React and Redux
 
State Models for React with Redux
State Models for React with ReduxState Models for React with Redux
State Models for React with Redux
 
Better React state management with Redux
Better React state management with ReduxBetter React state management with Redux
Better React state management with Redux
 

Similar to Reduxing Like a Pro

Full Stack Toronto - the 3R Stack
Full Stack Toronto - the 3R StackFull Stack Toronto - the 3R Stack
Full Stack Toronto - the 3R StackScott Persinger
 
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQueryRemedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQueryTatsuhiko Miyagawa
 
Migrating from Flux to Redux. Why and how.
Migrating from Flux to Redux. Why and how.Migrating from Flux to Redux. Why and how.
Migrating from Flux to Redux. Why and how.Astrails
 
How to perform debounce in react
How to perform debounce in reactHow to perform debounce in react
How to perform debounce in reactBOSC Tech Labs
 
Server side data sync for mobile apps with silex
Server side data sync for mobile apps with silexServer side data sync for mobile apps with silex
Server side data sync for mobile apps with silexMichele Orselli
 
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and JasmineSingle Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and JasminePaulo Ragonha
 
Rethinking Syncing at AltConf 2019
Rethinking Syncing at AltConf 2019Rethinking Syncing at AltConf 2019
Rethinking Syncing at AltConf 2019Joe Keeley
 
Recompacting your react application
Recompacting your react applicationRecompacting your react application
Recompacting your react applicationGreg Bergé
 
Server side rendering with React and Symfony
Server side rendering with React and SymfonyServer side rendering with React and Symfony
Server side rendering with React and SymfonyIgnacio Martín
 
Async Redux Actions With RxJS - React Rally 2016
Async Redux Actions With RxJS - React Rally 2016Async Redux Actions With RxJS - React Rally 2016
Async Redux Actions With RxJS - React Rally 2016Ben Lesh
 
Mock Servers - Fake All the Things!
Mock Servers - Fake All the Things!Mock Servers - Fake All the Things!
Mock Servers - Fake All the Things!Atlassian
 
TPSE Thailand 2015 - Rethinking Web with React and Flux
TPSE Thailand 2015 - Rethinking Web with React and FluxTPSE Thailand 2015 - Rethinking Web with React and Flux
TPSE Thailand 2015 - Rethinking Web with React and FluxJirat Kijlerdpornpailoj
 
Emberjs building-ambitious-web-applications
Emberjs building-ambitious-web-applicationsEmberjs building-ambitious-web-applications
Emberjs building-ambitious-web-applicationsColdFusionConference
 
How and why i roll my own node.js framework
How and why i roll my own node.js frameworkHow and why i roll my own node.js framework
How and why i roll my own node.js frameworkBen Lin
 

Similar to Reduxing Like a Pro (20)

Full Stack Toronto - the 3R Stack
Full Stack Toronto - the 3R StackFull Stack Toronto - the 3R Stack
Full Stack Toronto - the 3R Stack
 
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQueryRemedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
 
Migrating from Flux to Redux. Why and how.
Migrating from Flux to Redux. Why and how.Migrating from Flux to Redux. Why and how.
Migrating from Flux to Redux. Why and how.
 
How to perform debounce in react
How to perform debounce in reactHow to perform debounce in react
How to perform debounce in react
 
Server side data sync for mobile apps with silex
Server side data sync for mobile apps with silexServer side data sync for mobile apps with silex
Server side data sync for mobile apps with silex
 
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and JasmineSingle Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
 
Rethinking Syncing at AltConf 2019
Rethinking Syncing at AltConf 2019Rethinking Syncing at AltConf 2019
Rethinking Syncing at AltConf 2019
 
Recompacting your react application
Recompacting your react applicationRecompacting your react application
Recompacting your react application
 
React 101
React 101React 101
React 101
 
Node.js server-side rendering
Node.js server-side renderingNode.js server-side rendering
Node.js server-side rendering
 
ReactJS
ReactJSReactJS
ReactJS
 
Server side rendering with React and Symfony
Server side rendering with React and SymfonyServer side rendering with React and Symfony
Server side rendering with React and Symfony
 
Async Redux Actions With RxJS - React Rally 2016
Async Redux Actions With RxJS - React Rally 2016Async Redux Actions With RxJS - React Rally 2016
Async Redux Actions With RxJS - React Rally 2016
 
Mock Servers - Fake All the Things!
Mock Servers - Fake All the Things!Mock Servers - Fake All the Things!
Mock Servers - Fake All the Things!
 
TPSE Thailand 2015 - Rethinking Web with React and Flux
TPSE Thailand 2015 - Rethinking Web with React and FluxTPSE Thailand 2015 - Rethinking Web with React and Flux
TPSE Thailand 2015 - Rethinking Web with React and Flux
 
Emberjs building-ambitious-web-applications
Emberjs building-ambitious-web-applicationsEmberjs building-ambitious-web-applications
Emberjs building-ambitious-web-applications
 
How and why i roll my own node.js framework
How and why i roll my own node.js frameworkHow and why i roll my own node.js framework
How and why i roll my own node.js framework
 
Rails is not just Ruby
Rails is not just RubyRails is not just Ruby
Rails is not just Ruby
 
Silex Cheat Sheet
Silex Cheat SheetSilex Cheat Sheet
Silex Cheat Sheet
 
Silex Cheat Sheet
Silex Cheat SheetSilex Cheat Sheet
Silex Cheat Sheet
 

Recently uploaded

Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
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...apidays
 
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...Neo4j
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?Igalia
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
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 CVKhem
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
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 Processorsdebabhi2
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUK Journal
 

Recently uploaded (20)

Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
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...
 
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...
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
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
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
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
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 

Reduxing Like a Pro