Mittwoch, 19. März 2008

Ruby People

Für den zweiten Teil meiner Präsentation habe ich mich auf die Suche nach einigen bekannten Köpfen in der Ruby Gemeinschaft gemacht. Dabei war ich doch etwas zu eifrig, so dass meine Folie bald überladen war und ich sie aus der Präsentation kippen musste. Stattdessen stelle ich das "Gruppenbild" hier auf den Blog:

Donnerstag, 28. Februar 2008

By reference oder doch by value?!

Bei der Vorbereitung einer Schulung für Ruby bin ich auf eine verwirrende Eigenschaft gestossen:

Objekte werden in Ruby immer by reference übergeben, da Variablen nichts anderes als Referenzen auf Objekte sind. Aber siehe da:

def inc(n)
   n = n + 1
end
i = 1
inc(i) # => 2
puts i # => 1


Sieht aber so aus als ob Ruby nicht per reference übergeben würde, sondern by value.
Doch ein Blick in Docu zeigt, dass die Methode '+' ein neues Objekt mit dem Wert 2 zurückgibt, auf das nun n zeigt. Während i immer noch auf das alte Objekt mit dem Wert 1 zeigt. Würde Ruby kein neues Objekt erzeugen, sondern den Methoden-Receiver tatsächlich ändern:

a = 1
b = 2
c = a + b


ja dann wäre nach dieser Operation nicht nur c = 3, sondern auch a = 3.

Das ist aber immer noch nicht die ganze Wahrheit. Auch im folgendem Beispiel scheint Ruby by value zu übergeben:

def swap x,y
   y, x = x, y
end

a = 1
b = 2
swap a, b
puts a       # => 1
puts b       # => 2


Auch hier zeigt x nach dem Aufruf zwar auf 2, aber a immer noch auf 1. Doch die eigentliche Frage ist, warum werden überhaupt zwei Referenzen gebildet?

Weil Ruby Referenzen by value übergibt!

Übrigens herrscht in der Java-Welt immer noch das Gerücht, dass primitive Types by value übergeben werden und Objekte by reference. Stattdessen verhält sich Java genau gleich.

Montag, 25. Februar 2008

Erster Blick auf Cassandra

Es wird Zeit Cassandra vorzustellen, ein Projekt, das im Januar 2008 seine erste Version 0.2 erreicht hat.
Cassandra ist der Versuch eine logische Programmiersprache zu gestalten, die in einer objekt-orientierten Umgebung anwendbar ist. Logische Programmiersprachen wie Prolog folgen der Prädikatenlogik, wodurch das Prädikat im Vordergrund steht:

human(socrates).
parents(child, father, mother).


In Cassandra soll nach wie vor, das Objekt im Vordergrund stehen, das Prädikat hat eine ähnliche Stellung wie Objektattribute:

socrates.human!
child.parents!(father, mother)


Cassandra besteht ebenfalls wie Prolog aus Fakten, die mit einem Ausrufezeichen gekennzeichnet werden, Regeln und Abfragen (Queries), die mit einem Fragezeichen gekennzeichnet werden:

socrates.human? # => true
:x.mortal!.if :x.human # => x = socrates


Cassandra wurde als DSL (Domain Specific Language) in Ruby implementiert. Symbole dienen hier als Variablen.

Cassandra kann bereits aus Regeln und Fakten logische Schlüsse ziehen, wie die oben erwähnten Beispiele zeigen. Der nächste Schritt besteht nun darin Datenstrukturen einzubinden und Vererbung zu ermöglichen.

Montag, 17. Dezember 2007

Roxanne bekommt Flügel

Kurz nach dem Release von Rails 2.0 kommt nun auch der neuste Release von Roxanne. In dieser neuen Version stand vorallem die Performance im Vordergrund:

