SlideShare a Scribd company logo
Ruby on Rails (RoR) as a back-end processor for Apex  Espen Braekken Director of Consulting Senitel Consulting AS
First English? Norwegian? Questions Spørsmål
Agenda About me About Senitel Consulting Why do we need a supplement to Apex? Why Ruby and Rails (and friends)? Examples of Ruby in action Notes on deployment and integration How to get started Wrap up
About me Director of Consulting, Senitel Director of Sales and Services, dbWatch Practice Manager, Oracle Performance and Technical Architecture Director of Engineering, e-Travel Technical Manager, Oracle Consulting System Performance Group
Senitel Consulting AS Established 1996 with focus on Oracle Owned by employees Focus Web development (Oracle Application Express) Data warehouse / BI solutions Database Training and workshops Oracle licensing
Why Apex? Great integrated environment: Fast Full Oracle stack DBA friendly PL/SQL Same language for back-end and front-end => gives small Oracle teams same advantage as that of more famous and “sexy” frameworks: Ruby on Rails, Zend and more.
Why do we need a supplement to Apex? Things that are difficult: Communication with the operating system Communication with command line scripts, potentially on other physical machines Receiving and parsing emails ssh and (s)ftp May end up with brittle solutions that fail at random.
Warning! Our approach is to use Ruby as glue (ref Perl: The Glue of the internet) (slightly) changed from what is in the program, based on experience last 6 months Learning a new language can be addictive  General understanding Skills New perspective on your native language Fun!
Why Ruby and Rails (and friends)? Talk to command line Run from command line Integrate with multiple data sources (MySQL, MSSQL, Oracle) Wide choice of communication protocols Wide range of add-ins/tools Short development cycles Easy to deploy
This works on all platforms.  The Ruby file IO library  will translate to  local “naming” standard.
PHP and Perl crashing the enterprise party
Take the A Train
Huh – those numbers are relative!
Ruby, what is it? Ruby is a dynamic, reflective, general purpose object-oriented programming language that combines syntax inspired by Perl with Smalltalk-like features.  Ruby originated in Japan during the mid-1990s and was initially developed and designed by Yukihiro "Matz" Matsumoto.  It was influenced primarily by Perl, Smalltalk, Eiffel, and Lisp. Source: wikipedia
Ruby C like syntax. The standard 1.8.7 implementation is written in C, as a single-pass interpreted language Runs in a VM Available on “all” platforms: Linux Mac Windows Java
Rails, a short introduction A Model-View-Controller framework Open Source Web applications Developed by David Heinemeier Hansson (DHH) of 37signals Principles: Convention over configuration Don’t repeat yourself (DRY) Similar frameworks CakePHP CodeIgniter
What does this mean? Convention over configuration Almost no configuration file setup Only define specifics Everything else is based on “sensible” defaults Don’t Repeat Yourself (DRY) Extensive re-use Easy to add own methods as helpers
Configuration files
yml, not xml
Rails and friends -- I We «lied» ... when we talk about Rails, we really mean Ruby++ Our use of Rails is more on the back-end than the front ActiveRecord (ORM) ActionMailer ActiveResource ActionPack ActiveSupport
Rails and friends -- II Back-end scripts with database functionality Alternatives to Rails: Merb (will be merged with Rails in 3.0) Sinatra (for lightweight RESTful services)
Rails, how and when to use We use as a supplement, not instead of To create good applications with Rails, you need to work with it every day Use under these conditions: Create RESTful services When you need support of multiple data sources (Oracle and MySQL) When your command line scripts suite is becoming a nightmare
AciveRecord, the gem in Rails Object Relational Mapping (ORM) Table names in plural PK is always id (number) FK always  table-name-in-singular _id For Oracle a sequence per table:  table-name-in-singular _seq
 
Not too elegant, let’s use a yml file instead (next slide)
database.yml
ActiveRecord, mapping objects to tables
ActiveRecord, relations
 
