SlideShare ist ein Scribd-Unternehmen logo
1 von 99
Indeed My Jobs
A case study in ReactJS and Redux
Gaurav Mathur
Software Engineer
I help
people
get jobs.
What happens next?
Following up
Scheduling an interview
Preparing an interview
Negotiating your offer
Making a decision
Why React?
Virtual DOM
JSX
Data flow
MainDisplay
ViewList
JobTable
JobRow
MainDisplay
ViewListJobTable
JobRow
MainDisplay
State: jobs, counts
ViewListJobTable
JobRow
Props: counts
MainDisplay
State: jobs, counts
ViewListJobTable
JobRow
MainDisplay
State: jobs, counts
ViewListJobTable
JobRow
Props: jobs, updateHandler
MainDisplay
State: jobs, counts
ViewListJobTable
JobRow
Props: job, updateHandler
JobRow
MainDisplay
ViewListJobTable
this.props.handleUpdate(job, state)
this.props.handleUpdate(job, state)
JobRow
MainDisplay
ViewListJobTable
this.setState({jobs:newJobs, counts:newCounts});
JobRow
MainDisplay
ViewListJobTable
this.render(); //automatically fired
JobRow
MainDisplay
ViewListJobTable
Component
Component
Component
Component
this.props.handleUpdate(job, state)
this.props.handleUpdate(job, state)
this.props.handleUpdate(job, state)
Flux
View
View
Action
View
Dispatcher
Action
View
Dispatcher
StoreAction
View
Dispatcher
StoreAction
Transition the job
Transition Job
Job Row
Action = {
type: JobActions.APPLY,
job: job
};
Dispatch the action
MyJobsDispatcher.handleAction({
type: JobActions.APPLY,
job: job
});
Transition Job
Dispatcher
Job Row
function handleChange(action) {
...
switch (action.type) {
case JobActions.APPLY:
job.set('state', States.APPLIED);
break;
...
}
JobStore.emitChange();
}
JobStore.dispatchToken = MyJobsDispatcher.register(handleChange);
Update Job Store
Transition Job
Dispatcher
Job Store
Job Row
function handleChange(action) {
MyJobsDispatcher.waitFor(
[JobStore.dispatchToken]
);
...
JobCountsStore.emitChange();
}
Update Job Counts
Transition Job
Dispatcher
Job StoreJob Count Store
Job Row
ListenableStore.prototype = {
emitChange() {
for (let i = 0; i < this.listeners.length; i++) {
this.listeners[i]();
}
},
...
}
Listen for changes
const changeAggregator = new ChangeAggregator(
MyJobsDispatcher, storesToListenTo
);
const MainDisplay = React.createClass({
componentDidMount() {
changeAggregator.addChangeListener(this.update);
}
...
});
Collect changes
const MainDisplay = React.createClass({
...
update() {
this.setState({
jobs: JobStore.getJobs(),
counts: JobCountStore.getCounts(),
...
});
}
});
Transition Job
Dispatcher
Job StoreJob Count Store
Job Row
View List Job Table
Update views
Shortcomings
Boilerplate
ListenableStore
ChangeAggregator
MyjobsDispatcher
Best Practices & Testability
// TODO: Should this be in a different place..?
window.scrollTo(0, 0);
ViewStore.emitChange();
ViewStore.js
Borrowed from: https://twitter.com/denisizmaylov/status/672390003188703238
Jing Wang
Software Engineer
I help
people
get jobs.
Borrowed from: https://twitter.com/denisizmaylov/status/672390003188703238
Single source of truth
Application State Tree
State is read only
Dispatcher & Actions
Pure functions
Reducers
Redux Store
Single source of truth
const createStore = (reducer) => {
let state = {};
const getState = () => state;
let listeners = [];
const subscribe = (listener) => {
listeners.push(listener);
}
const dispatch = (action) => {
state = reducer(state, action);
listeners.forEach(listener => listener());
};
return {getState, dispatch, subscribe};
}
State is read only
const createStore = (reducer) => {
let state = {};
const getState = () => state;
let listeners = [];
const subscribe = (listener) => {
listeners.push(listener);
}
const dispatch = (action) => {
state = reducer(state, action);
listeners.forEach(listener => listener());
};
return {getState, dispatch, subscribe};
}
Changes are made with pure functions
const createStore = (reducer) => {
let state = {};
const getState = () => state;
let listeners = [];
const subscribe = (listener) => {
listeners.push(listener);
}
const dispatch = (action) => {
state = reducer(state, action);
listeners.forEach(listener => listener());
};
return {getState, dispatch, subscribe};
}
Emit changes
const createStore = (reducer) => {
let state = {};
const getState = () => state;
let listeners = [];
const subscribe = (listener) => {
listeners.push(listener);
}
const dispatch = (action) => {
state = reducer(state, action);
listeners.forEach(listener => listener());
};
return {getState, dispatch, subscribe};
}
Single reducer
const createStore = (reducer) => {
let state = {};
const getState = () => state;
let listeners = [];
const subscribe = (listener) => {
listeners.push(listener);
}
const dispatch = (action) => {
state = reducer(state, action);
listeners.forEach(listener => listener());
};
return {getState, dispatch, subscribe};
}
const myjobsReducer(state = new AppState(), action) => {
state = state.set('jobs', jobsReducer(state.jobs, action));
state = state.set('jobCounts', jobCountsReducer(state.jobCounts, action, state.jobs));
...
return state;
}
Combining reducers
const myjobsStore = createStore(myjobsReducer);
<MainDisplay
store={myjobsStore}
...
/>
Store as an explicit prop
const myjobsStore = createStore(myjobsReducer);
<MainDisplay
store={myjobsStore}
...
/>
<ViewList
store={this.props.myjobsStore}
...
/>
Store as an explicit prop
const myjobsStore = createStore(myjobsReducer);
<MainDisplay
store={myjobsStore}
...
/>
<ViewList
store={this.props.myjobsStore}
...
/>
<JobTable
store={this.props.myjobsStore}
...
/>
Store as an explicit prop
react-redux Provider
const myjobsStore = createStore(myjobsReducer);
<Provider store={myjobsStore}>
<MainDisplay />
</Provider>
MainDisplay
Provider
myjobsStore
const myjobsStore = createStore(myjobsReducer);
<Provider store={myjobsStore}>
<MainDisplay />
</Provider>
react-redux Provider
JobRow
MainDisplay
ViewListJobTable
Provider
myjobsStore
Provided store: {myjobsStore}
connect(mapStateToProps, mapDispatchToProps, ...) {
}
react-redux connect
mapStateToProps
function mapStateToProps(state) {
return {
jobsState: state.jobs
};
}
const mapDispatchToProps = (dispatch) => {
return {
handleAction: (action) => {
dispatch(action);
}
};
}
mapDispatchToProps
connect(mapStateToProps, mapDispatchToProps, ...) {
...
return function wrapWithConnect(WrappedComponent) {
class Connect extends Component {
...
return Connect;
};
}
}
react-redux connect
react-redux connect
Connect
constructor(props, context) {
this.store = props.store || context.store;
this.state = { this.store.getState() };
};
Connect
...
componentDidMount() {
this.store.subscribe(this.handleChange.bind(this));
}
handleChange() {
this.setState({ this.store.getState() })
}
react-redux connect
Connect
...
render() {
this.renderedElement = createElement(
WrappedComponent, this.mergedProps
);
return this.renderedElement;
}
react-redux connect
Connect
...
render() {
this.renderedElement = createElement(
WrappedComponent, this.mergedProps
);
return this.renderedElement;
}
mergedProps: {
...parentProps,
...mapStateToProps,
...mapDispatchToProps
}
react-redux connect
import { connect } from 'react-redux';
...
const matchStateToProps => (state) {
return {
jobsState: state.jobs
};
}
module.exports = connect(matchStateToProps)(JobTable);
JobTable.js
JobRow.js
import { connect } from 'react-redux';
...
module.exports = connect()(JobRow);
Connect
Connect Connect
Connect
JobRow
MainDisplay
ViewListJobTable
const createStore = (reducer) => {
...
const dispatch = (action) => {
state = reducer(state, action);
listeners.forEach(listener => listener());
};
}
myjobsStore
{type:"APPLY",jobKey:"7b14...",...}
Job Row
const createStore = (reducer) => {
...
const dispatch = (action) => {
state = reducer(state, action);
listeners.forEach(listener => listener());
};
}
Job Row
myjobsStore
myjobsReducer
state
const createStore = (reducer) => {
...
const dispatch = (action) => {
state = reducer(state, action);
listeners.forEach(listener => listener());
};
}
Job Row
myjobsStore
myjobsReducer
state
newState
const createStore = (reducer) => {
...
const dispatch = (action) => {
state = reducer(state, action);
listeners.forEach(listener => listener());
};
}
JobTable
Job Row
myjobsStore
myjobsReducer
state
newState
jobReducerJobStore
Flux stores to Redux reducers
...
Flux Redux
jobCountsReducerJobCountsStore
...
store.subscribe(() => {
if (view !== newView) {
window.scrollTo(0, 0);
}
});
Side effects in separate handlers
Less boilerplate code
createStore
ListenableStore
ChangeAggregator
MyJobsDispatcher
Flux ReduxFlux Redux
Less boilerplate code
connect
addChangeListener()
JobStore.getJobs()
Flux Redux
Less boilerplate code
combineReducerswaitFor()
Flux Redux
Easier to unit test
Well unit tested state transition logic
Less code to maintain
Code easier to follow
Results
engineering.indeed.com
www.indeed.jobs

