SlideShare a Scribd company logo
1 of 60
Download to read offline
You’re Going To Need A
Bigger Toolbox

DIBI 28th April 2010


gareth rushgrove | morethanseven.net   http://www.flickr.com/photos/booleansplit/2376359338/
morethanseven.net




Gareth Rushgrove


gareth rushgrove | morethanseven.net
We Used To Just Build Websites


gareth rushgrove | morethanseven.net
Probably Simple Websites


gareth rushgrove | morethanseven.net
Maybe the odd Ecommerce Site


gareth rushgrove | morethanseven.net
Then We Built Web Applications


gareth rushgrove | morethanseven.net
Now We Just Build.


gareth rushgrove | morethanseven.net
Your Toolbox is Growing


gareth rushgrove | morethanseven.net   http://www.flickr.com/photos/gordonr/42555739
1
Embrace Heterogeneous Environments


gareth rushgrove | morethanseven.net   http://www.flickr.com/photos/mk1971/2548492513/
1
No Development Tool Silver Bullet


gareth rushgrove | morethanseven.net   http://www.flickr.com/photos/mk1971/2548492513/
We Build Websites With...


gareth rushgrove | morethanseven.net   http://www.flickr.com/photos/freefoto/3436970425/
PHP, MySQL, Apache


gareth rushgrove | morethanseven.net
.NET, MSSQL, IIS


gareth rushgrove | morethanseven.net
Java, Oracle, Tomcat


gareth rushgrove | morethanseven.net
Lots of Others


gareth rushgrove | morethanseven.net
Just One Stack?


gareth rushgrove | morethanseven.net   http://www.flickr.com/photos/harrygoldenfeld/4263710200/
The Guardian Java, Python, Oracle, App Engine


gareth rushgrove | morethanseven.net
LastFM PHP, C++, Java, Hadoop, Python


gareth rushgrove | morethanseven.net
GitHub Ruby, Erlang, MySQL, Redis, Sinatra


gareth rushgrove | morethanseven.net
Twitter Ruby, Scala, Java, C/C++


gareth rushgrove | morethanseven.net
Facebook PHP, Erlang, C, MySQL, Cassandra


gareth rushgrove | morethanseven.net
2
2. Know When Your Stack is out of its Depth


gareth rushgrove | morethanseven.net   http://www.flickr.com/photos/dk_spook/2421009077/
What Should You Know About?


gareth rushgrove | morethanseven.net   http://www.flickr.com/photos/takomabibelot/220265100/
wiki.nginx.org




Serve Web Pages With Nginx


gareth rushgrove | morethanseven.net
“Apache is like Microsoft Word, it has a
        million options but you only need six. Nginx
        does those six things, and it does five of
        them 50 times faster than Apache.
        Chris Lea




Why Nginx


gareth rushgrove | morethanseven.net
server {
               listen 80;
               server_name www.example.com;

                    location / {
                        root /var/www/example.com;
                    }
            }




Nginx Example


