SlideShare a Scribd company logo
HOW WE USED RUBY TO
BUILD LOCAWEB'S CLOUD
WILLIAN MOLINARI
a.k.a PotHix
MOTIVATION
WORKING AT LOCAWEB
on the past 3 years
A LOT OF KNOWN PEOPLE
WHICH PROBLEM WE WANTED TO SOLVE
CLOUD SERVER
CLOUD SERVER TECHNOLOGIES
Perl
Java
VMware
VMWARE ARCHITECTURE
PROBLEMS
for both technical and product sides
CLOUD SERVER PRO
CLOUD SERVER PRO TECHNOLOGIES
Ruby
Xenserver
XEN ARCHITECTURE
XENSERVER, XENAPI AND XMLRPC
with a python example
RUBY + XENAPI
https://github.com/locaweb/xenapi-ruby
XENAPI EXAMPLE - GET DISKS
reference:
vm_ref = session.VM.get_by_uuid(virtual_machine.uuid)
vm_vbds_refs = session.VM.get_record(vm_ref)["VBDs"]
disks = vm_vbds_refs.inject({}) do |disks, vm_vbd_ref|
vm_vbd_record = session.VBD.get_record(vm_vbd_ref)
if vm_vbd_record["type"] == "Disk"
disks[vm_vbd_ref] = vm_vbd_record
end
disks
Xenserver API documentation
XENAPI-RUBY HELPER FOR THIS CODE
# Get all disks for a VM
disks = virtual_machine.vbds
XENAPI-RUBY PROVIDES SOME HELPERS
But the way is still validXenAPI
STARTING INFRASTRUCTURE
One pool, one firewall (providing NAT) and one DHCP server
SOMETHING LIKE THIS...
ASYNC ALL OVER THE PLACE
started with andActiveMQ Stomp
DIFFERENT QUEUE IMPLEMENTATIONS
XMPP, ActiveMQ (+ Stomp), Resque
RESQUE IMPLEMENTATION EXAMPLE
app/consumers/resque/consumer.rb
require "consumers/resque/configuration"
module Resque
class Consumer
class << self
def queue(name)
@queue = name
end
...
XMPP IMPLEMENTATION EXAMPLE
app/consumers/xmpp/consumer.rb
require 'xmpp4r'
module XMPP
class Consumer
class << self
attr_reader :queue_name, :queued_process, :timeout_value
def queue(name)
@queue_name = "#{name}@localhost"
end
...
EASILY CHANGEABLE
app/consumers/consumer.rb
# -*- coding: UTF-8 -*-
Consumer = Resque::Consumer
RESQUE WON
BTW
VIRTUAL MACHINE INSTALLATION PROCESS
http://github.com/locaweb/bpmachine
BPMACHINE EXAMPLE
process :of => :install do
must_be :machine_created
transition :select_ips,
:from => :machine_created,
:to => :ips_selected
transition :queue_dhcp_for_install,
:from => :ips_selected,
:to => :dhcp_synchronized
...
AND THE STEPS
app/steps/install_steps.rb
module InstallSteps
def select_ips
log_activity(:info, :id => id, :status => 'starting')
create_ip(primary=true) unless primary_ip_pair
log_activity(:info, :id => id, :status => 'done')
end
def queue_dhcp_for_install
...
end
GET THE NAME AND IP
A different app to handle these
DHCP CONFIGURATION
isc-dhcp
DUMMY DHCP EXPLANATION
ISC DHCP FILE EXAMPLE
# cpro0007
host 3ea808bd-5ef0-4227-a617-f5b0694e408c{
hardware ethernet 00:25:22:bd:d1:20;
fixed-address 186.202.1.7;
option host-name "cpro0007";
}
# cpro0051
host 3ea808bd-5ef0-4227-a617-cf5b0694e408 {
hardware ethernet 00:25:22:bd:d1:21;
fixed-address 186.202.1.8;
option host-name "cpro0051";
}
ERB FILE
<% vms.each do |vm| %>
# <%= vm.name %>
host <%= vm.uuid %> {
hardware ethernet <%= vm.mac %>;
fixed-address <%= vm.private_ip.address %>;
option host-name "<%= vm.name %>";
}
<% end %>
SIMPLE SCRIPT FOR DHCP
# Prepare isc dhcp file
echo -e "<%= dhcp_config %>" > /etc/dhcp/<%= Config[:dhcp_conf_file] %>
# Restart DHCP
sudo /etc/init.d/isc-dhcp-server restart
NET::SSH AS TRANSPORT LAYER
Net::SSH.start(@host, @user, ssh_options) do |ssh|
ssh_result = ssh.open_channel do |channel|
channel.request_pty do |chn, success|
raise "Could not obtain pty from ssh" unless success
chn[:out] = ""
chn.exec command
...
FIREWALL CONFIGURATIONS
default DROP
ADDING SOME FIREWALL RULES
iptables -A <%= internal_address %>/32 
-p <%= rule.filter_protocol %> 
-s <%= rule.filter_address %> 
-d <%= internal_address %> 
--dport <%= rule.filter_port %> 
-j ACCEPT
CONFIGURING NAT
# Configuring NAT
...
iptables -t nat -A PREROUTING -d <%= rule.external_address %> 
-j DNAT --to-destination <%= rule.internal_address %>
iptables -t nat -A POSTROUTING -s <%= rule.internal_address %> 
-j SNAT --to-source <%= rule.external_address %>
...
VNC ACCESS
Provided by Xen VNC Proxy (a.k.a XVP)
EXAMPLE XVP FILE
POOL XENSERVERPOOL1
DOMAIN ""
MANAGER root proxy_password_encrypted_hash
HOST 10.20.30.40
VM 7890 4344dc8f-1bdd-4b65-812a-a0dc9b27256e console1_encrypted_pass
VM 7891 c5b2d28e-4c11-492f-9d09-33670876cb4a console2_encrypted_pass
GENERATED FROM XVP BINARY
# for hosts
/bin/echo -e "proxy_password_here" | /usr/sbin/xvp -x
# for each console
/bin/echo -e "console_password_here" | /usr/sbin/xvp -e
WAIT...XVP IS OPEN SOURCE
RUBY VERSION
coisa linda!
def encrypt_vnc(password)
key = [0xc1, 0x24, 0x08, 0x99, 0xc2, 0x26, 0x07, 0x05]
des = OpenSSL::Cipher::Cipher.new("des-ecb")
des.key = key.map(&:chr).join
des.encrypt
des.update(password).unpack('H*').first
end
POST INSTALL PROCESS
VM already shipped by Xen
WINDOWS? LINUX?
Specialized post install
DONE BY VIRTUAL MACHINE TYPE
def post_installers
{ :windows2003 => PostInstall::Windows,
:windows2008 => PostInstall::Windows,
:linux => PostInstall::Linux }
end
...
def post_install
post_installers[code.to_sym].new
end
SIMPLIFIED, OF COURSE... WE HAVE:
centos5, centos6, ubuntu9.04, ubuntu9.10, ubuntu10.04,
ubuntu10.10, debian5, debian6, windows2003, ...
AND MANAGED ONES!
linux + cpanel, linux + plesk, windows + plesk, ...
LINUX POST INSTALL
SSH and bash scripts
WINDOWS POST INSTALL
and powershell scriptsWinrm
PARTITIONING DISKS EXAMPLE
for Linux and for WindowsLVM Diskpart
MORE AND MORE STEPS
Added basic monitoring
Configure DNS
VM cleanup
and so on...
AND WE'RE DONE!
production ready
SHIPPED WITH A SIMPLE ARCHITECTURE
MULTI POOL
"all your pools are belong to us"
MULTI POOL
MATRIX MACHINES
and their maintenance
A WILD WINDOWS MATRIX MACHINE
APPEARED!
SECURITY FIX RELEASED
SECURITY FIX APPLIED
OK...BUT WE HAVE MORE!
WE CAN DEAL WITH IT!
BUT....WAT!
NUMBERS!
~ 7000 VMs
~ 25 pools
~ 300 hosts
XEN IMPORT AND EXPORT
not so well documented
USING HTTP!
def export(vm_uuid, options = {})
options = {:to => "/tmp/export_file"}.merge(options)
file = File.open(options[:to], "wb")
session_ref = self.key
task_ref = self.task.create "export vm #{vm_uuid}", "export job"
path = "/export?session_id=#{session_ref} ... "
uri = URI.parse "http://#{master_address}#{path}"
Net::HTTP.get_response(uri) do |res|
res.read_body {|chunk| file.write chunk }
end
options[:to]
ensure
file.close rescue nil
self.task.destroy(task_ref) rescue nil
end
MULTI STORAGE
or...datasets!
MULTI FIREWALL
avoiding package overflow
SO BASICALLY...WE HAVE THIS:
TIME TO BREAK RESPONSABILITIES
by improving the infrastructure
NEW NETWORK INFRASTRUCTURE
dedicated servers for firewall and dhcp
BEFORE
NOW
QUANTUM
from the openstack project
QUANTUM + OPENVSWITCH
to useLocaweb quantum plugin openvswitch
NOT SSH ANYMORE
Queueing and consuming using RabbitMQ
NEW FIREWALL AND DHCP ARCHITECTURE
NEW HYPERVISORS TO SUPPORT
KVM, VMware
SIMPLESTACK!
https://github.com/locaweb/simplestack
A PROXY FOR HYPERVISORS
SIMPLESTACK INSTEAD OF XENAPI DIRECTLY
Using
# Old xenapi code
session.VM.get_by_uuid(virtual_machine.uuid)
# Simplestack
pool.on_simplestack.guests.find(virtual_machine.uuid)
ruby simplestack client
FEATURES WORTH MENTIONING
AUTOSCALE AND ALERTS
driven by monitoring
LEELA
https://github.com/locaweb/leela
THE FLOW
JUST MESSAGING
BLATHER AND DAEMON TOOLS
require 'blather/client'
DaemonKit::Application.running!
message :chat?, :body do |m|
begin
if Weatherman::Message.should_process?(m)
message = JSON.parse(m.body, :allow_nan => true)["results"]
unless message["event"].nil?
Weatherman::Message.process(message["event"])
end
end
rescue => e
DaemonKit.logger.error "Invalid message #{m.body}"
DaemonKit.logger.error e.backtrace
end
end
HETEROGENEOUS ENVIRONMENT
new features and support for all versions!
XEN POOL KNOWS ITS NETWORK VERSION
# -*- coding: UTF-8 -*-
module Network
module Manager
extend self
def for(pool)
pool.network_version.constantize.new
end
end
end
DIFFERENT BEHAVIORS FROM VERSION 1
# -*- coding: UTF-8 -*-
module Network
class Ver1
def internal_vlan?
true
end
def installation_ip(vm)
vm.public_ip.address
end
end
end
TO NETWORK VERSION 2
# -*- coding: UTF-8 -*-
module Network
class Ver2
def internal_vlan?
false
end
def installation_ip(vm)
vm.on_simplestack.ip
end
end
end
MULTIPLE IMPLEMENTATIONS FOR:
network configurations
firewall implementations
post install methods
LESSONS LEARNED
Start small and grow fast
OOP helps a lot to keep the code organized
Multiple projects
Multiple languages
THANKS!
BY WILLIAN MOLINARI (POTHIX)

