Ubuntus gwibber ist schrott!

Ich benutze häufig (vor allem, wenn ich an ubuntu-kisten sitze) gwibber, um meist eher bedeutungslose textstummel auf twitter und identi.ca zu posten. Wenn man einmal davon absieht, dass dieses programm für einen recht kleinen anwendungsfall einen recht großen speicherabdruck hinterlässt, ist es an sich ganz brauchbar.

Es ist vermutlich leicht vorstellbar, dass ich dieses stück softwäjhr oft sehr lange im hintergrund mitlaufen lasse. Genau dafür scheint mir so eine softwäjhr auch gemacht zu sein, dass sie ähnlich wie ein IRC-klient oder ein IM-programm gut im hintergrund laufen kann. Wenn mein nick erwähnt wird, bekomme ich eine kleine einblendung auf dem desktop, die mich zur aufmerksamkeit ruft.

So weit das gute.

Und nun das miese, also die art, wie dieses gwibber seine daten speichert. Und natürlich, wie dieses gwibber programmiert wurde.

Fange ich mal damit an, wie ich das problem entdeckt habe. Mir ist aufgefallen, dass einer der rechner, an denen ich häufig sitze, in regelmäßigen abständen in die knie ging. Es ist ein für meine verhältnisse ausgesprochen gut ausgestatteter rechner mit einer zweikern-CPU und 4 GiB RAM. Dennoch stand dieser rechner regelmäßig so sehr unter last, dass ich bei der audiobearbeitung probleme mit aussetzern bekam und es sogar zu rucklern beim abspielen von 720p-videos gekommen ist.

Natürlich empfand ich das als untragbar. Die video-probleme sind für mich eher untergeordnet, aber wenn ich keine klänge bearbeiten kann, ist ein kompjuter für mich kastriert. Ich benutze kompjuter verdammt noch mal zum musikmachen, und ich konnte das schon in den neunziger jahren mit meinem amiga machen, ohne mich mit derartigen aussetzern herumschlagen zu müssen.

Und deshalb habe ich mir dieses problem näher angeschaut.

Dabei ist mir schnell aufgefallen, dass der rechner in regelmäßigen abständen für mehrere sekunden eine CPU-auslastung von 100 prozent hat. Genauer gesagt: er wurde alle fünf minuten für ungefähr fünfzehn bis zwanzig sekunden unter so große last gesetzt, dass andere prozesse nicht mehr rund liefen.

Alle fünf minuten… schnell fiel mir ein, dass das genau die frekwenz war, mit der sich gwibber automatisch aktualisiert. Genauer gesagt: mit der sich ein hintergrund-prozess, der übrigens auch noch läuft, wenn man gwibber beendet hat, die fiepser und die statusmeldungen von identi.ca abholt, um sie lokal zu speichern. Ein aufruf von top an der kommandozeile brachte gewissheit, es war der prozess gwibber-service, der mir hier den spaß am rechner verdarb.

„Aber das ging doch früher“, habe ich mir gedacht.

Und dann bekam ich einen verdacht, dass gwibber wohl unmengen alter daten irgendwo gespeichert hatte und inzwischen probleme haben könnte, neue daten einzufügen.

Zeit, sich das einmal anzuschauen.

Zum glück speichert gwibber seine daten wie erwartet unter ~/.config/gwibber. In diesem verzeichnis liegt eine sqlite3-datenbank mit dem namen gwibber.sqlite herum. Ein schnelles ls -l führte dann dazu, dass mir einen kurzen moment lang die gesichtszüge entgleisten:

$ ls -l
-rw-r--r-- 1 elias elias 684362752 Apr 26 15:39 gwibber.sqlite
$ _

Dieses… ähm… tolle programm hat also im laufe der zeit 652,7 MiB an daten gespeichert. Kein wunder, dass das einfügen von daten in diese übergroße datei, das aktualisieren der indizes, und das anschließende benachrichtigen des GUI-prozesses gwibber, der aus dieser datei dann die neue ansicht ermittelt, ein bisschen last verursacht.

Ich dachte einen moment lang, dass gwibber niemals alte nachrichten löschen würde und dass die programmierer hirnlose vollpfosten seien, die ihre eigene softwäjhr gar nicht nutzen. Dieser gedanke erwies sich allerdings als halber trugschluss, denn in gwibber befindet sich sehr wohl etwas kohd, der die datenbank von alten einträgen befreit. In einer etwas obskuren SQL-anweisung mit zwei unter-SELECTs werden für jeden dienst alle nachrichten bis auf die letzten 2000 entfernt. Dies gilt allerdings nur für normale nachrichten. Gwibber hält… moment…

