SlideShare a Scribd company logo
RUBY – The Hard Bits
or
How to Rock Hard, Ride Free
or
Will I still be a Rubyist in 5 years?
RedDotRubyConf 2013 – Singapore Jun-2013
I am a Rubyist ..
Paul Gallagher
paul@evendis.com
evendis.com
personal:
tardate.com
twitter.com/tardate
.. but that wasn’t always the case
Let it never be said, the romance
is dead
'Cos there’s so little else
occupying my head
Pascal
@uni
BASIC,
Assembler, C,
Fortran..
@uni
BASIC,
Assembler, C,
Fortran..
Build more
complex
things faster
Build more
complex
things faster
OO DesignOO Design
dbase,
Notes
PascalPascal
Build more
complex
things even
faster
Build more
complex
things even
faster
Client ServerClient Server
C++,
OS/2
Purely for
preservation of
self-esteem
Purely for
preservation of
self-esteem
MCSDVB, VC, ASP, COM,
.NET, C#
dbase,
Notes
dbase,
Notes
Building with
cross-
functional
teams
Building with
cross-
functional
teams
The Internet
happened
The Internet
happened
J2EE
MCSD
VB, VC, ASP, COM, .NET,
C#
MCSD
VB, VC, ASP, COM, .NET,
C#
Lingua francaLingua franca
Open
Platforms and
Standards
Open
Platforms and
Standards
Perl
Universal glueUniversal glue
Ruby
J2EEJ2EE
write less,
write clean
write less,
write clean
Agile Web
Development,
Open source
Agile Web
Development,
Open source
Javascript
Universal web
glue
Universal web
glue
A Very Comfortable Place
Lazy Dog Inn, Huarez Peru http://goo.gl/zvkTI
A Very Comfortable Place
Lazy Dog Inn, Huarez Peru http://goo.gl/zvkTI
a test-infected community
vibrant open source
great packaging (gems)
unrivaled reuse (git/hub)
Oh, and the language is pretty nice too
Due to lack of interest tomorrow
is canceled
Let the clocks be reset and the
pendulums held
Will I still be a Rubyist
in 5 years?
Intrinsic
drivers
Intrinsic
drivers
Extrinsic
drivers
Extrinsic
drivers
All about
productivity
All about
productivity
Technology
mega trends
Technology
mega trends
Hit the road, Jack
programming problems
I can solve with Ruby
time
?
2013
Fear of the Dark
Frontier lands
Edge of common practice
Borders
No man’s land
What Technologists Think
http://www.infoq.com/research/software-trends-2013
1. HTML5 and
JavaScript as a
Platform
2. Mobile Applications
and Mobile-first UIs
3. Cloud Computing
4. NoSQL displacing
RDBs
5. Big Data and
Analytics
What CIOs Think
Gartner Top 10 CIO Business and Technology Priorities in 2013 http://goo.gl/Bca4T
Four Trends
Four Trends
Rich Interaction – Diverse Devices
Classic
web app
Classic
web app
APIAPI
NativeNative
Rich clientRich client
API,
partials,
logic
API,
partials,
logic
server
device
Java
Android
Objective C
iOS
JS Frameworks
Ember, Angular,
Backbone etc
JS Frameworks
Ember, Angular,
Backbone etc
http://todomvc.com/
Light dusting
PJAX, Turbolinks,
Backbone lite,
jQuery
Light dusting
PJAX, Turbolinks,
Backbone lite,
jQuery
Undisclosed desires..
Classic
web app
Classic
web app
APIAPI
NativeNative
Rich clientRich client
API,
partials,
logic
API,
partials,
logic
server
device
Java
Android
Objective C
iOS
JS Frameworks
Ember, Angular,
Backbone etc
JS Frameworks
Ember, Angular,
Backbone etc
Light dusting
PJAX, Turbolinks,
Backbone lite,
jQuery
Light dusting
PJAX, Turbolinks,
Backbone lite,
jQuery
We want to be DRY?We want to be DRY?
Undisclosed desires..
Classic
web app
Classic
web app
APIAPI
NativeNative
Rich clientRich client
API,
partials,
logic
API,
partials,
logic
server
device
Java
Android
Objective C
iOS
JS Frameworks
Ember, Angular,
Backbone etc
JS Frameworks
Ember, Angular,
Backbone etc
Light dusting
PJAX, Turbolinks,
Backbone lite,
jQuery
Light dusting
PJAX, Turbolinks,
Backbone lite,
jQuery
Exploit device capabilities?Exploit device capabilities?
Undisclosed desires..
Classic
web app
Classic
web app
APIAPI
NativeNative
Rich clientRich client
API,
partials,
logic
API,
partials,
logic
server
device
Java
Android
Objective C
iOS
JS Frameworks
Ember, Angular,
Backbone etc
JS Frameworks
Ember, Angular,
Backbone etc
Light dusting
PJAX, Turbolinks,
Backbone lite,
jQuery
Light dusting
PJAX, Turbolinks,
Backbone lite,
jQuery
Server-push and distributed event propagation?Server-push and distributed event propagation?
Undisclosed desires..
Classic
web app
Classic
web app
APIAPI
NativeNative
Rich clientRich client
API,
partials,
logic
API,
partials,
logic
server
device
Java
Android
Objective C
iOS
JS Frameworks
Ember, Angular,
Backbone etc
JS Frameworks
Ember, Angular,
Backbone etc
Light dusting
PJAX, Turbolinks,
Backbone lite,
jQuery
Light dusting
PJAX, Turbolinks,
Backbone lite,
jQuery
A cohesive full stack programming model?A cohesive full stack programming model?
Undisclosed desires..
Classic
web app
Classic
web app
APIAPI
NativeNative
Rich clientRich client
API,
partials,
logic
API,
partials,
logic
server
device
Java
Android
Objective C
iOS
JS Frameworks
Ember, Angular,
Backbone etc
JS Frameworks
Ember, Angular,
Backbone etc
Light dusting
PJAX, Turbolinks,
Backbone lite,
jQuery
Light dusting
PJAX, Turbolinks,
Backbone lite,
jQuery
Changing my mind should be this painful?Changing my mind should be this painful?
Innovators’ Dilemma: What are the
chances?
The New™
Framework
The New™
Framework
server
device
Java
Android
Objective C
iOS
Getting closer?
Meteor / Derby +
node.js
Getting closer?
Meteor / Derby +
node.js
Conclusions?
Four Trends
We do extreme App-ification
SaaSSaaS
PaaSPaaS
IaaSIaaS
We do extreme App-ification
SaaSSaaS
PaaSPaaS
IaaSIaaS
MaaSMaaS
API-ification
APIs Everywhere!
Favorite and time-tested strategy:
– Wait for the REST of the world to catch up
– Exceptions BTO
But as technology matures:
– More complex integration scenarios
– Security and data semantics
– Could we see a swing back to SOAP and WS-*
style integration?
Conclusions?
Four Trends
Big Data Diversification
Data AccessData Access
ORMORM
Server proc
and map-reduce
Server proc
and map-reduce
Key-valueKey-valueDocumentDocument
MongoDBMongoDB
GraphGraph
Neo4JNeo4J CassandraCassandra
Hadoop
(family)
Hadoop
(family)RedisRedis
RIAKRIAK
CouchDBCouchDB
ColumnColumn
✔✔
✔✔
JSJS
taxonomytaxonomy
examplesexamples
✔✔ ✔✔ ✔✔ ✔✔ ✔✔ ✔✔
½½
JSJS
✔✔
JS
erlang
JS
erlang CipherCipher
✔✔
CQLCQL
½½
Java, Pig
Hive
Java, Pig
Hive
½½
Aside: Need Government Data?
http://rgovdata.com
Analytics
– Can go quite a way with pure Ruby
– Use other tools like R (direct or via
RinRuby/RSRuby/Rserve)
– E.g. scanning utility bills with Ruby and R:
https://github.com/tardate/sps_bill_scanner
Python Envy?Python Envy?
IPython – interactive
notebooks and
visualisation
IPython – interactive
notebooks and
visualisation
Pandas, Statsmodels,
Numpy, SciPy – data
analysis comparable to R
Pandas, Statsmodels,
Numpy, SciPy – data
analysis comparable to R
SciRuby and NMatrix!
SciRuby: Tools for Scientific Computing in Ruby
Nmatrix: fast numerical linear algebra library for Ruby
“We believe that the time for a Ruby science
and visualization package has come”
Conclusions?
Four Trends
Case Study – Making Megar
a Ruby wrapper and CLI for the Mega API
https://github.com/tardate/megar
– mega.co.nz: DropBox on crypto steroids
– Browser RIA: cryptography in javascript
– API not yet formally/fully documented
Mega Crypto in a Nutshell
usernameusername passwordpassword
keygen
A32 > AES-CBC > Base64
keygen
A32 > AES-CBC > Base64
Login session challenge/responseLogin session challenge/response
Encrypted
Session ID
Encrypted
Session ID
Encrypted
RSA key
Encrypted
RSA key
Encrypted
master key
Encrypted
master key
RSA private
key parts
RSA private
key parts
Decrypt and decompose
Base64 > AES-CBC > A32
Decrypt and decompose
Base64 > AES-CBC > A32
Decrypt session_id
B64 > MPI > RSA Decrypt > B64
Decrypt session_id
B64 > MPI > RSA Decrypt > B64
Session IDSession ID
NB: this is simplified ;-)
Decrypt key
Base64 > AES-CBC > A32
Decrypt key
Base64 > AES-CBC > A32
master keymaster key
filefile
Request download
url
Request download
url
DownloadDownload
Encrypted fileEncrypted file
Decrypt file
AES-CTR + MAC verify
Decrypt file
AES-CTR + MAC verify
Decrypt file key
Base64 > > AES-CBC > A32
Decrypt file key
Base64 > > AES-CBC > A32
Request FilesRequest Files
Encrypted file
attributes
Encrypted file
attributes
File keyFile key
Mega Crypto Challenges
Funky Base64
– url-safe and no delimiters; JFDI
MPI and integer arrays
– lack of primitives; JFDI
RSA with key components
– incompatible OpenSSL
– DIY RSA private key decrypt
AES CTR mode
– Requires OpenSSL 1.0.1+
– DIY CTR mode on AES-CBC OpenSSL
0.9.8+
Mega Crypto Challenges
Funky Base64
– url-safe and no delimiters; JFDI
MPI and integer arrays
– lack of primitives; JFDI
RSA with key components
– incompatible OpenSSL
– DIY RSA private key decrypt
AES CTR mode
– Requires OpenSSL 1.0.1+
– DIY CTR mode on AES-CBC OpenSSL
0.9.8+
The Python
Experience?
The Python
Experience?
PyCrypto – native AES-CTR
implementation
PyCrypto – native AES-CTR
implementation
PyCrypto – able to drive RSA
with key components (bit of
a hack though)
PyCrypto – able to drive RSA
with key components (bit of
a hack though)
Base64, MPI and integer
array handling – same, same
Base64, MPI and integer
array handling – same, same
The Resistance
Ruby core and stdlib
– FBOW thin wrappers on
external libraries
Surely there’s a gem for
that?
– Yes, many, but..
– fast-aes, gibberish, rbncl,
crypto, ruby-aes etc..
Hate This & I’ll Love
You
Hate This & I’ll Love
You
Too much convention
*without* configuration
Too much convention
*without* configuration
Poor composabilityPoor composability
Distinctly C-dy OpenSSL
wrappers
Distinctly C-dy OpenSSL
wrappers
Maintained?Maintained?
Uprising – Krypt
https://github.com/krypt/krypt
Lead by Martin Boßlet OpenSSL maintainer
See confreaks e.g. http://goo.gl/V4wKW and
update at GORUCO 8th
June
Krypt aims:
– OpenSSL replacement
– External dependencies are optional
– Composability
– Convention *with* configuration
Still early days..
Conclusions?
TAKEAWAYS
Keep your eyes on the road,
and your hands upon the wheel
Four Trends – Liquid State
B-B-
A-A-
A+A+
C+C+
So! Will I still be a Rubyist
in 5 years?
YES! But..
– Most unpredictable arena is the future of web
development
– The future is polyglot, but once you start thinking
like a Rubyist it is hard to stop – even if we’re not
always typing it
– The irresistible urge to inject Ruby goodness
where-ever we tread
Thanks!
Paul Gallagher
paul@evendis.com
evendis.com
personal:
tardate.com
twitter.com/tardate
Ruby, Ruby, Ruby, Ruby
And do ya, do ya, do ya, do ya
Know what ya doing, doing to me?

