SlideShare une entreprise Scribd logo
1  sur  117
Télécharger pour lire hors ligne
Asynchronous Processing
               Jonathan Dahl




              (and RailSpikes,
                    Slantwise,
                    Zencoder,
                          etc.)
I.
    What is it, and
why should I care?
Wife:   What are you talking about at
        RailsConf this year?

Jon:    Asynchronous Processing


Wife:   [changes subject]
important
     tool
(ahem...)
Related Concepts

• Background Processing
• Parallel Processing
• Distributed Processing
has_attachment :storage => :s3
Image Upload   (   15 seconds)



 Send to S3


  Browser
 Response
Image Upload



 Send to S3    (   15 seconds)


  Browser
 Response
Image Upload



 Send to S3


  Browser
               (   3 seconds)
 Response
Image Upload



 Send to S3


  Browser
 Response
has_attachment :storage => :file_system
Image Upload   (   15 seconds)


  Browser
 Response


 Send to S3
Image Upload


  Browser
               (   3 seconds)
 Response


 Send to S3    (   who cares?)
has_attachment :storage => :s3,
               :thumbnails => {
                 :thumb => '100x100!',
                 :small => '240x180>',
                 :medium => '500x500>' }
Image Upload

Generate 3 Thumbnails

Send Thumbnail A to S3

Send Thumbnail B to S3

Send Thumbnail C to S3

  Send Original to S3

  Browser Response
Image Upload

Generate 3 Thumbnails

Send Thumbnail A to S3

Send Thumbnail B to S3

Send Thumbnail C to S3

  Send Original to S3

  Browser Response
Image Upload

Generate 3 Thumbnails

Send Thumbnail A to S3

Send Thumbnail B to S3

Send Thumbnail C to S3

  Send Original to S3

  Browser Response
Image Upload

Generate 3 Thumbnails

Send Thumbnail A to S3

Send Thumbnail B to S3

Send Thumbnail C to S3

  Send Original to S3

  Browser Response
Image Upload

Generate 3 Thumbnails

Send Thumbnail A to S3

Send Thumbnail B to S3

Send Thumbnail C to S3

  Send Original to S3

  Browser Response
Image Upload

Generate 3 Thumbnails

Send Thumbnail A to S3

Send Thumbnail B to S3

Send Thumbnail C to S3

  Send Original to S3

  Browser Response
Image Upload

Generate 3 Thumbnails

Send Thumbnail A to S3

Send Thumbnail B to S3

Send Thumbnail C to S3

  Send Original to S3

  Browser Response
II.
When do I need it?
Time
Request

• Method (GET, POST)
• URI (host, port, path)
• Parameters
Response

• Status (200, 404, 500)
• Metadata (content type, server info,
  etc.)

• Body (xml, html, file)
Resources
Trigger
HTTP trigger - browser request
HTTP trigger - API request

      GET /photos/1.xml HTTP/1.1
      Host: example.com:80
Human trigger - capistrano

      cap staging deploy
Human trigger - rake

      rake db:migrate
Human trigger - console
     $ script/console production
     Loading production environment
     (Rails 2.0.2)
     >> Photo.destroy_all
No trigger?



    - Send email in 2 hours
    - Sync data at 3:00am PST
    - Notify admin when disk is 90% full
    - Expire sessions that are inactive
    - Archive records that exceed quota
1. Time
2. Resources
3. Trigger
Concrete examples
• Sending mail
• Transcoding video/audio
• Storing images on S3
• Receiving email
• Synching with outside database
• Complex computations
class Emailer < ActionMailer::ARMailer
Zencoder
             User



         Video Sharing
            Website

                                  Data Storage
                                  (Amazon S3)
             Zencoder
             Manager

Worker                   Worker

   Worker           Worker
class Photo < ActiveRecord::Base
  after_create :background_s3_upload
  def background_s3_upload
    Bj.submit quot;./script/runner ./jobs/send_to_s3.rb #{self.id}quot;
  end
end
III.
     So how do you
decide what to use?
be seamless
how reliable?
when should it run?
dependencies and
system complexity
scaling
   and/or
performance
IV.
The simple solution:
      fork or thread
Parallel vs. Background
1. Stay within one
     request
2. thread.join
3. ActiveRecord
ActiveRecord::Base.allow_concurrency = true
fire and forget
Spawn


