Slide 1

Slide 1 text

.NET User Group Bern Johnny Graber http://www.JGraber.ch [email protected] Follow dnugbe on twitter http://www.dnug-bern.ch/rss.aspx

Slide 2

Slide 2 text

DNUG Bern Regionalsponsoren

Slide 3

Slide 3 text

DNUG Bern Sachsponsoren

Slide 4

Slide 4 text

Heutiges Twitter-Hashtag #dnugberuby

Slide 5

Slide 5 text

Ü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

Slide 6

Slide 6 text

Agenda •  Ruby •  Rails •  Rails im Alltag •  Testing •  Weiterführende Informationen

Slide 7

Slide 7 text

Warnung •  Ich bin kein Experte. •  Diese Präsentation ist ein Einstieg in Ruby und Rails und enthält zahlreiche Vereinfachungen.

Slide 8

Slide 8 text

Ruby

Slide 9

Slide 9 text

Wieso Ruby bei der DNUG Bern? •  Das grosse Gruseln zu Halloween? http://www.flickr.com/photos/pedroferrer/3615212504/

Slide 10

Slide 10 text

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!

Slide 11

Slide 11 text

Ruby? •  Von Yukihiro „Matz“ Matsumoto •  seit 1993 entwickelt •  Objektorientierte Sprache •  Dynamische Typisierung •  Interpretiert •  Standardisiert als ISO/IEC 30170:2012

Slide 12

Slide 12 text

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)

Slide 13

Slide 13 text

Was kann man mit Ruby machen? •  Tätigkeiten automatisieren •  Daten konvertieren •  Simulationen berechnen •  Reports erzeugen •  Webanwendungen erstellen •  ...

Slide 14

Slide 14 text

Wichtige Unterschiede •  Keine grosse Firma im Hintergrund •  Alles ist ein Objekt •  Wird nicht kompiliert •  Inhalt bestimmt den Typ einer Variable •  Es gibt keine Interfaces

Slide 15

Slide 15 text

Basistypen •  Zahlen – Fixnum a = 123 – Bignum b = 123_456_789_123_456_789_123 – Float c = 1.23 •  Strings d = "Ruby & Rails"

Slide 16

Slide 16 text

Basistypen •  Ranges e = [5..10] •  Arrays f = [1, 2, 3] •  Hashes g = {"a"=> 1, "b"=> 2} •  Reguläre Ausdrücke h = /e?/

Slide 17

Slide 17 text

Symbols •  Dienen als Bezeichner •  „Vergleichbar“ mit Enum •  Über ganzes Programm hinweg eindeutig :ruby val = {a: "1", b: "2"}

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

Module •  Module sind Methodensammlungen •  Keine abstrakten Klassen in Ruby •  Mix-In: verwenden eines Moduls in einer Klasse •  Ermöglichen "Mehrfachvererbung"

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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: ! verändert Objekt

Slide 24

Slide 24 text

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 #<...>

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

Blöcke •  Sind Closures – Zugriff auf die durch Iterator übergebenen lokalen Variablen •  Syntaktisch Gleichwertig – do |x| … end – {|x| … } •  Beispiel: 5.times { puts ‘Hello’}

Slide 28

Slide 28 text

Kontrollstrukturen & Schleifen •  Kontrollstrukturen –  If / Elsif / Else –  Unless –  Case-when •  Schleifen –  While –  Until –  Loop –  For –  Each

Slide 29

Slide 29 text

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.

Slide 30

Slide 30 text

Monkey Patching •  Alles kann in Ruby verändert werden •  Änderungen an der Basisklassen – Nennt man Monkey Patching – Sollte man vorsichtig machen – Ermöglicht Metaprogrammierung

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

RubyGems •  Ist das Ruby Paketierungssystem •  Besteht aus – Paketen (analog *.dll oder *.exe) – Verwaltungstools – Repository •  Dient zur Verteilung von Code •  Ist Vorbild für NuGet

Slide 33

Slide 33 text

IRB & Pry •  Interaktive Ruby Shell •  Zum Ausprobieren von Code •  Liefert sofortiges Feedback •  Hilft beim debuggen

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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)

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

Rails

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

MVC – Model View Controller

Slide 42

Slide 42 text

Rails Demo: ToDo Auftrag: – Erstelle eine webbasierte ToDo-Verwaltung – Implementiere CRUD für Items – Speichere die Felder Title und Done

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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…

Slide 45

Slide 45 text

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! }

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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)

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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\_AddBlogUrl.cs

