Packt eure TAR Archive! Haut alles rein was Ihr finden könnt. Fleiß, Schweiß und all eure Gems. Die Reise nach Jerusalem geht weiter und das nächste Ziel lautet Gemcutter.
Yugui hat in einer Mail an die Core-Mailingliste mitgeteilt, dass die Release-Schedule von Ruby 1.9.2 abgesagt wird. Diese war bereits recht weit fortgeschritten: die dritte Preview für 1.9.2 war für den 25. September angekündigt, einhergehend mit einem Feature Freeze. Als Begründung führt sie den Entschluss des MRI-Entwicklerteams an, dass der 1.9.2-Interpreter vor dem Release die RubySpec erfüllen muss. Diese Entscheidung würde aber einiges an Arbeit nach sich ziehen und ist somit nicht innerhalb des Rahmens zu erfüllen.
Die Bedeutung dieses Ereignisses ist nicht zu unterschätzen: lange Zeit war die RubySpec eine Bemühung, das Verhalten des MRI so zu beschreiben, dass andere Implementierungen ihre Konformität zu ihm testen können. Nach dieser Entscheidung ist die RubySpec nun eine Testsuite, die Ruby interpreterunabhängig beschreibt. Zu diesem Zweck bringt sie sogar eine simple Implementierung einer Specsuite mit, die es leicht machen soll, einen unvollständigen Miniinterpreter zu erstellen, der dann zumindest die Testsuite ausführen kann - auch, wenn er bei weitem Ruby nicht komplett implementiert.
Heute Morgen ist die Version 2.3.4 von Rails erschienen. Das Interessante an diesem Release ist die Geschichte hinter dem XSS Vulnerability Patch. Brian Mastenbrook hatte vor einiger Zeit einen Fehler in Twitter und Basecamp entdeckt. Durch diesen konnte er JavaScript in beiden Seiten einschleusen und dadurch Cross Site Scripting durchführen. Bei der Meldung dieses Fehlers stieß Brian jedoch auf erhebliche Probleme bei der Kommunikation mit 37Signals, die Ihn zu der Empfehlung führten, dass man in Zukunft lieber keine Daten mehr bei 37Signals speichern sollte.
Phusion Passenger ist in der Version 2.2.5 erschienen und behebt mit dieser einige seit längerer Zeit bestehende Probleme.
Es gibt weiterhin berichte, dass Passenger bei der neusten (und auch bei älteren) Versionen Probleme mit Mac OS X 10.6 verursacht. Bisher ist den Entwickler aber noch nicht klar, was diese Fehler verursacht und wie sie diese beheben können. Wenn ich raten müsste, würde ich sagen, dass es etwas mit dem 64bit Support zu tun hat. Wie werden sehen.
Wusstet ihr eigentlich, dass Schneeleoparden nicht brüllen, sondern schnurren wie eine Hauskatze? Was man bei einem Zoobesuch nicht so alles lernt!
Aber egal. Snow Leopard ist draussen und stellt natürlich die wichtige Frage: welches Ruby ist eigentlich dabei? Mich freuts ja[1], einige wirds ärgern:
[ skade HIPE-Machine ~ ] ruby --version ruby 1.8.7 (2008-08-11 patchlevel 72) [universal-darwin10.0]
Mit nem Klick gibts auch noch die Liste der vorinstallierten Gems.
[1] Ja, ich bin der Meinung, dass die meisten Vorbehalte gegenüber 1.8.7 unbegründet sind.
Der von der Telekom gesponserte developer garden hat eine Bibliothek für Ruby veröffentlicht. Damit soll es u.a. möglich sein, SMS zu versenden:
1 2 3 4 5 6 7 8 9 10 11 12 |
# SMS-Client instanziieren sms_client = SmsService::SmsService.new("YourUserName@t-online.de", "YourPassword") # SMS versenden send_sms_response = sms_client.send_sms( "+49-162-1234567,+49-163-1234567", "Testnachricht", "SMSDemo", ServiceEnvironment.PRODUCTION) # Rueckgabeparameter abfragen error_code = send_sms_response.error_code error_message = send_sms_response.error_message |
Sprachverbindungen aufzubauen:
1 2 3 4 5 6 7 8 9 10 11 12 |
# VoiceCall instanziieren voice_call_service = VoiceCallService:: VoiceCallService.new( "YourUserName@t-online.de", "YourPassword") # Neuen Anruf aufbauen voice_call = voice_call_service.new_call( "089 1234567890", "089 9876543210", 20, 120, 1) # Rueckgabeparameter abfragen status = voice_call.error_code error_message = voice_call.error_message session_id = voice_call.session_id |
oder auch Serviceabfragen (wie z.B. für das Quota) zu initialisieren:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# Quota-Client instanziieren quota_client = QuotaService::QuotaService.new( "YourUserName@t-online.de", "YourPassword") #Quota abfragen quota_information = quota_client.get_quota_information("SmsProduction") # Rueckgabeparameter abfragen error_code = quota_information.error_code error_message = quota_information.error_message max_quota = quota_information.max_quota max_user_quota = quota_information.max_user_quota quota_level = quota_information.quota_level |
Hat hier jemand einen T-Online Account und kann das mal ausprobieren? Bin doch ein wenig daran interessiert, wie gut das funktioniert. Gerade für das SMS Gateway hätte ich einige Anwendungsfälle.
Frohes neues Jahr :)
Die erste neue Version von CodeRay seit zwei Jahren ist endlich fertig.
CodeRay ist eine Ruby-Bibliothek zum Syntax-Highlighting. Sie ist komplett in Ruby geschrieben und sehr schnell.