What about stored procedures? There is a very comprehensive library for calling PL/SQL:  ruby-plsql Developed by Oracle ACE Raimonds Simanovskis – Oracle Developer of the Year 2009  We have not been successful in using with JRuby/JDBC Seems to have bindings to OCI based Oracle adapter Use if Java/JRuby is not important to you
Sample projects
Sample projects – I Dynamic creation of sql-loader scripts New loader file for each input file Constants and status codes Modeled after Rails’ implementation ERb
 
 
Sample projects – II Generic remote file management Supports ssh, ftp and s3 Basic operations on remote folders ls save (put) download (get) Operations to/from files or in-memory objects Can stream from remote file directly to LOB
 
 
Sample projects – III Calling Java code Ruby wrapper with exception handling, parameters etc for exporting (backing up) Apex code.
 
Deployment, alternatives We use Jruby and Tomcat/Glassfish for all our deployments Can use any J2EE container This means running your Ruby code in a Java Runtime environment Reduces your Rails deployment to copying a war file onto the server Familiar ground for sysadmins, both from deployment and everyday management perspective J2EE is the platform; Operating system of no consequence
How to get started Learn the language Ruby first, then a framework Start small Replace shell/bat scripts with Ruby first Then add DB interaction Wait with frameworks until you know Ruby Assess your needs No UI/Html => Merb or Sinatra
Wrap up Work with tool, not against it Apex where it shines Ruby++ where needed Dynamic languages is one the rise Ruby/Rails the fastest riser Don't be fooled, high productivity does not equal easy!
http://www.slideshare.net/ebraekke/presentations
Ad

Recommended

Ruby on Rails (RoR) as a back-end processor for Apex
Ruby on Rails (RoR) as a back-end processor for Apex
Espen Brækken
 
Ruby and Rails short motivation
Ruby and Rails short motivation
jistr
 
perl lauange
perl lauange
Naga Dinesh
 
LIL Presentation
LIL Presentation
badsectoracula
 
Create Your Own Language
Create Your Own Language
Hamidreza Soleimani
 
Scala-Ls1
Scala-Ls1
Aniket Joshi
 
Serialization and performance by Sergey Morenets
Serialization and performance by Sergey Morenets
Alex Tumanoff
 
Serialization (Avro, Message Pack, Kryo)
Serialization (Avro, Message Pack, Kryo)
오석 한
 
Music video pitch
Music video pitch
Megabanham
 
Art Wong Timeline
Art Wong Timeline
kazethewind
 
Contemporary landscape paintings on paper by Timothy Gent
Contemporary landscape paintings on paper by Timothy Gent
guest13b4b6
 
วชค 3 7
วชค 3 7
mai184
 
Wampiry, wilkołaki, czarownice
Wampiry, wilkołaki, czarownice
bibliozso6
 
rubyonrails
rubyonrails
tutorialsruby
 
rubyonrails
rubyonrails
tutorialsruby
 
Ruby On Rails
Ruby On Rails
Eric Berry
 
Rubyonrails 120409061835-phpapp02
Rubyonrails 120409061835-phpapp02
sagaroceanic11
 
Ruby on Rails All Hands Meeting
Ruby on Rails All Hands Meeting
Dan Davis
 
Exploring Ruby on Rails and PostgreSQL
Exploring Ruby on Rails and PostgreSQL
Barry Jones
 
Ruby On Rails Seminar Basis Softexpo Feb2010
Ruby On Rails Seminar Basis Softexpo Feb2010
arif44
 
Java, Ruby & Rails
Java, Ruby & Rails
Peter Lind
 
Ruby Rails Web Development SEO Expert Bangladesh LTD.pdf
Ruby Rails Web Development SEO Expert Bangladesh LTD.pdf
Tasnim Jahan
 
Why ruby and rails
Why ruby and rails
Reuven Lerner
 
Ruby On Rails Basics
Ruby On Rails Basics
Amit Solanki
 
Viridians on Rails
Viridians on Rails
Viridians
 
Ror Seminar With agilebd.org on 23 Jan09
Ror Seminar With agilebd.org on 23 Jan09
Shaer Hassan
 
Ruby on Rails survival guide of an aged Java developer
Ruby on Rails survival guide of an aged Java developer
gicappa
 
Ruby on Rails - An overview
Ruby on Rails - An overview
Thomas Asikis
 
From Java to Ruby...and Back
From Java to Ruby...and Back
Anil Hemrajani
 

More Related Content

Viewers also liked (6)