spawn(:method => :fork) do
  # do something
end
1. Time
2. Resources
  3. Trigger
V.
More robust
  solutions
Task Storage
Task Trigger
Task Storage

• task details (what happens?)
• priority
• when to run
Task Trigger

• worker pulling jobs
• time-based
• execute immediately
Task Storage   Task Trigger
   Database       daemon
Message Queue      cron
Task Storage   Task Trigger
   Database       daemon
Message Queue      cron
create_table   quot;jobsquot; do |t|
  t.text       quot;commandquot;
  t.integer    quot;priorityquot;
  t.integer    quot;pidquot;
  t.datetime   quot;submitted_atquot;
  t.datetime   quot;started_atquot;
  t.datetime   quot;finished_atquot;
  t.text       quot;resultquot;
end
create_table   quot;photosquot; do |t|
  t.string     quot;filenamequot;
  t.datetime   quot;created_atquot;
  t.datetime   quot;processed_atquot;
end
create_table   quot;photosquot; do |t|
  t.string     quot;filenamequot;
  t.datetime   quot;created_atquot;
  t.datetime   quot;processed_atquot;
end
Task Storage   Task Trigger
   Database       daemon
Message Queue      cron
Task Storage   Task Trigger
   Database       daemon
Message Queue      cron
• Amazon SQS
• Websphere MQ
• Starling
• JMS
• beanstalkd
queue = SQS.get_queue(quot;task_listquot;)
put message


queue.send_message quot;process:2872quot;
receive message


message = queue.receive_message
Starling


starling -h 192.168.1.1 -d
require 'memcache'
starling = MemCache.new('192.168.1.1:22122')

# Put messages onto a queue:
starling.set('my_queue', 12345)

# Get message from the queue:
starling.get('my_queue')
Task Storage   Task Trigger
   Database       daemon
Message Queue      cron
storage choice?


• queue: optimized for performance
• database: you’ve already got one
Task Storage   Task Trigger
   Database       daemon
Message Queue      cron
daemon
#!/usr/bin/env ruby
class JobRequester < SimpleDaemon::Base
  def self.start
    loop { Job.process_next }
  end
end

JobRequester.daemonize
Task Storage   Task Trigger
   Database       daemon
Message Queue      cron
0 6 * * * script/runner jobs/send_emails.rb
cronedit
require 'cronedit'

CronEdit::Crontab.Add quot;send-emailsquot;, {
  :minute => 0,
  :hour => 6,
  :command => quot;script/runner jobs/send_emails.rbquot;
}

CronEdit::Crontab.Remove 'old-task'
trigger choice


• process: always running
• cron: as reliable as your operating
  system
BackgroundDRb
class BillingWorker < BackgrounDRb::MetaWorker
  set_worker_name :billing_worker
  def create(args = nil)
    # this method is called when worker is loaded for the first time
  end

  def charge_customer(customer_id = nil)
    logger.info 'charging customer now'
  end
end

MiddleMan.worker(:billing_worker).charge_customer(current_customer.id)
:backgroundrb:
  :ip: 0.0.0.0

:development:
  :backgroundrb:
    :port: 11111
    :log: foreground

:production:
  :backgroundrb:
    :port: 22222
    :lazy_load: true
    :debug_log: false

./script/backgroundrb start
AP4R
def MyController
  def queue
    ap4r.async_to({:action => 'download'}, {:story =>
story.id, :url => params[:url]})
  end

  def download
    # long-running task
  end
end
Bj


Acronym
create_table   quot;bj_jobquot;, :primary_key => quot;bj
  t.text       quot;commandquot;
  t.text       quot;statequot;
  t.integer    quot;priorityquot;
  t.text       quot;tagquot;
  t.integer    quot;is_restartablequot;
  t.text       quot;submitterquot;
  t.text       quot;runnerquot;
  t.integer    quot;pidquot;
  t.datetime   quot;submitted_atquot;
  t.datetime   quot;started_atquot;
  t.datetime   quot;finished_atquot;
  t.text       quot;envquot;
Bj.submit quot;./script/runner ./jobs/task.rbquot;
after_create :bj_send_to_s3

def bj_send_to_s3
  Bj.submit quot;./script/runner ./jobs/send.rb #{id}quot;
end
Workling

# environment config
Workling::Remote.dispatcher =
 Workling::Remote::Runners::StarlingRunner.new