gareth rushgrove | morethanseven.net
http {
               upstream php {
                   server localhost:8002;
               }
               upstream python {
                   server localhost:8003;
               }
            }

            server {
               server_name www.example.com;
               location / {
                     proxy_pass http://python;
               }
               location ~ /basket/* {
                     proxy_pass http://php;
               }
            }



Nginx Example


gareth rushgrove | morethanseven.net
- Thin - http://code.macournoyer.com/thin/
       - Mongrel - http://github.com/fauna/mongrel/
       - Spawning - http://pypi.python.org/pypi/Spawning/
       - Unicorn - http://github.com/defunkt/unicorn/




Also See


gareth rushgrove | morethanseven.net
memcached.org




Caching with Memcached


gareth rushgrove | morethanseven.net
from django.core.cache import cache

            key = "/about/"
            content = cache.get(key)
            if not content:
                # expensive query to get content
                cache.set(key, content, 300)




Memcached Example


gareth rushgrove | morethanseven.net
- Squid - http://www.squid-cache.org
       - Varnish - http://varnish-cache.org




Also See


gareth rushgrove | morethanseven.net
lucene.apache.org/solr/




Search with Solr


gareth rushgrove | morethanseven.net
http://solr:8983/solr/products/select/
                ?q=colour:red
                &sort=price%20desc
                &rows=60
                &wt=json




Solr Example


gareth rushgrove | morethanseven.net
- Xapian - http://xapian.org
       - Sphinx - http://sphinxsearch.com
       - Nutch - http://lucene.apache.org/nutch/
       - Whoosh - http://whoosh.ca




Also See


gareth rushgrove | morethanseven.net
rabbitmq.com




Asynchronous Processing with RabbitMQ


gareth rushgrove | morethanseven.net
require 'carrot'

            q = Carrot.queue('carrot', :durable => true)
            10.times do |num|
              q.publish(num.to_s)
            end




RabbitMQ Enqueue Example


gareth rushgrove | morethanseven.net
puts "count: #{q.message_count}"

            while msg = q.pop(:ack => true)
              puts msg
              q.ack
            end

            Carrot.stop




RabbitMQ Dequeue Example


gareth rushgrove | morethanseven.net
- Apache ActiveMQ - http://activemq.apache.org
       - Beanstalk - http://kr.github.com/beanstalkd/
       - Stomp Server - http://stomp.codehaus.org
       - MemcacheQ - http://memcachedb.org/memcacheq/




Also See


gareth rushgrove | morethanseven.net
couchdb.apache.org




Data Storage With CouchDB


gareth rushgrove | morethanseven.net
<?php

                  $options['host'] = "localhost";
                  $options['port'] = 5984;

                  $couch = new CouchSimple($options);

                  $resp = $couch->send("PUT", "/test");

                  $resp = $couch->send("PUT", "/test/123",
                  '{"_id":"123","data":"Foo"}');

       ?>



CouchDB Example


gareth rushgrove | morethanseven.net
<?php

                  $options['host'] = "localhost";
                  $options['port'] = 5984;

                  $couch = new CouchSimple($options);

                  $resp = $couch->send("GET", "/test/_all_docs");

                  $resp = $couch->send("GET", "/test/123");

                  $resp = $couch->send("DELETE", "/test/");

       ?>



CouchDB Example


gareth rushgrove | morethanseven.net
- MongoDB - http://www.mongodb.org
       - Tokyo Tyrant - http://1978th.net/tokyotyrant/
       - Cassandra - http://cassandra.apache.org
       - Redis - http://code.google.com/p/redis/




Also See


gareth rushgrove | morethanseven.net
hadoop.apache.org




Data Mining With Hive


gareth rushgrove | morethanseven.net
CREATE TABLE u_data (
              userid INT,
              movieid INT,
              rating INT,
              unixtime STRING)
            ROW FORMAT DELIMITED
            FIELDS TERMINATED BY 't'
            STORED AS TEXTFILE;




Hive Create Example
Cucumber DSL Example


gareth rushgrove | morethanseven.net
LOAD DATA LOCAL INPATH 'data.txt' OVERWRITE
            INTO TABLE u_data;

            SELECT COUNT(1) FROM u_data;




Hive Load DSL Example
Cucumber Example


gareth rushgrove | morethanseven.net
add FILE weekday_mapper.py;

            INSERT OVERWRITE TABLE u_data_new
            SELECT
              TRANSFORM (userid, movieid, rating, unixtime)
              USING 'python weekday_mapper.py'
              AS (userid, movieid, rating, weekday)
            FROM u_data;

            SELECT weekday, COUNT(1)
            FROM u_data_new
            GROUP BY weekday;



Hive Map Reduce Example
Cucumber DSL Example


gareth rushgrove | morethanseven.net
- Hadoop - http://hadoop.apache.org
       - Hive - http://wiki.apache.org/hadoop/Hive/
       - Pig - http://hadoop.apache.org/pig/
       - Dumbo - http://lastfm.com/dumbo/
       - Disco - http://discoproject.org




Also See


gareth rushgrove | morethanseven.net
cukes.info




Testing with Cucumber


gareth rushgrove | morethanseven.net
Feature: google.co.uk
                To broaden their knowledge
                A user should be able
                To search for things

                       Scenario: Searching for things
                           Given I visit "http://www.google.co.uk"
                           When I fill in "q" with "wikipedia"
                           And I press "Google Search"
                           Then I should see "www.wikipedia.org"




Cucumber DSL Example


gareth rushgrove | morethanseven.net
Feature: google.co.uk
                To broaden their knowledge
                A user should be able
                To search for things

                       Scenario: Searching for things
                           Given I visit "http://www.google.co.uk"
                           When I fill in "q" with "wikipedia"
                           And I press "Google Search"
                           Then I should see "www.wikipedia.org"


            1 scenario (1 failed)
            4 steps (1 failed, 2 skipped, 1 passed)
            0m0.332s


Cucumber Results Example


gareth rushgrove | morethanseven.net
puppetlabs.com




Server Provisioning with Puppet


gareth rushgrove | morethanseven.net
class baseclass {
                $packagelist = ["sudo", "openssh-server"]
                package { $packagelist: ensure => installed }
                service { sshd:
                    name => "ssh",
                    enable => true,
                    ensure => running
                }
            }




Puppet Class Example


gareth rushgrove | morethanseven.net
node 'example.com' inherits basenode {
                $packagelist = ["nginx"]
                package { $packagelist: ensure => installed }
                service { "nginx":
                    ensure => running,
                    require => Package["nginx"]
                }
            }




Puppet Node Example


gareth rushgrove | morethanseven.net
- Chef - http://wiki.opscode.com/display/chef/Home/




Also See


gareth rushgrove | morethanseven.net
Conclusions


gareth rushgrove | morethanseven.net   http://www.flickr.com/photos/batega/1596898776/
1
Know What's Possible


gareth rushgrove | morethanseven.net   http://www.flickr.com/photos/docman/36125185/
2
Look for Opportunities


gareth rushgrove | morethanseven.net   http://www.flickr.com/photos/kgregory/500456103/
3
Experiment


gareth rushgrove | morethanseven.net   http://www.flickr.com/photos/seeminglee/3967329241/
4
Manage Complexity


gareth rushgrove | morethanseven.net   http://www.flickr.com/photos/30890318@N06/3510161637/
Questions?


gareth rushgrove | morethanseven.net   http://flickr.com/photos/psd/102332391/

More Related Content

What's hot

What's hot (14)

Scaling WordPress
Scaling WordPressScaling WordPress
Scaling WordPress
 
API analytics with Redis and Google Bigquery. NoSQL matters edition
API analytics with Redis and Google Bigquery. NoSQL matters editionAPI analytics with Redis and Google Bigquery. NoSQL matters edition
API analytics with Redis and Google Bigquery. NoSQL matters edition
 
Apache Spark & Hadoop : Train-the-trainer
Apache Spark & Hadoop : Train-the-trainerApache Spark & Hadoop : Train-the-trainer
Apache Spark & Hadoop : Train-the-trainer
 
DansGuardian open source content filtering
DansGuardian open source content filteringDansGuardian open source content filtering
DansGuardian open source content filtering
 
Nginx + PHP
Nginx + PHPNginx + PHP
Nginx + PHP
 
OSMC 2014: Processing millions of logs with Logstash and integrating with Ela...
OSMC 2014: Processing millions of logs with Logstash and integrating with Ela...OSMC 2014: Processing millions of logs with Logstash and integrating with Ela...
OSMC 2014: Processing millions of logs with Logstash and integrating with Ela...
 
curl better
curl bettercurl better
curl better
 
Install Apache Hadoop for Development/Production
Install Apache Hadoop for  Development/ProductionInstall Apache Hadoop for  Development/Production
Install Apache Hadoop for Development/Production
 
Web program-peformance-optimization
Web program-peformance-optimizationWeb program-peformance-optimization
Web program-peformance-optimization
 
Conquering the command line for code hackers
Conquering the command line for code hackersConquering the command line for code hackers
Conquering the command line for code hackers
 
Bigdata for small pockets, by Javier Ramirez from teowaki. RubyC Kiev 2014
Bigdata for small pockets, by Javier Ramirez from teowaki. RubyC Kiev 2014Bigdata for small pockets, by Javier Ramirez from teowaki. RubyC Kiev 2014
Bigdata for small pockets, by Javier Ramirez from teowaki. RubyC Kiev 2014
 
mri ruby gil
mri ruby gilmri ruby gil
mri ruby gil
 
LogStash - Yes, logging can be awesome
LogStash - Yes, logging can be awesomeLogStash - Yes, logging can be awesome
LogStash - Yes, logging can be awesome
 
Analyse Tweets using Flume 1.4, Hadoop 2.7 and Hive
Analyse Tweets using Flume 1.4, Hadoop 2.7 and HiveAnalyse Tweets using Flume 1.4, Hadoop 2.7 and Hive
Analyse Tweets using Flume 1.4, Hadoop 2.7 and Hive
 

Viewers also liked (7)

Introduction to ZeroMQ
Introduction to ZeroMQIntroduction to ZeroMQ
Introduction to ZeroMQ
 
ZeroMQ
ZeroMQZeroMQ
ZeroMQ
 
Roman Kuznietsov: Zeromq: sockets on steroids.Zero mq
Roman Kuznietsov: Zeromq: sockets on steroids.Zero mqRoman Kuznietsov: Zeromq: sockets on steroids.Zero mq
Roman Kuznietsov: Zeromq: sockets on steroids.Zero mq
 
zeromq
zeromqzeromq
zeromq
 
RabbitMq
RabbitMqRabbitMq
RabbitMq
 
ZeroMQ Is The Answer
ZeroMQ Is The AnswerZeroMQ Is The Answer
ZeroMQ Is The Answer
 
Overview of ZeroMQ
Overview of ZeroMQOverview of ZeroMQ
Overview of ZeroMQ
 

Similar to You're Going To Need A Bigger Toolbox

Config managament for development environments iii
Config managament for development environments iiiConfig managament for development environments iii
Config managament for development environments iii
Puppet
 
Puppet Module Reusability - What I Learned from Shipping to the Forge
Puppet Module Reusability - What I Learned from Shipping to the ForgePuppet Module Reusability - What I Learned from Shipping to the Forge
Puppet Module Reusability - What I Learned from Shipping to the Forge
Puppet
 

Similar to You're Going To Need A Bigger Toolbox (20)

Config managament for development environments iii
Config managament for development environments iiiConfig managament for development environments iii
Config managament for development environments iii
 
Parsing Microformats
Parsing MicroformatsParsing Microformats
Parsing Microformats
 
Building Go Web Apps
Building Go Web AppsBuilding Go Web Apps
Building Go Web Apps
 
Puppet Data Mining
Puppet Data MiningPuppet Data Mining
Puppet Data Mining
 
Config managament for development environments ii
Config managament for development environments iiConfig managament for development environments ii
Config managament for development environments ii
 
Rugged Driven Development with Gauntlt
Rugged Driven Development with GauntltRugged Driven Development with Gauntlt
Rugged Driven Development with Gauntlt
 
Vagrant and Configuration Management
Vagrant and Configuration ManagementVagrant and Configuration Management
Vagrant and Configuration Management
 
Practical ngx_mruby
Practical ngx_mrubyPractical ngx_mruby
Practical ngx_mruby
 
Using and scaling Rack and Rack-based middleware
Using and scaling Rack and Rack-based middlewareUsing and scaling Rack and Rack-based middleware
Using and scaling Rack and Rack-based middleware
 
Puppet Module Reusability - What I Learned from Shipping to the Forge
Puppet Module Reusability - What I Learned from Shipping to the ForgePuppet Module Reusability - What I Learned from Shipping to the Forge
Puppet Module Reusability - What I Learned from Shipping to the Forge
 
Introduction to Apache Camel
Introduction to Apache CamelIntroduction to Apache Camel
Introduction to Apache Camel
 
The Challenges of Container Configuration
The Challenges of Container ConfigurationThe Challenges of Container Configuration
The Challenges of Container Configuration
 
Sprockets
SprocketsSprockets
Sprockets
 
Continuously Testing Infrastructure - Beyond Module Testing - PuppetConf 2014
Continuously Testing Infrastructure - Beyond Module Testing - PuppetConf 2014Continuously Testing Infrastructure - Beyond Module Testing - PuppetConf 2014
Continuously Testing Infrastructure - Beyond Module Testing - PuppetConf 2014
 
KubeCon EU 2016: Kubernetes and the Potential for Higher Level Interfaces
KubeCon EU 2016: Kubernetes and the Potential for Higher Level InterfacesKubeCon EU 2016: Kubernetes and the Potential for Higher Level Interfaces
KubeCon EU 2016: Kubernetes and the Potential for Higher Level Interfaces
 
RediSearch Mumbai Meetup 2020
RediSearch Mumbai Meetup 2020RediSearch Mumbai Meetup 2020
RediSearch Mumbai Meetup 2020
 
Test Driven Development with Puppet - PuppetConf 2014
Test Driven Development with Puppet - PuppetConf 2014Test Driven Development with Puppet - PuppetConf 2014
Test Driven Development with Puppet - PuppetConf 2014
 
Apache spark session
Apache spark sessionApache spark session
Apache spark session
 
Logstash
LogstashLogstash
Logstash
 
Stop Reinventing The Wheel - The Ruby Standard Library
Stop Reinventing The Wheel - The Ruby Standard LibraryStop Reinventing The Wheel - The Ruby Standard Library
Stop Reinventing The Wheel - The Ruby Standard Library
 

More from Gareth Rushgrove

More from Gareth Rushgrove (20)

Communications Between Tribes
Communications Between TribesCommunications Between Tribes
Communications Between Tribes
 
Puppet and Openshift
Puppet and OpenshiftPuppet and Openshift
Puppet and Openshift
 
Two Sides of Google Infrastructure for Everyone Else
Two Sides of Google Infrastructure for Everyone ElseTwo Sides of Google Infrastructure for Everyone Else
Two Sides of Google Infrastructure for Everyone Else
 
Thinking Evil Thoughts
Thinking Evil ThoughtsThinking Evil Thoughts
Thinking Evil Thoughts
 
Web operations
Web operationsWeb operations
Web operations
 
Learnings from govuk
Learnings from govukLearnings from govuk
Learnings from govuk
 
Varnish Caching
Varnish CachingVarnish Caching
Varnish Caching
 
Metrics with Ganglia
Metrics with GangliaMetrics with Ganglia
Metrics with Ganglia
 
Automating web site deployment
Automating web site deploymentAutomating web site deployment
Automating web site deployment
 
Self Education for Web Professionals
Self Education for Web ProfessionalsSelf Education for Web Professionals
Self Education for Web Professionals
 
What to Build with Google App Engine
What to Build with Google App EngineWhat to Build with Google App Engine
What to Build with Google App Engine
 
App Engine for Python Developers
App Engine for Python DevelopersApp Engine for Python Developers
App Engine for Python Developers
 
Testing Django Applications
Testing Django ApplicationsTesting Django Applications
Testing Django Applications
 
Design Strategies for a Distributed Web
Design Strategies for a Distributed WebDesign Strategies for a Distributed Web
Design Strategies for a Distributed Web
 
A First Class Web Citizen
A First Class Web CitizenA First Class Web Citizen
A First Class Web Citizen
 
Things you probably don't do (or tying to make project automation sexy)
Things you probably don't do (or tying to make project automation sexy)Things you probably don't do (or tying to make project automation sexy)
Things you probably don't do (or tying to make project automation sexy)
 
Notes from (Web 2.0) Revolution
Notes from (Web 2.0) RevolutionNotes from (Web 2.0) Revolution
Notes from (Web 2.0) Revolution
 
Rails flavoured OpenId
Rails flavoured OpenIdRails flavoured OpenId
Rails flavoured OpenId
 
Shiny Content Management with Radiant
Shiny Content Management with RadiantShiny Content Management with Radiant
Shiny Content Management with Radiant
 
RESTful Rabbits
RESTful RabbitsRESTful Rabbits
RESTful Rabbits
 

Recently uploaded

Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
vu2urc
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
giselly40
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 

Recently uploaded (20)

Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Evaluating the top large language models.pdf
Evaluating the top large language models.pdfEvaluating the top large language models.pdf
Evaluating the top large language models.pdf
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 

You're Going To Need A Bigger Toolbox

  • 1. You’re Going To Need A Bigger Toolbox DIBI 28th April 2010 gareth rushgrove | morethanseven.net http://www.flickr.com/photos/booleansplit/2376359338/
  • 3. We Used To Just Build Websites gareth rushgrove | morethanseven.net
  • 4. Probably Simple Websites gareth rushgrove | morethanseven.net
  • 5. Maybe the odd Ecommerce Site gareth rushgrove | morethanseven.net
  • 6. Then We Built Web Applications gareth rushgrove | morethanseven.net
  • 7. Now We Just Build. gareth rushgrove | morethanseven.net
  • 8. Your Toolbox is Growing gareth rushgrove | morethanseven.net http://www.flickr.com/photos/gordonr/42555739
  • 9. 1 Embrace Heterogeneous Environments gareth rushgrove | morethanseven.net http://www.flickr.com/photos/mk1971/2548492513/
  • 10. 1 No Development Tool Silver Bullet gareth rushgrove | morethanseven.net http://www.flickr.com/photos/mk1971/2548492513/
  • 11. We Build Websites With... gareth rushgrove | morethanseven.net http://www.flickr.com/photos/freefoto/3436970425/
  • 12. PHP, MySQL, Apache gareth rushgrove | morethanseven.net
  • 13. .NET, MSSQL, IIS gareth rushgrove | morethanseven.net
  • 14. Java, Oracle, Tomcat gareth rushgrove | morethanseven.net
  • 15. Lots of Others gareth rushgrove | morethanseven.net
  • 16. Just One Stack? gareth rushgrove | morethanseven.net http://www.flickr.com/photos/harrygoldenfeld/4263710200/
  • 17. The Guardian Java, Python, Oracle, App Engine gareth rushgrove | morethanseven.net
  • 18. LastFM PHP, C++, Java, Hadoop, Python gareth rushgrove | morethanseven.net
  • 19. GitHub Ruby, Erlang, MySQL, Redis, Sinatra gareth rushgrove | morethanseven.net
  • 20. Twitter Ruby, Scala, Java, C/C++ gareth rushgrove | morethanseven.net
  • 21. Facebook PHP, Erlang, C, MySQL, Cassandra gareth rushgrove | morethanseven.net
  • 22. 2 2. Know When Your Stack is out of its Depth gareth rushgrove | morethanseven.net http://www.flickr.com/photos/dk_spook/2421009077/
  • 23. What Should You Know About? gareth rushgrove | morethanseven.net http://www.flickr.com/photos/takomabibelot/220265100/
  • 24. wiki.nginx.org Serve Web Pages With Nginx gareth rushgrove | morethanseven.net
  • 25. “Apache is like Microsoft Word, it has a million options but you only need six. Nginx does those six things, and it does five of them 50 times faster than Apache. Chris Lea Why Nginx gareth rushgrove | morethanseven.net
  • 26. server { listen 80; server_name www.example.com; location / { root /var/www/example.com; } } Nginx Example gareth rushgrove | morethanseven.net
  • 27. http { upstream php { server localhost:8002; } upstream python { server localhost:8003; } } server { server_name www.example.com; location / { proxy_pass http://python; } location ~ /basket/* { proxy_pass http://php; } } Nginx Example gareth rushgrove | morethanseven.net
  • 28. - Thin - http://code.macournoyer.com/thin/ - Mongrel - http://github.com/fauna/mongrel/ - Spawning - http://pypi.python.org/pypi/Spawning/ - Unicorn - http://github.com/defunkt/unicorn/ Also See gareth rushgrove | morethanseven.net
  • 29. memcached.org Caching with Memcached gareth rushgrove | morethanseven.net
  • 30. from django.core.cache import cache key = "/about/" content = cache.get(key) if not content: # expensive query to get content cache.set(key, content, 300) Memcached Example gareth rushgrove | morethanseven.net
  • 31. - Squid - http://www.squid-cache.org - Varnish - http://varnish-cache.org Also See gareth rushgrove | morethanseven.net
  • 32. lucene.apache.org/solr/ Search with Solr gareth rushgrove | morethanseven.net
  • 33. http://solr:8983/solr/products/select/ ?q=colour:red &sort=price%20desc &rows=60 &wt=json Solr Example gareth rushgrove | morethanseven.net
  • 34. - Xapian - http://xapian.org - Sphinx - http://sphinxsearch.com - Nutch - http://lucene.apache.org/nutch/ - Whoosh - http://whoosh.ca Also See gareth rushgrove | morethanseven.net
  • 35. rabbitmq.com Asynchronous Processing with RabbitMQ gareth rushgrove | morethanseven.net
  • 36. require 'carrot' q = Carrot.queue('carrot', :durable => true) 10.times do |num| q.publish(num.to_s) end RabbitMQ Enqueue Example gareth rushgrove | morethanseven.net
  • 37. puts "count: #{q.message_count}" while msg = q.pop(:ack => true) puts msg q.ack end Carrot.stop RabbitMQ Dequeue Example gareth rushgrove | morethanseven.net
  • 38. - Apache ActiveMQ - http://activemq.apache.org - Beanstalk - http://kr.github.com/beanstalkd/ - Stomp Server - http://stomp.codehaus.org - MemcacheQ - http://memcachedb.org/memcacheq/ Also See gareth rushgrove | morethanseven.net
  • 39. couchdb.apache.org Data Storage With CouchDB gareth rushgrove | morethanseven.net
  • 40. <?php $options['host'] = "localhost"; $options['port'] = 5984; $couch = new CouchSimple($options); $resp = $couch->send("PUT", "/test"); $resp = $couch->send("PUT", "/test/123", '{"_id":"123","data":"Foo"}'); ?> CouchDB Example gareth rushgrove | morethanseven.net
  • 41. <?php $options['host'] = "localhost"; $options['port'] = 5984; $couch = new CouchSimple($options); $resp = $couch->send("GET", "/test/_all_docs"); $resp = $couch->send("GET", "/test/123"); $resp = $couch->send("DELETE", "/test/"); ?> CouchDB Example gareth rushgrove | morethanseven.net
  • 42. - MongoDB - http://www.mongodb.org - Tokyo Tyrant - http://1978th.net/tokyotyrant/ - Cassandra - http://cassandra.apache.org - Redis - http://code.google.com/p/redis/ Also See gareth rushgrove | morethanseven.net
  • 43. hadoop.apache.org Data Mining With Hive gareth rushgrove | morethanseven.net
  • 44. CREATE TABLE u_data ( userid INT, movieid INT, rating INT, unixtime STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY 't' STORED AS TEXTFILE; Hive Create Example Cucumber DSL Example gareth rushgrove | morethanseven.net
  • 45. LOAD DATA LOCAL INPATH 'data.txt' OVERWRITE INTO TABLE u_data; SELECT COUNT(1) FROM u_data; Hive Load DSL Example Cucumber Example gareth rushgrove | morethanseven.net
  • 46. add FILE weekday_mapper.py; INSERT OVERWRITE TABLE u_data_new SELECT TRANSFORM (userid, movieid, rating, unixtime) USING 'python weekday_mapper.py' AS (userid, movieid, rating, weekday) FROM u_data; SELECT weekday, COUNT(1) FROM u_data_new GROUP BY weekday; Hive Map Reduce Example Cucumber DSL Example gareth rushgrove | morethanseven.net
  • 47. - Hadoop - http://hadoop.apache.org - Hive - http://wiki.apache.org/hadoop/Hive/ - Pig - http://hadoop.apache.org/pig/ - Dumbo - http://lastfm.com/dumbo/ - Disco - http://discoproject.org Also See gareth rushgrove | morethanseven.net
  • 48. cukes.info Testing with Cucumber gareth rushgrove | morethanseven.net
  • 49. Feature: google.co.uk To broaden their knowledge A user should be able To search for things Scenario: Searching for things Given I visit "http://www.google.co.uk" When I fill in "q" with "wikipedia" And I press "Google Search" Then I should see "www.wikipedia.org" Cucumber DSL Example gareth rushgrove | morethanseven.net
  • 50. Feature: google.co.uk To broaden their knowledge A user should be able To search for things Scenario: Searching for things Given I visit "http://www.google.co.uk" When I fill in "q" with "wikipedia" And I press "Google Search" Then I should see "www.wikipedia.org" 1 scenario (1 failed) 4 steps (1 failed, 2 skipped, 1 passed) 0m0.332s Cucumber Results Example gareth rushgrove | morethanseven.net
  • 51. puppetlabs.com Server Provisioning with Puppet gareth rushgrove | morethanseven.net
  • 52. class baseclass { $packagelist = ["sudo", "openssh-server"] package { $packagelist: ensure => installed } service { sshd: name => "ssh", enable => true, ensure => running } } Puppet Class Example gareth rushgrove | morethanseven.net
  • 53. node 'example.com' inherits basenode { $packagelist = ["nginx"] package { $packagelist: ensure => installed } service { "nginx": ensure => running, require => Package["nginx"] } } Puppet Node Example gareth rushgrove | morethanseven.net
  • 54. - Chef - http://wiki.opscode.com/display/chef/Home/ Also See gareth rushgrove | morethanseven.net
  • 55. Conclusions gareth rushgrove | morethanseven.net http://www.flickr.com/photos/batega/1596898776/
  • 56. 1 Know What's Possible gareth rushgrove | morethanseven.net http://www.flickr.com/photos/docman/36125185/
  • 57. 2 Look for Opportunities gareth rushgrove | morethanseven.net http://www.flickr.com/photos/kgregory/500456103/
  • 58. 3 Experiment gareth rushgrove | morethanseven.net http://www.flickr.com/photos/seeminglee/3967329241/
  • 59. 4 Manage Complexity gareth rushgrove | morethanseven.net http://www.flickr.com/photos/30890318@N06/3510161637/
  • 60. Questions? gareth rushgrove | morethanseven.net http://flickr.com/photos/psd/102332391/