Publicidad

Ruby und Rails für .NET Entwickler

Community
27 de Mar de 2023
Publicidad

Más contenido relacionado

Publicidad

Último(20)

Ruby und Rails für .NET Entwickler

  1. .NET User Group Bern Johnny Graber http://www.JGraber.ch JG@JGraber.ch Follow dnugbe on twitter http://www.dnug-bern.ch/rss.aspx
  2. DNUG Bern Regionalsponsoren
  3. DNUG Bern Sachsponsoren
  4. Heutiges Twitter-Hashtag #dnugberuby
  5. Ü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
  6. Agenda • Ruby • Rails • Rails im Alltag • Testing • Weiterführende Informationen
  7. Warnung • Ich bin kein Experte. • Diese Präsentation ist ein Einstieg in Ruby und Rails und enthält zahlreiche Vereinfachungen.
  8. Ruby
  9. Wieso Ruby bei der DNUG Bern? • Das grosse Gruseln zu Halloween? http://www.flickr.com/photos/pedroferrer/3615212504/
  10. 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!
  11. Ruby? • Von Yukihiro „Matz“ Matsumoto • seit 1993 entwickelt • Objektorientierte Sprache • Dynamische Typisierung • Interpretiert • Standardisiert als ISO/IEC 30170:2012
  12. 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)
  13. Was kann man mit Ruby machen? • Tätigkeiten automatisieren • Daten konvertieren • Simulationen berechnen • Reports erzeugen • Webanwendungen erstellen • ...
  14. Wichtige Unterschiede • Keine grosse Firma im Hintergrund • Alles ist ein Objekt • Wird nicht kompiliert • Inhalt bestimmt den Typ einer Variable • Es gibt keine Interfaces
  15. Basistypen • Zahlen – Fixnum a = 123 – Bignum b = 123_456_789_123_456_789_123 – Float c = 1.23 • Strings d = "Ruby & Rails"
  16. Basistypen • Ranges e = [5..10] • Arrays f = [1, 2, 3] • Hashes g = {"a"=> 1, "b"=> 2} • Reguläre Ausdrücke h = /e?/
  17. Symbols • Dienen als Bezeichner • „Vergleichbar“ mit Enum • Über ganzes Programm hinweg eindeutig :ruby val = {a: "1", b: "2"}
  18. 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
  19. 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
  20. 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
  21. Module • Module sind Methodensammlungen • Keine abstrakten Klassen in Ruby • Mix-In: verwenden eines Moduls in einer Klasse • Ermöglichen "Mehrfachvererbung"
  22. 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
  23. 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
  24. 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 #<...>
  25. 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
  26. 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
  27. Blöcke • Sind Closures – Zugriff auf die durch Iterator übergebenen lokalen Variablen • Syntaktisch Gleichwertig – do |x| … end – {|x| … } • Beispiel: 5.times { puts ‘Hello’}
  28. Kontrollstrukturen & Schleifen • Kontrollstrukturen – If / Elsif / Else – Unless – Case-when • Schleifen – While – Until – Loop – For – Each
  29. 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.
  30. Monkey Patching • Alles kann in Ruby verändert werden • Änderungen an der Basisklassen – Nennt man Monkey Patching – Sollte man vorsichtig machen – Ermöglicht Metaprogrammierung
  31. 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
  32. RubyGems • Ist das Ruby Paketierungssystem • Besteht aus – Paketen (analog *.dll oder *.exe) – Verwaltungstools – Repository • Dient zur Verteilung von Code • Ist Vorbild für NuGet
  33. IRB & Pry • Interaktive Ruby Shell • Zum Ausprobieren von Code • Liefert sofortiges Feedback • Hilft beim debuggen
  34. 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
  35. 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)
  36. 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
  37. 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
  38. Rails
  39. 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
  40. 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
  41. MVC – Model View Controller
  42. Rails Demo: ToDo Auftrag: – Erstelle eine webbasierte ToDo-Verwaltung – Implementiere CRUD für Items – Speichere die Felder Title und Done
  43. 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
  44. 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…
  45. 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! }
  46. 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
  47. 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)
  48. 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
  49. 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
  50. 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
  51. 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
  52. 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
  53. Rack • Ruby Webserver Interface • Wrapper zwischen HTTP-Request und HTTP-Response • Verbindet Webserver - Webanwendungen • Middleware • Vorbild für OWIN (Open Web Interface for .NET)
  54. Bundler & Rake • 2 wichtigste Werkzeuge für Rails • Bundler – Verwaltet Gems – Führt Gemfile.lock • Rake – Build- und Automatisierungstool – Tasks anzeigen: rake -T
  55. Rails für grosse Anwendungen • Initiale Struktur wird unübersichtlich • Anwendung unterteilen – Namespaces – Gems – Rails Engines
  56. 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)
  57. 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
  58. Rails im Alltag
  59. Alltagstipps • Auswahl der häufigsten Arbeiten • Zum Aufzeigen der Arbeitsabläufe • Neue Anwendung Buchverwaltung – Book – Author
  60. Optik verbessern • Rails unterstützt diverse CSS-Sprachen – Sass / LESS / … • Generiertes HTML ist minimal • Kann selber beliebig verschönert werden • Oder: (Twitter-) Bootstrap
  61. 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)
  62. 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
  63. 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
  64. Profiling aktivieren • Rails nimmt einem viel Arbeit ab • Was genau läuft im Hintergrund? • MiniProfiler liefert Informationen – Aus .Net nach Ruby portiert
  65. Profiling aktivieren • gem 'rack-mini-profiler' • Starten • Profiling in Produktion aktivieren – BeforeFilter in ApplicationController
  66. Paging • Index-Action zeigt alle Resultate an • Wird schnell zu einem Problem • Paging verwenden • Passende Gems: – will_paginate – kaminari
  67. Paging • gem 'will_paginate‘ • gem 'bootstrap-will_paginate' • Paging im Controller aktivieren • View um Paging-Control erweitern
  68. Deployment durchführen • Applikation soll veröffentlicht werden • Viele Gems zur Unterstützung – chef – capistrano • Oder in die Cloud? – Heroku
  69. Deployment durchführen • Voraussetzungen für Heroku – Account – Applikation in Git verwaltet – PostgreSQL als DB – Heroku-Toolset installiert
  70. 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
  71. Dateien anheften • Dateien lassen sich an Objekte anheften – Cover an Book – Avatar an Author • Paperclip kümmert sich um alles – Benötigt imagemagick & gs
  72. 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
  73. Verwaltungsfunktionen • Nicht alle Daten sollen durch Benutzer erfasst werden • Oft genügt Model ohne View und Controller • ActiveAdmin liefert Komplettpaket
  74. 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
  75. Testing
  76. 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
  77. 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
  78. Arten von Tests • Akzeptanztest • Systemtest • Integrationstest • Unittests Detaillierung nimmt zu Testdauer steigt
  79. 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
  80. 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
  81. 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
  82. Weiterführende Informatonen
  83. Podcasts • Ruby 5 http://ruby5.envylabs.com/ • The Ruby Show http://rubyshow.com/ • Ruby Rogues http://rubyrogues.com/
  84. Screencasts & Videos • Railscasts http://railscasts.com/ • Confreaks http://www.confreaks.com/ • TekPub http://tekpub.com/ • PeepCode https://peepcode.com/
  85. Buchempfehlungen
  86. Leider veraltet
  87. 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
  88. Webseiten für Windows • Ruby Installer: http://rubyinstaller.org • Rails Installer: http://railsinstaller.org • GitHub for Windows: http://windows.github.com
  89. 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
  90. Fragen und Diskussion
Publicidad