# task class
class ImageWorker < Workling::Base
  def send_to_s3(options = {})
    # put file to S3
  end
end
# trigger asynchronous job
ImageWorker.asynch_send_to_s3(:image_id => 2927)
script/workling_starling_client start
Pitfalls
race conditions
alive, but stalled
VI.
         some
recommendations
general purpose


      Bj
distributed processing


         SQS
  (+ custom worker)
time-scheduled


      cron
(+ rake or script)
speed + scalability


Starling/Workling
Thanks!
 Jonathan Dahl



Slides at RailSpikes
http://railspikes.com

Contenu connexe

Tendances

Service Worker Presentation
Service Worker PresentationService Worker Presentation
Service Worker Presentation
Kyle Dorman
 
0-60 with Goliath: Building High Performance Ruby Web-Services
0-60 with Goliath: Building High Performance Ruby Web-Services0-60 with Goliath: Building High Performance Ruby Web-Services
0-60 with Goliath: Building High Performance Ruby Web-Services
Ilya Grigorik
 
Ruby/rails performance and profiling
Ruby/rails performance and profilingRuby/rails performance and profiling
Ruby/rails performance and profiling
Danny Guinther
 

Tendances (20)

Scaling Twitter
Scaling TwitterScaling Twitter
Scaling Twitter
 
Tips for going fast in a slow world: Michael May at OSCON 2015
Tips for going fast in a slow world: Michael May at OSCON 2015Tips for going fast in a slow world: Michael May at OSCON 2015
Tips for going fast in a slow world: Michael May at OSCON 2015
 
Faster PHP apps using Queues and Workers
Faster PHP apps using Queues and WorkersFaster PHP apps using Queues and Workers
Faster PHP apps using Queues and Workers
 
Service Worker Presentation
Service Worker PresentationService Worker Presentation
Service Worker Presentation
 
Real World Lessons in Progressive Web Application & Service Worker Caching
Real World Lessons in Progressive Web Application & Service Worker CachingReal World Lessons in Progressive Web Application & Service Worker Caching
Real World Lessons in Progressive Web Application & Service Worker Caching
 
HTTP caching with Varnish
HTTP caching with VarnishHTTP caching with Varnish
HTTP caching with Varnish
 
Going crazy with Varnish and Symfony
Going crazy with Varnish and SymfonyGoing crazy with Varnish and Symfony
Going crazy with Varnish and Symfony
 
Single page apps with drupal 7
Single page apps with drupal 7Single page apps with drupal 7
Single page apps with drupal 7
 
0-60 with Goliath: Building High Performance Ruby Web-Services
0-60 with Goliath: Building High Performance Ruby Web-Services0-60 with Goliath: Building High Performance Ruby Web-Services
0-60 with Goliath: Building High Performance Ruby Web-Services
 
Choosing a Javascript Framework
Choosing a Javascript FrameworkChoosing a Javascript Framework
Choosing a Javascript Framework
 
Handling 10k requests per second with Symfony and Varnish - SymfonyCon Berlin...
Handling 10k requests per second with Symfony and Varnish - SymfonyCon Berlin...Handling 10k requests per second with Symfony and Varnish - SymfonyCon Berlin...
Handling 10k requests per second with Symfony and Varnish - SymfonyCon Berlin...
 
PWA 與 Service Worker
PWA 與 Service WorkerPWA 與 Service Worker
PWA 與 Service Worker
 
Mad scalability: Scaling when you are not Google
Mad scalability: Scaling when you are not GoogleMad scalability: Scaling when you are not Google
Mad scalability: Scaling when you are not Google
 
Service Workers for Performance
Service Workers for PerformanceService Workers for Performance
Service Workers for Performance
 
So I Wrote a Manifest
So I Wrote a ManifestSo I Wrote a Manifest
So I Wrote a Manifest
 
Migraine Drupal - syncing your staging and live sites
Migraine Drupal - syncing your staging and live sitesMigraine Drupal - syncing your staging and live sites
Migraine Drupal - syncing your staging and live sites
 
Ruby/rails performance and profiling
Ruby/rails performance and profilingRuby/rails performance and profiling
Ruby/rails performance and profiling
 
Implementing Comet using PHP
Implementing Comet using PHPImplementing Comet using PHP
Implementing Comet using PHP
 
