Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs...
Transcript of Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs...
![Page 1: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/1.jpg)
Ruby.learn{ |stuff| }
● What is Ruby?● What features make it interesting to me (and
maybe you)?● A quick, idiosyncratic tour of the Ruby
ecosphere.
Tuesday Software Lunch Talk: March 4, 2008
![Page 2: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/2.jpg)
What is it?
● a dynamic, object-oriented, open source programming language...
● with a uniquely (but not too uniquely), expressive syntax
● dynamically or “duck” typed● influenced by Perl, Smalltalk, Eiffel, Ada and
Lisp● has aspects of functional and imperative
programming styles
![Page 3: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/3.jpg)
History
● created by Yukihiro “Matz” Matsumoto on Feb 24 1993, released to public in 1995
● “Ruby” coined in comparison to “Perl”
![Page 4: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/4.jpg)
Philosophy (the “Ruby Way”)
● emphasize programmer needs over computer needs
● encourage good design, good APIs● Principle of Least Surprise (POLS)
– the language should behave in such a way as to minimize confusion for experienced users
● “Everything should be a simple as possible, but no simpler.” - Einstein
● orthogonality● change at runtime is not to be feared
![Page 5: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/5.jpg)
Interesting Stuff...
● Is Not a Ruby tutorial– http://tryruby.hobix.com/– Programming Ruby: The Pragmatic
Programmer's Guide– our just google it– you want something totally different?
● http://poignantguide.net/ruby/● Is what I find interesting/different/well done
about Ruby.
![Page 6: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/6.jpg)
Everything's an Object
● no exceptions
![Page 7: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/7.jpg)
Falsiness
● only false and nil are falsey. Not 0.
![Page 8: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/8.jpg)
Symbols
● labels● lightweight strings with no behaviour● often used as hash keys
![Page 9: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/9.jpg)
Blocks
● another name for a Ruby block is a “closure”● clo-sure [kloh-zher] – noun. A function that
is evaluated in an environment containing one or more bound variables.
![Page 10: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/10.jpg)
Procs
● anonymous subroutines or closures with a life of their own
![Page 11: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/11.jpg)
Adding Methods to Classes
● You can add methods to an object at runtime in several ways...
![Page 12: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/12.jpg)
Adding Methods: Classes are Open
● you can “reopen” a class
![Page 13: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/13.jpg)
Adding Methods: Mix-ins
● you can “mix-in” extra methods from modules
![Page 14: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/14.jpg)
Adding Methods: Extending Instances
● you can mix-in methods only for a particular instance
![Page 15: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/15.jpg)
Enumerable
● suppose I have a collection of objects● it has an #each method that allows me to
iterate through each member of a collection● I can mix-in the Enumerable module and get
a whole range of useful methods for free:– #find, #find_all, #detect, #reject, #grep– #map, #inject– #sort, if the shuttle operator (<=>) is defined– + more...
![Page 16: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/16.jpg)
Enumerable: Example
![Page 17: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/17.jpg)
Regular Expressions
● supports Perl-like constructs● all the usual Perl character classes and what
not are supported
![Page 18: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/18.jpg)
Attribute Accessors
● spend a lot of time writing trivial accessors (getters/setters)
● Ruby can help with the drudgery
![Page 19: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/19.jpg)
Stuff I haven't mentioned (for no good reason)
● exception handling (raise, catch, throw)● ranges● a sweet switch statement● threads/processes● writing domain specific languages● lots of other stuff...
![Page 20: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/20.jpg)
The Wide Wide World...
● how I use Ruby regularly● Ruby is in no way restricted by my
imagination—this is not exhaustive!● Rubyforge.org (http://rubyforge.org/) is your
friend● learn about the rubygems (
http://www.rubygems.org/) system—like CPAN for ruby.
![Page 21: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/21.jpg)
Read CSV Files: csv
● in core library● slow on large files● slightly awkward API for certain things
– try FasterCSV (http://fastercsv.rubyforge.org/)
![Page 22: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/22.jpg)
Access a Database
● huge range of choices● I'll demonstrate just a few● I normally use ActiveRecord because it plays
nice w/ Rails
![Page 23: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/23.jpg)
Access a Database: Sequel
● http://sequel.rubyforge.org/● strengths
– thread safety– connection pooling
![Page 24: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/24.jpg)
Access a Database: ActiveRecord
● part of Rails, but can be used separately
![Page 25: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/25.jpg)
Access a Database: DataMapper
● http://datamapper.org/● fast● new kid on the block● borrows a lot of ActiveRecord syntax● excellent alternative if you're not using Rails
![Page 26: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/26.jpg)
Access a Database: DataMapper
![Page 27: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/27.jpg)
Parse HTML: Hpricot
● http://code.whytheluckystiff.net/hpricot/● a flexible HTML parser● access elements through a CSS selector-like
syntax
![Page 28: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/28.jpg)
Parse XML: rexml
● in standard library● nice API● slow on large XML
![Page 29: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/29.jpg)
Parse XML: ruby-libxml
● wrapper around C library libxml2● screaming fast even on large XML● somewhat screwy namespace support● slightly awkward API sometimes
![Page 30: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/30.jpg)
Build an App: Rake
● http://rake.rubyforge.org/● a simple ruby build program with capabilities
similar to make or ant
![Page 31: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/31.jpg)
Build an App: Rake
![Page 32: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/32.jpg)
Automate Remote Tasks: Capistrano
● http://www.capify.org/● tool for automating tasks on one or more
remote servers● not only good for Ruby/Rails tasks
![Page 33: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/33.jpg)
Automate Remote Tasks: Capistrano
![Page 34: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/34.jpg)
Remote Method Invocation
● many options● outline the most common
![Page 35: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/35.jpg)
Remote Method Invoction: soap4r
● http://dev.ctor.org/soap4r● complicated, but relatively complete SOAP
1.1 implementation● in standard library, but old. Use gem version.
![Page 36: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/36.jpg)
Remote Method Invocation: xmlrpc
● http://www.fantasy-coders.de/ruby/xmlrpc4r/● in the standard library● lightweight compared to soap4r● nice and simple
![Page 37: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/37.jpg)
Remote Method Invocation: DRb
● http://chadfowler.com/ruby/drb.html● in the standard library
![Page 38: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/38.jpg)
Aspect Oriented Programming: Aquarium
● http://aquarium.rubyforge.org/
![Page 39: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/39.jpg)
Manipulate Images: RMagick
● http://rmagick.rubyforge.org/● wrapper around ImageMagick
– http://www.imagemagick.org/● therefore requires ImageMagick to be
installed
![Page 40: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/40.jpg)
Manipulate Images: RMagick
![Page 41: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/41.jpg)
Testing: Test::Unit
● in core library● typical unit testing framework
![Page 42: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/42.jpg)
Testing: RSpec
● http://rspec.info/● Behaviour Driven Development framework● includes:
– story framework– spec framework– mock object support
![Page 43: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/43.jpg)
Testing: RSpec
● Story Framework
![Page 44: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/44.jpg)
Testing: RSpec
● Spec Framework
![Page 45: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/45.jpg)
Numerical Computing: Ruby/GSL
● http://rb-gsl.rubyforge.org/● wraps the GNU Scientific Library● vectors, matrices, linear algebra, fourier
transforms, wavelet transforms, etc. etc.
![Page 46: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/46.jpg)
Query the VO: VORuby
● http://rubyforge.org/projects/voruby/● use voruby2 (currently in “preview”)
![Page 47: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/47.jpg)
Read FITS Files
● http://rubyforge.org/projects/rfits● wrapper around cfitsio
![Page 48: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/48.jpg)
Wrap Java: JRuby
● http://jruby.codehaus.org/● alternate implementation of Ruby 1.8.6 under
the JVM
![Page 49: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/49.jpg)
Wrap Java: JRuby
![Page 50: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/50.jpg)
Wrap Java: JRuby
● a simple Savot Java program● not bad, pretty compact● all those loops are bit distracting, though
![Page 51: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/51.jpg)
Wrap Java: JRuby
● equivalent in Ruby makes the domain more obvious
![Page 52: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/52.jpg)
Web Applications: Ruby on Rails
● full-stack framework for developing database-backed web applications according to the Model-View-Control pattern
● has its own extensive ecosphere● http://www.rubyonrails.org/
![Page 53: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/53.jpg)
Web Applications: Ruby on Rails
● philosophy– convention over configuration
● eschew complicated XML configuration files– don't repeat yourself (DRY)– less software
● write less code● easiest thing is just to show you an
example...
![Page 54: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/54.jpg)
Web Applications: Other
● Merb – http://www.merbivore.com/
● Nitro– http://www.nitroproject.org/
● Camping– http://code.whytheluckystiff.net/camping/
![Page 55: Ruby.learn{ |stuff| } · 2008-03-04 · Philosophy (the “Ruby Way”) emphasize programmer needs over computer needs encourage good design, good APIs Principle of Least Surprise](https://reader033.fdocuments.us/reader033/viewer/2022050101/5f401c91cbef8b21573e31e6/html5/thumbnails/55.jpg)
Resources
● About the language:– http://www.ruby-lang.org/ (canonical )– http://www.ruby-doc.org/ (documentation)
● Libraries/plugins/applications:– http://rubyforge.org/– http://raa.ruby-lang.org/