More Related Content

What's hot

Metasepi team meeting #20: Start! ATS programming on MCU
Metasepi team meeting #20: Start! ATS programming on MCUMetasepi team meeting #20: Start! ATS programming on MCU
Metasepi team meeting #20: Start! ATS programming on MCU
Kiwamu Okabe
 
ATS2 updates 2017
ATS2 updates 2017ATS2 updates 2017
ATS2 updates 2017
Kiwamu Okabe
 
ATS programming on ESP8266
ATS programming on ESP8266ATS programming on ESP8266
ATS programming on ESP8266
Kiwamu Okabe
 
Advanced Django Forms Usage
Advanced Django Forms UsageAdvanced Django Forms Usage
Advanced Django Forms Usage
Daniel Greenfeld
 
Embedded application designed by ATS language
Embedded application designed by ATS languageEmbedded application designed by ATS language
Embedded application designed by ATS language
Kiwamu Okabe
 
Sharing (or stealing) the jewels of python with big data & the jvm (1)
Sharing (or stealing) the jewels of python with big data & the jvm (1)Sharing (or stealing) the jewels of python with big data & the jvm (1)
Sharing (or stealing) the jewels of python with big data & the jvm (1)
Holden Karau
 
Learn python
Learn pythonLearn python
Learn python
Kracekumar Ramaraju
 
