Home

Praxiswissen Ruby - beim O'Reilly Verlag

image

Contents

1. Y f close else puts Noch keine Eintraege end Menue anzeigen puts print AUSWAHL print N euere if pos lt postings print A eltere if pos gt 5 print S chreiben E nde n print gt enueauswahl wahl gets chomp Beenden break if wahl e i euere Postings if wahl n i pos 5 pos postings if pos gt postings next end Aeltere Postings if wahl a i pos 5 pos 1 if pos lt 1 next end Eingabe eines neuen Eintrags puts Neuen Eintrag zeilenweise eingeben leere Zeile zum Fertigstellen Anzahl und Position erhoehen postings 1 Ein und Ausgabe 131 Beispiel 3 3 Das Konsolen Blog textblog txt Fortsetzung 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 pos postings Neue Datei zum Schreiben oeffnen fname post postings txt f File open fname w Datum Uhrzeit als erste Zeile erzeugen t Time new eintrag t strftime d m Y H M Schleife bis Eintrag leerer String ist while eintrag Eintrag in die Datei schreiben f puts eintrag Neue Zeile einlesen eintrag gets chomp end Datei schliessen f close Neue Anzahl eintragen f File open postings txt w f puts postings f close end Hier die Beschreibung der einzelnen Teile des Skripts Zeile 2 4 Zwei Variablen werden initialisiert postings speichert die Anzahl der vorhandenen Ein
2. Ruby my love You ll be my love You be my sky above Ruby my light You ll be my light You ll be my day and night You ll be mine tonight Cat Stevens Ruby Love In diesem Kapitel erfahren Sie zun chst das Wichtigste ber die Entwicklungsge schichte und die Eigenheiten der Programmiersprache Ruby Danach wird beschrie ben wie Sie das Ruby Paket auf Ihrem Rechner installieren k nnen Anschlie end unternehmen Sie Ihre ersten Schritte mit der Sprache und ihren Werkzeugen Etwas Ruby Geschichte Bereits als Informatikstudent machte sich der japanische Programmierer Yukihiro Matsumoto genannt Matz in den 1980er Jahren allerlei Gedanken ber Program miersprachen speziell ber Skriptsprachen Im Jahr 1993 begann er dann mit der Entwicklung seiner eigenen Sprache Er w hlte den Namen Ruby Rubin ein Edel stein der entsprechend einen deutlichen Bezug zu Perl bildet Erst im Nachhinein bemerkte er dass der Rubin als Geburtsstein des Monats Juli direkt auf die Perle Juni folgt was interessant ist weil Ruby einige Perl Konzepte weiterentwickelt 1 Siehe zum Beispiel http en wikipedia org wiki Birthstone Birthstones Bei der Entwicklung von Ruby lie sich Matz durch mancherlei Vorbilder inspirie ren insbesondere durch andere Skriptsprachen Perl wie bereits erw hnt beson ders bez glich der M glichkeit einer knappen Ausdrucksweise aber auch Python was die im Vergleich zu Perl klar
3. e x Umkehrfunktion des nat rlichen Logarithmus Math log10 x Zehnerlogarithmus Umkehrung 10 x Math sin x Math cos x Math tan x trigonometrische Funktionen Winkel im Bogenma 180 27 Math asin x Math acos x Math atan x Arcus oder Umkehrfunktionen der trigonometrischen Funktionen Math hypot k1 k2 Hypotenuse der beiden gegebenen Katheten gem Satz des Pythagoras Object Basisklasse f r s mtliche Ruby Klassen Instanzmethoden obj class liefert die Klasse eines Objekts obj eql obj2 true wenn obj und obj2 ein und dasselbe Objekt sind gleiche object_id ansonsten false obj instance_of class true wenn obj direkte Instanz von class ist ansonsten false obj kind_of class true wenn obj Instanz von class oder irgendeines Vorfah ren von class ist ansonsten false obj object_id die eindeutige ID des Objekts obj respond_to method true wenn object direkt oder indirekt die Methode method besitzt ansonsten false obj to_s String Darstellung des Objekts Klassenreferenz 367 Rational Echter Bruch Literale Rational zaehler nenner Werden automatisch so weit wie m glich gek rzt Instanzmethoden e rational numerator Z hler e rational denominator Nenner e rational to_f in Flie kommazahl konvertieren Regexp Kapselt einen regul ren Ausdruck Konstruktoraufruf e reg Regexp new regexp e reg Regexp new regexp st
4. CGl Skripten mit Ruby Zugriff auf Datenbanken We ba nwend u ngen We are in great haste to construct a magnetic telegraph from Maine to Texas but Maine and Texas it may be have nothing important to communicate Henry David Thoreau Schon bevor das im n chsten Kapitel besprochene Framework Ruby on Rails ent wickelt wurde konnte man mit Ruby Webanwendungen schreiben Bei einer Web anwendung liefert ein Webserver keine statischen Dokumente aus sondern startet nach dem Empfang einer HTTP Anfrage ein Programm oder Skript Seine Eingabe erh lt dieses Programm aus Benutzereingaben in ein Webformular Die Ausgabe des Programms meist HTML Code manchmal auch ein dynamisch erzeugtes Bild oder eine andere Datei wird an den Browser des Benutzers zur ckgeliefert Viele Webanwendungen lesen zus tzlich Daten aus einer Datenbank und schreiben wieder neue Daten hinein damit sie dauerhaft gespeichert bleiben Das ist die bli che Art und Weise gr ere Websites zu betreiben weil sie effizient und wenig st r anf llig ist Die Zusammenarbeit mit einer Datenbank wird in diesem Kapitel anhand des beliebten Open Source Datenbankservers MySQL erl utert 1 bersetzung Wir beeilen uns eine Magnettelegrafenleitung von Maine nach Texas zu bauen aber Maine und Texas haben sich vielleicht gar nichts Wichtiges mitzuteilen 273 Den Webserver Apache 2 installieren Bevor Sie Webanwendungen schreiben k nnen ben
5. Die Ruby Hilferi 149 Der Unterschied zwischen und in diesen Eingaben ist wichtig Der Punkt oder wahlweise beschreibt Klassenmethoden die ohne Existenz einer Instanz das hei t eines konkreten Objekts der Klasse aufgerufen werden Die Raute ist dagegen f r Instanzmethoden zust ndig f r die ein Objekt existieren muss Die Methode new die eine neue Instanz erzeugt ist nat rlich stets eine Klassenmethode da die Instanz zum Zeitpunkt ihres Aufrufs eben noch nicht existiert Die n chste Methode ist gets es erscheint logisch dass sie sich analog zu puts ver h lt Geben Sie also auf Verdacht gt ri IOf gets ein Volltreffer Allerdings liefert auch Kernel gets im Gegensatz zu Kernel puts eine ausf hrliche Antwort Die letzte neue Methode ist chomp Hier ist die Klasse noch unbekannt so dass Sie zuerst einfach gt ri chomp eingeben sollten Die beiden Alternativen sind Kernel chomp und Stringt chomp Da chomp im Beispielskript zweifellos als Methode eines Objekts name aufgerufen wurde erscheint es logisch dass String chomp die richtige Wahl ist Wenn Sie gt ri String chomp eingeben werden Sie feststellen dass die Vermutung korrekt ist Umgekehrt k nnen Sie ri Klassenname eingeben um zun chst eine Liste aller Methoden der jeweiligen Klasse manchmal auch eine allgemeine Beschreibung zu erhalten Anschlie end k nnen Sie sich nach dem soeben erl uterten Verfahren die Beschreibungen
6. Hier die Ausgabe dieses Beispiels fr steht fuer Franzoesisch de steht fuer Deutsch en steht fuer Englisch Auch andere Datentypen besitzen spezielle Iteratoren Ein sehr n tzlicher steht f r Ganzzahlen zur Verf gung und hei t times Er f hrt die im Block verschachtelte Aufgabe so oft aus wie es die jeweilige Zahl angibt Das folgende Beispiel liefert 5 W rfe eines W rtels ideal etwa f r das beliebte Spiel Kniffel 5 times wurf rand 6 1 print wurf Beispielausgabe 44 3 52175 Weitere wichtige Iteratoren f r Integerwerte sind e n1 upto n2 z hlt aufw rts von n1 bis einschlie lich n2 gt gt 3 upto 7 i print i 34567 e n1 downto n2 z hlt abw rts von n1 bis n2 wobei n1 nat rlich gr er sein muss als n2 gt gt 10 downto 5 ji print i 10 98 7 6 5 e n1 step n2 n3 z hlt in Schritten der Gr e n3 von n1 bis n2 gt gt 8 step 64 8 Ji print i 8 16 24 32 40 48 56 64 gt gt 49 step 7 7 Ji print i 49 42 35 28 21 14 7 Strings dagegen sind beispielsweise mit dem Iterator each_byte ausgestattet der nacheinander die Codes der einzelnen Zeichen liefert Damit l sst sich das oben vorgestellte Exklusiv Oder Verschl sselungsprogramm etwas kompakter schrei ben print Text text gets chomp print Schluessel 1 255 key gets to_i if key lt 1 or key gt 255 puts Ungueltiger Schluessel exit end 104 Kapitel 2 Sp
7. 009900 gruen nbsp amp nbsp amp nbsp 0000FF blau cgi br cgi submit Farbe speichern cgi a href gt farbe rb Farbe anschauen Das Skript farbe rb enth lt folgenden Code C ruby bin ruby exe w require cgi cgi CGI new html4 Farbe aus dem Cookie lesen if cgi cookies has_key farbe cookie cgi cookies farbe farbe cookie value O0 else farbe 000000 end cgi out cgi html cgi head cgi title Cookie Schreiber cgi meta http equiv gt content type content gt text html charset iso 8859 1 cgi body bgcolor gt FFFFFF text gt farbe CGl Skripten mit Ruby 307 cgi h1 Hier die gewaehlte Farbe aus dem Cookie cgi p als Textfarbe cgi a href gt farbwaehler rb Zurueck Wie Sie sehen enthalten beide Skripten die Anweisung cgi meta http equiv gt content type content gt text html charset iso 8859 1 Das lt meta gt Tag im Head stellt zus tzliche Optionen ein die den Browser und eventuell auch diverse Suchmaschinen interessieren Das Attribut http equiv besagt dass die Angabe dem betreffenden HTTP Header entspricht Im vorliegen den Fall wird der Header Content type zur Angabe des Dateityps berschrieben Der vollst ndige Wert ist text html charset iso 8859 1 Der Header wird also verwendet um neben dem Datentyp auch den zu verwenden
8. 114 115 116 117 18 119 Datenbankverbindung schliessen 120 conn close 328 Kapitel 6 Klassische Webanwendungen Beachten Sie besonders die Methode cd liste Zeile 7 31 Sie erzeugt die HTML Tabellenzeilen mit den einzelnen CDs falls bereits welche vorhanden sind Daten bankverbindung und CGI Objekt werden ihr in Form von Parametern zur Verf gung gestellt um die Verwendung globaler Variablen zu vermeiden Da die Ausgabe in jedem Fall ein String ist notfalls ein leerer kann der Methodenaufruf in Zeile 113 einfach mit an die bisherigen Tabellenzeilen angef gt werden Interessant ist au erdem dass der eingegebene Interpret nur dann in die Tabelle interpreten eingef gt wird falls er noch nicht vorhanden ist Daf r sorgen die Zei len 47 58 Zun chst sucht eine SQL Abfrage in der Tabelle nach einem Interpreten mit dem eingegebenen Namen Falls dieser noch nicht vorhanden ist findet eine INSERT Abfrage statt In Zeile 60 64 wird dann in jedem Fall die ID des Interpreten zum Eintragen in die CD Tabelle ausgelesen Zwischen CGI und Rails weitere M glichkeiten CGI ist wie bereits erw hnt die einfachste Schnittstelle f r Ruby Webanwendun gen Im n chsten Kapitel lernen Sie die derzeit perfekteste Variante kennen Ruby on Rails Zwischen diesen beiden Polen existieren noch zwei weitere Hilfsmittel f r Ruby Websites die hier zumindest erw hnt werden sollen Wenn Sie den Apache Webserver be
9. Wenn Sie das urspr ngliche objektorientierte G terzug Skript zug_oo rb und das Skript mit dieser Erweiterung einfacher_gueterzug rb nacheinander in irb impor tieren k nnen Sie die neue Klasse ausprobieren Beispielsweise so gt gt require zug_oo rb Vollst ndige Ausgabe dieses Skripts gt true gt gt require einfacher_gueterzug rb gt true gt gt egz EinfacherGueterzug new Lok DIESEL Lok OHNE 40 gt lt EinfacherGueterzug 0x2b13710 loks lt Lok 0x2b136d4 typ 50 gt lt Lok 0x2b136c0 typ 0 gt waggons 40 gt gt gt egz 10 gt lt EinfacherGueterzug 0x2b12374 loks lt Lok 0x2b12338 typ 50 gt lt Lok 0x2b12324 typ 0 gt waggons 50 gt gt gt egz 10 gt lt EinfacherGueterzug 0x2b12374 loks lt Lok 0x2b12338 typ 50 gt lt Lok 0x2b12324 typ 0 gt waggons 50 gt Klassen entwerfen und implementieren 189 Dass nach dem ersten erfolgreichen Anh ngen von 10 Waggons tats chlich ein neues EinfacherGueterzug Objekt erzeugt wurde sehen Sie an den ge nderten IDs des Zugs und seiner Loks Der zweite Versuch hat keinen Erfolg da die Anzahl zu hoch w rde und liefert daher die urspr ngliche Instanz zur ck Vielleicht fragen Sie sich zudem wo die Anzahl der Waggons im Erfolgsfall eigent lich ge ndert wird Ganz einfach Genau zu diesem Zweck wird zun chst anhaengen beziehungsweise abhaengen aufgerufen Diese Methoden ndern den Wert der Instanzv
10. Wertzuweisung bisherigen Wert erh hen Wert vermindern Wert multiplizieren Wert dividieren usw not logisches Nicht Textform or logisches Oder Textform and logisches Und Textform De Morgan Theorem a amp amp b la b a b a 8 amp b Kontrollstrukturen ndern den linearen Programmablauf Fallentscheidungen F hren Code abh ngig von Bedingugen aus Einfaches if f hrt Anweisungen aus wenn Ausdruck true ist if Ausdruck Anweisungen end if else f hrt Anweisungen aus wenn Ausdruck true ist ansonsten andere Anwei sungen if Ausdruck Dann Anweisungen else Sonst Anweisungen end if elsif else pr ft bei else weitere Bedingungen if Ausdrucki Dann Anweisungen 1 elsif Ausdruck2 Dann Anweisungen 2 else Sonst Anweisungen wenn keine Bedingung zutrifft end case when vergleicht Variable mit verschiedenen Werten case var when 360 Anhang A Ruby Kurzreferenz Wert1 Anweisungen fuer Werti Wert2 Wert3 Anweisungen fuer Wert2 oder Wert3 else Anweisungen fuer alle anderen Werte end Schleifen F hren Code mehrmals aus while f hrt Anweisungen aus solange Ausdruck true ist while Ausdruck Schleifenrumpf Anweisungen end Fu gesteuerte Schleife wird mindestens einmal ausgef hrt pr ft erst dann Bedin gung begin Anweisungen end while Ausdruck Endlosschleife muss mittels break verlassen w
11. bigen Typs ergeben Hier ein einfaches Beispiel gt gt puts 6 7 6 7 6 7 22 Selbstverst ndlich k nnen Sie einfache Zeichen Escape Sequenzen und eingebet tete Ausdr cke innerhalb von Strings beliebig miteinander vermischen Zum Bei spiel gt gt puts Das Ergebnis der Berechnung t3 2 tbetraegt n 3 2 Das Ergebnis der Berechnung 3 2 betraegt 5 Bei Strings in einfachen Anf hrungszeichen werden keine eingebetteten Ausdr cke ausgewertet Escape Sequenzen im Allgemeinen auch nicht allerdings stehen f r ein literales einfaches Anf hrungszeichen und f r einen Backslash zur Verf gung Probieren Sie die obigen Beispiele ruhig einmal mit einfachen Anf hrungszei chen aus um den Unterschied zu erfahren gt gt puts Text tmit Tab nHier tNoch ein Tab Text tmit Tab nHier tNoch ein Tab gt gt puts 6 7 6 7 6 7 6 7 Zur Verwendung von Anf hrungszeichen f r String Literale gibt es brigens noch eine Alternative Diese ist zum Beispiel n tzlich wenn Strings viele literale Anf h rungszeichen enthalten da Sie diese dann nicht durch den Backslash zu sch tzen brauchen Im Einzelnen geht es um folgende Optionen e q ersetzt einfache Anf hrungszeichen q Hallo ist zum Beispiel quiva lent mit Hallo 0 kann statt doppelter Anf hrungszeichen verwendet werden Beispiels weise bedeutet 0 Ein Text dasselbe wie Ein Text Das gro e Q k nnen Sie sog
12. die beiden Methoden instance_of und kind_of Der kleine aber manchmal wichtige Unter schied instance_of liefert nur dann true wenn das untersuchte Objekt eine Instanz von genau der angegebenen Klasse ist w hrend kind_of auch auf die Elternklasse und beliebige weitere bergeordnete Klassen zutrifft Ein Synonym f r kind_of ist brigens is_a was der Bezeichnungsweise im zu Beginn dieses Kapi tels besprochenen objektorientierten Design n her kommt Die folgenden Beispiele untersuchen das Ganzzahl Literal 3 gt gt 3 instance_of Fixnum gt true gt gt 3 instance_of Numeric gt false gt gt 3 kind_of Fixnum Weitere objektorientierte Konstrukte 213 gt true gt gt 3 kind_of Numeric gt true gt gt 3 is_a Object gt true Wie Sie sehen liefert 3 instance_of Fixnum den Wert true weil kleine Ganz zahlen direkte Instanzen der Klasse Fixnum sind F r Numeric den gemeinsamen Vorfahren aller Zahlenarten liefert die Untersuchung instance_of jedoch false kind_of ist dagegen sowohl f r Fixnum selbst als auch f r Numeric und sogar f r Object die allgemeinste aller Oberklassen erf llt Interessant ist auch die Frage ob ein Objekt eine bestimmte Methode unterst tzt Verwenden Sie f r diese Pr fung die Methode respond_to wobei Sie den Metho dennamen entweder als String oder als Symbol angeben k nnen Hier einige Bei spiele gt gt arr 1 2 3 1 2 3
13. ffnen Sie nun einen Browser und geben Sie die URL http localhost 3000 ein Daraufhin wird die in Abbildung 7 2 dargestellte Startseite angezeigt Nach diesem ersten Erfolgserlebnis k nnen Sie WEBrick mit Hilfe der Tasten kombination Strg C beenden Danach sollten Sie den n chsten Abschnitt lesen um Ihre erste Rails Anwendung um eigenen Code zu erg nzen Ruby on Rails Welcome aboard Mozilla Firefox Datei Bearbeiten Ansicht Chronik Lesezeichen Extras Hilfe i O _httpiocalhost 30007 Erste Schritte Q Aktuelle Nachrichten Welcome aboard You re riding the Rails About your application s environment Search the Rails site Join the community Getting started Here s how to get rolling Create your databases and edit config database yml Ruby on Rails Official weblog Mailing lists IRC channel Wiki Bug tracker Rails needs to know your login and password Browse the Use script generate to create your documentation models and controllers To see all available options run it without parameters Rails API Ruby standard library 3 Set up a default route and remove or rename Ruby core this file Routes are setup in config routes rb Abbildung 7 2 Die Begr ungsseite einer neuen Rails Anwendung im Firefox Die erste Rails Anwendung Als erstes Beispiel soll eine vereinfachte Anwendung erstellt werden die nur eine View u
14. gt lt Logbuch 0x2b116e0 log gt gt gt log2 Logbuch instance gt lt Logbuch 0x2b116e0 log gt 204 Kapitel 4 Eigene Klassen und Objekte erstellen Nun k nnen Sie die Methode log sowohl von log1 als auch von log2 verwenden um Eintr ge vorzunehmen Der jeweils neueste Eintrag wird an den Anfang gestellt Zum Beispiel gt gt log1 1log Computerlogbuch der Enterprise Captain Picard gt 01 12 2006 22 39 12 Computerlogbuch der Enterprise Captain Picard gt gt log2 log Befinden uns im Standardorbit um den Planeten Haven gt 01 12 2006 22 39 26 Befinden uns im Standardorbit um den Planeten Haven 01 12 2006 22 39 12 Computerlogbuch der Enterprise Captain Picard gt gt log1 log Ein Erkundungstrupp unter der Leitung von Lt Cmdr Data wird hinuntergebeamt um Untersuchungen vorzunehmen gt 01 12 2006 22 39 54 Ein Erkundungstrupp unter der Leitung von Lt Cmdr Data wird hinuntergebeamt um Untersuchungen vorzunehmen 01 12 2006 22 39 26 Befinden uns im Standardorbit um den Planeten Haven 01 12 2006 22 39 12 Computerlogbuch der Enterprise Captain Picard Dieses Verfahren das die Existenz nur einer Instanz garantiert wird brigens recht h ufig verwendet Es hat sogar einen Namen Singleton Solche immer wiederkeh renden Programmierschemata werden als Design Patterns oder Entwurfsmuster bezeichnet Sie sind sehr hilfreich wenn es darum
15. puts Hier steht Programmcode begin Hier steht Dokumentation Hier auch end puts Jetzt geht das Programm weiter Das Besondere an diesen Passagen ist dass man sie zus tzlich mit speziellen Schl s selw rtern versehen und dann automatisch als sogenannte RDoc Dokumentation exportieren kann Die Shebang Zeile Eine besondere Form des Kommentars die Sie als erste Zeile eines Programms ein setzen k nnen ist die sogenannte Shebang Zeile kurz f r sharp und bang Sie erm glicht es Ihnen auf UNIX Systemen das Ruby Skript wie ein bin res Pro gramm ausf hren das hei t ohne den Interpreter noch einmal auf der Kommando zeile aufzurufen Die Shebang Zeile teilt dem System n mlich mit welches Programm das vorliegende Skript ausf hren soll Schematisch sieht diese Zeile so aus Pfad zu ruby In vielen F llen lautet der konkrete Pfad usr bin ruby Wenn Sie Ruby nach der Anleitung im vorigen Kapitel selbst kompiliert haben muss der Pfad angepasst werden schreiben Sie beispielsweise Folgendes usr local ruby bin ruby Damit die automatische Ausf hrung tats chlich funktioniert m ssen Sie dem Skript allerdings noch das Executable Bit zuweisen Geben Sie dazu in dessen Ver zeichnis das Kommando chmod a x Skriptname ein chmod a x hello rb Anschlie end k nnen Sie das Skript einfach wie folgt starten solange Sie im selben Arbeitsverzeichnis bleiben hello rb Auf einem Windows Syste
16. 2 Konstruktor wird bei Objekterzeugung 3 mit new aufgerufen 4 def initialize txt 5 txt txt 6 end 7 Enthaltenen Text nachtraeglich aendern 8 def set_text txt 9 txt txt 10 end 11 Enthaltenen Text zurueckliefern 12 def get_text 13 etxt 14 end 15 Als Text Entsprechung des Objekts 16 ebenfalls den Text zurueckliefern 17 def to_s 18 get_text 19 end 20 Den Text rueckwaerts zurueckliefern 21 def turn 22 txt reverse 23 end 24 Den Text mit statt Vokalen zurueckliefern 25 def hide_vowels 26 txt gsub aeiou i 27 end 28 Den Text in Caesar Code zurueckliefern 29 def rot13 30 txt tr A Z a z N ZA M m za m 31 end 32 end 33 Neues ModText Objekt mit Inhalt erzeugen 34 mtext ModText new Hallo meine liebe Welt 35 Ausgabe der verschiedenen Methoden 36 printf Originaltext s n mtext get_text 37 printf Umgekehrt s n mtext turn 216 Kapitel4 Eigene Klassen und Objekte erstellen Beispiel 4 5 modtext rb der objektorientierte Textmanipulierer Fortsetzung 38 39 40 41 42 43 44 printf Versteckte Vokale s n mtext hide_vowels printf ROT13 s n mtext rot13 Text aendern mtext set_text Diese Worte sind neu Ausgabe des Objekts als Text ruft automatisch to_s auf printf Neuer Text s n mtext Das Programm besteht aus drei logischen Teilen Der erste Teil Zeile 1 bis 32 ist die Definition der Klas
17. 48 Kapitel 2 Sprachgrundlagen die so genannten Arrays zu Deutsch etwa Anordnungen Ein Array enth lt belie big viele Werte beliebiger Typen die ber den Variablennamen und eine in eckigen Klammern stehende laufende Nummer den Index angesprochen werden Auch Arrays werden am einfachsten durch eine Wertzuweisung erzeugt dazu wird die Wertegruppe durch Kommata getrennt und in eckige Klammern gesetzt Hier zwei Beispiele wochentage 5 Mo Di Mi Do Fr Sa So quadratzahlen 0 1 4 9 16 25 36 49 64 Sie k nnen auch ein leeres Array erzeugen um es sp ter mit Werten zu f llen noch_nichts Der Index beginnt jeweils bei 0 Um also das erste Element des jeweiligen Arrays zu erhalten k nnen Sie Folgendes eingeben gt gt wochentage 0 LS Mo gt gt quadratzahlen 0 gt 0 Um zu ermitteln wie viele Elemente ein Array besitzt k nnen Sie dessen Methode length aufrufen die Feinmechanik von Methodenaufrufen wird weiter unten erl u tert hier k nnen Sie sie einfach intuitiv verwenden gt gt wochentage length gt 7 gt gt quadratzahlen length gt 9 Das letzte Element eines Arrays erhalten Sie indem Sie die um 1 verminderte Ele mentanzahl als Index verwenden gt gt wochentage wochentage length 1 LS so gt gt quadratzahlen quadratzahlen length 1 gt 64 Daf r gibt es brigens eine Kurzfassung Negative Indizes liefern die Elemente des Arrays vo
18. Das hei t dass so gut wie jedes lokale oder standort bergreifende Computernetz werk Internetstandards verwendet Diese sind frei offen und f r jedes Betriebssys tem und beliebige Netzwerkhardware verf gbar In diesem Kapitel erfahren Sie wie man Netzwerk und Internetanwendungen zu Fu schreibt w hrend es im n chsten Kapitel um Webanwendungen mit fertig ein gerichtetem Webserver geht Kurze Einf hrung in TCP IP Bevor Sie erfolgreich in die Netzwerkprogrammierung einsteigen k nnen brauchen Sie ein wenig technisches Hintergrundwissen ber die Internet Kommunikation 1 Die meisten dieser propriet ren Protokolle existieren bis heute und selbst Ruby kann darauf zugreifen falls das jeweilige Betriebssystem das unterst tzt Die praktische Bedeutung wird allerdings von Tag zu Tag geringer so dass dies hier nicht weiter thematisiert werden soll 219 Das Internet und die meisten anderen modernen Netzwerke setzen einen seit 1969 entwickelten Kommunikationsstandard ein der als TCP IP Transmission Control Protocol Internet Protocol bezeichnet wird Der Begriff Protokoll steht in diesem Zusammenhang f r einen Standard zur Daten bertragung wobei TCP und IP nur zwei wichtige Teilprotokolle einer ziemlich gro en Familie sind Schematischer berblick Um Netzwerke zu analysieren und zu verstehen bedient man sich so genannter Schichtenmodelle Sie beschreiben die verschiedenen Funktionsebenen eines Netz werks Betracht
19. Formate 117 private 201 Beispiel 202 Klassenmethoden Abgrenzung 202 Process kill Methode 262 Process ppid Methode 262 Process wait Methode 259 Prompt 11 protected 201 Prozesse verwalten 256 Forking 257 Kommunikation zwischen Prozessen 260 Reaping 259 Signale 260 Zombies 259 Prozess ID 258 des Parents 262 public 201 push Methode 68 puts Methode 116 Python 2 Q Quadratwurzel 65 Quantifizierer Regexp 90 query Methode 323 Query String 291 309 Quoting Operatoren 43 R radio_group Methode 302 Rails 333 Action Mailer 336 Action Pack 335 Action Web Service 336 Active Record 335 Active Record Grundlagen 348 Active Support 336 ActiveRecord Base Basisklasse 346 Ajax Unterst tzung 336 Anwendung erzeugen 337 ApplicationController Basisklasse 339 Architektur 333 console Skript 348 Controller Methoden schreiben 350 database yml Konfigurationsdatei 344 Datenbank vorbereiten 343 datenbankbasiertes Beispiel 341 Deployment 354 erstes Beispiel 338 eRuby Templates 340 generate Skript 339 346 Installation 336 Index 387 Instanzvariablen zum Datenaustausch 340 irb einsetzen f r 348 Komponenten 335 MVC 333 Scaffolding 347 Templates 340 Ver ffentlichung 354 Verzeichnisstruktur einer Anwendung 341 rails Konsolen Tool 337 Rails WEBrick Testserver 337 RAILS_ENV Umgebungsvariable 354 raise 211 rand Methode 63 Ranges Bereiche 45 Rangfolge der Operatoren 62 Rational Klasse 145 denominator
20. brig geblie benen Text an require socket sock TCPSocket new www oreilly de 80 sock puts GET HTTP 1 1 Host www oreilly de sock puts inhalt sock read inhalt gsub lt gt m inhalt gsub s 2 n puts inhalt Wenn Sie das Skript starten erhalten Sie eine Ausgabe ber mehrere Fensterh hen leiten Sie sie gegebenenfalls in eine Datei um wenn Sie sie vollst ndig lesen m ch ten die wie folgt beginnt gt ruby easy_httpclient rb HTTP 1 1 200 OK Date Sun 17 Dec 2006 09 58 26 GMT Server Apache 1 3 28 Linux SuSE mod_ss1 2 8 15 OpenSSL 0 9 7b PHP 4 3 3 mod_ per1l 1 28 Last Modified Sun 17 Dec 2006 02 36 15 GMT ETag 211b7 6ca0 4584ad f Accept Ranges bytes Content Length 27808 Connection close Content Type text html oreilly de Willkommen beim O Reilly Verlag 08 amp 8217 Reilly Verlag 230 Kapitel 5 Netzwerkanwendungen Was geschieht hier Zuerst wird eine Instanz der Klasse TCPSocket erzeugt Es han delt sich um einen TCP Client Socket der eine Anfrage an einen TCP Server sen den kann Die n tigen Argumente sind Hostname oder IP Adresse sowie Port des gew nschten Servers in diesem Fall www oreilly de sowie 80 Bei Standard Ser verports k nnen Sie auch deren bekannten Namen verwenden hier also http Je nach angesprochenem Server k nnen Sie nach dem Verbindungsaufbau unmittel bar lesen bei anderen m ssen Sie zuerst einen Befehl senden der n
21. gt Le C Das lt br gt in den ersten vier Elementen erzeugt je einen Zeilenumbruch und sorgt so daf r dass die Buttons untereinander statt nebeneinander dargestellt werden Alternativ und passender zur CGl Bibliothek k nnten Sie Ruby cgi br und so weiter schreiben Checkbox Gruppen Bei dieser Variante k nnen Sie beliebig viele Kontrollk st chen ankreuzen und wieder abw hlen ideal immer dann wenn mehrere Ant worten m glich sind Die Syntax von cgi checkbox_group entspricht exakt derjenigen von cgi radio_group mit der Ausnahme dass Sie bei Bedarf mehr als ein Feld vorab ankreuzen k nnen Hier ein Beispiel zur Auswahl der vom User eingesetzten Betriebssysteme cgi checkbox_group betriebssysteme linux Linux cgi br true win Windows cgi br true mac Mac OS X cgi br bsd Free Open Net BSD cgi br x sonstige 302 Kapitel 6 Klassische Webanwendungen Denken Sie daran dass Sie die Eingaben aus Checkbox Gruppen mittels cgi param ermitteln m ssen weil Sie nur so mehrere Werte auslesen k nnen e Absende Button Nat rlich brauchen Sie eine M glichkeit ein Formular nach dem Ausf llen abzuschicken Daf r ist ein Submit Button zust ndig den Sie wie folgt erzeugen k nnen cgi submit Beschriftung e Reset Button Viele Formulare enthalten eine Schaltfl che die alle Eingaben l scht und den Ausgangszustand wiederherstellt Sie erstellen die
22. gt lt amp gt gt gt 23 Aquot gt amp amp gt amp 24 Aauml gt ae amp ouml gt oe amp uuml gt ue 25 amp Auml gt Ae amp 0uml gt Oe amp Uuml gt Ue 26 aszlig gt ss 27 begin 28 print URL gt 29 url gets chomp 30 end while url 31 Hauptschleife 32 loop do 33 anfuegen falls URL keinen enthaelt 34 if url r 35 url 36 end 37 URL zerlegen 38 host port uri parse_url url 39 puts Hole uri von host port 40 begin 41 Client erzeugen 42 httpclient Net HTTP new host port 43 Server Antwort holen 44 response httpclient get uri 45 Bei 30x Statuscodes der Weiterleitung folgen 46 while response code 30 d 47 Neue URL aus dem Header Location lesen 48 location response location 49 Absolute URL gesondert behandeln 50 if location r http 51 location 1 52 host port uri parse_url location 53 httpclient Net HTTP new host port 54 else 55 uri location 56 end 57 puts Verfolge Weiterleitung nach uri 58 Neue URL anfordern 59 response httpclient get uri 60 end 248 Kapitel 5 Netzwerkanwendungen Beispiel 5 4 Der Ruby Textbrowser httpclient rb Fortsetzung 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
23. gt gt arr class Array gt gt arr respond_to sort gt true gt gt arr respond_to test gt false gt gt arr respond_to respond_to gt true Wie Sie sehen besitzt ein Array Objekt die Methoden sort und respond_to aber keine Methode namens test Dabei ist es egal ob die Methoden in der fraglichen Klasse selbst in einer bergeordneten Klasse oder in einem Mixin Modul definiert wurden Sie k nnen auch eine Liste aller Methoden eines Objekts oder einer Klasse als Array erhalten indem Sie die Methode methods aufrufen Zum Beispiel gt gt Z Gueterzug new Lok DIESEL Lok OHNE gt lt Gueterzug 0x2b7ef38 loks lt Lok 0x2b7eefc typ 50 gt lt Lok 0x2b7eee8 typ 0 gt waggons 0 gt gt gt z methods gt methods instance_eval dup instance_variables Jok_aendern instance_of extend eql info hash id singleton methods taint frozen instance_variable get kind_of to_a type protected methods instance variable set method is_a to_s respond_to class require gem tainted private _methods anhaengen id _ nil untaint waggontest gem send display inspect clone object id abhaengen require public methods equal freeze lokinfo _ send _ 214 Kapitel 4 Eigene Klassen und Objekte erstellen Auch hier werden nicht nur die in der Klasse
24. zusammen um den kopierten Text an der aktuellen Textcursor Position einzuf gen Mustervergleiche mit regul ren Ausdr cken hnlich wie Perl ist Ruby beliebt f r seine fortgeschrittenen Textverarbeitungsm g lichkeiten Das liegt vor allem an der umfassenden Unterst tzung regul rer Aus dr cke englisch regular expressions oder kurz Regexp manchmal sogar Regex Es handelt sich dabei um Suchmuster mit denen sich die inhaltlichen Eigenschaften von Strings beschreiben lassen Sie k nnen sie sowohl zur Formulierung von Bedin gungen in Fallentscheidungen verwenden als auch zum Ersetzen bestimmter Grup pen von Zeichenfolgen in bestehenden Strings Mustervergleiche mit regul ren Ausdr cken 85 Einf hrung Was Einsteiger als Allererstes ber regul re Ausdr cke wissen sollten ist dass diese normalerweise keinen ganzen String beschreiben Ein Match Treffer ist bereits dann gegeben wenn der regul re Ausdruck einen beliebigen Teil des untersuchten Strings beschreibt Ein ganz einfaches Beispiel Lautet der regul re Ausdruck ein fach nur a so ist er erf llt wenn der String an einer beliebigen Stelle mindestens ein a enth lt Formal werden regul re Ausdr cke in Ruby entweder zwischen zwei Slashes gesetzt oder aber durch den speziellen Quoting Operator r gekennzeichnet und dann wie bei q und hnlichen Quoting Helfern in diverse Klammern oder andere Zeichen eingeschlossen Um also das besagte a als regul ren
25. 0 9 w oder 0 9a zA Z_ W oder 0 9a zA Z_ s S test i test m test x 915 825 25 Erl uterung Zeichen muss vorkommen Folge muss vorkommen Eines der Zeichen muss vorkommen Eines der Zeichen muss vorkommen Eines der Zeichen muss vorkommen hier Hexadezimalziffer Ein Zeichen au er den aufgelisteten muss vorkommen Genau ein beliebiges Zeichen muss vorkommen Element kommt vor oder nicht Element kommt beliebig oft vor Element kommt einmal oder fter vor Element kommt genau n mal vor Element kommt mindestens n und h chstens n mal vor Fasst Gruppe zusammen z B f r Quantifier oder Match Vari ablen Eine der aufgelisteten Alternativen muss vorkommen Element muss am Zeilenanfang stehen Element muss am Zeilenende stehen Element muss am Wortanfang bzw Wortende stehen Element darf nicht am Wortanfang bzw Wortende stehen Zeichen muss eine Ziffer sein Zeichen darf keine Ziffer sein Zeichen muss g ltiges Bezeichner Element sein Zeichen darf kein g ltiges Bezeichner Element sein Zeichen muss Leerzeichen Zeilenumbruch oder Tab sein Zeichen darf kein Whitespace sein Gro und Kleinschreibung wird ignoriert Ausdr cke werden auch ber Zeilengrenzen hinweg getestet Regexp darf durch Whitespace formatiert werden Inhalte geklammerter Ausdr cke von au en nach innen und von links nach rechts gez hlt Klassendefinition e Klasse class Klassenname Automatische Accessor Methoden
26. 10 zehn nicht zehn gt zehn Variablen Ausdr cke und Operationen 61 Rangfolge der Operatoren Die Regel Punkt vor Strichrechnung kennen Sie wahrscheinlich noch aus der Schule 4 5 6 ist nach dieser Regel 34 und nicht etwa 54 In einer Programmier sprache gibt es ebenfalls eine Rangfolge f r Operatoren Die folgende Liste zeigt diese Reihenfolge f r die wichtigsten Ruby Operatoren Menge e Potenz e Vorzeichen Vorzeichen gt gt Bitverschiebung links lt lt Bitverschiebung rechts e amp bitweise Und e bitweise Exklusiv Oder bitweise Oder e lt gt l entspricht Muster s u entspricht Muster nicht e not or and Je weiter oben ein Operator in dieser Liste steht desto st rker bindet er und desto fr her wird er ausgef hrt Nat rlich k nnen Sie beliebig tief verschachtelte Klam mern verwenden um die Rangfolge nach Ihren W nschen zu ndern Beispiels weise ergibt 4 5 6 tats chlich 54 Methodenaufrufe Viele weitere Ausdr cke entstehen durch den Aufruf von Methoden Das k nnen sowohl vordefinierte Methoden sein als auch die weiter unten behandelten selbst geschriebenen Eine Methode ist nichts weiter als eine benannte Abfolge von Anweisungen Manche Methoden erwarten Eingabewerte so genannte Argu mente andere geben wiederum Werte zur ck genau diese Sorte kann in Ausdr cken verwendet werden
27. 90 Kapitel2 Sprachgrundlagen Auch das Auftreten von Zeichenmengen l sst sich per Quantifizierer genauer beschreiben Das folgende Beispiel beschreibt eine ein bis zweistellige Zahl denn die zweite Ziffer 0 9 wird durch das Fragezeichen optional gesetzt 0 9 0 9 Sehr wichtig f r die Arbeit mit Quantifizierern ist die M glichkeit Teile regul rer Ausdr cke zu gruppieren Das geschieht durch runde Klammern Wenn Sie einen Quantifizierer hinter einen geklammerten Teilausdruck setzen wird der gesamte Teilausdruck modifiziert Der folgende Teilausdruck findet etwa sowohl den Admi nistrator als auch die g ngige Abk rzung Admin Admin istrator Die Klammerung l sst sich sogar beliebig ineinander verschachteln Hier sehen Sie einen Teilausdruck der neben Administrator und Admin auch den Systemadminis trator und den Sysadmin findet Sys tem Aa dmin istrator Die Bestandteile dieses regul ren Ausdrucks sollte man sich genauer ansehen e Sys tem wird durch die u eren Klammern und das Fragezeichen insge samt optional gesetzt und enth lt zus tzlich den verschachtelten Teilausdruck tem der seinerseits optional ist Das Ganze passt mit anderen Worten auf System Sys oder gar nichts Da ein regul rer Ausdruck aber auf einen belie bigen Teil eines Strings zutreffen kann bedeutet dieses gar nichts dass vor dem nachfolgenden Admin auch ein ganz anderer Text stehen darf so dass der gesamte Ausdru
28. 95 96 97 98 99 Eventuell Fehlermeldung ausgeben if response code 200 printf FEHLER s s n response code response message puts end Linkzaehler und liste zuruecksetzen linkcounter 0 linksammlung Es koennen nur Text Seiten angezeigt werden ctype response content type if ctype r text puts RESSOURCE NICHT DARSTELLBAR puts puts Der Typ dieser Ressource ist ctype puts Dieser Browser kann leider nur Text anzeigen puts print URL gt else body response body Seiteninhalt weiterverarbeiten 7 Schritte 1 Hyperlinks in Linksammlung aufnehmen body gsub r lt a href gt lt a gt mi linksammlung push 1 linkcounter 1 gt 2 linkcounter 2 Wichtige Entity Referenzen ersetzen entities each pair ent repl body gsub ent repl 3 Ueberschriften grossschreiben body gsub lt h 1 6 gt lt h 1 6 gt mi 1 upcase n 4 Zeilenumbrueche bei lt br gt lt p gt lt div gt und lt tr gt setzen body gsub r lt br s gt i n body gsub lt p gt i n body gsub lt div gt i n body gsub lt tr gt i n Web Clients mit Net HTTP 249 Beispiel 5 4 Der Ruby Textbrowser hitpclient rb Fortsetzung 100 5 Tabellenzelle gt Tabulator 101 body gsub lt td gt i t 102 6 Sonstiges HTML entfernen 103 body gsub lt
29. Das folgende Beispiel definiert das Modul Zeit mit einer Instanzmethode namens zeit die Datum und Uhrzeit in deutscher Formatierung liefert module Zeit def zeit Time new strftime d m Y H M end end Dieses Modul k nnen Sie nun mittels include in beliebige Klassen importieren Zum Beispiel class LogEintrag include Zeit attr_reader ereignis def initialize text ereignis sprintf s s zeit text end end Testen Sie es die importierte Methode wird sowohl intern als auch extern korrekt aufgerufen gt gt 1 LogEintrag new Festplatte partitionieren gt lt LogEintrag 0x2b86d50 ereignis 14 11 2006 14 38 Festplatte partitionieren gt gt gt l ereignis gt 14 11 2006 14 38 Festplatte partitionieren gt gt l zeit gt 14 11 2006 14 39 Nat rlich steht die Mixin Methode auch in abgeleiteten Klassen zur Verf gung Hier sehen Sie auch daf r ein Beispiel class LogToDo lt LogEintrag attr_accessor status def initialize text status erledigt super text status status end end 208 Kapitel 4 Eigene Klassen und Objekte erstellen Hier das Ergebnis des entsprechenden irb Tests gt gt 12 LogToDo new Backup einspielen nach Erledigung pruefen gt lt LogToDo 0x2b4641c ereignis 14 11 2006 14 47 Backup einspielen status nach Erledigung pruefen gt gt gt 12 zeit gt 28 11 2006 14 47 Neben selbst geschriebenen Modulen bietet Ruby
30. Ende des Child Prozesses abfangen trap SIGCLD Reaping Process wait Meldung puts Child Prozess beendet Parent beenden exit Endlosschleife damit der Parent weiterlaeuft loop do end else puts Ich bin das Child Druecken Sie ENTER um mich zu beenden STDIN gets exit end 9 POSIX ist ein recht alter Standard der den kleinsten gemeinsamen Nenner dessen festlegt was ein UNIX artiges Betriebssystem k nnen muss Linux alle BSDs einschlie lich Mac OS X Sun Solaris und viele andere Systeme gen gen diesem Standard aufgrund neuerer Entwicklungen gehen ihre Gemein samkeiten sogar noch weit ber POSIX hinaus Prozesse und Threads 261 Wie Sie sehen handelt es sich um eine leicht modifizierte Version des obigen Bei spiels Hier bittet der Child Prozess darum Enter zu dr cken und beendet sich erst danach In diesem Moment sendet er SIGCLD an den Parent Die trap f ngt dieses Signal ab ruft Process wait auf und beendet dann auch den Parent Prozess Wenn Sie ein Signal manuell versenden m chten k nnen Sie den Systemaufruf kill daf r verwenden Der etwas martialische Name stammt daher dass das Standardsi gnal einen Prozess auffordert sich zu beenden In Ruby wird Process kill verwen det um ein Signal zu senden Die Syntax lautet Process kill Signalstring PID Bei Forking Anwendungen ermittelt der Parent Prozess die ID eines Child Prozes ses wie beschrieben aus dem R ckgabewert des fork Aufruf
31. Erl uterung 10101 lt 2 1010100 e gt gt Rechtsverschiebung right shift verschiebt den ersten Operanden um so viele Bits nach rechts wie der zweite Operand angibt Rechts wegfallende Stel len werden ignoriert Zum Beispiel gt gt 43 gt gt 2 gt 10 Erl uterung 101011 gt gt 2 1010 Die Bit Operatoren werden h ufig in der Kryptografie eingesetzt Eine sehr einfa che aber recht effiziente Methode zum Codieren einer Wertefolge besteht bei spielsweise darin jeden Wert per Exklusiv Oder mit derselben Konstante zu verkn pfen Dabei bleibt n mlich kein Wert gleich aber es passiert auch nicht dass zwei unterschiedliche Ausgangswerte denselben Code erhalten Zudem erfolgt die Entschl sselung durch eine Wiederholung derselben Operation Viele mathema tisch hochkomplizierte Kryptoverfahren setzen Exklusiv Oder daher als einen von vielen Schritten ein Weiter unten in diesem Kapitel finden Sie ein entsprechendes Beispielprogramm Hier zun chst ein einfacheres Beispiel das sich die Bit Operatoren zunutze macht Es geht um die Umrechnung von RGB Farbwerten Das sind die Lichtfarben die durch eine additive Mischung des Rot Gr n und Blau Anteils beschrieben wer Variablen Ausdr cke und Operationen 57 den Wie Sie vielleicht wissen werden diese in HTML hexadezimal in der Form RRGGBB zwei Stellen f r Rot zwei f r Gr n und zwei f r Blau angegeben Das Programm in Beispiel 2 3 erwartet die Eingabe der
32. Ihre Einstellungen cgi a href gt schrift rb ansehen Das Gegenst ck schrift rb in dem die Session Variablen ausgelesen werden sieht so aus C ruby bin ruby exe w require cgi require cgi session CGI und Session Objekt erzeugen cgi CGI new htm14 session CGI Session new cgi 312 Kapitel 6 Klassische Webanwendungen Session Daten auslesen oder Standardwerte if session schrift schrift session schrift else schrift end Arial Helvetica sans serif if session groesse groesse session groesse else groesse 16px end if session farbe farbe session farbe else farbe 000000 end C ruby bin ruby exe w cgi out cgi html cgi head cgi title Schrifteinstellungen waehlen cgi meta http equiv gt Content type content type gt text html charset iso 8859 1 cgi style type gt text css body font family schrift font size groesse color farbe ye cgi body cgi p Hier sehen Sie die aktuellen Schrifteinstellungen im Einsatz cgi p Klicken Sie cgi a href gt schriftwahl rb hier um die Werte zu aendern Wie Sie sehen besitzen CGI Session Instanzen zwar keine has_key Methode wie CGlI Objekte und Cookies aber daf r k nnen Sie das if direkt auf ses sion Schluessel anwenden CGl Skripten mit Ruby 313
33. Iterat ren und Bl cke 2 2 2 22 ar eb 101 Zusammenfassung eseon ta anahe aE EARE AT EETA echte 107 3 RUby gt Klassen u sheet en BER MA Ta a nt 111 Was ist Objektorientierung 2222 2cueseeeeeeeeneneennneneen 111 Binz nd Ausgabe 20 022 0 ie ehe 114 Datumund Uhrzeit a ran innen hr a 138 Einige weitere Klassen 2 2 2222 2ceeeeeeeeeeeeneeeeenenenn 145 Die R by Hilferi 2 2 2202 2 a BEE aan 148 Zusammenfassung ur rahmen Bein Dh ine 150 4 Eigene Klassen und Objekte erstellen 153 Objektorientierte Programmierung Eine praktische Einf hrung 153 Klassen entwerfen und implementieren 22eseeeessenen 163 Weitere objektorientierte Konstrukte 222222222 seereeen en 198 Zusammenfassung a ak ihn net aan eh 215 5 Netzwerkanwendungen 22222cccseeeeeeerenenn 219 Kurze Einf hrung in TCP IP 2 222222 eseeneeeeeeennennnn 219 SOCK EIS u a a ee Ds ee ee 229 Web Clients mit Net HTTP 222222ceesseeneeenenenn 241 Pr zesse nd Threads arpaan ee ai A EN E E AIAN 256 Zus mmenf ssung ar ku a a e Er Ra a a 271 6 Klassische Webanwendungen 2 2cccccceccn 273 Den Webserver Apache 2 installieren 222222 ceeeneennn 274 CGl Skripten mit Ruby 2222220222 e a e a a a as 286 Zugriff auf Datenbanken 222222ssseeeeeeeeeeeennenen 314 Zusammenfassung an alta nina EE ar k
34. Methode definieren gt gt def hallo puts Hallo end Rufen Sie die Methode zun chst wie gehabt ohne Objektbezug auf gt gt hallo Hallo Ein Synonym f r diesen Aufruf ist wie eben ausgef hrt self hallo Probieren Sie die Methode nun f r beliebige Literale und andere Objekte aus z B 184 Kapitel 4 Eigene Klassen und Objekte erstellen 1 hallo Fixnum hallo hallo String 1 2 3 hallo Array Es funktioniert denn das Ergebnis ist immer dasselbe die Ausgabe des Textes Hallo Dieses interessante Ph nomen k nnen Sie sich zunutze machen indem Sie inner halb des Methodenrumpfes mittels self Bezug auf die Instanz nehmen f r die die Methode aufgerufen wurde Hier ein sehr einfaches Beispiel gt gt def verdoppeln self 2 end Rufen Sie diese neue Methode nun f r verschiedene Objekte auf von denen Sie wis sen dass man sie mit einer Ganzzahl multiplizieren kann gt gt 7 verdoppeln gt 14 gt gt Hallo verdoppeln gt HalloHallo gt gt 1 2 3 verdoppeln gt 1 2 3 1 2 3 Nat rlich gibt es auch Objekte die keine Multiplikation kennen In diesem Fall erhalten Sie eine Fehlermeldung Hier zum Beispiel ein Hash Literal gt gt name gt Schmitz vorname gt Jupp verdoppeln NoMethodError undefined method for name gt Schmitz vorname gt Jupp Hash In einer gespeicherten Skriptdatei funktioniert es nicht ganz so einfach Um dort ein
35. Reilly Verlag in dem das Thema umfassend mit wissen schaftlicher Pr zision und zugleich u erst unterhaltsam pr sentiert wird Zeichen und Zeichenfolgen Der einfachste Fall eines regul ren Ausdrucks ein einzelnes Zeichen wurde bereits in der Einleitung vorgestellt Ein Treffer ist immer dann gegeben wenn das entsprechende Zeichen mindestens einmal im untersuchten String enthalten ist Beispielsweise liefert Hallo 1 den Wert 2 erstes 1 in Hallo an Position 2 wie blich ab 0 gez hlt Der Fall Hallo L liefert dagegen keinen Treffer das hei t den Wert nil weil Hallo kein gro es L enth lt 13 Die englische Originalversion Mastering Regular Expressions ist 2006 bereits in der 3 Auflage erschie nen Mustervergleiche mit regul ren Ausdr cken 87 Besonders n tzlich sind einzelne Zeichen f r die Gegenprobe das hei t f r das Nichtzutreffen eines regul ren Ausdrucks Eine Operation in der Form String Regexp liefert true wenn der regul re Ausdruck auf keinen Teil des Strings zutrifft und false wenn er eben doch darin vorkommt Das folgende Beispiel verbietet die Zif fer 0 im gesamten String eingabe if eingabe 0 puts Korrekte Eingabe else puts Bitte keine 0 eingeben end Wenn Sie innerhalb des regul ren Ausdrucks mehrere Zeichen hintereinander set zen m ssen diese f r einen Treffer genau in der angegebenen Reihenfolge und direkt hintereinander im String
36. Ueber alle Bands iterieren Band find all each b bandlist lt li gt lt b gt b name b country lt b gt lt li gt Ueber alle Alben der Band iterieren bandlist lt ul gt Album find all conditions gt band_id b id each a bandlist lt li gt a title a release_year lt li gt bandlist lt ul gt bandlist lt ul gt Realistische Anwendung Eine Online Rock n Roll Datenbank 351 Liste als Instanzvariable veroeffentlichen bandlist bandlist end Nun m ssen Sie nur noch die entsprechende View app viewsllist rhtml erg n zen Sie hat momentan folgenden Inhalt lt h1 gt Album list lt h1 gt lt p gt Find me in app views album list rhtml lt p gt Erstellen Sie stattdessen den folgenden HTML eRuby Code lt html gt lt head gt lt title gt Rock n Rails Bands und ihre Alben lt title gt lt head gt lt body gt lt h1 gt Alle Bands und ihre Alben lt h1 gt lt p gt lt bandlist gt lt p gt lt body gt lt html gt Wie Sie sehen brauchen Sie nicht mehr eRuby Code als die Ausgabe der Instanzvari ablen bandlist Starten Sie nun den WEBrick Server und geben Sie die URL http localhost 3000 albumilist ein Die Ausgabe sehen Sie in Abbildung 7 6 Rock n Rails Bands und ihre Alben Mozilla Firefox Datei Bearbeiten Ansicht Chronik Lesezeichen Extras Hilfe C O _httpiyioc
37. Zul ssig sind unter anderem e html3 HTML 3 2 passend f r veraltete 3 x Browser e html4 HTML 4 0 Strict die aktuelle Fassung des klassischen HTML Stan dards in ihrer strengen nicht abw rtskompatiblen Form wird von allen g n gigen Browsern ab Version 4 x ca 1998 verarbeitet e html4Tr HTML 4 0 Transitional eine etwas tolerantere Version von HTML 4 die zum Beispiel das veraltete lt font gt Tag zur Schriftformatierung erlaubt Eine Version der CGI Bibliothek die auch den XML basierten Stan dard XHTML anbietet ist in Arbeit Sie wird voraussichtlich mit y Ruby 1 9 in die Standardbibliothek aufgenommen Das folgende Beispiel verwendet HTML 4 0 cgi CGI new html4 Die gesamte HTML Ausgabe muss von cgi out 298 Kapitel 6 Klassische Webanwendungen umschlossen werden Diese Methode erzeugt einen HTTP Header falls Sie nicht zuvor cgi header eingesetzt haben sowie einen Body Der Body Inhalt wird dabei als String in den Block geschrieben Innerhalb des Body wird das HTML Dokument mit Header und Body erzeugt diese Struktur sieht so aus cgi html cgi head egi body Da die Ergebnisse aller HTML Erzeugungsmethoden Strings sind werden sie auf jeder Verschachtelungsebene mit Hilfe des Operators verkettet Sie k nnen auch jederzeit literale Strings einf gen einschlie lich solcher die HTML Code als einfa chen Text enthalten Das folgende Beispiel f gt ohne weitere
38. beraus positive berraschungen Die wichtigsten dieser berraschungen werden in diesem Buch enth llt so dass Sie danach effizienter und sicherer mit Rails arbeiten k nnen Eine erste Einf hrung in Rails selbst finden Sie brigens im letzten Kapitel Vielleicht geht es Ihnen aber gar nicht um Ruby on Rails sondern Sie m chten ein fach Ihren Horizont erweitern und eine neue Programmiersprache erlernen Auch dann sind Sie hier vollkommen richtig An ausgew hlten Stellen werden Sie Bemer kungen finden die Ruby mit anderen Programmiersprachen vergleichen Ansons ten wird The Ruby Way gr ndlich erkl rt ohne bertrieben viel Zeit mit der Erl uterung theoretischer Konzepte zu verbringen Oder m glicherweise haben Sie berhaupt noch nie programmiert und Sie m ch ten es nun anhand von Ruby endlich lernen Eine exzellente Wahl denn Ruby ist durch klare Schreibweisen und eindeutige Formulierungen besonders einsteiger freundlich Im brigen k nnen Sie nirgends leichter und konsequenter das Prinzip der Objektorientierung erlernen ohne das Programmierung heute kaum noch vor stellbar w re Kurz Wenn Sie als Programmierneuling experimentierfreudig sind und ein recht schnelles Lerntempo m gen ist dieses Buch auch f r Sie genau das Richtige Egal zu welcher der drei genannten Gruppen Sie geh ren Wenn Sie Ruby lernen steigen Sie in eine schnell wachsende lebendige Gemeinschaft von Programmierern ein Denn Ruby gewinnt t
39. da sie eben nicht exakt den zugeh rigen HTML Tags entsprechen Bereits die Methode form selbst funktioniert etwas anders als andere Tag Metho den weil die Attribute als Strings und nicht als benannter Hash angegeben werden Es handelt sich von links nach rechts um folgende Werte 300 Kapitel 6 Klassische Webanwendungen e HTTP Methode Originalattribut method mit den m glichen Werten post oder get ihre Bedeutung wurde bereits besprochen Der Standardwert ist post e Action URL Originalattribut action Die Formulardaten werden an die ange gebene URL geschickt sobald die Absende Schaltfl che bet tigt wird Wenn Sie diesen Parameter weglassen wird das aktuelle Skript selbst als Versandziel gew hlt e Datentyp Originalattribut enctype Damit geben Sie das Format an in dem die Formulardaten abgeschickt werden Der Standardwert ist application x www form urlencoded Dieses Format ersetzt alle Sonderzeichen die in URLs nicht zul ssig sind durch passende Maskierungen weiter oben haben Sie bereits ein Beispiel gesehen Wenn Sie die Versandmethode POST w hlen k n nen Sie auch einen anderen Datentyp einstellen weil der Browser in diesem Fall einen Content type Header sendet Ein wichtiges Beispiel ist der Typ mul tipart form data der f r den Upload von Dateien verwendet wird Genau f r diesen Typ steht die Kurzform cgi multipart_form URL zur Verf gung Das folgende Beispiel erzeugt ein Formular das die
40. den Zeichensatz einzustellen In diesem Beispiel wird der Standardzeichensatz f r Westeuropa iso 8859 1 gesetzt Sofern Ihr Editor denselben Zeichensatz unter st tzt k nnen Sie danach Umlaute und andere Standard Sonderzeichen vieler europ ischer Sprachen problemlos verwenden Eine andere h ufig genutzte Zeichensatzeinstellung ist utf 8 Dies ist eine spezielle Variante des Weltzeichensatzes Unicode in der die nur f r Englisch ausreichenden ASCII Zeichen Code 0 bis 127 mit 8 Bit und alle anderen Zeichen mit 16 bis 32 Bit dargestellt werden Damit ist utf 8 im Gegensatz zu anderen Unicode Darstel lungsformen abw rtskompatibel zu ASCII Beachten Sie aber dass unter Umst n den nicht alle Client Rechner im Internet jedes Unicode Zeichen darstellen k nnen das Sie zum Erstellen Ihrer Seiten verwenden Sessions F r Websites die Benutzerdaten ber beliebig viele Einzelseiten hinweg speichern m ssen sind Cookies erst die halbe Miete Abgesehen davon d rfen Sie nie eine Webanwendung schreiben die sich alternativlos auf Cookies verl sst weil viele Benutzer ihre Browser so einstellen dass diese die Annahme von Cookies verwei gern Zumindest die manuelle Best tigung von Cookies ist sogar empfehlenswert da manche Werbebanner Vermarkter deren Banner auf vielen unterschiedlichen Sites auftauchen Cookies missbrauchen um das Surfverhalten von Usern auszuspi onieren und umfangreiche Profile dar ber anzulegen Die allgemeine Relati
41. dir Verzeichnispfad indent aktuelle Einrueckungstiefe Standardwert 0 def listdir dir indent 0 Verzeichnis des aktuellen Pfads oeffnen d Dir new dir Verzeichnis in Schleife auslesen while entry d read Neuen Pfad konstruieren path dir entry Ist der Pfad ein Verzeichnis if File directory path Ja Verzeichnis Einrueckung Verzeichnisname in eckigen Klammern ausgeben puts indent entry Rekursiver Aufruf mit neuem Pfad und akt Einrueckungstiefe 2 falls Eintrag nicht oder ist listdir path indent 2 if entry 1 2 else Nein kein Verzeichnis Einrueckung aktuellen Eintrag ausgeben puts indent entry end end Verzeichnis schliessen d close end Verzeichnis zunaechst auf aktuelles Arbeitsverzeichnis setzen dir Verzeichnis gegebenenfalls auf 1 Kommandozeilenargument setzen dir ARGV o if ARGV o nil Erstaufruf mit dem aktuellen Verzeichnis listdir dir Wenn Sie das Skript ohne Kommandozeilenargument ausf hren wird das aktuelle Arbeitsverzeichnis aufgelistet Hier ein gek rztes Beispiel f r das Verzeichnis in dem sich das Skript listdir rb befindet gt ruby listdir rb agecheck rb arg rb argnum rb listdir rb old comments rb conv rb 192 Kapitel 4 Eigene Klassen und Objekte erstellen crypt rb doc rb prim rb read rb rgb rb x txt Wie Sie sehen werden Verzeichnisnamen
42. ebenfalls nicht empfehlenswert 10 Wenn Sie auf Execute klicken werden die gew hlten nderungen durchge f hrt Falls es nicht klappen sollte m ssen Sie berpr fen ob eventuell bereits ein lterer MySQL Dienst l uft oder ob Ihre lokale Firewall den Port 3306 blo ckiert Installation auf UNIX Systemen Das Mac OS X Paket von MySQL ist ein bequemer Installer Bevor Sie ihn ausf h ren m ssen Sie unter Systemeinstellungen gt Benutzer berpr fen ob bereits ein User namens mysql existiert und diesen ansonsten neu anlegen Anschlie end k nnen Sie die Image Datei dmg per Doppelklick mounten und den enthaltenen Installer durch einen weiteren Doppelklick starten MySQL wird unter usr local mysql Version installiert zudem erstellt der Installer den Symlink usr local mysgl Anschlie end wird automatisch das Skript mysql_install_db zur Erstellung der Ver waltungstabellen ausgef hrt Bei der Linux Bin rvariante ist etwas mehr Handarbeit erforderlich Vor der Instal lation sollten Sie auch hier einen Benutzer und eine Gruppe namens mysql einrich ten damit MySQL aus Sicherheitsgr nden unter diesen IDs ausgef hrt wird Unter Linux und vielen anderen UNIX Systemen funktioniert das mit den folgenden bei den Befehlen als root groupadd mysql useradd g mysql mysql Anschlie end wird das Bin rpaket entpackt Zum Beispiel tar xzvf mysql max 5 0 27 linux i686 glibc23 tar gz Verschieben Sie das entpackte Verzei
43. ere Inhaltsdaten in die Vorlagen zu laden oder Benutzerein gaben zu speichern MySQL ist eine der beliebtesten Open Source Datenbanken sie verf gt genau ber die richtige Mischung aus Leistungsf higkeit und Geschwin digkeit um selbst gro e Webanwendungen erfolgreich betreiben zu k nnen Nach dem soeben vorgestellten traditionellen Ansatz zur Webentwicklung lernen Sie im n chsten Kapitel das moderne Framework Ruby on Rails kennen Zusammenfassung 331 In diesem Kapitel KAPITEL 7 sede aii und in Betrieb Ru by 0 n Rai Is Die erste Rails Anwendung Realistische Anwendung Eine Online Rock n Roll Datenbank Die Eisenbahn ist f r mich ein Symbol des Lebens Man sitzt ruhig und bewegt sich doch schnell vorw rts Wolfgang Korruhn Nachdem Sie Webanwendungen im vorigen Kapitel gewisserma en zu Fu erkun det haben wird es nun Zeit f r ein leistungsf higeres Transportmittel Ruby on Rails ist ein w rdiger Name daf r denn Eisenbahnen haben weltweit wesentlich zur Erschlie ung von unwegsamem Gel nde beigetragen Seit 1804 bewegen sie Unmengen von Personen und tonnenschwere Lasten Genau 200 Jahre sp ter 2004 kam der d nische Programmierer David Heinemeier Hansson auf die Idee Webanwendungen auf die Schiene zu setzen und erfand das Web Framework Ruby on Rails oft einfach Rails genannt Ruby on Rails setzt das so genannte Model View Controller Entwurfsmuster MVC f r das Web um Die MV
44. fert die Array Positionen aller Fundstellen an den Block zur ck Der R ckgabewert ist schlie lich die Anzahl der gefundenen Treffer class Array def search wert Startposition 0 pos 0 Anfangs 0 Treffer count 0 Alle Elemente durchgehen self each w Uebereinstimmung mit dem Suchwert if w wert Trefferzaehler erhoehen count 1 Position an Block liefern yield pos end Position erhoehen pos 1 Trefferzahl zurueckliefern count end end Probieren Sie es nun aus Als Code innerhalb des Blocks wird die jeweils gelieferte Position hier einfach mit einem kleinen Text ausgegeben Klassen entwerfen und implementieren 177 gt gt a w Hallo Welt hallo Mars hallo Jupiter hallo Galaxis gt gt z a search hallo pos puts Hallo an Position pos Hallo an Position 2 Hallo an Position 4 Hallo an Position 6 gt 3 gt gt puts z Treffer 3 Treffer Das einzig rgerliche ist dass die Methode search nun unverr ckbar ein Iterator ist und somit eine Fehlermeldung ausgibt wenn ihr kein Block bergeben wird gt gt a search hallo LocalJumpError no block given Um das zu verhindern k nnen Sie auch Hybrid Methoden schreiben die nur dann als Iteratoren fungieren wenn ein Block bergeben wird und ansonsten als brave Standardmethode Zur Entscheidungsfindung wird die Methode block _given verwendet Die folgende Erweiterung von Array search liefert bei einem Aufruf
45. globale Variablen 47 Regexp Anfangsmarke 94 Operator 51 Q Quoting Operator 43 q Quoting Operator 43 r Regexp Operator 86 w Operator 49 amp amp Operator 55 amp Operator 56 Regexp Gruppierung 91 Operator 52 arithmetischer Operator 51 Regexp Quantifizierer 92 String Operator 61 Operator 60 arithmetischer Operator 51 Regexp Quantifizierer 93 String Operator 61 Vorzeichen 52 Operator 60 Operator 51 Index String Erweiterung 190 Vorzeichen 52 Regexp Platzhalter 90 htaccess Dateien 282 Operator 51 regul re Ausdr cke 86 Operator 60 etc hosts Datei 281 Symbol Markierung 45 lt Operator 53 lt Vererbungs Operator 198 lt lt Bit Operator 57 lt lt HIER Dokument Marke 44 lt Operator 54 lt gt Operator 55 definieren 209 lt Directory gt 282 lt Location gt 282 Operator 60 Setter Kennzeichen 196 Operator 52 Operator 54 Operator 86 97 gt Operator 53 gt Operator 54 gt gt Operator 57 Regexp Quantifizierer 90 Zeichencode Operator 68 375 Operator 61 Instanzvariablen Kennzeichen 167 Klassenvariablen Kennzeichen 167 Array Methode 49 Hash Methode 50 in regul ren Ausdr cken 88 f r Escape Sequenzen 42 A Regexp Anfangsmarke 95 b Regexp Wortgrenze 95 B Regexp Wortinneres 95 D Regexp Nicht
46. gt 3 0 3 gt true gt gt 3 0 3 1 gt false gt gt 3 3 gt false 10 Noch genauer gesagt modifiziert nat rlich nur das Vorzeichen einen Ausdruck d h es kehrt sein bis heriges Vorzeichen um w hrend dessen bisherigen Wert beibeh lt und daher jederzeit weggelassen werden kann 52 Kapitel 2 Sprachgrundlagen gt gt hello gt true gt gt hello helloworld gt false gt gt a A gt false hello Ungleichheit Das Gegenst ck zu das Ergebnis ist true wenn die bei den Operanden verschieden sind und false wenn sie gleich sind gt 4 4 gt false gt gt 3 0 3 gt false gt gt 3 0 3 1 gt true gt gt 3 I 3 gt true gt gt hello hello gt false gt gt hello helloworld gt true gt gt a I A gt true lt kleiner als true wenn der linke Operand einen niedrigeren Wert besitzt als der rechte ansonsten false Beachten Sie dass dieser und die nachfolgenden gerichteten Vergleichsoperatoren nicht f r den Vergleich von Zahlen mit Strings verwendet werden d rfen siehe das folgende Beispiel gt 2 lt 3 gt true gt 2x lt 2 gt false 3 lt 2 gt false gt gt 3 lt 3 ArgumentError comparison of Fixnum with String failed from irb 21 in lt from irb 21 gt gt hello lt world gt true gt gt hello lt helloworld gt true
47. gt gt zweidrittel to_f gt 0 666666666666667 Objektorientierte regul re Ausdr cke Auch die im letzten Kapitel gr ndlich erl uterten regul ren Ausdr cke besitzen einen klassenbasierten Zugang und zwar ber die Klassen Regexp und MatchData F r den Alltagsgebrauch sind diese oft zu umst ndlich aber sie haben einige inter essante zus tzliche Features die hier gezeigt werden Ein Regexp Objekt speichert einen regul ren Ausdruck Es wird mit Hilfe von new oder dem Synonym compile erzeugt F r die Argumente gibt es zwei Schreibweisen Die eine M glichkeit ist ein literaler regul rer Ausdruck hier beispielsweise ein oder mehrere Buchstaben ohne Ber cksichtigung der Gro und Kleinschreibung r Regexp new a z i Die Alternative besteht darin einen String zu verwenden der in einen regul ren Ausdruck umgewandelt wird und die Modifizierer als zweites Argument anzuge ben Hier das obige Beispiel in dieser Syntax gt gt r Regexp new a z i gt a z i Die Optionen m ssen Sie in diesem Fall nicht als Strings angeben sondern k nnen sie auch durch eine bitweise Oder Kombination aus folgenden Konstanten erset zen e Regexp EXTENDED entspricht dem Modifier x Zur Formatierung verwendeter Whitespace wird ignoriert e Regexp IGNORECASE steht f r i In den untersuchten Strings spielen Gro und Kleinschreibung keine Rolle mehr e Regexp MULTILINE ersetzt das m also die Suche ber Zeilen
48. gt m 104 7 Whitespace zusammenfassen 105 body gsub s n n 106 body gsub n 3 m n n 107 body gsub 3 108 body gsub t t 109 Linkliste anfuegen 110 if linksammlung length gt 0 111 body nENTHALTENE LINKS n n 112 linkcounter 0 113 linksammlung each link 114 linkcounter 1 115 body linkcounter link n 116 117 end 118 Body ausgeben 119 wrappager to_page body 120 Neue Eingabeaufforderung 121 if linksammlung length gt 0 122 print LINK oder URL gt 123 else 124 print URL gt 125 end 126 end 127 rescue 128 puts Fehler 1 129 puts Pruefen Sie den eingegebenen Hostnamen 130 puts 131 print URL gt 132 end 133 begin 134 newurl gets chomp 135 end while newurl 136 Programmende bei Eingabe Q 137 break if newurl q 138 if newurl 0 9 139 URL bilden falls Linknummer eingegeben 140 newurl linksammlung newurl to_i 1 250 Kapitel 5 Netzwerkanwendungen Beispiel 5 4 Der Ruby Textbrowser httpclient rb Fortsetzung 41 if newurl 42 Nichts tun URL bleibt 43 elsif newurl r http 44 http entfernen 45 url 1 46 elsif newurl r 47 Host und absoluten Pfad kombinieren 48 url host newurl 49 else 50 Host und relativen Pfad kombinieren 51 url gsub r 1 52 url newurl 53 end 54 else 55 Norma
49. nach Jahr sortiert die Titel wurden aus Platzgr nden leicht gek rzt mysql gt SELECT FROM CDS ORDER BY cd_jahr ASC cd_nr cd_interpret cd_titel cd_jahr cd_songs 3 1 Led Zeppelin IV 1971 8 2 2 The Number Of T 1982 9 t1 2 Seventh Son Of 1988 8 3 rows in set 0 07 sec Zugriff auf Datenbanken 319 Der wichtigste Bestandteil einer SELECT Anfrage ist eine WHERE Klausel die Bedin gungen daf r formuliert welche Datens tze ausgew hlt werden sollen Das fol gende Beispiel zeigt nur die beiden CDs von Iron Maiden an mysql gt SELECT FROM cds WHERE cd_interpret 2 cd_nr cd_interpret cd_titel cd_jahr cd_songs To 2 Seventh Son Of A S 1988 8 2 2 The Number Of The 1982 9 2 rows in set 0 00 sec Zu guter Letzt sollten Sie sich noch ein Beispiel daf r anschauen wie Relationen in der Praxis genutzt werden Dazu soll eine Abfrage formuliert werden die den Inter preten und den Titel jeder CD ausgibt Di
50. pf baren Tabellen speichern Innerhalb dieser Gruppe gibt es Desktop Datenbanken wie Microsoft Access oder OpenOffice org Base und Datenbankserver wie MySQL oder Oracle F r dieses Buch fiel die Wahl auf MySQL den verbreitetsten Open Source Datenbankserver Bevor der Ruby Zugriff auf diese Software erl utert wird werden kurz die Installation und die ersten Schritte erkl rt Falls Sie weitere Infor mationen ber MySQL ben tigen finden Sie im O Reilly Verlag eine Reihe passen der B cher etwa meinen in der vorliegenden Buchreihe erschienenen Band Praktischer Einstieg in MySQL mit PHP MySQL installieren MySQL funktioniert unter Windows und allen g ngigen UNIX Systemen Eine Besonderheit gegen ber den meisten anderen Open Source Projekten ist dass auch f r die meisten UNIX Plattformen fertige Bin rversionen angeboten werden die Sie nicht mehr zu kompilieren brauchen Sie k nnen die passende Version f r Ihr Sys tem von der Website http www mysql com herunterladen Genaue Download Links finden Sie auf der Site zu diesem Buch weil die Site von MySQL selbst leider des fteren umstrukturiert wird 2 SQL Structured Query Language ist eine Sprache zur Kommunikation mit Datenbanksystemen Jede ernst zunehmende Datenbank beherrscht diese Sprache leider in teilweise sehr unterschiedlichen Dia lekten 314 Kapitel 6 Klassische Webanwendungen Die aktuelle stabile Version von MySQL ist 5 0 das neueste Release ist zu
51. r dieses Umwandlungsverfahren gt gt wochentage w Mo Di Mi Do Fr Sa So gt Mo Di Mi Do Fr Sa So gt gt wochentage join gt Mo Di Mi Do Fr Sa So Interessant ist schlie lich noch die M glichkeit Bereiche mittels to_a in Arrays umzuwandeln Zum Beispiel gt gt 1 10 t0_a gt 1 2 3 4 5 6 7 8 9 10 gt gt A G to_a gt MAS B Ch DS sE nee Kontrollstrukturen Wie Sie inzwischen wissen ist ein Ruby Skript im einfachsten Fall eine Abfolge von Anweisungen die der Reihe nach abgearbeitet werden Wenn dies unverr ckbar so bleiben m sste k nnten Sie mit Ruby allerdings kaum irgendwelche realen Pro bleme l sen Eine vollwertige Programmiersprache braucht Hilfsmittel um den geradlinigen Programmfluss zu unterbrechen und an andere Stellen zu verzweigen entweder abh ngig von Bedingungen oder einfach mehrmals hintereinander Genau zu diesem Zweck gibt es die in diesem Abschnitt beschriebenen Kontrollstrukturen Es gibt sie in zwei Geschmacksrichtungen Fallentscheidungen f hren Anweisungen abh ngig von Bedingungen aus und Schleifen erledigen dieselbe Aufgabe mehrmals hintereinander 72 Kapitel 2 Sprachgrundlagen Fallentscheidungen Eine Fallentscheidung sorgt daf r dass bestimmte Programmschritte nur ausge f hrt werden wenn eine Bedingung zutrifft Ruby kennt eine Reihe unterschiedli cher Arten von Fallentscheidungen if elsif els
52. temperatur rb 293 textblog rb 130 wrappager rb 246 zug _imp rb 154 zug_oo rb 158 Bereiche Ranges 45 in Arrays umwandeln 72 Vergleiche mit Einzelwerten 54 Berkeley Socket API 229 Betriebssysteme Ruby Unterst tzung in 3 Bezeichner 46 CamelCode 47 Bignum Klasse Referenz 364 Bit Operationen 56 Einsatzgebiete 57 block_given Methode 178 Bl cke 101 definieren 176 optional akzeptieren 178 Variablen in 102 body Methode 242 Bogenma 65 Broadcast Adresse IP 224 Broser Projekt Test 251 Browser Projekt 245 Erl uterungen 251 Implementierung 247 Bruchrechnung 145 C C Programmiersprache 2 C 2 CamelCode 47 Index 377 Cascading Style Sheets siehe CSS case when Fallentscheidungen 76 else 77 cd Konsolenbefehl 12 ceil Methode 64 CGI Apache Konfiguration 287 Definition 286 Erste Beispiele 287 Fehlersuche 291 Ruby Bibliothek 292 Umgebungsvariablen 289 CGI Klasse checkbox_group Methode 302 CSS einbetten 313 CSS einbinden 300 file_field Methode 303 form Methode 300 Formulardaten lesen 297 Formularelemente erzeugen 300 Funktionsumfang 292 has_key Methode 297 hidden Methode 309 HTML erzeugen 298 HTML Versionen 298 param Methode 297 radio_group Methode 302 reset Methode 303 submit Methode 303 text_field Methode 301 textarea Methode 301 Upload 303 XHTML Unterst tzung 298 CGl escapeHTML Methode 303 CGI Cookie 305 CGI Cookie Klasse 305 CGI Session Klasse 310 checkbox_g
53. test txt r Nachdem das Dateiobjekt zur Verf gung steht k nnen Sie im Prinzip je nach Modus die bereits bekannten Ein oder Ausgabemethoden darauf anwenden Um aus der soeben zum Lesen ge ffneten Datei test txt eine Zeile zu lesen wird zum Beispiel folgende Anweisung verwendet line file gets Wenn Sie mit dem Bearbeiten einer Datei fertig sind k nnen Sie sie mit Hilfe der Methode close wieder schlie en file close Beim Versuch eine nicht vorhandene Datei zum Lesen zu ffnen erhalten Sie eine Fehlermeldung Probieren Sie es einfach in irb gt gt file File new gibtsnicht txt r Errno ENOENT No such file or directory gibtsnicht txt Es ist dagegen kein Problem eine nicht vorhandene Datei zum Schreiben zu ffnen in diesem Fall wird sie neu angelegt gt gt file File new neu txt w gt lt File neu txt gt Um in eine Datei zu schreiben k nnen Sie alle bereits besprochenen Ausgabeme thoden darauf anwenden Das folgende Beispiel schreibt eine Zeile in die soeben ge ffnete Datei gt gt file puts Test gt nil Ein undAusgabe 127 Um auszuprobieren ob es funktioniert hat m ssen Sie die Datei zuerst schlie en anschlie end zum Lesen ffnen und dann beispielsweise mittels read ihren gesam ten Inhalt auslesen gt gt file close gt nil gt gt file open x txt r gt lt File x txt gt gt gt file read gt Test n ben zu ffnen denn sie
54. und f hren Sie es aus Nun k nnen Sie beliebig viele Zeilen eingeben und es wird jeweils gepr ft ob der kom plizierte regul re Ausdruck auf Ihre Eingabe passt Sobald Sie ein einzelnes q einge ben wird das Programm beendet Hier eine Beispielausf hrung gt ruby admin rb gt Systemadministrator Systemadministrator passt gt Systemadministratorin Systemadministrator passt gt Netzwerkadministrator administrator passt gt Der Admin ist in Urlaub Admin passt gt Sysad Passt nicht gt q Beachten Sie dass der gesamte Ausdruck noch einmal zus tzlich in runden Klam mern steht hier zur Verdeutlichung fett gesetzt und durch markiert re Sys tem Aa dmin istrator Diese u ersten Klammern werden nicht verwendet um den Ausdruck zu quantifi zieren sondern f r ein zus tzliches weiter unten genauer erl utertes Feature Dieje nigen Teile des Strings die auf geklammerte Ausdr cke passen werden der Reihe nach das hei t von au en nach innen sowie von links nach rechts automatisch in den Variablen 1 2 und so weiter gespeichert Das Skript kann dadurch im Fall eines Treffers ausgeben auf welchen Teil der Eingabe der regul re Ausdruck passt Bei der Systemadministratorin ist es beispielsweise der Teilstring Systemadminis trator beim Netzwerkadministrator dagegen nur administrator Der n chste und allgemeinste Quantifizierer ist das Sternchen Es bedeutet dass der ents
55. 0 gt 3 7 Ly 37 Wenn Sie Texte in Anf hrungszeichen durch verbinden werden diese also ver kettet und nicht etwa numerisch addiert selbst dann nicht wenn ausschlie lich Ziffern enthalten sind Wenn Sie irb nach einigen weiteren Experimenten beenden m chten k nnen Sie exit eingeben irb main 008 0 gt exit Eine andere einfache M glichkeit eine einzelne Ruby Anweisung auszuf hren besteht darin den Ruby Interpreter ruby mit der Option e aufzurufen Dabei m ssen Sie allerdings Ausgabebefehle am einfachsten puts verwenden um Text auszugeben Das folgende Beispiel f hrt ebenfalls eine Berechnung aus gt ruby e puts 9 6 54 Die gesamte Ruby Anweisung hinter dem e muss in Anf hrungszeichen stehen Da Sie f r die Anweisung selbst manchmal auch Anf hrungszeichen ben tigen k nnen Sie eine der beiden Sorten einfache beziehungsweise doppelte in die jeweils andere verschachteln Zum Beispiel Ruby Code eingeben und ausf hren 15 gt ruby e puts Hallo Ruby Hallo Ruby Oder eben umgekehrt gt ruby e puts Hallo Ruby Hallo Ruby Bitte beachten Sie dass die zweite Variante in Windows Versionen vor XP nicht funktioniert Bei Bedarf k nnen Sie in einem solchen Aufruf auch mehrere Anweisungen unter bringen indem Sie diese durch Semikola voneinander trennen Im Gegensatz zu vielen anderen Sprachen ist dies bei Ruby standardm ig nicht n tig sondern nur dann
56. 0 ist wird dies per Fehlermeldung und Notbremse als versuchte Division durch 0 ausgeschlos sen e Zeile 36 44 Das Ergebnis wird mit Hilfe einer case when Fallentscheidung berechnet Wie im vorigen Kapitel erl utert besteht eine der n tzlichen Beson derheiten von Ruby darin dass Sie Fallentscheidungen als Ausdr cke einsetzen k nnen wenn Sie f r den jeweiligen Fall einfach einen Wert hinschreiben e Zeile 47 Mit Hilfe der oben ausf hrlich besprochenen Methode printf erfolgt die Ausgabe diesmal auf STDOUT Alle drei Zahlen erhalten dabei zwei Nach kommastellen Datei Ein und Ausgabe Mit Hilfe der Ein und Ausgabeumleitung k nnen Sie aus Dateien lesen und in sie schreiben Das ist allerdings ein interessantes Zusatzfeature f r Poweruser und nicht die Art und Weise wie man im Alltag auf Dateien zugreift Im Kasten Die Ein undAusgabe 125 Standard O Kan le wurde beispielsweise gezeigt wie Sie eine Pipe verwenden k nnen um die Verzeichnisausgabe mit einem Suchbefehl zu kombinieren Selbstverst ndlich besitzt Ruby auch eingebaute Methoden um explizit auf Dateien zugreifen zu k nnen Diese werden hier gezeigt Grundlagen Um eine Datei zur Verarbeitung zu ffnen muss ein Objekt der Klasse File erzeugt werden Das geschieht wie beim Erstellen von Objekten blich mit Hilfe des Kon struktors new Schematisch sieht das so aus var File new Dateipfad Modus Das Ergebnis von new wird fast immer einer
57. 0x2affaa8 gt gt gt adr match plz gt lt MatchData 0x2afbd18 gt Mit beiden Ergebnissen k nnen Sie so nichts anfangen Es sind MatchData Objekte die Sie speichern m ssen um anschlie end ihre Methoden aufzurufen der Hexade zimalwert codiert jeweils die eindeutige Objekt ID Sie brauchen also eine Zeile wie diese m plz match adr m speichert die relevanten Daten in einem Array m o ist der gefundene Teilstring selbst gt gt m 0 gt 50670 4 Oder nach einer f nfstelligen Hausnummer aber die gibt es in Deutschland wohl recht selten Einige weitere Klassen 147 m 1 m 2 und so weiter entsprechen den im vorigen Kapitel beschriebenen geklam merten Teilausdr cken 1 2 usw Interessant sind noch folgende MatchData Methoden alle Beispiele beziehen sich weiterhin auf die Postleitzahl e m begin n liefert die Startposition des angegebenen Elements aus dem Match Array m begin 0 ist also mit dem Ergebnis der Operation identisch gt gt m begin 0 gt 49 e m end n ist entsprechend die Position des ersten Zeichens im String das nicht mehr zum Match Bestandteil n geh rt gt gt m end 0 gt 54 e m offset n liefert die Ergebnisse von m begin n und m end n zusammenge fasst als Array gt gt m offset 0 gt 49 54 e m pre match gibt alle Zeichen des Strings zur ck die vor dem Treffer stehen gt gt m pre_match gt O Reilly Verlag GmbH amp Co KG Balthasarstr 81 e
58. 146 numerator Methode 146 Referenz 368 Raumfolgearithmetik 38 RDoc 34 read Methode 121 read Methode Dir 137 Reaping Prozessverwaltung 259 kontrolliertes 260 rechner rb Skript 24 rechteck rb Skript 112 Referenz 357 Reflexion siehe Introspektion Regex 85 Regexp 85 Regexp Klasse 146 match Methode 147 Referenz 368 Regul re Ausdr cke 85 Endmarke 94 Treffervariablen 98 r Operator 86 Quantifizierer 92 Quantifizierer 93 Platzhalter 90 Quantifizierer 90 1 88 A Anfangsmarke 95 b Wortgrenze 95 B Wortinneres 95 D Nichtziffer 97 S Nicht Whitespace 97 s Whitespace 97 W Nichtwort Zeichen 97 w Wortzeichen 97 Z Endmarke 95 Anfangsmarke 94 Zeichen Ausschluss 89 Quantifizierer 94 Alternativen 96 Bereichsmarkierungen 94 einzelne Zeichen 86 Ersetzen 98 Escape Sequnezen in 88 Gier greed 93 greed 93 Grundlagen 86 gruppieren 91 gsub Methode 98 i Modifier 96 in Variablen 89 m Modifier 96 Matching 86 97 Modifier 96 Numerische Quantifizierer 94 objektorientiert 146 POSIX Zeichenklassen 97 Praxiseinsatz 97 Quantifizierer 90 sub Methode 98 Syntax 87 Treffervariablen 98 x Modifier 96 Zeichen ausschlie en 89 Zeichenbereiche 88 Rekursion 190 Konzept 190 Verzeichnisse durchsuchen 192 Relationale Datenbanken 314 rename Methode 179 Request HTTP 284 require Methode 187 rescue 209 reset Methode CGI 303 respond_to Methode 214 Response HTTP 285 return 1
59. 346ms TTL 40 226 Kapitel 5 Netzwerkanwendungen Ping Statistik fuer 210 163 138 100 Pakete Gesendet 4 Empfangen 4 Verloren 0 0 Verlust Ca Zeitangaben in Millisek Minimum 331ms Maximum 346ms Mittelwert 335ms Die hier gezeigte Windows Variante von ping sendet automatisch vier Testpakete und zeigt dann eine Statistik an Auf UNIX Systemen sendet das Programm dage gen so lange bis Sie Strg C dr cken brigens verwenden Menschen im Internet in der Regel keine IP Adressen sondern Hostnamen wie www oreilly de oder www rubygarden org Intern m ssen diese allerdings stets in die zugeh rigen IP Adressen umgewandelt werden Diese Dienst leistung erbringt ein Dienst namens DNS Domain Name System eine weltweit verteilte Datenbank so genannter Nameserver Wie das funktioniert k nnen Sie auf der Kommandozeile mit Hilfe des Dienstprogramms nslookup ermitteln Es ben tigt den aufzul senden Hostnamen sowie die IP Adresse eines Nameservers Zum Bei spiel gt nslookup www oreilly de 194 8 194 70 Server nsi1 netcologne de Address 194 8 194 70 Nicht autorisierte Antwort Name norawww oreilly de Address 62 206 71 33 Aliases www oreilly de Der in diesem Beispiel befragte Nameserver stammt von NetCologne verwenden Sie entsprechend einen Nameserver Ihres eigenen Providers Der Ausdruck Nicht autorisierte Antwort besagt nicht etwa dass die Antwort falsch ist sondern dass der Nameserver sie aus sein
60. 362 Anhang A Ruby Kurzreferenz Konstruktor Methoden end e Abgeleitete Klasse class Klassenname Elternklasse Zusaetze und Unterschiede programmieren end e Automatische Accessor Methoden att _reader var1 fuer Instanzvar vari nur lesbar att _writer var1 nur aenderbar attr_accessor vari les und aenderbar e Konstruktor def initialize instanzvari H end Instanzmethode def methodenname var Wert Bo Rueckgabewert Ausdruck Sofortiger Ruecksprung mit Rueckgabewert return Ausdruck end Aufruf von au en obj Klassenname new obj methodenname e Klassenmethode def Klassenname methodenname He end Aufruf von au en Klassenname methodenname Klassenreferenz Im Folgenden werden einige besonders wichtige eingebaute Ruby Klassen mit Konstruk tor sowie h ufig genutzten Klassen und Instanzmethoden jeweils falls vorhanden alpha betisch aufgelistet Beachten Sie dass alle eingebauten und eigenen Klassen die unter Object aufgelisteten Methoden besitzen es sei denn sie setzten sie explizit private Array Liste beliebig vieler beliebiger Objekte mit numerischem Index Konstruktoraufrufe e Array new ergibt e Array new n n Elemente mit Wert nil e Array new n w n Elemente mit Wert w e Implizit var Klassenreferenz 363 Instanzmethoden arr n liefert Element Nr n 1 e arr length Anzahl
61. 73 195 ueber maximal 30 Abschnitte 1 60 ms 50 ms 54 ms erx mawi netcologne de 195 14 247 95 2 46 ms 49 ms 47 ms swrt maw1 g34 netcologne de 213 196 239 169 3 47ms 45 ms 47 ms core maw1 v1l200 netcologne de 195 14 195 145 4 47ms 47 ms 46 ms core sto2 v1911 netcologne de 195 14 215 249 5 176 ms 143 ms 142 ms rteg g03 netcologne de 81 173 194 169 6 143 ms 143 ms 143 ms equinix ash epoch net 206 223 115 52 7 143 ms 145 ms 144 ms ge 0 0 0 c00 ash megapath net 155 229 70 85 8 143 ms 144 ms 142 ms ge 0 2 0 c01 dcp megapath net 155 229 70 38 9 148 ms 148 ms 149 ms pos1 0 btm m200 gw epoch net 155 229 123 213 10 146 ms 149 ms 149 ms 206 135 244 114 btm m200 cust gw epoch net 206 135 244 114 11 148 ms 149 ms 148 ms ns1 chadfowler com 216 133 73 195 Ablaufverfolgung beendet Beachten Sie dass das Programm auf UNIX Systemen traceroute statt tracert hei t Wie Sie sehen werden f r jede Station drei bertragungszeiten angegeben weil jede dreimal befragt wird Ein noch einfacheres Dienstprogramm ist brigens ping Es pr ft ob ein bestimm ter Host berhaupt erreichbar ist hier etwa www ruby lang org gt ping www ruby lang org Ping carbon ruby lang org 210 163 138 100 mit 32 Bytes an Daten Antwort von 210 163 138 100 Bytes 32 Zeit 331ms TTL 42 Antwort von 210 163 138 100 Bytes 32 Zeit 331ms TTL 42 Antwort von 210 163 138 100 Bytes 32 Zeit 332ms TTL 42 Antwort von 210 163 138 100 Bytes 32 Zeit
62. Au erhalb dieser Klasse stehen die Konstanten als Lok KONSTANTE zur Verf gung zum Beispiel 160 Kapitel 4 Eigene Klassen und Objekte erstellen Lok DAMPF hnlich wie die im vorigen Kapitel vorgestellten Konstanten der Klasse I0 etwa IO SEEK_SET Zeile 9 11 Eine Methode namens initialize hei t Konstruktor und wird auto matisch aufgerufen wenn Sie mit new eine Instanz das hei t ein neues Objekt der Klasse erzeugen Der Konstruktor wird vor allem verwendet um der Datenstruktur eines Objekts sinnvolle Anfangswerte zuzuweisen Bei der Loko motive ist dies nur der Typ der beim Aufruf bergeben werden kann oder ansonsten auf Lok OHNE gesetzt wird Gespeichert wird der Wert in der Instanzvariablen typ Zeile 13 24 Die Lok Methode get_typ untersucht per case when Fallentschei dung den Wert von typ und gibt einen entsprechenden String mit dem Loko motiventyp zur ck Zeile 26 28 get_kapazitaet gibt Auskunft dar ber wie viele Waggons die Lokomotive ziehen kann Dazu gen gt es den ohnehin numerischen Wert von typ zur ckzuliefern Zeile 30 32 Zur Fehlersuche und zur bequemen Verarbeitung ist es praktisch wenn eine Klasse eine Methode namens to_s besitzt die Informationen ber alle wichtigen Daten einer Instanz als String zur ckgibt Das Praktische an einer Methode dieses Namens ist dass sie automatisch aufgerufen wird wenn die Instanz selbst im String Kontext verwendet wird Ein anschauliches Beispiel erha
63. Ausdruck zu verwen den k nnen Sie es als a oder beispielsweise als r a schreiben Um nun einen String mit einem regul ren Ausdruck zu vergleichen der einfachste Anwendungsfall wird der Matching Operator verwendet Probieren Sie in irb einmal den regul ren Ausdruck a mit verschiedenen Strings mit und ohne ent haltenes a aus und betrachten Sie die Ergebnisse gt gt aber a gt 0 gt gt hallo a gt 1 gt gt Variable a gt 1 gt gt Regexp a gt nil gt gt Abend a gt nil Wie Sie sehen lautet der R ckgabewert nil wenn der regul re Ausdruck nicht zutrifft ein gro es A ist demzufolge kein a weil regul re Ausdr cke normaler weise zwischen Gro und Kleinschreibung unterscheiden weiter unten lernen Sie einen Modifier daf r kennen Trifft der regul re Ausdruck dagegen zu ist das Ergebnis eine ganze Zahl die Position des Zeichens im String bei dem das erste Vorkommen des regul ren Ausdrucks beginnt Da gem den weiter oben beschriebenen Regeln f r Wahrheitswerte jede Zahl auch die 0 als wahr gilt und nil als falsch k nnen Sie die Matching Operation ohne Weiteres als Kriterium f r eine if Fallentscheidung verwenden Das folgende Beispiel gibt bekannt ob die Benutzereingabe mindestens ein e enth lt oder nicht eingabe gets if eingabe e puts e gefunden else puts Kein e gefunden end 86 Kapitel 2 Sprac
64. Bei jedem Softwareprojekt das ber ein paar Zeilen hinausgeht sollten Sie nicht einfach anfangen Code einzutippen sondern zun chst einen Entwurf anfertigen Der hier besprochene objektorientierte Entwurf auf Englisch Object Oriented Klassen entwerfen und implementieren 163 Design oder kurz OOD geh rt zum Handwerkszeug der modernen Softwareent wicklung Dazu m ssen Sie auch ein wenig mehr ber den theoretischen Hinter grund und damit ber das Warum der Objektorientierung wissen Zun chst wird es Ihnen helfen nach dem intuitiven Zugang im vorigen Kapitel genaue Definitionen der Mitspieler objektorientierter Software zu erhalten Eine Klasse englisch class ist zwar das wichtigste Element eines OO Pro gramms aber selbst noch kein Objekt Es handelt sich vielmehr um einen Da tentyp eine Art Vorlage die die Eigenschaften properties und das Verhalten behavior beliebig vieler konkreter Objekte dieses Typs festlegt Die Eigen schaften werden als Instanzvariablen instance variables gespeichert w hrend das Verhalten in so genannten Instanzmethoden instance methods festgelegt wird Diese Zusammenfassung von Datenstruktur und Programmcode zu des sen Manipulation hei t Kapselung encapsulation In vollwertigen objektori entierten Sprachen hat ein Entwickler von au en in der Regel nur Zugriff auf die Methoden aber nicht auf die Eigenschaften Die Methoden bilden somit die offiziellen Schnittstellen f r den Zugr
65. Beispiel cd home sascha Wenn Sie vom aktuellen Verzeichnis aus in ein untergeordnetes Verzeichnis wech seln m chten m ssen Sie den Namen dieses Unterverzeichnisses ohne f hrenden Backslash beziehungsweise Slash angeben Hier ein Windows Beispiel C Dokumente und Einstellungen Sascha Eigene Dateien gt cd myruby C Dokumente und Einstellungen Sascha Eigene Dateien myruby gt Auf diese Weise lassen sich auch mehrere Hierarchiestufen berwinden Dazu sehen Sie hier ein UNIX Beispiel sascha linuxbox gt cd myruby kapitel1 sascha linuxbox myruby kapitel1 gt 12 Kapitel 1 Einf hrung Um in das bergeordnete Verzeichnis zu wechseln wird auf beiden Plattformen der spezielle Verzeichnisname verwendet Zum Beispiel unter Windows C Dokumente und Einstellungen Sascha Eigene Dateien gt cd C Dokumente und Einstellungen Sascha gt Diese Techniken lassen sich kombinieren um ber sogenannte relative Pfade von jedem beliebigen Verzeichnis in jedes andere zu wechseln Das folgende Beispiel vollzieht auf einem UNIX Rechner einen Wechsel aus dem oben gezeigten Ver zeichnis kapitell in das Geschwister Verzeichnis kapitel2 sascha linuxbox myruby kapiteli1 gt cd kapitel2 sascha linuxbox myruby kapitel2 gt Um unterhalb des aktuellen Arbeitsverzeichnisses ein neues Verzeichnis zu erstel len wird das Kommando mkdir verwendet Windows erlaubt auch die Kurzfassung md Hier wird beispielsweise schon ein
66. Bl cke definieren die Methoden der Klasse die im letzten Teil des Skripts aufgerufen werden Au er initialize und setText liefern sie alle einen Wert zur ck in Ruby gen gt es den entsprechenden Wert als einzelne Anweisung hin zuschreiben Die Einzelheiten brauchen Sie jetzt noch nicht zu verstehen jede verwendete Anweisung wird in diesem oder im n chsten Kapitel ausf hrlich erl utert Wissen Praktische Einf hrung 29 sollten Sie an dieser Stelle nur noch dass das Konstrukt txt eine Variable mit vor angestelltem Zeichen f r jedes Objekt der Klasse dauerhaft einen Wert speichert Genau das macht den praktischen Nutzen der Objektorientierung aus Die Daten und der Code zu ihrer Verarbeitung werden zusammengehalten Fachbegriff gekapselt Sie brauchen sie nicht getrennt zu verwalten Hier eine kurze bersicht ber die Aufgaben der einzelnen Methoden ohne eine genauere Beschreibung ihrer Funktionsweise e initialize Zeile 4 bis 6 wird automatisch aufgerufen wenn ein neues Objekt erzeugt wird und weist dem gekapselten Text seinen Anfangswert zu entwe der den bergebenen Inhalt oder einen leeren Text set_text Zeile 8 bis 10 ndert den enthaltenen Text des Objekts nachtr glich e get_text Zeile 12 bis 14 liefert den Text zur ck e to s Zeile 17 bis 19 ruft get_text auf da beide Methoden dieselbe Aufgabe erf llen Besonderheit Wenn etwas als Text eingesetzt werden soll wird seine Methode to_s
67. Da Ruby objektorientiert ist und alle Elemente Literale Variablen usw Objekte irgendeines Typs sind gibt es f r jedes von ihnen einige vordefinierte Methoden der Form Element Methode 62 Kapitel 2 Sprachgrundlagen Eine wichtige Methode die jedes Ruby Objekt besitzt ist class sie liefert die Klasse das hei t den Datentyp des Objekts zur ck Probieren Sie es mit beliebigen Variablen oder Literalen aus gt gt 2 class gt Fixnum gt gt 2 2 class gt Float gt gt 2 class gt String gt gt true class gt TrueClass Daneben gibt es auch eine Reihe globaler Methoden in der Form Methode Argument Bei vielen dieser Methoden k nnen Sie die Klammern um die Argumente noch weg lassen wenn Warnungen aktiviert sind erhalten Sie die Mitteilung warning parenthesize argument s for future version Wenn Sie die Klammern setzen m ssen Sie auch darauf achten dass zwischen dem Methodennamen und der ffnenden Klammer kein Leerzeichen stehen darf Ein Beispiel f r eine n tzliche globale Methode ist rand sie liefert eine zuf llige Flie kommazahl zwischen O und 1 Probieren Sie es einige Male aus nat rlich wer den Sie andere Werte erhalten als die hier abgedruckten gt gt rand gt 0 451022176722365 gt gt rand gt 0 827507832034271 Optional k nnen Sie rand eine Ganzzahl als Argument bergeben Wenn Sie das tun erhalten Sie eine zuf llige Ganzzahl zwischen 0 und dem
68. Das sollten Sie aus Sicherheitsgr nden nur bei geschlossener Internetverbindung oder hinter einer Fire wall tun Au erdem wird der Start des Servers fehlschlagen wenn Port 7 bereits durch einen offiziel len ECHO Server belegt ist 236 Kapitel 5 Netzwerkanwendungen Zeile 21 Der Text der Client Anfrage wird ausgelesen Der Server verl sst sich darauf dass der Client nicht nur die Verbindung herstellt sondern auch Text sendet Die String Methode strip die auf gets angewendet wird entfernt s mtlichen Whitespace vor und hinter dem Text Die explizite Erw hnung von STDIN schlie lich ist sicherer damit das Skript nicht versehentlich aus dem Socket liest unter Umst nden k nnte die zuletzt ge ffnete IO Instanz mit Lesebereitschaft n mlich als Standard betrachtet werden Zeile 23 Der Server gibt den Text der Anfrage zur Kontrolle aus Bessere Server verwenden daf r eine Logdatei und f gen mindestens die IP Adresse des Cli ents sowie Datum und Uhrzeit hinzu Wie dies gemacht wird erfahren Sie im letzten Abschnitt dieses Kapitels wo ein richtiger kleiner Webserver vorgestellt wird Zeile 25 Wenn der ausgeschnittene Textinhalt der Anfrage EXIT lautet beendet der Server die accept Schleife per break Anweisung Damit l sst sich der Server von einem entfernten Rechner aus beenden wie Sie weiter unten im Praxistest sehen werden In der Praxis sollten daher h here Anspr che an Ser ver Administrationsbefehle ges
69. Daten mit der Methode GET an die relative URL pruefung rb verschickt cgi form get pruefung rb Innerhalb des Formulars k nnen Sie weiterhin beliebige HTML Inhalte und Text unterbringen vor allem aber die diversen Eingabeelemente Die wichtigsten sind Einfache Textfelder In HTML werden sie mittels lt input type text name Feldname gt erzeugt In Ruby k nnen Sie entweder cgi input mit einem Hash benannter Attribute verwenden oder aber die elegantere Kurzfassung text_field cgi text_field Feldname Auch dieses Element kann benannte Parameter entgegennehmen Die wichtigs ten sind name Feldname size Breite in Zeichen maxlength maximal zul s sige Zeichenanzahl und value Vorgabetext Betrachten Sie etwa dieses Beispiel cgi text_field name gt geburtsdatum size gt 10 maxlength gt 10 value gt TT MM JJJJ Das Ergebnis ist folgender HTML Code lt INPUT name geburtsdatum size 10 TYPE text value TT MM JJJJ maxlength 10 gt e Mehrzeilige Textfelder F r gr ere Textbereiche ist die Methode cgi texta rea zust ndig Sie erzeugt ein lt textarea gt lt textarea gt Tag Paar Beliebige Attri bute k nnen als Hash eingef gt werden Die wichtigsten sind name oder ein einfacher String f r den Namen des Feldes cols f r die Breite in Zeichen rows f r die H he in Zeichen und wrap f r die Art des Zeilenumbruchs meist vir CGl Skripten mit Ruby 301 tua
70. Eingabeaufforderung ffnen Seit der neuen Ruby Version 1 8 5 wird diese Anpassung sogar automatisch vorgenommen Variablen Ausdr cke und Operationen Eine der wichtigsten F higkeiten von Programmiersprachen ist die Auswertung der sogenannten Ausdr cke Die Bedeutung des Begriffs Ausdruck entspricht in etwa derjenigen in der Mathematik wo Ausdr cke auch Terme genannt werden Es han delt sich um beliebige Verkn pfungen von Werten Literalen Variablen usw unter anderem durch e Arithmetische Operationen das hei t im Wesentlichen die Grundrechenarten e Vergleichsoperationen die berpr fen ob Werte identisch oder verschieden sind e Logische Operationen mit denen sich mehrere Vergleiche verkn pfen lassen e Bit Operationen die die gespeicherten Werte direkt manipulieren e Methodenaufrufe die beliebige Anweisungen ausf hren um Werte zu ver n dern Variablen Ausdr cke und Operationen 35 An jeder Stelle in einem Skript an der ein einzelner Wert erwartet wird darf auch ein beliebig komplexer Ausdruck stehen solange er einen Wert des ben tigten Typs ergibt nat rlich ist es unm glich Texte zu subtrahieren oder eine einzelne Zahl zu sortieren Literale Das einfachste Element eines Ausdrucks und gleichzeitig ein eigenst ndiger Aus druck ist das Literal ein w rtlich gemeinter Wert Ruby kennt verschiedene Arten von Literalen e Numerische Literale das hei t Zahlen unterteilt in ganze
71. Er wird einfach zweimal an einen Aufruf des Konstruktors der Elternklasse Schl sselwort super bergeben In Zeile 31 wird Rechteck new aufgerufen um ein Objekt oder eine Instanz der Klasse Rechteck zu erzeugen Anschlie end werden die vier Methoden der Instanz aufgerufen um sie zu testen Dieselben Schritte werden in Zeile 37 40 mit Quadrat durchgef hrt Die Syntax der berwiegend eingesetzten Ausgabemethode printf wird im n chsten Abschnitt behandelt Ein und Ausgabe In den bisherigen Kapiteln wurden einige Anweisungen zur Ein und Ausgabe auf Englisch Input Output oder kurz I O ohne n here Erkl rung verwendet In diesem Unterabschnitt werden die wichtigsten von ihnen systematischer erl utert Los geht es mit der Zeilenausgabe auf der Konsole sowie der zugeh rigen Benutzereingabe Anschlie end werden Ein und Ausgabemethoden f r Dateien und Verzeichnisse vorgestellt wobei Sie feststellen werden dass diese aufgrund der inzwischen in allen Betriebssystemen blichen Abstraktion beinahe genauso funktionieren wie die entsprechenden Konsolenbefehle Im bern chsten Kapitel werden Netzwerk V O Operationen behandelt und sogar diese sind fast identisch Konsolen Ein und Ausgabe Einfache Skripten kommunizieren normalerweise zeilenbasiert ber die Konsole mit dem Benutzer Einige der daf r zust ndigen Anweisungen wie puts oder gets haben Sie bereits gesehen hier werden sie genauer erl utert Die Standard I O Ka
72. Fallentscheidung 73 else 73 elsif 74 nachgestellt 75 Imperative Programmierung 154 Import externer Skripten 187 include Methode 208 Index Array 49 Hash 50 initialize Konstruktor Methode 113 Input Output siehe Ein und Ausgabe INSERT SQL Anweisung 319 Installation Ruby 4 instance_of Methode 213 Instanz Begriffsdefinition 164 Instanzen Erzeugen 168 self 184 Instanziierung 168 Instanzvariablen Accessor Methoden 197 automatische Getter 194 automatische Setter 195 Rails Datenaustausch mit 340 Instanzvariablen Begriffsdefinition 167 Integer 36 Integer Klasse Referenz 366 Interactive Ruby irb 14 Interfaces Java 207 Internet Protocol IP 224 Adressierung 224 Broadcast Adresse 224 CIDR 225 Datagramme 224 DHCP 225 IPv4 224 IPv6 224 Multicast 224 NAT 225 Routing 226 Teilnetzmaske 225 Interpreter 3 Interprozesskommunikation IPC 260 Introspektion 212 class 212 instance_of 213 is_a 213 methods 214 object_id 212 ObjectSpace 212 respond_to 214 IO Klasse Referenz 366 IP siehe Internet Protocol IP Adressen 224 automatische Zuweisung 225 Klassen 224 IPC siehe Interprozesskommunikation Index 381 irb 14 als Taschenrechner 14 Beenden 15 in Rails 348 Starten 14 Zeilennummerierung deaktivieren 23 is_a Methode 213 IS A Beziehung OOP 165 Iteratoren 101 Allgemeines 101 Blockvariablen 102 collect 105 downto 104 each 101 each_byte 104 each_key 103 each_pair
73. Formalit ten kursiven Text in den Body ein cgi body lt i Das ist kursiv lt i gt Da praktisch alle g ngigen HTML Tags als CGI Methoden zur Verf gung stehen k nnen Sie dies genauso gut als cgi body cgi i Das ist kursiv schreiben Auch das Einf gen von Zeilenumbr chen ist auf diese Weise m glich Sie machen den erzeugten HTML Code lesbarer und damit wartungsfreundlicher Das folgende Beispiel trennt Head und Body durch einen Zeilenumbruch cgi html egi head n egi body Verwechseln Sie einen einfachen Zeilenumbruch zur HTML Strukturierung aber nicht mit einem HTML Zeilenumbruch Auf einer Webseite wird beliebig viel Whitespace n mlich stets zu genau einem Leerzeichen abgesehen vom Wortum bruch zusammengefasst Wenn Sie einen expliziten Zeilenumbruch ben tigen m ssen Sie das HTML Tag lt br gt verwenden das Sie bei Bedarf auch mittels cgi br erzeugen k nnen Das wichtigste Element innerhalb des Heads ist der Dokumenttitel der mit Hilfe der Methode cgi title angegeben wird Zum Beispiel cgi head cgi title Titel des Dokuments CGl Skripten mit Ruby 299 Bei vielen HTML Erzeugungsmethoden k nnen Sie die zul ssigen Attribute als Hashargument einf gen Das folgende Beispiel erzeugt einen Body mit schwarzem Hintergrund und wei er Standardschriftfarbe cgi body bgcolor gt 000000 text gt HFFFFFF Sie sollten wissen dass moderne Web
74. Internet ist ein komplexes Geflecht aus Teilnetzen die durch Rou ter miteinander verbunden sind Ein Router betrachtet Datenpakete nur auf der Internetschicht er bestimmt anhand der Absender und Zieladresse an welches Teilnetz er sie am besten weiterleitet Damit hnelt er gewissenhaften Postmitarbeitern die nur die Adressangaben auf dem Umschlag lesen um Briefe weiterzuleiten Sobald die Daten beim endg ltigen Empf nger ankommen reicht dieser sie nach oben bis zur Anwendung weiter Die Empfangssoftware der Internetschicht entfernt die f r sie bestimmten Zusatzinformationen und liefert das enthaltene Paket an die Transportschicht aus Diese bestimmt anhand der Empf nger Portnummer f r welches Programm der Inhalt bestimmt ist und gibt diesen weiter Das Empf ngerprogramm im vorliegenden Beispiel der Webserver interpretiert die Anfrage Anschlie end verschickt er eine passende Antwort response und wird auf diese Weise seinerseits zum Sender Angenommen der Webserver hat die ange forderte Startseite gefunden dann antwortet er wie folgt 2 Wobei es prinzipiell m glich ist einen Router so zu programmieren dass er den Inhalt der Pakete liest oder kopiert genau wie unseri se Zusteller heimlich Briefe ffnen k nnen um beispielsweise Schecks zu finden Inzwischen werden Netzbetreiber sogar staatlicherseits zu derartigen Ma nahmen gezwun gen um im Rahmen der vermeintlichen Terrorabwehr die Kommunikation zu berwa
75. Led Zeppelin 1971 Mit fetch_hash funktioniert die Abfrage im Prinzip genauso bis auf den besser les baren Zugriff auf die Felder while line result fetch_hash printf s von s i n line cd_titel line int_name line cd_jahr end 324 Kapitel 6 Klassische Webanwendungen Bei nderungsabfragen die keine Datens tze zur ckliefern brauchen Sie keine Ergebnisvariable Stattdessen k nnen Sie nach Durchf hrung der Abfrage die Eigenschaft affected_rows Ihres Verbindungsobjekts auslesen Sie gibt an wie viele Datens tze ge ndert wurden Das folgende Beispiel f gt eine weitere Band zur Interpretentabelle hinzu und gibt danach an ob es funktioniert hat conn query INSERT INTO interpreten int name VALUES Pink Floyd if conn affected_rows gt 0 puts Band erfolgreich hinzugefuegt else puts Band konnte nicht hinzugefuegt werden end Alle MySQL Methoden l sen Exceptions vom Typ Mysql Error aus Wenn Sie diese abfangen k nnen Sie n tzliche Informationen ber den genauen Fehler erhal ten Das folgende Beispiel versucht Daten aus einer nicht existierenden Tabelle auszulesen begin result conn query SELECT FROM musiker rescue Mysql Error gt e puts Fehlernummer e errno Fehlercode puts Fehlermeldung e error Meldungstext puts SOL Zustand e sqlstate Fehler nach SQL Standard end Sie erhalten folgende Ausgabe Fehlernummer 1146 Fehlermeldung Table musi
76. Math tan Zahl sind die trigonometrischen Funktionen Sinus Kosinus und Tangens Beachten Sie dass die Winkel im Bogen ma angegeben werden m ssen Da 360 Winkelma im Bogenma 27 entspre chen k nnen Sie eine Grad Angabe in das Bogenma umrechnen indem Sie sie durch 180 teilen und mit m multiplizieren Einen einigerma en genauen N he rungswert der Kreiszahl liefert die eingebaute Konstante Math PI Die folgenden Beispiele berechnen den Sinus von 90 und den Kosinus von 0 gt gt Math sin 90 180 Math PI gt 0 0 gt gt Math cos 0 gt 1 0 gt gt Math PI gt 3 14159265358979 Variablen Ausdr cke und Operationen 65 String Methoden Auch zur Bearbeitung von Strings gibt es eine Reihe von Methoden einige von ihnen wurden bereits in Beispielen eingesetzt Die Methode String length gibt etwa die L nge des Strings in Zeichen zur ck gt gt Hallo Welt length gt 10 gt gt length gt 0 Andere Methoden besch ftigen sich mit dem Inhalt eines Strings Hier einige im berblick e String upcase wandelt alle enthaltenen Buchstaben in Gro buchstaben um gt gt Hallo Welt upcase gt HALLO WELT e String downcase macht dagegen alle Buchstaben zu Kleinbuchstaben gt gt Hallo Welt downcase gt hallo welt e String swapcase kehrt die Gro und Kleinschreibung jedes Buchstaben um gt gt Hallo Welt swapcase gt hALLO wELT e String reverse dreht den ga
77. Methode undefined method pots for main Object Wenn Sie pots durch die korrekte Schreibweise puts ersetzen erhalten Sie jedoch diese Fehlermeldung Anderer Fehler wrong number of arguments 0 for 1 Die spezielle Variable enth lt jeweils den Text der offiziellen Fehlermeldung Wenn Sie derartigen Code in eine Klasse einbauen k nnen sogar A diejenigen Arten von Fehlern um die Sie sich nicht selbst k mmern m chten oder k nnen k nnen Sie als letzte Anweisung vor ensure beziehungsweise end ein raise hinzuf gen Es reicht alle anderen Fehlerarten nach au en weiter das hei t an die Stelle wo eine Instanz der Klasse verwendet wird Um in Ihren Klassen eigene Arten von Fehlern zu erzeugen erweitern Sie einfach Exception den Urahn aller Fehlerklassen oder gegebenenfalls eine speziellere Klasse die besser passt Eine Meldung die in bernommen wird k nnen Sie 210 Kapitel 4 Eigene Klassen und Objekte erstellen einbauen indem Sie eine to_s Methode schreiben Ausgeworfen wird Ihre Excep tion mit raise Betrachten Sie beispielsweise die folgende Ableitung der Klasse Lok die keine belie bigen maximalen Waggonzahlen mehr akzeptiert sondern nur noch die offiziellen Loktypen Andernfalls erzeugt sie bei der Instanziierung eine Illegalelok Excep tion die zuvor definiert wird Einen benutzerdefinierten Fehler definieren class Illegalelok lt Exception Die Fehlermeldung festlegen def to_s Dieser L
78. Methode anhaengen erwartet genau ein Argument n mlich die Anzahl anzuh n gender Waggons Diese wird in der Parametervariablen waggons gespeichert Inner halb der Methode ist eine Parametervariable eine gew hnliche lokale Variable die in Ausdr cken verwendet und deren Wert auch ge ndert werden kann anhaengen berpr ft zuerst ob die vorhandenen Lokomotiven die neue Gesamtzahl von Waggons ziehen k nnten Wenn das der Fall ist wird die Instanzvariable wag gons um den bergabewert waggons erh ht Um der Au enwelt mitzuteilen dass das Anh ngen erfolgreich war enth lt die n chste Zeile das Literal true Die zuletzt ausgef hrte Zeile einer Methode liefert n mlich den so genannten R ckgabewert der Funktion der sich von au en abfragen l sst Im else Fall es w ren zu viele Waggons wird die Anzahl dagegen nicht ver ndert und der R ckgabewert ist false Beim sp teren Aufruf der Methode k nnen Sie den R ckgabewert ermitteln m s sen es aber nicht unbedingt die Methode erledigt in beiden F llen ihre Aufgabe Der globale Code des G terzug Beispiels enth lt beide Varianten Ohne Beruecksichtigung des Rueckgabewerts zug anhaengen 50 Aufruf im Rahmen eines Ausdrucks if Bedingung zur Nutzung des Rueckgabewerts if zug anhaengen 50 puts 50 weitere Waggons angehaengt else puts Konnte keine 50 Waggons mehr anhaengen end Parameter Wie bereits mehrfach erw hnt kann der Methodenkopf eine oder m
79. Module Tabelle 6 1 Die wichtigsten Apache Module im berblick Modul Bedeutung mitgeliefert aktiviert od_alias Um und Weiterleitung ja ja od_auth_basic Klartextbasierte Benutzeranmeldung Authentifi ja ja zierung od_auth_digest Verschl sselte Authentifizierung ja nein od_authn file Anmeldedaten aus Textdateien ja ja od_authn_dbm Anmeldedaten aus datenbank hnlichen DBM ja nein Dateien od_authz_host Host basierte Zugriffskontrolle Order Allow Deny ja ja siehe unten od_autoindex Automatisch erstellter Verzeichnisindex ja ja od_cgi CGl Skripten klassische Webserver Anwendun ja ja gen od_dir Definition der Indexseite ja ja od_log_config Protokollierung Logdateien ja ja od_mime Zuweisungen von Dateityp Zeichensatz und Spra ja ja che od negotiation Content Negotiation MIME Varianten je nach Cli ja ja ent Vorgabe od_perl In Apache integrierter Perl Interpreter nein od_ruby In Apache integrierter Ruby Interpreter siehe nein unten od_ssl Verschl sselte Verbindungen https jab nein a Bis Apache 2 0 lautete der Name dieses Moduls mod_access b Inder offiziellen Bin rversion f r Windows wird mod_ss1 nicht mitgeliefert Lesen Sie http buecher lin goworld de apache2 mod_ssl html f r Bezugsquellen und eine Installationsanleitung Eine weitere interessante Neuerung von Apache 2 gegen ber der alten Version 1 3 ist die Einf hrung der so genannten Multi Processing Module MPM Wie Sie aus dem v
80. Modus zu versetzen so dass er jederzeit sende und u empfangsbereit ist Dies geht allerdings ber den Themenkreis dieses Kapitels hinaus konsultieren Sie dazu die in Anhang B empfohlenen Quellen Praxisbeispiel ECHO Server und Client Um das Zusammenspiel zwischen TCP Server und Client zu verdeutlichen wird hier ein kleiner Server und der zugeh rige Client pr sentiert Es handelt sich um einen ECHO Server der die an ihn gesendeten Daten einfach zur cksendet Dieser Dienst verwendet traditionell den TCP und UDP Port 7 und kann eingesetzt wer den um die grunds tzliche Verf gbarkeit von Netzwerkverbindungen zu testen Die hier vorgestellte ECHO Version wurde allerdings leicht erweitert das Ergebnis ist ein echtes kleines Anwendungsprotokoll das zus tzlich zur blo en Textr ckgabe auf vier Administrationskommandos des Clients reagiert e MODE NORMAL versetzt den Server in den Standardmodus in dem der Text der Client Anfrage originalgetreu zur ckgesendet wird e MODE_REVERSE stellt den Reverse Modus ein Ab sofort wird der Inhalt der Cli ent Anfrage r ckw rts zur ckgesendet 234 Kapitel 5 Netzwerkanwendungen e MODE_ROT13 beantwortet alle k nftigen Anfragen mit der ROT13 Codierung des Anfragetextes e EXIT fordert den Server auf sich zu beenden Es ist wichtig dass Sie ein solches Kommando zum Beenden in einen TCP Server mit accept Schleife einbauen weil er sonst nur von au en mittels kill UNIX oder ber de
81. Moduswechsel den ein Client bermittelt ab sofort f r alle Clients gilt e Zeile 39 46 Wenn keiner der speziellen Befehle empfangen wurde kann der Inhalt der Client Anfrage als einfacher Text f r die ECHO Verarbeitung inter pretiert werden Eine verschachtelte case when Struktur erzeugt die zum aktuel len Modus passende Antwort die jeweilige Vorgehensweise entspricht dem objektorientierten Textmanipulierer aus Kapitel 2 und 4 e Zeile 52 Nachdem die accept Schleife per break verlassen wurde wird der Ser ver Socket geschlossen Dies geschieht am Skriptende zwar ohnehin automa tisch aber da Sie das Skript jederzeit verl ngern k nnten sollten Sie unben tigte Ressourcen der Ordnung halber stets schlie en In Beispiel 5 2 sehen Sie den Code des entsprechenden Clients Anschlie end folgt die bliche stufenweise Erl uterung und danach wird die Zusammenarbeit der bei den Komponenten im praktischen Einsatz gezeigt Beispiel 5 2 Der TCP ECHO Client echoclient rb 1 require socket 2 Host und Port von der Kommandozeile lesen 3 oder auf localhost und 7 setzen 4 if ARGV o 5 host ARGV o 6 else 7 host localhost 8 end 9 if ARGV 1 10 port ARGV 1 to i 11 else 12 port 7 13 end 14 Konfiguration ausgeben 15 printf Server s Port d n n host port 16 Zunaechst Endlosschleife 17 loop do 18 print Text 19 Text von STDIN lesen Zeilenumbruch entfernen 20 text STDIN gets chom
82. Peter Fa M ller An Peter Fa M ller y Von Anna Fa Schmitz Von Anna Fa Schmitz Postversand Absenderin Anna Empf nger Peter Abbildung 5 1 Ablauf der Kommunikation im einfachen Schichtenmodell Briefversand 220 Kapitel 5 Netzwerkanwendungen Der Klassiker unter den Schichtenmodellen das so genannte OSI Referenzmodell besitzt sieben Schichten Es wurde vor allem im Hinblick auf die Vergleichbarkeit v llig unterschiedlicher Netzwerkarten entworfen In einer Infrastruktur in der ausschlie lich die Internetprotokolle zum Einsatz kommen ist es irrelevant und wird daher hier nicht weiter behandelt F r das Internet gibt es ein eigenes Schichtenmodell mit nur vier Schichten 1 Auf der Netzzugangsschicht arbeitet die Netzwerkhardware Dort wird gekl rt wie die zu bertragenden Daten beschaffen sind wer wann senden darf und so weiter 2 Die Internetschicht k mmert sich zum einen um die eindeutige Adressierung jedes einzelnen Rechners und zum anderen um die Weiterleitung von Daten zwischen verschiedenen Teilnetzen Routing Die Bezeichnung ist brigens lter als das Internet sie besagt dass diese Schicht die Kommunikation zwi schen mehreren Netzen erm glicht 3 Die Host zu Host Transportschicht zerlegt die Daten in kleinere Einheiten Datenpakete Sie sorgt daf r dass sie auf dem Zielrechner wieder korrekt zusammengesetzt und an das richtige Programm ausgeliefert werden Der Begriff Host Englisch f
83. QUIT 27 Server Antwort empfangen 28 antwort conn gets 29 Antwort ausgeben 30 puts Antwort antwort 31 end Prozesseund Threads 265 Mit Threads arbeiten Seit ein paar Jahren unterst tzen immer mehr Betriebssysteme Programmierspra chen und Bibliotheken eine leichtgewichtige Alternative zu Prozessen die so genannten Threads Innerhalb ein und desselben Prozesses k nnen mehrere Threads ausgef hrt werden und auch zwischen ihnen wird automatisch hin und hergewechselt Ruby besitzt eine v llig eigenst ndige Thread Implementierung die nicht von den F higkeiten des Betriebssystems abh ngt Damit k nnen Sie nebenl ufige Anwen dungen schreiben die auf jedem beliebigen System funktionieren sowohl auf Windows Rechnern auf denen fork nicht zur Verf gung steht als auch auf der UNIKX Plattform wo sich systemeigene Threads erst nach und nach durchsetzen Thread Grundlagen Um Code in einem separaten Thread auszuf hren m ssen Sie eine Instanz der Klasse Thread erzeugen Der Konstruktor ben tigt einen Block mit den Anweisun gen die in diesem Thread laufen sollen Im folgenden Beispiel durchsucht ein sepa rater Thread ein Array mit Zufallszahlen nach einem bestimmten Wert hier 13 w hrend das Hauptprogramm oder der Haupt Thread eine Schleife mit 10 001 Durchg ngen ausf hrt und alle durch 1 000 teilbaren Werte ausgibt Suchergebnis ausgeben def suchergebnis index wert puts wert gefunden an
84. Ruby Rechner im Einsatz Was die einzelnen Anweisungen des Skripts tun soll an dieser Stelle noch nicht im Detail erkl rt werden Hier erhalten Sie lediglich einige kurze Hinweise Beachten Sie auch die Zeilen die mit beginnen es handelt sich dabei um Kommentare die von Ruby selbst ignoriert werden und lediglich Ihrer eigenen Orientierung dienen Nach Ausgabe der berschrift Zeile 2 bis 4 l uft der eigentliche Rechner in einer Endlosschleife wird also immer wieder ausgef hrt Dazu dient der folgende Block Zeile 6 bis 47 loop do end Innerhalb der Schleife werden zun chst die beiden Zahlen vom Benutzer erfragt Zeile 7 bis 14 Das Eingabeergebnis gets wird mit to_f sofort in eine Flie komma zahl umgewandelt und dann in z1 beziehungsweise z2 abgelegt Beim eingegebenen Operator wird dagegen mittels chomp der Zeilenumbruch abgeschnitten In Zeile 19 bis 29 erfolgen zwei Tests Wenn der Operator keines der vier zul ssigen Zeichen oder ist Zeile 19 wird eine Fehlermeldung ausgegeben anschlie end wird mittels next Zeile 22 der n chste Schleifendurchgang gestartet Als N chstes wird f r den Fall dass die Operation eine Division ist die unzul ssige 0 als zweiter Operand ausgeschlossen Das Ergebnis wird in Zeile 31 bis 40 mit Hilfe einer case when Struktur berechnet Die when F lle pr fen nacheinander verschiedene Einzelwerte und f hren die Ope ration f r den passenden Fall durch In Zeile 42 wird
85. Schleife die mit beinahe identischer Syntax auch in vielen anderen Programmiersprachen verf gbar ist hat folgende Syntax while Bedingung Anweisung en end Genau wie bei einer if Fallentscheidung wird zuerst eine Bedingung gepr ft Trifft diese zu werden die nachfolgenden Anweisungen bis zum end ausgef hrt Danach wird die Bedingung allerdings erneut gepr ft und solange englisch while sie zutrifft werden die verschachtelten Anweisungen immer wieder ausgef hrt Das folgende Beispiel fragt nach einer Eingabe solange diese noch nicht j oder n lautet wahl while wahl j amp amp wahl n print Moechten Sie noch mal j n wahl gets chomp downcase end Kontrollstrukturen 79 Ausf hrungsbeispiel Moechten Sie noch mal j n a Moechten Sie noch mal j n b Moechten Sie noch mal j n n Auf dieselbe Weise k nnen Sie sich beispielsweise auch die Quadrate der Zahlen 1 bis 10 anzeigen lassen le a while i lt 10 puts i 2 i 2 i 1 end Die Ausgabe sieht erwartungsgem so aus Ausschnitt 1 2 1 N Fa 3 2 9 10 2 100 Schleifen k nnen beliebig tief ineinander verschachtelt werden Um aus den Zahlen von 1 bis 100 alle Primzahlen herauszusuchen brauchen Sie bereits zwei verschach telte Schleifen eine f r die Zahlen selbst und eine f r ihre potenziellen Teiler Das hier verwendete Verfahren ist ziemlich langsam und daher keinesfalls zu empfehlen Bei der
86. Sie zum Schluss ebenfalls im Befehlsmodus wq Enter zum Speichern und Beenden ein oder q Enter wenn Sie vi m beenden m chten ohne zu spei chern Den Emacs starten Sie mit emacs Dateiname 5 Ab Werk enth lt TextPad keine Syntaxdefinition f r Ruby Sie k nnen sie aber von http www textpad com add ons synn2t html herunterladen 18 Kapitel 1 Einf hrung auf der Kommandozeile Unterschiedliche Modi wie bei vi gibt es hier nicht die unz hligen Befehle Optionen und Hilfsprogramme werden mit Strg oder Alt Tas tenkombinationen aufgerufen Beachten Sie die speziellen Konventionen der Emacs Dokumentation Strg Taste wird darin als C Taste bezeichnet Alt Taste als M Taste Beispiele C d also Strg D l scht das Zeichen unter dem Cursor w hrend M f also Alt F ein Wort weiterspringt Die Hilfe in der Sie die Beschrei bung aller Befehle finden erreichen Sie entsprechend mit C h Um die aktuelle Datei zu speichern k nnen Sie C x C s eingeben mit C x C c beenden Sie Emacs Beachten Sie dass Versionen von Vim und Emacs auch f r Windows verf gbar sind Sie finden sie auf den jeweiligen Projekt Websites http www vim org beziehungs weise http www gnu org software emacs emacs html Eine etwas ausf hrlichere Ein f hrung in die Arbeit mit beiden Editoren finden Sie beispielsweise unter http www galileocomputing de openbook kit itkomp04002 htm in der kostenlos zug nglichen Online Ausg
87. Text ENDMARKE gt Text nText n Die ENDMARKE Bezeichnung traditionell aber nicht zwingend erforderlich kom plett in Gro buchstaben muss ganz am linken Rand einer eigenen Zeile stehen Falls es die letzte Zeile Ihres Skripts sein sollte ist es unabdingbar dass Sie dahinter noch einen Zeilenumbruch einf gen denn nur dieser macht die Markierung zur vollwertigen Zeile Der gesamte Text zwischen den Markierungen wird als String betrachtet die Auswertung von Escape Sequenzen und die Variablensubstitution erfolgen wie bei Strings in doppelten Anf hrungszeichen Zus tzlich wird auch jeder Zeilenumbruch innerhalb des HIER Dokuments in den String bernommen Spezialliterale Neben den bereits behandelten Zahlen und Strings kennt Ruby noch einige beson dere Literale f r spezielle Aufgaben Ihre Bedeutung wird nach und nach im Kon text klar hier werden sie zun chst nur kurz aufgez hlt e Die Wahrheitswerte true und false sind die Ergebnisse von Vergleichen und anderen logischen Operationen Wenn ein Vergleich zutrifft hat er das Ergeb nis true andernfalls false Sogar das k nnen Sie in irb ausprobieren gt gt 3 gt true gt gt 3x lt 3 gt false als false w hrend jeder von O verschiedene Wert true ist Das ist in Ruby nicht so auch Nullwerte haben im Kontext der Logik den Wert true false existiert tats chlich nur als Ergebnis einer unzutref fenden Vergleichsoperation NS In den meisten Program
88. Umgangssprache manchmal vernachl ssigten Unterschied zwischen dual arith metisches Zweiersystem und bin r beliebige Codierung mit Hilfe von zwei verschiedenen Symbolen meist 0 und 1 Variablen Ausdr cke und Operationen 41 zeichen gekennzeichnet Grunds tzlich k nnen einfache oder doppelte Anf h rungszeichen verwendet werden G ltige Strings sind also beispielsweise Hallo oder Welt Die einfachen Strings in Ruby enthalten nur Zeichen mit je 8 Bit A Eine Zeichensatzinformation steht nicht zur Verf gung Die Folge P Umlaute und andere sprachliche Sonderzeichen werden oft falsch dargestellt Die Konsolen Anwendungen in den ersten Kapiteln die ses Buchs behelfen sich daher mit einer einfachen Umschreibung etwa Koeln statt K ln Wenn es in sp teren Kapiteln um Web anwendungen geht erfahren Sie wie Webserver dem Browser Zei chensatzinformationen bermitteln k nnen Die beiden Arten von Anf hrungszeichen haben Auswirkungen auf die Inhalte der Strings Bei Strings in doppelten Anf hrungszeichen werden diverse Elemente auf spezielle Weise interpretiert wenn Sie einfache Anf hrungszeichen benutzen ge schieht dies dagegen so gut wie gar nicht Die beiden Arten von speziellen Inhalten die bei der Verwendung doppelter Anf hrungszeichen ausgewertet werden sind e Escape Sequenzen Einige Zeichen denen Sie einen Backslash voranstellen haben eine besondere Bedeutung Wichtige Beispiele sind
89. Variablen zugewiesen Diese Variable wird zu einer Referenz einem Verweis auf das Objekt die notwendig ist um danach weiter mit dem Objekt arbeiten zu k nnen Wenn Sie n mlich einfach File new Dateipfad Modus schreiben wird die Datei zwar ebenfalls ge ffnet und ist ein Ruby Objekt aber die ses befindet sich dann an einer unbekannten Stelle im Arbeitsspeicher RAM des Rechners und kann nicht eingesetzt werden Der Aufruf erwartet zwei bis drei Argumente Der Dateipfad gibt in Form eines Strings an wo sich die zu ffnende Datei befindet Der Pfad kann entweder absolut oder aber relativ zum Verzeichnis des Skripts selbst angegeben werden Der Aufbau von Pfaden wurde bereits in Kapitel 1 beschrieben Ein absoluter Pfad k nnte unter Windows zum Beispiel C Rubyskripten test txt lauten unter UNIX dagegen home username rubyskripten test txt Bei Skripten zur allgemeineren Verwendung sollten aber eher relative Pfade gew hlt werden ein Beispiel w re test txt f r die gleichnamige Datei im aktuellen Verzeichnis e Der Modus gibt an f r welche Operation die Datei ge ffnet werden soll Im einfachsten Fall handelt es sich um einen String mit einem der Werte r read f r Lesen w write f r Schreiben und a append f r Anh ngen an die bestehende Datei Es gibt noch eine andere Syntax die den Modus mit Hilfe einiger Integer Konstanten genauer beschreibt zum Beispiel die Frage ob die Datei neu erstellt werden so
90. Zahlen und Flie kommazahlen e String Literale also durch Anf hrungszeichen gekennzeichnete Textbl cke e Symbole eindeutige garantiert voneinander verschiedene Objekte ohne spezi fischen Wert e Spezialliterale wie true false oder nil Numerische Literale Computer bew ltigen heutzutage immer mehr nichtmathematische Aufgaben Den noch lassen sich diese hinter den Kulissen nat rlich immer auf teils sehr komplexe Berechnungen zur ckf hren Daher sind Zahlen einer der wichtigsten Bestand teile von Computerprogrammen Sie werden f r arithmetische Berechnungen ver wendet aber beispielsweise auch zur Darstellung von Bildschirmpositionen Farben Datum und Uhrzeit Ordnungskriterien oder hnlichen Angaben Da der Prozessor selbst zwischen Ganzzahlen und Flie kommazahlen unterschei det bietet auch so gut wie jede Programmiersprache diese beiden Zahlenarten an Es gibt also einen internen Unterschied zwischen Zahlen wie beispielsweise 4 oder 4 4 Es geht um die Art und Weise wie diese Zahlen gespeichert werden und wie damit gerechnet wird Ganzzahloperationen gehen schneller und effizienter von statten als Flie kommaberechnungen Wann immer keine Nachkommastellen ben tigt werden bietet sich daher die Verwendung ganzer Zahlen an Ganze Zahlen Integer sind intuitiv alle Zahlen ohne Nachkommastellen das hei t die Reihe 23 2 1 0 E W hrend diese Reihe in der Mathematik in beide Richtungen unendlich weit fo
91. attr_reader breite hoehe Konstruktor 194 Kapitel 4 Eigene Klassen und Objekte erstellen def initialize b h breite b hoehe h end Methoden get_breite und get_hoehe entfallen Die restlichen Methoden an die Ruby Namenskonventionen anpassen def flaeche breite hoehe end def diagonale Math sqrt breite 2 hoehe 2 end end In Klassen die dieses n tzliche Hilfsmittel verwenden sollten Sie generell auf die Bezeichnung get verzichten um die Namen ver ffentlichter Attribute und durch Methoden berechneter Werte zu vereinheitlichen Im vorliegenden Beispiel wurden get_flaeche und get_diagonale daher in flaeche beziehungsweise diagonale umbe nannt Die neue Klasse k nnen Sie beispielsweise folgenderma en verwenden rechteck EasyRechteck new 20 30 printf Breite 3f n rechteck b printf Hoehe 3f n rechteck h printf Flaeche 3f n rechteck flaeche printf Diagonale 3f n rechteck diagonale Das liefert folgende Ausgabe Breite 20 000 Hoehe 30 000 Flaeche 600 000 Diagonale 36 056 Analog lassen sich brigens auch Setter Methoden ersetzen also Methoden die den Wert eines bestimmten Attributs ndern Dazu wird entsprechend die Anweisung attr_writer verwendet anschlie end k nnen die freigeschalteten Attribute per ein facher Wertzuweisung mit ge ndert werden Probieren Sie die folgende Ableitung von EasyRechteck aus bei der Breite und H he nacht
92. auch einige n tzliche Standard module die Sie importieren k nnen Eines der praktischsten ist Comparable Wenn Sie es importieren und in der Methode lt gt die Ordnung von Objekten Ihrer Klasse festlegen stehen auf einen Schlag s mtliche Vergleichsoperatoren wie lt und gt zur Verf gung Das folgende Beispiel erweitert eine Ableitung der Klasse Lok aus dem Einf hrungsbeispiel um eine solche Vergleichsm glichkeit wobei nat rlich die Anzahl der m glichen Waggons als Kriterium dient class Besserelok lt Lok Das Modul Comparable importieren include Comparable Die Methode lt gt zur Verfuegung stellen def lt gt anderelok typ lt gt anderelok get_kapazitaet end end Auch das k nnen Sie nun testen gt gt BessereLok new Lok STROM gt BessereLok new Lok DAMPF gt true gt gt BessereLok new Lok STROM gt Besserelok new Lok DIESEL gt false Exceptions In objektorientierten Programmen mit ihren ineinander verschachtelten Klassen und Objekthierarchien ist es n tzlich wenn sich Programmfehler bis zu ihrem Ursprung zur ckverfolgen lassen Daf r steht in Ruby wie in verschiedenen ande ren Sprachen das System der Exceptions Ausnahmen zur Verf gung Sie k nnen solche speziellen Fehler in Ihren Klassen sowohl ausl sen als auch abfangen Hier zun chst ein einfaches Beispiel f r das Abfangen einer Exception Eine Datei soll zum Lesen ge ffnet werden anschlie end wird
93. beispielsweise sehr n tzlich die in Kapitel 2 besprochene Vorgehensweise zum Runden von Flie kommazahlen gleich in die Klasse Float einzubauen Das funktioniert eigentlich sehr einfach Als zus tz liche Anforderung soll die Methode aber nach wie vor round hei en und die neue Funktionalit t nur dann besitzen wenn eine Nachkommastellenanzahl angegeben wird Hilfreich ist daf r die Ruby Standardmethode alias die es Ihnen erm glicht einer bestehenden Methode einen Ersatznamen zuzuweisen und den bisherigen Namen anderweitig zu verwenden Die Syntax lautet alias NeuerMethodenname AlterMethodenname Hier zun chst der vollst ndige Code der Float Erweiterung nebst einigen Testf llen Erl uterungen folgen Aenderungen in der Standardklasse Float class Float Traditionelle Round Methode umbenennen alias oldround round Neue angepasste Round Methode def round stellen 0 if stellen Bisherige Methode aufrufen bei 0 Nachkommastellen self oldround else Auf die gewuenschte Anzahl Stellen runden self 10 stellen oldround to_f 10 stellen end 186 Kapitel 4 Eigene Klassen und Objekte erstellen end end puts 4 44444 round puts 4 99999 round puts 4 44444 round 2 puts 4 99999 round 2 puts 4444 444444 round 2 Wenn Sie das Skript ausf hren erhalten Sie folgende Ausgabe AUA 44 5 4400 0 Was passiert in diesem Programm Zun chst findet eine Erweiterung der Klasse Float statt so dass de
94. besonders sicher und kann jeweils nur eine einzige Rails Anwendung hosten Auf der Website zum Buch finden Sie verschiedene Apache Beispielkonfigurationen 354 Kapitel 7 Ruby on Rails Zusammenfassung Dies war nur ein kleiner Vorgeschmack des Leistungsumfangs von Ruby on Rails Aber einige wichtige Punkte d rften klar geworden sein e Intelligente Skripten helfen Ihnen dabei immer wieder ben tigten Code der verschiedenen Grundger ste Anwendung MVC Komponenten und so weiter automatisch zu erstellen e Sie brauchen keine SQL Abfragen mehr in Ihre Webanwendungen einzubet ten Active Record k mmert sich vollautomatisch um die Umsetzung der Datenbanktabellen in Ruby Klassen und umgekehrt Zahlreiche praktische Methoden von denen Sie die allerwichtigsten kennengelernt haben ersetzen datenbankabh ngiges SQL durch neutrale anwendungsnahe Ruby Anweisun gen e Die Trennung in Model View und Controller erm glicht Ihnen eine saubere Aufgabentrennung Sie k nnen die zu pr sentierenden Daten die Steuerlogik und die Ansicht Ihrer Site v llig unabh ngig voneinander ndern Im Grunde macht der Einsatz von Rails Content Management berfl ssig beziehungsweise beinhaltet es bereits Nichtsdestotrotz werden bereits diverse CMS angeboten die wiederum auf dem Framework aufbauen Das Konzept von Ruby on Rails ist so erfolgreich dass Entwickler inzwischen ver suchen hnliche Frameworks f r andere Programmiersprachen
95. bestimmte Anweisungen f r alle Elemente einer Menge durchf hrt Mit hnlich praktischer Syntax gibt es Iteratoren sonst nur noch in der Programmiersprache Smalltalk einem leider nicht allzu verbreiteten Klassiker der Objektorientierung Alle Iteratoren besitzen die folgende grunds tzliche Syntax Menge Methode Anweisung en Die alternative Schreibweise lautet Menge Methode do Anweisung en end Die Menge ist irgendeine Aufz hlung mit mehreren Elementen normalerweise ein Bereich wie 1 10 oder ein Array Der Bereich zwischen den geschweiften Klam mern beziehungsweise zwischen do und end wird als Block bezeichnet Die Methode ist der eigentliche Iterator und kann sowohl eine Ruby Standardmethode als auch eine selbst geschriebene Methode siehe n chstes Kapitel sein Voraussetzung ist nur dass sie keinen einzelnen Wert sondern einen Block als Parameter akzeptiert Die einfachste derartige Methode ist each Wie der Name schon sagt f hrt sie die Anweisungen im Block einfach f r jedes Element der Menge aus Das folgende zugegeben recht sinnfreie Beispiel gibt zehnmal Hallo aus 1 10 each puts Hallo 15 Die geschweiften Klammern die Sie in Ruby seltener brauchen als in vielen anderen Sprachen werden auf einem PC mit Alt Gr 7 bzw Alt Gr 0 erzeugt IteratorenundBl cke 101 Das ist aber erst die halbe Wahrheit ber Iteratoren und Bl cke Der besondere Clou besteht darin dass die Werte
96. das auf diese Weise berech nete Ergebnis ausgegeben 26 Kapitel 2 Sprachgrundlagen Zeile 42 bis 46 k mmern sich um die Frage ob der Benutzer eine weitere Berech nung w nscht Wenn seine Antwort mit n beginnt wird die Schleife mit break ver lassen Zeile 46 Da nach dem end in Zeile 47 keine weitere Anweisung folgt ist damit auch das gesamte Programm beendet In Tabelle 2 1 sehen Sie noch einmal die wichtigsten Codezeilen des Taschenrech ner Beispiels Daneben k nnen Sie nachlesen in welchem Abschnitt dieses Kapitels oder gegebenenfalls in welchem anderen Kapitel das jeweilige Thema vertieft wird Tabelle 2 1 Ruby Sprachelemente im Taschenrechner Beispiel und in diesem Buch Skriptzeilen Code Thema Seite 1 Veberschrift Kommentare 33 2 4 puts Ruby Rechner Einfache Ausgabe 114 puts puts 6 40 loop do Endlosschleifen 81 end 10 z1 gets to_f Einfache Eingabe 114 Methoden zur Typumwandlung 70 17 op gets chomp String Methoden 66 19 23 if op I E H if elsif else und unless 73 an Mustervergleiche mit regul ren Ausdr 85 cken 25 if op amp amp z2 Vergleichsoperationen 52 Logische Operationen 55 31 40 case op case when Fallentscheidungen 76 end 42 puts Ergebnis z1 Arithmetische Operationen 51 op z2 ergebnis Ein Textmanipulierer Wie bereits einige Male erw hnt wurde ist Ruby eine objektorientierte Program miersprache Die theoretischen Grundlage
97. davon ab Es handelt sich um eine leicht zu erlernende m chtige Sprache in der so genannte Abfragen formuliert werden Damit k nnen Sie Tabellen erstellen ndern und vor allem Informationen daraus erhalten Selbstverst ndlich w rde eine syste matische Einf hrung in MySQL in diesem Kapitel zu weit f hren Hier finden Sie nur ein kurzes Beispiel das Sie direkt eintippen k nnen wenn Sie den oben erw hnten mysql Client starten gt mysql u root p Passwort eingeben Das Beispiel erstellt die Datenbank musik mit zwei Tabellen interpreten mit den Feldern int_nr und int_name sowie cds mit den Feldern cd_nr cd_interpret cd_titel cd_jahr und cd_songs Anzahl der Songs Geben Sie dazu Folgendes ein mysql gt CREATE DATABASE musik Query OK 1 row affected 0 24 sec mysql gt use musik Database changed mysql gt CREATE TABLE interpreten gt int_nr INT AUTO_INCREMENT PRIMARY KEY int name VARCHAR 40 Query OK O rows affected 0 28 sec mysql gt CREATE TABLE cds cd_nr INT AUTO_INCREMENT PRIMARY KEY gt cd_interpret INT cd_titel VARCHAR 40 cd_jahr YEAR gt cd_songs INT Query OK O rows affected 0 07 sec 318 Kapitel 6 Klassische Webanwendungen Wie Sie sehen besitzt jedes Feld einen festgelegten Datentyp Hier werden INT Ganzzahl VARCHAR n Text mit einer L nge von maximal n Zeichen und YEAR Jahreszahl verwendet int_nr beziehungsweise cd_nr sind die Prim rschl ssel PRIMARY KEY der be
98. der jeweiligen Methoden anzeigen lassen Beispiel gt ri String Zusammenfassung Nach den geradlinigen Sprachgrundlagen aus Kapitel 2 haben Sie in diesem Kapitel auch den vollst ndig objektorientierten Ansatz der Sprache Ruby kennen gelernt zumindest den passiven das hei t den Einsatz vorhandener Klassen Im ersten Hauptabschnitt drehte sich alles um die Ein und Ausgabe Die grundle genden Methoden wurden zun chst am Beispiel der Konsole vorgestellt Wichtig ist in diesem Zusammenhang dass Sie die drei Standard I O Kan le STDIN STDOUT und STDERR kennen Auf diese k nnen Sie Eingabemethoden wie gets und read beziehungsweise Ausgabemethoden wie print puts und printf anwenden Die Methode printf besitzt eine praktische Syntax zur String Formatierung mehrerer Ausdr cke die Methode sprintf stellt dieselbe Syntax f r String Ausdr cke zur Verf gung 150 Kapitel 3 Ruby Klassen Nach der ausf hrlichen Erl uterung der Konsolen O haben Sie festgestellt wie leicht sich das Erlernte auf Dateien bertragen l sst Dabei kommt nur die spezifi sche Syntax von File new beziehungsweise File open hinzu Achten Sie jeweils auf den richtigen Modus Lesen Schreiben Anh ngen usw sowie darauf dass Sie Dateien nach Gebrauch mittels datei close wieder schlie en sollten Zum Durchsuchen von Verzeichnissen gibt es eine eigene Klasse namens Dir Ihre Methode read liest jeweils den n chsten Verzeichniseintrag Mit Hilfe von stat
99. des ECHO Servers oberstes Fenster mit zwei Clients Web Clients mit Net HTTP Wenn es darum geht Clients f r Internet Standardprotokolle zu schreiben brau chen Sie sich in der Regel nicht die M he zu machen sie auf der Basis von TCPSocket manuell zu implementieren Ruby enth lt n mlich bereits ab Werk Bibliotheken f r den Zugriff auf die wichtigsten dieser Dienste Sie befinden sich im Unterverzeich nis net der Ruby Standardbibliothek und werden daher als net Bibliothek eingebun den w hrend die entsprechenden Klassen Net Protokoll hei en Als Beispiel wird hier der Einsatz von Net HTTP f r den Zugriff auf Webserver erl utert andere wich tige Bibliotheken sind Net FTP Net SMTP E Mail Versand oder Net Telnet Ter minal Emulation Web Clients mit Net HTTP 241 Net HTTP Grundlagen Um Net HTTP zu verwenden m ssen Sie die Bibliothek zun chst importieren require net http Danach k nnen Sie eine Net HTTP Instanz erzeugen und mit ihrer Hilfe eine Ver bindung zu einem Webserver herstellen Zum Beispiel webclient Net HTTP new buecher lingoworld de Als optionales zweites Argument k nnen Sie eine Portnummer angeben standard m ig wie bei Webservern blich 80 Die neue Client Instanz webclient besitzt unter anderem verschiedene Methoden die den diversen HTTP Anfragemethoden entsprechen unter anderem get post und head Einzelheiten finden Sie im n chsten Kapitel Die wichtig
100. die angegebene Position setzen e file rewind Dateizeiger zur cksetzen e file sort Alle Zeilen auslesen und in ein Array sortieren e file close Datei schlie en Siehe auch IO Fixnum Ganze Zahl Siehe Integer Float Flie kommazahl Instanzmethoden e float round auf ganze Zahl runden e float ceil n chsth here Ganzzahl e float floor Nachkommastellen abschneiden e float to_i Synomym f r float floor Hash Liste aus Schl ssel Wert Paaren Konstruktoraufrufe e hash Hash new leeres Hash e Implizit hash Schluesseli gt Werti Instanzmethoden e hash Schluessel Zugriff auf einzelnes Element e hash has_key Schluessel true wenn Schl ssel existiert ansonsten false Klassenreferenz 365 hash size Anzahl der Paare hash invert Schl ssel und Werte vertauschen Datenverlust bei vormals gleichen Werten e hash each Iterator ber jeden Schl ssel und jeden Wert einzeln wie Array Elemente e hash each_ key Iterator ber alle Schl ssel e hash each value Iterator ber alle Werte e hash each_ pair Iterator ber alle Paare Integer Ganzzahl gemeinsame Elternklasse von Fixnum und Bignum Instanzmethoden 10 int succ Nachfolger int chr Zeichen mit dem entsprechenden Code int times Iterator der int mal ausgef hrt wird 0 bis int 1 int upto int2 Iterator von int bis int2 aufst
101. die im Block befindlichen Anweisungen unver ndert ausf hrt und zwar mit einer zuf lligen Anzahl von Durchl ufen zwi schen 1 und 10 def zufaellig_oft rand 10 1 times yield end Hier ein Praxistest zur Vorweihnachtszeit gt gt zufaellig_ oft print Ho Ho Ho Ho Ho Ho gt 5 gt gt zufaellig_ oft print Ho Ho gt 1 gt gt zufaellig_ oft print Ho Ho Ho Ho Ho Ho Ho gt 6 176 Kapitel 4 Eigene Klassen und Objekte erstellen Eine solche Methode kann auch normale Parameter entgegennehmen Hier eine Variante von zufaellig_oft die statt der 10 ein Argument als H chstwert f r rand verwendet def zufaellig_oft n rand n 1 times yield end Diese ge nderte Version wird dann etwa wie folgt verwendet gt gt zufaellig_oft 3 print Ho Ho Ho Ho gt 3 gt gt zufaellig_oft 3 print Ho Ho Ho gt 2 Wenn Sie yield mit Argumenten aufrufen werden diese an den Block bergeben und k nnen mit Hilfe des bekannten Konstrukts Variable zu Beginn des Blocks in Empfang genommen werden Das folgende beraus n tzliche Beispiel erweitert die Standardklasse Array um einen Iterator namens search Grunds tzli ches zur Erweiterung von Standardklassen lesen Sie im Abschnitt Globale Metho den und neue Methoden f r Standardklassen auf Seite 184 Er durchsucht das Array nach einem Wert der als konventioneller Parameter angegeben wird und lie
102. die zueinander in Bezie hung Relation gesetzt werden k nnen Dies sorgt daf r dass Daten niemals dop pelt in der Datenbank gespeichert werden m ssen Denken Sie zum Beispiel an eine CD Datenbank Eine Tabelle enth lt Informationen ber die einzelnen CDs wie Interpret Titel Spielzeit und so weiter Da mehrere CDs vom selben Interpreten stammen k nnen empfiehlt es sich die Interpreten in einer separaten Tabelle zu speichern Der Eintrag Interpret in der CD Tabelle ist dann lediglich die Nummer des entsprechenden Interpreten aus der Interpreten Tabelle F r die Arbeit mit relationalen Datenbanken sollten Sie einige Begriffe kennen Eine Tabellenzelle die eine Information ber einen einzelnen Gegenstand enth lt hei t Datenfeld Eine Zeile mit s mtlichen Informationen ber einen Gegenstand wird Datensatz genannt englisch Record Wenn Sie aus einer Tabelle heraus auf Daten s tze einer anderen Tabelle verweisen m chten ben tigen diese Datens tze je ein Feld mit einem einmaligen Wert Dieses spezielle Feld hei t Prim rschl ssel pri mary key Der Prim rschl ssel wird oft durch einfaches Durchnummerieren gebil det Einige Objekte besitzen dagegen eine Art nat rlichen Prim rschl ssel Bei Autos ist dies etwa das amtliche Kennzeichen bei B chern dagegen die ISBN Fast alle relationalen Datenbanken k nnen ber eine Sprache namens SQL Struc tured Query Language gesteuert werden MySQL leitet sogar seinen Namen
103. eine durch Kommata getrennte Liste von Variablen angeben wenn Sie dahinter genauso viele Werte angeben Zum Beispiel gt gt a b c 1 2 3 a 1 gt gt b 2 c 3 Daraus ergibt sich unter anderem dass Sie die Werte zweier Variablen in einem Schritt vertauschen k nnen Das folgende Beispiel vertauscht die Werte von zahl1 und zahl2 gt gt zahli zahl2 zahl2 zahli In fast jeder anderen Programmiersprache brauchen Sie f r diese Aufgabe eine Hilfsvariable und drei Anweisungen Nat rlich funktioniert dieser umst ndlichere Weg auch in Ruby wenn Sie das unbedingt wollen gt gt helper zahli gt gt zahl1 zahl2 gt gt zahl2 helper Konstanten Wenn Sie einen Bezeichner w hlen der ausschlie lich aus Gro buchstaben und gegebenenfalls Ziffern besteht wird keine Variable definiert sondern eine Kon stante Diese ist global g ltig und beh lt ihren einmal festgelegten Wert im gesam ten Skript bei Ein praktisches Beispiel w re etwa ein Umrechnungsfaktor f r W hrungen Hier ein sehr kurzes Beispielskript DM 1 95583 euro100 100 DM puts 100 Euro sind euro100 DM dm100 100 DM puts 100 DM sind dm100 Euro Das liefert die folgende Ausgabe 100 Euro sind 195 583 DM 100 DM sind 51 1291881196219 Euro Arrays F r die automatisierte Verarbeitung gr erer Datenmengen ist es sehr n tzlich dass es spezielle Variablen gibt in denen sich Gruppen von Werten speichern lassen
104. eine praxisorientierte Ein f hrung in die Arbeit mit diesem u erst komfortablen Web Framework e Anhang A Ruby Kurzreferenz enth lt eine Kurz bersicht der wichtigsten Ruby Anweisungen und Klassen e Anhang B Ressourcen und Tools schlie lich empfiehlt einige B cher zum Wei terlernen sowie zu angrenzenden Themen Daneben erhalten Sie die Adressen diverser wichtiger Websites zum Thema Typografische Konventionen In diesem Buch werden folgende typografische Konventionen verwendet Kursivschrift Wird f r Datei und Verzeichnisnamen E Mail Adressen und URLs f r Schalt fl chenbeschriftungen und Men s sowie bei der Definition neuer Fachbegriffe und f r Hervorhebungen verwendet Nichtproportionalschrift Wird f r Codebeispiele und Variablen Funktionen Befehlsoptionen Parameter Klassennamen und HTML Tags verwendet Nichtproportionalschrift fett Bezeichnet Benutzereingaben auf der Kommandozeile Nichtproportionalschrift kursiv Kennzeichnet innerhalb von Codebeispielen Platzhalter die Sie durch Ihre eigenen spezifischen Angaben ersetzen m ssen Fett Wird f r Tastenk rzel und Shortcuts eingesetzt XII Vorwort Die Gl hbirne kennzeichnet einen Tipp oder einen generellen Hin weis mit n tzlichen Zusatzinformationen zum Thema dem Sie Vorsicht walten lassen sollten Fr Der Regenschirm kennzeichnet eine Warnung oder ein Thema bei i V a x In K sten mit einem Mikroskop wird ein Thema ge
105. einige merkw rdige Vor gehensweisen und Beschr nkungen leichter verstehen Klassische Webanwendungen werden ber die CGl Schnittstelle abgewickelt Sobald sie angefordert werden startet der Webserver einen neuen Prozess und f hrt darin das CGlI Programm aus Bei einer Skriptsprache wie Ruby wird sogar zun chst der Interpreter gestartet F r kleine bis mittlere Websites ist das ausrei chend w hrend Sie f r gr ere eine schnellere Integrationstechnik wie mod_ruby einsetzen sollten 330 Kapitel 6 Klassische Webanwendungen In diesem Kapitel wurde zuerst beschrieben wie Sie den Apache Webserver instal lieren und konfigurieren k nnen Er bildet das Herzst ck der meisten weltweiten Websites und ist daher praxiserprobt stabil und sicher Als Open Source Projekt ist er zudem kostenlos und ohne Einschr nkungen verwendbar Der Hauptteil dieses Kapitels erl uterte die CGI Programmierung in Ruby Zun chst wurde alles v llig zu Fu durchgef hrt um Ihnen die Grundlagen n her zubringen Danach haben Sie ausf hrlich die Arbeit mit der praktischen Bibliothek cgi rb kennengelernt Neben den CGI Standardaufgaben Formulardaten auslesen und HTML generieren bietet sie die Erweiterungen Cookies und Session Manage ment die ebenfalls erl utert wurden Zu guter Letzt wurde beschrieben wie Sie MySQL einrichten und per Ruby darauf zugreifen k nnen Fast jede Webanwendung greift heutzutage n mlich auf eine Datenbank zu um gr
106. erl uterten Mitteln weiter unten lernen Sie verschiedene Verk rzungen kennen ox 0 9A Fa f 0 9A Fa f Die allgemeinste aller Zeichengruppen schlie lich ist ein einfacher Punkt Dieser steht f r genau ein beliebiges Zeichen Der folgende Ausdruck passt etwa auf Ball Bill und Bell aber auch auf vollkommen sinnlose Zeichenfolgen wie Bx11 BG11 B311 oder B 11 B 11 Quantifizierer Die bisher gezeigten Optionen machen regul re Ausdr cke noch nicht sonderlich interessant N tzlicher werden sie erst durch weitere Features Beispielsweise k n nen Sie durch so genannte Quantifizierer englisch quantifiers genau angeben wie oft bestimmte Zeichen Zeichenmengen und beliebige Teilausdr cke im String vor kommen sollen oder d rfen Der einfachste Quantifizierer ist ein Fragezeichen Wenn Sie es hinter ein Ele ment setzen darf dieses Element an der entsprechenden Stelle einmal oder auch keinmal vorkommen Das folgende Beispiel passt auf die String Variable str wenn darin entweder eis oder es aber beispielsweise nicht ens vorkommt weil das i wortw rtlich in Frage gestellt wird str ei s Beachten Sie dass ei s etwas v llig anderes ist als e i s i steht f r genau ein Zeichen das kein i ist w hrend i das Zeichen i y oder gar kein Zeichen repr sentiert So passt ei s wie gesagt auf eis und es w hrend e i s beispielsweise auf ems ens oder ess zutrifft
107. falls vorhanden automatisch aufgerufen e turn Zeile 21 bis 23 dreht den Text mit Hilfe der Ruby Methode reverse herum und liefert das Ergebnis zur ck e hide vowels Zeile 25 bis 27 verwendet den sogenannten regul ren Ausdruck Suchmuster aeiou der auf alle Vokale im Text passt und ersetzt diese durch Sternchen Auch hier wird das Endergebnis zur ckgeliefert e rot13 Zeile 29 bis 31 wendet den sogenannten C sar Code auf den Text an Jeder Buchstabe wird um 13 Zeichen verschoben da das Alphabet 26 Buchsta ben besitzt sind die Vorg nge der Codierung und Decodierung identisch Der zweite Teil ausschlie lich Zeile 34 ist die Erzeugung eines konkreten ModText Objekts mit Textinhalt mtext ModText new Hallo meine liebe Welt Das ruft automatisch die Methode initialize auf und speichert den bergebenen Text dauerhaft in der Variablen txt des neuen Objekts mtext Im dritten Teil ab Zeile 36 werden schlie lich die verschiedenen Methoden des Objekts aufgerufen au er setText zum Wechseln des Inhalts dienen sie alle dem Auslesen des meist manipulierten Textinhalts von mtext Die Anweisung printf ersetzt die im Text enthaltenen Platzhalter brigens der Reihe nach durch die nachfolgenden Werte s steht dabei f r einen Textwert String Auch f r den Textmanipulierer finden Sie in Tabelle 2 2 wieder eine Auflistung der Themen diese beziehen sich wie vermerkt fast alle auf Kapitel 3 und 4 30 K
108. geht h ufig auftretende Pro bleme zu l sen es besteht die Hoffnung dass Sie das Rad nicht neu zu erfinden brauchen weil sich bereits jemand darum gek mmert und seine Erfahrungen in einem Musterkatalog abgelegt hat Wenn Sie die Arbeit mit Design Patterns erler nen m chten sollten Sie sich das hervorragende Buch Entwurfsmuster von Kopf bis Fu O Reilly Verlag besorgen Dort wird das Thema gr ndlich und beraus unter haltsam pr sentiert tected zu vermitteln denn Methoden mit dieser Geheimhaltungs u stufe sind f r beliebige Instanzen der eigenen Klasse und abgeleiteter Instanzen sichtbar Sie sind also immer dann sinnvoll wenn inner halb einer Klassendefinition auf eine Instanzmethode einer anderen Instanz derselben Klasse zugegriffen werden muss ohne dass die restliche ffentlichkeit das auch d rfte A Ein wenig schwieriger sind Funktionsweise und Bedeutung von pro Module und Mixins Wenn Sie eine rein statische Funktionalit t unter einem gemeinsamen Dach zusam menfassen m chten steht es Ihnen frei eine Klasse mit Konstanten und Klassenme thoden zu definieren Allerdings k nnte jemand auf die Idee kommen nutzlose Instanzen von dieser Klasse zu bilden oder Kindklassen von ihr abzuleiten Deshalb 7 Das kann man allen die objektorientiert programmieren nur empfehlen weil es jede Menge Arbeit spart Weitere objektorientierte Konstrukte 205 bietet Ruby auch ein offizielles Hilfsmittel f
109. glich neue Freunde aus aller Welt Viele von ihnen stel len ihre Entwicklungen wieder der Allgemeinheit zur Verf gung und so gibt es f r beinahe jede Spezialaufgabe eine oder auch mehrere gute L sungen Wenn Sie erst ber die Grundlagen hinaus sind k nnen auch Sie vielleicht die Ruby Gemein schaft bereichern indem Sie Ihre eigenen Skripten ffentlich verf gbar machen Im Anhang finden Sie die Adressen einiger Websites und Mailinglisten wo jede Hilfe willkommen ist Dieses Buch beantwortet bei jedem Thema die Frage nach dem konkreten Nutzen und liefert praxisnahe Beispiele Es versucht dabei self contained zu sein das hei t die behandelten Themen weitgehend ohne Referenzen auf externe Quellen abzudecken So erhalten Sie nebenher allerhand n tzliches Zusatzwissen zum Bei spiel ber TCP IP Netzwerke Web und Datenbankserver oder die CGI Schnitt X Vorwort stelle Solches Wissen brauchen Programmierer heutzutage dringend denn immer mehr Software wird nicht f r einen einzelnen Rechner sondern f r komplexe ver teilte Systeme geschrieben Falls Sie ber ein Thema bereits Bescheid wissen steht es Ihnen nat rlich frei die betreffenden Abschnitte zu berbl ttern Auf der Website zum Buch bei O Reilly http www oreilly de catalog rubybasger sowie auf meiner eigenen Site http buecher lingoworld de ruby k nnen Sie alle Listings herunterladen und erhalten nach und nach wichtige Zusatzinformationen Bedenken Si
110. gt lt head gt lt title gt Die Hallo Seite lt title gt lt meta http equiv Content type content text html charset iso 8859 1 gt lt head gt lt body gt lt h1 gt Planeten begr amp uuml amp szlig en lt h1 gt lt p gt Seite erzeugt um lt zeit gt lt p gt lt p gt lt grusstext gt lt p gt lt body gt lt html gt Wie Sie sehen werden die beiden Instanzvariablen aus dem Controller mittels lt gt in den HTML Code eingebunden Damit ist Ihre erste kleine Rails Anwendung komplett Starten Sie sie wie gehabt mit Hilfe der Anweisung gt ruby script server ffnen Sie danach einen Browser Die neue View steht unter http localhost 3000 hello zur Verf gung In Abbildung 7 3 sehen Sie die Ausgabe des Beispiels Da es keine Interaktivit t enth lt k nnen Sie den Server an dieser Stelle wieder beenden 340 Kapitel 7 Ruby on Rails gt Die Hallo Seite Mozilla Firefox Datei Bearbeiten Ansicht Chronik Lesezeichen Extras Hilfe E ih O httpiocalhost 3000 helo Erste Schritte Q Aktuelle Nachrichten Planeten begr en Seite erzeugt um Thu Dec 28 14 56 40 0100 2006 Hallo Welt Hallo Mars Hallo Jupiter Hallo Saturn Tag Welt Tag Mars Tag Jupiter Tag Saturn Hi Welt Hi Mars Hi Jupiter Hi Satum Moin Welt Moin Mars Moin Jupiter Moin Saturn Fertig Abbild
111. halt Wenn Sie diese Klasse unabh ngig ausprobieren m chten k nnen Sie das folgende kurze Skript wraptest rb verwenden das eine auf der Kommandozeile angegebene Datei nach dem beschriebenen Schema anzeigt require wrappager rb if ARGV 0 STDERR puts Verwendung 0 Datei exit 1 end filename ARGV O file File new filename r text file read file close wp WrapPager new wp to_page text Anregung Schreiben Sie eine erweiterte Fassung von wrappager rb in der sich die maximalen Zeilen und Spaltenanzahlen als Parameter angeben lassen Nachdem die gut formatierte Anzeige funktioniert wird es Zeit f r den eigentlichen Textbrowser In Beispiel 5 4 sehen Sie zun chst den gesamten Quellcode Beispiel 5 4 Der Ruby Textbrowser httpclient rb 1 require net http 2 require wrappager rb 3 URL in Host Port und Ressource zerlegen 4 def parse_url url 5 if url match r 6 host 1 7 uri 2 8 end 9 Gegebenenfalls Host und Portnummer trennen 10 if host 11 host port host split 12 port port to i 13 else 14 port 80 15 end 16 Alle drei Komponenten zurueckgeben 17 host port uri 18 end Web Clients mit Net HTTP 247 Beispiel 5 4 Der Ruby Textbrowser hitpclient rb Fortsetzung 19 Einen WrapPager erzeugen 20 wrappager WrapPager new 21 Hash zur Umsetzung wichtiger Entity Referenzen 22 entities Anbsp gt amp lt
112. html f r HTML Dokumente oder image jpeg f r JPEG Bilder bedeutet dass der Client alle Arten von Dokumenten annimmt was noch lange nicht hei t dass er sie auch darstellen kann e Accept Language listet die ISO K rzel der bevorzugten Sprachen des Clients auf Webserver wie Apache beherrschen eine Technik namens Content Negoti 284 Kapitel 6 Klassische Webanwendungen ation die die Accept Header auswertet und Dokumente in der bevorzugten Sprache dem bevorzugten Dateityp oder dem gew nschten Zeichensatz an Clients ausliefern kann Im Beispiel werden Deutsch und US Englisch in die ser Reihenfolge gew nscht e Accept Encoding gibt an dass der Browser komprimierte Ressourcen verarbei ten kann und listet die einzelnen Kompressionsformate auf Der Browser im Beispiel versteht GNU Zip gzip und ZIP deflate e User Agent ist die Selbstidentifikation des Clients hier handelt es sich um den Browser Firefox 2 0 unter Windows XP e Host ist der wichtigste Anfrage Header in HTTP 1 1 ist er vorgeschrieben Auf einem Serverrechner k nnen mehrere Websites mit eigenen Domainnamen lie gen die als virtuelle Hosts bezeichnet werden Damit der Server wei welche Site angefordert wird ben tigt er diesen Header e Connection gibt an ob die Verbindung zwischen Client und Server bestehen bleiben soll Keep Alive oder geschlossen wird close Das Offenhalten der Verbindung erm glicht das schnellere Nachladen verkn pfter
113. in die an geeigneter Stelle Ruby Anweisungen und Ausdr cke eingef gt werden k nnen Diese greifen auf die vom Controller bereitgestellten Methoden zur ck e Der Controller Steuerung bildet die programmierte Verbindung zwischen Model und View Er enth lt beispielsweise Methoden zum Durchsuchen und zur Filterung der Daten aus dem Model Umgekehrt nimmt er die Befehle aus den Steuerelementen der Benutzeroberfl che entgegen und setzt sie als nde rungen im Datenbestand des Models um Kleinere MVC Anwendungen kom men mitunter auch fast oder ganz ohne persistentes Model aus und wickeln die gesamte Anwendungslogik im Controller ab das w rde etwa f r eine Rails Umsetzung s mtlicher CGI Beispiele aus dem vorigen Kapitel bis auf das letzte datenbankbasierte Beispiel gelten In Abbildung 7 1 wird das Zusammenwirken der drei Komponenten noch einmal schematisch dargestellt Dabei m ssen Sie sich vor Augen f hren dass es sich bei Rails um eine verteilte Anwendung handelt Model und Controller sind Server Komponenten die auf demselben oder auf getrennten Rechnern ausgef hrt werden k nnen w hrend die View zwar serverseitig erzeugt aber letztendlich im Browser des Benutzers angezeigt wird der umgekehrt auch die Steuerbefehle bermittelt Au erdem sollten Sie verstehen dass die Interaktion zwischen Model und View im Prinzip stets indirekt ber die Methoden des Controllers durchgef hrt wird Zus tzlich zur Verwirklichung von
114. ist 1 Die Ausgabe lautet hallo was ist 1 PUNB Eine prominente Ruby Standardmethode die sich diesen Mechanismus zunutze macht ist printf Sie nimmt genau einen Formatstring und beliebig viele optionale Ausdr cke entgegen Hier sehen Sie ein weiteres Beispiel es berechnet die Summe aller numerischen Elemente eines Arrays def summe args s 0 args each z s z to f s end 172 Kapitel 4 Eigene Klassen und Objekte erstellen Probieren Sie es aus Beispielsweise ergibt puts summe 2 4 6 8 die Ausgabe 20 0 Eine weitere interessante Parameter L sung besteht darin nur eine einzige Parame tervariable entgegenzunehmen die als Hash behandelt wird vorzugsweise mit Sym bolen als Schl ssel Auf diese Weise k nnen Sie leicht benannte Parameter nach dem Schema parameter gt Wert verwenden Beispielsweise k nnten Sie den Konstruktor von Gueterzug so umschreiben dass er im bergebenen Hash nach den Schl sseln zug0 zug1 und waggons sucht und andernfalls Standardwerte verwendet class Gueterzug Grundzustand def initialize hash Erst einmal Standardwerte setzen dann gegebenenfalls ueberschreiben loko Lok OHNE lok1 Lok OHNE waggons 0 Argument nur auswerten falls Hash if hash class Hash if hash 1oko loko hash 1oko end if hash lok1 lok1 hash lok end if hash waggons waggons hash waggons end end Instanzvariablen initialisier
115. ist knapper und weniger komplex als etwa XML Die automatisch erstellte Version der Konfigurationsdatei sieht so aus die Kom mentare wurden entfernt development adapter mysql database rock_n roll development username root password host localhost test adapter mysql database rock_n roll test username root password host localhost production adapter mysql database rock_n roll production username root password host localhost Wie Sie sehen ist ein gro er Teil der Arbeit bereits getan Sogar der Datenbank Adapter mysql ist bereits eingestellt da er die Standardvorgabe f r Rails ist Ersetzen Sie den username root jeweils durch rock_user und f gen Sie das Passwort rockon rails hinzu Sie erhalten folgende Zeilen development adapter mysql database rock_n roll development username rock_user password rockonrails host localhost test adapter mysql database rock_n roll test username rock_user password rockonrails host localhost production adapter mysql database rock_n roll production 3 Ein solches Verfahren wird als Serialisierung oder Marshaling bezeichnet Es wird eingesetzt wenn komplexe Datenstrukturen seriell bertragen zum Beispiel durch Netzwerke oder in relationalen Datenbanken gespeichert werden sollen Realistische Anwendung Eine Online Rock n Roll Datenbank 345 username rock_user password rockonrails host localhost Nachdem Sie die ge nderte Datei ge
116. ist optional Gerade bei der Pr fung von Benutzereingaben die besonders h ufig mit case when erfolgt sollten Sie ihn aber verwenden um unzul s sige Werte abzufangen Das folgende Beispiel fragt zuerst nach einer L ngenangabe in Metern Danach erwartet es die Eingabe des Anfangsbuchstaben oder der offiziellen Abk rzung einer Ma einheit in die umgerechnet werden soll Falls ein unzul ssiger Buchstabe eingegeben wird erfolgt eine Fehlermeldung ber den else Teil print Laenge in Metern laenge gets to_f print Umrechnen in M illimeter C entimeter K ilometer einheit gets downcase case einheit when m mm puts laenge m laenge 1000 mm when c cm puts laenge m laenge 100 cm when k km puts laenge m laenge 1000 km else puts Ungueltige Masseinheit end Speichern Sie das Skript und probieren Sie verschiedene F lle aus gt ruby umrechnung rb Laenge in Metern 726 Umrechnen in M illimeter C entimeter K ilometer c 726 0m 72600 0cm gt ruby umrechnung rb Laenge in Metern 726 Umrechnen in M illimeter C entimeter K ilometer k 726 0m 0 726km gt ruby umrechnung rb Laenge in Metern 726 Umrechnen in M illimeter C entimeter K ilometer d Ungueltige Masseinheit Logische Operatoren als Fallentscheidungen Im Abschnitt ber logische Operationen wurde bereits erw hnt dass Sie diese manchmal auch als praktischen Ersatz f r Fallentsch
117. jedem weiteren Durchgang werden neue Inhalte an das Ende der Datei angeh ngt Geben Sie zum Testen zun chst das folgende kleine Skript ein und speichern Sie es als log rb log File new log txt a log puts Time new if ARGV 0 log printf Eingabe s n ARGV O end log puts log close 128 Kapitel 3 Ruby Klassen Was dieses Skript tut d rfte relativ offensichtlich sein Es ffnet die Datei log txt zum Anh ngen und schreibt Datum und Uhrzeit hinein siehe den n chsten Abschnitt Falls das erste Kommandozeilenargument existiert wird es ebenfalls hinzugef gt und zum Schluss folgt eine Trennlinie F hren Sie das Programm zun chst mehrmals mit wechselnden Kommandozeilenargumenten aus Zum Bei spiel gt ruby log rb Test des Log Skripts gt ruby log rb Noch ein Test gt ruby log rb Der letzte Test Schauen Sie sich danach den Inhalt von log txt an er sollte beispielsweise so ausse hen Tue Nov 07 21 42 53 0100 2006 Eingabe Test des Log Skripts Tue Nov 07 21 43 00 0100 2006 Eingabe Noch ein Test Tue Nov 07 21 43 06 0100 2006 Eingabe Der letzte Test Wie im Zusammenhang mit der Konsoleneingabe bereits beschrieben wurde k n nen Sie Lese Methoden wie gets als Bedingung einer while Schleife verwenden um die Zeilen bis zum Dateiende einzulesen Das folgende kleine Beispielskript liest die gerade angelegte Textdatei log txt ein und gibt jede ihrer Zeilen aus Ergeb
118. jeder nderung auf einen Compiler warten Fehlermeldungen beziehen sich ebenfalls direkt auf ihren Code so dass Sie Fehler leichter beheben k nnen Ruby besitzt eine klare und gut verst ndliche Sprachsyntax mit wenigen Ausnah men und Sonderregeln Der Sprachentwurf folgt dem sogenannten Principle of Least Surprise auf Deutsch Prinzip der geringsten berraschung Die Sprache sollte sich also f r einigerma en erfahrene Programmierer in der Regel so verhalten wie erwartet Das liegt unter anderem daran dass die Objektorientierung in Ruby absolut konsequent durchgehalten wird Es w rde zu weit f hren an dieser Stelle n her darauf einzugehen lassen Sie sich auf den nachfolgenden Seiten einfach Schritt f r Schritt von der Eleganz und Leistungsf higkeit der Ruby Syntax bezau bern Bereits im n chsten Kapitel werden Sie Ihre ersten n tzlichen Programme schreiben der Einstieg gestaltet sich bei Ruby wesentlich leichter als bei vielen anderen Sprachen Ruby installieren Bevor Sie mit Ruby arbeiten k nnen m ssen Sie den Interpreter und die zugeh ri gen Werkzeuge und Bibliotheken auf Ihrem Rechner installieren Dieser Abschnitt beschreibt wie Sie das unter Windows sowie auf Linux und anderen Unix Syste men erledigen k nnen Installation unter Windows Als Windows Benutzer sind Sie bei der Ruby Installation klar im Vorteil F r Sie gibt es ein komplettes Installer Paket das hei t eine einzige Datei die Sie per Dop pelkl
119. kann man danach erheblich leichter arbeiten 254 Kapitel 5 Netzwerkanwendungen Zeile 110 117 Nachdem der Dokumentinhalt verarbeitet wurde wird die Linkliste zeilenweise nummeriert und an den Body angef gt Vielleicht fragen Sie sich warum sie nicht einfach ausgegeben wird Das liegt daran dass sie mit dem Body zusammen Teil der seitenweisen Ausgabe sein soll Zeile 119 Der fertig verarbeitete Body samt eventueller Linkliste wird an den WrapPager bergeben der ihn nach dem weiter oben erl uterten Verfahren sei tenweise ausgibt Der Benutzer kann entweder Enter dr cken um die jeweils n chste Seite zu lesen oder Q Enter eingeben um die Ausgabe vorzeitig abzu brechen Zeile 121 125 Nach dem Ende der Ausgabe wird eine neue Eingabeaufforde rung angezeigt Falls Links vorhanden sind wird nach einer Linknummer oder einer neuen URL gefragt andernfalls nur nach einer URL Zeile 127 131 Wenn beim Laden und bei der Verarbeitung der Webseite irgendein schwerwiegender Fehler auftritt etwa wenn der angesprochene Host nicht erreichbar ist werden automatisch diese Anweisungen ausge f hrt Der User erf hrt den Inhalt der Fehlermeldung und wird nach einer neuen URL gefragt Zeile 133 135 Schleife zur Eingabe einer neuen URL oder einer Linknummer Zeile 137 Falls die Eingabe q lautete wird die Hauptschleife verlassen Damit ist das Programm beendet Zeile 138 152 Wenn es sich bei der Eingabe um eine Linkn
120. loks loknr get_typ 75 end Objektorientierte Programmierung Eine praktische Einf hrung 159 Beispiel 4 2 Der objektorientierte G terzug zug_oo rb Fortsetzung 76 Informationen ueber den Zug ausgeben 77 def info 78 printf Lokomotive 1 s n lokinfo 0 79 printf Lokomotive 2 s n lokinfo 1 80 printf Waggonkapazitaet d n loks o get_kapazitaet loks 1 get_kapazitaet 81 printf Aktuelle Waggonzahl d n waggons 82 end 8 end 84 Globaler Code einen Zug testen 8 Neuen Zug erzeugen 86 zug Gueterzug new Lok STROM Lok DIESEL 87 Informationen ueber den Grundzustand 88 zug info 89 puts 90 50 Waggons anhaengen 91 zug anhaengen 50 92 zug info 93 puts 94 Versuchen weitere 50 Waggons anzuhaengen 95 if zug anhaengen 50 96 puts 50 weitere Waggons angehaengt 97 else 98 puts Konnte keine 50 Waggons mehr anhaengen 99 end 100 puts 101 Lok 2 entfernen 102 zug lok_aendern 1 Lok OHNE 103 zug info 104 puts 105 Waggonanzahl testen 106 printf Zug kann nicht fahren d Waggons zu viel n zug waggontest In den einzelnen Teilen des objektorientierten G terzug Skripts geschieht Folgen des e Zeile 2 33 Definition der Klasse Lok deren Objekte Informationen ber eine einzelne Lokomotive speichern k nnen e Zeile 4 7 Da die Typ und Kapazit tskonstanten nur Lokomotiven betreffen ist es sinnvoll sie nun innerhalb der Klasse Lok zu definieren
121. n f r einen Zeilen umbruch oder t f r einen Tabulator Auch wenn Sie das Anf hrungszeichen oder den Backslash selbst als Zeichen ben tigen kommen entsprechende Escape Sequenzen zum Einsatz wird in umgewandelt in Geben Sie in irb zum Beispiel Folgendes ein um Escape Sequenzen zu testen gt gt puts Text tmit Tab nHier tNoch ein Tab Text mit Tab Hier Noch ein Tab gt nil Das in k nftigen Beispielen weggelassene Ergebnis gt nil in der letzten Zeile bedeutet brigens dass der verwendete Ausgabebefehl puts keinen Wert zur ckgibt das weiter unten besprochene Literal nil steht f r leer oder nichts Falls Sie in irb dagegen nur den String selbst eingeben erhal ten Sie ihn mitsamt Anf hrungszeichen und codierten Escape Sequenzen zur ck gt gt Text tmit Tab nHier tNoch ein Tab gt Text tmit Tab nHier tNoch ein Tab Zum korrekten Testen von Strings m ssen Sie daher stets einfache Ausgabebe fehle verwenden diese werden im n chsten Kapitel ausf hrlicher behandelt e Eingebettete Ausdr cke Wenn Sie innerhalb eines Strings in doppelten Anf h rungszeichen eine Sequenz in geschweifte Klammern einschlie en und dieser eine Raute voranstellen wird der Inhalt der Klammern als eingebet teter Ausdruck betrachtet und vor der Verwendung des Strings ausgewertet 42 Kapitel 2 Sprachgrundlagen Der Ausdruck kann dabei beliebig komplex sein und einen Wert nahezu belie
122. ohne Block die Position des ersten Treffers wenn ein Block vorhanden ist erf llt sie dagegen ihre bisherige Aufgabe class Array def search wert pos 0 count 0 self each w if w wert Block vorhanden if block_given Verfahren wie bisher count 1 yield pos else Einfach erste Fundstelle liefern return pos end end pos 1 count end end Rufen Sie diese neue Variante nun einmal mit und einmal ohne Block auf um den Unterschied zu testen Mit dem obigen Beispiel Array s he dies beispielsweise so aus gt gt a search hallo gt 2 gt gt a search hallo pos puts Fundstelle pos Fundstelle 2 178 Kapitel 4 Eigene Klassen und Objekte erstellen Fundstelle 4 Fundstelle 6 gt 3 Anregung Schreiben Sie eine zus tzliche Array Erweiterungsmethode namens reg_ search die nach demselben Schema keine festen Werte sondern regul re Ausdr cke sucht Klassenmethoden Die Methoden die in den bisherigen Beispielen innerhalb von Klassen definiert wurden waren Instanzmethoden Diese existieren nur und k nnen nur aufgerufen werden wenn Sie zuvor eine Instanz der entsprechenden Klasse erzeugen Im vori gen Kapitel haben Sie dagegen auch Methoden wie File exists kennengelernt die ohne Existenz einer Instanz als Bestandteil der Klasse selbst aufgerufen werden Sol che Methoden hei en deshalb Klassenmethoden Klassenmethoden sind immer dann n tzlich wenn eine Aufgabe durch
123. positive dagegen gr er als 1 Die Mantisse wird stets auf eine Stelle vor dem Komma normalisiert das hei t 1 Mantisse lt Basis Dadurch hat die erste Stelle f r die Basis 2 immer den Wert 1 Das machen sich die Flie kommadarstellungen der meisten Rechner zunutze indem sie sich das Bit zum Speichern der festen 1 sparen und stattdessen die Genauigkeit Nachkommastellen der Mantisse um dieses Bit verbessern Konkret bildet das h chste Bit das Vorzeichen der Mantisse Darauf folgt die gr te Bitgruppe die den Nachkomma Betrag der normalisierten Mantisse darstellt Das n chste Bit ist das Vorzeichen des Exponenten und die restlichen Bits stehen f r dessen Betrag M gliche Exponenten reichen in Ruby von 1023 bis 1023 Das k nnen Sie in irb ausprobieren steht dabei f r die Potenz gt gt 1 0 2 1023 gt 1 1125369292536e 308 gt gt 1 0 2 1023 gt 8 98846567431158e 307 brigens k nnen Sie auch in Ruby Skripten die wissenschaftliche Schreibweise ver wenden allerdings nur die bliche dezimale Dabei werden Mantisse und Exponent durch den Buchstaben E getrennt 3 5E9 3 10 9 3500000000 0 2 0E 7 3 10 1 0 0000002 Strings Eine weitere wichtige F higkeit von Computerprogrammen und eine besondere St rke von Ruby ist der Umgang mit Text Textdaten werden in so genannten Zeichenketten oder String Literalen gespeichert Diese werden durch Anf hrungs 8 Beachten Sie den in der
124. r diese Aufgabe Module Ein Modul hnelt einer Klasse au er dass es weder instanziiert noch vererbt werden kann Eines der bekanntesten Module aus dem Lieferumfang von Ruby ist Math siehe Kapitel 2 Das folgende Modul implementiert eine Konstante und zwei Klassenmethoden zum Umrechnen von DM in Euro und umgekehrt n tzlich f r die kurz vor Weihnach ten noch immer beliebten Zahl mit DM Aktionen des Einzelhandels module Waehrung DM 1 95583 def Waehrung dm in_euro dm dm DM end def Waehrung euro_in dm euro euro DM end end Importieren Sie die Datei mit dem Modul waehrung rb in irb und probieren Sie es aus gt gt require waehrung rb gt true gt gt Waehrung DM gt 1 95583 gt gt Waehrung dm_in_euro 7 gt 3 57904316837353 gt gt Waehrung euro_in dm 9 gt 17 60247 Ein n tzlicher Nebeneffekt von Modulen ist dass sie einen Namensraum definieren das Voranstellen des Modulnamens erm glicht allgemeine Methoden die den gleichen Namen tragen aber unterschiedliche Aufgaben erf llen Hier ein plakati ves Beispiel das mit der Doppeldeutigkeit des Wortes Platz spielt module Hund def Hund platz name puts name hat sich hingelegt end end module Tuete def Tuete platz puts Peng end end Hund platz Bello Tuete platz 206 Kapitel4 Eigene Klassen und Objekte erstellen Das liefert die Ausgabe Bello hat sich hingelegt Peng Hintergrun
125. testen ffnen Sie dazu drei Ter minalfenster und navigieren Sie jeweils in das Verzeichnis in dem sich die Anwen dung befindet Starten Sie im ersten Terminal den Server mit einem beliebigen verf gbaren Port Zum Beispiel gt ruby echoserver rb 7007 ECHO Server listening on port 7007 Wechseln Sie in das zweite Terminalfenster und starten Sie darin den Client mit dem Hostnamen localhost und derselben Portnummer oder einfach ohne Parame ter wenn der Server auf Port 7 lauscht gt ruby echoclient rb localhost 7007 Server localhost Port 7007 Starten Sie im dritten Fenster ebenfalls den Client mit denselben Host und Port Daten Wenn Sie Zugriff auf einen weiteren Rechner im lokalen Netz haben der Ruby enth lt k nnen Sie den Client dorthin kopieren und ebenfalls starten Beach ten Sie nur dass der Server Hostname auf einem entfernten Client nat rlich nicht localhost lautet Stattdessen m ssen Sie die IP Adresse des Servers eingeben in manchen LANs sind auch Hostnamen definiert gt ruby echoclient rb 192 168 0 10 7007 Server 192 168 0 10 Port 7007 Geben Sie nun in jeden Client einen beliebigen Text ein Wie Sie sehen wird er im Server Fenster protokolliert und unver ndert an den jeweiligen Client zur ckgesen det Probieren Sie als N chstes die drei Befehle MODE_REVERSE MODE_ROT13 und MODE _ NORMAL aus Sie werden wie oben beschrieben sehen dass die nderung stets alle Clients betrifft Beenden Si
126. unz hlige Java und XML Tools Die aktuelle Apache Version ist 2 2 die vorherigen Versionen 2 0 und 1 3 sind aber noch immer weitverbreitet und es gibt noch regelm ige Bugfixes daf r Wenn Sie eine Neuinstallation von Apache planen sollten Sie allerdings auf jeden Fall die neueste Version w hlen Sie k nnen die passende Apache Distribution den Bin r Installer f r Windows oder das Quellcode Paket f r UNIX unter http httpd apache org herunterladen Apache ist modular aufgebaut Viele Funktionen sind also kein unverzichtbarer Bestandteil des Webservers sondern k nnen je nach Bedarf hinzugef gt oder ent fernt werden Das inzwischen bevorzugt eingesetzte Verfahren seit Version 2 0 besteht sogar darin die gew nschten Module nicht ein f r alle Mal in Apache einzu kompilieren sondern sie als DSO Dateien Dynamic Shared Objects zu laden Somit m ssen Sie nur noch einen bestimmten Eintrag zur Webserver Konfigurationsdatei hinzuf gen und Apache neu starten um das entsprechende Modul einzubinden 274 Kapitel 6 Klassische Webanwendungen Neben den zahlreichen mitgelieferten Modulen gibt es auch noch Unmengen von Drittanbieter Modulen Viele von ihnen sind auf der Site http modules apache org registriert F r Ruby Programmierer ist das weiter unten angesprochene Modul mod_ruby interessant das den Ruby Interpreter direkt in den Webserver einbettet In Tabelle 6 1 finden Sie einen berblick ber einige der wichtigsten
127. vermittelt das Wichtigste ber s mtliche cli ent und serverseitigen Web Technologien HTML CSS JavaScript Ajax CGI PHP und MySQL Sascha Kersken Praktischer Einstieg in MySQL mit PHP K ln 2005 O Reilly Verlag Schnelleinstieg in Einrichtung Konfiguration und praktischen Einsatz des Daten banksystems MySQL und Datenbankprogrammierung mit PHP Web Ressourcen Nachfolgend finden Sie die Adressen einiger Websites mit Informationen zu Ruby Soft ware Downloads und so weiter Bei Drucklegung waren die URLs aktuell aber wie Sie wissen veralten Web Adressverzeichnisse recht schnell Deshalb finden Sie dieselbe Liste auf der Website zum Buch in aktueller Form Dort k nnen Sie zudem per Formular selbst Links vorschlagen Meine eigene Site zu diesem Buch hat die Adresse http buecher lingoworld de ruby Bei O Reilly hat das Buch die URL http www oreilly de catalog rubybasger Auf beiden Sites k nnen Sie Listings herunterladen Lob oder Kritik loswerden und mehr Ruby Dokumentation http ruby doc org die Ruby Dokumentationszentrale Enth lt s mtliche Inhalte der ri Dokumentation sowie Links auf viele weitere Ressourcen http www rubycentral com book die erste Auflage des Pickaxe Buchs von Andy Hunt und Dave Thomas siehe oben im Bereich B cher im Volltext http home vr web de juergen katins ruby buch index html dasselbe Buch auf Deutsch auf der Website des bersetzers http poignantguide net ruby h
128. vorkommen Hier einige Beispiele die Sie in irb nachvollziehen k nnen gt gt Hallo al gt 1 gt gt Hallo la gt nil gt gt Hammel al gt nil Der erste Versuch liefert einen Treffer denn die Zeichenfolge al kommt an Position 1 in Hallo vor Der Test auf la scheitert dagegen denn die Reihenfolge ist falsch Auch die Untersuchung auf al in Hammel liefert keinen Treffer da a und 1 in die sem Wort nicht direkt aufeinanderfolgen Wenn Sie Zeichen verwenden m chten die innerhalb regul rer Aus A dr cke eine besondere Bedeutung haben m ssen Sie diesen einen u Backslash voranstellen Es handelt sich insbesondere um folgende Zeichen L Zeichengruppen und bereiche Das bisher gezeigte Matching einzelner Zeichen und Zeichenfolgen ist noch nichts besonders Aufregendes und l sst sich auch ohne regul re Ausdr cke erledigen Viel interessanter ist die M glichkeit eine Auswahl passender Zeichen anzugeben Sol che Zeichenmengen werden grunds tzlich in eckige Klammern geschrieben Die einfachste Variante ist eine simple Aufz hlung einzelner Zeichen als Alternati ven Beispielsweise steht aeiou f r einen beliebigen kleingeschriebenen Vokal n mlich eines der Zeichen a e i o oder u Probieren Sie es ruhig einmal aus gt gt hello aeiou gt 1 gt gt 42 aeiou gt nil 88 Kapitel 2 Sprachgrundlagen Wenn Sie denselben l ngere
129. zur ck gt gt wert zwei_hoch_n pop gt 64 gt gt zwei_hoch_n gt 1 2 4 8 16 32 68 Kapitel 2 Sprachgrundlagen e array unshift Wert f gt am Anfang des Arrays einen oder mehrere Werte ein gt gt monate w April Mai Juni April Mai Juni monate unshift Maerz Maerz April Mai Juni monate unshift Januar Februar Januar Februar Maerz April Mai Juni e array shift ist das Gegenst ck zu unshift das erste Element wird entfernt und zur ckgeliefert gt gt gt gt gt gt gt gt gt todo w Analyse Entwurf Implementierung Test Dokumentation Analyse Entwurf Implementierung Test Dokumentation programmierschritt todo shift Analyse todo Entwurf Implementierung Test Dokumentation e array slice Index liefert das Element des Arrays an der gew nschten Stelle zur ck genau wie ein einfaches array Index Die spezielle Form array slice Index entfernt das entsprechende Element dauerhaft aus dem Array gt gt gt gt gt gt gt gt gt Einige kaese w Camembert Brie Gouda Edamer Emmentaler Camembert Brie Gouda Edamer Emmentaler essen kaese slice 1 Brie kaese Camembert Gouda Edamer Emmentaler weitere Methoden manipulieren die Reihenfolge der Elemente Mit sort werden die Elemente in Zeichensatzreihenfolge sortiert siehe
130. zwei oder mehr Whitespace Zeichen s 2 werden durch genau einen Zeilenumbruch ersetzt um gr ere L cken zu vermeiden F r den praktischen Gebrauch ist die hier verwendete Methode der HTML Entfernung viel zu ungenau Man m sste n mlich beispiels weise Text innerhalb von Anf hrungszeichen oder Kommentaren anders behandeln das hei t unbehelligt stehen lassen Zum Schluss wird der gelesene und umgewandelte Inhalt mittels puts auf die Stan dardausgabe geschrieben TCP Server und Clients F r die beiden Transportverfahren TCP und UDP existieren jeweils eigene Socket Klassen namens TCPSocket und UDPSocket Beide stammen von der gemeinsamen nicht instanziierbaren Elternklasse IPSocket ab in der ihre betr chtliche gemein same Funktionalit t festgelegt wird Von TCPSocket wird wiederum die Klasse TCP Server abgeleitet die nicht selbstst ndig eine Verbindung initiiert sondern an einem bestimmten Port auf Anfragen lauscht Dieser Abschnitt konzentriert sich auf das wichtigere und h ufiger eingesetzte TCP Informationen ber den Einsatz von UDPSocket erhalten Sie in einigen der Ressour cen die in Anhang B empfohlen werden Zudem finden Sie auf der Website zu die sem Buch eine UDP Version der weiter unten vorgestellten ECHO Anwendung Client und Server Grundlagen Ein TCP Server Socket wird erzeugt indem TCPServer new mit einem oder zwei Parametern aufgerufen wird Host und Portnummer oder nur Portnummer A
131. 0 puts Mangelhaft elsif punkte lt 67 puts Ausreichend elsif punkte lt 80 puts Befriedigend elsif punkte lt 92 puts Gut else puts Sehr gut end Beachten Sie dass der letzte Fall durch ein einfaches else vollst ndig abgedeckt wird denn selbst wenn jemand mehr als 100 Punkte von 100 m glichen errei chen sollte gibt es keine bessere Note als Sehr gut Wenn Sie nur eine einzige Anweisung von einer Bedingung abh ngig machen wol len und auch keinen else Teil brauchen gibt es eine k rzere Alternative zu if Bedingung Anweisung end Es handelt sich um ein nachgestelltes if in der Form Anweisung if Bedingung Hier ein Beispiel das Geschafft ausgibt wenn die Variable punkte einen Wert ber 100 hat puts Geschafft if punkte gt 100 Ruby kennt sogar eine Umkehrung von if unless berpr ft eine Bedingung und f hrt die entsprechenden Anweisungen nur dann aus wenn diese nicht zutrifft Das folgende Beispiel gibt eine Fehlermeldung aus wenn die Eingabe nicht 1 oder 2 lau tet puts Moechten Sie 1 noch mal oder 2 beenden print gt wahl gets to_i unless wahl 1 wahl puts Ungueltige Eingabe end F r solche einzelnen Anweisungen gibt es unless auch als nachgestellte Fallent scheidung puts Ungueltige Eingabe unless wahl 1 wahl Kontrollstrukturen 75 Nat rlich l sst sich jede Bedingung durch Verneinung so umformulieren dass Sie statt
132. 0000 0 1111 1 0001 1 1110 2 1101 3 0011 3 1100 4 0100 4 1011 5 0101 5 100167 0b0 i 0111 7 Abbildung 2 3 Darstellung der Raumfolgearithmetik am Beispiel des 4 Bit Zweierkomplements Der Vorteil der Zweierkomplement Schreibweise besteht darin dass die arithmeti sche Reihenfolge stimmt und dass jede Zahl auch die gr te positive einen Nachfolger besitzt In der Vier Bit Variante kommt nach 0111 7 der Wert 1000 8 Ebenso folgt auf 1111 1 wieder 0000 0 da der bertrag auf die n chste Stelle innerhalb fester Bit Grenzen nicht mehr stattfinden kann Das Ganze wird als Raumfolgearithmetik sequence space arithmetic bezeichnet und in Abbildung 2 3 anhand des Vier Bit Beispiels demonstriert Die Klasse der beliebig gro en Ganzzahlen wird als Bignum bezeichnet Selbstver st ndlich belegen sie mehr Speicher als Fixnum Zahlen und das Rechnen mit ihnen verlangsamt Ihre Programme Daf r wird die Zahlenart wie bereits erw hnt auto matisch konvertiert Geben Sie in irb Folgendes ein um das zu pr fen der Opera tor steht f r die Potenz gt gt a 2 30 1 38 Kapitel 2 Sprachgrundlagen Die Ausgabe lautet 1073741823 das ist wie oben hergeleitet die gr te darstell bare Fixnum Aufgrund der Verf gbarkeit von Bignum funktioniert aber auch Fol gendes a 1 gt 1073741824 Andere Programmiersprachen w rden 1073741824 liefern s
133. 00000000000000000000000000000 bis 1111111111111111111111111111111 Das vorderste Bit wird f r das Vorzeichen verwendet O steht f r positive Zahlen sowie 0 w hrend 1 negative Zahlen repr sentiert Positive Zahlen werden dabei einfach im Dualsystem Zweiersystem dargestellt die weithin bekannte Zahlen reihe von 0 bis 10 lautet beispielsweise so 0 1 10 11 100 101 110 111 1000 1001 1010 Negative Zahlen werden dagegen durch ein Verfahren namens Zweierkomplement gebildet Zum Kehrwert der entsprechenden positiven Zahl wird 1 addiert Zum Beispiel 0000000000000000000000000001111 7 1111111111111111111111111110000 Kehrwert 1111111111111111111111111110001 1 addieren gt 7 Damit lassen sich Zahlen von 1 073 741 824 bis 1 073 741 823 darstellen was f r die allermeisten allt glichen Berechnungen oder Z hlungen ausreichen d rfte gt 5 Auf 64 Bit Systemen sind es 63 und die angegebenen Zahlenbereiche verzigfachen sich bis in Bereiche in denen Sie wahrscheinlich nie rechnen werden Variablen Ausdr cke und Operationen 37 Der bersicht halber werden die weiteren Eigenschaften des Zweierkomplement Systems im Folgenden an nur vier Bit breiten Integerwerten dargestellt Dabei rei chen die darstellbaren Zahlen von 8 bis 7 8 berechnet sich dabei aus 8 bin r ohne Ber cksichtigung des Vorzeichens 1000 Der Kehrwert betr gt 0111 Anschlie end wird 1 addiert dies ergibt wieder 1000
134. 0_S gt 23 gt gt Math PI to_s gt 3 14159265358979 vv Einen Unterschied gibt es allerdings Bei den Ganzzahlen k nnen Sie als optionalen Parameter das Zahlensystem des Zielstrings angeben m gliche Werte reichen von 2 Dualsystem bis 36 Die H chstgrenze ergibt sich nicht aus irgendeiner mathe matischen Gegebenheit es sind beliebige Zahlensysteme denkbar sondern weil das 36er System bereits die Ziffern 0 9 und die Buchstaben A Z verbraucht f r alles dar ber Hinausgehende gibt es keine allgemeing ltige Vereinbarung Wenn Sie die Basis weglassen wird 10 angenommen wie das obige Beispiel zeigt Ein erstes Beispiel f r die Angabe einer Basis haben Sie bereits weiter oben im Farbkonverter Programm gesehen in dem Zahlen ins Hexadezimalsystem umge rechnet wurden Hier noch einige weitere Beispiele mit h ufig genutzten Zahlen systemen gt gt 100 to_s 2 gt 1100100 gt gt 1000 to_s 8 Ls 1750 gt gt 100000 t0_s 16 gt 186a0 Beispiele mit einer abwegigeren Basis k nnen Sie bei Bedarf gern selbst ausprobie ren Wenn Sie versuchen bei der Umwandlung einer Flie kommazahl die Basis anzuge ben erhalten Sie dagegen eine Fehlermeldung Math E ist die Euler sche Zahl e 2 71828182845905 also die Basis des nat rlichen Logarithmus gt gt Math E to_s 16 ArgumentError wrong number of arguments 1 for 0 Umgekehrt k nnen Sie auch Strings und andere Objekte in Zahlen um
135. 103 each_value 103 each_with_index 267 eigene 176 step 104 times 104 upto 104 Iteratorn yield 176 J Java 2 join Methode 71 join Methode Thread 267 K kalender rb Skript 143 Kapselung 154 KDE Konsole 10 kill Methode 262 kind_of Methode 213 Klammern f Priorit t 62 Klasen Time 369 Klasse ermitteln 212 Klassen 305 ActiveRecord Base 346 ApplicationController 339 Array 48 363 BasicSocket 230 Begriffsdefinition 164 Bignum 364 CGI 292 CGlI Session 310 Dir 137 364 Einf hrung 113 Entwurf 163 erweitern 185 File 126 364 Fixnum 37 365 Float 40 365 GServer 270 Hash 365 Instanziierung 168 Integer 366 IO 366 Konstruktor 167 MatchData 146 366 Math Modul 65 Mysql 323 Mysql Result 323 Net HTTP 241 Net HTTPOK 242 Object 367 Rational 145 368 Regexp 146 368 String 368 TCPServer 232 TCPSocket 231 Time 138 UUID 309 Vererbung 198 Klassen von IP Adressen 224 Klassendiagramme UML 165 Klassenmethoden 128 179 private Abgrenzung 202 Klassenvariablen 167 Kommandozeilen Argumente 122 Kommentare 33 RDoc 34 Konsole 10 Ein und Ausgabe 114 Ein Ausgabeumleitung 115 Konsolenbefehle bersicht 13 Konstanten 48 Konstruktor 113 Beispiele 168 new Aufruf 114 super Elternklasse 199 Syntax 167 Konstruktor Begriffsdefinition 167 382 Index Kontrollstrukturen 72 Fallentscheidungen 73 Schleifen 79 Kryptografie Bit Operatoren und 57 L
136. 18 19 An 197 25 14 11 Von 193 17 18 19 An 197 25 14 11 HTTP Anfrage GET HTTP I I TCP Datenstrom Von 12345 An 80 Von 193 17 18 19 An 197 25 14 11 Rohdaten f Hardware 1011 0110 1001 0100 Rohdaten f Hardware 1011 0110 1001 0100 Rohdaten f Hardware 1011 0110 1001 0100 HTTP Antwort HTTP I I 200 OK TCP Datenstrom Von 80 An 12345 Von 197 25 14 11 An 193 17 18 19 Von 197 25 14 11 An 193 17 18 19 HTTP Antwort HTTP 1 1 200 OK TCP Datenstrom Von 80 An 12345 Von 197 25 14 11 An 193 17 18 19 Rohdaten f Hardware 0101 1101 OIIO LIOI 4 Rohdaten f Hardware OIOI 1101 OIIO 1101 Rohdaten f Hardware 0101 1101 0110 1101 Client Host Router Server Host 193 17 18 19 Schnittstellen 197 25 14 11 Webbrowser 193 17 18 1 Webserver TCP Port 12345 197 25 14 TCP Port 80 Abbildung 5 2 Schematischer Ablauf der Anforderung und Lieferung einer Webseite Kurze Einf hrung in TCP IP 223 IP Adressen und Routing Ein besonders wichtiges Detail der TCP IP Kommunikation sind die Vorg nge auf der Internetschicht Dort arbeitet das Internet Protocol IP einer der beiden Namensgeber der Protokollfamilie Wie bereits erw hnt werden die Datenpakete dieser Schicht Datagramme genannt mit der Adresse des Absenders und derjeni gen des Empf ngers versehen Daf r werden so genannte IP Adressen verwendet Es hand
137. 2 Modus Konstanten 3 NORMAL 0 4 REVERSE 1 5 ROT13 2 6 Port von der Kommandozeile lesen oder auf 7 setzen 7 if ARGV 0 8 port ARGV 0 to _i 9 else 10 port 7 11 end 12 Lauschenden Socket erzeugen 13 server TCPServer new port 14 Infozeile ausgeben 15 puts ECHO Server listening on port port 16 Thread Array initialisieren 17 threads 18 Accept Schleife 19 loop do 20 next unless newclient server accept 21 Thread erzeugen und darin Client Verbindung verarbeiten 22 threads lt lt Thread new newclient client 23 Modus initialisieren nun pro Thread lokal 24 mode NORMAL 25 STDOUT puts CLIENT VERBINDUNG HERGESTELLT 26 loop do 27 Client Anfragen auslesen 28 anfrage client gets strip 29 und auf die Konsole protokollieren 30 STDOUT puts Anfrage anfrage 31 Bei QUIT Client Verbindung beenden 32 break if anfrage QUIT 33 Bei EXIT Server beenden und Schluss 34 if anfrage EXIT 35 exit 36 end 37 Modus Befehle behandeln 38 case anfrage 39 when MODE NORMAL 40 mode NORMAL 41 client print Modus auf Normal gesetzt r n 42 when MODE REVERSE 43 mode REVERSE 44 client print Modus auf Reverse gesetzt r n 45 when MODE_ROT13 Prozesse und Threads 269 Beispiel 5 7 Die Threading Version des ECHO Servers echothreadserver rb Fortsetzung 46 mode ROT13 47 client print Modus auf ROT13 gesetzt r
138. 2 Import der CGI Bibliothek Zeile 4 Eine neue CGI Instanz wird erzeugt Das Argument html4 sorgt daf r dass die HTML Erzeugungsmethoden aus dem Mixin Modul CGI HtmlExten sion eingef gt werden und zwar f r HTML 4 0 Zeile 6 cgi header erzeugt den HTTP Header wenn Sie keine Argumente angeben wird der minimal erforderliche Header erzeugt Content type text html Zeile 8 68 cgi out nimmt einen Block entgegen dessen Inhalt als Body der HTTP Antwort dient standardm ig also als HTML Dokument Zeile 12 14 cgi head erzeugt den lt head gt Block des HTML Dokuments Das Pluszeichen in Zeile 14 muss gesetzt werden weil die Ausgabe von cgi head genau wie der gesamte in cgi out verschachtelte Inhalt ein String ist Diese String Werte werden auf dieser sowie auf allen untergeordneten Ebenen mit tels verkettet Zeile 13 cgi title generiert das lt title gt Tag der Block Inhalt ist der enthal tene Text Zeile 16 66 cgi body umschlie t den lt body gt Block des Dokuments Zeile 19 37 Der if else Abschnitt pr ft ob Werte f r die beiden Formular felder temp und rechnung vorliegen Wenn Sie Formulare ber die Ruby Klasse CGI erzeugen werden diese standardm ig wieder an das aktuelle Skript selbst versandt so dass diese Daten vorhanden sind wenn das Formular im vorigen Durchlauf abgeschickt wurde Zum Testen wird die Methode has_key des CGI Objekts verwendet Zeile 21 Das Formularfeld temp wird ausgeles
139. 29 als Rails Template 340 Escape Sequenzen 42 in regul ren Ausdr cken 88 Zeichencode 68 ETag HTTP Header 286 Exceptions 209 abfangen 209 ausl sen 210 eigene 211 exists File Methode 128 138 exit Methode 125 Index 379 F Fallentscheidungen 73 case when 76 durch logische Operationen 77 if 73 in Ausdr cken 78 unless 75 false als Literal 44 fetch_hash Methode Mysql 324 fetch_row Methode 324 File Klasse 126 close Methode 127 Instanzen 126 open Methode 127 Referenz 364 rewind Methode 135 seek Methode 135 sort Methode 136 File directory Methode 138 File exists Methode 128 138 File file Methode 138 File rename Methode 179 file File Methode 138 file_field Methode 303 find Active Record Methode 348 Fixnum Klasse 37 Referenz 365 Flie komma Arithmetik 41 Flie kommazahlen 40 konvertieren in 70 Float Klasse 40 Referenz 365 round Methode Erweiterung 186 floor Methode 64 for Schleife 83 fork Methode 257 Forking 257 Forking Server 258 263 form Methode 300 Formulardaten Web 290 FreeRIDE Ruby Entwicklungsumgebung 18 G Ganze Zahlen 36 Dual 40 Hexadezimal 40 konvertieren in 70 Oktal 39 Ganzzahlarithmetik 37 Geheimhaltungsstufen siehe Zugriffsschutz OOP Geltungsbereich 47 gem rubygems Aufruf 309 322 generate Rails Tool 339 346 Geschichte von Ruby 1 GET HTTP Methode 284 Query String 291 309 get Methode Net HTTP 242 getc Methode 120 gets Methode 119 g
140. 5 gruen arg3 to_i 36 end 37 end 38 Klassenmethode Gegebene Werte in Hex RGB umrechnen 39 def RGBFarbe hex r g b 40 Gesamtwert berechnen 41 farbe r lt lt 16 g lt lt 8 b 42 In Hex umrechnen und auf 6 Stellen aufstocken 43 hexfarbe farbe to_s 16 44 while hexfarbe length lt 6 45 hexfarbe 0 hexfarbe 46 end 47 hexfarbe upcase 48 end 49 Rotwert zurueckgeben 50 def get_rot 51 rot 52 end 53 Gruenwert zurueckgeben 54 def get_gruen 55 gruen 56 end 57 Blauwert zurueckgeben 58 def get_blau 59 blau 60 end 61 Alle drei Einzelwerte als Array zurueckgeben 62 def get_rgb_array 63 rot gruen blau 64 end 182 Kapitel 4 Eigene Klassen und Objekte erstellen Beispiel 4 3 RGB Farbumwandlung als Klasse rgb_farbe rb Fortsetzung 65 Alle drei Einzelwerte als Hash zurueckgeben 66 def get_rgb_hash 67 rot gt rot gruen gt gruen blau gt blau 68 end 69 HTML Farbcode zurueckgeben 70 def get_html_farbe 71 RGBFarbe hex rot gruen blau 72 end 73 Die naechstgelegene Farbe der Webpalette ermitteln 74 def get_naechste_web_farbe 75 Naechstgelegene Web Farbwerte berechnen 76 wr rot 25 51 51 77 wg gruen 25 51 51 78 wb blau 25 51 51 79 RGBFarbe hex wr wg wb 80 end 81 end Beachten Sie besonders den Konstruktor Zeile 3 37 Er erm glicht die Angabe eines Hashes einzelner Rot Gr n und Blauw
141. 75 reverse Array Methode 69 reverse String Methode 66 388 Index rewind Methode 135 RFC 123 Datum 139 rgb rb Skript 58 rgb_farbe rb Skript 181 RGB Farben umrechnen 58 ri Ruby Hilfe 148 round Methode 64 Erweiterung 186 Routing 222 226 Ruby Anweisungen 32 Bezeichner 46 Bl cke 101 Datenbankzugriff 314 Datum und Uhrzeit 138 einfache Ausdr cke 14 Einfl sse 2 Einzelbefehle ausf hren 15 erstes Skript 17 FreeRIDE Entwicklungsumgebung 18 Geschichte 1 Installation 4 Installation UNIX 7 Installation Windows 4 Internationale Verbreitung 2 Interpreter 3 Iteratoren 101 Kommandos ausf hren 10 Kommandozeilen Argumente 122 Kommentare 33 Kontrollstrukturen 72 Literale 36 Lizenz 2 Merkmale 3 Name der Sprache 1 PATH erg nzen 9 Plattformen unterst tzte 3 Principle of Least Surprise 4 Referenz 357 Skript ausf hren 16 Skripten ausf hren ohne ruby 34 Skripten importieren 187 Syntax 31 Variablen 45 Verbreitungsschub durch Rails 2 Ruby on Rails 2 Ruby on Rails siehe Rails ruby Interpreter Direkteingabe 16 Einzelbefehl ausf hren 15 impliziter Aufruf 34 Skript ausf hren 16 rubygems Erweiterungsmanager 309 322 rubygems Erweiterungen mysql 321 rails 336 uuid 309 Ruby Hilfe ri 148 R ckgabewerte 175 Ausdr cke als 175 R ckgabwerte return 175 Runden auf n Nachkommastellen 65 S Scaffolding Rails 347 Schichtenmodell 220 Schleifen 79 for 83 loop 81 until 81 while 79 Schl ss
142. 7690 5 2 Float 21313340 4 2 Float 21313370 3 2 Float 21313400 212 Kapitel 4 Eigene Klassen und Objekte erstellen 2 2 Float 21313430 0 2 Float 21313480 100 Float 21341780 Es gibt 11 numerische Objekte Die Syntax des verwendeten printf Formatstrings k nnen Sie brigens in Kapitel 2 nachschlagen der Rest des Codes m sste ohne Weiteres verst ndlich sein Neben den selbst definierten Flie kommazahlen aus dem Array arr werden einige vordefinierte Zahlen aufgelistet n 3 14159 e 2 71828 die kleinste von O ver schiedene Zahl 2 22045e 016 sowie die absolut gr te 1 79769e 308 und abso lut kleinste 2 22507e 308 Flie kommazahl Wie Sie vielleicht bemerkt haben werden keine Instanzen der Ganzzahl Klasse Fixnum aufgelistet Diese sind genau wie true false und nil statische Objekte ber die ObjectSpace keine Informatio nen enth lt Das merken Sie daran dass die Objekt ID beim selben Wert stets iden tisch ist Testen Sie es in irb 2 2 object_id gt a gt gt b gt a gt 5 b 5 gt gt gt object_id Machen Sie auch die Gegenprobe mit zwei gleichwertigen Flie kommazahlen hier sind die IDs unterschiedlich c 45 gt gt d 4 5 gt gt c object_id gt 22570900 gt gt d object_id gt 22567520 Sie k nnen auch ermitteln ob ein Objekt zu einer bestimmten Klasse geh rt Daf r besitzen alle Instanzen von Object das hei t s mtliche Ruby Objekte
143. Argument 1 Wenn Sie also beispielsweise einen W rfel simulieren m chten k nnen Sie Folgendes ein geben gt gt rand 6 1 gt 4 gt gt rand 6 1 gt 2 gt gt rand 6 1 gt 5 Falls Sie sich hier gegen Argumentklammern entscheiden sollten also rand 6 schreiben m ssen Sie den gesamten rand Aufruf in Klammern setzen rand 6 1 11 bersetzung Warnung Setzen Sie Argument e f r zuk nftige Versionen in Klammern Variablen Ausdr cke und Operationen 63 Andernfalls wird die Addition zuerst ausgef hrt und rand 7 liefert nicht wie gew nscht eine Zahl zwischen 1 und 6 sondern eine zwischen 0 und 6 Es folgen einige weitere Beispiele f r bekannte Methoden geordnet nach Katego rien Mathematische Methoden Viele Methoden stammen aus dem Bereich der Mathematik Hier nur einige wich tige im berblick im Verlauf des Buchs lernen Sie noch weitere kennen Zahl abs liefert den absoluten Wert Betrag einer Zahl das hei t ihren Wert ohne Vorzeichen gt gt 3 abs gt 3 gt gt 3 abs gt 3 Zahl ceil gibt die n chsth here ganze Zahl zur ck oder die Zahl selbst falls es sich bereits um eine ganze Zahl handelt gt gt 2 ceil gt 2 gt gt 2 2 ceil gt 3 gt gt 2 7 ceil gt 3 Zahl floor liefert entsprechend die n chstniedrigere Ganzzahl gt gt 2 floor gt 2 gt gt 2 2 floor gt 2 gt gt 2 7 floor gt 2 Zahl round rundet mathe
144. Bei Division O als zweiten Operanden ausschliessen 25 if op amp amp z2 26 puts Division durch O ist verboten 27 puts 28 next 29 end 30 Ergebnis je nach Operator berechnen 31 case op 32 when 33 ergebnis z1 z2 34 when 35 ergebnis z1 z2 36 when 37 ergebnis z1 z2 38 when 39 ergebnis z1 z2 40 end 41 Ausgabe des Ergebnisses 42 puts Ergebnis z1 op z2 ergebnis 43 print Noch eine Berechnung j n 44 nochmal gets chomp 45 puts 46 break if nochmal n i 47 end Nachdem Sie das Rechner Skript eingegeben haben sollten Sie es zun chst auspro bieren Wechseln Sie dazu auf der Konsole in das entsprechende Verzeichnis und geben Sie Folgendes ein gt ruby rechner rb Nun k nnen Sie gem der Eingabeaufforderung durch das Programm ein paar Rechenoperationen eingeben Abbildung 2 1 zeigt einige Beispiele Praktische Einf hrung 25 ex C rubytest lof x a C rubytest gt ruby rechner rb Ruby Rechner itte die erste Zahl 5 itte die zweite Zahl 2 echenoperation i 1 1 7 rgebnis 5 8 2 8 7 0 och eine Berechnung j n j itte die erste Zahl 45 itte die zweite Zahl 8 echenoperation i 1 17 ivision durch 8 ist verboten itte die erste Zahl 53 itte die zweite Zahl 16 echenoperation i 1 1 7 rgehnis 53 8 16 8 848 8 och eine Berechnung j n n ruhytest gt Abbildung 2 1 Der
145. C Idee wurde urspr nglich im Zusammenhang mit Small talk f r lokale Anwendungen mit grafischer Oberfl che gepr gt Sie teilt eine GUI Anwendung in die folgenden drei Komponenten auf e Das Model auf Deutsch Modell enth lt die Datenstrukturen die der Anwen dung zugrunde liegen Damit sind nicht einfach nur ein paar Strings Zahlen oder Arrays gemeint sondern die softwaretechnische Abbildung der Daten f r Gesch ftsabl ufe und andere Transaktionen Business Logic Da MVC eine Architektur f r objektorientierte Sprachen ist findet das Modell seine Auspr gung nat rlich in einer Klassenstruktur Da die konkreten Daten einer Instanz jedoch nur so lange existieren wie ein Programm l uft m ssen sie irgendwo 333 dauerhaft Fachbegriff persistent gespeichert werden erst recht bei Weban wendungen wo ein Skript schon wieder endet bevor die fertige Seite an den Browser ausgeliefert wird Ruby on Rails verwendet daher einen cleveren Trick Die Klassenstruktur wird vollautomatisch mit passenden Datenbankta bellen verkn pft e Die View Ansicht Pr sentation bildet die Benutzeroberfl che der Anwen dung Sie pr sentiert die Daten des Modells in frei w hlbarer Form und stellt Steuerelemente zum Hinzuf gen ndern oder Entfernen solcher Daten bereit Rails muss in der Regel HTML basierte Views mit variablen Daten erzeugen und verwendet deshalb die im vorigen Kapitel erw hnten eRuby Vorlagedateien rhtml als Templates
146. Dateien wie beispielsweise Bilder die in eine Webseite eingebettet wurden Auf eine solche Anfrage antwortet der Webserver mit einer HTTP Antwort Response Diese besteht aus einer Statuszeile mehreren Antwort Headern einer Leerzeile und schlie lich dem Body der die eigentliche vom Client angeforderte Ressource liefert Hier ein Beispiel f r die HTTP Server Antwort auf eine GET Anfrage HTTP 1 1 200 OK Date Wed 27 Dec 2005 19 37 42 GMT Server Apache 2 2 3 Unix Last Modified Thu 10 Feb 2005 07 56 38 GMT ETag 39a4cb 533 6ef34d10 Accept Ranges bytes Content Length 2092 Connection Keep Alive Content Type text html lt DOCTYPE HTML PUBLIC W3C DTD HTML 4 0 Transitional EN gt lt html gt lt head gt Ba Die Statuszeile gibt Auskunft ber die HTTP Version hier 1 1 sowie ber Erfolg oder Misserfolg der Anfrage Der Status 200 OK bedeutet dass die Anfrage mit der Lieferung der gew nschten Ressource beantwortet werden kann Andere wichtige Statusmeldungen sind etwa 404 Not Found Ressource nicht gefunden meist bei feh lerhaften URL Eingaben oder veralteten Links 500 Internal Server Error k nnte Ihnen bei Fehlern in der Webprogrammierung begegnen oder die diversen 3xx Weiterleitungen Den Webserver Apache 2 installieren 285 Auch bei der Antwort sind die restlichen Zeilen Header Felder die hier verwende ten bedeuten Folgendes e Date gibt Datum und Uhrzeit der Lieferung an e
147. Diese Direktive bestimmt welche Dateien als Indexdokumente oder Startsei ten gelten sollen Wenn ein Benutzer ein Verzeichnis aber keine bestimmte Datei anfordert sucht Apache automatisch nach Dateien mit den hier angege benen Namen die erste gefundene Datei wird ausgeliefert Die Voreinstellung ist index html auf einem Ruby f higen Webserver empfiehlt sich dagegen DirectoryIndex index html index rb index rbx Was passiert wenn im angesprochenen Verzeichnis gar keine Indexseite gefun den wird h ngt von weiteren Einstellungen ab Sofern die Option Indexes siehe oben gesetzt und das Modul mod_autoindex geladen ist generiert Apache selbst einen Verzeichnisindex Andernfalls wird die Statusmeldung 404 Seite nicht gefunden an den Client gesendet Alias Die Direktive Alias ordnet einem Verzeichnis au erhalb der DocumentRoot einen URL Pfad zu Auf diese Weise k nnen Sie ber den Webserver auch Dateien Den Webserver Apache 2 installieren 283 ver ffentlichen die aus organisatorischen Gr nden oder aus Sicherheitserw gungen nicht im eigentlichen Website Verzeichnis liegen Betrachten Sie dazu folgendes Beispiel Alias test usr local testverzeichnis Das Verzeichnis testverzeichnis das in diesem Beispiel in Wirklichkeit im Ver zeichnis usr local liegt wird unter dem URL Pfad test eingebunden Es kann also unter der URL http www test localltest aufgerufen werden HTTP Grundwissen Webserver wie Apache kom
148. E de de de gq 0 8 en us g 0 5 en gq 0 3 HTTP_ACCEPT_ENCODING gzip deflate HTTP_ACCEPT_CHARSET ISO 8859 1 utf 8 q 0 7 q 0 7 HTTP_KEEP_ALIVE 300 HTTP_CONNECTION keep alive Abbildung 6 2 Ausgabe der CGI Umgebungsvariablen per CGI Skript Hintergrundwissen ber Formulardaten Wenn Sie unbedingt m chten k nnen Sie sogar Webformulare zu Fu einlesen Bei GET Anfragen stehen die Daten in der Umgebungsvariablen QUERY_STRING zur Verf gung auf die Sie mittels ENV QUERY_STRING zugreifen k nnen Bei POST Anfragen werden sie dagegen ber die Standardeingabe bereitgestellt und k nnen mit den blichen Eingabeoperationen eingelesen werden Welche HTTP Methode verwendet wurde steht im brigen in ENV REQUEST_METHOD Das Format der Daten ist f r die manuelle Verarbeitung allerdings recht unprak tisch Angenommen eine Webseite enth lt folgendes Formular mit zwei Textfel dern namens ort und telefon 290 Kapitel 6 Klassische Webanwendungen lt form action auswertung rb method GET gt Ort lt input type text name ort gt lt br gt Telefon lt input type text name telefon gt lt br gt lt input type submit value Abschicken gt lt form gt Sie f llen die beiden Felder mit K ln beziehungsweise 0221 123456 aus und klicken auf den mit Abschicken beschrifteten Absende Button an Die Daten werden mit der Methode GET an das Ruby CGl Skript auswertung rb ve
149. Einr ckungen und Zeilenumbr che spielen brigens keine Rolle zur besseren Les barkeit ist es aber ratsam sie auf die hier gezeigte Weise anzuwenden Das Tag Paar lt html gt und lt html gt umschlie t den gesamten Inhalt es handelt sich um das so genannte Wurzelelement des Dokuments Innerhalb dieses Rahmens besteht das HTML Dokument aus zwei Teilen Header und Body Der Header kann allerlei technische Informationen ber das Dokument enthalten die f r Webserver Proxies oder Browser interessant sind Die einzige verbindliche Angabe ist der hier gezeigte Dokumenttitel lt title gt lt title gt er erscheint unter anderem in der Titelleiste des Browserfensters Der Body enth lt dagegen den sichtbaren Inhalt des Dokuments der im Browser angezeigt wird Anwendungsbeispiel Ein kleiner Textbrowser Die Implementierung eines ausgewachsenen Webbrowsers ist u erst kompliziert Sie ben tigen eine grafische Oberfl che und vor allem leistungsf higes HTML Ren dering das selbst aus zweifelhaftem Quellcode die bestm gliche Webseite zurecht formatiert Dennoch ist es ein spannendes Projekt einen eigenen Mini Browser zu schreiben Das hier vorgestellte Skript besitzt folgende Eigenschaften e Nach Eingabe einer URL wird diese angefordert Weiterleitungen werden ver folgt wie im vorigen Abschnitt gezeigt e Der erhaltene HTML Code wird einigen S uberungs und Formatierungs schritten unterzogen e S mtliche Hyp
150. HNE 0 3 DAMPF 30 4 STROM 40 5 DIESEL 50 6 Datenstruktur globale Variablen 7 loks STROM DIESEL 8 waggons 0 9 Globale Methoden 10 Eine bestimmte Anzahl Waggons anhaengen 11 def anhaengen waggons 12 if waggons waggons lt loks 0 loks 1 13 waggons waggons 14 Erfolg melden 15 true 16 else 17 Misserfolg melden 18 false 1 Zumindest im Wortsinn ein kleiner Vorgeschmack auf Ruby on Rails Kapitel 7 154 Kapitel 4 Eigene Klassen und Objekte erstellen Beispiel 4 1 Die G terzug Anwendung ohne Objektorientierung zug_imp rb Fortsetzung 19 end 20 end 21 Eine bestimmte Anzahl Waggons abhaengen 22 def abhaengen waggons 23 if waggons waggons gt 0 24 waggons waggons 25 Erfolg melden 26 true 27 else 28 Misserfolg melden 29 false 30 end 31 end 32 Eine der Loks ersetzen 33 def lok_aendern loknr loktyp 34 loks loknr loktyp 35 end 36 Differenz Waggonkapazitaet anzahl ermitteln 37 def waggontest 38 return waggons loks 0o loks 1 39 end 40 Infostring ueber eine der Loks 41 def lokinfo loknr 42 case loks loknr 43 when OHNE 44 keine 45 when DAMPF 46 Dampflok 47 when STROM 48 Elektrolok 49 when DIESEL 50 Diesellok 51 end 52 end 53 Informationen ueber den Zug ausgeben 54 def info 55 printf Lokomotive 1 s n lokinfo 0 56 printf Lokomotive 2 s n lokinfo 1 57 pri
151. Hier ein Ausf hrungs beispiel gt ruby crypt rb Text Dieser Text soll verschluesselt werden Schluessel 1 255 9 Verschluesselter Text M 1z1 lq zfee l zjae lzzle l mlg Aufgrund der Funktionsweise der Exklusiv Oder Operation kann der verschl sselte Text durch die erneute Ausf hrung mit demselben Schl ssel wieder entschl sselt werden gt ruby crypt rb Text M 1z1 lq zfee l zjae lzzle l mlg Schluessel 1 255 9 Verschluesselter Text Dieser Text soll verschluesselt werden Die einzige neue Anweisung in diesem Skript ist exit Sie verl sst das Programm sofort Bei kurzen Konsolenprogrammen k nnen Sie schwerwiegende Eingabefehler am effektivsten auf diese Weise beheben A Sie brauchen den oft mit merkw rdigen Sonderzeichen gespickten verschl sselten Text zur Entschl sselung nicht selbst einzugeben 5 sondern k nnen ihn kopieren und einf gen Unter Windows m ssen Sie dazu die Titelleiste des Konsolenfensters mit der rechten Maus taste anklicken und die Untermen punkte des Befehls Bearbeiten w hlen zuerst Markieren was Sie daraufhin mit der Maus tun k n nen dann Kopieren oder einfach Enter und schlie lich Einf gen Noch viel einfacher geht es in den Terminalfenstern der meisten UNIX Linux Varianten Fahren Sie mit gedr ckter linker Maustaste ber den zu kopierenden Text Dr cken Sie anschlie end die mitt lere Maustaste oder das Scrollrad oder notfalls beide Maustasten
152. Hier lautet die pas sende Beziehung belongs_to weil ein Album stets einer bestimmten Band zugeord net ist der Sonderfall Sampler wird hier nicht betrachtet Die urspr ngliche Fassung class Albums lt ActiveRecord Base end wird somit zu 346 Kapitel 7 Ruby on Rails class Albums lt ActiveRecord Base belongs_to band end Beachten Sie den Singular bei belongs_to band Was an dieser Stelle nicht behandelt wird ist die M glichkeit Validierungsanforde rungen hinzuzuf gen Sie berpr fen beim Einf gen oder ndern von Daten auto matisch ob diese beispielsweise existieren oder ein bestimmtes Format besitzen Automatische Skripten zur Datenbearbeitung Eine besonders beeindruckende F higkeit von Ruby on Rails ist das Scaffolding englisch f r Ger stbau Mit einer einzigen Kommandozeilenanweisung erstellt es Ihnen eine Webschnittstelle zum Erstellen Lesen ndern und L schen von Daten s tzen einer Tabelle kurz CRUD f r Create Read Update Delete Im vorliegenden Beispiel k nnen Sie das Scaffolding nur f r die Tabelle bands benutzen weil das Verfahren noch nicht intelligent genug ist Tabellenrelationen automatisch zu ber cksichtigen Geben Sie also Folgendes ein gt ruby script generate scaffold band Starten Sie nun den WEBrick Server der Anwendung und geben Sie die URL http localhost 3000 bands in Ihren Browser ein Zun chst sehen Sie eine leere Liste Kli cken Sie auf New band und
153. Klasse definierten Accessor wert2 als auch auf wert aus der Elternklasse Parent Umgekehrt besitzt ein reines Parent Objekt dagegen nicht die zus tzlichen Eigenschaften die in Weitere objektorientierte Konstrukte 199 der Klasse Child definiert werden Ein entsprechender Zugriffsversuch liefert die Fehlermeldung dass die betreffende Methode nicht verf gbar sei gt gt p wert2 NoMethodError undefined method wert2 for lt Parent 0x2b19f20 wert 12 gt Nat rlich k nnen Sie nicht nur von eigenen sondern auch von eingebauten Klassen neue Klassen ableiten Das folgende Beispiel leitet eine Klasse von der im vorigen Kapitel behandelten Standardklasse Time ab um diese durch Methoden f r die deutsche Datums und Uhrzeitformatierung zu erweitern class DTime lt Time Konstanten Arrays WTAGE w Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag MONATE w Januar Februar Maerz April Mai Juni Juli August September Oktober November Dezember Deutschsprachiger Wochentag def wtag t self wday WTAGE t end Deutschsprachiger Monat def monat m self month MONATE m 1 end Ausfuehrliches deutschsprachiges Datum def datum self strftime self wtag d self monat H M S end Kurzes Euro Datum def kurzdatum self strftime d m Y H M S end end Probieren Sie die neuen Methoden in irb aus nachdem Sie das Skript mit der Klas sendefinition importiert haben
154. LLO a i den Wert 1 Position des Buchstaben A zur ckgibt e m bedeutet multiline Normalerweise werden regul re Ausdr cke nur auf ein zelne Zeilen von Strings angewendet Zum Beispiel passt o W o beliebiges Zei chen W nicht auf Hallo nWelt weil das beliebige Zeichen hier n auf einer Zeilengrenze liegt Wenn Sie stattdessen den modifizierten Ausdruck o W m ver wenden erhalten Sie einen Treffer da der komplette String betrachtet wird e x ist der Extended Modus Er erm glicht Ihnen beliebigen Whitespace in Ihre regul ren Ausdr cke einzuf gen um sie bersichtlicher zu gestalten Hier zum Beispiel ein strenger mehrzeilig geschriebener ISBN Regexp A d d 5 d 3 0 9X Z x Sie k nnen die Modifizierer beliebig miteinander kombinieren a z im steht zum Beispiel f r einen oder mehrere Gro oder Kleinbuchstaben i im Multiline Modus m Wenn Sie einen regul ren Ausdruck als r statt als schreiben werden die Modifizierer ebenfalls ohne Abstand dahintergesetzt Das nachfolgende Beispiel fin det beliebig lange Hexadezimalzahlen r o 9a f i Weitere Konstrukte Man k nnte endlos weitermachen und ein Kapitel oder gar ein ganzes Buch ber die Ruby Regexp Syntax schreiben aber im Rahmen dieser Einf hrung muss irgend wann Schluss sein Deshalb finden Sie hier nur noch eine kurze Aufz hlung weiterer Elemente die teilweise in sp teren Kapiteln zum Einsatz
155. Last Modified HTTP Header 286 Laufzeit 212 Laufzeittyp berpr fung siehe Introspektion length Array Methode 49 68 length String Methode 66 Linux Apache installieren 277 Dateisystem 11 Konsolenbefehle 13 MySQL installieren 316 Prompt 11 Ruby installieren 7 Shebang 34 Shell 10 Terminalfenster 10 listdir rb Skript 192 Listen Apache Direktive 280 Literale 36 Bereiche Ranges 45 nil 45 numerische 36 spezielle 44 Strings 41 Symbole 45 true false 44 Lizenz von Ruby 2 LoadModule 280 localhost 281 log Math Methode 65 Logarithmus 65 Logische Operationen 55 als Fallentscheidungen 77 De Morgan Theorem 76 Short Circuit Verfahren 56 loop Schleife 81 ls UNIX Konsolenbefehl 13 M m Regexp Modifier 96 Mac OS X Apache installieren 277 Dateisystem 11 Konsolenbefehle 13 MySQL installieren 316 Prompt 11 Ruby installieren 7 Shebang 34 Shell 10 Terminalfenster 10 match Methode 147 MatchData Klasse 146 begin Methode 148 end Methode 148 offset Methode 148 post_match Methode 148 pre_match Methode 148 Referenz 366 Matching Regexp 86 Einzelheiten 97 Math Modul 65 Referenz 367 Math cos Methode 65 Math log Methode 65 Math sin Methode 65 Math sqrt Methode 65 Math tan Methode 65 Mathematische Methoden 64 Matsumoto Yukihiro 1 Matz 1 Mehrfachvererbung 207 message Methode 242 Methoden Array 49 Hash 50 String 67 abs 64 accept 233 Accessors 197 alias 186 Array Parameter 172 Arrays 68 attr_a
156. Letzteres hat als Haupt Thread allerdings eine Besonderheit Wenn es beendet wird enden automatisch auch alle anderen Threads Wenn es erforderlich ist dass ein Thread seine Arbeit am Programmende noch abschlie t m ssen Sie seine Methode join aufrufen am Ende des obigen Programmbeispiels k nnten Sie beispielsweise folgende Zeile hinzuf gen suchthread join Ein Thread l sst sich bei Bedarf auch verlangsamen Die zust ndige Methode hei t sleep sie kann sowohl innerhalb eines Threads ohne Objektbezug als auch f r eine benannte Thread Instanz von au en aufgerufen werden Das Argument ist die gew nschte Pause in Sekunden ein Float damit auch Sekundenbruchteile m g lich sind Das folgende Beispiel f hrt im Haupt Thread einen Countdown von zehn Sekun den durch 10 downto o n puts n sleep 1 Im Gegensatz zu Prozessen besitzen Threads keinen separaten Speicherbereich so dass sie sich alle vor der Thread Erzeugung definierten Variablen teilen Der Vorteil ist dass dabei keine speziellen Kommunikationsverfahren zum Einsatz kommen m ssen Das folgende Beispiel definiert eine Variable namens a und erzeugt dann drei Threads Jeder Thread erh ht a um 1 und gibt dann ihren Wert aus Prozesse und Threads 267 threads a 10 puts Anfangswert a 3 times threads lt lt Thread new at 1 puts Wert im Thread a Die Ausgabe lautet Anfangswert 10 Wert im Thread 11 Wert im Thre
157. MVC folgt Ruby on Rails zwei weiteren wichti gen Entwurfsprinzipien die sich direkt aus der hoffentlich auch in diesem Buch deutlich gewordenen Ruby Philosophie ergeben e Don t Repeat Yourself DRY Wenn Sie es richtig angehen brauchen Sie bei einer Rails Anwendung jedes St ck Ruby Code und sogar die meisten Teile Ihrer HTML Vorlagen nur einmal zu schreiben e Convention over Configuration Ein klarer Satz von Konventionen bestimmt die meisten Beziehungen zwischen Model View und Controller so dass Sie nur wenige Informationen in Konfigurationsdateien festlegen m ssen Beispiels weise werden die Model Klassen automatisch aus den Datenbanktabellen 334 Kapitel 7 Ruby on Rails Browser X Formulardaten A HTML 1 Controller Datenstruktur F Persistenz v Datenbank Abbildung 7 1 Das MVC Muster mit konkreten Erweiterungen die Ruby on Rails nutzt generiert und wenn an irgendeiner Stelle mehrere Instanzen einer bestimmten Klasse Abbildung mehrerer Datens tze gemeint sind erzeugt Rails bei den meisten englischen Bezeichnungen automatisch den korrekten Plural Das Framework besteht aus den folgenden Einzelkomponenten e Active Record ist die Datenbankschnittstelle und damit der Model Teil von MVC Die Komponente f hrt ein so genanntes objektrelationales Mapping ORM durch bildet also Ruby Objekte auf relationale Datenbankstrukturen ab und umgekehr
158. Methode 66 chop Methode 66 chr Methode 67 downcase Methode 66 each_byte Iterator 104 gsub Methode 98 length Methode 66 Referenz 368 reverse Methode 66 split Methode 71 sub Methode 98 swapcase Methode 66 upcase Methode 66 String Methoden 66 Strings 41 Anf hrungszeichen 42 Eingebettete Ausdr cke 42 Escape Sequenzen 42 HIER Dokumente 43 konvertieren in 70 Quoting Operatoren 43 verketten mit 61 vervielfachen mit 61 Zeilenumbruch entfernen 66 Zerlegen 71 Stylesheets siehe CSS sub Methode 98 submit Methode 303 Subnet Mask siehe Teilnetzmaske sum eigene Array Erweiterung 188 super Konstruktor d Elternklasse 199 swapcase Methode 66 Symbole 45 Syntax von Ruby 31 Systemzeit auslesen 138 T tan Math Methode 65 TCP siehe Transmission Control Protocol TCP IP 219 Anwendungsprotokolle 241 Kommunikationsablauf 221 Nameserver 227 NAT 225 nslookup 227 ping 226 Routing 222 226 Schichtenmodell 220 Sockets 229 traceroute 226 Transportprotokolle 227 390 Index TCPServer Klasse 232 TCPSocket Klasse 231 Teilnetzmaske 225 temperatur rb Skript 293 Templates Rails 340 Terminal 10 text_field Methode 301 textarea Methode 301 textblog txt Skript 130 Texteditoren berblick 17 TextPad Editor 18 Thread Klasse 266 join Methode 267 sleep Methode 267 Threading Server 268 Threads 266 verlangsamen 267 Time Klasse 138 day Methode 139 hour Methode 139 min Methode 139 month Methode 139 no
159. Normal when DRINGEND Wichtig end end Formatierten Termin zurueckgeben def get_termin ausgabe sprintf s n s nPrioritaet s n Termin datum datum eintrag get_prioritaet ausgabe end end t1 Termin new 18 00 Backup Tapes wechseln t2 Termin new 2006 11 08 9 00 Kundenberatung Linux Migration Termin DRINGEND t3 Termin new 2006 11 09 Spam loeschen Termin NIEDRIG Aktuelles Datum d Time new printf Es ist jetzt s n n Termin datum d puts TO DO puts puts t1 get_termin puts puts t2 get_termin puts puts t3 get_termin Hier ist die Ausgabe des Skripts nach dessen Ausf hrung gt ruby termine rb Es ist jetzt 07 11 2006 16 48 TO DO 07 11 2006 18 00 Backup Tapes wechseln Prioritaet Normal 180 Kapitel 4 Eigene Klassen und Objekte erstellen 08 11 2006 09 00 Kundenberatung Linux Migration Prioritaet Wichtig 09 11 2006 00 00 Spam loeschen Prioritaet Niedrig Den Code m ssten Sie mittlerweile ohne l ngere Erkl rungen verstehen Die Klas senmethode um die es hier vor allem geht besitzt folgende Definition def Termin datum dat dat strftime d m Y H M end Die Methode wird einmal innerhalb und einmal au erhalb der Klasse aufgerufen Der erste Aufruf steht in der Instanzmethode get_termin er formatiert das in der Instanzvariablen datum gespeicherte Datum ausgabe sprintf s n s nPrioritaet s n Termin datum datum eintrag g
160. P Verbindungen in der Regel Clients sowie TCPServer f r eigene Serverdienste Beide wurden anhand eines einfachen Beispiels einem erweiterten ECHO Server der lediglich die Client Anfrage zur cksendet und dem zugeh rigen Client erl utert Neben den einfachen Sockets stellt Ruby eine Reihe weiterer Bibliotheken zur Ver f gung mit denen Sie bequemer auf verschiedene Anwendungsprotokolle zugreifen k nnen Als besonders prominenter Vertreter wurde Net HTTP vorgestellt und zwar zur Implementierung eines richtigen kleinen zeilenbasierten Webbrowsers Im letzten Abschnitt schlie lich drehte sich alles um das Thema Nebenl ufigkeit In der Praxis m ssen TCP Server in der Lage sein mehrere Client Verbindungen gleichzeitig zu verarbeiten Zu diesem Zweck wurde zun chst der auf UNIX Sys teme beschr nkte Umgang mit Prozessen vorgestellt Wenn Sie Windows verwen den stehen Ihnen dagegen nur die im Anschluss erl uterten Threads zur Verf gung Beide Varianten wurden durch eine Neuimplementierung des ECHO Servers mit der jeweiligen Technik veranschaulicht Die n chsten beiden Kapitel besch ftigen sich weiterhin mit Netzwerkthemen allerdings auf einer h heren Ebene Zun chst erfahren Sie wie Sie in Ruby klassi sche Webanwendungen mit einem externen Webserver schreiben k nnen anschlie end wird das moderne Web Framework Ruby on Rails vorgestellt Zusammenfassung 271 In diesem Kapitel KAPITEL 6 EB Klassische
161. Portnummer alle Zei chen vor dem ersten und der Pfad der gesamte Rest des Strings extrahiert Zeile 10 15 Wenn der Hostname einen Doppelpunkt enth lt wird die dahin ter befindliche Portnummer abgetrennt Ansonsten wird der HTTP Standard port 80 festgelegt Zeile 17 Die drei Werte Host Port und Pfad werden zum Schluss als Array zur ckgegeben Zeile 20 Da der WrapPager zur Anzeige jeder geladenen Webseite ben tigt wird wird an dieser Stelle ein f r alle Mal eine Instanz dieser Klasse erzeugt 252 Kapitel 5 Netzwerkanwendungen Zeile 22 26 Der hier definierte Hash entities enth lt die wichtigsten Sonder zeichen die w hrend der Verarbeitung des HTML Codes ersetzt werden Auf grund der in Kapitel 2 beschriebenen Zeichensatzinkompatibilit t zwischen Windows und seiner Eingabeaufforderung werden f r die deutschen Umlaute die Ersetzungen ae oe und so weiter festgelegt Zeile 27 30 Eingabe der ersten URL Um v llig leere Eingaben abzufangen wurde der Vorgang in eine Schleife eingebettet Dieser spezielle Schleifentyp eine fu gesteuerte Schleife pr ft die Bedingung erst nach dem Schleifenrumpf so dass zumindest der erste Durchgang stattfinden muss In Ruby erreichen Sie das durch die Kombination eines begin end Blocks mit einem nachgestellten while Zeile 32 158 Die Hauptschleife des Programms in der eine Seite nach der anderen angefordert werden kann Sie ist als Endlosschleife konzipiert und kann s
162. Position index end Ein Array nach einem bestimmten Wert durchsuchen def suchen array wert array each with index a_ wert index if a_ wert wert suchergebnis index wert end end Array mit 10 000 Zufallszahlen 1 100 erzeugen arr 1 10000 collect rand 100 1 Thread erzeugen und mit Suche nach 13 beauftragen suchthread Thread new suchen arr 13 Haupt Thread in 1000er Schritten bis 10 000 zaehlen 10001 times x if x 1000 266 Kapitel 5 Netzwerkanwendungen puts Haupt Thread ist bei x end Leiten Sie die Ausgabe dieses Beispiels such rb am besten in eine Datei um damit Sie einen Eindruck von der Ausf hrungsreihenfolge der Threads bekommen Sie werden feststellen dass sich die Ausgabe der Hauptschleife und der Suchergebnisse blockweise abwechselt damit Sie dies schneller erkennen k nnen wurden die Aus gabezeilen des Such Threads etwas einger ckt Der in der Suchen Funktion verwendete Iterator each with index wurde bisher noch nicht besprochen Wie Sie sehen liefert er f r jedes Array Element zwei Werte in den Block n mlich den Wert des aktuellen Elements sowie dessen Index Der Thread wird mit Hilfe folgender Zeilen erzeugt suchthread Thread new suchen arr 13 Die Ausf hrung beginnt unmittelbar nach der Erzeugung des Threads abwech selnd mit den anderen Threads des Programms wobei auch das Hauptprogramm einen Thread darstellt
163. Praxiswissen Rub Von den Grundlagen bis zur Objektorientierung Web und Netzwerk anwendungen mit Ruby Mit wertvollem Zusatzwissen O REILLY Sascha Kersken Praxiswissen Ruby Sascha Kersken O REILLY Beijing Cambridge Farnham K ln Paris Sebastopol Taipei Tokyo Die Informationen in diesem Buch wurden mit gr ter Sorgfalt erarbeitet Dennoch k nnen Fehler nicht vollst ndig ausgeschlossen werden Verlag Autoren und bersetzer bernehmen keine juristische Verantwortung oder irgendeine Haftung f r eventuell verbliebene Fehler und deren Folgen Alle Warennamen werden ohne Gew hrleistung der freien Verwendbarkeit benutzt und sind m glicherweise eingetragene Warenzeichen Der Verlag richtet sich im Wesentlichen nach den Schreibweisen der Hersteller Das Werk einschlie lich aller seiner Teile ist urheberrechtlich gesch tzt Alle Rechte vorbehalten einschlie lich der Vervielf ltigung bersetzung Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen Kommentare und Fragen k nnen Sie gerne an uns richten O Reilly Verlag Balthasarstr 81 50670 K ln Tel 0221 9731600 Fax 0221 9731608 E Mail kommentar oreilly de Copyright der deutschen Ausgabe 2007 by O Reilly Verlag GmbH amp Co KG 1 Auflage 2007 Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografi
164. Schritt wie Sie mit Rails eine einigerma en realisti sche Webanwendung erstellen k nnen Auf Action Mailer Action Web Service Active Support sowie das Deployment die Ver ffentlichung auf einem Produk tions Webserver kann dabei aus Platzgr nden leider nicht eingegangen werden Wenn Sie nach dem Durcharbeiten dieses Kapitels auf den Geschmack gekommen sind empfehlen wir Ihnen das Buch Praxiswissen Ruby on Rails von Denny Carl das ebenfalls in der vorliegenden Reihe bei O Reilly erschienen ist Rails installieren und in Betrieb nehmen Die meisten Installationsanleitungen f r Ruby on Rails beschreiben zuerst wie Ruby installiert wird Wenn Sie in diesem Buch bis hierher gekommen sind d rften Sie dies allm hlich hinter sich haben Falls Sie mit diesem Kapitel angefangen haben um sich zuerst Rails anzuschauen bl ttern Sie kurz zur ck zu Kapitel 1 und befolgen Sie die dortige Installationsanleitung Als N chstes brauchen Sie den Erweiterungsmanager rubygems Falls er nicht vor handen ist finden Sie im vorigen Kapitel Informationen zu seiner Installation Nun k nnen Sie folgende Befehle eingeben um Ruby on Rails zu installieren gt gem update gt gem install rails include dependencies Warten Sie eine Weile und verfolgen Sie dabei die verschiedenen Meldungen Schon steht Rails zur Verf gung Um vollwertige MVC Anwendungen zu erstellen ben tigen Sie zuletzt eine Daten bank sowie die entsprechenden Klassen damit R
165. Server ist die Selbstidentifikation der Webserver Software bei Apache wird ihre Ausf hrlichkeit durch die weiter unten beschriebene Direktive ServerTo kens gesteuert e Last Modified enth lt Datum und Uhrzeit der letzten nderung Browser und Proxy Caches nutzen diese Angabe um zu entscheiden ob die zwischenge speicherte Version noch g ltig ist F r solche Pr fungen existiert brigens die spezielle HTTP Anfragemethode HEAD die nur die Header aber nicht die eigentliche Ressource anfordert e ETag Entity Tag ist ein aus verschiedenen Angaben berechneter Hashwert der die Identit t eines Dokuments ber die URL oder den Dateinamen hinaus berpr ft Auch dies ist f r Caching Zwecke wichtig e Accept Ranges bytes gibt an dass der Server Anfragen nach Teilbereichen einer Ressource akzeptiert Das macht sich beispielsweise der Adobe Acrobat Reader zunutze um umfangreiche PDF Dokumente st ckweise anzufordern Content Length ist die Gr e des Bodys also der gelieferten Datei in Byte e Connection entspricht dem gleichnamigen Anfrage Header Der Server gibt an ob er das Offenhalten der Verbindung best tigt Keep Alive oder ablehnt close Content Type ist der wichtigste Antwort Header Er gibt den Datentyp MIME Typ der gelieferten Ressource an damit der Client wei wie er die empfange nen Daten behandeln soll Nach einer Leerzeile folgt der Body also der eigentliche Inhalt der Antwort Im Bei spiel wurde er
166. Unterverzeichnis cd mysql ruby 2 7 Nun wird das Skript extconf rb unter Angabe Ihres MySQL Verzeichnisses aufgeru fen Zum Beispiel ruby extconf rb usr local mysql Zum Schluss werden make und make install aufgerufen make make install Zugriff auf Datenbanken 321 Der Ruby Erweiterungsmanager rubygems rubygems ist ein verteiltes Internetarchiv f r Ruby Erweiterungen Ein Netzwerk von Mirror Servern aus denen automatisch ausgew hlt wird macht den Download von Paketen schnell und zuverl ssig In neueren Ruby Versionen ist die Unterst tzung bereits ab Werk vorhanden Wenn nicht m ssen Sie zun chst rubygens selbst installieren Besuchen Sie dazu die Site http www rubyforge org und verwenden Sie die Suchfunktion um das Paket rubygems zu finden Laden Sie die f r UNIX geeignete tar gz oder die zu Windows passende zip Datei herunter Entpacken Sie das Archiv und f hren Sie dann auf der Konsole innerhalb des ausgepackten Verzeichnisses folgendes Kom mando aus gt ruby setup rb Nachdem rubygenms zur Verf gung steht k nnen Sie den Manager ber das Konso lenkommando gem bedienen Der erste Schritt sollte stets darin bestehen die vor handenen durch rubygems installierten Erweiterungen zu aktualisieren Dies geschieht folgenderma en gt gem update Um ein Paket zu installieren dessen Namen Sie bereits kennen gen gt danach die Eingabe gt gem install Paketname Das folgende Beispiel di
167. Willkommen beim O Reilly Verlag amp 8217 REILLY VERLAG arenkorb Home 1 Produkte 2 Bestellen 3 OpenBooks 4 Kontakt 5 gt Ueber O Reilly 6 EATURED NEW RELEASES gt Englischsprachige Neuerscheinungen 7 8 gt Java Generics and Collections 9 covers everything from the mos asic uses of generics to the strangest corner cases It teaches yo verything you need to know about the collections libraries so you lways know which collection is appropriate for any given task and ow to use it WEITER ENTER ENDE QILENTER Eingabeaufforderung ruby httpclient rb 6 catalog hfdesignpatger catalog linuxpgger 8 catalog typo3ckbkger 9 catalog hf java2ger 8 catalog ajaxbasger catalog oobasehasger 2 catalog asteriskger 3 oreilly katalog html 4 oreilly majordomo form html 5 special fug messen author newsarchive oreilly contact html http www oreilly com cn http www oreilly fr http www oreilly com WEITER ENTER ENDE QILENTER http www oreilly co jp http www oreilly com tw oreilly privacy html oreilly contact html sales bookstores INK oder URL gt _ an WNES vor Abbildung 5 4 Der kleine Ruby Textbrowser im Einsatz erster und letzter Bildschirm von www oreilly de G ltige Beispiele w ren etwa buecher lingoworld de ruby oder localhost 8000 seite html Zeile 5 8 Aus der URL werden der Host eventuell mit
168. Zugriff auf Datenbanken Die Mehrheit aller modernen Webanwendungen greift auf eine Datenbank zur ck um die Seitenstruktur mit dynamischen Inhalten zu f llen sowie um benutzergene rierte Inhalte dauerhaft zu speichern Nat rlich k nnen Sie Ihre Katalogdaten Foren G steb cher und andere Inhalte auch in Textdateien unterbringen Aber bei h ufigen Zugriffen verlangsamt dies Ihre Anwendungen und Sie m ssten sich selbst darum k mmern gleichzeitige Schreibzugriffe in den Griff zu bekommen In einer Datenbank k nnen Sie dagegen fast beliebig umfangreiche Informationen speichern und um den Zugriffsschutz und hnliche Stabilit tsfragen k mmern sich gute Datenbankserver auch automatisch Wenn Sie Anwendungen mit dem im n chsten Kapitel exklusiv vorgestellten Web Framework Ruby on Rails erstellen basieren diese von vornherein auf einer Daten bankstruktur Die eingebaute Datenbankschnittstelle Active Record erledigt dabei hinter den Kulissen die Umsetzung Ihrer Ruby Objekte in Datens tze und umge kehrt In diesem Abschnitt geht es jedoch um die traditionelle Art des Datenbank zugriffs Ihre Anwendung sendet dem Datenbankserver SQL Code dieser antwortet auf nderungsbefehle mit einer Erfolgs oder Fehlermeldung und auf Lesebefehle mit Datens tzen die Ihren Suchkriterien entsprechen Datenbanksysteme gibt es heutzutage wie Sand am Meer Die meisten von ihnen sind so genannte relationale Datenbanken die ihre Daten in miteinander verkn
169. Zun chst einmal gibt es die vier klassischen Grundrechenarten e Addition e Subtraktion e Multiplikation e Division Wie bereits im vorigen Kapitel gezeigt k nnen Sie diese Operatoren leicht mit numerischen Literalen in irb ausprobieren Hier einige Beispiele zur Anregung gt 17 4 gt 21 gt gt 93 51 gt 42 gt gt 10 2 3 gt 23 gt 17 2 gt 8 gt gt 17 0 2 gt 8 5 Das Ph nomen aus dem vorletzten Beispiel wurde bereits beschrieben Wenn beide Operanden bei der Division ganzzahlig sind wird auch das Ergebnis als ganze Zahl ausgegeben und dabei nicht etwa gerundet sondern abgeschnitten Aus Sicher heitsgr nden m ssen Sie also mindestens einen der Operanden explizit als Flie kommazahl hinschreiben Wenn Sie dabei keine Literale sondern Variablen verwenden m ssen Sie die weiter unten beschriebene Float Konvertierungsme thode to_f benutzen Neben den vier Standard Grundrechenarten kennt Ruby noch zwei weitere arith metische Operationen e ist der so genannte Modulo Operator er liefert den Rest der ganzzahligen Division Hier einige Beispiele gt 3 2 gt 1 gt 18 7 gt 4 gt 9 3 gt 0 Variablen Ausdr cke und Operationen 51 e ist der Potenz Operator der den ersten Operanden mit dem zweiten poten ziert Einige Beispiele gt gt 2 10 gt 1024 gt gt 7 3 gt 343 gt gt 5 0 10 4 gt 0 0005 Im weiteren Sinne
170. abe meines Buchs Kompendium der Informationstechnik In Beispiel 1 1 sehen Sie zun chst den Quellcode Geben Sie ihn einfach in Ihren Lieblingseditor ein Keine Sorge wenn Sie sich vertippen werden Sie eine entspre chende Fehlermeldung erhalten Ausf hrliche Erl uterungen folgen nach dem Lis ting Beispiel 1 1 Das erste Ruby Programm hello rb puts Hallo Welt jetzt Time new puts Es ist jetzt jetzt puts Wie heissen Sie name gets name chomp puts Hallo name Begeben Sie sich nach der Eingabe in das Verzeichnis in dem Sie das Skript gespei chert haben Rufen Sie es folgenderma en auf ruby hello rb In beiden F llen wird das Skript nun ausgef hrt In Abbildung 1 2 sehen Sie den Verzeichniswechsel und die Ausf hrung in der Windows Eingabeaufforderung Hier ein Textbeispiel ruby hello rb Hallo Welt Es ist jetzt Tue Aug 08 20 37 23 Westeuropaeische Normalzeit 2006 Wie heissen Sie Sascha Hallo Sascha 6 Dieses Beispiel wurde noch mit Ruby 1 8 4 erstellt In Version 1 8 5 wurde das Standardformat f r Datum und Uhrzeit leicht ge ndert hier lautet die Ausgabe Tue Aug 08 20 37 23 0100 2006 Statt der Zeitzone wird also nun die Differenz zur UTC angezeigt Diese Schreibweise hei t RFC 1123 Datums format und wird zum Beispiel in vielen Logdateien verwendet Hello World hello Ruby das erste Ruby Programm 19 ex Eingabeaufforderung Microsoft Windows XP Versi
171. acheinander eine Stunde einen Tag und eine Woche zur aktu ellen Systemzeit gt gt t Time new gt Sun Oct 22 12 11 31 0200 2006 gt gt t 3600 gt Sun Oct 22 13 11 31 0200 2006 gt gt t 86400 gt Mon Oct 23 12 11 31 0200 2006 gt gt t 86400 7 gt Sun Oct 29 11 11 31 0100 2006 Wichtig ist in diesem Fall dass Sie hinter dem beziehungsweise anders als bei den gleichnamigen arithmetischen Operationen ein Leerzeichen setzen Andern falls erhalten Sie eine Fehlermeldung 142 Kapitel3 Ruby Klassen 29 Oktober 2006 um 03 00 Uhr morgens von Sommer auf Winter W Der Zeitsprung im letzten Beispiel liegt daran dass die Uhr am y zeit umgestellt wurde Das sehen Sie auch an der ge nderten UTC Differenz vorher zwei Stunden danach eine Stunde Anwendungsbeispiel Ein kleiner Konsolenkalender Das kleine Skript in diesem Unterabschnitt gibt einen Monatskalender aus wobei Monat und Jahr aus dem Systemdatum ermittelt werden Tippen Sie das Listing aus Beispiel 3 4 zun chst ein und speichern Sie es als kalender rb Danach erhalten Sie die bliche Beschreibung der Programmzeilen und ein Ausgabebeispiel Beispiel 3 4 Der Konsolen Monatskalender kalender rb upw he O Wong r 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Datum ermitteln jetzt Time new d jetzt day jetzt month y jetzt year Laengen aller Monate Schal
172. ad 12 Wert im Thread 13 Der Operator lt lt ist brigens eine Kurzschreibweise f r die Array Methode push siehe Kapitel 2 Gegen ber Thread Implementierungen vieler anderer Programmiersprachen haben Ruby Threads zus tzlich den Vorteil dass lokal definierte Variablen Ihre Privatan gelegenheit sind Das liegt daran dass Bl cke einen in sich abgeschlossenen Gel tungsbereich bilden Es gibt einen speziellen Trick eine Variable in jeden neu erzeugten Thread hinein zukopieren aber innerhalb der Threads unabh ngig zu behandeln Sie brauchen die Variable nur als Parameter von Thread new einzusetzen und dann innerhalb des Thread Blocks als Variable abzuholen Hier ein Beispiel das auf diese Weise die Threads z hlt threads 1 upto 4 lil threads lt lt Thread new i n puts Ich bin Thread Nr n Was dieses Beispiel ausgibt k nnen Sie sich wahrscheinlich denken Wenn nicht probieren Sie es einfach aus Threading Server Mit den Socket Informationen in diesem Kapitel und den Thread Grundlagen aus dem vorigen Abschnitt d rfte es nicht schwerfallen eine Thread Variante des ECHO Servers zu erstellen In Beispiel 5 7 wird der vollst ndige Code dieser letzten Version gezeigt Anders als der Forking Server kann diese Version auch unter Win dows verwendet werden 268 Kapitel 5 Netzwerkanwendungen Beispiel 5 7 Die Threading Version des ECHO Servers echothreadserver rb 1 require socket
173. age ausgegeben Der Abbruch erfolgt dabei mittels exit 1 der von 0 verschiedene R ckgabewert signalisiert dem Betriebssystem dass etwas nicht in Ordnung ist Zeile 20 22 Die beiden Zahlen und der Operator werden aus den Kommando zeilenargumenten gelesen und in anderen Variablen gespeichert Auf die Zah len wird die bereits bekannte Float Umwandlungsmethode to_f angewendet der Operator bleibt ein String Zeile 24 28 Der eingegebene Operator wird mit dem regul ren Ausdruck x verglichen Dieser steht f r Ausdrucksbeginn eines der Zeichen x oder Ausdrucksende Wie Sie bereits wissen m ssen die Sonderzeichen und durch einen Backslash gesch tzt werden weil sie in regul ren Ausdr cken selbst eine besondere Bedeutung haben Wenn die Eingabe diesem Schema nicht entspricht Operator erfolgen wieder Fehlermeldung und Abbruch Wahrscheinlich fragen Sie sich an dieser Stelle warum f r die Multi A plikation ein x und nicht das bliche verwendet wird Das liegt 1 daran dass das f r das Betriebssystem als Platzhalter gilt beim Ruby Skript kommt dieses Zeichen gar nicht erst an sondern statt dessen der erste Verzeichniseintrag UNIX beziehungsweise der erste Verzeichniseintrag ohne Endung Windows Genauere Details ber Datei Platzhalter finden Sie im Abschnitt Zu Unrecht gef rchtet Arbeiten mit der Konsole in Kapitel 1 e Zeile 30 34 Wenn der Operator und der zweite Operand
174. alhost 3000 album ist Erste Schritte B Aktuelle Nachrichten Alle Bands und ihre Alben Metallica USA Master of Puppets 1986 o Ride The Lightning 1984 o Metallica 1991 Iron Maiden United Kingdom The Number Of The Beast 1982 Die rzte Germany Die Bestie in Menschengestalt 1993 Led Zeppelin United Kingdom Die Toten Hosen Germany Extreme USA Abbildung 7 6 Die Ausgabe der Action View albumllist Stoppen Sie WEBrick danach wieder denn nun kommt die Tabellenansicht an die Reihe Erg nzen Sie den Stub der Methode table zu def table Tabelleninhalt tab lt tr gt lt th gt Album lt th gt 352 Kapitel 7 Ruby on Rails lt th gt Jahr lt th gt lt th gt Band Land lt th gt tab lt tr gt Album find all order_by gt title each Jal tab lt tr gt tab lt td gt a title lt td gt tab lt td gt a release_year lt td gt b Band find a band id tab lt td gt b name b country tab lt tr gt Veroeffentlichung albumtable tab end K mmern Sie sich danach um die View table rhtml lt html gt lt head gt lt title gt Rails n Roll Alben Tabelle lt title gt lt head gt lt body gt lt h1 gt Tabelle aller Alben lt h1 gt lt table border 2 cellpadding 8 gt lt albumtable gt lt table gt lt body gt lt html gt Wenn Sie WEBri
175. alisiert dem Browser dass nun der Body folgt CGl Skripten mit Ruby 287 Mit diesem Vorwissen k nnen Sie leicht Ihr erstes CGI Skript schreiben Hier der vollst ndige Code usr bin ruby w puts Content type text html charset iso 8859 1 puts puts lt html gt puts lt head gt puts lt title gt Ruby CGI Skript lt title gt puts lt head gt puts lt body gt puts lt h1 gt HALLO WELT lt h1 gt puts Ein CGI Skript erzeugt Time new puts lt body gt puts lt html gt Vergessen Sie nicht gegebenenfalls die Shebang Zeile anzupassen Speichern Sie das Skript danach je nach Konfiguration im Verzeichnis cgi bin oder irgendwo in Ihrem Website Verzeichnis htdocs ffnen Sie dann einen beliebigen Webbrowser und geben Sie die passende URL zum Beispiel localhost cgi bin hello rb ein Abbil dung 6 1 zeigt das Ergebnis in dem kleinen Textbrowser aus dem vorigen Kapitel Eingabeaufforderung ruby httpclient rb z rubytest gt ruby httpelient rh RL gt localhost hello rb ole hello rb von localhost 88 uby CGI Skript ALLO WELT a SEE Skript erzeugt Wed Dec 27 88 52 16 Westeurop ische Normalzeit Abbildung 6 1 Ausgabe des ersten Ruby CGI Skripts im Textbrowser aus Kapitel 5 Das n chste Beispiel ist bereits viel n tzlicher Es gibt eine HTML Tabelle mit den Namen und Werten aller Umgebungsvariablen aus Umgebungsvariablen sind Vor einstellungen im Ausf hrungskontext ein
176. andeln k nnen string split teilt einen String an einem beliebigen Trennzeichen in Elemente eines Arrays auf und array join verbindet die Elemente des Arrays zu einem String getrennt durch eine frei w hl bare Zeichensequenz split verwendet standardm ig Whitespace beliebig viele Leerzeichen Tabulato ren und Zeilenumbr che als Trennzeichen Hier zwei Beispiele Variablen Ausdr cke und Operationen 71 gt gt Dies ist ein Satz split gt Dies ist ein Satz gt gt Dies nist noch tein n Satz split gt Dies ist noch ein Satz Wenn Sie einzelne Zeichen haben m chten geben Sie einfach den leeren String als Trennzeichen an gt gt Alle Zeichen split gt A ln 1 ver n ar VAA Tang a Ye h tem ene Sie k nnen aber auch eine beliebige andere Zeichensequenz angeben Auch daf r sehen Sie hier ein Beispiel gt gt ice_strecke Hannover Dortmund Essen Duesseldorf Koeln gt gt ice_strecke split gt Hannover Dortmund Essen Duesseldorf Koeln Statt eines literalen Strings k nnen Sie auch einen regul ren Ausdruck also ein Suchmuster als Trennzeichen verwenden Das wird weiter unten im entsprechen den Abschnitt besprochen Bei join k nnen Sie das Trennzeichen ebenfalls weglassen In diesem Fall werden die Array Elemente aber einfach ohne Abstand zusammengef gt was meistens nicht erw nscht ist Hier ein Beispiel f
177. apitel 2 Sprachgrundlagen Tabelle 2 2 Ruby Sprachelemente im Textmanipulierer Beispiel und in diesem Buch Skriptzeilen Code Thema Seite 1 32 class ModText Klassen entwerfen und implementieren 163 end 4 6 def initialize Der Konstruktor 167 end 8 31 def Methoden 169 end 5 9 txt txt Der Konstruktor Instanzvariablen 167 13 txt R ckgabewerte 175 22 txt reverse String Methoden 66 26 txt Regul re Ausdr cke im Einsatz 97 gsub aeiou i 30 txt tr A Z a z Regul re Ausdr cke im Einsatz 97 N ZA M m za m 34 mtext Der Konstruktor Instanziierung 167 ModText new 36 39 printt Morg y ess Einfache Ausgabe 114 41 mtext Methoden 169 set_text Diese Worte sind neu Grundlagen der Syntax Wenn Sie eine neue Sprache erlernen besteht eine erste Herausforderung darin zu erkennen wie sinnvolle S tze bei einer Programmiersprache Anweisungen genannt konstruiert werden Dieser Grundaufbau einer Sprache wird als Syntax bezeichnet Beachten Sie dabei den entscheidenden Unterschied zwischen nat rli chen Sprachen und Programmiersprachen Erstere bieten meist eine enorme Band breite an Ausdrucksm glichkeiten sowie eine hohe Fehlertoleranz w hrend Letztere Ihnen sehr enge Grenzen stecken Das ist keine b se Absicht der Program miersprachenentwickler sondern liegt daran dass der Computer als digitale Maschine eben nicht denken sondern nur ziemlich schnell rechnen kann F r Skriptspra
178. ar Code zurueckliefern 29 def rot13 30 txt tr A Z a z N ZA M m za m 31 end 32 end 33 Neues ModText Objekt mit Inhalt erzeugen 34 mtext ModText new Hallo meine liebe Welt 28 Kapitel 2 Sprachgrundlagen Beispiel 2 2 modtext rb der objektorientierte Textmanipulierer Fortsetzung 35 Ausgabe der verschiedenen Methoden 36 printf Originaltext s n mtext get_text 37 printf Umgekehrt s n mtext turn 38 printf Versteckte Vokale s n mtext hide_vowels 39 printf ROT13 s n mtext rot13 40 Text aendern 41 mtext set_text Diese Worte sind neu 42 Ausgabe des Objekts als Text 43 ruft automatisch to_s auf 44 printf Neuer Text s n mtext F hren Sie das Skript nun wie gewohnt aus gt ruby modtext rb Sehen Sie sich die mehrzeilige Ausgabe an siehe Abbildung 2 2 Vergleichen Sie sie mit den daf r verantwortlichen printf Anweisungen im letzten Teil des Skripts ex C rubytest jol x rubytest gt ruby modtext rb riginaltext Hallo meine liebe Welt mgekehrt ttleW ebeil eniem ollaH ersteckte Vokale H 11 m n l h Welt 0113 Umxxa yquzg xugng Jgxft euer Text Diese Worte sind neu rubhytest gt _ Abbildung 2 2 Ausgabe des objektorientierten Textmanipulierers Das vorliegende Programm besteht aus drei logischen Teilen Der erste Teil Zeile 1 bis 32 ist die Definition der Klasse ModText class ModText end Die einzelnen def
179. ar weglassen Auch die Variante wertet Escape Sequenzen und einge bettete Ausdr cke aus Die Ausrufezeichen k nnen je nachdem welche Zeichen innerhalb der Strings selbst ben tigt werden durch andere Zeichen ersetzt werden zum einen durch alle Arten von Klammern n mlich und sogar lt gt zum anderen aber auch durch zwei gleiche Zeichen wie oder gar Der gr te Vorteil dieser Varianten besteht wie bereits erw hnt darin dass Anf h rungszeichen ohne Escaping verwendet werden k nnen Ein Beispiel hier mit Klammern statt Ausrufezeichen weil Letztere im Text selbst vorkommen gt gt puts 0 Du musst mir helfen rief er Sie sind hinter mir her Du musst mir helfen rief er Sie sind hinter mir her An jeder Stelle an der ein String stehen kann besteht auch die M glichkeit ein so genanntes HIER Dokument zu verwenden benannt nach der Tatsache dass es bis HIER das hei t bis zu einer speziellen Endmarkierung reicht Jedes HIER Doku Variablen Ausdr cke und Operationen 43 ment beginnt dabei mit der Sequenz lt lt Name_der Markierung und endet mit einer Zeile in der die Markierung erneut steht Hier zwei typische Beispiele ein Ausga bebefehl und eine Variablen Wertzuweisung mehr zu Letzteren lesen Sie weiter unten gt gt puts lt lt ENDMARKE Text mehr Text ENDMARKE Text mehr Text gt gt var lt lt ENDMARKE Text
180. ariable selbst enthalten und so ihren bisherigen Wert modifizie ren Das folgende Beispiel erh ht den Wert der Variablen zaehler um 1 zaehler zaehler 1 Der Name einer Variablen der so genannte Bezeichner kann aus Buchstaben Zif fern und Unterstrichen bestehen und beliebig lang sein Das erste Zeichen darf keine Ziffer sein Ruby unterscheidet bei Bezeichnern zwischen Gro und Kleinschrei 46 Kapitel 2 Sprachgrundlagen bung Variablennamen beginnen standardm ig mit einem Kleinbuchstaben Ruby selbst verwendet f r seine eigenen Bezeichner sofern sie aus mehreren W rtern bestehen keinen CamelCode Binnenmajuskeln sondern trennt die einzelnen W rter durch Unterstriche Sie sollten sich auch bei selbst gew hlten Bezeichnern an diese Konvention halten Hier einige Beispiele f r g ltige und typische Variablennamen in Ruby en e zahl e text1 e neuer wert Eine Liste ung ltiger Bezeichner wird hier aus didaktischen Gr nden nicht ver f fentlicht denn Menschen neigen dazu sich Gedrucktes auch dann einzupr gen wenn es falsch ist Normalerweise existiert eine Variable nur innerhalb der Umgebung in der sie defi niert wurde das wird als ihr so genannter G ltigkeitsbereich oder Geltungsbereich Englisch scope bezeichnet N heres dazu erfahren Sie im bern chsten Kapitel da Methoden Klassen und Module zahlreiche Besonderheiten mit sich bringen Soll eine Variable unabh ngig von allen G ltigkei
181. ariablen waggons und geben true zur ck wenn die neue Anzahl im Rah men des M glichen liegt und ansonsten einfach false Danach kann waggons ein fach zur Konstruktion der neuen Instanz verwendet werden da der Wert bereits korrekt ist Im Grunde k nnte man sich sogar das if sparen w rde dann aber bei einer missgl ckten nderung der Waggonanzahl eine berfl ssige Instanziierung durchf hren Hier noch ein besonders interessantes Beispiel Erinnern Sie sich noch daran dass in Kapitel 2 die Rede davon war man k nne keine Strings subtrahieren Nun von Hause aus kann Ruby das auch nicht Aber nichts h lt Sie davon ab der Klasse String eine Methode namens zu spendieren die den angegebenen Teilstring aus dem urspr nglichen Text l scht Da man per Textindex auf Strings zugreifen kann ist das ein Kinderspiel class String def txt self txt self end end Probieren Sie es aus gt gt Ruby ist unflexibel un gt Ruby ist flexibel gt gt ball 0 LS alle Wie Sie sehen k nnen Sie den abzuziehenden Teil sowohl als Text als auch numerisch angeben weil beide Varianten als Index zul ssig sind Rekursion Unterverzeichnisse durchsuchen Als komplexeres Beispiel f r die Arbeit mit Methoden wird hier das im vorigen Kapitel angek ndigte Skript gezeigt das die Inhalte eines Verzeichnisses und seiner Unterverzeichnisse mit passender Finr ckung auflistet Um eine beliebig tief verschachtelte Verze
182. ase wandelt alle enthalteten Buchstaben in Kleinschrei bung um e str gsub regexp ersatz str gsub regexp ersatz ersetzt alle Vorkommen von regexp durch ersatz Geklammerte Ausdr cke aus regexp stehen in ersatz als l 2 usw zur Verf gung e str gsub regexp str gsubl regexp leitet Treffer in den Block weiter und erm glicht so beliebig komplexe Ersatzausdr cke e str index str2 liefert die Position an der str2 in str vorkommt oder nil falls str2 gar nicht vorkommt e str length Anzahl der Zeichen e str strip str strip entfernt s mtlichen Whitespace an Anfang und Ende e str sub regexp ersatz str subl regexp ersatz ersetzt das erste Vorkom men von regexp durch ersatz e str succ direkter alphabetischer Nachfolger z B abc succ gt abd e str to_i wandelt m glichst viele Zeichen von links an in eine Ganzzahl um e str to_i basis wandelt m glichst viele Zeichen in eine Ganzzahl um die aus basis 2 36 konvertiert wird e str to_f wandelt m glichst viele Zeichen von links an in eine Flie kommazahl um e str tr stri str2 str tr str1 str2 ersetzt die Zeichen aus str1 durch Zei chen aus str2 an der entsprechenden Position e str each_byte Iterator ber alle Zeichen die als Code verf gbar sind und mittels chr wieder in Zeichen umgewandelt werden k nnen Time Kapselt Datum und Uhrzeit Konstruktoraufruf Time new speichert aktue
183. asse erzeugt wird wird der Konstruktor auto matisch aufgerufen so dass er sinnvollerweise verwendet wird um der Datenstruktur der Instanz ihre Anfangswerte zuzuweisen Es handelt sich dabei um eine spezielle Methode mit dem vorgegebenen zu dieser Aufgabe passenden Namen initialize Die Datenstruktur einer Instanz wird in so genannten Instanzvariablen gespeichert bekannte Alternativnamen sind Eigenschaften oder Attribute Diese speziellen Variablen werden durch ein einleitendes Zeichen gekennzeichnet Sie werden in aller Regel innerhalb des Konstruktors ins Leben gerufen und stehen w hrend der gesamten Lebensdauer einer Instanz in allen ihren Methoden zur Verf gung A Es gibt noch eine weitere besondere Variablenart die Sie in Klassen einsetzen k nnen Klassenvariablen Diese beginnen mit zwei Zei v chen Beispiel classvar und stehen in jeder Methode zur Verf gung auch in den weiter unten besprochenen Klassenmethoden Sie nehmen innerhalb einer Klasse die Position von globalen Variab len ein In diesem Buch kommt nur ein Beispiel vor das Klassenvariablen verwendet auch in der Praxis werden sie eher selten eingesetzt Da eine Klasse als Vorlage ein statisches Gebilde ist sind Konstanten wie etwa die Loktypen in der Klasse Lok meist n tzlicher zumal Sie auf diese auch von au en zugreifen k nnen Ver nderliche Daten geh ren dagegen eher zu einer konkreten Instanz und werden dem zufolge eben in Instanzvariab
184. at rlich kommen mathematische Anwendungen nicht immer ohne Nachkomma stellen aus F r das Rechnen mit Dezimalbr chen stehen Prozessoren und Program miersprachen die so genannten Flie kommazahlen oder auch Gleitkommazahlen Floating Point Numbers zur Verf gung in Ruby durch die Klasse Float repr sen tiert Der Name besagt dass die Anzahl der Nachkommastellen variabel sein darf 7 Im Gegensatz dazu gibt es auch Festkommazahlen mit einer konstanten Anzahl von Nachkommastellen das prominenteste Beispiel sind W hrungsbetr ge mit zwei Dezimalstellen Diese k nnen Sie intern im Prinzip durch Integer darstellen und Komma oder Punkt jeweils erst bei der Ausgabe einf gen 40 Kapitel 2 Sprachgrundlagen Beachten Sie dass das Dezimaltrennzeichen gem der englischen Schreibweise kein Komma sondern ein Punkt ist Beispiele f r Flie kommazahlen sind etwa 2 4 3 1415926 0 1 7 5 Flie komma Arithmetik Aufgrund der digitalen Natur des Computers m ssen nat rlich auch nA Flie kommazahlen in irgendeiner Form bin r repr sentiert werden Das N bliche Modell ist eine duale Form der wissenschaftlichen Schreibweise 2 die also x 2 statt dem dezimalen x 10 verwendet In einer solchen Dar stellung wird das x als Mantisse die 2 oder 10 als Basis und das n als Exponent bezeichnet die Kommaverschiebung erfolgt durch eine nde rung des Exponenten Negative Exponenten machen den Faktor BasisF rorext kleiner
185. ator Methode 146 Deny Apache Webserver 283 Deployment Rails 354 Design Patterns 205 DHCP 225 Dir Klasse 137 read Methode 137 Referenz 364 dir Windows Konsolenbefehl 13 directory File Methode 138 DirectoryIndex 283 Direktiven Apache Webserver 280 DNS Domain Name System 227 DocumentRoot 281 downcase Methode 66 downto Iterator 104 Dualzahlen 40 Duck Typing 47 Dynamische Typisierung 47 E each Iterator 101 each_byte Iterator 104 each_key Iterator 103 each_pair Iterator 103 each_value Iterator 103 each_with_index Iterator 267 ECHO Client 238 f r nebenl ufige Server 265 echoclient rb Skript 238 echoforkclient rb Skript 265 echoforkserver rb Skript 263 ECHO Server Einzelberbindung 235 ECHO Server Forking 263 ECHO Server Threading 269 echoserver rb Skript 235 echothreadserver rb Skript 269 Ein und Ausgabe 114 Dateien 125 getc 120 gets 119 Konsole 114 Nonblocking 234 Pipe 115 print 116 printf 117 puts 116 read 121 Standardkan le 114 STDERR 115 STDIN 114 STDOUT 115 Umleitung 115 Verzeichnisse 136 Eingabeaufforderung 10 Eingabeumleitung 115 Eingebettete Ausdr cke 42 else 73 bei case when 77 bei if 73 elsif 74 Elternklasse 113 Emacs Editor 18 Embedded Ruby siehe eRuby End Of File EOF 120 end MatchData Methode 148 Endlosschleifen kontrollierte 81 Entwurfsmuster siehe Design Patterns ENV 289 EOF 120 EPOCH 142 erb siehe eRuby ErrorLog Apache 291 erubis siehe eRuby eRuby 3
186. auch mit arith metischen Operatoren durchf hren farbe r 65536 g 256 b Der fertig berechnete Wert wird anschlie end in eine Hexadezimalzahl umgewan delt Zeile 19 beziehungsweise 33 hexfarbe farbe to_s 16 Die Methode to_s zur Umwandlung in einen String kennt dazu praktischerweise die Angabe einer Basis in diesem Fall 16 wenn Sie sie weglassen wird automatisch 10 gew hlt Danach wird eine while Schleife ausgef hrt Solange die Hexadezimalzahl noch weniger als 6 Stellen hat wird jeweils eine weitere 0 davorgesetzt Der anschlie Variablen Ausdr cke und Operationen 59 Rende upcase Aufruf Zeile 25 37 wandelt die Buchstaben in der Hexadezimalzahl in Gro buchstaben um Das Ausrufezeichen hinter einem Methodennamen steht wie hier in der Regel daf r dass der ge nderte Wert nicht nur zur ckgeliefert sondern auch in der Variablen selbst gespeichert wird Zu guter Letzt ist noch interessant wie die drei Web Farbwerte berechnet werden Hier als Beispiel der Rotwert Zeile 28 wr r 25 51 51 Gesucht sind wie erw hnt ganzzahlige Vielfache von 51 Diese sind leicht zu berechnen indem der bisherige ganzzahlige Wert durch 51 geteilt wird die Nachkommastellen fallen dadurch weg Anschlie end wird wieder mit 51 multipli ziert Zuvor wird allerdings noch 25 also knapp die H lfte addiert damit tats ch lich der n chstgelegene und nicht einfach der n chstniedrigere Wert zur c
187. auf die ersten drei Zeilen gek rzt CGI Skripten mit Ruby Der klassische Ansatz f r Webanwendungen ist die CGlI Schnittstelle Common Gateway Interface Der Webserver startet kurz gesagt einen neuen Prozess und darin die Webanwendung als externes Programm im Fall einer interpretierten Skriptsprache wie Ruby wird zuerst der Interpreter selbst gestartet Damit ist CGI problemlos f r kleine bis mittlere Websites geeignet wenn Sie eine extrem gut besuchte Site betreiben sollten Sie dagegen eine andere L sung w hlen Apache erm glicht den Zugriff auf CGI Anwendungen ber das Modul mod_cgi Standardm ig k nnen Sie Ihre CGI Skripten im Verzeichnis cgi bin unter Ihrer ServerRoot dem Apache Installationsverzeichnis speichern Dieses Verzeichnis wird automatisch mit Hilfe einer ScriptAlias Direktive als URL Pfad eingebun den unter Windows beispielsweise so 286 Kapitel 6 Klassische Webanwendungen ScriptAlias cgi bin C Programme Apache Software Foundation Apache2 2 cgi bin ScriptAlias funktioniert im Prinzip wie die im ersten Abschnitt besprochene Direk tive Alias mit dem Unterschied dass alle Dateien im eingebundenen Verzeichnis als CGI Skripten betrachtet werden Alternativ k nnen Sie folgende Sektion in Ihre httpd conf Datei einf gen am besten unter den lt Directory gt lt Directory gt Block der DocumentRoot um alle Dateien mit der Endung rb serverweit als CGI Skripten zu betrachten Files rb
188. ausgeben puts Nun hat a den Wert a Hier die zugeh rige Ausgabe Zur Unterscheidung wurden die Parent Zeilen fett und die Child Zeilen kursiv gesetzt Im Child behaelt a den Wert 42 Nun hat a den Wert 42 Im Parent besitzt a den Wert 42 Im Parent wurde a nun auf 23 geaendert Nun hat a den Wert 23 258 Kapitel 5 Netzwerkanwendungen Beim Einsatz von fork m ssen Sie ein spezielles Problem bedenken Wenn ein Child etwa zur Bedienung von Clients in einem Forking Server seine Arbeit erledigt hat und Sie exit aufrufen um auch den Prozess selbst zu beenden gelingt dies nicht vollst ndig Der Child Prozess bleibt als so genannter Zombie Prozess bestehen Wenn nur wenige Child Prozesse existieren ist das nicht weiter schlimm Aber stel len Sie sich zum Beispiel einen Webserver vor der monatelang l uft und dabei Tau sende von Clients bedient Dabei k nnten Zombies nach und nach den Speicher verstopfen Ein Zombie erf llt keine besondere Aufgabe mehr sondern steht nur zum Abruf bereit damit der Parent seinen Exit Status auslesen kann Dies geschieht durch ein Verfahren namens Reaping Ernte Zust ndig ist der Systemaufruf wait4 der in Ruby als Klassenmethode namens Process wait zur Verf gung steht In Forking Anwendungen sollte der Parent diese Anweisung regelm ig aufrufen Hier ein interessantes Zombie Testprogramm f fork if f puts Ich bin der Parent mein Child heisst f puts Hier mein Ch
189. betische Liste umkehrt name Peter Schmitz puts name sub w s w 2 1 Ergebnis Schmitz Peter Hier ein weiteres Beispiel das eine ISBN mit Strichen versieht falls sie noch keine hat und sie ansonsten unangetastet l sst 98 Kapitel 2 Sprachgrundlagen isbn1 3897214784 isbn2 3 89721 403 2 puts isbn1 sub d d 5 d 3 AX 1 2 3 4 puts isbn2 sub d d 5 d 3 AX 1 2 3 4 Die Ausgabe lautet 3 89721 478 4 3 89721 403 2 Erfreulicherweise gibt es eine zweite M glichkeit Sie k nnen den zweiten Parame ter das hei t den Ersetzungs String weglassen und stattdessen einen Block benut zen Die Treffervariablen stehen darin zur Verf gung Die Ersetzungsmethode gsub funktioniert sogar als vollwertiger Iterator innerhalb des Blocks kann der jeweils aktuelle Treffer als Variable abgefangen werden N heres ber Bl cke und Iteratoren erfahren Sie im n chsten Abschnitt Nebenbei k nnen Sie beliebige Fall entscheidungen und andere Anweisungen verwenden um den Ersetzungswert zu erzeugen Das ISBN Beispiel l sst sich auf diese Weise bersichtlicher schreiben isbn 3897214784 puts isbn sub d d 5 A 3 C AX 1 2 3 4 Hier noch ein sehr unterhaltsames gsub Beispiel Es liest eine Eingabezeile ein er setzt jeden Vokal durch einen anderen und gibt den ver nderten String aus eingabe get
190. bnis ist ein neues Time Objekt in dem der angegebene Zeitpunkt codiert ist parse ist sehr tolerant bez glich der m glichen Formate Nehmen Sie f r einige Tests an die aktuelle Zeit sei Sat Oct 21 13 44 29 Westeuropaeische Normalzeit 2006 Prinzipiell k nnen Sie Datum und Uhrzeit nur ein Datum oder nur eine Uhrzeit angeben Eine vollst ndige Angabe machen Sie am einfachsten als String im Format JJJJ MM TT hh mm ss Zum Beispiel gt gt d Time parse 1999 09 13 17 59 00 gt Mon Sep 13 17 59 00 Westeuropaeische Normalzeit 1999 Wenn Sie nur ein Datum ohne Uhrzeit angeben wird 00 00 Uhr eingestellt gt gt d Time parse 1999 09 13 gt Mon Sep 13 00 00 00 Westeuropaeische Normalzeit 1999 Eine Uhrzeit ohne Datum verwendet dagegen das Systemdatum mit der angegebe nen Uhrzeit gt gt d Time parse 9 13 gt Sat Oct 21 09 13 00 Westeuropaeische Normalzeit 2006 Sie k nnen auf diese Weise keinen Zeitpunkt vor dem 01 01 1970 A 00 00 Uhr speichern Dieses spezielle Datum Spitzname EPOCH y gilt als UNIX Erfindungsdatum Die C Standardbibliothek auf der alle wichtigen Betriebssysteme und Programmiersprachen wie Ruby basieren speichert alle Zeitangaben in Sekunden oder in neueren Implementierungen Millisekunden seit EPOCH Um von einem bestimmten Datum zu einem anderen gelangen k nnen Sie eine Sekundenzahl zu einem Datum addieren oder von diesem abziehen Die folgenden Beispiele addieren n
191. by Bedingte Ausf hrung Gl ckwunsch wenn punkte gr er als 100 ist if punkte gt 100 puts Sie haben gewonnen end Kommentare Wenn Sie eine Zeile mit einer Raute beginnen gilt diese als Kommentar und wird vom Ruby Interpreter ignoriert Gleiches gilt f r den Rest einer Zeile nach einer Raute Hier zwei Beispiele Ein alleinstehender Kommentar puts Text Kommentar hinter einer Anweisung Sie sollten sich angew hnen Ihre Skripten stets ausf hrlich zu kommentieren So wissen Sie w hrend der Entwicklung und auch beim sp teren Lesen eines Skripts noch genau welche Aufgaben die jeweiligen Sektionen haben Kommentare in separaten Zeilen sind dabei in der Regel zu bevorzugen Ab diesem Kapitel werden alle l ngeren Skriptbeispiele dieses Buchs mit Kommen taren versehen Die Kommentarfrequenz entspricht dabei etwa meinen eigenen Angewohnheiten nicht zu sparsam und nicht zu geschw tzig Wenn wenige Codezeilen in zu vielen Kommentaren ertrinken kann dies ein Skript n mlich genauso unleserlich machen als w re es unzureichend oder gar nicht kommentiert Hilfreich ist nat rlich in jedem Fall ein guter Editor der Kommentare per Syntax Highlighting andersfarbig darstellt Grundlagen der Syntax 33 Wenn Sie l ngere Erkl rungspassagen einf gen m chten die ebenfalls vom Inter preter ignoriert werden sollen k nnen Sie diese zwischen begin und end jeweils in eigenen Zeilen platzieren Hier ein Beispiel
192. ccessor 197 attr_reader 194 attr_writer 195 Aufrufe in Ausdr cken 62 begin MatchData 14 Begriffsdefinition 164 169 block_given 178 Bl cke optionale 178 body 242 ceil 64 oo Index 383 CGl escapeHTML 303 checkbox_group 302 chomp 66 chop 66 chr 67 class 46 212 close 127 code 242 collect Iterator 105 create Active Record 349 day 139 denominator 146 downcase 66 downto Iterator 104 dynamische Parameter 174 each Iterator 101 each_byte Iterator 104 each_key Iterator 103 each_pair Iterator 103 each_value Iterator 103 each_with_index Iterator 267 end MatchData 148 exit 125 fetch_hash Mysql 324 fetch_row 324 File directory 138 File exists 128 138 File file 138 Filerename 179 file_field 303 find Active Record 348 floor 64 fork 257 form 300 get Net HTTP 242 getc 120 gets 119 getservbyname 233 Getter 113 Globale 184 has_key 297 Hash Parameter 173 hidden CGI 309 hour 139 include 208 initialize Konstruktor 113 instance_of 213 is_a 213 Iteratoren eigene 176 join 71 join Thread 267 kind_of 213 Klassenmethoden 179 length Array 49 68 length String 66 match 147 Math cos 65 Math log 65 Math sin 65 Math sqrt 65 Math tan 65 mathematische 64 message 242 methods 214 min 139 month 139 now 138 num_rows Mysql 324 numerator 146 object_id 212 offset 148 open 127 Operatoren als 188 param 297 Parametervariablen 170 parse T
193. ch kein Fehler falls der Benutzer auf der ersten Seite nochmals n eingibt Nach der Wert nderung startet next einen neuen Schleifendurchlauf und springt so direkt zur Ausgabe Zeile 63 67 Hier wird pos entsprechend um 5 verringert Mindestwert 1 um ltere Postings anzuzeigen Zeile 70 71 Wenn das Skript hier ankommt wurde die Schleife noch nicht ver lassen oder neu gestartet Es findet also die Eingabe eines neuen Eintrags statt Dazu wird postings zuerst um 1 erh ht auch pos erh lt den neuen Wert dieser Variablen Zeile 74 75 Wie in Zeile 34 wird der Name der Posting Datei generiert danach wird die Datei ge ffnet diesmal allerdings zum Lesen Zeile 77 Ein Time Objekt wird erzeugt es enth lt automatisch das Systemda tum und die uhrzeit Zeile 78 In der Variablen eintrag werden als Anfangswert Datum und Uhrzeit in einem Format wie 22 10 2006 18 14 eingetragen Damit wird als erste Zeile eines jeden Eintrags auf jeden Fall ein Zeitstempel eingetragen Die Funktions weise der Formatierungsmethode strftime wird weiter unten im Abschnitt Datum und Uhrzeit beschrieben Ein und Ausgabe 133 e Zeile 80 85 Die Eingabeschleife l uft solange eintrag kein leerer String ist Beim ersten Durchlauf ist diese Bedingung erf llt weil Datum und Uhrzeit darin gespeichert wurden Innerhalb der Schleife wird der aktuelle Wert von eintrag zuerst in die Datei geschrieben erst danach erfolgt die Eingabe der n chsten Zeile D
194. ch mit Ausgabe gt gt quadrate 1 20 collect ji i 2 gt 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400 Aus dem Lottozahlen Beispiel l sst sich ganz leicht ein Ziehungssimulator bauen Denn es gen gt nat rlich nicht einfach sieben Zufallszahlen zwischen 1 und 49 zu w hlen dabei kann schlie lich leicht mehrmals dieselbe Zahl vorkommen Die Kugeln werden daher wie oben gezeigt mittels collect in einem Array gespei chert Anschlie end werden per slice sieben zuf llig gew hlte Gl ckszahlen aus geschnitten und angezeigt Hier der komplette Code den Sie nach allen Erkl run gen in diesem Kapitel ohne Weiteres verstehen m ssten Zahlen von 1 bis 49 in Array speichern lottozahlen 1 49 collect z z Iteratoren und Bl cke 105 Schleife ueber 7 Durchgaenge for i in 1 7 Zufaellig gewaehlte Zahl ausschneiden zahl lottozahlen slice rand lottozahlen length Ausgeben ifi puts Zusatzzahl zahl else puts i zahl end end Eine Beispielausf hrung sieht so aus gt ruby lotto rb 1 39 2 24 3 26 4 47 5 27 6 6 Zusatzzahl 15 Noch h bscher ist es nat rlich wenn die ersten sechs Zahlen sortiert ausgegeben werden Dazu k nnen Sie sie wieder mit Hilfe von collect in einem Array sammeln und anschlie end mit dessen Methode sort dauerhaft sortieren und ausgeben Die Zusatzzahl kann danach einfach separat gezogen w
195. chen Aus die sen Gr nden ist es wichtig die Nutzdaten zu verschl sseln wenn etwa eine Kreditkartennummer oder andere vertrauliche Daten bermittelt werden 222 Kapitel 5 Netzwerkanwendungen HTTP 1 1 200 OK weitere Antwortdaten lt html gt lt head gt lt title gt Die erste Zeile enth lt einen Statuscode hier 200 f r eine erfolgreich beantwortete Anfrage nach einigen weiteren technischen Daten die weiter unten behandelt werden folgt der Inhalt der angeforderten Datei hier durch lt html gt angedeutet Der Weg durch die Schichten verl uft nun nach demselben Schema wie oben erl u tert aber genau umgekehrt Zu guter Letzt nimmt der Browser den eventuell aus mehreren Paketen zusammengesetzten HTML Code in Empfang und stellt nach den darin formulierten Regeln die gew nschte Webseite dar In der Regel sendet er dabei weitere Anfragen an den Server um eingebettete Bilder zu laden In Abbildung 5 2 sehen Sie den gesamten hier geschilderten Ablauf noch einmal schematisch dargestellt Einige Details etwa IP Adressen und Portnummern werden im Folgenden noch genauer erkl rt Die hier verwendeten Adressen sind nat rlich fiktiv Anwendungsschicht Host zu Host Transportschicht Internetschicht Netzzugangsschicht Anwendungsschicht Host zu Host Transportschicht Internetschicht Netzzugangsschicht HTTP Anfrage GET HTTP I I TCP Datenstrom Von 12345 An 80 Von 193 17
196. chen wie Ruby ist es typisch dass es kein formales Hauptprogramm oder hnliches gibt Zun chst k nnen Sie also ohne gro artige Formalit ten eine Abfolge von Anweisungen hintereinander schreiben was das Erlernen der Ruby Grundlagen enorm erleichtert In diesem Abschnitt wird zun chst einmal gekl rt aus welchen Komponenten Anweisungen bestehen k nnen und wie sie voneinan der getrennt werden Grundlagen der Syntax 31 Anweisungen und ihre Elemente Die einzelnen Arbeitsschritte eines Computerprogramms werden als Anweisungen auf Englisch instructions bezeichnet Im Verlauf dieses Kapitels und des restlichen Buchs werden Sie verschiedene Arten von Anweisungen kennenlernen In Ruby werden Anweisungen normalerweise durch Zeilenumbr che voneinander getrennt das in vielen anderen Programmiersprachen n tige Semikolon braucht in diesem Fall nicht gesetzt zu werden Es besteht allerdings die M glichkeit mehrere Anweisungen in dieselbe Zeile zu schreiben indem Sie sie durch Semikola trennen Formal k nnten Anweisungsfolgen also unter anderem folgenderma en aussehen Durch Zeilenumbruch getrennt Anweisungi Anweisung2 Anweisungn Beispiel puts Bitte geben Sie Ihren Namen ein print gt name gets chomp e Durch Semikolon getrennt Anweisung1 Anweisung2 Anweisungn Beispiel print Noch ein Versuch j n auswahl gets chomp e Mischformen wie diese Anweisung1 Anweisung2 Anweisung3 Anweisungn Beis
197. chher end gt gt zurueck vorher gt true Sie sehen dass der Text vorher ausgegeben wird anschlie end folgt der R ck sprung mit dem R ckgabewert true Die Anweisung puts nachher wird niemals ausgef hrt Klassen entwerfen und implementieren 175 Mit Hilfe der beiden Wertr ckgabeverfahren k nnen Sie etwa die beiden folgenden Fassungen einer Methode schreiben die berpr ft ob eine Zahl gerade d h durch 2 teilbar ist def geradei zahl if zahl 2 true else false end end def gerade2 zahl if zahl 2 return true end return false end F r welche der beiden Varianten Sie sich entscheiden ist letztlich Geschmacks sache Wie Sie sehen ben tigt gerade2 keinen else Teil denn wenn die Funktion an dieser Stelle noch nicht verlassen wurde ist klar dass die untersuchte Zahl unge rade sein muss M glicherweise sch tzen Sie das else aber weil es die Struktur der Methode deutlicher macht In diesem Fall h lt Sie auch nichts davon ab die return Fassung mit einem eigentlich berfl ssigen else zu schreiben Iteratoren definieren Bereits in Kapitel 2 haben Sie die N tzlichkeit der eingebauten Ruby Iteratoren kennengelernt Noch erfreulicher ist dass Sie auch eigene Iteratoren implementie ren k nnen Das geht erstaunlich einfach Sobald Sie innerhalb einer Methode die Anweisung yield aufrufen wird der Code innerhalb des bergebenen Blocks ausge f hrt Hier ein erster kleiner Iterator der
198. chnen mit Rational Im vorigen Kapitel haben Sie ausf hrliche Informationen ber die Arbeit mit Ganz zahlen und Flie kommazahlen erhalten Aber wussten Sie dass Ruby auch mit ech ten Br chen arbeiten kann Daf r zust ndig ist die Klasse Rational die Z hler und Nenner eines Bruchs speichert Sie enth lt auch alle wichtigen Operatoren um mit Br chen zu rechnen einschlie lich dem daf r notwendigen Erweitern und K r zen Mit echten Br chen l sst sich oftmals exakter und auch angenehmer rechnen als mit Flie kommazahlen Ein Rational Objekt wird folgenderma en erzeugt ein new Aufruf ist bei dieser Klasse nicht m glich gt gt bruch Rational 2 3 gt Rational 2 3 Wenn Sie einen Bruch erzeugen der sich noch k rzen l sst geschieht dies automa tisch Zum Beispiel gt gt bruch2 Rational 5 10 gt Rational 1 2 Arithmetische Operationen sind sowohl mit anderen Br chen als auch mit Ganz oder Flie kommazahlen m glich gt gt bruch Rational 1 2 gt Rational 1 2 gt gt bruch 2 gt Rational 1 4 gt gt bruch Rational 1 3 gt Rational 5 6 Einige weitere Klassen 145 Z hler und Nenner des Bruchs erhalten Sie mit Hilfe der Methoden numerator bezie hungsweise denominator gt gt printf d d zweidrittel numerator zweidrittel denominator 2 3 Schlie lich k nnen Sie den Bruch auch mit Hilfe der wohlbekannten Methode to_f in eine Flie kommazahl umwandeln
199. chnis nach usr local und erstellen Sie einen symbolischen Link darauf der einfach mysql hei t mv mysql max 5 0 27 linux i686 glibc23 usr local In s usr local mysql max 5 0 27 linux i686 glibc23 usr local mysql Danach k nnen Sie in das Verzeichnis usr local mysql wechseln und m ssen dort das Skript mysql_install_db im Unterverzeichnis bin aufrufen das die Datenbank mysql mit den Tabellen f r Benutzerrechte und weitere Verwaltungsaufgaben ein richtet 316 Kapitel 6 Klassische Webanwendungen cd usr local mysql bin mysql_install_db Als N chstes m ssen einige Benutzer und Gruppenrechte angepasst werden die Dateien in allen MySQL Unterverzeichnissen sollen dem User root und der Gruppe mysql geh ren das Unterverzeichnis data mit den Datenbanken dagegen auch dem Benutzer mysql Geben Sie dazu folgende Anweisungen ein chown R root chown R mysql data chgrp R mysql Anschlie end k nnen Sie den Datenbank Server starten usr local mysql bin mysqld_safe user mysql amp Wenn MySQL beim Booten automatisch gestartet werden soll m ssen Sie in Ihrem Verzeichnis f r Startskripten unter vielen Linux Distributionen beispielsweise etc init d einen symbolischen Link auf das Skript support_files mysql server aus dem MySQL Verzeichnis erstellen Zum Beispiel In s usr local mysgql support_files mysql server etc init d mysql Anschlie end muss dieses Skript auf eine jeweils betriebssys
200. ck beispielsweise auch auf Netzwerkadministrator passt e Aa d rfte klar sein An dieser Stelle wird entweder ein gro es oder ein kleines A erwartet aber auf keinen Fall ein anderes Zeichen e dmin ist eine einfache Zeichenfolge die genau in dieser Reihenfolge und ohne Unterbrechung im String vorkommen muss e istrator schlie lich wird durch das Fragezeichen wiederum zum optionalen Bestandteil A Wenn Sie den Teilausdruck 4 Sys tem Aa dmin istrator a vollst ndig auswerten passt er auch auf einige unwahrscheinliche W rter wie SystemAdmin oder Sysadministrator Es bleibt Ihnen selbst berlassen wie genau Sie Ihre regul ren Ausdr cke schreiben in den meisten F llen gen gt es wie hier dass alle gew nschten Treffer enthalten sind und Sie brauchen sich keine Gedanken ber nicht existierende W rter zu machen auf die das Muster zuf llig ebenfalls passt Wenn es um Sicherheitsaspekte geht etwa bei der Eingabe einer Kreditkartennummer m ssen Sie solche F lle jedoch explizit ausschlie en Mustervergleiche mit regul ren Ausdr cken 91 Hier ein kleines Beispielskript mit dem Sie den obigen Ausdruck testen k nnen Geben Sie zuerst die folgenden Zeilen ein re Sys tem Aa dmin istrator loop do print gt ein gets chomp break if ein q if ein re puts 1 passt else puts Passt nicht end end Speichern Sie das Ganze beispielsweise als admin rb
201. ck wieder starten und http localhost 3000 album table aufrufen sollten Sie eine Ansicht wie in Abbildung 7 7 erhalten Rails n Roll Alben Tabelle Mozilla Firefox Datei Bearbeiten Ansicht Chronik Lesezeichen Extras Hilfe E C C Http Mocahost s000Yalbumftabie Erste Schritte Q Aktuelle Nachrichten Tabelle aller Alben Album Band Land Master of Puppets Metallica USA Ride The Lightning Metallica USA The Number Of The Beast Iron Maiden United Kingdom Die Bestie in Menschengestalt Die rzte Germany Metallica Metallica USA Abbildung 7 7 Die Ausgabe der Action View album table Realistische Anwendung Eine Online Rock n Roll Datenbank 353 Zu guter Letzt sollten Sie die beiden Ansichten der Bequemlichkeit halber per Hyperlink miteinander verkn pfen Bei gr eren Projekten ist es ratsam die Logik von View und Con A troller strikt zu trennen Der Controller sollte dann keine HTML u Schnipsel liefern sondern nur die Rohdaten beispielsweise als Array Iteration und Ausgabe kommen dann in die View Nichts leichter als das Erg nzen Sie list rhtml unmittelbar ber lt body gt um die fol gende Zeile lt a href table gt Zur Tabellenansicht lt a gt Umgekehrt k nnen Sie an derselben Stelle in table rhtml diese Erg nzung vorneh men lt a href list gt Zur Listenansicht lt a
202. class Gueterzug Grundzustand def initialize lok0 Lok OHNE lok1 Lok OHNE waggons 0 loks Array new Ist das erste Argument loko ein Hash if loko class Hash Ja ein Hash Benannte Argumente verarbeiten if loko loko loks 0 Lok new 1loko 10ko else loks 0 Lok new Lok OHNE end if loko 1ok1 loks 1 Lok new 1loko 1ok1 else loks 1 Lok new Lok OHNE end if loko waggons waggons loko waggons else waggons 0 end else Nein kein Hash Klassische Argumente verarbeiten loks 0 Lok new 1loko loks 1 Lok new lok1 waggons waggons end end Methoden end Dieser Konstruktor kann unter anderem wie folgt aufgerufen werden zug1 Gueterzug new Standardwerte zug2 Gueterzug new Lok DIESEL nur eine Diesellok 174 Kapitel 4 Eigene Klassen und Objekte erstellen zug3 Gueterzug new lok0 gt Lok STROM waggons gt 10 E Lok 10 Waggons Die Auswertungsreihenfolge musste hier abermals etwas ge ndert werden weil die Standardwerte nun wieder aus der Parameter bergabe stammen Wenn ein Hash bergeben wird befindet er sich automatisch in der Parametervariablen loko die beiden anderen Argumente erhalten zwar ihre Standardwerte werden aber in die sem Fall nicht weiter beachtet Wenn kein Hash bergeben wird werden die Argu mente dagegen wie gehabt von links nach rechts in den Variablen gesammelt Ein noch extremeres Beispiel das
203. d Operationen 39 Wenn Sie Lust haben k nnen Sie nach einer f hrenden O0 auch einmal die unzul ssigen Ziffern 8 und 9 ausprobieren Sie erhalten nat rlich eine Fehler meldung gt gt 098 SyntaxError compile error irb 3 Illegal octal digit from irb 3 e Wenn Sie einer Zahl ox voranstellen gilt sie als hexadezimal das ist das Sech zehnersystem Es ist ideal zur Darstellung von Byte Inhalten weil alle 256 m glichen Werte von 8 Bit 2 256 in zwei Stellen passen Da es nur Ziffern von 0 bis 9 gibt die f r das Hexadezimalsystem nicht ausreichen werden zur Darstellung der Ziffernwerte 10 bis 15 die Buchstaben A bis F hinzugenommen die Sie brigens auch kleinschreiben d rfen Der Wert jeder Stelle betr gt das Sechzehnfache ihres rechten Nachbarn Auch Hexadezimalwerte erkunden Sie am einfachsten indem Sie sie in irb ausprobieren Geben Sie beispielsweise fol gende Zahlen ein gt gt 0x100 gt 256 gt gt OXFF gt 255 gt gt OXABC gt 2748 e Das Pr fix ob schlie lich ist f r duale Zahlen gedacht Die einzigen zul ssigen Ziffern sind 0 und 1 eine Stelle besitzt den doppelten Wert ihres rechten Nach barn Probieren Sie auch das in irb aus gt gt 0b1000 8 gt gt 0b11111 31 gt gt 0b10101010 170 Die umgekehrte Umwandlung von Dezimalzahlen in beliebige andere Zahlensys teme ist ebenfalls m glich diese Spezialvariante der zust ndigen Methoden to_s und to_i wird weiter unten erl utert N
204. d seinen P Unterverzeichnissen auf einem UNIX System an Ihre Alltags User ID bertragen Zum Beispiel chown R sascha var railsapps Danach sollten Sie auch unter der entsprechenden User ID und nicht als root weiterarbeiten Ansonsten m ssen Sie sp ter erneut chown ausf hren 2 Nun kann das Skelett einer Rails Anwendung erstellt werden Rufen Sie dazu das Konsolenkommando rails mit dem Namen der gew nschten Anwendung auf Das folgende Beispiel erzeugt eine Anwendung namens helloworld gt rails helloworld Dadurch entsteht ein neues Verzeichnis mit dem gew nschten Namen Anschlie end wird eine Liste der darunter erzeugten Verzeichnisstruktur ange zeigt in die zahlreiche vorgefertigte Skripten und Konfigurationsdateien kopiert werden Die Bedeutung der diversen Verzeichnisse wird weiter unten erl utert 3 Die neue Anwendung enth lt zwar noch keinerlei spezifischen Code ist aber prinzipiell schon bereit f r einen ersten Test Starten Sie dazu den eingebauten Ruby Test Webserver WEBrick im Unterverzeichnis script Rails installieren und in Betrieb nehmen 337 gt ruby helloworld script server gt Booting WEBrick gt Rails application started on http 0 0 0 0 3000 gt Ctrl C to shutdown server call with help for options 2007 01 02 23 38 35 INFO WEBrick 1 3 1 2007 01 02 23 38 35 INFO ruby 1 8 5 2006 08 25 i386 mswin32 2007 01 02 23 38 35 INFO WEBrick HTTPServer start pid 5404 port 3000
205. das aktuelle Skript selbst ein Der erzeugte HTML Code sieht so aus lt FORM METHOD get ENCTYPE application x www form urlencoded ACTION temperatur rb gt lt FORM gt Beim Klicken auf den Absende Button wird also dieselbe Datei vom Server angefordert erh lt aber zus tzlich Formulardaten Die Verarbeitung dieser Daten findet in Zeile 19 33 statt und wurde bereits beschrieben Zeile 41 64 Damit Formulare vern nftig formatiert werden sollten Sie ihre Inhalte wie hier in einer Tabelle unterbringen Die zahlreichen zul ssigen Attri bute des lt table gt Tags k nnen Sie als Hash in die Argumentklammern der Methode cgi table aufnehmen Aus cgi table border gt 2 cellpadding gt 8 wird so beispielsweise lt TABLE border 2 cellpadding 8 gt lt TABLE gt border 2 sorgt dabei f r einen sichtbaren Rahmen und Zellr nder mit einer St rke von zwei Pixeln w hrend cellpadding 8 einen Zellinnenabstand von 8 Pixeln festlegt damit die Inhalte nicht zu eng an den R ndern kleben Zeile 46 Ein einfaches Textfeld innerhalb eines Formulars k nnen Sie mittels cgi text_field erzeugen Der einzige notwendige Parameter ist der Feldname hier temp Das HTML Ergebnis ist lt INPUT NAME temp SIZE 40 TYPE text gt Zeile 53 55 Hier wird mit Hilfe der Methode cgi radio_group eine Gruppe von Radio Buttons erzeugt Der Name dieser Steuerelemente stammt daher dass Sie immer nur eines aus der Grupp
206. den Inhalt des aktuellen Verzeichnisses in die Datei inhalt txt gt dir gt inhalt txt Windows Is gt inhalt txt UNIX Eine besondere Form der 1 O Umleitung ist die Pipe Wenn Sie zwei Anweisungen mit verketten wird die Ausgabe der ersten als Eingabe an die zweite weitergelei tet Das folgende Beispiel leitet den Verzeichnisinhalt an ein Suchprogramm weiter und gibt so nur diejenigen Dateien oder Verzeichnisse aus deren Name ein a ent h lt gt dir find a Windows 1s grep a UNIX Vielleicht fragen Sie sich warum die Ein und Ausgabebefehle berhaupt in diesem Kapitel zur Objektorientierung behandelt werden schlie lich wurden Anweisun gen wie printf oder gets bisher in diesem Buch ohne Objektbezug irgendetwas gets verwendet Das liegt allerdings nur daran dass Ruby dies in manchen F llen als Abk rzung akzeptiert wenn die Standardeingabe bei Eingabeanweisungen wie gets beziehungsweise die Standardausgabe bei Ausgabemethoden wie print oder puts betroffen ist Die vollst ndige Schreibweise dieser Methoden folgt eigentlich dem Schema 1 0 Objekt Methode Konkrete I O Objekte werden in der Regel nicht aus der allgemeinen Oberklasse 1 0 gebildet sondern aus konkreteren Unterklassen wie etwa File f r Dateien siehe unten F r die Konsolen J O stehen die im Kasten Die Standard O Kan le vorge stellten Kan le als konstante O Objekte STDIN STDOUT und STDERR zur Verf gung Ein einfaches
207. der Elemente e arr push Wert h ngt Element e am Ende an e arr lt lt Wert push Alternative f r Einzelelement e arr pop entfernt letztes Element und liefert es zur ck e arr unshift Wert h ngt Element e am Anfang an e arr shift entfernt erstes Element und liefert es zur ck e arr each Iterator ber alle Elemente Bignum Beliebig gro e Ganzzahlen siehe Integer Dir Kapselt ein Verzeichnis Konstruktoraufruf Dir new Pfad Instanzmethoden e dir read n chsten Eintrag lesen und zur ckliefern e dir rewind zur ck zum ersten Eintrag e dir close schlie en Siehe auch IO File Kapselt eine ge ffnete Datei Konstruktoraufruf File new Pfad Modus Die wichtigsten Modi e r esen Datei muss existieren sonst Fehler e w schreiben Datei wird neu angelegt oder berschrieben e a anh ngen Datei wird neu angelegt oder es wird an ihrem Ende weitergeschrie ben e r gemischtes Lesen und Schreiben 364 Anhang A Ruby Kurzreferenz Klassenmethoden e File exists Pfad true falls Pfad existiert ansonsten false e File file Pfad true falls Pfad eine regul re Datei ist ansonsten false e File directory Pfad true falls Pfad ein Verzeichnis ist ansonsten false e File open Pfad Modus Synonym f r File new e File rename alt neu Datei umbenennen e File delete Pfad Datei l schen Instanzmethoden e file seek Pos Dateizeiger auf
208. der Elemente in den Block weitergegeben wer den Um Gebrauch davon zu machen m ssen Sie am Anfang des Blocks eine Vari able oder gegebenenfalls auch mehrere benennen die diese Werte aufnehmen soll Diese wird zwischen zwei Zeichen gesetzt Hier ein Beispiel das den Bereich von 1 bis 10 unter dem Variablennamen i durchz hlt und die entsprechenden Zah len ausgibt 1 10 each i puts i Die andere Schreibweise sieht so aus 1 10 each do il puts i end Nat rlich k nnen Sie mit den Elementen auch viel kompliziertere Aufgaben erledi gen Das folgende Beispiel gibt zus tzlich zu den Zahlen der Menge durch Tabula toren getrennt auch ihr Quadrat sowie ihre Quadratwurzel aus puts Zahl tQuadrat tQuadratwurzel 1 10 each do il quadrat i 2 wurzel Math sqrt i puts i t quadrat t wurzel end Damit Sie einen direkten Vergleich haben sehen Sie hier eine letzte Neufassung des Primzahlen Beispiels aus dem Abschnitt ber Schleifen diesmal mit der Iterator Methode each 1 100 each i Annahme i ist eine Primzahl prim true Potenzielle Teiler bis i 2 testen 2 i 2 each j i durch j teilbar ifi j Keine Primzahl prim false Pruefschleife j vorzeitig verlassen break end Ausgabe falls Primzahl print i if prim Sie k nnen auch die Elemente eines Arrays mit each verarbeiten und innerhalb des Blocks als Variable ansprechen Das folgende Beispiel
209. die drei bekannten MVC Aspekte models views und controllers sowie das zus tzli che Unterverzeichnis helpers f r gemeinsame Hilfsklassen config enth lt Konfigurationsdateien auch wenn das Prinzip Convention over Configuration gilt geht es nun einmal nicht ganz ohne In den meisten F llen brauchen Sie aber nur die Datei database yml zu editieren die die Namen und Zugangsdaten der verwendeten Datenbanken enth lt Das wird im n chsten Abschnitt genauer beschrieben script enth lt einige vorgefertigte Hilfsskripten die nicht innerhalb Ihrer Rails Anwendung ausgef hrt werden sondern Ihnen bei der Entwicklung helfen Das Skript generate erzeugt beispielsweise die Grundger ste Ihrer MVC Kom ponenten und server ist der WEBrick Server der die Anwendung zu Testzwe cken ausf hrt 342 Kapitel 7 Ruby on Rails e public enth lt eine CGI Konfiguration Mit ihrer Hilfe kann die Ruby on Rails Anwendung praktisch von jedem CGl f higen Webserver bereitgestellt wer den Weiter unten wird nat rlich die entsprechende Konfiguration von Apache erl utert e test stellt eine Umgebung f r so genannte Unit Tests bereit ein beliebtes Mittel zum automatisierten Testen objektorientierter Programme Leider w rde es den Umfang und die inhaltliche Ausrichtung dieses Buches sprengen n her darauf einzugehen halten Sie sich im Bedarfsfall an die Quellen aus Anhang B Datenbanken erzeugen und an die Rails Anwendung binden Die z
210. die Beschreibung der Vergleichsoperatoren weiter oben Hier ein Beispiel gt gt gt gt gt gt tiere w Loewe Zebra Affe Nashorn Elefant Bison Loewe Zebra Affe Nashorn Elefant Bison tiere sort Affe Bison Elefant Loewe Nashorn Zebra Auch hier gibt es die Variante sort die das urspr ngliche Array dauerhaft sortiert abspeichert w hrend das normale sort nur eine sortierte Kopie des Arrays als Wert zur ckgibt reverse beziehungsweise reverse kehrt ein Array um hnlich wie der gleichnamige String Operator Das folgende Beispiel speichert die Tierliste sortiert ab und dreht sie dann ebenso dauerhaft herum gt gt tiere sort Affe Bison Elefant Loewe Nashorn Zebra gt gt tiere reverse Zebra Nashorn Loewe Elefant Bison Affe Variablen Ausdr cke und Operationen 69 Methoden zur Typumwandlung Am Rande wurde bereits erw hnt dass Sie die verschiedenen einfachen Ruby Datentypen bis zu einem gewissen Grad ineinander konvertieren k nnen Dazu ste hen diverse Standardmethoden zur Verf gung Die Methode to_s wandelt ein beinahe beliebiges Objekt in einen String um der Inhalt dieses Strings h ngt dabei von der Art des Objekts ab Besonders h ufig kommt es vor dass Zahlen in Strings konvertiert werden sollen Das funktioniert ohne Probleme denn sowohl Ganz als auch Flie kommazahlen verf gen ber diese Methode gt gt 23 t
211. die Datentypen der Argumente unterscheidet wenn kein Hash bergeben wird finden Sie im Abschnitt ber Klassenmethoden R ckgabewerte Dass Methoden einen Wert zur ckgeben k nnen haben Sie bereits erfahren und praktisch eingesetzt Interessant ist aber dass Ruby zwei M glichkeiten der Wert r ckgabe kennt alleinstehende Ausdr cke oder return Wenn Sie einen Ausdruck in eine einzelne Zeile schreiben wird dieser zum R ckga bewert sofern diese Zeile innerhalb der Methode als letzte ausgef hrt wird bevor der R cksprung an die aufrufende Stelle erfolgt Hier ein kleines irb Beispiel das den Namen und den Slogan eines bekannten Online Auktionshauses variiert gt gt def xbay 3 2 1 deins end gt gt xbay gt deins Der R ckgabewert dieser Methode ist der String deins weil dieser Ausdruck die letzte Anweisung innerhalb der Methode ist Das explizite return funktioniert ein wenig anders Probieren Sie es aus gt gt def xbay2 return 3 return 2 return 1 return deins end gt gt xbay2 gt 3 Der R ckgabewert ist 3 Woran liegt das Nun return legt nicht den R ckgabewert f r den Fall eines eventuellen R cksprungs fest sondern sorgt selbst f r den soforti gen R cksprung mit dem angegebenen Wert Die Ausf hrung der Methode ist beim ersten return beendet Das k nnen Sie berpr fen indem Sie davor und dahinter Ausgabebefehle einbauen gt gt def zurueck puts vorher return true puts na
212. drei Komponenten Rot Gr n und Blau mit Werten von 0 aus bis 255 Maximum in derselben Form werden sie beispielsweise auch in Bildbearbeitungsprogrammen wie Photoshop verwendet Daraufhin liefert das Skript den zugeh rigen Hexadezimalwert sowie die n chstge legene Webfarbe das hei t eine Kombination aus Vielfachen von 51 die hexadezi male Reihe 00 33 66 99 CC FF Beispiel 2 3 Der Farbumrechner rgb rb puts RGB Farbumrechner puts puts Bitte geben Sie die Komponenten der Farbe ein print Rot 0 255 Rotwert einlesen und in Ganzzahl umwandeln r gets toi Unzulaessige Rotwerte auf 0 setzen r oifr lt o r gt 255 osoauPrwen 9 print Gruen 0 255 10 g gets toi 11 g oifg lt o g gt 255 12 print Blau 0 255 13 b gets to i 14 b 0ifb lt 0 b gt 255 15 Den Gesamtwert berechnen 16 farbe r lt lt 16 g lt lt 8 b 17 puts Gesamtwert farbe 18 Hexadezimalwert berechnen 19 hexfarbe farbe to_s 16 20 Auf 6 Stellen aufstocken 21 while hexfarbe length lt 6 22 hexfarbe 0 f 23 end 24 In Grossbuchstaben umwandeln 25 hexfarbe upcase 26 puts Hexadezimal Chexfarbe 27 Naechstgelegene Web Farbwerte berechnen 28 wr r 25 51 51 29 wg g 25 51 51 30 wb b 25 51 51 31 Gesamtwert der Webfarbe hexadezimal usw 32 webfarbe wr lt lt 16 wg lt lt 8 wb 33 hexwebfarbe webfarbe to_s 16 58 Kapitel2 Sprachg
213. dwissen Typisierte und untypisierte Sprachen Nur wenige objektorientierte Programmiersprachen beispielsweise C A bieten die M glichkeit der Mehrfachvererbung das hei t die Ableitung N einer Klasse von mehr als einer Elternklasse gleichzeitig Da dies zu Pro 2 blemen f hren kann etwa bei gleichnamigen Methoden wurde dieses Feature gerade bei modernen OO Sprachen weggelassen oder durch andere Konzepte ersetzt Java verwendet beispielsweise Interfaces die eine Klasse einem zus tzlichen Typ zuordnen daf r aber verlangen dass sie alle ihre Methoden implementiert denn die Methodendeklarationen eines Java Inter faces sind leer Das Hauptproblem das die C Mehrfachvererbung oder die Interfaces in Java l sen ist die Festlegung eines gemeinsamen Datentyps f r Instanzen unterschiedli cher Klassen damit diese Instanzen beispielsweise von ein und derselben Methode als Argument akzeptiert werden Hier zur Veranschaulichung eine typische Java Methode public String info Auto a return Das Auto ist a getFarbe und faehrt maximal a getHoechstgeschwindigkeit km h Wie Sie sehen besitzt in typisierten Sprachen wie Java alles einen festgelegten Datentyp Die Methode info liefert einen String zur ck also ist ihr Typ String und sie liefert Informationen ber ein Auto so dass ihr Parameter eine Instanz von Auto sein muss Soll info nun auch Informationen ber Boote liefern so m ssen Auto und Bo
214. e ben ist es auch m glich zus tzlich oder ausschlie lich die Anzahl der Nach kommastellen anzugeben und zwar hinter einem Punkt Um die passenden L ngen zu erreichen wird entweder gerundet oder mit Nullen aufgef llt Wenn Sie sowohl die Gesamtl nge als auch eine Genauigkeit angeben wird die Zahl gegebenenfalls wieder rechtsb ndig ausgerichtet Hier drei Beispiele gt gt printf 8f n 3 5 3 500000 gt gt printf 2f n 3 5 3 50 gt gt printf Wert 8 2f n 3 5 Wert 3 50 In Tabelle 3 1 finden Sie eine bersicht aller zul ssigen Platzhalter mit Erl uterun gen und Beispielen Tabelle 3 1 bersicht ber die printf Formatplatzhalter Platzhalter Bedeutung Beispiel b Numerisches Argument als Dualzahl b 13 gt 1101 c Zeichencode in Zeichen konvertieren c 97 gt a d Ganzzahl Nachkommastellen werden abge d 10 gt 10 schnitten d 3 9 gt 3 e Flie kommazahlen in wissenschaftliche Schreib 2e 0 0001 weise konvertieren gt 1 00e 004 E Wie e aber mit gro em E 2E 1000000 gt 1 00E 006 f Flie kommazahl bei Nachkommastellen wird 2f 3 3 gt 3 30 gerundet erg nzt 2f 4 777 gt 4 78 g Wissenschaftliche Schreibweise falls Exponent 2g 0 00001 gt 1e 005 Nachkommastellenanzahl 2g 0 1 gt 0 1 G Wie g aber mit gro em G 2G 0 00001 gt 1E 005 i Entspricht d i 17 gt 17 o In Oktalzahl konvertieren 0 100 gt 144 p Erg
215. e detaillierte bibliografische Daten sind im Internet ber http dnb ddb de abrufbar Lektorat Volker Bombien Fachgutachten Sven Riedel M nchen Korrektorat Oliver Mosler K ln Satz G amp U Language amp Publishing Services GmbH Flensburg www GundU com Umschlaggestaltung Michael Oreal K ln Coverabbildung Perkin Elmer Electronics Wiesbaden amp Dipl Designer Guido Bender Produktion Andrea Mi K ln Belichtung Druck und buchbinderische Verarbeitung Druckerei K sel Krugzell www koeselbuch de ISBN 978 3 89721 478 1 Dieses Buch ist auf 100 chlorfrei gebleichtem Papier gedruckt Inhalt VOLWORR a ee Er tee IX Aufbaurdes Buchs a Balearen XI Danksagungen due ee nen el an xml EINTURMINd ze su er se ge 1 Etwas Ruby G schichte our esre ere nn ernannt nt 1 Merkmale und Vorz ge von Ruby 2 222ceeeeeeeeeenenn 3 Ruby installieren 4 4 a sr ae er ke i 4 Ruby Code eingeben und ausf hren 222ccesccceeesnen 10 Hello World hello Ruby das erste Ruby Programm 17 Zu sammenlassung su als aaa 21 Sprachgrundlagen 2 222222222cseseeeeeeseseeeeenn 23 Praktische Einf hrung 2 u 28 2 ll 24 Grundlagen der Syntax 22 22 222ccesseeeeeseeeneeeeen nenn 31 Variablen Ausdr cke und Operationen 2c222cceeeenenee nn 35 Kontrollstrukturen a ser tler a u een 2 Mustervergleiche mit regul ren Ausdr cken 222222ce 0 85
216. e 1 1 Die wichtigsten Konsolenbefehle f r Windows und UNIX Gew nschte Wirkung Windows Befehl UNIX Befehl Laufwerk wechseln Laufwerksbuchstabe z B C oder F Arbeitsverzeichnis wechseln cd Verz Unterv cd Verz Unterv absoluter Pfad In Unterverzeichnis des aktuel cd Verz Unterv cd Verz Unterv len Arbeitsverzeichnisses wech seln In bergeordnetes Verzeichnis cd cd wechseln In das eigene Home Verzeichhis cd wechseln Neues Verzeichnis erstellen mkdir Name mkdir Name md Name Inhalt des aktuellen Verzeichnis dir ls ses anzeigen ausf hrlich 1s 1 Datei l schen del Name rm Name Datei kopieren copy AltName NeuName cp AltName NeuName Platzhalter alle Dateien im Kek aktuellen Verzeichnis Bildschirm l schen cls clear oft auch Strg L Ruby Anweisungen und Skripten eingeben Wenn Sie sich erst einmal auf der Konsole zu Hause f hlen gibt es verschiedene M glichkeiten Ruby Code auszuf hren Die interessanteste Variante f r einen praktischen Einstieg ist die interaktive Ruby Shell irb Interactive Ruby Wenn Sie Ruby gem der Anleitung in diesem Kapitel installiert haben gen gt folgende Ein gabe auf der Konsole um dieses Programm zu starten gt irb Nun k nnen Sie beliebige Ruby Anweisungen eingeben Ein praktischer Vorteil von irb besteht darin dass nicht einmal Ausgabebefehle n tig sind weil der Wert von Ausdr cken jeweils sofort angezeigt wird Auf diese We
217. e 36 41 Der Konstruktor von Gueterzug hat etwas mehr zu tun als der von Lok weil die zu verwaltende Datenstruktur umfangreicher ist Das Array loks enth lt diesmal keine Rohdaten wie bei der nicht objektorientierten Version sondern zwei Lok Instanzen f r die beiden Lokomotiven waggons speichert dagegen weiterhin einfach die aktuelle Lokomotivenanzahl Beim Aufruf des Konstruktors k nnen Sie die Typen der beiden Lokomotiven sowie die Anfangs Waggonzahl von rechts an weglassen Standardm ig besitzt der Zug keine Loks Typ Lok OHNE und keine Waggons Zeile 43 52 Die Methode anhaengen entspricht fast genau ihrem imperativen Pendant aus dem vorigen Beispiel Der einzige Unterschied befindet sich in Zeile 44 Um die maximale Waggonanzahl des Zugs zu ermitteln wird die Methode get_kapazitaet der beiden Lok Instanzen aufgerufen die Ergebnisse werden dann wie gehabt addiert Zeile 54 63 Die Methode abhaengen besitzt sogar keinen einzigen Unterschied zur imperativen Variante da der Grenzwert f r ein erfolgreiches Entfernen von Waggons hier wie dort 0 ist Zeile 65 67 lok_aendern funktioniert in der objektorientierten Fassung etwas anders Da der Typ einer bestehenden Lok aus den oben erw hnten Gr nden nicht nachtr glich ge ndert werden kann wird mit Hilfe der bergebenen Parameter eine neue Lok Instanz erzeugt Zeile 69 71 Die nderung in waggontest erfolgt analog zu derjenigen in anhaen gen die Zugkraft einer Lokomotiv
218. e Beziehung kann entweder ber eine rela tiv komplizierte JOIN Klausel oder mit Hilfe von WHERE formuliert werden hier sehen Sie Letzteres mysql gt SELECT int_name cd_titel FROM interpreten cds gt WHERE int_nr cd_interpret int_name cd_titel Iron Maiden Seventh Son Of A Seventh Son Iron Maiden The Number Of The Beast Led Zeppelin Led Zeppelin IV 3 rows in set 0 08 sec Wenn mehrere Tabellen gleichnamige Felder enthalten die Sie ansprechen m ch ten m ssen Sie diese brigens in der Form Datenbankname Feldname notieren etwa cds cd_ titel oder interpreten int_nr Das vorliegende Beispiel kommt ohne dieses Hilfsmittel aus weil in jeder Tabelle konsequent Namenspr fixe hier cd_ bezie hungsweise int_ verwendet werden Dies ist auch in der Praxis empfehlenswert F r den Zugriff durch Webanwendungen sollten Sie zu guter Letzt einen separaten MySQL Benutzer erzeugen der nur auf die jeweilige einzelnde Datenbank zugreifen darf Das folgende Beispiel erzeugt im Kommandozeilen Client einen Benutzer namens dbuser der in Skripten auf demselben Rechner mit dem Passwort geheim auf die Datenbank musik zugreifen darf mysql gt CREATE USER dbuser localhost mysql gt GRANT ALL PRIVILEGES ON musik TO dbuser localhost gt IDENTIFIED BY geheim 3 Inder P
219. e Dateien im Web publizieren kann es sonst zu Problemen kommen Manche Konsolenbefehle k nnen mit Platzhaltern umgehen die auf mehrere Dateien zutreffen Dabei steht ein f r beliebig viele beliebige Zeichen und ein f r genau ein beliebiges Zeichen Auch hier gibt es einen kleinen Plattformunterschied In UNIX Systemen steht f r alle Dateien in einem Verzeichnis bei Windows dage gen weil die Dateiendung gesondert betrachtet wird Um das aktuelle Arbeitsverzeichnis zu wechseln verwenden sowohl UNIX als auch Windows das Kommando cd kurz f r change directory Unter Windows ist die ser Befehl nicht daf r zust ndig um das Laufwerk zu wechseln Dies geschieht durch die einfache Eingabe des Laufwerksbuchstaben mit nachfolgendem Doppel punkt Das folgende Beispiel vollzieht einen Wechsel auf die Festplatte C gt C Mit cd k nnen Sie unter Windows innerhalb eines Laufwerks einen absoluten das hei t vollst ndigen Pfad angeben um in das entsprechende Verzeichnis zu wech seln Wenn Verzeichnis oder Dateinamen Leerzeichen enthalten m ssen Sie diese oder wahlweise den gesamten Pfad in Anf hrungszeichen setzen Das folgende Beispiel wechselt aus einem beliebigen Verzeichnis auf der Festplatte C in das Verzeichnis Eigene Dateien des Benutzers Sascha gt cd Dokumente und Einstellungen Sascha Eigene Dateien Bei UNIX Systemen funktioniert der Verzeichniswechsel per absolutem Pfad im Prinzip genauso Zum
220. e Dir erzeugen als Argument ben tigt es den relativen oder absoluten Pfad des gew nschten Verzeich nisses im Stringformat dir Dir new Verzeichnispfad Wenn Sie das aktuelle Verzeichnis ffnen m chten in dem sich Ihr Skript befindet lautet der relative Pfad in beiden Systemwelten 1 das K rzel f r aktuelles Arbeitsverzeichnis Nachdem das Verzeichnis ge ffnet ist k nnen Sie seine Methode read verwenden um einen Eintrag auszulesen Wenn Sie alle Eintr ge brauchen k nnen Sie read in der Bedingung einer while Schleife einsetzen Die folgende Schleife gibt die Ver zeichniseintr ge einfach untereinander aus while entry dir read puts entry end Zum Schluss sollten Sie die Methode close aufrufen um das Verzeichnisobjekt frei zugeben dir close Die ausgelesenen Verzeichniseintr ge sind einfache Datei oder Unterverzeichnisna men ohne Pfadangabe Die Spezialeintr ge und Verweis auf das aktuelle bezie hungsweise bergeordnete Verzeichnis werden stets mitgeliefert Hier als Beispiel der auf obige gezeigte Weise ausgelesene Inhalt eines Verzeichnisses mit Ruby Skripten Ausschnitt einige Dateinamen kommen Ihnen wahrscheinlich bekannt vor agecheck rb arg rb argnum rb argrechner rb args rb argvt rb ausgabe rb ausgabe txt bis1000 rb bis1000 txt BR Wenn es darum geht die Eintr ge weiterzuverarbeiten sollten Sie zun chst einmal feststellen ob es sich um gew hnliche Dateien Unter
221. e Eingabe zu gro zu klein oder genau rich tig ist Geben Sie das Skript zun chst ein puts Zahlenraten puts puts puts Raten Sie eine Zahl zwischen 1 und 100 puts Computer denkt sich Zahl zufallszahl rand 100 1 Versuche werden separat gezaehlt versuch 0 Endlosschleife loop do versuch 1 print versuch Versuch zahl gets to_i if zahl lt zufallszahl puts Diese Zahl ist zu klein elsif zahl gt zufallszahl puts Diese Zahl ist zu gross else Zahl ist korrekt Schleife verlassen puts Volltreffer break end end Geben Sie das Skript ein und probieren Sie es aus Um die Zahl m glichst schnell zu erraten brauchen Sie nur jeweils den brig gebliebenen Bereich zu halbieren Zum Beispiel Zahlenraten Raten Sie eine Zahl zwischen 1 und 100 1 Versuch 50 Diese Zahl ist zu gross 2 Versuch 25 Diese Zahl ist zu klein 3 Versuch 38 Diese Zahl ist zu klein 4 Versuch 44 82 Kapitel 2 Sprachgrundlagen Diese Zahl ist zu klein 5 Versuch 47 Diese Zahl ist zu gross 6 Versuch 46 Volltreffer for Schleifen Die dritte Schleifenart verwendet das Schl sselwort for und erm glicht die Durch f hrung von Anweisungen f r alle Elemente eines Bereichs eines Arrays oder einer anderen Art von Menge Die Syntax lautet for Variable in Menge Anweisung en end Innerhalb der Schleifenanweisungen steht das jeweilige Flement der Menge unter de
222. e Formatierung als Ganzzahl Die einzelnen Platzhalter werden von links nach rechts durch die jeweiligen Argumente ersetzt Sie m ssen darauf achten dass mindestens so viele zus tzliche Argumente wie Platzhalter vorhanden sind ansonsten erhalten Sie eine Fehlermeldung gt gt printf Nicht vorhandene Zahl d n ArgumentError too few arguments Die wichtigsten Formatplatzhalter sind e s ein String Wenn Sie eine Zahl dazwischensetzen etwa 10s wird der String auf die entsprechende Anzahl von Zeichen erg nzt und rechtsb ndig im Gesamtfeld ausgerichtet Zum Beispiel printf 1 9s n Hallo printf 2 9s n du liebe printf 3 9s n Welt Das ergibt folgende Ausgabe 1 Hallo 2 du liebe 3 Welt Ist der entsprechende String dagegen l nger als die angegebene Zeichenanzahl wird die Formatierung zugunsten der vollst ndigen Ausgabe aufgehoben e d eine Ganzzahl Wenn Sie an der entsprechenden Position eine Flie kom mazahl angeben wird der Nachkommateil ohne Rundung abgeschnitten gt gt printf d n 3 3 gt gt printf d n 3 2 3 gt gt printf d n 3 9 3 Ein undAusgabe 117 Auch d k nnen Sie durch die Angabe einer Gesamtl nge rechtsb ndig ausrich ten Zum Beispiel gt gt printf Viel Platz 10d n 7 Viel Platz 7 f eine Flie kommazahl Auch hier k nnen Sie wieder eine Gesamtl nge angeben die f r die gesamte Zahl einschlie lich dem Dezimalpunkt gilt Dan
223. e HTTP 1 1 200 OK bestehend aus Protokollversion hier wie derum HTTP 1 1 Statuscode und text Der Status 200 OK besagt dass das ange forderte Dokument vorhanden ist und geliefert wird Ein anderer bekannter Status ist beispielsweise 404 Not Found er tritt auf wenn die gew nschte Seite nicht vorhanden ist e Diverse Header Zeilen Die wichtigste ist Content type sie teilt dem Browser den Datentyp der Antwort mit im vorliegenden Fall text html f r ein HTML Dokument Die wichtigsten HTTP Header werden weiter unten in diesem Kapitel erl utert e Der Body er wird durch eine Leerzeile von den Headern getrennt und enth lt entweder das angeforderte Dokument oder gegebenenfalls eine Fehlermittei 6 Wie Sie vielleicht wissen besteht auch ein HTML Dokument wiederum aus einem Head und einem Body Bereich Aus der Sicht des HTTP Protokolls bildet allerdings das gesamte HTML Dokument den Body der Antwort Eine sehr kurze HTML bersicht finden Sie weiter unten in diesem Kapitel Sockets 231 lung Im obigen Beispiel ist die erste vom HTML Code befreite Body Zeile der Titel oreilly de Willkommen beim O Reilly Verlag In Wirklichkeit steht er zwischen den Tags lt title gt und lt title gt Der Client liest die Antwort mittels sock read vollst ndig aus seinem Socket Zum Schluss werden noch zwei Musterersetzungen durchgef hrt Alles was auch mehr zeilig zwischen spitzen Klammern steht lt gt m verschwindet und
224. e Methode auf beliebige Objekte anwenden zu k nnen m ssen Sie sie als Erweiterung der Klasse Object schreiben indem Sie sie einfach in den Block class Object end setzen Dies ersetzt die Standardklasse Object nicht etwa sondern erweitert sie um die entsprechende Methode Hier eine erweiterte Fassung von verdoppeln innerhalb eines Skriptbeispiels die f r alle Werte au er Zahlen Strings und Arrays nil zur ckgibt Dazu untersucht sie mittels class to_s den in Strings umgewandelten Typ von self und reagiert entsprechend class Object def verdoppeln case self class to_s when Fixnum Bignum Float String Array self 2 else nil 4 Es geht hier wohlgemerkt nicht um Methoden ohne expliziten Objektbezug wie im imperativen G ter zug Beispiel diese funktionieren v llig problemlos sondern eben nur um solche die als Instanz Methode aufgerufen werden sollen Klassen entwerfen und implementieren 185 end end end Passende Klassen puts 2 verdoppeln puts 7 1 verdoppeln puts Hallo verdoppeln puts a b c verdoppeln Unpassende Klassen puts true verdoppeln puts verdoppeln Skript ist Instanz von Object Wenn Sie dieses Skript speichern und ausf hren erhalten Sie folgende Ausgabe gt ruby verdoppeln rb 4 14 2 HalloHallo a b c a b c nil nil Interessanterweise k nnen Sie aber nicht nur die allgemeine Klasse Object sondern auch gezielt einzelne Klassen erweitern Es w re
225. e aber dass Sie beim manuellen Abtippen unendlich viel mehr lernen als wenn Sie einfach die fertigen Listings ffnen und ausf hren Und nun Leinen los und Anker lichten Sie segeln in ein unentdecktes Land voller Abenteuer Mit Entdeckergeist und Mut werden Sie bald viele seiner Geheimnisse l ften und f r Ihre t gliche Arbeit nutzen k nnen Ich zumindest habe meinen erw hnten Werkzeugkasten inzwischen etwas umgepackt Ruby f r Admin Skrip ten Ruby on Rails oder Ruby CGls und seltener PHP f rs Web und nur im Not fall Java Ruby hat mein Programmierer Leben ver ndert und auch Sie werden es gewiss nicht bereuen diese Sprache zu lernen Aufbau des Buchs Dieses Buch ist in sieben Kapitel und zwei Anh ngen mit folgenden Inhalten unter teilt e Kapitel 1 Einf hrung verliert zun chst einige Worte ber Geschichte und Merkmale von Ruby Danach wird gezeigt wie Sie die Sprache und ihre Werk zeuge auf Ihrem Rechner installieren und Sie schreiben Ihr erstes Ruby Skript e In Kapitel 2 Sprachgrundlagen werden alle Grundbausteine der Programmier sprache Ruby vorgestellt Die Syntax das hei t die korrekte Schreibweise von Befehlen danach Ausdr cke und Variablen Fallentscheidungen Schleifen und so weiter bis hin zu einigen Spezialwerkzeugen die so nur Ruby zu bieten hat e Kapitel 3 Ruby Klassen ist der erste Teil einer gr ndlichen Einf hrung in die Objektorientierung Hier lernen Sie mit vielen n tzlichen Kla
226. e ankommen k nnen Sie die Session Daten wie der auslesen indem Sie zun chst nach dem weiter oben beschriebenen Verfah ren den Wert des Parameters id ermitteln und anschlie end auf die betreffende Datei oder Datenbanktabelle zugreifen Von der Implementierung einer eigenen Session L sung nach dem soeben erl uter ten Schema soll an dieser Stelle abgesehen werden wenn Sie m chten k nnen Sie es an einem verregneten Sonntagnachmittag selbst probieren Denn erfreulicher weise enth lt Ruby eine eingebaute Bibliothek f r Session Tracking Um diese zu nutzen m ssen Sie zun chst die entsprechenden Klassen importieren require cgi session Nun k nnen Sie unter Verwendung Ihres bereits existierenden CGI Objekts hier wie blich cgi genannt eine Session Instanz erzeugen session CGI Session new cgi Diese Instanz kann als Hash verwendet werden um beliebige Werte als Session Daten zu speichern Dies muss vor dem Senden der Header also vor cgi header beziehungsweise cgi out geschehen Dieses Beispiel speichert den Wert eines For mularfeldes in der Session session username cgi username Um Session Variablen auf einer anderen Seite wieder auszulesen brauchen Sie nur wieder ein Session Objekt zu erzeugen und den betreffenden Hashschl ssel darauf anzuwenden Dazwischen d rfen beliebig viele CGI Skripten oder gar einfache HTML Seiten liegen die keine Session Daten verwenden die Ruby Session Biblio thek k mm
227. e ausw hlen k nnen genau wie bei den Frequenzbandw hlern eines alten Radios Das erste Argument ist ein String mit dem gemeinsamen Gruppennamen danach folgt f r jeden Button ein Array mit zu bertragendem Formularwert und Beschriftung Einem Ihrer Buttons k nnen Sie als drittes Argument den Wert true mitgeben dieser ist dann auto matisch vorausgew hlt Aus dem vorliegenden Methodenaufruf entsteht so fol gender HTML Code lt INPUT CHECKED NAME rechnung TYPE radio VALUE cf gt amp deg C gt amp deg F nbsp amp nbsp lt INPUT NAME rechnung TYPE radio VALUE fc gt amp deg F gt amp deg 296 Kapitel 6 Klassische Webanwendungen e Zeile 62 Zuletzt ben tigt das Formular noch eine Schaltfl che zum Abschi cken Als Argument k nnen Sie ihm die gew nschte Beschriftung bergeben andernfalls legt der jeweilige Browser einen Standardtext fest Formulardaten auslesen Wie Sie im cgi rb Einf hrungsbeispiel bereits gesehen haben gibt es eine sehr einfa che M glichkeit mit Hilfe der CGI Bibliothek Formulardaten zu ermitteln Sie k n nen den jeweiligen Feldnamen als Index auf die CGI Instanz selbst anwenden um das gew nschte Feld auszulesen Das Ergebnis ist ein String mit dem fraglichen Wert Zuvor kann die Methode cgi has_key Feldname eingesetzt werden um zu pr fen ob der Benutzer das entsprechende Feld berhaupt ausgef llt hat Das folgende Beispiel pr ft ob ein Feld namens kundenn
228. e einfachste M glichkeit der Kom munikation zwischen Prozessen Interprozesskommunikation oder kurz IPC umfangreiche Inhalte lassen sich damit nicht austauschen aber immerhin ein vor definierter Satz von Konstanten 260 Kapitel 5 Netzwerkanwendungen Das Signal mit dem das Ende eines Child Prozesses bekannt gemacht wird hei t SIGCLD dies ist die Ruby Bezeichnung der POSIX Name lautet SIGCHLD Um in Ruby ein Signal abzufangen wird ein Konstrukt mit folgender Syntax verwendet trap Signalstring Der Signalstring ist ein String der einen der zul ssigen Signalnamen angibt entwe der mit oder ohne SIG Pr fix Welche Signale m glich sind variiert leicht zwi schen den UNIX Varianten Der Mindestsatz ist im POSIX Standard festgelegt eine Liste mit einer kurzen Beschreibung jedes Signals finden Sie beispielsweise unter http en wikipedia org wiki Signal_ computing Der Block von trap ist also die passende Stelle an der Sie das Reaping ohne die Gefahr einer Blockade durchf hren k nnen Das Schema sieht so aus trap SIGCLD Reaping hier ohne Untersuchung des Child Exit Status Process wait Sie k nnen eine trap gleich zu Beginn des gew nschten Prozesses platzieren aufge rufen wird sie erst sp ter wenn das betreffende Signal eintrifft Um diese Variante zu testen k nnen Sie das folgende kurze Skript ausprobieren f fork if f puts Ich bin der Parent mein Child heisst f
229. e normale Ausgabe Die wichtigsten Ausgabemethoden die Sie auf STDOUT STDERR und jedem anderen f r die Ausgabe ge ffneten I O Kanal verwenden k nnen sind print puts und printf Wenn Sie ihnen keinen Kanal voranstellen wird automatisch STDOUT ver wendet print gibt einen oder mehrere durch Kommata getrennte Ausdr cke aus Weder zwischen den Ausdr cken noch am Ende wird ein Zeilenumbruch oder sonstiger Abstand eingef gt Probieren Sie es in irb aus gt gt print 2 3 23 puts gibt die Werte der einzelnen Ausdr cke dagegen zeilenweise aus und f gt auch hinter dem letzten einen Zeilenumbruch ein Zum Beispiel 116 Kapitel 3 Ruby Klassen gt gt puts 2 3 2 3 Bereits im vorigen Kapitel wurde der Aufbau von String Literalen besprochen wenn Sie diese in doppelte Anf hrungszeichen setzen werden Escape Sequenzen und eingebettete Ausdr cke ausgewertet Zum Beispiel gt gt puts Naeherungswert von Pi Math PI Naeherungswert von Pi 3 14159265358979 Einen etwas anderen Weg geht die aus der C Standardbibliothek stammende Methode printf Das f steht f r Format denn das erste Argument ist ein Format string Er kann neben beliebigen Zeichen spezielle Platzhalter enthalten die mit beginnen Diese bestimmen wie die nachfolgenden Argumente dargestellt werden sollen Bevor die Details beschrieben werden hier zun chst ein Beispiel gt gt printf d d d n 2 2 2 2 2 2 4 d steht f r ein
230. e und unless Die einfachste Variante pr ft die Bedingung und f hrt eine oder mehrere Anweisun gen aus wenn diese zutrifft Die Syntax lautet if Bedingung Anweisung en end Das folgende kurze Beispiel fragt den Benutzer nach seinem Alter Wenn es gr er oder gleich 18 ist wird eine Erfolgsmeldung ausgegeben puts Zutritt nur fuer Erwachsene print Bitte geben Sie Ihr Alter ein Alter einlesen und in Ganzzahl umwandeln alter gets to_i if alter gt 18 puts Herzlich willkommen end Es w re nat rlich w nschenswert wenn auch bei Minderj hrigen eine Meldung erscheinen w rde Zu diesem Zweck k nnen Sie einen else Block andernfalls hinzuf gen Dieser wird genau dann ausgef hrt wenn die Bedingung nicht zutrifft Eine solche Fallentscheidung hat folgendes Schema if Bedingung Dann Anweisung en else Sonst Anweisung en end Damit k nnen Sie die Alters berpr fung wie folgt erg nzen if alter gt 18 puts Herzlich willkommen else puts Fuer Minderjaehrige ist der Zutritt leider verboten puts Bitte kommen Sie in 18 alter Jahren wieder end Probieren Sie verschiedene F lle aus wie in Abbildung 2 4 gezeigt Kontrollstrukturen 73 Sie k nnen zwischen der Bedingung und der ersten von ihr abh n genden Anweisung optional das Schl sselwort then schreiben das in 7 einigen lteren Programmiersprachen Pflicht ist Zum Beispiel if alter gt 18 then puts He
231. e wird in ein Datenpaket verpackt Die Nutzdaten die dem Briefbogen im Postbeispiel entsprechen werden also um Versandinformationen vergleichbar mit einem Briefumschlag erg nzt Der innere Umschlag der Host zu Host Trans portschicht nummeriert die Pakete einer bertragungssequenz und f gt die beiden Portnummern hinzu Damit wei der Empf ngerrechner an welches konkrete Pro gramm er den Inhalt aush ndigen soll und von welchem Programm auf dem Absen derrechner die Daten stammen Als N chstes wird das Paket der Transportschicht in einen weiteren Umschlag verpackt Die Internetschicht f gt die Adresse des Absenderrechners und die des Empf ngerrechners hinzu Das Format dieser so genannten IP Adressen wird weiter unten erl utert Die Pakete der Internetschicht werden schlie lich ber die Netzwerkhardware zum Beispiel Ethernet WLAN DSL oder eine Modem Verbindung ins eigentliche Netz geschickt wobei eine letzte Ebene von Versandinformationen hinzukommt Nun m ssen die Daten zum Zielrechner transportiert werden Wenn sich Sender und Empf nger im gleichen physischen Netzwerk befinden werden die Pakete ohne Umweg zugestellt etwa ber einen Ethernet Switch oder einen einzelnen WLAN Hotspot Bei Internetverbindungen ist das jedoch so gut wie nie der Fall Hier kommt das Routing ins Spiel Die Router sind spezielle Rechner die jeweils mit mehr als einem Teilnetz verbunden sind und Daten zwischen diesen Netzen weiterleiten Das
232. e wird nun mit Hilfe ihrer Methode get_ kapazitaet ermittelt Zeile 73 75 Die Methode lokinfo ist nur noch ganz kurz weil ihre eigentliche Aufgabe in der Klasse Lok erledigt wird Zeile 13 24 Deshalb gen gt es an dieser Stelle die Methode get_typ der betroffenen Lok aufzurufen Zeile 77 82 In der Methode info haben sich nur zwei Zeilen ge ndert In Zeile 80 wird wie bereits beschrieben mit get_kapazitaet gearbeitet In Zeile 81 wird statt der fr heren globalen Variablen nun der Wert der Instanzvariablen waggons ausgegeben Zeile 86 Hier wird eine Instanz der Klasse Gueterzug erzeugt die Referenzvari able zug verweist darauf Es werden zwei der drei m glichen Parameter berge ben n mlich die Loktypen als Konstanten der Klasse Lok Der dritte Parameter die Anfangswaggonzahl wird weggelassen so dass er den Standardwert 0 erh lt siehe Zeile 36 Zeile 88 106 Dieser Teil des globalen Codes entspricht im Ablauf genau den Zeilen 62 80 der imperativen L sung Der Unterschied der sich durch alle 162 Kapitel 4 Eigene Klassen und Objekte erstellen Codezeilen zieht ist die Syntax der Methodenaufrufe Wo bei der imperativen Fassung ein einfaches info oder anhaengen 50 steht wird in der OO Version spezifiziert um welchen konkreten Zug es geht indem den Methodenaufrufen die Referenzvariable zug vorangestellt wird zug info beziehungsweise zug anhaengen 50 Anregung Auf den ersten Blick wirkt die objektorientier
233. e zuletzt einen der Clients mit quit Geben Sie im anderen EXIT ein um den Server aus der Ferne zu beenden 240 Kapitel 5 Netzwerkanwendungen In Abbildung 5 3 sehen Sie den hier geschilderten Ablauf ohne den externen Cli ent im berblick x Eingabeaufforderung elx rubytest gt ruby echoserver rhb 7887 CHO Server listening on port 7007 Dieser Text soll bitte zur ckgeliefert werden MODE_REUERSE Dieser Text soll bitte umgedreht werden Hier ein weiterer Text der ebenfalls umgekehrt wird MODE_ROT13 Nun soll mal ein Text verschl sselt werden rubytest gt Eingabeaufforderung rubytest gt ruby echoclient rb localhost 7007 erver localhost Port 7007 ext MODE_REVERSE ntwort Modus auf Reverse gesetzt ext Hier ein weiterer Text der ebenfalls umgekehrt wird ntwort driw trhekegmu sllafnebe red txeT reretiew nie reiH ext Nun soll mal ein Text verschl sselt werden neuort Aha fbyy zny rva Grkg irefpuy ffryg jregra ext rubytest gt x Eingabeaufforderung rubytest gt ruby echoclient rb localhost 7887 erver localhost Port 7007 Dieser Text soll bitte zur ckgeliefert werden ort Dieser Text soll bitte zur ckgeliefert werden Dieser Text soll bitte umgedreht werden ntwort nedrew therdegmu ettib llos txeT reseiD ext MODE_ROT13 ntwort Modus auf ROT13 gesetzt ext quit ruhytest gt _ Abbildung 5 3 Die Zusammenarbeit
234. ebnis von Ausdruck inspect im p 1 2 3 gt 1 2 3 Wesentlichen String Darstellung s String mit Genauigkeitsangabe werden maximal s Hallo gt Hallo entsprechend viele Zeichen dargestellt 2s Hallo gt Ha AU Vorzeichenlose Ganzzahl u 10 gt 10 u 10 gt 4294967286 118 Kapitel 3 Ruby Klassen Tabelle 3 1 bersicht ber die printf Formatplatzhalter Fortsetzung Platzhalter RX X Bedeutung Beispiel In Hexadezimalzahl konvertieren x 65534 gt fffe Wie x aber mit Gro buchstaben X 65534 gt FFFE Literales Prozentzeichen d 100 gt 100 a Die Anweisung printf selbst wurde aus Platzgr nden jeweils weggelassen b Zur Interpretation dieses seltsamen vorn abgeschnittenen Ergebnisses lesen Sie bitte den Infokasten zur Ganzzahlarithmetik im vorigen Kapitel Es gibt noch einige interessante Erg nzungen f r die Formatplatzhalter die die Feinheiten der Formatierung regeln Hier einige von ihnen im berblick e pr zisere Schreibweise F gt vor Oktalzahlen 0 und vor Hexadezimalzahlen 0x ein bei den wissenschaftlichen Schreibweisen werden ein Dezimalpunkt und Nachkommastellen eingef gt auch wenn keine n tig w ren Zum Bei spiel gt gt printf x 3333 0xdo5 e f gt vor positiven Zahlen ein Pluszeichen ein Zum Beispiel gt gt printf d 1200 1200 e Das Ergebnis linksb ndig statt rechtsb ndig formatieren funk
235. ehalt gehalt gehalt end Die maximale Kreditsumme ist geheim private def max_kredit gehalt 4 end Oeffentlich ist nur ob ein bestimmter Kredit gewaehrt werden kann public def kredit _ok summe if summe lt max_kredit true else false end end end Probieren Sie die Klasse nun aus mueller Kunde new 2500 neuwagen 26000 gebrauchtwagen 8000 if mueller kredit_ok neuwagen puts Glueckwunsch Wir koennen Ihren Neuwagen finanzieren else puts Der Neuwagen sprengt leider den Rahmen end if mueller kredit_ok gebrauchtwagen puts Glueckwunsch Wir koennen Ihren Gebrauchtwagen finanzieren else puts Der Gebrauchtwagen sprengt leider den Rahmen end Die Ausgabe lautet Der Neuwagen sprengt leider den Rahmen Glueckwunsch Wir koennen Ihren Gebrauchtwagen finanzieren Ein direkter Aufruf der Methode max_kredit von au en scheitert dagegen erwar tungsgem gt gt mueller max_kredit NoMethodError private method max_kredit called for lt Kunde 0x2b0gea4 gehalt 2500 gt Die Geheimhaltungsstufe private wird im brigen sehr h ufig verwendet um die unkontrollierte Instanziierung einer Klasse zu verhindern Bestimmte Ressourcen wie etwa eine Druckerwarteschlange oder den Zugriff auf eine Logdatei darf es nur ein einziges Mal geben und jeder Bezug darauf muss somit dasselbe Objekt liefern Weitere objektorientierte Konstrukte 203 Es folgt ein Beispiel das ein einfaches Logbuch realisier
236. ehrere Parame tervariablen enthalten Diese werden ohne trennendes Leerzeichen in runde Klam mern hinter den Methodennamen geschrieben und beim Aufruf mit Werten gef llt den Argumenten 170 Kapitel 4 Eigene Klassen und Objekte erstellen Im einfachsten Fall sind die Parameter normale Variablen wie in dieser Methode die den gr eren von zwei Werten zur ckliefert def groessere z1 z2 if z1 gt z2 z1 else z2 end end Beim Aufruf m ssen Sie genau zwei Argumente angeben sonst erhalten Sie eine Fehlermeldung Zum Ausprobieren k nnen Sie die Datei mit dieser alleinstehenden Methode einfach um zwei Testzeilen erweitern eine g ltige und eine unvollst n dige Zum Beispiel puts groessere 2 7 puts groessere 2 Die Ausgabe lautet 7 gr rb 10 in groessere wrong number of arguments 1 for 2 ArgumentError Im ersten Fall wird also das korrekte Ergebnis 7 ausgegeben im zweiten Fall kommt es zum erwarteten Fehler Eine praktische M glichkeit die Anzahl der Argumente variabel zu machen ist der Einsatz von Standardwerten Wichtig Ab dem ersten Parameter mit Standardwert ben tigen alle nachfolgenden ebenfalls Standardwerte damit Ruby beim Aufruf die Reihenfolge der Argumente versteht Bei der Klasse Lok besitzt beispielsweise der einzige Parameter des Konstruktors der Loktyp einen Standardwert def initialize typ 0HNE typ typ end Sie k nnen eine Lok mit oder ohne Typangabe erzeugen im letzteren Fall wi
237. eidungen verwenden k nnen Beachten Sie dass Sie daf r in Ruby die Textvarianten and und or benutzen m ssen amp amp und funktionieren dort nicht Das Ganze funktioniert aufgrund der bereits beschriebenen Short Circuit Funktions weise dieser Operatoren Sobald das Ergebnis feststeht wird die Operation nicht weiterberechnet Das ist bei and der Fall wenn der erste Operand false ist denn das Kontrollstrukturen 77 macht den Gesamtausdruck false Bei or erfolgt der Abbruch dagegen wenn der erste Operand true ist weil der Gesamtausdruck bereits true sein muss Auf diese Weise wird and zu einem if Ersatz der die Anweisung nur dann ausf hrt wenn die Bedingung zutrifft Zum Beispiel punkte gt 100 and puts Sie haben gewonnen Entsprechend kann or als unless Stellvertreter fungieren denn die Anweisung hin ter dem Operator wird ausgef hrt wenn die Bedingung nicht wahr ist punkte gt 100 or puts Das war wohl nichts Fallentscheidungen in Ausdr cken Interessanterweise k nnen Sie nicht nur logische Operatoren als Fallentscheidun gen verwenden sondern umgekehrt auch Fallentscheidungen direkt an Stellen schreiben wo Ausdr cke erwartet werden Wichtig ist nur dass Sie f r die einzel nen F lle keine Anweisungen sondern eben Ausdr cke angeben Beachten Sie dass auch dies eine Ruby Spezialit t ist Eine bertra l gung auf andere Programmiersprachen liefert h chstwahrscheinlich nur eine Fehlermeldu
238. eigend int downto int2 Iterator von int bis int2 absteigend int step max schritt Iterator von int bis max Schrittweite schritt int to_s basis konvertiert int in das Zahlensystem basis 2 36 und liefert das Ergebnis als String Allgemeine Ein und Ausgabeklasse Instanzmethoden io print Text ausgeben io puts Text zeilenweise ausgeben io printf format Elemente gem format ausgeben bersicht ber For matplatzhalter Kapitel 3 io getc ein Zeichen einlesen io gets eine Zeile einlesen io read Fingabestrom bis Dateiende EOF einlesen MatchData Treffer bei Mustervergleich mit regexp match siehe Klasse RegExp Instanzmethoden match n 0 ist der gefundene Text des gesamten Treffers 1 bis n sind geklammerte Ausdr cke entspren 1 bis n 366 Anhang A Ruby Kurzreferenz match begin n Position des ersten Zeichens eines Treffers oder Teilausdrucks im String match end n Position des ersten Zeichens das nicht mehr zum Treffer geh rt match offset n Array mit den Werten begin und end match pre match Text vor dem Treffer match post_match Text hinter dem Treffer Math Modul f r komplexere mathematische Konstanten und Berechnungen Konstanten Math PI m 3 14159265358979 Math E e 2 71828182845905 Klassenmethoden Math sqrt x Quadratwurzel Math log x nat rlicher Logarithmus Basis e Math exp x
239. eilbar Zeile 13 Aus dem Array wird die L nge des aktuellen Monats ermittelt Zeile 15 18 Mittels Time parse wird ein neues Datumsobjekt erzeugt Monat und Jahr stimmen mit dem Systemdatum berein aber als Tag wird der Monatserste eingetragen um dessen Wochentag zu ermitteln Wenn es sich um den Sonntag Wert 0 handelt wird er auf 7 ge ndert weil der Kalender kontinentaleurop isch sortiert werden soll Zeile 23 24 Die erste Woche wird mit Leerzeichen f r die nicht vorhandenen Wochentage aufgef llt vier Zeichen f r jeden Tag Zeile 25 38 Der Operator upto z hlt von 1 bis zum Monatsletzten 144 Kapitel 3 Ruby Klassen e Zeile 27 30 Wenn der Wochentag gr er als 7 Sonntag ist wird er auf 1 zur ckgesetzt und es erfolgt ein Zeilenumbruch e Zeile 32 36 Der Tag wird ausgegeben Falls es sich um den heutigen Tag han delt wird er von eckigen Klammern umgeben Anregung Denken Sie dar ber nach wie Sie das Skript durch zwei optionale Para meter Monat und Jahr erweitern k nnten um alternativ auch einen Kalender f r einen anderen Monat ausgeben zu k nnen Einen L sungsvorschlag finden Sie auf der Webseite zum Buch Einige weitere Klassen Nachdem Sie nun Klassen f r zwei wichtige Anwendungsgebiete kennengelernt haben wissen Sie bereits gut wie man mit vorgefertigten Klassen arbeitet Deshalb sollen hier in diesem kurzen Abschnitt noch einige weitere interessante Klassen erw hnt werden Bruchre
240. eine Zeile daraus gelesen und die Datei wird wieder geschlossen Falls die Datei nicht vorhanden ist soll eine benutzerfreundliche Fehlermeldung ausgegeben werden Der entsprechende Code sieht so aus filename nichtda txt begin f File open filename r Weitere objektorientierte Konstrukte 209 text f gets f close rescue STDERR puts Datei filename kann leider nicht geoeffnet werden end Das Schema ist immer dasselbe Setzen Sie die Codezeilen mit Fehlerm glichkeit in einen Block der mit begin anf ngt Hinter dem Schl sselwort rescue steht der Code der beim Auftreten eines Fehlers ausgef hrt werden soll Wenn n tig k n nen Sie vor dem abschlie enden end noch das Schl sselwort ensure einf gen Der darin befindliche Code wird auf jeden Fall ausgef hrt ob der Fehler auftritt oder nicht Hinter dem Schl sselwort rescue k nnen Sie optional eine Fehlerklasse nennen Dadurch k nnen sogar mehrere rescue Abschnitte angegeben werden um verschie dene Arten von Fehlern unterschiedlich zu behandeln Das folgende Beispiel unter scheidet zwischen einer nicht vorhandenen Methode NoMethodError und allen anderen Arten von Fehlern StandardError begin pots Hallo Absichtlich falsch f File new Ebenfalls absichtlich falsch rescue NoMethodError puts Unbekannte Methode rescue StandardError puts Anderer Fehler end Bei der ersten Ausf hrung lautet die Fehlermeldung Unbekannte
241. el Hash 50 SciTE Editor 18 Scope G ltigkeitsbereich 47 ScriptAlias 287 search Array Erweiterung 177 sec Methode 139 seek Methode 135 SELECT SQL Anweisung 319 select_db Methode 323 self 184 Server 232 Server HTTP Header 286 ServerAdmin 281 ServerName 281 ServerRoot 280 Sessions HTTP 308 in CGI Bibliothek 310 manuell implementieren 309 Setter Methoden Attribut 196 Setter Methoden automatische 195 Shebang 34 bei CGI 287 Shell 10 shift Methode 69 Short Circuit Verfahren 56 Sichtbarkeitsstufen siehe Zugriffsschutz OOP Index 389 SIGCLD Signal 261 Signale 260 abfangen 261 senden 262 SIGCLD 261 SIGTERM 262 SIGUSR1 262 SIGUSR2 262 SIGTERM Signal 262 SIGUSR Signal 262 SIGUSR2 Signal 262 sin Math Methode 65 Singleton 205 Skripten importieren 187 sleep Methode 267 slice Methode 69 Smalltalk 2 Sockets 229 accept 233 getservbyname 233 Klassen 230 lauschende Server 233 Nonblocking 234 sort Methode 69 sort Methode File 136 Spezialliterale 44 Sprachreferenz 357 sprintf Methode 119 SQL 318 CREATE TABLE Anweisung 318 in Ruby Skripten 323 INSERT Anweisung 319 SELECT Anweisung 319 sqrt Math Methode 65 Standardausgabe 115 Standardeingabe 114 Standardfehlerausgabe 115 Standardwerte f r Parameter 171 Statuscodes HTTP 285 STDERR 115 STDIN 114 STDOUT 115 step Iterator 104 strftime Methode 140 strftime Formate 141 String Klasse Erweiterung 190 Methode 67 chomp
242. elt sich um 32 Bit lange Zahlen die jeden im Internet oder einem anderen TCP IP Netzwerk vorhandenen Rechner Host oder Router eindeutig kennzeich nen blicherweise besteht eine IP Adresse aus vier durch Punkte getrennten Dezi malzahlen zwischen 0 und 255 Beispiele 129 17 21 56 oder 83 12 51 126 Der Anfangsteil einer IP Adresse gibt das Netzwerk an zu dem der betreffende Rechner geh rt der Rest steht f r den Rechner selbst Der bergang zwischen den beiden Teilen ist nicht immer an derselben Stelle Traditionell gibt es die folgenden Klassen von IP Adressen Zu welcher Klasse eine Adresse geh rt richtet sich nach dem ersten ihrer vier Zahlenbl cke e Klasse A von 0 bis 127 8 Bit kennzeichnen das Netzwerk die restlichen 24 den Rechner Dies erm glicht 16 777 216 Adressen pro Netz 12 13 14 15 und 12 14 15 16 geh ren beispielsweise zum gleichen Netz w hrend 13 14 15 16 einem anderen angeh rt e Klasse B von 128 bis 191 16 Bit f r das Netzwerk und 16 f r den Rechner In jedem Netz stehen 65 536 Adressen zur Verf gung Somit geh ren 130 10 22 23 und 130 10 23 24 zum selben Netz aber 130 11 23 24 nicht e Klasse C von 192 bis 223 24 Bit f r das Netzwerk und 8 f r den Rechner so dass jedes Netz nur 256 Adressen enth lt 194 10 11 12 und 194 10 11 13 geh ren daher zum gleichen Netz aber 194 11 12 13 zu einem anderen e Klasse D von 224 bis 239 ist der Bereich der so genannten Multicast Adressen Sie werde
243. em Cache geliefert hat ohne den eigentlich zust ndigen Nameserver erneut zu fragen gewisserma en eine Antwort ohne Gew hr Aufgaben der Host zu Host Transportschicht W hrend das IP Protokoll durch Routing grunds tzlich daf r sorgt dass berhaupt Datenpakete von einem bestimmten Host zu einem beliebigen anderen gesendet werden k nnen ist es die Aufgabe der Host zu Host Transportschicht dies f r den eigentlichen Datentransport zu nutzen Daf r gibt es zwei verschiedene Transport protokolle die f r unterschiedliche Anwendungsf lle geeignet sind das Transmis sion Control Protocol TCP und das User Datagram Protocol UDP TCP stellt einen verl sslichen Datenstrom zwischen den beiden Hosts zur Verf gung w h rend UDP zum schnellen einfachen Versand einzelner Nachrichten dient Bei TCP wird vor dem eigentlichen Datenversand eine Verbindung zwischen den Hosts aufgebaut Da die zugrunde liegenden Datagramme der Internetschicht nach wie vor durch Routing transportiert werden handelt es sich nicht um eine echte Kurze Einf hrung in TCP IP 227 Punkt zu Punkt Verbindung die etwa bei klassischen Telefondiensten zustande kommt sondern um eine virtuelle Die Datenpakete werden dazu mit einer Sequenznummer versehen und der Sender erwartet f r jedes Paket eine Best tigung vom Empf nger Bleibt diese aus sendet er das betreffende Paket nach einer gewis sen Wartezeit erneut Das Ergebnis dieses Verfahrens ist ein abso
244. em Fall auf die Datei usr local apache2 htdocs products info html verweisen Hier zum Vergleich ein Windows Beispiel DocumentRoot C Programme Apache Software Foundation Apache2 2 htdocs Beachten Sie in diesem Zusammenhang die Anf hrungszeichen sie sind bei Apache Direktiven zwingend erforderlich sobald ein Parameter Leerzeichen enth lt Den Webserver Apache 2 installieren 281 lt Directory gt lt Directory gt Dies ist eine von mehreren so genannten Container Direktiven Die darin ent haltenen Einstellungen beziehen sich nur auf das angegebene Verzeichnis und seine Unterverzeichnisse Das wichtigste Beispiel sind die weiter unten gezeig ten Voreinstellungen f r alle Verzeichnisse und f r die DocumentRoot Letzteres sieht bei einer UNIX Standardinstallation schematisch so aus Directory usr local apache2 htdocs gt Voreinstellungen fuer die DocumentRoot lt Directory gt lt Location gt lt Location gt hnelt lt Directory gt sehr mit dem Unterschied dass sich die Angabe auf einen URL Pfad bezieht Betrachten Sie dazu das folgende Beispiel lt Location info gt Einstellungen fuer URL Pfad test lt Location gt Die Direktiven in diesem Container betreffen also auf das obige Beispiel bezo gen alle URLs die mit http www test local info beginnen Options Options stellt verschiedene Einstellungen f r das Verhalten eines Verzeichnisses zur Verf gung Beispiele Indexes gene
245. en loks Array new loks 0 Lok new 1loko loks 1 Lok new lok1 waggons waggons end Methoden end Mit diesem neuen Konstruktor k nnen Sie nun flexibel selbst entscheiden welche Werte Sie angeben m chten und sogar die Reihenfolge spielt keine Rolle mehr Zum Beispiel zug1 Gueterzug new waggons gt 10 loko gt Lok DIESEL zug2 Gueterzug new lok1 gt Lok STROM Innerhalb des Konstruktorrumpfes wurde die Reihenfolge ein wenig ge ndert weil die Standardwerte nun nicht mehr aus der Parameterliste stammen sondern nach Klassen entwerfen und implementieren 173 tr glich festgelegt werden In diesem Fall ist es am praktischsten einen Satz lokaler Variablen zuerst mit diesen Standardwerten zu initialisieren und ihn dann gegebe nenfalls mit den Hashwerten zu berschreiben Bevor der Hash ausgelesen wird berpr ft eine Fallentscheidung aus Sicherheits gr nden mittels class ob der bergebene Parameter berhaupt ein Hash ist Anschlie end wird jeder m gliche Schl ssel ausprobiert falls er vorhanden ist wird die entsprechende lokale Variable mit dessen Wert ge ndert Erst ganz zum Schluss werden Instanzvariablen mit den nun feststehenden Werten initialisiert Sie k nnen sogar noch einen Schritt weitergehen und beide Konstruktorvarianten miteinander verkn pfen Die folgende Variante des Gueterzug Konstruktors verar beitet sowohl die bisherigen 0 bis 3 Einzelwerte als auch den Hash
246. en Sie zum Vergleich die Schichten der Kommunikation per klas sischem Brief 1 Ganz unten befindet sich die Hardware bedrucktes Papier 2 Wer die entsprechende Schrift und Sprache beherrscht erkennt in den gedruckten Zeichen auf dem Papier einen Text 3 Aus den W rtern und S tzen des Textes ergibt sich ein Inhalt den m glicher weise nur spezielle Personengruppen verstehen Mit einem Brief den ein Arzt an einen Fachkollegen schreibt h tte ein Programmierer beispielsweise Schwie rigkeiten 4 Damit der Brief einen ganz bestimmten Empf nger erreichen kann wird er in einen Umschlag verpackt der mit einer Anschrift versehen wird Ein Merkmal von Schichtenmodellen ist dass beim Sender und Empf nger diesel ben Schichten existieren aber umgekehrt abgearbeitet werden Um beim Alltags beispiel zu bleiben Der Absender schreibt den Brief verpackt ihn in den Umschlag und adressiert ihn Der Empf nger packt ihn dagegen zuerst aus und liest ihn dann Diese beiden Schichten werden in Abbildung 5 1 dargestellt Schreiben Lesen Hallo Peter Hallo Peter A r Besprechung heute Besprechung heute Briefinhalt 15 00 Uhr in meinem B ro 15 00 Uhr in meinem B ro MfG Anna MfG Anna Verpacken amp adressieren Auspacken Hallo Peter Hallo Peter Besprechung heute Besprechung heute 15 00 Uhr in meinem B ro 15 00 Uhr in meinem B ro Briefumschlag MfG Anna MfG Anna An
247. en die beiden Befehle zur Kompilierung und Installation aufgerufen sp testens f r Letzteres ben tigen Sie root Rechte make make install Nach der Installation k nnen Sie Apache starten Daf r ist das Skript apachectl im bin Verzeichnis Ihrer Installation Standard usr local apache2 bin zust ndig apachectl start Dieses Skript dient auch dazu Apache nach einer Konfigurations nderung neu zu starten Geben Sie dazu Folgendes ein apachectl restart Bei Servern im Praxiseinsatz sollten Sie laufende Client Verbindungen nicht durch einen Neustart abbrechen sondern zun chst abwarten bis sie abgeschlossen sind Das erledigt die Option graceful elegant apachectl graceful Sie k nnen den Webserver mit Hilfe dieses Tools auch beenden indem Sie den Befehl stop beziehungsweise graceful stop verwenden Zu guter Letzt kann apachectl dazu genutzt werden um Apache 2 beim Booten automatisch zu starten Dazu m ssen Sie in Ihrem Startskripten Verzeichnis einen Link darauf erzeugen und dieses Startskript aktivieren Bei den meisten Linux Sys temen funktionieren diese beiden Schritte beispielsweise so In s usr local apache2 bin apachectl etc init d apache2 chkconfig a apache2 Basiskonfiguration Nun ist Apache installiert und Sie k nnen sich um die Basiskonfiguration k m mern bevor Sie ihn starten Bei einer Apache Standardinstallation befinden sich die wichtigsten Einstellungen in einer einzigen Konfigu
248. en mit dem Namen ihrer jeweiligen Band anzei gen zu lassen gt gt Album find all each Ja gt b Band find a band_id gt gt puts a title von b name a release_year gt Master of Puppets von Metallica 1986 Ride The Lightning von Metallica 1984 The Number Of The Beast von Iron Maiden 1982 Die Bestie in Menschengestalt von Die Aerzte 1993 Metallica von Metallica 1991 Controller und View erstellen Mit dem Active Record Wissen aus dem vorigen Abschnitt ist es nun berhaupt kein Problem mehr den Controller und die View der Rock and Roll Anwendung zu erstellen Die Bands und ihre Alben sollen alternativ als verschachtelte Liste und als Tabelle angezeigt werden Erstellen Sie als Erstes das Grundger st des Album Controllers gt ruby script generate controller Album exists app controllers exists app helpers create app views album exists test functional create app controllers album_controller rb create test functional album controller _test rb create app helpers album_helper rb Zuerst sollen die beiden m glichen Ansichten erstellt werden Sie wissen bereits wie die View Daten aus dem Controller erhalten kann sie kann s mtliche Instanz variablen auslesen Eine praktische Vorgehensweise besteht also beispielsweise darin die Ansichtsdaten komplett im Controller zu erzeugen in Instanzvariablen zu speichern und dann in der View anzuzeigen Die beiden Teilansichten erste
249. en und in eine Ganzzahl umge wandelt Zum Lesen von CGlI Parametern k nnen Sie den jeweiligen Feldna men einfach als Index auf die CGI Instanz anwenden Zeile 22 Auch der Inhalt des Feldes rechnung wird ermittelt Es handelt sich um zwei Radio Buttons von denen nur einer ausgew hlt werden kann Je nachdem welchen Sie anklicken kommt entweder cf Umrechnung von Celsius nach Fahrenheit oder fc dabei heraus Zeile 23 27 Im Modus cf wird der eingegebene Temperaturwert hier von C in F umgewandelt In Zeile 25 findet die eigentliche Umrechnung statt In Zeile 26 wird der Wert auf zwei Nachkommastellen gek rzt und Zeile 27 bernimmt die Ausgabe Beachten Sie dass das Sonderzeichen nicht websi cher ist und daher wie hier als Entity Referenz amp deg geschrieben werden sollte Zeile 28 32 In diesem else Block findet entsprechend die Umrechnung von Fahrenheit in Celsius statt CGl Skripten mit Ruby 295 Zeile 34 36 Wenn keine Formulardaten vorliegen wird ein leerer String als Ausgabe erzeugt Dieser else Teil ist absolut notwendig weil die if else Sequenz auf jeden Fall einen String zur ckliefern muss Andernfalls funktio niert die String Verkettung mit nicht mehr Zeile 39 65 Dieser Bereich des Skripts erzeugt den lt form gt lt form gt Block Der einzige Formularparameter ist hier die Methode get Da das zweite Argument die Action URL weggelassen wurde setzt die CGI Bibliothek automatisch
250. en vielleicht nichts anfangen aber keine Sorge im Laufe dieses Buches wird alles Schritt f r Schritt eingef hrt Ruby ist eine interpretierte Skriptsprache Das bedeutet dass ein Ruby Programm nicht direkt vom Prozessor eines Computers ausgef hrt wird Stattdessen wird zun chst der Ruby Interpreter geladen Dieses spezielle Programm ffnet die Ruby Dateien liest sie Zeile f r Zeile und wandelt die Ruby Anweisungen in Code um den der Prozessor verstehen kann Das Gegenteil von den Interpreter Sprachen sind kompilierte Sprachen Bei diesen kommt ein bersetzungsprogramm namens Compiler zum Einsatz das den gesamten Programmcode in die Maschinensprache des jeweiligen Prozessors bertr gt und dann dauerhaft als selbstst ndig lauff higes Programm abspeichert Kompilierte Programme werden zweifellos schneller ausgef hrt als interpretierte wobei die konkrete Geschwindigkeit heutzutage stark von der Qualit t der zugrunde liegenden Programmbibliotheken abh ngt Hier stellt sich allerdings die Frage des Anwendungszwecks ein 3 D Action Spiel muss fast immer kompiliert werden um ruckelfrei zu laufen Bei Anwendungen die auf langsamen Aspekten wie Benutzereingaben oder Netzwerkverbindungen basieren macht es dagegen kaum einen Unterschied ob Sie eine Compiler oder eine Skriptsprache w hlen Ein weiteres Problem besteht darin dass der Interpreter auf jedem Rechner instal liert werden muss auf dem die in der betreffenden Sprache ge
251. enn hacken 330 7 RubyonlRailss waus232 as 2 0602 22 00 ar a ren 333 Rails installieren und in Betrieb nehmen 222 22ccees n 336 Die erste Rails Anwendung 2220ce2cceeeeeeeeeeeenenenn 338 Realistische Anwendung Eine Online Rock n Roll Datenbank 341 Zusammentassung nr sd aan E e E E RE E E 355 A Ruby Kurzreferenz naaa 357 u e a a E T S S AE EEE EOT OI EE 357 Ausdr cken o are es nen ren E eA aAA 357 Kontrollstrukturen samek in e a e a a a a t a 360 Regul re Ausdr cke Saci iea en E ar Ba a 361 VI Inhalt Klassen def EOT 2er last le ds u lt 362 Klassenreferenz 2 2 sale E er 363 Ressourcen und Tools ccccc2ee nn 371 B cher eraras nA E E ee el a AD BE 371 Web Ressourcen sh 2 A a a ee A 373 dk ee ee ee er ren en are ne 375 Inhalt vii Vorwort A Programmer s Best Friend Slogan auf der Ruby Website Im Jahr 2002 entdeckte ich auf einem W hltisch einer K lner Buchhandlung ein verbilligtes Exemplar des Buchs Programmieren mit Ruby die deutsche Ausgabe der ersten englischsprachigen Ver ffentlichung zum Thema Die Tatsache dass das Buch bald nach Erscheinen verramscht wurde zeigt dass Ruby damals in Europa leider noch keine gro e Bedeutung hatte Aber als leidenschaftlicher Sammler von Computerb chern musste ich einfach zugreifen denn von dieser Sprache hatte ich zwar bereits geh rt aber noch keinerlei praktische Erfahrungen damit gesammelt Unmi
252. ent der Installation des Frameworks Ruby on Rails um das es im n chsten Kapitel geht gt gem install rails Wenn das zu installierende Paket von anderen Paketen abh ngt werden Sie jeweils einzeln gefragt ob Sie diese installieren m chten Um alle Abh ngigkeiten automa tisch zu erf llen k nnen Sie die Option include dependencies hinzuf gen Zum Beispiel gt gem install include dependencies gem bietet auch die M glichkeit nach Paketen zu suchen in deren Namen eine bestimmte Zeichenfolge vorkommt Ein einfaches gt gem search Zeichenfolge sucht dabei in den lokalen das hei t bereits installierten Gems F gen Sie remote hinzu um das Online Archiv zu durchsuchen Das folgende Beispiel sucht nach der weiter oben installierten uuid gt gem search uuid remote REMOTE GEMS 322 Kapitel 6 Klassische Webanwendungen uuid 1 0 3 1 0 2 1 0 1 1 0 0 UUID generator uuid4r 0 1 This generates and parses UUID based on OSSP uuid C library uuidtools 1 0 0 0 1 4 0 1 3 0 1 2 0 1 1 0 1 0 Generation of UUIDs Um Bibliotheken zu nutzen die Sie ber rubygems heruntergeladen haben sollten Sie immer zuerst die Bibliothek rubygems importieren Neuere Ruby Versionen erle digen das zwar automatisch ber die automatisch gesetzte Umgebungsvariable rubyopt aber es bringt auch dann keine Nachteile die zus tzliche Zeile hinzu schreiben Das folgende Beispiel importiert die uuid Bib
253. ent fertig ist Stattdessen erh lt er den Urprozess init PID 1 als Adoptiv Parent Forking Server Mit Hilfe von fork k nnen Sie TCP Server schreiben die mehrere dauerhafte Cli ent Verbindungen zur selben Zeit bedienen k nnen Hier wird eine entsprechend modifizierte Version des ECHO Servers pr sentiert Auch der Client muss leicht ge ndert werden denn er soll nicht mehr bei jeder Anfrage eine neue Verbindung zum Server herstellen Stattdessen wird das neue Steuerkommando QUIT eingef hrt das den Server anweist den Child Prozess einer Client Verbindung zu beenden Eine weitere Besonderheit dieses neuen Servers ist dass die Modus Steuerbefehle nun f r jeden Client separat gelten In Beispiel 5 5 sehen Sie zun chst den Server in Beispiel 5 6 folgt der angepasste Client Wenn Sie dem Kapitel bisher aufmerksam gefolgt sind m ssten Sie die Skripten mitsamt den kurzen Erl uterungen in den Kommentaren problemlos verstehen Beispiel 5 5 Die Forking Version des ECHO Servers echoforkserver rb 1 require socket 2 Modus Konstanten 3 NORMAL 0 4 REVERSE 1 5 ROT13 2 6 Anfangswert fuer Modus festlegen 7 mode NORMAL 8 Port von der Kommandozeile lesen oder auf 7 setzen 9 if ARGCV O 10 port ARGV 0 to _i 11 else 12 port 7 13 end 14 Lauschenden Socket erzeugen 15 server TCPServer new port 16 Infozeile ausgeben 17 puts ECHO Server listening on port port Prozess
254. entuelles Kommando Zeile 28 Falls der eingegebene Text EXIT war wird der Client nun ebenfalls beendet im Unterschied zu quit aber erst nachdem dieser Befehl an den Server geschickt wurde Zeile 30 Mit Hilfe von read wird eine beliebig lange Server Antwort ausgele sen Auch der Client verl sst sich an dieser Stelle darauf dass der Server tat s chlich Text liefert falls dies nicht der Fall sein sollte blockiert der Client Sie m ssen sich bei solchen einfachen Client Server Anwendungen deshalb stets genau ber das Protokoll und dabei speziell ber die Sende und Emp fangs Reihenfolge im Klaren sein Zeile 32 Der Socket wird geschlossen weil dieser Durchgang beendet ist Zeile 34 Zum Schluss wird die Antwort des Servers einfach ausgegeben Sockets 239 anwendung erm glicht die gleichzeitige Verarbeitung mehrerer u Client Verbindungen Der Client baut die Verbindung n mlich erst nach erfolgter Benutzereingabe auf Daraufhin sendet und empf ngt er schnell und beendet die Verbindung sofort wieder A Nur die spezielle Architektur der hier gezeigten einfachen Netzwerk Wenn Sie stattdessen eine einzelne dauerhafte Verbindung bevorzu gen m ssen weitere Clients entweder warten oder der Server muss so umgebaut werden dass er f r jeden Client eine neue Instanz sei ner selbst zur Verf gung stellt Dies ist Gegenstand des bern chsten Abschnitts Nun ist es Zeit diese Client Server Anwendung zu
255. er cgi sprachen liefert in diesem Fall nur den String ruby Um alle Sprachen auszulesen m ssen Sie dagegen ber cgi param sprachen zugreifen Dann erhalten Sie das vollst ndige Ergebnis ruby php java CGl Skripten mit Ruby 297 Dieselbe Auswahl k nnten Sie brigens auch als Men schreiben in dem der User mehrere Werte mit gedr ckter Strg Taste an und wieder abw hlen kann Der ent sprechende HTML Code s he so aus select name sprachen size 5 multiple multiple gt lt option value ruby gt Ruby lt option gt lt option value perl gt Perl lt option gt lt option value php gt PHP lt option gt lt option value c gt C lt option gt lt option value java gt Java lt option gt HTML Code erzeugen Es ist nicht sonderlich elegant in ein CGI Skript endlose Ketten von Ausgabekom mandos wie puts lt h1 gt Haupt uuml berschrift lt h1 gt einzuf gen Eine M glichkeit l ngere HTML Sequenzen auszugeben sind HIER Dokumente Zum Beispiel Logo anzeigen Tagline Hauptueberschrift puts lt lt ENDE_KOPF lt img src logo gif gt lt br gt lt i gt Wir bauen Ihre Site lt i gt lt h gt Willkommen bei der Sitebuilder GmbH amp Co KG lt h1 gt ENDE_KOPF Noch viel praktischer ist es meistens die HTML Erzeugungsmethoden der CGI Bibliothek einzusetzen Dazu ben tigt der Konstruktoraufruf f r die CGI Instanz die gew nschte HTML Version als Stringargument
256. er Datei einlesen oder sogar ersetzen Es w re vorstellbar auf diese Weise eine Art eigener Datenbank zu programmieren 1 In der Praxis sind echte Datenbanken immer vorzuziehen weil sie stabiler sind und einen gewissen Schutz vor Datenverlust bieten Andererseits ben tigt ein User in diesem Fall die entsprechende Daten bank Software so dass man f r kleinere Anwendungen berlegen k nnte diese Funktionalit t selbst ins Programm einzubauen 134 Kapitel 3 Ruby Klassen Die File Methode seek dient dazu den Dateizeiger auf ein bestimmtes Byte zu set zen Stellen Sie sich vor die Datei Obis9 txt enth lt nur eine Zeile mit den Ziffern von O bis 9 0123456789 Sie k nnen diese Datei entweder in einem Editor anlegen oder mit Hilfe folgender Ruby Anweisungen f File new obis9 txt w f print 0123456789 f close ffnen Sie diese Datei nun zum Lesen um seek auszuprobieren gt gt f File open obis9 txt r gt lt File obis9 txt gt Setzen Sie den Dateizeiger jetzt auf Byte Nummer 5 gt gt f seek 5 gt 0 Nun k nnen Sie die Zeile einlesen gt gt f gets gt 56789 Wie Sie sehen werden die Bytes wie blich von 0 an gez hlt Ein weiterer Versuch aus der Datei zu lesen liefert keinen Wert mehr da der Datei zeiger am Dateiende angekommen ist gt gt f gets gt nil Um danach wieder weiter vorn in der Datei zu lesen k nnen Sie erneut seek ver wenden Um den Dateizei
257. er Java mehr Kompromisse mit Nicht OOP Techniken eingehen Bei der OOP geht es kurz gesagt darum Datenstrukturen das hei t Einzelvariab len Arrays und so weiter zu einer Einheit mit den Funktionen zu verbinden die der Verarbeitung dieser Strukturen dienen Dieses Konzept hei t Kapselung Der Code wird dadurch bersichtlicher und leichter zu warten weil die Datenstruktu ren nicht mehr ber das ganze Programm verstreut manipuliert werden k nnen Am leichtesten l sst sich die objektorientierte Programmierung im direkten Ver gleich mit einem nicht objektorientierten Ansatz erl utern der in Ruby zwar nicht empfehlenswert aber doch m glich ist Die Aufgabenstellung Ein G terzug soll simuliert werden Die Lokomotiven 1 2 St ck k nnen je nach Antriebstechnik elektrisch Diesel Dampf eine bestimmte Anzahl von Waggons ziehen diese k n nen an oder abgeh ngt werden sofern die Loks mit der betreffenden Anzahl zurechtkommen In Beispiel 4 1 sehen Sie zun chst den klassischen Ansatz Alle Informationen ber den Zug werden in globalen Variablen gespeichert Die Werte dieser Variablen wer den von beliebigen ber das Skript verstreuten Methoden modifiziert Eine solches Programmierverfahren wird als imperativ bezeichnet Probieren Sie diese Variante zun chst aus die Erl uterungen folgen Beispiel 4 1 Die G terzug Anwendung ohne Objektorientierung zug_imp rb 1 Konstanten fuer die maximale Anzahl an Waggons 2 O
258. er Klassen deren Objekte etwa einen bestimmten Zeitpunkt repr sen tieren Verschiedene Methoden erm glichen dann den Zugriff auf die einzelnen Bestandteile von Datum und Uhrzeit In diesem Abschnitt werden verschiedene Aspekte der wichtigsten Datums und Uhrzeitklasse Time vorgestellt Die Klasse Time Die einfachste M glichkeit die aktuelle Systemzeit auszulesen besteht darin ein Objekt der Klasse Time ohne Argumente zu erzeugen Das geht mittels var Time new oder dem Synonym var Time now Das Objekt auf das wie blich ber die Referenzvariable zugegriffen wird speichert Datum und Uhrzeit im Augenblick seiner Erzeugung Beachten Sie dass es seiner 138 Kapitel 3 Ruby Klassen seits nicht wie eine Uhr weiterl uft wenn Sie eine aktualisierte Uhrzeit ben tigen m ssen Sie auch ein neues Objekt erzeugen Wenn Sie Datum und Uhrzeit nur kurz ausgeben m chten brauchen Sie das Objekt noch nicht einmal in einer Referenzvariablen zu speichern Die zu Beginn dieses Kapitels beschriebenen Ausgabemethoden sorgen automatisch daf r dass ein Time new Aufruf als String ausgegeben wird Versuchen Sie es in irb gt gt puts Time new Fri Oct 20 22 40 47 0200 2006 Das Format k nnen Sie sich so allerdings nicht aussuchen Es handelt sich um das RFC 1123 Format das beispielsweise auch f r viele Server Logdateien verwendet wird In Ruby 1 8 5 wurde es brigens leicht modifiziert Statt dem Namen der Zeit zone wird als vo
259. er Rest des Codes zur Ressourcenverarbeitung wird nun in einem else Block ausgef hrt weil Nicht Text Ressourcen nicht weiterverarbeitet werden k nnen Zeile 79 Zur weiteren Verarbeitung wird der Body der Anfrage also das gelie ferte Textdokument in einer Variablen gespeichert Zeile 81 108 Hier wird eine Reihe von Transformationen durchgef hrt um Links zu extrahieren den Text anhand bestimmter Begrenzer zu formatieren und die restlichen HTML Tags zu entfernen Die grundlegende Aufgabe jedes Arbeitsschritts wird in einem Kommentar zusammengefasst Alle diese Opera tionen basieren auf regul ren Ausdr cken und wenn Sie Kapitel 2 aufmerksam durchgearbeitet haben sollten Sie keine Schwierigkeiten haben sie zu verste hen gegebenenfalls k nnen Sie dort noch einmal nachschlagen A Die hier gezeigten Verarbeitungsschritte reichen f r den Hausge brauch aus den meisten Webseiten sollten Sie einigerma en ver o n nftig formatierten Text erhalten falls diese berhaupt Text enthalten und nicht ganz auf Flash oder Bildern basieren Es werden allerdings oft Stylesheet und JavaScript Code sowie einige unaufge l ste Entity Referenzen brig bleiben Ein professioneller Textbrowser verl sst sich deshalb zur Formatie rung des Inhalts nicht auf ein paar regul re Ausdr cke sondern ver wendet einen HTML Parser der das Dokument zun chst vollst ndig zerlegt Mit der aus dieser Vorverarbeitung erhaltenen Datenstruktur
260. er ein Sicherheitsrisiko da ein erfolgreicher externer Angriff auf den Server so einen root Pro zess unter seine Kontrolle bringen und erheblich mehr Schaden anrichten k nnte Professionelle Server wie der Webserver Apache siehe n chstes Kapitel umgehen dieses Problem indem sie zwar die Verbindung ber einen root Prozess herstellen die eigentliche Kom munikation mit den Clients aber nicht privilegierten Prozessen ber lassen Sockets Wenn Sie beim Programmieren auf Netzwerkverbindungen zugreifen m chten ver wenden Sie so genannte Sockets daf r Ein Socket ist einer der beiden Endpunkte der Netzwerkkommunikation Im Gegensatz zu Dateihandles oder Pipes sind Sockets bidirektional k nnen also sowohl zum Senden als auch zum Empfangen von Daten eingesetzt werden Als Grundlage der Socket Programmierung dient bei allen UNIX Derivaten die Ber keley Socket APP die urspr nglich f r BSD UNIX entwickelt wurde Windows ver wendet von Haus aus eine leicht unterschiedliche Bibliothek namens Windows Socket Library kurz Winsock Viele moderne Programmiersprachen auch Ruby maskieren die geringf gigen Unterschiede zwischen diesen Ans tzen und stellen f r alle unterst tzten Plattformen dieselbe Netzwerkunterst tzung zur Verf gung eine meist um n tzliche Features erweiterte Variante der Berkeley Sockets In Ruby ist der Zugang aufgrund der Objektorientierung besonders komfortabel Um Sockets zu verwenden m ssen Sie zun chs
261. erden Hier der gesamte abge wandelte Code Zahlen von 1 bis 49 in Array speichern lottozahlen 1 49 collect z z Die sechs regulaeren Zahlen sammeln ziehung 1 6 collect Zufaellig gewaehlte Zahl ausschneiden lottozahlen slice rand lottozahlen length Zusatzzahl ziehen zusatz lottozahlen slice rand lottozahlen length Gezogene Zahlen sortieren ziehung sort Ausgabe print ziehung join puts Zusatzzahl zusatz Beachten Sie dass der collect Block f r die Ziehung ohne Parametervariable aus kommt da die Z hlungswerte selbst nicht ben tigt werden Zudem wird die Zie 106 Kapitel2 Sprachgrundlagen hung selbst einfach als Ausdruck hingeschrieben da collect sie automatisch im Ergebnis Array sammelt Die Ausgabe k nnte zum Beispiel so aussehen gt ruby lotto2 rb 18 20 25 36 40 49 Zusatzzahl 2 Im Verlauf dieses Buchs werden Sie noch weitere Beispiele f r Iteratormethoden kennenlernen zum Beispiel f r das zeilen oder zeichenweise Auslesen von Dateien Zudem erfahren Sie im n chsten Kapitel wie Sie selbst welche schreiben k nnen Zusammenfassung Herzlichen Gl ckwunsch Sie haben bis hierhin durchgehalten und sind damit f r alle k nftigen Ruby Abenteuer bestens ger stet Sie haben mit anderen Worten alle wichtigen Werkzeuge und Materialien kennengelernt Im n chsten Kapitel erfahren Sie dann wie Sie daraus gr ere Anwendungen konstruieren k n
262. erden wenn eine Bedingung zutrifft loop do Anweisungen Abbruch break if Ausdruck end for Schleife ber Listenelemente for var in liste var nimmt nacheinander den Wert jedes Elements an end Regul re Ausdr cke Komplexe Muster zum Durchsuchen von Strings Darstellung als oder r Matching string regexp Liefert bei Treffer Anfangsposition von regexp in string ansonsten nil Umkehrung string regexp Liefert bei Treffer false ansonsten true string sub regexp ersatz Ersetzt den ersten Treffer in string durch ersatz string gsub regexp ersatz Ersetzt alle Treffer in string durch ersatz Regul re Ausdr cke 361 Konstrukte f r regul re Ausdr cke Konstrukt Einzelzeichen Zeichenfolge Zeichengruppe Zeichenfolge Zeichenkombination Zeichenausschluss Beliebiges Zeichen Quantifier optional Quantifier beliebig oft Quantifier mindestens einmal Quantifier genau n mal Quantifier m bis n mal Gruppierung Alternative Bereichsmarkierung Anfang Bereichsmarkierung Ende Wortgrenze Wortinneres Ziffer Keine Ziffer Wortbestandteil Nicht Wortbestandteil Whitespace Nicht Whitespace Modifier Case ignorieren Modifier Zeilen bergreifen Modifier Extended Mode Match Variablen Syntax Beispiel a hallo abc a z 0 9a fA F abc 0 9 a a z n 0 9a fA F m n Text abc xyz abc xyz ba n b B1 O B d oder 0 9 D oder
263. ere Syntax mit weniger kryptischen Sonderzeichen erkl rt Im brigen entwickelte er Ruby so konsequent objektorientiert wie es nach dem Klassiker Smalltalk aus den 1970er Jahren kaum eine Sprache mehr war C beispielsweise die wohl verbreitetste objektorientierte Sprache macht zugunsten der Abw rtskompatibilit t mit dem nicht objektorientierten C eine Menge Kompro misse und selbst das modernere Java weist diverse Inkonsequenzen auf Ob jektorientierung ist brigens kurz gesagt eine Technik die die programmiertechni sche Nachbildung von Gegenst nden und Prozessen aus der realen Welt extrem erleichtert In Kapitel 4 wird genau erl utert wie es funktioniert 1995 ver ffentlichte Matz die Sprache als Open Source Software Sie steht unter der GNU General Public License GPL die auch so wichtige Software wie das Betriebs system Linux oder den Datenbankserver MySQL sch tzt In Japan verbreitete Ruby sich rasch und ist seither recht beliebt und mindestens so verbreitet wie Python in den USA und Europa Die internationale Verbreitung von Ruby begann ganz allm hlich im Jahr 2000 als das erste englischsprachige Buch ber die Sprache erschien das wegen seines Covers Pickaxe Book Spitzhacken Buch genannte Programming Ruby von Dave Thomas Pragmatic Programmers Dieses Buch liegt inzwischen in zweiter Auflage vor in Anhang B finden Sie bibliografische Angaben sowie die Adresse der Buch Website Ruby wird bis heute stetig weiteren
264. ereits vorgestellten Methoden gibt es brigens auch f r die Erset zungsmethoden die Varianten sub und gsub die den Inhalt der behandelten String Variablen selbst modifizieren Das Ausprobieren berlasse ich Ihnen als zus tzliche bung Zuletzt sollte an dieser Stelle noch erw hnt werden dass die bereits vorgestellte String Methode split als Trennzeichen nicht nur eine einfache Zeichenfolge son dern auch einen regul ren Ausdruck akzeptiert Das folgende Beispiel wandelt einen beliebigen Text in ein Array aus W rtern um indem es beliebig lange Folgen von Nicht Wort Zeichen als Trennzeichen akzeptiert gt gt text lt lt ENDE Saetze die verschiedene Satzzeichen enthalten sogar Zeilenumbrueche sie sollen von diesem Ballast 100 Kapitel 2 Sprachgrundlagen befreit werden als Array ENDE gt gt text split h gt Saetze die verschiedene Satzzeichen enthalten sogar Zeilenumbrueche sie sollen von diesem Ballast befreit werden Array als Neben den hier gezeigten M glichkeiten der Regex Verwendung gibt es auch noch einen explizit objektorientierten Ansatz f r den Umgang y mit regul ren Ausdr cken Das wird passenderweise im n chsten Kapitel besprochen Iteratoren und Bl cke Neben den weiter oben behandelten Schleifen hat Ruby noch ein weiteres interes santes Konzept zu bieten Iteratoren Es handelt sich dabei um eine Konstruktion die
265. ergeben werden Sie werden in den Instanz variablen auch Attribute oder Eigenschaften genannt breite und hoehe gespei chert Der Typ der restlichen vier Methoden wird Getter genannt Die Namen solcher Methoden beginnen traditionell mit dem Wort get und sie geben den Wert einer Instanzvariablen oder einen daraus berechneten Ausdruck zur ck Konkret werden folgende Werte zur ckgeliefert beziehungsweise berechnet e get_breite Zeile 9 11 liefert die Breite breite zur ck e get_hoehe Zeile 12 14 gibt die H he hoehe zur ck e get_flaeche Zeile 15 17 berechnet den Fl cheninhalt das Produkt aus den beiden Instanzvariablen e get diagonale Zeile 18 20 zieht die Wurzel aus dem Satz des Pythagoras um die L nge der Diagonale zu ermitteln Anhand der Klasse Quadrat wird das Konzept der Vererbung demonstriert Die Ein leitungszeile 24 class Quadrat lt Rechteck besagt dass Quadrat s mtliche Eigenschaften und Methoden von Rechteck ber nimmt Durch die Vererbung brauchen Sie nur diejenigen Aspekte zu ndern Fach begriff berschreiben die die abgeleitete Klasse hier Quadrat von der Elternklasse Rechteck unterscheiden oder die hinzukommen Was ist Objektorientierung 113 Der einzige Unterschied zwischen Rechtecken und Quadraten besteht darin dass Breite und H he bei letzteren identisch sind Somit braucht lediglich der Konstruk tor berschrieben zu werden Derjenige der Klasse Quadrat erh lt nur einen Wert
266. erlinks werden extrahiert und mit einer Nummerierung verse hen Nach Abschluss einer Seite k nnen Sie entweder eine v llig neue URL ein geben oder Sie tippen eine der Nummern ein um einem Link zu folgen e Die Ausgabe erfolgt seitenweise und mit Wortumbruch Dazu wird zun chst die unabh ngig einsetzbare Klasse WrapPager entwickelt Das Programm hat mithin nicht einmal den Komfort richtiger Textbrowser wie Lynx http lynx browser org Diese haben n mlich den Vorteil dass sie nicht zei lenorientiert arbeiten sondern den Terminalbildschirm kontrollieren Auf diese Weise k nnen Sie zum Beispiel beliebig zur ck und vorbl ttern oder Links mit der Tastatur ansteuern Einen Vorteil hat die hier vorgestellte L sung aber doch Dieser kleine Browser ist wahrscheinlich schneller als alle die Sie jemals ausprobiert haben In Beispiel 5 3 sehen Sie zun chst den Quellcode von wrappager rb also die Klasse zur formatierten seitenweisen Ausgabe Web Clients mit Net HTTP 245 Beispiel 5 3 Eine Klasse f r Wortumbruch und seitenweise Ausgabe wrappager rb 1 N WO oN oun A Ww 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 class WrapPager def to_page text Die Hauptersetzung nach max 70 Zeichen an einer Wortgrenze umbrechen text gsub 1 70 s Z 1 n Die einzelnen Zeilen in einem Array ablegen textlines text split n Ak
267. ert sich im Hintergrund automatisch um die Session Verwaltung Durch zus tzliche Parameter und Unterklassen gibt es diverse M g lichkeiten die genaue Arbeitsweise von Sessions zu beeinflussen Sie y k nnen zum Beispiel w hlen ob die Daten in Textdateien Stan dard im Arbeitsspeicher besonders schnell aber nur f r wenig datenintensive Anwendungen geeignet oder in Datenbanken auch komplexe Datenstrukturen m glich abgelegt werden sollen Die Betrachtung solcher spezieller F higkeiten w rde an dieser Stelle allerdings zu weit f hren Lesen Sie beispielsweise die ri Dokumen tation zu CGI Session wenn Sie N heres wissen m chten Es folgt wie bei den Cookies ein Beispiel aus zwei Skripten Im ersten Skript werden die aus einem Formular gelesenen Schrifteinstellungen in der Session gespeichert Das zweite Skript liest den Wert aus und setzt ihn per CSS im Seiten text um Sie erfahren hier nebenbei wie Sie CSS Code direkt in Ihr CGI Skript ein betten k nnen ohne eine externe Datei zu verwenden 310 Kapitel 6 Klassische Webanwendungen Hier zun chst der Code des Formularskripts schriftwahl rb auch in diesem Skript sollte Ihnen inzwischen alles gel ufig sein C ruby bin ruby exe w require cgi require cgi session CGI und Session Objekt erzeugen cgi CGI new html4 session CGI Session new cgi Formulardaten auslesen oder Standardwerte if cgi has_key schrift schrift cg
268. erte oder eines HTML Farbstrings mit oder ohne Raute etwa FF0000 oder 99CCo0 Die Klassenmethode hex steht in Zeile 39 48 Sie rechnet die drei bergebenen Inte gerwerte f r Rot Gr n und Blau in einen HTML Farbstring um Speichern Sie die Klasse in einer eigenen Datei namens rgb_farbe rb und importie ren Sie sie wie folgt in irb gt gt require rgb_farbe rb Nun k nnen Sie die verschiedenen Aufrufvarianten des Konstruktors und die Metho den der Klasse RGBFarbe aufrufen Zum Beispiel gt gt f1 RGBFarbe new 50 100 200 gt lt RGBFarbe 0x2b17464 blau 100 gruen 200 rot 50 gt gt gt f1 get_html_farbe gt 32C864 gt gt f1 get_naechste_web_farbe gt 33CC66 gt gt f2 RGBFarbe new FF0000 gt lt RGBFarbe 0x2bobda8 blau 0 gruen 0 rot 255 gt gt gt f2 get_rgb_hash gt r0t gt 255 gruen gt 0 blau gt 0 gt gt f3 RGBFarbe new gruen gt 200 rot gt 100 gt lt RGBFarbe 0x28d1d94 blau 0 gruen 200 rot 100 gt gt gt f3 get_html_farbe gt 64C800 Klassen entwerfen und implementieren 183 Wie Sie sehen liefert Ihnen ein Konstruktoraufruf in irb jeweils interessante Infor mationen ber die neue Instanz hinter dem Klassennamen stehen die Objekt ID und die Anfangswerte der Instanzvariablen Das ist zum Ausprobieren neuer Klas sen sehr hilfreich Zum Schluss k nnen Sie auch die Klassenmethode ausprobieren etwa wie folgt g
269. es Programms oder Skripts Eine der bekanntesten Konsolen Umgebungsvariablen ist PATH sie legt die Verzeichnisse fest in denen bei Eingabe eines Kommandos nach ausf hrbaren Programmen gesucht wird Um ihren Inhalt zu lesen k nnen Sie auf der Windows Konsole Fol gendes eingeben 288 Kapitel 6 Klassische Webanwendungen gt echo PATH Auf UNIX Systemen lautet die Syntax dagegen echo PATH Ruby stellt die Umgebungsvariablen in einem Hash namens ENV zur Verf gung die Variablennamen sind die Schl ssel und ihre Werte die Inhalte Eine einfache Itera tion zur Ausgabe aller Umgebungsvariablen lautet also ENV each_pair var val puts var val Beachten Sie dass sich der CGI Ausf hrungskontext stark von der Konsole unter scheidet Deshalb gibt es dort auch v llig andere Umgebungsvariablen Hier das CGI Skript mit dem Sie sie lesen k nnen C Ruby bin ruby exe w puts lt lt ENDE_KOPF Content type text html lt html gt lt head gt lt title gt CGI Umgebungsvariablen lt title gt lt head gt lt body gt lt h1 gt CGI Umgebungsvariablen mit Ruby lt h1 gt Dieses Skript wurde mit Hilfe von Ruby erzeugt Hier eine Tabelle mit allen Umgebungsvariablen lt table border 2 cellpadding 8 gt lt tr gt lt th gt Umgebungsvariable lt th gt lt th gt Wert lt tr gt ENDE_KOPF ENV each_pair var val puts lt tr gt puts lt td valign top gt lt tt gt var lt tt
270. esen im Gegensatz zur Klassenmethode File exists pr fen ob unter einem bestimmten Namen berhaupt eine Datei existiert kennengelernt Eine zentrale Rolle beim Objektorientierten Entwurf spielen die standardisierten Diagramme der UML Unified Modeling Language F r die Entwicklung komple xer Systeme gibt es eine Reihe verschiedener Diagrammtypen die nicht nur den 164 Kapitel 4 Eigene Klassen und Objekte erstellen geplanten Programmcode sondern beispielsweise auch Gesch ftsabl ufe beteiligte Personen und Ger te modellieren Die wichtigste und hier ausschlie lich bespro chene Diagrammsorte sind die Klassendiagramme die die Bestandteile von Klassen und die Beziehungen zwischen ihnen illustrieren In Abbildung 4 1 sehen Sie ein vereinfachtes Klassendiagramm f r die Klasse Lok aus dem Einf hrungsbeispiel Ganz oben steht der Name der Klasse Lok unter dem ersten Trennstrich finden Sie die Datenstruktur die Liste der Instanzvariab len und nach einer weiteren Trennlinie folgen die Methoden Lok typ get_typ get_kapazitaet to_s Abbildung 4 1 Vereinfachtes UML Klassendiagramm der Klasse Lok Vereinfacht ist dieses Klassendiagramm weil es keine Angaben zum Datentyp der Instanzvariablen sowie zu Parametern und R ckgabetypen der Methoden macht Die verschiedenen Arten von Beziehungen zwischen Klassen werden durch Linien dargestellt gegebenenfalls mit Pfeilen f r eine besti
271. et das Arbeiten mit der Konsole auf Seite 10 einige Hinweise dazu Ruby installieren 7 Sollte es f r Ihre Distribution gar kein Ruby oder keine ausreichend neue Version geben k nnen Sie die Sprache immer noch leicht selbst kompilieren Beachten Sie dass Sie dazu die GNU Entwicklungswerkzeuge GCC und make ben tigen die bei einigen g ngigen Linux Distributionen zum Beispiel SUSE Linux nicht automa tisch installiert werden Installieren Sie sie also zun chst gegebenenfalls mit dem Paketmanager Ihrer Distribution nach Als N chstes k nnen Sie sich das aktuellste Quellcode Paket herunterladen Besu chen Sie dazu die Site http www ruby lang org und folgen Sie den Download Links Dort erhalten Sie ein Paket namens ruby 1 8 x tar gz zurzeit ruby 1 8 5 tar gz Laden Sie es herunter und berpr fen Sie auch hier wie weiter oben f r Windows erl utert die MD5 Pr fsumme Danach k nnen Sie das Paket entpacken tar xzvf ruby tar gz Bei einigen exotischeren Unix Varianten die kein GNU tar enthalten m ssen Sie daf r allerdings zwei Befehle eingeben gunzip ruby tar gz tar xvf ruby tar Danach k nnen Sie jedenfalls in das neu erstellte Unterverzeichnis ruby 1 8 x wech seln Zum Beispiel cd ruby 1 8 5 Dort muss zun chst das Shell Skript configure ausgef hrt werden das die Make files f r Ihre konkrete Systemplattform anpasst Anschlie end wird make f r die eigentliche Kompilierung und make i
272. et_prioritaet Im globalen Code wird die Methode dagegen zur Formatierung des aktuellen Datums aufgerufen d Time new printf Es ist jetzt s n n Termin datum d Als umfangreicheres Beispiel das auch eine Klassenmethode als Rechenhelfer ver wendet sehen Sie in Beispiel 4 3 einen klassenbasierten RGB Farbumrechner Die meisten wichtigen Programmschritte wurden bereits f r ein hnliches Beispiel in Kapitel 2 erl utert Beispiel 4 3 RGB Farbumwandlung als Klasse rgb_farbe rb 1 class RGBFarbe 2 Konstruktor 3 def initialize arg1 0 arg2 0 arg3 0 4 Absolute Standardwerte setzen spart Arbeit 5 rot 0 6 gruen 0 7 blau 0 8 if arg1 class Hash 9 Hash Komponenten auslesen 10 if argil rot 11 rot argil rot 12 end 13 if argil gruen 14 gruen arg1 gruen 15 end 16 if arg l blau 17 blau arg blau 18 end Klassen entwerfen und implementieren 181 Beispiel 4 3 RGB Farbumwandlung als Klasse rgb_farbe rb Fortsetzung 19 elsif argi class String 20 String Als HTML Farbstring behandeln und umrechnen 21 Zunaechst eventuelles Zeichen entfernen 22 arg sub 23 Auf sechs Zeichen verlaengern 24 while argi length lt 6 25 argl 0 26 end 27 RGB Komponenten berechnen 28 rot arg 0 2 to_i 16 29 gruen arg 2 2 to_i 16 30 blau arg1 4 2 to_i 16 31 else 32 Ganzzahlen erzwingen 33 rot arg1 to_i 34 blau arg2 to_i 3
273. etservbyname Methode 233 Getter Methoden 113 automatische 194 Gier Regexp 93 Gleichzeitigkeit siehe Nebenl ufigkeit Gleitkommazahlen 40 Globale Methoden 184 Globale Variablen 47 GNOME Terminal 10 GNU General Public License 2 GPL 2 greed Regexp 93 Gro und Kleinschreibung Dateinamen 12 Grundrechenarten 51 GServer Klasse 270 gsub Methode 98 G ltigkeitsbereich 47 H Hallo Welt 17 Hansson David Heinemeier 333 has_key Methode 297 HAS A Beziehung OOP 165 Hash Klasse Methode 50 each_key Iterator 103 each_pair Iterator 103 each_value Iterator 103 Referenz 365 Hashes 50 als Parameter 173 Schl ssel 50 Header HTTP 284 380 Index Hello World 17 hello rb Skript 19 Hexadezimalzahlen 40 hidden Methode CGI 309 Hidden Formularfelder 309 HIER Dokumente 43 Hilfe ri 148 Host HTTP Header 285 hosts Datei 281 hour Methode 139 HTML erzeugen CGI 298 Kurzeinf hrung 243 Sonderzeichen maskieren 303 HTTP siehe HyperText Transfer Protocol httpclient rb Skript 247 HTTP Header auslesen 242 HyperText Markup Language siehe HTML HyperText Transfer Protocol HTTP Anfrage 284 Antwort 285 Antwort als Objekt 242 Client Bibliothek 241 Cookies 304 GET Anfragen 284 Grundlagen 284 Header 284 Methoden 284 Parameter 290 POST Anfragen 284 Query String 291 309 Sessions 308 Statuscode 243 Statuscodes 285 Weiterleitungen 243 i Regexp Modifier 96 VO siehe Ein und Ausgabe ID Objekte 212 if
274. eund Threads 263 Beispiel 5 5 Die Forking Version des ECHO Servers echoforkserver rb Fortsetzung 18 Accept Schleife 19 loop do 20 next unless client server accept 21 Forking 22 f fork 23 Im Child Prozess Client Verbindung verarbeiten 24 if f nil 25 STDOUT puts CLIENT VERBINDUNG HERGESTELLT 26 loop do 27 Client Anfragen auslesen 28 anfrage client gets strip 29 und auf die Konsole protokollieren 30 STDOUT puts Anfrage anfrage 31 Bei QUIT Client Verbindung beenden 32 break if anfrage QUIT 33 Bei EXIT Server beenden und Schluss 34 if anfrage EXIT 35 Process kill SIGTERM Process ppid 36 exit 37 end 38 Modus Befehle behandeln 39 case anfrage 40 when MODE NORMAL 41 ode NORMAL 42 client print Modus auf Normal gesetzt r n 43 when MODE_REVERSE 44 ode REVERSE 45 client print Modus auf Reverse gesetzt r n 46 when MODE _ROT13 47 ode ROT13 48 client print Modus auf ROT13 gesetzt r n 49 else 50 Standardanfrage behandeln 51 case mode 52 when NORMAL 53 client printf s r n anfrage 54 when REVERSE 55 client printf s r n anfrage reverse 56 when ROT13 57 client printf s r n anfrage tr a m A M n z N Z n z N Z a m A M 58 end 59 end 60 end 61 Client Verbindung schliessen 62 client close 63 Child Prozess beenden 64 exit 65 else 66 Im Parent trap fuer Ende eines Childs 67 tra
275. f ROT13 gesetzt r n else Standardanfrage behandeln case mode when NORMAL client printf s r n anfrage when REVERSE client printf s r n anfrage reverse when ROT13 lient printf s r n anfrage tr a m A M n z N Z n z N Z a m A M O Duo u end end Client Verbindung schliessen client close end Lauschenden Socket schliessen server close Die einzelnen Teile des ECHO Server Codes haben folgende Aufgaben 7 Zeile 1 Import der Socket Bibliothek Zeile 3 5 Definition einiger Konstanten f r die verschiedenen ECHO Modi Zeile 7 Der Modus wird zun chst standardm ig auf NORMAL gesetzt Zeile 9 13 Wenn ein Kommandozeilenargument existiert wird die Server Portnummer auf den entsprechenden Wert gesetzt andernfalls wird der Stan dardport 7 gew hlt Zeile 15 Der lauschende Socket wird erzeugt Wenn Sie eine sichere Variante bevorzugen die nur Clients auf dem lokalen Rechner selbst zul sst k nnen Sie TCPServer new port durch TCPServer new localhost port ersetzen Zeile 19 50 Die komplette accept Schleife in der eine Client Anfrage nach der anderen verarbeitet wird Zeile 19 In der while Bedingung wird die Client Anfrage akzeptiert Dadurch steht innerhalb des Schleifenrumpfs eine TCPSocket Instanz namens client zur Verf gung die die Kommunikation mit dem Client erm glicht Achten Sie darauf dass Sie das Skript auf einem UNIX System in diesem Fall als root ausf hren m ssen
276. fert einen Editor mit SciTE Nach der Installation k nnen Sie ihn mittels Start gt Alle Programme gt Ruby Version gt SciTE starten Dieser Editor ist zwar nicht ganz so m chtig wie TextPad liefert aber beispielsweise ebenfalls Syntax Highlighting Auch SciTE wird weitgehend ber ein Men gesteuert Noch komfortabler ist FreeRIDE kein reiner Texteditor mehr sondern eine grafi sche Ruby Entwicklungsumgebung Sie wird ebenfalls ber das Ruby Untermen im Windows Startmen aufgerufen Auf Linux und anderen UNIX Systemen sind vor allem zwei Editoren weit verbrei tet vi beziehungsweise dessen komfortablere Weiterentwicklung vim Vi IMpro ved sowie Emacs Irgendeine Variante von vi ist auf so gut wie jedem UNIX Rechner installiert Geben Sie auf der Kommandozeile einfach vi Dateiname ein um die angegebene Datei zu bearbeiten oder neu zu erstellen Die Handha bung von vi m ist recht gew hnungsbed rftig weil es mehrere Arbeitsmodi gibt Im Befehlsmodus rufen einfache Tastendr cke spezielle Funktionen auf dr cken Sie beispielsweise die Taste X um das Zeichen unter dem Cursor zu l schen Sobald Sie im Befehlsmodus I dr cken wechseln Sie in den Eingabemodus Dort k nnen Sie ganz normal Text eingeben Mit Esc gelangen Sie zur ck in den Befehls modus Es gibt zahlreiche Befehle wenn Sie sie erlernen m chten k nnen Sie im Befehlsmodus help Enter eingeben und sich durch die Themen f hren lassen Geben
277. fforderung ausgegeben 1 bersetzung Wenn Sie eine Sprache f r die einfache objektorientierte Programmierung brauchen wenn Ihnen die H sslichkeit von Perl nicht zusagt oder wenn Sie das Konzept von LISP aber nicht die damit einhergehenden zahlreichen Klammern m gen k nnte Ruby die Sprache Ihrer Wahl sein 2 Geben Sie auf einem UNIX System man ruby ein um sie zu lesen 23 Praktische Einf hrung Dieses Kapitel kommt nicht umhin einige recht trockene theoretische Konzepte zu beschreiben die Kenntnis dieser Konzepte vervielfacht jedoch Ihren Programmier erfolg Um das Ganze m glichst praxisnah zu gestalten geht es in diesem Abschnitt mit zwei Beispielskripten los in denen die Sprachelemente noch nicht ausf hrlich erl utert aber in ihrem typischen Zusammenhang pr sentiert werden Ein Ruby Taschenrechner Das erste Beispiel ein kleiner Rechner stellt die wichtigsten Ruby Grundele mente vor Variablen als Datenspeicher Ein und Ausgabe Fallentscheidungen und Schleifen Nach der Eingabe zweier Zahlen und einer der vier Grundrechenarten wird die entsprechende Rechenoperation ausgef hrt Bei einer fehlerhaften Eingabe geht es von vorn los nach einer erfolgreichen Berechnung werden Sie gefragt ob Sie einen weiteren Durchgang w nschen Ab dem nachfolgenden Skript wurden alle l ngeren Listings in die sem Buch mit Zeilennummern versehen Diese dienen der Beschrei y bung des Codes aber Sie d rfen sie nicht mi
278. g Wortschatz und Grammatik und im Grunde ist es bei einer Programmiersprache auch nicht anders Zusammenfassung 21 In diesem Kapitel KAPITEL 2 l onmagad saa Sprachgrundlagen e Variablen Ausdr cke und Operationen e Kontrollstrukturen Mustervergleiche mit regul ren Ausdr cken e Iteratoren und Bl cke If you want a language for easy object oriented programming or you don t like the Perl ugliness or you do like the concept of LISP but don t like too much parentheses Ruby may be the language of your choice Aus der Einleitung der ruby Manpage Nachdem Sie im vorigen Kapitel Ruby installiert und Ihre ersten Schritte damit unternommen haben ist es nun an der Zeit systematisch an die Sprache heranzuge hen Nach einer kurzen Einf hrung mit zwei Vorab Praxisbeispielen wird das Basis vokabular der Sprache Ruby sehr gr ndlich aber m glichst praxisnah vorgestellt Nat rlich enth lt auch der lange Theorieteil jede Menge Ruby Code und zwar zum Teil in Form einzelner Codezeilen aber auch einige kurze Skripten Um die einzel nen Zeilen auszuprobieren ist die bereits erw hnte interaktive Ruby Shell irb besonders praktisch weil Sie auf jede Eingabe sofort Feedback erhalten Die im Text gezeigten Beispiele wurden mit folgender Startvariante von irb erstellt gt irb simple prompt Dadurch wird die bliche Nummerierung der Eingabezeilen deaktiviert und ledig lich gt gt als Eingabeau
279. g stellen Sie sich einen Moment lang vor es g be keine wie bei den ersten Computern in den 1940er bis 50er Jahren Sie m ss ten direkt auf die nummerierten Bl cke des Arbeitsspeichers zugreifen und sich merken wo Sie bereits etwas abgelegt haben und was noch frei ist au erdem m ss ten Sie selbst die Speicherbereiche f r Programme und Daten auseinanderhalten Variablen erleichtern Ihnen das Leben ungemein Sie brauchen sich nur noch den selbst gew hlten Namen eines Speicherplatzes zu merken und der Computer k m mert sich hinter den Kulissen darum einen freien Platz f r die enthaltenen Informa tionen zu finden Auch die Speicherbereiche der verschiedenen Programme und ihrer Daten h lt er in aller Regel sauber auseinander M glicherweise kennen Sie den Begriff der Variablen aus der Mathematik Sowohl in einer mathematischen Formel als auch in einem Computerprogramm ist die Vari able ein Platzhalter der einen mehr oder weniger beliebigen Wert repr sentieren kann Sobald Sie ein Programm allerdings ausf hren dies ist die so genannte Laufzeit muss die Variable jederzeit einen eindeutigen Wert besitzen damit alles funktioniert In Ruby erzeugen Sie eine Variable ganz einfach indem Sie ihr einen Anfangswert zuweisen Hier sehen Sie ein Beispiel a 1 Variablen Ausdr cke und Operationen 45 Dies ruft eine Variable namens a ins Leben und weist ihr den Wert 1 zu Wenn Sie danach in einem Ausdruck Ihres Skripts a benut
280. geben Sie eine Band Ihrer Wahl sowie deren Herkunfts land ein und klicken Sie auf Create siehe Abbildung 7 4 Wiederholen Sie das ein paarmal bis Sie eine Liste wie in Abbildung 7 5 erhalten Bands new Mozilla Firefox FER Datei Bearbeiten Ansicht Chronik Lesezeichen Extras Hilfe e O Htto Mocalhost 300JBandsinew gt Glz ruby on rais generate scar E Erste Schritte B Aktuelle Nachrichten hands on pdf application pdf Objekt O Bands new New band Name The Beatles Country United Kingdom Create Back Suchen sca Abw rts Aufw rts Hervorheben Gro Kleinschreibung Fertig Abbildung 7 4 Eingabe einer neuen Band in die vollautomatisch erzeugte Eingabemaske Realistische Anwendung Eine Online Rock n Roll Datenbank 347 Bands list Mozilla Firefox FJER Datei Bearbeiten Ansicht Chronik Lesezeichen Extras Hilfe e gt ih C _http jjlocalhost 3000 bandsjist gt Gl ruby on rails generate scaf Erste Schritte E Aktuelle Nachrichten hands on pdf application pdf Objekt I I Bands list Band was successfully created Listing bands Name Country Metallica USA Show Edit Destroy Iron Maiden United Kingdom Show Edit Destroy Die rzte Germany Show Edit Destroy Led Zeppelin United Kingdom Show Edit Destroy Die Toten Hosen German
281. gef hrt wer den soll die mit der Klasse in lockerem Zusammenhang steht Um etwa zu ber pr fen ob eine Datei existiert ist es nicht n tig sie zu ffnen Instanzen der Klasse File sind aber grunds tzlich ge ffnete Dateien so dass f r die berpr fung nur eine Klassenmethode in Frage kommt Dasselbe gilt etwa f r File rename AlterName NeuerName Ge ffnete Dateien k nnen n mlich nicht umbenannt werden Eine Klassenmethode wird implementiert indem Sie bei ihrer Definition den durch Punkt getrennten Klassennamen vor den Methodennamen setzen Das folgende Beispiel kapselt einen Termin f r einen elektronischen Terminkalender Die Klas senmethode Termin datum formatiert ein bergebenes Time Objekt mittels strftime in deutscher Schreibweise Hier der Code mitsamt Anwendungsbeispielen class Termin Prioritaetskonstanten NIEDRIG 1 NORMAL o DRINGEND 1 def initialize datum eintrag prioritaet NORMAL datum Time parse datum eintrag eintrag prioritaet prioritaet end 3 Und wenn die Datei nicht existiert ist es nicht einmal m glich sie zu ffnen sondern f hrt zu einer Feh lermeldung die die Benutzer Ihres Programms irritiert oder nervt Klassen entwerfen und implementieren 179 Klassenmethode deutsches Datumsformat def Termin datum dat dat strftime d m Y H M end Prioritaet als String zurueckgeben def get_prioritaet case prioritaet when NIEDRIG Niedrig when NORMAL
282. gehoert zu Oesterreich Als etwas praktischeres for Schleifen Beispiel sehen Sie hier den weiter oben angek ndigten Codierer der bitweises Exklusiv Oder verwendet um jeweils die selben Bits der Zeichencodes zu maskieren Nach dem Start wird der Benutzer auf gefordert den Text einzugeben und danach eine Zahl zwischen 1 und 255 als Schl ssel Die for Schleife geht vom ersten Zeichen 0 bis zum letzten die um 1 verminderte L nge da den Endwert ausschlie t Die Anwendung eines Index in eckigen Klammern auf einen String liefert wie bereits erw hnt den Zeichen code Dieser wird jeweils mittels Exklusiv Oder mit dem Schl ssel maskiert Der neue Wert wird per chr wieder in ein Zeichen umgewandelt und schlie lich ausge geben Geben Sie zun chst den Code ein print Text Text einlesen Zeilenumbruch abschneiden text gets chomp print Schluessel 1 255 key gets to_i Fehlermeldung amp Ende bei unzulaessigem Schluessel if key lt 1 or key gt 255 puts Ungueltiger Schluessel exit end Verschluesselter Text ist zunaechst leer encrypt Schleife ueber alle Zeichen des Textes for i in 0 text length Durch Exklusiv Oder maskierten Zeichencode wieder in Zeichen umwandeln 84 Kapitel 2 Sprachgrundlagen und an verschluesselten Text anfuegen encrypt text i key chr end print Verschluesselter Text encrypt Speichern Sie das kurze Skript als crypt rb und starten Sie es
283. genst nde Giambattista Vico Nachdem Sie im vorigen Kapitel mit diversen eingebauten Klassen gearbeitet haben werden Sie nun erfahren wie leicht es ist Ihre eigenen Klassen zu schreiben Dies ist beraus n tzlich um bersichtlichere und weniger fehlertr chtige Pro gramme zu schreiben Zudem sind Klassen leichter f r neue Projekte wiederver wendbar als andere Arten von Codebl cken Objektorientierte Programmierung Eine praktische Einf hrung Da Sie gerade dieses Buch lesen in dem eine der wichtigsten objektorientierten Pro grammiersprachen beschrieben wird ist davon auszugehen dass Sie den Begriff schon einmal geh rt haben Wahrscheinlich haben Sie auch eine ungef hre Vorstel lung davon was er bedeutet Hier erfahren Sie Genaueres Der Ansatz der objektorientierten Programmierung auch OOP abgek rzt wurde bereits in den fr hen 1970er Jahren entwickelt und zwar als Reaktion auf die so genannte Softwarekrise der sp ten 60er Zum ersten Mal wurde Softwareentwick lung damals teurer als Hardwarebeschaffung und das obwohl die damaligen Rechner nicht viel weniger kosteten als ein Haus Wie viele Errungenschaften der modernen IT wurde auch die OOP vor allem im Forschungszentrum Xerox PARC Palo Alto Research Center ersonnen Das Ergebnis der dortigen Arbeiten war Smalltalk die erste konsequent objektorientierte Sprache Interessanterweise hat sie viele hnlichkeiten mit Ruby w hrend andere Sprachen wie C od
284. ger wieder ganz an den Anfang zu setzen k nnen Sie statt f seek 0 auch folgende Methode aufrufen gt gt f rewind gt 0 Lesen Sie nochmals eine Zeile um zu testen ob es geklappt hat gt gt f gets gt 0123456789 Die Methode seek besitzt einen optionalen zweiten Parameter der angibt wie der erste interpretiert werden soll Als m gliche Werte stehen drei Konstanten der Klasse I0 zur Verf gung e file seek n IO SEEK_SET ist das Standardverhalten Der Dateizeiger wird zur absoluten Byteposition n bewegt e file seek n I0 SEEK_CUR bewegt den Dateizeiger um n Bytes von der aktuel len Position an Sie k nnen auch negative Werte angeben um ihn weiter in Richtung Dateianfang zu verschieben Ein undAusgabe 135 e file seek n IO SEEK_END interpretiert n relativ zum Dateiende Dabei muss n nat rlich einen negativen Wert erhalten Um eine Datei zum gemischten Lesen und Schreiben zu ffnen wird der spezielle Modus r verwendet ffnen Sie die Datei Obis9 txt auf diese Weise um es aus zuprobieren gt gt f File open obis9 txt gt lt File 0bis9 txt gt r Analog zu einem bekannten Kinderspiel sollen nun alle Vielfachen von 3 in der Liste durch ein Zeichen ersetzt werden Das ist mit seek und putc sehr einfach denn eine Schreiboperation in einer zum Lesen und Schreiben ge ffneten Datei ersetzt die Zeichen an der entsprechenden Position Verwenden Sie am einfachsten folgende Iterati
285. gew nschten Elternklasse hinter den Klassennamen schreiben Dabei k nnen Sie Ihre Klassen sowohl von Ruby Standardklassen als auch von Ihren eigenen Klassen ableiten 198 Kapitel 4 Eigene Klassen und Objekte erstellen Das folgende einfache Beispiel definiert eine Elternklasse namens Parent und leitet eine Klasse namens Child davon ab class Parent Attribut veroeffentlichen attr_accessor wert Konstruktor def initialize wert 0 wert wert end end Class Child lt Parent Zusaetzliches Attribut attr_accessor wert2 Konstruktor def initialize wert 0 wert2 0 Konstruktor der Elternklasse aufrufen super wert wert2 wert2 end end Inhaltlich sind diese beiden Klassen recht sinnlos Parent kapselt einen beliebigen Wert Child f gt einen zweiten hinzu Im Konstruktor von Child wird der Konstruk tor von Parent mit Hilfe des Schl sselworts super aufgerufen Zum Ausprobieren der Vererbung ist das Beispiel jedoch gut geeignet Speichern Sie beide Klassen als inheritl rb importieren Sie sie in irb und spielen Sie ein bisschen damit gt gt require inherit1 rb gt true gt gt p Parent new 7 gt lt Parent 0x2b19f20 wert 7 gt gt gt p wert 12 gt 12 gt gt c Child new 8 7 gt lt Child 0x2b1667c wert 8 wert2 7 gt gt gt c wert 5 gt 5 gt gt c wert2 9 gt 9 Wie Sie sehen hat die Child Instanz c sowohl Zugriff auf den in ihrer eigenen
286. gibt alle Elemente des Arrays untereinander aus 102 Kapitel 2 Sprachgrundlagen programmiersprachen w Ruby Perl Smalltalk Java programmiersprachen each sprache puts sprache Wenn Sie den Iterator each auf einen Hash anwenden werden die Schl ssel und ihre Werte gleichberechtigt nacheinander ausgewertet wie die Elemente eines Arrays geschlecht f gt weiblich m gt maennlich geschlecht each g puts g ergibt m maennlich f weiblich Da dies meist nicht das gew nschte Ergebnis ist gibt es speziell f r Hashes den Ite rator each_key der nur die Schl ssel nacheinander durchgeht Damit l sst sich der Hash Inhalt sinngem verarbeiten geschlecht each_key k puts k geschlecht k liefert die korrektere Ausgabe m maennlich f weiblich Falls Sie jedoch auf die Schl ssel verzichten k nnen und nur die Werte des Hashs ben tigen k nnen Sie alternativ den Iterator each_value verwenden geschlecht each_value v puts v Die Ausgabe lautet hier einfach maennlich weiblich Schlie lich gibt es auch noch den Hash Iterator each_pair der das jeweilige Schl s sel Wert Paar bereitstellt Sie k nnen innerhalb des Blocks zwei Variablen verwen den um diese Daten aufzunehmen sprachen de gt Deutsch en gt Englisch fr gt Franzoesisch Iteratoren und Bl cke 103 sprachen each pair kurz lang puts kurz steht fuer lang
287. gibt die Klasse zur ck der ein beliebiges Objekt ein Literal ein Ausdruck oder eine Variable angeh rt Entsprechende Beispiele haben Sie schon in Kapitel 2 gesehen Interessant ist das Modul ObjectSpace dessen Methoden Auskunft ber s mtliche Objekte des aktuellen Ausf hrungskontextes das hei t der Ruby Umgebung plus Ihrem Programm geben Ein Beispiel ist der Iterator each_object der nacheinander jedes einzelne Objekt bereitstellt Er nimmt optional einen Klassennamen als Argu ment entgegen und iteriert dann nur ber die Instanzen der angegebenen Klasse sowie der von ihr abgeleiteten Klassen Nach der Ausf hrung wird die Anzahl der passenden Objekte als Ergebnis zur ckgeliefert Das folgende Beispiel liefert eine formatierte Liste aller Objekte vom Typ Numeric ihrer konkreten Klassen n class sowie ihrer eindeutigen Objekt IDs n object_id und gibt anschlie end deren Gesamtzahl aus puts Objekt Klasse Objekt ID puts 7 arr 0 2 2 2 3 2 4 2 5 2 num ObjectSpace each object Numeric n printf 20g 165 d n n n class n object_id puts puts Es gibt num numerische Objekte Hier die Ausgabe des Beispiels Objekt Klasse Objekt ID n 22 2 2 2 42 1 2 71828 Float 21237020 3 14159 Float 21237030 2 22045e 016 Float 21257670 1 79769e 308 Float 21257680 2 22507e 308 Float 2125
288. grenzen hinweg Damit sieht das Beispiel wie folgt aus gt gt r Regexp new a z Regexp IGNORECASE gt a z i 146 Kapitel 3 Ruby Klassen Sequenzen ber cksichtigen m ssen ein Backslash muss bei u spielsweise durch zwei ersetzt werden Hier als Beispiel ein regu l rer Ausdruck f r die Suche nach beliebig viel Whitespace einmal in Regexp und einmal in String Schreibweise W Denken Sie bei der String Schreibweise daran dass Sie Escape r1 Regexp new s r2 Regexp new s Um einen String mit einem auf diese Weise konstruierten regul ren Ausdruck zu vergleichen k nnen Sie entweder den bereits bekannten Operator oder aber die Methode match des Regexp Objekts verwenden Zum Testen wird der folgende regu l re Ausdruck zur Suche nach einer deutschen Postleitzahl konstruiert plz Regexp new d 5 Hier eine Beispieladresse die untersucht werden soll adr O Reilly Verlag GmbH amp Co KG Balthasarstr 81 50670 Koeln Die bereits bekannte Schreibweise f r den Mustervergleich lautet gt gt adr plz 49 Der Wert 49 ist die Position im String an der die Postleitzahl beginnt brigens ist die umgekehrte Schreibrichtung plz adr absolut gleichwertig und liefert daher dasselbe Ergebnis Auch bei match kann die Reihenfolge vertauscht werden da sowohl regul re Aus dr cke als auch Strings diese Methode besitzen gt gt plz match adr gt lt MatchData
289. gt Was bleibt zu tun Der Grundstein einer ersten Rails Webanwendung ist gelegt und Sie haben einige der wichtigsten Komponenten des Frameworks gesehen In der Praxis m ssten nun folgende Schritte folgen 1 Sie brauchen Controller Actions zum Hinzuf gen ndern und L schen von Alben Mit Scaffolding ist es nicht getan weil es die Relationen nicht automa tisch ber cksichtigen kann Wenn Sie aber Ihre Active Record Kenntnisse aus diesem Kapitel und den Scaffold Code in app controllers bands_controller rb kombinieren m ssten Sie leicht ans Ziel gelangen 2 Nach der Entwicklungsphase die bereits bei mittleren Projekten immer auch Unit Tests umfassen sollte erfolgt der Wechsel in die Produktionsumgebung Dazu m ssen Sie die Datenbank Anwendung_production um dieselben Tabel lenstrukturen erg nzen wie die Entwicklungsdatenbank Anschlie end m s sen Sie Rails ber die Umgebungsvariable RAILS_ENV mitteilen dass die Produktionsumgebung verwendet werden soll Das geht auf der Konsole wie folgt gt set RAILS_ENV production Windows export RAILS_ENV production Linux In der Regel sollten Sie diese Variablendefinition allerdings in die Konfiguration Ihres Produktions Webservers einbauen Apache stellt daf r beispielsweise die Direktive SetEnv zur Verf gung SetEnv RAILS_ENV production 3 Zum Schluss erfolgt das Deployment also die Ver ffentlichung auf einem pro duktionstauglichen Webserver WEBrick ist langsam nicht
290. gt Options ExecCGI SetHandler cgi script lt Files gt Ein lt Files gt Container wird auf alle Dateien im aktuellen Kontext angewendet die dem angegebenen Dateimuster entsprechen Options ExecCGI f gt die CGI Ausf h rung zu den bestehenden Optionen hinzu Die AddHandler Direktive sorgt schlie lich daf r dass die betreffenden Dateien als CGI Skripten betrachtet werden Wenn Sie diese oder irgendeine andere Konfigurations nderung durchf hren m chten m ssen Sie daran denken Apache anschlie _ Bend neu zu starten Die ersten CGI Beispiele Ein Ruby CGI Skript ist im Prinzip ein gew hnliches Ruby Skript dessen Ausgabe als Webseite an den Browser eines Users ausgeliefert wird Dazu m ssen solche Skripten allerdings zwei Bedingungen erf llen e Sie m ssen dem Rechner mitteilen dass es sich um ein Ruby Skript handelt Daf r wird die in Kapitel 2 erw hnte Shebang Zeile als erste Zeile des Skripts verwendet Unter Windows sieht sie beispielsweise so aus C ruby bin ruby exe w Die entsprechende UNIX Variante lautet usr bin ruby w Den Pfad m ssen Sie jeweils an Ihr eigenes System anpassen e Damit der Browser wei um welche Art von Daten es sich bei der Ausgabe Ihres CGI Skripts handelt m ssen Sie ihm zuerst einen Content Type Header senden In den meisten F llen erzeugen CGIs HTML Code so dass die betref fende Zeile so lautet puts Content type text html puts Die Leerzeile nach dem Header sign
291. gt gt Hallo Welt o gt 72 Allerdings bekommen Sie nicht das erwartete Zeichen H zur ck sondern eine Zahl Es handelt sich dabei um den numerischen Zeichencode Diesen k nnen Sie mit Hilfe der Methode chr wieder in das entsprechende Zeichen umwandeln gt gt 72 chr gt H gt gt Hallo Welt 1 chr gt a Wenn Sie zwei durch Komma getrennte Ganzzahlen in die eckigen Klammern set zen erhalten Sie dagegen einen Teilstring wobei die erste Zahl den Startpunkt und die zweite die maximale L nge angibt Beispiele gt gt Hallo Welt 1 2 gt al gt gt Hallo Welt 6 1 gt W gt gt Hallo Welt 9 3 y t Wie bei einem Hash k nnen Sie sogar einen String als Index verwenden R ckgabe wert ist der entsprechende Teilstring selbst falls er im durchsuchten String vor kommt ansonsten nil gt gt Koeln oel gt gel gt gt Duesseldorf Dom gt nil Am praktischsten ist dass Sie diese Indizes auf String Variablen anwenden k nnen um die Werte der gefundenen Teile zu ndern gt gt satz PHP ist die beste Sprache der Welt gt gt satz PHP Ruby gt Ruby gt gt satz gt Ruby ist die beste Sprache der Welt gt gt halbsatz Dieser Satz kein Verb gt gt halbsatz 11 2 hat gt gt halbsatz gt Dieser Satz hat ein Verb Variablen Ausdr cke und Operationen 67 Um den numerischen Code eines einzelnen literalen Zeiche
292. gt gt hello lt hello gt false gt gt a lt A gt false gt gr er als Diese Operation liefert true wenn der linke Operand einen h heren Wert besitzt als der rechte sonst false gt gt 2 gt 3 gt false gt gt 2 gt 2 Variablen Ausdr cke und Operationen 53 e lt gt gt gt gt gt gt gt gt gt gt gt gt gt gt gt gt gt gt false 3 gt 2 true helloworld gt hello true hello gt hello false hello gt go true a gt A true kleiner oder gleich Das Gegenteil von gt Das Ergebnis ist true wenn der linke Operand maximal so gro wie der rechte ist aber eben nicht gr er 2 lt 3 true 2 lt 2 true 3 lt 2 false helloworld lt hello false hello lt hello true go lt hello true e gt gr er oder gleich Entsprechend das Gegenteil von lt so dass die Opera tion true ergibt wenn der linke Operand mindestens so gro ist wie der rechte aber nicht kleiner gt gt gt gt gt gt gt gt gt gt gt gt gt gt gt gt gt gt 2 gt 3 false 2 gt 2 true 393 2 true helloworld gt hello true hello gt hello true hello gt go true Ein speziellerer Vergleichsoperator ist Bereich wie 0 10 oder a z und auf der rechten Seite einen einzelnen Wert Der R ckgabewert ist true wenn der Einzelwert i
293. gt gt require dtime rb gt true gt gt DTime new wtag gt Montag gt gt DTime new monat gt November gt gt DTime new datum 200 Kapitel 4 Eigene Klassen und Objekte erstellen gt Montag 13 November 2006 13 53 21 gt gt DTime new kurzdatum gt 13 11 2006 13 53 26 Beachten Sie dass Sie alternativ auch immer die vorhandene Klasse selbst erweitern k nnen indem Sie einen class Block mit den gew nschten nderungen oder Erg nzungen f r sie schreiben Das wurde weiter oben beispielsweise f r die Klasse Array gezeigt die um die n tzlichen Methoden sum und average erweitert wurde Zugriffsschutz In Ruby sind alle Methoden standardm ig ffentlich Das bedeutet dass sie f r jede Instanz einer Klasse von au en zug nglich sind Das l sst sich bei Bedarf ndern wenn das Design einer Klassenhierarchie verlangt dass bestimmte Metho den die ffentlichkeit nichts angehen Zu diesem Zweck definiert Ruby drei Geheimhaltungs oder Sichtbarkeitsstufen e public ist der Standardfall Fine Methode mit dieser Sichtbarkeit steht inner halb der Klassendefinition und berall dort zur Verf gung wo eine Instanz der Klasse verwendet werden kann e private ist das andere Extrem Methoden mit dieser Geheimhaltungsstufe sind ausschlie lich innerhalb der Klassendefinition selbst verf gbar e protected erm glicht den Zugriff f r andere Instanzen derselben Klasse sowie f r abgeleitete Klassen u
294. gt lt td gt print lt td valign top gt print val amp nbsp val puts lt td gt puts lt tr gt puts lt lt ENDE_FUSS lt table gt lt body gt lt html gt ENDE_FUSS CGl Skripten mit Ruby 289 Wie Sie sehen bieten sich HIER Dokumente f r die Ausgabe l ngerer HTML Pas sagen an Der eigentliche Funktionskern des Skripts steht innerhalb des Iterators Name und Wert jeder Variablen werden in Tabellenzellen geschrieben Die Zeile print val amp nbsp val sorgt zus tzlich daf r dass leere Werte durch ein gesch tztes Leerzeichen amp nbsp ersetzt werden Eine ganz leere Tabellenzelle w rde n mlich ohne R nder ange zeigt was recht h sslich aussehen w rde In Abbildung 6 2 sehen Sie den Beginn der Ausgabe dieses Skripts im Browser Mozilla Firefox gt CGI Umgebungsvariablen Mozilla Firefox Datei Bearbeiten Ansicht Gehe Lesezeichen Extras Hilfe A d I ME koiocahosten Erste Schritte EN Aktuelle Nachrichten CGI Umgebungsvariablen mit Ruby Dieses Skript wurde mit Hilfe von Ruby erzeugt Hier eine Tabelle mit allen Umgebungsvaniablen Umgebungsvariable HTTP_HOST localhost HTTP_USER_AGENT Mozilla 5 0 Windows U Windows NT 5 1 de rw 1 8 0 8 Geck0 20061025 Firefox 1 5 0 8 HTTP_ACCEPT text aml application aml application xhtml zml text html g 0 9 text plain gq 0 8 imagelpng q 0 5 HTTP_ACCEPT_LANGUAG
295. gth F hren Sie das Skript mehrfach mit einer unterschiedlichen Anzahl von Argumen ten aus gt ruby argnum rb Sie haben 0 Argumente eingegeben gt ruby argnum rb eins zwei drei Sie haben 3 Argumente eingegeben Wenn Sie nur wenige Argumente ben tigen k nnen Sie ARGV 0 ARGV 1 und so weiter auch direkt testen nicht vorhandene Parameter haben den Wert nil Hier ein entsprechendes Beispiel mit nur einem Argument if ARGV o nil puts ARGV O else puts Kein Argument end Das Array ARGV l sst sich zudem sehr praktisch mit Hilfe des Iterators each bearbei ten Das folgende Beispielskript gibt die Argumente nummeriert aus 1 1 ARGV each arg printf 2d s n i arg i 1 Speichern Sie es als args rb und f hren Sie es mit einigen Parametern aus gt ruby args rb Ruby rocks da House 1 Ruby 122 Kapitel3 Ruby Klassen 2 rocks 3 da House Wie Sie sehen k nnen Sie auch einzelne Argumente mit enthaltenen Leerzeichen eingeben indem Sie sie in Anf hrungszeichen setzen In Beispiel 3 2 sehen Sie ein l ngeres Skript das einen Taschenrechner hnlich dem Einf hrungsbeispiel aus dem vorigen Kapitel realisiert Allerdings werden die bei den Zahlen und der Operator diesmal als Kommandozeilenparameter erwartet Geben Sie das Programm zun chst ein die Erl uterungen folgen sp ter Beispiel 3 2 Taschenrechner mit Kommandozeilenargumenten argrechner rb 1 String Variable mit Anleitung 2
296. halt angezeigt Die daf r verwendete statische CGI Methode escapeHTML sorgt daf r dass HTML relevante Sonderzeichen maskiert werden Schauen Sie sich den Code den Sie komplett verstehen m ssten an und probieren Sie das Beispiel upload rb aus CGl Skripten mit Ruby 303 C ruby bin ruby exe w require cgi cgi CGI new htm14 cgi out cgi html cgi head cgi title Uploader cgi body cgi h 1 Datei Uploads Datei und Kommentar vorhanden if cgi has_key kommentar amp amp cgi has_key datei Kommentar als Ueberschrift ausgeben cgi h2 cgi kommentar read if cgil datei content_type r text Datei ausgeben falls Textdatei CGI escapeHTML cgi datei read else Ansonsten Fehlermeldung FEHLER Unzulaessiger Dateityp end else end Multipart Formular cgi multipart_form cgi p Kommentar cgi text_field kommentar cgi p Textdatei Datei Upload Feld cgi file_field name gt datei accept gt text plain cgi p cgi reset Zuruecksetzen cgi submit Hochladen Cookies Ein gro es Problem f r umfangreichere Webanwendungen besteht darin dass HTTP ein zustandsloses Protokoll englisch stateless ist Nach Browser Anfrage und Webserver Antwort ist die Kommunikation abgeschlossen und die n chste 304 Kapitel 6 Klassische Webanwendungen Anfrage wei nichts mehr von der vorherigen Webanwendungen mi
297. haltenen Anweisungen aus wenn Ausgabebefehle enthalten sind wird ihr Inhalt direkt an die entsprechende Stelle der Webseite geschrieben Das zweite Konstrukt gibt dagegen direkt an Ort und Stelle den Wert des betreffen den Ausdrucks aus eRuby funktioniert mithin so hnlich wie PHP ASP oder JSP Hier ein kleines Beispiel das das Datum und die Uhrzeit sowie eine Schleife aus gibt lt html gt lt head gt lt title gt eRuby Beispiel lt title gt lt head gt lt body gt lt h1 gt Hallo lt h1 gt lt p gt Es ist lt Time new gt lt p gt lt p gt Hier eine Reihe von Zweierpotenzen die amp quot Ecksteine des Hackeruniversums amp quot Neal Stephenson lt i gt Snow Crash lt i gt lt p gt lt 0 upto 16 Jil puts 2 lt sup gt i lt sup gt H 2 i gt lt body gt lt html gt Diese Art von Konstrukten wird Ihnen sehr bald wiederbegegnen weil ein Bestand teil von Ruby on Rails die Template Dateien genauso aussieht Zusammenfassung Selbst wenn Sie letztlich Ruby on Rails f r Ihre Webanwendungen w hlen hat Ihnen dieses Kapitel trotzdem gro en Nutzen gebracht Sie haben die hinter den Kulissen fast immer gleiche Anatomie jeder Webanwendung gesehen Wer ein hoch integriertes Framework verwendet vergisst n mlich beinahe dass es immer noch Webserver und Browser sind zu deren eigentlichen Kommunikationsf higkeiten HTTP kein Framework etwas hinzuf gt So werden Sie
298. hen OHNE 16 keine 17 when DAMPF 18 Dampflok 19 when STROM 20 Elektrolok 21 when DIESEL 22 Diesellok 23 end 24 end 25 Waggonkapazitaet 26 def get_kapazitaet 27 typ 28 end 29 Stringdarstellung 30 def to_s 158 Kapitel 4 Eigene Klassen und Objekte erstellen Beispiel 4 2 Der objektorientierte G terzug zug_oo rb Fortsetzung 31 get_typ Kapazitaet typ Waggons 32 end 33 end 34 class Gueterzug 35 Grundzustand 36 def initialize lok0 Lok OHNE lok1 Lok OHNE waggons 0 37 loks Array new 38 loks 0 Lok new 1loko 39 loks 1 Lok new lok1 40 waggons waggons 41 end 42 Eine bestimmte Anzahl Waggons anhaengen 43 def anhaengen waggons 44 if waggons waggons lt loks O get_kapazitaet loks 1 get_kapazitaet 45 waggons waggons 46 Erfolg melden 47 true 48 else 49 Misserfolg melden 50 false 51 end 52 end 53 Eine bestimmte Anzahl Waggons abhaengen 54 def abhaengen waggons 55 if waggons waggons gt 0 56 waggons waggons 57 Erfolg melden 58 true 59 else 60 Misserfolg melden 61 false 62 end 63 end 64 Eine der Loks ersetzen 65 def lok aendern loknr loktyp 66 loks loknr Lok new loktyp 67 end 68 Differenz Waggonkapazitaet anzahl ermitteln 69 def waggontest 70 return Qwaggons loks o get_kapazitaet loks 1 get_kapazitaet 71 end 72 Infostring ueber eine der Loks 73 def lokinfo loknr 74
299. henfolge erste Zahl Operator zweite Zahl Da das Skript verschiedene Fehler abf ngt sollten Sie es mit einigen falschen Eingaben auf die Probe stellen Hier einige Beispiele der Verwendungshinweis wird ab dem zweiten Versuch aus Platzgr nden weggelassen gt ruby argrechner rb 1 FEHLER Nicht genug Eingabewerte Verwendung ruby argrechner rb h lt num1 gt lt op gt lt num2 gt h Nur Hilfe ausgeben und beenden lt num1 gt lt num2 gt Beliebige Fliesskommazahlen lt op gt X gt ruby argrechner rb 2 1 FEHLER Ungueltiger Operator gt ruby argrechner rb 2 0 FEHLER Illegale Division durch O Aber Sie k nnen nat rlich auch erfolgreiche Berechnungen durchf hren gt ruby argrechner rb 17 4 17 00 4 00 21 00 Hier noch einige systematische Erl uterungen zum Skript e Zeile 2 7 Der Variablen usage wird per HIER Dokument ein mehrzeiliger Erkl rungstext ber die Verwendung des Skripts zugewiesen e Zeile 9 12 Wenn das erste Argument ungeachtet der Anzahl den Wert h hat wird der Inhalt von usage ausgegeben Obwohl dies keine Fehlermeldung ist erfolgt die Ausgabe auf STDERR Anschlie end wird das Skript mittels exit verlassen das Argument 0 wird dabei an das Betriebssystem zur ckgegeben und bedeutet kein Fehler 124 Kapitel3 Ruby Klassen e Zeile 14 18 Falls die Anzahl der Argumente ARGV length kleiner als drei ist werden eine entsprechende Fehlermeldung und us
300. her bestimmt welche Information oder Dienstleistung Sie von dem Server w nschen Ein klassi scher daytime Server Port 13 sendet beispielsweise sofort Datum und Uhrzeit w h rend der im vorliegenden Beispiel angesprochene HTTP Server zun chst eine Anfrage erwartet Diese besteht hier aus drei Elementen e Der eigentliche Befehl GET HTTP 1 1 eine einfache Dateianforderung GET f r die Startseite Protokollversion HTTP 1 1 e Die zus tzliche Header Zeile Host www oreilly de der Host Header ist in der HTTP Version 1 1 Pflicht weil unter derselben IP Adresse mehrere Hostna men mit unterschiedlichen Websites technisch ausgedr ckt namensbasierte virtuelle Hosts liegen k nnen Dieser Header gibt an welche konkrete Site auf dem angesprochenen Rechner angefordert wird Beim TCP Verbindungsauf bau wird n mlich nur noch die zuvor ber einen Nameserver aufgel ste IP Adresse verwendet so dass der konkrete Hostname zur Unterscheidung noch mals innerhalb der Nutzdaten des TCP Pakets stehen muss e Eine Leerzeile erzeugt durch sock puts die anzeigt dass die Header vorbei sind Eine GET Anfrage ist damit vollst ndig w hrend andere HTTP Anfragear ten sowie die meisten HTTP Antworten nach dieser Leerzeile noch einen Body enthalten bei der Antwort beispielsweise den Inhalt der bertragenen Datei Nachdem die Anfrage vollst ndig ist versendet der Server die Antwort Sie enth lt folgende Komponenten e Die Statuszeil
301. hgrundlagen Speichern Sie diesen Codeblock als Skript ab und f hren Sie ihn aus Geben Sie beim ersten Mal einen Text mit e ein danach einen ohne Hello e gefunden Hallo Kein e gefunden Die Syntax der regul ren Ausdr cke Regul re Ausdr cke stellen eine ganz eigene Sprache dar die Ihnen nach dem Erler nen brigens nicht nur in Ruby von Nutzen ist sondern auch in vielen anderen Pro grammiersprachen in der UNIX Shell oder in zahlreichen Texteditoren Das grundlegende Konzept stammt nicht aus der Informatik sondern wurde unter anderem von dem amerikanischen Sprachwissenschaftler Noam Chomsky zur Beschreibung der Syntax und Grammatik nat rlicher Sprachen mit mathematischen Mitteln entwickelt Die Regexp Implementierungen in Programmiersprachen und anderen Computerprogrammen besitzen zwar nur unterschiedlich gro e Teilmen gen der allgemeinen F higkeiten regul rer Ausdr cke sind aber dennoch beraus leistungsf hig Die Regexp Implementierung in Ruby ist besonders umfangreich noch mehr bietet nur noch die entsprechende Bibliothek von Perl Deshalb ist es leider unm glich hier s mtliche Regexp F higkeiten von Ruby darzustellen Betrachten Sie diesen Abschnitt vielmehr als solides Tutorial f r die Grundlagen wenn Sie damit zurecht kommen k nnen Sie sich sp ter leicht zus tzliches Wissen aneignen Als weiter f hrende Lekt re empfehle ich Ihnen das hervorragende Buch Regul re Ausdr cke von Jeffrey E F Friedl O
302. hner temperatur rb Fortsetzung 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 ffnen Sie einen Webbrowser und geben Sie die URL des Skripts ein zum Beispiel http localhost temperatur rb falls es sich direkt im u ersten Website Verzeichnis befindet Geben Sie einen Temperaturwert ein und w hlen Sie die gew nschte Umrechnungsrichtung Klicken Sie dann auf Umrechnen Abbildung 6 3 zeigt das cgi text_field temp cgi tr cgi td Umrechnung cgi td Radio Buttons fuer Umrechnungsrichtung cgi radio_group rechnung cf amp deg C gt amp deg F nbsp nbsp true fc amp deg F gt amp deg C cgi tr cgi td colspan gt 2 Absende Button cgi submit Umrechnen Ergebnis im Firefox nachdem 30 C in Fahrenheit umgerechnet wurde Ruby Temperaturumrechner Mozilla Firefox Datei Bearbeiten Ansicht Chronik Lesezeichen Extras Hilfe e gt A B http localhost temperatur rb temp 30 amp rechnung cf Erste Schritte B Aktuelle Nachrichten Temperaturumrechner 30 C 86 00 F Temperaturwert L Umrechnung C gt F OF gt C Umrechnen Abbildung 6 3 Der CGI Temperaturumrechner im Einsatz 294 Kapitel 6 Klassische Webanwendungen Die verschiedenen Teile dieses Skripts erledigen folgende Aufgaben Zeile
303. hnisse rekursiv durchsuchen 192 Verzeichnisse auslesen 136 Verzeichnisse pr fen 138 Verzeichnisstruktur 11 vi Editor 18 vim Editor 18 Vorzeichen 52 Ww Wahrheitswerte true false 44 wait Methode 259 wday Methode 139 Web Services 336 Webanwedungen mod_ruby 329 Webanwendungen Datenbankzugriff 314 Webbrowser Projekt 245 Erl uterungen 251 Implementierung 247 Test 251 Webformulare 290 Hidden Felder 309 WEBrick Webserver 337 Webserver 274 WEBrick 337 Weiterleitung HTTP 243 while Schleife 79 Whitespace in regul ren Ausdr cken 97 Windows Apache installieren 276 Dateisystem 11 Eingabeaufforderung starten 10 Konsolenbefehle 13 Laufwerk wechseln 12 MySQL installieren 315 Prompt 11 Ruby installieren 4 Winkelma in Bogenma umrechnen 65 Winsock 229 Wochentag deutsch 140 Wortumbruch 246 wrappager rb Skript 24 Wrapping 246 O X x Regexp Modifier 96 XAMPP 274 Xerox PARC 153 XHTML in CGI Bibliothek 298 Y YAML Dateiformat 344 year Methode 139 yield 176 Z Zahlen 36 Basis konvertieren 70 71 Z hler Bruch 146 Zeichenketten Strings 41 Zeilenumbruch am String Ende entfernen 66 Zeilenumbruch Plattformunterschied 237 Zombie Prozesse 259 Zufallsgenerator 63 zug _imp rb Skript 154 zug_oo rb Skript 158 Zugriffsschutz OOP 201 Beispiele 202 private 201 protected 201 public 201 392 Index ber den Autor Sascha Kersken kam 1983 zum ersten Mal mit einem C
304. hode wird sprintf und nicht printf verwendet da die Methode nicht etwa eine Ausgabe durchf hren sondern einen String Ausdruck zur ckliefern soll Letzteres gilt analog f r die Methode to_s Fine Methode dieses Namens hat wie bereits erw hnt noch einen Vorteil Sie wird automatisch aufgerufen wenn die Instanz in einem String Kontext verwendet wird hier beispielsweise in den irb Zeilen in denen die Instanzen lied1 und lied2 als Argumente von puts fungieren Weitere objektorientierte Konstrukte Nachdem Sie nun ber die Definition einzelner Klassen und den Einsatz entspre chender Instanzen Bescheid wissen k nnen Sie sich mit der Zusammenarbeit von verschiedenen Klassen besch ftigen In diesem Abschnitt erfahren Sie daher das Wichtigste ber die Themen Vererbung Geheimhaltungsstufen ffentliche oder private Methoden Module und Mixins die gleichnamige Klassenmethoden und gemeinschaftliche Instanzmethoden verschiedener Klassen erm glichen sowie Introspektion die Live Untersuchung von Klassenstrukturen Vererbung Die Vererbung Inheritance z hlt zu den bedeutendsten Vorteilen der Objektorien tierung Indem Sie Gemeinsamkeiten in bergeordneten Klassen verallgemeinern und Unterschiede in abgeleiteten Klassen herausarbeiten sparen Sie sich h ufig doppelte Arbeit und machen Ihre Programme bersichtlicher Die Vererbung wird durchgef hrt indem Sie in einer Klassendefinition ein lt Zei chen und den Namen der
305. hrung in lt i gt HTML lt i gt lt p gt Die merkw rdige Zeichensequenz amp uuml steht f r den Umlaut Sonderzeichen die in HTML eine besondere Bedeutung haben zum Beispiel lt und gt sowie Nicht ASCII Zeichen werden durch diese so genannten Entity Referenzen dargestellt Auf der Website zum Buch finden Sie eine entsprechende Liste F r HTML Tags die keine weiteren Inhalte mehr umfassen existiert eine spezielle Kurzschreibweise Statt lt tag attribut wert gt lt tag gt k nnen Sie auch einfach Folgendes schreiben lt tag attribut wert gt Das bekannteste Beispiel ist der einfache Zeilenumbruch lt br gt brigens werden Sie im Web zahlreiche ltere HTML Dokumente antreffen die solche Einfach Tags ohne den abschlie enden Slash verwenden Das liegt daran dass 1999 die HTML Neufassung XHTML eingef hrt wurde Sie besitzt eine strengere Syntax als ltere HTML Versionen weil sie XML kompatibel ist Infor mationen ber XML erhalten Sie im n chsten Kapitel Ohne hier n her ins Detail zu gehen Gew hnen Sie sich den End Slash f r leere Tags grunds tzlich an damit Ihre HTML Dokumente zukunftssicher sind Jedes HTML Dokument besitzt die folgende Grundstruktur lt html gt lt head gt lt title gt Titel des Dokuments lt title gt lt head gt lt body gt Sichtbarer Inhalt des Dokuments lt body gt lt html gt 244 Kapitel 5 Netzwerkanwendungen
306. i In der String Instanzvariablen txt wird jeder wegen dem Modifizierer i sowohl gro als auch kleingeschriebene Vokal durch ein Sternchen ersetzt Hier ein weiteres Beispiel das die Flie kommazahl r in einen String umwandelt und den Punkt durch das in Kontinentaleuropa gebr uchliche Komma ersetzt zahl Math PI ausgabe zahl to_s sub puts Pi hat den Wert ausgabe Das Beispiel gibt folgende Zeile aus Pi hat den Wert 3 14159265358979 Besonders praktisch ist dass Sie innerhalb des Ersetzungs Strings auf Treffer Teil strings zur ckgreifen k nnen wenn Sie diese in runde Klammern setzen In der bis her gezeigten Schreibweise funktioniert das allerdings noch nicht mit Hilfe der bereits erw hnten Variablen 1 2 und so weiter Diese stehen n mlich erst nach der Ausf hrung einer Regexp Methode zur Verf gung Stattdessen gibt es hier die spezielle Variante 1 2 usw Einziges Problem In einem String in doppelten Anf hrungszeichen werden sie als Zeichencodes missverstanden und sie lassen sich auch nicht als eingebettete Ausdr cke schreiben Abhilfe schaffen hier entwe der einfache Anf hrungszeichen deren Nachteile zu Beginn dieses Kapitels bereits aufgez hlt wurden oder das Escaping des jeweiligen Backslashs schreiben Sie mit anderen Worten entweder 1 oder 1 Hier ein Beispiel das einen String der Form Wort1 Wort2 durch Wort2 Wort1 ersetzt also beispielsweise Namen f r eine alpha
307. i schen Methoden wie File file oder File directory k nnen Sie ermitteln ob es sich bei einem Eintrag um eine gew hnliche Datei oder ein Verzeichnis handelt Ein weiteres wichtiges Element einer modernen Programmiersprache ist der Umgang mit Datum und Uhrzeit Ruby stellt daf r die Klasse Time zur Verf gung Methoden wie month oder hour stellen die einzelnen Bestandteile eines Datumsob jekts zur Verf gung w hrend strftime eine Reihe von Platzhaltern f r Format strings bereitstellt Abgerundet wurde dieses Kapitel durch die Klassen Rational f r die Bruchrechnung sowie Regexp und MatchData f r den objektorientierten Zugang zu regul ren Ausdr cken Und zum Schluss wurde noch kurz auf die Verwendung der Ruby Hilfe ri eingegangen so dass Sie nun leicht weitere eingebaute Klassen und Methoden erkunden k nnen In sp teren Kapiteln werden Sie eine Reihe weiterer Klassen aus dem Sprachkern sowie aus den mit Ruby gelieferten Bibliotheken kennenlernen Im n chsten Kapitel erfahren Sie au erdem ausf hrlich wie Sie Ihre eigenen Klassen entwickeln k n nen und sogar wie sich die Ruby Standardklassen durch eigene Methoden erwei tern lassen Zusammenfassung 151 In diesem Kapitel KAPITEL 4 ur Eine paksch Ehrung Eigene Klassen und Klassen entwerfen und implemen A tieren 0 b k e Weitere objektorientierte Je te e rste e n Konstrukte Die Ordnung der Ideen muss fortschreiten nach der Ordnung der Ge
308. i schrift else schrift end Arial Helvetica sans serif if cgi has_key groesse groesse cgi groesse else groesse 12px end if cgi has_key farbe farbe cgi farbe else farbe 000000 end Daten in Session speichern session schrift schrift session groesse groesse session farbe farbe Seite mit Formular anzeigen cgi out cgi html cgi head cgi title Schrifteinstellungen waehlen cgi meta http equiv gt Content type content type gt text html charset iso 8859 1 cgi body cgi h1 Waehlen Sie Ihre Schrifteinstellungen cgi form method gt get cgi table border gt 0 cellpadding gt 8 cgi tr cgi td Schriftart CGl Skripten mit Ruby 311 cgi td cgi popup menu schrift Arial Helvetica sans serif serifenlos true Times New Roman Times serif Serifenschrift Courier New Courier mono Festbreitenschrift egi tr cgi td Schriftgroesse cgi td cgi radio_group groesse 10px klein amp nbsp nbsp 12px normal nbsp amp nbsp true 16px gross egi tr cgi td Schriftfarbe cgi td cgi popup_menu farbe 000000 schwarz true FF0000 rot 009900 gruen 0000FF blau egi tr cgi td colspan gt 2 cgi submit Einstellungen uebernehmen cgi p
309. i einem typischen TCP Server stellt der Parent beispielsweise den lauschenden Socket zur Verf gung w hrend f r jede Client Verbindung ein Child erzeugt wird Dieses klassische Modell hei t Forking Server Damit Parent und Child unterschiedlichen Aufgaben nachgehen k nnen brauchen Sie eine M glichkeit sie zu unterscheiden Der Schl ssel ist der R ckgabewert von fork Im Parent Prozess enth lt er die Prozess ID PID des Childs eine positive Ganzzahl und im Child nil Somit erm glicht ein einfaches if else die Unterschei dung zwischen den beiden Prozessen Hier ein einfaches Beispiel f fork if f puts Hi Ich bin der Parent und mein Child heisst f else puts Ich bin das Child end Etwas ungew hnlich an dieser Fallentscheidung ist dass beide Zweige ausgef hrt werden der if Teil eben vom Parent und der else Teil vom Child Die Ausgabe lautet also beispielsweise so Ich bin das Child Hi Ich bin der Parent und mein Child heisst 4778 Es wurde bereits erw hnt dass Parent und Child nach dem fork dieselben Variab len besitzen Allerdings erh lt jeder Prozess seine eigene Kopie davon was Sie sehen k nnen wenn Sie den Wert individuell ndern Zum Beispiel a 42 f fork iff Parent Wert von a ausgeben puts Im Parent besitzt a den Wert a a aendern a 23 puts Im Parent wurde a nun auf a geaendert else Child puts Im Child behaelt a den Wert a end a in beiden Prozessen
310. i modul2 kompiliert die angegebenen Module fest ein In der Liste m ssen Sie das K rzel mod_ vor dem Modulnamen weglassen also zum Beispiel autoindex log_config statt mod_autoindex mod _log_ con fig F r manche h ufig genutzten Module steht brigens auch die Kurzfas sung enable modulname zur Verf gung enable mods shared moduli modul2 kompiliert die angegebenen Module als DSOs was den praktischen Vorteil hat dass sie jederzeit auch vor bergehend wieder entfernt werden k nnen F r prominente Module gibt es auch die Schreibweise enable modulname shared enable modules most beziehungsweise enable mods shared most kompiliert fast alle Module Je nach Auswahl werden sie statisch einkompiliert oder als DSOs erstellt most ist in den meisten F llen gegen ber all vorzuziehen weil unter anderem alle Module weggelassen werden die beim Kompilieren Pro bleme bereiten w rden 278 Kapitel 6 Klassische Webanwendungen e disable modules moduli modul2 l sst die angegebenen Module aus dr cklich weg Das ist besonders beim Einsatz von enable modules all sehr n tzlich Das folgende Beispiel bereitet Apache f r die Kompilierung und Installation im Standardverzeichnis usr local apache2 und zur Installation der meisten Module als DSOs vor configure enable layout Apache enable so enable mods shared most Nachdem configure seine Arbeit beendet hat die viele Minuten dauern kann wer d
311. ich mit demselben Schutzmechanismus Hier der Code class RechtwinkligesDreieck Attribut lesbar machen attr_reader alpha Konstruktor def initialize alpha 45 Winkel beschraenken alpha 89 9 if alpha gt 90 alpha alpha end Aenderungsmethode def alpha alpha Winkel beschraenken alpha 89 9 if alpha gt 90 alpha alpha end Den anderen Winkel ermitteln def beta 90 alpha end end 196 Kapitel 4 Eigene Klassen und Objekte erstellen Probieren Sie die Klasse aus indem Sie eine Instanz erzeugen und den Winkel alpha nachtr glich ndern Zur Kontrolle k nnen Sie jeweils die Methode beta aufrufen Zum Beispiel d RechtwinkligesDreieck new 30 printf Alpha d Beta d n d alpha d beta Alpha aendern d alpha 40 printf Alpha d Beta d n d alpha d beta Die Ausgabe lautet nat rlich Alpha 30 Beta 60 Alpha 40 Beta 50 Eine Kurzfassung f r alle Attribute die sowohl lesbar als auch nderbar sein sollen ist attr_accessor Accessor Methoden ist brigens der traditionelle Oberbegriff f r Getter und Setter Hier als Beispiel eine Klasse die alle Informationen ber einen Song kapselt Interpret Titel und Laufzeit in Sekunden Da alle diese Daten unkritisch nderbar sind werden sie mittels attr_accessor freigegeben class Song Attribute veroeffentlichen attr_accessor interpret titel dauer Konstruktor def initialize interpret titel da
312. ichnishierarchie zu verarbeiten oder andere verschachtelte Probleme zu l sen kommt ein Verfahren namens Rekursion zum Einsatz bei dem sich eine Methode f r einen untergeordneten Bereich immer wieder selbst aufruft Wie das funktioniert zeigt zum Beispiel dieses bekannte Kin derlied 190 Kapitel 4 Eigene Klassen und Objekte erstellen Ein Hund kam in die K che und stahl dem Koch ein Ei Da nahm der Koch den L ffel und schlug den Hund entzwei Da kamen alle Hunde und gruben ihm ein Grab Und setzten ihm nen Grabstein worauf geschrieben stand Ein Hund kam in die K che und stahl dem Koch ein Ei Da nahm der Koch den L ffel und schlug den Hund entzwei Da kamen alle Hunde und gruben ihm ein Grab Und setzten ihm nen Grabstein worauf geschrieben stand Ein Hund kam bertragen auf das Verzeichnisproblem bedeutet das dass sich die zust ndige Methode jedes Mal wenn sich ein Eintrag als Unterverzeichnis entpuppt mit die sem Verzeichnis als Pfad selbst aufruft Das stellt sicher dass der gesamte unterge ordnete Verzeichnisbaum verarbeitet wird Die Besonderheit einer rekursiven Methode besteht darin dass Sie sie innerhalb ihres eigenen Methodenrumpfes aufrufen Wichtig ist dabei eine Abbruchbedin gung Jeder Methodenaufruf belegt etwas Speicher weil der Computer sich merken muss an welcher Stelle das Programm nach Ausf hrung der Methode weitergeht R cksprungadresse Eine unendliche Rekursion w rde so irgendwa
313. ick installieren k nnen Sie enth lt unter anderem folgende Bestandteile e Den Ruby Interpreter e Die Kernbibliotheken e Zahlreiche popul re Erweiterungen e Den Texteditor SciTE der unter anderem Syntax Highlighting f r Ruby zu bieten hat 4 Kapitel 1 Einf hrung e Die grafische Ruby Entwicklungsumgebung FreeRIDE e Umfangreiches Dokumentationsmaterial in den Formaten HTML und Windows Help darunter den Volltext des oben erw hnten Pickaxe Buchs Programming Ruby The Pragmatic Programmers Guide 1 Auflage Sie finden den Installer unter http rubyinstaller rubyforge org Klicken Sie den Link Downloads an und laden Sie sich die jeweils neueste Version herunter Stand Januar 2007 1 8 5 21 stable Die Datei mit der Endung exe zurzeit ruby185 21 exe ist der Installer selbst ruby185 21 md5 Diese Datei enth lt einen sogenannten MD5 Hash u eine nach einem komplexen Verfahren berechnete Pr fsumme Damit k nnen Sie selbstst ndig die Integrit t Ihres Downloads ber pr fen um Fehler auszuschlie en Sie brauchen nur den MD5 Hash der exe Datei zu erstellen und mit der herunterladbaren md5 Datei zu vergleichen u Zu jeder exe Datei geh rt eine gleichnamige md5 Datei etwa Windows enth lt ab Werk kein md5 Tool Sie k nnen aber einfach eins aus dem Web herunterladen ein gutes Beispiel sind die Win32 GNU Utilities von der Website http unxutils sourceforge net die noch weitere Windows Ver
314. id Heinemeier Hansson und dem Pragmatic Programmer Dave Thomas Die zweite Auflage geht unter anderem st rker auf Ajax ein Dave Thomas David Heinemeier Hansson Agile Webentwicklung mit Rails M n chen 2006 Hanser Verlag Die erste Auflage des vorgenannten Werks in deutscher bersetzung Rob Orsini Rails Cookbook Sebastopol 2007 O Reilly Media Auch zu Ruby on Rails ist inzwischen ein Kochbuch mit praktischen Anleitungen erschienen Objektorientierung Bernhard Lahres Gregor Rayman Praxisbuch Objektorientierung Bonn 2006 Gali leo Computing In diesem Buch werden alle wichtigen Konzepte der objektorientier ten Programmierung ausf hrlich und methodisch anhand praxisnaher Beispiele erl utert Neben C C und Java kommt auch Ruby zur Sprache Eric Freeman Elizabeth Freeman Kathy Sierra Entwurfsmuster von Kopf bis Fu K ln 2006 O Reilly Verlag Der comicartige und verspielte Stil der Von Kopf bis Fu Reihe hilft Ihnen Themen nicht nur zu lernen sondern auch zu behalten In diesem Band werden Entwurfsmuster Design Patterns behandelt standardisierte L sungsans tze f r immer wiederkehrende Programmierprobleme Jeder ernsthafte OO Entwickler sollte sich eines Tages mit Entwurfsmustern besch ftigen weil sie enorm viel Arbeit sparen Christoph Kecher UML 2 0 Das umfassende Handbuch 2 Auflage Bonn 2006 Galileo Computing Jede OOP Anwendung die ber ein bis zwei Klassen hinaus geht sollte sorgf ltig gepla
315. iden Tabellen der Zusatz AUTO_INCREMENT besagt dass sie auto matisch durchnummeriert werden sollen F gen Sie nun mit Hilfe der beiden folgenden Zeilen Beispielwerte in die Tabelle interpreten ein mysql gt INSERT INTO interpreten int_name VALUES Led Zeppelin Query OK 1 row affected 0 08 sec mysql gt INSERT INTO interpreten int_name VALUES Iron Maiden Query OK 1 row affected 0 06 sec Nun k nnen Sie s mtliche Inhalte der Tabelle interpreten ausw hlen damit diese angezeigt wird mysql gt SELECT FROM interpreten int_nr int_name 1 Led Zeppelin 2 Iron Maiden Dies zeigt die automatisch eingef gten Nummern an die Sie ben tigen um den CDs die korrekten Interpreten zuzuordnen Mit dieser Information k nnen Sie sich daranmachen CDs einzugeben mysql gt INSERT INTO cds cd_interpret cd_titel cd_jahr cd_songs gt VALUES 2 Seventh Son Of A Seventh Son 1988 8 Query OK 1 row affected 0 03 sec mysql gt INSERT INTO cds cd_interpret cd_titel cd_jahr cd_songs gt VALUES 2 The Number Of The Beast 1982 9 Query OK 1 row affected 0 01 sec mysql gt INSERT INTO cds cd_interpret cd_titel cd_jahr cd_songs gt VALUES 1 Led Zeppelin IV 1971 8 Query OK 1 row affected 0 00 sec Der folgende Befehl zeigt die gesamte Tabelle cds an und zwar aufsteigend ASCen ding
316. ie die Konfigurationsdatei gespeichert haben gelten die nderungen sobald Sie ein neues Terminalfenster ffnen Probieren Sie es aus indem Sie sich die obige Begr ung noch einmal aus einem anderen Arbeitsverzeichnis heraus und ohne vorangestelltes ausgeben lassen Zum Beispiel user rechner gt ruby e puts Hallo hier ist noch mal Ruby Ruby installieren 9 Ruby Code eingeben und ausf hren Ruby ist eine Programmiersprache und kein gew hnliches Anwendungsprogramm Das bedeutet dass Sie nicht einfach ein Anwendungsfenster ffnen um mit Ruby zu arbeiten Stattdessen besteht die Sprache aus mehreren kleinen Einzelprogram men Diese besitzen keine grafische Oberfl che sondern werden jeweils durch eine Befehlseingabe in einer Textkonsole ausgef hrt In diesem kurzen Abschnitt lernen Sie die wichtigsten M glichkeiten zum Ausf hren von Ruby Anweisungen oder Skripten kennen Zu Unrecht gef rchtet das Arbeiten mit der Konsole Bevor Sie die Ruby Dienstprogramme verwenden k nnen m ssen Sie ein Pro gramm zur Befehlseingabe ffnen Dies ist unter Windows die bereits erw hnte Ein gabeaufforderung und auf UNIX Systemen ein beliebiges Terminalfenster Zum ffnen der Windows Eingabeaufforderung gibt es zwei M glichkeiten e W hlen Sie Start gt Alle Programme gt Zubeh r gt Eingabeaufforderung Beach ten Sie dass es in lteren Windows Versionen vor XP Programme statt Alle Programme hei t e Alter
317. ie in der normalen Kalenderschreibweise F r den Zugriff auf ein Array m ssen Sie 1 davon abziehen Das Array selbst k nnen Sie aber erst einmal definieren monate w Januar Februar Maerz April Mai Juni Juli August September Oktober November Dezember Nun k nnen Sie den R ckgabewert der Methode wday als Index auf wtage und den um 1 verminderten Wert von month als Index auf monate anwenden t Time new wtag wtage t wday monat monate t month 1 Nun k nnen Sie Datum und Uhrzeit vollst ndig ausgeben printf s 02d s 4d 02d 02d 02d n wtag t day monat t year t hour t min t sec Ein Ausgabebeispiel k nnte so aussehen Samstag 21 Oktober 2006 10 51 46 Um direkt aus dem Time Objekt ein nach Ihren W nschen formatiertes Ergebnis zu extrahieren k nnen Sie seine Methode strftime aufrufen Der Name ist eine Abk rzung f r String Format Time eine gleichnamige Funktion mit praktisch identischer Formatsyntax steht seit vielen Jahren in der C Standardbibliothek zur Verf gung Die Ruby Variante besitzt folgende Grundsyntax wobei t wieder ein Time Objekt ist t strftime Formatstring 140 Kapitel 3 Ruby Klassen Der Formatstring ist ein beliebiger String in dem hnlich wie bei printf spezi elle Zeichen Sequenzen f r die einzelnen Zeit Aspekte stehen In Tabelle 3 2 fin den Sie eine bersicht ber alle verf gbaren Formate Tabelle 3 2 Formatplatzhalter f r die Methode Time strfti
318. ier finden Sie Why s Poignant Guide to Ruby ein sehr eigenwilliges Online Buch zum Thema Ruby von why the lucky stiff Blogger Synonym Es enth lt eine gr ndliche und sehr kurzweilige Ruby Einf hrung und jede Menge Cartoons mit F chsen http www approximity com rubybuch2 rb_main html noch ein deutschsprachiges Online Buch zu Ruby Es handelt sich um die Webausgabe des Buchs Programmie ren mit Ruby von Armin Roehrl Stefan Schmiedl und Clemens Wyss das auch gedruckt erschienen ist siehe oben Web Ressourceen 373 Ruby Community http www ruby lang org en die Ruby Homepage Hier wird jeweils die neueste Version zum Download angeboten Daneben finden Sie auf dieser Site zahlreiche Zusatzinformationen und Links http www rubygarden org umfangreiche Ruby Ressourcen Site von Chad Fowler http tryruby hobix com interaktive JavaScript Anwendung mit der Sie irb im Browser benutzen k nnen Inklusive kurzem Ruby Tutorial http www2 ruby lang org en 20020104 html bersicht ber die wichtigsten Ruby Mailing Listen sowohl f r Nutzer als auch f r potentielle Mitentwickler der Spra che http www rubyforen de umfangreiches deutschsprachiges Diskussionsforum zu den verschiedensten Ruby Themen http www rubyonrails org die Webseite des Projekts Ruby on Rails mit Down loads Dokumentation und allerlei n tzlichen Links http www radrails org RadRails ist eine integrierte Entwicklu
319. iese etwas eigenwillige Reihenfolge stellt sicher dass die als Abbruchbedingung einzugebende Leerzeile einfach Enter nicht in der Datei landet e Zeile 87 Die Eingabe ist beendet und die Datei wird geschlossen e Zeile 89 91 Abschlie end wird die neue Anzahl in postings txt geschrieben Danach erfolgt automatisch ein neuer Durchlauf der Hauptschleife da pos bereits in Zeile 72 auf den neuen Wert von postings gesetzt wurde kann der Benutzer seinen neuen Fintrag sofort lesen In Abbildung 3 1 sehen Sie das Textblog nach der Eingabe des sechsten Eintrags ex Eingabeaufforderung ruby textblog rb olx isherige Eintraege 18 11 2066 18 88 as Textblog hat alle Tests bestanden 18 11 2006 18 88 nur noch einen Eintrag dann gibt s was zum Blaettern 18 11 2866 18 87 Hinweis auf Abschnitt Datum und Uhrzeit in Beschreibung einfuegen 18 11 2006 18 86 Idee in spaeterem Kapitel datenbankhasierte Fassung einbauen MySQL gt 18 11 2006 18 65 otiz usgabe der Postings als Iteration mit downto realisieren Abbildung 3 1 Das Textblog im Einsatz Erweiterte Dateizugriffe Sie k nnen Dateien brigens nicht nur sequenziell Zeile f r Zeile bearbeiten Der Dateizeiger das hei t die aktuelle Schreib oder Leseposition in der Datei kann ver schoben werden und Sie k nnen Dateien auch zum gemischten Lesen und Schrei ben ffnen Damit lassen sich gezielt bestimmte Stellen ein
320. iff auf die Daten so dass die Zul ssig keit jeder nderung kontrolliert werden kann Das macht objektorientierte Programme weniger fehleranf llig als imperative Eine Instanz instance allgemeiner auch als Objekt object bezeichnet ist ein konkretes Element dessen Eigenschaften und Verhalten durch eine bestimmte Klasse festgelegt werden Die Instanz wird erzeugt indem mittels Klasse new der Konstruktor constructor einer Klasse aufgerufen wird eine Art spezieller Methode deren R ckgabewert eben die neue Instanz ist Sobald die Instanz existiert k nnen Sie ihre Methoden aufrufen um auf ihr Verhalten zuzugreifen Aufrufe von Instanzmethoden werden auch als Nachrichten mes sages bezeichnet die verschiedene Objekte einander senden Diese Interpreta tion der Objektorientierung unterstreicht die Autonomie der verschiedenen Objekte Sie f hren bestimmte Handlungen durch sobald sie eine entspre chende Nachricht erhalten Eine Methode method ist ein benanntes St ck Programmcode Sie wird zwar in einer Klasse definiert kann aber in der Regel nur f r eine konkrete Instanz der Klasse aufgerufen werden bliche Syntax nicht nur in Ruby Instanz Methodenname Eine Ausnahme sind Klassenmethoden class methods die f r allgemeine und nicht auf ein bestimmtes Objekt bezogene Aufgaben verwendet werden im vorigen Kapitel haben Sie beispielsweise die Instanzmethode File Instanz gets eine Zeile aus einer konkreten Datei l
321. ild in der Prozessliste ps ps aux puts ps match w s f puts Bitte ENTER druecken gets Process wait puts Reaping erledigt Ist mein Child noch in der Prozessliste ps ps aux puts ps match w s f else puts Ich bin das Child und bin schon fertig exit end Was macht dieses Skript Der Child Prozess jedenfalls macht nicht viel Er gibt eine Zeile Text aus und beendet sich danach sofort Die Arbeitsschritte des Parents sind interessanter Er gibt zun chst die PID des Child Prozesses seinen R ckgabewert von fork aus Anschlie end sucht er genau diesen Wert in der Prozessliste Dazu ruft er das bereits erw hnte Shell Kommando ps aux auf Wenn Sie ein Shell Kommando wie hier in Backticks setzen f hrt Ruby es als eigenst ndigen Prozess aus und liefert seine gesamte Ausgabe zur ck Als N chstes wird die Zeile herausgesucht die mit beliebig vielen Wortzeichen User der den Prozess ausf hrt beliebig viel Whitespace und der Prozess ID beginnt Beachten Sie in der ausgegebenen Zeile den Status Z Zombie sowie die Bemerkung lt defunct gt au er Betrieb 8 Im Gegensatz zu fork funktioniert dies auch unter Windows Prozesse und Threads 259 Nun wird der User aufgefordert Enter zu dr cken damit etwas Zeit vergeht Danach wird Process wait aufgerufen Zur Kontrolle wird am Ende nochmals die Prozessliste ausgelesen und durchsucht Wenn das Reaping erfolgreich war d rfte de
322. ile m ssen Sie gegebenenfalls wieder anpassen Beispiel 6 1 Der CGI Temperaturumrechner temperatur rb 1 C ruby bin ruby exe w 2 require cgi 3 CGI Instanz mit HTML Erzeugungsmethoden 4 cgi CGI new html4 5 HTTP Header ausgeben 6 cgi header 7 HTTP Body ausgeben 83 cgi out 9 HTML Dokument 10 cgi html 11 Kopf des HTML Dokuments 12 cgi head 13 cgi title Ruby Temperaturumrechner 14 15 Body des HTML Dokuments 16 cgi body 17 Hauptueberschrift 18 cgi h1 Temperaturumrechner 19 if cgi has_key temp amp amp cgi has_key rechnung 20 Wenn Formulardaten vorhanden sind umrechnen 21 temp cgi temp to_i 22 rechnung cgi rechnung 23 if rechnung cf 24 Celsius in Fahrenheit 25 ergebnis temp 1 8 32 26 ausgabe sprintf 2f ergebnis 27 temp amp deg C ausgabe deg F 28 else 29 Fahrenheit in Celsius 30 ergebnis temp 32 1 8 31 ausgabe sprintf 2f ergebnis 32 temp deg F ausgabe deg C 33 end 34 else 35 Nichts ausgeben falls keine Formulardaten 36 37 end 38 Formular Methode GET Ziel aktuelles Skript Standard 39 cgi form get 40 Tabelle 41 cgi table border gt 2 cellpadding gt 8 42 egi tr 43 cgi td Temperaturwert 44 cgi td 45 Textfeld zur Eingabe des Temperaturwerts CGl Skripten mit Ruby 293 Beispiel 6 1 Der CGI Temperaturumrec
323. ime 142 pop 68 post_match 148 pre_match 148 print 116 printf 117 Process kill 262 Process ppid 262 Process wait 259 push 68 puts 116 query 323 radio_group 302 rand 63 read 121 read Dir 137 Rekursion 190 require 187 reset CGI 303 respond_to 214 reverse Array 69 reverse String 66 rewind 135 Index round 64 R ckgabewerte 175 sec 139 seek 135 select_db 323 Setter 195 shift 69 sleep 267 slice 69 sort 69 sort File 136 sprintf 119 step Iterator 104 strftime 140 Strings 66 sub 98 submit 303 swapcase 66 text_field 301 textarea 301 times Iterator 104 to_a 72 to_f 70 to_i 70 to_s 70 trap 261 Typumwandlung 70 unshift 69 upcase 66 update Active Record 350 upto Iterator 104 wday 139 year 139 yield 176 Methodenkopf 169 Methodenrumpf 169 methods Methode 214 min Methode 139 Mixins 208 include 208 mkdir Konsolenbefehl 13 mod_ruby 329 mod_text rb Skript 216 Modifier Regexp 96 modtext rb Skript 28 Module 205 Comparable 209 Math 65 206 367 Mixins 208 Namensraum 206 ObjectSpace 212 Module Apache Webserver 275 Modulo 51 Monat deutsch 140 month Methode 139 Multicast IP 224 MVC 333 MySQL 314 Daten einf gen 319 Datenbank erzeugen 318 Datens tze lesen 319 Einf hrung 318 Installation Linux 316 Installation Mac OSX 316 Installation UNIX 316 Installation Windows 315 Konsolen Client 318 Ruby Zugriff 321 Tabelle erze
324. in Sekunden zu Time now zu addieren Wenn Sie kein Verfallsdatum angeben gilt der Cookie nur f r die Dauer der aktuellen Browsersitzung eines Benutzers Session Cookie Das folgende Beispiel erzeugt einen Cookie namens lastvisit mit der in einen String umgewandelten aktuellen Systemzeit und einer G ltigkeitsdauer von einer Woche cookie Cookie new name gt lastvisit value gt Time new to_s expires gt Time new 86400 7 Um den Cookie tats chlich zu setzen m ssen Sie im Argument Hash von cgi hea der oder cgi out einen Header mit dem Schl ssel cookie hinzuf gen Der entspre chende Wert ist keine CGI Cookie Instanz sondern ein Array solcher Instanzen da eine HTTP Antwort mehrere Cookies setzen kann Hier ein Beispiel das nur den soeben erzeugten cookie setzt cgi out cookie gt cookie CGl Skripten mit Ruby 305 Eine Seite die den Cookie lesen m chte kann auf die Methode cookies des CGI Objekts zugreifen Diese liefert einen Hash in dem alle verf gbaren Cookie Namen die Schl ssel bilden Sie k nnen auch hier has_key einsetzen um zu berpr fen ob ein bestimmter Cookie existiert Den Cookie lastvisit k nnten Sie beispielsweise wie folgt auslesen if cgi cookies has_key lastvisit lastvisit cgi cookies lastvisit value 0 else lastvisit new end Wie Sie sehen erfolgt der Zugriff auf den Wert eines bestimmten Cookies ber die Methode value Diese liefert ei
325. in Verfahren namens NAT Network Address u Translation Selbst die kleinsten Ger te etwa jede beliebige DSL Routerbox unterst tzen dieses Protokoll was Ihnen den Aufwand und die Kosten erspart offizielle IP Adressen f r Ihre Privatrechner zu beantragen 4 Es gibt sogar CIDR Adtessen in denen die Trennlinie zwischen Netz und Hostteil nicht an einer Byte Grenze verl uft 192 168 17 4 26 Teilnetzmaske 255 255 255 192 geh rt beispielsweise zu einem Netz mit den Adressen 192 168 17 0 bis 192 168 17 63 Dieser komplexere Fall wird hier allerdings nicht n her betrachtet Kurze Einf hrung in TCP IP 225 Die zweite Aufgabe des IP Protokolls neben der Adressierung ist das Routing das hei t die Weiterleitung von Daten in andere Teilnetze Wie sich das Teilnetz aus der Adresse ergibt wurde soeben erl utert Ein Router besitzt mehrere Netzwerk schnittstellen Ethernet WLAN DSL usw Jede von ihnen besitzt eine IP Adresse aus einem anderen Netz Der Router leitet Daten die er ber eine seiner Schnittstel len empf ngt ber eine andere in ein anderes Netz weiter Sie k nnen sich sogar die einzelnen Stationen des Routings ansehen Beinahe jeder TCP IP f hige Rechner enth lt ein Dienstprogramm das diesen Weg beschreiben kann Hier die Route von meinem Rechner DSL bei NetCologne zu www rubygarden org einer empfehlens werten Ruby Ressourcen Site gt tracert www rubygarden org Routenverfolgung zu rubygarden org 216 133
326. in eckigen Klammern dargestellt und die Inhalte von Unterverzeichnissen hier nur eines einger ckt Nun zu den detaillier ten Erl uterungen des Skripts Zeile 4 27 Definition der Methode listdir Beachten Sie zun chst dass eine Methode in Ruby definiert werden muss bevor sie zum ersten Mal aufgerufen werden kann in manchen anderen Sprachen wird das freier gehandhabt Des halb steht die Methode vor dem globalen Code am Anfang des Skripts listdir nimmt bis zu zwei Argumente entgegen den Pflichtparameter dir das zurzeit zu durchsuchende Verzeichnis und die optionale Einr ckungstiefe indent die den Standardwert 0 keine Einr ckung enth lt wenn sie beim Aufruf nicht angegeben wird Zeile 6 Es wird ein neues Dir Objekt erzeugt Als Pfad wird die Parametervari able dir eingesetzt die Referenzvariable hei t d Zeile 8 24 In einer Schleife werden alle Eintr ge des aktuellen Verzeichnisses ausgelesen Der Aufruf der Methode read dient dabei als Bedingung der while Schleife die dadurch automatisch ausgef hrt wird solange weitere Eintr ge vorhanden sind Der jeweilige Eintrag wird in der Variablen entry gespeichert Zeile 10 dir und entry werden zu einem neuen Pfad verkn pft um den aktuel len Eintrag untersuchen zu k nnen Gl cklicherweise akzeptiert auch Ruby f r Windows den UNIX Slash als Trennzeichen so dass hier keine Plattform Fall entscheidung n tig ist Das Ergebnis der Operation wird in einer Variablen namens
327. ind und es wirklich auf die Spitze treiben m chten k nnen Sie die Ausgabe von read rb auch wieder in eine Datei umleiten und diese danach in Ruhe in einem Editor lesen gt ruby read rb lt bis1000 txt gt readtest txt Ein und Ausgabe 121 Kommandozeilen Argumente des Ruby Skripts Bei einfachen Konsolenprogrammen ist es oft praktischer die zu verarbeitenden Werte gleich beim Start als Parameter einzulesen als sie nachtr glich per zeilenba sierter Eingabe anzufordern Stellen Sie sich etwa vor der Konsolenbefehl zum L schen Windows del UNIX rm m sste zun chst ohne Dateimuster eingegeben werden und w rde anschlie end fragen Welche Dateifen m chten Sie l schen Umst ndlicher ginge es kaum gerade die Kommandozeilen Argumente machen die Konsole zum praktischen Arbeitsumfeld Um einem Ruby Skript beim Aufruf Argumente zu bergeben werden diese durch Leerzeichen getrennt hinter dessen Dateinamen und vor eine eventuelle Ein oder Ausgabeumleitung geschrieben und zwar nach dem Schema ruby Dateinam argo argi argn Innerhalb Ihres Skripts stehen die Parameter dann im Array ARGV zur Verf gung der erste befindet sich in ARGV o der zweite in ARGV 1 und so weiter Bevor Sie die Parameter auf Verdacht verarbeiten sollten Sie zun chst mittels ARGV length ihre Anzahl ermitteln Speichern Sie dazu das folgende einzeilige Skript in einer Datei printf Sie haben d Argumente eingegeben n ARGV len
328. inden Sie eine GServer Version des ECHO Servers sowie einen einfachen Webserver 270 Kapitel 5 Netzwerkanwendungen Zusammenfassung In diesem Kapitel haben Sie zum ersten Mal die Grenzen eines einzelnen Rechners verlassen und sich ins Netzwerk vorgetastet Erfreulicherweise funktionieren heut zutage fast alle Netzwerke genauso wie das Internet so dass jede Netzwerkanwen dung zugleich eine Internetanwendung ist und umgekehrt Im ersten Abschnitt wurden einige wichtige Grundbegriffe der Netzwerktheorie ein gef hrt Diese sollten Sie verstanden und verinnerlicht haben um erfolgreich Netz werkanwendungen programmieren zu k nnen TCP IP Netzwerke bestehen aus vier Schichten oder Funktionsebenen Auf die Netzwerkhardware baut die logische Adressierung durch IP Adressen auf Diese wird von den Transportprotokollen TCP und UDP verwendet um Verbindungen zwischen bestimmten Anwendungen bereit zustellen Auf der obersten Ebene befinden sich schlie lich die Anwendungsproto kolle das hei t die Sprachen in denen Clients und Server miteinander kommunizieren Die meisten Internet Anwendungsprotokolle sind klartextbasiert was Entwicklern und Administratoren die Fehlersuche enorm vereinfacht Der zweite Abschnitt f hrte das grundlegende Handwerkszeug zum Schreiben von Netzwerkanwendungen ein die Sockets genauer gesagt die verschiedenen von BasicSocket abgeleiteten Klassen In der Praxis sind die wichtigsten TCPSocket f r allgemeine TC
329. ine beliebige Ziffer einer der Buchstaben f g h i j k 1 oder m Ein weiteres Beispiel ist die folgende Verkn pfung mehrerer Bereiche die alle zul s sigen Ziffern einer Hexadezimalzahl umfasst wobei die Buchstaben A bis F vor sichtshalber sowohl in Gro schreibung als auch in Kleinschreibung vorkommen 0 9A Fa f Wenn Sie innerhalb der eckigen Klammern als erstes Zeichen ein setzen bedeutet das dass an der entsprechenden Stelle ein beliebiges Zeichen aufser den angegebe 14 Das liegt daran dass die Pr fziffer durch eine Modulo 11 Operation das hei t den Rest der Division durch 11 gebildet wird Der m gliche Rest 10 wird dabei durch das X dargestellt Seit Anfang 2007 gibt es brigens neue dreizehnstellige ISBN Nummern aber noch werden beide Systeme nebeneinander verwendet Mustervergleiche mit regul ren Ausdr cken 89 nen stehen soll Das Folgende steht beispielsweise f r ein Zeichen aber keine Zif fer 0 9 Wenn an irgendeiner Stelle ein Zeichen stehen soll das kein Buchstabe und keine Ziffer ist k nnen Sie Folgendes schreiben 0 9A Za z Nat rlich k nnen Sie Zeichenmengen mit beliebigen anderen Regex Konstrukten mischen insbesondere mit den bereits gezeigten literalen Zeichenfolgen Ange nommen Sie m chten zwei Stellen nach einem ox als Hexadezimalzahl interpretie ren Dann lautet der regul re Ausdruck zur Pr fung der G ltigkeit der beiden hexadezimalen Ziffern mit den bisher
330. instieg einige der wichtigsten vorgefertigten Klassen und Objekte von Ruby verwenden Klassen zur Ein und Ausgabe f r Datum und Uhrzeit sowie f r einige andere Einsatzgebiete Im n chsten Kapitel erfahren Sie dann wie leicht es ist Ihre eigenen Programmentw rfe in Klassen und Objekten abzubilden Was ist Objektorientierung Einen ausf hrlichen Einstieg in den Entwurf von Ruby Klassen erhalten Sie im n chsten Kapitel in diesem geht es zun chst um die Nutzung vorgefertigter Ruby Elemente die als Klassen vorliegen Die wichtigsten Begriffe aus dem Bereich der Objektorientierung sollten Sie allerdings auch daf r bereits kennen Deshalb sehen Sie in Beispiel 3 1 ein Listing in dem Klassen und die Arbeit mit In stanzen dieser Klassen demonstriert werden Anhand dieses Beispiels werden an schlie end die wichtigsten Begriffe der objektorientierten Programmierung erl utert Beispiel 3 1 Ein kurzes Beispiel zur Erl uterung der OO Grundbegriffe rechteck rb 1 Klassendefinition Rechteck 2 class Rechteck 3 Konstruktor 4 def initialize b h 5 breite b 6 hoehe h 7 end 8 Methoden 9 def get_breite 10 breite 11 end 12 def get_hoehe 13 hoehe 14 end 15 def get_flaeche 16 breite hoehe 17 end 18 def get_diagonale 19 Math sqrt breite 2 hoehe 2 20 end 21 end 22 Klassendefinition Quadrat 23 abgeleitet von Rechteck 24 class Quadrat lt Rechteck 25 Geaenderter Konstruktor 26 def initial
331. irb einen String mit enthaltenem Zeilenumbruch untersuchen gt gt Hallo nWelt W gt 6 gt gt Hallo nWelt AW gt nil gt gt Hallo nWelt AH gt 0 Der regul re Ausdruck W trifft zu denn es gibt ein W an einem Zeilenanfang AW passt dagegen nicht weil das W nicht am Anfang des Strings selbst steht AH wird dagegen gefunden weil der String mit H anf ngt Eine weitere Bereichsmarkierung ist die durch b gekennzeichnete Wortgrenze Dabei kann es sich um Whitespace um String Anfang oder Ende sowie um Satz zeichen handeln So passt der Teilausdruck bals beispielsweise auf Regexp als Suchmuster aber nicht auf Ich habe Halsschmerzen Ebenso ist Tag b f r Guten Tag geeignet aber nicht f r Tageszeitung Das Gegenteil von einer Wortgrenze k nnen Sie mit B ausdr cken Dabei muss sich der entsprechende Teilausdruck innerhalb eines Wortes befinden So passt Beis beispielsweise auf Erdbeereis aber nicht auf Das Wetter ist eisig Mustervergleiche mit regul ren Ausdr cken 95 Modifizierer Mit Hilfe bestimmter Zeichen die hinter den letzten Slash eines regul ren Aus drucks gesetzt werden l sst sich dessen Wirkung modifizieren In Ruby sind drei solcher Modifizierer Modifier wichtig e i steht f r ignorecase und bedeutet dass die Gro und Kleinschreibung nicht mehr beachtet werden soll So liefert HALLO a beispielsweise kei nen Treffer w hrend HA
332. ise k nnen Sie das Pro gramm etwa als einfachen Taschenrechner nutzen Geben Sie als erstes Beispiel etwa Folgendes ein irb main 001 0 gt 3 7 gt 10 Auf diese Weise k nnen Sie beliebige Rechenausdr cke eingeben wobei die Grund rechenarten durch folgende Zeichen dargestellt werden Addition Subtraktion Multiplikation und Division Probieren Sie einfach ein paar M glichkeiten aus Hier einige unverbindliche Beispiele 14 Kapitel 1 Einf hrung irb main 002 0 gt 7 6 gt 42 irb main 003 0 gt 76 53 gt 23 irb main 004 0 gt 5 2 gt 2 Das Ergebnis der Division scheint allerdings nicht korrekt zu sein Das Problem besteht darin dass ganze Zahlen und Flie kommazahlen verschiedene Datentypen sind 2 ist das korrekte Ergebnis der ganzzahligen Division Versuchen Sie es f r die mathematisch korrekte L sung mit irb main 005 0 gt 5 0 2 gt 2 5 che gem der englischen Schreibweise mit einem Punkt statt y mit Komma geschrieben werden Es hei t also beispielsweise 2 5 statt 2 5 A Flie kommazahlen m ssen in Ruby wie in jeder Programmierspra Eine weitere interessante Entdeckung ist der Unterschied zwischen mathemati schen Ausdr cken und Textausdr cken Geben Sie dazu Folgendes ein irb main 006 0 gt 3 7 Ly 347 Das Ergebnis ist und bleibt der Text 3 7 es findet keine arithmetische Berech nung statt Hier noch eine interessante Abwandlung irb main 007
333. isses 42 puts Ergebnis z1 op z2 ergebnis 43 print Noch eine Berechnung j n 44 nochmal gets chomp 45 puts 46 break if nochmal n i 47 end Damit Sie noch einmal rekapitulieren k nnen was Sie in diesem Kapitel unter anderem gelernt haben folgen hier noch einmal die Erl uterungen zum Skript allerdings mit allen Fachbegriffen die zu Beginn des Kapitels vermieden wurden und die Sie nun kennengelernt haben Nach Ausgabe der berschrift Zeile 2 bis 4 l uft der eigentliche Rechner in einer Endlosschleife wird also immer wieder ausgef hrt Dazu dient der folgende Block Zeile 6 bis 47 loop do end Innerhalb der Schleife werden zun chst die beiden Zahlen vom Benutzer erfragt Zeile 7 bis 14 Das Ergebnis der Eingabemethode gets wird mit Hilfe der Methode to_f sofort in eine Flie kommazahl umgewandelt und dann in der Variable z beziehungsweise z2 abgelegt Beim eingegebenen Operator wird dagegen mittels chomp der Zeilenumbruch entfernt In Zeile 19 bis 29 erfolgen zwei Tests Wenn das Anti Matching per ergibt dass der eingegebene Operator keines der vier zul ssigen Zeichen oder ist Zeile 19 wird eine Fehlermeldung ausgegeben anschlief end wird mittels next 108 Kapitel 2 Sprachgrundlagen Zeile 22 der n chste Schleifendurchgang gestartet Als N chstes wird f r den Fall dass die Operation eine Division ist die unzul ssige 0 als zweiter Operand ausge schlo
334. itt erhalten Sie keine detaillierte Fehlermeldung an Ort und Stelle das hei t in diesem Fall im Browser Dieser gibt bei schwerwiegenden Fehlern besonders wenn keine Header vorhanden sind eine allgemeine Fehlerseite mit dem Status 500 Internal Server Error zur ck Bei gering f gigen Fehlern wird sogar einfach nur eine leere Seite angezeigt Ruby gibt die Fehlermeldungen wie gehabt aus allerdings nicht auf STDOUT wie die eigentliche Webseite sondern auf STDERR Apache wiederum schreibt alle STDERR CGl Skripten mit Ruby 291 Ausgaben in seine ErrorLog Datei Wo sich diese befindet steht in der gleichnami gen Apache Konfigurationsdirektive in der Regel handelt es sich um die Datei error log oder error_log im Unterverzeichnis logs der Apache Konfiguration Ein typischer Windows Pfad w re also beispielsweise C Programme Apache Software Foundation Apache2 2 logs error log unter UNIX k nnte er dagegen etwa usr local apache2 logs error_log lauten Um sich einen solchen Logeintrag anzusehen k nnen Sie zum Beispiel folgendes CGI Skript mit einem kleinen Fehler im Browser testen usr bin ruby w puts Content type text html puts pits lt html gt lt html gt ffnen Sie Ihre ErrorlLog Datei zum Lesen und betrachten Sie die letzte Zeile Sie d rfte ungef hr wie folgt lauten Thu Dec 28 19 14 35 2006 error client 127 0 0 1 C Programme Apache Software Foundation Apache2 2 htdocs fehler rb 4 undefined me
335. ittelt die Kombination aus Interpret Album und Erscheinungsjahr Zugriff auf Datenbanken 323 result conn query SELECT int_name cd_ titel cd_jahr FROM interpreten cds WHERE int_nr cd_interpret Die erste Methode von result die Sie aufrufen sollten ist num_rows Sie liefert die Anzahl der Ergebnisdatens tze zur ck Wenn sie O ist entsprach kein Datensatz Ihrer Abfrage Zum Beispiel if result num_rows gt O Ergebnis ausgeben else puts Keine Datensaetze gefunden end Zum Auslesen der Ergebnisse kommen vor allem zwei Methoden in Frage e fetch_row liest einen Datensatz als nummeriertes Array aus Die Reihenfolge der Felder innerhalb einer Ergebniszeile entspricht den Angaben in Ihrer Abfrage bei alle Felder wird die Reihenfolge der Tabelle selbst gew hlt e fetch_hash liest ebenfalls genau einen Datensatz aus Der einzige Unterschied besteht darin dass Sie einen Hash zur ckerhalten in dem die Spaltennamen aus den Datenbanktabellen die Schl ssel bilden Beide Methoden lassen sich idealerweise innerhalb der Bedingung einer while Schleife platzieren um alle Datens tze nacheinander auszulesen Hier ein Beispiel f r den Einsatz von fetch_row while line result fetch_row printf s von s i n line 1 line o line 2 end Das m sste folgende Ausgabe liefern Seventh Son Of A Seventh Son von Iron Maiden 1988 The Number Of The Beast von Iron Maiden 1982 Led Zeppelin IV von
336. ize b 27 super b b 28 end 29 end 30 Anwendungsbeispiele 31 r Rechteck new 20 10 32 printf Rechteck Breite d n r get_breite 33 printf Hoehe d n r get_hoehe 34 printf Flaecheninhalt d n r get_flaeche 35 printf Diagonale 3f n r get_diagonale 36 puts 37 q Quadrat new 20 38 printf Quadrat Kantenlaenge d n q get_breite 39 printf Flaecheninhalt d n q get_flaeche 40 printf Diagonale 3f n q get_diagonale 112 Kapitel3 Ruby Klassen Wenn Sie dieses Skript ausf hren erhalten Sie folgende Ausgabe gt ruby rechteck rb Rechteck Breite 20 Hoehe 10 Flaecheninhalt 200 Diagonale 22 361 Quadrat Kantenlaenge 20 Flaecheninhalt 400 Diagonale 28 284 In diesem Beispiel sind Rechteck und Quadrat zwei Klassen Sie legen die Datenstruk tur und das Verhalten von Objekten fest die diese Formen beschreiben Diese Ver kn pfung von Daten und ihren Verarbeitungsmethoden ist eines der wichtigsten Ziele der Objektorientierung das als Kapselung bezeichnet wird Die Klasse Rechteck Zeile 2 21 besitzt f nf Methoden das hei t Funktionen zur Verarbeitung von Rechteck Objekten Die erste Methode initialize ist der so genannte Konstruktor der Klasse Er wird aufgerufen sobald ein neues Objekt der Klasse erzeugt wird und dient in der Regel dazu der Datenstruktur des Objekts ihre Anfangswerte zuzuweisen Beim Rechteck sind die relevanten Daten Breite und H he die bei der Objekterzeugung b
337. k musiker doesn t exist SOL Zustand 42502 Sobald Sie die MySQL Verbindung nicht mehr ben tigen sollten Sie sie schlie en conn close Beispiel Eine erg nzbare CD Tabelle Als zusammenh ngendes CGI Skript das Gebrauch von einer Datenbankverbin dung macht sehen Sie in Beispiel 6 2 eine Anwendung die die vorhandenen Musik CDs anzeigt und die Eingabe einer neuen CD erm glicht Der gr te Teil des Codes wird in den Kommentaren erl utert Abbildung 6 4 zeigt das Skript im Einsatz Zugriff auf Datenbanken 325 Ruby n Roll Mozilla Firefox Datei Bearbeiten Ansicht Chronik Lesezeichen Extras Hilfe E i EI tp itocalhost musikab rb interpret Metalicatitel Ride The Lightningejahr 19648tracks 9 Erste Schritte B Aktuelle Nachrichten Die Ruby Rockmusikdatenbank Interpret Albumtitel Tracks Extreme Pornograffitti 13 Eintragen Anthrax Among The Living 3 Iron Maiden Seventh Son Of A Seventh Son Iron Maiden The Number Of The Beast Led Zeppelin Led Zeppelin IV Metallica Master Of Puppets Metallica Ride The Lightning Pink Floyd Dark Side Of The Moon Abbildung 6 4 Datenbankbasierte CGI Anwendung die Rock Tabelle Beispiel 6 2 Die interaktive Musik CD Tabelle musikdb rb 1 C ruby bin ruby exe w 2 Bibliotheken importieren 3 require cgi 4 require rubygems 5 require mysql 6 CDs auslese
338. kgeliefert wird dieses Verfahren entspricht dem mathematisch korrekten Runden Weitere Operationen Ruby kennt noch einige weitere Operationen die hier kurz vorgestellt werden Die Wertzuweisung an Variablen war bereits Thema Dazu wird der Operator ver wendet Da der Ausdruck hinter dem Gleichheitszeichen zuerst komplett ausgewer tet wird kann auch die Variable selbst darin vorkommen in diesem Fall wird ihr bisheriger Wert in den Ausdruck eingesetzt Zum Beispiel gt gt zahl 3 gt 3 gt gt zahl zahl 1 gt 4 Genau f r diese direkte Manipulation des bisherigen Variablenwerts gibt es Kurz schreibweisen die aus dem jeweiligen Operator und einem angeh ngten Gleich heitszeichen gebildet werden Das naheliegendste Beispiel sind die arithmetischen Operatoren Statt zahl zahl 1 k nnen Sie auch Folgendes schreiben zahl 1 Probieren Sie mit einer bereits definierten Variablen zum Beispiel auch folgende Varianten aus zahl 7 bisherigen Wert um 7 vermindern zahl 3 mit 3 multiplizieren zahl 2 durch 2 teilen Dasselbe funktioniert auch mit den Bit Operatoren 8 lt lt und gt gt 60 Kapitel 2 Sprachgrundlagen Die normalerweise arithmetischen Operatoren und besitzen nebenbei noch eine besondere Bedeutung f r Strings Mit k nnen Sie Strings aneinanderf gen Zum Beispiel gt gt Ruby on Rails gt Ruby on Rails Dasselbe geht nat rlich auch mit Va
339. kommen Am besten pro bieren Sie sie am sprichw rtlichen verregneten Sonntagnachmittag alle einmal aus Das Pipe Zeichen repr sentiert alternative Bereiche meist innerhalb runder Klammern um sie vom Rest abzugrenzen Netzwerk System administrator steht beispielsweise f r Netzwerkadministrator oder Systemadministrator 96 Kapitel 2 Sprachgrundlagen Zu den bereits genannten Elementen die mit und einem Buchstaben gebildet wer den kommen noch folgende hinzu e d steht f r eine beliebige Ziffer ist also eine Kurzfassung f r 0 9 Das Gegen st ck D stellt ein Zeichen dar das keine Ziffer ist genau wie 0 9 Damit l sst sich etwa die weiter oben vorgestellte ISBN verk rzt als d d 5 d 3 dX schreiben w trifft auf jedes Zeichen zu das in einem g ltigen Ruby Bezeichner stehen darf Buchstabe Ziffer oder Unterstrich also 0 9A Za z_ W passt entspre chend auf ein Zeichen das nicht zu dieser Gruppe geh rt e s passt auf ein beliebiges Whitespace Zeichen also auf ein Leerzeichen einem Tabulator oder einen Zeilenumbruch Jedes Nicht Whitespace Zei chen wird dagegen durch s beschrieben Daneben gibt es einige Konstrukte in der Form Klasse Es handelt sich dabei um die sogenannten POSIX Zeichenklassen die zum Regex Vokabular klassischer UNIX Kommandos wie grep geh ren Unter anderem sind folgende definiert e alnum alphanumerisches Zeichen Ziffer oder Buchstabe ents
340. ktaler Zeichencode oxnn hexa dezimaler Zeichencode usw e Eingebettete Ausdr cke werden ausgewertet und in den String geschrieben Belie biger Text beliebig komplexer Ausdruck Text Zahlen e Dezimale Ganzzahlen Fixnum 100 3 0 1024 e Beliebig gro e Ganzzahlen Bignum 100000000000 5 10 100 e Optionales Tausendertrennzeichen _ 1_000_000 1000000 e Oktale Ganzzahlen Onnn Z B 0333 219 e Hexadezimale Ganzzahlen Oxnnnn Z B OxABC 2748 Flie kommazahlen Float 3 5678 2 0 0 0 1 4567 e Wissenschaftliche Schreibweise f r Flie kommazahlen n nnnnE nnn n nnnn 10 nnn Z B 3 21e 7 1 9876e 9 e Zeichencode Zeichen Z B A 65 31 63 Bereiche Ranges e Anfang Ende schlie t Ende ein 0 4 0 1 2 3 4 ae a b Eis d e Anfang Ende schlie t Ende aus 0 4 0 1 2 3 e a i a b c Sonstige e true wahre logische Aussage e false false logische Aussage e nil leeres Element e abc Symbol eindeutiges Element ohne konkreten Wert 358 Anhang A Ruby Kurzreferenz Variablen Variablen sind benannte Speicherpl tze Deklaration und Wertzuweisung var Ausdruck var kann danach in Ausdr cken statt eines Literals eingesetzt werden Allgemeines e Variablennamen beginnen mit Kleinbuchstaben Z B test test test123 e Gro buchstaben kennzeichnen Konstanten deren Wert sich nach Definition nicht mehr nder
341. ktionsdatenbank aber zum Ausprobieren soll erst einmal ein gemeinsames Konto gen gen Die folgenden Zeilen legen einen User namens rock_user mit dem Passwort rockonrails an der vol len Zugriff auf alle drei Datenbanken besitzt mysql gt create user rock_user localhost identified by rockonrails mysql gt grant all on rock_n_roll_development to rock_user localhost mysql gt grant all on rock_n_ roll_test to rock_user localhost mysql gt grant all on rock_n_roll_production to rock_user localhost Realistische Anwendung Eine Online Rock n Roll Datenbank 343 Anschlie end sollten Sie die MySQL Benutzerdaten aktualisieren damit diese nderungen wirksam werden mysql gt flush privileges Jetzt k nnen die Tabellen erstellt werden die das Model der Anwendung bilden sollen Im Gegensatz zum Beispiel aus dem vorigen Kapitel werden hier konsequent englische Namen verwendet Das liegt daran dass Rails bei Beziehungen zwischen Tabellen automatisch den Plural beziehungsweise Singular englischer Standardw r ter bildet one band has many albums oder formaler band has_many albums bis hin zu eingebauten Ausnahmen wie person lt gt people Wenn Sie deutsche oder sehr seltene englische Namen verwenden m chten m ssen Sie die Pluralregeln einzeln in config environment rb angeben Zun chst brauchen Sie nur in der Entwicklungs Datenbank Tabellen W hlen Sie diese als Standarddatenbank aus mysql gt use rock_n_ro
342. l um die Umbr che zwar darzustellen aber nicht in den Feldtext zu ber nehmen Das folgende Beispiel erzeugt ein 40 Zeichen breites und sieben Zeichen hohes Feld namens meinung cgi textarea meinung cols gt 40 rows gt 7 wrap gt virtual Falls Sie einen Block mit Text einf gen wird dieser zwischen lt textarea gt und lt textarea gt gesetzt und somit als Vorgabetext in den Textbereich eingetragen Zum Beispiel cgi textarea meinung cols gt 40 rows gt 7 wrap gt virtual Ihre Meinung hier Radio Button Gruppen Diese Steuerelemente haben Sie bereits im Einf h rungsbeispiel gesehen Es handelt sich um mehrere Optionsschalter von denen Sie genau einen ausw hlen k nnen Die allgemeine CGI Syntax daf r lautet cgi radio_group Gruppenname Feldwert1 Beschriftung1 Feldwert2 Beschriftung2 Wenn Sie die Beschriftung eines Buttons den zweiten Parameter im jeweiligen Array weglassen wird der interne Wert auch als Beschriftungstext verwendet Optional k nnen Sie bei einem der Buttons als dritten Parameter true einset zen damit dieser Button vorausgew hlt wird Das folgende Beispiel erzeugt eine Gruppe von Radio Buttons zur Auswahl der Lieblingsprogrammiersprache wobei Ruby nat rlich vorausgew hlt ist cgi radio_group lieblingssprache ruby Ruby lt br gt true perl Perl lt br gt java Java lt br gt php PHP lt br
343. l Adressen fallen auch unter die 5 ses letzte else Sie werden automatisch durch das rescue im n chsten Schleifendurchlauf abgefangen Zeile 154 156 Wenn die Eingabe keine Zahl ist wird sie als normale URL bernommen und nach dem oben beschriebenen Schema im nachfolgenden Schleifendurchlauf verarbeitet Anregung Spendieren Sie dem Textbrowser eine Bookmark Verwaltung Durch Eingabe von b Stichwort soll die zuletzt geladene Seite unter dem gew nschten Stichwort in der Bookmark Datei gespeichert werden Mit g Stichwort soll das betreffende Bookmark sp ter wieder aufgerufen werden schlie lich soll eine sei tenweise Liste der verf gbaren Bookmarks in der Form Stichwort URL anzeigen Prozesse und Threads Bereits in der Socket Einf hrung wurde darauf hingewiesen dass praxistaugliche TCP Server einen Mechanismus ben tigen um mehrere Client Anfragen gleichzei tig zu bearbeiten Auch andere Aufgaben lassen sich hervorragend parallelisieren beispielsweise k nnten Sie im Hintergrund automatisch einen Index der Texte erstellen die Sie im Vordergrund eingeben In diesem Abschnitt erfahren Sie wie Sie Ruby dazu bringen mehrere Arbeitsabl ufe im schnellen Wechsel zu erledigen Der Fachbegriff f r Anwendungen die dies k nnen hei t Nebenl ufigkeit oder auch Gleichzeitigkeit auf Englisch concurrency Neue Prozesse erzeugen und steuern Beachten Sie zun chst dass ein Computer Aufgaben nur dann wirklich gleichzeitig er
344. le bekanntlich id hei en muss Die verschiedenen Felder schlie lich stehen einfach als Methoden der gefundenen Instanz zur Verf gung 348 Kapitel 7 Ruby on Rails Starten Sie f r den n chsten Versuch scripts console gt ruby script console Loading development environment Geben Sie folgenden Code ein um eine Liste aller Bands mit ihren IDs Namen und L ndern zu erhalten gt gt Band find all each b gt puts b id b name b country gt gt Metallica USA Iron Maiden United Kingdom Die Aerzte Germany Led Zeppelin United Kingdom Die Toten Hosen Germany 6 Extreme USA vvpw6h9jeo Das Symbol all kann statt einer konkreten ID verwendet werden um alle Daten s tze auszulesen Zum Schluss sollten Sie einige Alben anlegen Auch f r die Neuerstellung von Datens tzen gibt es eine einfache Vorgehensweise Klasse create attr1 gt Wert attr2 gt Wert Das Einf gen von Datens tzen ist mit anderen Worten nur noch ein Ruby Metho denaufruf Mit der nummerierten Bandliste ist nun auch bekannt welche Band zu welchem Album eingegeben werden muss Legen Sie also los Zum Beispiel gt gt Album create title gt Die Bestie in Menschengestalt gt release_year gt 1993 band_id gt 3 Wenn Sie einen Fehler machen k nnen Sie zum Beispiel die Methode update_ attribute eines Datensatz Objekts aufrufen um ihn zu beheben Die ben tigten Attribute sind Feld
345. le URL Eingabe uebernehmen 56 url newurl 57 end 58 end Starten Sie den kleinen Browser und geben Sie eine beliebige URL ohne http N ein Bei einem reinen Hostnamen ohne Ressourcenteil etwa www rubygarden org wird automatisch ein f r die absolute Startseite angef gt Nun wird die Seite gela den und Sie k nnen mit Enter seitenweise vorw rts bl ttern oder die Anzeige mit Q und Enter vorzeitig beenden Nach dem eigentlichen Seitentext wird eine Liste aller verf gbaren Links angezeigt An dieser Stelle haben Sie drei verschiedene Ein gabem glichkeiten e Die Nummer eines der Hyperlinks e Eine neue URL e Q zum Beenden des Programms In Abbildung 5 4 sehen Sie als Beispiel die erste und die letzte Bildschirmseite das Ende der Linkliste nach Eingabe der URL www oreilly de Hier die bliche Beschreibung der einzelnen Arbeitsschritte des Skripts e Zeile 1 2 Import der ben tigten Bibliotheken Neben net http aus der Stan dardbibliothek wird der weiter oben beschriebene Pager wrappager rb impor tiert diese Datei muss sich dazu im selben Verzeichnis befinden wie httpclient rb selbst e Zeile 4 18 Die Methode parse_url wird zum Zerlegen von Anfrage URLs bereitgestellt Sie erwartet als Argument einen String mit folgendem Schema Host Port Pfad der Ressource Web Clients mit Net HTTP 251 Eingabeaufforderung ruby httpcli KL gt www oreilly de ole von www oreilly de reilly de
346. ledigen kann wenn er mehrere Prozessoren besitzt Dennoch sind Sie es von einem modernen PC gewohnt dass viele Programme nebeneinander ausgef hrt werden Sie k nnen problemlos zur selben Zeit eine Datei herunterladen eine E Mail schreiben und nat rlich diverse Serverdienste zur Verf gung stellen Wenn Sie sich einen berblick verschaffen m chten was auf Ihrem Computer alles los ist k nnen Sie unter Windows den Task Manager aufrufen Klicken Sie dazu mit der rechten Maustaste auf die Taskleiste und w hlen Sie Task Manager Auf der Registerkarte Anwendungen werden nur wenige Desktop Programme angezeigt eine Vorstellung von den wirklichen Verh ltnissen liefert erst die Registerkarte 256 Kapitel 5 Netzwerkanwendungen Prozesse Ein Prozess ist eine von vielen Aufgaben zwischen denen Ihr Betriebssys tem permanent hin und herwechselt Auf einem Linux System k nnen Sie sich die Prozessliste anzeigen lassen indem Sie auf der Konsole ps aux eingeben Senden Sie die Ausgabe am besten durch eine Pipe an less da die Aus gabe h chstwahrscheinlich mehrere Seiten umfasst Bei anderen UNIX Varianten lautet das korrekte Argument f r die 8 vollst ndige Prozessliste m glicherweise nicht aux Geben Sie evena v tuell man ps ein um nachzulesen wie Ihre lokale ps Variante funktio niert Der Ruby Interpreter der eines Ihrer Skripten ausf hrt ist selbstverst ndlich auch ein Prozess und sollte in der erw hnte
347. len gespeichert Die allgemeine Syntax f r eine Klasse mit Konstruktor sieht so aus class Klassenname def initialize parameter1 parameter2 instanzvariable1 parameter1 Eh end end 2 Viele andere Programmiersprachen verwenden daf r das umst ndlichere Konstrukt this Variablennane Klassen entwerfen und implementieren 167 Eine Instanz einer solchen Klasse wird mit Hilfe des folgenden Aufrufs erzeugt den Sie bereits im vorigen Kapitel f r Ruby Standardklassen kennengelernt haben instanz Klassenname new argument1 argument2 Betrachten Sie beispielsweise noch einmal den Konstruktor der Klasse Lok aus dem Einf hrungsbeispiel class Lok Konstanten Grundzustand Konstruktor def initialize typ OHNE typ typ end Methoden Hs end Wie Sie sehen enth lt eine Lok Instanz nur eine Instanzvariable namens typ die angibt wie viele Waggons die Lokomotive ziehen kann Der Anfangswert wird aus der Parametervariablen typ des Konstruktors gelesen Wenn die Konstruktordefini tion einfach def initialize typ typ typ end lauten w rde w ren Sie gezwungen bei der sp teren Instanzerzeugung oder Instanziierung auf jeden Fall einen Wert anzugeben Der vorliegende Konstruktor nutzt aber eine n tzliche Eigenschaft von Ruby Methoden einen Standardwert f r einen Parameter Dieser wird per normaler Wertzuweisung notiert und kommt zum Einsatz wenn der entsprechende Wert beim Aufruf der Meth
348. lerdings die Sicherheit und Stabilit t des Servers so dass Sie die Voreinstellungen beibehalten sollten falls Sie nicht ganz genau wissen was Sie tun ServerRoot Diese Direktive gibt das Apache Installationsverzeichnis an in der Regel wurde es beim Installationsprozess bereits richtig eingestellt Zum Beispiel ServerRoot usr local apache2 Listen Diese Direktive stellt den TCP Port ein an dem Apache lauscht Wie im vori gen Kapitel beschrieben hat das HTTP Protokoll den Standardport 80 in der Regel steht hier also Folgendes Listen 80 Falls Apache noch an anderen Ports lauschen soll etwa 443 f r gesicherte SSL Verbindungen werden weitere Listen Direktiven ben tigt LoadModule Zum dynamischen Laden gew nschter DSO Module m ssen Sie LoadModule verwenden Die Syntax lautet LoadModule xxx_module modules mod_xxx so Das erste Argument ist die allgemeine Modulbezeichnung das zweite der Pfad der Moduldatei Letzterer kann wie hier relativ zur ServerRoot oder auch absolut sein Das folgende Beispiel l dt das Modul mod_autoindex zur automati schen Erzeugung von Verzeichnis Indizes LoadModule autoindex_module modules mod_autoindex so 280 Kapitel 6 Klassische Webanwendungen ServerAdmin Hier sollte bei ffentlichen Webservern die E Mail Adresse des Administrators meist webmaster lt Ihre Domain gt angegeben werden Wenn der Apache automatisch Seiten erzeugt vor allem f r Fehlermeldungen wie Seite nicht gef
349. lich sinnlose Text t jetzt ausgegeben sondern der Wert von jetzt das hei t Datum und Uhrzeit puts Wie heissen Sie Eine weitere einfache Textausgabe name gets gets liest eine Zeile normalerweise von der Tastatur Dabei wird das Ergebnis also die Benutzereingabe in name gespeichert Der Zeilenumbruch der durch das Dr cken von Enter entsteht wird dabei mit gespeichert Das ist in der Regel wie auch hier nicht erw nscht und wird im n chsten Schritt ge ndert 20 Kapitel 1 Einf hrung name chomp chomp entfernt einen Zeilenumbruch am Ende eines Texts puts Hallo name Auch hier wird der zuvor vom Benutzer eingegebene Wert von name in den statischen Text eingef gt und dann ausgegeben Zusammenfassung Der Anfang ist gemacht Nachdem Sie etwas Hintergrundwissen zu Ruby erhalten haben ist der Interprter auf Ihrem Rechner installiert Danach haben Sie irb ken nen gelernt eine interaktive Umgebung in der Sie einzelne Ruby Kommandos ein geben k nnen und sofort Feedback erhalten Zum Schluss haben Sie Ihr erstes vollst ndiges Skript eingegeben und mit Hilfe des Ruby Interpreters ausgef hrt Sie sind nun also bereit die wichtigsten Merkmale der Programmiersprache Ruby Schritt f r Schritt kennen zu lernen Lesen Sie weiter und Sie erfahren zun chst alles ber ihre Grundbausteine Bei einer nat rlichen Sprache w rde man sagen Sie erlernen nun die Grundlagen von Rechtschreibung Zeichensetzun
350. lige Lokomotiventyp ziehen kann Wenn eine der beiden Lokomotiven nicht dabei ist hat diese Position den Typ OHNE mit 0 m glichen Waggons e Zeile 7 8 Die beiden globalen Variablen werden definiert und erhalten ihre Anfangswerte loks enth lt eine Elektro und eine Diesellok die insgesamt 90 156 Kapitel 4 Eigene Klassen und Objekte erstellen Waggons schaffen waggons die Anzahl der bereits am Zug h ngenden Wag gons ist anfangs 0 Zeile 11 20 Die Methode anhaengen versucht die globale Variable waggons um die als Parameter bergebene Anzahl waggons zu erh hen Dazu wird die gesamte Anzahl mit der Gesamtkapazit t beider Lokomotiven verglichen Wenn der Wert im Rahmen liegt wird waggons erh ht und die Methode gibt true zur ck Andernfalls geschieht nichts und der R ckgabewert ist false Zeile 22 31 abhaengen funktioniert genau wie anhaengen nur dass waggons diesmal vermindert wird sofern eine entsprechende Mindestanzahl an Wag gons vorhanden ist Zeile 33 35 Die Methode lok_aendern erwartet eine Lokomotivnummer das hei t O oder 1 sowie einen Loktyp eine der Konstanten Das entsprechende Element von loks wird auf den angegebenen Wert gesetzt Anregung Diese Methode implementiert keinerlei Fehlerkontrolle Wie k nnte man sie so erweitern dass sie als Loknummer wirklich nur 0 oder 1 und als Typ nur eine der Waggonanzahl Konstanten akzeptiert Was sollte die Methode zur ckgeben wenn die bergebenen Wer
351. liothek auf sichere Weise require rubygems require uuid Wenn Sie selbst n tzliche Ruby Erweiterungen geschrieben haben k nnen Sie sie der Ruby Gemeinde auch ber rubygems zur Verf gung stellen Eine ausf hrliche Anleitung ber dieses und viele andere rubygems Themen finden Sie unter http rubygems org Der MySQL Zugriff ber die Bibliothek mysql erfordert zun chst die passenden require Anweisungen require rubygems require mysql Anschlie end k nnen Sie den Konstruktor der Klasse Mysql aufrufen um eine Ver bindung zum Datenbankserver herzustellen Die notwendigen Parameter sind Host Benutzername und Passwort Das folgende Beispiel stellt eine Verbindung mit den Rechten des weiter oben erstellten Benutzers dbuser her conn Mysql new localhost dbuser geheim Anschlie end sollten Sie eine Standarddatenbank w hlen mit der gearbeitet wer den soll Andernfalls m ssten Sie st ndig Datenbank Tabelle schreiben Dies geschieht mit Hilfe der Methode select_db Die Datenbank musik auf die der Benutzer dbuser zugreifen darf wird beispielsweise wie folgt ausgew hlt conn select_db musik Nun l sst sich die Verbindung ganz einfach f r Datenbankabfragen verwenden So genannte Auswahlabfragen mit SELECT die Datens tze zur ckliefern sollten Sie einer Variablen zuweisen Diese hat den Datentyp Mysql Result und enth lt ver schiedene Methoden zum Auslesen des Ergebnisses Das folgende Beispiel erm
352. ll wenn sie noch nicht existiert diese Konstanten sind allerdings stark plattformabh ngig und werden deshalb in diesem Buch nicht weiter behandelt Optional k nnen Sie als drittes Argument die Rechte der Datei angeben nur unter UNIX Dateirechte bestehen aus einer dreistelligen Oktalzahl die Stel len beschreiben von links nach rechts die Rechte des Dateieigent mers der Dateigruppe und aller anderen Benutzer Jede Stelle setzt sich dabei aus einer Summe von Bits mit folgenden Bedeutungen zusammen 4 lesen 2 schrei 126 Kapitel 3 Ruby Klassen ben 1 ausf hren 0755 ist zum Beispiel typisch f r Programme und Skripten denn es bedeutet dass der Eigent mer alles mit der Datei tun darf w hrend die restlichen User sie lesen und ausf hren d rfen Das folgende Beispiel ffnet die Datei test txt im aktuellen Verzeichnis zum Lesen und verwendet daf r eine Referenzvariable namens file file File new test txt r Ein gleichwertiges Synonym f r File new ist File open diese A Schreibweise macht es gerade bei Datei Leseoperationen klarer dass u die Datei nicht neu erzeugt sondern lediglich ge ffnet wird Wenn Sie open verwenden k nnen Sie sogar das File weglassen weil die globale Methode open ebenfalls eine Datei ffnet Somit bewirken die drei folgenden Anweisungen genau dasselbe sie ffnen die Datei test txt zum Lesen f File new test txt r f File open test txt r f open
353. ll_development Die beiden Tabellen sollen bands und albums hei en Eine Band wird dabei durch ihren Namen und ihr Herkunftsland charakterisiert ein Album durch Titel Erscheinungsjahr und Band Letzteres ist eine Relation mit einem Datensatz in bands Da eine Band beliebig viele Alben produzieren kann handelt es sich um eine so genannte 1 n Relation Die Rails Konventionen gehen davon aus dass jede Tabelle einen Prim rschl ssel namens id besitzt und dass ein Feld mit Bezug auf eine andere Tabelle einen Namen nach dem Schema andereTabelle_id erh lt Geben Sie kurz gesagt folgenden SQL Code ein um die Tabellen anzulegen mysql gt create table bands gt id int auto_increment primary key gt name varchar 40 gt country varchar 40 gt mysql gt create table albums gt id int auto_increment primary key gt title varchar 40 gt release_year date gt band_id int gt Verlassen Sie den MySQL Client nach diesen Eingaben oder geben Sie vorher ein paar Testdaten ein wenn Sie m chten Schon bald werden Sie allerdings auch ein praktisches Web Interface zur Datenpflege erhalten Nun ist es Zeit die Datei config database yml in einem Texteditor zu ffnen und die Datenbank Verbindungsparameter einzugeben Die Datei ist im YAML Format geschrieben Es handelt sich dabei um eine sehr einfache Sprache zur Darstellung 344 Kapitel 7 Ruby on Rails verschiedener Datenstrukturen in Textform Das Format
354. lle Systemzeit Klassenreferenz 369 Klassenmethoden t t Time now Synonym f r Time new Time parse string versucht ein g ltiges Datum aus string zu extrahieren Instanzmethoden year vierstellige Jahreszahl month Monat numerisch 1 12 day Tag im Monat 1 31 wday numerisch codierter Wochentag 0 So 1 Mo 6 Sa hour Stunde 0 23 min Minute 0 59 sec Sekunde 0 59 strftime format formatiert Datum und Uhrzeit gem Formatstring Eine Liste der Platzhalter finden Sie in Kapitel 3 eb seh ek ch echt echt Hehe eE 370 Anhang A Ruby Kurzreferenz ANHANG B Ressourcen und Tools Essen vertreibt den Hunger Lernen vertreibt die Dummheit Chinesisches Sprichwort In diesem Anhang werden einige B cher und Websites empfohlen die Ihnen helfen mehr Ruby zu lernen sowie zus tzliche Informationen ber Themen zu erhalten die in diesem Buch nebenher angesprochen wurden B cher Zuerst werden einige B cher zu Ruby und Rails aufgelistet danach geht es um Objektori entierung im Allgemeinen Servertechnologien und mehr Ruby und Ruby on Rails e Dave Thomas Andy Hunt et al Programming Ruby The Pragmatic Programmers Guide 2 Auflage 2004 Pragmatic Programmers Das ber hmte Pickaxe Book machte Ruby zum ersten Mal au erhalb Japans bekannt Die erste Auflage ist auf Englisch und Deutsch im Web verf gbar siehe den Abschnit
355. llen Sie am besten als Controller Actions die letztlich separate View Templates erzeugen 350 Kapitel 7 Ruby on Rails gt ruby script generate controller Album list table exists app controllers exists app helpers exists app views album exists test functional overwrite app controllers album _controller rb Ynaq Sie werden gefragt ob die bestehende Datei berschrieben werden soll Die Ant wortm glichkeiten sind Y ja n nein a alle weiteren berschreiben oder q Erzeugung abbrechen Im vorliegenden Fall sollten Sie Y w hlen P Bei sp teren Erweiterungen d rfen Sie auf keinen Fall mehr mit Y oder gar mit a antworten weil Sie sonst Ihren selbst erzeugten Code vernichten Aber wenn Sie jemals eine weitere Aktion hinzuf gen und die Datei album_controllers rb nicht ersetzen brauchen Sie nur die beiden Zeilen def Aktionsname end selbst zu schreiben die ansonsten automatisch erstellt w rden Erstellen Sie nun also die Controller Methoden zuerst list f r die Listenansicht Wenn Sie die Datei app controllers album_controller rb ffnen finden Sie dort die Klassendefinition mit den Methoden Stubs list und table class AlbumController lt ApplicationController def list end def table end end Erg nzen Sie list zu folgendem Gesamtcode die Active Record Methodenaufrufe sollten Ihnen nach den obigen Erl uterungen bekannt sein def list Listeninhalt privat erstellen bandlist lt ul gt
356. ls Host k nnen Sie einen Hostnamen oder eine IP Adresse des lokalen Rechners ange ben In diesem Fall reagiert der Server nur auf Anfragen ber diejenige Netzwerk schnittstelle zu der die angegebene Adresse geh rt Das ist beispielsweise n tzlich wenn Ihr Server nur im lokalen Netzwerk aber nicht ber eine Fernverbindung erreichbar sein soll Das folgende Beispiel erzeugt einen TCP Server Socket der auf Verbindungen ber Port 8000 mit der lokalen IP Adresse 192 168 0 4 wartet server TCPSocket new 192 168 0 4 8000 232 Kapitel 5 Netzwerkanwendungen Wenn Sie keinen Host angeben lauscht der Server am angegebenen Port auf allen verf gbaren Schnittstellen Hier ein Beispiel f r einen Server der an Port 8888 jeder Netzwerkverbindung lauscht server TCPSocket new 8888 Statt der Portnummer k nnen Sie auch den Namen eines Well Known Ports ver wenden Im Zweifelsfall k nnen Sie den betreffenden Port zun chst mit Hilfe der Socket Klassenmethode getservbyname testen Zum Beispiel gt gt Socket getservbyname ftp gt 21 Nachdem Sie einen Server Socket erzeugt haben lauscht er auf Client Verbindun gen Wenn eine eintrifft m ssen Sie die Methode accept des Sockets aufrufen Dar aufhin erhalten Sie einen zus tzlichen Socket zur Kommunikation mit dem Client bei der Ruby Implementierung geh rt er bequemerweise der Klasse TCPSocket an Der Server Socket lauscht dagegen weiter auf neue Verbindungen Damit diese
357. lten Sie wenn Sie im aktuellen Verzeichnis irb starten darin zun chst mit Hilfe der Anweisung require das Skript zug_oo rb importieren und anschlie Rend per puts die Eigenschaften eines neuen Lok Objekts ausgeben gt gt require zug_oo rb Ausgabe siehe oben gt gt puts Lok new Lok DIESEL gt Diesellok Kapazitaet 50 Waggons Eine Methode zum nachtr glichen ndern des Loktyps gibt es nicht A weil auch in der Realit t beispielsweise eine Dampflokomotive nicht y zu einer E Lok mutieren kann Auch bei der objektorientierten Fas sung k nnen Sie lediglich die an den Zug geh ngten Waggons wech seln Eines der Ziele der Objektorientierung ist es schlie lich Elemente und Sachverhalte aus der Realit t m glichst genau abzubil den Die eigentlich auch etwas realit tsfremde Entscheidung ein Lo Objekt mit dem Typ Lok OHNE zuzulassen also gewisserma en eine Lokomotive die nicht da ist folgt praktischen berlegungen Der Fall dass eine der Loks eines G terzugs nicht vorhanden ist kann auf diese Weise genauso behandelt werden wie jeder Loktyp Andernfalls m sste die Klasse Gueterzug diese beiden F lle selbst unterscheiden was umst ndlicher w re Objektorientierte Programmierung Eine praktische Einf hrung 161 Zeile 34 83 Die Klasse Gueterzug ist die Vorlage f r G terz ge mit ihrer Daten struktur Lokomotiven und Waggons sowie diversen nderungs und Aus kunftsmethoden Zeil
358. lut zuverl ssiger Datenstrom mit definierter Reihenfolge so dass sich ber eine TCP Verbindung beliebig gro e Datenmengen bertragen lassen UDP Pakete werden dagegen stets einzeln gesendet und der Sender k mmert sich nicht darum ob sie ihr Ziel erreichen Sie haben allerdings auch einen wichtigen Vorteil gegen ber TCP Da sie keine Sequenznummern Empfangsbest tigungen und weitere Datenstromlogik ben tigen ist der Anteil von Verwaltungsinformatio nen an den zu sendenden Gesamtdaten erheblich geringer so dass sich in derselben Zeit wesentlich mehr Informationen bertragen lassen dies allerdings nicht zuver l ssig Gemeinsam haben die beiden Protokolle das bereits erw hnte Konzept der Port nummern Das Portnummern Paar eines Datenpakets kennzeichnet eindeutig einen bestimmten Kommunikationskanal zwischen Absender und Empf nger Stellen Sie sich zur Verdeutlichung vor ein und derselbe Browser fordert in zwei Fenstern unterschiedliche Seiten vom gleichen Server an Der Webserver besitzt in beiden F llen die Portnummer 80 aber die Verwendung von zwei verschiedenen Client Ports erm glicht eine exakte Zuordnung Tabelle 5 1 zeigt einige Portnummern die blicherweise f r g ngige Serverdienste verwendet werden Die Spalte Transportprotokoll gibt Auskunft dar ber mit wel chem der beiden Transportdienste TCP oder UDP die jeweiligen Anwendungsda ten bertragen werden k nnen Die vollst ndige Liste aller offiziell registrie
359. m Namen der angegebenen Variablen zur Verf gung Auf diese Weise l sst sich beispielsweise das Programm mit den Primzahlen wesentlich pr gnanter schreiben for i in 1 100 Annahme i ist eine Primzahl prim true Potenzielle Teiler bis i 2 testen for j in 2 1 2 i durch j teilbar ifi j Keine Primzahl prim false Pruefschleife j vorzeitig verlassen break end end Ausgabe falls Primzahl print i if prim end Wie Sie sehen sind die Zuweisung des jeweiligen Anfangswerts und die Erh hung um 1 verschwunden Beides wird automatisch durch die for Anweisung geregelt Die for Schleife eignet sich auch hervorragend zur Bearbeitung aller Elemente eines Arrays Hier ein einfaches Beispiel sprachen w Ruby Perl PHP Java for s in sprachen puts Ich programmiere in s end Das ergibt nat rlich folgende Ausgabe Ich programmiere in Ruby Ich programmiere in Perl Kontrollstrukturen 83 Ich programmiere in PHP Ich programmiere in Java Wenn Sie die Elemente eines Hashes entsprechend bearbeiten m chten k nnen Sie dessen Eigenschaft keys zu Hilfe nehmen die nacheinander alle Schl ssel liefert tlds de gt Deutschland at gt Oesterreich ch gt Schweiz for t in tlds keys puts Die TLD t gehoert zu tlds t end Hier der Vollst ndigkeit halber das zu erwartende Ergebnis Die TLD de gehoert zu Deutschland Die TLD ch gehoert zu Schweiz Die TLD at
360. m die G l tigkeit regul rer Ausdr cke auf bestimmte Teile von Strings einzuschr nken stehen diverse Bereichsmarkierungen zur Verf gung Die wichtigsten sind f r den Anfang und f r das Ende des untersuchten Strings beziehungsweise einer Zeile Der regul re Ausdruck 0x 0 9a fA F passt auf alle Strings die an beliebiger Stelle eine Hexadezimalzahl enthalten Also zum Beispiel auf die Strings Der Wert ist OxABC oder OxFF0000 ist sattes Rot 94 Kapitel 2 Sprachgrundlagen Wenn Sie jedoch ox 0 9a fA F schreiben sind pl tzlich nur noch ganze Zeilen erlaubt die ausschlie lich aus einer Hexadezimalzahl bestehen Auf hnlich strenge Weise k nnten Sie etwa berpr fen ob eine Zeile ein g ltiger Ruby Bezeichner ist die Kriterien daf r wurden bereits weiter oben in diesem Kapi tel erl utert A Za z_ 0 9A Za z_ In Zeile 46 unseres Taschenrechner Beispiels wurde die Rechenschleife unterbro chen wenn die Antwort auf die Frage nach einem neuen Durchgang mit n beginnt break if nochmal n i Das i hinter dem letzten Slash ist brigens ein Modifier der Gro und Kleinschrei bung ignoriert Diesen und andere Modifier lernen Sie weiter unten genauer ken nen Noch strenger und in dieser Form eine Besonderheit von Ruby sind A und Z die auf jeden Fall den absoluten Anfang beziehungsweise das absolute Ende des jeweili gen Strings kennzeichnen Um das zu verdeutlichen sollten Sie in
361. m hinteren Ende an Die beiden obigen Beispiele k nnen Sie also k rzer schreiben gt gt wochentage 1 LS so gt gt quadratzahlen 1 gt 64 Eine praktische Methode um ein Array aus Strings zu erzeugen besteht brigens darin den Quoting Operator w zu verwenden wie bei q amp Co wahlweise mit Klammern oder identischen Umschlie ungszeichen Dadurch werden die durch Leerzeichen getrennten Zeichenfolgen zu Elementen des Arrays Zum Beispiel Variablen Ausdr cke und Operationen 49 gt gt jahreszeiten w Fruehling Sommer Herbst Winter gt Fruehling Sommer Herbst Winter Die interessantesten Array Operationen werden durch Methoden A bereitgestellt die es Ihnen erm glichen Elemente hinzuzuf gen oder o zu entfernen den Inhalt des Arrays zu sortieren und so weiter Die entsprechenden Methoden werden weiter unten im Abschnitt ber Methodenaufrufe vorgestellt Wie Sie alle Elemente eines Arrays in einer Schleife durchlaufen k nnen erfahren Sie dagegen in den Abschnitten ber einfache Schleifen beziehungsweise Iteratoren Hashes Ein Hash ist ein sehr hnliches Konstrukt wie ein Array Die Besonderheit besteht darin dass die Indizes keine fortlaufenden Nummern sondern beliebige Objekte sind meistens werden Strings oder Symbole verwendet sie werden oft als Schl ssel Keys statt als Indizes bezeichnet Auf diese Weise erm glichen Hashes Zuordnun gen diverser Wertepaare ohne gara
362. m m ssen Sie diese Zeile durch C ruby bin ruby exe 34 Kapitel 2 Sprachgrundlagen beziehungsweise Ihren entsprechenden Installationspfad ersetzen Sie k nnen sie aber auch einstweilen weglassen unter Windows wird sie erst zwingend erforder lich wenn Sie in Ruby CGI Programme f rs Web schreiben siehe Kapitel 6 Die automatische Ausf hrung nach UNIX Art ist dort jedenfalls ohnehin nicht m glich Hinter der Shebang Zeile wird h ufig der Schalter w angegeben Zum Beispiel usr bin ruby w Es handelt sich dabei um eine Kommandozeilenoption f r den Ruby Interpreter Sie besagt dass Warnungen aktiviert werden sollen Eine Warnung ist nicht direkt eine Fehlermeldung sondern ein Hinweis auf eine Ungenauigkeit oder unsauberen Programmierstil Gerade wenn Sie Ruby neu lernen sind die Warnungen also ber aus n tzlich Wenn Sie auf einer UNIX Plattform arbeiten sollten Sie es gleich ausprobieren Stellen Sie den beiden Beispielskripten aus dem ersten Abschnitt eine Shebang Zeile voran machen Sie sie mit chmod ausf hrbar und starten Sie sie ohne expliziten ruby Aufruf F r Windows gibt es noch eine einfachere M glichkeit auf den A Befehl ruby zu verzichten Nehmen Sie die Dateiendung rb in die u Umgebungsvariable PATHEXT auf indem Sie Start gt Systemsteuerung gt System gt Erweitert gt Umgebungsvariablen w hlen und den Wert dort anpassen Beachten Sie dass die nderung erst gilt sobald Sie eine neue
363. m post_match liefert entsprechend die Zeichen hinter dem Match gt gt m post_match gt Koeln Die Ruby Hilfe ri Wenn Sie Informationen ber Ruby Klassen Methoden oder Eigenschaften suchen k nnen Sie die Ruby Konsolendokumentation ri verwenden die Referenz in Anhang A dieses Buches ist f r einen ersten berblick auch n tzlich aber auf grund des beschr nkten Buchumfangs leider nicht einmal ansatzweise vollst ndig Die ri Beschreibungen sind englischsprachig ri befindet sich im bin Verzeichnis Ihrer Ruby Installation sollte also in jedem beliebigen Arbeitsverzeichnis funktio nieren wenn Sie Installationsanleitung in Kapitel 1 gefolgt sind ri ist sehr leicht zu bedienen Geben Sie einfach ri Schluesselwort ein um Informationen zum gew nschten Thema zu erhalten An dieser Stelle wer den exemplarisch die Schritte beschrieben um zu den Beschreibungen der Anwei sungen des allerersten Beispiels aus diesem Buch zu gelangen puts Hallo Welt jetzt Time new puts Es ist jetzt jetzt puts Wie heissen Sie 148 Kapitel 3 Ruby Klassen name gets name chomp puts Hallo name Die Vorgehensweise mag anfangs ein wenig verworren erscheinen aber mit etwas U bung wird sie klarer Die erste Anweisung ist puts Versuchen Sie also Ihr Gl ck mit gt ri puts Die Antwort besagt dass mehrere Klassen Methoden namens puts besitzen More than one method matched your request You can refine your
364. mal das Projektverzeichnis f r Kapitel 3 vor bereitet sascha linuxbox myruby gt mkdir kapitel3 Beachten Sie dass Sie auf einer UNIX Maschine nur innerhalb Ihres eigenen Home Verzeichnisses neue Verzeichnisse erstellen d rfen In anderen Bereichen des Datei systems darf dies nur der Superuser root Geben Sie su und das root Passwort ein wenn Sie vor bergehend als root arbeiten m ssen und exit sobald Sie damit fertig sind Als N chstes sollten Sie noch das Kommando kennen mit dem Sie sich den Inhalt des aktuellen Verzeichnisses ausgeben lassen k nnen Unter Windows hei t es dir gt dir Auf UNIX Rechnern lautet der Befehl dagegen 1s Wenn Sie die Option 1 hinzuf gen erhalten Sie ausf hrliche Informationen ber jede Datei beispielsweise den Eigent mer die Zugriffsrechte und die Gr e Is 1 Um den berblick zu behalten ist es manchmal n tzlich den Fensterinhalt zu l schen und den Prompt wieder nach links oben zu setzen Geben Sie dazu in der Windows Eingabeaufforderung Folgendes ein gt cls In den meisten UNIX Terminals lautet der Befehl dagegen clear Noch praktischer ist dass Sie bei fast allen UNIX Varianten einfach Strg L dr cken k nnen um denselben Effekt zu erzielen Tabelle 1 1 stellt die wichtigsten Konsolenbefehle f r beide Plattformen noch ein mal gegen ber wobei noch einige zus tzliche Anweisungen hinzukommen Ruby Code eingeben und ausf hren 13 Tabell
365. matisch das hei t unter 0 5 wird ab ansonsten aufgerun det gt gt 2 round gt 2 gt gt 2 49 round gt 2 gt gt 2 5 round gt 3 64 Kapitel 2 Sprachgrundlagen Es gibt keine eingebaute Funktion die auf eine bestimmte Anzahl A von Stellen hinter dem Komma rundet Wenn Sie diese M glichkeit y ben tigen multiplizieren Sie die Flie kommazahl einfach mit der Zehnerpotenz die der Anzahl der gew nschten Nachkommastellen entspricht Das Ergebnis k nnen Sie mit round runden AnschlieRend m ssen Sie wieder durch dieselbe Zehnerpotenz teilen aber diesmal als Flie kommazahl Das folgende Beispiel rundet eine Zahl nach diesem Verfahren auf zwei Stellen hinter dem Komma betrag 19 4879381 betrag betrag 100 round 100 0 puts betrag Das Ergebnis lautet erwartungsgem 19 49 Im bern chsten Kapi tel erfahren Sie wie Sie die Standardmethode round der Flie kom mazahlen um eine optionale Nachkommastellenzahl erweitern k nnen Auf viele weitere mathematische Methoden k nnen Sie ber die Standardklasse Math zugreifen Math sqrt Zahl liefert beispielsweise die Quadratwurzel Math log Zahl den nat rlichen Logarithmus und Math exp Zahl das Gegenst ck dazu n mlich e Zum Beispiel gt gt Math sqrt 9 gt 3 0 gt gt Math sqrt 2 gt 1 4142135623731 gt gt Math 1log 10 gt 2 30258509299405 gt gt Math exp 1 gt 2 71828182845905 Math sin Zahl Math cos Zahl und
366. me Platzhalter a A b Bedeutung Wochentag Abk rzung Wochentag ausgeschrieben Monat Abk rzung Monat ausgeschrieben Datum und Uhrzeit Tag im Monat 1 31 Stunde 00 23 Stunde 00 12 Tag im Jahr Numerischer Monat Minute 00 59 AM oder PM f r 12 Stunden Anzeige Sekunde 00 59 Kalenderwoche beginnend mit Sonntag Numerischer Wochentag 0 5o 1 Mo 6 Sa Kalenderwoche beginnend mit Montag Datum englisch MM TT JJ Uhrzeit Jahr zweistellig Jahr vierstellig Zeitzonendifferenz zu GMT Zeitzone Literales Prozentzeichen Ausgabebeispiel Fri Friday Oct October Sat Oct 21 10 07 01 2006 20 21 09 293 10 27 PM 15 42 5 42 10 20 06 21 27 15 06 2006 1 00b GMT 1 00 UNIX Westeuropaeische Normalzeit Win dows a Unter Windows ist das Format MM TT JJ hh mm ss z B 10 20 06 21 27 15 b Unter Windows wird hier ebenfalls die Zeitzone angezeigt Hier zwei irb Beispiele einmal das rein numerische Datum in deutscher Reihen folge und einmal ein sehr ausf hrliches englisches Datum gt gt t strftime d m Y H M gt 21 10 2006 12 16 gt gt t strftime A B d Y I M p gt Saturday October 21 2006 12 16 PM Datum und Uhrzeit 141 Wenn Sie nicht die aktuelle Systemzeit sondern ein anderes Datum und oder eine andere Uhrzeit speichern m chten k nnen Sie die Time Methode parse aufrufen Das Erge
367. miersprachen gelten 0 und der leere String V 44 Kapitel 2 Sprachgrundlagen Das Leer Literal nil steht f r Elemente die gar keinen Wert besitzen Auch das ist etwas anderes als die oben erw hnten Werte 0 und In Vergleichen gilt nil als falsch e Symbole haben die Form Symbolname wobei der Symbolname Buchstaben Zif fern und Unterstriche enthalten aber nicht mit einer Ziffer beginnen darf Sym bole sind ein besonders speicherschonendes Verfahren um unterschiedliche Werte zur Verf gung zu haben wenn es nicht auf einen bestimmten Wert ankommt e Bereiche Ranges sind aufsteigende Reihen von Ganzzahlen oder Zeichen Dabei wird jeweils das erste und das letzte Element getrennt durch Punkte notiert Bei zwei Punkten ist der Bereich inklusive dem letzten Element gemeint Zum Beispiel steht 3 7 f r die Zahlenreihe 3 4 5 6 7 Wenn Sie an dagegen drei Punkte verwenden wird der letzte Wert ausgeschlossen a f steht beispielsweise f r a b c d e Bereiche sind zum Beispiel praktisch um zu berpr fen ob sich ein bestimmter Wert darin befindet oder um eine Schleife ber alle ihre Elemente zu bilden Variablen Eines der wichtigsten Konzepte h herer Programmiersprachen und ein gef rchte ter Stolperstein f r Einsteiger sind die Variablen Es handelt sich im Grunde um nichts weiter als benannte Speicherpl tze Wenn Sie den Eindruck haben der Umgang mit Variablen sei schwieri
368. mmte Richtung Am wichtigsten sind zwei Arten von Beziehungen e Wenn die Datenstruktur einer Klasse eine Instanz einer anderen Klasse enth lt wird das als HAS A Beziehung bezeichnet Zum Beispiel Ein G terzug hat eine Lok genauer gesagt zwei Bei der voll objektorientierten Sprache Ruby stellen alle Instanzvariablen HAS A Beziehungen dar weil es keine Nicht OO Datentypen so genannte einfache oder primitive Typen wie etwa in Java gibt In Abbildung 4 2 sehen Sie die HAS A Beziehung zwischen den Klassen Gue terzug und Lok Die Ziffern am Pfeil besagen dass ein G terzug zwei Loks besitzt e Wenn eine Klasse von einer allgemeineren Klasse abgeleitet wird spricht man von Vererbung inheritance Im Klassendiagramm ist das eine IS A Beziehung weil eine Instanz der abgeleiteten Klasse auch eine spezielle Instanz der Eltern klasse ist Beispiele Jedes Auto ist ein spezielles Fahrzeug und jede Flie kommazahl Float ist eine Zahl Numeric Ruby kennt sogar die eingebaute Methode is_a die diese Beziehung berpr ft siehe den Abschnitt ber Introspektion gegen Ende dieses Kapitels In Abbildung 4 2 wird die Verer bungsbeziehung der Klassen Rechteck und Quadrat aus dem Einf hrungsbei spiel des vorigen Kapitels gezeigt Klassen entwerfen und implementieren 165 Gueterzug Lok 1 2 loks gt typ waggons anhaengen get_typ abhaengen get_kapazitaet lok_aendern to_s waggontest lokinfo i
369. munizieren ber das bereits im vorigen Kapitel erw hnte Anwendungsprotokoll HTTP HyperText Transfer Protocol mit Client Programmen die meisten von ihnen sind Webbrowser wie Firefox oder der Inter net Explorer Die genaue Definition der aktuellen HTTP Version steht in RFC 2616 blicherweise sendet der Client eine Anfrage an den Server sobald Sie eine URL in die Adresszeile Ihres Browsers eintippen oder einen Link anklicken Eine HTTP Anfrage sieht beispielsweise folgenderma en aus GET seiten info html HTTP 1 1 Accept Accept Language de en US Accept Encoding gzip deflate User Agent Mozilla 5 0 Windows U Windows NT 5 1 de rv 1 8 1 1 Geck0 20061204 Firefox 2 0 0 1 Host www test local Connection Keep Alive Die erste Zeile ist der eigentliche Befehl Er besteht aus der HTTP Methode hier GET dem Pfad der angeforderten Ressource info html im Website Unterverzeich nis seiten sowie der HTTP Protokollversion HTTP 1 1 ist der Standard Die Methode GET fordert eine Ressource vom Server an Eine andere bekannte HTTP Methode ist zum Beispiel POST sie kann zus tzlich gr ere Datenmengen meist aus Webformularen an den Webserver senden Alle anderen Zeilen sind HTTP Header die dem Server weitere Aspekte ber den Client und die Anfrage mitteilen e Accept gibt eine Liste von MIME Typen der Dokumentarten an die der Client akzeptiert MIME Typen haben das Format Haupttyp Untertyp etwa text
370. n 48 else 49 Standardanfrage behandeln 50 case mode 51 when NORMAL 52 client printf s r n anfrage 53 when REVERSE 54 client printf s r n anfrage reverse 55 when ROT13 56 client printf s r n anfrage tr a m A M n z N Z n z N Z a m A M 57 end 58 end 59 end 60 Client Verbindung schliessen 61 client close 62 63 end 64 Lauschenden Socket schliessen 65 server close In Zeile 22 wird der durch accept erzeugte Client Socket nach dem bereits gezeigten Schema an den zust ndigen Thread weitergereicht Weiterhin m ssen Sie noch beachten dass die Variable mode nun lokal pro Client Thread vereinbart werden muss Zeile 24 Andernfalls w rden sich Modus nderungen wieder auf alle Client Verbindungen auswirken wie im urspr nglichen nicht nebenl ufigen Beispiel Wenn Sie diesen neuen Server ausprobieren m chten k nnen Sie als Client die Ver sion echoforkclient rb aus dem vorigen Abschnitt verwenden Sie funktioniert auch mit dem Threading Server genauso unproblematisch Sie k nnen sich das Schreiben Thread basierter Server noch einfa cher machen indem Sie Ihren Server von der Klasse GServer ableiten v Dazu m ssen Sie zun chst mittels require gserver die passende Bibliothek importieren anschlie end k nnen Sie losle gen Das Grundger st eines solchen Servers lautet class MeinServer lt GServer def initialize port super port end end Auf der Website zum Buch f
371. n le Offene Ein und Ausgabeverbindungen werden als Datenstr me data streams oder Kan le channels bezeichnet In den meisten modernen Betriebssystemen darunter Windows und alle UNIX Varianten gibt es drei Standardkan le f r Kon solen I O Das liegt daran dass diese Betriebssysteme in C oder C programmiert wurden und die drei Kan le der C Standardbibliothek benutzen Im Einzelnen handelt es sich um e STDIN die Standardeingabe Hier stammt die Eingabe von der Tastatur solange sie nicht umgeleitet wird 114 Kapitel 3 Ruby Klassen e STDOUT die Standardausgabe Der Text wird an die aktuelle Position des jewei ligen Terminaltfensters geschrieben falls keine Ausgabeumleitung stattfindet e STDERR die Standardfehlerausgabe Zun chst besteht scheinbar kein Unter schied zur Standardausgabe aber der Nutzen dieses zus tzlichen Ausgabeka nals besteht darin dass Sie Fehlermeldungen oder Warnungen auch dann noch auf der Konsole ausgeben k nnen wenn die Standardausgabe umgeleitet wird Die besagte Umleitung funktioniert in ihrer einfachsten Form unter Windows und UNIX gleich Wenn Sie an einen Konsolenbefehl zum Beispiel den Aufruf eines Ruby Skripts DATEINAME anh ngen wird die Standardausgabe in die angegebene Datei umgeleitet gt DATEINAME h ngt die Ausgabe an den bisherigen Inhalt der Datei an lt DATEINAME schlie lich liest die Eingabe aus der angegebenen Datei Das folgende Beispiel schreibt
372. n regul ren Ausdruck mehrfach in A einem Skript verwenden oder in irb ausprobieren m chten k nnen y Sie ihn problemlos in einer Variablen speichern wie jedes andere Literal Anschlie end wird hinter dem oder an anderen Stellen wo regul re Ausdr cke erlaubt sind einfach die Variable statt dem literalen Regexp eingesetzt Zum Beispiel gt gt re aeiou gt aeiou gt gt hallo re gt 1 gt gt grrrr re gt nil Die Zeichengruppe braucht keineswegs in alphabetischer beziehungsweise Zeichen satz Reihenfolge geschrieben zu werden jedes Zeichen in der Gruppe ist gleichbe rechtigt Die Gruppenangaben ab und ba sind also beispielsweise identisch An der entsprechenden Stelle darf entweder ein a oder ein b stehen Statt einer einfachen Zeichengruppe k nnen Sie auch einen Zeichenbereich ange ben Dabei wird das erste und das letzte Zeichen einer aufeinanderfolgenden Reihe zul ssiger Zeichen angegeben getrennt durch einen Einige Beispiele Sl a z ein beliebiger Kleinbuchstabe e A Z ein beliebiger Gro buchstabe 9 f m e 08 li Sie k nnen einzelne Zeichen und Zeichenbereiche innerhalb der eckigen Klammern beliebig mischen Die letzte Ziffer das hei t die Pr fziffer einer ISBN internatio nale Buchnummer das vorliegende Buch hat die 3 89721 478 4 kann beispiels weise 0 bis 9 oder X lauten Das k nnen Sie wie folgt in einem regul ren Ausdruck angeben 0 9X e
373. n wird ein Prompt die eigentliche Eingabeaufforderung angezeigt Windows Rechner verwenden standardm ig die Schreibweise Arbeitsverzeichnis gt Zum Beispiel C Dokumente und Einstellungen Sascha Eigene Dateien gt Bei UNIX Systemen kann der Prompt sehr unterschiedlich aussehen Recht h ufig ist die Form Username Rechner Arbeitsverzeichnis gt Das eigene Home Verzeich nis meist home Username wird dabei in der Regel durch abgek rzt Somit sieht der gesamte Prompt beispielsweise wie folgt aus sascha linuxbox gt Wenn Sie als root arbeiten wird meistens kein Username angezeigt und das Schlusszeichen wechselt von gt oder zu einer Raute Zum Beispiel linuxbox home sascha In diesem Abschnitt und im Rest dieses Buchs werden normalerweise solange der konkrete Prompt keine Rolle spielt folgende Zeichen verwendet um den Prompt zu kennzeichnen e gt Windows Prompt sowie allgemeiner Prompt wenn eine Eingabe f r alle Betriebssysteme gilt e UNIX Prompt beliebiger Benutzer einschlie lich root wobei Sie normale Aufgaben aus Sicherheitsgr nden nicht als root erledigen sollten UNIX Prompt f r root Wenn Sie zum ersten Mal in einer Konsole arbeiten werden Sie einige grundle gende Befehle ben tigen Diese betreffen vor allem den Umgang mit Verzeichnis sen wie etwa den Wechsel des Arbeitsverzeichnisses oder das Anlegen neuer Unterverzeichnisse Hierbei spielt die unterschiedliche Organisatio
374. n Array mit einem oder mehreren Werten zur ck im vorliegenden Beispiel wird der erste Wert ausgelesen Im Folgenden wird ein vollst ndiges Beispiel pr sentiert Im CGI Skript farbwaeh ler rb k nnen Sie eine von mehreren Farben ausw hlen Diese wird als Cookie gespeichert Das Skript enth lt einen Link zu einem zweiten CGI Skript namens farbe rb in dem die Farbe aus dem Cookie ausgelesen und als allgemeine Body Textfarbe eingestellt wird Hier zun chst der komplette Code von farbwaehler rb nach den vorangegangenen Erl uterungen m ssten Sie eigentlich alles verstehen C ruby bin ruby exe w require cgi cgi CGI new htm14 Standardwert farbe 000000 Eventuell eingegebene Farbe auslesen if cgi has_key farbe farbe cgi farbe end Cookie zur Speicherung der Farbe erzeugen cookie CGI Cookie new name gt farbe value gt cgi farbe expires gt Time new 86400 HTTP Header und Body erzeugen Header mit Cookie egi out cookie gt cookie It cegi html cgi head 306 Kapitel 6 Klassische Webanwendungen cgi title Farbwaehler cgi meta http equiv gt Content type content gt text html charset iso 8859 1 cgi body cgi h1 Cookie Farbwaehler if cookie cgi p Farbe farbe gespeichert end cgi form get Farbe cgi radio_group farbe FF0000 rot nbsp amp nbsp amp nbsp true
375. n Prozessliste auftauchen Interessanterweise k nnen Sie ein Skript dazu bringen zur Laufzeit einen zus tzlichen Prozess zu erzeugen R Das in diesem Abschnitt beschriebene Verfahren funktioniert nur auf l UNIX Systemen Wenn Sie Ruby auf einem Windows Rechner ver wenden stehen Ihnen nur die weiter unten beschriebenen Threads zur Verf gung Forking Grundwissen Alle UNIX Systeme erzeugen neue Prozesse durch den Systemaufruf fork Dieser fertigt eine exakte Kopie des laufenden Prozesses an so dass nach diesem Vorgang zwei Prozesse mit denselben Variablen ge ffneten Dateien und standardm ig auch mit demselben Code existieren Letzteres ist in der Regel unerw nscht zeigt aber am deutlichsten wie das Verfahren funktioniert Probieren Sie dazu das fol gende kleine Skript aus puts Noch bin ich der einzige Prozess Neuen Prozess erzeugen fork puts Was glauben Sie wie viele Prozesse jetzt da sind Die Ausgabe dieses Skripts sieht so aus Noch bin ich der einzige Prozess Was glauben Sie wie viele Prozesse jetzt da sind Was glauben Sie wie viele Prozesse jetzt da sind Da die zweite Ausgabe nach dem fork ausgef hrt wurde sehen Sie sie zweimal da alle nachfolgenden Anweisungen nun von zwei Prozessen ausgef hrt werden Die beiden werden als Parent und Child Prozess bezeichnet Prozesse und Threads 257 In der Regel soll der Child Prozess nat rlich eine andere Aufgabe erledigen als der Parent Prozess Be
376. n Taskmanager Windows beendet werden kann Die drei MODE_ Kommandos liefern brigens auch kein Textecho zur ck sondern eine administrative Antwort In Beispiel 5 1 sehen Sie zun chst den kompletten Quellcode des Servers der im Anschluss erl utert wird Beispiel 5 1 Der erweiterte TCP ECHO Server echoserver rb 1 require socket 2 Modus Konstanten 3 NORMAL 0 4 REVERSE 1 5 ROT13 2 6 Anfangswert fuer Modus festlegen 7 mode NORMAL 8 Port von der Kommandozeile lesen oder auf 7 setzen 9 if ARGV 0 10 port ARCV o to_ i 11 else 12 port 7 13 end 14 Lauschenden Socket erzeugen 15 server TCPServer new port 16 Infozeile ausgeben 17 puts ECHO Server listening on port port 18 Accept Schleife 19 while client server accept 20 Client Anfrage auslesen 21 anfrage client gets strip 22 und auf die Konsole protokollieren 23 puts Anfrage anfrage 24 Bei EXIT beenden 25 break if anfrage EXIT 26 Modus Befehle behandeln 27 case anfrage 28 when MODE_NORMAL 29 mode NORMAL 30 client print Modus auf Normal gesetzt r n 31 when MODE REVERSE Sockets 235 Beispiel 5 1 Der erweiterte TCP ECHO Server echoserver rb Fortsetzung 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 mode REVERSE client print Modus auf Reverse gesetzt r n when MODE _ROT13 mode ROT13 client print Modus au
377. n dazu werden im bern chsten Kapitel behandelt aber als kleiner Vorgeschmack wurde das zweite Einf hrungsbeispiel in objektorientierter Schreibweise geschrieben Zun chst wird eine Klasse definiert eine Vorlage f r beliebig viele Objekte die eine Datenstruktur und Funktionen zu deren Manipulation Methoden miteinander verkn pfen Im vorliegenden Fall ist die Datenstruktur ein kurzer Text und die Methoden sind verschiedene Manipula Praktische Einf hrung 27 tionsvariationen Anschlie end wird ein Objekt der Klasse erzeugt und die Metho den werden aufgerufen Geben Sie den Code aus Beispiel 2 2 zun chst wieder in Ihren Texteditor ein nat rlich ohne Zeilennummern und speichern Sie ihn in Ihrem Arbeitsverzeichnis als modtext rb Beispiel 2 2 modtext rb der objektorientierte Textmanipulierer 1 class ModText 2 Konstruktor wird bei Objekterzeugung 3 mit new aufgerufen 4 def initialize txt 5 txt txt 6 end 7 Enthaltenen Text nachtraeglich aendern 8 def set_text txt 9 txt txt 10 end 11 Enthaltenen Text zurueckliefern 12 def get_text 13 etxt 14 end 15 Als Text Entsprechung des Objekts 16 ebenfalls den Text zurueckliefern 17 def to_s 18 get_text 19 end 20 Den Text rueckwaerts zurueckliefern 21 def turn 22 txt reverse 23 end 24 Den Text mit statt Vokalen zurueckliefern 25 def hide_vowels 26 txt gsub aeiou i 27 end 28 Den Text in Caes
378. n dem Bereich enthalten ist und ansonsten false Hier ein paar Beispiele gt gt gt gt gt gt 0 10 10 true 0 10 10 false Er erwartet auf der linken Seite einen 54 Kapitel 2 Sprachgrundlagen 3y a z tb gt true SSi ta senz een Br gt false Zu guter Letzt gibt es noch einen besonderen Operator dessen R ckgabewert nicht true oder false ist lt gt liefert 1 wenn der erste Operand kleiner ist als der zweite 0 wenn die beiden Operanden gleich gro sind und 1 wenn der erste Operand gr er ist gt gt 1 lt gt 2 gt 1 gt 1 lt gt 1 gt 0 gt gt 2 lt gt 1 gt 1 Dieser Operator eignet sich hervorragend zur Definition von Sortierreihenfolgen eigener Klassen dies wird in Kapitel 4 an einem Beispiel demonstriert Logische Operationen Logische Aussagen werden wie bereits erw hnt vornehmlich durch Vergleichsope ratoren getroffen Dabei kommt es recht h ufig vor dass die Ausf hrung eines Pro grammteils von mehreren Bedingungen abh ngt Deshalb gibt es die M glichkeit mehrere Vergleiche durch logische Operatoren miteinander zu verkn pfen Im Einzelnen stehen die folgenden logischen Operatoren zur Verf gung e alternative Schreibweise or logisches Oder Wenn Sie zwei Aussagen damit verkn pfen ist die Gesamtaussage wahr sobald mindestens eine der bei den Teilaussagen wahr ist Das folgende Beispiel ergibt also ei
379. n des Dateisys tems also die Verzeichnishierarchien eine wichtige Rolle Auf Windows Rechnern beginnen Dateipfade mit einem Laufwerksbuchsta ben darauf folgen die ineinander verschachtelten Verzeichnisnamen und zum Schluss der Dateiname Das Trennzeichen ist ein Backslash der auf einer deutschen Windows Tastatur mit Alt Gr erzeugt wird Das folgende Bei spiel ist der Pfad der Ruby Datei hello rb im Ordner myruby unter dem Privat verzeichnis des Users Sascha C Dokumente und Einstellungen Sascha Eigene Dateien myruby hello rb e UNIX Systeme kennen keine Laufwerksbuchstaben Das Dateisystem besitzt eine gemeinsame Wurzel namens wobei sich die diversen Standardverzeich nisse auf verschiedenen Laufwerken oder Partitionen befinden k nnen die genaue Anordnung wird durch Konfigurationsdateien geregelt Als Trennzei chen zwischen Unterverzeichnissen sowie zwischen Verzeichnis und Datei dient dabei der Slash Die UNIX Entsprechung des oben gezeigten Win dows Pfades w re daher Ruby Code eingeben und ausf hren 11 home sascha myruby hello rb Beachten Sie dass UNIX bei Datei und Verzeichnisnamen zwischen A Gro und Kleinschreibung unterscheidet Windows aber nicht Tun u Sie sich zur Sicherheit selbst einen Gefallen und schreiben Sie konse quent alles klein Ebenso sollten Sie in allen selbst gew hlten Namen Leerzeichen und Sonderzeichen au er dem Unterstrich _ vermei den Sp testens wenn Sie Ihr
380. n query 55 INSERT INTO interpreten int_name 56 VALUES interpret 57 58 end 59 Interpreten ID ermitteln 60 result conn query 61 SELECT int_nr FROM interpreten 62 WHERE int_name interpret 63 64 int_nr result fetch_hash int_nr 65 CD einfuegen 66 conn query 67 INSERT INTO cds cd_interpret cd_titel cd_jahr cd_songs 68 VALUES int_nr titel jahr tracks 69 70 end Zugriff auf Datenbanken 327 Beispiel 6 2 Die interaktive Musik CD Tabelle musikdb rb Fortsetzung 71 cgi out 72 cgi html 73 cgi head 74 cgi title Ruby n Roll 75 cgi meta 76 http equiv gt Content type 77 charset gt iso 8859 1 78 79 80 cgi body 81 cgi h1 Die Ruby Rockmusikdatenbank 82 cgi form get 83 cgi table border gt 2 cellpadding gt 8 84 egi tr 85 cgi th Interpret 86 cgi th Albumtitel 87 cgi th Jahr 88 cgi th Tracks 89 90 egi tr 91 cgi td 92 cgi text_field 93 name gt interpret 94 size gt 30 95 96 cgi td 97 cgi text_field 98 name gt titel 99 size gt 30 100 101 cgi td 102 cgi text_field 103 name gt jahr 104 size gt 6 105 106 cgi td 107 cgi text_field 108 name gt tracks 109 size gt 4 110 cgi submit Eintragen 111 112 113 cd liste conn cgi
381. n und Tabellenzeilen generieren 7 def cd_liste conn cgi 8 SOL Abfrage 9 result conn query 10 SELECT int_name cd_titel cd_jahr cd_songs 11 FROM interpreten cds 12 WHERE int_nr cd_interpret 13 ORDER BY int name cd titel 14 15 ausgabe 16 Wenn Datensaetze vorhanden sind 17 if result num_rows gt 0 18 zeilenweise hinzufuegen 19 while row result fetch_hash 20 ausgabe 21 cgi tr 22 cgi td row int_name 23 egi td row cd titel 24 cgi td row cd_ jahr 326 Kapitel 6 Klassische Webanwendungen Beispiel 6 2 Die interaktive Musik CD Tabelle musikdb rb Fortsetzung 25 egi td row cd_songs 26 27 end 28 end 29 Fertigen String zurueckgeben 30 ausgabe 31 end 32 CGI Instanz 33 cgi CGI new htm14 34 Datenbankverbindung 35 conn Mysql new localhost dbuser geheim 36 Standard Datenbank 37 conn select_db musik 38 Neuer Datensatz eingegeben 39 if cgi has_key interpret amp amp cgi has_key titel amp amp 40 cgi has_key jahr amp amp cgi has_key tracks 41 Daten auslesen 42 interpret cgi interpret 43 titel cgil titel 44 jahr cgi jahr 45 tracks cgi tracks 46 Den Interpreten ueberpruefen 47 result conn query 48 SELECT int_name FROM interpreten 49 WHERE int_name interpret 50 51 Interpret neu 52 if result num_rows 53 Interpret einfuegen 54 con
382. n verwendet um dieselben Daten ressourcenschonend an mehrere Hosts weiterzuleiten brigens m ssen Sie von der Anzahl der Adressen in einem Teilnetz noch zwei abziehen um die Anzahl der m glichen Hosts zu erhalten Die erste verf gbare Adresse kennzeichnet n mlich das Netzwerk selbst w hrend die letzte als so genannte Broadcast Adresse dient die empfangene Pakete an alle Hosts im gleichen Netz weiterleitet So k nnen im Klasse C Netz mit dem Adressbereich 193 17 18 x beispielsweise nur die 254 Adressen von 193 17 18 1 bis 193 17 18 254 f r Hosts benutzt werden 193 17 18 0 ist die Netzwerk Adresse und 193 17 18 255 die Broadcast Adresse 3 Dies ist die klassische Version IPv4 Da der Adressraum allm hlich knapp wird gibt es eine Neufassung des Protokolls namens IPv6 die 128 Bit lange Adressen verwendet aber noch nicht universell verbreitet ist 224 Kapitel 5 Netzwerkanwendungen Das IP Protokoll wurde zu einer Zeit erfunden als es nur wenige hundert Hosts gab und man sich vielleicht einen Zuwachs auf einige Tausend vorstellen konnte Heute gibt es allerdings viele Millionen Hosts so dass sich das Klassensystem l ngst als zu unflexibel erwiesen hat Deshalb kann die Grenze zwischen Netz und Hostteil heute flexibel gesetzt werden Dazu wird die Anzahl der Netzwerk Bits durch einen Slash getrennt hinter der IP Adresse notiert Dieses Verfahren wird als CIDR Classless Inter Domain Routing bezeichnet Eine andere Schreib
383. nacheinander verarbeitet werden k nnen f hrt der typische Server eine so genannte accept Schleife aus Jede neue Client Verbindung wird akzeptiert verar beitet und wieder geschlossen Eine solche Schleife sieht beispielsweise so aus while client server accept client ist der Kommunikations Socket hier alle Lese und Schreiboperationen abwickeln dann den Client Socket schliessen client close end Dieses einfachste Modell eines TCP Servers bekommt allerdings immer dann ein Problem wenn die Verarbeitung der Client Anfragen l nger dauert oder gar beste hen bleiben soll Der n chste Client kann n mlich wie an einer Supermarktkasse immer erst dann bedient werden wenn einer fertig ist Die passende L sung wurde erst vor kurzem aus der IT Welt in die reale Welt ber nommen Alle Clients Kunden warten an einer einzigen Warteschlange dem lau schenden Socket und sobald sie an der Reihe sind verteilen sie sich auf verschiedene Schalter Server Instanzen Dies wird im Abschnitt Prozesse und Threads auf Seite 256 erl utert Hier wird dagegen zun chst ein einfacher Server gezeigt der eine einzelne Anfrage schnell beantwortet und die Verbindung dann sofort beendet um den n chsten wartenden Client zu bedienen Der aus dem accept Aufruf empfangene TCPSocket des Servers sowie der TCPSocket des Clients dienen anschlie end der direkten Kommunikation zwischen den beiden Stationen Jeder Partner kann sowohl lesen als auch
384. name und neuer Wert Angenommen Sie legen das Metallica Album Metallica das so genannte Black Album an und geben als Jahr 1990 statt 1991 ein gt gt Album create title gt Metallica gt release_year gt 1990 band_id gt 1 Um die Daten eines konkreten Albums zu ndern m ssen Sie das entsprechende Album zun chst einmal finden Statt einer bestimmten ID k nnen Sie bei find auch die Kombination all und conditions gt Bedingungen angeben Die Bedin gungen sind praktisch derjenige Teil einer SQL Abfrage den Sie in einem SELECT hinter das WHERE schreiben w rden Zum Beispiel gt gt Album find all conditions gt title like Met each a gt puts a title gt gt Metallica Realistische Anwendung Eine Online Rock n Roll Datenbank 349 Die hier verwendete SQL Klausel LIKE stellt eine einfache Suchmuster Syntax zur Verf gung Ein Prozentzeichen steht f r beliebig viele beliebige Zeichen und ein Unterstrich _ f r genau ein beliebiges Zeichen Verwenden Sie dies um das Jahr zu korrigieren gt gt Album find all conditions gt title like Met each a a update_attribute release_year 1991 gt gt gt lt Album ox381cccc attributes title gt Metallica release_year gt 1991 id gt 5 band _id gt 1 gt Geben Sie einige weitere Alben Ihrer Wahl ein und verwenden Sie zum Schluss die sen Code um sich eine Liste der Alb
385. nativ k nnen Sie Start gt Ausf hren w hlen cmd eingeben und OK ankli cken beziehungsweise Enter dr cken Wie Sie in Ihrem UNIX artigen System ein Terminalfenster ffnen ist je nach Dis tribution Version und grafischer Oberfl che verschieden Hier nur einige Beispiele e Der beliebte Desktop KDE f r Linux und einige andere UNIX Varianten ent h lt ein komfortables Terminalprogramm namens Konsole das Sie in der Regel ber ein Bildschirm Symbol im Panel die Leiste am unteren Bildschirmrand ffnen k nnen e Der andere verbreitete Desktop GNOME besitzt ebenfalls eine eigene Termi nalemulation die einfach GNOME Terminal hei t Sie ffnen es am einfachs ten indem Sie mit der rechten Maustaste eine leere Stelle auf dem Desktop anklicken und Terminal ffnen aus dem Kontextmen w hlen e Unter Mac OS X befindet sich das Terminal im Systemordner Applications Wenn Sie ernsthaft mit dem Programmieren beginnen werden Sie es fter ben tigen und sollten es daher ins Dock ziehen P Beachten Sie dass innerhalb von UNIX Terminalfenstern unter schiedliche Shells Befehls Interpreter ausgef hrt werden k nnen wodurch sich die Syntax mancher Eingaben etwas ndert In den drei genannten Beispielf llen ist es so gut wie immer die bash Soweit die Arbeit mit der Shell in diesem Abschnitt geschildert wird macht dies aber keinen Unterschied 10 Kapitel 1 Einf hrung Nachdem Sie die jeweilige Konsole ge ffnet habe
386. nauer unter die Lupe genommen Danksagungen Zun chst einmal und vor allen Dingen danke ich Ihnen Sie haben dieses Buch ent weder schon gekauft in einer B cherei ausgeliehen oder lesen dieses Vorwort gerade in einer Buchhandlung um festzustellen ob es das richtige Buch f r Sie ist In all diesen F llen zeigen Sie Interesse f r meine Arbeit und das ehrt mich bereits denn ohne interessierte Leserschaft k nnte sich jeder Autor seine M he gleich sparen Weiterer Dank geht an den O Reilly Verlag vor allem an meinen Lektor Volker Bombien Er hat alle Teile des Manuskripts kritisch gelesen und mich stellenweise auf den besonderen Erkl rungsbedarf von Programmieranf ngern hingewiesen Besonderer Dank geb hrt nat rlich auch Yukihiro Matz Matsumoto dem Erfin der der Programmiersprache Ruby sowie den zahllosen bekannten oder unbekann ten Mitgliedern der weltweiten Ruby Gemeinschaft die diese Sprache durch ihren unerm dlichen Einsatz zu einem so gro artigen Werkzeug gemacht haben Zuletzt w re keines meiner B cher ohne die endlose Geduld und Ausdauer meiner Frau und meines Sohnes realisierbar gewesen Auch euch also wieder einmal mei nen herzlichsten Dank Danksagungen XM l KAPITEL 1 In diesem Kapitel Etwas Ruby Geschichte u f es h Merkmale und Vorz ge von Ruby E n u ru n g e Ruby installieren Ruby Code eingeben und ausf hren Hello World hello Ruby das erste Ruby Programm
387. nd einen Controller aber kein Model enth lt Der Controller stellt diverse 2 Wenn es sich nicht um den Standardport 80 handelt muss das http in den meisten Browsern unbe dingt mit eingegeben werden 338 Kapitel 7 Ruby on Rails Instanzvariablen zur Verf gung die im eruby Template der View verwendet werden k nnen Entsprechend dem gew hlten Anwendungsnamen helloworld sollen verschiedene Gru worte mit verschiedenen Planeten kombiniert werden Der betreffende String soll vom Controller erstellt und dann von der View zur Ausgabe bernommen wer den Wechseln Sie zun chst in das weiter oben erstellte Verzeichnis helloworld Geben Sie dort folgende Anweisung ein um einen Controller und eine View namens hello mit einer Aktion namens index zu erstellen gt ruby script generate controller hello index exists app controllers exists app helpers create app views hello exists test functional create app controllers hello_controller rb create test functional hello_controller_test rb create app helpers hello_helper rb create app views hello index rhtml Der Name index hat wie bei normalen Websites den besonderen Vorteil dass Sie beim sp teren Aufruf im Browser keinen konkreten Dateinamen einzugeben brau chen Die beiden Skripten die Sie nun um eine eigene Funktionalit t erweitern k nnen sind der Controller app controllers hello_controller rb und die View app views hello index rhtml Die restlichen Skri
388. nd ihre Instanzen Sie ndern die Sichtbarkeit von Methoden indem Sie das entsprechende Schl ssel wort in eine eigene Zeile Ihrer Klassendefinition setzen Von da an besitzen alle nachfolgenden Methoden diese Geheimhaltungsstufe bis Sie sie wieder ndern Machen Sie zun chst den folgenden einfachen Versuch mit private class PrivatTest private def privat puts Dies ist privat end public def oeffentlich print Ganz unter uns privat end end Die Klasse PrivatTest besitzt zwei Methoden privat hat die Sichtbarkeit private w hrend oeffentlich explizit als public gekennzeichnet wurde Innerhalb von oef fentlich wird die Methode privat ohne Instanzbezug aufgerufen Erzeugen Sie nun eine Instanz der Klasse und testen Sie beide Methoden Beim Aufruf von privat erhalten Sie eine Fehlermeldung Weitere objektorientierte Konstrukte 201 gt gt pt PrivatTest new gt lt PrivatTest 0x2b058f4 gt gt gt pt privat NoMethodError private method privat called for lt PrivatTest 0x2b058f4 gt Der Aufruf von oeffentlich verl uft jedoch problemlos und offenbart so indirekt auch das Verhalten von privat gt gt pt oeffentlich Ganz unter uns Dies ist privat P Private Methoden erwecken den Eindruck etwas hnliches zu sein wie Klassenmethoden Dieser Eindruck t uscht allerdings Klassen methoden k nnen durchaus von au en aufgerufen werden beziehen sich aber nicht auf eine konkrete Instanz Private Me
389. ne wahre Aus sage n mlich dass mindestens einmal der Wert 3 gefunden wurde a 3 b 4 gt gt a 3 b gt true e amp amp weitere Formulierung and logisches Und Hier ist die Gesamtaussage nur dann wahr wenn beide Teilaussagen wahr sind Das folgende Beispiel liefert daher eine falsche Aussage false da eben nicht beide Variablen den Wert 3 besitzen a 3 gt b 4 gt gt a 38 amp b gt false Variablen Ausdr cke und Operationen 55 e oder not logisches Nicht Dieser Operator dient nicht dazu zwei Ausdr cke miteinander zu verkn pfen sondern wird einem Ausdruck vorangestellt und kehrt dessen Wahrheitswert um Hier einige Beispiele gt gt l1 gt false gt gt 0 gt false gt gt false gt true gt gt 1 1 amp amp 0 1 gt false gt gt I 1 1 amp amp 0 1 gt true Beachten Sie dass 8 amp und das so genannte Short Circuit Verfahren zu Deutsch Kurzschluss verwenden Sobald das Ergebnis feststeht wird der Ausdruck nicht weiter ausgewertet Das ist der Fall wenn bei der erste Operand wahr ist und so das Gesamtergebnis wahr macht denn es reicht schlie lich aus dass ein Teilaus druck zutrifft Umgekehrt ist der Fall bei amp amp klar wenn der erste Teilausdruck falsch ist da beide wahr sein m ssen macht dies bereits den gesamten Ausdruck falsch Bei der berpr fung von Ausdr cken hat dies keine besonderen praktischen A
390. nen Was Sie bereits alles gelernt haben k nnen Sie feststellen indem Sie sich nochmals den zu Beginn dieses Kapitels vorgestellten Taschenrechner ansehen In Beispiel 2 4 sehen Sie ihn der bersicht halber noch einmal Beispiel 2 4 Der Ruby Taschenrechner rechner rb nun kennen Sie alle Anweisungen 1 Veberschrift ausgeben 2 puts Ruby Rechner 3 puts 4 puts 5 Endlosschleife starten 6 loop do 7 print Bitte die erste Zahl 8 Eingabe direkt in Fliesskommazahl umwandeln 9 und in z1 speichern 10 z1 gets to_f 11 print Bitte die zweite Zahl 12 Eingabe direkt in Fliesskommazahl umwandeln 13 und in z2 speichern 14 z2 gets to_f 15 print Rechenoperation 16 Operator einlesen und anschliessenden Zeilenumbruch entfernen 17 op gets chomp 18 Gueltigkeit des Operators pruefen 19 if op X H 20 puts Ungueltige Operation op 21 puts 22 next 23 end Zusammenfassung 107 Beispiel 2 4 Der Ruby Taschenrechner rechner rb nun kennen Sie alle Anweisungen 24 Bei Division O als zweiten Operanden ausschliessen 25 if op amp amp z2 26 puts Division durch O ist verboten 27 puts 28 next 29 end 30 Ergebnis je nach Operator berechnen 31 case op 32 when 33 ergebnis z1 z2 34 when 35 ergebnis z1 z2 36 when 37 ergebnis z1 z2 38 when 39 ergebnis z1 z2 40 end 41 Ausgabe des Ergebn
391. nen Kon Methoden Die Methoden genauer gesagt Instanzmethoden einer Klasse sind der zweite Bestandteil der Kapselung neben den Instanzvariablen Sie haben die Aufgabe die in den Instanzvariablen gespeicherte Datenstruktur einer Instanz zu manipulieren und zu ver ffentlichen Sie bilden mit anderen Worten die Schnittstelle zwischen einer Instanz und der Au enwelt das hei t anderen Programmteilen Jede Methodendefinition steht in einem Codeblock mit folgender Struktur def Methodenname end Die Zeile def Methodenname wird dabei als Methodenkopf bezeichnet die Code zeilen zwischen def und end heien Methodenrumpf Um die Methode sp ter aufzurufen brauchen Sie nur ihren Namen gefolgt von eventuellen Argumenten anzugeben Bei den hier erl uterten Instanzmethoden muss allerdings zuerst eine Instanz existieren Betrachten Sie als Beispiel eine der Methoden der Klasse Gueterzug aus dem Einf hrungsbeispiel und ihren sp teren Aufruf im globalen Code class Gueterzug Konstruktor Eine bestimmte Anzahl Waggons anhaengen def anhaengen waggons if waggons waggons lt loks O get_kapazitaet loks 1 get_kapazitaet waggons waggons Erfolg melden true else Misserfolg melden false end end Klassen entwerfen und implementieren 169 Weitere Methoden end iua Neuen Zug erzeugen zug Gueterzug new Lok STROM Lok DIESEL 50 Waggons anhaengen zug anhaengen 50 Die
392. nfach per und anh ngen beziehungsweise abh ngen k nnen Nichts leichter als das Definieren Sie einfach die Methoden und Wichtig ist in diesem Zusammenhang dass diese speziellen Methoden als Ergebnis die entsprechend modifizierte Instanz der Klasse zur ckliefern m ssen 5 Es sei denn Sie haben Erfahrungen mit in einer Sprache wie C in der sich Operatoren berladen lassen allerdings umst ndlicher als in Ruby 188 Kapitel 4 Eigene Klassen und Objekte erstellen Das folgende Beispiel leitet eine Klasse von Gueterzug ab und f gt die beiden Metho den hinzu die dazu n tige Vererbung wird weiter unten genauer erl utert EinfacherGueterzug uebernimmt alle Eigenschaften und Methoden von Gueterzug class EinfacherGueterzug lt Gueterzug Methode Waggons anhaengen def waggons Durch anhaengen testen ob Anzahl passt if anhaengen waggons Neue Instanz mit geaenderter Waggonzahl zurueckgeben return EinfacherGueterzug new loks 0 get_kapazitaet loks 1 get_kapazitaet waggons else Die bisherige Instanz unveraendert zurueckgeben return self end end Methode Waggons abhaengen def waggons Durch abhaengen testen ob Anzahl passt if abhaengen waggons Neue Instanz mit geaenderter Waggonzahl zurueckgeben return EinfacherGueterzug new loks 0 get_kapazitaet loks 1 get_kapazitaet waggons else Die bisherige Instanz unveraendert zurueckgeben return self end end end
393. nfo Abbildung 4 2 Vereinfachtes UML Klassendiagramm das die HAS A Beziehung zwischen Gueterzug und Lok darstellt Rechteck b h getBreite getHoehe getFlaeche getDiagonale Quadrat b getBreite getHoehe getFlaeche getDiagonale Abbildung 4 3 Vereinfachtes UML Klassendiagramm das die IS A Beziehung Vererbung zwischen Rechteck und Quadrat darstellt Diese wenigen Beispiele reichen nat rlich nicht als Einf hrung in das reichhaltige Diagrammvokabular der UML und noch nicht einmal in Klassendiagramme Den noch sollten Sie sich selbst einen Gefallen tun und Ihre Programme mit Hilfe dieser oder hnlicher Visualisierungen planen Es gibt sehr n tzliche teilweise sogar kos tenlose Software daf r in Anhang B finden Sie einige entsprechende Links sowie OOP und UML Buchempfehlungen Manchmal ist es aber n tzlicher vom Rech 166 Kapitel 4 Eigene Klassen und Objekte erstellen ner aufzustehen und die Entw rfe mit einem Stift auf ein gro es leeres Blatt zu zeichnen Auf diese Weise kommen Sie auch nicht so leicht in Versuchung vor dem Entwurf mit der Implementierung zu beginnen So nun aber f rs Erste genug codefreie Theorie Die nachfolgenden Abschnitte beschreiben die Ruby Syntax der diversen Bestandteile von Klassen und Objekten Der Konstruktor Eines der wichtigsten Elemente einer Klasse ist der Konstruktor Sobald mit Klas senname new eine neue Instanz einer Kl
394. ng Das folgende if Beispiel wiederholt die weiter oben vorgestellte Zuordnung von Punkten zu Noten auf kompaktere Weise print Bitte Punktzahl eingeben punkte gets to_i note if punkte lt 30 6 elsif punkte lt 50 5 elsif punkte lt 67 4 elsif punkte lt 80 3 elsif punkte lt 92 2 else 1 end puts Ihre Note note Hier ein weiteres Beispiel das case when einsetzt um die obigen Noten in die Text form zu bertragen notentext case note when 1 Sehr gut when 2 Gut 78 Kapitel2 Sprachgrundlagen when 3 Befriedigend when 4 Ausreichend when 5 Mangelhaft when 6 Ungenuegend else Ungueltige Note end puts Note in Textschreibweise notentext Einfache Schleifen In Programmen m ssen Sie bestimmte Schritte sehr oft mehrmals durchf hren sei es nacheinander mit unterschiedlichen Werten oder solange eine bestimmte Bedin gung erf llt ist F r diese Aufgabe bieten Programmiersprachen das Konzept der Schleife In diesem Abschnitt werden die verschiedenen Schleifenvarianten von Ruby vorgestellt Daneben kennt Ruby allerdings noch das Konzept des Iterators der f r viele Anwendungen n tzlicher ist als eine Schleife Es handelt sich dabei um die automa tische Ausf hrung von Anweisungen f r alle Elemente einer Menge Aufgrund ihrer zentralen Bedeutung werden Iteratoren weiter unten in einem eigenen Abschnitt vorgestellt while und until Schleifen Die bekannteste
395. ngen Order Allow Deny Diese drei Direktiven bestimmen welche Hosts oder Netzwerke Zugriff auf ein bestimmtes Verzeichnis erhalten sollen Bei Allow k nnen Sie Hosts oder Adressbereiche auflisten denen der Zugriff explizit gew hrt werden soll Deny verbietet ihn grunds tzlich Order kann die Werte Allow Deny oder Deny Allow jeweils ohne Leerzeichen annehmen und bestimmt so in welcher Reihen folge Allow und Deny Angaben ausgewertet werden In aller Regel wird eine der beiden Direktiven f r alle Hosts gesetzt Deny from all beziehungsweise Allow from all die jeweils andere definiert dann Ausnahmen Hier ein Beispiel URL Pfad lokal nur fuer das lokale Netz lt Location lokal gt Order Deny Allow Deny from all Allow from 192 168 0 lt Location gt Nat rlich m ssen Sie 192 168 0 durch den Netzwerkteil der IP Adressen Ihres eigenen Netzes ersetzen Beachten Sie im brigen dass diese Direktiven nor malerweise nichts bringen wenn Sie bestimmte externe Benutzer ausschlie en wollen da die meisten IP Adressen dynamisch von den Internet Providern zugewiesen werden In den Verzeichniseinstellungen der DocumentRoot befinden sich bei ffentlichen Webservern folgende Eintr ge die allen Hosts den Zugriff gew hren Order Allow Deny Allow from all In einer reinen Testumgebung sollten Sie die Zugriffe allerdings auf den Rech ner selbst 127 0 0 1 beziehungsweise auf das lokale Netzwerk beschr nken DirectoryIndex
396. ngesprochene Apache Webserver sendet daraufhin eine Weiterleitungsmittei lung und die obige Schleife liefert folgende Meldung Verfolge Weiterleitung nach http buecher lingoworld de ruby HTML Einstieg in zwei Minuten In diesem Abschnitt und in den nachfolgenden Kapiteln kommt relativ viel HTML zum Einsatz Falls Sie sich noch nicht damit auskennen sollten Sie das brillante Online Tutorial Self HTML von Stefan M nz http de selfhtml org konsultieren oder ein Buch wie HTML amp XHTML Das umfassende Referenzwerk von Cuck Musciano und Bill Kennedy O Reilly Verlag ISBN 978 3 89721 494 1 zu Rate zie hen In diesem Kasten erfahren Sie nur das Allerwichtigste ber HTML Web Clients mit Net HTTP 243 HTML ist eine klartextbasierte Auszeichnungssprache in der Formatierungen und funktionale Elemente durch so genannte Tags gekennzeichnet werden Ein Tag steht in lt spitzen Klammern gt und markiert den Beginn und das Ende einer bestimm ten Eigenschaft der darin verschachtelten Elemente Jedes Tag besteht aus einem ffnenden und einem schlie enden Teil mit folgender Schreibweise lt tag attribut wert gt Be lt tag Die eckigen Klammern stehen hier wie in Syntaxschemata blich f r optionale Teile Das folgende Beispiel zeigt einen Textabsatz p ist die Abk rzung f r para graph in den ein wenig Text mit einem kursiven Wort i f r italic verschachtelt ist lt p Eine kurze Einf uuml
397. ngsumgebung IDE zum Erstellen von Ruby und Ruby on Rails Anwendungen Es handelt sich um eine spezielle Ruby Erweiterung der beliebten Open Source IDE Eclipse Sonstige Webseiten http de selfhtml org Tutorial und umfassende Referenz zu HTML und Weben twicklung von Stefan M nz http httpd apache org die Website des Webservers Apache 2 mit Downloads und Dokumentation http www apachefriends org de xampp html das integrierte Apache PHP MySQL Serverpaket XAMPP http buecher lingoworld de apache2 Website zu meinem Buch Apache 2 siehe oben mit zahlreichen Konfigurationstipps inklusive Suchfunktionen und einem Dis kussionsforum http www mysql com Website der Firma MySQL AB Hier k nnen Sie den Daten bankserver MySQL herunterladen und seine Dokumentation lesen http www galileocomputing openbook kit kostenlos verf gbare Online Version meines Buchs Kompendium der Informationstechnik Bonn 2003 Galileo Computing die Neuauflage hei t Handbuch f r Fachinformatiker Enth lt theoretische Grundla gen und praktische Einf hrungen in zahlreiche IT Themengebiete TCP IP und Datenbanken werden beispielsweise erheblich ausf hrlicher erl utert als es im vor liegenden Buch m glich w re 374 Anhang B Ressourcen und Tools Operator 56 Suffix von nderungsmethoden 66 Operator 53 I Operator 88 Shebang 34 Kommentar 33 eingebettete Ausdr cke 42 Kennz f
398. nis siehe oben file File new log txt r while line file gets line chomp puts line end file close Alternativ k nnen Sie im Lesemodus auch den bereits besprochenen Iterator each auf die ge ffnete Datei anwenden dieser stellt die einzelnen Zeilen der Datei zur Verf gung Sie k nnen das obige Beispiel also wie folgt noch k rzer und bersicht licher schreiben file File open log txt r each line line chomp puts line Ein und Ausgabe 129 Anwendungsbeispiel Ein Text Blog Weblogs oder kurz Blogs sind heutzutage die einfachste M glichkeit um eine pri vate Homepage zu betreiben Wenn das Layout einmal feststeht k nnen Sie auf Knopfdruck einen neuen Eintrag erstellen der automatisch ganz oben erscheint Ein hnliches Konzept eignet sich auch als pers nliches Notizbuch auf der Konsole Das vorliegende Beispiel realisiert ein solches Offline Blog Auf dem Bildschirm werden jeweils f nf vorhandene Eintr ge angezeigt der neueste ganz oben Der Benutzer kann bl ttern falls insgesamt mehr als f nf vorhanden sind oder einen neuen Eintrag verfassen Die einzelnen Postings werden in durchnummerierten Dateien namens postl txt post2 txt und so weiter gespeichert die zus tzliche Datei postings txt merkt sich deren bisherige Anzahl Geben Sie das Skript aus Beispiel 3 3 zun chst ein und speichern Sie es unter dem Namen textblog rb vorzugsweise in einem eigenen Unterordner da diese
399. nn den Spei cher berlaufen lassen Beim Verzeichnisbeispiel existiert eine nat rliche Abbruch bedingung weil es auf Datentr gern mit endlicher Gr e nat rlich keine unendlich tief verschachtelten Verzeichnishierarchien geben kann Hier als kleines Beispiel ein Programm das das obige Gedicht rekursiv ausgibt Als Abbruchbedingung erh lt die Methode die Information wie oft der Text auf den Grabstein passt Dieser Wert wird jeweils um 1 vermindert bei 0 erfolgt kein wei terer Aufruf mehr def grabstein anzahl 0 Text ausgeben puts Ein Hund kam in die Kueche und stahl dem Koch ein Ei puts Da nahm der Koch den Loeffel und schlug den Hund entzwei puts Da kamen alle Hunde und gruben ihm ein Grab puts Und setzten ihm nen Grabstein worauf geschrieben stand Rekursiver Aufruf mit anzahl 1 falls anzahl noch gt 1 grabstein anzahl 1 if anzahl gt 1 end Erster Aufruf z B 5 Durchgaenge grabstein 5 Das zu erwartende Ergebnis dieses Programms sind f nf Ausgaben des Textes Nach diesen Vorab Erl uterungen sehen Sie in Beispiel 4 4 das komplette Verzeich nisskript Geben Sie es wie gewohnt ein ein Ausf hrungsbeispiel und genauere Erl uterungen folgen Klassen entwerfen und implementieren 191 Beispiel 4 4 Der rekursive Verzeichnisauflister listdir rb vosoawumPrwevr NDNNDSNNDH HRBRRHRRHRHRHRHR HR DNHRHODDOSOaAUMNPWN KH Oo 23 24 25 26 27 28 29 30 31 32 33 Methode listdir
400. ns zu erhalten gen gt es brigens auch diesem Zeichen ein Fragezeichen voranzustellen gt gt A gt 65 gt gt a gt 97 gt gt 0 gt 48 Innerhalb von String Literalen k nnen Sie einzelne Zeichen ebenfalls durch ihren Code angeben nnn erwartet eine Oktalzahl zwischen 0 und 176 dezimal 126 Hier ein extremes und praxisfernes Beispiel gt gt 110 101 114 114 117 gt HALLO Mit xNN k nnen Sie den Zeichencode auch hexadezimal angeben diesmal von x0 bis x7E Hier das obige Beispiel in dieser Schreibweise gt gt x48 x41 x4C x4C x4F gt HALLO In der Praxis wird dieses Feature eher f r Steuerzeichen wie etwa 12 beziehungs weise xA den Zeilenumbruch auch n verwendet Array Methoden Genau wie Strings verf gen auch Arrays wie bereits erw hnt ber die Methode length die in diesem Fall die Anzahl der enthaltenen Elemente zur ckgibt gt gt 1 2 3 length gt 3 Da Arrays in Ruby eine variable L nge besitzen gibt es eine Reihe interessanter Methoden mit denen Sie Elemente an verschiedenen Stellen hinzuf gen oder ent fernen k nnen e array push Wert f gt einen oder mehrere Werte am hinteren Ende hinzu Zum Beispiel gt gt zwei hoch n 1 2 4 8 gt 1 2 4 8 gt gt zwei_hoch_n push 16 1 2 4 8 16 gt gt zwei hoch_n push 32 64 gt 1 2 4 8 16 32 64 e array pop entfernt das letzte Element aus dem Array und gibt es
401. nstall f r die Installation ins gew nschte Ver zeichnis verwendet configure kennt zahlreiche Optionen f r spezielle Installationsw nsche Geben Sie Folgendes ein um sie zu lesen configure help less Bei manchen lteren UNIX Arten m ssen Sie more statt less eingeben Bl ttern Sie mit den Pfeiltasten in der Beschreibung und dr cken Sie Q sobald Sie alles N tige gelesen haben Anschlie end k nnen Sie configure mit den gew nschten Optionen aufrufen Das folgende Beispiel bereitet die Makefiles zur Installation des komplet ten Ruby Verzeichnisbaums unter usr local ruby vor configure prefix usr local ruby Nun k nnen make und make install aufgerufen werden zumindest Letzteres m s sen Sie als root erledigen weil gew hnliche Benutzer keinen Schreibzugriff auf Ver zeichnisse unter usr besitzen make su Password root Passwort Eingabe wird nicht angezeigt make install 8 Kapitel 1 Einf hrung Auf einem Computer auf dem Sie keine root Rechte besitzen k nnen Sie Ruby alternativ in einem Verzeichnis unter Ihrem Home Verzeichnis installieren Geben Sie dazu beim configure Aufruf das entsprechende Pr fix an Zum Beispiel configure prefix home meinname ruby F r den ersten Test nach der Installation m ssen Sie bei dieser selbstkompilierten Variante in das bin Verzeichnis von Ruby wechseln cd usr local ruby bin Nun k nnen Sie folgende Zeile eingeben um eine Ruby Anwei
402. nt ARGV o vorhanden ist erh lt dir stattdessen seinen Wert Zeile 33 Hier erfolgt der Erstaufruf der Methode listdir mit dem Verzeichnis dir als Argument Eine Einr ckung wird nicht angegeben das liefert den Stan dardwert 0 da die Eintr ge des obersten Verzeichnisses nicht einger ckt wer den sollen Zugriff auf Attribute In der Klasse Gueterzug aus dem Einf hrungsbeispiel oder in der Klasse Rechteck aus dem vorigen Kapitel haben Sie diverse Methoden gesehen deren Name mit get beginnt und die nichts weiter tun als den Wert einer bestimmten Instanzvariablen zur ckzugeben Das widerspricht keineswegs dem Ansatz der Kapselung da Sie frei entscheiden k nnen welche Eigenschaften Sie transparent machen m chten und welche nicht Noch erfreulicher ist aber dass Sie diesen Zugriff ber die so genannten Getter Methoden in Ruby nicht unbedingt brauchen Stattdessen gibt es eine sehr einfache M glichkeit die Werte bestimmter Attribute nach au en zu ver ffentlichen Schrei ben Sie einfach Folgendes an den Anfang Ihrer Klassendefinition class Klassenname Nach aussen lesbare Attribute attr_reader attri attr2 e A end Statt attr1 attr2 und so weiter m ssen Sie die korrekten Namen Ihrer Instanzva riablen verwenden nur eben als Symbole mit Doppelpunkt statt mit beginnend Hier die entsprechende Kurzfassung der Klasse Rechteck aus dem vorigen Kapitel class EasyRechteck Zu veroeffentlichende Attribute
403. nt werden Mittel der Wahl sind meist die verschiedenen Diagramme der Unified Modeling Language Dieses Handbuch dokumentiert aus f hrlich aller verf gbaren Diagrammtypen und gibt wertvolle Hinweise f r ihren Ein satz Netzwerke Server Technologien Webentwicklung Craig Hunt TCP IP Netzwerk Administration 3 Auflage K ln 2003 O Reilly Ver lag Dieser Klassiker bietet eine ausgewogene Mischung zwischen der Erl uterung von Protokollgrundlagen und praktischen Administrationstipps von TCP IP Netz werken auf UNIX Systemen 372 Anhang B Ressourcen und Tools Lincoln D Stein Network Programming with Perl Reading 2000 Addison Wesley Zugegeben Dieses Buch ist einige Jahre alt nur auf Englisch verf gbar eine zwi schenzeitlich angebotene deutsche Ausgabe ist ausverkauft und behandelt Perl Aber kein anderes Buch behandelt die Implementierung von TCP IP Servern und Clients gr ndlicher verst ndlicher und praxisorientierter Da viele Konzepte der Ruby Netzwerkprogrammierung den zum Teil sogar gleichnamigen Perl Biblio theken nachempfunden wurden ist es auch f r Ruby Entwickler geeignet Sascha Kersken Apache 2 inkl Apache 2 2 2 Auflage Bonn 2006 Galileo Compu ting Mein Buch ber den Apache Webserver ist ein ausf hrliches Handbuch zur Installation Konfiguration und Administration Mark Lubkowitz Webseiten programmieren und gestalten 3 Auflage Bonn 2006 Galileo Press Dieser ausf hrliche Band
404. ntf Waggonkapazitaet d n loks 0 loks 1 58 printf Aktuelle Waggonzahl d n waggons 59 end 60 Globaler Code einen Zug testen 61 Informationen ueber den Grundzustand 62 info 63 puts Objektorientierte Programmierung Eine praktische Einf hrung 155 Beispiel 4 1 Die G terzug Anwendung ohne Objektorientierung zug_imp rb Fortsetzung 64 50 Waggons anhaengen 65 anhaengen 50 66 info 67 puts 68 Versuchen weitere 50 Waggons anzuhaengen 69 if anhaengen 50 70 puts 50 weitere Waggons angehaengt 71 else 72 puts Konnte keine 50 Waggons mehr anhaengen 73 end 74 puts 75 Lok 2 entfernen 76 lok_aendern 1 OHNE 77 info 78 puts 79 Waggonanzahl testen 80 printf Zug kann nicht fahren d Waggons zu viel n waggontest Wenn Sie das Skript ausf hren erhalten Sie folgende Ausgabe gt ruby zug_imp rb Lokomotive 1 Elektrolok Lokomotive 2 Diesellok Waggonkapazitaet 90 Aktuelle Waggonzahl 0 Lokomotive 1 Elektrolok Lokomotive 2 Diesellok Waggonkapazitaet 90 Aktuelle Waggonzahl 50 Konnte keine 50 Waggons mehr anhaengen Lokomotive 1 Elektrolok Lokomotive 2 keine Waggonkapazitaet 40 Aktuelle Waggonzahl 50 Zug kann nicht fahren 10 Waggons zu viel Die einzelnen Anweisungen im Skript d rften weitgehend bekannt sein so dass die Beschreibung hier recht kurz ausfallen kann e Zeile 2 5 In vier Konstanten wird die Anzahl der Waggons gespeichert die der jewei
405. ntierte Reihenfolge Hash Literale stehen in geschweiften Klammern Zwischen Index und Element wird die Zeichenfolge gt verwendet Das folgende Beispiel verwendet Wochentagsabk rzungen als Schl ssel und die vollst ndigen Namen als Werte wochentagsnamen Mo gt Montag Di gt Dienstag Mi gt Mittwoch Do gt Donnerstag Fr gt Freitag Sa gt Samstag So gt Sonntag Die Aufteilung auf mehrere Zeilen ist dabei nat rlich nur eine Option die der bes seren bersicht dient Sie k nnen genauso gut alles hintereinander schreiben Der Zugriff auf ein einzelnes Element eines Hashs erfolgt genau wie bei einem Array indem Sie den Schl ssel in eckige Klammern setzen Zum Beispiel gt gt wochentagsnamen Mo gt Montag N tzliche Methoden und Iteratoren f r Hashes lernen Sie weiter unten in diesem Kapitel kennen wie bereits bei den Arrays angek ndigt Operationen Nachdem Sie nun die wichtigsten Einzelbestandteile von Ausdr cken kennenge lernt haben ist es an der Zeit zu erfahren wie Sie diese Elemente verkn pfen k n 50 Kapitel 2 Sprachgrundlagen nen F r diese Aufgabe stellt Ruby eine umfangreiche Menge von Operatoren zur Verf gung Arithmetische Operationen Die bekanntesten Operatoren die Ihnen aus den allt glichen Bereichen der Mathe matik gel ufig sein d rften sind die arithmetischen Operatoren Sie dienen der Durchf hrung von Berechnungen
406. nutzen was in diesem Kapitel zumindest ansatzweise erl utert wurde steht Ihnen das Drittanbieter Modul mod_ruby zur Verf gung Unter http www modruby org en k nnen Sie es herunterladen und dort finden Sie auch eine Installationsanleitung Der gro e Vorteil von mod_ruby gegen ber CGI besteht darin dass es den Ruby Interpreter direkt in den Webserver einbettet Damit laufen Ihre Ruby Webanwendungen erheblich schneller und gehen auch bei einem gro en Besucheransturm nicht in die Knie Erfreulicherweise k nnen Sie Ihre vorhandenen Ruby CGI Skripten zudem einfach weiterverwenden Eine weitere Option ist die direkte Einbettung von Ruby in den HTML Code mit Hilfe einer so genannten eRuby Bibliothek Embedded Ruby Zu diesem Zweck wer den die drei Pakete eruby cgi erb und erubis angeboten eRuby funktioniert nur unter UNIX w hrend die beiden anderen plattformunabh ngig sind Funktions weise und Lieferumfang aller drei Varianten sind dagegen praktisch identisch Infor mationen und Download Quellen finden Sie unter http www eruby info Sobald Sie eine der Einbettungs Bibliotheken korrekt installiert und konfiguriert haben k nnen Sie spezielle eRuby Webseiten erstellen standardm ig mit der Endung rhtml Diese k nnen an beliebigen Stellen innerhalb des HTML Codes fol gende Konstrukte enthalten lt Ruby Anweisung en gt lt Ruby Ausdruck gt Zugriff auf Datenbanken 329 Ersteres f hrt die ent
407. nzen String herum gt gt Hallo Welt reverse gt tleW ollaH e String chop liefert den String ohne sein letztes Zeichen zur ck wird manchmal zum Entfernen des abschlie enden Zeilenumbruchs verwendet gt gt Hallo Welt chop gt Hallo Wel gt gt Hallo Welt n chop gt Hallo Welt e String chomp entfernt das letzte Zeichen nur dann wenn es tats chlich ein Zei lenumbruch ist und ist damit sicherer als chop gt gt Hallo Welt chomp gt Hallo Welt gt gt Hallo Welt n chomp gt Hallo Welt All diese Umwandlungsmethoden haben noch eine zweite Variante mit angeh ng tem Ausrufezeichen Diese Methoden k nnen nicht auf Literale sondern nur auf String Variablen angewendet werden Sie liefern nicht einfach den entsprechenden Wert zur ck sondern ver ndern den Inhalt der Variablen dauerhaft Probieren Sie es aus gt gt text We apologize for the inconvenience gt gt text upcase gt WE APOLOGIZE FOR THE INCONVENIENCE gt gt text 66 Kapitel 2 Sprachgrundlagen gt We apologize for the inconvenience gt gt text upcase gt WE APOLOGIZE FOR THE INCONVENIENCE gt gt text gt WE APOLOGIZE FOR THE INCONVENIENCE Interessant ist schlie lich der Zugriff auf die einzelnen Zeichen eines Strings indem Sie die Nummer des gew nschten Zeichens bei 0 beginnend in eckigen Klammern dahintersetzen hinter den Kulissen gibt es tats chlich eine Methode namens
408. o grammierer Tradition als Erstes ein Programm zu schreiben das die Worte Hello World oder zu Deutsch Hallo Welt ausgibt Um dieser Tradition treu zu blei ben und dennoch ein einigerma en lehrreiches erstes Skript zu verfassen soll das Beispiel Folgendes leisten 1 Hallo Welt ausgeben 2 Datum und Uhrzeit gem Systemuhr ausgeben 3 Den Benutzer nach dessen Namen fragen 4 Hallo lt Name gt ausgeben Sie k nnen das Programm in einen Texteditor siehe Kasten eingeben und unter dem Namen hallo rb speichern Am besten legen Sie sich in Ihrem Benutzerver zeichnis Eigene Dateien Windows beziehungsweise home Username UNIX Systeme einen Ordner f r Ihre gesammelten Ruby Experimente an Nennen Sie ihn beispielsweise myruby Wenn Sie m chten k nnen Sie darunter auch noch Unterverzeichnisse f r die einzelnen Kapitel oder Projekte erzeugen gr ere Bei spiele in sp teren Kapiteln werden jeweils aus mehreren Dateien bestehen Texteditoren Ein Texteditor ist ein Programm mit dem Sie reinen Text eingeben und bearbeiten k nnen im Unterschied zu einem Textverarbeitungsprogramm das vielerlei Text und Absatzformatierungen zul sst und daher f r die Eingabe von Programmaquell codes ungeeignet ist weil diese Formatierungen mit in den Dateien gespeichert werden so dass ein Interpreter oder Compiler sie nicht versteht Wenngleich sich die Aufgabe der reinen Texteingabe trivial anh rt gibt e
409. ode beziehungs weise in diesem Fall des Konstruktors nicht angegeben wird Die folgende Instanziierung erzeugt also eine Elektrolok mit einer Zugkraft von 50 Waggons lok Lok new Lok STROM Das n chste Beispiel erzeugt dagegen eine leere Lok der nicht angegebene Para meter erh lt den Standardwert Lok OHNE 0 Waggons lok Lok new Mehr ber Standardwerte erfahren Sie im nachfolgenden Abschnitt der sich mit Methoden besch ftigt da dieses Verfahren nicht nur f r Konstruktoren sondern auch f r alle Arten von Methoden angewandt werden kann Wenn Sie keinen Konstruktor schreiben bernimmt Ihre Klasse automatisch denje nigen der Klasse von der sie abgeleitet ist also den ihrer Elternklasse Explizite Ver erbung wird weiter unten behandelt aber jede Klasse wird automatisch von der 168 Kapitel 4 Eigene Klassen und Objekte erstellen Ruby Standardklasse Object abgeleitet Diese stellt einen leeren Konstruktor bereit der nichts Besonderes tut aber eben einen new Aufruf zur Instanziierung erm g licht struktor normalerweise wenig hilfreich Sie ist meist nur bei der Ver 5 erbung sinnvoll wenn sich der Konstruktor einer abgeleiteten Klasse nicht von demjenigen der Elternklasse unterscheidet aber auch das kommt selten vor weil sich abgeleitete Klassen meist gerade durch eine erweiterte Datenstruktur von ihren Vorfahren unterscheiden A In der Praxis ist eine selbst geschriebene Klasse ohne eige
410. ofern ihre Grenze ebenfalls bei 30 Bit l ge Weiter unten in diesem Kapitel erfahren Sie genauer wie Sie mit Hilfe von Aus druck class den Datentyp von Literalen und Ausdr cken ermitteln k nnen Pro bieren Sie es hier ruhig schon einmal aus gt gt 2 30 1 class gt Fixnum gt gt 2 30 class gt Bignum Der bersicht halber k nnen Sie Unterstriche verwenden um die Ziffern einer Zahl nach jeweils drei Stellen von rechts an zu trennen Zum Beispiel Es gt gt 1_000_000_000 gt 1000000000 gibt aber noch mehr M glichkeiten Geben Sie in irb Folgendes ein gt gt 056 gt 46 Warum ist das Ergebnis 46 statt der zu erwartenden 56 Nun das auch von Ruby standardm ig verwendete Dezimalsystem ist nicht immer die ideale Darstellungs form f r ganze Zahlen Aus diesem Grund gibt es die M glichkeit Integer Literale in anderen Schreibweisen anzugeben Eine f hrende o betrachtet Zahlen als oktal das hei t zum Achtersystem geh rend Dabei sind Ziffern von 0 bis 7 zul ssig der Wert jeder Stelle betr gt das Achtfache der rechts daneben liegenden Stelle Spielen Sie in irb einfach ein wenig mit Oktalwerten herum ihre Werte werden jeweils dezimal angezeigt Hier noch einige Beispiele gt gt 033 gt 27 gt gt 0777 gt 511 6 Wie erw hnt m ssen Sie auf einem 64 Bit Rechner in diesem und den folgenden Beispielen stattdessen 2 62 schreiben Variablen Ausdr cke un
411. oktyp existiert nicht end end Erweiterung der Klasse Lok class Exaktelok lt Lok Konstruktor ueberschreiben def initialize typ OHNE Nur offizielle Typen zulassen if typ OHNE amp amp typ DAMPF amp amp typ DIESEL amp amp typ STROM raise Illegalelok else typ typ end end end Testen Sie die neue Klasse wie folgt Erster Versuch passender Typ begin e1 ExakteLok new ExakteLok STROM puts e1 get_typ rescue Illegalelok puts end Zweiter Versuch unzulaessiger Typ begin e2 Exaktelok new 35 puts e2 get_typ rescue Illegalelok puts end W hrend bei e1 der Typ Elektrolok ausgegeben wird erhalten Sie f r e2 die fol gende Fehlermeldung Dieser Loktyp existiert nicht Weitere objektorientierte Konstrukte 211 Introspektion Ein interessantes Feature vieler objektorientierter Programmiersprachen ist die M glichkeit zur Laufzeit d h w hrend ein Skript ausgef hrt wird die Bestandteile von Klassen und Objekten zu untersuchen Gerade f r eine untypisierte Sprache wie Ruby ist es praktisch dass Sie jederzeit ermitteln k nnen welcher Klasse ein Objekt angeh rt auf welche Methoden es reagiert oder wie seine Ahnenreihe bis hinauf zu Object aussieht Eine solche F higkeit wird als Introspektion oder Reflexion bezeichnet auf Deutsch k nnte man auch Nabelschau dazu sagen Die einfachste Introspektionsmethode haben Sie bereits kennengelernt Objekt class
412. omputer in Ber hrung und hatte sp ter das Gl ck dieses langj hrige Hobby zu seinem Beruf machen zu k n nen Er arbeitet als Fachbuchautor Dozent und IT Berater mit den Schwerpunkten UNIX Serveranwendungen und Webentwicklung in K ln Er ist Autor der B cher Praxiswissen Flash 8 und Praktischer Einstieg in MySQL mit PHP O Reilly sowie Handbuch f r Fachinformatiker Apache 2 und SUSE Linux 10 x Galileo Press F r den O Reilly Verlag hat er au erdem die Titel Java und XML Java Enterprise in a Nutshell DNS amp BIND Kochbuch Active Directory Praxiswissen Dreamweaver und Ajax von Kopf bis Fu bersetzt bzw mit bersetzt Seine Freizeit verbringt er am liebsten mit seiner Frau und seinem Sohn oder mit guten B chern Kolophon Das Design der Reihe O Reillys Basics wurde von Hanna Dyer entworfen das Coverlayout dieses Buchs hat Henri Oreal gestaltet Als Textschrift verwenden wir die Linotype Birka die berschriftenschrift ist die Adobe Myriad Condensed und die Nichtproportionalschrift f r Codes ist LucasFont s TheSansMono Condensed
413. on gt gt 3 step 9 3 i f seek i f putc gt 3 Nun k nnen Sie den Dateizeiger zur cksetzen und eine Zeile lesen um herauszu finden ob alles funktioniert hat gt gt f rewind gt 0 gt gt f gets gt 012 45 78 Eine weitere interessante Dateimethode ist sort Sie liest s mtliche Zeilen einer Datei aus und gibt sie als sortiertes Array zur ck was bei der Ausgabe in Dateien gespeicherter Listen manchmal ein zus tzliches Sortieren erspart Erzeugen Sie zum Testen eine Textdatei namens unsort txt mit nicht sortierten Zeilen beispielsweise C oomoo D gt ffnen Sie diese Datei anschlieRend zum Lesen und rufen Sie ihre Methode sort auf gt gt f File open unsort txt r gt lt File unsort txt gt gt gt f sort gt A n B n C n D n E n Verzeichnisse lesen Ruby kann nicht nur auf Dateien zugreifen sondern auch auf Verzeichnisse Das wird beispielsweise erforderlich sobald Sie Benutzern Ihrer Skripten die M glich keit einr umen selbst ber Dateinamen zum Speichern zu bestimmen Sie k nnten 2 Vorher m ssen Sie die Datei nat rlich schlie en wenn Sie die vorige bung mitgemacht haben f close 136 Kapitel 3 Ruby Klassen dann etwa eine Liste der vorhandenen Dateien anzeigen wenn es darum geht sie wieder zu laden oder beim Speichern nicht noch einmal denselben Dateinamen zu verwenden Um ein Verzeichnis auszulesen m ssen Sie ein Objekt der Klass
414. on 2 Entscheiden Sie sich f r den Servertyp Developer Machine MySQL wird nicht mit Priorit t ausgef hrt sondern wie auf einem Arbeitsrechner zu empfehlen als ein Programm unter vielen 3 Als Datenbanktyp sollten Sie Multifunctional Database w hlen um flexibel mit allen MySQL Tabellentypen arbeiten zu k nnen 4 Unter Tablespace k nnen Sie das Laufwerk und das Verzeichnis f r Ihre MySQL Datenbanken einstellen 5 W hlen Sie Decision Support f r maximal 20 gleichzeitige Client Verbindungen mehr braucht ein Entwicklungsrechner nicht 6 Behalten Sie den Standard TCP Port 3306 bei auch Enable Strict Mode f r eine strengere Datenbankabfrage Syntax sollten Sie eingeschaltet lassen 7 Die beste Zeichensatzeinstellung f r Webanwendungen ist Standard Character Set ISO 8859 1 8 W hlen Sie Install As Windows Service und Launch the MySQL Server automat ically um MySQL als Dienst zu installieren und beim Booten automatisch zu Zugriff auf Datenbanken 315 starten Include Bin Directory in Windows PATH sorgt daf r dass Sie die MySQL Kommandozeilen Hilfsprogramme aus jedem Verzeichnis aufrufen k nnen 9 Aktivieren Sie Modify Security Settings und geben Sie ein Passwort f r den MySQL Administrator root ein Enable root access from remote machines sollte deaktiviert bleiben die Fernadministration von Servern sollte ein weniger pri vilegierter Benutzer vornehmen Create An Anonymous Account ist in der Regel
415. on 5 1 2688 lt C Copyright 1985 2861 Microsoft Corp C Dokumente und Einstellungen Sascha gt ed Eigene Dateien myruhy C Dokumente und Einstellungen Sascha Eigene Dateien myruby gt ruby hello rb Welt t jetzt Mon Aug 21 12 30 53 Westeurop ische Sommerzeit 2006 hei en Sie Sascha Hallo Sascha C Dokumente und Einstellungen Sascha Eigene Dateien myruby gt Abbildung 1 2 Die Ausf hrung des ersten Ruby Skripts in der Windows Eingabeaufforderung Die einzelnen Codezeilen bedeuten Folgendes puts Hallo Welt Das Kommando puts gibt den bergebenen Text oder einen beliebigen Aus druck der dann zun chst berechnet wird gefolgt von einem Zeilenumbruch aus Die Ausgabe landet in der ersten freien Zeile des Konsolen oder Eingabe aufforderungs Fensters in dem Sie das Skript ausf hren Konstanter Text hier Hallo Welt ist an den Anf hrungszeichen erkennbar er wird einfach Zeichen f r Zeichen ausgegeben Wenn Sie puts mehrere durch Kommata getrennte Ausdr cke bergeben wird jeder in einer eigenen Zeile dargestellt jetzt Time new Diese Anweisung speichert Datum und Uhrzeit gem der aktuellen Systemzeit des Rechners unter dem Namen jetzt puts Es ist jetzt jetzt Auch diese puts Anweisung gibt Text aus mit einer Besonderheit Zeichenfol gen in geschweiften Klammern nach einer Raute werden zun chst ausgewertet und dann ausgegeben Es wird also nicht etwa der ziem
416. origen Kapitel wissen gibt es verschiedene M glichkeiten nebenl ufige Ser ver zu schreiben Durch MPM k nnen Sie die jeweils passende Variante f r Ihr Sys tem und Ihre Bed rfnisse ausw hlen Die beiden wichtigsten Beispiele sind Den Webserver Apache 2 installieren 275 prefork die klassische rein prozessbasierte UNIX L sung Prefork bedeutet dass neue Prozesse nicht erst beim Eintreffen von Client Anfragen sondern bereits vorher auf Vorrat erzeugt werden worker ein Thread basiertes Modell Wenn Ihr System ber eine moderne Thread Implementierung verf gt zum Beispiel Linux ab Kernel 2 4 arbeitet diese Variante speicherschonender als prefork Daneben gibt es einige gemischte Prozess Thread Modelle F r Windows und einige andere Nicht UNIX Plattformen werden jeweils eigene angepasste MPM verwendet Webanwendungen zu entwickeln Wenn Sie eine Website auf einem u eigenen Server im Internet ver ffentlichen m chten sind zus tzliche berlegungen erforderlich vor allem im Hinblick auf die Sicherheit Wenn Sie weitere Informationen ber Apache ben tigen empfehle ich Ihnen mein Buch Apache 2 2 Auflage Bonn 2006 Galileo Press Auch auf der Website zu diesem Buch unter http buecher lingo world de apache2 finden Sie zahlreiche Konfigurationstipps A Die Einf hrung in diesem Abschnitt gen gt um mit Apache eigene Installation unter Windows F r Windows bietet die Apache Software Foundation einen be
417. ot entweder eine gemeinsame Elternklasse haben oder eben ein Inter face implementieren das die gemeinsamen Methoden getFarbe und getHoechst geschwindigkeit vorgibt Der Datentyp des Parameters von info wird dann auf diesen gemeinsamen Typ ge ndert und es funktioniert wieder Ein anderer Nebeneffekt der Typisierung ist brigens die so genannte Polymorphie Eine Methode mit demselben Namen kann mehrfach definiert werden wenn die Anzahl oder Datentypen der Parameter unterschiedlich sind In untypisierten Sprachen wie Ruby ist das alles nicht n tig Da Variablen keinen ein f r alle Mal festgelegten Datentyp haben kann eine Methode einfach dyna misch ermitteln wie viele Argumente sie erhalten hat das wurde im Abschnitt Parameter auf Seite 170 erl utert und auch f r die Wertr ckgabe ist kein bestimmter Typ vorgegeben Weitere objektorientierte Konstrukte 207 Ruby kennt keine Mehrfachvererbung siehe den Kasten Hintergrundwissen Typisierte und untypisierte Sprachen auf Seite 207 Trotzdem kann es manchmal n tzlich sein dieselbe Methode f r verschiedene nicht verwandte Klassen bereitzu stellen Ruby kennt einen eleganten Weg daf r den Import eines Moduls als so genanntes Mixin Dazu muss das Modul eine zun chst widersinnig erscheinende da in sich nicht aufrufbare Instanzmethode definieren Nach dem Import steht diese Methode in einer Klasse zur Verf gung wie jede Ihrer eigenen Instanzmetho den
418. p 21 Client beenden falls quit eingegeben wurde 22 break if text quit 23 Client Socket mit Host und Portnummer erzeugen 24 conn TCPSocket new host port 25 Anfrage an den Server senden 26 conn printf s r n text 238 Kapitel 5 Netzwerkanwendungen Beispiel 5 2 Der TCP ECHO Client echoclient rb Fortsetzung 27 28 29 30 31 32 33 34 35 Bei EXIT auch den Client beenden break if text EXIT Server Antwort empfangen antwort conn read Socket schliessen conn close Antwort ausgeben puts Antwort antwort end Der Client besteht aus folgenden Arbeitsschritten Zeile 1 Auch hier muss die Bibliothek socket importiert werden Zeile 4 13 Hostname und Server Portnummer werden aus den ersten beiden Kommandozeilenargumenten gelesen oder behelfsweise auf localhost bezie hungsweise Port 7 gesetzt Zeile 15 Zur Kontrolle werden Host und Port ausgegeben Zeile 17 35 Der Client nimmt nun in einer Schleife Benutzereingaben entge gen sendet sie an den Server und empf ngt dessen jeweilige Antwort Zeile 20 Einlesen der Benutzereingabe von STDIN Zeile 22 Wenn die Eingabe quit lautet wird nur der Client beendet indem die Schleife per break verlassen wird Der Server l uft dagegen unbehelligt wei ter Zeile 24 Ein TCPSocket wird erzeugt um eine Verbindung zum Server herzu stellen Zeile 26 Der Text der Client Anfrage wird an den Server gesendet und zwar auch ein ev
419. p SIGCLD 264 Kapitel 5 Netzwerkanwendungen Beispiel 5 5 Die Forking Version des ECHO Servers echoforkserver rb Fortsetzung 68 Reaping 69 Process wait 70 Meldung 71 STDOUT puts CLIENT VERBINDUNG BEENDET 72 73 end 74 end 75 Lauschenden Socket schliessen 76 server close Die einzige kleine nderung im Server die noch erw hnt werden sollte ist die leicht ge nderte Struktur der accept Schleife Zeile 19 20 Sie wird nun als Endlos schleife ausgef hrt und falls im jeweiligen Durchlauf keine Client Verbindungsan frage eingeht wird per next sofort der n chste Durchlauf eingeleitet Letztlich ist dies aber Geschmackssache Beispiel 5 6 Der passende Client zum Forking ECHO Server echoforkclient rb 1 require socket 2 Host und Port von der Kommandozeile lesen 3 oder auf localhost und 7 setzen 4 if ARGV o 5 host ARGV 0 6 else 7 host localhost 8 end 9 if ARGV 1 10 port ARGV 1 to_i 11 else 12 port 7 13 end 14 Konfiguration ausgeben 15 printf Server s Port d n n host port 16 Client Socket mit Host und Portnummer erzeugen 17 conn TCPSocket new host port 18 Zunaechst Endlosschleife 19 loop do 20 print Text 21 Text von STDIN lesen Zeilenumbruch entfernen 22 text STDIN gets chomp 23 Anfrage an den Server senden 24 conn printf s r n text 25 Bei EXIT oder QUIT den Client beenden 26 break if text EXIT text
420. p ter durch die Eingabe von Q verlassen werden Zeile 34 36 Sollte die Eingabe gar keinen Slash enthalten ist davon auszu gehen dass es sich um einen reinen Hostnamen handelt Da dieser keine Seite zum Anfordern enth lt wird als URL Pfad der Startseite angeh ngt Der regul re Ausdruck selbst wird wie noch oft in diesem Skript als r statt geschrieben um das Escaping des Zeichens zu vermeiden Zeile 38 Ein Aufruf von parse_url zerlegt die URL in die drei Komponenten Host Port und Pfad Zeile 40 132 Anforderung Auslesen und Verarbeiten der Antwort werden in einen Block verpackt um einen eventuellen Fehler abzufangen insbesondere einen nicht existierenden Host Zeile 42 44 Eine neue Net HTTP Instanz wird erzeugt als Argumente dienen der extrahierte Hostname und die Portnummer Anschlie end wird per GET Anfrage die gew nschte Ressource geladen Zeile 46 60 Solange die Server Antwort einen 30x Statuscode besitzt folgt der Browser automatisch der Weiterleitung Zeile 48 Aus dem Header Location wird die URL des Weiterleitungsziels aus gelesen Zeile 50 53 Manche Weiterleitungen besitzen eine absolute URL wie http andere site de seite Wenn dies der Fall ist muss diese URL erneut zerlegt wer den Anschlie end wird aus der neuen URL ein Net HTTP Objekt mit Host und Port erzeugt Zeile 55 Sollte das Weiterleitungsziel dagegen nur ein URL Pfad wie seite sein kann dieser Pfad sofor
421. path abgelegt Zeile 12 Die if Abfrage pr ft ob der aktuelle Pfad path ein Verzeichnis ist Dazu wird die oben besprochene Methode File directory auf den Pfad ange wendet Wenn der Eintrag ein Verzeichnis ist werden die Zeilen 13 18 ausge f hrt ansonsten der else Block in Zeile 20 22 Zeile 15 Der Verzeichnisname wird in eckigen Klammern ausgegeben Zuvor wird das Leerzeichen mit indent multipliziert um die korrekte Einr ckungs tiefe zu erzeugen Zeile 18 Hier erfolgt der rekursive Aufruf von listdir Als Parameter werden path der komplette Pfad des aktuellen Unterverzeichnisses und der um 2 erh hte Wert von indent bergeben Ein nachgestelltes if sorgt daf r dass f r die Verzeichnisse und kein Aufruf stattfindet diese w rden n mlich ansonsten zu einer Endlosschleife f hren Klassen entwerfen und implementieren 193 Zeile 22 Hier wird der Name des Eintrags ohne eckige Klammern ausgegeben wenn er kein Verzeichnis ist Die Einr ckung funktioniert wie bei den Ver zeichnisnamen in Zeile 15 Zeile 26 Mit Hilfe der Dir Methode close wird das Verzeichnis wieder geschlossen Zeile 29 Hier ist die Methodendefinition bereits beendet das ist tats chlich die erste Anweisung die ausgef hrt wird Sie weist einer Variablen namens dir den Wert zu weil das aktuelle Arbeitsverzeichnis als Standardverzeichnis f r die Funktion des Programms verwendet wird Zeile 31 Wenn das erste Kommandozeilenargume
422. piel puts Bitte geben Sie eine Zahl ein print gt zahl gets to_f Die meisten Anweisungen bestehen aus mehreren einzelnen Elementen Das kleinste untrennbare Element einer Anweisung wird als Token bezeichnet der erste Schritt bei der bersetzung oder Interpretation von Quellcode besteht darin ihn in diese Token zu zerlegen Wichtige Token Arten sind unter anderem e Literale das hei t w rtlich gemeinte Einzelwerte wie die Zahl 42 oder der Text Das Restaurant am Ende des Universums e Variablen also benannte Speicherpl tze die bei der Verarbeitung Ihres Skripts durch ihren aktuellen Wert ersetzt werden e Operatoren zur Verkn pfung von Werten zum Beispiel arithmetische Opera toren wie und oder Vergleichsoperatoren wie etwa ist gleich und lt kleiner als 32 Kapitel 2 Sprachgrundlagen e Methoden das hei t benannte Anweisungsfolgen die bestimmte Aufgaben erledigen oder Werte berechnen puts Text gibt beispielsweise den angege benen Text aus Zahl round rundet die entsprechende Zahl Bei vielen Token ist es brigens egal ob Sie sie durch Leerzeichen voneinander trennen oder nicht 3 5 2 bedeutet beispielsweise genau dasselbe wie 3 5 2 Hier einige wenige Anwendungsbeispiele wobei deren Bedeutung und Funktions weise sp ter in diesem Kapitel genauer erl utert wird e Wertzuweisung einen Wert speichern gruss Hallo e Methodenaufruf hier ein Ausgabebefehl puts Hier ist Ru
423. pilierung an Ihre Bed rfnisse anzupassen Das Skript kennt unz hlige Optionen geben Sie Folgendes ein wenn Sie sie alle studieren m chten configure help less Hier nur die allerwichtigsten Optionen im berblick prefix Verzeichnispfad gibt das bergeordnete Verzeichnis f r die Apache Installation an standardm ig usr local apache2 enable layout Layoutname erm glicht alternativ oder zus tzlich zur Angabe eines Verzeichnisses die Auswahl eines Installationslayouts das die Verzeich nisse f r die verschiedenen Komponenten festlegt Die Datei config layout ent h lt die Definitionen der verschiedenen Layouts Sie k nnen sie mit einem Texteditor ffnen um das f r Sie passende Layout zu finden oder nach dem Schema in der Datei selbst zu erstellen with mpm MPM Modul w hlt eines der oben angesprochenen Multi Processing Module MPM aus Unter UNIX wird standardm ig das MPM prefork installiert Wenn Sie keine exotischen Drittanbieter Module verwenden kann sich auch die Einstellung with mpm worker lohnen sie installiert das Thread basierte Worker MPM enable so ist eine der wichtigsten Optionen Sie schaltet die Unterst tzung f r Dynamic Shared Objects DSOs ein so dass Module dynamisch hinzuge f gt werden k nnen Da Apache fast alle seine Aufgaben durch einzelne Module l st ist dies praktisch unabdingbar Inzwischen ist diese Option gl ck licherweise Standard enable modules modul
424. prechende Teilausdruck beliebig oft im untersuchten String vorkom 92 Kapitel2 Sprachgrundlagen men darf das hei t keinmal einmal oder fter Das folgende Beispiel passt auf eine 1 gefolgt von beliebig vielen Nullen 10 Hier noch ein Beispiel das ein Kleiner Zeichen beliebig viele zuf llige Zeichen und ein anschlie endes Gr er Zeichen findet eine vermeintlich perfekte Beschrei bung von HTML oder XML Tags I2 3 Dabei ergibt sich allerdings ein Problem das sich erst offenbart wenn man den gesamten Ausdruck in runde Klammern setzt auf einen String mit mehreren sol chen Tags anwendet und anschlie end den Inhalt von 1 kontrolliert Hier ein ent sprechender irb Test gt gt html lt html gt lt body gt lt h1 gt Hi lt h1 gt lt body gt lt html gt gt lt html gt lt body gt lt h1 gt Hi lt h1 gt lt body gt lt html gt gt gt if html lt gt puts 1 end lt html gt lt body gt lt h1 gt Hi lt h1 gt lt body gt lt html gt Die Ausgabe des gesamten Strings zeigt dass hier etwas nicht in Ordnung sein kann Denken Sie noch einmal genau dar ber nach was die einzelnen Bestandteile von lt r gt bedeuten ein Kleiner Zeichen beliebig viele zuf llige Zeichen ein Gr er Zeichen Nun auch die verschiedenen Gr er Zeichen innerhalb des Strings sind beliebige Zeichen das hei t trifft genauso gut auch auf sie zu Erst das allerletzte m gliche Gr f er Zeichen wi
425. pricht dA Za z e alpha e digit Buchstabe entspricht A Za z Ziffer entspricht d e space Whitespace entspricht s Regul re Ausdr cke im Einsatz Nachdem Ihnen nun einigerma en ausf hrlich die Regex Syntax vorgestellt wurde sollten Sie auch wissen was man mit regul ren Ausdr cken alles anstellen kann In diesem Abschnitt erhalten Sie einen kurzen berblick in sp teren Kapiteln werden einige Anwendungsm glichkeiten vertieft Das einfache Matching das Finden von Suchmustern ist die h ufigste Anwen dung f r regul re Ausdr cke Die beiden zust ndigen Operatoren und haben Sie bereits kennengelernt Hier zur Wiederholung noch einmal ihre Funktionsweise in Kurzform String Regexp liefert bei Erfolg die Anfangsposition des ersten Treffers im String und bei Misser folg nil String Regexp ergibt dagegen true wenn es keinen Treffer gibt und andernfalls false Mustervergleiche mit regul ren Ausdr cken 97 Ein weiteres besonders n tzliches Einsatzgebiet regul rer Ausdr cke ist das Erset zen der Treffer durch neuen Text Daf r sind die String Methoden sub und gsub zust ndig String sub Regex NeuStr ersetzt den ersten Treffer im untersuchten String durch den String Neustr String gsub Regex NeuStr ersetzt dagegen alle Treffer Ein Beispiel f r Letzteres haben Sie bereits in Zeile 26 des Textmanipulierer Beispiels gesehen txt gsub aeiou
426. print ist daher lediglich eine kompakte Schreibweise f r STDOUT print und gets entsprechend eine Kurzfassung von STDIN gets Probieren Sie es einfach in irb aus Ein und Ausgabe 115 gt gt puts Einfache Ausgabe Einfache Ausgabe gt gt STDOUT puts Einfache Ausgabe auf STDOUT Einfache Ausgabe auf STDOUT gt gt a gets Hallo gt Hallo n gt gt a STDIN gets Hallo STDIN gt Hallo STDIN n F r die Konsolenausgabe k nnen Sie als Alternative zu STDOUT auch STDERR w hlen was Sie immer dann tun sollten wenn Fehlermeldungen oder Warnungen auszuge ben sind Geben Sie zum Testen folgendes Beispielprogramm in Ihren Editor ein und speichern Sie es als ausgabe rb STDOUT puts Dies ist eine normale Ausgabe STDERR puts Dies ist eine Warnung F hren Sie es zun chst normal aus beide Zeilen werden untereinander ausgege ben es geschieht nichts Besonderes gt ruby ausgabe rb Dies ist eine normale Ausgabe Dies ist eine Warnung Leiten Sie nun die Standardausgabe um damit Sie den Unterschied erkennen gt ruby ausgabe rb ausgabe txt Dies ist eine Warnung Wie Sie sehen wird nur noch die auf STDERR geschriebene Warnung auf der Kon sole ausgegeben STDOUT wurde dagegen in die Datei ausgabe txt umgeleitet was Sie berpr fen k nnen indem Sie sich deren Inhalt anzeigen lassen gt type ausgabe txt Windows Dies ist eine normale Ausgabe cat ausgabe txt UNIX Dies ist ein
427. pten tun hier erst einmal nichts zur Sache ihre Auf gabe wird weiter unten im Zusammenhang mit komplexeren Anwendungen erl u tert ffnen Sie zun chst das Skript app controllers hello_controller rb in einem Textedi tor Ihrer Wahl Es sieht zun chst so aus class HelloController lt ApplicationController def index end end Es wurde also eine leere Klassendefinition erstellt die von der Standardklasse ApplicationController der Vorlage f r Rails Controller abgeleitet wurde Erg n zen Sie das Skript zu folgender Fassung class HelloController lt ApplicationController def index Text lokal erzeugen Die erste Rails Anwendung 339 gruesse w Hallo Tag Hi Moin welten w Welt Mars Jupiter Saturn grusszeilen gruesse collect g welten collect w Hgh Hu In der View verfuegbare Instanzvariablen grusstext grusszeilen join lt br gt zeit Time now end end Die verwendeten Anweisungen brauchen hier wohl nicht weiter erl utert zu wer den In der View stehen die beiden Instanzvariablen grusstext und zeit zur Ver f gung Als N chstes muss die View app views hello index rhtml bearbeitet werden Sie besteht zun chst nur aus dem folgenden unvollst ndigen HTML Code lt h1 gt Hello index lt h1 gt lt p gt Find me in app views hello index rhtml lt p gt Ersetzen Sie diese beiden Zeilen durch das folgende HTML Dokument mit einge betteten Ruby Ausdr cken lt html
428. quemen Bin r Instal ler im MSI Format Windows Installer an Starten Sie das Paket apache_2 2 4 win32 x86 no_ssl msi per Doppelklick Folgen Sie dann Schritt f r Schritt den Installationsanweisungen auf den folgenden Dialogseiten 1 Information dass Apache 2 2 installiert wird Klicken Sie hier wie auch auf allen folgenden Bildschirmen Next an um fortzufahren Anzeige der Apache Lizenz Es handelt sich um eine GPL hnliche Open Source Lizenz im Wesentlichen erlaubt sie den freien Einsatz und die Ver nde rung von Apache und sch tzt die Entwickler vor der Vereinnahmung durch kommerzielle Unternehmen oder gar Softwarepatente W hlen Sie I accept the terms in the license agreement Kurze bersicht ber die Features von Apache 2 2 und weitere Informations quellen Eingabe einiger Grundeinstellungen Network Domain ist Ihr Domainname f r einen lokalen Testserver k nnen Sie zum Beispiel test local eingeben Server Name ist der Name des Webservers zum Beispiel www test local Die Adminis trator s E Mail Address wird angegeben damit Benutzer Ihnen bei Fehlern eine entsprechende Mitteilung senden k nnen normalerweise wird daf r die Adresse webmaster lt Ihre Domain gt verwendet Als Letztes m ssen Sie aus w hlen ob Apache als automatisch startender Produktions Server For All Users on Port 80 as a Service oder als manuell zu startendes Testprogramm only for the Current User on Port 8080 when
429. r glich nderbar sind die Ver erbung selbst wird weiter unten n her erl utert class VarEasyRechteck lt Rechteck attr_writer breite hoehe end Erzeugen Sie zum Testen eine VarEasyRechteck Instanz und ndern Sie beispiels weise nachtr glich ihre Breite r VarEasyRechteck new 10 30 printf Flaeche vorher d n r flaeche Klassen entwerfen und implementieren 195 Breite aendern r breite 20 printf Flaeche nachher d n r flaeche Hier das Ergebnis Flaeche vorher 300 Flaeche nachher 600 Mit att _writer sollten Sie beraus vorsichtig und sparsam umge hen denn die entsprechenden Attribute lassen sich von au en unge pr ft auf jeden beliebigen Wert ndern Eine sicherere aber fast genauso praktische Alternative ist eine selbst definierte Methode die den Namen eines Attributs gefolgt von einem Gleichheitszeichen tr gt Auf diese k nnen Sie von au en genauso zugreifen wie auf einen automatisch generierten Setter aber zus tzlich kann eine Wertkontrolle eingebaut werden Die nachfolgende Klasse kapselt ein rechtwinkliges Dreieck indem sie einen der beiden anderen Winkel alpha festlegt der zweite beta ergibt sich durch die Operation 90 alpha Damit dieser Winkel nicht zu gro wird enth lt der Kon struktor eine entsprechende Abfrage wobei der Ersatzwert 89 9 willk rlich gew hlt wurde jeder Wert unter 90 ist zul ssig Die spezielle Methode alpha ndert den Winkel nachtr gl
430. r Child Prozess nicht mehr gefunden werden In Abbildung 5 5 ist das jedenfalls so die zweite Ausgabe lautet nil ET eRscha tux Betenlstenster Konsole ON Situng Bearbeien Ansicht Lesezeichen Einstellungen Hile sascha tux gt ruby forkx rb Ich bin das Child und bin schon fertig Ich bin der Parent mein Child heisst 5108 Hier mein Child in der Prozessliste sascha 5108 0 0 0 0 o 0 pts 1 Z 00 22 0 00 ruby lt defunct gt Bitte ENTER druecken Reaping erledigt Ist mein Child noch in der Frozessliste n i sascha tux gt J Een Abbildung 5 5 Ausgabe des Zombie Testprogramms Vor dem Reaping befindet sich der Child Prozess noch in der Prozessliste danach nicht mehr In der Praxis gen gt dieses Vorgehen meistens nicht Das Problem ist n mlich dass ein Process wait Aufruf blockiert bis der erste Child Prozess beendet wurde Wenn Sie etwa einen TCP Server schreiben der im Parent Prozess die accept Schleife aus f hrt und im Child Prozess die Client Verbindungen verarbeitet k nnen Sie diese Anweisung nicht einfach in den Parent Teil schreiben Denn dann l sst der Server nur genau einen Client zu wartet auf das Ende von dessen Verbindung und akzep tiert erst dann den n chsten wait darf mit anderen Worten nur dann aufgerufen werden wenn feststeht dass ein Child beendet wurde Gl cklicherweise wird dieses Ereignis dem Parent automa tisch durch ein Signal mitgeteilt Signale sind di
431. r Gastgeber bezeichnet jeden Rechner der an der Netzwerkkommunikation als aktiver Sender oder Empf nger mitwirkt im Gegensatz zu den Routern die nur als Vermittler zwischen verschiedenen Netz werken agieren 4 Auf der Anwendungsschicht schlie lich werden die eigentlichen Nutzdaten aus getauscht Dort gibt es eine Reihe standardisierter Anwendungsprotokolle wie HTTP Web FTP und E Mail In diesem Kapitel werden Sie allerdings auch ein eigenes Anwendungsprotokoll implementieren Auch diese Schichten werden beim Sender von oben nach unten und beim Empf n ger in umgekehrter Reihenfolge abgearbeitet Nehmen Sie beispielsweise an jemand m chte die Website www ruby lang org besuchen Dazu muss der Webbrowser Client auf seinem Rechner eine Verbindung mit dem Webserver auf dem Zielrech ner herstellen Diese Verbindung wird durch ein Paar eindeutiger Nummern gekennzeichnet die so genannten Portnummern Der Client verwendet dabei eine zuf llige Nummer der Server in der Regel eine je nach Aufgabe festgelegte Nummer ein Webserver hat beispielsweise meistens die Portnummer 80 Sobald die Verbindung steht sendet der Client eine Anfrage request deren Format durch ein Anwendungsprotokoll festgelegt wird F r Webseiten wird das Anwen dungsprotokoll HTTP verwendet die Anforderung der Startseite einer Website lau tet in dieser Sprache GET HTTP 1 1 weitere Anfragedaten Kurze Einf hrung in TCP IP 221 Die Anfrag
432. r auch alle Eintragsdateien enthalten wird Anschlie end k nnen Sie das Programm aus f hren und testen Nach dem Beispiel folgen einige Erl uterungen Beispiel 3 3 Das Konsolen Blog textblog txt 1 Gesamtzahl der Postings zunaechst auf 0 setzen 2 postings 0 3 Aktuelle Position auf 0 setzen 4 pos 0 5 Anzahldatei vorhanden 6 if File file postings txt 7 Anzahl auslesen 8 f File open postings txt r 9 postings f gets to_i 10 f close 11 Aktuelle Position entspricht zunaechst Anzahl 12 pos postings 13 end 14 Hauptschleife 15 loop do 16 Bildschirm loeschen plattformabhaengig 17 if RUBY_PLATFORM win 18 system cls 19 else 20 system clear 21 end 22 Fuenf Eintraege ab pos ausgeben falls vorhanden 23 if postings gt 0 24 puts Bisherige Eintraege 25 puts 26 puts 27 Letzter anzuzeigender Eintrag 130 Kapitel 3 Ruby Klassen Beispiel 3 3 Das Konsolen Blog textblog txt Fortsetzung 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 last pos 4 last 1 if last lt 1 Iterator umgekehrte Reihenfolge pos downto last il printf d i Aktuelle Datei oeffnen fname post i txt f open fname r Gesamten Inhalt auslesen und ausgeben post f read puts post puts
433. r einzelne Anweisungen ausf hren Geben Sie Folgendes ein um sich zum ersten Mal von Ruby begr en zu lassen das klappt aus jedem beliebigen Arbeitsverzeichnis da der Installer Ihren PATH ausf hrbarer Programme anpasst gt ruby e puts Hallo hier ist Ruby Hallo hier ist Ruby Wenn Sie die obige Ausgabe erhalten hat die Installation funktioniert und Sie k n nen im n chsten Abschnitt Ihr erstes richtiges Programm schreiben Installation unter Linux und anderen Unix Systemen Die Ruby Entwickler selbst geben keine fertigen Ruby Bin rpakete f r Linux und andere Unix Systeme heraus Allerdings ist Ruby ab Werk in den meisten moder nen Linux Distributionen aber auch in Mac OS X oder FreeBSD enthalten so dass Sie es nur in Ausnahmef llen selbst kompilieren m ssen berpr fen Sie also als Erstes ob Ruby bereits installiert ist ffnen Sie dazu ein Terminal und geben Sie Folgendes ein ruby v Wenn keine Fehlermeldung erscheint sondern eine Versionsnummer ab 1 8 x dann haben Sie bereits die passende Ruby Version f r die Arbeit mit diesem Buch und k nnen im n chsten Abschnitt mit dem ersten Beispiel weitermachen Andernfalls sollten Sie die Paketverwaltung Ihrer Distribution oder die Website Ihres Systeman bieters durchforsten und nachschauen ob eine aktuelle Ruby Version verf gbar ist 3 Falls Sie mit der Verwendung von Terminals nicht vertraut sind finden Sie weiter unten im Abschnitt Zu Unrecht gef rcht
434. r relevante Code zwischen class Float und end steht Dort erh lt die Methode round als Erstes einen Alternativnamen alias oldround round Beachten Sie dass der Methodenname round an dieser Stelle noch funktioniert der Aliasname wird zus tzlich vergeben Als N chstes wird unter dem Namen round allerdings eine neue Methode vereinbart so dass die klassische nur noch als old round zur Verf gung steht Die neue Methode round nimmt eine Nachkommastellenanzahl als optionales Argu ment mit dem Standardwert 0 entgegen Wenn stellen explizit oder automatisch 0 ist wird f r self den Wert der Flie kommazahl einfach oldround aufgerufen Andernfalls muss eine etwas komplexere Berechnung durchgef hrt werden Die Zahl wird mit der Zehnerpotenz der Nachkommastellenanzahl multipliziert und dann mittels oldround ganzzahlig gerundet Das Ergebnis wird per to_f in eine Flie kommazahl umgewandelt und wieder durch den Faktor der urspr nglichen Multiplikation geteilt So bleibt genau die gew nschte Anzahl von Nachkommastel len brig Und wie das letzte Beispiel zeigt k nnen Sie mit Hilfe eines negativen Arguments sogar vor dem Komma runden Diese Erweiterung ist am n tzlichsten wenn sie in einer externen importierbaren Bibliotheksdatei zur Verf gung steht Zu diesem Zweck k nnen Sie den Teil von def Float bis zum u ersten end in einer separaten Datei speichern beispielsweise unter dem Namen round rb und dann wie folgt am Anfang eine
435. r vorhanden ist und spei chert seinen Wert in der gleichnamigen Variablen Falls das Feld nicht existiert erh lt die Variable dagegen den Wert NEUKUNDE if cgi has_key kundennr kundennr cgi kundennr else kundennr NEUKUNDE end In den meisten F llen funktioniert dieser einfache Zugriff auf Formularfelder pro blemlos Es gibt allerdings zwei Arten von Steuerelementen die mehrere Werte zur ckliefern k nnen Checkboxen und multiple Auswahlmen s Bei ihnen liefert dieses Zugriffsverfahren jeweils nur den ersten Wert als String Wenn Sie alle ange gebenen Werte auslesen m chten m ssen Sie die Methode cgi param aufrufen Auch sie liefert einen Hash in dem die Feldnamen die Schl ssel bilden aber im Unterschied zum Direktzugriff auf die CGI Instanz ist der jeweilige Wert ein Array mit einem oder mehreren Strings Betrachten Sie als Beispiel die folgende Gruppe von Checkboxen Welche Programmiersprachen beherrschen Sie lt br gt lt input type checkbox name sprachen value ruby gt Ruby lt br gt lt input type checkbox name sprachen value perl gt Perl lt br gt lt input type checkbox name sprachen value php gt PHP lt br gt lt input type checkbox name sprachen value c gt C lt br gt lt input type checkbox name sprachen value java gt Java Angenommen ein User f llt das Formular mit dieser Checkbox Gruppe aus und kreuzt Ruby PHP und Java an Der einfache Zugriff b
436. rachgrundlagen encrypt Iterator ueber alle Zeichen des Textes text each_byte ch Durch Exklusiv Oder maskierten Zeichencode wieder in Zeichen umwandeln und an verschluesselten Text anfuegen encrypt ch key chr print Verschluesselter Text encrypt Zum einen k nnen Sie so die umst ndliche Bereichskonstruktion 0 text length vermeiden und zum anderen liegt das jeweilige Zeichen innerhalb des Blocks bereits als Codenummer vor was die eigentliche Verschl sselungszeile verk rzt Ein weiterer interessanter Iterator f r Bereiche Arrays und andere Mengen ist col lect Das Ergebnis jedes Blockdurchlaufs wird wieder als neues Element zu einem Array hinzugef gt Auf diese Weise l sst sich beispielsweise ganz schnell ein Pool mit allen 49 Lottozahlen bilden aus denen sp ter gezogen werden kann lottozahlen 1 49 collect z Z Wenn Sie das in irb eingeben erhalten Sie sofort das gesamte Array als Ausgabe gt 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 Aber anstatt den Wert des jeweiligen Elements aus der urspr nglichen Menge ein fach unver ndert zu bernehmen k nnen Sie nat rlich auch beliebige Ausdr cke daraus bilden Das folgende Beispiel speichert alle Quadrate der Zahlen 1 bis 20 in einem Array hier einmal in einer einzelnen irb Zeile und glei
437. rationsdatei namens httpd conf die sich im conf Verzeichnis des Servers befindet das Unterverzeichnis extra ent h lt einige optionale Konfigurationsdateien f r diverse Zusatzmodule In welchem Den Webserver Apache 2 installieren 279 Verzeichnis sich die Konfigurationsdateien unter UNIX bei Ihrem Installationslay out befinden k nnen Sie dem Eintrag sysconfdir in der Datei config layout aus dem Quellcode Paket entnehmen Bei der Installation in usr local apache2 mit dem Standardlayout Apache handelt es sich um das Verzeichnis usr local apache2 conf Unter Windows befindet sich die Datei im Verzeichnis lt Apache Basisverzeichnis gt conf bei einer Standardinstallation also unter C Programme Apache Software Foundation Apache2 2 conf Die Konfigurationsdatei besteht aus zahlreichen Konfigurationseinstellungen den Direktiven Die meisten von ihnen werden in der Datei selbst durch Kommentare beschrieben ein Kommentar ist jede Zeile die mit anf ngt Eine deutschspra chige Referenz aller Direktiven finden Sie im offiziellen Apache Manual http httpd apache org docs 2 2 de das normalerweise mit Apache auf Ihrem Rechner installiert wird Im Folgenden werden nur einige der wichtigsten Direktiven im berblick vorge stellt und zwar in der Reihenfolge in der sie in der Standard Konfigurationsdatei einer Apache Neuinstallation auftreten Beachten Sie dass es noch einige weitere wichtige Einstellungen gibt diese betreffen al
438. raxis d rfen Sie nat rlich kein so einfaches Passwort w hlen 320 Kapitel 6 Klassische Webanwendungen Wenn dieser User sofort aktiv werden soll ohne dass Sie den Client mysql beenden m ssen Sie danach die Benutzerdaten neu laden mysql gt FLUSH PRIVILEGES Ruby Zugriff auf MySQL Datenbanken Ruby ist mit einer Datenbankschnittstelle namens DBI ausgestattet die f r jede kon krete Datenbank einen Treiber DBD DataBase Driver ben tigt Der passende Trei ber f r MySQL muss manuell kompiliert werden Dies gelingt auf den meisten UNIX Systemen problemlos weil dort ein C Compiler zum Standardlieferumfang geh rt Unter Windows m ssten Sie zur Installation des DBD Treibers dagegen einen teuren Microsoft Compiler einsetzen weil die Ruby Makefiles standardm Big f r diese Variante konfiguriert sind Aus diesem Grund wird DBI an dieser Stelle nicht weiter vertieft Gl cklicherweise gibt es eine andere L sung in Form einer direkten MySQL Klasse F r Windows kann sie wie folgt ber den Erweiterungsmanager rubygens siehe den folgenden Kasten installiert werden gt gem update gt gem install mysql Um die Erweiterung unter UNIX zu installieren m ssen Sie sie dagegen aus dem Quellcode Paket installieren Laden Sie sie dazu von http tmtm org downloads mysql ruby herunter die aktuelle Version ist derzeit 2 7 Entpacken Sie das Archiv wie folgt tar xzvf mysql ruby 2 7 tar gz Wechseln Sie danach in das neue
439. rd als Treffer f r gt geliefert Das Kernproblem Der Quantifizie rer ist gierig englisch greedy das hei t er passt auf so viel Text wie m glich Wenn Sie die Gier aufheben m chten k nnen Sie hinter das Sternchen zus tzlich ein Fragezeichen setzen Der HTML Ausdruck lautet dann also lt gt Probieren Sie es selbst aus gt gt html lt html gt lt body gt lt h1 gt Hi lt h1 gt lt body gt lt html gt gt lt html gt lt body gt lt h1 gt Hi lt h1 gt lt body gt lt html gt gt gt if html lt gt puts 1 end lt html gt Es gibt noch eine andere L sung f r die HTML Tags Der folgende Ausdruck passt auf ein Kleiner Zeichen beliebig viele Zeichen die 5 kein Gr er Zeichen sind und ein Gr er Zeichen lt gt Der letzte allgemeine Quantifizierer ist das Pluszeichen Es bedeutet dass der betrachtete Teilausdruck mindestens einmal im String vorkommen muss Das fol gende Beispiel findet in Strings gepackte Flie kommazahlen mindestens eine Zif Mustervergleiche mit regul ren Ausdr cken 93 fer vor dem Dezimalpunkt und mindestens eine dahinter denken Sie an das weiter oben erw hnte Escaping des literalen Punkts durch den Backslash 0 9 0 9 Das Pluszeichen ist ebenso greedy wie das Sternchen auch hier k nnen Sie diese Wirkung mit einem nachgestellten Fragezeichen aufheben So passt lt gt wieder auf einen beliebig langen HTML Block und z
440. rd der Standardwert gew hlt lok1 Lok new Lok DIESEL lok2 Lok new Die Methode get_typ zeigt jeweils welche Art von Lokomotive erzeugt wurde lok1 get_typ Diesellok lok2 get_typ keine Beim Konstruktor von Gueterzug besitzen sogar alle drei Parameter Standardwerte def initialize lok0 Lok OHNE lok1 Lok OHNE waggons 0 loks Array new loks 0 Lok new loko Klassen entwerfen und implementieren 171 loks 1 Lok new lok1 waggons waggons end Diesen Konstruktor k nnen Sie mit null bis drei Werten aufrufen wobei Ihre Argu mente der Reihe nach den Parametervariablen zugewiesen werden Wenn Sie weni ger als drei Argumente bergeben erhalten die restlichen Parameter den jeweiligen Standardwert Zum Beispiel gz1 Gueterzug new Lok OHNE Lok OHNE O gz2 Gueterzug new Lok STROM Lok STROM Lok OHNE O Eine andere M glichkeit die Standardwerte ausschlie t besteht darin als letzten Parameter ein Rest Array anzugeben Diese Variable wird in der Parameterliste durch ein vorangestelltes Sternchen gekennzeichnet das jedoch nicht Teil des Variablennamens ist In diesem Array werden beliebig viele zus tzliche Argumente gespeichert Die folgende Methode verwendet ein solches Array als einzigen Parameter und gibt dessen Elemente nummeriert aus def argliste args i 1 args each arg printf 2d s n i arg i 1 Hier ein Aufrufbeispiel argliste hallo was
441. rden soll Klicken Sie hier wie auch zum Best tigen der nachfolgenden Seiten auf Next License Agreement in einer Textbox mit Scrollbalken erscheinen einige Hin weise zur installierten Version sowie zur Lizenz Ruby steht unter der GNU General Public License GPL der verbreitetsten Open Source Lizenz Sie erlaubt Ihnen die Software in jeder Hinsicht frei zu nutzen zu ver ndern und unter derselben Lizenz weiterzugeben und soll vor allem verhindern dass kommerzielle Softwarefirmen sich den Code exklusiv zu eigen machen Inso fern k nnen Sie wohl guten Gewissens auf I Agree klicken Choose Components w hlen Sie aus welche Bestandteile Sie installieren m chten Dieser Schritt wird in Abbildung 1 1 gezeigt Folgende Optionen ste hen zur Verf gung Ruby die Sprache selbst nicht abw hlbar SciTE der Texteditor FreeRIDE die Entwicklungsumgebung Enable RubyGems aktiviert den Ruby Erweiterungs Manager RubyGems European Keyboard Tastatur Anpassung f r Interactive Ruby IRB Auf einem halbwegs aktuellen Rechner d rfte es kein Problem sein alle Kom ponenten auszuw hlen Links unten teilt Ihnen die Angabe Space required mit wie viel Festplattenspeicher Ihre aktuelle Auswahl ben tigt die Vollinstallation belegt in der aktuellen Version knapp 100 Megabyte Ruby 184 20 Setup Choose Components Choose which features of Ruby 184 20 you want to install Check the components you
442. riablen die Strings enthalten gt gt ruby Ruby gt gt leer gt gt on_rails on Rails gt gt ruby leer on_rails Ruby on Rails P Beachten Sie dass das nur funktioniert wenn alle Komponenten bereits Strings sind es findet keine automatische Typumwandlung statt wie etwa in JavaScript Der Versuch liefert eine Fehlermeldung Wenn Sie sich also bei irgendeinem Element der Verkn pfung nicht sicher sind h ngen Sie to_s an den Aufruf der weiter unten beschriebenen String Konvertierungs Methode Hier ein Beispiel gt gt Die Antwort auf die grosse Frage ist 42 to_s gt Die Antwort auf die grosse Frage ist 42 Der Operator kann einen String vervielf ltigen sofern der vordere Operand der String und der hintere eine ganze Zahl ist Zum Beispiel gt gt 40 EEE EEEEEEEEEEE E EEEE EEEE EEEE EEE EEE EEEE EE gt gt Hallo 4 gt Hallo Hallo Hallo Hallo Ein letzter Operator der Ihnen vielleicht manchmal begegnet ist der tern re drei gliedrige also aus drei Operanden bestehende Fallentscheidungsoperator Er hat die Form Bedingung Dann Wert Sonst Wert Die Bedingung ist blicherweise eine Vergleichsoperation oder ein anderer logi scher Ausdruck Wenn sie wahr ist wird der Dann Wert als Wert des Gesamtaus drucks gew hlt andernfalls der Sonst Wert Zum Beispiel gt a 10 gt gt a lt 10 kleiner nicht kleiner gt nicht kleiner gt gt a
443. riert automatisch eine Liste mit Hyper links auf die Dateien im Verzeichnis wenn keine Indexseite DirectoryIndex siehe unten gefunden wird Includes aktiviert die Ausf hrung von SSI Server Side Includes FollowSymLinks l st symbolische Links Verweise auf Dateien in anderen Verzeichnissen auf Zum Beispiel Options Indexes FollowSymLinks AllowOverride Innerhalb der Website selbst k nnen zus tzliche Dateien mit Konfigurationsdi rektiven stehen die nur das jeweilige Verzeichnis betreffen Der Standardname einer solchen Datei lautet htaccess dies kann auf Wunsch mit Hilfe der hier nicht n her beschriebenen Direktive AccessFileName ge ndert werden Die Direktive AllowOverride legt fest ob und welche Direktiven in htaccess Dateien innerhalb der Verzeichnisse der Website selbst berschrieben werden d rfen Neben All jede grunds tzlich verzeichnisf hige Direktive und None keine k nnen einige Gruppen angegeben werden zum Beispiel FileInfo Datei Einstellungen oder AuthConfig Authentifizierung Zum Beispiel AllowOverride FileInfo Wenn Sie eine einzelne Website betreiben die nur von Ihnen administriert wird sollten Sie htaccess Dateien mittels AllowOverride None abschalten und s mtliche Konfigurationseinstellungen in die httpd conf schreiben Diese Dateien sind nur n tzlich wenn Sie die Verantwortung f r einzelne Verzeich nisse an Dritte delegieren m chten 282 Kapitel 6 Klassische Webanwendu
444. riffsschutz 201 offset Methode 148 Oktalzahlen 39 OOP siehe Objektorientierung Open Source 2 open Methode 127 Operationen 50 arithmetische 51 bitweise 56 logische 55 Rangfolge 62 sonstige 60 Vergleiche 52 Operatoren 51 1 56 l 53 I 88 AQ 43 q 43 w 49 amp 56 au 55 arithmetisch 51 Strings 61 60 arithmetisch 51 Strings 61 60 51 60 lt 53 lt lt bitweise 57 lt lt HIER Dokumente 44 lt 54 lt gt 55 60 52 54 86 97 gt 53 gt 54 gt gt 57 Zeichencode 68 61 N 57 56 55 als Methoden 188 386 Index and 55 eigene 188 not 56 or 55 Rangfolge 62 Operatoren 51 Operatoren lt Vererbung 198 Options Apache Webserver 282 or Operator 55 Order Apache Webserver 283 OSI Referenzmodell 221 P param Methode 297 Parameter 170 Arrays als 172 dynamische 174 Hashes als 173 Standardwerte 171 Parametervariablen siehe Parameter Parent Prozess 257 PID ermitteln 262 parse Methode Time 142 Parser 254 PATH Umgebungsvariabe f r Ruby erg nzen 9 PATHEXT Umgebungsvariable Windows 35 Patterns siehe Design Patterns Perl 2 Pickaxe Book Programming Ruby 2 PID siehe Prozess ID ping 226 Pipe 115 pop Methode 68 Port TCP UDP 228 POSIX Signale 261 POST HTTP Methode 284 post_match Methode 148 ppid Methode 262 pre_match Methode 148 Principle of Least Surprise 4 print Methode 116 printf Methode 117
445. ring modifier e Implizit reg regexp Klassenmethoden e Regexp compile Synonym f r Regexp new e Regexp last_match Treffer des letzten Regexp Vergleichs e Regexp escape string maskiert alle Zeichen die in regul ren Ausdr cken eine besondere Bedeutung haben durch Instanzmethoden e reg match string liefert MatchData Instanz e reg string liefert Trefferposition in string oder nil String Beliebiger Textblock siehe auch String Literale Instanzmethoden e str str Strings verketten e str int Inhalt int mal hintereinander e str n Zeichen Nr n 1 e str m n maximal n Zeichen ab Position n 1 368 Anhang A Ruby Kurzreferenz e str str2 der Teilstring str2 falls er vorkommt oder nil falls nicht e str str2 der Teilstring wird durch str2 ersetzt L nge darf unterschiedlich sein e str capitalize str capitalize jeden Anfangsbuchstaben gro schreiben die Variante mit ver ndert wie bei allen nachfolgenden Operationen eine String Variable dauerhaft e str center n zentriert den String mit Hilfe von Leerzeichen auf einer Gesamt breite von n Zeichen e str chop str chop entfernt das letzte Zeichen e str comp str chomp entfernt das letzte Zeichen nur dann wenn es Whitespace ist praktisch f r den Zeilenumbruch bei gets Eingaben e str count str2 addiert wie oft jedes Zeichen aus str2 in str vorkommt e str downcase str downc
446. rletzte Komponente nun die Differenz zur UTC Weltstandardzeit Greenwich Mean Time ohne Sommerzeit angezeigt Bis Version 1 8 4 lautete die Ausgabe dagegen zum Beispiel Fri Oct 20 22 40 47 Westeuropaeische Normalzeit 2006 F r Endanwenderprogramme ist dieses Format in jedem Fall nicht empfehlenswert da die merkw rdige Reihenfolge der Datums und Uhrzeitbestandteile weder konti nentaleurop ischen noch britisch amerikanischen Standards entspricht Daher soll ten Sie sich mit den vielen Methoden der Klasse Time vertraut machen die die einzelnen Elemente von Datum und Uhrzeit extrahieren und diese selbstst ndig zusammensetzen Hier die wichtigsten im berblick die Referenzvariable f r das Time Objekt hei t jeweils t e t year die vierstellige Jahreszahl zum Beispiel 2006 e t month der Monat in numerischer Darstellung 1 12 day der Tag im Monat 1 31 t t t e t wday der numerisch codierte Wochentag 0 So 1 Mo 6 Sa t t t hour die Stunde 0 23 min die Minute 0 59 sec die Sekunde 0 59 Damit k nnen Sie sich eine f r deutschsprachige User gut lesbare Datums und Uhrzeitanzeige zusammenbasteln Zum Beispiel t Time new printf 02d 02d 4d 02d 02d 02d n t day t month t year t hour t min z sec 3 RFC hei t Request For Comments Bitte um Kommentare Es handelt sich um die ffentlich verf g bare Dokumentation von Protokollen Diensten und Techniken des In
447. roup Methode 302 Child Prozess 257 chomp Methode 66 chop Methode 66 chr Methode 67 CIDR 225 class Methode 46 212 Client 232 close Methode 127 code Methode 242 collect Iterator 105 Common Gateway Interface siehe CGI Comparable Modul 209 Compiler 3 Connection HTTP Header 285 286 console Rails Tool 348 Content Length HTTP Header 286 Content Type HTTP Header 286 CGI 287 Cookies 304 auslesen 306 erzeugen 305 setzen 305 cos Math Methode 65 CREATE TABLE SQL Anweisung 318 create Active Record Methode 349 CRUD Datenbank Management 347 CSS 300 externe Datei 300 in CGls einbetten 313 D database yml Rails Konfigurationsdatei 344 Datagramm IP 224 Date HTTP Header 286 Dateien erweiterte Funktionen 134 Existenz testen 128 138 Modus 126 ffnen 126 schlie en 127 Typ testen 138 umbenennen 179 Dateien verarbeiten 125 Dateisystem 11 Datei Uploads 303 Dateizeiger 134 Datenbanken CRUD 347 f r Rails vorbereiten 343 Datenbankzugriff 314 Datenstr me 114 Datentyp ermitteln 212 Datentypen 46 Datentyp Umwandlung 70 in Flie kommazahl 70 in Ganzzahl 70 in String 70 Datum und Uhrzeit 138 Berechnungen 142 bestimmter Zeitpunkt 142 Einsatzbeispiele 143 EPOCH 142 378 Index Formate 139 Monat deutsch 140 RFC 123 139 Systemzeit 138 Time Klasse 138 Wochentag deutsch 140 day Methode 139 DBI 321 De Morgan Theorem 76 def Schl sselwort 169 Definition von Variablen 45 denomin
448. rsendet GET h ngt sie durch ein Fragezeichen getrennt als Query String an die Anfrage URL Diese lau tet daher auswertung rb ort K F6ln amp telefon 0221 2F123456 Wenn das Ruby Skript ENV QUERY_STRING ausliest erh lt es ort K F6ln amp telefon 0221 2F123456 An dieser Stelle m ssten die einzelnen Name wWert Paare an den amp Zeichen getrennt werden anschlie end k nnten Sie diese im erhaltenen Array nochmals am Gleich heitszeichen in Feldname und Wert aufteilen Zuletzt ist eine Umwandlung der spe ziell codierten Sonderzeichen wie F6 f r oder 2F f r erforderlich Zu diesem Zweck enth lt die Klasse CGI aus der Ruby Standardbibliothek die Klassenme thode unescape Der Code zum Zerlegen der genannten Felder s he also wie folgt aus require cgi formdata ENV QUERY_STRING formvars formdata split amp formvars each feld name wert feld split printf s s lt br gt n name CGI unescape wert end Wenn Sie dies ausprobieren m chten k nnen Sie es leicht auf eigene Faust tun Allerdings ist diese Vorgehensweise in der Praxis weder erforderlich noch empfeh lenswert Denn sobald Sie die Bibliothek cgi rb importieren k nnen Sie CGI Para meter viel leichter auslesen und noch viele andere Webaufgaben erheblich eleganter erledigen CGI Fehler finden CGI Skripten haben einen gro en Nachteil gegen ber Ruby Skripten die auf der Konsole ausgef hrt werden Wenn ein Fehler auftr
449. rt gesetzt wird gibt es in der traditionellen Ganzzahlarithmetik von Computern eine 4 Naja in Kapitel 4 werden Sie sehen wie weit man das Standardverhalten von Ruby aufbohren kann 36 Kapitel2 Sprachgrundlagen gr te und eine kleinste darstellbare Zahl die Bandbreite h ngt dabei von der Gr e des Speicherplatzes ab der pro Zahl reserviert wird Hier eine gute Nachricht f r Sie In Ruby k nnen Sie tats chlich beliebig gro e Ganzzahlen verwenden Hinter den Kulissen werden aus Effizienzgr nden zwei ver schiedene Arten von Integerzahlen verwendet beim berschreiten der Grenze von gut einer Milliarde positiv wie negativ erfolgt allerdings ein vollautomatischer Wechsel zwischen ihnen Wenn Sie sich dennoch f r die Details interessieren k n nen Sie den Infokasten Ganzzahlarithmetik lesen Ganzzahlarithmetik Die beschr nkten Integerzahlen als effizienteste Operanden f r Berech hA nungen werden in Ruby Fixnum genannt Prinzipiell stehen f r jede Fix N num 32 Bit oder 4 Byte an Speicherplatz zur Verf gung Im letzten Bit 2 wird allerdings eine konstante 1 gespeichert um klarzustellen dass der gespeicherte Wert vom Typ Fixnum ist Somit sind 31 Byte f r den eigent lichen Zahlenwert verf gbar Wie Ihnen bekannt sein d rfte kann jedes Bit zwei verschiedene Zust nde anneh men die traditionell als O oder 1 bezeichnet werden Somit besitzt jede Fixnum 2 verschiedene m gliche Zust nde von 00
450. rten TCP und UDP Portnummern der so genannten Well Known Ports finden Sie unter http www iana orglassignments port numbers Wenn Sie ein UNIX System verwenden besitzen Sie zus tzlich die Datei etc services mit einer brauchbaren Teilmenge dieser Liste Tabelle 5 1 Einige verbreitete TCP und UDP Portnummern Portnummer Transportprotokoll Anwendungsprotokoll Erl uterung 20 TCP FTP Daten Datei Upload Download 21 TCP FTP Steuerung Datei Upload Download 22 TCP SSH Sichere Terminalverbindung 23 TCP Telnet Klassische Terminalverbindung 25 TCP SMTP E Mail Versand 53 TCP UDP Domain Nameserver Abfragen 80 TCP HTTP Webserver 110 TCP POP3 E Mail Postfach 228 Kapitel 5 Netzwerkanwendungen Tabelle 5 1 Einige verbreitete TCP und UDP Portnummern Fortsetzung Portnummer Transportprotokoll Anwendungsprotokoll Erl uterung 123 UDP NTP Uhrzeitsynchronisation 443 TCP UDP HTTPS Verschl sselte Webverbindung 3306 TCP UDP MySQL Beliebter Open Source Daten bankserver Auf UNIX Systemen gibt es eine wichtige Einschr nkung Verbindun A gen bei denen die lokale Portnummer kleiner als 1024 ist klassische u Serverdienste d rfen nur von root initiiert werden In der guten alten Zeit als die Universit tsnetze praktisch unter sich waren diente dies der Sicherheit Auf einem allgemein zug nglichen Host konnte nicht jeder Hinz und Kunz einen offiziellen Server starten Inzwischen ist diese Einschr nkung sogar eh
451. rundlagen Beispiel 2 3 Der Farbumrechner rgb rb Fortsetzung 34 while hexwebfarbe length lt 6 35 hexwebfarbe 0 f 36 end 37 hexwebfarbe upcase 38 puts Naechste Webfarbe hexwebfarbe Speichern Sie das Skript unter dem Namen rgb rb und starten Sie es wie blich Hier eine komplette Beispielausf hrung gt ruby rgb rb Rot 0 255 217 Gruen 0 255 81 Blau 0 255 20 Gesamtwert 14242068 Hexadezimal D95114 Naechste Webfarbe CC6600 Als Erstes werden die Zahlen eingegeben mit Hilfe der Methode to_i in Integer umgewandelt und in Variablen gespeichert in Zeile 6 beispielsweise r f r den Rot wert to_i setzt unzul ssige Werte automatisch auf 0 in einem zweiten Schritt zum Beispiel Zeile 8 werden unerw nschte das hei t zu gro e oder zu kleine Eingaben ebenfalls auf O gesetzt Das nachgestellte if als Fallentscheidung gilt dabei nur f r die vorstehende Anweisung in derselben Zeile Die entscheidenden Zeilen f r den Einsatz der Bit Operatoren sind 16 und 32 sehen Sie sich als Beispiel die Berechnung des Gesamtwertes aus den urspr ngli chen Eingaben an farbe r 16 g 8 b Der Rotwert wird um 16 Bit nach links verschoben der Gr nwert um 8 Bit und der Blauwert gar nicht Verkn pft werden sie mittels bitweisem Oder w re ebenfalls m glich w rde aber mehr Zeit f r die Berechnung erfordern Im Grunde k nnten Sie dieselbe Operation umst ndlicher und schwerer verst ndlich
452. rungen wie die mit Ruby gelieferte Biblio thek Curses die dies leisten Quellen f r weitere Informationen zu diesem Thema finden Sie in Anhang B Das andere Extrem ist die Methode read Sie liest beliebig viel Text bis EOF und speichert ihn in einem einzigen String Speichern Sie dazu das folgende kurze Skript unter dem Namen read rb txt STDIN read puts Die Eingabe puts txt F hren Sie das Skript aus geben Sie beliebig viele Zeilen ein und dr cken Sie dann das EOF Tastenk rzel Zum Beispiel gt ruby read rb Dies ist ein Test Z Die Eingabe Dies ist ein Test Dass tats chlich eine beliebig lange Eingabe verarbeitet wird sehen Sie wenn Sie eine l ngere Textdatei an die Standardeingabe umleiten Eine solche k nnen Sie sich zun chst mit folgendem Skript erstellen das die Zahlen von 1 bis 1000 ausgibt 1 1000 each i puts i Speichern Sie dieses Skript als bis1000 rb und f hren Sie es aus wobei Sie die Aus gabe in eine Datei umleiten gt ruby bis1000 rb gt bis1000 txt Nun k nnen Sie die neue Datei bis1000 txt als Eingabe f r read rb verwenden gt ruby read rb lt bis1000 txt Die Eingabe 1 2 3 2 99 1000 Nat rlich werden Sie nur die letzten Zeilen der Ausgabe sehen die A Windows Eingabeaufforderung und moderne Terminalfenster ver y f gen zwar ber einen Ausgabepuffer mit Scrollbalken aber dieser ist in der Regel keine 1001 Zeilen lang Wenn Sie misstrauisch s
453. rzeit Ende Dezember 2006 5 0 27 besonders Letzteres wird sich voraussichtlich bald ndern Die nachfolgenden Installationsanleitungen f r Windows und f r UNIX Systeme gehen davon aus dass Sie die entsprechende Bin rversion f r Ihre Platt form bereits heruntergeladen haben Installation unter Windows F r Windows bieten die MySQL Entwickler einen bequemen Bin r Installer an Entpacken Sie als Erstes die ZIP Datei zurzeit mysql 5 0 27 win32 zip Anschlie Bend k nnen Sie die enthaltene Datei Setup exe per Doppelklick ausf hren Falls auf Ihrem Rechner bereits eine ltere MySQL Version existiert wird sie deinstalliert und durch die neue ersetzt die vorhandenen Datenbanken bleiben erhalten Als Erstes m ssen Sie sich den Installationsumfang aussuchen Typical die wichtigsten Komponenten Complete alles oder Custom freie Auswahl W hlen Sie Letzteres und klicken Sie auf dem n chsten Bildschirm auf die Schaltfl che Change wenn Sie das Installationsverzeichnis wechseln m chten Ein Klick auf Next startet anschlie Bend die Installation Danach k nnen Sie Configure the MySQL Server now w hlen um den Datenbank server nach Ihren W nschen einzurichten beispielsweise wird er als automatisch startender Dienst installiert Der Konfigurationsdialog ist sp ter jederzeit ber das Startmen verf gbar Beantworten Sie die Fragen f r einen Programmierrechner wie folgt 1 W hlen Sie den Installationstyp Detailed Configurati
454. rzlich willkommen end In diesem Fall k nnen Sie die Bedingung und die erste Anweisung auch ohne Zeilenumbruch schreiben if alter gt 18 then puts Herzlich willkommen end Eine zul ssige Kurzschreibweise f r then ist der Doppelpunkt if alter gt 18 puts Herzlich willkommen end ngabeaufforderung rubytest gt ruby agecheck rb utritt nur fuer Erwachsene itte geben Sie Ihr Alter ein 12 uer Minderjaehrige ist der Zutritt leider verboten itte kommen Sie in 6 Jahren wieder rubytest gt ruby agecheck rh utritt nur fuer Erwachsene itte geben Sie Ihr Alter ein 19 erzlich willkommen rubytest gt Abbildung 2 4 Die Alters berpr fung im Einsatz Manchmal kommt es vor dass Sie im Sonst Fall eine weitere Bedingung pr fen m ssen in deren Sonst Fall wieder eine und so weiter F r diese Aufgabe stellt Ruby das spezielle Schl sselwort elsif zur Verf gung Die allgemeine Syntax einer solchen verschachtelten Fallentscheidung sieht so aus if Bedingung Anweisung en elsif Bedingung Anweisung en elsif else Anweisung en end 74 Kapitel 2 Sprachgrundlagen Dieses Verfahren wird oft f r eine Art stufenweise Filterung verwendet Das fol gende Beispiel ordnet verschiedenen Punktzahlbereichen in einer Pr fung nachein ander die unterschiedlichen Noten zu print Bitte Punktzahl eingeben punkte gets to_i if punkte lt 30 puts Ungenuegend elsif punkte lt 5
455. s Ein Child kann dage gen die PID seines Parents herausfinden indem er Process ppid aufruft Wichtig ist dass Sie f r diese Art der Interprozesskommunikation Signale ausw h len die standardm ig einfach ignoriert werden Wenn Sie beispielsweise das Sig nal SIGTERM senden wird der angesprochene Prozess automatisch beendet was auch n tzlich sein kann wie Sie im n chsten Beispiel erfahren werden F r benut zerdefinierte Nachrichten sind dagegen die Signale SIGUSR1 und SIGUSR2 interessant auf die ein Prozess normalerweise nicht reagiert Das folgende Beispiel stellt im Child Prozess ein Men dar um verschiedene Sig nale an den Parent zu senden Dieser reagiert auf SIGUSR1 und SIGUSR2 mit verschie denen Meldungen w hrend er bei SIGTERM automatisch nicht weiter ausgef hrt wird f fork if f Parent trap SIGUSRA puts Child sendet SIGUSR1 trap SIGUSR2 puts Child sendet SIGUSR2 loop do end else Child puts 1 SIGUSR1 senden puts 2 SIGUSR2 senden puts 3 SIGTERM senden loop do wahl STDIN gets chomp case wahl when 1 Process kill SIGUSR1 Process ppid when 2 Process kill SIGUSR2 Process ppid when 3 262 Kapitel 5 Netzwerkanwendungen Process kill SIGTERM Process ppid break else STDOUT puts Unbekannter Befehl end end end Beachten Sie den break Aufruf nach dem Senden von SIGTERM Ein Child Prozess wird n mlich keineswegs ebenfalls beendet wenn sein Par
456. s chomp puts eingabe gsub aeiou i vok case vok when a e when e a5 when i o when o u when u a when A y when E g when I g when 0 g when U g end Mustervergleiche mit regul ren Ausdr cken 99 Wenn Sie das Beispiel speichern und ausf hren sieht es beispielsweise so aus Es ist eine Freude den Vokalverschieber bei der Arbeit zu sehen As ost ioni Friadi din Vukelvirschoibir bio dir Urbiot za sihin Der jeweilige Treffer wird dabei in der Variablen vok gespeichert Diese wird per case Fallentscheidung untersucht und je nach Inhalt wird der Ersetzungswert fest gelegt Nat rlich sind auch sinnvollere Anwendungen m glich Das folgende Beispiel kommt sogar ohne Auswertung der Treffer selbst aus es ersetzt einfache Striche am Anfang von Zeilen durch fortlaufende Zahlen macht also aus einer einfa chen Aufz hlung eine nummerierte Liste text lt lt ENDE Ruby ist flexibel objektorientiert leicht zu erlernen ENDE i 0 puts text gsub s i 1 Hij Hier die entsprechende Ausgabe Ruby ist 1 flexibel 2 objektorientiert 3 leicht zu erlernen Innerhalb des Blocks im obigen Beispiel ist die Reihenfolge wichtig weil der letzte Ausdruck zur ckgeliefert wird Falls Sie i also erst nach dem String Ausdruck i erh hen und daf r vor dem Block auf 0 setzen erhalten Sie Zeilen wie 1flexibel Wie bei vielen b
457. s hunderte von Textedito ren mit unterschiedlichen F higkeiten und Besonderheiten Der einfachste Editor f r Windows der auch gleich mit dem System geliefert wird hei t Notepad Sie k nnen ihn ber Start gt Alle Programme gt Zubeh r gt Editor starten Die Alternative ist Start gt Ausf hren geben Sie dann notepad ein und dr cken Sie Enter Die Bedienung dieses Editors ist sehr einfach zumal er kaum Optio nen besitzt Er wird komplett ber das Men gesteuert 4 Unter http www2 latech edu acm HelloWorld shtml k nnen Sie Hello World Programme in mehre ren hundert Programmiersprachen bestaunen darunter nat rlich auch in Ruby Hello World hello Ruby das erste Ruby Programm 17 Da Notepad aufgrund seines geringen Leistungsumfangs vor allem f r Program mierer nicht ausreicht gibt es f r Windows zahlreiche Drittanbieter Editoren sowohl kommerzielle als auch Open Source Programme Mein pers nlicher Favorit ist TextPad Es handelt sich um Shareware die Sie unter http www textpad com herunterladen und ausgiebig testen k nnen bevor Sie sich zum Kauf f r beraus g nstige US 29 entschlie en TextPad besitzt etliche Features die einem Pro grammierer das Leben erleichtern zum Beispiel Zeilennummern Mustersuche Makros Syntax Highlighting Hervorhebung verschiedener Elemente von Pro grammiersprachen durch Einf rbung und so weiter Auch der Ruby Installer f r Windows lie
458. s neuen Programms im selben Verzeichnis importieren require round rb Diese flexible Erweiterbarkeit der vorgegebenen Elemente ist wieder einmal eines jener Features die Ruby zu einer vollkommen einzigartigen Sprache machen Weil es so beraus n tzlich ist hier gleich noch ein Beispiel es erweitert die Klasse Klassen entwerfen und implementieren 187 Array um die Methoden sum Summe aller Elemente und average Mittelwert aller Elemente Aenderungen in der Standardklasse Array class Array Summe aller Elemente def sum s 0 self each z In Fliesskommazahl umrechnen O wenn keine Zahl s z to f Summe zurueckgeben s end Mittelwert def average self sum self length end end Viel zu erkl ren gibt es hier eigentlich nicht mehr da Ihnen alle Anweisungen und Konstrukte des Skripts bekannt sind Speichern Sie es unter einem Namen wie array_ext rb und importieren Sie es in ein eigenes Skript oder in irb gt gt require array_ext rb gt true Nun k nnen Sie die Erweiterungen testen gt gt arr 1 2 6 gt gt arr sum gt 9 0 gt gt arr average gt 3 0 Operatoren definieren und ndern Eine der berraschendsten Eigenschaften von Ruby ist vielleicht die Tatsache dass viele Operatoren auch nichts anderes als spezielle Methoden sind Sie werden auch auf dieselbe Weise definiert Vielleicht m chten Sie einen praktischeren G terzug haben bei dem Sie Waggons ei
459. sch Der zweite Teil ausschlie lich Zeile 34 ist die Erzeugung einer konkreten ModText Instanz mit Textinhalt Zusammenfassung 217 mtext ModText new Hallo meine liebe Welt Dies ruft automatisch die Methode initialize auf und speichert den bergebenen Text dauerhaft in der Instanzvariablen txt des neuen Objekts mtext Im dritten Teil ab Zeile 36 werden schlie lich die verschiedenen Methoden des Objekts aufgerufen au er set_text zum Wechseln des Inhalts dienen sie alle dem Auslesen des meist manipulierten Textinhalts von mtext Die Anweisung printf ersetzt die im Text enthaltenen Platzhalter brigens der Reihe nach durch die nachfolgenden Werte s steht dabei f r einen Textwert String 218 Kapitel 4 Eigene Klassen und Objekte erstellen In diesem Kapitel KAPITEL 5 en Netzwerkanwendungen e Web Clients mit Net HTTP Prozesse und Threads The Network is the Computer Werbeslogan von Sun Microsystems Programmierung wird noch interessanter wenn sie ber die Grenzen eines einzelnen Rechners hinausgeht Netzwerkf higkeit ist eine zentrale Forderung an moderne Software Noch vor wenigen Jahren h tte man an dieser Stelle fragen m ssen welche Netzwerkprotokolle denn zum Einsatz kommen sollen Microsoft Apple und die UNIX Welt kochten jeweils ihr eigenes S ppchen mit zueinander inkompatiblen Netzwerken Heute kann man gl cklicherweise praktisch sagen Netzwerk Internet
460. schreiben Daf r kommen die in Kapitel 2 besprochenen Ein und Ausgabemethoden zum Einsatz Sockets 233 Ein TCP Client Socket wird brigens direkt mit Hilfe des Konstruktors der Klasse TCPSocket erzeugt Die beiden Parameter sind e Hostname oder IP Adresse des gew nschten Servers e Portnummer oder Name eines Well Known Ports auf dem Server Der Client selbst erh lt brigens eine zuf llige Portnummer ephemeral port Das folgende Beispiel erzeugt einen Client Socket f r den FTP Server der Universi t t zu K ln client TCPSocket new ftp uni koeln de ftp Hier ein weiteres Beispiel das eine Verbindung zu dem nicht n her spezifizierten Server auf Port 8888 des lokalen Rechners herstellt client TCPSocket new localhost 8888 Bei Sockets im Standardmodus gibt es allerdings ein spezifisches Problem Wenn Sie versuchen aus einem Socket zu lesen der noch keine Daten bereitstellt blo ckiert Ihre Netzwerkanwendung bis das erste Byte ankommt hnlich wie beim Warten auf direkte Benutzereingaben Anders als beim Einlesen von Dateien gibt es auch kein End of File das den Abschluss einer bertragungssequenz markiert Sie m ssen also genau wissen wann Sie auf welche Datenmenge warten und soll ten die Lese und Schreibaufgaben Ihrer TCP basierten Skripten zudem jeweils als eigenst ndige Threads oder Prozesse ausf hren Alternativ besteht die M glichkeit einen Socket in den so genannten Nonblocking
461. schriebenen Skripten ausgef hrt werden sollen Kompilierte Software ist dagegen ohne weitere Voraus setzungen auf jedem Rechner lauff hig der denselben Prozessor und dasselbe Betriebssystem nutzt wie der Computer auf dem sie kompiliert wurde Neben diesen offensichtlichen Nachteilen besitzen Skriptsprachen aber auch einige wichtige Vorteile Beispielsweise l sst sich ein Interpreter leichter auf verschiedene Plattformen portieren als ein Compiler so dass Ihre Programme tendenziell auf mehr unterschiedlichen Betriebssystemen laufen oft sogar ohne jegliche nderun gen weil die Interpreter Versionen f r die verschiedenen Plattformen die Unter schiede bereits ber cksichtigen Konkret ist Ruby mindestens f r folgende Nicht Unix Plattformen verf gbar e Alle Windows Versionen ab Windows 95 und NT 4 0 e MS DOS und damit auch die klassischen Windows Versionen bis 3 11 e Klassisches Mac OS bis Version 9 IBM 05 2 Merkmale und Vorz gevonRuby 3 Im Unix Bereich werden unter anderem folgende Betriebssysteme unterst tzt e Linux alle Distributionen viele liefern sogar eine Version mit e Mac OS X enth lt Ruby ebenfalls ab Werk e FreeBSD OpenBSD und NetBSD e Sun Solaris und viele andere Unix Varianten Ein weiterer Vorteil von Interpreter Sprachen betrifft die Programmierung selbst Da die Skripten jeweils direkt aus dem Quellcode ausgef hrt werden lassen sie sich schneller testen Sie m ssen nicht bei
462. se ModText class ModText end Die einzelnen def Bl cke definieren die Methoden der Klasse die im letzten Teil des Skripts aufgerufen werden Au er initialize und set_text liefern sie alle einen Wert zur ck in Ruby gen gt es den entsprechenden Wert als einzelne Anweisung hinzuschreiben Hier eine kurze bersicht ber die Aufgaben der einzelnen Methoden initialize Zeile 4 bis 6 wird bei der Instanziierung aufgerufen und weist der Instanzvariablen txt ihren Anfangswert zu entweder den bergebenen Inhalt oder einen leeren Text set_text Zeile 8 bis 10 ndert den enthaltenen Text des Objekts nachtr glich get_text Zeile 12 bis 14 liefert den Text zur ck to_s Zeile 17 bis 19 ruft get_text auf da beide Methoden dieselbe Aufgabe erf llen Beachten Sie aber Wenn ein Objekt in einem String Kontext einge setzt werden soll wird seine Methode to_s falls vorhanden automatisch aufgerufen turn Zeile 21 bis 23 dreht den Text mit Hilfe der Ruby Methode reverse herum und liefert das Ergebnis zur ck hide _vowels Zeile 25 bis 27 verwendet den regul ren Ausdruck aeiou der auf alle Vokale im Text zutrifft und ersetzt diese durch Sternchen Auch hier wird das Endergebnis zur ckgeliefert rot13 Zeile 29 bis 31 wendet den so genannten C sar Code auf den Text an Jeder Buchstabe wird um 13 Zeichen verschoben da das Alphabet 26 Buchstaben besitzt sind die Vorg nge der Codierung und Decodierung iden ti
463. search by asking for information on one of IO puts Kernel puts StringIO puts Zlib GziphWriter puts Da puts im Beispiel nicht als Klasse puts oder Instanz puts sondern alleinstehend aufgerufen wurde d rfte es sich um Kernel puts handeln Die spezielle Klasse Ker nel enth lt die Basismethoden und eigenschaften des Ruby Sprachkerns Sie k nnten in Ihren Skripten sogar Kernel puts statt einfachem puts schreiben Geben Sie daher Folgendes ein um die Beschreibung der gew nschten Methode zu lesen gt ri Kernel puts Die Ausgabe sieht so aus Kernel puts puts obj gt nil Equivalent to stdout puts obj Der Kopfbereich zwischen den Linien zeigt das Syntaxschema der Methode an puts mit beliebig vielen durch Komma getrennten Objekten kein R ckgabewert nil ist ein spezieller Wert der nichts bedeutet Die Beschreibung selbst ist in diesem Fall allerdings ein wenig mager man erf hrt lediglich dass die Methode ein quivalent zu stdout puts ist stdout ist ein Syno nym f r STDOUT Um noch mehr zu erfahren m ssen Sie nun herausfinden welcher Klasse diese Variable angeh rt Geben Sie dazu diese Anweisung ein gt ruby e puts stdout class Die Antwort lautet I0 so dass Sie ausf hrlichere Hilfe zu puts letztendlich mit Hilfe dieser Eingabe finden gt ri IO puts Beim n chsten Befehl ist der Fall klar Time new nennt Klasse und Methode Geben Sie also Folgendes ein gt ri Time new
464. seiten HTML ausschlie lich zur Strukturie rung des Inhalts verwenden HTML Tags die f r Layout und Design zust ndig sind gelten als veraltet die meisten sind in strengem HTML 4 0 sowie in XHTML unzul ssig wenngleich sie von den meisten Browsern noch verarbeitet werden Um das Design k mmert sich exklusiv die Sprache CSS Cascading Style Sheets Wenn Sie eine externe Stylesheet Datei einbetten m chten funktioniert dies mit Hilfe eines lt link gt Tags im Head Hier ein vollst ndiger Head mit Titel und der Ein bettung einer CSS Datei namens layout css die sich im selben Verzeichnis befindet wie das Ruby Skript selbst cgi head cgi title Eine Seite mit CSS Layout cgi link rel gt stylesheet type gt text css href gt layout css Wenn auch der CSS Code in dieser Datei den Seitenhintergrund schwarz und den Text wei darstellen soll muss er wie folgt lauten body background color 000000 color FFFFFF Wenn Sie weitere Informationen ber Stylesheets ben tigen halten Sie sich an die Weblinks und Buchempfehlungen in Anhang Es w re sinnlos an dieser Stelle die CGI Methoden zur Erzeugung s mtlicher HTML Tags aufzuf hren Wenn Sie HTML beherrschen k nnen Sie davon ausge hen dass sie alle wie erwartet funktionieren N here Angaben stehen in der ri Dokumentation zu CGI HtmlExtension Besonders interessant sind allerdings einige Methoden zur Erzeugung von Formu larelementen
465. selbst definierten Methoden sondern auch diejenigen aus bergeordneten Klassen und Mixins angezeigt Das war nur ein kurzer berblick ber die wichtigsten Introspektions Hilfsmittel Weitere Informationen finden Sie in den B chern und y Online Ressourcen die in Anhang B vorgestellt werden Zusammenfassung Zugegeben In diesem Kapitel wurden eine Menge Themen abgehandelt Aber nun verf gen Sie ber solides und vor allem praktisches Grundlagenwissen ber die wichtigsten Aspekte der Objektorientierung Wenn Sie bereits andere objektorien tierte Sprachen kennen sind Sie sicherlich beeindruckt von der Einfachheit und Ele ganz mit der Ruby auch komplexe Konzepte handhabt Wenn Ruby dagegen Ihre erste OO Sprache ist haben Sie Gl ck gehabt So leicht lernen Sie diese Konzepte n mlich sonst nirgends denn alle anderen Sprachen mit Ausnahme von Smalltalk implementieren sie umst ndlicher Das Grundkonstrukt der Objektorientierung ist eine Klasse ihre Definition wird durch class Klassenname eingeleitet und mit end abgeschlossen Dazwischen k n nen beliebig viele Methoden definiert werden die die Datenstruktur eines Objekts der Klasse manipulieren oder einfach zur ckliefern Die feste Verkn pfung von Daten und Code innerhalb jeder Instanz einer Klasse Kapselung sorgt f r war tungsfreundlicheren und leichter wiederverwendbaren Code Die Datenstruktur selbst wird in sogenannten Instanzvariablen oder Attributen gespeichert die R
466. ses Element bei Bedarf so cgi reset Beschriftung Datei Uploads Wenn Sie ein Multipart Formular erstellen besteht wie bereits erw hnt die M glichkeit Dateien auf den Server hochzuladen F r das entsprechende Upload Feld ist die CGI Methode file field zust ndig Die wichtigsten Parameter die wie der als Hash gesetzt werden k nnen sind der bekannte name sowie accept f r die MIME Typen die das Feld akzeptiert Zum Beispiel cgi file_field name gt textdatei accept gt text plain nicht zuverl ssig ist Sie m ssen den Typ der hochgeladenen Dateien aus Sicherheitsgr nden nochmals berpr fen R Beachten Sie dass die Datentypkontrolle durch das Attribut accept Beachten Sie dass in einem Multipart Formular die Inhalte aller Felder in tempor ren Dateien gespeichert werden Der Zugriff erfolgt weiterhin mit Hilfe von cgi Feld name allerdings nicht mehr direkt sondern ber die folgenden Methoden e read liefert den Body das hei t den Inhalt der jeweiligen Datei zur ck e local path ist der Pfad der tempor ren Datei in der die Datei gespeichert wurde e original_filename gibt den urspr nglichen Dateinamen an e content_type ist der Datentyp MIME Typ des Feldes beziehungsweise der hochgeladenen Datei Das folgende Komplettbeispiel stellt ein Multipart Formular mit einem Textfeld und einem Upload Feld zur Verf gung Wenn die hochgeladene Datei einen text MIME Typ besitzt wird ihr In
467. sind auch die Vorzeichen und als arithmetische Operationen zu verstehen wenngleich sie nicht zwei Werte miteinander verkn pfen sondern den unmittelbar nachfolgenden Ausdruck modifizieren Vergleichsoperationen Eine h ufige Aufgabe von Computerprogrammen besteht darin Vergleiche durch zuf hren und aufgrund der Ergebnisse dieser Vergleiche Entscheidungen zu treffen sprich bestimmte Anweisungen auszuf hren oder nicht auszuf hren Die Fallent scheidungen selbst werden im n chsten Abschnitt behandelt hier geht es zun chst um ihre Grundlage im Bereich der Ausdr cke Jeder Vergleichsoperator dient dazu zwei beliebige Werte miteinander zu verglei chen Der zur ckgelieferte Wert ist in der Regel true oder false in einigen Ausnah mef llen auch nil oder etwas anderes Neben dem naheliegenden Vergleich von Zahlen lassen sich auch Strings miteinan der vergleichen das Kriterium ist dabei die Position des ersten unterschiedlichen Zeichens im Zeichensatz Alle Gro buchstaben sind dabei kleiner als alle Klein buchstaben W hrend Ganz und Flie kommazahlen zum Vergleich automatisch ineinander konvertiert werden findet keine Umwandlung von Zahlen in Strings oder umgekehrt statt Hier die Liste der grundlegenden Vergleichsoperatoren mit einer Beschreibung ihres Verhaltens und irb Beispielen e Gleichheit Liefert true wenn die beiden Operanden denselben Wert besitzen ansonsten false gt gt 4 gt true gt
468. sionen verbreiteter Unix Utilities enthalten Laden Sie die ZIP Datei herunter und entpacken Sie sie am besten in ein Verzeichnis das zum PATH ausf hrbarer Konsolen programme geh rt zum Beispiel das Systemverzeichnis normaler weise C Windows Danach k nnen Sie die Eingabeaufforderung ff nen siehe den Abschnitt Hello World hello Ruby das erste Ruby Programm in Ihr Ruby Download Verzeichnis zum Beispiel Desktop oder Eigene Dateien wechseln und md5sum mit dem Namen der exe Datei als Argument eingeben Hier ein Beispiel gt md5sum ruby185 21 exe 8830dfeb25e39fd7a5cccfbd02030337 ruby185 21 exe Vergleichen Sie die Ausgabe mit der md5 Datei die sich entweder direkt im Browser ffnet oder aber nach dem Download mit jedem beliebigen Texteditor betrachten l sst Wenn die beiden Werte nicht bereinstimmen m ssen Sie den Installer erneut herunterladen Die eigentliche Installation k nnen Sie vornehmen indem Sie auf die exe Datei doppelklicken Unter Windows Versionen ab XP Service Pack 2 erscheint zun chst eine Sicherheitswarnung da der Installer keinen offiziellen Segen von Microsoft besitzt klicken Sie auf Ausf hren Erst danach geht es mit dem eigentli chen Ruby Setup Wizard los wobei Sie nacheinander folgende Screens zu sehen bekommen 2 Bitte aufpassen es hei t tats chlich unxutils und nicht etwa unixutils Ruby installieren 5 1 Welcome Information dass Ruby installiert we
469. speichert haben k nnen die Model Klassen erzeugt werden Geben Sie dazu folgende Kommandos ein gt ruby script generate model Band exists app models exists test unit exists test fixtures create app models bands rb create test unit bands_test rb create test fixtures bands yml create db migrate create db migrate 001_create_bands rb gt ruby script generate model Album exists app models exists test unit exists test fixtures create app models albums rb create test unit albums_test rb create test fixtures albums yml exists db migrate create db migrate 002_create_albums rb Die erstellten Klassen sind so genannte Stubs englisch f r Stummel oder Stumpf Sie enthalten also die Basisfunktionalit t ohne jegliche Extras Das Wichtigste was Sie hinzuf gen m ssen sind die Relationen zwischen den Daten ffnen Sie also zun chst die Datei app models bands rb Sie besteht nur aus den fol genden beiden Zeilen class Bands lt ActiveRecord Base end Die Klasse Bands die mit der gleichnamigen kleingeschriebenen Datenbanktabelle korrespondiert wird also von ActiveRecord Base abgeleitet wo alles Wesentliche f r die Umsetzung der Datens tze in Ruby Instanzen bereits existiert Erg nzen Sie die Klassendefinition wie folgt um klarzustellen dass eine Band mehrere Alben ver ffentlichen kann class Bands lt ActiveRecord Base has_many albums end Auch app models albums rb m ssen Sie entsprechend erweitern
470. ss der Zug nicht mehr fah ren kann Objektorientierte Programmierung Eine praktische Einf hrung 157 Wie Sie schen k nnen die in den globalen Variablen loks und waggons gespei cherten Eigenschaften des Zugs an jeder Stelle des Skripts modifiziert werden Genau darin besteht das Problem dieses Ansatzes Das Skript wird un bersichtlich und bei Fehlern l sst sich kaum noch erkennen an welcher Stelle sie auftraten Viel besser w re ein G terzug der sich intern um seine eigenen Angelegenheiten k m mert und Zugriffe auf seine Datenstrukturen nur ber bestimmte Methoden erlaubt Genau diesen Anforderungen wird die objektorientierte L sung gerecht Lokomo tive und Zug werden als Klassen definiert die ihre Daten selbst speichern und deren nderung mit Hilfe von Objektmethoden erm glichen Die Zug Klasse enth lt zwei Lok Objekte w hrend der globale Code wiederum ein Zug Objekt erzeugt Geben Sie zun chst Beispiel 4 2 ein und f hren Sie es aus Die Ausgabe sollte exakt der Nicht OO Variante entsprechen Die entsprechenden Erl uterungen folgen nach dem Listing Beispiel 4 2 Der objektorientierte G terzug zug_oo rb 1 Datenstrukturen Methoden als Klassen 2 class Lok 3 Konstanten fuer die maximale Anzahl von Waggons 4 OHNE 0 5 DAMPF 30 6 7 STROM 40 DIESEL 50 8 Grundzustand 9 def initialize typ OHNE 10 typ typ 11 end 12 Typinformation als String 13 def get_typ 14 case typ 15 w
471. ssen Das Ergebnis wird in Zeile 31 bis 40 mit Hilfe einer case when Struktur berechnet Die when F lle pr fen nacheinander verschiedene Einzelwerte und f hren die Ope ration f r den passenden Fall durch In Zeile 42 wird das auf diese Weise berech nete Ergebnis ausgegeben Am Ende des bern chsten Kapitels erhalten Sie eine hnliche Re kapitulation f r das Textmanipulierer Beispiel Die Zeilen 42 bis 46 k mmern sich um die Frage ob der Benutzer eine weitere Berechnung w nscht Wenn seine Antwort mit n beginnt das hei t auf den regul ren Ausdruck n passt wird die Schleife mit break verlassen Zeile 46 Da nach dem end in Zeile 47 keine weitere Anweisung folgt ist damit auch das gesamte Pro gramm beendet Zusammenfassung 109 In diesem Kapitel KAPITEL 3 ange Ruby Klassen Datum und Uhrzeit Einige weitere Klassen Die Ruby Hilfe ri Nirgends kann man den Grad der Kultur einer Stadt und berhaupt den Geist ihres herrschenden Geschmacks schneller und doch zugleich richtiger erkennen als in den Lesebibliotheken Heinrich von Kleist Im vorigen Kapitel haben Sie die meisten wichtigen Einzelbausteine f r Ihre Arbeit mit Ruby kennengelernt In diesem Kapitel kommen die Hilfsmittel hinzu mit denen Sie l ngere strukturierte Programme daraus konstruieren k nnen Sie erfahren wie Objektorientierung in der Praxis funktioniert In diesem Kapitel werden Sie nach einem allgemeinen E
472. ssen zu arbeiten die zum Lieferumfang geh ren Die wichtigsten Themen sind Ein und Aus gabe auf der Konsole in Dateien und so weiter Datum und Uhrzeit sowie einige andere eingebaute Klassen Kapitel 4 Eigene Klassen und Objekte besch ftigt sich danach mit dem aktiven Teil der Objektorientierung Sie lernen Schritt f r Schritt wie Sie Ihre eigenen Datenmodelle und Arbeitsabl ufe in Klassen abbilden k nnen Das gesamte Handwerkszeug der objektorientierten Programmierung das Ruby in beson ders vollendeter Form zur Verf gung stellt wird dabei gr ndlich erl utert In Kapitel 5 Netzwerkanwendungen erfahren Sie wie Sie mit Hilfe eigener Pro gramme auf lokale Netzwerke oder auf das Internet zugreifen k nnen Sie erhal Aufbau des Buchs XI ten zun chst einige Hintergrundinformationen ber den Aufbau der TCP IP Protokolle und entwickeln dann auf dieser Grundlage Clients und Server Ein Teil des Kapitels besch ftigt sich zudem mit dem Problem der Nebenl ufigkeit um Server zu schreiben die mehrere Clients gleichzeitig bedienen Kapitel 6 Klassische Webanwendungen beschreibt zun chst wie Sie den Web server Apache einrichten und konfigurieren Er dient als Plattform f r die nach folgend entwickelten Anwendungen Hier geht es um die traditionelle Art der Webprogrammierung die Sie erst als Grundlage verstanden haben sollten bevor Sie nur noch Rails verwenden In Kapitel 7 Ruby on Rails erhalten Sie schlie lich
473. stallation UNIX 277 Installation Windows 276 Konfiguration 279 Listen 280 LoadModule 280 mod_cgi 286 mod_ruby 329 Module 275 Multi Processing Module 275 Options 282 Order 283 ScriptAlias 287 ServerAdmin 281 ServerName 281 ServerRoot 280 XAMPP 274 ApplicationController Klasse 339 376 Index argrechner rb Skript 123 ARGV 122 Arithmetik Flie kommazahlen 41 Ganze Zahlen 37 Raumfolgearithmetik 38 Arithmetische Operatoren 51 Array Klasse 48 Methode 49 each_with_index Iterator 267 join Methode 71 length Methode 68 Methoden 68 pop Methode 68 push Methode 68 Referenz 363 Reverse Methode 69 search eigene Erweiterung 177 shift Methode 69 slice Methode 69 sort Methode 69 sum Erweiterung 188 unshift Methode 69 Arrays 48 als Parameter 172 Index 49 length Methode 49 Wertzuweisung 49 zusammenf gen 71 attr_accessor 197 attr_reader 194 attr_writer 195 Attribute siehe Instanzvariablen Ausdr cke als R ckgabewerte 175 eingebettete 42 Fallentscheidungen in 78 Ausgabeumleitung 115 Ausnahmen siehe Exceptions B Backticks f r Shell Kommandos 259 bash 10 BasicSocket Klasse 230 begin MatchData Methode 148 Beispiele argrechner rb 123 echoclient rb 238 echoforkclient rb 265 echoforkserver rb 263 echoserver rb 235 echothreadserver rb 269 hello rb 19 httpclient rb 247 kalender rb 143 istdir rb 192 mod_text rb 216 modtext rb 28 rechner rb 24 rechteck rb 112 rgb rb 58 rgb_farbe rb 181
474. started Manually installiert wer 276 Kapitel 6 Klassische Webanwendungen den soll Selbst f r lokale Testzwecke lohnt sich Ersteres der Dienst verbraucht kaum Ressourcen und kann leicht gegen Zugriffe von au en gesch tzt werden 5 Nun m ssen Sie die Vollst ndigkeit der Installation ausw hlen Typical instal liert die wichtigsten Komponenten mit Custom k nnen Sie weitere Elemente ausw hlen Sie sollten auf jeden Fall Custom einstellen da Sie nur so den Instal lationsort bestimmen k nnen 6 Diese Dialogseite wird nur angezeigt wenn Sie im vorigen Schritt Custom gew hlt haben Oben sehen Sie in einer Baumansicht die Bestandteile der Installation Wenn gen gend Festplattenspeicher zur Verf gung steht gut 50 MByte sollten Sie einfach den obersten Eintrag anklicken und This Feature and all subfeatures will be installed on local hard drive w hlen andernfalls k n nen Sie beispielsweise die Dokumentation weglassen Unten k nnen Sie das Installationsverzeichnis w hlen voreingestellt ist Apache Software Foundation im Programme Verzeichnis 7 Klicken Sie auf dem letzten Bildschirm auf Install um die Installation mit den gew hlten Einstellungen zu starten oder auf Back falls Sie doch noch etwas ndern m chten Nach der Installation als Dienst wird Apache automatisch gestartet Im Systray rechter Rand der Taskleiste erscheint das kleine Feder Icon des Apache Service Monitors Klicken Sie es mit der rech
475. ste dieser Methoden ist get Sie fordert eine Ressource vom Server an holt die Antwort ab und speichert sie in einer komplexen Datenstruktur Das folgende Beispiel l dt die Startseite der Website zum vorliegenden Buch response webclient get ruby Die Datenstruktur response besitzt je nach Antwort des Servers einen leicht unter schiedlichen Datentyp den Sie mit response class ermitteln k nnen Wenn eine Seite erfolgreich geladen werden konnte erhalten Sie gt gt response class gt Net HTTPOK Wichtige Eigenschaften von response unabh ngig vom konkreten Typ sind vor allem folgende Felder e response code String der Statuscode der Antwort etwa 200 f r eine korrekt geladene Seite 404 f r eine nicht verf gbare Seite oder 301 f r eine Weiterlei tung e response message String die passende Textmeldung zur Statusnummer zum Beispiel OK f r den Status 200 e response body enth lt den Body das hei t den eigentlichen Dateninhalt der Antwort e Zus tzlich enth lt response eine hashartige Struktur mit s mtlichen Headern der HTTP Antwort in der die Schl ssel die Header Namen bilden Sie k nnen sie beispielsweise wie folgt auslesen response each key h printf s s n h response h F r unser Beispiel http buecher lingoworld de ruby liefert dieser Code fol gende Header einige werden im n chsten Kapitel genauer erkl rt last modified Sat 04 Nov 2006 11 43 39 GMT 242 Kapi
476. sung auszuf hren die Sie begr t ruby e puts Hallo hier ist Ruby Auf Dauer sollten Sie das bin Verzeichnis zum Pfad ausf hrbarer Programme der Umgebungsvariablen PATH hinzuf gen damit Sie Ruby und seine Hilfsprogramme aus jedem Arbeitsverzeichnis aufru fen k nnen Die Konfigurationsdateien in die solche nderungen permanent eingetragen werden unterscheiden sich je nach konkre tem System und je nach Distribution Bei g ngigen Linux Distributi onen wird ete profile f r alle Shells und alle Benutzer verwendet w hrend home Username bashrc beispielsweise f r die bash Shell und nur f r den jeweiligen Benutzer gilt Nachdem Sie sich f r eine Konfigurationsdatei entschieden haben k nnen Sie sie in einem Editor ffnen Suchen Sie eine Zeile in der PATH einen Wert erh lt das hei t so etwas wie export PATH pfad nr 1 pfad nr 2 oder export PATH PATH weiterer pfad noch ein pfad F gen Sie einen weiteren Doppelpunkt und Ihren Ruby bin Pfad hinzu also etwa usr local ruby bin Falls die gew hlte Datei gar keine PATH Definition enth lt k nnen Sie eine Zeile wie die folgende verwenden die Ihren bisherigen Such pfad um das Ruby Verzeichnis erg nzt export PATH PATH usr local ruby bin Beachten Sie dass die hier gezeigte Syntax f r die bash gilt wenn Sie eine andere Shell verwenden m ssen Sie stattdessen die f r diese geltenden Kommandos zur Variablendefinition einsetzen Nachdem S
477. t Jeder neue Eintrag wird mit einem Zeitstempel versehen und mittels unshift an den Anfang eines Arrays gestellt Die Instanzbildung wird verboten indem new und nicht etwa initialize f r privat erkl rt wird Beachten Sie in diesem Zusammenhang dass new eine Klas sen und keine Instanzmethode ist denn eine Instanz entsteht erst durch ihren Auf ruf so dass private_class method verwendet werden muss Die einzige Instanz wird intern als Klassenvariable logbuch gespeichert und durch einen Aufruf von instance zur ckgegeben Hier der komplette Code f r diese Klasse class Logbuch Instanziierung verhindern private_class method new def initialize log Array new end Klassenvariable fuer die einzige Instanz logbuch nil Methode zur Instanzrueckgabe def Logbuch instance if logbuch logbuch else logbuch new end end def log eintrag logeintrag Time new strftime d m Y H M S logeintrag eintrag log unshift logeintrag end end Stellen Sie die Funktionalit t auf die Probe Importieren Sie logbuch rb in irb und versuchen Sie zun chst wider besseres Wissen new aufzurufen dies misslingt gt gt log1 Logbuch new NoMethodError private method new called for Logbuch Class Verwenden Sie stattdessen instance um Zugriff auf die Instanz zu erhalten am besten zweimal dann merken Sie an der Objekt ID dass Sie tats chlich dieselbe Instanz erhalten gt gt log1 Logbuch instance
478. t Sie brauchen also keinen SQL Code mehr zu schreiben sondern k nnen Datenbankinhalte mit Ruby Syntax auslesen und bearbeiten Active Record arbeitet mit einer Reihe unterschiedlicher Datenbanken zusam men Sie ben tigen allerdings jeweils einen passenden Treiber oder Adapter e Action Pack besteht aus den beiden Teilen Action Controller und Action View Action Controller liefert die Logik f r die Anwendungssteuerung w hrend Action View die Templates f r die Benutzeroberfl che bereitstellt Es handelt sich dabei also um die Implementierung von View und Controller der MVC Architektur Ruby on Rails 335 e Action Mailer liefert E Mail Unterst tzung so dass User und oder Administra toren automatisch per Mail ber bestimmte Vorg nge in der Rails Anwendung informiert werden k nnen e Action Web Service erm glicht die Rails basierte Entwicklung von Web Ser vices sowie entsprechenden Clients e Active Support schlie lich ist eine Schnittstelle f r beliebige Ruby basierte Erweiterungen des Rails Frameworks Hinzu kommt die eingebaute Unterst tzung f r Ajax eine JavaScript basierte Technologie die das Ersetzen beliebiger Einzelteile einer Webseite durch Serverda ten ohne Warten und ohne Neuladen der gesamten Seite erm glicht Einf hrungen in Action Mailer Action Web Service und die Ajax Komponenten sind in Vorberei tung und werden demn chst auf der Website zum Buch erscheinen Dieses Kapitel zeigt Schritt f r
479. t Z B G 9 81 PI 3 1415926 e var globale Variablen die im gesamten Skript gelten Z B global Test e var Instanzvariablen nur nach Klasse new verf gbar e var Klassenvariablen in Klasse und allen Instanzen verf gbar Arrays Listen mit beliebig vielen Elementen beliebigen Typs gekennzeichnet durch numerischen Index e Definition z B arr Werti Wert2 WertN e arr o erstes Element e arr n Element Nr n 1 e arr 1 letztes Element Hashes Listen mit Schl ssel Wert Paaren e Definition z B hash Schluessel1 gt Wert1 e Zugriff hash Schluessel e Typ des Schl ssels meist String oder Symbol hash Schluessel bzw hash schluessel Operatoren Die wichtigsten in absteigender Rangfolge e Menge e Potenz e logisches Nicht Vorzeichen Vorzeichen e Multiplikation Division Modulo Divisionsrest e gt gt Bitverschiebung links lt lt Bitverschiebung rechts e amp bitweise Und e bitweise Exklusiv Oder bitweise Oder Ausdr cke 359 lt kleiner oder gleich lt kleiner gt gr er gt gr er oder gleich lt gt Vergleich ist gleich in Bereich enthalten l ist ungleich entspricht Regexp entspricht Regexp nicht amp amp logisches Und logisches Oder Bereich incl Ende Bereich excl Ende Fallentscheidung Ausdruck Dann Wert Sonst Wert
480. t gt RGBFarbe hex 255 153 51 gt FF9933 Globale Methoden und neue Methoden f r Standardklassen brigens wurden auch in der nicht objektorientierten L sung des einf hrenden Eisenbahn Beispiels und in anderen Skripten in diesem Buch Methoden definiert Es handelt sich dabei scheinbar um globale Methoden in anderen Sprachen Funk tionen genannt da sie sich ohne Instanz aufrufen lassen in dem imperativen Skript hei t es etwa anhaengen 50 statt zug anhaengen 50 Wie passt dies zu der Tatsache dass Ruby eine konsequent objektorientierte Pro grammiersprache ist Ganz einfach Formal betrachtet ist jede Methode die Sie au erhalb einer Klasse schreiben trotzdem eine Instanzmethode Der Trick besteht darin dass der Ruby Ausf hrungskontext also beispielsweise das aktuelle Skript oder die aktuelle irb Sitzung eine Instanz der allgemeinen Klasse Object ist Das k nnen Sie leicht herausfinden indem Sie in irb Folgendes eingeben gt gt self class gt Object Das Schl sselwort self dient dem Selbstbezug einer Instanz Die Methode class wurde bereits in Kapitel 2 beschrieben sie liefert die Klasse zu der irgendein Objekt geh rt und wie Sie wissen ist in Ruby alles ein Objekt Da Object der Urahn s mtlicher Ruby Klassen ist k nnen Sie Ihre globalen Methoden in irb nicht nur alleinstehend sondern auch als Instanzmethoden jedes beliebigen Objekts aufrufen Probieren Sie es aus indem Sie folgende kurze
481. t Waren korbsystem datenbankbasierten Katalogen oder pers nlicher Anmeldung m ssen Zust nde aber ber mehrere Seitenwechsel hinweg speichern Zu diesem Zweck wurde unter anderem das Konzept der Cookies eingef hrt Es handelt sich um kleine Textinformationen die der Browser im Auftrag einer bestimmten Website in einer Datei speichert und bei der n chsten Anfrage an dieselbe Site automatisch wieder mitschickt Der Server setzt einen Cookie indem er einen entsprechenden HTTP Header mit schickt Auch k nftige Anfragen die der Browser an den Server sendet enthalten den Cookie als Header Cookies verf gen ber ein Verfallsdatum bis zu dem der Browser sie speichert Auf diese Weise ist es m glich dass Besucher auch beim n chsten Besuch ihren Warenkorb oder pers nliche Voreinstellungen wiederfin den Um mit Hilfe der CGI Bibliothek einen Cookie zu setzen m ssen Sie zuerst eine Instanz der Klasse CGI Cookie erzeugen Der Konstruktor erwartet einen Hash mit diversen Parametern f r den Cookie Die wichtigsten sind e name der Name unter dem der Browser den Cookie speichert Wenn mehrere Seiten Ihrer Website unterschiedliche Informationen als Cookies bertragen sollen m ssen Sie darauf achten dass Sie diesen verschiedene Namen zuwei sen e value der zu speichernde Wert ein String e expires das erw hnte Verfallsdatum Sie k nnen eine Time Instanz verwen den am einfachsten ist es die gew nschte Zeitspanne
482. t Web Ressourcen Die erweiterte 2 Auflage bietet einen umfassenden berblick und eine ausf hrliche Refe renz der Programmiersprache Ruby in Version 1 8 Das ideale Buch zum Weiterar beiten wenn Sie mit dem vorliegenden fertig sind e Armin Roehrl Stefan Schmiedl Clemens Wyss Programmieren mit Ruby Heidelberg 2002 dpunkt Verlag Dies war das erste deutschsprachige Originalbuch zu Ruby Es eignet sich vor allem f r Umsteiger von anderen Programmiersprachen weniger f r komplette Einsteiger Leider ist es etwas lter und behandelt keine aktuelle Ruby Version 371 Lucas Carlson Leonard Richardson Ruby Cookbook Sebastopol 2006 O Reilly Media Hier finden Sie im bew hrten O Reilly Kochbuch Stil zahlreiche Praxisre zepte f r den Soforteinsatz im Ruby Alltag Jedes Rezept gliedert sich dabei in Pro blemstellung L sung und erweiterte Diskussion Denny Carl Praxiswissen Ruby on Rails K ln 2007 O Reilly Verlag Wenn Sie Ruby gelernt haben und sich nun n her mit Rails besch ftigen m chten d rfte dieses Buch genau das Richtige f r Sie sein Es erkl rt Schritt f r Schritt mit praxisnahen Beispie len wie Sie Rails Anwendungen programmieren und ver ffentlichen k nnen Dave Thomas David Heinemeier Hansson Agile Web Development with Rails 2 Auflage 2007 Pragmatic Programmers Dieses Buch ist eine ausf hrliche Praxis einf hrung und umfassende Referenz zu Ruby on Rails geschrieben vom Rails Erfin der Dav
483. t abtippen Beispiel 2 1 zeigt den kompletten Code Geben Sie ihn wie im vorigen Kapitel erw hnt in Ihren Texteditor ein Das bedeutet zwar ein wenig Tipparbeit vermit telt Ihnen aber ein Gef hl f r Ruby Formulierungen Speichern Sie die Datei unter dem Namen rechner rb in Ihrem Verzeichnis mit Ruby Beispielen Wenn Sie m ch ten k nnen Sie aus Gr nden der bersichtlichkeit ein Unterverzeichnis f r dieses Projekt oder f r das ganze Kapitel anlegen Beispiel 2 1 Der Ruby Taschenrechner rechner rb 1 Veberschrift ausgeben 2 puts Ruby Rechner 3 puts 4 puts 5 Endlosschleife starten 6 loop do 7 print Bitte die erste Zahl 8 Eingabe direkt in Fliesskommazahl umwandeln 9 und in z1 speichern 10 z1 gets to_f 11 print Bitte die zweite Zahl u 12 Eingabe direkt in Fliesskommazahl umwandeln 13 und in z2 speichern 14 z2 gets to_f 3 Sie k nnen das Beispiel auch downloaden http www oreilly de catalog rubybasger oder http buecher lingoworld de ruby Wir empfehlen Ihnen jedoch den Code zun chst selbst einzugeben 24 Kapitel 2 Sprachgrundlagen Beispiel 2 1 Der Ruby Taschenrechner rechner rb Fortsetzung 15 print Rechenoperation 16 Operator einlesen und anschliessenden Zeilenumbruch entfernen 17 op gets chomp 18 Gueltigkeit des Operators pruefen 19 if op X H 20 puts Ungueltige Operation op 21 puts 22 next 23 end 24
484. t die Include Datei socket aus der Ruby Standardbibliothek importieren und zwar am besten zu Beginn Ihres Skripts require socket 5 API steht f r Application Programming Interface also eine Schnittstelle zur Anwendungsprogram mierung Sockets 229 Danach steht Ihnen eine Reihe verschiedener Socket Klassen zur Verf gung Sie alle werden von der Klasse BasicSocket abgeleitet Diese Basisklasse enth lt die gemein same Funktionalit t aller Socket Typen aber es lassen sich keine Instanzen von ihr bilden Die verschiedenen Unterklassen l sen daf r jeweils spezielle Aufgaben BasicSocket stammt wiederum von I0 ab so dass Sie s mtliche in Kapitel 3 vorge stellten Schreib und Lesemethoden auch auf Sockets anwenden k nnen mit eini gen Besonderheiten die im Folgenden n her erl utert werden In diesem Kapitel werden vor allem einige komfortable Ruby Erwei A terungen der Socket API behandelt Der mehr oder weniger direkte w Zugriff auf die Socket Bibliothek des Betriebssystems ist ebenfalls m glich und zwar ber die auch von BasicSocket abgeleitete Klasse Socket Diese Methode ist allerdings viel komplizierter und platt formabh ngig so dass sie hier nicht weiter behandelt wird Bevor einige Socket Klassen und ihre F higkeiten im Detail erl utert werden hier zun chst ein einfaches Beispiel Das folgende kleine Skript l dt die Startseite von www oreilly de herunter entfernt s mtliche HTML Tags und zeigt den
485. t verwendet werden Zeile 59 In jedem Fall wird nun das Weiterleitungsziel geladen Falls es sich erneut um eine Weiterleitung handelt findet der n chste Schleifendurchlauf statt Web Clients mit Net HTTP 253 Zeile 62 65 Falls der Statuscode gegebenenfalls nach der letzten Weiterlei tung nicht 200 sein sollte ist offensichtlich ein Fehler aufgetreten An dieser Stelle werden Statuscode und meldung dieses Fehlers ausgegeben Beachten Sie dass die nachfolgende normale Verarbeitung der Ressource nicht in einem else Block steht Eine Fehlerseite wird somit genauso verarbeitet wie eine kor rekte Lieferung dies ist passend weil die Fehlermeldungen der meisten Web server ein HTML Dokument mit einer Fehlerbeschreibung mitliefern Zeile 67 68 An dieser Stelle werden ein ganzzahliger Z hler und ein leeres Array f r die Linkliste initialisiert Zeile 70 77 Als N chstes wird der Header Content type der HTTP Antwort ausgewertet Dieser gibt den Datentyp der gelieferten Ressource an Da es sich bei diesem Skript um einen Textbrowser handelt k nnen nur Daten mit text Typen verarbeitet werden beispielsweise text html HTML Code der Standard bei Webseiten text plain einfacher Text ohne Formatbefehle oder text xml XML Code Sollte die Ressource einen anderen Typ haben etwa image gif f r ein GIF Bild oder application pdf f r ein PDF Dokument dann wird an dieser Stelle eine Fehlermeldung angezeigt Zeile 78 D
486. te Fassung umst ndlicher schon allein weil sie mit 106 Zeilen deutlich umfangreicher ist als die 80 Zeilen des imperativen Skripts Machen Sie sich einmal Gedanken dar ber wie man beide Skripten umschreiben m sste um die Daten von f nf verschiedenen Z gen zu ver walten Glauben Sie dass die imperative Schreibweise dann immer noch schlanker w re Klassen entwerfen und implementieren Nach dem Einf hrungsbeispiel sind Sie nun bereit f r einen systematischen ber blick ber den Entwurf und die Programmierung von Klassen und das Arbeiten mit ihren Instanzen und Methoden Jede Ruby Klasse wird in einem Codeblock mit folgender Syntax definiert class Klassenname Konstanten Methoden usw end Zwischen class und end werden dann s mtliche Elemente der Klasse definiert die Sie im Folgenden kennenlernen Konstruktor Methoden und so weiter Interes santerweise besteht die k rzeste g ltige Klasse aber aus genau diesen beiden Zeilen wenngleich sie dann keinen besonderen Nutzen hat Probieren Sie es trotzdem in irb aus gt gt class Test gt gt end gt nil gt gt t Test new gt lt Test 0x2b1ac7c gt Sie haben damit erfolgreich eine Klasse definiert und eine Instanz davon erzeugt Da diese keinerlei Daten enth lt zeigt irb die Objekt ID an Das ist eine eindeutige Nummer unter der sich Ruby selbst jedes einzelne Objekt merkt sie wird weiter unten noch n her besprochen Der objektorientierte Entwurf
487. te ung ltig sind Zeile 37 39 waggontest liefert einfach die Differenz zwischen der aktuellen Waggonanzahl und der Kapazit t der beiden Lokomotiven Zeile 41 52 In der Methode lokinfo wird die Kapazit t der angegebenen Lok per case when Fallentscheidung untersucht Diese liefert eine String Entspre chung des Lokomotiventyps Zeile 54 59 Die Methode info gibt alle relevanten Informationen ber den G terzug aus Sie ruft zun chst f r beide Lokomotiven lokinfo auf anschlie Rend werden die Waggonkapazit t und die aktuelle Waggonzahl des Zugs aus gegeben Zeile 62 Hier beginnt der globale das hei t nicht mehr in Methodendefinitio nen stehende Code abgesehen von den Konstantendefinitionen zu Beginn des Skripts Die erste Anweisung die tats chlich ausgef hrt wird ist dieser Aufruf von info um den Grundzustand des Zugs auszugeben Zeile 65 66 50 Waggons werden angeh ngt Danach wird erneut info aufgeru fen um den aktuellen Zustand zu ermitteln Zeile 69 74 Ein erneuter Aufruf von anhaengen macht sich dessen R ckgabewert zunutze um zu berpr fen ob sich weitere 50 Waggons hinzuf gen lassen Die if Abfrage sorgt f r die entsprechende Erfolgs oder Misserfolgsmeldung Zeile 76 Die zweite Lokomotive also Nummer 1 wird entfernt indem ihr Typ auf die Konstante OHNE gesetzt wird Zeile 80 Ein Aufruf von waggontest bringt an den Tag dass f r die verbliebene Lokomotive zu viele Waggons vorhanden sind so da
488. tel 3 Ruby Klassen else Fall gilt die Plattform etwas ungenau aber in der Praxis wohl ausrei chend als UNIX Variante Zeile 23 42 Durch eine berpr fung der Variable postings wird ermittelt ob Eintr ge vorhanden sind Ist das der Fall so werden sie angezeigt ansonsten erscheint eine Meldung dass es noch keine gibt Zeile 28 29 Da bis zu f nf Postings angezeigt werden sollen wird hier der letzte Eintrag ermittelt entweder pos 4 oder einfach 1 falls auf der Seite mit den ltesten Eintr gen weniger als f nf stehen Zeile 31 41 Zum Auslesen der Dateien wird der Iterator downto mit den Wer ten von pos bis last verwendet Zeile 32 Zun chst wird die aktuelle Posting Nummer ausgegeben Zeile 34 Der Dateiname des aktuellen Eintrags wird konstruiert Zeile 35 40 Die Datei wird ge ffnet ihr Inhalt wird ausgelesen und angezeigt und sie wird wieder geschlossen Zeile 46 51 Das Men wird angezeigt Das ist nur erw hnenswert weil die Men punkte N euere und A eltere davon abh ngig gemacht werden ob das Bl ttern in die entsprechende Richtung noch funktioniert Zeile 55 Wenn die Eingabe mit gro em oder kleinem e wie Ende beginnt wird die Schleife mittels break verlassen Damit ist das Programm beendet Zeile 57 61 Beginnt die Eingabe mit n so wird pos um 5 erh ht um die f nf n chstneueren Eintr ge anzuzeigen Als H chstgrenze wird der Wert von pos tings festgelegt Dadurch passiert au
489. tel 5 Netzwerkanwendungen connection close content type text html etag 15dc535 1582 454c7ceb date Mon 18 Dec 2006 22 16 02 GMT server Apache 1 3 33 Unix content length 5506 accept ranges bytes In response body befindet sich wie erw hnt der Dateninhalt der gelieferten Res source bei 200 OK die gew nschte Datei bei den meisten anderen Statuscodes dagegen eine kurze Fehlermeldung im HTML Format Bei einem Status wie 404 k nnen Sie nichts weiter unternehmen die Seite ist nicht vorhanden m glicher weise haben Sie sich beim Aufruf verschrieben oder der Betreiber hat die Seite aus dem Netz genommen Interessant sind dagegen die 30x Statuscodes Der Client erh lt die Mitteilung dass sich die Seite an einem anderen Ort befindet die neue URL steht im Header Loca tion Browser verfolgen solche Weiterleitungen automatisch w hrend Sie das Ihren eigenen Clients erst beibringen m ssen Eine M glichkeit w re eine Schleife wie diese die auch mehreren Weiterleitungen automatisch folgt Bei 30x Statuscodes der Weiterleitung folgen while response code 30 d Neue URL aus dem Header Location lesen url response location puts Verfolge Weiterleitung nach url Neue URL anfordern response webclient get url end Sie k nnen dies leicht ausprobieren indem Sie die obige Site ohne den abschlie en den Slash aufrufen also ruby statt ruby schreiben response webclient get ruby Der a
490. tellt werden etwa die Kenntnis eines speziel len konfigurierbaren Passworts Zeile 27 47 In einer case when Fallentscheidung wird gepr ft ob ein Client einen der drei Moduswechsel Befehle gesendet hat Zeile 28 30 Wenn der Befehl MODE_NORMAL empfangen wurde wird die Vari able mode auf NORMAL gesetzt Der Client erh lt eine entsprechende administra tive Meldung als Antwort Der hier gezeigte Zeilenabschluss mit r n ist f r Netzwerkanwen A dungen sehr wichtig Wie Ihnen vielleicht bekannt ist verwenden die w verschiedenen Betriebssysteme unterschiedliche Zeichen zur Markie rung eines Zeilenumbruchs Alle UNIX Varianten benutzen den ein fachen Zeilenvorschub line feed ASCI Code 10 oder n Windows benutzt Wagenr cklauf carriage return ASCH 13 und Zeilenvorschub also die Sequenz r n Das klassische Mac OS bis Version 9 schlie lich verwendet nur einen Wagenr cklauf F r TCP IP Netzwerkanwendungen wird erstaunlicherweise die Windows Sequenz eingesetzt obwohl diese Protokolle aus der UNIX Welt stammen Deshalb m ssen Sie r n in TCP Clients und Servern explizit hinschreiben damit sie auf jeder Plattform funk tionieren In lokalen Anwendungen wird ein einfaches n dagegen automatisch in das Zeilenende des jeweiligen Systems konvertiert Sockets 237 e Zeile 31 36 Die Modus Wechselbefehle MODE REVERSE beziehungsweise MODE_ROT13 werden auf dieselbe Weise verarbeitet Beachten Sie dass der
491. temspezifische Art und Weise aktiviert werden SUSE und einige andere Linux Distributionen bieten daf r zum Beispiel das bequeme Kommando chkconfig an chkconfig a mysql Nach Installation und Start des MySQL Servers k nnen Sie zum Beispiel den Kom mandozeilen Client mysql verwenden um Datenbanken einzurichten und zu ver walten Er befindet sich im bin Verzeichnis der Installation und kann beim ersten Start ohne Passwort ausgef hrt werden usr local mysql bin mysql Die neue Eingabeaufforderung mysql gt zeigt dass Sie sich nun innerhalb dieses Cli ents befinden Hier sollten Sie sich aus Sicherheitsgr nden zuerst darum k mmern ein Passwort f r root localhost die Administration vom lokalen Rechner aus festzulegen mysql gt SET PASSWORD FOR root localhost PASSWORD meinPasswort Anschlie end sollten Sie alle Zugangsberechtigungen mit leerem Benutzernamen und oder leerem Passwort entfernen mysql gt DELETE FROM mysql user WHERE user OR password Nun k nnen Sie den Client zun chst wieder verlassen indem Sie exit oder q ein geben Wenn Sie ihn das n chste Mal starten m ssen Sie die Optionen u Benut zername und p Passworteingabeaufforderung verwenden mysql u root p Passwort eingeben Zugriff auf Datenbanken 317 Erste Schritte mit MySQL Wie bereits erw hnt ist MySQL eine so genannte relationale Datenbank Dieser Begriff besagt dass die Daten in Tabellen organisiert sind
492. ten Maustaste an um den Monitor zu ffnen Dort k nnen Sie Apache steuern ihn zum Beispiel nach einer Konfigurations nde rung neu starten Installation unter UNIX In vielen Linux und BSD Distributionen ist der Apache Webserver bereits ab Werk enthalten oder kann bei der Installation des Systems optional ausgew hlt werden Auch Mac OS X liefert ihn mit Falls dies auf Ihrem System der Fall ist k nnen Sie diesen Abschnitt berspringen Sie sollten lediglich sicherstellen dass mindestens Apache 2 0 installiert ist und keine 1 3 Version Zu Ihrer eigenen Sicherheit sollten Sie au erdem berpr fen ob die installierte Version aktuell ist ltere Releases ent halten oft bekannte Sicherheitsl cken die Cracker sich zunutze machen Auf UNIX Systemen wird Apache fast immer aus dem Quellcode kompiliert selbst die Apache Software Foundation bietet f r diese Plattform keine Bin rpakete an Zum Kompilieren ben tigen Sie einen modernen ANSI C Compiler vorzugsweise die GNU Compiler Collection GCC Der erste Installationsschritt besteht darin dass Sie das Quellcode Paket durch fol gende Anweisung entpacken tar xzvf httpd 2 2 4 tar gz Wechseln Sie anschlie end in das neu entstandene Verzeichnis in das die Archiv dateien entpackt wurden Den Webserver Apache 2 installieren 277 cd httpd 2 2 4 Nun muss das Skript configure im aktuellen Verzeichnis aufgerufen werden um die Quelldateien vor der eigentlichen Kom
493. ternets und seiner Vorl ufer netze die seit 1969 gesammelt werden Sie k nnen die inzwischen gut 4 600 meist sehr technischen und trockenen Ausnahme einige Spa RFCs vom 1 April z B RFC 2324 Dokumente zum Beispiel unter http www ietf org rfc html abrufen Datum und Uhrzeit 139 Die Ausgabe sieht beispielsweise so aus 21 10 2006 10 32 07 Zur Erinnerung Der Formatplatzhalter 02d bedeutet dass die entsprechende Ganzzahl auf mindestens zwei Stellen erg nzt werden soll und dass als eventuelles F llzeichen kein Leerzeichen sondern eine 0 verwendet wird Ein wenig mehr Arbeit ist es den Wochentag dazu als Text auszugeben und nach M glichkeit auch noch den Monat Sie lernen zwar als N chstes die Formatierungs methode strftime f r Time Objekte kennen die auch diese Werte liefern kann das allerdings nur auf Englisch Deshalb hier zun chst eine Anleitung f r die Extrahie rung deutscher Wochentags und Monatsnamen Wenn Sie sich den Wertebereich der Wochentagsnummern ansehen ist der Fall eigentlich klar Die m glichen Werte 0 bis 6 lassen sich ohne Weiteres als Index auf ein Array mit Wochentagsnamen anwenden Wichtig ist nur dass Sie die Reihen folge beachten in der englischsprachigen Welt beginnt die Woche mit dem Sonn tag Das Array muss also folgenderma en aussehen wtage w Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag Beim Monat wird es etwas schwieriger Der Wertebereich ist 1 bis 12 w
494. thod pits for main Object NoMethodError r Einen schwerwiegenden Fehler mit Status 500 erhalten Sie beispielsweise durch dieses Skript usr bin ruby w puts lt html gt lt head gt lt title gt Test lt title gt lt head gt puts lt body gt Test lt body gt lt html gt Wie Sie sehen fehlen in diesem Skript die Header Die ErrorLog Datei meldet dies wie folgt Thu Dec 28 19 20 44 2006 error client 127 0 0 1 malformed header from script Bad header lt html gt lt head gt lt title gt Test lt title fatal rb Die Ruby CGI Bibliothek verwenden Die weiter oben erw hnte Bibliothek cgi rb vereinfacht das Schreiben von CGI Skripten in Ruby Ihre wichtigsten F higkeiten sind e Einfaches Lesen von Formulardaten Erzeugung von HTML Code durch Ruby Methoden Setzen und Auslesen von Cookies e Session Tracking Bevor diese Themen in den nachfolgenden Abschnitten vertieft werden hier zun chst ein einfaches Beispiel Es handelt sich um einen Service f r Reisende in die englischsprachige Welt denn er erm glicht die Eingabe einer Temperatur und die Auswahl ob von Celsius in Fahrenheit umgerechnet werden soll oder umgekehrt 292 Kapitel 6 Klassische Webanwendungen In Beispiel 6 1 sehen Sie zun chst den Quellcode Diese Datei temperatur rb muss wieder je nach Konfiguration in das cgi bin Verzeichnis oder in ein beliebiges Ver zeichnis unterhalb Ihrer Apache DocumentRoot kopiert werden Auch die Shebang Ze
495. thoden sind dagegen Instanzmethoden die jedoch nicht von au en aufgerufen werden k nnen Es gibt noch eine andere Aufrufm glichkeit f r public private und protected Sie k nnen ihnen ein oder mehrere Symbole als Argumente bergeben um nur den angegebenen Methoden die entsprechende Sichtbarkeit zuzuweisen Das ist vor allem n tzlich um die Geheimhaltungsstufe von Methoden zu modifizieren die aus der Elternklasse bernommen wurden Das obige Beispiel k nnten Sie auf diese Weise wie folgt umschreiben class PrivatTest def privat puts Dies ist privat end def oeffentlich print Ganz unter uns privat end private privat end Es kann n tzlich sein private Methoden zu schreiben um sich um die inneren Angelegenheiten einer Instanz zu k mmern Stellen Sie sich beispielsweise vor ein H ndler bietet f r seine Waren eine Ratenkreditfinanzierung an Der Kredit soll gew hrt werden falls das Monatsgehalt des Kunden mindestens ein Viertel des Kaufpreises betr gt Das genaue Gehalt geht den Verk ufer nichts an aber dennoch muss er entscheiden k nnen ob der Kunde den Kredit erh lt Zu diesem Zweck k nnte man eine private Methode schreiben die das Gehalt mit vier multipliziert Sie wird hinter den Kulissen von einer ffentlichen Methode aufgerufen die nur true oder false zur ckgibt Die Klasse Kunde s he in diesem Fall so aus 202 Kapitel 4 Eigene Klassen und Objekte erstellen class Kunde def initialize g
496. tigen Sie einen Webserver Der bekannteste und verbreitetste von allen ist der Apache HTTP Server Da es sich dabei um frei verf gbare Open Source Software handelt k nnen Sie diesen Indus triestandard auch als Entwicklungsserver f r Ihre eigenen Websites einsetzen Nach einigen Worten zu den F higkeiten dieses Servers wird die Installation unter Win dows und UNIX beschrieben danach erhalten Sie noch einige Informationen zur Apache Grundkonfiguration Eine schnelle und einfache Alternative f r einen reinen Entwickler A rechner ist die Installation von XAMPP Es handelt sich dabei um ein o integriertes und weitgehend fertig konfiguriertes Paket mit Apache MySQL Datenbank PHP und weiteren Serverkomponenten Unter den diversen Erweiterungspaketen ist inzwischen auch mod_ruby siehe den Kasten am Ende dieses Kapitels zu finden Downloads f r Windows Linux und Mac OS X sowie ausf hrliche Installationsan leitungen finden Sie unter http www apachefriends org de xampp html Eigenschaften von Apache 2 Apache wurde seit 1995 entwickelt zun chst als Weiterf hrung des universit ren NCSA HTTPd und danach als eigenst ndiger wesentlich leistungsf higerer Web server Die Apache Software Foundation in der sich seine Entwickler organisiert haben betreut neben diesem Server l ngst eine gro e Anzahl verschiedener renom mierter Open Source Projekte beispielsweise den Java Webanwendungs Server Tomcat den Spam Filter SpamAssassin oder
497. tioniert nur zusammen mit einer Gesamtbreite Beispiele zum Vergleich gt gt printf Vortext 10d Nachtext 3 Vortext 3 Nachtext gt gt printf Vortext 10d Nachtext 3 Vortext 3 Nachtext e 0 Den freien Platz mit Nullen statt mit Leerzeichen auff llen Dazu wird die 0 vor die Angabe der Gesamtbreite gesetzt Zum Beispiel gt gt printf 7d 23 23 gt gt printf 07d 42 0000042 u Die F higkeiten von printf k nnen Sie auch einsetzen um forma tierte String Ausdr cke zu bilden Dazu steht die globale Methode sprintf zur Verf gung deren Ergebnis ein String mit den entspre chenden Formatierungen ist Hier als Beispiel eine Variablen Wert zuweisung gt gt text sprintf 1Ff 1f 1f 5 2 5 0 2 gt 5 0 2 0 2 5 Die wichtigste Methode f r die Konsoleneingabe ist gets Sie liest eine Zeile samt Zeilenumbruch ein was Sie leicht in irb ausprobieren k nnen Ein undAusgabe 119 gt gt text gets Hallo gt Hallo n Da der abschlie ende Zeilenumbruch in der Regel nicht gebraucht wird sondern st rt wird er meist sofort mit chomp entfernt gt gt text gets chomp Hallo gt Hallo Sie k nnen gets als Bedingung einer while Schleife verwenden Die Schleife wird dann ausgef hrt bis das Zeichen End of File EOF eingegeben wird W hrend es bei Dateien wie der Name vermuten l sst am Dateiende automatisch erzeugt wird muss es bei Tasta
498. tjahr if y 4 0 amp amp y 100 0 y 400 monate 1 29 end Laenge des aktuellen Monats mlaenge monate m 1 Wochentag des Monatsersten erster Time parse y m 01 wt erster wday Sonntag gt 7 europ Woche wt 7 if wt 0 puts m y puts puts MO DI MI DO FR SA SO Leerzeichen von Montag bis Wochentag des Ersten leer wt 1 4 print leer 1 upto mlaenge tag Wochenwechsel ifwt gt 7 wt 1 print n end Aktueller Tag onate 31 28 31 30 31 30 31 31 30 31 30 31 Datum und Uhrzeit 143 Beispiel 3 4 Der Konsolen Monatskalender kalender rb Fortsetzung 32 33 34 35 36 37 38 if tag d printf 2d tag else printf 3d tag end wt 1 Wenn Sie das Skript ausf hren erhalten Sie eine Ausgabe wie in Abbildung 3 2 ex Eingabeaufforderung ojx rubytest gt ruby kalender rb 8 2886 sa so 1 7 8 14 15 21 221 28 29 ruhytest gt Abbildung 3 2 Ausgabe des Konsolenkalenders am 22 10 2006 Hier die wichtigsten Programmschritte im berblick Zeile 2 5 Das aktuelle Systemdatum wird ermittelt anschlie end werden die Bestandteile Tag Monat und Jahr extrahiert Zeile 7 11 Die L ngen der verschiedenen Monate werden in einem Array gespeichert Zeile 9 pr ft ob das aktuelle Jahr ein Schaltjahr ist durch 4 aber nicht durch 100 teilbar oder aber durch 400 t
499. tr ge und pos die Nummer des ersten Eintrags der auf der aktuellen Seite angezeigt wird Da sich erst aus dem Inhalt der anschlie end untersuchten eventuell noch gar nicht vorhandenen Datei postings txt ergibt wie viele Postings vorhanden sind ist der Anfangswert beider Variablen 0 Zeile 6 13 Wenn postings txt existiert und eine gew hnliche Datei ist Methode File file wird sie zum Lesen ge ffnet Der ausgelesene Wert wird mittels to_i in eine Ganzzahl umgewandelt und in postings gespeichert Da die Anzeige beim neuesten Eintrag mit der h chsten Nummer beginnen soll erh lt pos denselben Wert Zeile 15 92 Der Rest des Skripts wird in einer Endlosschleife ausgef hrt die sp ter bei einer bestimmten Benutzereingabe verlassen wird Innerhalb dieser Schleife kann der Benutzer in den Postings bl ttern oder neue verfassen Zeile 17 21 Vor der Ausgabe wird der Bildschirm gel scht Dazu wird die Anweisung system verwendet die das Betriebssystem beauftragt den bergebe nen String als Konsolenbefehl auszuf hren Das Problem ist nur dass der ent sprechende Befehl unter Windows cls hei t aber in UNIX Systemen clear Gl cklicherweise liefert die globale Konstante RUBY_PLATFORM den Namen der Systemplattform f r die die laufende Ruby Version kompiliert wurde Der Wert wird gegen den regul ren Ausdruck win getestet weil davon auszuge hen ist dass alle Windows Varianten von Ruby diesen Teilstring enthalten Im 132 Kapi
500. truktor aufrufen Zum Beispiel require rubygems require uuid uuid UUID new Die erzeugte UUID ist 128 Bit lang und wird als String aus Hexadezimalziffern und Bindestrichen notiert zum Beispiel c9ce3001 7bbf 0129 373e 00505600008 2 Die erzeugte Session ID muss auf Dauer mit den Anfragen des fraglichen Cli ents verkn pft werden Sie k nnen zun chst versuchen sie als Cookie zu spei chern Falls dies aber aus den oben angesprochenen Gr nden scheitert bleibt Ihnen nur noch die M glichkeit die ID in den Query String oder die POST Daten jeder internen Verkn pfung Hyperlinks Formularversand usw aufzu nehmen In Formulare k nnen Sie dazu einfach ein Hidden Feld unsichtbares Feld mit einem vorgegebenen Wert einbetten Zum Beispiel cgi form cgi hidden name gt id value gt uuid ar Bei Hyperlinks m ssen Sie die ID jedoch manuell anh ngen zum Beispiel so cgi a href gt bestellung rb id uuid Bestellen 3 Unter der ID k nnen Sie nun Daten speichern die jeweils f r eine spezielle Cli ent Session relevant sind Zwei Speicherm glichkeiten f r Session Daten w ren Textdateien deren Name die jeweilige Session ID ist oder eine Datenbankta CGl Skripten mit Ruby 309 belle Wie Sie auf Textdateien zugreifen k nnen wurde bereits in Kapitel 3 erl utert und Genaueres ber die Ruby Datenbankanbindung erfahren Sie im n chsten Abschnitt 4 Wenn Sie auf einer neuen Seit
501. tsbereichen im gesamten Skript gelten m ssen Sie ihrem Namen ein Dollarzeichen voranstellen Dieser spezielle Typ wird als globale Variable bezeichnet w hrend die Standardvariablen ohne Dollar zeichen lokale Variablen hei en Beachten Sie dass das Dollarzeichen ein Bestand teil des Namens ist test und test sind beispielsweise zwei verschiedene Variablen Hier ein Definitionsbeispiel lokal Gilt nur lokal global Gilt im gesamten Skript Wie in den meisten Skriptsprachen ist eine Ruby Variable im Lauf ihrer Existenz nicht auf einen bestimmten Datentyp festgelegt Sie k nnen ihr nacheinander ver schiedene Wertetypen zuweisen Diese Eigenschaft wird als dynamische Typisierung bezeichnet Speziell f r Ruby wurde der Begriff Duck Typing gepr gt If it walks like a duck and quacks like a duck then it must be a duck Probieren Sie auch dieses Feature aus indem Sie ein und derselben Variablen nach einander unterschiedliche Arten von Werten zuweisen var 2 var 2 2 var Hallo var true 9 Wenn es wie eine Ente watschelt und wie eine Ente quakt dann muss es eine Ente sein Variablen Ausdr cke und Operationen 47 Wenn Sie nach jeder Wertzuweisung var class aufrufen erhalten Sie nacheinander folgende Typangaben Fixnum Float String und TrueClass Eine weitere interessante Funktion die Ruby vielen anderen Sprachen voraushat ist die Mengen Wertzuweisung Vor dem Gleichheitszeichen k nnen Sie
502. ttelbar nach Erwerb des Buchs probierte ich Ruby aus es ist schlie lich Open Source Software die man kostenlos herunterladen kann Ich war praktisch sofort begeistert von der Klarheit und Eleganz der Formulierungen und vom Leis tungsumfang der mitgelieferten Bibliotheken Praktische Nutzanwendungen waren aber auch f r mich erst einmal nicht zu entdecken denn mein Sprachen Werk zeugkasten war damals einigerma en wohlgeordnet Perl f r Admin Skripten PHP f rs Web und Java f r gr ere Anwendungen gelegentlich noch etwas C und ein paar Shell Skripten Der eigentliche Durchbruch f r Ruby in der Entwicklerwelt au erhalb Japans Rubys Heimat kam erst 2004 Fachzeitschriften und Blogs begannen ber Ruby on Rails zu berichten eine neue gut durchdachte Umgebung f r Webanwendun 1 http www ruby lang org gen Durch eine saubere Trennung von Datenmodell Programmierlogik und Inhalt macht Rails Schluss mit dem blichen Durcheinander klassischer Webanwendun gen Wobei man fairerweise erw hnen sollte dass nicht diese Anwendungen oder ihre Programmiersprachen an dem Chaos schuld sind sondern die Abfolge einzel ner Webseiten in Kapitel 6 dieses Buchs erfahren Sie N heres Es ist gut m glich dass Sie dieses Buch lesen weil Sie sich begeistert auf Rails gest rzt und dann pl tzlich gemerkt haben dass Sie noch nicht genug ber die zugrunde liegende Sprache Ruby wissen Sie bietet n mlich zahlreiche wohlge merkt
503. tuelle Bildschirmzeilennummer line 0 Solange noch Zeilen vorhanden sind while textlines Solange der Bildschirm nicht voll ist while line lt 22 Aktuelle Zeile holen l textlines shift Ende falls keine Zeile mehr vorhanden if l1 nil ende true break end Zeile ausgeben puts 1 Bildschirmzeilenzaehler erhoehen line 1 end Abbruch falls Textende gefunden wurde break if ende Ausgabe der Fusszeile print n t WEITER ENTER ENDE Q ENTER k weiter STDIN gets chomp Abbruch falls q eingegeben wurde break if weiter q Zaehler zuruecksetzen line 0 end end end Eine zeilenweise Beschreibung entf llt an dieser Stelle ausnahmsweise Lesen Sie den Quellcode in Ruhe im Prinzip m ssten Ihnen die einzelnen Anweisungen des Skripts bekannt sein Beachten Sie besonders den eigentlichen Wortumbruch Zeile 5 text gsub 1 70 s Z 2 n Der erste geklammerte Ausdruck besagt dass 1 bis 70 beliebige Zeichen gew hlt werden sollen Danach folgt entweder beliebig viel Whitespace s oder das Text ende 2 Als Ersatztext dient der Inhalt des ersten Klammerausdrucks 1 gefolgt von einem Zeilenumbruch Das Verfahren funktioniert aufgrund der in Kapitel 2 246 Kapitel 5 Netzwerkanwendungen beschriebenen Greediness der Regexp Quantifizierer Der Teilausdruck 1 70 macht nicht beim ersten sondern beim letzten m glichen Auftreten von Whitespace
504. tureingaben k nstlich erzeugt werden unter Windows mit Strg Z bei UNIX Systemen mit Strg D Hier ein Beispiel das jede eingegebene Zeile umgekehrt ausgibt while line gets line chomp puts line reverse end Speichern Sie das kurze Skript und f hren Sie es aus Geben Sie zum Abbrechen die EOF Tastenkombination Ihrer Plattform und dann Enter ein Zum Beispiel gt ruby textrev rb Ich kehre alles um mu sella erhek hcI Dieser Text soll andersherum stehen nehets murehsredna llos txeT reseiD NZ Versuchen Sie auch das Skript per Eingabeumleitung auf eine Datei anzuwenden zum Beispiel auf sich selbst gt ruby textrev rb lt textrev rb steg enil elihw pmohc enil esrever enil stup dne Es gibt auch die M glichkeit ein einzelnes Zeichen einzulesen Dazu wird die Methode getc verwendet die eine explizite Angabe des I O Kanals ben tigt im Fall der Tastatur STDIN Zum Beispiel gt gt zeichen STDIN getc a gt 97 Beachten Sie dass das entsprechende Zeichen als numerischer Code zur ckgeliefert wird Sie k nnen es wie blich mit chr umwandeln Noch wichtiger ist dass Ihre Eingabe gepuffert wird das Zeichen steht erst zur Verf gung nachdem die Enter Taste gedr ckt wurde Das ungepufferte Auslesen eines Zeichens ist leider betriebs systemabh ngig und steht daher in einer plattformneutralen Skriptsprache nicht 120 Kapitel 3 Ruby Klassen zur Verf gung Es gibt allerdings Erweite
505. twickelt Au er Matz arbeitet eine ber die ganze Welt verteilte sehr aktive Community an der Sprache an zahllosen Erweite rungen und an der Dokumentation Die Koordination der verschiedenen Arbeits gruppen erfolgt ber das Internet die Adressen der wichtigsten Websites und Mailinglisten stehen in Anhang B Die meisten Mitglieder dieser Gruppen sind freundlich und beantworten bereitwillig Fragen auch von Einsteigern Achten Sie aber darauf dass Sie zun chst in den FAQs oder Archiven der betreffenden Foren und Mailinglisten nachsehen ob Ihre Frage nicht bereits beantwortet wurde Erst in den letzten zwei Jahren erhielt Ruby einen neuen ungeahnten Popularit ts schub Es sprach sich unter Webentwicklern schnell herum dass das Framework Ruby on Rails die schnelle Entwicklung robuster und sicherer Webanwendungen erm glicht mehr dar ber lesen Sie in Kapitel 7 Auch die benutzerfreundlichen reaktionsschnellen Ajax und Web 2 0 Anwendungen profitieren von Ruby on Rails Um mit Rails vern nftig arbeiten zu k nnen empfiehlt es sich zun chst die zugrunde liegende Sprache Ruby zu erlernen Insofern ist das vorliegende Buch auch eine ideale Vorbereitung f r angehende Rails Entwickler 2 Kapitel 1 Einf hrung Merkmale und Vorz ge von Ruby Ohne technische Details vorwegzunehmen wird in diesem kurzen Abschnitt das Wesen der Programmiersprache Ruby vorgestellt Falls Sie noch nie programmiert haben k nnen Sie mit manchen Begriff
506. uby durch das f hrende kennzeichnet Eine besondere Methode ist der Konstruktor dessen Name initialize lautet Er wird in der Regel genutzt um die Instanzvariab len zu initialisieren Mit Hilfe des Operators lt k nnen Sie bei einer Klassendefinition angeben dass die neue Klasse alle Eigenschaften und Methoden von einer anderen Klasse berneh men soll Danach gen gt es Erg nzungen und Unterschiede neu zu schreiben Die ses Konzept hei t Vererbung und erm glicht den Aufbau umfangreicher Klassenhierarchien in denen jegliche Codeverdopplung eine h ufige Fehlerquelle verhindert wird Einige zus tzliche Features erg nzen das OOP Standardrepertoire in Ruby Ein wichtiges Beispiele sind die Module die sich als Mixins in beliebige Klassen impor tieren lassen so dass in verschiedenen Klassen dieselben Methoden zur Verf gung stehen obwohl diese Klassen nicht durch Vererbung voneinander abgeleitet wur den Auch der umfangreiche Werkzeugkasten zur Introspektion also zur Untersu chung von Klassen Instanzen und Methoden im laufenden Betrieb erleichtert Ihnen das Leben als OO Entwickler enorm Zusammenfassung 215 Da Sie nun das Wichtigste ber Objektorientierung wissen wird hier noch einmal das Textmanipulierer Beispiel aus Kapitel 2 aufgegriffen wobei die Beschreibung nun alle in diesem Kapitel eingef hrten Fachbegriffe enth lt Beispiel 4 5 modtext rb der objektorientierte Textmanipulierer 1 class ModText
507. uby mit ihr arbeiten kann Ruby 1 Ein Web Service ist eine Komponente die mit Hilfe standardisierter HTTP POST Anfragen meist in den XML Formaten SOAP oder XML RPC ber das Web genutzt werden kann Das erm glicht die plattformneutrale Zusammenarbeit verschiedener Softwarekomponenten 336 Kapitel 7 Ruby on Rails on Rails kann mit vielen verschiedenen Datenbanken zusammenarbeiten Die Emp fehlung und Voreinstellung ist MySQL Wenn Sie Kapitel 6 durchgearbeitet haben ist dieser Datenbankserver bereits installiert und auch die Ruby Anbindung m sste funktionieren Falls Sie diese Schritte noch nicht erledigt haben lesen Sie im vori gen Kapitel nach Anleitungen zur Verwendung anderer Datenbanksysteme gibt es dagegen auf der Website von Ruby on Rails unter http www rubyonrails org Nachdem alle Komponenten installiert sind k nnen Sie sofort Ihre erste Rails Anwendung einrichten Das Grundger st wird wie folgt erzeugt 1 Wechseln Sie in ein Verzeichnis Ihrer Wahl oder erstellen Sie ein neues das Ihre Rails Anwendungen enthalten soll und wechseln Sie anschlie end in die ses Verzeichnis Hier ein Windows Beispiel gt C gt cd gt md railsapps gt cd railsapps Unter UNIX k nnten Sie hingegen folgendes Verzeichnis als root erzeugen cd var mkdir railsapps cd railsapps A Damit Sie die Rails Entwicklungsarbeit nicht als root durchf hren m ssen sollten Sie den Besitz an dem neuen Verzeichnis un
508. uer 0 interpret interpret titel titel dauer dauer to_i end Dauer in Minuten def minuten sprintf d 02d dauer 60 floor dauer 60 end Alle Infos ueber den Song als String def to_s sprintf s s s interpret titel minuten end end Zum einfachen Ausprobieren k nnen Sie die Datei mit der Klasse in irb importieren und dann interaktiv mit der Klasse spielen Hier ein komplettes Beispiel einer sol chen Sitzung gt gt require song rb gt true gt gt lied1 Song new Metallica One 444 gt lt Song 0x2b18bac dauer 444 titel One interpret Metallica gt 6 Inspiriert durch ein hnliches Praxisbeispiel im Pickaxe Book Klassen entwerfen und implementieren 197 gt gt puts lied1 Metallica One 7 24 gt gt lied2 Song new Red Hot Chili Peppers Snow Hey Oh gt lt Song 0x2b1437c dauer 0 titel Snow Hey Oh interpret Red Hot Chili Peppers gt gt gt puts lied2 Red Hot Chili Peppers Snow Hey Oh 0 00 gt gt lied2 dauer 334 gt 334 gt gt puts lied2 Red Hot Chili Peppers Snow Hey Oh 5 34 Schauen Sie sich nebenbei noch kurz die Methode minuten an Sie setzt die Dauer in Minuten aus dem ganzzahligen Anteil der durch 60 geteilten Sekunden einem Dop pelpunkt und dem Rest dieser Division zusammen F r Letzteren wird das Format 02d verwendet das zwei Stellen und eventuell eine f hrende Null garantiert Als Met
509. ugen 318 Mysql query Methode 323 mysql Client 318 Mysql Klasse 323 select_db Methode 323 mysql Ruby Erweiterung 321 Mysal result fetch_hash Methode 324 fetch_row Methode 324 num_rows Methode 324 Mysql Result Klasse 323 N Namensraum OOP 206 Nameserver 227 NAT 225 Nebenl ufigkeit 256 beim Apache Webserver 275 Forking 257 Threads 266 Nenner Bruch 146 Net HTTP Klasse 241 Antwort 242 get Methode 242 Net HTTPOK Klasse 242 body Methode 242 code Methode 242 message Methode 242 Index 385 Netzwerk Routing 222 226 Schichtenmodell 220 Sockets 229 Netzwerkgrundlagen 219 new Konstruktoraufruf 114 nil 45 Nonblocking I O 234 not Operator 56 Notepad Editor 17 now Methode 138 nslookup 227 num_rows Methode Mysql 324 numerator Methode 146 Numerische Literale 36 0 Object Klasse Referenz 367 object_id Methode 212 ObjectSpace Modul 212 Objekt ID 212 Objektorientierte Programmierung OOP siehe Objektorientierung Objektorientierung Design Patterns 205 Geschichte 153 Grundbegriffe 111 HAS A Beziehung 165 Instanz Definition 164 Instanziierung 168 IS A Beziehung 165 Kapselung 154 Klasse Definition 164 Klassen 113 Klassenentwurf 163 Konstruktor 113 Konstruktor Definition 167 Mehrfachvererbung 207 Methoden 113 Methoden Definition 164 169 Module 205 Namensraum 206 Singleton 205 bersicht 111 UML Diagramme 164 Vererbung 113 198 Vergleich m imperativer Prog 154 Zug
510. ummer handelt ist eine Reihe von Verarbeitungsschritten n tig Zeile 140 Zun chst wird der passende Eintrag aus der Linkliste ausgelesen da Arrays ab 0 z hlen muss die eingegebene Zahl um 1 vermindert werden Zeile 141 Untersch tzen Sie das leere anweisungslose if nicht Eine URL die mit beginnt verweist auf eine Markierung innerhalb der aktuellen Seite ein grafischer Browser scrollt an die entsprechende Stelle wenn ein solcher Link angeklickt wird F r den vorliegenden zeilenorientierten Browser hat diese Linksorte dagegen keine Bedeutung so dass sie durch dieses if aus dem letzten else Teil URL relativ zum aktuellen Verzeichnis herausgehalten wer den muss Zeile 143 145 Bei einer absoluten URL muss nur das f hrende http entfernt werden Zeile 146 148 Eine URL die mit beginnt verweist auf die Wurzel des aktuel len Hosts Deshalb wird dieser wieder vor dem Pfad eingef gt Zeile 149 152 Alle anderen URLs werden als relativ zum aktuellen Verzeichnis betrachtet Deshalb wird der Bereich ab dem letzten Slash aus der vorherigen URL entfernt anschlie end wird die Link URL angef gt Wenn die aktuelle Web Clients mit Net HTTP 255 Seite etwa www site de info index html ist und der Verweis katalog html lautet wird daraus auf diese Weise die vollst ndige neue URL www site de info kata log html Alle Spezial URLs die dieser Browser gar nicht verarbeiten kann A etwa auf FTP Servern oder E Mai
511. unden kann er einen Link auf diese Adresse anzeigen damit Benutzer entsprechende Fehlermitteilungen versenden k nnen Zum Beispiel ServerAdmin webmaster test local ServerName Mit Hilfe von ServerName wird der Netzwerkname des Webservers angegeben Zum Beispiel ServerName www test local Beachten Sie dass diese Einstellung nur der Selbstidentifikation des Servers dient Da mit er tats chlich unter diesem Namen im Netzwerk erreichbar ist m ssen Sie einen entsprechenden Eintrag auf einem Nameserver vornehmen F r den Hausgebrauch gen gt es auch eine Zeile wie die folgende in die Datei etc hosts Windows lt Windows Verzeichnis gt System32 drivers etc hosts aller beteiligten Rechner zu schreiben 192 168 0 2 www test local Statt 192 168 0 2 m ssen Sie nat rlich die richtige IP Adresse Ihres Webserver Rechners angeben Wenn Sie Webserver und Browser auf demselben Rechner ausf h A ren ist der Server stets auch unter der speziellen IP Adresse 127 0 0 1 u die Loopback Adresse f r Selbstgespr che erreichbar meist ist ihr auch der besondere Hostname localhost zugeordnet Geben Sie also im Browser http 127 0 0 1 oder http localhost ein DocumentRoot Hier wird das Stammverzeichnis der Website angegeben Bei einer UNIX Stan dardinstallation sieht der Eintrag beispielsweise so aus DocumentRoot usr local apache2 htdocs Eine Client Anfrage mit der URL _ http www test local products info html w rde in dies
512. ung 7 3 Die Ausgabe des ersten einfachen Rails Beispiels im Browser Firefox Realistische Anwendung Eine Online Rock n Roll Datenbank Seinen vollst ndigen Nutzen beginnt Rails erst dann langsam zu entfalten wenn Sie neben der View und dem Controller auch ein Model erstellen Deshalb wird in die sem Abschnitt die erweiterte Rails Version des datenbankbasierten CGI Beispiels aus dem vorigen Kapitel erstellt eine Website die das Betrachten Hinzuf gen ndern und L schen verschiedener Rockbands und ihrer Alben erm glicht Das Grundger st erzeugen Der erste Schritt besteht wie beim ersten Beispiel wieder darin das Skelett Ihrer Anwendung zu erzeugen Wechseln Sie also erneut in Ihr Hauptverzeichnis f r Webanwendungen und geben Sie Folgendes ein gt rails rock_n_ roll Wieder wird die automatisch erzeugte Verzeichnisstruktur angezeigt Diesmal soll ten Sie sich diesen Baum n her ansehen Die komplette Struktur sieht folgenderma Ren aus Realistische Anwendung Eine Online Rock n Roll Datenbank 341 app controllers helpers models views layouts components config environments db doc lib tasks log public images javascripts stylesheets script performance process test fixtures functional integration mocks development test unit tmp cache sessions sockets vendor plugins Die wichtigsten Verzeichnisse haben folgende Bedeutung app enth lt die Komponenten der eigentlichen Anwendung unterteilt in
513. ung von Und und Oder bei der Verneinung wahl until wahl j wahl n print Moechten Sie noch mal j n wahl gets chomp downcase end Endlosschleifen Eine echte Endlosschleife ist eigentlich eine Situation die durch Programmierfeh ler entsteht und unerw nscht ist In Ruby k nnen Sie sie allerdings manchmal als Hilfsmittel verwenden wenn die Bedingung zu Beginn des ersten Schleifendurch laufs noch gar nicht gepr ft werden kann Innerhalb der Schleife k nnen Sie dann ein per if Fallentscheidung gepr ftes break verwenden um diese abzubrechen Die grundlegende Syntax der Endlosschleife sieht so aus loop do Anweisung en end Das folgende Beispiel gibt immer wieder neue W rfelw rfe aus bis der Benutzer die Frage nach einem weiteren Wurf verneint loop do wurf rand 6 1 puts Gewuerfelt wurf print Noch einmal wuerfeln j n wahl gets chomp downcase Schleife bei n verlassen break if wahl n end Ausf hrungsbeispiel Gewuerfelt 6 Noch einmal wuerfeln j n j Kontrollstrukturen 81 Gewuerfelt 3 Noch einmal wuerfeln j n n Diese Schleifenkonstruktion wurde brigens bereits f r das Einf hrungsbeispiel dieses Kapitels den Taschenrechner verwendet Es folgt ein weiteres Beispielprogramm Der Computer denkt sich per Zufallsge nerator eine Zahl zwischen 1 und 100 die der Benutzer erraten muss Nach jeder Eingabe erh lt er die Information ob di
514. unless auch einfach if schreiben k nnen Beachten Sie dabei aber dass Sie dann Und Verkn pfungen bei der Aufl sung gegebenenfalls durch Oder ersetzen m ssen und umgekehrt Beispielsweise lautet das Gegenteil von wahl 1 wahl also wahl 1 wahl 2 und ohne die Klammern wahl 1 amp amp wahl 2 Die urspr ngliche Oder Bedingung ist n mlich erst dann falsch wenn beide Einzel bedingungen falsch sind Das Ganze l sst sich formal so ausdr cken und wird als De Morgan Theorem bezeichnet a b la 88 b a 88 b la b Dabei k nnen a und b zwei Vergleiche oder sonstige Operationen sein die true oder false ergeben case when Fallentscheidungen Manchmal m ssen Sie eine Variable mit verschiedenen Einzelwerten vergleichen und je nach Ergebnis unterschiedliche Anweisungen ausf hren Das funktioniert prinzipiell mit if elsif else Strukturen aber speziell f r diese Aufgabe gibt es auch eine besondere Struktur Sie hat folgende Form case Variable when Wert1 Anweisung en when Wert2 Anweisung en else Kein Wert trifft zu Anweisung en end Je nachdem welchen Wert die Variable zurzeit besitzt werden die Anweisungen im entsprechenden when Teil ausgef hrt Jedes when kann einen oder optional mehrere durch Kommata getrennte Werte berpr fen 12 Nach Augustus De Morgan 1806 1871 einem schottischen Mathematiker 76 Kapitel 2 Sprachgrundlagen Der else Teil
515. us wirkungen aber eine Besonderheit von Ruby die es mit einigen UNIX Shells sowie mit Perl teilt besteht darin dass sich mit Hilfe der logischen Operatoren nicht nur Ausdr cke sondern auch Anweisungen verkn pfen lassen dabei sorgt das Short Circuit Verfahren f r die bedingte Ausf hrung Eine genaue Erkl rung und Bei spiele finden Sie weiter unten im Abschnitt ber Fallentscheidungen Bit Operationen Eine spezielle Gruppe von Operatoren bietet Zugriff auf die einzelnen Bits aus denen gespeicherte Werte zusammengesetzt sind Diese lassen sich auf verschie dene Arten verkn pfen oder verschieben Hier zun chst alle Bit Operatoren im berblick e bitweises Oder setzt alle Bits auf 1 die in mindestens einem der beiden Ope randen 1 sind Zum Beispiel gt 21 43 gt 63 Erl uterung Bin rform 010101 101011 111111 e amp bitweises Und setzt alle Bits auf 1 die in beiden Operanden 1 sind gt gt 21 amp 43 gt 1 56 Kapitel2 Sprachgrundlagen Erl uterung 010101 amp 101011 000001 e bitweises Exklusiv Oder setzt alle Bits auf 1 die in genau einem der beiden Operanden 1 sind gt gt 21 43 gt 62 Erl uterung 010101 101011 111110 e lt lt Linksverschiebung left shift verschiebt den ersten Operanden um so viele Bits nach links wie der zweite Operand angibt Die leeren Stellen werden mit Nullen aufgef llt Zum Beispiel gt gt 21 lt 2 gt 84
516. usage lt lt ENDUSAGE 3 Verwendung ruby argrechner rb h lt num1 gt lt op gt lt num2 gt 4 h Nur Hilfe ausgeben und beenden 5 lt num1 gt lt num2 gt Beliebige Fliesskommazahlen 6 lt op gt X 7 ENDUSAGE 8 Bei h nur Hilfe ausgeben und beenden 9 if ARGV 0 h 10 STDERR puts usage 11 exit 0 12 end 13 Fehler amp Abbruch wenn weniger als drei Argumente 14 if ARGV length lt 3 15 STDERR puts FEHLER Nicht genug Eingabewerte 16 STDERR puts usage 17 exit 1 18 end 19 Zahlen und Operand extrahieren 20 numi ARGV 0 to_f 21 num2 ARGV 2 to_f 22 op ARGV 1 23 Ungueltige Operatoren aussortieren 24 if op I R H X 25 STDERR puts FEHLER Ungueltiger Operator 26 STDERR puts usage 27 exit 1 28 end 29 Division durch O ausschliessen 30 if op amp amp num2 31 STDERR puts FEHLER Illegale Division durch 0 32 STDERR puts usage 33 exit 1 34 end Ein und Ausgabe 123 Beispiel 3 2 Taschenrechner mit Kommandozeilenargumenten argrechner rb Fortsetzung 35 Ergebnis je nach Operator berechnen 36 result case op 37 when 38 num1 num2 39 when 40 num1 num2 41 when x 42 num1 num2 43 when 44 num1 num2 45 end 46 Ausgabe 47 printf 2f s 2f 2f n numl op num2 result Speichern Sie das Skript unter dem Dateinamen argrechner rb und f hren Sie es aus Es erwartet die Parameter in der Rei
517. verschwindend geringen Anzahl von nur 100 Kandidaten f llt das jedoch nicht ins Gewicht isi while i lt 100 Annahme i ist eine Primzahl prim true j 2 Potenzielle Teiler bis i 2 testen while j lt i 2 i durch j teilbar ifi j Keine Primzahl prim false Pruefschleife j vorzeitig verlassen break end j 1 end Ausgabe falls Primzahl print i if prim i 1 end Wenn Sie das Skript eingeben speichern und ausf hren erhalten Sie folgende Liste 1235 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 80 Kapitel 2 Sprachgrundlagen Die einzige wirklich neue Anweisung in diesem Skript ist break Diese verl sst sofort die Schleife die gerade ausgef hrt wird und macht mit der ersten Zeile nach dem end weiter Bei verschachtelten Schleifen wie hier wird jeweils die innerste ver lassen Daneben sollten Sie sich das Konzept merken der Zustandsvariablen prim zuerst auf Verdacht den Wert true zuzuweisen Auf diese Weise ist ein schleifenbasier ter Test m glich bei dem sich nachtr glich das Gegenteil der Behauptung heraus stellen k nnte Das Ganze erinnert an mathematische Beweise durch Widerlegen des Gegenteils Genau wie if das Gegenst ck unless besitzt gibt es auch zu while eine Umkehrung until f hrt die Schleifenanweisungen aus bis die Bedingung zutrifft Damit l sst sich etwa das obige Eingabebeispiel logischer formulieren beachten Sie wieder die Vertausch
518. verzeichnisse oder etwas Ein undAusgabe 137 anderes handelt Dazu k nnen unter anderem folgende Klassenmethoden von File verwendet werden e File exists Pfad wurde bereits erw hnt Die Methode liefert true zur ck wenn der angegebene Pfad ein existierender Verzeichniseintrag ist und false falls er nicht existiert e File file Pfad hat dagegen nur dann das Ergebnis true wenn der unter suchte Pfad eine regul re Datei ist ansonsten erhalten Sie das Resultat false e File directory Pfad ergibt true wenn der Pfad ein Verzeichnis ist und false wenn er kein Verzeichnis ist Diese Testmethoden helfen im n chsten Kapitel bei einem ehrgeizigeren Projekt Dort sollen nicht nur die Inhalte eines Verzeichnisses ausgelesen werden sondern auch die Inhalte aller ineinander verschachtelten Unterverzeichnisse sollen einge r ckt dargestellt werden Datum und Uhrzeit Jeder Rechner enth lt heutzutage eine Uhr die durch eine Batterie auch im ausge schalteten Zustand am Laufen gehalten wird Daher ist der Umgang mit Datums und Zeitinformationen zu einer der wichtigsten F higkeiten von Computerpro grammen geworden Zu den bekanntesten Anwendungen geh ren die typischen Zeitstempel f r Dateizugriffe und nat rlich die allgegenw rtigen Terminkalender Anwendungen Alle modernen Programmiersprachen sind mit Funktionen ausgestattet um auf Systemdatum und uhrzeit zuzugreifen In Ruby funktioniert das Ganze mit Hilfe verschieden
519. vierung des Datenschutzes angeblich zum Kampf gegen den Terror l sst zudem bef rchten dass sich Konzern und Staatsmacht solche Informationen k nftig br derlich teilen 308 Kapitel 6 Klassische Webanwendungen Erfreulicherweise gibt es eine andere Methode um HTTP nachtr glich um eine Zustandsspeicherung zu erweitern den Einsatz so genannter Session Variablen Wenn Sie unbedingt m chten k nnen Sie so etwas auch manuell implementieren das Verfahren funktioniert im Prinzip immer gleich 1 Wenn ein Besucher die erste Seite Ihrer Site aufsucht egal welche muss eine Session ID generiert werden das hei t eine eindeutige Nummer die dieser spe ziellen Client Verbindung zugeordnet wird Eine solche Zahl k nnen Sie leicht selbst generieren aber noch einfacher und eleganter ist es einen Generator f r UUIDs Universally Unique IDentity numbers einzusetzen In Ruby geh rt ein solcher Generator zwar nicht zum Lieferumfang aber wenn Sie eine Internet verbindung haben k nnen Sie ihn mit Hilfe der folgenden Kommandozeilen anweisungen leicht installieren gt gem update gt gem install uuid Der Umgang mit dem Erweiterungsmanager rubygems wird weiter unten noch genauer erl utert Der Generator erzeugt eine UUID danach aus der weltweit einmaligen MAC Adresse einer Netzwerkkarte der Systemzeit und einem Zufallsfaktor Wann immer Sie eine solche ID ben tigen k nnen Sie die Bibliothek importieren und den Kons
520. w Methode 138 parse Methode 142 Referenz 369 sec Methode 139 strftime Methode 140 wday Methode 139 year Methode 139 times Iterator 104 to_a Methode 72 to_f Methode 70 to_i Methode 70 to_s Methode 70 traceroute 226 Transmission Control Protocol TCP 227 Client 232 Forking Server 258 Port 228 Server 232 Server Forking 263 TCPSocket 231 trap Methode 261 true als Literal 44 Typisierung 207 dynamische 47 Typumwandlung 70 U UDP siehe User Datagram Protocol Uhrzeit siehe Datum und Uhrzeit Umgebungsvariablen 288 CGI 289 PATH 9 PATHEXT Windows 35 RAILS_ENV 354 UML Unified Modeling Language 164 Unified Modeling Language siehe UML UNIX Apache installieren 277 Dateisystem 11 Konsolenbefehle 13 MySQL installieren 316 Prompt 11 Ruby installieren 7 Shebang 34 Shell 10 Terminalfenster 10 unless Fallentscheidung 75 unshift Methode 69 until Schleife 81 upcase Methode 66 update Active Record Methode 350 Uploads Webformular 303 upto Iterator 104 User Datagram Protocol UDP 228 User Agent HTTP Header 285 UUID 309 UUID Klasse 309 V Variablen 45 als Parameter 170 Arrays 48 Bezeichner 46 Datentypen 46 Definition 45 globale 47 G ltigkeitsbereich 47 Hashes 50 in Bl cken 102 Vererbung Konzept 198 private 201 protected 201 Index 391 public 201 super 199 Zugriffsschutz 201 Vererbung OOP Einf hrung 113 Vergleichsoperationen 52 Ver ffentlichung Rails 354 Verzeic
521. wandeln indem Sie ihre Methode to_i f r Ganzzahlen beziehungsweise to_f f r Flie kom mazahlen aufrufen Diese Methoden sind beraus fehlertolerant Beim ersten Zei 70 Kapitel 2 Sprachgrundlagen chen das nicht zum gew nschten Zahlentyp geh ren kann brechen sie ab und bei v llig ung ltigen Strings liefern sie einfach 0 Hier einige Beispiele gt gt 42 to i gt 42 gt gt 42 to_f gt 42 0 gt gt 3 Maenner im Schnee to_i gt 3 gt gt Die 3 von der Tankstelle to_f gt 0 0 gt gt 3 9 to_i gt 3 Bei to_i gibt es wiederum eine Besonderheit Diesmal k nnen Sie optional das urspr ngliche Zahlensystem angeben aus dem der String als Zahl interpretiert wer den soll der Standardwert ist wieder 10 Das f hrt nat rlich zu unterschiedlichen Werten f r denselben String gt gt 1000 to_i gt 1000 gt gt 1000 to_i 2 gt 8 gt gt 1000 to_i 8 gt 512 gt 1000 to_i 16 gt 4096 Wenn Sie beide Umwandlungsoperationen kombinieren haben Sie das n tige Handwerkszeug um Zahlen beliebiger Systeme innerhalb des zul ssigen Rahmens ineinander zu konvertieren Zum Beispiel die Kommentare k nnen Sie nat rlich weglassen gt gt 1000 to_i 8 to_s 16 Oktal nach Hexadezimal gt 200 gt gt ABC to_i 16 to_s 2 Hexadezimal nach Dual gt 101010111100 Interessant sind auch die Methoden mit denen Sie Strings und Arrays ineinander umw
522. want to install and uncheck the components you don t want to install Click Next to continue Select components to install Ruby Descipken SciTE FreeRIDE Enable RubyGems European Keyboard Space required 86 5MB Abbildung 1 1 Ruby Installation unter Windows Auswahl der Komponenten 6 Kapitel 1 Einf hrung 4 Choose Install Location w hlen Sie das Verzeichnis in dem Ruby installiert werden soll In der Regel d rfte der automatische Vorschlag C ruby in Ord nung sein Andernfalls k nnen Sie auf Browse klicken und einen anderen Ord ner w hlen 5 Choose Start Menu Folder hier k nnen Sie einstellen unter welchem Eintrag Ruby im Windows Startmen erscheinen soll Normalerweise ist Ruby lt Ver sionsnr gt wie vorgeschlagen in Ordnung es sei denn Sie haben Ihre eigene Ordnung im Startmen Damit sind alle Informationen vollst ndig Klicken Sie auf Install um die eigentliche Installation durchzuf hren oder auf Back um letzte Korrekturen durchzuf hren Nach der Installation sollten Sie pr fen ob Ruby funktioniert Begeben Sie sich dazu in die Eingabeaufforderung indem Sie der Anleitung im Abschnitt Zu Unrecht gef rchtet das Arbeiten mit der Konsole auf Seite 10 folgen Der Ruby Interpreter hei t unter Windows ruby exe wobei Sie die Endung exe wie bei Befehlen in der Eingabeaufforderung blich weglassen k nnen Mit der Option e k nnen Sie unmittelba
523. war noch genauer als lt gt weil zwischen den Klammern mindestens ein Zeichen erwartet wird w hrend lt gt einzelne Tags findet Einen etwas anderen Weg gehen die numerischen Quantifizierer die als Zahlen in geschweiften Klammern notiert werden Dabei gibt es drei M glichkeiten die sche matisch so aussehen e n bedeutet dass das vorstehende Element genau n mal vorkommen muss e m n steht f r ein Element das an der entsprechenden Stelle mindestens m und h chstens n mal auftreten darf e n schlie lich bedeutet dass das Element mindestens n mal im String stehen muss So ist 0 etwa eine andere Schreibweise f r w hrend 1 einem entspricht Die Varianten m n und n sind wieder einmal gierig auch sie lassen sich durch ein nachfolgendes Fragezeichen bescheidener machen Das folgende Beispiel findet eine ISBN als Teil des beliebigen Strings str if str 0 9 o 9 5 0 9 3 0 9X puts ISBN 1 gefunden end Da manche Websites zum Beispiel amazon de die stets an denselben Stellen vor kommenden Striche weglassen sollten Sie diese per Fragezeichen optional setzen To 9 o 9 5 o 9 3 0 9X Bereichsmarkierungen Alle bisher vorgestellten regul ren Ausdr cke passten stets auf ein beliebiges Teil st ck eines Strings Das ist prima um bestimmte Muster in einem Text zu suchen aber etwa f r die Sicherheits berpr fung einer Eingabe katastrophal U
524. weise ist die Teilnetzmaske subnet mask sie verwendet diesel ben vier Bl cke wie die Adressdarstellung selbst wobei Netzwerk Bits auf 1 und die Host Bits auf 0 gesetzt werden Hier als Beispiel die Teilnetzmasken f r die drei Standardklassen e Klasse A 255 0 0 0 e Klasse B 255 255 0 0 e Klasse C 255 255 255 0 168 10 17 4 ist beispielsweise eine Klasse B Adresse die zum Adressbereich 168 10 0 0 bis 168 10 255 255 geh rt 168 10 17 4 24 Teilnetzmaske 255 255 255 0 geh rt dagegen zu einer CIDR Teilmenge dieses Netzes in der 24 Bit das Netzwerk festlegen es beinhaltet also nur den Adressbereich 168 10 17 0 bis 168 10 17 255 4 Viele Hosts besitzen keine festen IP Adressen sondern dynamisch zugewiesene In lokalen Netzwerken werden sie beim Booten ber ein Protokoll namens DHCP Dynamic Host Configuration Protocol zugewiesen in Fernverbindungen etwa DSL bei der Einwahl Eine weitere Adress Sparma nahme besteht darin dass einige Adressbereiche f r private Netzwerke reserviert sind Die Daten dieser Adres sen werden nicht ins Internet geroutet so dass ein und derselbe Bereich in beliebig vielen Organisationen verwendet werden kann Im Einzelnen sind das folgende Adressen e das Klasse A Netz 10 0 0 0 8 e die sechzehn Klasse B Netze 172 16 0 0 16 bis 172 31 0 0 16 e die 256 Klasse C Netze 192 168 0 0 24 bis 192 168 255 0 24 Es gibt eine indirekte M glichkeit solche Privatnetze mit dem Inter A net zu verbinden e
525. weite Aufgabe besteht darin das Model zu erstellen Sie umfasst vier Einzel schritte e Erzeugen der Datenbanken und Tabellen e Eintragen der Datenbanknamen und zugriffsparameter in die Konfigurations datei config database yml e Automatisches Generieren der zugeh rigen Model Klassen e Anpassen der erzeugten Klassen durch Hinzuf gen der Tabellenrelationen Starten Sie f r den ersten Schritt den Konsolen Client mysql gt mysql u root p Passwort Eine Rails Anwendung ben tigt bis zu drei Datenbanken die standardm ig mit Anwendungsname_development Anwendungsname_test und Anwendungsname_pro duction bezeichnet werden Sie sind f r die Entwicklung die Unit Tests beziehungs weise die Produktion die tats chliche Ver ffentlichung der Site zust ndig Zu Beginn ben tigen Sie nur die Entwicklungs und gegebenenfalls die Testdatenbank Es schadet aber nichts gleich alle drei zu erstellen Da die neue Anwendung rock_ n_roll hei t k nnen Sie dazu die folgenden drei Zeilen eingeben mysql gt create database rock_n_roll_ development mysql gt create database rock_n_roll_test mysql gt create database rock_n_roll_production Als N chstes sollten Sie einen separaten MySQL User erstellen der Zugriff auf diese Datenbanken hat Benutzername und Passwort dieses Benutzerkontos m ssen Sie in die Konfiguration der Anwendung schreiben In der Praxis verwenden Sie aus Sicherheitsgr nden besser einen separaten User f r die Produ
526. wenn Sie mehrere Befehle in eine Zeile schreiben Das folgende Beispiel spei chert das Ergebnis einer Berechnung zwischen und gibt es dann aus gt ruby e ergebnis 21 2 puts ergebnis 42 Spielen Sie auch mit dieser Variante ein wenig herum um ein Gef hl daf r zu bekommen Wenn Sie die Option e nicht verwenden erf llt der Ruby Interpreter seine Stan dardaufgabe Er liest ein Ruby Skript aus einer Datei und f hrt es aus Dazu m ssen Sie den entsprechenden Dateinamen angeben Falls Sie sich gerade im Verzeichnis der betreffenden Datei befinden gen gt der reine Dateiname andernfalls k nnen Sie auch einen relativen oder absoluten Pfad angeben Das folgende Beispiel f hrt das Skript test rb aus falls es sich im aktuellen Verzeichnis befindet gt ruby test rb Ein konkretes Beispiel f r diese Herangehensweise finden Sie im n chsten Abschnitt Im brigen k nnen Sie das Programm ruby auch ohne einen Dateinamen aufrufen Dann haben Sie die M glichkeit beliebig viele Ruby Codezeilen einzugeben Abschlie en m ssen Sie die Eingabe mit EOF End of File dieses Sonderzei chen erzeugen Sie auf einem Windows Rechner mit Strg Z und unter UNIX mit Strg D Hier ein kurzes Beispiel gt ruby ergebnis 13 10 puts ergebnis Strg D Strg Z 23 16 Kapitel 1 Einf hrung Hello World hello Ruby das erste Ruby Programm Wie Sie wahrscheinlich schon einmal geh rt haben ist es Teil der ehrw rdigen Pr
527. wird einfach berschrieben Daher ist es in vielen F llen wichtig dass Sie vorher berpr fen ob die Datei schon existiert Zu diesem Zweck besitzt die Klasse File eine Klassen methode das ist eine Methode die ohne konkretes Objekt funktio niert namens exists die einen String daraufhin berpr ft ob er ein existierender Verzeichniseintrag Datei Unterverzeichnis oder hnli ches ist Ir Es ist brigens gef hrlich eine bereits vorhandene Datei zum Schrei V Das folgende Beispiel verl sst das Programm mit einer Fehlermel dung falls die Datei x txt bereits existiert und ffnet diese ansonsten zum Schreiben if File exists x txt STDERR puts FEHLER Ausgabedatei existiert bereits exit 1 end Wenn das Programm hier ankommt existiert x txt noch nicht daher zum Schreiben oeffnen file File new x txt w Der Modus a ist interessant wenn Sie regelm ig Daten zur sp teren Auswertung speichern m chten Serverdienste und andere Programme die ohne sichtbare Aus gabe im Hintergrund ausgef hrt werden f hren beispielsweise so genannte Log dateien auch Protokolldateien genannt in denen alle wichtigen oder auch nur alle fehlerhaften Operationen festgehalten werden Logdateien werden blicherweise bei jedem Start des entsprechenden Programms zum Anh ngen ge ffnet Wenn Sie eine noch nicht vorhandene Datei mit dem Modus a ffnen wird sie nn bequemerweise neu angelegt genau wie bei w Bei
528. y Show Edit Destroy Extreme USA Show Edit Destroy New band E suchen sca Abw rts Aufw rts L Hervorheben Gro Kleinschreibung Fertig Abbildung 7 5 Die ebenfalls vollautomatisch erzeugte Bandliste irb on Rails und ein Active Record Tutorial Im Verzeichnis script Ihrer Rails Anwendung finden Sie noch zwei weitere praktische Helfer scripts runner f hrt einzelne Ruby Anweisungen in der Rails Umgebung aus genau wie ruby e Anweisung auf der Konsole scripts console ruft dagegen irb simple prompt auf und stellt darin s mtliche Klassen der Ruby on Rails Anwendung zur Verf gung Sie sollten beides ausprobieren und nutzen indem Sie ein wenig Active Record Code zu Fu eingeben Dabei werden Sie gleichzeitig sehen wie einfach und Ruby gem der Zugriff auf die Datenstrukturen pl tzlich funktioniert vor allem vergli chen mit den relativ umst ndlichen direkten SQL Abfragen die Sie im vorigen Kapitel kennengelernt haben Probieren Sie zuerst scripts runner aus Das folgende Beispiel liest den Namen und das Land der ersten Band aus der Tabelle bands gt ruby script runner b1 Band find 1 puts b1 name b1 country Metallica USA Ja es ist wirklich so einfach Die Klasse Band wurde automatisch aus der Tabelle bands generiert Ihre Klassenmethode find sucht nach einer konkreten Instanz oder einem Datensatz mit der angegebenen ID die in der Datenbanktabel
529. zen wird ebendiese 1 eingesetzt Zum Beispiel gt gt puts Der Wert von a ist a Der Wert von a ist 1 Solange Sie allerdings statische Werte f r Ihre Variablen verwenden machen Sie Ihre Skripten zwar bersichtlicher aber noch nicht dynamisch Im obigen Beispiel k nnten Sie statt a genauso gut die 1 hinschreiben und w rden dasselbe Ergeb nis erhalten In der Praxis sind Variablen erst dann wirklich sinnvoll wenn sie bei jedem Durchlauf andere Werte annehmen k nnen Das geschieht beispielsweise durch e die Speicherung von Benutzereingaben in Variablen e mehrere Arbeitsdurchl ufe mit einer Variablen als Schleifenz hler e eine von einer Bedingung abh ngige Wertzuweisung Nat rlich k nnen Variablen nicht nur ganzzahlige Werte enthalten sondern belie bige Objekte Probieren Sie es in irb aus indem Sie Variablen verschiedene Arten von Werten zuweisen und anschlie end mittels variable class ihren Typ erfragen Hier zur Anregung einige Beispiele gt gt zahl 3 456 gt 3 456 gt gt zahl class gt Float gt gt text Hallo gt Hallo gt gt text class gt String gt gt jetzt Time new gt Thu Sep 14 21 37 52 0200 2006 gt gt jetzt class gt Time Sie k nnen Variablen statt Literalen auch beliebige Ausdr cke als Wert zuweisen Zum Beispiel gt gt ergebnis 2 7 gt 14 Da der Ausdruck zuerst berechnet und erst dann in der Variablen abgelegt wird kann er sogar die V
530. ziffer 97 d Regexp Ziffer 97 S Regexp Nicht Whitespace 97 s Regexp Whitespace 97 W Regexp Nichtwort Zeichen 97 w Regexp Wortzeichen 97 Z Regexp Endmarke 95 Operator 57 Regexp Anfangsmarke 94 Regexp Verneinung 89 Regexp Quantifizierer 94 Operator 56 Regexp Alternativen 96 Operator 55 0 Oktalzahlen Kennzeichen 39 Ob Dual Kennzeichen 40 0x Hexadezimal Kennzeichen 40 A Abgeleitete Klasse 113 abs Methode 64 Accept HTTP Header 284 accept Methode 233 Accept Encoding HTTP Header 285 Accept Language HTTP Header 284 Accept Ranges HTTP Header 286 Accessor Methoden 197 Action Controller 335 Action Mailer 336 Action Pack 335 Action View 335 Action Web Service 336 Active Record 335 create Methode 349 Datens tze ndern 350 Datens tze einf gen 349 Datens tze finden 348 find Methode 348 Grundlagen 348 update Methode 350 Active Support 336 ActiveRecord Base Klasse 346 Ajax 336 Alias Apache Webserver 283 alias Methode 186 Allow Apache Webserver 283 AllowOverride 282 and Operator 55 Anfrage HTTP 284 Anf hrungszeichen einzelne doppelte 42 Antwort HTTP 285 als Objekt 242 Anweisungen 32 Bestandteile 32 Apache Webserver 274 htaccess Dateien 282 lt Directory gt 282 lt Location gt 282 Alias 283 Allow 283 AllowOverride 282 CGI Konfiguration 287 Deny 283 DirectoryIndex 283 Direktiven 280 DocumentRoot 281 Eigenschaften 274 ErrorLog 291 In
531. zu entwerfen etwa PHP on Trax Allerdings sind die meisten der zugrunde liegenden Sprachen nicht ann hernd so elegant und zugleich m chtig wie Ruby so dass diese Pakete auch nicht an Rails heranreichen Zusammenfassung 355 ANHANG A Ruby Kurzreferenz Der echte Sch ler lernt aus dem Bekannten das Unbekannte entwickeln und n hert sich dem Meister Johann Wolfgang Goethe Syntax Anweisungen werden durch Zeilenumbruch oder innerhalb einer Zeile durch ge trennt Bezeichner beginnen mit Buchstabe oder Unterstrich _ danach weitere Buchstaben Ziffern oder Unterstriche Gro und Kleinschreibung werden unterschieden Kommentare von bis Zeilenende Shebang Erste Zeile gibt an wo sich Ruby befindet Z B usr bin ruby Unix C ruby bin ruby exe Windows Ausdr cke Ein Ausdruck ist eine beliebig komplexe Verkn pfung von Literalen Variablen und Methodenaufrufen durch Operationen Literale Literale sind alle w rtlich gemeinten Einzelwerte 357 Strings e In doppelten Anfuehrungszeichen werden Escape Sequenzen und eingebettete Ausdruecke ausgewertet In einfachen Anf hrungszeichen werden nur und umgewandelt e Q Wie doppelte Anf hrungszeichen e q Wie einfache Anf hrungszeichen e HIER Dokument lt lt ENDMARKE Mehrzeiliger Text ENDMARKE e Escape Sequenzen n Zeilenvorschub auch allgemeiner Zeilenumbruch r Wagenr cklauf t Tabulator onnn o

Download Pdf Manuals

image

Related Search

Related Contents

Fotografia publicitaria - Universidad Complutense de Madrid    連結タイプ 取付説明書ダウンロード  Untitled  TE 706/TE 706-AVR Martillo rompedor  Astra-J, v.16 (rev 2), fr-FR (Work nr: K931A_50)  ArtNet-LED-Dimmer 4 ArtNet-LED-Dimmer 4R  Oracle Hospitality Suite8 Export to Microsoft Outlook User Manual  Oster 133704 User's Manual  C48/24-1500 Converter User Manual  

Copyright © All rights reserved.
Failed to retrieve file