Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

RUBY Getting Started DANIEL MORRISON Ι COLLECTIVE IDEA APPFORUM Americas 2012

Slide 3

Slide 3 text

WELCOME Daniel Morrison • @danielmorrison • Founder, Collective Idea • Based in Holland, Michigan • Programmer • Ruby & Rails Instructor

Slide 4

Slide 4 text

RUBY Language • Dynamic • Object-Oriented • Designed for Programmer Productivity Ruby on Rails • Web Framework • Launched Ruby into the public eye • Inspiration for many other frameworks RhoMobile • Uses Ruby to bridge devices • Rhodes framework takes cues from Rails

Slide 5

Slide 5 text

CORE RUBY

Slide 6

Slide 6 text

DATA TYPES Numbers • Integer types: • 5.class #=> Fixnum • 9999999999999999999.class # => Bignum

Slide 7

Slide 7 text

DATA TYPES Numbers • Integer types: • 5.class #=> Fixnum • 9999999999999999999.class # => Bignum Arithmetic Operation • + add • - subtract • * multiply • / divide • % modulus • ** exponent

Slide 8

Slide 8 text

STRINGS Strings in ruby • “Hello World” • Can use single or double quoted. • As well as more esoteric syntaxes: %q|Hello World|

Slide 9

Slide 9 text

STRINGS Strings in ruby • “Hello World” • Can use single or double quoted. • As well as more esoteric syntaxes: %q|Hello World| String Interpolation • “There are #{24 * 7} hours in a week.” • Only works with double quotes.

Slide 10

Slide 10 text

METHODS

Slide 11

Slide 11 text

METHODS Methods in ruby • Called Functions in other languages Define and call • def my_addition(value1, value2) value1 + value2 end • my_add(10, 5) # => 15

Slide 12

Slide 12 text

VARIABLES

Slide 13

Slide 13 text

VARIABLES Define a variable • a = “Hello World” • No need to specify type • Can redefine at any time • a = 15

Slide 14

Slide 14 text

VARIABLES Define a variable • a = “Hello World” • No need to specify type • Can redefine at any time • a = 15 Strong Dynamic Typing • Strong: variable always has an explicit type • Dynamic: type can change at any time

Slide 15

Slide 15 text

VARIABLES Define a variable • a = “Hello World” • No need to specify type • Can redefine at any time • a = 15 Strong Dynamic Typing • Strong: variable always has an explicit type • Dynamic: type can change at any time Duck Typing • def my_addition(value1, value2) value1 + value2 end • my_addition(“Hello”, “World”) # => “HelloWorld”

Slide 16

Slide 16 text

COLLECTION DATA TYPES

Slide 17

Slide 17 text

ARRAY Easy to create • a = [5, 10, 45, 9] • a = Array.new(5, 10, 45, 9) # works, but not usually used.

Slide 18

Slide 18 text

ARRAY Easy to create • a = [5, 10, 45, 9] • a = Array.new(5, 10, 45, 9) # works, but not usually used. Easy to access & modify • a[2] # => 45 • a[0] = 1000 # => [1000, 10, 45, 9]

Slide 19

Slide 19 text

ARRAY Easy to create • a = [5, 10, 45, 9] • a = Array.new(5, 10, 45, 9) # works, but not usually used. Easy to access & modify • a[2] # => 45 • a[0] = 1000 # => [1000, 10, 45, 9] Polyglot • b = [“banana”, 3.14, -200, “Hello World”] • Mix & match values

Slide 20

Slide 20 text

ARRAY Easy to create • a = [5, 10, 45, 9] • a = Array.new(5, 10, 45, 9) # works, but not usually used. Easy to access & modify • a[2] # => 45 • a[0] = 1000 # => [1000, 10, 45, 9] Polyglot • b = [“banana”, 3.14, -200, “Hello World”] • Mix & match values Dynamically Sized • fruits = [“Apple”, “Banana”] • fruits[2] = “Orange” # => [“Apple”, “Banana”, “Orange] • fruits.length # => 3

Slide 21

Slide 21 text

HASH Key-Value Store • AKA: HashTable, Dictionary, associative array • Key is unique

Slide 22

Slide 22 text

HASH Key-Value Store • AKA: HashTable, Dictionary, associative array • Key is unique Easy to Create • h = {“name” => “Daniel”, “language” => “Ruby”}

Slide 23

Slide 23 text

HASH Key-Value Store • AKA: HashTable, Dictionary, associative array • Key is unique Easy to Create • h = {“name” => “Daniel”, “language” => “Ruby”} Easy to Access • Array-like syntax • h[“name”] # => “Daniel” • h[“age”] # => nil • h[“age”] = 10 # => {“name” => “Daniel”, “age => 10, “language” => “Ruby”}

