SlideShare a Scribd company logo
1 of 67
Download to read offline
Ruby	
for	devops
	
Adam	Klein
Questions
Ask	at	any	time
Why!?
Ruby	for	automation	scripts
easy	&	intuitive
rich	libraries	and	open	source
DevOps	tools
Chef
Capistrano
Server	Spec
Vagrant
God
Better	understanding
	of	Ruby-based	systems
About	me
Adam	Klein
Co-Founder	of	500Tech.com
@500TechIL
Some	stuff	to	know	about	Ruby
Interpreted	language
It's	fun	
Rich	built-in	libraries	
Garbage	collection
Great	open-source
Non-devops	usages
Mainly	used	in	web	server	frameworks:
Rails
Sinatra
Grape
Padrino
Supports
Mac
Linux
"Windows"
Interpreters
Ruby	=	YARV	(>=	1.9)
Latest	version	=	2.1.1
Other:
MRI	(<	1.9)
JRuby
Rubinius
IronRuby
Threading
(YARV)
native	threads	-	only	one	at	a	time
JRuby
Allows	Java	code	integration
Allows	parallel	multi-threading	(JVM	threads)
Memory
Lazy	Garbage	Collection
Ruby	hardly	frees	up	memory	to	user	space
Ruby	on	Rails	processes	consume	much	memory
JRuby	is	a	memory	hog
Installation
Install	RVM	-	manages	installed	ruby	versions
rvm	use	2.0.0
rvm	install	ruby-2.1.2	
rvm	list
GEMs
Open	source	libraries	(MIT)
They	are	just	ruby	code	
Some	require	native	code	compilation	(C	compiler)			
Some	include	an	executable	
Manage	using	a	Powerful	CLI
$	gem	install	pry
$	gem	list	aws
$	gem	search	debugger
$	gem	dependency	rails	-v	'4.0.0'
Running	code
ruby	test.rb	(run	code	from	file)
irb	(interactive)
pry	(irb	with	color)
Basic	syntax
Dynamic	vars
num	=	5
numbers	=	[1,2,3]
title	=	"hello	world"
details	=	{name:	'Adam',	company:	'500Tech'}
now	=	Time.new
methods
>	arr	=	["one",	"two",	"three"]
>	csv	=	arr.join	",	"
=>	"one,	two,	three"
>	4.to_f
=>	4.0
>	Time.now
=>	2014-07-13	19:23:09	+0300
defining	methods
	def	greet(first,	last)
		"Hello	#{first}	#{last}"
	end
Loops	&	blocks
	websites	=	%w(yad2.co.il
															homeless.co.il
															winwin.co.il)
	websites.each	do	|website|
			scrape(website)
	end
More	block	examples
	5.times	do
			putc	"."
			sleep	1
	end
	hezkot	=	(1..10).map	{|num|	2	**	num}
GEMs
packaged	code
online	repositories	(rubygems.org)
easily	managed	in	terminal
dependency	management
GEMs
$	gem	install	nokogiri
>	require	'nokogiri'
>	path	=	'www.google.co.il/search?q=ruby'
>	doc	=	Nokogiri.HTML(open(path))
>	doc.css('#ires	a').first.text
=>	"Ruby	Programming	Language"
Object	Oriented
Classes
	class	Cow
			def	initialize									#	constructor
					@litres	=	10									#	instance	variable
			end
			def	milk															#	instance	method
					@litres	-=	1
			end
			attr_reader	:litres				#	getter	method
	end
Object	Oriented
Instances
	daisy	=	Cow.new
	daisy.milk
	daisy.milk
	daisy.litres
=>	8
	betty	=	Cow.new
	betty.litres
=>	10
Modules	/	namespaces
		module	Animal
				class	Cow
						..
				end
		end
	betty	=	Animal::Cow.new
Concrete	example
Given:
heroku	application
daily	backups
maximum	7	backups
Needed:
script	to	upload	backups	to	S3
Solution:
Ruby!
The	GEMs
open-uri
aws-sdk
The	code
require	'open-uri'
require	'aws'
AWS.config(access_key_id:	'XXX',	secret_access_key:	'YYY')
bucket	=	AWS::S3.new.buckets['my_project']
data	=	open(`heroku	pgbackups:url`)
bucket.objects["backups/#{Time.now.to_i}"].write(data)
Directories	and	Files
	Dir.pwd
	Dir['**.txt']
	Dir.open('.').each	{|f|	...	}
	Dir.mkdir('tmp/files')
	File.exist?('docs/words.txt')
	File.basename?('docs/words.txt')
	f	=	File.open('docs/words.txt')
	f.size
	f.path