Docker and jvm. A good idea?
Docker and jvm. A good idea?Docker and jvm. A good idea?
Docker and jvm. A good idea?
 
PowerShell: Automation for everyone
PowerShell: Automation for everyonePowerShell: Automation for everyone
PowerShell: Automation for everyone
 

En vedette

CYNTHIA L STOEBICH Jan 2016
CYNTHIA L STOEBICH Jan 2016CYNTHIA L STOEBICH Jan 2016
CYNTHIA L STOEBICH Jan 2016
Cynthia Stoebich
 
P&G 2002 Annual Report
P&G 2002 Annual ReportP&G 2002 Annual Report
P&G 2002 Annual Report
finance3
 
fmc technologies 2002ar
fmc technologies 2002arfmc technologies 2002ar
fmc technologies 2002ar
finance50
 
Eco brasil indigena_mma+funai_ecoturismoti_resumo_jun1998
Eco brasil indigena_mma+funai_ecoturismoti_resumo_jun1998Eco brasil indigena_mma+funai_ecoturismoti_resumo_jun1998
Eco brasil indigena_mma+funai_ecoturismoti_resumo_jun1998
Brazil Ecotravel
 
El rol del docente en ead
El rol del docente en eadEl rol del docente en ead
El rol del docente en ead
julia_martinez
 

En vedette (20)

Agri Innovation by Carl Fletcher, OMAFRA
Agri Innovation by Carl Fletcher, OMAFRAAgri Innovation by Carl Fletcher, OMAFRA
Agri Innovation by Carl Fletcher, OMAFRA
 
Redis: An introduction
Redis: An introductionRedis: An introduction
Redis: An introduction
 
CYNTHIA L STOEBICH Jan 2016
CYNTHIA L STOEBICH Jan 2016CYNTHIA L STOEBICH Jan 2016
CYNTHIA L STOEBICH Jan 2016
 
P&G 2002 Annual Report
P&G 2002 Annual ReportP&G 2002 Annual Report
P&G 2002 Annual Report
 
INFORME FORO PARTICIPATIVO. PUERTO DE BARBATE.
INFORME FORO PARTICIPATIVO. PUERTO DE BARBATE.INFORME FORO PARTICIPATIVO. PUERTO DE BARBATE.
INFORME FORO PARTICIPATIVO. PUERTO DE BARBATE.
 
fmc technologies 2002ar
fmc technologies 2002arfmc technologies 2002ar
fmc technologies 2002ar
 
Eco brasil indigena_mma+funai_ecoturismoti_resumo_jun1998
Eco brasil indigena_mma+funai_ecoturismoti_resumo_jun1998Eco brasil indigena_mma+funai_ecoturismoti_resumo_jun1998
Eco brasil indigena_mma+funai_ecoturismoti_resumo_jun1998
 
PalmaActiva: Presentacio eureka 2012 - dossier de premsa
PalmaActiva: Presentacio eureka 2012 - dossier de premsaPalmaActiva: Presentacio eureka 2012 - dossier de premsa
PalmaActiva: Presentacio eureka 2012 - dossier de premsa
 
201217 es es
201217 es es201217 es es
201217 es es
 
El rol del docente en ead
El rol del docente en eadEl rol del docente en ead
El rol del docente en ead
 
Perseus
PerseusPerseus
Perseus
 
Psicodelia
PsicodeliaPsicodelia
Psicodelia
 
19. salmo 19 cómo conocer a dios
19.  salmo 19 cómo conocer a dios19.  salmo 19 cómo conocer a dios
19. salmo 19 cómo conocer a dios
 
Intro to Angel.co | Tandem
Intro to Angel.co | TandemIntro to Angel.co | Tandem
Intro to Angel.co | Tandem
 
Teoría de señales
Teoría de señalesTeoría de señales
Teoría de señales
 
Resiliencia Organizacional
Resiliencia OrganizacionalResiliencia Organizacional
Resiliencia Organizacional
 
Zwinnie i pod kontrolą - SCRUM vs COBIT
Zwinnie i pod kontrolą - SCRUM vs COBITZwinnie i pod kontrolą - SCRUM vs COBIT
Zwinnie i pod kontrolą - SCRUM vs COBIT
 
