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