DB
		client	=	Mysql2::Client.new
			host:	'localhost',
			username:	'root'
	client.query('select	*	from	users')
		.each	do	|user|
			puts	user[:name]
	end
ActiveRecord
Migrations
Change	DB	Schema	with	ruby	code
Keep	several	branches	in	sync
Example
	class	CreateProducts	<	ActiveRecord::Migration
			def	change
					create_table	:products	do	|t|
							t.string	:name
							t.text			:description
							t.float		:price
					end
			end
	end
Usage
	rake	db:migrate
	rake	db:rollback
	rake	db:migrate:status
*	Note	-	non	rails	projects	will	need	custom	setup
Abstraction	of	the	DB
connection.rb
require	'active_record'
ActiveRecord::Base.establish_connection(
		database:	'my_db',
		adapter:		'postgresql',
		host:					'...',
		port:					...,
		username:	'.....'
)
Simple	Example
Assume	we	have	an	'orders'	table	
	require	'connection'
	class	Order	<	ActiveRecord::Base
	end
>	Order.count
=>	1403
>	Order.create	price:	1005,	title:	'PC'
*	Note:	you	can	override	conventions
Relations
models.rb
	class	Order	<	ActiveRecord::Base
			has_many	:items
	end
	class	Item	<	ActiveRecord::Base
			belongs_to	:order
	end
Relations	usage
Order.first.items.sum(:price)
Underlying	SQL:
Select	sum(price)	from	items	where	order_id	=	(select
God
monitoring	framework
config	files	in	ruby
Simple	config	file
God.watch	do	|w|
		w.name	=	"simple"
		w.start	=	"ruby	/full/path/to/simple.rb"
		w.keepalive
end
Complex	config	files
		God.watch	do	|w|
				w.name	=	"gravatar2-mongrel-#{port}"
				w.start	=	"mongrel_rails	start	-c	#{RAILS_ROOT}	-p	#{port}	
						-P	#{RAILS_ROOT}/log/mongrel.#{port}.pid		-d"
				w.stop	=	"mongrel_rails	stop	-P	#{RAILS_ROOT}/log/mongrel.#{port}.pid"
				w.restart	=	"mongrel_rails	restart	-P	#{RAILS_ROOT}/log/mongrel.#{port}.pid"
				w.pid_file	=	File.join(RAILS_ROOT,	"log/mongrel.#{port}.pid")
				w.behavior(:clean_pid_file)
				w.start_if	do	|start|
						start.condition(:process_running)	do	|c|
								c.interval	=	5.seconds
								c.running	=	false
						end
				end
				w.restart_if	do	|restart|
						restart.condition(:memory_usage)	do	|c|
								c.above	=	150.megabytes
								c.times	=	[3,	5]	#	3	out	of	5	intervals
end
						restart.condition(:cpu_usage)	do	|c|
								c.above	=	50.percent
								c.times	=	5
						end
				end
				#	lifecycle
				w.lifecycle	do	|on|
						on.condition(:flapping)	do	|c|
								c.to_state	=	[:start,	:restart]
								c.times	=	5
								c.within	=	5.minute
								c.transition	=	:unmonitored
								c.retry_in	=	10.minutes
								c.retry_times	=	5
								c.retry_within	=	2.hours
						end
				end
		end
Features
Alert	contacts	(email,	webhooks,	campfire,	etc.)
Memory	/	CPU	thresholds
Restart	logic	(retries,	intervals)
Modify	STOP	signal
Grouping	processes
Etc.
e.g:
If	process	goes	over	95%	CPU	5	times	in	1	minutes,	restart	it.	If
this	condition	was	met	more	than	5	times	within	20	minutes,
shutdown	the	process	and	alert	the	admin.
Reuse	code
		def	cpu(w,	percent	=	95,	times	=	5)
				w.restart_if	do	|restart|
						restart.condition(:cpu_usage)	do	|c|
								c.above	=	percent.percent
								c.times	=	times
						end
				end
		end
		
		def	memory(w,	limit	=	100,	times	=	5)
				...
		end
Reuse	code
God.load('common.god')
God.watch	do	|w|
		w.name	=	"simple"
		w.start	=	"ruby	/full/path/to/simple.rb"
		w.keepalive
		cpu(w)
		memory(w,	150,	3)
		flapping
end
Use	loops
{first:	'/first/path/to/file',
	second:	'/second/path/to/file',
	third:	'/usr/bin/third'}
.each	do	|name,	path|
		God.watch	do	|w|
				w.name	=	name.gsub('/',	'_')
				w.start	=	"ruby	#{path}.rb"
				...
		end
end
Debug!
$	gem	install	pry-debugger
require	'pry'
God.watch	do	|w|
		w.name	=	"simple"
		w.start	=	"ruby	#{ENV['ROOT_DIR']}/simple.rb"
		binding.pry
		w.keepalive
end
Ruby	DSLs
Domain	Specific	Language
Chef
"Chef	delivers	fast,	scalable,	flexible	IT
automation"
All	in	Ruby:
config	files
recipes
Chef	DSL
								
			file	'foo'	do
					content	'hello	world'
			end
Without	DSL
					require	'chef'	
			Chef.file	'foo'	do	|f|
					f.content	'hello	world'
			end
Vagrant
Create	and	share	development	environments	easily
develop	normally	on	local	filesystem	+	GIT
run	&	test	on	virtual	machine	(box)
Saves	installation	&	configuration	time
Vagrantfile
The	config	file	is	written	in.....
Ruby
Share	code
common.rb:
	RAILS_ROOT	=	'/my/project'
	AWS_KEY				=	'XXX'
	NODES						=	4
	...
	def	timestamp
			Time.now.strftime("%Y%m%d%H%M%S")
	end
	...
Reuse	code
Vagrantfile:
chef_recipe.rb:
config.god:
	require	'common'
	...
	require	'common'
	...
	require	'common'
	...
server	spec
Testing	server	configuration	with	RSpec
Example
describe	package('httpd')	do
			it	{	should	be_installed	}
end
describe	port(80)	do
			it	{	should	be_listening	}
end
describe	file('/etc/httpd/conf/httpd.conf')	do
			it	{	should	be_file	}
its(:content)	{	should	match	/ServerName	www.example.jp/	}
end
Output
package	httpd
		is	installed
service	httpd
		is	enabled
		is	running	(FAILED	-	1)
port	80
		is	listening
file	httpd.conf
		is	a	file
		has	content	'...'
Output
		Failures:
		1)	service	httpd	is	running
					Failure/Error:	it('is	running')	{	should	be_running}
							expected	`service("httpd").running?`	to	return	true,	got	false
					#	./test.rb:13:in	`block	(2	levels)	in	<top	(required)>'