Neuigkeiten:
gem install coderay
Wann hast Du das letzte mal die Bibliothek benchmark aus der Ruby Standardbibliothek benutzt? Kannst Du Dich noch erinnern, wie die Methoden heißen, die man braucht, um einen Benchmarkbericht zu erzeugen?
Ich muss jedes mal neu in der API-Dokumentation nachschauen, weil die Bibliothek für mich nicht gerade intuitiv ist, so dass ich die Benutzung immer wieder vergesse. Aber dem kann man ja Abhilfe schaffen…
Wie ihr vielleicht gemerkt habt gab es letze Woche wieder keinen Artikel. Ich möchte mich dafür entschuldigen und werde bis auf weiteres nur alle zwei Wochen einen neuen Artikel schreiben, da sich das zeitlich bei mir sonst kaum ausgeht.
Ruby/Eventmachine implementiert ereignisgesteuerte Ein- und Ausgabe für Netzwerkprogrammierung in Ruby. Eventmachine zielt dabei vor allem auf hohe Skalierbarkeit, Stabilität und Performanz, aber auch darauf eine API bereitzustellen die möglichst einfach zu verwenden ist. Eventmachine selber steht in 3 Varianten zur Verfügung: Purem Ruby, das ohne weitere Abhängigkeiten läuft, Ruby mit einer C++-Extension und einer Version für JRuby, die in Java geschrieben ist.
Das folgende habe ich gerade im Ruby Trunk entdeckt:
JSON ist eine Alternative zu YAML, findet zunehmend Verbreitung und wird unter anderem von Rails benutzt, um Daten über die AJAX-Schnittstelle zu senden. Das Ruby-Core-Team hat sich jetzt entschieden, Ruby serienmäßig damit auszurüsten:
Mon Jun 4 21:15:45 2007 NARUSE, Yui <naruse@ruby-lang.org>
* lib/json.rb, lib/json, ext/json, test/json:
import JSON library.
require 'json' # To create a JSON text from a ruby data structure, you # can call JSON.generate (or JSON.unparse) like that: json = JSON.generate [1, 2, {"a"=>3.141}, false, true, nil, 4..10] # => [1,2,{"a":3.141},false,true,null,"4..10"] # It's also possible to call the #to_json method directly. json = [1, 2, {"a"=>3.141}, false, true, nil, 4..10].to_json # => [1,2,{"a":3.141},false,true,null,"4..10"]
$ irb19 -rjson irb(main):001:0> jj Array('1.8'..'2.4') [ "1.8", "1.9", "2.0", "2.1", "2.2", "2.3", "2.4" ] => nil
Die Bibliothek wurde in C von Florian Frank geschrieben und gestern in den trunk importiert (das heißt, in Ruby 1.9.) Zu Weihnachten gibt es also schnellen JSON-Import und -Export in Ruby.
Ganz ohne Aufsehen wurde vor einigen Tagen ein kleines Helferlein für die Ruby-Werkzeugkiste veröffentlicht: Unroller. Zweck dieser Ruby-Bibliothek ist menschenlesbare Traces der Programmausführung zu generieren – und das auch noch in bunt:
Unroller eignet sich besonders zum Analysieren von unbekannten Bibliotheken oder auch zur Fehlersuche. Installiert wird die Bibliothek einfach via gem1 (gem install unroller).
Es gibt zwei grundlegende Ansätze die Trace-Funktionalität zu nutzen: Entweder globales Tracing, unter Verwendung der Methoden Unroller.trace zum Einschalten und Unroller.trace_off zum Ausschalten der Trace-Ausgabe oder lokales Tracing, indem der Methode Unroller.trace ein Block mitgegeben wird und die Ausgabe nur für die darin aufgerufenen Methoden stattfindet. Die erste Möglichkeit ist insbesondere für längere Programmstücke geeignet, während sich letztere besonders gut zum Testen einzelner Methoden benutzen lässt, wie obiges Beispiel zeigt.
Für die Feinabstimmung der Ausgabe gibt es noch diverse Optionen, z. B. um bestimmte Klassen oder Methoden von der Ausgabe auszuschließen oder die Ausgabetiefe zu begrenzen. Weitere Infos dazu sind in der API-Doku nachzulesen.
1 Unter Windows muss außerdem win32console installiert sein.
Wie ich gerade erfahren habe, wurde gestern die Version 0.9.2 von JRuby veröffentlicht. Wer das Treiben im JRuby Trunk verfolgt wird nix besonderes finden, für alle anderen sei gesagt, dass OpenSSL und Readline jetzt kompatibel mit MRI sind. Weiterhin wurden eine Menge Fehler behoben. Ein paar Stellen wurden einem Redesign unterworfen. Es wurde am Compiler weitergebastelt und (wie sollte es auch anders sein) der Rails Support und die Geschwindigkeit wurde marginal verbessert.
Mich würde mal interessieren ob jemand JRuby praktisch verwendet. Ich hab auf Arbeit mal ein paar Tests mithilfe einer früheren JRuby Version für Javaapplikationen geschrieben. Was macht Ihr damit so?
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.)]