SlideShare a Scribd company logo
1 of 65
Download to read offline
BUILDING REAL-TIME
APP
By Steven Yap
Futureworkz Pte. Ltd.
StevenYap
stevenyap@futureworkz.com
https://github.com/stevenyap
• Host Saigon.rb Ruby Meetup
• Co-Founder of Futureworkz
• Ruby on Rails coder
• Agile startup consultant
Awesome Ruby on Rails Development
http://www.futureworkz.com
http://playbook.futureworkz.com/
WHAT IS A REAL-TIME
APP?
“the real-time web consists in making the client
interface (or the web side; or the web layer) of
a web application, to communicate
continuously with the corresponding real-time
server, during every user connection.
wikipedia.org/wiki/Real-time_web
USERS DON'T NEED TO
REFRESH THE APP TO
GET NEW DATA
HOW DO YOU?
Use Cases Development Effort
Build a real time To-do list app in your mind
A husband and wife shares the same to-do list
Wife creates a to-do item "Buy fruits"
Husband sees the new item (without refreshing!)
Husband sees the total number of 

items of the list is now 1
Husband refactor the item from "Buy fruits"

to "Buy apples" and "Buy oranges"
Wife sees the "Buy fruits" is changed to 

"Buy apples" and sees a new item "Buy oranges"
Wife sees the total number of items is now 2
Wife deletes "Buy oranges"
HOW DO YOU?
Use Cases Development Effort
Build a real time To-do list app in your mind Setup Rails
A husband and wife shares the same to-do list
Wife creates a to-do item "Buy fruits"
Husband sees the new item (without refreshing!)
Husband sees the total number of 

items of the list is now 1
Husband refactor the item from "Buy fruits"

to "Buy apples" and "Buy oranges"
Wife sees the "Buy fruits" is changed to 

"Buy apples" and sees a new item "Buy oranges"
Wife sees the total number of items is now 2
Wife deletes "Buy oranges"
HOW DO YOU?
Use Cases Development Effort
Build a real time To-do list app in your mind Setup Rails
A husband and wife shares the same to-do list Setup WebSocket
Wife creates a to-do item "Buy fruits"
Husband sees the new item (without refreshing!)
Husband sees the total number of 

items of the list is now 1
Husband refactor the item from "Buy fruits"

to "Buy apples" and "Buy oranges"
Wife sees the "Buy fruits" is changed to 

"Buy apples" and sees a new item "Buy oranges"
Wife sees the total number of items is now 2
Wife deletes "Buy oranges"
HOW DO YOU?
Use Cases Development Effort
Build a real time To-do list app in your mind Setup Rails
A husband and wife shares the same to-do list Setup WebSocket
Wife creates a to-do item "Buy fruits" API create item
Husband sees the new item (without refreshing!)
Husband sees the total number of 

items of the list is now 1
Husband refactor the item from "Buy fruits"

to "Buy apples" and "Buy oranges"
Wife sees the "Buy fruits" is changed to 

"Buy apples" and sees a new item "Buy oranges"
Wife sees the total number of items is now 2
Wife deletes "Buy oranges"
HOW DO YOU?
Use Cases Development Effort
Build a real time To-do list app in your mind Setup Rails
A husband and wife shares the same to-do list Setup WebSocket
Wife creates a to-do item "Buy fruits" API create item
Husband sees the new item (without refreshing!)
Find husband, broadcast item data and update
view
Husband sees the total number of 

items of the list is now 1
Husband refactor the item from "Buy fruits"

to "Buy apples" and "Buy oranges"
Wife sees the "Buy fruits" is changed to 

"Buy apples" and sees a new item "Buy oranges"
Wife sees the total number of items is now 2
Wife deletes "Buy oranges"
HOW DO YOU?
Use Cases Development Effort
Build a real time To-do list app in your mind Setup Rails
A husband and wife shares the same to-do list Setup WebSocket
Wife creates a to-do item "Buy fruits" API create item
Husband sees the new item (without refreshing!)
Find husband, broadcast item data and update
view
Husband sees the total number of 

items of the list is now 1
Find husband, broadcast count data and update
view
Husband refactor the item from "Buy fruits"

to "Buy apples" and "Buy oranges"
Wife sees the "Buy fruits" is changed to 