File Polyglottery; or This Proof of Concept is Also a Picture of Cats
File Polyglottery; or This Proof of Concept is Also a Picture of CatsFile Polyglottery; or This Proof of Concept is Also a Picture of Cats
File Polyglottery; or This Proof of Concept is Also a Picture of Cats
Evan Sultanik
 
Clojure at ardoq
Clojure at ardoqClojure at ardoq
Clojure at ardoq
Erik Bakstad
 
Go for Rubyists. August 2018. RUG-B Meetup
Go for Rubyists. August 2018. RUG-B MeetupGo for Rubyists. August 2018. RUG-B Meetup
Go for Rubyists. August 2018. RUG-B Meetup
Kirill Zonov
 
Metasepi team meeting #19: ATS application on Arduino
Metasepi team meeting #19: ATS application on ArduinoMetasepi team meeting #19: ATS application on Arduino
Metasepi team meeting #19: ATS application on Arduino
Kiwamu Okabe
 
Odyssey to async ruby
Odyssey to async rubyOdyssey to async ruby
Odyssey to async ruby
Delton Ding
 
High Concurrent Ruby Web Development Without Fear
High Concurrent Ruby Web Development Without FearHigh Concurrent Ruby Web Development Without Fear
High Concurrent Ruby Web Development Without Fear
Delton Ding
 
A rough guide to JavaScript Performance
A rough guide to JavaScript PerformanceA rough guide to JavaScript Performance
A rough guide to JavaScript Performance
allmarkedup
 
JPA Week4. VALUE TYPES / CQRS
JPA Week4. VALUE TYPES / CQRSJPA Week4. VALUE TYPES / CQRS
JPA Week4. VALUE TYPES / CQRS
Covenant Ko
 
Soft Dive Into GrimoireLab. Twitter OSS workshop
Soft Dive Into GrimoireLab. Twitter OSS workshopSoft Dive Into GrimoireLab. Twitter OSS workshop
Soft Dive Into GrimoireLab. Twitter OSS workshop
Manrique Lopez
 

What's hot (16)

Metasepi team meeting #20: Start! ATS programming on MCU
Metasepi team meeting #20: Start! ATS programming on MCUMetasepi team meeting #20: Start! ATS programming on MCU
Metasepi team meeting #20: Start! ATS programming on MCU
 
ATS2 updates 2017
ATS2 updates 2017ATS2 updates 2017
ATS2 updates 2017
 
ATS programming on ESP8266
ATS programming on ESP8266ATS programming on ESP8266
ATS programming on ESP8266
 
Advanced Django Forms Usage
Advanced Django Forms UsageAdvanced Django Forms Usage
Advanced Django Forms Usage
 
Embedded application designed by ATS language
Embedded application designed by ATS languageEmbedded application designed by ATS language
Embedded application designed by ATS language
 
Sharing (or stealing) the jewels of python with big data & the jvm (1)
Sharing (or stealing) the jewels of python with big data & the jvm (1)Sharing (or stealing) the jewels of python with big data & the jvm (1)
Sharing (or stealing) the jewels of python with big data & the jvm (1)
 
Learn python
Learn pythonLearn python
Learn python
 
File Polyglottery; or This Proof of Concept is Also a Picture of Cats
File Polyglottery; or This Proof of Concept is Also a Picture of CatsFile Polyglottery; or This Proof of Concept is Also a Picture of Cats
File Polyglottery; or This Proof of Concept is Also a Picture of Cats
 
Clojure at ardoq
Clojure at ardoqClojure at ardoq
Clojure at ardoq
 
Go for Rubyists. August 2018. RUG-B Meetup
Go for Rubyists. August 2018. RUG-B MeetupGo for Rubyists. August 2018. RUG-B Meetup
Go for Rubyists. August 2018. RUG-B Meetup
 
Metasepi team meeting #19: ATS application on Arduino
Metasepi team meeting #19: ATS application on ArduinoMetasepi team meeting #19: ATS application on Arduino
Metasepi team meeting #19: ATS application on Arduino
 
Odyssey to async ruby
Odyssey to async rubyOdyssey to async ruby
Odyssey to async ruby
 
High Concurrent Ruby Web Development Without Fear
High Concurrent Ruby Web Development Without FearHigh Concurrent Ruby Web Development Without Fear
High Concurrent Ruby Web Development Without Fear
 
A rough guide to JavaScript Performance
A rough guide to JavaScript PerformanceA rough guide to JavaScript Performance
A rough guide to JavaScript Performance
 
JPA Week4. VALUE TYPES / CQRS
JPA Week4. VALUE TYPES / CQRSJPA Week4. VALUE TYPES / CQRS
JPA Week4. VALUE TYPES / CQRS
 
Soft Dive Into GrimoireLab. Twitter OSS workshop
Soft Dive Into GrimoireLab. Twitter OSS workshopSoft Dive Into GrimoireLab. Twitter OSS workshop
Soft Dive Into GrimoireLab. Twitter OSS workshop
 

