SlideShare a Scribd company logo
1 of 42
Download to read offline
AMIR BARYLKO
                    IRON RUBY AND .NET
                      A MATCH MADE IN
                          HEAVEN
                                    CODEMASH
                                     JAN 2011




Amir Barylko - Iron Ruby and .NET               MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
WHO AM I?

   • Architect

   • Developer

   • Mentor

   • Great        cook

   • The      one who’s entertaining you for the next while!



Amir Barylko - Iron Ruby and .NET                          MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
CONTACT AND MATERIALS
   • Contact          me: amir@barylko.com, @abarylko

   • Download: http://www.orthocoders.com/presentations.




Amir Barylko - Iron Ruby and .NET                       MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
RUBY INTRO
                                     Dynamic languages
                                         Testing
                                           IRB
                                        Constructs




Amir Barylko - Iron Ruby and .NET                        MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
DYNAMIC LANGUAGES

          High level
          Dynamically typed
          Runtime over compile time
          Closures
          Reflection
          Platform independent

Amir Barylko - Iron Ruby and .NET      MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
.NET CLR


           Iron Ruby                   DLR           CLR




Amir Barylko - Iron Ruby and .NET              MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
DEVELOPERS TOOLBOX
   • Make        your toolbox grow!

   • The      right tool for the job

   • Not       a replacement

   • Combine             strengths

   • Problem           solving



Amir Barylko - Iron Ruby and .NET      MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
WELCOME TO RUBY

          Created in mid-90s by          Several implementations:
           “Matz” Matsumoto in Japan       MRI, YARB, JRuby
          Smalltalk, Perl influences      Totally free!!
          Dynamic typing
          Object Oriented
          Automatic memory
           management

Amir Barylko - Iron Ruby and .NET                           MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
RUBY FEATURES

          Everything is an expression      Operator overloading,
                                             flexible syntax
          Metaprogramming
                                            Powerful standard library
          Closures
          Garbage collection
          Exceptions



Amir Barylko - Iron Ruby and .NET                         MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
RUBY SUPPORT

          Hundreds of books              Lots of great web sites:
                                           basecamp, twitter, 43
          User conferences all over       things, hulu, scribd,
           the world                       slideshare, Justin.tv
          Active community (you can      Lots of web frameworks
           create a conf in your own       inspired by Ruby on Rails
           city and top Ruby coders
           will go there to teach
           others, invite them and
           see)

Amir Barylko - Iron Ruby and .NET                        MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
SET UP

          Download IronRuby installer
          Put the bin folder on the path
          That’s it!




Amir Barylko - Iron Ruby and .NET            MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
INTERACTIVE
                             IRON RUBY SHELL
      c:> ir.exe

      > puts “hello”                   > x = 1.upto(5).to_a
      hello                            => [1, 2, 3, 4, 5]
      => nil
                                       > x.join
      > "Hello World! " * 2            => "12345"
      => "Hello World! Hello World!"
                                       > (1..10).inject([]) { |a, i| a << i      }
      > ((1 + 5) * 3) ** 2             => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
      => 324




Amir Barylko - Iron Ruby and .NET                              MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
BASIC TYPES
        Numbers
          1.class => Fixnum
          1.1.class => Float
          (120**100).class => Bignum
          3.times {puts “he “}




Amir Barylko - Iron Ruby and .NET                 MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
BASIC TYPES II
   • Strings

      'he ' + 'he' => he he
      “That's right” => That's right
      'He said “hi”' => He said “hi”
      “He said “hi”” => He said “hi”
      “1 + 1 is #{1+1}” => 1 + 1 is 2
      "#{'Ho! '*3}Merry Christmas" =>Ho! Ho! Ho! Merry
      Christmas



Amir Barylko - Iron Ruby and .NET                    MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
BASIC TYPES III
      Arrays
       a = [1, 5.5, “nice!”]
       1 == a.first
       1 == a[0]
       nil == a[10]
       a[1] = 3.14
       a.each {|elem| puts elem}
       a.sort



Amir Barylko - Iron Ruby and .NET                     MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
BASIC TYPES IV
   • Hashes
      h = {“one” => 1, 1 => “one”}
      h[“one”] == 1
      h[1] == “one”
      h[“two”] == nil
      h.keys == [“one”, 1] (or is it [1, “one”] ?)
      h.values == [“one”, 1] (or is it [1, “one”] ?)
      h[“one”] = 1.0