Erstens wurde ActsAsTree durch ActsAsNestedSet ersetzt, genauer gesagt mit BetterNestedSet. Damit können nun ganze Content-Hierarchien mit einem Query geladen werden. Zum Vergleich, eine Seite mit etwa 250 editierbaren Elementen brauchte auf einem G4 1.42 GHz MiniMac im development Modus etwas über 9 sec (gähn!), im productive Modus etwa 3 sec. Jetzt braucht die gleiche Seite im development 6.5 sec, noch nicht gerade berauschend, aber im productive Modus nur noch 0.7 sec.

Zweitens setzt Roxanne nun auch Caching ein. Solange man auf der Site nicht eingeloggt ist, werden die Seiten direkt aus dem Cache geliefert. Das dauert dann gerade noch 0.0015 sec ;-) Und nicht zuletzt ist nun Roxanne auch Rails 2.0 ready.

Sonntag, 16. Dezember 2007

PHP weigert sich zu iterieren

Der Provider eines unserer Kunden hat sein PHP auf Version 5.2.3 upgedated und plötzlich erschien nur noch eine weisse Seite. Nach stundenlangem Suchen konnte die Fehlerquelle bei einem each ausfindig gemacht werden:
while (list($item, $data) = each($this->getValue($idTitle)))

Es fand schlicht keine Iteration mehr statt, der while blieb immer auf dem ersten Eintrag und erzeugte damit eine Endlosschlaufe. Sobald der Returnvalue des ersten Aufrufs in eine extra Variable gepackt wurde, funktionierte der each wieder:
$subs = $this->getValue($idTitle);
while (list($item, $data) = each($subs))

Ähnliche Probleme mit Returnvalues einer Instanzmethode sind schon bei früheren PHP Versionen immer wieder aufgetaucht. Es erstaunt doch etwas, dass man noch immer an solch tiefliegenden Mechanismen rumbastelt.

Mittwoch, 14. November 2007

Roxanne mit Safari 3

Zur Zeit laufen die Vorbereitungen für den Release 0.4 von Roxanne auf Hochtouren. Es darf mit einer massiven Performanceverbesserung gerechnet werden.
Bei dieser Gelegenheit habe ich mich nochmals durch den Admin-Bereich von Roxanne mit Safari 3, der mit Leopard mitgeliefert wird, durchnavigiert. Während sein Vorgänger noch etliche Probleme hatte, verhält sich die neue Version von Safari praktisch genau so gut wie Firefox 2. Aber abgesehen davon, ist der Safari einiges schneller.
Safari hat bei mir wieder gute Chancen zum Standard Browser für den Alltag zu werden, bei der Entwicklung bleibt Firefox, dank Firebug und Web Developer Tools, klar Favorit. Der Admin-Bereich von Roxanne läuft sowohl unter Firefox, wie jetzt auch unter Safari sauber. Bleibt nur noch der IE zu bändigen...

Sonntag, 4. November 2007

M42 im Intro von Leopard

Dieses Wochenende hab nun auch ich das neue Mac OS X bei mir installiert. Schon beim Willkommens-Intro von Leopard wurde ich überrascht. Im Hintergrund schön sichtbar M42, auch bekannt als "grosser Orionnebel". Danke Apple für diese kleine Hommage ;-)
Nach dieser ersten Aufmunterung ging's an die neuen Features: "Stack" und "Quick Look" sind wirklich sehr praktisch und haben mich sofort überzeugt. Ein "space-ähnliches" Tool hatte ich schon unter Tiger installiert, dies hat sich dann aber dank "Exposé" nicht durchgesetzt, mal sehen ob's diesmal klappt und "Timemachine" scheint mir etwas zu gefrässig zu sein, ich bleibe deshalb wohl noch bei meinen RSync-Skripten. Ansonsten scheint mir der Leopard noch nicht ganz so stabil, Mail, Finder und Firefox sind mir innerhalb von 2 Tagen mehrmals hängen geblieben oder abgestürzt. Im Gegensatz zu vielen enttäuschten Java Entwickler wurde ich mit sofort einsatzbereitem Ruby und Rails verwöhnt. Ein Blick auf die vorinstallierten "Gems" lässt sich sehen. Auch Roxanne läuft einwandfrei und ohne zusätzliche Upgrades oder Patches. Coole Sache!