Weitere ähnliche Inhalte

Was ist angesagt?

CakePHPをさらにDRYにする、ドライケーキレシピ akiyan.com 秋田真宏
CakePHPをさらにDRYにする、ドライケーキレシピ akiyan.com 秋田真宏CakePHPをさらにDRYにする、ドライケーキレシピ akiyan.com 秋田真宏
CakePHPをさらにDRYにする、ドライケーキレシピ akiyan.com 秋田真宏
Masahiro Akita
 
Building Smart Async Functions For Mobile
Building Smart Async Functions For MobileBuilding Smart Async Functions For Mobile
Building Smart Async Functions For Mobile
Glan Thomas
 
DroidKnight 2018 State machine by Selaed class
DroidKnight 2018 State machine by Selaed classDroidKnight 2018 State machine by Selaed class
DroidKnight 2018 State machine by Selaed class
Myeongin Woo
 
Instant Dynamic Forms with #states
Instant Dynamic Forms with #statesInstant Dynamic Forms with #states
Instant Dynamic Forms with #states
Konstantin Käfer
 

Was ist angesagt? (20)

How to Bring Common UI Patterns to ADF
How to Bring Common UI Patterns to ADF How to Bring Common UI Patterns to ADF
How to Bring Common UI Patterns to ADF
 