Mi primer día en la Guardería: apoyar la adaptación y promover seguridad en e...
Mi primer día en la Guardería: apoyar la adaptación y promover seguridad en e...Mi primer día en la Guardería: apoyar la adaptación y promover seguridad en e...
Mi primer día en la Guardería: apoyar la adaptación y promover seguridad en e...
 
Mini Diccionario español - japonés
Mini Diccionario español -  japonésMini Diccionario español -  japonés
Mini Diccionario español - japonés
 
Alineamiento Estratégico de las Tecnologías de Información
Alineamiento Estratégico de las Tecnologías de InformaciónAlineamiento Estratégico de las Tecnologías de Información
Alineamiento Estratégico de las Tecnologías de Información
 

Similaire à Asynchronous Processing with Ruby on Rails (RailsConf 2008)

Performance Optimization of Rails Applications
Performance Optimization of Rails ApplicationsPerformance Optimization of Rails Applications
Performance Optimization of Rails Applications
Serge Smetana
 
#NewMeetup Performance
#NewMeetup Performance#NewMeetup Performance
#NewMeetup Performance
Justin Cataldo
 
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
 
Systems Bioinformatics Workshop Keynote
Systems Bioinformatics Workshop KeynoteSystems Bioinformatics Workshop Keynote
Systems Bioinformatics Workshop Keynote
Deepak Singh
 
Monitoring with Syslog and EventMachine (RailswayConf 2012)
Monitoring  with  Syslog and EventMachine (RailswayConf 2012)Monitoring  with  Syslog and EventMachine (RailswayConf 2012)
Monitoring with Syslog and EventMachine (RailswayConf 2012)
Wooga
 

Similaire à Asynchronous Processing with Ruby on Rails (RailsConf 2008) (20)

Performance patterns
Performance patternsPerformance patterns
Performance patterns
 
Scaling python webapps from 0 to 50 million users - A top-down approach
Scaling python webapps from 0 to 50 million users - A top-down approachScaling python webapps from 0 to 50 million users - A top-down approach
Scaling python webapps from 0 to 50 million users - A top-down approach
 
Building Efficient and Reliable Crawler System With Sidekiq Enterprise
Building Efficient and Reliable Crawler System With Sidekiq EnterpriseBuilding Efficient and Reliable Crawler System With Sidekiq Enterprise
Building Efficient and Reliable Crawler System With Sidekiq Enterprise
 
Performance Optimization of Rails Applications
Performance Optimization of Rails ApplicationsPerformance Optimization of Rails Applications
Performance Optimization of Rails Applications
 
MongoDB World 2019: Becoming an Ops Manager Backup Superhero!
MongoDB World 2019: Becoming an Ops Manager Backup Superhero!MongoDB World 2019: Becoming an Ops Manager Backup Superhero!
MongoDB World 2019: Becoming an Ops Manager Backup Superhero!
 
Christoph Stoettner - Save my time using scripts
Christoph Stoettner - Save my time using scriptsChristoph Stoettner - Save my time using scripts
Christoph Stoettner - Save my time using scripts
 
Presentation Tier optimizations
Presentation Tier optimizationsPresentation Tier optimizations
Presentation Tier optimizations
 
#NewMeetup Performance
#NewMeetup Performance#NewMeetup Performance
#NewMeetup Performance
 
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
 
Getting Maximum Performance from Amazon Redshift (DAT305) | AWS re:Invent 2013
Getting Maximum Performance from Amazon Redshift (DAT305) | AWS re:Invent 2013Getting Maximum Performance from Amazon Redshift (DAT305) | AWS re:Invent 2013
Getting Maximum Performance from Amazon Redshift (DAT305) | AWS re:Invent 2013
 
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)
 
(WEB301) Operational Web Log Analysis | AWS re:Invent 2014
(WEB301) Operational Web Log Analysis | AWS re:Invent 2014(WEB301) Operational Web Log Analysis | AWS re:Invent 2014
(WEB301) Operational Web Log Analysis | AWS re:Invent 2014
 
Talk at NCRR P41 Director's Meeting
Talk at NCRR P41 Director's MeetingTalk at NCRR P41 Director's Meeting
Talk at NCRR P41 Director's Meeting
 
Systems Bioinformatics Workshop Keynote
Systems Bioinformatics Workshop KeynoteSystems Bioinformatics Workshop Keynote
Systems Bioinformatics Workshop Keynote
 