Output
		Finished	in	0.003	seconds	(files	took	0.18	seconds	to	load)
		6	examples,	1	failure
		Failed	examples:
		rspec	./test.rb:13	#	service	httpd	is	running
RSpec	DSL
describe	file('/etc/httpd/conf/httpd.conf')	do
			before(:each)	do	...	end
			it	{	should	be_file	}
			its(:content)	{	should	match	/ServerName	www.example.jp/	}
end
Server	Spec	Methods
describe	service('httpd')	do
			it	{	should	be_enabled	}
			it	{	should	be_running	}
end
describe	port(80)	do
			it	{	should	be_listening	}
end
describe	file('/etc/httpd/conf/httpd.conf')	do
			it	{	should	be_file	}
			its(:content)	{	should	match	/ServerName	www.example.jp/	}
end
Ruby	goodness
services	=	%w(httpd	stunnel	mysql	redis)
services.each	do	|name|
			describe	service(name)	do
						it	{	should	be_enabled	}
						it	{	should	be_running	}
			end
end
Resources
www.ruby-doc.org
ruby-toolbox.com
Questions?
adam@500tech.com
@500TechIL
500tech.com
hackademy.co.il
angular.co.il

More Related Content

What's hot

Inside The Java Virtual Machine
Inside The Java Virtual MachineInside The Java Virtual Machine
Inside The Java Virtual Machineelliando dias
 
Redis Everywhere - Sunshine PHP
Redis Everywhere - Sunshine PHPRedis Everywhere - Sunshine PHP
Redis Everywhere - Sunshine PHPRicard Clau
 
3978 Why is Java so different... A Session for Cobol/PLI/Assembler Developers
3978   Why is Java so different... A Session for Cobol/PLI/Assembler Developers3978   Why is Java so different... A Session for Cobol/PLI/Assembler Developers
3978 Why is Java so different... A Session for Cobol/PLI/Assembler Developersnick_garrod
 
Jfokus 2016 - A JVMs Journey into Polyglot Runtimes
Jfokus 2016 - A JVMs Journey into Polyglot RuntimesJfokus 2016 - A JVMs Journey into Polyglot Runtimes
Jfokus 2016 - A JVMs Journey into Polyglot RuntimesCharlie Gracie
 
Introduction to Docker
Introduction to DockerIntroduction to Docker
Introduction to DockerAlan Forbes
 
