Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Intro to Ruby - Twin Cities Code Camp 7

3,555 views

Published on

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

Published in: Technology, Business
  • Be the first to comment

Intro to Ruby - Twin Cities Code Camp 7

  1. 1. intro to ruby brian hogan New Auburn Personal Computer Services LLC
  2. 2. programming is fun.
  3. 3. you just don’t know it yet.
  4. 4. I was a designer. I hated programming.
  5. 5. my clients wanted interactive websites...
  6. 6. and I started to hate my life.
  7. 7. I learned Ruby in 2005 and fell in love...
  8. 8. So what can kinds of things can you do with Ruby?
  9. 9. 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
  10. 10. 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>
  11. 11. !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
  12. 12. got a great idea and want to get it out there quickly?
  13. 13. got a big site that’s hard to maintain?
  14. 14. So, what is Ruby? • Highly dynamic • Very high level • 100% object oriented • 100% open-source • Really easy to learn
  15. 15. History Smalltalk C++ Ruby Java VB 6 C# (1983) (1989) (1993) (1995) (1996) (2000)
  16. 16. Ruby follows the Principle of Least Surprise.
  17. 17. consistent API "Brian".length ["red", "green", "blue"].length [:first_name => "Brian", :last_name => "Hogan"].length User.find_all_by_last_name("Hogan").length
  18. 18. and a simple syntax age = 42 first_name = "Homer" start_date = Date.new 1980, 06, 05 annual_salary = 100000.00
  19. 19. Basic Ruby
  20. 20. Standard operators 5 + 5 10 * 10 "Hello" + "World" 25 / 5
  21. 21. Arrays colors = ["Red", "Green", "Blue"]
  22. 22. Hashes (Dictionaries) attributes = {:age => 25, :first_name => "Homer", :last_name => "Simpson"}
  23. 23. =>
  24. 24. :foo
  25. 25. Simple control logic if on_probation(start_date) puts "Yes" else puts "no" end
  26. 26. Unless if !current_user.admin? redirect_to "/login" end unless current_user.admin? redirect_to "/login" end
  27. 27. Conditionals as statement suffixes redirect_to "/login" unless current_user.admin?
  28. 28. Methods (functions) are simple too. # if start date + 6 months is > today def on_probation?(start_date) (start_date >> 6) > Date.today end
  29. 29. 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
  30. 30. 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
  31. 31. 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
  32. 32. Ruby is a loaded gun.
  33. 33. So, write good tests.
  34. 34. TATFT
  35. 35. 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
  36. 36. Implement the method class Person attr_accessor :name, :start_date def on_probation? (start_date >> 6) > Date.today end end
  37. 37. And the tests pass.
  38. 38. Testing first helps you think about your design AND your features.
  39. 39. Every professional Ruby developer writes tests first for production code.
  40. 40. Ten Simple Rules For Programming in My Favorite Language.
  41. 41. 1. Everything is an object
  42. 42. 25.class Fixnum "brian".class String [1,2,3].class Array
  43. 43. 2. Everything evaluates to true except nil or false
  44. 44. 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
  45. 45. 3. Variables are dynamically typed but DATA is strongly typed!
  46. 46. age = 32 name = "Brian" TypeError: can't convert Fixnum into String name + age age = 32 name = "Brian" “Brian32” name + age.to_s
  47. 47. 4. Every method returns the last evaluation implicitly
  48. 48. def limit_reached? self.projects.length > 0 end def welcome_message if current_user.anonymous? "You need to log in." else "Welcome!" end end
  49. 49. 5. Every expression evaluates to an object
  50. 50. result = if current_user.anonymous? "You need to log in." else "Welcome!" end
  51. 51. It is very easy to accidentally return false! def before_save if self.status == "closed" self.closed_on = Date.today end end
  52. 52. 6. Classes are objects
  53. 53. WRONG! person = new Person RIGHT! person = Person.new
  54. 54. 7. You need to use and understand blocks.
  55. 55. Blocks can iterate roles.each do |role| puts "<li>" + role.name + "<li>" end
  56. 56. They can also encapsulate code. ActiveRecord::Schema.define do create_table :pages do |t| t.string :name t.text :body t.timestamps end end
  57. 57. Every method can take a block! 5.times do puts "Hello!" end
  58. 58. 8. Favor modules over inheritance
  59. 59. 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
  60. 60. Do not use type, use behaviors.
  61. 61. 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
  62. 62. 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!"
  63. 63. 9. Embrace Reflection
  64. 64. person.respond_to?(:name) true person.respond_to?(:age) false person.send(:name) “Brian”
  65. 65. 10. Write code that writes code.
  66. 66. 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?
  67. 67. haml and sass
  68. 68. 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
  69. 69. 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>
  70. 70. 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
  71. 71. CSS #header { color: #333333; border-left: 1px; border-right: 2px; color: red; } #header a { font-weight: bold; text-decoration: none; }
  72. 72. StaticMatic demo
  73. 73. sinatra
  74. 74. Hello Sinatra! require 'rubygems' require 'sinatra' get "/" do "Hello Sinatra!" end
  75. 75. Sinatra demo
  76. 76. cucumber
  77. 77. 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!"
  78. 78. Testing the Wiki with Webrat and Cucumber
  79. 79. Ruby will make you productive.
  80. 80. And happy.
  81. 81. 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/
  82. 82. Questions? Twitter: bphogan bphogan at gmail

×