SlideShare a Scribd company logo
1 of 80
Download to read offline
Ruby Meditation #13
Functional web apps with
Webmachine framework
Mikhail Bortnyk, Amoniac OÜ
Who am I
❖ Mikhail Bortnyk
Who am I
❖ Mikhail Bortnyk
❖ github: @vessi
Who am I
❖ Mikhail Bortnyk
❖ github: @vessi
❖ twitter: @mikhailbortnyk
Who am I
❖ Mikhail Bortnyk
❖ github: @vessi
❖ twitter: @mikhailbortnyk
❖ language researcher
Who am I
❖ Mikhail Bortnyk
❖ github: @vessi
❖ twitter: @mikhailbortnyk
❖ language researcher
❖ co-founder of Kottans community school
Who am I
❖ Mikhail Bortnyk
❖ github: @vessi
❖ twitter: @mikhailbortnyk
❖ language researcher
❖ co-founder of Kottans community school
❖ 3rd contributor of mruby/c
Who am I
❖ Mikhail Bortnyk
❖ github: @vessi
❖ twitter: @mikhailbortnyk
❖ language researcher
❖ co-founder of Kottans community school
❖ 3rd contributor of mruby/c
❖ Ruby developer (not Rails!)
Source code
❖ [Link to presentation online]
Source code
❖ [Link to presentation online]
❖ [Link to source code on GitHub]
Introduction
Typical experience of web developer
CGI Old school is cool! (Bash, C, Perl, some scripting)
Typical experience of web developer
CGI Old school is cool! (Bash, C, Perl, some scripting)
Servlets I know your pain, bro (PHP, Java)
Typical experience of web developer
CGI Old school is cool! (Bash, C, Perl, some scripting)
Servlets I know your pain, bro (PHP, Java)
MVC The thing we all know (Python/Django, Ruby/Rails etc)
SPA is a new sexy
❖ No one uses ol’ goo’ ERB
SPA is a new sexy
❖ No one uses ol’ goo’ ERB
❖ Javascript rules over the web
SPA is a new sexy
❖ No one uses ol’ goo’ ERB
❖ Javascript rules over the web
❖ Web does not work without JS
SPA is a new sexy
❖ No one uses ol’ goo’ ERB
❖ Javascript rules over the web
❖ Web does not work without JS
❖ http://tobyho.com/
2010/03/11/how-much-of-the-
web-actually/
SPA is a new sexy
❖ No one uses ol’ goo’ ERB
❖ Javascript rules over the web
❖ Web does not work without JS
❖ http://tobyho.com/
2010/03/11/how-much-of-the-
web-actually/
❖ In fact, you are limited to
StackOverflow, Amazon and
Google Search
SPA is a new sexy
❖ No one uses ol’ goo’ ERB
❖ Javascript rules over the web
❖ Web does not work without JS
❖ http://tobyho.com/2010/03/11/
how-much-of-the-web-actually/
❖ In fact, you are limited to
StackOverflow, Amazon and
Google Search
❖ Actually, only paranoids disable
JS in 2017
We are outdated
No more MPA applications
Web developers are developing
APIs
APIs for SPAs, for mobile
applications, for another APIs
Solutions for APIs
❖ Still Rails. Now with API flavor (rails-api)
Solutions for APIs
❖ Still Rails. Now with API flavor (rails-api). Still Rails.
Still boring. Still overbloated.
Solutions for APIs
❖ Still Rails. Now with API flavor (rails-api). Still Rails.
Still boring. Still overbloated.
❖ Sinatra is a new shiny
Solutions for APIs
❖ Still Rails. Now with API flavor (rails-api). Still Rails.
Still boring. Still overbloated.
❖ Sinatra is a new shiny OH WAI~~. A little too big
Solutions for APIs
❖ Still Rails. Now with API flavor (rails-api). Still Rails.
Still boring. Still overbloated.
❖ Sinatra is a new shiny OH WAI~~. A little too big
❖ Microframeworks like Cuba, NYNY
Solutions for APIs
❖ Still Rails. Now with API flavor (rails-api). Still Rails.
Still boring. Still overbloated.
❖ Sinatra is a new shiny OH WAI~~. A little too big
❖ Microframeworks like Cuba, NYNY - too much to write
Solutions for APIs
❖ Still Rails. Now with API flavor (rails-api). Still Rails.
Still boring. Still overbloated.
❖ Sinatra is a new shiny OH WAI~~. A little too big
❖ Microframeworks like Cuba, NYNY - too much to write
❖ Roda
Solutions for APIs
❖ Still Rails. Now with API flavor (rails-api). Still Rails.
Still boring. Still overbloated.
❖ Sinatra is a new shiny OH WAI~~. A little too big
❖ Microframeworks like Cuba, NYNY - too much to write
❖ Roda - a challenger appears. No one noticed
Solutions for APIs
❖ Still Rails. Now with API flavor (rails-api). Still Rails.
Still boring. Still overbloated.
❖ Sinatra is a new shiny OH WAI~~. A little too big
❖ Microframeworks like Cuba, NYNY - too much to write
❖ Roda - a challenger appears. No one noticed
❖ Rack
Solutions for APIs
❖ Still Rails. Now with API flavor (rails-api). Still Rails.
Still boring. Still overbloated.
❖ Sinatra is a new shiny OH WAI~~. A little too big
❖ Microframeworks like Cuba, NYNY - too much to write
❖ Roda - a challenger appears. No one noticed
❖ Rack - maybe easier to rewrite the whole stack from
scratch?
Solutions for APIs
❖ Still Rails. Now with API flavor (rails-api). Still Rails.
Still boring. Still overbloated.
❖ Sinatra is a new shiny OH WAI~~. A little too big
❖ Microframeworks like Cuba, NYNY - too much to write
❖ Roda - a challenger appears. No one noticed
❖ Rack - maybe easier to rewrite the whole stack from
scratch? (And end up with buggy unfinished Rails)
If you can’t create it, steal it
WebMachine-ruby
❖ Based on Erlang’s web machine
WebMachine-ruby
❖ Based on Erlang’s web machine
❖ Created by Sean Cribbs
WebMachine-ruby
❖ Based on Erlang’s web machine
❖ Created by Sean Cribbs
❖ More than 5 years old
WebMachine-ruby
❖ Based on Erlang’s web machine
❖ Created by Sean Cribbs
❖ More than 5 years old
❖ Still alive!
WebMachine-ruby
❖ Based on Erlang’s web machine
❖ Created by Sean Cribbs
❖ More than 5 years old
❖ Still alive! Last commit - on 30 Jan 2017
WebMachine-ruby
❖ Based on Erlang’s web machine
❖ Created by Sean Cribbs
❖ More than 5 years old
❖ Still alive! Last commit - on 30 Jan 2017
❖ 13 issues opened and 80 closed
WebMachine-ruby
❖ Based on Erlang’s web machine
❖ Created by Sean Cribbs
❖ More than 5 years old
❖ Still alive! Last commit - on 30 Jan 2017
❖ 13 issues opened and 80 closed
❖ Author works with Erlang, Ruby and Elixir
WebMachine-ruby
❖ Based on Erlang’s web machine
❖ Created by Sean Cribbs
❖ More than 5 years old
❖ Still alive! Last commit - on 30 Jan 2017
❖ 13 issues opened and 80 closed
❖ Author works with Erlang, Ruby and Elixir
❖ github://webmachine/webmachine-ruby.git
Fundamental idea
❖ Each API resource is a typical state machine
Fundamental idea
❖ Each API resource is a typical state machine
❖ Each request is a flow through this state machine
Fundamental idea
❖ Each API resource is a typical state machine
❖ Each request is a flow through this state machine
❖ Most requests are pretty standard
Fundamental idea
❖ Each API resource is a typical state machine
❖ Each request is a flow through this state machine
❖ Most requests are pretty standard
❖ Functional behavior is more suiting case for this
Fundamental idea
❖ Each API resource is a typical state machine
❖ Each request is a flow through this state machine
❖ Most requests are pretty standard
❖ Functional behavior is more suiting case for this
❖ Define standards and override only needed things
Why state machine?
❖ Typical frameworks: request is running by predefined
procedure.
Why state machine?
❖ Typical frameworks: request is running by predefined
procedure. They are not your bros
Why state machine?
❖ Typical frameworks: request is running by predefined
procedure. They are not your bros
❖ Webmachine determines facts about requests
Why state machine?
❖ Typical frameworks: request is running by predefined
procedure. They are not your bros
❖ Webmachine determines facts about requests
❖ Uses finite state machine to determine proper response
Why state machine?
❖ Typical frameworks: request is running by predefined
procedure. They are not your bros
❖ Webmachine determines facts about requests
❖ Uses finite state machine to determine proper response
❖ Each fact can easily be tested
Why state machine?
❖ Typical frameworks: request is running by predefined
procedure. They are not your bros
❖ Webmachine determines facts about requests
❖ Uses finite state machine to determine proper response
❖ Each fact can easily be tested
❖ Webmachine is your bro
State machine diagram
Request to resource flow
Validation and authorization
Content negotiation
Existence and redirection
Conditional requests
PUT/POST (resource creation)
DELETE (resource deletion)
render body
How it parses your request?
Parsing request
❖ Initial request: 

