SlideShare a Scribd company logo
1 of 69
Download to read offline
How$We$Use$Chef$(currently)
By#Dan#Ivovich
January'21,'2015
LAX$Internal$Conf
Chef%can%be%hard%to%wrap%your%head%around
Automa'ons*can*go*horribly*wrong
But$without$Chef
This%is%your%server%infrastructure
Chef%has%a%learning%curve
I've%given%talks%about%what%Chef%is%and%how%Chef%
works
But$it$is$hard$to$cover$all$of$Chef$thoroughly
The$Good$News$is$Chef%works!
So#Let's#Get#Prac%cal
How$do$we$use$Chef$today$at$SmartLogic?
Consider)this)app)Wuphf
If#you#send#a#Wuphf,#the#message#goes#to#the#
recipients'#home#phone,#cell#phone,#email,#Facebook,#
twi<er,#fax#and#homescreen#at#the#same#>me.
Wuphf&Tech&Stack
1. Rails(App((Unicorn)
2. Nginx
3. Amazon(S3,(Twi=er,(Facebook,(and(Twilio(tokens
4. Redis
5. Sidekiq
6. Postgresql
How$do$we$use$the$tool$to$minimize$
differences$between$environments?
Your%server%cluster%is%all%about%coordina1on
Infrastructure+Considera0ons
1. Staging)is)a)single)VM
2. Beta)is)a)web/worker)VM)and)a)DB)VM
3. Produc=on)has)web,)worker,)and)DB)VMs
Chef%Setup%(Berksfile)
source 'https://supermarket.getchef.com'
cookbook 'annoyances', '~> 0.0.2'
cookbook 'build-essential'
cookbook 'firewall', '>= 0.8'
cookbook 'git', '~> 3.0'
cookbook 'hostname', '~> 0.0.4'
cookbook 'hostsfile', '~> 1.0'
cookbook 'imagemagick', '~> 0.2'
cookbook 'monit', '~> 0.7'
cookbook 'mysql'
cookbook 'newrelic'
cookbook 'nginx', '~> 2.7'
cookbook 'openssl', '~> 1.1'
cookbook 'openssh', '~> 1.2'
cookbook 'postgresql', '~> 3.4'
cookbook 'rbenv'
cookbook 'redisio', '~> 1.4'
cookbook 'sudo', '~> 1.1'
cookbook 'ufw'
cookbook 'users_solo', '~> 1.0'
cookbook 'xml'
cookbook 'github_keys', github: 'smartlogic/github_keys-cookbook'
cookbook 'wuphf', path: './site-cookbooks/wuphf'
One$Chef$Cookbook$to$RULE$THEM$ALL
cookbook 'wuphf', path: './site-cookbooks/wuphf'
Place&all&the&work&our&app&needs&done&in&a&single&
cookbook&with&recipies&for&each&major&component
1. wuphf::setup
2. wuphf::db
3. wuphf::redis
4. wuphf::web
5. wuphf::app
6. wuphf::worker
We#can#use#these#recipes#in#each#environment#as#we#
need#to.
The$recipe$for$your$app$can$be$very$simple
What%do%those%recipes%look%like?
wuphf::setup
Do#the#work#that#needs#to#happen#on#every#server#we#
set#up
wuphf::setup
Hostname)and)hosts)file
include_recipe 'hostname'
hostsfile_entry '127.0.0.1' do
hostname "#{node['fqdn']} #{node['hostname']} localhost"
end
(node['wuphf']['hosts'] || {}).each_pair do |name, ip|
hostsfile_entry ip do
hostname name
end
end
wuphf::setup
Compile(dependencies,(ssl,(ssh,(sudo(setup
include_recipe 'build-essential'
include_recipe 'openssl'
include_recipe 'openssh'
include_recipe 'sudo'
Admin&accounts,&ssh&keys,&firewall&rules
include_recipe 'users_solo::admins'
include_recipe 'github_keys'
include_recipe 'ufw'
wuphf::db
Setup&and&configure&a&database&server
wuphf::db
Make%sure%setup%has%run
include_recipe 'wuphf::setup'
Install'the'db'server'so/ware,'add2ons,'and'tuning
include_recipe 'postgresql::server'
include_recipe 'postgresql::contrib'
include_recipe 'postgresql::ruby'
include_recipe 'postgresql::config_pgtune'
wuphf::db
Make%sure%the%applica/on%database%user%and%schema%
exists
connection_info = {
:host => "127.0.0.1",
:port => 5432,
:username => 'postgres',
:password => node['postgresql']['password']['postgres']
}
postgresql_database_user node['wuphf']['database_user'] do
connection connection_info
password node['wuphf']['database_password']
action :create
end
postgresql_database node['wuphf']['database'] do
connection connection_info
encoding 'UTF8'
owner node['wuphf']['database_user']
action :create
end
wuphf::redis
Setup&a&redis&server
wuphf::redis
Make%sure%setup%has%run
include_recipe 'wuphf::setup'
Install'the'redis'and'enable'it,'install'monit'for'
monitoring
include_recipe 'redisio::install'
include_recipe 'redisio::enable'
include_recipe 'monit'
wuphf::web
Setup&Nginx&web&server&components
wuphf::web
Make%sure%setup%has%run
include_recipe 'wuphf::setup'
Install'Nginx'from'the'repository,'and'monit'so'we'
can'monitor'it
include_recipe 'nginx::repo'
include_recipe 'nginx'
include_recipe 'monit'
wuphf::app
Setup&the&applica,on&core
wuphf::app
Make%sure%setup%has%run
include_recipe 'wuphf::setup'
Install'client'libraries'needed'and'monitoring
include_recipe 'postgresql::client'
include_recipe 'redisio::install'
include_recipe 'monit'
wuphf::app
Install'applica+on'ruby'and'setup'folder'structure
include_recipe 'wuphf::ruby'
include_recipe 'wuphf::app_env'
Install'applica+on'dependencies
include_recipe 'xml'
include_recipe 'imagemagick'
include_recipe 'nodejs'
wuphf::app
Rotate&your&logs
package "logrotate"
template "/etc/logrotate.d/wuphf_unicorn" do
source "unicorn_logrotate.erb"
mode "0644"
owner 'root'
group 'root'
variables(
:log_paths => [
"#{node['wuphf']['deploy_to']}/shared/log/#{node['wuphf']['environment']}.log",
"#{node['wuphf']['deploy_to']}/shared/log/unicorn.log"
],
:pid_path => "#{node['wuphf']['deploy_to']}/shared/tmp/pids/unicorn.pid"
)
end
WOAH!&Two&new&recipes!
1. wuphf::ruby
2. wuphf::app_env
wuphf::ruby
Setup&Ruby&and&Install&Bundler
include_recipe 'rbenv'
include_recipe 'rbenv::ruby_build'
rbenv_ruby node['wuphf']['ruby_version']
rbenv_gem "bundler" do
ruby_version node['wuphf']['ruby_version']
end
wuphf::app_env
Setup&the&folder&structure&for&the&app&to&deploy&to
directory "#{node['wuphf']['cap_base']}" do
action :create
owner 'deploy'
group 'deploy'
mode '0755'
end
directory "#{node['wuphf']['deploy_to']}" do
action :create
owner 'deploy'
group 'deploy'
mode '0755'
end
directory "#{node['wuphf']['deploy_to']}/shared" do
action :create
owner 'deploy'
group 'deploy'
mode '0755'
end
directory "#{node['wuphf']['deploy_to']}/shared/config" do
action :create
owner 'deploy'
group 'deploy'
mode '0755'
end
wuphf::app_env
Create&the&database.yml&and&file&for&dotenv
template "#{node['wuphf']['deploy_to']}/shared/config/database.yml" do
source 'database.yml.erb'
owner 'deploy'
group 'deploy'
mode '0644'
end
template "#{node['wuphf']['deploy_to']}/shared/wuphf_env" do
source 'wuphf_env.erb'
owner 'deploy'
group 'deploy'
mode '0644'
end
wuphf::worker
Setup&background&worker&node
wuphf::worker
Make%sure%setup%has%run
include_recipe 'wuphf::setup'
Install'client'libraries'needed'and'monitoring
include_recipe 'postgresql::client'
include_recipe 'redisio::install'
include_recipe 'monit'
wuphf::worker
Install'applica+on'ruby'and'setup'folder'structure
include_recipe 'wuphf::ruby'
include_recipe 'wuphf::app_env'
Install'applica+on'dependencies
include_recipe 'xml'
include_recipe 'imagemagick'
include_recipe 'nodejs'
Make%sure%your%new%cookbook%has%a0ributes
a"ributes/default.rb
default['wuphf']['cap_base'] = '/home/deploy/apps'
default['wuphf']['deploy_to'] = '/home/deploy/apps/wuphf'
default['wuphf']['environment'] = 'production'
default['wuphf']['database'] = 'wuphf'
default['wuphf']['adapter'] = 'postgresql'
default['wuphf']['database_user'] = 'postgres'
default['wuphf']['database_password'] = (node['postgresql']['password']['postgres'] rescue nil)
default['wuphf']['database_host'] = 'localhost'
default['wuphf']['database_pool'] = 25
default['wuphf']['ruby_version'] = '2.1.3'
default['wuphf']['env_settings'] = {}
Review&cookbook&architecture
Now$to$configure$our$nodes
The$wuphf$config$key$and$the$Run$List$vary$
significantly
Firewall(and(Postgres(keys(also(vary(from(node(to(node
First&let's&consider&the&firewall&rules
Review&network&architecture
Staging'(10.0.0.1)
"firewall" : {
"rules" : [
{ "http" : { "port" : "80" } }
]
},
The$cookbook$keeps$SSH$port$22$open$for$us
Beta%Web/App/Worker%(10.0.0.2)
"firewall" : {
"rules" : [
{ "http" : { "port" : "80" } }
]
},
Beta%DB/Redis%(10.0.0.3)
"firewall" : {
"rules" : [
{ "psql" : { "port" : "5432", "source": "10.0.0.2/32" } },
{ "redis" : { "port" : "6379", "source": "10.0.0.2/32" } }
]
},
Prod%Web%(10.0.0.5)
"firewall" : {
"rules" : [
{ "http" : { "port" : "80" } }
]
},
Prod%Worker%(10.0.0.6)
"firewall" : {
"rules" : [ ]
},
Prod%DB/Redis%(10.0.0.7)
"firewall" : {
"rules" : [
{ "psql" : { "port" : "5432", "source": "10.0.0.5/32" } },
{ "psql" : { "port" : "5432", "source": "10.0.0.6/32" } },
{ "redis" : { "port" : "6379", "source": "10.0.0.5/32" } },
{ "redis" : { "port" : "6379", "source": "10.0.0.6/32" } },
]
},
Postgres(Setup
Staging'(10.0.0.1)
"postgresql" : {
"password" : {
"postgres" : "super-secret-password"
},
"enable_pgdg_apt" : true,
"version" : "9.3",
"config_pgtune" : {
"max_connections" : "100",
"db_type" : "desktop"
}
},
Beta%DB/Redis%(10.0.0.3)%(Addi3ons)
"postgresql" : {
"config" : {
"listen_addresses" : "localhost, 10.0.0.3"
},
"pg_hba" : [
{ "type" : "local", "db" : "all", "user" : "postgres", "addr" : null, "method" : "ident"},
{ "type" : "local", "db" : "all", "user" : "all", "addr" : null, "method" : "ident"},
{ "type" : "host", "db" : "all", "user" : "all", "addr" : "127.0.0.1/32", "method" : "md5"},
{ "type" : "hostssl", "db" : "all", "user" : "wuphf", "addr" : "10.0.0.2/32", "method" : "md5"},
{ "type" : "host", "db" : "all", "user" : "all", "addr" : "::1/128", "method" : "md5"}
],
"config_pgtune" : {
"db_type" : "web",
"max_connections" : "400"
}
},
Prod%DB/Redis%(10.0.0.7)%(Addi4ons)
"postgresql" : {
"pg_hba" : [
{ "type" : "hostssl", "db" : "all", "user" : "wuphf", "addr" : "10.0.0.5/32", "method" : "md5"},
{ "type" : "hostssl", "db" : "all", "user" : "wuphf", "addr" : "10.0.0.6/32", "method" : "md5"},
],
},
Wuphf
Staging'(10.0.0.1)
"wuphf" : {
"environment" : "staging",
"database" : "wuphf_staging",
"env_settings" : {
"AWS_ACCESS_KEY" : "AWS_ACCESS_KEY",
"AWS_SECRET_ACCESS_KEY" : "AWS_SECRET_ACCESS_KEY",
"FACEBOOK_APP_ID" : "FACEBOOK_APP_ID",
"FACEBOOK_APP_SECRET" : "FACEBOOK_APP_SECRET",
"NEW_RELIC_LICENSE_KEY" : "NEW_RELIC_LICENSE_KEY",
"TWITTER_CONSUMER_KEY" : "TWITTER_KEY",
"TWITTER_CONSUMER_SECRET" : "TWITTER_SECRET",
"TWILIO_API_KEY" : "TWILIO_API_KEY",
"REDIS_PROVIDER" : "REDIS_URL",
"REDIS_URL" : "redis://localhost:6379",
"RACK_ENV" : "staging",
"RAILS_ENV" : "staging"
}
},
Beta%Web/App/Worker%(10.0.0.2)
"wuphf" : {
"environment" : "beta",
"database" : "wuphf_beta",
"hosts" : {
"db1" : "10.0.0.3"
},
"env_settings" : {
"AWS_ACCESS_KEY" : "AWS_ACCESS_KEY",
"AWS_SECRET_ACCESS_KEY" : "AWS_SECRET_ACCESS_KEY",
"FACEBOOK_APP_ID" : "FACEBOOK_APP_ID",
"FACEBOOK_APP_SECRET" : "FACEBOOK_APP_SECRET",
"NEW_RELIC_LICENSE_KEY" : "NEW_RELIC_LICENSE_KEY",
"TWITTER_CONSUMER_KEY" : "TWITTER_KEY",
"TWITTER_CONSUMER_SECRET" : "TWITTER_SECRET",
"TWILIO_API_KEY" : "TWILIO_API_KEY",
"REDIS_PROVIDER" : "REDIS_URL",
"REDIS_URL" : "redis://10.0.0.3:6379",
"RACK_ENV" : "beta",
"RAILS_ENV" : "beta"
}
},
Prod%Web/App%(10.0.0.5)
"wuphf" : {
"environment" : "production",
"database" : "wuphf_production",
"hosts" : {
"db1" : "10.0.0.7",
"worker1" : "10.0.0.6"
},
"env_settings" : {
"AWS_ACCESS_KEY" : "AWS_ACCESS_KEY",
"AWS_SECRET_ACCESS_KEY" : "AWS_SECRET_ACCESS_KEY",
"FACEBOOK_APP_ID" : "FACEBOOK_APP_ID",
"FACEBOOK_APP_SECRET" : "FACEBOOK_APP_SECRET",
"NEW_RELIC_LICENSE_KEY" : "NEW_RELIC_LICENSE_KEY",
"TWITTER_CONSUMER_KEY" : "TWITTER_KEY",
"TWITTER_CONSUMER_SECRET" : "TWITTER_SECRET",
"TWILIO_API_KEY" : "TWILIO_API_KEY",
"REDIS_PROVIDER" : "REDIS_URL",
"REDIS_URL" : "redis://10.0.0.7:6379",
"RACK_ENV" : "production",
"RAILS_ENV" : "production"
}
},
Prod%Worker%(10.0.0.6)
"wuphf" : {
"environment" : "production",
"database" : "wuphf_production",
"hosts" : {
"db1" : "10.0.0.7",
"web1" : "10.0.0.5",
},
"env_settings" : {
"AWS_ACCESS_KEY" : "AWS_ACCESS_KEY",
"AWS_SECRET_ACCESS_KEY" : "AWS_SECRET_ACCESS_KEY",
"FACEBOOK_APP_ID" : "FACEBOOK_APP_ID",
"FACEBOOK_APP_SECRET" : "FACEBOOK_APP_SECRET",
"NEW_RELIC_LICENSE_KEY" : "NEW_RELIC_LICENSE_KEY",
"TWITTER_CONSUMER_KEY" : "TWITTER_KEY",
"TWITTER_CONSUMER_SECRET" : "TWITTER_SECRET",
"TWILIO_API_KEY" : "TWILIO_API_KEY",
"REDIS_PROVIDER" : "REDIS_URL",
"REDIS_URL" : "redis://10.0.0.7:6379",
"RACK_ENV" : "production",
"RAILS_ENV" : "production"
}
},
App#Run#Lists
Staging'(10.0.0.1)
"run_list": [
"recipe[wuphf::db]",
"recipe[wuphf::redis]",
"recipe[wuphf::web]",
"recipe[wuphf::app]",
"recipe[wuphf::worker]",
"recipe[newrelic]"
]
Beta%Web/App/Worker%(10.0.0.2)
"run_list": [
"recipe[wuphf::web]",
"recipe[wuphf::app]",
"recipe[wuphf::worker]",
"recipe[newrelic]"
]
Beta%DB/Redis%(10.0.0.3)
"run_list": [
"recipe[wuphf::db]",
"recipe[wuphf::redis]",
"recipe[newrelic]"
]
Prod%Web%(10.0.0.5)
"run_list": [
"recipe[wuphf::web]",
"recipe[wuphf::app]",
"recipe[newrelic]"
]
Prod%Worker%(10.0.0.6)
"run_list": [
"recipe[wuphf::worker]",
"recipe[newrelic]"
]
Prod%DB/Redis%(10.0.0.7)
"run_list": [
"recipe[wuphf::db]",
"recipe[wuphf::redis]",
"recipe[newrelic]"
]
Review&system&architecture
Confused?*Amazed?
Don't&worry
It#is#a#process#of#trial#and#error
You've'got'this
You$can$look$awesome
Any$ques)ons?
Thank&You!
smartlogic.io
@smartlogic
danivovich.com
@danivovich
Image&Cita*ons
h"p:/
/devopsreac.ons.tumblr.com/post/
104064772852/understanding@git
h"p:/
/collec.onofawesome.com/2012/10/18/
anchorman@60@of@the@.me@gif/
h"p:/
/devopsreac.ons.tumblr.com/post/
106500035590/building@a@new@server@and@adding@
it@to@the@live
h"p:/
/devopsreac.ons.tumblr.com/post/
105951734875/describing@our@network@
infrastructure
h"p:/
/theoffice.wikia.com/wiki/WUPHF.com
Image&Cita*ons&(con*nued)
h"p:/
/devopsreac.ons.tumblr.com/post/
77162384009/se?ngAupAnewAhostAwithApuppetAorA
chef
h"p:/
/devopsreac.ons.tumblr.com/post/
87186564388/kspliceAkpatch
h"p:/
/devopsreac.ons.tumblr.com/post/
97207834532/fixingAsystemsAinternals
h"p:/
/giphy.com/gifs/keanuAreevesAuPnKU86sFa2fm
h"p:/
/devopsreac.ons.tumblr.com/post/
107492619940/deployingAaAcluster
h"p:/
/devopsreac.ons.tumblr.com/post/
Image&Cita*ons&(con*nued)
h"p:/
/i.imgur.com/dJ5jnB0.gif
h"p:/
/devopsreac:ons.tumblr.com/post/
61010641998/someChos:ngCcompaniesConC
availability
h"p:/
/i.imgur.com/QdVD216.gif
h"ps:/
/i.imgur.com/CXNOCBb.gif
h"p:/
/media.tumblr.com/
fe40a2da7c8e594479f48fd8450817d5/
tumblr_inline_nczuo9C9ov1raprkq.gif
h"p:/
/devopsreac:ons.tumblr.com/post/
72072493400/srmdsCserverCroomCmadnessC
Image&Cita*ons&(concluded)
h"p:/
/devopsreac.ons.tumblr.com/post/
79349198148/vendors<benchmarks
h"p:/
/devopsreac.ons.tumblr.com/post/
86295268875/cleaning<up<openssl<code
h"p:/
/devopsreac.ons.tumblr.com/post/
93197357391/security<hole
h"p:/
/devopsreac.ons.tumblr.com/post/
87581910878/trying<to<make<progress<on<monday
h"p:/
/devopsreac.ons.tumblr.com/post/
91731143332/doing<trial<and<error<with<chef

More Related Content

Similar to How SmartLogic Uses Chef-Dan Ivovich

Massive device deployment - EclipseCon 2011
Massive device deployment - EclipseCon 2011Massive device deployment - EclipseCon 2011
Massive device deployment - EclipseCon 2011Angelo van der Sijpt
 
Eventsourcing with PHP and MongoDB
Eventsourcing with PHP and MongoDBEventsourcing with PHP and MongoDB
Eventsourcing with PHP and MongoDBJacopo Nardiello
 
Dethroning Grunt: Simple and Effective Builds with gulp.js
Dethroning Grunt: Simple and Effective Builds with gulp.jsDethroning Grunt: Simple and Effective Builds with gulp.js
Dethroning Grunt: Simple and Effective Builds with gulp.jsJay Harris
 
Composer for Busy Developers - php|tek13
Composer for Busy Developers - php|tek13Composer for Busy Developers - php|tek13
Composer for Busy Developers - php|tek13Rafael Dohms
 
글로벌 CDN과 동적 웹 가속 기술 (Global CDN & Dynamic Web Acceleration) - FNet Grand Conf...
글로벌 CDN과 동적 웹 가속 기술 (Global CDN & Dynamic Web Acceleration) - FNet Grand Conf...글로벌 CDN과 동적 웹 가속 기술 (Global CDN & Dynamic Web Acceleration) - FNet Grand Conf...
글로벌 CDN과 동적 웹 가속 기술 (Global CDN & Dynamic Web Acceleration) - FNet Grand Conf...Junho Choi
 
Fixing Growing Pains With Puppet Data Patterns
Fixing Growing Pains With Puppet Data PatternsFixing Growing Pains With Puppet Data Patterns
Fixing Growing Pains With Puppet Data PatternsMartin Jackson
 
Using Ember to Make a Bazillion Dollars
Using Ember to Make a Bazillion DollarsUsing Ember to Make a Bazillion Dollars
Using Ember to Make a Bazillion DollarsMike Pack
 
Asynchronous programming patterns in Perl
Asynchronous programming patterns in PerlAsynchronous programming patterns in Perl
Asynchronous programming patterns in Perldeepfountainconsulting
 
R57php 1231677414471772-2
R57php 1231677414471772-2R57php 1231677414471772-2
R57php 1231677414471772-2ady36
 
Nodejs Explained with Examples
Nodejs Explained with ExamplesNodejs Explained with Examples
Nodejs Explained with ExamplesGabriele Lana
 
Nodejsexplained 101116115055-phpapp02
Nodejsexplained 101116115055-phpapp02Nodejsexplained 101116115055-phpapp02
Nodejsexplained 101116115055-phpapp02Sunny Gupta
 
Rapid Prototyping FTW!!!
Rapid Prototyping FTW!!!Rapid Prototyping FTW!!!
Rapid Prototyping FTW!!!cloudbring
 
Implementing Server Side Data Synchronization for Mobile Apps
Implementing Server Side Data Synchronization for Mobile AppsImplementing Server Side Data Synchronization for Mobile Apps
Implementing Server Side Data Synchronization for Mobile AppsMichele Orselli
 

Similar to How SmartLogic Uses Chef-Dan Ivovich (20)

HARE 2010 Review
HARE 2010 ReviewHARE 2010 Review
HARE 2010 Review
 
Massive device deployment - EclipseCon 2011
Massive device deployment - EclipseCon 2011Massive device deployment - EclipseCon 2011
Massive device deployment - EclipseCon 2011
 
Profiling for Grown-Ups
Profiling for Grown-UpsProfiling for Grown-Ups
Profiling for Grown-Ups
 
Ruby gems
Ruby gemsRuby gems
Ruby gems
 
Eventsourcing with PHP and MongoDB
Eventsourcing with PHP and MongoDBEventsourcing with PHP and MongoDB
Eventsourcing with PHP and MongoDB
 
Dethroning Grunt: Simple and Effective Builds with gulp.js
Dethroning Grunt: Simple and Effective Builds with gulp.jsDethroning Grunt: Simple and Effective Builds with gulp.js
Dethroning Grunt: Simple and Effective Builds with gulp.js
 
Composer for Busy Developers - php|tek13
Composer for Busy Developers - php|tek13Composer for Busy Developers - php|tek13
Composer for Busy Developers - php|tek13
 
Device deployment
Device deploymentDevice deployment
Device deployment
 
글로벌 CDN과 동적 웹 가속 기술 (Global CDN & Dynamic Web Acceleration) - FNet Grand Conf...
글로벌 CDN과 동적 웹 가속 기술 (Global CDN & Dynamic Web Acceleration) - FNet Grand Conf...글로벌 CDN과 동적 웹 가속 기술 (Global CDN & Dynamic Web Acceleration) - FNet Grand Conf...
글로벌 CDN과 동적 웹 가속 기술 (Global CDN & Dynamic Web Acceleration) - FNet Grand Conf...
 
All about Apache ACE
All about Apache ACEAll about Apache ACE
All about Apache ACE
 
Fixing Growing Pains With Puppet Data Patterns
Fixing Growing Pains With Puppet Data PatternsFixing Growing Pains With Puppet Data Patterns
Fixing Growing Pains With Puppet Data Patterns
 
Using Ember to Make a Bazillion Dollars
Using Ember to Make a Bazillion DollarsUsing Ember to Make a Bazillion Dollars
Using Ember to Make a Bazillion Dollars
 
Asynchronous programming patterns in Perl
Asynchronous programming patterns in PerlAsynchronous programming patterns in Perl
Asynchronous programming patterns in Perl
 
Transforming WebSockets
Transforming WebSocketsTransforming WebSockets
Transforming WebSockets
 
Having Fun with Play
Having Fun with PlayHaving Fun with Play
Having Fun with Play
 
R57php 1231677414471772-2
R57php 1231677414471772-2R57php 1231677414471772-2
R57php 1231677414471772-2
 
Nodejs Explained with Examples
Nodejs Explained with ExamplesNodejs Explained with Examples
Nodejs Explained with Examples
 
Nodejsexplained 101116115055-phpapp02
Nodejsexplained 101116115055-phpapp02Nodejsexplained 101116115055-phpapp02
Nodejsexplained 101116115055-phpapp02
 
Rapid Prototyping FTW!!!
Rapid Prototyping FTW!!!Rapid Prototyping FTW!!!
Rapid Prototyping FTW!!!
 
Implementing Server Side Data Synchronization for Mobile Apps
Implementing Server Side Data Synchronization for Mobile AppsImplementing Server Side Data Synchronization for Mobile Apps
Implementing Server Side Data Synchronization for Mobile Apps
 

More from SmartLogic

Writing Game Servers with Elixir
Writing Game Servers with ElixirWriting Game Servers with Elixir
Writing Game Servers with ElixirSmartLogic
 
All Aboard The Stateful Train
All Aboard The Stateful TrainAll Aboard The Stateful Train
All Aboard The Stateful TrainSmartLogic
 
DC |> Elixir Meetup - Going off the Rails into Elixir - Dan Ivovich
DC |> Elixir Meetup - Going off the Rails into Elixir - Dan IvovichDC |> Elixir Meetup - Going off the Rails into Elixir - Dan Ivovich
DC |> Elixir Meetup - Going off the Rails into Elixir - Dan IvovichSmartLogic
 
Monitoring Your Elixir Application with Prometheus
Monitoring Your Elixir Application with PrometheusMonitoring Your Elixir Application with Prometheus
Monitoring Your Elixir Application with PrometheusSmartLogic
 
Going Multi-Node
Going Multi-NodeGoing Multi-Node
Going Multi-NodeSmartLogic
 
Kubernetes and docker
Kubernetes and dockerKubernetes and docker
Kubernetes and dockerSmartLogic
 
Serializing Value Objects-Ara Hacopian
Serializing Value Objects-Ara HacopianSerializing Value Objects-Ara Hacopian
Serializing Value Objects-Ara HacopianSmartLogic
 
Guide to food foraging by SmartLogic's Kei Ellerbrock
Guide to food foraging by SmartLogic's Kei EllerbrockGuide to food foraging by SmartLogic's Kei Ellerbrock
Guide to food foraging by SmartLogic's Kei EllerbrockSmartLogic
 
Introduction to Type Script by Sam Goldman, SmartLogic
Introduction to Type Script by Sam Goldman, SmartLogicIntroduction to Type Script by Sam Goldman, SmartLogic
Introduction to Type Script by Sam Goldman, SmartLogicSmartLogic
 
A Few Interesting Things in Apple's Swift Programming Language
A Few Interesting Things in Apple's Swift Programming LanguageA Few Interesting Things in Apple's Swift Programming Language
A Few Interesting Things in Apple's Swift Programming LanguageSmartLogic
 
Effective ActiveRecord
Effective ActiveRecordEffective ActiveRecord
Effective ActiveRecordSmartLogic
 
An Introduction to Reactive Cocoa
An Introduction to Reactive CocoaAn Introduction to Reactive Cocoa
An Introduction to Reactive CocoaSmartLogic
 
iOS Development Methodology
iOS Development MethodologyiOS Development Methodology
iOS Development MethodologySmartLogic
 
CSS Preprocessors to the Rescue!
CSS Preprocessors to the Rescue!CSS Preprocessors to the Rescue!
CSS Preprocessors to the Rescue!SmartLogic
 
Deploying Rails Apps with Chef and Capistrano
 Deploying Rails Apps with Chef and Capistrano Deploying Rails Apps with Chef and Capistrano
Deploying Rails Apps with Chef and CapistranoSmartLogic
 
From Slacker to Hacker, Practical Tips for Learning to Code
From Slacker to Hacker, Practical Tips for Learning to CodeFrom Slacker to Hacker, Practical Tips for Learning to Code
From Slacker to Hacker, Practical Tips for Learning to CodeSmartLogic
 
The Language of Abstraction in Software Development
The Language of Abstraction in Software DevelopmentThe Language of Abstraction in Software Development
The Language of Abstraction in Software DevelopmentSmartLogic
 
Android Testing: An Overview
Android Testing: An OverviewAndroid Testing: An Overview
Android Testing: An OverviewSmartLogic
 
Intro to DTCoreText: Moving Past UIWebView | iOS Development
Intro to DTCoreText: Moving Past UIWebView | iOS DevelopmentIntro to DTCoreText: Moving Past UIWebView | iOS Development
Intro to DTCoreText: Moving Past UIWebView | iOS DevelopmentSmartLogic
 
Logstash: Get to know your logs
Logstash: Get to know your logsLogstash: Get to know your logs
Logstash: Get to know your logsSmartLogic
 

More from SmartLogic (20)

Writing Game Servers with Elixir
Writing Game Servers with ElixirWriting Game Servers with Elixir
Writing Game Servers with Elixir
 
All Aboard The Stateful Train
All Aboard The Stateful TrainAll Aboard The Stateful Train
All Aboard The Stateful Train
 
DC |> Elixir Meetup - Going off the Rails into Elixir - Dan Ivovich
DC |> Elixir Meetup - Going off the Rails into Elixir - Dan IvovichDC |> Elixir Meetup - Going off the Rails into Elixir - Dan Ivovich
DC |> Elixir Meetup - Going off the Rails into Elixir - Dan Ivovich
 
Monitoring Your Elixir Application with Prometheus
Monitoring Your Elixir Application with PrometheusMonitoring Your Elixir Application with Prometheus
Monitoring Your Elixir Application with Prometheus
 
Going Multi-Node
Going Multi-NodeGoing Multi-Node
Going Multi-Node
 
Kubernetes and docker
Kubernetes and dockerKubernetes and docker
Kubernetes and docker
 
Serializing Value Objects-Ara Hacopian
Serializing Value Objects-Ara HacopianSerializing Value Objects-Ara Hacopian
Serializing Value Objects-Ara Hacopian
 
Guide to food foraging by SmartLogic's Kei Ellerbrock
Guide to food foraging by SmartLogic's Kei EllerbrockGuide to food foraging by SmartLogic's Kei Ellerbrock
Guide to food foraging by SmartLogic's Kei Ellerbrock
 
Introduction to Type Script by Sam Goldman, SmartLogic
Introduction to Type Script by Sam Goldman, SmartLogicIntroduction to Type Script by Sam Goldman, SmartLogic
Introduction to Type Script by Sam Goldman, SmartLogic
 
A Few Interesting Things in Apple's Swift Programming Language
A Few Interesting Things in Apple's Swift Programming LanguageA Few Interesting Things in Apple's Swift Programming Language
A Few Interesting Things in Apple's Swift Programming Language
 
Effective ActiveRecord
Effective ActiveRecordEffective ActiveRecord
Effective ActiveRecord
 
An Introduction to Reactive Cocoa
An Introduction to Reactive CocoaAn Introduction to Reactive Cocoa
An Introduction to Reactive Cocoa
 
iOS Development Methodology
iOS Development MethodologyiOS Development Methodology
iOS Development Methodology
 
CSS Preprocessors to the Rescue!
CSS Preprocessors to the Rescue!CSS Preprocessors to the Rescue!
CSS Preprocessors to the Rescue!
 
Deploying Rails Apps with Chef and Capistrano
 Deploying Rails Apps with Chef and Capistrano Deploying Rails Apps with Chef and Capistrano
Deploying Rails Apps with Chef and Capistrano
 
From Slacker to Hacker, Practical Tips for Learning to Code
From Slacker to Hacker, Practical Tips for Learning to CodeFrom Slacker to Hacker, Practical Tips for Learning to Code
From Slacker to Hacker, Practical Tips for Learning to Code
 
The Language of Abstraction in Software Development
The Language of Abstraction in Software DevelopmentThe Language of Abstraction in Software Development
The Language of Abstraction in Software Development
 
Android Testing: An Overview
Android Testing: An OverviewAndroid Testing: An Overview
Android Testing: An Overview
 
Intro to DTCoreText: Moving Past UIWebView | iOS Development
Intro to DTCoreText: Moving Past UIWebView | iOS DevelopmentIntro to DTCoreText: Moving Past UIWebView | iOS Development
Intro to DTCoreText: Moving Past UIWebView | iOS Development
 
Logstash: Get to know your logs
Logstash: Get to know your logsLogstash: Get to know your logs
Logstash: Get to know your logs
 

Recently uploaded

Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Zilliz
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native ApplicationsWSO2
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Bhuvaneswari Subramani
 
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
 
WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...
WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...
WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...WSO2
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FMESafe Software
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Victor Rentea
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxRemote DBA Services
 
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
 
Choreo: Empowering the Future of Enterprise Software Engineering
Choreo: Empowering the Future of Enterprise Software EngineeringChoreo: Empowering the Future of Enterprise Software Engineering
Choreo: Empowering the Future of Enterprise Software EngineeringWSO2
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAndrey Devyatkin
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...DianaGray10
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Jeffrey Haguewood
 
JavaScript Usage Statistics 2024 - The Ultimate Guide
JavaScript Usage Statistics 2024 - The Ultimate GuideJavaScript Usage Statistics 2024 - The Ultimate Guide
JavaScript Usage Statistics 2024 - The Ultimate GuidePixlogix Infotech
 
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
 
Quantum Leap in Next-Generation Computing
Quantum Leap in Next-Generation ComputingQuantum Leap in Next-Generation Computing
Quantum Leap in Next-Generation ComputingWSO2
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2
 

Recently uploaded (20)

Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
 
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
 
WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...
WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...
WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptx
 
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
 
Choreo: Empowering the Future of Enterprise Software Engineering
Choreo: Empowering the Future of Enterprise Software EngineeringChoreo: Empowering the Future of Enterprise Software Engineering
Choreo: Empowering the Future of Enterprise Software Engineering
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
JavaScript Usage Statistics 2024 - The Ultimate Guide
JavaScript Usage Statistics 2024 - The Ultimate GuideJavaScript Usage Statistics 2024 - The Ultimate Guide
JavaScript Usage Statistics 2024 - The Ultimate Guide
 
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
 
Quantum Leap in Next-Generation Computing
Quantum Leap in Next-Generation ComputingQuantum Leap in Next-Generation Computing
Quantum Leap in Next-Generation Computing
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 

How SmartLogic Uses Chef-Dan Ivovich