Amir Barylko - Iron Ruby and .NET                MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
BASIC TYPES V
       Symbols: constant names. No need to declare, guaranteed
        uniqueness, fast comparison

   :apple == :apple
   :orange != :banana
   [:all, :those, :symbols]
   {:ca => “Canada”, :ar => “Argentina”, :es => “Spain”}




Amir Barylko - Iron Ruby and .NET                      MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
CONTROL STRUCTURES
          if
           if count < 20
             puts “need more”
           elsif count < 40
             puts “perfect”
           else
             puts “too many”
           end
          while
            while count < 100 && need_more
                buy(1)
            end
Amir Barylko - Iron Ruby and .NET            MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
CONTROL STRUCTURES II
        Statement modifiers
         buy while need_more?

         buy(5) if need_more?

         buy until left == 0

         buy unless left < 5




Amir Barylko - Iron Ruby and .NET   MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
CONTROL STRUCTURES III
   • Case
       case left
            when 0..5
              dont_buy_more
            when 6..10
              buy(1)
            when 10..100
              buy(5)
       end

Amir Barylko - Iron Ruby and .NET   MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
METHODS
        Simple
          def play(movie_path)
          ....
          end

        Default arguments
          def play(movie_path, auto_start = true, wrap = false)
          ....
          end




Amir Barylko - Iron Ruby and .NET                     MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
METHODS II
        Return value: the last expression evaluated, no need for
         explicit return
         def votes(voted, num_votes)
           voted && num_votes || nil
         end

        No need for parenthesis on call without arguments (same
         syntax to call a method and a field)
         buy() == buy
         movie.play() == movie.play

Amir Barylko - Iron Ruby and .NET                         MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
METHODS III
       No need also with arguments (but careful!! only if you know
        what you are doing)

         movie.play “Pulp fiction”, false, true




Amir Barylko - Iron Ruby and .NET                       MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
RUBY INTRO II
                                          Classes
                                           Mixin
                                        Enumerable




Amir Barylko - Iron Ruby and .NET                    MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
CLASSES & OBJECTS

       Initializer and instance variables
         class Movie
           def initialize(name)
             @name = name
           end

           def play
             puts %Q{Playing “#{@name}”. Enjoy!}
           end
         end

         m = Movie.new(“Pulp fiction”)
         m.play

         => Playing “Pulp fiction”. Enjoy!


Amir Barylko - Iron Ruby and .NET                  MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
CLASSES & OBJECTS II
        Attributes
     class Movie
       def initialize(name)
         @name = name
       end



                                                           }
         def name                   # attr_reader :name
           @name
         end                                                   # attr_accessor :name

         def name=(value)           # attr_writter :name
           @name = value
         end

     end

     m = Movie.new('Brazil').name = “Pulp fiction”



Amir Barylko - Iron Ruby and .NET                                    MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
CODE ORGANIZATION
        Code in files with .rb extension
        Require 'movie' will read movie.rb file and make its methods
         available to the current file
        Require 'media/movie' will read file from media dir relative
         to the current working dir
            $LOAD_PATH << 'media'
            require 'movie'




Amir Barylko - Iron Ruby and .NET                        MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
CODE ORGANIZATION II
       Relative to this file:
         require File.join(File.dirname(__FILE__), 'media/movie')




Amir Barylko - Iron Ruby and .NET                    MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
MIXINS
        What about module “instance methods”?
        One of the greatest Ruby features!
        You can define functions in Modules, and get them added to
         your classes.
             Great code reuse,
             Multiple inheritance alternative.
             Code organization


Amir Barylko - Iron Ruby and .NET                      MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
ENUMERABLE
        Enumerable mixin, from the standard library documentation:


            The Enumerable mixin provides collection
            classes with several traversal and
            searching methods, and with the ability to
            sort. The class must provide a method each,
            which yields successive members of the
            collection


Amir Barylko - Iron Ruby and .NET                     MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
ENUMERABLE II
       It provides useful methods such as:

             map

             to_a

             take_while

             count

             inject