Similar to Ruby - The Hard Bits

Web development with Lua: Introducing Sailor an MVC web framework @ CodingSer...
Web development with Lua: Introducing Sailor an MVC web framework @ CodingSer...Web development with Lua: Introducing Sailor an MVC web framework @ CodingSer...
Web development with Lua: Introducing Sailor an MVC web framework @ CodingSer...
Etiene Dalcol
 
PyData Frankfurt - (Efficient) Data Exchange with "Foreign" Ecosystems
PyData Frankfurt - (Efficient) Data Exchange with "Foreign" EcosystemsPyData Frankfurt - (Efficient) Data Exchange with "Foreign" Ecosystems
PyData Frankfurt - (Efficient) Data Exchange with "Foreign" Ecosystems
Uwe Korn
 
ING - Mind the Gap
ING - Mind the GapING - Mind the Gap
ING - Mind the Gap
Richard Abbuhl
 
DiUS Computing Lca Rails Final
DiUS  Computing Lca Rails FinalDiUS  Computing Lca Rails Final
DiUS Computing Lca Rails Final
Robert Postill
 
Java With The Best Online Conference - Mind the gap: Java, Machine Learning, ...
Java With The Best Online Conference - Mind the gap: Java, Machine Learning, ...Java With The Best Online Conference - Mind the gap: Java, Machine Learning, ...
Java With The Best Online Conference - Mind the gap: Java, Machine Learning, ...
Richard Abbuhl
 
Dmitry Lebedev: Agile Testing Using Agile Tools
Dmitry Lebedev: Agile Testing Using Agile ToolsDmitry Lebedev: Agile Testing Using Agile Tools
Dmitry Lebedev: Agile Testing Using Agile Tools
Agile Lietuva
 
Code Europe Spring 2018 - Mind the Gap
Code Europe Spring 2018 -  Mind the GapCode Europe Spring 2018 -  Mind the Gap
Code Europe Spring 2018 - Mind the Gap
Richard Abbuhl
 
Exploring Ruby on Rails and PostgreSQL
Exploring Ruby on Rails and PostgreSQLExploring Ruby on Rails and PostgreSQL
Exploring Ruby on Rails and PostgreSQL
Barry Jones
 
Mongodb and Totsy - E-commerce Case Study
Mongodb and Totsy - E-commerce Case StudyMongodb and Totsy - E-commerce Case Study
Mongodb and Totsy - E-commerce Case Study
Mitch Pirtle
 
Javascript on Arduino
Javascript on ArduinoJavascript on Arduino
Javascript on Arduino
Keith Bloomfield
 
Functional Scala 2022 - scalajs Alexis.pdf
Functional Scala 2022 - scalajs Alexis.pdfFunctional Scala 2022 - scalajs Alexis.pdf
Functional Scala 2022 - scalajs Alexis.pdf
ssusercd195b
 
Rails Vs CakePHP
Rails Vs CakePHPRails Vs CakePHP
Rails Vs CakePHP
Gautam Rege
 
Free The Enterprise With Ruby & Master Your Own Domain
Free The Enterprise With Ruby & Master Your Own DomainFree The Enterprise With Ruby & Master Your Own Domain
Free The Enterprise With Ruby & Master Your Own Domain
Ken Collins
 
Ruby on Google App Engine: Upgrade to Google App "Turbo" Engine
Ruby on Google App Engine: Upgrade to Google App "Turbo" EngineRuby on Google App Engine: Upgrade to Google App "Turbo" Engine
Ruby on Google App Engine: Upgrade to Google App "Turbo" Engine
Joseph Ku
 
Puppet Camp Dallas 2014: How Puppet Ops Rolls
Puppet Camp Dallas 2014: How Puppet Ops RollsPuppet Camp Dallas 2014: How Puppet Ops Rolls
Puppet Camp Dallas 2014: How Puppet Ops Rolls
Puppet
 
Backend as a Service
Backend as a ServiceBackend as a Service
Backend as a Service
apiomat
 
Using software modules welcome to hell!
Using software modules   welcome to hell!Using software modules   welcome to hell!
Using software modules welcome to hell!
Baruch Sadogursky
 
Webdevcon Keynote hh-2012-09-18
Webdevcon Keynote hh-2012-09-18Webdevcon Keynote hh-2012-09-18
Webdevcon Keynote hh-2012-09-18
Pierre Joye
 
Developing Brilliant and Powerful APIs in Ruby & Python
Developing Brilliant and Powerful APIs in Ruby & PythonDeveloping Brilliant and Powerful APIs in Ruby & Python
Developing Brilliant and Powerful APIs in Ruby & Python
SmartBear
 
Ruby On Rails
Ruby On RailsRuby On Rails
Ruby On Rails
Gautam Rege
 

Similar to Ruby - The Hard Bits (20)

Web development with Lua: Introducing Sailor an MVC web framework @ CodingSer...
Web development with Lua: Introducing Sailor an MVC web framework @ CodingSer...Web development with Lua: Introducing Sailor an MVC web framework @ CodingSer...
Web development with Lua: Introducing Sailor an MVC web framework @ CodingSer...
 
PyData Frankfurt - (Efficient) Data Exchange with "Foreign" Ecosystems
PyData Frankfurt - (Efficient) Data Exchange with "Foreign" EcosystemsPyData Frankfurt - (Efficient) Data Exchange with "Foreign" Ecosystems
PyData Frankfurt - (Efficient) Data Exchange with "Foreign" Ecosystems
 
ING - Mind the Gap
ING - Mind the GapING - Mind the Gap
ING - Mind the Gap
 
DiUS Computing Lca Rails Final
DiUS  Computing Lca Rails FinalDiUS  Computing Lca Rails Final
DiUS Computing Lca Rails Final
 
Java With The Best Online Conference - Mind the gap: Java, Machine Learning, ...
Java With The Best Online Conference - Mind the gap: Java, Machine Learning, ...Java With The Best Online Conference - Mind the gap: Java, Machine Learning, ...
Java With The Best Online Conference - Mind the gap: Java, Machine Learning, ...
 