Music video pitch
Music video pitch
Megabanham
 
Art Wong Timeline
Art Wong Timeline
kazethewind
 
Contemporary landscape paintings on paper by Timothy Gent
Contemporary landscape paintings on paper by Timothy Gent
guest13b4b6
 
วชค 3 7
วชค 3 7
mai184
 
Wampiry, wilkołaki, czarownice
Wampiry, wilkołaki, czarownice
bibliozso6
 
Music video pitch
Music video pitch
Megabanham
 
Art Wong Timeline
Art Wong Timeline
kazethewind
 
Contemporary landscape paintings on paper by Timothy Gent
Contemporary landscape paintings on paper by Timothy Gent
guest13b4b6
 
วชค 3 7
วชค 3 7
mai184
 
Wampiry, wilkołaki, czarownice
Wampiry, wilkołaki, czarownice
bibliozso6
 

Similar to Ruby on Rails (RoR) as a back-end processor for Apex (20)

rubyonrails
rubyonrails
tutorialsruby
 
rubyonrails
rubyonrails
tutorialsruby
 
Ruby On Rails
Ruby On Rails
Eric Berry
 
Rubyonrails 120409061835-phpapp02
Rubyonrails 120409061835-phpapp02
sagaroceanic11
 
Ruby on Rails All Hands Meeting
Ruby on Rails All Hands Meeting
Dan Davis
 
Exploring Ruby on Rails and PostgreSQL
Exploring Ruby on Rails and PostgreSQL
Barry Jones
 
Ruby On Rails Seminar Basis Softexpo Feb2010
Ruby On Rails Seminar Basis Softexpo Feb2010
arif44
 
Java, Ruby & Rails
Java, Ruby & Rails
Peter Lind
 
Ruby Rails Web Development SEO Expert Bangladesh LTD.pdf
Ruby Rails Web Development SEO Expert Bangladesh LTD.pdf
Tasnim Jahan
 
Why ruby and rails
Why ruby and rails
Reuven Lerner
 
Ruby On Rails Basics
Ruby On Rails Basics
Amit Solanki
 
Viridians on Rails
Viridians on Rails
Viridians
 
Ror Seminar With agilebd.org on 23 Jan09
Ror Seminar With agilebd.org on 23 Jan09
Shaer Hassan
 
Ruby on Rails survival guide of an aged Java developer
Ruby on Rails survival guide of an aged Java developer
gicappa
 
Ruby on Rails - An overview
Ruby on Rails - An overview
Thomas Asikis
 
From Java to Ruby...and Back
From Java to Ruby...and Back
Anil Hemrajani
 
JRuby and Google App Engine
JRuby and Google App Engine
joshsmoore
 
Ruby On Rails Overview
Ruby On Rails Overview
jonkinney
 
Ruby Rails Web Development.pdf
Ruby Rails Web Development.pdf
Ayesha Siddika
 
Ruby on Rails
Ruby on Rails
Momentum Design Lab
 
Rubyonrails 120409061835-phpapp02
Rubyonrails 120409061835-phpapp02
sagaroceanic11
 
Ruby on Rails All Hands Meeting
Ruby on Rails All Hands Meeting
Dan Davis
 
Exploring Ruby on Rails and PostgreSQL
Exploring Ruby on Rails and PostgreSQL
Barry Jones
 
Ruby On Rails Seminar Basis Softexpo Feb2010
Ruby On Rails Seminar Basis Softexpo Feb2010
arif44
 
Java, Ruby & Rails
Java, Ruby & Rails
Peter Lind
 
Ruby Rails Web Development SEO Expert Bangladesh LTD.pdf
Ruby Rails Web Development SEO Expert Bangladesh LTD.pdf
Tasnim Jahan
 
Ruby On Rails Basics
Ruby On Rails Basics
Amit Solanki
 
Viridians on Rails
Viridians on Rails
Viridians
 
Ror Seminar With agilebd.org on 23 Jan09
Ror Seminar With agilebd.org on 23 Jan09
Shaer Hassan
 
Ruby on Rails survival guide of an aged Java developer
Ruby on Rails survival guide of an aged Java developer
gicappa
 
Ruby on Rails - An overview
Ruby on Rails - An overview
Thomas Asikis
 
