Slide 1

Slide 1 text

Ruby  und  Rails     für  .Net  Entwickler   Johnny  Graber   http://www.JGraber.ch   [email protected]  

Slide 2

Slide 2 text

Ü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  

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

Ruby  

Slide 5

Slide 5 text

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!    

Slide 6

Slide 6 text

Wer  nutzt  Ruby  /  Rails?  

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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      

Slide 15

Slide 15 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 16

Slide 16 text

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

Slide 17

Slide 17 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  AppHelper      extend  BooksHelper      include  Enumerable   end  

Slide 18

Slide 18 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  speziwische  Objekt-­‐Instanz   gehängt  werde   •  Konvention:  !  verändert  Objekt    

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

method_missing   •  Wird  aufgerufen  falls  Methode  fehlt   •  Erlaubt  eine  dynamische  Auswertung  der   geschickten  Meldung   – wind_by_*****  in  ActiveRecord  

Slide 21

Slide 21 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 22

Slide 22 text

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

Slide 23

Slide 23 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 24

Slide 24 text

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

Slide 25

Slide 25 text

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  

Slide 26

Slide 26 text

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  

Slide 27

Slide 27 text

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    

Slide 28

Slide 28 text

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

Slide 29

Slide 29 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 30

Slide 30 text

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)    

Slide 31

Slide 31 text

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  

Slide 32

Slide 32 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 33

Slide 33 text

Rails  

Slide 34

Slide 34 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  conwiguration  

Slide 35

Slide 35 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 36

Slide 36 text

MVC  –  Model  View  Controller  

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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  

Slide 39

Slide 39 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 40

Slide 40 text

Pause  

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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  

Slide 43

Slide 43 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 44

Slide 44 text

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  

Slide 45

Slide 45 text

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  

Slide 46

Slide 46 text

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  

Slide 47

Slide 47 text

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  

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

WichTge  Werkzeuge   •  Bundler   – Verwaltet  Gems   – Führt  Gemwile.lock   •  Rake   – Build-­‐  und  Automatisierungstool   – Tasks  anzeigen:  rake  -­‐T  

Slide 50

Slide 50 text

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    

Slide 51

Slide 51 text

Arten  von  Tests  

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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    

Slide 54

Slide 54 text

Rails  im  Alltag  

Slide 55

Slide 55 text

AlltagsTpps   •  Auswahl  der  häuwigsten  Arbeiten   •  Zum  Aufzeigen  der  Arbeitsabläufe   •  Selber  probieren:   https://github.com/jgraber/Zentral_RailsDemo   •  Neue  Anwendung  Buchverwaltung   – Book   – Author  

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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)  

Slide 58

Slide 58 text

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'  

Slide 59

Slide 59 text

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  

Slide 60

Slide 60 text

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  

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

Paging   •  gem  'kaminari’   •  rails  g  kaminari:views  bootstrap   •  Paging  im  Controller  aktivieren   •  View  um  Paging-­‐Control  erweitern   •  Paging  erscheint  nur  wen  notwendig  

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 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 66

Slide 66 text

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  

Slide 67

Slide 67 text

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  

Slide 68

Slide 68 text

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  

Slide 69

Slide 69 text

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  

Slide 70

Slide 70 text

Weiterführende   InformaTonen  

Slide 71

Slide 71 text

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/  

Slide 72

Slide 72 text

Buchempfehlungen  

Slide 73

Slide 73 text

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/    

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

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  

Slide 76

Slide 76 text

Fragen  und  Diskussion  

Slide 77

Slide 77 text

Photo  Credits   •  http://www.wlickr.com/photos/johnny_graber/ 6097321363   •  http://www.wlickr.com/photos/brucetsao/ 5044455674   •  http://www.wlickr.com/photos/lorenzwalthert/ 3223217160