Sexy.js: A Sequential Ajax (Sajax) library for jQuery
Sexy.js: A Sequential Ajax (Sajax) library for jQuerySexy.js: A Sequential Ajax (Sajax) library for jQuery
Sexy.js: A Sequential Ajax (Sajax) library for jQuery
 
What's new in Doctrine
What's new in DoctrineWhat's new in Doctrine
What's new in Doctrine
 
Migrating to dependency injection
Migrating to dependency injectionMigrating to dependency injection
Migrating to dependency injection
 
CakePHPをさらにDRYにする、ドライケーキレシピ akiyan.com 秋田真宏
CakePHPをさらにDRYにする、ドライケーキレシピ akiyan.com 秋田真宏CakePHPをさらにDRYにする、ドライケーキレシピ akiyan.com 秋田真宏
CakePHPをさらにDRYにする、ドライケーキレシピ akiyan.com 秋田真宏
 
Spock and Geb
Spock and GebSpock and Geb
Spock and Geb
 
究極のコントローラを目指す
究極のコントローラを目指す究極のコントローラを目指す
究極のコントローラを目指す
 
Building Smart Async Functions For Mobile
Building Smart Async Functions For MobileBuilding Smart Async Functions For Mobile
Building Smart Async Functions For Mobile
 
Presentation1
Presentation1Presentation1
Presentation1
 
Understanding redux
Understanding reduxUnderstanding redux
Understanding redux
 
Drupal7 dbtng
Drupal7  dbtngDrupal7  dbtng
Drupal7 dbtng
 
Manage catalog Configueation In Sharepoint PowerShell
Manage catalog Configueation In Sharepoint PowerShellManage catalog Configueation In Sharepoint PowerShell
Manage catalog Configueation In Sharepoint PowerShell
 
Be lazy, be ESI: HTTP caching and Symfony2 @ PHPDay 2011 05-13-2011
 Be lazy, be ESI: HTTP caching and Symfony2 @ PHPDay 2011 05-13-2011 Be lazy, be ESI: HTTP caching and Symfony2 @ PHPDay 2011 05-13-2011
Be lazy, be ESI: HTTP caching and Symfony2 @ PHPDay 2011 05-13-2011
 