Ola Bini Evolving The Java Platform
Ola Bini Evolving The Java PlatformOla Bini Evolving The Java Platform
Ola Bini Evolving The Java Platformdeimos
 
Thoughts on Transaction and Consistency Models
Thoughts on Transaction and Consistency ModelsThoughts on Transaction and Consistency Models
Thoughts on Transaction and Consistency Modelsiammutex
 
Node.js Web Apps @ ebay scale
Node.js Web Apps @ ebay scaleNode.js Web Apps @ ebay scale
Node.js Web Apps @ ebay scaleDmytro Semenov
 
Docker at Djangocon 2013 | Talk by Ken Cochrane
Docker at Djangocon 2013 | Talk by Ken CochraneDocker at Djangocon 2013 | Talk by Ken Cochrane
Docker at Djangocon 2013 | Talk by Ken CochranedotCloud
 
Performance tuning with zend framework
Performance tuning with zend frameworkPerformance tuning with zend framework
Performance tuning with zend frameworkAlan Seiden
 
Everything-as-code. A polyglot adventure. #DevoxxPL
Everything-as-code. A polyglot adventure. #DevoxxPLEverything-as-code. A polyglot adventure. #DevoxxPL
Everything-as-code. A polyglot adventure. #DevoxxPLMario-Leander Reimer
 
When Two Worlds Collide: Java and Ruby in the Enterprise
When Two Worlds Collide: Java and Ruby in the EnterpriseWhen Two Worlds Collide: Java and Ruby in the Enterprise
When Two Worlds Collide: Java and Ruby in the Enterprisebenbrowning
 
Scala e xchange 2013 haoyi li on metascala a tiny diy jvm
Scala e xchange 2013 haoyi li on metascala a tiny diy jvmScala e xchange 2013 haoyi li on metascala a tiny diy jvm
Scala e xchange 2013 haoyi li on metascala a tiny diy jvmSkills Matter
 
Dockerize your Symfony application - Symfony Live NYC 2014
Dockerize your Symfony application - Symfony Live NYC 2014Dockerize your Symfony application - Symfony Live NYC 2014
Dockerize your Symfony application - Symfony Live NYC 2014André Rømcke
 
The jar of joy
The jar of joyThe jar of joy
The jar of joySensePost
 
ITCamp 2011 - Alessandro Pilotti - Optimizing ASPNet and PHP apps on IIS 7.5
ITCamp 2011 - Alessandro Pilotti - Optimizing ASPNet and PHP apps on IIS 7.5ITCamp 2011 - Alessandro Pilotti - Optimizing ASPNet and PHP apps on IIS 7.5
ITCamp 2011 - Alessandro Pilotti - Optimizing ASPNet and PHP apps on IIS 7.5ITCamp
 
Scaling and Managing Cassandra with docker, CoreOS and Presto
Scaling and Managing Cassandra with docker, CoreOS and PrestoScaling and Managing Cassandra with docker, CoreOS and Presto
Scaling and Managing Cassandra with docker, CoreOS and PrestoVali-Marius Malinoiu
 

What's hot (20)

A32 Database Virtulization Technologies
A32 Database Virtulization TechnologiesA32 Database Virtulization Technologies
A32 Database Virtulization Technologies
 
Euruko 2012 - JRuby
Euruko 2012 - JRubyEuruko 2012 - JRuby
Euruko 2012 - JRuby
 
Inside The Java Virtual Machine
Inside The Java Virtual MachineInside The Java Virtual Machine
Inside The Java Virtual Machine
 
ruby pentest
ruby pentestruby pentest
ruby pentest
 
Redis Everywhere - Sunshine PHP
Redis Everywhere - Sunshine PHPRedis Everywhere - Sunshine PHP
Redis Everywhere - Sunshine PHP
 
3978 Why is Java so different... A Session for Cobol/PLI/Assembler Developers
3978   Why is Java so different... A Session for Cobol/PLI/Assembler Developers3978   Why is Java so different... A Session for Cobol/PLI/Assembler Developers
3978 Why is Java so different... A Session for Cobol/PLI/Assembler Developers
 
Jfokus 2016 - A JVMs Journey into Polyglot Runtimes
Jfokus 2016 - A JVMs Journey into Polyglot RuntimesJfokus 2016 - A JVMs Journey into Polyglot Runtimes
Jfokus 2016 - A JVMs Journey into Polyglot Runtimes
 
Introduction to Docker
Introduction to DockerIntroduction to Docker
Introduction to Docker
 
Ola Bini Evolving The Java Platform
Ola Bini Evolving The Java PlatformOla Bini Evolving The Java Platform
Ola Bini Evolving The Java Platform
 
