SlideShare une entreprise Scribd logo
1  sur  84
@techgirlwonder
she/her
hannah@carbon
ve.com
Personal
Anecdote: I have
a dog
HANNAH HOWARD #ABOUTME
InfoQ.com: News & Community Site
• Over 1,000,000 software developers, architects and CTOs read the site world-
wide every month
• 250,000 senior developers subscribe to our weekly newsletter
• Published in 4 languages (English, Chinese, Japanese and Brazilian
Portuguese)
• Post content from our QCon conferences
• 2 dedicated podcast channels: The InfoQ Podcast, with a focus on
Architecture and The Engineering Culture Podcast, with a focus on building
• 96 deep dives on innovative topics packed as downloadable emags and
minibooks
• Over 40 new content items per week
Watch the video with slide
synchronization on InfoQ.com!
https://www.infoq.com/presentations/
rxjs-front-end/
Purpose of QCon
- to empower software development by facilitating the spread of
knowledge and innovation
Strategy
- practitioner-driven conference designed for YOU: influencers of
change and innovation in your teams
- speakers and topics driving the evolution and innovation
- connecting and catalyzing the influencers and innovators
Highlights
- attended by more than 12,000 delegates since 2007
- held in 9 cities worldwide
Presented at QCon San Francisco
www.qconsf.com
REACTIVE
PROGRAMMING:
A Better Way to Write Frontend Applications
1.
PROBLEM STATEMENT
WHAT IS A
COMPUTER
PROGRAM?
A computer program is a
sequence of instructions
for performing a task
designed to solve
speci c problems.
- Wikipedia
Program = Todo List?
'SEQUENCE OF INSTRUCTIONS'
LESSON PLAN
HOW COMPUTER PROGRAMS ACTUALLY RUN
the heart of frontend programming
INTERRUPTIONS:
2.
A BRIEF HISTORY OF INTERRUPTIONS
Technique 1:
GLOBAL EVENT BUS
In The Beginning... C!
  1. #define BYTE unsigned char
  2. #define NUM_SCAN_QUE 256 // this MUST be 256, using BYTE 
