Upload
amir-barylko
View
569
Download
0
Tags:
Embed Size (px)
DESCRIPTION
Citation preview
Amir Barylko - RoR Training MavenThought Inc. - June 2010
AMIR BARYLKOIRON RUBY AND .NET
A MATCH MADE INHEAVEN.NET USER GROUP
SEP 2010
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!
Amir Barylko - RoR Training MavenThought Inc. - June 2010
CONTACT AND MATERIALS
• Contact me: [email protected], @abarylko
• Download: http://www.orthocoders.com/presentations.
Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010
RUBY INTRODynamic languages
TestingIRB
Constructs
Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010
DYNAMIC LANGUAGES
High level
Dynamically typed
Runtime over compile time
Closures
Reflection
Platform independent
Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010
.NET CLR
Iron Ruby DLR CLR
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
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!!
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
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
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!
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"
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 “}
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
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
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
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”}
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
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
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
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
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
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
Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010
RUBY INTRO IIClassesMixin
Enumerable
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!
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}
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'
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')
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
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
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
Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Sep 2010
EXAMPLESrSpec
Enumerable Mixinmissing_method
SinatraBDD Cucumber
DSL
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
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))
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
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"
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
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"]
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
QUESTIONS?
(Don’t be shy)
Amir Barylko - RoR Training MavenThought Inc. - June 2010
CONTACT AND MATERIALS
• Contact me: [email protected], @abarylko
• Download: http://www.orthocoders.com/presentations.
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