curl "http://localhost/kudos/1" -H "Accept:
application/json" -u test -p test
Parsing request
❖ Initial request: 

curl "http://localhost/kudos/1" -H "Accept: application/json" -u test -p test
❖ Does route /kudos/:id exist?
Parsing request
❖ Initial request: 

curl "http://localhost/kudos/1" -H "Accept: application/json" -u test -p test
❖ Does route /kudos/:id exist?
❖ Does resource with ID 1 exist?
Parsing request
❖ Initial request: 

curl "http://localhost/kudos/1" -H "Accept: application/json" -u test -p test
❖ Does route /kudos/:id exist?
❖ Does resource with ID 1 exist?
❖ Is this user with this password allowed to execute this
request on resource?
Parsing request
❖ Initial request: 

curl "http://localhost/kudos/1" -H "Accept: application/json" -u test -p test
❖ Does route /kudos/:id exist?
❖ Does resource with ID 1 exist?
❖ Is this user with this password allowed to execute this
request on resource?
❖ Can this method be called for this resource?
Parsing request
❖ Initial request: 

curl "http://localhost/kudos/1" -H "Accept: application/json" -u test -p test
❖ Does route /kudos/:id exist?
❖ Does resource with ID 1 exist?
❖ Is this user with this password allowed to execute this
request on resource?
❖ Can this method be called for this resource?
❖ Can this resource be rendered with this content type?
Typical resource
class KudoResource < Webmachine::Resource
def allowed_methods
["GET"]
end
def content_types_provided
[["application/json", :to_json]]
end
def resource_exists?
kudo # Truthy or falsey
end
def to_json
kudo.to_json
end
private
def kudo
@kudo ||= Kudo.find(id)
end
def id
request.path_info[:id]
end
end
Little coding session
Bonus: request trace
Even more
Lattice: Webmachine on actors
Thank you!
Questions?

More Related Content

What's hot

Mind your lang (for role=drinks at CSUN 2017)
Mind your lang (for role=drinks at CSUN 2017)Mind your lang (for role=drinks at CSUN 2017)
Mind your lang (for role=drinks at CSUN 2017)Adrian Roselli
 
Semantic Web: A web that is not the Web
Semantic Web: A web that is not the WebSemantic Web: A web that is not the Web
Semantic Web: A web that is not the WebBruce Esrig
 
Pragmatic REST: recent trends in API design
Pragmatic REST: recent trends in API designPragmatic REST: recent trends in API design
Pragmatic REST: recent trends in API designMarsh Gardiner
 
DIY Synthetic: Private WebPagetest Magic
DIY Synthetic: Private WebPagetest MagicDIY Synthetic: Private WebPagetest Magic
DIY Synthetic: Private WebPagetest MagicJonathan Klein
 
Selfish Accessibility — WordCamp Europe 2017
Selfish Accessibility — WordCamp Europe 2017Selfish Accessibility — WordCamp Europe 2017
Selfish Accessibility — WordCamp Europe 2017Adrian Roselli
 
Contributing To Rails By Plugin Gem
Contributing To Rails By Plugin GemContributing To Rails By Plugin Gem
Contributing To Rails By Plugin GemDaniel Lv
 
Web ninja html & css
Web ninja   html & cssWeb ninja   html & css
Web ninja html & cssAlfi Rizka
 
I can has API? A Love Story
I can has API? A Love StoryI can has API? A Love Story
I can has API? A Love StoryCal Henderson
 
Offline for web - Frontend Dev Conf Minsk 2014
Offline for web - Frontend Dev Conf Minsk 2014Offline for web - Frontend Dev Conf Minsk 2014
Offline for web - Frontend Dev Conf Minsk 2014Jan Jongboom
 
