Intro to Ruby - Twin Cities Code Camp 7
Upcoming SlideShare
Loading in...5
×
 

Intro to Ruby - Twin Cities Code Camp 7

on

  • 4,182 views

Slides from my "Introduction to Ruby" talk at Twin Cities Code Camp 7 on 10/24/2009

Slides from my "Introduction to Ruby" talk at Twin Cities Code Camp 7 on 10/24/2009

Statistics

Views

Total Views
4,182
Views on SlideShare
4,098
Embed Views
84

Actions

Likes
4
Downloads
54
Comments
0

3 Embeds 84

http://www.napcsweb.com 77
http://coderwall.com 4
http://www.slideshare.net 3

Accessibility

Categories

Upload Details

Uploaded via as Apple Keynote

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • Hi everyone. I’m Brian. I do Ruby and Rails training and consulting.
  • Maybe you do... but it can be even more fun.
  • I hated programming. I did some when I was a kid, but it wasn’t what I wanted to do. I liked the web. And I started building sites in 1995 for small businesses.
  • so I started learning to program in ASP and eventually PHP. Even did some Java and some Oracle DBA stuff in there.
  • I was getting burned out, spending hours fighting with the languages while writing the same kind of applications over again.
  • A consultant who was working with me on a Java project introduced me to Rails <br /> and now, four years later,
  • I get to work on fun projects, work with amazing people, I&#x2019;m excited about what I do, and I even got to write some books.
  • I want to get you excited about this language. I want to you to ask me any questions you have, and I want you to run home and start coding! So the best way to do that is to show you what you can do.
  • We can make a desktop application that works on Windows, Mac, and Linux using Shoes.
  • We can make a very simple iPhone-enabled website with Sinatra. This one serves files to you in around 50 lines of code.
  • We can use Sass to generate stylesheets for our applications. We can use variables for our colors and widths!
  • Use Rails. Rails is a great framework for building web applications. And despite what you&#x2019;ve heard, it scales exceptionally well, as long as you know how to scale a web application and you&#x2019;ve written good code.
  • Use Rails to kickstart a CMS.
  • Highly dynamic, high level, 100% object oriented, 100% open source, and really easy to learn.
  • Ruby was created by Yukihiro Matsumoto (Matz) in 1993. It&#x2019;s built on C, and has many implementations, including JRuby, which runs on the JVM, and IronRuby, which runs on the .Net platform.
  • &#x201C;How you feel is more important than what you do. &#x201C; <br /> The entire language is designed for programmer productivity and fun.
  • Principle of Least Surprise - This means The language should behave in a way that is not confusing to experienced developers. It doesn&#x2019;t mean that it works like your current favorite language! But as you get used to Ruby, you&#x2019;ll find that you ramp up quickly.
  • Ruby achieves this through a consistant API. You won&#x2019;t find yourself guessing too much what methods are available to you.
  • It also helps that the syntax is simple. There are no unnecessary semicolons or curly braces. The interpreter knows when lines end.
  • We have numbers, strings, multiplication, addition, subtraction, and division, just like everyone else.
  • The square brackets denote an array.
  • This is the hash symbol, or the hash rocket. Whenever you see this, you&#x2019;re dealing with a hash.
  • When you see these, you&#x2019;re looking at Symbols. They represent names and some strings. They conserve memory, as repeating a symbol in your code uses the same memory reference, whereas repeating a string creates a new object on each use.
  • Unless is an alias for &#x201C;if not&#x201D;. Subtle, but sometimes much more readable.
  • You can append these suffixes to statements to prevent them from firing. This is a great space saver and it&#x2019;s easy to read
  • The two arrows (>>) is actually a method on the Date object that adds months. So here, we&#x2019;re adding six months to the start date and comparing it to today <br /> <br /> Notice here that the input parameter is assumed to be a date. There&#x2019;s no type checking here.
  • The = is part of the method name. And Ruby&#x2019;s interpreter doesn&#x2019;t mind you putting a space in front of it to make it easier to read!
  • Making getters and setters is so common that Ruby can do it for you.
  • It assumes you are an intelligent person who wants to get things done. It will not try to protect you from your own stupidity.
  • In fact,
  • Test All The Effing Time! Let&#x2019;s go through adding our &#x201C;on_probation?&#x201D; method to our Person class. A person is on probation for the first six months of employment.
  • Here we have two tests, one using a person hired today, and another using a person last year.
  • Did we miss any cases?
  • Everything is an object in Ruby. There are no primitive types. Strings, integers, floats, everything. Even Nil, True, and False!
  • Everything. Even 0 and -1.
  • I&#x2019;m not here to tell you that dynamically typed languages are better than statically typed languages. I prefer dynamic typing. I am more productive with it. And most of the claims against it are false.
  • We don&#x2019;t need to specify a &#x201C;return&#x201D; keyword.
  • In this example, if the status is not closed, this method will return false. In Rails, if a before_save method returns false, the record won&#x2019;t save to the database.
  • There are methods on arrays and hashes to iterate over the elements stored within.
  • Blocks let you pass code as a parameter, so that the code may be run within the method. If you&#x2019;ve used closures or anonymous functions, you already understand this. But this is how Ruby developers work every day.
  • We can create modules of code that we can mix in to our classes.
  • In this example, we&#x2019;re using modules to replace inheritence. However, since classes are objects, we can also apply modules to instances of objects at runtime.
  • If it walks like a duck, and talks like a duck, it&#x2019;s a duck. Even if it&#x2019;s not.
  • Declare modules that encapsulate behavior. Here we have a doctor, a ninja, and a musician.
  • We can then mix in the behaviors to the instance of the class. Its type doesn&#x2019;t really matter. We can ask the instance if it has the methods we want and we can call them.
  • Reflection is built into the core language. It&#x2019;s not a tacked on library, and it&#x2019;s meant to be used to improve your code.
  • We can ask our model all sorts of questions, and even actually send messages dynamically.
  • We can loop over an array and generate methods on the object.
  • Sinatra is a simple web framework that basically maps incoming requests to backend code that produces responses.
  • That little bit of code gets us a working web application that handles requests.
  • We write stories using plain text, that describes what we want to do.