Slide 24

Slide 24 text

HASH Key-Value Store • AKA: HashTable, Dictionary, associative array • Key is unique Easy to Create • h = {“name” => “Daniel”, “language” => “Ruby”} Easy to Access • Array-like syntax • h[“name”] # => “Daniel” • h[“age”] # => nil • h[“age”] = 10 # => {“name” => “Daniel”, “age => 10, “language” => “Ruby”} Symbols • Begin with a colon • Most often used as hash keys • h = {:name => “Alice”, :age => 10} • h[:age] # => 10 • h[“age”] # => nil

Slide 25

Slide 25 text

NESTING Both Hash & Array can contain each other • apple = {“name” => “Apple”, “colors” => [“red”, “green”]} • banana = {“name” => “Banana”, “colors” => [“yellow”]} • fruits = [apple, banana] • fruits.last # => {“name” => “Banana”, “colors” => [“yellow”]}

Slide 26

Slide 26 text

NESTING Both Hash & Array can contain each other • apple = {“name” => “Apple”, “colors” => [“red”, “green”]} • banana = {“name” => “Banana”, “colors” => [“yellow”]} • fruits = [apple, banana] • fruits.last # => {“name” => “Banana”, “colors” => [“yellow”]} Multidimensional Arrays • matrix = [[3, 2, 6], [1, 4, 5], [7, 4, 7]] • matrix[0] # => [3, 2, 6]

Slide 27

Slide 27 text

RANGE Ranges of values • r = (10..100) • r.include?(20) # => true • r.include?(2) # => false

Slide 28

Slide 28 text

RANGE Ranges of values • r = (10..100) • r.include?(20) # => true • r.include?(2) # => false Useful with Dates & Times • jan1 = Date.new(2012, 1, 1) • dec31 = Date.new(2012, 1, 1) • (jan1..dec31).include?(Date.today) # => true • (jan1..dec31).include?(Date.today + 365) # => false

Slide 29

Slide 29 text

REGULAR EXPRESSIONS

Slide 30

Slide 30 text

REGULAR EXPRESSIONS Easy to Create • r = Regexp.new(“\d\d\d\d-\d\d-\d\d”) • r = /\d\d\d\d-\d\d-\d\d/

Slide 31

Slide 31 text

REGULAR EXPRESSIONS Easy to Create • r = Regexp.new(“\d\d\d\d-\d\d-\d\d”) • r = /\d\d\d\d-\d\d-\d\d/ Match Strings • info = “Conference runs from 2012-06-04 to 2012-06-06” • Use =~ to find match location • info =~ /\d\d\d\d-\d\d-\d\d/ # => 21 • Use match to get the data back • info.match(/\d\d\d\d-\d\d-\d\d/) # => #

Slide 32

Slide 32 text

REGULAR EXPRESSIONS Easy to Create • r = Regexp.new(“\d\d\d\d-\d\d-\d\d”) • r = /\d\d\d\d-\d\d-\d\d/ Match Strings • info = “Conference runs from 2012-06-04 to 2012-06-06” • Use =~ to find match location • info =~ /\d\d\d\d-\d\d-\d\d/ # => 21 • Use match to get the data back • info.match(/\d\d\d\d-\d\d-\d\d/) # => # Substitutions • info.sub(/\d\d\d\d-\d\d-\d\d/, “today”) - #=> “Conference runs from today to 2012-06-06” • info.gsub(/\d\d\d\d-\d\d-\d\d/, “today”) - #=> “Conference runs from today to today”

Slide 33

Slide 33 text

REGULAR EXPRESSIONS Test with rubular.com

Slide 34

Slide 34 text

CONDITIONALS AND LOOPS

Slide 35

Slide 35 text

IF STATEMENTS if • if input == “quit” exit end

Slide 36

Slide 36 text

IF STATEMENTS if • if input == “quit” exit end Single line if • exit if input == “quit”

Slide 37

Slide 37 text

IF STATEMENTS if • if input == “quit” exit end Single line if • exit if input == “quit” unless • unless input == “quit” do_work end • do_work unless input == “quit”

Slide 38

Slide 38 text

ELSE Test multiple conditions • if input == “quit” exit elsif input == “pause” sleep 20 else do_work end

Slide 39

Slide 39 text

ELSE Test multiple conditions • if input == “quit” exit elsif input == “pause” sleep 20 else do_work end • Note the spelling of elsif

Slide 40

Slide 40 text