Abstractions: Fringe Accessibility
Abstractions: Fringe AccessibilityAbstractions: Fringe Accessibility
Abstractions: Fringe AccessibilityAdrian Roselli
 
EscConf - Deep Dive Frontend Optimization
EscConf - Deep Dive Frontend OptimizationEscConf - Deep Dive Frontend Optimization
EscConf - Deep Dive Frontend OptimizationJonathan Klein
 
Modular Open Source in Java for Now and Later
Modular Open Source in Java for Now and LaterModular Open Source in Java for Now and Later
Modular Open Source in Java for Now and LaterBob Paulin
 
LAMP Optimization
LAMP OptimizationLAMP Optimization
LAMP OptimizationDave Ross
 
Pragmatic REST APIs
Pragmatic REST APIsPragmatic REST APIs
Pragmatic REST APIsamesar0
 
Cufon - Javascript Font Replacement
Cufon - Javascript Font ReplacementCufon - Javascript Font Replacement
Cufon - Javascript Font ReplacementDave Ross
 

What's hot (17)

Mind your lang (for role=drinks at CSUN 2017)
Mind your lang (for role=drinks at CSUN 2017)Mind your lang (for role=drinks at CSUN 2017)
Mind your lang (for role=drinks at CSUN 2017)
 
UCLA HACKU'11
UCLA HACKU'11UCLA HACKU'11
UCLA HACKU'11
 
Semantic Web: A web that is not the Web
Semantic Web: A web that is not the WebSemantic Web: A web that is not the Web
Semantic Web: A web that is not the Web
 
Pragmatic REST: recent trends in API design
Pragmatic REST: recent trends in API designPragmatic REST: recent trends in API design
Pragmatic REST: recent trends in API design
 
DIY Synthetic: Private WebPagetest Magic
DIY Synthetic: Private WebPagetest MagicDIY Synthetic: Private WebPagetest Magic
DIY Synthetic: Private WebPagetest Magic
 
Selfish Accessibility — WordCamp Europe 2017
Selfish Accessibility — WordCamp Europe 2017Selfish Accessibility — WordCamp Europe 2017
Selfish Accessibility — WordCamp Europe 2017
 
Contributing To Rails By Plugin Gem
Contributing To Rails By Plugin GemContributing To Rails By Plugin Gem
Contributing To Rails By Plugin Gem
 
Web ninja html & css
Web ninja   html & cssWeb ninja   html & css
Web ninja html & css
 
I can has API? A Love Story
I can has API? A Love StoryI can has API? A Love Story
I can has API? A Love Story
 
Firebug
FirebugFirebug
Firebug
 
Offline for web - Frontend Dev Conf Minsk 2014
Offline for web - Frontend Dev Conf Minsk 2014Offline for web - Frontend Dev Conf Minsk 2014
Offline for web - Frontend Dev Conf Minsk 2014
 
Abstractions: Fringe Accessibility
Abstractions: Fringe AccessibilityAbstractions: Fringe Accessibility
Abstractions: Fringe Accessibility
 
EscConf - Deep Dive Frontend Optimization
EscConf - Deep Dive Frontend OptimizationEscConf - Deep Dive Frontend Optimization
EscConf - Deep Dive Frontend Optimization
 
Modular Open Source in Java for Now and Later
Modular Open Source in Java for Now and LaterModular Open Source in Java for Now and Later
Modular Open Source in Java for Now and Later
 
LAMP Optimization
LAMP OptimizationLAMP Optimization
LAMP Optimization
 
Pragmatic REST APIs
Pragmatic REST APIsPragmatic REST APIs
Pragmatic REST APIs
 
Cufon - Javascript Font Replacement
Cufon - Javascript Font ReplacementCufon - Javascript Font Replacement
Cufon - Javascript Font Replacement
 

Viewers also liked

Funtional Ruby - Mikhail Bortnyk
Funtional Ruby - Mikhail BortnykFuntional Ruby - Mikhail Bortnyk
Funtional Ruby - Mikhail BortnykRuby Meditation
 
Evident Secrets of Successful Application - Max Goncharov
Evident Secrets of Successful Application - Max GoncharovEvident Secrets of Successful Application - Max Goncharov
Evident Secrets of Successful Application - Max GoncharovRuby Meditation
 
Rodauth: Clean Authentication - Valentine Ostakh
Rodauth: Clean Authentication - Valentine OstakhRodauth: Clean Authentication - Valentine Ostakh
Rodauth: Clean Authentication - Valentine OstakhRuby Meditation
 
Ruby Gems and Native Extensions - Stas Volovyk
Ruby Gems and Native Extensions - Stas VolovykRuby Gems and Native Extensions - Stas Volovyk
Ruby Gems and Native Extensions - Stas VolovykRuby Meditation
 
Lets build a game (in 24 min) by Ivan Zarea
Lets build a game (in 24 min) by Ivan ZareaLets build a game (in 24 min) by Ivan Zarea
Lets build a game (in 24 min) by Ivan ZareaPivorak MeetUp
 
Say Goodbye to Procedural Programming - Nick Sutterer
Say Goodbye to Procedural Programming - Nick SuttererSay Goodbye to Procedural Programming - Nick Sutterer
Say Goodbye to Procedural Programming - Nick SuttererRuby Meditation
 

Viewers also liked (6)

Funtional Ruby - Mikhail Bortnyk
Funtional Ruby - Mikhail BortnykFuntional Ruby - Mikhail Bortnyk
Funtional Ruby - Mikhail Bortnyk
 
Evident Secrets of Successful Application - Max Goncharov
Evident Secrets of Successful Application - Max GoncharovEvident Secrets of Successful Application - Max Goncharov
Evident Secrets of Successful Application - Max Goncharov
 
Rodauth: Clean Authentication - Valentine Ostakh
Rodauth: Clean Authentication - Valentine OstakhRodauth: Clean Authentication - Valentine Ostakh
Rodauth: Clean Authentication - Valentine Ostakh
 
Ruby Gems and Native Extensions - Stas Volovyk
Ruby Gems and Native Extensions - Stas VolovykRuby Gems and Native Extensions - Stas Volovyk
Ruby Gems and Native Extensions - Stas Volovyk
 
Lets build a game (in 24 min) by Ivan Zarea
Lets build a game (in 24 min) by Ivan ZareaLets build a game (in 24 min) by Ivan Zarea
Lets build a game (in 24 min) by Ivan Zarea
 