*tipptipptipp* SELECT stream, count(*) from messages group by 1;

…aber neben den „messages“ auch noch „images“, „links“, „lists“, „private“, „profile“, „replies“, „search“, „send_private“, „send_thread“, „user“ und „videos“ — und moment…

*tipptipptipp* SELECT operation, count(*) from messages group by 1;

…neben den empfangenen nachrichten („receive“) auch ein paar weitere nachrichtentypen, die als „lists“, „private“, „receive“, „responses“, „search“, „send“, „send_private“, „send_thread“ und „user_messages“ ausgewiesen sind. Was das alles bedeutet? Ich kann es in einigen fällen sicher erraten, und in anderen ist es mir eigentlich egal.

Entscheidend ist nur eines: alles, was gwibber davon selbst löscht, sind einträge, bei denen operation = "receive" und stream = "message" ist.

Und alles andere sammelt sich im laufe der zeit in einer datenbank an, über deren relationales desein ich an dieser stelle lieber den gnädigen schleier des schweigens senke, um nicht an einem akuten mangel unflätiger wörter zu verenden. Nur so viel sei hierzu noch angemerkt: Damit die datenbank auch schön moppelig werde und nicht gar zu viel platz auf der festplatte unbelegt bleibe, steht zu jedem eintrag einer nachricht auch noch das vollständige json-format, in dem er vom gwibber-service empfangen wurde, in der datenbank. Was die programmierer sich dabei gedacht haben? Ich weiß es nicht. Vielleicht wollten sie einfach eine möglichkeit der wiederherstellung haben, wenn einmal eine spalte mit daten verdampft. :mrgreen:

Nun gut, wenn gwibber das selbst nicht besser kann, muss ich das problem halt ein bisschen „spanabhebend“ lösen. Zum Beispiel, indem ich mit einer SQL-anweisung alle einträge lösche, die älter als dreißig tage sind. Und weil zu erwarten ist, dass ich diese wartungsaufgabe noch etwas häufiger vor mir haben werde, und weil andererseits nicht zu erwarten ist, dass die im auftrage canonicals meinen kompjuter unbrauchbar machenden gwibber-programmierer in der kommenden monaten etwas gegen dieses problem tun werden, ist es wohl am günstigsten, hierfür ein ganz schnelles skript zu hacken, dass man bei bedarf ausführt. Zum beispiel dieses hier:

#!/bin/bash

db_dir=~/.config/gwibber
db_name=gwibber.sqlite
db_keepdays=30

db_path=$db_dir/$db_name
db_keepsecs=$(($db_keepdays * 24 * 60 * 60))
db_deletebefore=$((`date +%s` - $db_keepsecs))

sqlite3 "$db_path" <<EOF
delete from messages where time < $db_deletebefore;
vacuum;
EOF

Eine kommentierte versjon des skriptes kann bei pastebin angeschaut und heruntergeladen werden — es ist also nicht nötig, hier bei bedarf die zwischenablage zu bemühen…

Nach aufruf dieses skriptes (und etlichen sekunden intensivens kratzens auf der festplatte) befanden sich bei mir nur noch die einträge der letzten dreißig tage in der datenbank. Wer ein anderes zeitfenster wünscht, kann für $db_keepdays einen anderen wert setzen.

Die größe der datenbank hat sich in meinem fall auf 83,5 MiB reduziert. Das ist zwar eine menge, aber es sind nur noch 13 prozent der ursprünglichen größe — die speicherverschwendung liegt an der stark redundanten datenhaltung. Und ich kann gwibber immer noch so benutzen, wie ich das will: ich kann meine timeline lesen und meine textstummel auf twitter und identi.ca veröffentlichen. Welchen vorzug der gespeicherte datenmüll aus anwendersicht haben sollte, ist mir auch nach kurzem lesen der gwibber-kwelltexte nicht aufgegangen.

Dabei fühlt sich gwibber jetzt deutlich schneller an. Und die systemlast bei aktualisieren ist so sehr reduziert, dass es nicht mehr zu derart üblen aussetzern kommt, wie ich sie weiter oben beschrieben habe.

Warum canonical seinem ubuntu eine derartige müllanwendung ausliefert, die den rechner in einer weise unbrauchbar macht, die „normale anwender“ einfach nur vor rätsel stellt (das ging doch vor ein paar wochen auch noch), gehört zu den fragen, mit denen man sich bitte an canonical wendet. Mein verdacht ist ja, dass die „zielgruppe“ canonicals leute sind, die niemals mit ihrem kompjuter arbeiten.

URLs aus einer HTML-datei extrahieren