Amir Barylko - Iron Ruby and .NET              MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
EXAMPLES
                                          rSpec
                                    Enumerable Mixin
                                     missing_method
                                          Sinatra
                                     BDD Cucumber
                                           DSL

Amir Barylko - Iron Ruby and .NET                      MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
RSPEC TESTING LIBRARY
      require File.dirname(__FILE__) + "/../main/MavenThought.MovieLibrary/bin/Debug/MavenThought.MovieLibrary.dll"
      require 'rubygems'
      require 'spec'
      include MavenThought::MovieLibrary

      describe Library do
      	

      it "should be created empty" do
      	

      	

    lib = Library.new
      	

      	

    lib.contents.should be_empty
      	

      end

      	

      it "should add an element" do
      	

      	

    lib = Library.new
      	

      	

    m = Movie.new 'Blazing Saddles'
      	

      	

    lib.add m
      	

      	

    lib.contents.should include(m)
      	

      	

    lib.contents.count.should == 1
      	

      end
      	

      end


Amir Barylko - Iron Ruby and .NET                                                               MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
EXTEND LIBRARY
                 WITH METHOD MISSING
      require File.dirname(__FILE__) + "/../main/MavenThought.MovieLibrary/bin/Debug/MavenThought.MovieLibrary.dll"

      require 'rubygems'

      include MavenThought::MovieLibrary

      # Extend library to use method missing to add find_by
      class Library

      	

        def method_missing(m, *args)
      	

        	

    if m.id2name.include?( "find_by" )
      	

        	

    	

      field = m.id2name.sub /find_by_/, ""
      	

        	

    	

      contents.find_all( lambda{ |m| m.send(field) == args[0] } )
      	

        	

    else
      	

        	

    	

      super
      	

        	

    end
      	

        end
      	

      end


      l = Library.new

      l.add Movie.new('Blazing Saddles', System::DateTime.new(1972, 1, 1))
      l.add Movie.new('Spaceballs', System::DateTime.new(1984, 1, 1))

      puts "Found the movie #{l.find_by_title 'Spaceballs'}"
      puts "Found the movie #{l.find_by_release_date System::DateTime.new(1972, 1, 1)}"



Amir Barylko - Iron Ruby and .NET                                                                                     MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
SIMPLE WEB WITH SINATRA
      require 'rubygems'
      require 'sinatra'
      require 'haml'
      require 'singleton'

      require File.dirname(__FILE__) + "/../main/MavenThought.MovieLibrary/bin/Debug/MavenThought.MovieLibrary.dll"
      include MavenThought::MovieLibrary

      class Library
          include Singleton
      end

      # index
      get '/' do
       @movies = Library.instance.contents
       haml :index
      end

      # create
      post '/' do
       m = Movie.new(params[:title])
       Library.instance.add m
       redirect '/'
      end



Amir Barylko - Iron Ruby and .NET                                                                               MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
BDD WITH CUCUMBER
      Feature: Addition
      	

    In order to make my library grow
      	

    As a registered user
      	

    I want to add movies to the library

      	

      Scenario: Add a movie
      	

      	

 Given I have an empty library
      	

      	

 When I add the following movies:
                              |   title                |   release_date   |
                              |   Blazing Saddles      |   Feb 7, 1974    |
                              |   Young Frankenstein   |   Dec 15, 1974   |
                              |   Spaceballs           |   Jun 24, 1987   |
      	

      	

   Then    The library should have 3 movies
      	

      	

   And     "Blazing Saddles" should be in the list with release date "Feb 7, 1974"
      	

      	

   And     "Young Frankenstein" should be in the list with release date "Dec 15, 1974"
      	

      	

   And     "Spaceballs" should be in the list with release date "Jun 24, 1987"


