42
Amir Barylko - RoR Training MavenThought Inc. - June 2010 AMIR BARYLKO IRON RUBY AND .NET A MATCH MADE IN HEAVEN .NET USER GROUP SEP 2010

dotnet-ug-iron-ruby

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: dotnet-ug-iron-ruby

Amir Barylko - RoR Training MavenThought Inc. - June 2010

AMIR BARYLKOIRON RUBY AND .NET

A MATCH MADE INHEAVEN.NET USER GROUP

SEP 2010

Page 2: dotnet-ug-iron-ruby

Amir Barylko - RoR Training MavenThought Inc. - June 2010

WHO AM I?

• Architect

• Developer

• Mentor

• Great cook

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

Page 3: dotnet-ug-iron-ruby

Amir Barylko - RoR Training MavenThought Inc. - June 2010

CONTACT AND MATERIALS

• Contact me: [email protected], @abarylko

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

Page 4: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

RUBY INTRODynamic languages

TestingIRB

Constructs

Page 5: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

DYNAMIC LANGUAGES

High level

Dynamically typed

Runtime over compile time

Closures

Reflection

Platform independent

Page 6: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

.NET CLR

Iron Ruby DLR CLR

Page 7: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

DEVELOPERS TOOLBOX

•Make your toolbox grow!

• The right tool for the job

• Not a replacement

• Combine strengths

• Problem solving

Page 8: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

WELCOME TO RUBY

Created in mid-90s by “Matz” Matsumoto in Japan

Smalltalk, Perl influences

Dynamic typing

Object Oriented

Automatic memory management

Several implementations: MRI, YARB, JRuby

Totally free!!

Page 9: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

RUBY FEATURES

Everything is an expression

Metaprogramming

Closures

Garbage collection

Exceptions

Operator overloading, flexible syntax

Powerful standard library

Page 10: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

RUBY SUPPORT

Hundreds of books

User conferences all over the world

Active community (you can create a conf in your own city and top Ruby coders will go there to teach others, invite them and see)

Lots of great web sites: basecamp, twitter, 43 things, hulu, scribd, slideshare, Justin.tv

Lots of web frameworks inspired by Ruby on Rails

Page 11: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

SET UP

Download IronRuby installer

Put the bin folder on the path

That’s it!

Page 12: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

INTERACTIVE IRON RUBY SHELL

c:\> ir.exe

> puts “hello”

hello

=> nil

> "Hello World! " * 2

=> "Hello World! Hello World!

"

> ((1 + 5) * 3) ** 2

=> 324

> x = 1.upto(5).to_a

=> [1, 2, 3, 4, 5]

> x.join

=> "12345"

Page 13: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

BASIC TYPES

Numbers

1.class => Fixnum

1.1.class => Float

(120**100).class => Bignum

3.times {puts “he “}

Page 14: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

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

Page 15: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

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

Page 16: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

BASIC TYPES IV

• Hashesh = {“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

Page 17: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

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

Page 18: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

CONTROL STRUCTURES

if

while

if count < 20 puts “need more”elsif count < 40 puts “perfect”else puts “too many”end

while count < 100 && need_more buy(1)end

Page 19: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

CONTROL STRUCTURES II

Statement modifiers

buy while need_more?

buy(5) if need_more?

buy until left == 0

buy unless left < 5

Page 20: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

CONTROL STRUCTURES III

• Case

case left

when 0..5

dont_buy_more

when 6..10

buy(1)

when 10..100

buy(5)

end

Page 21: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

METHODS

Simple

Default arguments

def play(movie_path)....end

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

Page 22: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

METHODS II

Return value: the last expression evaluated, no need for explicit return

No need for parenthesis on call without arguments (same syntax to call a method and a field)

def votes(voted, num_votes) voted && num_votes || nilend

buy() == buy

movie.play() == movie.play

Page 23: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

METHODS III

No need also with arguments (but careful!! only if you know what you are doing)

movie.play “Pulp fiction”, false, true

Page 24: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

RUBY INTRO IIClassesMixin

Enumerable

Page 25: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

CLASSES & OBJECTS

Initializer and instance variablesclass Movie def initialize(name) @name = name end

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

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

=> Playing “Pulp fiction”. Enjoy!

Page 26: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

CLASSES & OBJECTS II Attributesclass Movie def initialize(name) @name = name end

def name @name end

def name=(value) @name = value end

end

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

# attr_reader :name

# attr_writter :name

# attr_accessor :name}

Page 27: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

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'

Page 28: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

CODE ORGANIZATION II

Relative to this file:require File.join(File.dirname(__FILE__), 'media/movie')

Page 29: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

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

Page 30: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

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

Page 31: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

ENUMERABLE II

It provides useful methods such as:

map

to_a

take_while

count

inject

Page 32: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

EXAMPLESrSpec

Enumerable Mixinmissing_method

SinatraBDD Cucumber

DSL

Page 33: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

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

Page 34: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

EXTEND LIBRARYWITH 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_byclass 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))

Page 35: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

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 Singletonend

# indexget '/' do @movies = Library.instance.contents haml :indexend

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

Page 36: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

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"

Page 37: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

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

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 endend

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

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_nilend

Page 38: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

DSL IRAKE

task :default => [:build]desc "Builds the project"task :build do call_target msbuild_cmd, :buildend

desc "Rebuild the application by cleaning and then building"task :rebuild => [:clean, :build] do #nothing to do....end

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

Page 39: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

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

Page 40: dotnet-ug-iron-ruby

QUESTIONS?

(Don’t be shy)

Page 41: dotnet-ug-iron-ruby

Amir Barylko - RoR Training MavenThought Inc. - June 2010

CONTACT AND MATERIALS

• Contact me: [email protected], @abarylko

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

Page 42: dotnet-ug-iron-ruby

Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010

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