roll­over for 
  3.                          // q code
  4. BYTE gb_scan;
  5. BYTE gb_scan_q[NUM_SCAN_QUE];
  6. BYTE gb_scan_head;
  7. BYTE gb_scan_tail;
  8. 
  9. static void interrupt(far *oldkb)(void); /* BIOS keyboard 
handler */
 10. 
 11. /* ­­­­­­­­­­­­­­­­­­­­­­ get_scan() ­­­­­­­­­­­­­­­­­­­­­ 
April 17,1993 */
 12. void interrupt get_scan(void)
 13. {
 14.   /* read the scan code from the keyboard */
Windows event loop
  1. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE 
hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  2. {
  3.   MSG msg;
  4.   BOOL bRet;
  5. 
  6.   while (1)
  7.   {
  8.     bRet = GetMessage(&msg, NULL, 0, 0);
  9. 
 10.     if (bRet > 0) // (bRet > 0 indicates a message that 
must be processed.)
 11.     {
 12.       TranslateMessage(&msg);
 13.       DispatchMessage(&msg);
  1. LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM 
wParam, LPARAM lParam) // second message parameter
  2. {
  3.   switch (uMsg)
  4.   {
  5.   case WM_CREATE:
  6.     // Initialize the window.
  7.     return 0;
  8. 
  9.   case WM_PAINT:
 10.     // Paint the window's client area.
 11.     return 0;
 12. 
 13.   case WM_SIZE:
 14.     // Set the size and position of the window.
 15.     return 0;
 16. 
 17.   case WM_DESTROY:
 18.     // Clean up window­specific data objects.
 19.     return 0;
 20.   //
Window procedure = read message, update state
1999?
  1. LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM 
wParam, LPARAM lParam) // second message parameter
  2. {
  3.   switch (uMsg)
  4.   {
  5.   case WM_CREATE:
  6.     // Initialize the window.
  7.     return 0;
  8. 
  9.   case WM_PAINT:
 10.     // Paint the window's client area.
 11.     return 0;
 12. 
 13.   case WM_SIZE:
 14.     // Set the size and position of the window.
 15.     return 0;
 16. 
 17.   case WM_DESTROY:
 18.     // Clean up window­specific data objects.
 19.     return 0;
 20.   //
 21.   // Process other messages.
 22.   //
23. default:
Or did we?
  1. function todoApp(state = initialState, action) {
  2.   switch (action.type) {
  3.     case SET_VISIBILITY_FILTER:
  4.       return { ...state,
  5.         visibilityFilter: action.filter
  6.       };
  7.     case ADD_TODO:
  8.       return { ...state,
  9.         todos: [
NO SHADE TO REDUX
Technique 2:
OBSERVER PATTERN
A SHORT DIGRESSION...
VERY IMPORTANT CONTENT CREATOR
HOW WILL PEOPLE SEE MY CONTENT?
OLD SCHOOL WAY
I will make content
- in uencer
I will subscribe to your
content
- adoring fan
I made new content
- in uencer
I am noti ed about your
content, and can watch
it
- adoring fan
I will emit events
- Subject
I will subscribe to your
events
- Observer
An event happened
- Subject
I am noti ed about the
event, and can handle it
- Observer
Real World Example
  1. // Function to change the content of t2
  2. const modifyText = () => {
  3.   const toggle = document.getElementById("toggle");
  4.   toggle.firstChild.nodeValue = t2.firstChild.nodeValue == 
"on" ? "off" : "on";
  5. }
  6. 
  7. // add event listener to table
  8. const el = document.getElementById("toggle­switch");
  9. el.addEventListener("click", modifyText, false);
OBSERVER PATTERN VS GLOBAL
EVENT BUS
(+) Way simpler than global event bus
(+) Localized scope
(-) Have To Setup Subscriptions
Take home quiz:
TRY DRAG AND DROP
MIXING CONCERNS
1. Handling events
2. Subscribing observers
Is this what happened?
REDUX ORIGIN STORY
IS THERE A BETTER WAY?
3.
FUNCTIONAL REACTIVE PROGRAMMING
I taught middle school
ONCE UPON A TIME...
GOOD TEACHERS = JEDI
DON'T START WITH A PLAN...
AND GET INTERRUPTED.
PLAN FOR
INTERRUPTIONS
AND REACT!
PSA:
PAY TEACHERS
HOW COULD WE
WRITE PROGRAMS
REACTIVELY?
Consider this statement
Y = X + 3
Assign once the value for y by adding 3 to x
IMPERATIVE MEANING:
An equation
MATH MEANING
5 10 15 20­5­10­15­20
5
10
15
20
­5
­10
­15
­20
y
x
X is a value that can change over time. Y is always the
value 3 greater than X
REACTIVE MEANING:
a data stream of numbers over time
X VALUES OVER TIME
0 9 3 10 4
a data stream of numbers derived from another stream
Y VALUES OVER TIME
0 9 3 10 4
3 12 6 13 7
Stream of user input events
MOUSE CLICKS OVER TIME
MC MC MCMCMCMC MC MCMCMCMC MC
REACTIVE
PROGRAMMING IN
THE REAL WORLD?
Only better...
OBSERVER PATTERN!
A value that changes over time, that we can listen to
changes on
OBSERVABLE:
Value as 'Observable'
  1. x.subscribe(nextX => console.log(nextX))
  2. 
  3. x.subscribe(nextX => console.log(nextX + 3))
  4. 
  5. y = "?";
  6. 
  7. x = [0, 9, 3, 10, 4]
  8. 
  9. y = x.map(nextX => nextX + 3)
 10. 
 11. x = Observable.of(0, 9, 3, 10, 4);
 12. 
 13. y = x.map(nextX => nextX + 3)
Go Left Go Right
Left Button
Clicks
Right Button
Clicks
Left Click
Position
Right Click
Position
Position
How This Works
  1. import {
  2.   fromEvent,
  3.   merge
  4. } from "rxjs";
4. HOW DO I ACTUALLY USE THIS?
IMPORTANT DATA POINT
YOU'RE ALREADY USING IT.
TWO QUESTIONS FOR USING RXJS
How to architect applications with RxJS?
How do I integrate this in my application, today?
User name:
Password:
Submit
User name Password Submit Button
Login Attempts
Login Responses
Login In ProgressLogin Failures
Login Successes
Failure Message
User Token Get Protected
Protected Resourc
But how tho?
  1. const api = {
  2.   login: (username, password) => Promise,
  3.   protectedResource: {
  4.     get: (userToken) => Promise
  5.   }
  6. };
  7. 
  8. const username$ = new Subject();
  9. const password$ = new Subject();
 10. const submitButton$ = new Subject();
 11. 
 12. const loginAttempts$ = 
submitButton$.pipe(withLatestFrom(username$, password$));
 13. 
 14. const loginResponses$ = loginAttempts$.pipe(
 15.   mergeMap(([_, username, password]) => api.login(
 16.     username,
17. password
How data propogates through your program
SIGNAL GRAPH
ACTUAL SIGNAL GRAPH FROM REAL APP
email passwordauthorizationRequested
selectedAccountIndex portfolioSelectedauthorization
user failedLogins portfolios
activePortfolio
portfolioSecurities
accounts
activeAccount
activeAccountPerformances activeAccountPortfolios
PRODUCTION CONCERNS
1. How do I test?
2. How do I make sure my graph is sound?
3. Ack RxJs idiosyncracies!
4. One big graph or lots of smaller ones?
5. Diagramming is hard
I liked Signal Graphs so much I bought the
company!
- me, 2018
A library for frontend state management using signal
graphs
SIGNAL:
Signal!
  1. const signalGraph = new SignalGraphBuilder()
  2.   .define(
  3.     addPrimary('username$'),
  4.     addPrimary('password$'),
  5.     addPrimary('submitButton$'),
  6.     addDerived(
  7.       'loginAttempts$',
  8.       makeLoginAttempts,
  9.       'submitButton$',
 10.       'username$',
 11.       'password$'
 12.     ),
 13.     addDerived('loginResponses$', makeLoginResponses, 
'loginAttempts$', 'api'),
 14.     addDerived(
 15.       'loginInProgress$',
 16.       makeLoginInProgress,
17. 'loginAttempts$',
Available Now(ish):
@RXREACT/SIGNAL
Coming Soon:
AUTOMATIC
GRAPH
VISUALIZATION
INTEGRATION
FRAMEWORK = ANGULAR
1. You're done
2. Check out NgRx
BUT WHAT ABOUT REACT?
GOOD NEWS!
Tools for integrating react with RxJs!
RXREACT:
Signal-connect
  1. import { withViewModel } from '@rxreact/signal­connect'
  2. 
  3. const PositionedBox = ({ position }) => <RedBox pose=
{position} />
  4. 
  5. const ballSignalGraph = new 
SignalGraphBuilder().define(/*...*/).build()
  6. 
  7. // connect(graph, mapGraphOutputsToProps, 
mapGraphInputsToProps = {})
  8. const BoundBox = connect(
  9.   ballSignalGraph,
 10.   {
 11.     position: 'position$'
 12.   }
 13. )(PositionedBox)
 14. 
15. const LeftButton = connect(
5.
USED CAR SALES PORTION
RxJs+React on it's own
@RXREACT/CORE:
RxReact Demo
  1. import { withViewModel } from '@rxreact/core'
  2. 
  3. const PositionedBox = ({ position }) => <RedBox pose=
{position} />
  4. 
  5. const boxVm = {
  6.   inputs: {
  7.     position: position$
  8.   }
  9. }
 10. 
 11. const BoundBox = withViewModel(boxVm)(PositionedBox)
 12. 
 13. const LeftButton = withViewModel({
 14.   outputs: {
 15.     onClick: leftClick$
 16.   }
WHAT ABOUT TYPESCRIPT?
RXREACT TYPESCRIPT
VIEW MODEL AS REDUCER?
  1. let viewModel = viewModelFromReducer({
  2.   initialState: {
  3.     count: 2,
  4.     fruit: 'bananas',
  5.     extra: 'applesauce'
  6.   },
  7.   reducer(state, action) {
  8.     switch (action.type) {
  9.       case ActionType.SET_COUNT:
 10.         return ReducerResult.Update({ ...state,
 11.           count: action.payload
@RXREACT/PROCESS
reactivex-talk.techgirlwonder.com
github.com/hannahhoward/reactivex-talk
THAT'S ALL FOLKS!
Watch the video with slide
synchronization on InfoQ.com!
https://www.infoq.com/presentations/
rxjs-front-end/

Contenu connexe

Similaire à RxJS: A Better Way to Write Front-End Applications

Similaire à RxJS: A Better Way to Write Front-End Applications (20)

Eclipse IoT Talk (Montreal JUG)
Eclipse IoT Talk (Montreal JUG)Eclipse IoT Talk (Montreal JUG)
Eclipse IoT Talk (Montreal JUG)
 
Freeing the Whale: How to Fail at Scale
Freeing the Whale: How to Fail at ScaleFreeing the Whale: How to Fail at Scale
Freeing the Whale: How to Fail at Scale
 
Debugging Javascript - 0 to Heisenberg
Debugging Javascript - 0 to HeisenbergDebugging Javascript - 0 to Heisenberg
Debugging Javascript - 0 to Heisenberg
 
Practical JavaScript Programming - Session 8/8
Practical JavaScript Programming - Session 8/8Practical JavaScript Programming - Session 8/8
Practical JavaScript Programming - Session 8/8
 
Playing With Fire - An Introduction to Node.js
Playing With Fire - An Introduction to Node.jsPlaying With Fire - An Introduction to Node.js
Playing With Fire - An Introduction to Node.js
 
Baking a Microservice PI(e)
Baking a Microservice PI(e)Baking a Microservice PI(e)
Baking a Microservice PI(e)
 
Norikra: SQL Stream Processing In Ruby
Norikra: SQL Stream Processing In RubyNorikra: SQL Stream Processing In Ruby
Norikra: SQL Stream Processing In Ruby
 
Abs2014 kitkatinternals-212-phpapp01
Abs2014 kitkatinternals-212-phpapp01Abs2014 kitkatinternals-212-phpapp01
Abs2014 kitkatinternals-212-phpapp01
 
iExec V3 Dev Edition - EthCC Workshop - March 2019 - Paris
iExec V3 Dev Edition - EthCC Workshop - March 2019 - ParisiExec V3 Dev Edition - EthCC Workshop - March 2019 - Paris
iExec V3 Dev Edition - EthCC Workshop - March 2019 - Paris
 
Microservices 5 things i wish i'd known java with the best 2018
Microservices 5 things i wish i'd known   java with the best 2018Microservices 5 things i wish i'd known   java with the best 2018
Microservices 5 things i wish i'd known java with the best 2018
 
Microservices 5 Things I Wish I'd Known - JFall 2017
Microservices 5 Things I Wish I'd Known - JFall 2017Microservices 5 Things I Wish I'd Known - JFall 2017
Microservices 5 Things I Wish I'd Known - JFall 2017
 
CorePy High-Productivity CellB.E. Programming
CorePy High-Productivity CellB.E. ProgrammingCorePy High-Productivity CellB.E. Programming
CorePy High-Productivity CellB.E. Programming
 
20110709 - CM_Cocoa
20110709 - CM_Cocoa20110709 - CM_Cocoa
20110709 - CM_Cocoa
 
Splunk n-box-splunk conf-2017
Splunk n-box-splunk conf-2017Splunk n-box-splunk conf-2017
Splunk n-box-splunk conf-2017
 
Debugging Javascript
Debugging JavascriptDebugging Javascript
Debugging Javascript
 
Bringing JAMStack to the Enterprise
Bringing JAMStack to the EnterpriseBringing JAMStack to the Enterprise
Bringing JAMStack to the Enterprise
 
Code instrumentation
Code instrumentationCode instrumentation
Code instrumentation
 
(Even more) Rapid App Development with RubyMotion
(Even more) Rapid App Development with RubyMotion(Even more) Rapid App Development with RubyMotion
(Even more) Rapid App Development with RubyMotion
 
The Ring programming language version 1.6 book - Part 7 of 189
The Ring programming language version 1.6 book - Part 7 of 189The Ring programming language version 1.6 book - Part 7 of 189
The Ring programming language version 1.6 book - Part 7 of 189
 
Reactive Programming with Rx
 Reactive Programming with Rx Reactive Programming with Rx
Reactive Programming with Rx
 

Plus de C4Media

Plus de C4Media (20)

Streaming a Million Likes/Second: Real-Time Interactions on Live Video
Streaming a Million Likes/Second: Real-Time Interactions on Live VideoStreaming a Million Likes/Second: Real-Time Interactions on Live Video
Streaming a Million Likes/Second: Real-Time Interactions on Live Video
 
Next Generation Client APIs in Envoy Mobile
Next Generation Client APIs in Envoy MobileNext Generation Client APIs in Envoy Mobile
Next Generation Client APIs in Envoy Mobile
 
Software Teams and Teamwork Trends Report Q1 2020
Software Teams and Teamwork Trends Report Q1 2020Software Teams and Teamwork Trends Report Q1 2020
Software Teams and Teamwork Trends Report Q1 2020
 
Understand the Trade-offs Using Compilers for Java Applications
Understand the Trade-offs Using Compilers for Java ApplicationsUnderstand the Trade-offs Using Compilers for Java Applications
Understand the Trade-offs Using Compilers for Java Applications
 
Kafka Needs No Keeper
Kafka Needs No KeeperKafka Needs No Keeper
Kafka Needs No Keeper
 
High Performing Teams Act Like Owners
High Performing Teams Act Like OwnersHigh Performing Teams Act Like Owners
High Performing Teams Act Like Owners
 
Does Java Need Inline Types? What Project Valhalla Can Bring to Java
Does Java Need Inline Types? What Project Valhalla Can Bring to JavaDoes Java Need Inline Types? What Project Valhalla Can Bring to Java
Does Java Need Inline Types? What Project Valhalla Can Bring to Java
 
Service Meshes- The Ultimate Guide
Service Meshes- The Ultimate GuideService Meshes- The Ultimate Guide
Service Meshes- The Ultimate Guide
 
Shifting Left with Cloud Native CI/CD
Shifting Left with Cloud Native CI/CDShifting Left with Cloud Native CI/CD
Shifting Left with Cloud Native CI/CD
 
CI/CD for Machine Learning
CI/CD for Machine LearningCI/CD for Machine Learning
CI/CD for Machine Learning
 
Fault Tolerance at Speed
Fault Tolerance at SpeedFault Tolerance at Speed
Fault Tolerance at Speed
 
Architectures That Scale Deep - Regaining Control in Deep Systems
Architectures That Scale Deep - Regaining Control in Deep SystemsArchitectures That Scale Deep - Regaining Control in Deep Systems
Architectures That Scale Deep - Regaining Control in Deep Systems
 
ML in the Browser: Interactive Experiences with Tensorflow.js
ML in the Browser: Interactive Experiences with Tensorflow.jsML in the Browser: Interactive Experiences with Tensorflow.js
ML in the Browser: Interactive Experiences with Tensorflow.js
 
User & Device Identity for Microservices @ Netflix Scale
User & Device Identity for Microservices @ Netflix ScaleUser & Device Identity for Microservices @ Netflix Scale
User & Device Identity for Microservices @ Netflix Scale
 
Scaling Patterns for Netflix's Edge
Scaling Patterns for Netflix's EdgeScaling Patterns for Netflix's Edge
Scaling Patterns for Netflix's Edge
 
Make Your Electron App Feel at Home Everywhere
Make Your Electron App Feel at Home EverywhereMake Your Electron App Feel at Home Everywhere
Make Your Electron App Feel at Home Everywhere
 
The Talk You've Been Await-ing For
The Talk You've Been Await-ing ForThe Talk You've Been Await-ing For
The Talk You've Been Await-ing For
 
Future of Data Engineering
Future of Data EngineeringFuture of Data Engineering
Future of Data Engineering
 
Automated Testing for Terraform, Docker, Packer, Kubernetes, and More
Automated Testing for Terraform, Docker, Packer, Kubernetes, and MoreAutomated Testing for Terraform, Docker, Packer, Kubernetes, and More
Automated Testing for Terraform, Docker, Packer, Kubernetes, and More
 
Navigating Complexity: High-performance Delivery and Discovery Teams
Navigating Complexity: High-performance Delivery and Discovery TeamsNavigating Complexity: High-performance Delivery and Discovery Teams
Navigating Complexity: High-performance Delivery and Discovery Teams
 

Dernier

Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 
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
vu2urc
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
giselly40
 
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
Earley Information Science
 

Dernier (20)

A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
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
 
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
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
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
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
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
 
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
 
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...
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
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
 
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...
 
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
 

RxJS: A Better Way to Write Front-End Applications