Intro to Ruby - Twin Cities Code Camp 7 Intro to Ruby - Twin Cities Code Camp 7 Presentation Transcript

  • intro to ruby brian hogan New Auburn Personal Computer Services LLC
  • programming is fun.
  • you just don’t know it yet.
  • I was a designer. I hated programming.
  • my clients wanted interactive websites...
  • and I started to hate my life.
  • I learned Ruby in 2005 and fell in love...
  • So what can kinds of things can you do with Ruby?
  • Shoes.app do para "Item name" @name = edit_line button "Add to list" do @names.append do para @name.text end @name.text = "" end button("Clear the list") {@names.clear} @names = stack :width=>"100%", :height=>"90%" end
  • require 'sinatra' require 'pathname' get "/" do dir = "./files/" @links = Dir[dir+"*"].map { |file| file_link(file) }.join erb :index end helpers do def file_link(file) filename = Pathname.new(file).basename "<li><a href='#{file}' target='_self'>#{filename}</a></li>" end end use_in_file_templates! __END__ @@ index <html> <head> <meta name="viewport" content="width=320; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"/> <style type="text/css" media="screen">@import "/stylesheets/iui.css";</style> <script type="application/x-javascript" src="/javascripts/iui.js"></script> </head> <body> <div class="toolbar"> <h1 id="pageTitle"></h1> </div> <ul id="home" title="Your files, sir." selected="true"> <%= @links %> </ul> </body> </html>
  • !the_border = 1px !base_color = #111 #header { #header color: #333333; color = !base_color * 3 border-left: 1px; border-left= !the_border border-right: 2px; border-right = !the_border * 2 color: red; } color: red #header a { font-weight: bold; a text-decoration: none; } font-weight: bold text-decoration: none
  • got a great idea and want to get it out there quickly?
  • got a big site that’s hard to maintain?
  • So, what is Ruby? • Highly dynamic • Very high level • 100% object oriented • 100% open-source • Really easy to learn
  • History Smalltalk C++ Ruby Java VB 6 C# (1983) (1989) (1993) (1995) (1996) (2000)
  • Ruby follows the Principle of Least Surprise.
  • consistent API "Brian".length ["red", "green", "blue"].length [:first_name => "Brian", :last_name => "Hogan"].length User.find_all_by_last_name("Hogan").length
  • and a simple syntax age = 42 first_name = "Homer" start_date = Date.new 1980, 06, 05 annual_salary = 100000.00
  • Basic Ruby
  • Standard operators 5 + 5 10 * 10 "Hello" + "World" 25 / 5
  • Arrays colors = ["Red", "Green", "Blue"]
  • Hashes (Dictionaries) attributes = {:age => 25, :first_name => "Homer", :last_name => "Simpson"}
  • =>
  • :foo
  • Simple control logic if on_probation(start_date) puts "Yes" else puts "no" end
  • Unless if !current_user.admin? redirect_to "/login" end unless current_user.admin? redirect_to "/login" end
  • Conditionals as statement suffixes redirect_to "/login" unless current_user.admin?
  • Methods (functions) are simple too. # if start date + 6 months is > today def on_probation?(start_date) (start_date >> 6) > Date.today end
  • Classes are easy too. class Person @started_on = Date.today @name = "" def started_on=(date) @started_on = date end def started_on @started_on end end
  • Class instance variables are private class Person @started_on = Date.today Expose them through @name = "" accessor methods that def started_on=(date) @started_on = date resemble C# and VB end Property members. def started_on @started_on end person = Person.new person.age = 32 def name=(name) person.name = "Brian" @name = name end person.age => 32 def name person.name @name => "Brian" end end
  • Let Ruby write code for you! class Person @started_on = Date.today @name = "" def started_on=(date) class Person @started_on = date end attr_accessor :name attr_accessor :started_on def started_on @started_on end end def name=(name) @name = name end def name @name end end
  • Ruby is a loaded gun.
  • So, write good tests.
  • TATFT
  • def test_user_hired_today_should_be_on_probation person = Person.new person.hired_on = Date.today assert person.on_probation? end test_user_hired_last_year_should_not_be_on_probation person = Person.new person.hired_on = 1.year.ago assert !person.on_probation? end
  • Implement the method class Person attr_accessor :name, :start_date def on_probation? (start_date >> 6) > Date.today end end
  • And the tests pass.
  • Testing first helps you think about your design AND your features.
  • Every professional Ruby developer writes tests first for production code.
  • Ten Simple Rules For Programming in My Favorite Language.
  • 1. Everything is an object
  • 25.class Fixnum "brian".class String [1,2,3].class Array
  • 2. Everything evaluates to true except nil or false
  • x = 0 0 puts x if x x = -1 -1 puts x if x x = false nil puts x if x x = nil nil puts x if x
  • 3. Variables are dynamically typed but DATA is strongly typed!
  • age = 32 name = "Brian" TypeError: can't convert Fixnum into String name + age age = 32 name = "Brian" “Brian32” name + age.to_s
  • 4. Every method returns the last evaluation implicitly
  • def limit_reached? self.projects.length > 0 end def welcome_message if current_user.anonymous? "You need to log in." else "Welcome!" end end
  • 5. Every expression evaluates to an object
  • result = if current_user.anonymous? "You need to log in." else "Welcome!" end
  • It is very easy to accidentally return false! def before_save if self.status == "closed" self.closed_on = Date.today end end
  • 6. Classes are objects
  • WRONG! person = new Person RIGHT! person = Person.new
  • 7. You need to use and understand blocks.
  • Blocks can iterate roles.each do |role| puts "<li>" + role.name + "<li>" end
  • They can also encapsulate code. ActiveRecord::Schema.define do create_table :pages do |t| t.string :name t.text :body t.timestamps end end
  • Every method can take a block! 5.times do puts "Hello!" end
  • 8. Favor modules over inheritance
  • module SharedValidations def self.included(base) base.validates_presence_of :name base.validates_uniqueness_of :name end end class Project class Task include SharedValidations include SharedValidations end end
  • Do not use type, use behaviors.
  • module Doctor module Ninja def treat_patient def attack puts "All better!" puts "You’re dead!" end end end end module Musician def play_guitar puts "meedily-meedily-meedily-meeeeeeeeee!" end end
  • person = Person.new person.extend Ninja "You're dead!" person.attack person.extend Doctor "All better!" person.treat_patient person.extend Musician "meedily-meedily- person.play_guitar meedily-meeeeeeeeee!"
  • 9. Embrace Reflection
  • person.respond_to?(:name) true person.respond_to?(:age) false person.send(:name) “Brian”
  • 10. Write code that writes code.
  • class User ROLES = ["admin", "superadmin", "user", "moderator"] ROLES.each do |role| class_eval <<-EOF def #{role}? self.roles.include?("#{role}") end EOF end end user = User.new user.admin? user.moderator?
  • haml and sass
  • HAML !!! #wrapper.container_12 #header.grid_12 %h1 The awesome site %ul#navbar.grid_12 %li %a{:href => "index.html"} Home %li %a{:href => "products"} Products %li %a{:href => "services"} Services #middle.grid_12 %h2 Welcome #footer.grid_12 %p Copyright 2009 SomeCompany
  • HTML <div class='container_12' id='wrapper'> <div class='grid_12' id='header'> <h1>The awesome site</h1> </div> <ul class='grid_12' id='navbar'> <li> <a href='index.html'>Home</a> </li> <li> <a href='products'>Products</a> </li> <li> <a href='services'>Services</a> </li> </ul> <div class='grid_12' id='middle'> <h2>Welcome</h2> </div> <div class='grid_12' id='footer'> <p>Copyright 2009 SomeCompany</p> </div> </div>
  • SASS !the_border = 1px !base_color = #111 #header color = !base_color * 3 border-left= !the_border border-right = !the_border * 2 color: red a font-weight: bold text-decoration: none
  • CSS #header { color: #333333; border-left: 1px; border-right: 2px; color: red; } #header a { font-weight: bold; text-decoration: none; }
  • StaticMatic demo
  • sinatra
  • Hello Sinatra! require 'rubygems' require 'sinatra' get "/" do "Hello Sinatra!" end
  • Sinatra demo
  • cucumber
  • Feature: creating a new page in the wiki As an average anonymous user I want to create a page about Ruby So that I can tell everyone how awesome it is. Scenario: Creating a new page and editing its content Given I go to "/ruby" Then I should see "Edit this page" When I click "Edit this page" And I fill in "body" with "Ruby is the best programming language in the whole world!" And I press "Save" Then I should see "Ruby is the best programming language in the whole world!"
  • Testing the Wiki with Webrat and Cucumber
  • Ruby will make you productive.
  • And happy.
  • Resources: Try Ruby in your browser! http://tryruby.sophrinix.com/ Try SASS online: http://sass-lang.com/try.html Try HAML online: http://haml-lang.com/try.html http://staticmatic.rubyforge.org/ Sinatra: http://www.sinatrarb.com/ Sinatra Wiki source: http://github.com/napcs/sinatriki Cucumber: http://cukes.info/ WATIR: http://watir.com/
  • Questions? Twitter: bphogan bphogan at gmail