Thoughts on Transaction and Consistency Models
Thoughts on Transaction and Consistency ModelsThoughts on Transaction and Consistency Models
Thoughts on Transaction and Consistency Models
 
Node.js Web Apps @ ebay scale
Node.js Web Apps @ ebay scaleNode.js Web Apps @ ebay scale
Node.js Web Apps @ ebay scale
 
Docker at Djangocon 2013 | Talk by Ken Cochrane
Docker at Djangocon 2013 | Talk by Ken CochraneDocker at Djangocon 2013 | Talk by Ken Cochrane
Docker at Djangocon 2013 | Talk by Ken Cochrane
 
Performance tuning with zend framework
Performance tuning with zend frameworkPerformance tuning with zend framework
Performance tuning with zend framework
 
Everything-as-code. A polyglot adventure. #DevoxxPL
Everything-as-code. A polyglot adventure. #DevoxxPLEverything-as-code. A polyglot adventure. #DevoxxPL
Everything-as-code. A polyglot adventure. #DevoxxPL
 
When Two Worlds Collide: Java and Ruby in the Enterprise
When Two Worlds Collide: Java and Ruby in the EnterpriseWhen Two Worlds Collide: Java and Ruby in the Enterprise
When Two Worlds Collide: Java and Ruby in the Enterprise
 
Scala e xchange 2013 haoyi li on metascala a tiny diy jvm
Scala e xchange 2013 haoyi li on metascala a tiny diy jvmScala e xchange 2013 haoyi li on metascala a tiny diy jvm
Scala e xchange 2013 haoyi li on metascala a tiny diy jvm
 
Dockerize your Symfony application - Symfony Live NYC 2014
Dockerize your Symfony application - Symfony Live NYC 2014Dockerize your Symfony application - Symfony Live NYC 2014
Dockerize your Symfony application - Symfony Live NYC 2014
 
The jar of joy
The jar of joyThe jar of joy
The jar of joy
 
ITCamp 2011 - Alessandro Pilotti - Optimizing ASPNet and PHP apps on IIS 7.5
ITCamp 2011 - Alessandro Pilotti - Optimizing ASPNet and PHP apps on IIS 7.5ITCamp 2011 - Alessandro Pilotti - Optimizing ASPNet and PHP apps on IIS 7.5
ITCamp 2011 - Alessandro Pilotti - Optimizing ASPNet and PHP apps on IIS 7.5
 
Scaling and Managing Cassandra with docker, CoreOS and Presto
Scaling and Managing Cassandra with docker, CoreOS and PrestoScaling and Managing Cassandra with docker, CoreOS and Presto
Scaling and Managing Cassandra with docker, CoreOS and Presto
 

Similar to Ruby for devops

IronRuby for the Rubyist
IronRuby for the RubyistIronRuby for the Rubyist
IronRuby for the RubyistWill Green
 
Ruby on rails toolbox
Ruby on rails toolboxRuby on rails toolbox
Ruby on rails toolboxBlazing Cloud
 
An introduction to Rails 3
An introduction to Rails 3An introduction to Rails 3
An introduction to Rails 3Blazing Cloud
 
An introduction to the ruby ecosystem
An introduction to the ruby ecosystemAn introduction to the ruby ecosystem
An introduction to the ruby ecosystemGeison Goes
 
Ruby and Rails short motivation
Ruby and Rails short motivationRuby and Rails short motivation
Ruby and Rails short motivationjistr
 
Introduction To Rails
Introduction To RailsIntroduction To Rails
Introduction To RailsEric Gruber
 
Ruby on Rails (RoR) as a back-end processor for Apex
Ruby on Rails (RoR) as a back-end processor for Apex Ruby on Rails (RoR) as a back-end processor for Apex
Ruby on Rails (RoR) as a back-end processor for Apex Espen Brækken
 
Redis Introduction
Redis IntroductionRedis Introduction
Redis IntroductionAlex Su
 
Ruby On Google App Engine 2nd Athens Ruby Me
Ruby On Google App Engine 2nd Athens Ruby MeRuby On Google App Engine 2nd Athens Ruby Me
Ruby On Google App Engine 2nd Athens Ruby MePanagiotis Papadopoulos
 
JRoR Deploying Rails on JRuby
JRoR Deploying Rails on JRubyJRoR Deploying Rails on JRuby
JRoR Deploying Rails on JRubyelliando dias
 
Dynamic Languages on the JVM
Dynamic Languages on the JVMDynamic Languages on the JVM
Dynamic Languages on the JVMelliando dias
 

