Ruby, RPM und twittern von der Kommandozeile

Heute war mal wieder so ein Tag… Eigentlich wollte ich mir nur einen Twitter-Client installieren, den man von der Kommandozeile aus nutzt: termtter. (Da ich einen Großteil meiner Arbeitzeit auf der Kommandozeile oder in emacs verbringe, hab ich eine gewisse Affinität dazu entwickelt und mache Dinge gerne auf der Kommandozeile. Auch ist der X-Server für mich bis heute ein starker Push-Faktor, doch lieber die Kommandozeile zu nutzen.)

Der Entwickler scheint Japaner zu sein oder zumindest Japanisch zu sprechen, deswegen muß man manchmal ein bißchen rumsuchen, bis man die Doku auch auf Englisch hat, aber das ist ja nicht weiter schlimm. Gleichzeitig bedeutet das aber auch, daß die Software wirklich keine Probleme mit Unicode macht, ein lobenswertes Qualitätsmerkmal. (Und daß ich dies heutzutage – immerhin im Jahr 2010 – noch loben muß, sollten sich alle die solches Lob nicht verdienen (Ihr wißt, wer Ihr seid) mal wieder zum Anlaß nehmen, sich in eine Ecke zu verkriechen und intensiv und sehr lange zu schämen!)

termtter ist in Ruby geschrieben und auch wenn ich deswegen heute mehr Aufwand gehabt habe, als mir lieb gewesen wäre, will ich das hier nicht als Nachteil werten. Die meiste Ruby-Software die mir bisher untergekommen ist, funktioniert sehr gut und ist häufig sogar halbwegs sicher (noch so ein Anlaß für andere, sich mal wieder zu schämen). Und im Gegensatz zu Python kann ich auch als jemand der Ruby nicht kennt, die Fehlermeldungen halbwegs interpretieren. Insgesamt gefällt mir Ruby und wenn ich will das in absehbarer Zeit mal lernen.

Nun aber zur Anleitung (die für Fedora 14 gilt):

Gleich als allererstes sollte man sich folgende Packete installieren, bevor man überhaupt an termtter denkt (ich gehe mal davon aus, daß grundlegende Build-Tools schon vorhanden sind):

sudo yum install rubygem-gem2rpm ruby-devel rpmdev-setuptree rubygem-json rubygem-highline rubygem-rspec rubygem-actionpack rubygem-curb rubygem-mocha rubygem-rack rubygem-typhoeus rubygem-eventmachine

Dann sollte man sich (falls noch nicht vorhanden) eine Build-Umgebung für RPM einrichten und dann die weiteren Abhängigkeiten von termtter die es bisher nicht als Packete für Fedora gibt in RPMs verwandeln. (Ich verwende für soetwas übrigens gerne einen speziellen User „builduser“, um mir nicht mein reguläres Heimverzeichnis zuzumüllen.) Um das zu bewerkstelligen gibt es das Tool gem2rpm, das mir heute fast durchgehend gute Dienste geleistet hat (s.u.).

Noch eine Randbemerkung: Ich verwende hier rpmdev-setuptree und das lohnt sich wirklich. Das schreibt einem nämlich auch schöne Dinge in die .rpmmacros-Config, etwa daß der Compiler auch gerne auf mehr als eine CPU zurückgreifen darf beim Build. Auf die Idee wäre ich selbst nie gekommen, daß man ihm das über ein RPM-Makro mitgeben kann.


rpmdev-setuptree
cd rpmbuild/SOURCES
gem fetch addressable
gem fetch em-http-request
gem fetch notify
gem fetch oauth
gem fetch rubytter
gem fetch termcolor
gem fetch termtter
gem2rpm addressable-2.2.2.gem > ../SPECS/rubygem-addressable.spec
gem2rpm notify-0.3.0.gem > ../SPECS/rubygem-notify.spec
gem2rpm oauth-0.4.4.gem > ../SPECS/rubygem-oauth.spec
gem2rpm rubytter-1.4.1.gem > ../SPECS/rubygem-rubytter.spec
gem2rpm termcolor-1.2.1.gem > ../SPECS/rubygem-termcolor.spec
gem2rpm termtter-1.9.0.gem > ../SPECS/rubygem-termtter.spec

