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

Ruby & Rails für .Net Entwickler (Luzern)

Ruby & Rails für .Net Entwickler (Luzern)

Code-Beispiele und Folien zu meinem Vortrag vom 22.04.2013 bei @dotnetzentral

Johnny Graber

April 22, 2013
Tweet

More Decks by Johnny Graber

Other Decks in Programming

Transcript

  1. Über  Johnny  Graber   •  SW  Ingenieur  @  FMH,  Bern

      – Weiter-­‐  und  Fortbildungsplattformen       •  Web:  http://www.JGraber.ch   •  Twitter:  @j_graber       Hinweis: Verwendung für eigene Präsentationen nur mit Einverständnis des Autors  
  2. Agenda   •  Ruby   •  Rails   •  Rails

     im  Alltag   •  Weiterführende  Informationen  
  3. Wieso  Ruby  bei  .Net  Zentral?   •  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!    
  4. Ruby?   •  Von  Yukihiro  „Matz“  Matsumoto   •  seit

     1993  entwickelt   •  Objektorientierte  Sprache   •  Dynamische  Typisierung   •  Interpretiert   •  Standardisiert  als  ISO/IEC  30170:2012    
  5. Basistypen   •  Zahlen   – Fixnum    a  =  123

      – Bignum    b  =  123_456_789_123_456_789_123   – Float    c  =  1.23   •  Strings    d  =  "Ruby  &  Rails"  
  6. Basistypen   •  Ranges        e  =  [5..10]

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

     Enum   •  Über  das  ganze  Programm  hinweg  eindeutig    :ruby    val  =  {a:  "1",  b:  "2"}  
  8. Klassen   •  Ruby  unterstütz  Einfachvererbung   •  Methode  initialize()

     ist  der  Konstruktor   •  Sichtbarkeit   – public:  Sichtbar  für  alle   – protected:  Sichtbar  in  Vererbungshierarchie   – private:  Sichtbar  nur  für  deklarierende  Klasse      
  9. 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  
  10. Module   •  Module  sind  Methodensammlungen   •  Keine  abstrakten

     Klassen  in  Ruby   •  Mix-­‐In:  verwenden  eines  Moduls  in  einer   Klasse   •  Ermöglichen  "Mehrfachvererbung"  
  11. 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  AppHelper      extend  BooksHelper      include  Enumerable   end  
  12. 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  speziwische  Objekt-­‐Instanz   gehängt  werde   •  Konvention:  <Methode>!  verändert  Objekt    
  13. Beispiel  Methoden  an  Instanz   a  =  Object.new   b

     =  Object.new     def  a.hello      "Hello  world"   end     a.hello   =>  "Hello  world"   b.hello   NoMethodError:  undewined  method  `hello'  for  #<...>  
  14. method_missing   •  Wird  aufgerufen  falls  Methode  fehlt   • 

    Erlaubt  eine  dynamische  Auswertung  der   geschickten  Meldung   – wind_by_*****  in  ActiveRecord  
  15. Blöcke   •  Sind  Closures   – Zugriff  auf  die  durch

     Iterator  übergebenen   lokalen  Variablen   •  Syntaktisch  Gleichwertig   – do  |x|  …  end   – {|x|  …  }   •  Beispiel:    5.times  {  puts  “Hello“}  
  16. Kontrollstrukturen  &  Schleifen   •  Kontrollstrukturen   –  If  /

     Elsif  /  Else   –  Unless   –  Case-­‐when   •  Schleifen   –  While   –  Until   –  Loop   –  For   –  Each  
  17. 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.  
  18. Monkey  Patching   •  Alles  kann  in  Ruby  verändert  werden

      •  Änderungen  an  der  Basisklassen   – Sollte  man  vorsichtig  machen   – Ermöglicht  Metaprogrammierung  
  19. Reservierte  Schlüsselwörter   begin  and  alias  END  BEGIN    

    __LINE__  __FILE__  __ENCODING__     end  elsif  else  do  dewined?  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  
  20. Flexibilität  von  Ruby   •  Alles  kann  verändert  werden  

    •  Method_missing  lässt  Objekte  auf  nicht   dewinierte  Methoden  antworten   •  Duck  Typing  lässt  beliebige  Klassen   miteinander  zusammenarbeiten   •  Monkey  Patching  ermöglicht  die   Weiterentwicklung  ohne  neuen  Release  
  21. Ruby  Gems   •  Ist  das  Ruby  Paketierungssystem   • 

    Besteht  aus   – Paketen  (analog  *.dll  oder  *.exe)   – Verwaltungstools   – Repository   •  Ist  Vorbild  für  NuGet   •  Gems  winden:  Ruby-­‐Toolbox.com    
  22. IRB  &  Pry   •  Interaktive  Ruby  Shell   • 

    Zum  ausprobieren  von  Code   •  Liefert  sofortiges  Feedback   •  Hilft  beim  debuggen    
  23. 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  
  24. Ruby  ImplemenTerungen   •  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)    
  25. Wozu  all  die  ImplemenTerungen?   •  Unterschiedliche  Ziele   • 

    Ruby  ist  zu  langsam   – RMI  schlecht  für  Multitasking  (GIL)   •  C  Komponenten  laufen  nicht  überall   •  Bestehenden  Code  weiter  verwenden  
  26. 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  
  27. 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  conwiguration  
  28. 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  
  29. Rails  Demo:  ToDo   Auftrag:     – Erstelle  eine  webbasierte

     ToDo-­‐Verwaltung   – Implementiere  CRUD  für  Items   – Speichere  die  Felder  Title  und  Done  
  30. Rails  Demo:  ToDo  –  Befehle   rails  new  todo  

    cd  todo   vi  Gemwile   bundle   rails  g  scaffold  item  title:string  done:boolean   rake  db:create  &  rake  db:migrate   rails  s  
  31. 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…  
  32. Demo:  Kleinste  Rails  Anwendung   #  Von  http://thesmallestrailsapp.com/   %w(action_controller/railtie

     coderay  markaby).map  &method(:require)     run  TheSmallestRailsApp  ||=  Class.new(Rails::Application)  {      conwig.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_wile(__FILE__).div(line_numbers:  :table)                  p  {  a  "Make  me  smaller",  href:  "//goo.gl/YdRpy"  }              }]]          }      }.to_s      initialize!   }  
  33. Au[au  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  
  34. 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)  
  35. AcTve  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  
  36. MigraTons   •  DSL  für  Datenbank-­‐Operationen   (Dewinitionen,  nicht  Abfragen)

      •  Migriert  von  einer  Version  zur  nächsten   •  Timestamp  als  eindeutige  Version   •  Verwaltet  in  Tabelle  schema_migrations  
  37. Beispiel  MigraTon  (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  
  38. Beispiel  MigraTon  (Rails)   class  AddAttachmentToBooks  <  ActiveRecord::Migration    

     def  self.up          change_table  :books  do  |t|              t.has_attached_wile  :cover          end      end        def  self.down          drop_attached_wile  :books,  :cover      end   end  
  39. Beispiel  MigraTon  (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  
  40. WichTge  Werkzeuge   •  Bundler   – Verwaltet  Gems   – Führt

     Gemwile.lock   •  Rake   – Build-­‐  und  Automatisierungstool   – Tasks  anzeigen:  rake  -­‐T  
  41. TesTng  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    
  42. Rails  für  grosse  Anwendungen   •  Initiale  Struktur  wird  unübersichtlich

      •  Anwendung  unterteilen   – Namespaces   – Gems   – Rails  Engines  
  43. AlternaTven  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    
  44. AlltagsTpps   •  Auswahl  der  häuwigsten  Arbeiten   •  Zum

     Aufzeigen  der  Arbeitsabläufe   •  Selber  probieren:   https://github.com/jgraber/Zentral_RailsDemo   •  Neue  Anwendung  Buchverwaltung   – Book   – Author  
  45. OpTk  verbessern   •  Rails  unterstützt  diverse  CSS-­‐Sprachen   – Sass

     /  LESS  /  …   •  Generiertes  HTML  ist  minimal   •  Kann  selber  beliebig  verschönert  werden   •  Oder:  (Twitter-­‐)  Bootstrap    
  46. OpTk  verbessern   •  gem  'twitter-­‐bootstrap-­‐rails'   •  gem  'less-­‐rails'

      •  rails  g  bootstrap:install   •  rails  g  bootstrap:layout  application  wluid   •  rails  g  bootstrap:themed  books   (erst  nach  rake  db:migrate  für  book)  
  47. Developer-­‐Tools   •  Rails  nimmt  einem  viel  Arbeit  ab  

    •  Was  genau  läuft  im  Hintergrund?   •  MiniProwiler  liefert  Informationen   – Aus  .Net  nach  Ruby  portiert   – gem  'rack-­‐mini-­‐prowiler'   •  Bessere  Fehlermeldungen   – gem  'better_errors‘   – gem  'quiet_assets'  
  48. n:m  RelaTonen   •  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  
  49. n:m  RelaTonen   •  Ressourcen  erzeugen  (Author,  Book)   • 

    rails  g  model  authorship  author:references   book:references   •  authors/_form.erb.html  übernehmen   •  Massenzuweisung  erlauben   •  Nach  Belieben  mit  JavaScript  erweitern  
  50. Paging   •  Index-­‐Action  zeigt  alle  Resultate  an   • 

    Wird  schnell  zu  einem  Problem   •  Paging  verwenden   •  Passende  Gems:   – will_paginate   – kaminari  
  51. Paging   •  gem  'kaminari’   •  rails  g  kaminari:views

     bootstrap   •  Paging  im  Controller  aktivieren   •  View  um  Paging-­‐Control  erweitern   •  Paging  erscheint  nur  wen  notwendig  
  52. Deployment  durchführen   •  Applikation  soll  veröffentlicht  werden   • 

    Viele  Gems  zur  Unterstützung   – chef   – capistrano   •  Oder  in  die  Cloud?   – Heroku  
  53. Deployment  durchführen   •  Voraussetzungen  für  Heroku   – Account  

    – Applikation  in  Git  verwaltet   – PostgreSQL  als  DB   – Heroku-­‐Toolset  installiert  
  54. 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  
  55. Dateien  anhe`en   •  Dateien  lassen  sich  an  Objekte  anheften

      – Cover  an  Book   – Avatar  an  Author   •  Paperclip  kümmert  sich  um  alles   – Benötigt  imagemagick  &  gs  
  56. Dateien  anhe`en   •  gem  'paperclip'   •  rails  generate

     paperclip  book  cover   •  rake  db:migrate   •  Book  um  Feld  Cover  ergänzen   •  Helper  für  Bildanzeige  erstellen   •  Views  anpassen  
  57. VerwaltungsfunkTonen   •  Nicht  alle  Daten  sollen  durch  Benutzer  

    erfasst  werden   •  Oft  genügt  Model  ohne  View  und  Controller   •  ActiveAdmin  liefert  Komplettpaket   •  Rails  4  geht  noch  nicht  
  58. VerwaltungsfunkTonen   •  gem  'activeadmin'   •  rails  generate  active_admin:install

      •  Migrationsdatei  anpassen  (User/PW)   •  rake  db:migrate   •  rails  generate  active_admin:resource  book   •  Bugwix  in  conwig/initializers/kaminari.rb  
  59. Podcasts  &  Videos   •  Ruby  5  http://ruby5.envylabs.com/   • 

    The  Ruby  Show  http://rubyshow.com/   •  Ruby  Rogues  http://rubyrogues.com/   •  Railscasts  http://railscasts.com/   •  Confreaks  http://www.confreaks.com/   •  TekPub  http://tekpub.com/  
  60. Webseiten   •  Ofwizielle  Seite  zu  Ruby:     http://www.ruby-­‐lang.org

      •  Ofwizielle  Seite  zu  Rails:     http://rubyonrails.org/   •  RubyGems:     http://rubygems.org/   •  Ruby  Toolbox:     https://www.ruby-­‐toolbox.com/    
  61. Webseiten  für  Windows   •  Ruby  Installer:     http://rubyinstaller.org

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

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