DroidKnight 2018 State machine by Selaed class
DroidKnight 2018 State machine by Selaed classDroidKnight 2018 State machine by Selaed class
DroidKnight 2018 State machine by Selaed class
 
Developer Testing Tools Roundup
Developer Testing Tools RoundupDeveloper Testing Tools Roundup
Developer Testing Tools Roundup
 
Instant Dynamic Forms with #states
Instant Dynamic Forms with #statesInstant Dynamic Forms with #states
Instant Dynamic Forms with #states
 
Data20161007
Data20161007Data20161007
Data20161007
 
Command Bus To Awesome Town
Command Bus To Awesome TownCommand Bus To Awesome Town
Command Bus To Awesome Town
 
購物車程式架構簡介
購物車程式架構簡介購物車程式架構簡介
購物車程式架構簡介
 
How Reactive do we need to be
How Reactive do we need to beHow Reactive do we need to be
How Reactive do we need to be
 

Ähnlich wie Indeed My Jobs: A case study in ReactJS and Redux (Meetup talk March 2016)

Ähnlich wie Indeed My Jobs: A case study in ReactJS and Redux (Meetup talk March 2016) (20)

Egghead redux-cheat-sheet-3-2-1
Egghead redux-cheat-sheet-3-2-1Egghead redux-cheat-sheet-3-2-1
Egghead redux-cheat-sheet-3-2-1
 
React и redux
React и reduxReact и redux
React и redux
 
Recompacting your react application
Recompacting your react applicationRecompacting your react application
Recompacting your react application
 
Full Stack Toronto - the 3R Stack
Full Stack Toronto - the 3R StackFull Stack Toronto - the 3R Stack
Full Stack Toronto - the 3R Stack
 
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 lecture
React lectureReact lecture
React lecture
 
React & Redux
React & ReduxReact & Redux
React & Redux
 
Advanced redux
Advanced reduxAdvanced redux
Advanced redux
 
Reactивная тяга
Reactивная тягаReactивная тяга
Reactивная тяга
 
React 101
React 101React 101
React 101
 
React new features and intro to Hooks
React new features and intro to HooksReact new features and intro to Hooks
React new features and intro to Hooks
 
React, Redux and es6/7
React, Redux and es6/7React, Redux and es6/7
React, Redux and es6/7
 
N Things You Don't Want to Repeat in React Native
N Things You Don't Want to Repeat in React NativeN Things You Don't Want to Repeat in React Native
N Things You Don't Want to Repeat in React Native
 
Introduction to Redux
Introduction to ReduxIntroduction to Redux
Introduction to Redux
 
Manage the Flux of your Web Application: Let's Redux
Manage the Flux of your Web Application: Let's ReduxManage the Flux of your Web Application: Let's Redux
Manage the Flux of your Web Application: Let's Redux
 
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.
 
Redux vs Alt
Redux vs AltRedux vs Alt
Redux vs Alt
 
The evolution of redux action creators
The evolution of redux action creatorsThe evolution of redux action creators
The evolution of redux action creators
 
React state managmenet with Redux
React state managmenet with ReduxReact state managmenet with Redux
React state managmenet with Redux
 
React/Redux
React/ReduxReact/Redux
React/Redux
 

Mehr von indeedeng

Mehr von indeedeng (20)

Weapons of Math Instruction: Evolving from Data0-Driven to Science-Driven
Weapons of Math Instruction: Evolving from Data0-Driven to Science-DrivenWeapons of Math Instruction: Evolving from Data0-Driven to Science-Driven
Weapons of Math Instruction: Evolving from Data0-Driven to Science-Driven
 
Alchemy and Science: Choosing Metrics That Work
Alchemy and Science: Choosing Metrics That WorkAlchemy and Science: Choosing Metrics That Work
Alchemy and Science: Choosing Metrics That Work
 
Indeed Engineering and The Lead Developer Present: Tech Leadership and Manage...
Indeed Engineering and The Lead Developer Present: Tech Leadership and Manage...Indeed Engineering and The Lead Developer Present: Tech Leadership and Manage...
Indeed Engineering and The Lead Developer Present: Tech Leadership and Manage...
 
Indeed Engineering and The Lead Developer Present: Tech Leadership and Manage...
Indeed Engineering and The Lead Developer Present: Tech Leadership and Manage...Indeed Engineering and The Lead Developer Present: Tech Leadership and Manage...
Indeed Engineering and The Lead Developer Present: Tech Leadership and Manage...
 