Dmitry Lebedev: Agile Testing Using Agile Tools
Dmitry Lebedev: Agile Testing Using Agile ToolsDmitry Lebedev: Agile Testing Using Agile Tools
Dmitry Lebedev: Agile Testing Using Agile Tools
 
Code Europe Spring 2018 - Mind the Gap
Code Europe Spring 2018 -  Mind the GapCode Europe Spring 2018 -  Mind the Gap
Code Europe Spring 2018 - Mind the Gap
 
Exploring Ruby on Rails and PostgreSQL
Exploring Ruby on Rails and PostgreSQLExploring Ruby on Rails and PostgreSQL
Exploring Ruby on Rails and PostgreSQL
 
Mongodb and Totsy - E-commerce Case Study
Mongodb and Totsy - E-commerce Case StudyMongodb and Totsy - E-commerce Case Study
Mongodb and Totsy - E-commerce Case Study
 
Javascript on Arduino
Javascript on ArduinoJavascript on Arduino
Javascript on Arduino
 
Functional Scala 2022 - scalajs Alexis.pdf
Functional Scala 2022 - scalajs Alexis.pdfFunctional Scala 2022 - scalajs Alexis.pdf
Functional Scala 2022 - scalajs Alexis.pdf
 
Rails Vs CakePHP
Rails Vs CakePHPRails Vs CakePHP
Rails Vs CakePHP
 
Free The Enterprise With Ruby & Master Your Own Domain
Free The Enterprise With Ruby & Master Your Own DomainFree The Enterprise With Ruby & Master Your Own Domain
Free The Enterprise With Ruby & Master Your Own Domain
 
Ruby on Google App Engine: Upgrade to Google App "Turbo" Engine
Ruby on Google App Engine: Upgrade to Google App "Turbo" EngineRuby on Google App Engine: Upgrade to Google App "Turbo" Engine
Ruby on Google App Engine: Upgrade to Google App "Turbo" Engine
 
Puppet Camp Dallas 2014: How Puppet Ops Rolls
Puppet Camp Dallas 2014: How Puppet Ops RollsPuppet Camp Dallas 2014: How Puppet Ops Rolls
Puppet Camp Dallas 2014: How Puppet Ops Rolls
 
Backend as a Service
Backend as a ServiceBackend as a Service
Backend as a Service
 
Using software modules welcome to hell!
Using software modules   welcome to hell!Using software modules   welcome to hell!
Using software modules welcome to hell!
 
Webdevcon Keynote hh-2012-09-18
Webdevcon Keynote hh-2012-09-18Webdevcon Keynote hh-2012-09-18
Webdevcon Keynote hh-2012-09-18
 
Developing Brilliant and Powerful APIs in Ruby & Python
Developing Brilliant and Powerful APIs in Ruby & PythonDeveloping Brilliant and Powerful APIs in Ruby & Python
Developing Brilliant and Powerful APIs in Ruby & Python
 
Ruby On Rails
Ruby On RailsRuby On Rails
Ruby On Rails
 

Recently uploaded

JavaLand 2024: Application Development Green Masterplan
JavaLand 2024: Application Development Green MasterplanJavaLand 2024: Application Development Green Masterplan
JavaLand 2024: Application Development Green Masterplan
Miro Wengner
 
HCL Notes und Domino Lizenzkostenreduzierung in der Welt von DLAU
HCL Notes und Domino Lizenzkostenreduzierung in der Welt von DLAUHCL Notes und Domino Lizenzkostenreduzierung in der Welt von DLAU
HCL Notes und Domino Lizenzkostenreduzierung in der Welt von DLAU
panagenda
 
Your One-Stop Shop for Python Success: Top 10 US Python Development Providers
Your One-Stop Shop for Python Success: Top 10 US Python Development ProvidersYour One-Stop Shop for Python Success: Top 10 US Python Development Providers
Your One-Stop Shop for Python Success: Top 10 US Python Development Providers
akankshawande
 
Let's Integrate MuleSoft RPA, COMPOSER, APM with AWS IDP along with Slack
Let's Integrate MuleSoft RPA, COMPOSER, APM with AWS IDP along with SlackLet's Integrate MuleSoft RPA, COMPOSER, APM with AWS IDP along with Slack
Let's Integrate MuleSoft RPA, COMPOSER, APM with AWS IDP along with Slack
shyamraj55
 
Digital Banking in the Cloud: How Citizens Bank Unlocked Their Mainframe
Digital Banking in the Cloud: How Citizens Bank Unlocked Their MainframeDigital Banking in the Cloud: How Citizens Bank Unlocked Their Mainframe
Digital Banking in the Cloud: How Citizens Bank Unlocked Their Mainframe
Precisely
 
Building Production Ready Search Pipelines with Spark and Milvus
Building Production Ready Search Pipelines with Spark and MilvusBuilding Production Ready Search Pipelines with Spark and Milvus
Building Production Ready Search Pipelines with Spark and Milvus
Zilliz
 
WeTestAthens: Postman's AI & Automation Techniques
WeTestAthens: Postman's AI & Automation TechniquesWeTestAthens: Postman's AI & Automation Techniques
WeTestAthens: Postman's AI & Automation Techniques
Postman
 
“Temporal Event Neural Networks: A More Efficient Alternative to the Transfor...
“Temporal Event Neural Networks: A More Efficient Alternative to the Transfor...“Temporal Event Neural Networks: A More Efficient Alternative to the Transfor...
“Temporal Event Neural Networks: A More Efficient Alternative to the Transfor...
Edge AI and Vision Alliance
 
Taking AI to the Next Level in Manufacturing.pdf
Taking AI to the Next Level in Manufacturing.pdfTaking AI to the Next Level in Manufacturing.pdf
Taking AI to the Next Level in Manufacturing.pdf
ssuserfac0301
 
Nordic Marketo Engage User Group_June 13_ 2024.pptx
Nordic Marketo Engage User Group_June 13_ 2024.pptxNordic Marketo Engage User Group_June 13_ 2024.pptx
Nordic Marketo Engage User Group_June 13_ 2024.pptx
MichaelKnudsen27
 
Fueling AI with Great Data with Airbyte Webinar
Fueling AI with Great Data with Airbyte WebinarFueling AI with Great Data with Airbyte Webinar
Fueling AI with Great Data with Airbyte Webinar
Zilliz
 