"Buy apples" and sees a new item "Buy oranges"
Wife sees the total number of items is now 2
Wife deletes "Buy oranges"
HOW DO YOU?
Use Cases Development Effort
Build a real time To-do list app in your mind Setup Rails
A husband and wife shares the same to-do list Setup WebSocket
Wife creates a to-do item "Buy fruits" API create item
Husband sees the new item (without refreshing!)
Find husband, broadcast item data and update
view
Husband sees the total number of 

items of the list is now 1
Find husband, broadcast count data and update
view
Husband refactor the item from "Buy fruits"

to "Buy apples" and "Buy oranges"
API update item and create item
Wife sees the "Buy fruits" is changed to 

"Buy apples" and sees a new item "Buy oranges"
Wife sees the total number of items is now 2
Wife deletes "Buy oranges"
HOW DO YOU?
Use Cases Development Effort
Build a real time To-do list app in your mind Setup Rails
A husband and wife shares the same to-do list Setup WebSocket
Wife creates a to-do item "Buy fruits" API create item
Husband sees the new item (without refreshing!)
Find husband, broadcast item data and update
view
Husband sees the total number of 

items of the list is now 1
Find husband, broadcast count data and update
view
Husband refactor the item from "Buy fruits"

to "Buy apples" and "Buy oranges"
API update item and create item
Wife sees the "Buy fruits" is changed to 

"Buy apples" and sees a new item "Buy oranges"
Find wife, broadcast changes and update the
view
Wife sees the total number of items is now 2
Wife deletes "Buy oranges"
HOW DO YOU?
Use Cases Development Effort
Build a real time To-do list app in your mind Setup Rails
A husband and wife shares the same to-do list Setup WebSocket
Wife creates a to-do item "Buy fruits" API create item
Husband sees the new item (without refreshing!)
Find husband, broadcast item data and update
view
Husband sees the total number of 

items of the list is now 1
Find husband, broadcast count data and update
view
Husband refactor the item from "Buy fruits"

to "Buy apples" and "Buy oranges"
API update item and create item
Wife sees the "Buy fruits" is changed to 

"Buy apples" and sees a new item "Buy oranges"
Find wife, broadcast changes and update the
view
Wife sees the total number of items is now 2
Broadcast to wife and update the count
Wife deletes "Buy oranges"
HOW DO YOU?
Use Cases Development Effort
Build a real time To-do list app in your mind Setup Rails
A husband and wife shares the same to-do list Setup WebSocket
Wife creates a to-do item "Buy fruits" API create item
Husband sees the new item (without refreshing!)
Find husband, broadcast item data and update
view
Husband sees the total number of 

items of the list is now 1
Find husband, broadcast count data and update
view
Husband refactor the item from "Buy fruits"

to "Buy apples" and "Buy oranges"
API update item and create item
Wife sees the "Buy fruits" is changed to 

"Buy apples" and sees a new item "Buy oranges"
Find wife, broadcast changes and update the
view
Wife sees the total number of items is now 2
Broadcast to wife and update the count
Wife deletes "Buy oranges"
API delete item, find husband, broadcast item
data, broadcast count data and update the view
DIFFICULTIES IN BUILDING REAL TIME APP
➤ Managing a constant connection between client and server (Long polling or
WebSocket)
➤ Messy code to update view via DOM manipulation (prepend, append, change
HTML content, remove element)
➤ Messy code to push new changes to the correct clients
➤ Finding the correct clients and WebSocket channels
➤ Detect changes in item count
➤ If a model can update another model, then a view can update a model, which
updates another model, and this, in turn, might cause another view to update.
➤ Total number of items in a list
➤ Total number of items by husband
➤ Total number of items by wife
➤ New item created by mistress in a shared list with husband
A PROPOSED SOLUTION - R4
➤ Rails 5 ActionCable
➤ RethinkDB
➤ ReactJS
➤ Redux
RAILS 5 - ACTIONCABLE
RAILS 5 - ACTIONCABLE
➤ WebSocket is a bi-directional real-time communication
between client and server
➤ It is a persistent connection between server and browser
➤ Server can send data to browser
➤ Browser can send data back to server
➤ Rails 5 ActionCable makes it "easy" to setup WebSocket
RAILS 5 - ACTIONCABLE
$ gem install rails --pre --no-ri --no-rdoc --api
RAILS 5 - ACTIONCABLE
$ gem install rails --pre --no-ri --no-rdoc --api
#	app/channels/todos_channel.rb	
class	TodosChannel	<	ApplicationCable::Channel		
		def	subscribed		
				stream_from	'todo'	
		end	