More Related Content

What's hot

What's hot (20)

Ansible - Swiss Army Knife Orchestration
Ansible - Swiss Army Knife OrchestrationAnsible - Swiss Army Knife Orchestration
Ansible - Swiss Army Knife Orchestration
 
Ansible - Crash course
Ansible - Crash courseAnsible - Crash course
Ansible - Crash course
 
Testing your infrastructure with litmus
Testing your infrastructure with litmusTesting your infrastructure with litmus
Testing your infrastructure with litmus
 
Ansible leveraging 2.0
Ansible leveraging 2.0Ansible leveraging 2.0
Ansible leveraging 2.0
 
Using Ansible Dynamic Inventory with Amazon EC2
Using Ansible Dynamic Inventory with Amazon EC2Using Ansible Dynamic Inventory with Amazon EC2
Using Ansible Dynamic Inventory with Amazon EC2
 
Fullstack conf 2017 - Basic dev pipeline end-to-end
Fullstack conf 2017 - Basic dev pipeline end-to-endFullstack conf 2017 - Basic dev pipeline end-to-end
Fullstack conf 2017 - Basic dev pipeline end-to-end
 
Ansible : what's ansible & use case by REX
Ansible :  what's ansible & use case by REXAnsible :  what's ansible & use case by REX
Ansible : what's ansible & use case by REX
 