Similar to Ruby for devops (20)

IronRuby for the Rubyist
IronRuby for the RubyistIronRuby for the Rubyist
IronRuby for the Rubyist
 
Ruby on rails toolbox
Ruby on rails toolboxRuby on rails toolbox
Ruby on rails toolbox
 
An introduction to Rails 3
An introduction to Rails 3An introduction to Rails 3
An introduction to Rails 3
 
An introduction to the ruby ecosystem
An introduction to the ruby ecosystemAn introduction to the ruby ecosystem
An introduction to the ruby ecosystem
 
Ruby and Rails short motivation
Ruby and Rails short motivationRuby and Rails short motivation
Ruby and Rails short motivation
 
Ruby and Security
Ruby and SecurityRuby and Security
Ruby and Security
 
Introduction To Rails
Introduction To RailsIntroduction To Rails
Introduction To Rails
 
2 Basics
2 Basics2 Basics
2 Basics
 
Athens Ruby Meetup #3: IronRuby
Athens Ruby Meetup #3: IronRubyAthens Ruby Meetup #3: IronRuby
Athens Ruby Meetup #3: IronRuby
 
Ruby on Rails (RoR) as a back-end processor for Apex
Ruby on Rails (RoR) as a back-end processor for Apex Ruby on Rails (RoR) as a back-end processor for Apex
Ruby on Rails (RoR) as a back-end processor for Apex
 
Ruby Beyond Rails
Ruby Beyond RailsRuby Beyond Rails
Ruby Beyond Rails
 
Redis Introduction
Redis IntroductionRedis Introduction
Redis Introduction
 
MacRuby on Rails
MacRuby on RailsMacRuby on Rails
MacRuby on Rails
 
Ruby On Google App Engine 2nd Athens Ruby Me
Ruby On Google App Engine 2nd Athens Ruby MeRuby On Google App Engine 2nd Athens Ruby Me
Ruby On Google App Engine 2nd Athens Ruby Me
 
Setup ruby
Setup rubySetup ruby
Setup ruby
 
JRoR Deploying Rails on JRuby
JRoR Deploying Rails on JRubyJRoR Deploying Rails on JRuby
JRoR Deploying Rails on JRuby
 
Ruby on rails
Ruby on railsRuby on rails
Ruby on rails
 
Why ruby?
Why ruby?Why ruby?
Why ruby?
 
Dynamic Languages on the JVM
Dynamic Languages on the JVMDynamic Languages on the JVM
Dynamic Languages on the JVM
 
Practical JRuby
Practical JRubyPractical JRuby
Practical JRuby
 

More from Adam Klein

Angular Course - Flux & Redux
Angular Course - Flux & ReduxAngular Course - Flux & Redux
Angular Course - Flux & ReduxAdam Klein
 
Redux "Bad" Practices - A List of 13 Bad Practices and How to Avoid Them
Redux "Bad" Practices - A List of 13 Bad Practices and How to Avoid ThemRedux "Bad" Practices - A List of 13 Bad Practices and How to Avoid Them
Redux "Bad" Practices - A List of 13 Bad Practices and How to Avoid ThemAdam Klein
 
Tales of an open source library
Tales of an open source libraryTales of an open source library
Tales of an open source libraryAdam Klein
 
Es6 everywhere
Es6 everywhereEs6 everywhere
Es6 everywhereAdam Klein
 
Clean up your code
Clean up your codeClean up your code
Clean up your codeAdam Klein
 
Lean startups for non-tech entrepreneurs
Lean startups for non-tech entrepreneursLean startups for non-tech entrepreneurs
Lean startups for non-tech entrepreneursAdam Klein
 
Data models in Angular 1 & 2
Data models in Angular 1 & 2Data models in Angular 1 & 2
Data models in Angular 1 & 2Adam Klein
 
Client side unit tests - using jasmine & karma
Client side unit tests - using jasmine & karmaClient side unit tests - using jasmine & karma
Client side unit tests - using jasmine & karmaAdam Klein
 
Mobile Apps using AngularJS
Mobile Apps using AngularJSMobile Apps using AngularJS
Mobile Apps using AngularJSAdam Klein
 

More from Adam Klein (10)

Angular Course - Flux & Redux
Angular Course - Flux & ReduxAngular Course - Flux & Redux
Angular Course - Flux & Redux
 
Redux "Bad" Practices - A List of 13 Bad Practices and How to Avoid Them
Redux "Bad" Practices - A List of 13 Bad Practices and How to Avoid ThemRedux "Bad" Practices - A List of 13 Bad Practices and How to Avoid Them
Redux "Bad" Practices - A List of 13 Bad Practices and How to Avoid Them
 