Say Goodbye to Procedural Programming - Nick Sutterer
Say Goodbye to Procedural Programming - Nick SuttererSay Goodbye to Procedural Programming - Nick Sutterer
Say Goodbye to Procedural Programming - Nick Sutterer
 

Similar to Build Functional Web APIs with the Webmachine Framework in Ruby

Rapid API Development with LoopBack/StrongLoop
Rapid API Development with LoopBack/StrongLoopRapid API Development with LoopBack/StrongLoop
Rapid API Development with LoopBack/StrongLoopRaymond Camden
 
Windycityrails page performance
Windycityrails page performanceWindycityrails page performance
Windycityrails page performanceJohn McCaffrey
 
Build your own analytics power tools
Build your own analytics power toolsBuild your own analytics power tools
Build your own analytics power toolsAlban Gérôme
 
Offline of web applications
Offline of web applicationsOffline of web applications
Offline of web applicationsFDConf
 
6 reasons Jubilee could be a Rubyist's new best friend
6 reasons Jubilee could be a Rubyist's new best friend6 reasons Jubilee could be a Rubyist's new best friend
6 reasons Jubilee could be a Rubyist's new best friendForrest Chang
 
The Power of Open Data
The Power of Open DataThe Power of Open Data
The Power of Open DataPhil Windley
 
Yahoo Pipes Middleware In The Cloud
Yahoo Pipes Middleware In The CloudYahoo Pipes Middleware In The Cloud
Yahoo Pipes Middleware In The CloudConSanFrancisco123
 
Y Pipes Mashup Camp
Y Pipes Mashup CampY Pipes Mashup Camp
Y Pipes Mashup CampJinho Jung
 
Open Data Semantic Web Community Barn Raising
Open Data Semantic Web Community Barn RaisingOpen Data Semantic Web Community Barn Raising
Open Data Semantic Web Community Barn RaisingBoris Mann
 
Handling 10k requests per second with Symfony and Varnish - SymfonyCon Berlin...
Handling 10k requests per second with Symfony and Varnish - SymfonyCon Berlin...Handling 10k requests per second with Symfony and Varnish - SymfonyCon Berlin...
Handling 10k requests per second with Symfony and Varnish - SymfonyCon Berlin...Alexander Lisachenko
 
Creating And Consuming Web Services In Php 5
Creating And Consuming Web Services In Php 5Creating And Consuming Web Services In Php 5
Creating And Consuming Web Services In Php 5Michael Girouard
 
Understanding APIs.pptx introduction chk
Understanding APIs.pptx introduction chkUnderstanding APIs.pptx introduction chk
Understanding APIs.pptx introduction chknooreen nayyar syeda
 
Concurrent Ruby Application Servers
Concurrent Ruby Application ServersConcurrent Ruby Application Servers
Concurrent Ruby Application ServersLin Jen-Shin
 
REST API Pentester's perspective
REST API Pentester's perspectiveREST API Pentester's perspective
REST API Pentester's perspectiveSecuRing
 
How we took our server side application to the cloud and liked what we got
How we took our server side application to the cloud and liked what we gotHow we took our server side application to the cloud and liked what we got
How we took our server side application to the cloud and liked what we gotBaruch Sadogursky
 

Similar to Build Functional Web APIs with the Webmachine Framework in Ruby (20)

Rapid API Development with LoopBack/StrongLoop
Rapid API Development with LoopBack/StrongLoopRapid API Development with LoopBack/StrongLoop
Rapid API Development with LoopBack/StrongLoop
 
Windycityrails page performance
Windycityrails page performanceWindycityrails page performance
Windycityrails page performance
 
Build your own analytics power tools
Build your own analytics power toolsBuild your own analytics power tools
Build your own analytics power tools
 
Offline of web applications
Offline of web applicationsOffline of web applications
Offline of web applications
 
6 reasons Jubilee could be a Rubyist's new best friend
6 reasons Jubilee could be a Rubyist's new best friend6 reasons Jubilee could be a Rubyist's new best friend
6 reasons Jubilee could be a Rubyist's new best friend
 
The Power of Open Data
The Power of Open DataThe Power of Open Data
The Power of Open Data
 
Yahoo Pipes Middleware In The Cloud
Yahoo Pipes Middleware In The CloudYahoo Pipes Middleware In The Cloud
Yahoo Pipes Middleware In The Cloud
 
Y Pipes Mashup Camp
Y Pipes Mashup CampY Pipes Mashup Camp
Y Pipes Mashup Camp
 
Open Data Semantic Web Community Barn Raising
Open Data Semantic Web Community Barn RaisingOpen Data Semantic Web Community Barn Raising
Open Data Semantic Web Community Barn Raising
 
Handling 10k requests per second with Symfony and Varnish - SymfonyCon Berlin...
Handling 10k requests per second with Symfony and Varnish - SymfonyCon Berlin...Handling 10k requests per second with Symfony and Varnish - SymfonyCon Berlin...
Handling 10k requests per second with Symfony and Varnish - SymfonyCon Berlin...
 
Os Bowkett
Os BowkettOs Bowkett
Os Bowkett
 
Creating And Consuming Web Services In Php 5
Creating And Consuming Web Services In Php 5Creating And Consuming Web Services In Php 5
Creating And Consuming Web Services In Php 5
 
Ruby - The Hard Bits
Ruby - The Hard BitsRuby - The Hard Bits
Ruby - The Hard Bits
 
Understanding APIs.pptx
Understanding APIs.pptxUnderstanding APIs.pptx
Understanding APIs.pptx
 
Understanding APIs.pptx introduction chk
Understanding APIs.pptx introduction chkUnderstanding APIs.pptx introduction chk
Understanding APIs.pptx introduction chk
 
Doodling for-great-success
Doodling for-great-successDoodling for-great-success
Doodling for-great-success
 
Concurrent Ruby Application Servers
Concurrent Ruby Application ServersConcurrent Ruby Application Servers
Concurrent Ruby Application Servers
 
REST API Pentester's perspective
REST API Pentester's perspectiveREST API Pentester's perspective
REST API Pentester's perspective
 
Mojolicious
MojoliciousMojolicious
Mojolicious
 
How we took our server side application to the cloud and liked what we got
How we took our server side application to the cloud and liked what we gotHow we took our server side application to the cloud and liked what we got
How we took our server side application to the cloud and liked what we got
 

More from Ruby Meditation

