Sequel ist wohl die DB-Zugriffsschicht, mit der sich die wenigsten Rubyisten auskennen. Dabei ist sie meiner Meinung nach die beste reine Skripting-Bibliothek von allen dreien. Das äussert sich schon darin, dass Sequel mit keinerlei Core-Extensions wie ActiveSupport oder Extlib daher kommt. Einige werden zwar optional mitgeliefert, aber nicht standardmässig geladen.
Wie bereits erwähnt, beschäftigt sich Sequel nur mit SQL und das mit nur minimalen Abstraktionen - Sequel ist also kein ORM. Dafür kommt Sequel mit der größten Anzahl an Datenbank-Adaptern, momentan über 20. Implementierungen für verschiedene Connection-Pooling-Strategien und Sharding finden sich auch.
Plugins gibt es für viele interessante SQL-Funktionen, zum Beispiel für Windows (also, nicht das OS) oder Recursive Table Expressions.
Darüber hinaus kommt Sequel mit einem Kommandozeilentool, dass sich als Ersatz für den datenbankspezifischen Client verwenden lässt, allerdings im Grunde nur IRB mit vorgeladener Datenbank ist.
Auf einem der letzten germany.rb-Treffen kam zwischendurch eine Frage auf, die wohl doch viele beschäftigt: was unterscheidet eigentlich die drei großen Persistenzbibliotheken ActiveRecord, DataMapper und Sequel? Ein Thema, dass schon so manchen hat fragen lassen, aber selten ordentlich beantwortet wurde. Daher will ich in einer kleinen Serie von Posts alle drei im Detail vorstellen. Dieser Post wird als Auftakt dienen und eine grobe Unterscheidung versuchen.
Ganz frisch und noch nicht mal im Trunk zu finden, ist das neuste Kind der MiniTest Familie: minitest/benchmark. Diese Bibliothek stellt die Möglichkeit zur Verfügung, die Performance eines Codestückes zu testen. Dabei werden jedoch nicht die absoluten Zahlen als Maßstab genommen, sondern die Wachstumsrate eines Algorithmus. Das Ganze könnte z.B. so aussehen:
1 2 3 4 5 6 7 8 9 10 11 |
require 'minitest/benchmark' class TestAlgo < MiniTest::Unit::TestCase def bench_my_algorithm assert_performance_linear 0.9999 do |n| n.times do @obj.my_algorithm end end end end |
Dieser Test ist erfolgreich, solange @obj.my_algorithm linear wächst. Die folgenden Assertions stehen zur Auswahl:
Bei all diesen Assertions kann ein Schwellwert für die Abweichung angegeben werden. Individualisten können weiterhin assert_performance verwenden, dort kann die Wachstumsrate selbst definiert werden.
Das alles bald auch in der Standardbibliothek eures Vertrauens…
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.