Heavy Web Optimization: Backend
Heavy Web Optimization: BackendHeavy Web Optimization: Backend
Heavy Web Optimization: Backend
 
Monitoring with Syslog and EventMachine (RailswayConf 2012)
Monitoring  with  Syslog and EventMachine (RailswayConf 2012)Monitoring  with  Syslog and EventMachine (RailswayConf 2012)
Monitoring with Syslog and EventMachine (RailswayConf 2012)
 
Asynchronous Personalization at Groupon - JSConf 2011
Asynchronous Personalization at Groupon - JSConf 2011Asynchronous Personalization at Groupon - JSConf 2011
Asynchronous Personalization at Groupon - JSConf 2011
 
How I Learned to Stop Worrying and Love the Cloud - Wesley Beary, Engine Yard
How I Learned to Stop Worrying and Love the Cloud - Wesley Beary, Engine YardHow I Learned to Stop Worrying and Love the Cloud - Wesley Beary, Engine Yard
How I Learned to Stop Worrying and Love the Cloud - Wesley Beary, Engine Yard
 
"Load Testing Distributed Systems with NBomber 4.0", Anton Moldovan
"Load Testing Distributed Systems with NBomber 4.0",  Anton Moldovan"Load Testing Distributed Systems with NBomber 4.0",  Anton Moldovan
"Load Testing Distributed Systems with NBomber 4.0", Anton Moldovan
 
Streaming Way to Webscale: How We Scale Bitly via Streaming
Streaming Way to Webscale: How We Scale Bitly via StreamingStreaming Way to Webscale: How We Scale Bitly via Streaming
Streaming Way to Webscale: How We Scale Bitly via Streaming
 

Plus de Jonathan Dahl

Advanced API Design: how an awesome API can help you make friends, get rich, ...
Advanced API Design: how an awesome API can help you make friends, get rich, ...Advanced API Design: how an awesome API can help you make friends, get rich, ...
Advanced API Design: how an awesome API can help you make friends, get rich, ...
Jonathan Dahl
 

Plus de Jonathan Dahl (9)

The impact of encoding on content delivery: four ways to optimize video quality
The impact of encoding on content delivery: four ways to optimize video qualityThe impact of encoding on content delivery: four ways to optimize video quality
The impact of encoding on content delivery: four ways to optimize video quality
 
Designing Great APIs: Learning from Jony Ive, Orwell, and the Kano Model
Designing Great APIs: Learning from Jony Ive, Orwell, and the Kano ModelDesigning Great APIs: Learning from Jony Ive, Orwell, and the Kano Model
Designing Great APIs: Learning from Jony Ive, Orwell, and the Kano Model
 
Advanced API Design: how an awesome API can help you make friends, get rich, ...
Advanced API Design: how an awesome API can help you make friends, get rich, ...Advanced API Design: how an awesome API can help you make friends, get rich, ...
Advanced API Design: how an awesome API can help you make friends, get rich, ...
 
Advanced API Design: how an awesome API can attract friends, make you rich, a...
Advanced API Design: how an awesome API can attract friends, make you rich, a...Advanced API Design: how an awesome API can attract friends, make you rich, a...
Advanced API Design: how an awesome API can attract friends, make you rich, a...
 
Programming and Minimalism: Lessons from Orwell and the Clash
Programming and Minimalism: Lessons from Orwell and the ClashProgramming and Minimalism: Lessons from Orwell and the Clash
Programming and Minimalism: Lessons from Orwell and the Clash
 
Aristotle and the Art of Software Development (Agile 2009)
Aristotle and the Art of Software Development (Agile 2009)Aristotle and the Art of Software Development (Agile 2009)
Aristotle and the Art of Software Development (Agile 2009)
 
Rails and alternative ORMs
Rails and alternative ORMsRails and alternative ORMs
Rails and alternative ORMs
 
Aristotle and the Art of Software Development
Aristotle and the Art of Software DevelopmentAristotle and the Art of Software Development
Aristotle and the Art of Software Development
 
EC2, MapReduce, and Distributed Processing
EC2, MapReduce, and Distributed ProcessingEC2, MapReduce, and Distributed Processing
EC2, MapReduce, and Distributed Processing
 

Dernier

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
 
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
 

Dernier (20)

Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.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...
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
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
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
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
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
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?
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
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
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
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
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
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
 

Asynchronous Processing with Ruby on Rails (RailsConf 2008)