Amir Barylko - Iron Ruby and .NET                                                   MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
CUCUMBER STEPS
      require File.dirname(__FILE__) + "/../../main/MavenThought.MovieLibrary/bin/Debug/MavenThought.MovieLibrary.dll"

      include MavenThought::MovieLibrary

      Given /^I have an empty library$/ do
       @lib = Library.new
      end

      When /^I add the following movies:$/ do |table|
          table.hashes.each do |row|
            movie = Movie.new row[:title], System::DateTime.parse(row[:release_date])
      	

          @lib.add movie
          end
      end

      Then /^The library should have (.*) movies$/ do |count|
       @lib.contents.count.should == count.to_i
      end

      Then /^"([^"]*)" should be in the list with release date "([^"]*)"$/ do |title, release|
       @lib.contents.find( lambda { |m| m.title == title and m.release_date == System::DateTime.parse(release) } ).should_not be_nil
      end



Amir Barylko - Iron Ruby and .NET                                                                          MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
DSL I
                                    RAKE
   desc "Builds the project"
   task :build do
   	

 call_target msbuild_cmd, :build
   end

   desc "Rebuild the application by cleaning and then building"
   task :rebuild => [:clean, :build]

   desc "Runs all the tests"
   task :test => ["test:all"]


Amir Barylko - Iron Ruby and .NET                                 MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
DSL II
                        CRON - WHENEVER
    every 10.minutes do
       runner "MyModel.some_process"
       rake "my:rake:task"
       command "/usr/bin/my_great_command"
    end


    every 2.days, :at => '4:30am' do
       command "/usr/bin/my_great_command"
    end




Amir Barylko - Iron Ruby and .NET            MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
QUESTIONS?




                               (Don’t be shy)




Thursday, January 13, 2011
CONTACT AND MATERIALS

   •   Contact me: amir@barylko.com, @abarylko

   •   Download: http://www.orthocoders.com/presentations.




Amir Barylko - RoR Training                         MavenThought Inc. - June 2010
Thursday, January 13, 2011
ONLINE RESOURCES
        IronRuby: http://ironruby.net/
        The Ruby Bible (a.k.a. Pickaxe): http://ruby-doc.org/docs/ProgrammingRuby/
        Ruby language site: http://www.ruby-lang.org
        rSpec: http://rspec.info/
        Sinatra: http://www.sinatrarb.com/
        Cucumber: http://cukes.info/
        Rake: http://rake.rubyforge.org/
Amir Barylko - Iron Ruby and .NET                                        MavenThought Inc. - Jan 2011
Thursday, January 13, 2011

More Related Content

Similar to Codemash-iron-ruby-match-made-in-heaven

every-day-automation
every-day-automationevery-day-automation
every-day-automationAmir Barylko
 
Quality web-acceptance
Quality web-acceptanceQuality web-acceptance
Quality web-acceptanceAmir Barylko
 
The Dark Depths of iOS [CodeMash 2011]
The Dark Depths of iOS [CodeMash 2011]The Dark Depths of iOS [CodeMash 2011]
The Dark Depths of iOS [CodeMash 2011]Chris Adamson
 
A Look at the Future of HTML5
A Look at the Future of HTML5A Look at the Future of HTML5
A Look at the Future of HTML5Tim Wright
 
Developing Cocoa Applications with macRuby
Developing Cocoa Applications with macRubyDeveloping Cocoa Applications with macRuby
Developing Cocoa Applications with macRubyBrendan Lim
 
Monitoring is easy, why are we so bad at it presentation
Monitoring is easy, why are we so bad at it  presentationMonitoring is easy, why are we so bad at it  presentation
Monitoring is easy, why are we so bad at it presentationTheo Schlossnagle
 
Conquistando el Servidor con Node.JS
Conquistando el Servidor con Node.JSConquistando el Servidor con Node.JS
Conquistando el Servidor con Node.JSCaridy Patino
 
Node js techtalksto
Node js techtalkstoNode js techtalksto
Node js techtalkstoJason Diller
 
node.js for front-end developers
node.js for front-end developersnode.js for front-end developers
node.js for front-end developersGarann Means
 
Ruby hollywood
Ruby hollywoodRuby hollywood
Ruby hollywoodehuard
 
Image and Music: Processing plus Pure Data with libpd library
Image and Music: Processing plus Pure Data with libpd libraryImage and Music: Processing plus Pure Data with libpd library
Image and Music: Processing plus Pure Data with libpd libraryPETER KIRN
 

Similar to Codemash-iron-ruby-match-made-in-heaven (15)

obs-tdd-intro
obs-tdd-introobs-tdd-intro
obs-tdd-intro
 
every-day-automation
every-day-automationevery-day-automation
every-day-automation
 
Quality web-acceptance
Quality web-acceptanceQuality web-acceptance
Quality web-acceptance
 
The Dark Depths of iOS [CodeMash 2011]
The Dark Depths of iOS [CodeMash 2011]The Dark Depths of iOS [CodeMash 2011]
The Dark Depths of iOS [CodeMash 2011]
 
A Look at the Future of HTML5
A Look at the Future of HTML5A Look at the Future of HTML5
A Look at the Future of HTML5
 
Developing Cocoa Applications with macRuby
Developing Cocoa Applications with macRubyDeveloping Cocoa Applications with macRuby
Developing Cocoa Applications with macRuby
 
Monitoring is easy, why are we so bad at it presentation
Monitoring is easy, why are we so bad at it  presentationMonitoring is easy, why are we so bad at it  presentation
Monitoring is easy, why are we so bad at it presentation
 
Caridy patino - node-js
Caridy patino - node-jsCaridy patino - node-js
Caridy patino - node-js
 
Conquistando el Servidor con Node.JS
Conquistando el Servidor con Node.JSConquistando el Servidor con Node.JS
Conquistando el Servidor con Node.JS
 
Node js techtalksto
Node js techtalkstoNode js techtalksto
Node js techtalksto
 
agile-planning
agile-planningagile-planning
agile-planning
 
Web heresies
Web heresiesWeb heresies
Web heresies
 
node.js for front-end developers
node.js for front-end developersnode.js for front-end developers
node.js for front-end developers
 
Ruby hollywood
Ruby hollywoodRuby hollywood
Ruby hollywood
 
Image and Music: Processing plus Pure Data with libpd library
Image and Music: Processing plus Pure Data with libpd libraryImage and Music: Processing plus Pure Data with libpd library
Image and Music: Processing plus Pure Data with libpd library
 

More from Amir Barylko

Functional converter project
Functional converter projectFunctional converter project
Functional converter projectAmir Barylko
 
Elm: delightful web development
Elm: delightful web developmentElm: delightful web development
Elm: delightful web developmentAmir Barylko
 
User stories deep dive
User stories deep diveUser stories deep dive
User stories deep diveAmir Barylko
 
Coderetreat hosting training
Coderetreat hosting trainingCoderetreat hosting training
Coderetreat hosting trainingAmir Barylko
 
There's no charge for (functional) awesomeness
There's no charge for (functional) awesomenessThere's no charge for (functional) awesomeness
There's no charge for (functional) awesomenessAmir Barylko
 
What's new in c# 6
What's new in c# 6What's new in c# 6
What's new in c# 6Amir Barylko
 
Who killed object oriented design?
Who killed object oriented design?Who killed object oriented design?
Who killed object oriented design?Amir Barylko
 
From coach to owner - What I learned from the other side
From coach to owner - What I learned from the other sideFrom coach to owner - What I learned from the other side
From coach to owner - What I learned from the other sideAmir Barylko
 
Communication is the Key to Teamwork and productivity
Communication is the Key to Teamwork and productivityCommunication is the Key to Teamwork and productivity
Communication is the Key to Teamwork and productivityAmir Barylko
 
Acceptance Test Driven Development
Acceptance Test Driven DevelopmentAcceptance Test Driven Development
Acceptance Test Driven DevelopmentAmir Barylko
 
Agile requirements
Agile requirementsAgile requirements
Agile requirementsAmir Barylko
 
Agile teams and responsibilities
Agile teams and responsibilitiesAgile teams and responsibilities
Agile teams and responsibilitiesAmir Barylko
 
Beutiful javascript with coffeescript
Beutiful javascript with coffeescriptBeutiful javascript with coffeescript
Beutiful javascript with coffeescriptAmir Barylko
 
Rich UI with Knockout.js &amp; Coffeescript
Rich UI with Knockout.js &amp; CoffeescriptRich UI with Knockout.js &amp; Coffeescript
Rich UI with Knockout.js &amp; CoffeescriptAmir Barylko
 

More from Amir Barylko (20)

Functional converter project
Functional converter projectFunctional converter project
Functional converter project
 
Elm: delightful web development
Elm: delightful web developmentElm: delightful web development
Elm: delightful web development
 
Dot Net Core
Dot Net CoreDot Net Core
Dot Net Core
 
No estimates
No estimatesNo estimates
No estimates
 
User stories deep dive
User stories deep diveUser stories deep dive
User stories deep dive
 
Coderetreat hosting training
Coderetreat hosting trainingCoderetreat hosting training
Coderetreat hosting training
 
There's no charge for (functional) awesomeness
There's no charge for (functional) awesomenessThere's no charge for (functional) awesomeness
There's no charge for (functional) awesomeness
 
What's new in c# 6
What's new in c# 6What's new in c# 6
What's new in c# 6
 
Productive teams
Productive teamsProductive teams
Productive teams
 
Who killed object oriented design?
Who killed object oriented design?Who killed object oriented design?
Who killed object oriented design?
 
From coach to owner - What I learned from the other side
From coach to owner - What I learned from the other sideFrom coach to owner - What I learned from the other side
From coach to owner - What I learned from the other side
 
Communication is the Key to Teamwork and productivity
Communication is the Key to Teamwork and productivityCommunication is the Key to Teamwork and productivity
Communication is the Key to Teamwork and productivity
 
Acceptance Test Driven Development
Acceptance Test Driven DevelopmentAcceptance Test Driven Development
Acceptance Test Driven Development
 
Refactoring
RefactoringRefactoring
Refactoring
 
Agile requirements
Agile requirementsAgile requirements
Agile requirements
 
Agile teams and responsibilities
Agile teams and responsibilitiesAgile teams and responsibilities
Agile teams and responsibilities
 
Refactoring
RefactoringRefactoring
Refactoring
 
Beutiful javascript with coffeescript
Beutiful javascript with coffeescriptBeutiful javascript with coffeescript
Beutiful javascript with coffeescript
 
Sass & bootstrap
Sass & bootstrapSass & bootstrap
Sass & bootstrap
 
Rich UI with Knockout.js &amp; Coffeescript
Rich UI with Knockout.js &amp; CoffeescriptRich UI with Knockout.js &amp; Coffeescript
Rich UI with Knockout.js &amp; Coffeescript
 

Recently uploaded

Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embeddingZilliz
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
Vector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesVector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesZilliz
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfRankYa
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostZilliz
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
The Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfThe Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfSeasiaInfotech2
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024The Digital Insurer
 

Recently uploaded (20)

Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embedding
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
Vector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesVector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector Databases
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdf
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
The Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfThe Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdf
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024
 

Codemash-iron-ruby-match-made-in-heaven

  • 1. AMIR BARYLKO IRON RUBY AND .NET A MATCH MADE IN HEAVEN CODEMASH JAN 2011 Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 2. WHO AM I? • Architect • Developer • Mentor • Great cook • The one who’s entertaining you for the next while! Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 3. CONTACT AND MATERIALS • Contact me: amir@barylko.com, @abarylko • Download: http://www.orthocoders.com/presentations. Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 4. RUBY INTRO Dynamic languages Testing IRB Constructs Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 5. DYNAMIC LANGUAGES  High level  Dynamically typed  Runtime over compile time  Closures  Reflection  Platform independent Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 6. .NET CLR Iron Ruby DLR CLR Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 7. DEVELOPERS TOOLBOX • Make your toolbox grow! • The right tool for the job • Not a replacement • Combine strengths • Problem solving Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 8. WELCOME TO RUBY  Created in mid-90s by  Several implementations: “Matz” Matsumoto in Japan MRI, YARB, JRuby  Smalltalk, Perl influences  Totally free!!  Dynamic typing  Object Oriented  Automatic memory management Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 9. RUBY FEATURES  Everything is an expression  Operator overloading, flexible syntax  Metaprogramming  Powerful standard library  Closures  Garbage collection  Exceptions Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 10. RUBY SUPPORT  Hundreds of books  Lots of great web sites: basecamp, twitter, 43  User conferences all over things, hulu, scribd, the world slideshare, Justin.tv  Active community (you can  Lots of web frameworks create a conf in your own inspired by Ruby on Rails city and top Ruby coders will go there to teach others, invite them and see) Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 11. SET UP  Download IronRuby installer  Put the bin folder on the path  That’s it! Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 12. INTERACTIVE IRON RUBY SHELL c:> ir.exe > puts “hello” > x = 1.upto(5).to_a hello => [1, 2, 3, 4, 5] => nil > x.join > "Hello World! " * 2 => "12345" => "Hello World! Hello World!" > (1..10).inject([]) { |a, i| a << i } > ((1 + 5) * 3) ** 2 => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] => 324 Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 13. BASIC TYPES  Numbers 1.class => Fixnum 1.1.class => Float (120**100).class => Bignum 3.times {puts “he “} Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 14. BASIC TYPES II • Strings 'he ' + 'he' => he he “That's right” => That's right 'He said “hi”' => He said “hi” “He said “hi”” => He said “hi” “1 + 1 is #{1+1}” => 1 + 1 is 2 "#{'Ho! '*3}Merry Christmas" =>Ho! Ho! Ho! Merry Christmas Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 15. BASIC TYPES III  Arrays a = [1, 5.5, “nice!”] 1 == a.first 1 == a[0] nil == a[10] a[1] = 3.14 a.each {|elem| puts elem} a.sort Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 16. BASIC TYPES IV • Hashes h = {“one” => 1, 1 => “one”} h[“one”] == 1 h[1] == “one” h[“two”] == nil h.keys == [“one”, 1] (or is it [1, “one”] ?) h.values == [“one”, 1] (or is it [1, “one”] ?) h[“one”] = 1.0 Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 17. BASIC TYPES V  Symbols: constant names. No need to declare, guaranteed uniqueness, fast comparison :apple == :apple :orange != :banana [:all, :those, :symbols] {:ca => “Canada”, :ar => “Argentina”, :es => “Spain”} Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 18. CONTROL STRUCTURES  if if count < 20 puts “need more” elsif count < 40 puts “perfect” else puts “too many” end  while while count < 100 && need_more buy(1) end Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 19. CONTROL STRUCTURES II  Statement modifiers buy while need_more? buy(5) if need_more? buy until left == 0 buy unless left < 5 Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 20. CONTROL STRUCTURES III • Case case left when 0..5 dont_buy_more when 6..10 buy(1) when 10..100 buy(5) end Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 21. METHODS  Simple def play(movie_path) .... end  Default arguments def play(movie_path, auto_start = true, wrap = false) .... end Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 22. METHODS II  Return value: the last expression evaluated, no need for explicit return def votes(voted, num_votes) voted && num_votes || nil end  No need for parenthesis on call without arguments (same syntax to call a method and a field) buy() == buy movie.play() == movie.play Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 23. METHODS III  No need also with arguments (but careful!! only if you know what you are doing) movie.play “Pulp fiction”, false, true Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 24. RUBY INTRO II Classes Mixin Enumerable Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 25. CLASSES & OBJECTS  Initializer and instance variables class Movie def initialize(name) @name = name end def play puts %Q{Playing “#{@name}”. Enjoy!} end end m = Movie.new(“Pulp fiction”) m.play => Playing “Pulp fiction”. Enjoy! Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 26. CLASSES & OBJECTS II  Attributes class Movie def initialize(name) @name = name end } def name # attr_reader :name @name end # attr_accessor :name def name=(value) # attr_writter :name @name = value end end m = Movie.new('Brazil').name = “Pulp fiction” Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 27. CODE ORGANIZATION  Code in files with .rb extension  Require 'movie' will read movie.rb file and make its methods available to the current file  Require 'media/movie' will read file from media dir relative to the current working dir $LOAD_PATH << 'media' require 'movie' Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 28. CODE ORGANIZATION II  Relative to this file: require File.join(File.dirname(__FILE__), 'media/movie') Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 29. MIXINS  What about module “instance methods”?  One of the greatest Ruby features!  You can define functions in Modules, and get them added to your classes.  Great code reuse,  Multiple inheritance alternative.  Code organization Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 30. ENUMERABLE  Enumerable mixin, from the standard library documentation: The Enumerable mixin provides collection classes with several traversal and searching methods, and with the ability to sort. The class must provide a method each, which yields successive members of the collection Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 31. ENUMERABLE II  It provides useful methods such as:  map  to_a  take_while  count  inject Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 32. EXAMPLES rSpec Enumerable Mixin missing_method Sinatra BDD Cucumber DSL Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 33. RSPEC TESTING LIBRARY require File.dirname(__FILE__) + "/../main/MavenThought.MovieLibrary/bin/Debug/MavenThought.MovieLibrary.dll" require 'rubygems' require 'spec' include MavenThought::MovieLibrary describe Library do it "should be created empty" do lib = Library.new lib.contents.should be_empty end it "should add an element" do lib = Library.new m = Movie.new 'Blazing Saddles' lib.add m lib.contents.should include(m) lib.contents.count.should == 1 end end Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 34. EXTEND LIBRARY WITH METHOD MISSING require File.dirname(__FILE__) + "/../main/MavenThought.MovieLibrary/bin/Debug/MavenThought.MovieLibrary.dll" require 'rubygems' include MavenThought::MovieLibrary # Extend library to use method missing to add find_by class Library def method_missing(m, *args) if m.id2name.include?( "find_by" ) field = m.id2name.sub /find_by_/, "" contents.find_all( lambda{ |m| m.send(field) == args[0] } ) else super end end end l = Library.new l.add Movie.new('Blazing Saddles', System::DateTime.new(1972, 1, 1)) l.add Movie.new('Spaceballs', System::DateTime.new(1984, 1, 1)) puts "Found the movie #{l.find_by_title 'Spaceballs'}" puts "Found the movie #{l.find_by_release_date System::DateTime.new(1972, 1, 1)}" Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 35. SIMPLE WEB WITH SINATRA require 'rubygems' require 'sinatra' require 'haml' require 'singleton' require File.dirname(__FILE__) + "/../main/MavenThought.MovieLibrary/bin/Debug/MavenThought.MovieLibrary.dll" include MavenThought::MovieLibrary class Library include Singleton end # index get '/' do @movies = Library.instance.contents haml :index end # create post '/' do m = Movie.new(params[:title]) Library.instance.add m redirect '/' end Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 36. BDD WITH CUCUMBER Feature: Addition In order to make my library grow As a registered user I want to add movies to the library Scenario: Add a movie Given I have an empty library When I add the following movies: | title | release_date | | Blazing Saddles | Feb 7, 1974 | | Young Frankenstein | Dec 15, 1974 | | Spaceballs | Jun 24, 1987 | Then The library should have 3 movies And "Blazing Saddles" should be in the list with release date "Feb 7, 1974" And "Young Frankenstein" should be in the list with release date "Dec 15, 1974" And "Spaceballs" should be in the list with release date "Jun 24, 1987" Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 37. CUCUMBER STEPS require File.dirname(__FILE__) + "/../../main/MavenThought.MovieLibrary/bin/Debug/MavenThought.MovieLibrary.dll" include MavenThought::MovieLibrary Given /^I have an empty library$/ do @lib = Library.new end When /^I add the following movies:$/ do |table| table.hashes.each do |row| movie = Movie.new row[:title], System::DateTime.parse(row[:release_date]) @lib.add movie end end Then /^The library should have (.*) movies$/ do |count| @lib.contents.count.should == count.to_i end Then /^"([^"]*)" should be in the list with release date "([^"]*)"$/ do |title, release| @lib.contents.find( lambda { |m| m.title == title and m.release_date == System::DateTime.parse(release) } ).should_not be_nil end Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 38. DSL I RAKE desc "Builds the project" task :build do call_target msbuild_cmd, :build end desc "Rebuild the application by cleaning and then building" task :rebuild => [:clean, :build] desc "Runs all the tests" task :test => ["test:all"] Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 39. DSL II CRON - WHENEVER every 10.minutes do runner "MyModel.some_process" rake "my:rake:task" command "/usr/bin/my_great_command" end every 2.days, :at => '4:30am' do command "/usr/bin/my_great_command" end Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 40. QUESTIONS? (Don’t be shy) Thursday, January 13, 2011
  • 41. CONTACT AND MATERIALS • Contact me: amir@barylko.com, @abarylko • Download: http://www.orthocoders.com/presentations. Amir Barylko - RoR Training MavenThought Inc. - June 2010 Thursday, January 13, 2011
  • 42. ONLINE RESOURCES  IronRuby: http://ironruby.net/  The Ruby Bible (a.k.a. Pickaxe): http://ruby-doc.org/docs/ProgrammingRuby/  Ruby language site: http://www.ruby-lang.org  rSpec: http://rspec.info/  Sinatra: http://www.sinatrarb.com/  Cucumber: http://cukes.info/  Rake: http://rake.rubyforge.org/ Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011