I’ve been to two Ruby and Ruby on Rails focused events in the past week, first to the RailsCamp Hamburg 2011, then to the monthly meeting of the RUG::B (the Ruby User Group Berlin), and while I didn’t expect ChiliProject to be as well known as some other big or popular projects, I was somewhat astonished and maybe even a little disappointed to see how little even its name was known. It seems to me that public knowledge and being on people’s mind is something that we need to work on more than any technical or feature-wise improvements (don’t get me wrong: those are important too, but pretty useless if no one uses them…).
It really hit me last saturday at the RailsCamp when the schedule for the day was being discussed. When it was my turn to propose my talk (I had naturally prepared a short one about ChiliProject and why we had forked Redmine), I first asked how many people had heard of ChiliProject, then how many didn’t know Redmine. I estimate there were some 100-130 people present, and the answer to both questions was less than ten. Now I didn’t expect more than half the people present to know about ChiliProject, but less than 10% is a really small mindshare.
The interest wasn’t overwhelming either, but I credit that to my somewhat clumsy introduction to the matter and the very strong lineup otherwise than to sheer disinterest, so the talk turned into a discussion with people already using Redmine that have gone a little worried about the project and who were glad to hear about someone “picking up the slack”, even if it was in the form of a fork.
Then came the RUG::B. I had planned on going anyway and decided to try to spread the word about ChiliProject there. I reworked the presentation to be more focused on the technical and community reasons behind the fork (the slides aren’t available online as some slides might be misinterpreted without the presentation, the gist of the presentation’s arguments can be found in this “ChiliProject – Spread the word” thread in the ChiliProject forums) and presented it to the 30-odd people present. The preliminary question got roughly the same answer as on the RailsCamp, the interest and response were great though, including specific questions regarding the intended “community management” style and praise and admiration for having the guts to fork instead of just “giving up”.
All in all, I think those two visits showed me that we still have a lot of work to do in the mindshare area. The visibility of ChiliProject will rise when the new design (current design proposal here, not final yet) is released and deployed on some high-profile installations, but this probably won’t be enough. In addition to that, I plan on going to some european conferences during the next year (wroc_love.rb, Railsberry and the EuRuKo) and hold presentations or at least lightning talks about ChiliProject. Interesting times! :–)
]]>git-http-backend
, den hatte ich
allerdings “vergessen” weil er als ich auf einem anderen Server einen git
smart-http installiert habe nicht in Frage gekommen war, grack schon.
Kahlil Lechelt hat vor ein paar Monaten in seinem Post UberGit schon gezeigt, wie man Uberspace als privaten git Server über ssh benutzen kann. Diese Methode hat allerdings den Nachteil, dass man Anderen keinen Zugriff auf seine Repositories oder mehreren Leuten Schreibzugriff auf ein gemeinsam-genutztes Repository geben kann. Das Uberspace Wiki beschreibt weiterhin, wie man gitolite installieren kann und damit über ssh mehreren Nutzern Lese- und/oder Schreibzugriff auf Repositories geben kann, bzw. wie man ein Repository über http veröffentlichen kann, hier ist der Schreibzugriff allerdings ausgeschlossen.
Nun, wem unwohl ist anderen Benutzern Zugriff auf sein ssh zu geben, die ssh-Konfiguration für die Endanwender zu kompliziert ist und über http auch schreiben können möchte, dem verschafft grack Abhilfe. grack ist ein in Ruby geschriebener Wrapper um git selbst, der einen git-smart-http-Server über den man Repositories lesen und schreiben kann bereitstellt.
Folgendes Kommando installiert grack im eigenen Uberspace:
1
|
|
Dieses Kommando führt das unten aufgeführte Skript aus, was:
.grack
in deinem Home-Verzeichnis runterlädt,.grack
den Ordner repositories
erstellt, von wo grack später Repositories
auslesen wird,Die durch das Skript erstellte Konfiguration erlaubt Lese- aber keinen Schreibzugriff,
um Letzteren zu erlauben muss in der erstellten ~/fcgi-bin/git.fcgi
der Parameter
:receive_pack => false,
zu :receive_pack => true,
geändert werden. Das
fcgi-Skript kann man auch nach Belieben in einen anderen Host als den default Host
installieren, dafür verweise ich aber auf den FastCGI Artikel im Uberspace
Wiki (dort ist übrigens auch beschrieben wie man ein FastCGI Skript neustarten
kann, was nötig ist nachdem man die Konfiguration geändert hat).
Repositories sollten für grack im bare Format vorliegen. Ein neues Repository
legt man mit git init --bare ~/.grack/repositories/repo_name
an, ein existierendes Repository kann man mit
git clone --bare http://example.com/repo_name ~/.grack/repositories/repo_name
clonen. Die Adresse zu einen so erstellten Repository lautet für mich dann
http://thegcat.virgo.uberspace.de/fcgi-bin/git.fcgi/repo_name
, den Account
bzw. Uberhost Namen muss dann jeder für sich anpassen (das Skript gibt die
“Oberadresse” für alle Repositories auch noch mal aus :–) ).
Eine letzte aber wichtige Anmerkung: grack bietet keine Möglichkeit den Zugriff
auf alle oder einzelne Repositories zu verbieten bzw. nur bestimmten Benutzern
zu erlauben, man kann lediglich über die Parameter :upload_pack
bzw.
:receive_pack
Lese- bzw. Schreib-Operationen für alle Repositories zulassen.
Eine feinere Zugangskontrolle muss noch “vor” grack im Uberhost Apache passieren,
dazu aber später von den Ubernauten oder mir noch was.
(Verbesserungsvorschläge gerne auf GitHub :–) )
]]>Disclaimer: I’m no expert on OOP (apart from the basic class at the university that teaches that “putting code in classes” is good) nor Rails (I learnt ruby and Rails by myself roughly 2 years ago while tinkering with Redmine (hint: not the nicest code in the Rails world)), so don’t take my opinion for granted, I just hope to fuel the discussion a little.
Flashback to pre-Draper times: everyone has a feeling of sorts that the Rails
helpers are probably a bad idea, but they still become the dumping place for
any formatting methods and other stuff you don’t know where else to put. Formatting
methods landed there because having them in your ActiveRecord models made the
models look bloated which made you feel even worse than putting them in the helpers
and/or because what you wanted the method do do wouldn’t work in the model
because models miss the ActionView helpers (link_to
et al.). Over time, the helpers
would get bloated, you’d have to add them to an increasing number of views,
maybe even include them in the controllers because you’d put some controller
logic in there or needed view logic in the controller (I’m looking at you,
#to_xml
, but that’s a different matter). In the end, everyone would feel bad about
the helpers becoming so big and jumbled together, but it still was better than having all this
stuff in your models or controllers (or views!) and more convenient because you
could even add all helpers to all view and be done with it (provided you didn’t
have any methods with the same names in different helpers).
Enter Draper. It has a nice sounding name, claims to solve an itch Rails developers have, and uses a catchy sounding OOP pattern everyone has heard about some time or another as selling point. Problem solved, right? I thought so too at first (beware of the buzzwords!), but Andreas (@mediafinger) and Uygar’s (@uygar_gg) presentation at the RailsCamp Hamburg made me realize that the lurking unease I had about Draper is justified after all. Draper just wraps your helpers in objects (something you could have easily done before but rightfully didn’t) thus solving the cross-helper method name collision problem, at the cost of just a little less hassle than doing it yourself would have been while masking the pain you’d have had making decorators yourself.
Let’s have a look at an example, first without Draper:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
Not really pretty because you have some function twitter_link_for_user
that
looks like it should rather belong to the User
class (the for_user part of
the method name should be enough of a hint) rather than lurch in the helper,
and you have included the helper in the controller, for example to include the
twitter link in some #to_xml
call. If I’m not completely mistaken, Rails helpers
are view helpers, including them in your controllers puts view logic in them,
which kinda renders the whole MVC pattern moot and should be considered a code smell.
Now the same example with Draper:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
You can now get the twitter link for the user by calling @user.twitter_link
and you were able to stop including the helper in the controller, you can even
drop the helper
call in the controller if your helper becomes empty. You feel
all fuzzy inside and are comfortable with your code again. The helper is empty
and everything is neatly organized in objects, so it’s all OOP and must thus be
good, right? I don’t think so.
Let me rephrase the above without using Draper (I’m aware Draper does a little bit more than that, but bear with me):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
How does it look without the nice syntax Draper brings? There’s an explicit
call to ActionView::Helpers
in something directly called by the controller.
It doesn’t feel so warm and fuzzy after all, does it? Here’s the slide from the
aforementioned presentation which made me realize that you’re effectively
squeezing view code between your model and controller:
Now if you applied the decorator to your object only “after” the controller, I wouldn’t mind (provided said decorator contains view logic only). Sadly, that’s not the case in the code examples provided by Draper.
The approach presented above has more pitfalls still, and one that isn’t apparent from the code above is that you’re working on “fully” decorated objects in the controller. Apart from bringing view logic into your controller, this also is problematic with another feature of Draper which allows to white- or blacklist functions of the decorated object. Great feature, you decide to blacklist write operations to your object, including save, but that means for “write” actions (create and update) you can’t use the decorated object in your controller logic. No big deal, you just use the plain object and decorate only if the operation fails and you have to present the user with the form for the object (this would be the right way to apply view decorators, by the way). Now for whatever reason, for example for access control, you stick a method into your decorator (it’s only of interest to instances of that particular class but isn’t business logic, so you don’t put it in the helper nor in the object but into the decorator) and now need the decorated object before you call save on it. You now have to juggle a decorated and an undecorated instance of the object at the same time. Bummer.
Let’s recap what bothers us with the Rails helpers and what Draper can do for us. Does it avoid cross-helper method name collisions? Sure. Is it “more OOP”? You’re explicitly calling your helper methods on an object rather than including a misnamed hodgepodge of methods to be able to call them in views, so let’s say yes here too. Does it take this jumbled together mess out of the helpers? It does, and sticks this same mess but with better names into an object. I don’t consider a namespaced mess better than a non-namespaced one, so this is a draw. Does it keep view logic out of your controllers? Nope, I’d even say it makes things worse. Does it keep view logic out of your models? Yeah, but so do helpers. Does Draper give us more than a buzzword we can add to the list of “OOP things” our code does? I don’t think so, and you probably shouldn’t either.
How can the Rails helper situation be improved? I’m not sure I have a good answer
to that, but if you think your helpers are too bloated, try splitting them
into smaller topical modules. If you think your helper methods should really
be methods on your business objects but don’t want to litter your model definitions
with view logic or include the ActionView helpers in them (and you shouldn’t!),
then by all means use decorators, but don’t use them as yet another dumping ground!
Feel free to use more than one decorator on business object instances, for example
a TwitterUser
, a GooglePlusUser
and a XingUser
(yeah, decorators don’t need
to be called SomeDecorator
). Sure, this results in a call akin to
TwitterUser.new(GooglePlusUser.new(XingUser.new(@user)))
, but at least it is
very clear what each decorator does and it makes it easier to swap one for another
or refactor any of them. Make also sure to know which decorator belongs to which
MVC step, you can use decorated objects in your controller logic, but decorate
your objects with view logic only at the end of or after your controller logic!
Sure, that’s not as easy just dumping everything into the helpers or into Draper
decorators (I know you can apply multiple Draper decorators on an object and thus
avoid bloating them, the code examples and the fact that the decorated objects
seem to get used in controller logic doesn’t indicate that this was the authors
primary intentions. Furthermore, FooDecorator.find
doesn’t make sense for a
“proper”/reusable decorator), but no one ever said programming was easy :–)
Blogging didn’t really work for me in the past. I don’t know if it was because of the engine (wordpress), because I didn’t think I have enough interesting things to share, or that the idea-to-blog hurdle is higher than just ranting on twitter (I still do that, by the way…), but I tried twice in the past and it didn’t stick.
So what to expect here? As I said, the content will probably become more technical, the main topics will probably be:
A last word of caution: this site still has some rough edges, no comments, no RSS feeds for categories, and so on. I decided to “relaunch” anyway as I have completed importing and converting posts from my previous (wordpress) blog more than 6 weeks ago and haven’t found the time to take care of the few itches I still want to scratch. 80% there is still better than not there at all :-)
Enjoy!
]]>Update (25.06.2009 19:30): Hier noch ein paar mehr Impressionen der Aufführung, erstens bei den Ruhrnachrichten, und zweitens vor Ort von einem Kommilitonen gefilmt :-)
Nachtrag (15.06.09 12:10): Mehr Infos gibt es auch noch auf den Seiten der Fakultat für Kunst- und Sportwissenschaften der TU Dortmund: Italienisches Triptychon im Juni.
]]>Musikalisch hat also alles gepasst, oder zumindest gab es keine gravierenden Probleme, die nicht in der nächsten Woche noch beseitigt werden könnten. Mal sehen, wie das wird, wenn wir noch die Szene einbringen! Das wird allerdings erst am 16.06. bei der Generalprobe stattfinden (wer mal in eine Generalprobe reinschauen will kann sicher kommen, wenn nicht zu viele andere die gleiche Idee haben, gegebenenfalls ganz unten auf “Kontakt” klicken und mir eine Mail schreiben), und da wird sicherlich noch einiges schief gehen (bei einer Generalprobe passiert immer etwas).
In der Zwischenzeit möchte ich schon mal ein bisschen Werbung machen, und zwar finden die 2 Aufführungen am 24.06. im Audimax der TU Dortmund und am 27.06. im Konzerthaus Dortmund statt, wer es noch nicht getan hat sollte es sich schnell in seinen Kalender schreiben! :-)
]]>Jetzt schreibe ich schon einen ganzen Absatz über meine Aufregung, vielleicht sollte ich auch mal sagen, weswegen ich so aufgeregt bin… In 3 Wochen ist die erste Aufführung der Oper! Falls die “letzte” Generalprobe (GP) auch noch zur öffentlichen GP wird, sind es sogar nur noch 2 Wochen. Die Aufregung kommt auch nicht nur von der “Aufführungsangst” (Kann ich meinen Text gut genug? Werden die szenischen Effekte alle gut rüberkommen? Werde ich da fit genug sein? Wenn ich jetzt schon so aufgeregt bin, was für ein Nervenbündel werde ich dann bei der Aufführung sein? Kann ich mich nach der Aufführung überhaupt noch bei meinem Professor für theoretische Informatik, der so von der Oper begeistert ist, blicken lassen?…), die wahrscheinlich irgendwo normal ist, und die ich vor Konzerten immer hatte (obwohl natürlich nicht in dem Maße, ich war ja bis jetzt nur einmal Solist), die Aufregung kommt auch von der Vorfreude auf die Oper (das wir toll!!!), und von der Unsicherheit wer jetzt von meiner Familie alles kommt.
Zu meinem engeren Familienkreis, also Geschwister und Eltern, muss ich hier noch nachtragen, dass dieser Teil meiner Familie 900km weit weg von mir wohnt, weil die in Mittenimnichtshausen geblieben sind. Der Ort heißt natürlich nicht so, aber um es schnell und grob zu erklären: das liegt im Zentralmassiv in der Nähe von Clermont-Ferrand (wer Französisch in der Schule hat/hatte und mit der Reihe “Découvertes” gelernt hat könnte das sogar kennen ;-) ), ziemlich in der Mitte Frankreichs. Auch wenn ich vor der letzten Aufführung nicht so viel Zeit für meine Familie hätte, würde ich mich dennoch sehr freuen wenn wenigstens einer meiner Eltern da wäre. Über die restliche Familie (Tanten, Onkel, Cousinen und Cousins, Großeltern, alles da!) würde ich mich natürlich auch sehr freuen, aber da die entferntesten in Frankfurt wohnen ist es nicht ganz so schwierig die des Konzertbesuchs zu überzeugen.
Ich wollte eigentlich auch noch ein bisschen mehr über die Vorfreude auf die Oper selbst schreiben, insbesondere wie (wider meinen Erwartungen) gut die bisherigen Durchläufe geklappt haben, aber das muss auf den nächsten Beitrag über die Oper warten, schliesslich ist dieser hier schon lang genug :-) Sobald ich Plakate und Handzettel (zu Neudeutsch: Flyer) habe, werde ich diese auch großzügig verteilen und hier damit Werbung machen, bis dahin darf sich aber jeder den 24.06. und den 27.06. merken, da gibt’s dann Aufführungen, jeweils im Audimax der TU Dortmund, und im Konzerthaus Dortmund. Wir freuen uns auf jeden Besucher, ich mich ganz besonders auf euch :-D
]]>Das Konzert am Sonntag war für die relativ kleine Kirche gut besucht, und musikalisch brauche ich mich nicht zu schämen, teilweise hatte ich sogar das Gefühl den ganzen Raum alleine zu füllen, obwohl ich nie alleine, also nur mit den anderen Solisten und/oder mit dem Chor, gesungen habe. Ich könnte mich allerdings für meinen eigenen Auftritt selbst schlagen: Ich hatte bewusst weder Krawatte noch Fliege um, weil man mir zur Frage zur Kleiderordnung nur “ganz schwarz” geantwortet hatte (außerdem ist mir mein schwarzes Hemd am Kragen zu eng, wäre also eh schwierig da noch Krawatte oder Fliege zu zu tragen…), irgendwie fühlte ich mich dann trotzdem underdressed, ein Stück habe ich noch mit dem Chor gesungen, bin aber bei einem Stück, bei dem ich nicht gesungen habe, mit aufgetreten, und die 3 Knöpfe an meinem Jackett haben trotz ihrer geringen Anzahl es geschafft mich am Ende des Konzerts (wieder auf die Bühne kommen und verbeugen) zu verwirren. Mein Gesangslehrer hatte dazu allerdings auch mal wieder ein passendes Wort: “Das zeigt, dass du menschlich bist”. Alles in Allem kann es aber gar nicht so schlecht gewesen sein, weil ich nach dem Konzert noch für Karfreitag engagiert worden bin. Vielleicht doch noch der Anfang einer musikalischen Karriere?
]]>Zur Musik wäre hier noch zu sagen, dass Puccini da auch nicht unbedingt die “leichteste” Musik geschrieben hat. Die Musik, die unter klassische Musik bekannt ist (die Bezeichnung ist mir immer irgendwie zu schwammig, hierfür wird es aber reichen), ist eigentlich mit etwas Übung recht leicht zu singen und schnell erlernbar, weil Musik dieser Zeit recht strengen Regeln und Mustern gefolgt hat. Mit etwas Erfahrung und einer guten Kenntnis der musikalischen Epoche bzw. des Komponisten geht es sogar noch schneller. Puccini hat allerdings Ende des 19. bzw. Anfang des 20. Jahrhunderts gelebt und komponiert, und fällt nicht mehr in diesen “klassischen” Rahmen, was seine Musik meines Erachtens etwas abwechslungsreicher und “frischer” macht, allerdings auch Tücken mit sich bringt. Über eine dieser Tücken sind wir heute gestolpert: Im ersten Teil von Gianni Schicchi ist der Schwerpunkt der Musik vom Orchester nicht wie man es erwarten würde auf dem ersten Schlag eines Taktes, aber immer auf der “3 und”, also auf der auftaktigen Achtel, was die Musik gefühlt etwas flotter erscheinen lässt. Das mag sich jetzt ein bisschen nach Nörgelei anhören, aber das macht es extrem schwierig die eigenen Einsätze zu finden, insbesondere wenn 2 oder 3 Stimmen, die in der “Unterhaltung” vorkommen, fehlen.
Naja, noch ist ja nichts schlimmes passiert, und es ist noch weit genug zur Aufführung, um solche Sachen auszubügeln, aber peinlich war mir das schon irgendwie. Ich hoffe dieser Versuch einer musikalischen Probe war uns eine Warnung, und dass es umso besser nächste Woche beim nächsten Versuch die Musik mit einzubinden klappen wird!
]]>RoR bietet viele Möglichkeiten Eingaben zu prüfen, z.B. ob überhaupt ein Datenfeld gefüllt ist, oder ob sie einem bestimmten Format oder einer bestimmten Länge entsprechen, aber keine einfache Möglichkeit, um das Format einer Emailadresse zu überprüfen. Es gibt zwar ein Haufen Ansätze mit Regular Expressions, diese sind aber zu 99,9% nicht mit den Standards kompatibel. Dafür habe ich das validates_email_format_of Rails Plugin von Alex Dunae gefunden, was wie der Name es vermuten lässt eine validates_email_format_of Methode bereitstellt, mit der man die Richtigkeit einer Emailadresse gegen die gängigsten Standards bzw. RFCs testen kann.
]]>Ich will nicht zu viel auf einmal verraten, damit ich später noch ein bisschen schreiben kann, und damit noch ein paar Überraschungen bei der Aufführung bleiben :-) . Gestern war die erste Probe, und ich habe einen Großteil der Besetzung und die Regisseuren kennen gelernt. Im Großen und Ganzen eine lustige Truppe, und die Ideen der Regisseure sind auch recht gut. Das einzige Manko, was ich im Moment sehe, ist die Sprache: Die Oper ist original auf Italienisch, und wir singen sie auf Deutsch.
]]>Facebook hat jetzt allerdings neue Nutzungsbedingung, die diese Austrittsklausel durch Accountlöschung entfernt haben. Soll heißen: Alles, was auf Facebook jetzt hochgeladen, geschrieben oder erstellt wird gehört denen, auf immer und ewig, ohne dass irgendjemand was dagegen tun kann. Das besagen die Nutzungsbedingungen von Facebook, die allerdings momentan nur auf Englisch vorliegen. Mehr Infos dazu (auf Englisch) gibt es z.B. bei The Consumerist im Artikel: Facebook’s New Terms Of Service: “We Can Do Anything We Want With Your Content. Forever.”
Das hört sich jetzt alles irgendwie sehr nach einem David-gegen-Goliath-artigen Kampf an: Was kann denn jetzt der “kleine” Benutzer gegen den “großen” Facebook tun? Nach meinen letzten Informationen leben wir in Deutschland immer noch in einem Rechtsstaat (man glaubt’s kaum!), und diese Rechte schützen auch Benutzer und Einzelpersonen, nicht nur Weltkonzerne und deren Geschäftsführer. Laut dem Rechtsanwalt Dr. Carsten Ulbricht, der sich auf seinem Blog Web 2.0 & Recht mit der Verwendung von User Generated Content laut deutschem Recht befasst hat, “[dürfen] Inhalte [die] urheberrechtlichen Schutz genießen […] – bis auf wenige Ausnahmen - nur mit der ausdrücklichen Zustimmung des Urhebers veröffentlicht, weitergegeben oder sonst wie genutzt werden.”Die Nutzungsbedingungen von Facebook würden in der aktuellen Form also in Deutschland nicht greifen, da eine “pauschale” Abtretung der Urheberechte, wie es momentan bei Facebook der Fall ist, nicht als ausdrückliche Zustimmung gilt. (N.B.: Ich habe den Artikel nur überflogen und konnte ihn noch nicht ganz durchlesen, alle Angaben also ohne Gewähr; wer genaue Informationen braucht sollte sich an einen kompetenten Anwalt wenden.)
Da ich oben StudiVZ und Schwesterseiten genannt habe, möchte ich deren Situation auch noch klären. Obwohl persönliche Daten zum Zweck der gezielten Werbung auf dieser Plattform genutzt werden, und das meiner Meinung nach schon keine passive Nutzung mehr beinhaltet, kann man dieses Verhalten abschalten, genauso wie Werbung, die man von StudiVZ oder Partnern bekommen würde. Weiterhin wird soweit ich das feststellen konnte in den AGBs nirgends erwähnt, dass man irgendwelche Rechte an dem Inhalt abgibt, den man dort hochlädt. (Hier auch wieder: Alle Angaben ohne Gewähr!) Wir können nur hoffen, dass das deutsche Recht weiterhin den Benutzer schützt, und solche Bedingungen wie Facebook sie praktiziert in Deutschland möglich werden.
]]>Florian war immer noch nicht ganz überzeugt, und hat dem Leiter des Projektes noch ein paar Fragen per Mail gestellt, unter anderem auch was die “Studenten-Freundlichkeit” des Projektes angeht (siehe weiter unten). Studierende und junge Leute sind bei dem Projekt auch noch ausdrücklich erwünscht, es gibt bis jetzt scheinbar kaum Kandidaten unter 30. Die Anmeldefrist ist schon um eine Woche nach hinten geschoben worden auf den 08.02.09, wer Interesse hat hat also noch ein paar Tage, trödeln sollte man dann aber nicht! :-)
Und nun zum Interview: