Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Ruby & Rails für .Net Entwickler

Ruby & Rails für .Net Entwickler

Einführung in Ruby und Rails für .Net Entwickler vom 31. Oktober 2012 für die .Net User Group Bern (http://www.dnug-bern.ch)

Johnny Graber

October 31, 2012
Tweet

More Decks by Johnny Graber

Other Decks in Programming

Transcript

  1. Über Johnny Graber •  Applikationsentwicker @ FMH, Bern – Ärztliche Weiter-

    und Fortbildungsplattform •  Web: http://www.JGraber.ch •  Twitter: @j_graber Hinweis: Verwendung für eigene Präsentationen nur mit Einverständis des Autors
  2. Agenda •  Ruby •  Rails •  Rails im Alltag • 

    Testing •  Weiterführende Informationen
  3. Warnung •  Ich bin kein Experte. •  Diese Präsentation ist

    ein Einstieg in Ruby und Rails und enthält zahlreiche Vereinfachungen.
  4. Wieso Ruby bei der DNUG Bern? •  Das grosse Gruseln

    zu Halloween? http://www.flickr.com/photos/pedroferrer/3615212504/
  5. Wieso Ruby bei der DNUG Bern? •  Vieles das die

    Arbeit in .Net erleichtert geht auf Ruby/Rails zurück: ASP.Net MVC EF Code First Migrations NuGet Subsonic Mspec SpecFlow OWIN … •  Ruby & Rails inspirieren viele Entwickler •  Es macht Spass!
  6. Ruby? •  Von Yukihiro „Matz“ Matsumoto •  seit 1993 entwickelt

    •  Objektorientierte Sprache •  Dynamische Typisierung •  Interpretiert •  Standardisiert als ISO/IEC 30170:2012
  7. Wichtige Versionen •  0.95: 1. veröffentlichte Version (12/1995) •  1.8:

    älteste unterstützte Version (8/2003) •  1.9: aktuelle Version (Dezember 2007) •  2.0: nächste Version (Anfangs 2013)
  8. Was kann man mit Ruby machen? •  Tätigkeiten automatisieren • 

    Daten konvertieren •  Simulationen berechnen •  Reports erzeugen •  Webanwendungen erstellen •  ...
  9. Wichtige Unterschiede •  Keine grosse Firma im Hintergrund •  Alles

    ist ein Objekt •  Wird nicht kompiliert •  Inhalt bestimmt den Typ einer Variable •  Es gibt keine Interfaces
  10. Basistypen •  Zahlen – Fixnum a = 123 – Bignum b =

    123_456_789_123_456_789_123 – Float c = 1.23 •  Strings d = "Ruby & Rails"
  11. Basistypen •  Ranges e = [5..10] •  Arrays f =

    [1, 2, 3] •  Hashes g = {"a"=> 1, "b"=> 2} •  Reguläre Ausdrücke h = /e?/
  12. Symbols •  Dienen als Bezeichner •  „Vergleichbar“ mit Enum • 

    Über ganzes Programm hinweg eindeutig :ruby val = {a: "1", b: "2"}
  13. Reservierte Schlüsselwörter begin and alias END BEGIN __LINE__ __FILE__ __ENCODING__

    end elsif else do defined? def class case break not nil next module in if for false ensure true then super self return retry rescue redo or yield while when until unless undef
  14. Klassen •  Ruby unterstützt Einfachvererbung •  Methode initialize() ist der

    Konstruktor •  Sichtbarkeit – public: Sichtbar für alle – protected: Sichtbar in Vererbungshierarchie – private: Sichtbar nur für deklarierende Klasse
  15. Beispiel Klasse class Book < Item attr_accessor :description attr_reader :title

    def initialize @title= "Ruby" @description= "A simple object" end private def calcualte (value) 1 + 3 + value end end
  16. Module •  Module sind Methodensammlungen •  Keine abstrakten Klassen in

    Ruby •  Mix-In: verwenden eines Moduls in einer Klasse •  Ermöglichen "Mehrfachvererbung"
  17. Beispiel Modul module BooksHelper def show_cover (book, size) if(book.cover?) image_tag

    book.cover.url(size) else path_to_placeholder end end end class Helper extend BooksHelper include Enumerable end
  18. Methoden In Ruby gibt es keine Methodenaufrufe Man sendet Meldungen

    an Objekte •  Jede Methode hat einen Rückgabewert – Implizit: letzter Befehl •  Können an eine spezifische Objekt- Instanz gehängt werde •  Konvention: <Methode>! verändert Objekt
  19. Beispiel Methoden an Instanz a = Object.new b = Object.new

    def a.hello "Hello world" end a.hello => "Hello world" b.hello NoMethodError: undefined method `hello' for #<...>
  20. method_missing •  Wird aufgerufen falls Methode fehlt •  Erlaubt eine

    dynamische Auswertung der geschickten Meldung •  Ermöglicht Vorlagen für Antworten auf erst zur Laufzeit bekannte Kriterien – find_by_***** in ActiveRecord
  21. Beispiel method_missing class Demo def method_missing(m, *args, &block) puts "There

    is no method '#{m}' with this args: #{args}" end end Demo.new.anything 1, 5, "Hello” There is no method 'anything' with this args: [1, 5, "Hello"] => nil
  22. Blöcke •  Sind Closures – Zugriff auf die durch Iterator übergebenen

    lokalen Variablen •  Syntaktisch Gleichwertig – do |x| … end – {|x| … } •  Beispiel: 5.times { puts ‘Hello’}
  23. Kontrollstrukturen & Schleifen •  Kontrollstrukturen –  If / Elsif /

    Else –  Unless –  Case-when •  Schleifen –  While –  Until –  Loop –  For –  Each
  24. Duck Typing •  Klassen sind keine Typen •  Das Verhalten

    eines Objekts bestimmt seinen Typ: If an object walks like a duck and talks like a duck, then the interpreter is happy to treat it as if it were a duck.
  25. Monkey Patching •  Alles kann in Ruby verändert werden • 

    Änderungen an der Basisklassen – Nennt man Monkey Patching – Sollte man vorsichtig machen – Ermöglicht Metaprogrammierung
  26. Flexibilität von Ruby •  Alles kann verändert werden •  Method_missing

    lässt Objekte auf nicht definierte Methoden antworten •  Duck Typing lässt beliebige Klassen miteinander zusammenarbeiten •  Monkey Patching ermöglicht die Weiterentwicklung ohne neuen Release
  27. RubyGems •  Ist das Ruby Paketierungssystem •  Besteht aus – Paketen

    (analog *.dll oder *.exe) – Verwaltungstools – Repository •  Dient zur Verteilung von Code •  Ist Vorbild für NuGet
  28. IRB & Pry •  Interaktive Ruby Shell •  Zum Ausprobieren

    von Code •  Liefert sofortiges Feedback •  Hilft beim debuggen
  29. Entwicklungsumgebung •  IDE wie Visual Studio werden kaum verwendet – RubyMine

    von JetBrains •  Meist eine Kombination von Texteditor und IRB/Pry – TextMate – Sublime Text 2 – Vim / Emacs
  30. Ruby Implementierungen •  MRI (Matz‘s Ruby Interpreter) [=> Ruby] • 

    JRuby (Java, läuft in der JVM) •  MacRuby (Objectiv-C, für Mac OS X) •  IronRuby (C#, DLR von .Net) •  Rubinius (Ruby, Ideen aus Smalltalk-80) •  RubyMotion (statisch komp. Code für iOS)
  31. Wozu all die Implementierungen? •  Unterschiedliche Ziele •  Ruby ist

    zu langsam – RMI schlecht für Multitasking (GIL) •  C Komponenten laufen nicht überall •  Bestehenden Code weiter verwenden
  32. Unterstützte Betriebssysteme •  Ruby ist traditionell UNIX-Lastig •  Volle Unterstützung

    für Mac & Linux •  Windows holt auf – Probleme: Nativer C-Code – 25% der User von Engine Yard haben Windows
  33. Ruby on Rails? •  Wird seit 2004 von David Heinemeier

    Hansson (DHH) entwickelt •  Ist ein Web-Framework für Ruby – Wurde aus Basecamp extrahiert •  Folgt den Prinzipien – Don’t repeat yourself (DRY) – Convention over configuration
  34. Opinionated Framework •  Alles hat seinen Platz •  Der gewollte

    Weg ist der Kürzeste – Alles bereit für TDD – Klare Trennung zwischen Dev & Prod •  Abweichungen schmerzen
  35. Rails Demo: ToDo – Befehle rails new todo cd todo

    rails g scaffold item title:string done:boolean rake db:create & rake db:migrate rails s
  36. Rails Demo: ToDo – Ergebnis •  Aufgabe erfüllt? Und • 

    Alles geht auch mit JSON •  Umgebung für Prod & Test vorbereit •  Dokumentation generierbar •  Alles ganz ohne Code zu schreiben…
  37. Demo: Kleinste Rails Anwendung # Von http://thesmallestrailsapp.com/ %w(action_controller/railtie coderay markaby).map

    &method(:require) run TheSmallestRailsApp ||= Class.new(Rails::Application) { config.secret_token = routes.append { root to: proc { [200, {"Content-Type" => "text/html"}, [Markaby::Builder.new.html { title @title = "The Smallest Rails App" h3 "I am #@title!" p "Here is my source code:" text CodeRay.scan_file(__FILE__).div(line_numbers: :table) p { a "Make me smaller", href: "//goo.gl/YdRpy" } }]] } }.to_s initialize! }
  38. Aufbau von Rails •  rails new liefert den ganze Rails-Stack

    – Alles drin was man braucht – Viel Ballast für kleine Anwendungen •  Rails besteht aus Modulen •  Module können weggelassen werden •  Module lassen sich austauschen – Mongo_Mapper statt ActiveRecord
  39. Rails Module •  Action Mailer (für E-Mail Versand) •  Action

    Pack (für View und Controller) •  Active Model (für Model) •  Active Record (der OR-Mapper) •  Active Resource (mapping REST zu Model) •  Active Support (Helper) •  Railties (Kern von Rails)
  40. Active Record •  Ist ein Architektur-Pattern •  2003 von Martin

    Fowler beschrieben •  Objekte – Verfügen über CRUD-Methoden – Objekte entsprechen DB-Tabellen – Felder bilden DB-Spalten ab •  Bildet Basis für Datenzugriffe in Rails – Kann wie jedes Modul ersetzt werden
  41. Migrations •  DSL für Datenbank-Operationen (Definitionen, nicht Abfragen) •  Migriert

    von einer Version zur nächsten •  Timestamp als eindeutige Version •  Verwaltet in Tabelle schema_migrations
  42. Beispiel Migration (Rails) class CreateBooks < ActiveRecord::Migration def change create_table

    :books do |t| t.string :title t.string :isbn t.string :description t.timestamps end end end
  43. Beispiel Migration (Rails) class AddAttachmentToBooks < ActiveRecord::Migration def self.up change_table

    :books do |t| t.has_attached_file :cover end end def self.down drop_attached_file :books, :cover end end
  44. Beispiel Migration (C# für EF) public partial class AddBlogUrl :

    DbMigration { public override void Up() { AddColumn("Blogs", "Url", c => c.String()); } public override void Down() { DropColumn("Blogs", "Url"); } } # Migrations\<timestamp>_AddBlogUrl.cs
  45. Rack •  Ruby Webserver Interface •  Wrapper zwischen HTTP-Request und

    HTTP-Response •  Verbindet Webserver - Webanwendungen •  Middleware •  Vorbild für OWIN (Open Web Interface for .NET)
  46. Bundler & Rake •  2 wichtigste Werkzeuge für Rails • 

    Bundler – Verwaltet Gems – Führt Gemfile.lock •  Rake – Build- und Automatisierungstool – Tasks anzeigen: rake -T
  47. Rails für grosse Anwendungen •  Initiale Struktur wird unübersichtlich • 

    Anwendung unterteilen – Namespaces – Gems – Rails Engines
  48. Ausblick Rails 4 •  Erwartet auf Ende 2012 •  ActiveSupport::Queue

    •  Unterstützt HTTP PATCH •  Async. Seitenaufbau mit Turbolinks •  Russian Doll Caching (cache_digests) •  ActionController::Live (streaming)
  49. Alternativen zu Rails •  Sinatra – DSL für die schnelle Entwicklung

    von Webanwendungen in Ruby – Web: http://www.sinatrarb.com •  Serve –  Rapid Prototyping Framework für Webanwendungen, setzt auf Rack auf –  Web: http://get-serve.com
  50. Alltagstipps •  Auswahl der häufigsten Arbeiten •  Zum Aufzeigen der

    Arbeitsabläufe •  Neue Anwendung Buchverwaltung – Book – Author
  51. Optik verbessern •  Rails unterstützt diverse CSS-Sprachen – Sass / LESS

    / … •  Generiertes HTML ist minimal •  Kann selber beliebig verschönert werden •  Oder: (Twitter-) Bootstrap
  52. Optik verbessern •  gem 'twitter-bootstrap-rails' •  rails g bootstrap:install • 

    rails g bootstrap:layout application fluid •  rails g bootstrap:themed books (erst nach rake db:migrate für book)
  53. n:m Relationen •  Daten sind miteinander Verknüpft – Bücher haben mehrere

    Autoren – Autoren schreiben mehrere Bücher •  Mapping über Hilfstabelle •  Zusätzliche Herausforderung – Autoren mit Büchern erfassen
  54. n:m Relationen •  Ressourcen erzeugen (Author, Book) •  rails g

    model authorship author:references book:references •  authors/_form.erb.html übernehmen •  Massenzuweisung erlauben •  Nach Belieben mit JavaScript erweitern
  55. Profiling aktivieren •  Rails nimmt einem viel Arbeit ab • 

    Was genau läuft im Hintergrund? •  MiniProfiler liefert Informationen – Aus .Net nach Ruby portiert
  56. Profiling aktivieren •  gem 'rack-mini-profiler' •  Starten •  Profiling in

    Produktion aktivieren – BeforeFilter in ApplicationController
  57. Paging •  Index-Action zeigt alle Resultate an •  Wird schnell

    zu einem Problem •  Paging verwenden •  Passende Gems: – will_paginate – kaminari
  58. Paging •  gem 'will_paginate‘ •  gem 'bootstrap-will_paginate' •  Paging im

    Controller aktivieren •  View um Paging-Control erweitern
  59. Deployment durchführen •  Applikation soll veröffentlicht werden •  Viele Gems

    zur Unterstützung – chef – capistrano •  Oder in die Cloud? – Heroku
  60. Deployment durchführen •  Voraussetzungen für Heroku – Account – Applikation in Git

    verwaltet – PostgreSQL als DB – Heroku-Toolset installiert
  61. Deployment durchführen •  /usr/local/heroku/bin/heroku create •  heroku addons:add heroku-postgresql • 

    git push heroku master •  heroku run rake --trace db:migrate •  heroku logs
  62. Dateien anheften •  Dateien lassen sich an Objekte anheften – Cover

    an Book – Avatar an Author •  Paperclip kümmert sich um alles – Benötigt imagemagick & gs
  63. Dateien anheften •  gem 'paperclip' •  rails generate paperclip book

    cover •  rake db:migrate •  Book um Feld Cover ergänzen •  Helper für Bildanzeige erstellen •  Views anpassen
  64. Verwaltungsfunktionen •  Nicht alle Daten sollen durch Benutzer erfasst werden

    •  Oft genügt Model ohne View und Controller •  ActiveAdmin liefert Komplettpaket
  65. Verwaltungsfunktionen •  gem 'activeadmin' •  rails generate active_admin:install •  Migrationsdatei

    anpassen (User/PW) •  rake db:migrate •  rails generate active_admin:resource book •  Bugfix in config/initializers/kaminari.rb
  66. Testing in Ruby & Rails •  Testing ist tief in

    der Kultur verankert – Kein Prüfung zur Kompilierzeit – Hohe Wiederverwendung – Best Practices will man leben •  Ruby und Rails unterstützen Testing – Templates für Tests – Duck Typing
  67. Testing in Ruby & Rails •  Grosse Diskussionen – Über Sinn

    und Unsinn von TDD – Über Vor- und Nachteile von BDD – Wirtschaftlichkeit – Was sind die Best Practices? – Sind Mocks gut oder böse? •  Tests müssen einem beim erreichen der Projektziele unterstützen
  68. Test-Frameworks: RSpec # bowling_spec.rb require 'bowling' describe Bowling, "#score" do

    it "returns 0 for all gutter game" do bowling = Bowling.new 20.times { bowling.hit(0) } bowling.score.should eq(0) end end $ rspec bowling_spec.rb --format nested Bowling#score returns 0 for all gutter game Finished in 0.007534 seconds 1 example, 0 failures
  69. Test-Frameworks: Cucumber # language: de Funktionalität: Division Um dumme Fehler

    zu vermeiden müssen Kassierer in der Lage sein einen Bruchteil zu berechnen Szenario: Normale Zahlen Gegeben sei ich habe 3 in den Taschenrechner eingegeben Und ich habe 2 in den Taschenrechner eingegeben Wenn ich divide drücke Dann sollte das Ergebniss auf dem Bildschirm 1.5 sein Angenommen /ich habe (\d+) in den Taschenrechner eingegeben/ do |n| @calc.push n.to_i end Wenn /ich (\w+) drücke/ do |op| @result = @calc.send op end Dann /sollte das Ergebniss auf dem Bildschirm (.*) sein/ do |result| @result.should == result.to_f end
  70. Test-Tools •  Factory_girl – Setzt Factory-Pattern um – Erzeugt Objekte für Tests

    •  Guard / Autotest – Continuous Testing – Führen Tests im Hintergrund aus •  Simplecov – Coverage Tool für Testabdeckung
  71. Webseiten •  Offizielle Seite zu Ruby: http://www.ruby-lang.org •  Offizielle Seite

    zu Rails: http://rubyonrails.org/ •  RubyGems: http://rubygems.org/ •  Ruby Toolbox: https://www.ruby-toolbox.com/ •  TryRuby: http://tryruby.org
  72. Webseiten für Windows •  Ruby Installer: http://rubyinstaller.org •  Rails Installer:

    http://railsinstaller.org •  GitHub for Windows: http://windows.github.com
  73. Falls nur 1 Folie in Erinnerung bleibt… … Ruby ist

    eine dynamische OO-Sprache … Rails ist ein mächtiges Webframework … .Net profitiert von Ruby/Rails … Es gibt mehr als nur einen richtigen Weg … Eine Programmiersprache soll uns Entwickler bei der Arbeit unterstützen