Is this Legacy or Revenant Code? - Sergey Sergyenko | Ruby Meditation 30
Is this Legacy or Revenant Code? - Sergey Sergyenko  | Ruby Meditation 30Is this Legacy or Revenant Code? - Sergey Sergyenko  | Ruby Meditation 30
Is this Legacy or Revenant Code? - Sergey Sergyenko | Ruby Meditation 30Ruby Meditation
 
Life with GraphQL API: good practices and unresolved issues - Roman Dubrovsky...
Life with GraphQL API: good practices and unresolved issues - Roman Dubrovsky...Life with GraphQL API: good practices and unresolved issues - Roman Dubrovsky...
Life with GraphQL API: good practices and unresolved issues - Roman Dubrovsky...Ruby Meditation
 
Where is your license, dude? - Viacheslav Miroshnychenko | Ruby Meditation 29
Where is your license, dude? - Viacheslav Miroshnychenko | Ruby Meditation 29Where is your license, dude? - Viacheslav Miroshnychenko | Ruby Meditation 29
Where is your license, dude? - Viacheslav Miroshnychenko | Ruby Meditation 29Ruby Meditation
 
Dry-validation update. Dry-validation vs Dry-schema 1.0 - Aleksandra Stolyar ...
Dry-validation update. Dry-validation vs Dry-schema 1.0 - Aleksandra Stolyar ...Dry-validation update. Dry-validation vs Dry-schema 1.0 - Aleksandra Stolyar ...
Dry-validation update. Dry-validation vs Dry-schema 1.0 - Aleksandra Stolyar ...Ruby Meditation
 
How to cook Rabbit on Production - Bohdan Parshentsev | Ruby Meditation 28
How to cook Rabbit on Production - Bohdan Parshentsev | Ruby Meditation 28 How to cook Rabbit on Production - Bohdan Parshentsev | Ruby Meditation 28
How to cook Rabbit on Production - Bohdan Parshentsev | Ruby Meditation 28 Ruby Meditation
 
How to cook Rabbit on Production - Serhiy Nazarov | Ruby Meditation 28
How to cook Rabbit on Production - Serhiy Nazarov | Ruby Meditation 28How to cook Rabbit on Production - Serhiy Nazarov | Ruby Meditation 28
How to cook Rabbit on Production - Serhiy Nazarov | Ruby Meditation 28Ruby Meditation
 
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...Ruby Meditation
 
Performance Optimization 101 for Ruby developers - Nihad Abbasov (ENG) | Ruby...
Performance Optimization 101 for Ruby developers - Nihad Abbasov (ENG) | Ruby...Performance Optimization 101 for Ruby developers - Nihad Abbasov (ENG) | Ruby...
Performance Optimization 101 for Ruby developers - Nihad Abbasov (ENG) | Ruby...Ruby Meditation
 
Use cases for Serverless Technologies - Ruslan Tolstov (RUS) | Ruby Meditatio...
Use cases for Serverless Technologies - Ruslan Tolstov (RUS) | Ruby Meditatio...Use cases for Serverless Technologies - Ruslan Tolstov (RUS) | Ruby Meditatio...
Use cases for Serverless Technologies - Ruslan Tolstov (RUS) | Ruby Meditatio...Ruby Meditation
 
The Trailblazer Ride from the If Jungle into a Civilised Railway Station - Or...
The Trailblazer Ride from the If Jungle into a Civilised Railway Station - Or...The Trailblazer Ride from the If Jungle into a Civilised Railway Station - Or...
The Trailblazer Ride from the If Jungle into a Civilised Railway Station - Or...Ruby Meditation
 
What/How to do with GraphQL? - Valentyn Ostakh (ENG) | Ruby Meditation 27
What/How to do with GraphQL? - Valentyn Ostakh (ENG) | Ruby Meditation 27What/How to do with GraphQL? - Valentyn Ostakh (ENG) | Ruby Meditation 27
What/How to do with GraphQL? - Valentyn Ostakh (ENG) | Ruby Meditation 27Ruby Meditation
 
New features in Rails 6 - Nihad Abbasov (RUS) | Ruby Meditation 26
New features in Rails 6 -  Nihad Abbasov (RUS) | Ruby Meditation 26New features in Rails 6 -  Nihad Abbasov (RUS) | Ruby Meditation 26
New features in Rails 6 - Nihad Abbasov (RUS) | Ruby Meditation 26Ruby Meditation
 
Security Scanning Overview - Tetiana Chupryna (RUS) | Ruby Meditation 26
Security Scanning Overview - Tetiana Chupryna (RUS) | Ruby Meditation 26Security Scanning Overview - Tetiana Chupryna (RUS) | Ruby Meditation 26
Security Scanning Overview - Tetiana Chupryna (RUS) | Ruby Meditation 26Ruby Meditation
 