So, und da war der Spaß aus. Wer aufgepaßt hat, dürfte bemerkt haben, daß ich hier kein Specfile für em-http-request erstellen lasse. Ich hab das hier bewußt ausgelassen, denn das Specfile das gem2rpm da erstellt ist schlichtweg unsinnig. em-http-request scheint kein gewöhnliches Gem zu sein, denn es benötigt als Build-Dependency ruby-devel und scheint irgendetwas zu kompilieren. Das Problem ist offenbar, daß gem2rpm nicht sonderlich viel Logik einsetzt um seinen Job zu machen, folglich nicht erkennt, daß es bei diesem Gem anders verfahren müßte und dann schließlich Schritte ins Specfile schreibt, die für diesen Fall ungeeignet sind. Der langen Rede kurzer Unsinn: Ich hab mir dann ein funktionierendes RPM für em-http-request einer anderen Linux-Distribution gesucht und mir von dem Specfile dort was abgeschaut und das was unter Fedora nicht ging gefixt. Vielen Dank an die Leute bei Mandriva Linux, insbesondere Rémy Clouard, hier ist das gefixte Specfile für em-http-request auf Fedora 14.

Nun kann man sich endlich ans Builden machen:


rpmbuild -ba ~/rpmbuild/SPECS/rubygem-addressable.spec
rpmbuild -ba ~/rpmbuild/SPECS/rubygem-notify.spec
rpmbuild -ba ~/rpmbuild/SPECS/rubygem-oauth.spec
rpmbuild -ba ~/rpmbuild/SPECS/rubygem-rubytter.spec
rpmbuild -ba ~/rpmbuild/SPECS/rubygem-termcolor.spec
rpmbuild -ba ~/rpmbuild/SPECS/rubygem-termtter.spec

Die so erzeugten RPMs kann man dann installieren:

sudo yum localinstall --nogpgcheck ~/rpmbuild/x86_64/rubygem-em-http-request-0.2.15-1.fc14.x86_64.rpm ~/rpmbuild/noarch/rubygem-notify-0.3.0-1.fc14.noarch.rpm ~/rpmbuild/noarch/rubygem-rubytter-1.4.1-1.fc14.noarch.rpm ~/rpmbuild/noarch/rubygem-termtter-1.9.0-1.fc14.noarch.rpm ~/rpmbuild/noarch/rubygem-addressable-2.2.2-1.fc14.noarch.rpm ~/rpmbuild/noarch/rubygem-oauth-0.4.4-1.fc14.noarch.rpm ~/rpmbuild/noarch/rubygem-termcolor-1.2.1-1.fc14.noarch.rpm

termtter benötigt eine kleine, aber feine Config, die man sich unter .termtter/config ablegen sollte:


config.user_name = 'your id'
config.password = 'your password'
config.update_interval = 60

#config.proxy.host = 'proxy host'
#config.proxy.port = '8080'
#config.proxy.user_name = 'proxy user'
#config.proxy.password = 'proxy password'

#Termtter::Client.init do |t|
# t.plug 'growl'
#end

Beim ersten Start wird termtter OAuth triggern und im Browser eine URL öffnen die zu Twitter führt. Dort muß man sich nochmal einloggen und erhält dann eine PIN, die man bei termtter eingibt. Danach ist termtter bei Twitter authentifiziert und kann benutzt werden. Eine Manpage fehlt leider bisher (wenn jemand weiß, wie man die Ruby-Doku in eine Manpage umwandeln kann: ich freue mich über Input), aber termtter hat eine eingebaute Hilfe, einfach „help“ eingeben und lesen. Diese Hilfe ist übrigens erschöpfend, d.h. das was da steht ist auch schon alles, was man über termtter wissen muß. Twitter ist ja nicht so komplex.