Main news related to the CCS TSI 2023 (2023/1695)
Main news related to the CCS TSI 2023 (2023/1695)Main news related to the CCS TSI 2023 (2023/1695)
Main news related to the CCS TSI 2023 (2023/1695)
Jakub Marek
 
GNSS spoofing via SDR (Criptored Talks 2024)
GNSS spoofing via SDR (Criptored Talks 2024)GNSS spoofing via SDR (Criptored Talks 2024)
GNSS spoofing via SDR (Criptored Talks 2024)
Javier Junquera
 
Dandelion Hashtable: beyond billion requests per second on a commodity server
Dandelion Hashtable: beyond billion requests per second on a commodity serverDandelion Hashtable: beyond billion requests per second on a commodity server
Dandelion Hashtable: beyond billion requests per second on a commodity server
Antonios Katsarakis
 
Digital Marketing Trends in 2024 | Guide for Staying Ahead
Digital Marketing Trends in 2024 | Guide for Staying AheadDigital Marketing Trends in 2024 | Guide for Staying Ahead
Digital Marketing Trends in 2024 | Guide for Staying Ahead
Wask
 
Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024
Jason Packer
 
Overcoming the PLG Trap: Lessons from Canva's Head of Sales & Head of EMEA Da...
Overcoming the PLG Trap: Lessons from Canva's Head of Sales & Head of EMEA Da...Overcoming the PLG Trap: Lessons from Canva's Head of Sales & Head of EMEA Da...
Overcoming the PLG Trap: Lessons from Canva's Head of Sales & Head of EMEA Da...
saastr
 
SAP S/4 HANA sourcing and procurement to Public cloud
SAP S/4 HANA sourcing and procurement to Public cloudSAP S/4 HANA sourcing and procurement to Public cloud
SAP S/4 HANA sourcing and procurement to Public cloud
maazsz111
 
dbms calicut university B. sc Cs 4th sem.pdf
dbms  calicut university B. sc Cs 4th sem.pdfdbms  calicut university B. sc Cs 4th sem.pdf
dbms calicut university B. sc Cs 4th sem.pdf
Shinana2
 
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdf
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdfHow to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdf
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdf
Chart Kalyan
 

Recently uploaded (20)

JavaLand 2024: Application Development Green Masterplan
JavaLand 2024: Application Development Green MasterplanJavaLand 2024: Application Development Green Masterplan
JavaLand 2024: Application Development Green Masterplan
 
HCL Notes und Domino Lizenzkostenreduzierung in der Welt von DLAU
HCL Notes und Domino Lizenzkostenreduzierung in der Welt von DLAUHCL Notes und Domino Lizenzkostenreduzierung in der Welt von DLAU
HCL Notes und Domino Lizenzkostenreduzierung in der Welt von DLAU
 
Your One-Stop Shop for Python Success: Top 10 US Python Development Providers
Your One-Stop Shop for Python Success: Top 10 US Python Development ProvidersYour One-Stop Shop for Python Success: Top 10 US Python Development Providers
Your One-Stop Shop for Python Success: Top 10 US Python Development Providers
 
Let's Integrate MuleSoft RPA, COMPOSER, APM with AWS IDP along with Slack
Let's Integrate MuleSoft RPA, COMPOSER, APM with AWS IDP along with SlackLet's Integrate MuleSoft RPA, COMPOSER, APM with AWS IDP along with Slack
Let's Integrate MuleSoft RPA, COMPOSER, APM with AWS IDP along with Slack
 
Digital Banking in the Cloud: How Citizens Bank Unlocked Their Mainframe
Digital Banking in the Cloud: How Citizens Bank Unlocked Their MainframeDigital Banking in the Cloud: How Citizens Bank Unlocked Their Mainframe
Digital Banking in the Cloud: How Citizens Bank Unlocked Their Mainframe
 
Building Production Ready Search Pipelines with Spark and Milvus
Building Production Ready Search Pipelines with Spark and MilvusBuilding Production Ready Search Pipelines with Spark and Milvus
Building Production Ready Search Pipelines with Spark and Milvus
 
WeTestAthens: Postman's AI & Automation Techniques
WeTestAthens: Postman's AI & Automation TechniquesWeTestAthens: Postman's AI & Automation Techniques
WeTestAthens: Postman's AI & Automation Techniques
 
“Temporal Event Neural Networks: A More Efficient Alternative to the Transfor...
“Temporal Event Neural Networks: A More Efficient Alternative to the Transfor...“Temporal Event Neural Networks: A More Efficient Alternative to the Transfor...
“Temporal Event Neural Networks: A More Efficient Alternative to the Transfor...
 
Taking AI to the Next Level in Manufacturing.pdf
Taking AI to the Next Level in Manufacturing.pdfTaking AI to the Next Level in Manufacturing.pdf
Taking AI to the Next Level in Manufacturing.pdf
 
Nordic Marketo Engage User Group_June 13_ 2024.pptx
Nordic Marketo Engage User Group_June 13_ 2024.pptxNordic Marketo Engage User Group_June 13_ 2024.pptx
Nordic Marketo Engage User Group_June 13_ 2024.pptx
 
Fueling AI with Great Data with Airbyte Webinar
Fueling AI with Great Data with Airbyte WebinarFueling AI with Great Data with Airbyte Webinar
Fueling AI with Great Data with Airbyte Webinar
 
Main news related to the CCS TSI 2023 (2023/1695)
Main news related to the CCS TSI 2023 (2023/1695)Main news related to the CCS TSI 2023 (2023/1695)
Main news related to the CCS TSI 2023 (2023/1695)
 
GNSS spoofing via SDR (Criptored Talks 2024)
GNSS spoofing via SDR (Criptored Talks 2024)GNSS spoofing via SDR (Criptored Talks 2024)
GNSS spoofing via SDR (Criptored Talks 2024)
 
Dandelion Hashtable: beyond billion requests per second on a commodity server
Dandelion Hashtable: beyond billion requests per second on a commodity serverDandelion Hashtable: beyond billion requests per second on a commodity server
Dandelion Hashtable: beyond billion requests per second on a commodity server
 
Digital Marketing Trends in 2024 | Guide for Staying Ahead
Digital Marketing Trends in 2024 | Guide for Staying AheadDigital Marketing Trends in 2024 | Guide for Staying Ahead
Digital Marketing Trends in 2024 | Guide for Staying Ahead
 
Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024
 
