Wie schon letzes Jahr haben die Confreaks alle Vorträge auf der Mountain West Rubyconf 2008 aufgenommen, und stellen diese jetzt nach und nach online. Zu finden sind die Videos auf Confreak's MWRC2008-Seite. Die Videos kann man sich entweder gleich im Browser anschauen oder im mp4-Format downloaden.
Von den bisher online gestellten Videos haben mir besonders Giles Bowkett's Code Generation: The Safety Scissors Of Metaprogramming und Jim Weirich's Shaving with Occam gefallen, aber auch Evan Phoenix' Vortrag über das Rubiniusprojekt oder der Merb-Vortrag sind sehr gut.
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.
Rake ist ein unheimliches praktisches Tool, keine Frage. Aber es ist auch an die Rakefile gebunden - gibt es im aktuellen Verzeichnis keine, mag auch Rake nicht. Da schafft Sake Abhilfe - System-wide Rake. Einfach per gem install sake installieren, und man kann loslegen.
Sake verwendet eine globale Rakefile, und kann überall Tasks aus dieser ausführen. Eignet sich also herrlich zum Automatisieren von diversen Tasks die wir so erledigen müssen. Ich habe z.b. einen Sake-Task der mir alle Repositories im aktuellen Verzeichnis auf den aktuellsten Stand bringt - egal ob Subversion, Git, Mercurial, oder was da sonst noch so herumfleucht. Oder einen Task um ein Subversion-Repository in ein Git-Repository zu verwandeln.
Installieren von einem Sake-Task ist dabei denkbar einfach. Als Quelle geht jede Rakefile, oder auch Tasks die im Internet liegen. Wenn man z.b. den Repository-Update-Task installieren wollen, geben wir sake -i http://github.com/eventualbuddha/sake-git/tree/master/git.rake?raw=true ein - kurze Zeit später informiert uns Sake dass der Task installiert ist, und wir ihn per sake scm:update aufrufen können. Optional nimmt -i nach der Rakefile auch eine Liste mit Tasks entgegen, die installiert werden sollen. Sake beschränkt sich dann auf diese (plus deren Abhängigkeiten).
UPDATE: gitify ist jetzt Teil von sake-git, das auf GitHub zu finden ist.
cheatcheat ist ein Tool das uns Cheatsheets auf die Kommandozeile holt. Nach dem installieren (gem install cheat) können wir uns z.b. zu Git ein Cheatsheet anzeigen lassen: cheat git. cheat holt das Sheet von Err the Blog's Cheatsheet Wiki und zeigt es uns an. Dabei wird das Cheatsheet lokal gespeichert, damit es nicht jedes mal neu geladen werden muss. Wenn man den Parameter --new angibt, leert cheat seine Caches, wodurch wir sicherstellen können das wir immer die aktuellsten Cheatsheets zur Verfügung haben. Hilfe zu cheat selber bekommt man indem man cheat cheat eingibt.
ZenTest ist eine Suite aus 4 Tools und einer Library: zentest, unit_diff, autotest, multiruby und Test::Rails. Alle helfen dem geneigten Programmierer Code zu schreiben der komplett durch Unit-Tests abgedeckt ist.
ruby-prof ist ein Ruby-Profiler. Er ist nicht nur deutlich schneller als profile aus der Standardlibrary, sondern unterstützt u.a. auch rekursive Aufrufe, kann mehrere Threads gleichzeitig analysieren, und Call-Graph-Profile erzeugen.
'Ruby Tuesday' soll eine wöchentliche Serie über ein Ruby-Tool oder eine Ruby-Library werden, die vielleicht noch nicht so bekannt sind. Jeder Artikel soll den Sinn und Zweck des Tools oder der Library kurz erläutern, und eine Installationshilfe (sofern notwendig) und eine kurze Gebrauchsanleitung liefern.
Vorschläge für Tools oder Libraries werden natürlich gern entgegengenommen, entweder in den Kommentaren oder per eMail.
Wenn ihr selber einen Artikel beisteuern wollt, seit ihr natürlich herzlich eingeladen, dazu mir bitte einfach eine eMail schicken.
ruby-debug ist ein Ruby Debugger. In Zeiten von Unit Tests mag ein Debugger vielleicht schon wie ein Anachronismus wirken, aber manchmal helfen auch die besten Testfälle nichts, und man muss in die Eingeweide einer Applikation oder Library tauchen.
Quines sind bekanntermassen Programme die ihren eigenen Quelltext ausgeben.
Aber jetzt gibts was neues: Quines der 3. Ordnung. sigfpe hat ein kleines Haskell-Programm entwickelt:
q a b c=putStrLn $ b ++ [toEnum 10,'q','('] ++ show b ++ [','] ++ show c ++ [','] ++ show a ++ [')']
main=q "q a b c=putStrLn $ b ++ [toEnum 10,'q','('] ++ show b ++ [','] ++ show c ++ [','] ++ show a ++ [')']" "def q(a,b,c):print b+chr(10)+'q('+repr(b)+','+repr(c)+','+repr(a)+')'" "def e(x) return 34.chr+x+34.chr end;def q(a,b,c) print b+10.chr+'main=q '+e(b)+' '+e(c)+' '+e(a)+' '+10.chr end"Führt man dieses Programm aus, erhält man ein Python-Programm:
def q(a,b,c):print b+chr(10)+'q('+repr(b)+','+repr(c)+','+repr(a)+')'
q("def q(a,b,c):print b+chr(10)+'q('+repr(b)+','+repr(c)+','+repr(a)+')'","def e(x) return 34.chr+x+34.chr end;def q(a,b,c) print b+10.chr+'main=q '+e(b)+' '+e(c)+' '+e(a)+' '+10.chr end","q a b c=putStrLn $ b ++ [toEnum 10,'q','('] ++ show b ++ [','] ++ show c ++ [','] ++ show a ++ [')']")… welches wiederum ein Ruby-Programm produziert:
def e(x) return 34.chr+x+34.chr end;def q(a,b,c) print b+10.chr+'main=q '+e(b)+' '+e(c)+' '+e(a)+' '+10.chr end q("def e(x) return 34.chr+x+34.chr end;def q(a,b,c) print b+10.chr+'main=q '+e(b)+' '+e(c)+' '+e(a)+' '+10.chr end","q a b c=putStrLn $ b ++ [toEnum 10,'q','('] ++ show b ++ [','] ++ show c ++ [','] ++ show a ++ [')']","def q(a,b,c):print b+chr(10)+'q('+repr(b)+','+repr(c)+','+repr(a)+')'")
Und dieses Ruby-Programm produziert wieder das Haskell-Programm. Toll, oder?
(Anm.: Wil Shipley ist der Autor von Delicious Library, mit welcher man seine Sammlung aus Bücher, CDs, Filmen, etc. einfach verwalten kann. Im Moment arbeitet er an Delicious Library 2 - die erste Mac-Anwendung die bereits als Beta-Software einen Apple Design Award gewonnen hat. In seinem Blog Call me Fishmeal gibt er ganz gern Ratschläge für Programmierer. Einer davon ist Free Programming Tips are Worth Every Penny, der auch für nicht-Mac-Programmierer sehr interessant ist. Übersetzt mit freundlicher Erlaubnis von Wil.)
Manchmal meint jemand zu mir, “Hey, Wil, du programmierst doch seit die Dinosaurier die Erde beherrschten… hast du nicht ein paar Ratschläge für uns Jungspunde?”
Worauf ich immer antworte, “Hey, ihr Schlingel, RUNTER VON MEINEM RASEN!”
Nein, nein, normalerweise wende ich zögernd “Ach, ich weiss doch auch nicht so recht” ein, während ich schüchtern auf meine Füße starre.
Aber ich hab in letzter Zeit oft darüber nachgedacht, nachdem ich zuerst alleine so viel Code für Delicious Library geschrieben habe (zum ersten mal seit vielen Jahren), und dann einen neuen Programmierer eingestellt und versucht habe ihm mein Wissen zu vermitteln. Und dabei habe ich einen Stil entwickelt:
Distributed Version Control Systems (DVCS) haben im letzen Jahr einiges an Aufmerksamkeit bekommen. Glaubt man Linus Torvalds, dann sind Subversion-User Idioten und Git das einzige DVCS Wert verwendet zu werden. Grund genug sich das mal genauer anzuschauen - und wenn es nur geschieht um nicht zu den von Torvalds erwähnten Subversion-Idioten zu gehören.
Laurent Sansonetti ist der Herr der bei Apple für Ruby verantwortlich ist. Neben dem Ruby Interpreter kümmert er sich auch um so sachen wie RubyCocoa, einer Ruby-ObjectiveC-Bridge, mit der man native OS X Programme in Ruby schreiben kann.
Und jetzt hat er RubyInject veröffentlicht.
Rails hat Symbol#to_proc populär gemacht. So sehr dass es sogar Teil von Ruby 1.9 werden wird.
String#to_proc implementiert. Das sieht folgendermassen aus:
'x+1'.to_proc[2] # => 3 'x+2*y'.to_proc[2, 3] # => 8
Symbol#to_proc verwendet wird, braucht man String#to_proc nicht. Verglichen mit
%w[dsf fgdg fg].map(&:capitalize)
%w[dsf fgdg fg].map(&'.capitalize')
(1..5).map &'*2' # => [2, 4, 6, 8, 10]
(1..5).inject &'+' # => 15
(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.