Teach your application eloquence. Logs, metrics, traces - Dmytro Shapovalov (...
Teach your application eloquence. Logs, metrics, traces - Dmytro Shapovalov (...Teach your application eloquence. Logs, metrics, traces - Dmytro Shapovalov (...
Teach your application eloquence. Logs, metrics, traces - Dmytro Shapovalov (...Ruby Meditation
 
Best practices. Exploring - Ike Kurghinyan (RUS) | Ruby Meditation 26
Best practices. Exploring - Ike Kurghinyan (RUS) | Ruby Meditation 26Best practices. Exploring - Ike Kurghinyan (RUS) | Ruby Meditation 26
Best practices. Exploring - Ike Kurghinyan (RUS) | Ruby Meditation 26Ruby Meditation
 
Road to A/B testing - Alexey Vasiliev (ENG) | Ruby Meditation 25
Road to A/B testing - Alexey Vasiliev (ENG) | Ruby Meditation 25Road to A/B testing - Alexey Vasiliev (ENG) | Ruby Meditation 25
Road to A/B testing - Alexey Vasiliev (ENG) | Ruby Meditation 25Ruby Meditation
 
Concurrency in production. Real life example - Dmytro Herasymuk | Ruby Medita...
Concurrency in production. Real life example - Dmytro Herasymuk | Ruby Medita...Concurrency in production. Real life example - Dmytro Herasymuk | Ruby Medita...
Concurrency in production. Real life example - Dmytro Herasymuk | Ruby Medita...Ruby Meditation
 
Data encryption for Ruby web applications - Dmytro Shapovalov (RUS) | Ruby Me...
Data encryption for Ruby web applications - Dmytro Shapovalov (RUS) | Ruby Me...Data encryption for Ruby web applications - Dmytro Shapovalov (RUS) | Ruby Me...
Data encryption for Ruby web applications - Dmytro Shapovalov (RUS) | Ruby Me...Ruby Meditation
 
Rails App performance at the limit - Bogdan Gusiev
Rails App performance at the limit - Bogdan GusievRails App performance at the limit - Bogdan Gusiev
Rails App performance at the limit - Bogdan GusievRuby Meditation
 
GDPR. Next Y2K in 2018? - Anton Tkachov | Ruby Meditation #23
GDPR. Next Y2K in 2018? - Anton Tkachov | Ruby Meditation #23GDPR. Next Y2K in 2018? - Anton Tkachov | Ruby Meditation #23
GDPR. Next Y2K in 2018? - Anton Tkachov | Ruby Meditation #23Ruby Meditation
 

More from Ruby Meditation (20)

Is this Legacy or Revenant Code? - Sergey Sergyenko | Ruby Meditation 30
Is this Legacy or Revenant Code? - Sergey Sergyenko  | Ruby Meditation 30Is this Legacy or Revenant Code? - Sergey Sergyenko  | Ruby Meditation 30
Is this Legacy or Revenant Code? - Sergey Sergyenko | Ruby Meditation 30
 
Life with GraphQL API: good practices and unresolved issues - Roman Dubrovsky...
Life with GraphQL API: good practices and unresolved issues - Roman Dubrovsky...Life with GraphQL API: good practices and unresolved issues - Roman Dubrovsky...
Life with GraphQL API: good practices and unresolved issues - Roman Dubrovsky...
 
Where is your license, dude? - Viacheslav Miroshnychenko | Ruby Meditation 29
Where is your license, dude? - Viacheslav Miroshnychenko | Ruby Meditation 29Where is your license, dude? - Viacheslav Miroshnychenko | Ruby Meditation 29
Where is your license, dude? - Viacheslav Miroshnychenko | Ruby Meditation 29
 
Dry-validation update. Dry-validation vs Dry-schema 1.0 - Aleksandra Stolyar ...
Dry-validation update. Dry-validation vs Dry-schema 1.0 - Aleksandra Stolyar ...Dry-validation update. Dry-validation vs Dry-schema 1.0 - Aleksandra Stolyar ...
Dry-validation update. Dry-validation vs Dry-schema 1.0 - Aleksandra Stolyar ...
 
How to cook Rabbit on Production - Bohdan Parshentsev | Ruby Meditation 28
How to cook Rabbit on Production - Bohdan Parshentsev | Ruby Meditation 28 How to cook Rabbit on Production - Bohdan Parshentsev | Ruby Meditation 28
How to cook Rabbit on Production - Bohdan Parshentsev | Ruby Meditation 28
 
How to cook Rabbit on Production - Serhiy Nazarov | Ruby Meditation 28
How to cook Rabbit on Production - Serhiy Nazarov | Ruby Meditation 28How to cook Rabbit on Production - Serhiy Nazarov | Ruby Meditation 28
How to cook Rabbit on Production - Serhiy Nazarov | Ruby Meditation 28
 
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...
 
Performance Optimization 101 for Ruby developers - Nihad Abbasov (ENG) | Ruby...
Performance Optimization 101 for Ruby developers - Nihad Abbasov (ENG) | Ruby...Performance Optimization 101 for Ruby developers - Nihad Abbasov (ENG) | Ruby...
Performance Optimization 101 for Ruby developers - Nihad Abbasov (ENG) | Ruby...
 
Use cases for Serverless Technologies - Ruslan Tolstov (RUS) | Ruby Meditatio...
Use cases for Serverless Technologies - Ruslan Tolstov (RUS) | Ruby Meditatio...Use cases for Serverless Technologies - Ruslan Tolstov (RUS) | Ruby Meditatio...
Use cases for Serverless Technologies - Ruslan Tolstov (RUS) | Ruby Meditatio...
 
The Trailblazer Ride from the If Jungle into a Civilised Railway Station - Or...
The Trailblazer Ride from the If Jungle into a Civilised Railway Station - Or...The Trailblazer Ride from the If Jungle into a Civilised Railway Station - Or...
The Trailblazer Ride from the If Jungle into a Civilised Railway Station - Or...
 
What/How to do with GraphQL? - Valentyn Ostakh (ENG) | Ruby Meditation 27
What/How to do with GraphQL? - Valentyn Ostakh (ENG) | Ruby Meditation 27What/How to do with GraphQL? - Valentyn Ostakh (ENG) | Ruby Meditation 27
What/How to do with GraphQL? - Valentyn Ostakh (ENG) | Ruby Meditation 27
 
New features in Rails 6 - Nihad Abbasov (RUS) | Ruby Meditation 26
New features in Rails 6 -  Nihad Abbasov (RUS) | Ruby Meditation 26New features in Rails 6 -  Nihad Abbasov (RUS) | Ruby Meditation 26
New features in Rails 6 - Nihad Abbasov (RUS) | Ruby Meditation 26
 
Security Scanning Overview - Tetiana Chupryna (RUS) | Ruby Meditation 26
Security Scanning Overview - Tetiana Chupryna (RUS) | Ruby Meditation 26Security Scanning Overview - Tetiana Chupryna (RUS) | Ruby Meditation 26
Security Scanning Overview - Tetiana Chupryna (RUS) | Ruby Meditation 26
 
Teach your application eloquence. Logs, metrics, traces - Dmytro Shapovalov (...
Teach your application eloquence. Logs, metrics, traces - Dmytro Shapovalov (...Teach your application eloquence. Logs, metrics, traces - Dmytro Shapovalov (...
Teach your application eloquence. Logs, metrics, traces - Dmytro Shapovalov (...
 
Best practices. Exploring - Ike Kurghinyan (RUS) | Ruby Meditation 26
Best practices. Exploring - Ike Kurghinyan (RUS) | Ruby Meditation 26Best practices. Exploring - Ike Kurghinyan (RUS) | Ruby Meditation 26
Best practices. Exploring - Ike Kurghinyan (RUS) | Ruby Meditation 26
 
Road to A/B testing - Alexey Vasiliev (ENG) | Ruby Meditation 25
Road to A/B testing - Alexey Vasiliev (ENG) | Ruby Meditation 25Road to A/B testing - Alexey Vasiliev (ENG) | Ruby Meditation 25
Road to A/B testing - Alexey Vasiliev (ENG) | Ruby Meditation 25
 
Concurrency in production. Real life example - Dmytro Herasymuk | Ruby Medita...
Concurrency in production. Real life example - Dmytro Herasymuk | Ruby Medita...Concurrency in production. Real life example - Dmytro Herasymuk | Ruby Medita...
Concurrency in production. Real life example - Dmytro Herasymuk | Ruby Medita...
 
Data encryption for Ruby web applications - Dmytro Shapovalov (RUS) | Ruby Me...
Data encryption for Ruby web applications - Dmytro Shapovalov (RUS) | Ruby Me...Data encryption for Ruby web applications - Dmytro Shapovalov (RUS) | Ruby Me...
Data encryption for Ruby web applications - Dmytro Shapovalov (RUS) | Ruby Me...
 
Rails App performance at the limit - Bogdan Gusiev
Rails App performance at the limit - Bogdan GusievRails App performance at the limit - Bogdan Gusiev
Rails App performance at the limit - Bogdan Gusiev
 
GDPR. Next Y2K in 2018? - Anton Tkachov | Ruby Meditation #23
GDPR. Next Y2K in 2018? - Anton Tkachov | Ruby Meditation #23GDPR. Next Y2K in 2018? - Anton Tkachov | Ruby Meditation #23
GDPR. Next Y2K in 2018? - Anton Tkachov | Ruby Meditation #23
 

Recently uploaded

Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
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
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
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 MenDelhi Call girls
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
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
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
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
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?XfilesPro
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 

Recently uploaded (20)

Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
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
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
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
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
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
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
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
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food Manufacturing
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 

Build Functional Web APIs with the Webmachine Framework in Ruby

  • 1. Ruby Meditation #13 Functional web apps with Webmachine framework Mikhail Bortnyk, Amoniac OÜ
  • 2. Who am I ❖ Mikhail Bortnyk
  • 3. Who am I ❖ Mikhail Bortnyk ❖ github: @vessi
  • 4. Who am I ❖ Mikhail Bortnyk ❖ github: @vessi ❖ twitter: @mikhailbortnyk
  • 5. Who am I ❖ Mikhail Bortnyk ❖ github: @vessi ❖ twitter: @mikhailbortnyk ❖ language researcher
  • 6. Who am I ❖ Mikhail Bortnyk ❖ github: @vessi ❖ twitter: @mikhailbortnyk ❖ language researcher ❖ co-founder of Kottans community school
  • 7. Who am I ❖ Mikhail Bortnyk ❖ github: @vessi ❖ twitter: @mikhailbortnyk ❖ language researcher ❖ co-founder of Kottans community school ❖ 3rd contributor of mruby/c
  • 8. Who am I ❖ Mikhail Bortnyk ❖ github: @vessi ❖ twitter: @mikhailbortnyk ❖ language researcher ❖ co-founder of Kottans community school ❖ 3rd contributor of mruby/c ❖ Ruby developer (not Rails!)
  • 9. Source code ❖ [Link to presentation online]
  • 10. Source code ❖ [Link to presentation online] ❖ [Link to source code on GitHub]
  • 12. Typical experience of web developer CGI Old school is cool! (Bash, C, Perl, some scripting)
  • 13. Typical experience of web developer CGI Old school is cool! (Bash, C, Perl, some scripting) Servlets I know your pain, bro (PHP, Java)
  • 14. Typical experience of web developer CGI Old school is cool! (Bash, C, Perl, some scripting) Servlets I know your pain, bro (PHP, Java) MVC The thing we all know (Python/Django, Ruby/Rails etc)
  • 15.
  • 16. SPA is a new sexy ❖ No one uses ol’ goo’ ERB
  • 17. SPA is a new sexy ❖ No one uses ol’ goo’ ERB ❖ Javascript rules over the web
  • 18. SPA is a new sexy ❖ No one uses ol’ goo’ ERB ❖ Javascript rules over the web ❖ Web does not work without JS
  • 19. SPA is a new sexy ❖ No one uses ol’ goo’ ERB ❖ Javascript rules over the web ❖ Web does not work without JS ❖ http://tobyho.com/ 2010/03/11/how-much-of-the- web-actually/
  • 20. SPA is a new sexy ❖ No one uses ol’ goo’ ERB ❖ Javascript rules over the web ❖ Web does not work without JS ❖ http://tobyho.com/ 2010/03/11/how-much-of-the- web-actually/ ❖ In fact, you are limited to StackOverflow, Amazon and Google Search
  • 21. SPA is a new sexy ❖ No one uses ol’ goo’ ERB ❖ Javascript rules over the web ❖ Web does not work without JS ❖ http://tobyho.com/2010/03/11/ how-much-of-the-web-actually/ ❖ In fact, you are limited to StackOverflow, Amazon and Google Search ❖ Actually, only paranoids disable JS in 2017
  • 23. No more MPA applications
  • 24. Web developers are developing APIs
  • 25. APIs for SPAs, for mobile applications, for another APIs
  • 26. Solutions for APIs ❖ Still Rails. Now with API flavor (rails-api)
  • 27. Solutions for APIs ❖ Still Rails. Now with API flavor (rails-api). Still Rails. Still boring. Still overbloated.
  • 28. Solutions for APIs ❖ Still Rails. Now with API flavor (rails-api). Still Rails. Still boring. Still overbloated. ❖ Sinatra is a new shiny
  • 29. Solutions for APIs ❖ Still Rails. Now with API flavor (rails-api). Still Rails. Still boring. Still overbloated. ❖ Sinatra is a new shiny OH WAI~~. A little too big
  • 30. Solutions for APIs ❖ Still Rails. Now with API flavor (rails-api). Still Rails. Still boring. Still overbloated. ❖ Sinatra is a new shiny OH WAI~~. A little too big ❖ Microframeworks like Cuba, NYNY
  • 31. Solutions for APIs ❖ Still Rails. Now with API flavor (rails-api). Still Rails. Still boring. Still overbloated. ❖ Sinatra is a new shiny OH WAI~~. A little too big ❖ Microframeworks like Cuba, NYNY - too much to write
  • 32. Solutions for APIs ❖ Still Rails. Now with API flavor (rails-api). Still Rails. Still boring. Still overbloated. ❖ Sinatra is a new shiny OH WAI~~. A little too big ❖ Microframeworks like Cuba, NYNY - too much to write ❖ Roda
  • 33. Solutions for APIs ❖ Still Rails. Now with API flavor (rails-api). Still Rails. Still boring. Still overbloated. ❖ Sinatra is a new shiny OH WAI~~. A little too big ❖ Microframeworks like Cuba, NYNY - too much to write ❖ Roda - a challenger appears. No one noticed
  • 34. Solutions for APIs ❖ Still Rails. Now with API flavor (rails-api). Still Rails. Still boring. Still overbloated. ❖ Sinatra is a new shiny OH WAI~~. A little too big ❖ Microframeworks like Cuba, NYNY - too much to write ❖ Roda - a challenger appears. No one noticed ❖ Rack
  • 35. Solutions for APIs ❖ Still Rails. Now with API flavor (rails-api). Still Rails. Still boring. Still overbloated. ❖ Sinatra is a new shiny OH WAI~~. A little too big ❖ Microframeworks like Cuba, NYNY - too much to write ❖ Roda - a challenger appears. No one noticed ❖ Rack - maybe easier to rewrite the whole stack from scratch?
  • 36. Solutions for APIs ❖ Still Rails. Now with API flavor (rails-api). Still Rails. Still boring. Still overbloated. ❖ Sinatra is a new shiny OH WAI~~. A little too big ❖ Microframeworks like Cuba, NYNY - too much to write ❖ Roda - a challenger appears. No one noticed ❖ Rack - maybe easier to rewrite the whole stack from scratch? (And end up with buggy unfinished Rails)
  • 37. If you can’t create it, steal it
  • 38. WebMachine-ruby ❖ Based on Erlang’s web machine
  • 39. WebMachine-ruby ❖ Based on Erlang’s web machine ❖ Created by Sean Cribbs
  • 40. WebMachine-ruby ❖ Based on Erlang’s web machine ❖ Created by Sean Cribbs ❖ More than 5 years old
  • 41. WebMachine-ruby ❖ Based on Erlang’s web machine ❖ Created by Sean Cribbs ❖ More than 5 years old ❖ Still alive!
  • 42. WebMachine-ruby ❖ Based on Erlang’s web machine ❖ Created by Sean Cribbs ❖ More than 5 years old ❖ Still alive! Last commit - on 30 Jan 2017
  • 43. WebMachine-ruby ❖ Based on Erlang’s web machine ❖ Created by Sean Cribbs ❖ More than 5 years old ❖ Still alive! Last commit - on 30 Jan 2017 ❖ 13 issues opened and 80 closed
  • 44. WebMachine-ruby ❖ Based on Erlang’s web machine ❖ Created by Sean Cribbs ❖ More than 5 years old ❖ Still alive! Last commit - on 30 Jan 2017 ❖ 13 issues opened and 80 closed ❖ Author works with Erlang, Ruby and Elixir
  • 45. WebMachine-ruby ❖ Based on Erlang’s web machine ❖ Created by Sean Cribbs ❖ More than 5 years old ❖ Still alive! Last commit - on 30 Jan 2017 ❖ 13 issues opened and 80 closed ❖ Author works with Erlang, Ruby and Elixir ❖ github://webmachine/webmachine-ruby.git
  • 46. Fundamental idea ❖ Each API resource is a typical state machine
  • 47. Fundamental idea ❖ Each API resource is a typical state machine ❖ Each request is a flow through this state machine
  • 48. Fundamental idea ❖ Each API resource is a typical state machine ❖ Each request is a flow through this state machine ❖ Most requests are pretty standard
  • 49. Fundamental idea ❖ Each API resource is a typical state machine ❖ Each request is a flow through this state machine ❖ Most requests are pretty standard ❖ Functional behavior is more suiting case for this
  • 50. Fundamental idea ❖ Each API resource is a typical state machine ❖ Each request is a flow through this state machine ❖ Most requests are pretty standard ❖ Functional behavior is more suiting case for this ❖ Define standards and override only needed things
  • 51. Why state machine? ❖ Typical frameworks: request is running by predefined procedure.
  • 52. Why state machine? ❖ Typical frameworks: request is running by predefined procedure. They are not your bros
  • 53. Why state machine? ❖ Typical frameworks: request is running by predefined procedure. They are not your bros ❖ Webmachine determines facts about requests
  • 54. Why state machine? ❖ Typical frameworks: request is running by predefined procedure. They are not your bros ❖ Webmachine determines facts about requests ❖ Uses finite state machine to determine proper response
  • 55. Why state machine? ❖ Typical frameworks: request is running by predefined procedure. They are not your bros ❖ Webmachine determines facts about requests ❖ Uses finite state machine to determine proper response ❖ Each fact can easily be tested
  • 56. Why state machine? ❖ Typical frameworks: request is running by predefined procedure. They are not your bros ❖ Webmachine determines facts about requests ❖ Uses finite state machine to determine proper response ❖ Each fact can easily be tested ❖ Webmachine is your bro
  • 58.
  • 67. How it parses your request?
  • 68. Parsing request ❖ Initial request: 
 curl "http://localhost/kudos/1" -H "Accept: application/json" -u test -p test
  • 69. Parsing request ❖ Initial request: 
 curl "http://localhost/kudos/1" -H "Accept: application/json" -u test -p test ❖ Does route /kudos/:id exist?
  • 70. Parsing request ❖ Initial request: 
 curl "http://localhost/kudos/1" -H "Accept: application/json" -u test -p test ❖ Does route /kudos/:id exist? ❖ Does resource with ID 1 exist?
  • 71. Parsing request ❖ Initial request: 
 curl "http://localhost/kudos/1" -H "Accept: application/json" -u test -p test ❖ Does route /kudos/:id exist? ❖ Does resource with ID 1 exist? ❖ Is this user with this password allowed to execute this request on resource?
  • 72. Parsing request ❖ Initial request: 
 curl "http://localhost/kudos/1" -H "Accept: application/json" -u test -p test ❖ Does route /kudos/:id exist? ❖ Does resource with ID 1 exist? ❖ Is this user with this password allowed to execute this request on resource? ❖ Can this method be called for this resource?
  • 73. Parsing request ❖ Initial request: 
 curl "http://localhost/kudos/1" -H "Accept: application/json" -u test -p test ❖ Does route /kudos/:id exist? ❖ Does resource with ID 1 exist? ❖ Is this user with this password allowed to execute this request on resource? ❖ Can this method be called for this resource? ❖ Can this resource be rendered with this content type?
  • 74. Typical resource class KudoResource < Webmachine::Resource def allowed_methods ["GET"] end def content_types_provided [["application/json", :to_json]] end def resource_exists? kudo # Truthy or falsey end def to_json kudo.to_json end private def kudo @kudo ||= Kudo.find(id) end def id request.path_info[:id] end end