Improving the development process with metrics driven insights presentation
Improving the development process with metrics driven insights presentationImproving the development process with metrics driven insights presentation
Improving the development process with metrics driven insights presentation
 
Data-Driven off a Cliff: Anti-Patterns in Evidence-Based Decision Making
Data-Driven off a Cliff: Anti-Patterns in Evidence-Based Decision MakingData-Driven off a Cliff: Anti-Patterns in Evidence-Based Decision Making
Data-Driven off a Cliff: Anti-Patterns in Evidence-Based Decision Making
 
Automation and Developer Infrastructure — Empowering Engineers to Move from I...
Automation and Developer Infrastructure — Empowering Engineers to Move from I...Automation and Developer Infrastructure — Empowering Engineers to Move from I...
Automation and Developer Infrastructure — Empowering Engineers to Move from I...
 
@Indeedeng: RAD - How We Replicate Terabytes of Data Around the World Every Day
@Indeedeng: RAD - How We Replicate Terabytes of Data Around the World Every Day@Indeedeng: RAD - How We Replicate Terabytes of Data Around the World Every Day
@Indeedeng: RAD - How We Replicate Terabytes of Data Around the World Every Day
 
Data Day Texas - Recommendations
Data Day Texas - RecommendationsData Day Texas - Recommendations
Data Day Texas - Recommendations
 
Vectorized VByte Decoding
Vectorized VByte DecodingVectorized VByte Decoding
Vectorized VByte Decoding
 
[@IndeedEng] Imhotep Workshop
[@IndeedEng] Imhotep Workshop[@IndeedEng] Imhotep Workshop
[@IndeedEng] Imhotep Workshop
 
@IndeedEng: Tokens and Millicents - technical challenges in launching Indeed...
@IndeedEng:  Tokens and Millicents - technical challenges in launching Indeed...@IndeedEng:  Tokens and Millicents - technical challenges in launching Indeed...
@IndeedEng: Tokens and Millicents - technical challenges in launching Indeed...
 
[@IndeedEng] Large scale interactive analytics with Imhotep
[@IndeedEng] Large scale interactive analytics with Imhotep[@IndeedEng] Large scale interactive analytics with Imhotep
[@IndeedEng] Large scale interactive analytics with Imhotep
 
[@IndeedEng] Logrepo: Enabling Data-Driven Decisions
[@IndeedEng] Logrepo: Enabling Data-Driven Decisions[@IndeedEng] Logrepo: Enabling Data-Driven Decisions
[@IndeedEng] Logrepo: Enabling Data-Driven Decisions
 
[@IndeedEng] Boxcar: A self-balancing distributed services protocol
[@IndeedEng] Boxcar: A self-balancing distributed services protocol [@IndeedEng] Boxcar: A self-balancing distributed services protocol
[@IndeedEng] Boxcar: A self-balancing distributed services protocol
 
[@IndeedEng Talk] Diving deeper into data-driven product design
[@IndeedEng Talk] Diving deeper into data-driven product design[@IndeedEng Talk] Diving deeper into data-driven product design
[@IndeedEng Talk] Diving deeper into data-driven product design
 
[@IndeedEng] Managing Experiments and Behavior Dynamically with Proctor
[@IndeedEng] Managing Experiments and Behavior Dynamically with Proctor[@IndeedEng] Managing Experiments and Behavior Dynamically with Proctor
[@IndeedEng] Managing Experiments and Behavior Dynamically with Proctor
 
[@IndeedEng] Engineering Velocity: Building Great Software Through Fast Itera...
[@IndeedEng] Engineering Velocity: Building Great Software Through Fast Itera...[@IndeedEng] Engineering Velocity: Building Great Software Through Fast Itera...
[@IndeedEng] Engineering Velocity: Building Great Software Through Fast Itera...
 
[@IndeedEng] Redundant Array of Inexpensive Datacenters
[@IndeedEng] Redundant Array of Inexpensive Datacenters[@IndeedEng] Redundant Array of Inexpensive Datacenters
[@IndeedEng] Redundant Array of Inexpensive Datacenters
 
[@IndeedEng] Building Indeed Resume Search
[@IndeedEng] Building Indeed Resume Search[@IndeedEng] Building Indeed Resume Search
[@IndeedEng] Building Indeed Resume Search
 

Kürzlich hochgeladen