Da fragt mich doch jemand, wie man mit einem regulären ausdruck und sed die URLs aus einer HTML-datei extrahieren kann. Meine erste reakzjon: „Damit ist sed ein bisschen überfordert, das wird eine sehr lange zeile“. Aber ich habe ja nochmal nachgedacht, und dann fiel mir ein, dass der textbrauser lynx dieses problem schon hervorragend löst, und etwa zwei minuten später ging die folgende funktion für die sh raus:

getlinks()
{
  for i
  do
    lynx -dump -listonly "$i" | sed 1,3d
  done | sed "s/ *[0-9]*\. *//" 
}

Diese funkzjon getlinks kann mit beliebig vielen HTML-dateien oder auch gültigen URLs als parameter aufgerufen werden, und lynx erledigt den größten teil der arbeit. Heraus kommt eine Liste mit den URLs, jede hübsch einzeln auf einer zeile und ohne weiteren kram, der die weitere verarbeitung in einem skript erschwert. Die ausgabe wird mit zwei sed-befehlen gefiltert. Der erste entfernt die laufenden nummern, die am anfang der zeilen stehen. Das sollte eigentlich auch mit der lynx-opzjon -nonumbers gehen, aber unglücklicherweise verstand der lynx auf der kiste, auf der dieses skript laufen sollte, ausgerechnet diese eine opzjon nicht und wir hatten keine lust, schnell einen neuen zu kompilieren. Der zweite audruck löscht einfach nur die ersten drei zeilen, die eine hier störende überschrift enthalten. Wer diese funkzjon benutzen will, sollte sich aber vorher einmal die ausgabe von lynx -dump -listonly anschauen, denn es ist nicht auszuschließen, dass die ausgabe in anderen versjonen ein bisschen anders aussieht.

Wenn es eine wirkliche stärke unixoider betriebssysteme gibt, denn ist es die art, wie man sich die bestehenden programme „zusammenstecken“ kann, um mit relativ wenig aufwand komplexe probleme zu lösen. Das war in den siebziger jahren schon ein starkes konzept, und es ist auch vierzig jahre später noch unendlich nützlich. Leider gerät es mit dem vordringen grafischer klickflächen immer mehr in vergessenheit, selbst bei menschen mit guten technischen kenntnissen — und in der folge werden viele probleme mit viel zu großem aufwand gelöst.

Mit wpcmd macht das bloggen wieder spaß

Nachdem ich mich jetzt schon so lange über das immer schwerfälliger und langsamer werdende wördpress geärgert habe, habe ich endlich zur selbsthilfe gegriffen und mir eine blogsoftwäjhr für die kommandozeile zusammengehäckt. Und auf einmal macht das bloggen wieder spaß.

Was ich so toll an meiner idee finde, ist die möglichkeit zur automatisierung. Ich habe meine texte schon immer offline geschrieben, um sie besser archivieren zu können. Dabei habe ich ordner für jahr und monat angelegt, in denen ich die texte gespeichert habe, und nach der veröffentlichung habe ich diese texte in einem ordner published abgelegt, um nicht die übersicht zu verlieren. Jetzt habe ich ein programm für die kommandozeile, und meine erste tat war das verfassen eines kleinen shellskriptes, um diesen vorgang zu automatisieren.

Dieses skript sieht so aus:

#!/bin/sh

dir=~/Dokumente/Blogtexte/`date +%Y-%m`
cd $dir
test -d published || mkdir published
for i in *.txt
do
    if grep -q '^!![:space:]*blog:' "$i"
    then
        wpcmd -v "$i"
        mv "$i" published
    fi
done

Der seltsame grep -q macht einerseits keine ausgabe nach stdout, das ist der zweck von diesem komischen -q (eine opzjon noch aus frühesten unix-zeiten), aber grep hat ja einen rückgabewert, der ungleich 0 ist, wenn der suchausdruck nicht gefunden wurde. Und der ausdruck nach dem grep gibt eine zeile an, die in jedem blogfähigen text enthalten sein muss, so dass niemals „versehentlich“ ungeeignete texte gepohstet werden. Ich habe mir mit diesen paar zeilen shellskript doch tatsächlich meinen kompletten vorherigen wörkflou automatisiert und kann mich wieder völlig darauf konzentrieren, meine texte zu in meinem lieblingseditor zu schreiben. (Der übrigens immer noch ein emacs ist, ja, ich weiß… — aber ich bin dieses monster jetzt seit jahrzehnten gewohnt. Vielleicht bringe ich ihm demnächst mal das bloggen bei, das fehlt noch in emacs. Wenn nur diese vielen klammern in diesem scheiß-lisp nicht wären.)