CASE Ruby’s powerful case statement • case input when “quit” exit when “pause” sleep 20 when String puts “The input is #{input}” when 5..10 puts “The input was between 5 and 10” when /\d\d\d\d-\d\d-\d\d/ puts “The input looks like a date” else puts “I don’t understand you.” end

Slide 41

Slide 41 text

WHILE Simple while loop • count = 0 • while count < 10 • puts count • count += 1 • end

Slide 42

Slide 42 text

WHILE Simple while loop • count = 0 • while count < 10 • puts count • count += 1 • end += • Equivalent to count = count + 1 • Can be used with any number • And all basic math operations (*=, -=, etc.)

Slide 43

Slide 43 text

WHILE Simple while loop • count = 0 • while count < 10 • puts count • count += 1 • end += • Equivalent to count = count + 1 • Can be used with any number • And all basic math operations (*=, -=, etc.) Inline while • count = 0 • puts count += 1 while count < 10

Slide 44

Slide 44 text

UNLESS Unless is the inverted while • count = 0 • unless count >= 10 • puts count • count += 1 • end

Slide 45

Slide 45 text

UNTIL until is the inverted while • count = 0 • until count >= 10 • puts count • count += 1 • end Inline until • count = 0 • puts count += 1 until count >= 10

Slide 46

Slide 46 text

FOR For exists in Ruby • for fruit in fruits • puts “I love #{fruit} • end

Slide 47

Slide 47 text

FOR For exists in Ruby • for fruit in fruits • puts “I love #{fruit} • end But we don’t use it.

Slide 48

Slide 48 text

ITERATION THE RUBY WAY

Slide 49

Slide 49 text

EACH Use each for iterating • fruits.each do |fruit| • puts “I love #{fruit}” • end

Slide 50

Slide 50 text

EACH Use each for iterating • fruits.each do |fruit| • puts “I love #{fruit}” • end Use do & end for multi-line, {} for single-line • fruits.each {|fruit| puts “I love #{fruit}” }

Slide 51

Slide 51 text

EACH Use each for iterating • fruits.each do |fruit| • puts “I love #{fruit}” • end Use do & end for multi-line, {} for single-line • fruits.each {|fruit| puts “I love #{fruit}” } Same syntax works for other forms of iterating • .map • .each_with_index • .each_key

Slide 52

Slide 52 text

OBJECTS

Slide 53

Slide 53 text

OBJECTS Objects • class Person end

Slide 54

Slide 54 text

OBJECTS Objects • class Person end Inheritance • class Programmer < Person end

Slide 55

Slide 55 text

OBJECTS Objects • class Person end Inheritance • class Programmer < Person end Constructors • class Person def initialize(name) @name = name end end

Slide 56

Slide 56 text

RUBY ON RAILS

Slide 57

Slide 57 text

RUBY ON RAILS What is Rails • Web Framework • Convention over Configuration • Geared toward database-backed web applications • Great for producing APIS

Slide 58

Slide 58 text

EXAMPLE RAILS APP Demo time! • rails new demo • cd demo • rails generate scaffold person name:string age:integer • rails server

Slide 59

Slide 59 text

USING JSON

Slide 60

Slide 60 text

PARSING JSON In Rails • JSON.parse(json) Rhodes • Rho::JSON.parse(json)

Slide 61

Slide 61 text

PARSING JSON In Rails • JSON.parse(json) Rhodes • Rho::JSON.parse(json) Both turn JSON into a Hash • { "name": "Bob", "age": 20, "friends": ["Alice", "Carol", "Dave"] } • { "name" => "Bob", "age" => 20, "friends" => ["Alice", "Carol", "Dave"] }

Slide 62

Slide 62 text

XML IN RUBY XML is as easy as JSON • REXML::Document.new(xml_file)

Slide 63

Slide 63 text

IRB INTERACTIVE RUBY

Slide 64

Slide 64 text

IRB Command-line Ruby • irb • rails console

Slide 65

Slide 65 text

IRB Command-line Ruby • irb • rails console Inspect data • puts x • x.inspect

Slide 66

Slide 66 text

DEBUGGING Ruby Debugger • debugger gem, or ruby-debug • Both work similar to gdb

Slide 67

Slide 67 text