Tales of an open source library
Tales of an open source libraryTales of an open source library
Tales of an open source library
 
Es6 everywhere
Es6 everywhereEs6 everywhere
Es6 everywhere
 
Clean up your code
Clean up your codeClean up your code
Clean up your code
 
Lean startups for non-tech entrepreneurs
Lean startups for non-tech entrepreneursLean startups for non-tech entrepreneurs
Lean startups for non-tech entrepreneurs
 
Data models in Angular 1 & 2
Data models in Angular 1 & 2Data models in Angular 1 & 2
Data models in Angular 1 & 2
 
Client side unit tests - using jasmine & karma
Client side unit tests - using jasmine & karmaClient side unit tests - using jasmine & karma
Client side unit tests - using jasmine & karma
 
Mobile Apps using AngularJS
Mobile Apps using AngularJSMobile Apps using AngularJS
Mobile Apps using AngularJS
 
3rd party
3rd party3rd party
3rd party
 

Recently uploaded

JohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptxJohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptxJohnPollard37
 
Design and Development of a Provenance Capture Platform for Data Science
Design and Development of a Provenance Capture Platform for Data ScienceDesign and Development of a Provenance Capture Platform for Data Science
Design and Development of a Provenance Capture Platform for Data SciencePaolo Missier
 
ChatGPT and Beyond - Elevating DevOps Productivity
ChatGPT and Beyond - Elevating DevOps ProductivityChatGPT and Beyond - Elevating DevOps Productivity
ChatGPT and Beyond - Elevating DevOps ProductivityVictorSzoltysek
 
The Zero-ETL Approach: Enhancing Data Agility and Insight
The Zero-ETL Approach: Enhancing Data Agility and InsightThe Zero-ETL Approach: Enhancing Data Agility and Insight
The Zero-ETL Approach: Enhancing Data Agility and InsightSafe Software
 
Introduction to FIDO Authentication and Passkeys.pptx
Introduction to FIDO Authentication and Passkeys.pptxIntroduction to FIDO Authentication and Passkeys.pptx
Introduction to FIDO Authentication and Passkeys.pptxFIDO Alliance
 
Less Is More: Utilizing Ballerina to Architect a Cloud Data Platform
Less Is More: Utilizing Ballerina to Architect a Cloud Data PlatformLess Is More: Utilizing Ballerina to Architect a Cloud Data Platform
Less Is More: Utilizing Ballerina to Architect a Cloud Data PlatformWSO2
 
TEST BANK For Principles of Anatomy and Physiology, 16th Edition by Gerard J....
TEST BANK For Principles of Anatomy and Physiology, 16th Edition by Gerard J....TEST BANK For Principles of Anatomy and Physiology, 16th Edition by Gerard J....
TEST BANK For Principles of Anatomy and Physiology, 16th Edition by Gerard J....rightmanforbloodline
 
Intro to Passkeys and the State of Passwordless.pptx
Intro to Passkeys and the State of Passwordless.pptxIntro to Passkeys and the State of Passwordless.pptx
Intro to Passkeys and the State of Passwordless.pptxFIDO Alliance
 
Hyatt driving innovation and exceptional customer experiences with FIDO passw...
Hyatt driving innovation and exceptional customer experiences with FIDO passw...Hyatt driving innovation and exceptional customer experiences with FIDO passw...
Hyatt driving innovation and exceptional customer experiences with FIDO passw...FIDO Alliance
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityWSO2
 
AI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by AnitarajAI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by AnitarajAnitaRaj43
 
Modernizing Legacy Systems Using Ballerina
Modernizing Legacy Systems Using BallerinaModernizing Legacy Systems Using Ballerina
Modernizing Legacy Systems Using BallerinaWSO2
 
Simplifying Mobile A11y Presentation.pptx
Simplifying Mobile A11y Presentation.pptxSimplifying Mobile A11y Presentation.pptx
Simplifying Mobile A11y Presentation.pptxMarkSteadman7
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDropbox
 
Continuing Bonds Through AI: A Hermeneutic Reflection on Thanabots
Continuing Bonds Through AI: A Hermeneutic Reflection on ThanabotsContinuing Bonds Through AI: A Hermeneutic Reflection on Thanabots
Continuing Bonds Through AI: A Hermeneutic Reflection on ThanabotsLeah Henrickson
 
API Governance and Monetization - The evolution of API governance
API Governance and Monetization -  The evolution of API governanceAPI Governance and Monetization -  The evolution of API governance
API Governance and Monetization - The evolution of API governanceWSO2
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontologyjohnbeverley2021
 
Harnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptx
Harnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptxHarnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptx
Harnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptxFIDO Alliance
 
WebRTC and SIP not just audio and video @ OpenSIPS 2024
WebRTC and SIP not just audio and video @ OpenSIPS 2024WebRTC and SIP not just audio and video @ OpenSIPS 2024
WebRTC and SIP not just audio and video @ OpenSIPS 2024Lorenzo Miniero
 
Quantum Leap in Next-Generation Computing
Quantum Leap in Next-Generation ComputingQuantum Leap in Next-Generation Computing
Quantum Leap in Next-Generation ComputingWSO2
 

Recently uploaded (20)

JohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptxJohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptx
 
Design and Development of a Provenance Capture Platform for Data Science
Design and Development of a Provenance Capture Platform for Data ScienceDesign and Development of a Provenance Capture Platform for Data Science
Design and Development of a Provenance Capture Platform for Data Science
 
ChatGPT and Beyond - Elevating DevOps Productivity
ChatGPT and Beyond - Elevating DevOps ProductivityChatGPT and Beyond - Elevating DevOps Productivity
ChatGPT and Beyond - Elevating DevOps Productivity
 
The Zero-ETL Approach: Enhancing Data Agility and Insight
The Zero-ETL Approach: Enhancing Data Agility and InsightThe Zero-ETL Approach: Enhancing Data Agility and Insight
The Zero-ETL Approach: Enhancing Data Agility and Insight
 
Introduction to FIDO Authentication and Passkeys.pptx
Introduction to FIDO Authentication and Passkeys.pptxIntroduction to FIDO Authentication and Passkeys.pptx
Introduction to FIDO Authentication and Passkeys.pptx
 
Less Is More: Utilizing Ballerina to Architect a Cloud Data Platform
Less Is More: Utilizing Ballerina to Architect a Cloud Data PlatformLess Is More: Utilizing Ballerina to Architect a Cloud Data Platform
Less Is More: Utilizing Ballerina to Architect a Cloud Data Platform
 
TEST BANK For Principles of Anatomy and Physiology, 16th Edition by Gerard J....
TEST BANK For Principles of Anatomy and Physiology, 16th Edition by Gerard J....TEST BANK For Principles of Anatomy and Physiology, 16th Edition by Gerard J....
TEST BANK For Principles of Anatomy and Physiology, 16th Edition by Gerard J....
 
Intro to Passkeys and the State of Passwordless.pptx
Intro to Passkeys and the State of Passwordless.pptxIntro to Passkeys and the State of Passwordless.pptx
Intro to Passkeys and the State of Passwordless.pptx
 
Hyatt driving innovation and exceptional customer experiences with FIDO passw...
Hyatt driving innovation and exceptional customer experiences with FIDO passw...Hyatt driving innovation and exceptional customer experiences with FIDO passw...
Hyatt driving innovation and exceptional customer experiences with FIDO passw...
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 
AI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by AnitarajAI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by Anitaraj
 
Modernizing Legacy Systems Using Ballerina
Modernizing Legacy Systems Using BallerinaModernizing Legacy Systems Using Ballerina
Modernizing Legacy Systems Using Ballerina
 
Simplifying Mobile A11y Presentation.pptx
Simplifying Mobile A11y Presentation.pptxSimplifying Mobile A11y Presentation.pptx
Simplifying Mobile A11y Presentation.pptx
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
Continuing Bonds Through AI: A Hermeneutic Reflection on Thanabots
Continuing Bonds Through AI: A Hermeneutic Reflection on ThanabotsContinuing Bonds Through AI: A Hermeneutic Reflection on Thanabots
Continuing Bonds Through AI: A Hermeneutic Reflection on Thanabots
 
API Governance and Monetization - The evolution of API governance
API Governance and Monetization -  The evolution of API governanceAPI Governance and Monetization -  The evolution of API governance
API Governance and Monetization - The evolution of API governance
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
Harnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptx
Harnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptxHarnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptx
Harnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptx
 
WebRTC and SIP not just audio and video @ OpenSIPS 2024
WebRTC and SIP not just audio and video @ OpenSIPS 2024WebRTC and SIP not just audio and video @ OpenSIPS 2024
WebRTC and SIP not just audio and video @ OpenSIPS 2024
 
Quantum Leap in Next-Generation Computing
Quantum Leap in Next-Generation ComputingQuantum Leap in Next-Generation Computing
Quantum Leap in Next-Generation Computing
 

Ruby for devops