Update: Man hat mal wieder das readline-Paket vergessen ^^ Also: Neue Version. Windows-User können sich freuen, denn seit Samstag (nach einem halben Jahr ohne Update) steht die finale Version des neuen One-Click-Installers (which you have to double-click afterwards™) zum Download bereit.
Nichts neues, aber dennoch mal interessant: Unicode-Zeichen in Ruby-Programmen.
Klingt traurig, nicht? Es ist wirklich wahr: Das Projekt YARV ist beendet!
Aus dem ChangeLog:
Mon Jan 01 00:00:00 2007 Koichi Sasada* Merge YARV
YARV ist tot, es lebe Ruby 1.9!
Du bist jetzt die elftwichtigste Programmiersprache der Welt. Keine andere Sprache hat im letzten Jahr so viel zugelegt.
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.)]
ruby -c
Is this Ruby? Yes!
Rails is for many in this world Fast Enough:
We got sites actually doing millions of dynamic
page views per day; amazing. Maybe you end
up being with the Yahoo or Amazon front page;
it's unlikely that an off-the-shelve framework
in ANY language will do you much good. You'
ll probably have to roll your own. But sure.
I'd like free CPU cycles too. I just happen
to care much more about free developer cycles
and am willing to trade the former for the
latter - What';s your opinion?
25 x warning: parenthesize argument(s) for future version
Syntax OK
Ich glaube, sowas geht echt nur in Ruby ^_^
Der Text ist von David Heinemeier Hansson, hab nur ein bisschen umformuliert.
Korrektur: PHP akzeptiert das natürlich auch. Weil kein <? drin vorkommt.
Ich bin ein großer Fan des Spruchs "Try that in Java!", mit dem ich andeuten will, dass Ruby viele Dinge sehr viel einfacher und dadurch erst denkbar (=möglich) macht. Dinge wie Rails, Markaby, selbst CodeRay.
Heute muss ich sagen: "Try that in Ruby!". Licenser, ein weiteres cYcnus-Mitglied, hat einen schönen Artikel über seine schlechten Erfahrungen mit GUI in Ruby geschrieben (auf Englisch.) Übrigends ist das Blog auch sonst einen Besuch wert! :)
Fazit: Es fehlt was in Ruby. Nämlich ein gutes, wirklich plattform-unabhängiges Framework. Wenn ich richtig gehört habe, haben Perl und Python ähnliche Probleme. Wer schöne GUIs entwerfen will, benutzt wohl lieber Delphi oder Java.
Lieber Weihnachtsmann! Ich wünsche mir ein ganz einfaches, schnelles, schönes, gut dokumentiertes freies GUI-Framework, das die GUI-Programmierung so einfach macht wie Rails die Web-Programmierung. Dankeschön!
a = 'AAAA' rand(26**a.size).times { a.succ! } puts a
Gerade im ICQ bez. des vorherigen Artikels:
Licenser (aka Heinz N. Gies, ein alter Schulfreund von mir) hat endlich ein Blog! Dort beschreibt er einen originellen One-Liner, mit dem man die Rails-Logs zu einer einfach Besucherstatistik auswerten kann:
cat log/production.log | grep "^Processing" | \\
awk '{print $4}' | sort -u | wc | awk '{print $1}'
Martin Fowler's Keynote auf der RailsConf dreht sich weniger über Rails (Actually, I haven't used Ruby on Rails.), sondern um Ruby, Programmieren in der Post-Moderne, Agile Softwareentwicklung, XP und all das Meta-Zeug, dass Programmierer zu den Philosophen unserer Zeit werden lässt.
Ich finde diesen Vortrag absolut genial. Besonders den Teil über die gemeinsame Philosophie hinter UNIX und Ruby; Fowler sagt unter anderem:
I mean, LISPers ans Smalltalkers look down their nose at how much syntax there is in Ruby. And yet, it kind of works. It gets out of the way, allows you to do nice things, and it allows you to deal with the complexities.
Fowler findet faszinierende Bilder, um den Vorteil dieser Schwäche zu verdeutlichen.
Jeder Ruby-Interessierte sollte sich den Vortrag in Ruhe anhören!
Syntax-Sonntag! Heute:
# Ich gehe bis zum Zeilenende. Eigentor.create :author => 'Petit' # ^_^ # Gibt eine zufällige natürliche Zahl zurück. def random_number 23 endRuby hat eine zweite, weniger bekannte Kommentar-Variante:
=begin = Mehrzeilige Kommentare * waren wohl ursprünglich für die Dokumentation vorgesehen * haben sich aber nicht durchgesetzt * man benutzt stattdessen RDoc-Kommentarblöcke mit vielen #. =end
Ziemlich unhandlich, wenn man einfach etwas auskommentieren möchte. Zudem kann man diese mehrzeiligen Kommentare nicht schachteln.
Häufig möchte man einen Ruby-Block ausklammern – ein if, ein def, eine Klasse. Wie macht man das am einfachsten?
Am letzten Donnerstag traf sich die Ruby-User-Group Berlin zum dritten Mal, wieder im newthinking store.
Leider waren wir diesmal nur zu fünft. Dafür gab es allerdings gleich zwei Vorträge:
Ab heute kann man CodeRay wieder testen:
Ihr könnt ein Stück Code eurer Wahl hineinkopieren (bis 20 KB), Titel und Autor angeben und die Sprache wählen (Ruby, C, HTML, RHTML, Nitro-XHTML, Delphi und Plaintext sind zur Zeit verfügbar.) Der Code wird dann als Ray gespeichert, bunt gefärbt und ist für alle sichtbar.
"Rays" ist also eine Art No-Paste-Wiki. Nichts neues - bis darauf, dass jeder die vorhandenen Posts editieren kann.
Für das Highlighting sorgt CodeRay 0.7.1. Es wird nichts gecacht!
Achso: Das Update ist ein Schritt auf dem Weg zu CodeRay 0.8! :)<7p>
Achso 2: Fehler, die die Website betreffen, bitte melden! (murphy rubychan de) Gerade Sicherheitslücken (XSS etc.) befürchte ich noch. Ich habe mir zwar Mühe gegeben, habe aber noch nicht allzuviel Erfahrung mit offenen interaktiven Websites.<7p>
Fehler bezüglich CodeRay könnt ihr natürlich auch melden, aber vielleicht wartet ihr lieber, bis mein Trac fertig ist. ;)
Es gibt auch einen offiziellen CodeRay-Banner, falls ihr CodeRay bereits einsetzt und Werbung machen wollt. Am besten verlinkt ihr den direkt mit coderay.rubychan.de, der neuen offiziellen Website.
F:\rails\onedaybb>rake stats (in F:/rails/onedaybb) +----------------------+-------+-------+---------+---------+-----+-------+ | Name | Lines | LOC | Classes | Methods | M/C | LOC/M | +----------------------+-------+-------+---------+---------+-----+-------+ | Helpers | 117 | 86 | 1 | 7 | 7 | 10 | | Controllers | 960 | 748 | 7 | 19 | 2 | 37 | | Components | 0 | 0 | 0 | 0 | 0 | 0 | | Functional tests | 109 | 79 | 12 | 18 | 1 | 2 | | Models | 539 | 454 | 34 | 28 | 0 | 14 | | Unit tests | 301 | 211 | 30 | 30 | 1 | 5 | | Libraries | 0 | 0 | 0 | 0 | 0 | 0 | | Integration tests | 0 | 0 | 0 | 0 | 0 | 0 | +----------------------+-------+-------+---------+---------+-----+-------+ | Total | 2026 | 1578 | 84 | 102 | 1 | 13 | +----------------------+-------+-------+---------+---------+-----+-------+ Code LOC: 1288 Test LOC: 290 Code to Test Ratio: 1:0.2 F:\rails\onedaybb>time Aktuelle Zeit: 5:56:20,53