notes on Evolution Of Analytic Scalability.ppt
notes on Evolution Of Analytic Scalability.pptnotes on Evolution Of Analytic Scalability.ppt
notes on Evolution Of Analytic Scalability.ppt
MsecMca
 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ssuser89054b
 
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
dollysharma2066
 
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night StandCall Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
amitlee9823
 
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 BookingVIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
dharasingh5698
 

Kürzlich hochgeladen (20)

notes on Evolution Of Analytic Scalability.ppt
notes on Evolution Of Analytic Scalability.pptnotes on Evolution Of Analytic Scalability.ppt
notes on Evolution Of Analytic Scalability.ppt
 
chapter 5.pptx: drainage and irrigation engineering
chapter 5.pptx: drainage and irrigation engineeringchapter 5.pptx: drainage and irrigation engineering
chapter 5.pptx: drainage and irrigation engineering
 
Online banking management system project.pdf
Online banking management system project.pdfOnline banking management system project.pdf
Online banking management system project.pdf
 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
 
Intze Overhead Water Tank Design by Working Stress - IS Method.pdf
Intze Overhead Water Tank  Design by Working Stress - IS Method.pdfIntze Overhead Water Tank  Design by Working Stress - IS Method.pdf
Intze Overhead Water Tank Design by Working Stress - IS Method.pdf
 
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night StandCall Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
 
Java Programming :Event Handling(Types of Events)
Java Programming :Event Handling(Types of Events)Java Programming :Event Handling(Types of Events)
Java Programming :Event Handling(Types of Events)
 
Bhosari ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready For ...
Bhosari ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready For ...Bhosari ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready For ...
Bhosari ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready For ...
 
The Most Attractive Pune Call Girls Manchar 8250192130 Will You Miss This Cha...
The Most Attractive Pune Call Girls Manchar 8250192130 Will You Miss This Cha...The Most Attractive Pune Call Girls Manchar 8250192130 Will You Miss This Cha...
The Most Attractive Pune Call Girls Manchar 8250192130 Will You Miss This Cha...
 
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 BookingVIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
 
Call for Papers - International Journal of Intelligent Systems and Applicatio...
Call for Papers - International Journal of Intelligent Systems and Applicatio...Call for Papers - International Journal of Intelligent Systems and Applicatio...
Call for Papers - International Journal of Intelligent Systems and Applicatio...
 
Double rodded leveling 1 pdf activity 01
Double rodded leveling 1 pdf activity 01Double rodded leveling 1 pdf activity 01
Double rodded leveling 1 pdf activity 01
 
KubeKraft presentation @CloudNativeHooghly
KubeKraft presentation @CloudNativeHooghlyKubeKraft presentation @CloudNativeHooghly
KubeKraft presentation @CloudNativeHooghly
 
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
 
(INDIRA) Call Girl Bhosari Call Now 8617697112 Bhosari Escorts 24x7
(INDIRA) Call Girl Bhosari Call Now 8617697112 Bhosari Escorts 24x7(INDIRA) Call Girl Bhosari Call Now 8617697112 Bhosari Escorts 24x7
(INDIRA) Call Girl Bhosari Call Now 8617697112 Bhosari Escorts 24x7
 
VIP Model Call Girls Kothrud ( Pune ) Call ON 8005736733 Starting From 5K to ...
VIP Model Call Girls Kothrud ( Pune ) Call ON 8005736733 Starting From 5K to ...VIP Model Call Girls Kothrud ( Pune ) Call ON 8005736733 Starting From 5K to ...
VIP Model Call Girls Kothrud ( Pune ) Call ON 8005736733 Starting From 5K to ...
 
Generative AI or GenAI technology based PPT
Generative AI or GenAI technology based PPTGenerative AI or GenAI technology based PPT
Generative AI or GenAI technology based PPT
 
Call Girls Wakad Call Me 7737669865 Budget Friendly No Advance Booking
Call Girls Wakad Call Me 7737669865 Budget Friendly No Advance BookingCall Girls Wakad Call Me 7737669865 Budget Friendly No Advance Booking
Call Girls Wakad Call Me 7737669865 Budget Friendly No Advance Booking
 
BSides Seattle 2024 - Stopping Ethan Hunt From Taking Your Data.pptx
BSides Seattle 2024 - Stopping Ethan Hunt From Taking Your Data.pptxBSides Seattle 2024 - Stopping Ethan Hunt From Taking Your Data.pptx
BSides Seattle 2024 - Stopping Ethan Hunt From Taking Your Data.pptx
 

Indeed My Jobs: A case study in ReactJS and Redux (Meetup talk March 2016)