Slide 53

Slide 53 text

Rack •  Ruby Webserver Interface •  Wrapper zwischen HTTP-Request und HTTP-Response •  Verbindet Webserver - Webanwendungen •  Middleware •  Vorbild für OWIN (Open Web Interface for .NET)

Slide 54

Slide 54 text

Bundler & Rake •  2 wichtigste Werkzeuge für Rails •  Bundler – Verwaltet Gems – Führt Gemfile.lock •  Rake – Build- und Automatisierungstool – Tasks anzeigen: rake -T

Slide 55

Slide 55 text

Rails für grosse Anwendungen •  Initiale Struktur wird unübersichtlich •  Anwendung unterteilen – Namespaces – Gems – Rails Engines

Slide 56

Slide 56 text

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)

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

Rails im Alltag

Slide 59

Slide 59 text

Alltagstipps •  Auswahl der häufigsten Arbeiten •  Zum Aufzeigen der Arbeitsabläufe •  Neue Anwendung Buchverwaltung – Book – Author

Slide 60

Slide 60 text

Optik verbessern •  Rails unterstützt diverse CSS-Sprachen – Sass / LESS / … •  Generiertes HTML ist minimal •  Kann selber beliebig verschönert werden •  Oder: (Twitter-) Bootstrap

Slide 61

Slide 61 text

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)

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

Profiling aktivieren •  Rails nimmt einem viel Arbeit ab •  Was genau läuft im Hintergrund? •  MiniProfiler liefert Informationen – Aus .Net nach Ruby portiert

Slide 65

Slide 65 text

Profiling aktivieren •  gem 'rack-mini-profiler' •  Starten •  Profiling in Produktion aktivieren – BeforeFilter in ApplicationController

Slide 66

Slide 66 text

Paging •  Index-Action zeigt alle Resultate an •  Wird schnell zu einem Problem •  Paging verwenden •  Passende Gems: – will_paginate – kaminari

Slide 67

Slide 67 text

Paging •  gem 'will_paginate‘ •  gem 'bootstrap-will_paginate' •  Paging im Controller aktivieren •  View um Paging-Control erweitern

Slide 68

Slide 68 text

Deployment durchführen •  Applikation soll veröffentlicht werden •  Viele Gems zur Unterstützung – chef – capistrano •  Oder in die Cloud? – Heroku

Slide 69

Slide 69 text

Deployment durchführen •  Voraussetzungen für Heroku – Account – Applikation in Git verwaltet – PostgreSQL als DB – Heroku-Toolset installiert

Slide 70

Slide 70 text

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

Slide 71

Slide 71 text

Dateien anheften •  Dateien lassen sich an Objekte anheften – Cover an Book – Avatar an Author •  Paperclip kümmert sich um alles – Benötigt imagemagick & gs

Slide 72

Slide 72 text

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

Slide 73

Slide 73 text

Verwaltungsfunktionen •  Nicht alle Daten sollen durch Benutzer erfasst werden •  Oft genügt Model ohne View und Controller •  ActiveAdmin liefert Komplettpaket

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

Testing

Slide 76

Slide 76 text

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

Slide 77

Slide 77 text

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

Slide 78

Slide 78 text

Arten von Tests •  Akzeptanztest •  Systemtest •  Integrationstest •  Unittests Detaillierung nimmt zu Testdauer steigt

Slide 79

Slide 79 text

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

Slide 80

Slide 80 text

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

Slide 81

Slide 81 text

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

Slide 82

Slide 82 text

Weiterführende Informatonen

Slide 83

Slide 83 text

Podcasts •  Ruby 5 http://ruby5.envylabs.com/ •  The Ruby Show http://rubyshow.com/ •  Ruby Rogues http://rubyrogues.com/

Slide 84

Slide 84 text

Screencasts & Videos •  Railscasts http://railscasts.com/ •  Confreaks http://www.confreaks.com/ •  TekPub http://tekpub.com/ •  PeepCode https://peepcode.com/

Slide 85

Slide 85 text

Buchempfehlungen

Slide 86

Slide 86 text

Leider veraltet

Slide 87

Slide 87 text

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

Slide 88

Slide 88 text

Webseiten für Windows •  Ruby Installer: http://rubyinstaller.org •  Rails Installer: http://railsinstaller.org •  GitHub for Windows: http://windows.github.com

Slide 89

Slide 89 text

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

Slide 90

Slide 90 text

Fragen und Diskussion