Integrating icinga2 and the HashiCorp suite
Integrating icinga2 and the HashiCorp suiteIntegrating icinga2 and the HashiCorp suite
Integrating icinga2 and the HashiCorp suite
 
Bootstrapping multidc observability stack
Bootstrapping multidc observability stackBootstrapping multidc observability stack
Bootstrapping multidc observability stack
 
Rapid Infrastructure Provisioning
Rapid Infrastructure ProvisioningRapid Infrastructure Provisioning
Rapid Infrastructure Provisioning
 
Creating Reusable Puppet Profiles
Creating Reusable Puppet ProfilesCreating Reusable Puppet Profiles
Creating Reusable Puppet Profiles
 
Ansible for beginners ...?
Ansible for beginners ...?Ansible for beginners ...?
Ansible for beginners ...?
 
Ansible roles done right
Ansible roles done rightAnsible roles done right
Ansible roles done right
 
Write php deploy everywhere
Write php deploy everywhereWrite php deploy everywhere
Write php deploy everywhere
 
Refactoring terraform
Refactoring terraformRefactoring terraform
Refactoring terraform
 
Hacking ansible
Hacking ansibleHacking ansible
Hacking ansible
 
Network Automation: Ansible 102
Network Automation: Ansible 102Network Automation: Ansible 102
Network Automation: Ansible 102
 