From Java to Ruby...and Back
From Java to Ruby...and Back
Anil Hemrajani
 
JRuby and Google App Engine
JRuby and Google App Engine
joshsmoore
 
Ruby On Rails Overview
Ruby On Rails Overview
jonkinney
 
Ruby Rails Web Development.pdf
Ruby Rails Web Development.pdf
Ayesha Siddika
 
Ad

Recently uploaded (20)

FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Alliance
 
Data Validation and System Interoperability
Data Validation and System Interoperability
Safe Software
 
FIDO Seminar: Evolving Landscape of Post-Quantum Cryptography.pptx
FIDO Seminar: Evolving Landscape of Post-Quantum Cryptography.pptx
FIDO Alliance
 
OWASP Barcelona 2025 Threat Model Library
OWASP Barcelona 2025 Threat Model Library
PetraVukmirovic
 
June Patch Tuesday
June Patch Tuesday
Ivanti
 
“Why It’s Critical to Have an Integrated Development Methodology for Edge AI,...
“Why It’s Critical to Have an Integrated Development Methodology for Edge AI,...
Edge AI and Vision Alliance
 
Bridging the divide: A conversation on tariffs today in the book industry - T...
Bridging the divide: A conversation on tariffs today in the book industry - T...
BookNet Canada
 
No-Code Workflows for CAD & 3D Data: Scaling AI-Driven Infrastructure
No-Code Workflows for CAD & 3D Data: Scaling AI-Driven Infrastructure
Safe Software
 
FIDO Seminar: Targeting Trust: The Future of Identity in the Workforce.pptx
FIDO Seminar: Targeting Trust: The Future of Identity in the Workforce.pptx
FIDO Alliance
 
Raman Bhaumik - Passionate Tech Enthusiast
Raman Bhaumik - Passionate Tech Enthusiast
Raman Bhaumik
 
Supporting the NextGen 911 Digital Transformation with FME
Supporting the NextGen 911 Digital Transformation with FME
Safe Software
 
ENERGY CONSUMPTION CALCULATION IN ENERGY-EFFICIENT AIR CONDITIONER.pdf
ENERGY CONSUMPTION CALCULATION IN ENERGY-EFFICIENT AIR CONDITIONER.pdf
Muhammad Rizwan Akram
 
Tech-ASan: Two-stage check for Address Sanitizer - Yixuan Cao.pdf
Tech-ASan: Two-stage check for Address Sanitizer - Yixuan Cao.pdf
caoyixuan2019
 
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
NTT DATA Technology & Innovation
 
Providing an OGC API Processes REST Interface for FME Flow
Providing an OGC API Processes REST Interface for FME Flow
Safe Software
 
FIDO Seminar: New Data: Passkey Adoption in the Workforce.pptx
FIDO Seminar: New Data: Passkey Adoption in the Workforce.pptx
FIDO Alliance
 
Viral>Wondershare Filmora 14.5.18.12900 Crack Free Download
Viral>Wondershare Filmora 14.5.18.12900 Crack Free Download
Puppy jhon
 
High Availability On-Premises FME Flow.pdf
High Availability On-Premises FME Flow.pdf
Safe Software
 
Integration of Utility Data into 3D BIM Models Using a 3D Solids Modeling Wor...
Integration of Utility Data into 3D BIM Models Using a 3D Solids Modeling Wor...
Safe Software
 
AI vs Human Writing: Can You Tell the Difference?
AI vs Human Writing: Can You Tell the Difference?
Shashi Sathyanarayana, Ph.D
 
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Alliance
 
Data Validation and System Interoperability
Data Validation and System Interoperability
Safe Software
 
FIDO Seminar: Evolving Landscape of Post-Quantum Cryptography.pptx
FIDO Seminar: Evolving Landscape of Post-Quantum Cryptography.pptx
FIDO Alliance
 
OWASP Barcelona 2025 Threat Model Library
OWASP Barcelona 2025 Threat Model Library
PetraVukmirovic
 
June Patch Tuesday
June Patch Tuesday
Ivanti
 
“Why It’s Critical to Have an Integrated Development Methodology for Edge AI,...
“Why It’s Critical to Have an Integrated Development Methodology for Edge AI,...
Edge AI and Vision Alliance
 