Na ja, immerhin habe ich mir einen hübschen starter auf meinem desktopp gebastelt, der mein skript aufruft und alles auf einen klick runterbloggt.

Wenn bloggen gar nicht mehr nerdy ist, denn muss man es eben nerdy machen. Und immer daran denken: CODE IS PROSA, NOT POETRY… :mrgreen:

Ich glaube aber nicht, dass ich in den nächsten vier wochen das wpcmd-projekt noch einmal anfassen mag. Ich bin froh, dass ich gerade mal ein paar tage ruhe gefunden habe, das, was jetzt fertig ist, auch richtig zu machen. Wie man an diesem pohsting sieht, lässt sich mit der jetzigen alfa ganz gut bloggen. Für die zukunft steht ganz oben auf meiner liste, etwas dreckscode in wpcmd besser zu machen (betrifft vor allem die applohd-funkzjon) und ein paar pohsteigenschaften zusätzlich setzen zu können (vor allem das veröffentlichungsdatum, denn ich blogge manchmal in die zukunft) — und denn kommen erstmal jede menge admin-möglichkeiten, in erster linje kommentarmoderation an der kommandozeile. Wenn der stand erreicht ist, den ich haben will, brauche ich die adminoberfläche in wordpress nur noch in sehr seltenen fällen.

Twittern an der kommandozeile

Manchmal wünscht man sich ein programm zum twittern, das sich schnell an der kommandozeile verwenden lässt und das vielleicht sogar gewisse automatisierungen ermöglicht (zum beispiel für wetterdaten oder vergleichbares). Für jemanden, der linux benutzt, ist das recht einfach, es geht mit curl und einem schlichten shellskript:

#!/bin/sh

user="username" # Richtigen Usernamen eintragen
pass="passwort" # Richtiges Passwort eintragen
curl="/usr/bin/curl" #Pfad zu curl

$curl 	--basic	\
	-u "$user:$pass" \
	-d "status=`echo $@ | tr ' ' '+'`" \
	"http://twitter.com/statuses/update.json" \
	2&>1 >/dev/null

exit 0

Die verwendung ist denkbar einfach. Wenn man das kleine skript zum beispiel unter dem namen tweet in seinen $PATH ablegt, denn kann auf die folgende, sehr einfache weise ein neuer twiht erstellt werden:

tweet ich habe gerade nichts zu sagen...

Natürlich kann auch eine programmausgabe mit bäckticks eingefügt werden. Wenn man sich das kleine programm hodie installiert hat, denn bringt folgende zeile das lateinische datum zu twitter:

tweet `hodie`

Auch für gewisse akzjonen mag es nützlich sein, skriptgesteuert jede minute oder alle 10 sekunden einen kurzen spruch in einem twitter-akkaunt abzusetzen. Da twitter so etwas in seinen nutzungsbedingungsen verbietet, sollte man aber dafür einen wegwerfaccount anlegen. Der folgende einzeiler in bash-syntax erzeugt alle fünf sekunden einen twieht:

while :;do tweet dummer text hierher; sleep 5; done

Natürlich muss so etwas mit Ctrl+C beendet werden. Es kann aber gut im hintergrund in einem kleinen konsolenfenster laufen.

Fröhliche grüße an kristina

Zusammen getäggt

Ich habe mir heute eine dieser ganz simplen fragen gestellt. Seit das blah-blog läuft, verwendet es ja kaum das kategorien-system von wordpress, sondern die meist kurzen texte werden mit täggs ausgezeichnet. Und weil das so schön einfach geht und weil man sich dabei keine strukturellen gedanken machen muss, werden an so einem text gern mehrere täggs gehängt. Das ist nur natürlich.

Die frage, die ich mir stellte, lautete nun: Welche täggs tauchen oft gemeinsam zu einem text auf. In dieser kleinigkeit könnte sich, so meine idee, doch einiges von der geisteshaltung kristallisieren, die jeden tag zu den kurzen hinweisen antreibt — und die sehr subjektive geisteshaltung ist wieder eine reakzjon auf den oft wenig erkwicklichen zeitgeist.

Es gibt nun für so ziemlich jeden mist irgendwelche statistiken, die schon einmal jemand fertig programmiert hat, aber diese frage musste ich mir denn doch selbst beantworten — mit einem kleinen python-skript und einem bisschen SQL. (Niemand erwarte hier ein wunder der eleganz, ich habe das schnell hingestrokelt.)

