rapid development with ruby/jruby and rails

45
1 Rapid Development with Ruby/JRuby and Rails Lee Chuk Munn Staff Engineer Sun Microsystems 1

Upload: elliando-dias

Post on 15-May-2015

1.630 views

Category:

Technology


4 download

TRANSCRIPT

Page 1: Rapid Development with Ruby/JRuby and Rails

1

Rapid Development with Ruby/JRuby and RailsLee Chuk MunnStaff EngineerSun Microsystems

1

Page 2: Rapid Development with Ruby/JRuby and Rails

2

Why Ruby?

Page 3: Rapid Development with Ruby/JRuby and Rails

3

What is Ruby?• Created by Yukihiro “Matz” Matsumoto> Started around 1993, about the same time as Java

• What is a scripting language?> No compilation unit

puts “Hello world”> Not compiled> Specialized syntax and data types

subject.gsub(/before/, "after")> Maybe dynamic typing /duck typing

• Design to put the “fun” back into programming

Page 4: Rapid Development with Ruby/JRuby and Rails

4

Ruby Conventions• ClassNames• methods_names, variable_names • visible?• methods_with_side_effects!• @instance_variable• @@class_variable• $global_variable• A_CONSTANT, AnotherConstant• MyClass.class_method – doc only• MyClass#instance_method – doc only

Page 5: Rapid Development with Ruby/JRuby and Rails

5

A Typical Ruby Classclass Song

@@plays = 0

attr_accessor :name, :artist, :duration

def initialize(d, a, d)

@name = n; @artist = a; @duration = d

end

public

def duration_in_minutes

@duration / 60

end

def duration_in_minutes=(v)

@duration = (v * 60)

end

def play

@@plays += 1

puts "#{@name} plays #{@@plays}"

@@plays

end

end

Properties

Virtual properties

Constructor

No return

Interpolated values

Page 6: Rapid Development with Ruby/JRuby and Rails

6

Sample Execution

s = Song.new(“Cavatina”, “John Williams”, 200)

puts(“duration: #{s.duration}”)

puts “in mins: #{s.duration_in_minutes}”

s.duration_in_minutes = 4

puts “in mins: #{s.duration}”

s.play

Page 7: Rapid Development with Ruby/JRuby and Rails

7

Symbols• :a_name is symbol, think identities> Refer to the name a_name, not the value that a_name

may potentially hold• Typically used in maps, property declaration,

method names, any place you need a name/symbol

foo

bar

Symbol table

Memory location

foo:foo

Page 8: Rapid Development with Ruby/JRuby and Rails

8

attr_accessor :color, :age, :name

protected :deposit, :withdrawl

color = {:red => 0xf00,:green => 0x0f0,:blue => 0x00f

}

add_column :plugins, :price, :decimal, :precision => 8, :scale => 2, :default => 0

Example Use of SymbolsAttribute

Access modifiers

Maps

As keyword parameters

Page 9: Rapid Development with Ruby/JRuby and Rails

9

Everything Returns a Value• Returned not required

• Statements can be used as expressions

• Even defining a method has a return value> Returns nil

def duration_in_minutes@duration / 60

end

gt = if (x > y) true else false

Page 10: Rapid Development with Ruby/JRuby and Rails

10

Everything Is An Object• 'Primitives' are objects> -1.abs

• nil is an object> nil.methods

• Classes are objects> Song.new – invoking the new method on 'Song' object> Create instances of themselves

• Code blocks are objects> They can be pass around, even as parameters> Blocks can be closure

Page 11: Rapid Development with Ruby/JRuby and Rails

11

Customization with Closureclass ColorButton

attr_accessor :label, :r, :g, :bdef initialize(l)

label = 1r = 0x0fg = 0x0fb = 0x0fif block_given?

yield selfend

end b = ColorButton(“Press me”) do |button|button.r = 0xff# more stuff...

end

Page 12: Rapid Development with Ruby/JRuby and Rails

12

Common Uses of Closures• Iteration

• Resource management

• Callbacks

• Initialization

From http://onestepback.org/articles/10things/item3.html

[1,2,3].each {|i| puts i }

File.new("/etc/hosts", "r").each {|e| puts e }

widget.on_button_press { puts "Button Press" }

a = Array.new(5) {|i| i * i }

Page 13: Rapid Development with Ruby/JRuby and Rails

13

Almost Everything is a Method Call• In lots of cases, invoking method without knowing it

• Methods can be invoked with or without parenthesis> Most developers chose the latter> Code looks more natural especially if you are doing DSL

• Methods can be overridden> Get operator overloading for free

array[i] = 0 – invoking the [] method1 + 2 + 3 – 1.+(2.+(3))str.length

Page 14: Rapid Development with Ruby/JRuby and Rails

14

Every Method Call is a Message• obj.method(param) means having a method on the

object in Java• In Ruby, this means sending a message to the

object

is to send a '+' message with one value

• Use respond_to? to find out if an object knows how to handle a message

obj.send(:method, param)

1 + 2 + 31.send(:+, 2.send(:+, 3))

1.respond_to? :succ => true

Page 15: Rapid Development with Ruby/JRuby and Rails

15

So What Is the Big Deal?public VCR

def initialize@messages = []

enddef method_missing(method, *args, &block)

@messages << [method, args, block]enddef play_back_to(obj)

@messages.each do |method, args, block|obj.send(method, *args, &block)

endend

end From http://onestepback.org/articles/10things/page017.html

varag

Push triplet onto array

Page 16: Rapid Development with Ruby/JRuby and Rails

16

Example of Macro at the Language Level

vcr = VCR.newvcr.sub!(/Java/) { |match| match.reverse }vcr.upcase!vcr[11,5] = "Universe"vcr << "!"

string = "Hello Java World"puts string

vcr.play_back_to(string)puts string # => "Hello AVAJ Universe"

Capture a group of operations. Reapply these on a separate object

Page 17: Rapid Development with Ruby/JRuby and Rails

17

Duck Typing Instead of Interfaces• Familiar with the idea of using interface to enforce

contracts> An object can only be considered a thread if it

implements Runnable

• If an object can behave like a thread, then should be considered as a thread> Runnable is irrelevant if it has run()> If it walks like a duck, talks like a duck, then we can treat

it as a duck

d = DuckLikeObject.newputs d.quack if d.responds_to :quack

Page 18: Rapid Development with Ruby/JRuby and Rails

18

Reuse – Inheritance • Supports inheritance

class KaraokeSong < Song...def to_s

super + “[#{@lyrics}]”end

Page 19: Rapid Development with Ruby/JRuby and Rails

19

Reuse - Mixins• Multiple inheritance like mechanism call mixins

defined by modules> A namespace> Can have methods> But cannot be instantiated

• Becomes part of a class when included a module is included in a class> The reverse is also possible by extending the module

with an object

Page 20: Rapid Development with Ruby/JRuby and Rails

20

Mixin Examplemodule Stringify

def stringifyif @value == 1

"One"elsif @value == 2

"Two"elsif @value == 3

"Three"end

endend

class MyNumber include Stringifydef initialize(value)

@value = valueend...

Stringify example http://www.juixe.com/techknow/index.php/2006/06/15/mixins-in-ruby/

Page 21: Rapid Development with Ruby/JRuby and Rails

21

Reuse – Modifying Existing Class• Methods can be added to a class at any time> Applies to built in classes

• Can be frozen

class Stringdef rot13

self.tr("A-Ma-mN-Zn-z","N-Zn-zA-Ma-m")end

end

“hello world”.rot13 #=> uryyb jbeyq

Page 22: Rapid Development with Ruby/JRuby and Rails

22

Extremely Flexible and Dynamic• One of the hallmarks of scripting languages• Metaprogramming – programs that write or

manipulate themselves• Some of the stuff you can do> Trap missing methods and add them if you so desire> Kernel definition hooks eg. Adding a method> Create code and execute them on the fly

Page 23: Rapid Development with Ruby/JRuby and Rails

23

Example of Ruby's Malleabilityclass Foo

def method_missing(name, *args)if args[0].is_a?(Proc)

self.class.instance_eval dodefine_method(name.to_s.chomp("="), args[0])

endelse

superend

endend

Adapted from http://tech.rufy.com/2006/08/dynamically-add-methods-to-classes.html

f = Foo.newf.greet = lambda {|t| "Hello #{t}!"}f.greet "Hello SunTech Days"

Page 24: Rapid Development with Ruby/JRuby and Rails

24

DSLs with Ruby• DSL is a language designed for a specific domain > Captures jargon in language

• Ruby's DSL is internal (Fowler) > Morph language into DSL> Java is external and/or API based

• Killer features for DSL with Ruby> Paranthesis-less method invocation> Closures> Malleable and dynamc engine> Variable argument list> Symbols

Page 25: Rapid Development with Ruby/JRuby and Rails

25

DSL ExamplePBJ Sandwich

ingredients:- two slices of bread- one tablespoon of peanut butter- one teaspoon of jam

instructions:- spread peanut butter on bread- spread jam on top of peanut butter- place other slice of bread on top

servings: 1prep time: 2 minutes

recipe "PBJ Sandwich"

ingredients :bread 2.sliceingredients :peanut_butter 1.spooningredients :jam 1.teaspoon instructions do

step 1 “spread peanut butter”step 2 “spread jam...”step 3 “place other slice...”

end

servings 1prep_time 2.minutes

Adapted from http://weblog.jamisbuck.org/2006/4/20/writing-domain-specific-languages

Page 26: Rapid Development with Ruby/JRuby and Rails

26

This is great, but...• Ruby language is different from Java• Ruby platform is different from Java• How can Java developers benefit?

Page 27: Rapid Development with Ruby/JRuby and Rails

27

JRuby• Implementation of Ruby written in Java• Compatible with Ruby 1.8.6• Enables use of Java code in Ruby• Easier deployment• More libraries• More platforms• Less “political” resistence

Page 28: Rapid Development with Ruby/JRuby and Rails

28

FreeTTS Example• In Java

VoiceManager vm = VoiceManager.getInstance();Voice voice = vm.getVoice("kevin16"); voice.allocate();voice.speak(jTextArea1.getText());voice.deallocate();

• In Rubyrequire 'java'vm = com.sun.speech.freetts.VoiceManager.getInstance()voice = vm.getVoice("kevin16")voice.allocate()voice.speak("Calling Java code from Ruby")voice.deallocate()

• JRuby engine available through JSR-223 in JavaSE 6

Page 29: Rapid Development with Ruby/JRuby and Rails

29

Rapid Development with Ruby/JRuby and RailsLee Chuk MunnStaff EngineerSun Microsystems

29

Page 30: Rapid Development with Ruby/JRuby and Rails

30

3. Inserting New or Existing Slides● To add a new slide to your presentation, select

Insert>Slide. You can also duplicate slides in the Slide Sorter using copy and paste.

● To add a slide(s) from another presentation,copy and paste from one file to the other inthe Slide Sorter.

● To insert an entire presentation, select Insert>File.

Page 31: Rapid Development with Ruby/JRuby and Rails

31

Template – Text Slidewith Two Line Title and Subtitle

• To insert a Subtitle on other slides, copy and paste the Subtitle text block• On a slide with a two line Title and Subtitle (as

shown here) move the bullet text block down to make room for the Subtitle. You can also duplicate this slide and replace the content.

This is a Subtitle with Initial Caps Each Major Word

Page 32: Rapid Development with Ruby/JRuby and Rails

32

GlassFish V2

Page 33: Rapid Development with Ruby/JRuby and Rails

33

Page 34: Rapid Development with Ruby/JRuby and Rails

34

Page 35: Rapid Development with Ruby/JRuby and Rails

35

Page 36: Rapid Development with Ruby/JRuby and Rails

36

Page 37: Rapid Development with Ruby/JRuby and Rails

37

Page 38: Rapid Development with Ruby/JRuby and Rails

38

Page 39: Rapid Development with Ruby/JRuby and Rails

39

Page 40: Rapid Development with Ruby/JRuby and Rails

40

Page 41: Rapid Development with Ruby/JRuby and Rails

41

Page 42: Rapid Development with Ruby/JRuby and Rails

42

Page 43: Rapid Development with Ruby/JRuby and Rails

43

Page 44: Rapid Development with Ruby/JRuby and Rails

44

Page 45: Rapid Development with Ruby/JRuby and Rails

45

Title HereLee Chuk MunnStaff EngineerSun Microsystems

45