Bridging the divide: A conversation on tariffs today in the book industry - T...
Bridging the divide: A conversation on tariffs today in the book industry - T...
BookNet Canada
 
No-Code Workflows for CAD & 3D Data: Scaling AI-Driven Infrastructure
No-Code Workflows for CAD & 3D Data: Scaling AI-Driven Infrastructure
Safe Software
 
FIDO Seminar: Targeting Trust: The Future of Identity in the Workforce.pptx
FIDO Seminar: Targeting Trust: The Future of Identity in the Workforce.pptx
FIDO Alliance
 
Raman Bhaumik - Passionate Tech Enthusiast
Raman Bhaumik - Passionate Tech Enthusiast
Raman Bhaumik
 
Supporting the NextGen 911 Digital Transformation with FME
Supporting the NextGen 911 Digital Transformation with FME
Safe Software
 
ENERGY CONSUMPTION CALCULATION IN ENERGY-EFFICIENT AIR CONDITIONER.pdf
ENERGY CONSUMPTION CALCULATION IN ENERGY-EFFICIENT AIR CONDITIONER.pdf
Muhammad Rizwan Akram
 
Tech-ASan: Two-stage check for Address Sanitizer - Yixuan Cao.pdf
Tech-ASan: Two-stage check for Address Sanitizer - Yixuan Cao.pdf
caoyixuan2019
 
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
NTT DATA Technology & Innovation
 
Providing an OGC API Processes REST Interface for FME Flow
Providing an OGC API Processes REST Interface for FME Flow
Safe Software
 
FIDO Seminar: New Data: Passkey Adoption in the Workforce.pptx
FIDO Seminar: New Data: Passkey Adoption in the Workforce.pptx
FIDO Alliance
 
Viral>Wondershare Filmora 14.5.18.12900 Crack Free Download
Viral>Wondershare Filmora 14.5.18.12900 Crack Free Download
Puppy jhon
 
High Availability On-Premises FME Flow.pdf
High Availability On-Premises FME Flow.pdf
Safe Software
 
Integration of Utility Data into 3D BIM Models Using a 3D Solids Modeling Wor...
Integration of Utility Data into 3D BIM Models Using a 3D Solids Modeling Wor...
Safe Software
 
AI vs Human Writing: Can You Tell the Difference?
AI vs Human Writing: Can You Tell the Difference?
Shashi Sathyanarayana, Ph.D
 
Ad