Automation and Ansible
Automation and AnsibleAutomation and Ansible
Automation and Ansible
 
Asynchronous Threads in Lasso 8.5
Asynchronous Threads in Lasso 8.5Asynchronous Threads in Lasso 8.5
Asynchronous Threads in Lasso 8.5
 
Ansible loves Python, Python Philadelphia meetup
Ansible loves Python, Python Philadelphia meetupAnsible loves Python, Python Philadelphia meetup
Ansible loves Python, Python Philadelphia meetup
 

Similar to How we used ruby to build locaweb's cloud (http://presentations.pothix.com/rubyconf2013/)

Python Deployment with Fabric
Python Deployment with FabricPython Deployment with Fabric
Python Deployment with Fabric
andymccurdy
 
Railsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slideshareRailsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slideshare
tomcopeland
 
From Dev to DevOps - Codemotion ES 2012
From Dev to DevOps - Codemotion ES 2012From Dev to DevOps - Codemotion ES 2012
From Dev to DevOps - Codemotion ES 2012
Carlos Sanchez
 
Deployment with Fabric
Deployment with FabricDeployment with Fabric
Deployment with Fabric
andymccurdy
 
Puppet for Java developers - JavaZone NO 2012
Puppet for Java developers - JavaZone NO 2012Puppet for Java developers - JavaZone NO 2012
Puppet for Java developers - JavaZone NO 2012
Carlos Sanchez
 
fog or: How I Learned to Stop Worrying and Love the Cloud (OpenStack Edition)
fog or: How I Learned to Stop Worrying and Love the Cloud (OpenStack Edition)fog or: How I Learned to Stop Worrying and Love the Cloud (OpenStack Edition)
fog or: How I Learned to Stop Worrying and Love the Cloud (OpenStack Edition)
Wesley Beary
 

Similar to How we used ruby to build locaweb's cloud (http://presentations.pothix.com/rubyconf2013/) (20)

infra-as-code
infra-as-codeinfra-as-code
infra-as-code
 
Wordpress y Docker, de desarrollo a produccion
Wordpress y Docker, de desarrollo a produccionWordpress y Docker, de desarrollo a produccion
Wordpress y Docker, de desarrollo a produccion
 
Python Deployment with Fabric
Python Deployment with FabricPython Deployment with Fabric
Python Deployment with Fabric
 
Railsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slideshareRailsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slideshare
 