DEBUGGING Read the Errors • They tell you line numbers NameError: undefined local variable or method `my_method' for # from /Users/daniel/.rvm/gems/ruby-1.9.3-p194@ project/gems/ activerecord-3.2.2/lib/active_record/dynamic_matchers.rb:50:in `method_missing' from /Users/daniel/Projects/my_project/app/models/sign.rb:16:in `import' from (irb):4 from /Users/daniel/.rvm/gems/ruby-1.9.3-p194@project/gems/railties-3.2.2/lib/ rails/commands/console.rb:47:in `start' from /Users/daniel/.rvm/gems/ruby-1.9.3-p194@ project/gems/railties-3.2.2/lib/ rails/commands/console.rb:8:in `start' from /Users/daniel/.rvm/gems/ruby-1.9.3-p194@ project/gems/railties-3.2.2/lib/ rails/commands.rb:41:in `' from script/rails:6:in `require' from script/rails:6:in `'

Slide 68

Slide 68 text

DEBUGGING Read the Errors • They tell you line numbers NameError: undefined local variable or method `my_method' for # from /Users/daniel/.rvm/gems/ruby-1.9.3-p194@ project/gems/ activerecord-3.2.2/lib/active_record/dynamic_matchers.rb:50:in `method_missing' from /Users/daniel/Projects/my_project/app/models/sign.rb:16:in `import' from (irb):4 from /Users/daniel/.rvm/gems/ruby-1.9.3-p194@project/gems/railties-3.2.2/lib/ rails/commands/console.rb:47:in `start' from /Users/daniel/.rvm/gems/ruby-1.9.3-p194@ project/gems/railties-3.2.2/lib/ rails/commands/console.rb:8:in `start' from /Users/daniel/.rvm/gems/ruby-1.9.3-p194@ project/gems/railties-3.2.2/lib/ rails/commands.rb:41:in `' from script/rails:6:in `require' from script/rails:6:in `'

Slide 69

Slide 69 text

DEBUGGING Read the Errors • They tell you line numbers NameError: undefined local variable or method `my_method' for # from /Users/daniel/.rvm/gems/ruby-1.9.3-p194@ project/gems/ activerecord-3.2.2/lib/active_record/dynamic_matchers.rb:50:in `method_missing' from /Users/daniel/Projects/my_project/app/models/sign.rb:16:in `import' from (irb):4 from /Users/daniel/.rvm/gems/ruby-1.9.3-p194@project/gems/railties-3.2.2/lib/ rails/commands/console.rb:47:in `start' from /Users/daniel/.rvm/gems/ruby-1.9.3-p194@ project/gems/railties-3.2.2/lib/ rails/commands/console.rb:8:in `start' from /Users/daniel/.rvm/gems/ruby-1.9.3-p194@ project/gems/railties-3.2.2/lib/ rails/commands.rb:41:in `' from script/rails:6:in `require' from script/rails:6:in `'

Slide 70

Slide 70 text

DEBUGGING Read the Errors • They sometimes confuse you

Slide 71

Slide 71 text

DEBUGGING Read the Errors • They sometimes confuse you @user.first_name

Slide 72

Slide 72 text

DEBUGGING Read the Errors • They sometimes confuse you @user.first_name NoMethodError: undefined method `first_name' for nil:NilClass from (irb):1 from /Users/daniel/.rvm/gems/ruby-1.9.3-p194@signwars/gems/railties-3.2.2/ lib/rails/commands/console.rb:47:in `start' from /Users/daniel/.rvm/gems/ruby-1.9.3-p194@signwars/gems/railties-3.2.2/ lib/rails/commands/console.rb:8:in `start' from /Users/daniel/.rvm/gems/ruby-1.9.3-p194@signwars/gems/railties-3.2.2/ lib/rails/commands.rb:41:in `' from script/rails:6:in `require' from script/rails:6:in `'

Slide 73

Slide 73 text

DEBUGGING Read the Errors • They sometimes confuse you @user.first_name NoMethodError: undefined method `first_name' for nil:NilClass from (irb):1 from /Users/daniel/.rvm/gems/ruby-1.9.3-p194@signwars/gems/railties-3.2.2/ lib/rails/commands/console.rb:47:in `start' from /Users/daniel/.rvm/gems/ruby-1.9.3-p194@signwars/gems/railties-3.2.2/ lib/rails/commands/console.rb:8:in `start' from /Users/daniel/.rvm/gems/ruby-1.9.3-p194@signwars/gems/railties-3.2.2/ lib/rails/commands.rb:41:in `' from script/rails:6:in `require' from script/rails:6:in `'

Slide 74

Slide 74 text

LEARN MORE

Slide 75

Slide 75 text

LEARN MORE Documentation • http://ruby-doc.org • http://api.rubyonrails.org TryRuby • http://tryruby.org This Presentation • https://speakerdeck.com/u/danielmorrison • or shorter URL: http://bit.ly/LqCinu Talk to Me • @danielmorrison • http://collectiveidea.com

Slide 76

Slide 76 text

No content