(Dieser Artikel ist die deutsche Übersetzung von 13 Ways of Looking at a Ruby Symbol, welche mit freundlicher Erlaubnis des Autors erfolgt)
Neue Ruby-Programmierer fragen sich oft “Was, genau, ist eigentlich ein Symbol? Und wie unterscheidet es sich von einem String?” Keine einzelne Antwort arbeitet für jeden, deshalb – in Anlehnung an Wallace Stevens – hier 13 Wege um ein Ruby-Symbol zu betrachten.
Nippon, we have a problem.
RUBY_PATCHLEVEL.Ich möchte versuchen, Licht ins Dunkel zu bringen.
Folgende Änderungen unterscheiden Ruby 1.8.5-ps (2006-12-04) von Ruby 1.8.5 (2006-08-29):
ChangeLogMon Dec 4 10:22:26 2006 URABE Shyouhei* stable version 1.8.5-p2 relased. Sun Dec 3 17:11:12 2006 Shugo Maeda * lib/cgi.rb (CGI::QueryExtension::read_multipart): should quote boundary. JVN#84798830 Sun Nov 26 16:36:46 2006 URABE Shyouhei * version.h: addition of RUBY_PATCHLEVEL. * version.c: ditto. Sat Sep 23 21:34:15 2006 Yukihiro Matsumoto * lib/cgi.rb (CGI::QueryExtension::read_multipart): CGI content may be empty. a patch from Jamis Buck .
Jetzt sehen wir auch mal, wer die Lücke gefunden hat: Danke, Jamis!
lib/cgi.rb@@ -967,6 +967,7 @@ def read_multipart(boundary, content_length) params = Hash.new([]) boundary = "--" + boundary + quoted_boundary = Regexp.quote(boundary, "n") buf = "" bufsize = 10 * 1024 boundary_end="" @@ -998,7 +999,7 @@ end body.binmode if defined? body.binmode - until head and /#{boundary}(?:#{EOL}|--)/n.match(buf) + until head and /#{quoted_boundary}(?:#{EOL}|--)/n.match(buf) if (not head) and /#{EOL}#{EOL}/n.match(buf) buf = buf.sub(/\\\\A((?:.|\\\\n)*?#{EOL})#{EOL}/n) do @@ -1018,14 +1019,14 @@ else stdinput.read(content_length) end - if c.nil? + if c.nil? || c.empty? raise EOFError, "bad content body" end buf.concat(c) content_length -= c.size end - buf = buf.sub(/\\\\A((?:.|\\\\n)*?)(?:[\\\\r\\\\n]{1,2})?#{boundary}([\\\\r\\\\n]{1,2}|--)/n) do + buf = buf.sub(/\\\\A((?:.|\\\\n)*?)(?:[\\\\r\\\\n]{1,2})?#{quoted_boundary}([\\\\r\\\\n]{1,2}|--)/n) do body.print $1 if "--" == $2 content_length = -1
Hier stecken also die eigentlichen Fehler.
stdinput.read gab einen leeren String zurück anstatt nil, wenn das Ende des Inputs erreicht war.
Dadurch entstand eine Endlosschleife. Auslösen konnte man das einfach, indem man eine Multipart-Form an cgi.rb schickt,
die nicht mit dem erwarteten Zeichen endet.boundary wurde nicht maskiert. Wenn man boundary auf (?!) oder so etwas setzt, wird es nie gefunden.
Oder man fügt einer dieser "Milliarden Jahre Rechenzeit"-Regexps ein.Ich weiß leider nicht, wer die zweite Lücke gefunden hat.
Bleibt noch das neue Patchlevel:
version.c und version.h
const int ruby_patchlevel = RUBY_PATCHLEVEL;
...
rb_define_global_const("RUBY_PATCHLEVEL", INT2FIX(RUBY_PATCHLEVEL));
...
#define RUBY_PATCHLEVEL 2
...
RUBY_EXTERN const int ruby_patchlevel;
Die Diskussion um die Einführung des Patchlevels und eines neuen CVS-Branches (er schient jetzt ruby_1_8_5 zu heißen) findet ihr im Archiv.
Baut folgende Prüfung ein, wenn eure Skripte cgi.rb benutzen (soweit ich weiß, tun das unter anderem alle Rails-Applikationen; laut Jeremy Kemper ist Rails aber nicht betroffen, wenn man im production-Mode unter FastCGI arbeitet.)
if not defined? RUBY_PATCHLEVEL or (RUBY_VERSION <= '1.8.5' and RUBY_PATCHLEVEL < 2) raise SecurityError, 'Please use Ruby 1.8.5-p2 or later!' end
Based on how the cgi.rb file is coded it's most likely that there will be more of these kinds of defects in the future.(Zed A .Shaw, der Mongrel-Typ) [Edit: Prüfungscode für Ruby 1.9 angepasst (Patchlevel natürlich nur für bereits veröffentlichte Versionen.)]
Nachdem ich die letzten Jahre einen Bogen um den Verlag von Tim O’Reilly gemacht habe (das letzte O’Reilly Buch, welches ich in meinem Bücherregal fand, war Linux in a Nutshell – Preis 69 DM), habe ich nun meine Sammlung um das Ruby Cookbook erweitert und damit halte ich nun wieder ein O’Reilly Buch in den Händen.
Über einen bevorstehenden Guerilla Angriff auf den Ruby Wikipedia Artikel berichtete ich bereits. Nun möchte ich nach drei monatiger Arbeit allen Leuten Danke sagen die mitgeholfen haben das neue Grundgerüst des Artikels zu erstellen und Ruby damit in der Wikipedia ein besseres Gesicht zu verpassen. Es gibt immer noch eine Menge zu tun aber die Ausgangsbasis ist nun um einiges besser.
Infos:
Unsere neue Version ist nun der offizielle Artikel.
Die alte Version ist jedoch immer noch über die History erreichbar.
Der eine oder andere von Euch wird sicherlich die Online Enzyklopädie Wikipedia kennen. Sie zeichnet sich dadurch aus, dass es zu jedem Thema (ich meine wirklich jedes Thema) einen Artikel gibt. Natürlich gibt es auch einen für Ruby. Bei diesem handelt es sich leider nicht um eine Glanzleistung der Wikipedia. Es werden stupide Merkmale aufgezählt und in einem ewig langen Listing wird die Syntax von Ruby gezeigt. Dies ist mir persönlich ein Dorn im Auge. Aufgrund dessen habe ich angefangen, parallel in der Wikipedia meinen eigenen Ruby Artikel zu schreiben. Er steckt im Moment noch in den Kinderschuhen und es bedarf noch einiger Arbeit um daraus einen würdiger Wikipedia-Eintrag für Ruby zu gestalten. Aufgrund dessen will ich hiermit jeden Interessierten einladen, einen Blick auf den Artikel zu werfen und mutig Änderungen durchzuführen.
Weblink: Beta Ruby Artikel
PS.: Hier können wir ruhig einmal einen neidischen Blick zu unseren netten Nachbarn werfen.
Wie ich hier kurz erwähnte, will ich mich heute ins Ruby-Ghetto wagen. Es geht darum C in Ruby einzubinden.
Ich würde Euch gerne sagen, dass Ruby der Ursprung war. Dass es nix davor gab und dass es nix danach geben wird. Aber leider ist dies weit von der Wahrheit entfernt. Denn so wie jede Ballkönigin eine kleine dicke Freundin hat, so hat auch Ruby ein kleines hässliches Anhängsel. Es ist wirklich so klein und hässlich, dass man schon bei der Namenssuche nach dem ersten Buchstaben verzweifelte, aufgab und es heute nur noch 'C' nennt. Man weiß nicht genau wozu dieses 'C' da sein soll. Einige behaupten es wäre eine Programmiersprache - aber eine Programmiersprache sollte unser Leben einfacher gestalten. Andere behaupten es wäre die erste Waffe im Informationskrieg gewesen um die Russen zu verwirren - dies wiederum würde einiges erklären.
Murphy hat Euch in den letzten Wochen einen tiefen Einblick in die syntaktischen Finessen von Ruby geliefert. Ihr habt normale Strings und Fancy Strings kennengelernt. Es stellte sich heraus, dass Here Docs ebenfalls nur Strings mit einer zusätzlichen Dimension sind. Die funktionale Programmierung mit Symbol#to_proc macht Euch das Leben um einiges leichter. Und Fehlerbehandlung mit rescue ist nun zu einem selbstverständlichen Codefragment geworden, welches jeden unsicheren Code schmückt. Parallel hierzu möchten wir euch nun auf einer neuen Ebene einen Einblick in unseren Rubin verschaffen. Hierzu fahren wir die Schmelzanlage auf knapp 2050°C hoch und schauen uns an, was sich im inneren des Edelsteins befindet.
Was gibt es Neues in Rails 1.1?
Die Bergarbeiter in der Ruby-Mine haben einen ganzen Wagen voller Hinweise ans Licht gebracht - auf Deutsch, diesmal.
Wer also nicht genug Englisch kann, um die Originalartikel zu lesen, oder unsere Ergänzungen lesen möchte, findet auf
die Ergebnisse tagelangen Grabens.
Viel Spaß :)
Kevin Clark hat in seinem Blog den Artikel “Rails for Designer” veröffentlicht. Der Beitrag ist in englischer Sprache verfasst, trotzdem aber gut verständlich. Er richtet sich in erster Linie an Webdesigner die mit Rails in Kontakt kommen.
Vom Aufbau (MVC) über die Templates und RHTML bis hin zu Tags und Partials, zeigt er anhand von Beispielen, welche Möglichkeiten der Designer hat und was er beachten muss.
Dies sollte den Einsteig für jeden Rails-Neuling auf jeden Fall erleichtern.