Das skript steht zusammen mit seiner ausgabe für den nachtwächter-blah zum freien daunlohd zur verfügung. damit sich auch niemand anders mehr diese mühe machen muss. Auf hinweise, wie man das ding zum laufen kriegt, verzichte ich hier, wer python kann, wird sofort damit klar kommen. Allerdings muss das skript auf einem rechner laufen, der die möglichkeit zu einer direkten verbindung zur wördpress-datenbank bietet, da es seine informazjonen unmittelbar aus der datenbank gewinnt.

Ein paar kleine anmerkungen zur täggbenutzung im blah-blog

Glotzrepublik — Es ist schon interessant zu sehen, dass das tag „BRD“ in mehr als zehn prozent seiner benutzungen zusammen mit „propaganda“, „dämonkratie“ und „kotzreiz“ gefallen ist, aber das entspricht durchaus meinen eigenen erwartungen. Dass ich „ARD“ aber vergleichbar oft zusammen mit „BRD“ benutze, ist mir nicht ganz so klar gewesen.

Netzweg — In mehr als 10 prozent der fälle habe ich die täggs „internet“ und „zensur“ gleichzeitig benutzt.

Werbewahn — Ähnlich stark korrelliert sind „werbung“ und „wahnsinn“. Dabei habe ich doch gar keinen fernseher und sehe die autowerbung, die so manifest irre geworden ist, nur sehr sporadisch. Das „werbung“ und „bullshit“ gut zusammen passen, ist aber für mich kein wunder.

Müllblogger — Wenn ich das tägg „bloggen“ in einem fünftel der fälle zusammen mit dem tägg „spam“ verwende, sagt es wohl einiges darüber, womit man sich beim bloggen so herumschlagen muss.

Propaganda — Was sich so richtig spitzenmäßig zum tägg „propaganda“ gesellt hat, das sind die täggs „link“ (gut, im blah-blog werden viele links gesetzt), „hirnfick“, „brd“, „lüge“, „journaille“, „krieg“, „kotzreiz“. Und das ist eine prächtige zusammenfassung, warum ich beim besten willen keine zeitung mehr aufschlagen werde.

Geglaubtes — Ach, ich lasse zum tägg „religion“ einfach mal den spitzenreiter „link“ weg und zähle auf, was sich sonst dazu gesellt, denn es spricht für sich: „christentum“, „wahnsinn“, „bibel“, „bullshit“,  „katholizismus“, „hirnfick“, „dummes“, „papst“, „bild“, „islam“, „jesus“, „kirche“, „mord“… es klingt fast wie ein zynisches synonym-wörterbuch. Aber es ist nicht so mörderisch und menschenverachtend zynisch wie die wirklichkeit der religjon, die sich darin abbildet.

Guglhupf — Wie sich doch die ehemalige suchmaschine guhgell in den letzten monaten darum bemüht, dass eine alternative zu diesem datensammler mit angeschlossener suchmaschine entsteht: „chrome“, „internet“, „datensammlung“, „google is evil“, „überwachung“, „kotzreiz“, „schrott“, „wahnsinn“, „werbung“, „adsense“, „weltherrschaft“, „zensur“… wenn das ein fragment eines entstehenden synonym-wörterbuches ist, denn sollte sich guhgell ernsthaft geganken um die außenwirkung machen.

Dosenfleisch — In mehr als zwanzig prozent der fälle ist das tägg „spam“ mit dem tägg „seo“ verknüpft. So sieht es aus mit der handgeschriebenen SEO-spämm in einem harmlosen, kleinen blog, das jetzt weg ist. Na ja, es ist nicht richtig weg, nur aus der juristischen schusslinie gezogen ist es.

Dämonenherrschaft — Das schon seltene tägg „dämonkratie“ verbindet sich mit „brd“, „hirnfick“, „propaganda“ und „überwachung“, direkt gefolgt von der „spd“. Ja, die sind im hochbeschwören dämonischer ängste offenbar viel aktiver als ihr politische mitbewerb. Oder liegt es daran, dass leute wie Wolfgang Schäuble und Porno-Ursel von der Leyen nur noch geisteskrank wirken?

Brägenficker — Das tägg „medien“ erscheint in einem viertel der fälle zusammen mit dem tägg „hirnfick“. Das kommt mir fast ein bisschen zu wenig vor…

Käferplage — Wenn ich das tägg „bug“ verwende, steht jedes zweite mal „wordpress“ dahinter. Das lässt ziemlich tief blicken.

Alles in allem hätte ich mir etwas mehr aufschluss und auch ein paar überraschungen von einer solchen analyse erwartet, aber davon gab es nur wenig. Vielleicht werde ich diese analyse in einem jahr noch einmal über das blah-blog laufen lassen, das kleine skript dafür ist ja schon fertig.