Ruby on Rails (RoR) as a back-end processor for Apex

  • 1. Ruby on Rails (RoR) as a back-end processor for Apex Espen Braekken Director of Consulting Senitel Consulting AS
  • 2. First English? Norwegian? Questions Spørsmål
  • 3. Agenda About me About Senitel Consulting Why do we need a supplement to Apex? Why Ruby and Rails (and friends)? Examples of Ruby in action Notes on deployment and integration How to get started Wrap up
  • 4. About me Director of Consulting, Senitel Director of Sales and Services, dbWatch Practice Manager, Oracle Performance and Technical Architecture Director of Engineering, e-Travel Technical Manager, Oracle Consulting System Performance Group
  • 5. Senitel Consulting AS Established 1996 with focus on Oracle Owned by employees Focus Web development (Oracle Application Express) Data warehouse / BI solutions Database Training and workshops Oracle licensing
  • 6. Why Apex? Great integrated environment: Fast Full Oracle stack DBA friendly PL/SQL Same language for back-end and front-end => gives small Oracle teams same advantage as that of more famous and “sexy” frameworks: Ruby on Rails, Zend and more.
  • 7. Why do we need a supplement to Apex? Things that are difficult: Communication with the operating system Communication with command line scripts, potentially on other physical machines Receiving and parsing emails ssh and (s)ftp May end up with brittle solutions that fail at random.
  • 8. Warning! Our approach is to use Ruby as glue (ref Perl: The Glue of the internet) (slightly) changed from what is in the program, based on experience last 6 months Learning a new language can be addictive General understanding Skills New perspective on your native language Fun!
  • 9. Why Ruby and Rails (and friends)? Talk to command line Run from command line Integrate with multiple data sources (MySQL, MSSQL, Oracle) Wide choice of communication protocols Wide range of add-ins/tools Short development cycles Easy to deploy
  • 10. This works on all platforms. The Ruby file IO library will translate to local “naming” standard.
  • 11. PHP and Perl crashing the enterprise party
  • 12. Take the A Train
  • 13. Huh – those numbers are relative!
  • 14. Ruby, what is it? Ruby is a dynamic, reflective, general purpose object-oriented programming language that combines syntax inspired by Perl with Smalltalk-like features. Ruby originated in Japan during the mid-1990s and was initially developed and designed by Yukihiro "Matz" Matsumoto. It was influenced primarily by Perl, Smalltalk, Eiffel, and Lisp. Source: wikipedia
  • 15. Ruby C like syntax. The standard 1.8.7 implementation is written in C, as a single-pass interpreted language Runs in a VM Available on “all” platforms: Linux Mac Windows Java
  • 16. Rails, a short introduction A Model-View-Controller framework Open Source Web applications Developed by David Heinemeier Hansson (DHH) of 37signals Principles: Convention over configuration Don’t repeat yourself (DRY) Similar frameworks CakePHP CodeIgniter
  • 17. What does this mean? Convention over configuration Almost no configuration file setup Only define specifics Everything else is based on “sensible” defaults Don’t Repeat Yourself (DRY) Extensive re-use Easy to add own methods as helpers
  • 20. Rails and friends -- I We «lied» ... when we talk about Rails, we really mean Ruby++ Our use of Rails is more on the back-end than the front ActiveRecord (ORM) ActionMailer ActiveResource ActionPack ActiveSupport
  • 21. Rails and friends -- II Back-end scripts with database functionality Alternatives to Rails: Merb (will be merged with Rails in 3.0) Sinatra (for lightweight RESTful services)
  • 22. Rails, how and when to use We use as a supplement, not instead of To create good applications with Rails, you need to work with it every day Use under these conditions: Create RESTful services When you need support of multiple data sources (Oracle and MySQL) When your command line scripts suite is becoming a nightmare
  • 23. AciveRecord, the gem in Rails Object Relational Mapping (ORM) Table names in plural PK is always id (number) FK always table-name-in-singular _id For Oracle a sequence per table: table-name-in-singular _seq
  • 24.  
  • 25. Not too elegant, let’s use a yml file instead (next slide)
  • 29.  
  • 30. What about stored procedures? There is a very comprehensive library for calling PL/SQL: ruby-plsql Developed by Oracle ACE Raimonds Simanovskis – Oracle Developer of the Year 2009 We have not been successful in using with JRuby/JDBC Seems to have bindings to OCI based Oracle adapter Use if Java/JRuby is not important to you
  • 32. Sample projects – I Dynamic creation of sql-loader scripts New loader file for each input file Constants and status codes Modeled after Rails’ implementation ERb
  • 33.  
  • 34.  
  • 35. Sample projects – II Generic remote file management Supports ssh, ftp and s3 Basic operations on remote folders ls save (put) download (get) Operations to/from files or in-memory objects Can stream from remote file directly to LOB
  • 36.  
  • 37.  
  • 38. Sample projects – III Calling Java code Ruby wrapper with exception handling, parameters etc for exporting (backing up) Apex code.
  • 39.  
  • 40. Deployment, alternatives We use Jruby and Tomcat/Glassfish for all our deployments Can use any J2EE container This means running your Ruby code in a Java Runtime environment Reduces your Rails deployment to copying a war file onto the server Familiar ground for sysadmins, both from deployment and everyday management perspective J2EE is the platform; Operating system of no consequence
  • 41. How to get started Learn the language Ruby first, then a framework Start small Replace shell/bat scripts with Ruby first Then add DB interaction Wait with frameworks until you know Ruby Assess your needs No UI/Html => Merb or Sinatra
  • 42. Wrap up Work with tool, not against it Apex where it shines Ruby++ where needed Dynamic languages is one the rise Ruby/Rails the fastest riser Don't be fooled, high productivity does not equal easy!

Editor's Notes

  • #12: Matt Asay: http://news.cnet.com/8301-13505_3-10453213-16.html 14. Feb 2010
  • #13: Duke Ellington