Running Docker in Development & Production (#ndcoslo 2015)
Running Docker in Development & Production (#ndcoslo 2015)Running Docker in Development & Production (#ndcoslo 2015)
Running Docker in Development & Production (#ndcoslo 2015)
 
Cutting through the fog of cloud
Cutting through the fog of cloudCutting through the fog of cloud
Cutting through the fog of cloud
 
From Dev to DevOps - Codemotion ES 2012
From Dev to DevOps - Codemotion ES 2012From Dev to DevOps - Codemotion ES 2012
From Dev to DevOps - Codemotion ES 2012
 
Building cloud stack at scale
Building cloud stack at scaleBuilding cloud stack at scale
Building cloud stack at scale
 
Deployment with Fabric
Deployment with FabricDeployment with Fabric
Deployment with Fabric
 
Getting instantly up and running with Docker and Symfony
Getting instantly up and running with Docker and SymfonyGetting instantly up and running with Docker and Symfony
Getting instantly up and running with Docker and Symfony
 
Software Defined Datacenter
Software Defined DatacenterSoftware Defined Datacenter
Software Defined Datacenter
 
Puppet for Java developers - JavaZone NO 2012
Puppet for Java developers - JavaZone NO 2012Puppet for Java developers - JavaZone NO 2012
Puppet for Java developers - JavaZone NO 2012
 
Introduction to WP-CLI: Manage WordPress from the command line
Introduction to WP-CLI: Manage WordPress from the command lineIntroduction to WP-CLI: Manage WordPress from the command line
Introduction to WP-CLI: Manage WordPress from the command line
 
Rack
RackRack
Rack
 
Docker in Action
Docker in ActionDocker in Action
Docker in Action
 
Harmonious Development: Via Vagrant and Puppet
Harmonious Development: Via Vagrant and PuppetHarmonious Development: Via Vagrant and Puppet
Harmonious Development: Via Vagrant and Puppet
 
fog or: How I Learned to Stop Worrying and Love the Cloud
fog or: How I Learned to Stop Worrying and Love the Cloudfog or: How I Learned to Stop Worrying and Love the Cloud
fog or: How I Learned to Stop Worrying and Love the Cloud
 
Docker Security workshop slides
Docker Security workshop slidesDocker Security workshop slides
Docker Security workshop slides
 
fog or: How I Learned to Stop Worrying and Love the Cloud (OpenStack Edition)
fog or: How I Learned to Stop Worrying and Love the Cloud (OpenStack Edition)fog or: How I Learned to Stop Worrying and Love the Cloud (OpenStack Edition)
fog or: How I Learned to Stop Worrying and Love the Cloud (OpenStack Edition)
 
How to create your own hack environment
How to create your own hack environmentHow to create your own hack environment
How to create your own hack environment
 

More from Willian Molinari

Abertura do ruby_rails_no_mundo_real_guru_sp
Abertura do ruby_rails_no_mundo_real_guru_spAbertura do ruby_rails_no_mundo_real_guru_sp
Abertura do ruby_rails_no_mundo_real_guru_sp
Willian Molinari
 

More from Willian Molinari (16)

Desconstruindo a web
Desconstruindo a webDesconstruindo a web
Desconstruindo a web
 
Mesos
MesosMesos
Mesos
 
As escolhas do desenvolvedor
As escolhas do desenvolvedorAs escolhas do desenvolvedor
As escolhas do desenvolvedor
 
Desenvolvimento de jogos com HTML5 e javascript
Desenvolvimento de jogos com HTML5 e javascriptDesenvolvimento de jogos com HTML5 e javascript
Desenvolvimento de jogos com HTML5 e javascript
 
Javascript and browser games
Javascript and browser gamesJavascript and browser games
Javascript and browser games
 
Html5, gamedev e o skeleton jigsaw
Html5, gamedev e o skeleton jigsawHtml5, gamedev e o skeleton jigsaw
Html5, gamedev e o skeleton jigsaw
 
Ruby e xmpp
Ruby e xmppRuby e xmpp
Ruby e xmpp
 
Game network programming
Game network programmingGame network programming
Game network programming
 
Locasberos
LocasberosLocasberos
Locasberos
 
Simplestack
SimplestackSimplestack
Simplestack
 
Implementações paralelas
Implementações paralelasImplementações paralelas
Implementações paralelas
 
TDC2011 - Desenvolvimento de jogos com Javascript e HTML5
TDC2011 - Desenvolvimento de jogos com Javascript e HTML5TDC2011 - Desenvolvimento de jogos com Javascript e HTML5
TDC2011 - Desenvolvimento de jogos com Javascript e HTML5
 
FLISOL SJC - Desenvolvimento de jogos com javascrit e HTML5
FLISOL SJC - Desenvolvimento de jogos com javascrit e HTML5FLISOL SJC - Desenvolvimento de jogos com javascrit e HTML5
FLISOL SJC - Desenvolvimento de jogos com javascrit e HTML5
 
Abertura do ruby_rails_no_mundo_real_guru_sp
Abertura do ruby_rails_no_mundo_real_guru_spAbertura do ruby_rails_no_mundo_real_guru_sp
Abertura do ruby_rails_no_mundo_real_guru_sp
 
Vim
VimVim
Vim
 
What is and how does work RubyLearning.org
What is and how does work RubyLearning.orgWhat is and how does work RubyLearning.org
What is and how does work RubyLearning.org
 

Recently uploaded

Search and Society: Reimagining Information Access for Radical Futures
Search and Society: Reimagining Information Access for Radical FuturesSearch and Society: Reimagining Information Access for Radical Futures
Search and Society: Reimagining Information Access for Radical Futures
Bhaskar Mitra
 

Recently uploaded (20)

Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...
 
Powerful Start- the Key to Project Success, Barbara Laskowska
Powerful Start- the Key to Project Success, Barbara LaskowskaPowerful Start- the Key to Project Success, Barbara Laskowska
Powerful Start- the Key to Project Success, Barbara Laskowska
 
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMsTo Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
 
UiPath Test Automation using UiPath Test Suite series, part 1
UiPath Test Automation using UiPath Test Suite series, part 1UiPath Test Automation using UiPath Test Suite series, part 1
UiPath Test Automation using UiPath Test Suite series, part 1
 
JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and Grafana
 
Search and Society: Reimagining Information Access for Radical Futures
Search and Society: Reimagining Information Access for Radical FuturesSearch and Society: Reimagining Information Access for Radical Futures
Search and Society: Reimagining Information Access for Radical Futures
 
Salesforce Adoption – Metrics, Methods, and Motivation, Antone Kom
Salesforce Adoption – Metrics, Methods, and Motivation, Antone KomSalesforce Adoption – Metrics, Methods, and Motivation, Antone Kom
Salesforce Adoption – Metrics, Methods, and Motivation, Antone Kom
 
Agentic RAG What it is its types applications and implementation.pdf
Agentic RAG What it is its types applications and implementation.pdfAgentic RAG What it is its types applications and implementation.pdf
Agentic RAG What it is its types applications and implementation.pdf
 
Exploring UiPath Orchestrator API: updates and limits in 2024 🚀
Exploring UiPath Orchestrator API: updates and limits in 2024 🚀Exploring UiPath Orchestrator API: updates and limits in 2024 🚀
Exploring UiPath Orchestrator API: updates and limits in 2024 🚀
 
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
 
Integrating Telephony Systems with Salesforce: Insights and Considerations, B...
Integrating Telephony Systems with Salesforce: Insights and Considerations, B...Integrating Telephony Systems with Salesforce: Insights and Considerations, B...
Integrating Telephony Systems with Salesforce: Insights and Considerations, B...
 
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
 
SOQL 201 for Admins & Developers: Slice & Dice Your Org’s Data With Aggregate...
SOQL 201 for Admins & Developers: Slice & Dice Your Org’s Data With Aggregate...SOQL 201 for Admins & Developers: Slice & Dice Your Org’s Data With Aggregate...
SOQL 201 for Admins & Developers: Slice & Dice Your Org’s Data With Aggregate...
 
Knowledge engineering: from people to machines and back
Knowledge engineering: from people to machines and backKnowledge engineering: from people to machines and back
Knowledge engineering: from people to machines and back
 
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
 
Custom Approval Process: A New Perspective, Pavel Hrbacek & Anindya Halder
Custom Approval Process: A New Perspective, Pavel Hrbacek & Anindya HalderCustom Approval Process: A New Perspective, Pavel Hrbacek & Anindya Halder
Custom Approval Process: A New Perspective, Pavel Hrbacek & Anindya Halder
 
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualitySoftware Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
 
Behind the Scenes From the Manager's Chair: Decoding the Secrets of Successfu...
Behind the Scenes From the Manager's Chair: Decoding the Secrets of Successfu...Behind the Scenes From the Manager's Chair: Decoding the Secrets of Successfu...
Behind the Scenes From the Manager's Chair: Decoding the Secrets of Successfu...
 
The architecture of Generative AI for enterprises.pdf
The architecture of Generative AI for enterprises.pdfThe architecture of Generative AI for enterprises.pdf
The architecture of Generative AI for enterprises.pdf
 
10 Differences between Sales Cloud and CPQ, Blanka Doktorová
10 Differences between Sales Cloud and CPQ, Blanka Doktorová10 Differences between Sales Cloud and CPQ, Blanka Doktorová
10 Differences between Sales Cloud and CPQ, Blanka Doktorová
 

How we used ruby to build locaweb's cloud (http://presentations.pothix.com/rubyconf2013/)