Das war sie nun unsere zweite Iteration der Germany.rb am 20. und 21. August 2011. Es waren ca. 25 Leute da und es gab insgesamt 13 auf Video aufgezeichnete Vorträge. Hier eine kleine Zusammenfassung wie es ablief und wie es weitergehen könnte.
Vom 16 bis 19. Juli 2011 fand die 6. und letzte RubyKaigi in Tokyo statt. Dabei handelt es sich neben der RubyConf und EuRuKo um die wichtigste jährliche Ruby Konferenz.
Hier gibt es ein paar Notizen von den aus meiner Sicht interessantesten Vorträgen.
An sich ist ihm das ja komplett frei gestellt, aber ich dachte, es könnte doch interessant sein: Matz arbeitet neuerdings bei Heroku.
Irgendwann kommt die leidige Diskussion ja immer wieder auf. Ruby 1.9 oder 1.8? Wer Argumente gegen 1.8 für neue Projekte sucht, der wird ab heute ein neues bekommen: Die Gespräche über das End-Of-Life von Ruby 1.8 haben begonnen. Das altehrwürdige 1.8.6 wird eh kaum mehr gepflegt und 1.8.7 ist seit Jahren im Maintenance-Mode. Beide entwickeln sich nicht mehr fort, können allerdings auf eine breite Installationsbasis verweisen, was die Pflege durchaus noch sinnvoll macht. Gerade 1.8.7 wurde vor einigen Tagen mit einer neuen Version bedacht.
Wer die Diskussion gleich live verfolgen will, kann das im Redmine Issue 4996 tun. Momentan steht ein Ende der Maintenance im Juni 2012 im Raum, die Einstellung von sicherheitsrelevanten Fixes im Juni 2013. Aber das ist erstmal nur ein Vorschlag, es wäre nicht das erste Mal, dass sich in solch einer Situation ein Maintainer findet, der die Pflege unbedingt fortführen will.
Ich habe gerade folgendes Quine von Yusuke Endoh gefunden:
1 2 |
# ruby l=92.chr;eval s="s=s.dump[r=1..-2].gsub(/("+l*4+"){4,}(?!\")/){|t|'\"+l*%d+\"'%(t.size/2)};5.times{s=s.dump[r]};puts\"# python\\nprint(\\\"# perl\\\\nprint(\\\\\\\"# lua"+l*4+"nprint("+l*7+"\"(* ocaml *)"+l*8+"nprint_endline"+l*15+"\"-- haskell"+l*16+"nimport Data.List;import Data.Bits;import Data.Char;main=putStrLn("+l*31+"\"/* C */"+l*32+"n#include<stdio.h>"+l*32+"nint main(void){char*s[501]={"+l*31+"\"++intercalate"+l*31+"\","+l*31+"\"(c(tail(init(show("+l*31+"\"/* Java */"+l*32+"npublic class QuineRelay{public static void main(String[]a){String[]s={"+l*31+"\"++intercalate"+l*31+"\","+l*31+"\"(c("+l*31+"\"brainfuck"+l*64+"n++++++++[>++++<-]+++++++++>>++++++++++"+l*31+"\"++(concat(snd(mapAccumL h 2("+l*31+"\"110"+l*31+"\"++g(length s)++"+l*31+"\"22111211100111112021111102011112120012"+l*31+"\"++concatMap("+l*32+"c->let d=ord c in if d<11then"+l*31+"\"21002"+l*31+"\"else"+l*31+"\"111"+l*31+"\"++g d++"+l*31+"\"22102"+l*31+"\")s++"+l*31+"\"21002111010120211222211211101000120211021120221102111000110120211202"+l*31+"\"))))))++"+l*31+"\","+l*63+"\""+l*64+"n"+l*63+"\"};int i=0;for(;i<94;i++)System.out.print(s[i]);}}"+l*31+"\")))))++"+l*31+"\",0};int i=0;for(;s[i];i++)printf("+l*63+"\"%s"+l*63+"\",s[i]);puts("+l*63+"\""+l*63+"\");return 0;}"+l*31+"\");c s=map("+l*32+"s->"+l*31+"\""+l*63+"\""+l*31+"\"++s++"+l*31+"\""+l*63+"\""+l*31+"\")(unfoldr t s);t[]=Nothing;t s=Just(splitAt(if length s>w&&s!!w=='"+l*31+"\"'then 501else w)s);w=500;f 0=Nothing;f x=Just((if x`mod`2>0then '0'else '1'),x`div`2);g x= reverse (unfoldr f x);h p c=let d=ord c-48in(d,replicate(abs(p-d))(if d<p then '<'else '>')++"+l*31+"\"."+l*31+"\");s="+l*31+"\"# ruby"+l*32+"n"+l*31+"\"++"+l*31+"\"l=92.chr;eval s=\"+(z=l*31)+\"\\\"\"+s+z+\"\\\""+l*31+"\"++"+l*31+"\""+l*32+"n"+l*31+"\""+l*15+"\""+l*7+"\")"+l*4+"n\\\\\\\")\\\")\"########### (c) Yusuke Endoh, 2009 ###########\n" |
Das besondere an diesem Quine?
1 2 3 4 5 6 7 8 9 10 11 |
$ ruby QuineRelay.rb > QuineRelay.py $ python QuineRelay.py > QuineRelay.pl $ perl QuineRelay.pl > QuineRelay.lua $ lua QuineRelay.lua > QuineRelay.ml $ ocaml QuineRelay.ml > QuineRelay.hs $ runghc QuineRelay.hs > QuineRelay.c $ gcc -Wall -o QuineRelay QuineRelay.c && ./QuineRelay > QuineRelay.java $ javac QuineRelay.java && java QuineRelay > QuineRelay.bf $ beef QuineRelay.bf > QuineRelay.ws $ wspace QuineRelay.ws > QuineRelay.unl $ unlambda QuineRelay.unl > QuineRelay2.rb |
Und abschliessend:
$ diff QuineRelay.rb QuineRelay2.rb |
Ich bin verstört…
Wir haben wieder einen Termin gefunden! Am 20. und 21. August 2011 treffen wir uns zur zweiten Germany.rb in Leipzig im sublab. Wie immer gibt es keine Teilnahmegebühr und kein statisches Programm. Statt dessen gibt es Platz für Jeden um seine Ideen vorzutragen und sein Wissen zu teilen und zu erweitern.
Mehr Informationen gibt es auf der offiziellen Ruby Webseite.
Der Bericht mit allen Videos zur Germany.rb 2010 ist auch verfügbar.
James Edward Gray II. hat heute überrschend das Gateway zwischen der Ruby-Talk-Mailingliste und der Newsgroup comp.lang.ruby heruntergefahren, da ihm die Wartung ein zu großer Aufwand würde und er meint, dass die Ruby-Community zu groß für diese Verbindung geworden sei, sie habe sich ohnehin schon in einzelne Themenbereiche aufgespalten. Die ursprüngliche Funktion, die Ruby-Community zusammenzuhalten, als sie noch klein war, sei überholt und nicht mehr vonnöten.
Heute um 22:25 Uhr hat James verkündet, dass das Gateway geschlossen sei. Das bedeutet, dass die Usenet-Posts auf comp.lang.ruby nun nicht mehr auf der Mailingliste erscheinen werden, und umgekehrt auch Postings auf der Mailingliste die Newgroup nicht mehr erreichen.
Method chaining - also die implementierung einer Methode durch verketten mehrerer anderer ist durch Ruby on Rails zu einer gewissen Popularität gelangt. Während sich Rails hier auf ein einfaches Namenschema und alias verlässt, bietet DataMapper hier eine Technik an, die sich vorzüglich für einen Ausflug in Rubys Objektmodell eignet. Diese Gelegenheit will ich nicht an mir vorüber gehen lassen und die Implementierung namens Chainable hier vorstellen.
私たちに向かって、Oracleの敵対的な態度は、私たちは、Rubyプログラミング言語で開発を停止させる。これは、私が言うのは難しいが、もうRubyを使用しないでください。そのような組織をサポートしていません。Zugleich kündigte Oracle an, mit der demnächst erscheinenden Version 7 der Programmiersprache Java deren Lizenz so abzuändern, dass jegliche Software, die auf der Java Virtual Machine aufsetzt, nur noch als Closed-Source vertrieben werden darf. Dies veranlasste den führenden Kopf der JRuby-Implementation, Charles Oliver Nutter, zu einem hier nicht weiter zitierten, aber überaus unhöflichen Statement gegenüber Oracle. Alle Hoffnungen ruhen nun auf der letzten freien Ruby-Implementation Rubinius, deren Entwicklungsteam sich zwar gleichfalls geschockt zeigte, aber verlauten lies, man werde nun mit Hochdruck an der Fertigstellung von Rubinius 1.5 arbeiten, das vollständige Kompatibilität zum bisherigen MRI 1.9.2 besitzen solle.
Novell hat die Version 2.10 der alternativen .NET-Implementierung Mono veröffentlicht. Inwiefern ist das für Rubyisten relevant? Ab diesem Release enthalten die Installer für Linux und OS X einen Release von IronRuby und IronPython. Wer also bequem mal IronRuby ausprobieren möchte, kann nun den Installer installieren und einfach ir aufrufen:
[ skade Florian-Gilchers-MacBook-Pro ~ ] ir
IronRuby 1.1.2.0 on 2.10 (tarball Mon Feb 14 16:04:48 MST 2011)
Copyright (c) Microsoft Corporation. All rights reserved.
>>> RUBY_VERSION
=> "1.9.2"
>>> Für FOSS-Anhänger wie mich: IronRuby ist übrigens seit geraumer Zeit zusammen mit der DLR (Dynamic Language Runtime) unter Apache 2.0 veröffentlicht.
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.
Diesmal nur ein ganz kurzer. Über das Picky Lambda kann man gerne ewig lange diskutieren, aber mir ist gestern noch folgende, selten erwähnte Kleinigkeit aufgefallen: wenn man das picky lambda verwendet, können die Argumentklammern weggelassen werden.
1 2 |
f = -> a,b { puts a,b }
f[1,2] |
(Eigentlich will ich ja nur wissen, ob CodeRay damit zurecht kommt.)
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.
Beim rug-b Treffen in Berlin scheinen heute weitere Neuigkeiten über die nächste EuRuKo bekanntgegeben worden zu sein. U.a. ist die Veranstaltung auf den 28. und 29. Mai 2011 fixiert worden. Und der Veranstaltungsort wird das Kino International sein, nur knapp 600m von meinem Zweitwohnsitz in Berlin entfernt. Sehr cool!
hanna ist ein Template für das Ruby-Dokumentationstool RDoc. Es weist im Gegensatz zum Standard-Template Darkfish (welches ihr z.B. auf der RDoc-Website bewundern könnt) eine sehr angenehm lesbare HTML-Ausgabe auf und enthält zudem eine Suchfunktion für Methodennamen. Eine beispielhaft mit hanna generierte Dokumentation findet ihr etwa im Dokumentationsteil der Website meines Automations-Projekts und es leidet auch nicht an einigen Problemen wie Darkfish, welches zum Beispiel nicht mit mehrzeiligen Methodendefinitionszeilen (solche können mit der Direktive call-seq erzeugt werden) umgehen kann. In diesem Blogpost möchte ich mich damit befassen, wie man hanna dazu bringen kann, die Ruby-Quellen zu dokumentieren, sodass man nicht immer an Webseiten wie ruby-doc.org (welches oft nicht aktuell ist) oder rdoc.info (welchem hin und wieder einige Teile insbesondere der Stdlib fehlen) gebunden ist. Außerdem werden wir nicht umhin kommen, dasselbe auch für installierte Gems zu tun.