Overcoming the PLG Trap: Lessons from Canva's Head of Sales & Head of EMEA Da...
Overcoming the PLG Trap: Lessons from Canva's Head of Sales & Head of EMEA Da...Overcoming the PLG Trap: Lessons from Canva's Head of Sales & Head of EMEA Da...
Overcoming the PLG Trap: Lessons from Canva's Head of Sales & Head of EMEA Da...
 
SAP S/4 HANA sourcing and procurement to Public cloud
SAP S/4 HANA sourcing and procurement to Public cloudSAP S/4 HANA sourcing and procurement to Public cloud
SAP S/4 HANA sourcing and procurement to Public cloud
 
dbms calicut university B. sc Cs 4th sem.pdf
dbms  calicut university B. sc Cs 4th sem.pdfdbms  calicut university B. sc Cs 4th sem.pdf
dbms calicut university B. sc Cs 4th sem.pdf
 
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdf
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdfHow to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdf
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdf
 

Ruby - The Hard Bits

  • 1. RUBY – The Hard Bits or How to Rock Hard, Ride Free or Will I still be a Rubyist in 5 years? RedDotRubyConf 2013 – Singapore Jun-2013
  • 2. I am a Rubyist .. Paul Gallagher paul@evendis.com evendis.com personal: tardate.com twitter.com/tardate
  • 3. .. but that wasn’t always the case
  • 4. Let it never be said, the romance is dead 'Cos there’s so little else occupying my head
  • 5. Pascal @uni BASIC, Assembler, C, Fortran.. @uni BASIC, Assembler, C, Fortran.. Build more complex things faster Build more complex things faster OO DesignOO Design
  • 6. dbase, Notes PascalPascal Build more complex things even faster Build more complex things even faster Client ServerClient Server C++, OS/2 Purely for preservation of self-esteem Purely for preservation of self-esteem
  • 7. MCSDVB, VC, ASP, COM, .NET, C# dbase, Notes dbase, Notes Building with cross- functional teams Building with cross- functional teams The Internet happened The Internet happened
  • 8. J2EE MCSD VB, VC, ASP, COM, .NET, C# MCSD VB, VC, ASP, COM, .NET, C# Lingua francaLingua franca Open Platforms and Standards Open Platforms and Standards Perl Universal glueUniversal glue
  • 9. Ruby J2EEJ2EE write less, write clean write less, write clean Agile Web Development, Open source Agile Web Development, Open source Javascript Universal web glue Universal web glue
  • 10. A Very Comfortable Place Lazy Dog Inn, Huarez Peru http://goo.gl/zvkTI
  • 11. A Very Comfortable Place Lazy Dog Inn, Huarez Peru http://goo.gl/zvkTI a test-infected community vibrant open source great packaging (gems) unrivaled reuse (git/hub) Oh, and the language is pretty nice too
  • 12. Due to lack of interest tomorrow is canceled Let the clocks be reset and the pendulums held
  • 13. Will I still be a Rubyist in 5 years?
  • 15. programming problems I can solve with Ruby time ? 2013
  • 16. Fear of the Dark Frontier lands Edge of common practice Borders No man’s land
  • 17. What Technologists Think http://www.infoq.com/research/software-trends-2013 1. HTML5 and JavaScript as a Platform 2. Mobile Applications and Mobile-first UIs 3. Cloud Computing 4. NoSQL displacing RDBs 5. Big Data and Analytics
  • 18. What CIOs Think Gartner Top 10 CIO Business and Technology Priorities in 2013 http://goo.gl/Bca4T
  • 21. Rich Interaction – Diverse Devices Classic web app Classic web app APIAPI NativeNative Rich clientRich client API, partials, logic API, partials, logic server device Java Android Objective C iOS JS Frameworks Ember, Angular, Backbone etc JS Frameworks Ember, Angular, Backbone etc http://todomvc.com/ Light dusting PJAX, Turbolinks, Backbone lite, jQuery Light dusting PJAX, Turbolinks, Backbone lite, jQuery
  • 22. Undisclosed desires.. Classic web app Classic web app APIAPI NativeNative Rich clientRich client API, partials, logic API, partials, logic server device Java Android Objective C iOS JS Frameworks Ember, Angular, Backbone etc JS Frameworks Ember, Angular, Backbone etc Light dusting PJAX, Turbolinks, Backbone lite, jQuery Light dusting PJAX, Turbolinks, Backbone lite, jQuery We want to be DRY?We want to be DRY?
  • 23. Undisclosed desires.. Classic web app Classic web app APIAPI NativeNative Rich clientRich client API, partials, logic API, partials, logic server device Java Android Objective C iOS JS Frameworks Ember, Angular, Backbone etc JS Frameworks Ember, Angular, Backbone etc Light dusting PJAX, Turbolinks, Backbone lite, jQuery Light dusting PJAX, Turbolinks, Backbone lite, jQuery Exploit device capabilities?Exploit device capabilities?
  • 24. Undisclosed desires.. Classic web app Classic web app APIAPI NativeNative Rich clientRich client API, partials, logic API, partials, logic server device Java Android Objective C iOS JS Frameworks Ember, Angular, Backbone etc JS Frameworks Ember, Angular, Backbone etc Light dusting PJAX, Turbolinks, Backbone lite, jQuery Light dusting PJAX, Turbolinks, Backbone lite, jQuery Server-push and distributed event propagation?Server-push and distributed event propagation?
  • 25. Undisclosed desires.. Classic web app Classic web app APIAPI NativeNative Rich clientRich client API, partials, logic API, partials, logic server device Java Android Objective C iOS JS Frameworks Ember, Angular, Backbone etc JS Frameworks Ember, Angular, Backbone etc Light dusting PJAX, Turbolinks, Backbone lite, jQuery Light dusting PJAX, Turbolinks, Backbone lite, jQuery A cohesive full stack programming model?A cohesive full stack programming model?
  • 26. Undisclosed desires.. Classic web app Classic web app APIAPI NativeNative Rich clientRich client API, partials, logic API, partials, logic server device Java Android Objective C iOS JS Frameworks Ember, Angular, Backbone etc JS Frameworks Ember, Angular, Backbone etc Light dusting PJAX, Turbolinks, Backbone lite, jQuery Light dusting PJAX, Turbolinks, Backbone lite, jQuery Changing my mind should be this painful?Changing my mind should be this painful?
  • 27. Innovators’ Dilemma: What are the chances? The New™ Framework The New™ Framework server device Java Android Objective C iOS Getting closer? Meteor / Derby + node.js Getting closer? Meteor / Derby + node.js
  • 30. We do extreme App-ification SaaSSaaS PaaSPaaS IaaSIaaS
  • 31. We do extreme App-ification SaaSSaaS PaaSPaaS IaaSIaaS MaaSMaaS
  • 32. API-ification APIs Everywhere! Favorite and time-tested strategy: – Wait for the REST of the world to catch up – Exceptions BTO But as technology matures: – More complex integration scenarios – Security and data semantics – Could we see a swing back to SOAP and WS-* style integration?
  • 35. Big Data Diversification Data AccessData Access ORMORM Server proc and map-reduce Server proc and map-reduce Key-valueKey-valueDocumentDocument MongoDBMongoDB GraphGraph Neo4JNeo4J CassandraCassandra Hadoop (family) Hadoop (family)RedisRedis RIAKRIAK CouchDBCouchDB ColumnColumn ✔✔ ✔✔ JSJS taxonomytaxonomy examplesexamples ✔✔ ✔✔ ✔✔ ✔✔ ✔✔ ✔✔ ½½ JSJS ✔✔ JS erlang JS erlang CipherCipher ✔✔ CQLCQL ½½ Java, Pig Hive Java, Pig Hive ½½
  • 36. Aside: Need Government Data? http://rgovdata.com
  • 37. Analytics – Can go quite a way with pure Ruby – Use other tools like R (direct or via RinRuby/RSRuby/Rserve) – E.g. scanning utility bills with Ruby and R: https://github.com/tardate/sps_bill_scanner Python Envy?Python Envy? IPython – interactive notebooks and visualisation IPython – interactive notebooks and visualisation Pandas, Statsmodels, Numpy, SciPy – data analysis comparable to R Pandas, Statsmodels, Numpy, SciPy – data analysis comparable to R
  • 38. SciRuby and NMatrix! SciRuby: Tools for Scientific Computing in Ruby Nmatrix: fast numerical linear algebra library for Ruby “We believe that the time for a Ruby science and visualization package has come”
  • 41. Case Study – Making Megar a Ruby wrapper and CLI for the Mega API https://github.com/tardate/megar – mega.co.nz: DropBox on crypto steroids – Browser RIA: cryptography in javascript – API not yet formally/fully documented
  • 42. Mega Crypto in a Nutshell usernameusername passwordpassword keygen A32 > AES-CBC > Base64 keygen A32 > AES-CBC > Base64 Login session challenge/responseLogin session challenge/response Encrypted Session ID Encrypted Session ID Encrypted RSA key Encrypted RSA key Encrypted master key Encrypted master key RSA private key parts RSA private key parts Decrypt and decompose Base64 > AES-CBC > A32 Decrypt and decompose Base64 > AES-CBC > A32 Decrypt session_id B64 > MPI > RSA Decrypt > B64 Decrypt session_id B64 > MPI > RSA Decrypt > B64 Session IDSession ID NB: this is simplified ;-) Decrypt key Base64 > AES-CBC > A32 Decrypt key Base64 > AES-CBC > A32 master keymaster key filefile Request download url Request download url DownloadDownload Encrypted fileEncrypted file Decrypt file AES-CTR + MAC verify Decrypt file AES-CTR + MAC verify Decrypt file key Base64 > > AES-CBC > A32 Decrypt file key Base64 > > AES-CBC > A32 Request FilesRequest Files Encrypted file attributes Encrypted file attributes File keyFile key
  • 43. Mega Crypto Challenges Funky Base64 – url-safe and no delimiters; JFDI MPI and integer arrays – lack of primitives; JFDI RSA with key components – incompatible OpenSSL – DIY RSA private key decrypt AES CTR mode – Requires OpenSSL 1.0.1+ – DIY CTR mode on AES-CBC OpenSSL 0.9.8+
  • 44. Mega Crypto Challenges Funky Base64 – url-safe and no delimiters; JFDI MPI and integer arrays – lack of primitives; JFDI RSA with key components – incompatible OpenSSL – DIY RSA private key decrypt AES CTR mode – Requires OpenSSL 1.0.1+ – DIY CTR mode on AES-CBC OpenSSL 0.9.8+ The Python Experience? The Python Experience? PyCrypto – native AES-CTR implementation PyCrypto – native AES-CTR implementation PyCrypto – able to drive RSA with key components (bit of a hack though) PyCrypto – able to drive RSA with key components (bit of a hack though) Base64, MPI and integer array handling – same, same Base64, MPI and integer array handling – same, same
  • 45. The Resistance Ruby core and stdlib – FBOW thin wrappers on external libraries Surely there’s a gem for that? – Yes, many, but.. – fast-aes, gibberish, rbncl, crypto, ruby-aes etc.. Hate This & I’ll Love You Hate This & I’ll Love You Too much convention *without* configuration Too much convention *without* configuration Poor composabilityPoor composability Distinctly C-dy OpenSSL wrappers Distinctly C-dy OpenSSL wrappers Maintained?Maintained?
  • 46. Uprising – Krypt https://github.com/krypt/krypt Lead by Martin Boßlet OpenSSL maintainer See confreaks e.g. http://goo.gl/V4wKW and update at GORUCO 8th June Krypt aims: – OpenSSL replacement – External dependencies are optional – Composability – Convention *with* configuration Still early days..
  • 48. TAKEAWAYS Keep your eyes on the road, and your hands upon the wheel
  • 49. Four Trends – Liquid State B-B- A-A- A+A+ C+C+
  • 50. So! Will I still be a Rubyist in 5 years?
  • 51. YES! But.. – Most unpredictable arena is the future of web development – The future is polyglot, but once you start thinking like a Rubyist it is hard to stop – even if we’re not always typing it – The irresistible urge to inject Ruby goodness where-ever we tread
  • 52. Thanks! Paul Gallagher paul@evendis.com evendis.com personal: tardate.com twitter.com/tardate Ruby, Ruby, Ruby, Ruby And do ya, do ya, do ya, do ya Know what ya doing, doing to me?

Editor's Notes

  1. Four horsemen Richness of client server at internet scale