end
RAILS 5 - ACTIONCABLE
$ gem install rails --pre --no-ri --no-rdoc --api
#	app/channels/todos_channel.rb	
class	TodosChannel	<	ApplicationCable::Channel		
		def	subscribed		
				stream_from	'todo'	
		end	
end	
#	Send	a	message	to	client	
ActionCable.server.broadcast('todo',	{task:	'Buy	
Apples'})
RAILS 5 - ACTIONCABLE
//	Javascript	
App.cable.subscriptions.create('TodosChannel',	{	
		received:	(data)	=>	{	
				console.log(data)	
		}	
})
RAILS 5 - ACTIONCABLE
# app/channels/todos_channel.rb
class	TodosChannel	<	ApplicationCable::Channel		
		def	subscribed		
				stream_from	'todo'	
		end	
		def	create(data)	
				todo	=	Todo.new(data)	
				if	todo.save	
						ActionCable.server.broadcast('todo',	todo)	
				else	
						ActionCable.server.broadcast('todo',	'Save	failed')	
				end	
		end	
end
RAILS 5 - ACTIONCABLE
//	Javascript	
App.cable.subscriptions.create('TodosChannel',	{	
		received:	(data)	=>	{	
				console.log(data)	
		},	
		onSubmit:	(task)	=>	{	
				//	send	data	back	to	server	
				//	calls	TodosChannel#create	
				//	with	data	=	{	task:	task	}	
				this.perform('create',	{	task:	task	})	
		}	
})
RAILS 5 - ACTIONCABLE
➤ Two kinds of broadcast:
➤ Operation broadcast (CRUD)
➤ Notification broadcast
➤ Operation broadcast is easy - simply broadcast back the result
➤ Notification broadcast is messy
➤ A todo item created
➤ Broadcast to wife/husband - which channel? which stream?
➤ Broadcast the new count - which channel? which stream?
➤ Broadcast to others - which channel? which stream?
➤ Code found in Channel/Controller/Model/Job/etc
RETHINKDB
RETHINKDB
➤ Open Source NoSQL database
➤ Stream changes to server for any changes in data
➤ Instead of finding all the channels to broadcast to, we simply
put all notification broadcasting in our channel#subscribed
RETHINKDB SETUP
#	Gemfile	
gem	'nobrainer'	
$	rails	g	nobrainer:install
RETHINKDB SETUP
#	models/todo.rb	
class	Todo	
		include	NoBrainer::Document	
		include	NoBrainer::Document::Timestamps	
		field	:task,						type:	String,			required:	true	
		field	:completed,	type:	Boolean,		required:	true	
end
RETHINKDB SETUP
#	models/todo.rb	
class	Todo	
		include	NoBrainer::Document	
		include	NoBrainer::Document::Timestamps	
		field	:task,						type:	String,			required:	true	
		field	:completed,	type:	Boolean,		required:	true	
end	
#	Use	it	like	ActiveRecord!	(mostly)	
todo	=	Todo.new({task:	'Buy	apples',	completed:	
false})	
todo.save	
todo.errors.full_messages
SUBSCRIBE TO CHANGES
#	app/channels/todos_channel.rb	
class	TodosChannel	<	ApplicationCable::Channel		
		def	subscribed		
				stream_from	'todo'	
				Todo.all.raw.changes.each	do	|changes|	
						ActionCable.server.broadcast(@stream,	changes)	
				end	
		end	
			
		#	...	
end
CHANGES STREAM
#	create	a	todo		
{	
		"new_val"	=>	{					
				"id"	=>	"3SGzWZLEdC2D6P",		
				"task"	=>	"buy	oranges",		
				"completed"	=>	false,		
				"created_at"	=>	2016	-	06	-	07	07:	31:	47	+	0000,	
				"updated_at"	=>	2016	-	06	-	07	07:	31:	47	+	0000	
		},	
		"old_val"	=>	nil	
}
CHANGES STREAM
#	update	a	todo		
{	
		"new_val"	=>	{	
				"id"	=>	"3SEIgBkmjHNuNy",		
				"task"	=>	"buy	oranges",		
				"completed"	=>	false,		
				"created_at"	=>	2016	-	06	-	07	03:	12:	40	+	0000,		
				"updated_at"	=>	2016	-	06	-	07	07:	32:	40	+	0000	
		},		
		"old_val"	=>	{	
				"id"	=>	"3SEIgBkmjHNuNy",		
				"task"	=>	"buy	apples",		
				"completed"	=>	false,		
				"created_at"	=>	2016	-	06	-	07	03:	12:	40	+	0000,		
				"updated_at"	=>	2016	-	06	-	07	07:	32:	24	+	0000	
		}	
}
CHANGES STREAM
#	destroy	a	todo		
{	
		"new_val"	=>	nil,		
		"old_val"	=>	{	
				"id"	=>	"3SEIgBkmjHNuNy",		
				"task"	=>	"buy	oranges",		
				"completed"	=>	false,		
				"created_at"	=>	2016	-	06	-	07	03:	12:	40	+	0000,		
				"updated_at"	=>	2016	-	06	-	07	07:	32:	40	+	0000	
		}	
}
RETHINKDB
➤ Notification broadcasting only occurs in channel subscription
from RethinkDB
➤ Not hidden in Active Record, Active Job, controllers, channel
subscriptions, etc
➤ Single source of notification broadcast
REACTJS
REACTJS
➤ Given a set of data, it will render
➤ When the set of data changes, it will automatically re-render
➤ Declarative style, easy to see how the view will turn out
➤ Easy to reason how data is transformed into view
REACTJS WALKTHROUGH
REACTJS
➤ Given a fixed data, ReactJS will always render correctly
➤ We can make ReactJS deal with rendering only
➤ Can we extract all data/state management to another place?
REDUX
REDUX
➤ Gives the state of entire frontend in a JS Object
➤ When the data changes, it creates a new state and pass to all
the React components to re-render (if necessary)
➤ Extracts away all data logic from React
➤ React renders purely based on the state from Redux
➤ Single source of truth for React
REDUX
#	Initial	State	
state	=	{	
		todos:	[]	
}	
#	React	Renders	nothing
REDUX
#	New	Message	to	reducers	
{	
		id:	"3SEIgBkmjHNuNy",		
		task:	"buy	apple",		
		completed:	false	
}
REDUX
#	New	Message	to	reducers	
{	
		id:	"3SEIgBkmjHNuNy",		
		task:	"buy	apple",		
		completed:	false	
}	
#	New	State	
state	=	{	
		todos:	[	
				{	
						id:	"3SEIgBkmjHNuNy",		
						task:	"buy	apple",		
						completed:	false	
				}	
		]	
}
REDUX
#	New	Message	to	reducers	
{	
		id:	"3SEIgBkmjHNuNy",		
		task:	"buy	apple",		
		completed:	false	
}	
#	New	State	
state	=	{	
		todos:	[	
				{	
						id:	"3SEIgBkmjHNuNy",		
						task:	"buy	apple",		
						completed:	false	
				}	
		]	
}	
#	React	Renders	
<p>buy	apple</p>
REDUX
#	New	Message	to	reducers	
{	
		id:	"3SGzWZLEdC2D6P",		
		task:	"buy	oranges",		
		completed:	false	
}
REDUX
#	New	Message	to	reducers	
{	
		id:	"3SGzWZLEdC2D6P",		
		task:	"buy	oranges",		
		completed:	false	
}	
#	New	State	
state	=	{	
		todos:	[	
				{	
						id:	"3SEIgBkmjHNuNy",		
						task:	"buy	apple",		
						completed:	false	
				},		
				{	
						id:	"3SGzWZLEdC2D6P",		
						task:	"buy	oranges",		
						completed:	false	
				}	
		]	
}
REDUX
#	New	Message	to	reducers	
{	
		id:	"3SGzWZLEdC2D6P",		
		task:	"buy	oranges",		
		completed:	false	
}	
#	New	State	
state	=	{	
		todos:	[	
				{	
						id:	"3SEIgBkmjHNuNy",		
						task:	"buy	apple",		
						completed:	false	
				},		
				{	
						id:	"3SGzWZLEdC2D6P",		
						task:	"buy	oranges",		
						completed:	false	
				}	
		]	
}	
#	React	Renders	
<p>buy	apple</p>	
<p>buy	oranges</p>
REDUX
#	New	Message	to	reducers	
{	
		id:	"3SxIYBkmjUnxms",		
		task:	"buy	pears",		
		completed:	false	
}
REDUX
#	New	Message	to	reducers	
{	
		id:	"3SxIYBkmjUnxms",		
		task:	"buy	pears",		
		completed:	false	
}	
#	New	State	
state	=	{	
		todos:	[	
				{	
						id:	"3SEIgBkmjHNuNy",		
						task:	"buy	apple",		
						completed:	false	
				},		
				{	
						id:	"3SGzWZLEdC2D6P",		
						task:	"buy	oranges",		
						completed:	false	
				},		
				{	
						id:	"3SxIYBkmjUnxms",		
						task:	"buy	pears",		
						completed:	false	
				}	
		]	
}
REDUX
#	New	Message	to	reducers	
{	
		id:	"3SxIYBkmjUnxms",		
		task:	"buy	pears",		
		completed:	false	
}	
#	New	State	
state	=	{	
		todos:	[	
				{	
						id:	"3SEIgBkmjHNuNy",		
						task:	"buy	apple",		
						completed:	false	
				},		
				{	
						id:	"3SGzWZLEdC2D6P",		
						task:	"buy	oranges",		
						completed:	false	
				},		
				{	
						id:	"3SxIYBkmjUnxms",		
						task:	"buy	pears",		
						completed:	false	
				}	
		]	
}	
#	React	Renders	
<p>buy	apple</p>	
<p>buy	oranges</p>	
<p>buy	pears</p>
CONNECTING REDUX &
REACTJS
WIRING THEM UP
➤ ReactJS is (almost)
pure functions of view
➤ Redux is the single
source of truth for
frontend data
➤ Rails provides the
business logic and
WebSocket connection
➤ RethinkDB is the
single source of
broadcast
RethinkDB
Rails
Redux
ReactJS
dispatch
perform
broadcast
BENEFITS
➤ Separation of concerns
➤ Easier to subscribe to multiple data changes
➤ Increased use of WebSocket
➤ Real-time app made easy!
FOOD FOR THOUGHT
➤ Using Opal for frontend React/Redux
➤ Pure frontend vs monolithic app
➤ Redux + React Native mobile development

with Rails + Rethinkdb backend
➤ Storing Redux state in backend vs frontend
➤ Websocket vs HTTP
USING OPAL FOR FRONTEND REACT/REDUX
➤ Ruby everywhere!
➤ Isomorphic app - share code between frontend and backend
PURE FRONTEND (REDUX + REACTJS) VS MONOLITHIC APP
➤ Enjoy the goodness of frontend development
➤ Separation of concern between frontend and backend
REDUX + REACT NATIVE MOBILE DEVELOPMENT WITH RAILS + RETHINKDB BACKEND
➤ React = "Learn once, write every where"
➤ ReactJS is very similar to React Native
➤ Easy to onboard web developers onto mobile developments
➤ Enjoy hot reloading, code push, etc
STORING REDUX STATE IN BACKEND VS FRONTEND
➤ Persist frontend state in backend
➤ Write reducers in Ruby!
➤ Faster performance in calculating new state
➤ Stream state diff to frontend
WEBSOCKET VS HTTP API
➤ WebSocket is bi-directional
➤ Why do we need to call HTTP API?
➤ Less overhead, faster response
➤ HTTP - fetch and wait and response
➤ WebSocket - push to server and react on response
RESOURCES
➤ https://github.com/rails/rails/tree/master/actioncable
➤ https://www.rethinkdb.com/docs/guide/ruby/
➤ https://facebook.github.io/react/docs/thinking-in-react.html
➤ http://redux.js.org/index.html
➤ https://egghead.io/courses/getting-started-with-redux

More Related Content

What's hot

Every Api Needs a Product Manager • Mailjet
Every Api Needs a Product Manager • Mailjet Every Api Needs a Product Manager • Mailjet
Every Api Needs a Product Manager • Mailjet Molino de Ideas
 
Develop Like a Designer: The Art of APIs
Develop Like a Designer: The Art of APIsDevelop Like a Designer: The Art of APIs
Develop Like a Designer: The Art of APIsJenny Wanger
 
All the world's a stage – the next step in automated testing practices
All the world's a stage – the next step in automated testing practicesAll the world's a stage – the next step in automated testing practices
All the world's a stage – the next step in automated testing practicesJohn Ferguson Smart Limited
 
TDC2016SP - Otimização Prematura: a Raíz de Todo o Mal
TDC2016SP - Otimização Prematura: a Raíz de Todo o MalTDC2016SP - Otimização Prematura: a Raíz de Todo o Mal
TDC2016SP - Otimização Prematura: a Raíz de Todo o Maltdc-globalcode
 
Handling Changes to Your Server-Side Data Model
Handling Changes to Your Server-Side Data ModelHandling Changes to Your Server-Side Data Model
Handling Changes to Your Server-Side Data ModelGilt Tech Talks
 
iOS Testing With Appium at Gilt
iOS Testing With Appium at GiltiOS Testing With Appium at Gilt
iOS Testing With Appium at GiltGilt Tech Talks
 
What Makes a Great Open API?
What Makes a Great Open API?What Makes a Great Open API?
What Makes a Great Open API?John Musser
 
The Null Object Pattern
The Null Object PatternThe Null Object Pattern
The Null Object Patternmodern_legend
 
Technical SEO for a Mobile First World
Technical SEO for a Mobile First WorldTechnical SEO for a Mobile First World
Technical SEO for a Mobile First WorldKaizen
 

What's hot (9)

Every Api Needs a Product Manager • Mailjet
Every Api Needs a Product Manager • Mailjet Every Api Needs a Product Manager • Mailjet
Every Api Needs a Product Manager • Mailjet
 
Develop Like a Designer: The Art of APIs
Develop Like a Designer: The Art of APIsDevelop Like a Designer: The Art of APIs
Develop Like a Designer: The Art of APIs
 
All the world's a stage – the next step in automated testing practices
All the world's a stage – the next step in automated testing practicesAll the world's a stage – the next step in automated testing practices
All the world's a stage – the next step in automated testing practices
 
TDC2016SP - Otimização Prematura: a Raíz de Todo o Mal
TDC2016SP - Otimização Prematura: a Raíz de Todo o MalTDC2016SP - Otimização Prematura: a Raíz de Todo o Mal
TDC2016SP - Otimização Prematura: a Raíz de Todo o Mal
 
Handling Changes to Your Server-Side Data Model
Handling Changes to Your Server-Side Data ModelHandling Changes to Your Server-Side Data Model
Handling Changes to Your Server-Side Data Model
 
iOS Testing With Appium at Gilt
iOS Testing With Appium at GiltiOS Testing With Appium at Gilt
iOS Testing With Appium at Gilt
 
What Makes a Great Open API?
What Makes a Great Open API?What Makes a Great Open API?
What Makes a Great Open API?
 
The Null Object Pattern
The Null Object PatternThe Null Object Pattern
The Null Object Pattern
 
Technical SEO for a Mobile First World
Technical SEO for a Mobile First WorldTechnical SEO for a Mobile First World
Technical SEO for a Mobile First World
 

Viewers also liked

React on rails v6.1 at LA Ruby, November 2016
React on rails v6.1 at LA Ruby, November 2016React on rails v6.1 at LA Ruby, November 2016
React on rails v6.1 at LA Ruby, November 2016Justin Gordon
 
SQL vs NoSQL: 
проблема выбора
SQL vs NoSQL: 
проблема выбораSQL vs NoSQL: 
проблема выбора
SQL vs NoSQL: 
проблема выбораTKConf
 
Writing Once: Multi-client code sharing in ReactJS
Writing Once: Multi-client code sharing in ReactJSWriting Once: Multi-client code sharing in ReactJS
Writing Once: Multi-client code sharing in ReactJSColin Vernon
 
how-to-disappear-from-the-web
how-to-disappear-from-the-webhow-to-disappear-from-the-web
how-to-disappear-from-the-webRussell Ford
 
RethinkDB - the open-source database for the realtime web
RethinkDB - the open-source database for the realtime webRethinkDB - the open-source database for the realtime web
RethinkDB - the open-source database for the realtime webAlex Ivanov
 
Enterprise Architectures with Ruby (and Rails)
Enterprise Architectures with Ruby (and Rails)Enterprise Architectures with Ruby (and Rails)
Enterprise Architectures with Ruby (and Rails)Konstantin Gredeskoul
 
From Obvious to Ingenius: Incrementally Scaling Web Apps on PostgreSQL
From Obvious to Ingenius: Incrementally Scaling Web Apps on PostgreSQLFrom Obvious to Ingenius: Incrementally Scaling Web Apps on PostgreSQL
From Obvious to Ingenius: Incrementally Scaling Web Apps on PostgreSQLKonstantin Gredeskoul
 

Viewers also liked (9)

React on rails v6.1 at LA Ruby, November 2016
React on rails v6.1 at LA Ruby, November 2016React on rails v6.1 at LA Ruby, November 2016
React on rails v6.1 at LA Ruby, November 2016
 
React on rails v4
React on rails v4React on rails v4
React on rails v4
 
SQL vs NoSQL: 
проблема выбора
SQL vs NoSQL: 
проблема выбораSQL vs NoSQL: 
проблема выбора
SQL vs NoSQL: 
проблема выбора
 
Writing Once: Multi-client code sharing in ReactJS
Writing Once: Multi-client code sharing in ReactJSWriting Once: Multi-client code sharing in ReactJS
Writing Once: Multi-client code sharing in ReactJS
 
how-to-disappear-from-the-web
how-to-disappear-from-the-webhow-to-disappear-from-the-web
how-to-disappear-from-the-web
 
RethinkDB - the open-source database for the realtime web
RethinkDB - the open-source database for the realtime webRethinkDB - the open-source database for the realtime web
RethinkDB - the open-source database for the realtime web
 
Ruby on Rails for beginners
Ruby on Rails for beginnersRuby on Rails for beginners
Ruby on Rails for beginners
 
Enterprise Architectures with Ruby (and Rails)
Enterprise Architectures with Ruby (and Rails)Enterprise Architectures with Ruby (and Rails)
Enterprise Architectures with Ruby (and Rails)
 
From Obvious to Ingenius: Incrementally Scaling Web Apps on PostgreSQL
From Obvious to Ingenius: Incrementally Scaling Web Apps on PostgreSQLFrom Obvious to Ingenius: Incrementally Scaling Web Apps on PostgreSQL
From Obvious to Ingenius: Incrementally Scaling Web Apps on PostgreSQL
 

Recently uploaded

HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comFatema Valibhai
 
Sector 18, Noida Call girls :8448380779 Model Escorts | 100% verified
Sector 18, Noida Call girls :8448380779 Model Escorts | 100% verifiedSector 18, Noida Call girls :8448380779 Model Escorts | 100% verified
Sector 18, Noida Call girls :8448380779 Model Escorts | 100% verifiedDelhi Call girls
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplatePresentation.STUDIO
 
Exploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdfExploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdfproinshot.com
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnAmarnathKambale
 
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesVictorSzoltysek
 
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfonteinmasabamasaba
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension AidPhilip Schwarz
 
BUS PASS MANGEMENT SYSTEM USING PHP.pptx
BUS PASS MANGEMENT SYSTEM USING PHP.pptxBUS PASS MANGEMENT SYSTEM USING PHP.pptx
BUS PASS MANGEMENT SYSTEM USING PHP.pptxalwaysnagaraju26
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsJhone kinadey
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️Delhi Call girls
 
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Steffen Staab
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfkalichargn70th171
 
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park %in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park masabamasaba
 
LEVEL 5 - SESSION 1 2023 (1).pptx - PDF 123456
LEVEL 5   - SESSION 1 2023 (1).pptx - PDF 123456LEVEL 5   - SESSION 1 2023 (1).pptx - PDF 123456
LEVEL 5 - SESSION 1 2023 (1).pptx - PDF 123456KiaraTiradoMicha
 
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...Shane Coughlan
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...ICS
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️Delhi Call girls
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdfPearlKirahMaeRagusta1
 

Recently uploaded (20)

HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.com
 
Sector 18, Noida Call girls :8448380779 Model Escorts | 100% verified
Sector 18, Noida Call girls :8448380779 Model Escorts | 100% verifiedSector 18, Noida Call girls :8448380779 Model Escorts | 100% verified
Sector 18, Noida Call girls :8448380779 Model Escorts | 100% verified
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation Template
 
Exploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdfExploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdf
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learn
 
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
 
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
BUS PASS MANGEMENT SYSTEM USING PHP.pptx
BUS PASS MANGEMENT SYSTEM USING PHP.pptxBUS PASS MANGEMENT SYSTEM USING PHP.pptx
BUS PASS MANGEMENT SYSTEM USING PHP.pptx
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial Goals
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
 
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
 
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park %in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
 
LEVEL 5 - SESSION 1 2023 (1).pptx - PDF 123456
LEVEL 5   - SESSION 1 2023 (1).pptx - PDF 123456LEVEL 5   - SESSION 1 2023 (1).pptx - PDF 123456
LEVEL 5 - SESSION 1 2023 (1).pptx - PDF 123456
 
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdf
 

Building Real Time App