Sinnlos verbautes funkzjonsmerkmal des tages

Der KDE-Dateimanager führt unter bestimmten Umständen Schadcode aus. Die Entwickler entfernen die Funktion nun, da sie sowieso niemand verwendet hatte

Das wäre doch mal ein anfang: funkzjonen aus softwäjhr entfernen, die da drin sind, weil irgendwann einmal eine „tolle idee“ hatte (oder ausprobieren wollte, was er im studium gehört und nur halb verstanden hat), die aber gar nicht oder kaum benutzt werden. Wenn man jetzt damit anfängt und sich keine falsche zurückhaltung beim entfernen sinnloser funkzjonen auferlegt, ist in wenigen jahren alles besser. Die softwäjhr wird schneller geladen und schneller ausgeführt, und sie wird sicherer. Denn komplexität ist bei softwäjhr nun einmal das genaue gegenteil von sicherheit.

Ich musste jedenfalls unwillkürlich an einige nahezu unlesbar gewordene kwältexte im GNU-projekt denken. 😀

Da ist geld, ab in die flammen damit…

60 Millionen Euro gab die Bundesagentur für Arbeit für eine Software aus, die 14 verschiedene Anwendungen bündeln sollte. Nun stellt die Behörde fest: Das System funktioniert nicht

Woran scheitert es? Vermutlich scheitert es daran, dass die programmierer bei der bundesagentur für arbeit in ihrem mutmaßlich von der bundesagentur für arbeit erteilten SQL-kurs noch kein UPDATE hatten und deshalb keine möglichkeit gesehen haben, dem anwender eine datenbearbeitung zu ermöglichen:

Es habe sich gezeigt, das nachträgliche Änderungen, etwa die Korrektur einer Kontonummer, in dem System nicht möglich seien. Um eine solche Angabe dennoch korrigieren zu können, habe man sämtlich Leistungs- und Vermittlungsdaten in das System neu eingeben müssen

m(

Welcher zertifizierte spezjalexperte (name, vorname, geburtsdatum) hat da das projektmänätschment gemacht?

Waren ja auch nur sechzig milljönchen, die für so einen erbärmlichen schrott verbrannt wurden. Haftet ja auch niemand für. Das geld holt man einfach wieder rein, indem man es einspart. Zum beispiel, indem man hartz-IV-empfänger mit willkürlichen schikanen in den freitod treibt. Wo ist also das problem? :mrgreen:

Was der jornalist verschweigt, ist, um was für ein „großprojekt“ es sich dabei gehandelt hat. Hier mal eine kleine präsentation für jornalisten und die interessierte öffentlichkeit, und zur absicherung gegen durch löschung verursachte datenarmut hier noch eine lokale sicherheitskopie davon.

Achtung, vor dem weiterlesen getränke aus dem mund entfernen!

Immer daran denken: Heute benötigt der mitarbeiter viele IT verfahren [sic! Deppen leer zeichen!], mit medienbrüchen und oberflächengestaltungen. (Seite 4 der BA-internen präsentazjon.) Bwahahahaha! Die staatlich entlohnten hartz-IV-kwäler bei der BA sind damit überfordert, wenn sie mehr als eine anwendung benutzen müssen, und deshalb sollte eine eierlegende wollmilchsau geproggt werden (anstatt etwa einer vernünftigen schnittstelle zwischen den bestehenden fachanwendungen, die die arbeit mit diesem gewaxenen kaos erleichtert, fehlerkwellen reduziert und die man schön nach und nach implementieren und schrittweise ausrollen kann, um früh schwächen zu entdecken)! Nachdem ich das gesehen habe, braucht mir niemand mehr das pflichtenheft zuzustecken. Dieser fisch stinkt von dem kopfe her, der solche tollen ideen ausbrütet und solche entscheidungen trifft.

(Wenn doch jemand ein mutmaßlich dickes, aufgeblähtes und für programmierer letztlich unbrauchbares pflichtenheft rumliegen hat, bevorzugt als PDF: ich freue mich drüber. Wenn da irgendwo ein paar kwelltexte auf einem CVS-sörver lumlungern, die auf einen checkout warten, freue ich mich darüber genau so. Es gibt ja eine menge sharehoster. Aber kümmer dich bitte selbst darum, dass man dich nicht identifizieren kann, denn ich werde das hier genau so bringen. Und wenn du mehr aufmerksamkeit brauchst, steck es Fefe, der freut sich auch. Ich bin mir sehr sicher, dass im pflichtenheft nicht drinsteht, dass man daten auch mal bearbeiten können muss, denn dieses kleine funkzjonsmerkmal ist doch — trotz der fachlichen anforderungen an dokumentazjonspflicht und völliger nachvollziehbarkeit des gesamten verwaltungsvorganges mit allen altdaten — ziemlich trivial…)

Kwalitätssoftwäjhr des tages

Vor vielen jahren habe ich mal in einem C++-projekt eine der schlimmsten zeilen kohd gesehen, die ich je gesehen habe (nicht-programmierern ist das nur schwierig zu erklären):

#define private public

Nun, wenn man so etwas in PHP machen will, hat man zwar keinen präprozessor zur verfügung, aber das heißt noch lange nicht, dass man das nicht doch irgendwie machen kann.

Was uns allen… na ja: aber doch einigen… gefehlt hat…

An Open Source reimplementation of Windows PowerShell, for Mono. https://groups.google.com/group/pash-project

Gefällt mir! Leider noch alfa, also noch nicht wirklich empfehlenswert. Ich — als jemand, der es oft mit der bash (und manchmal mit der ollen sh) und praktisch nie mit der powershell zu tun hat — habe mir nicht angeschaut, wie weit die sind und was alles geht. Ein paar lustige bildschirmfotos gibt es schon.

Smartdingens des tages

Gut, im jahr 2005 hatten die werber noch nicht das wort „smart“ erfunden, aber digitaltechnik wurde trotzdem überall verbaut. Zum beispiel in autos. Und dann wurde programmiert, dass man nur froh drüber sein kann, wenn meistens gut gegangen ist. Muss sich ja niemand wegen der mordversuche aus niederen motiven (profitstreben) im industriemaßstab vor irgendeinem gericht verantworten, geht auch niemand hinter schwedische gardinen, also drauf geschissen!

Wer gern englisch liest: der von Fefe verlinkte englische text lehrt erst so richtig das gruseln.

Auch weiterhin viel spaß mit geheimgehaltener softwäjhr irgendwelcher profitorientierter unternehmen, die in allen möglichen geräten wie ein technischer zauber vor sich hinläuft, ohne dass sich irgendjemand gedanken drum macht! Freut ihr euch auch schon so auf das „internetz der dinge“? :mrgreen:

Es ist ja nicht so, dass man sich bei toyota nicht um softwäjhrkwalität bemüht hätte… nur der industriestandard war halt zu aufwändig, zu langsam und zu teuer, und da hat man sich dann halt einen privaten standard ausgedacht:

Toyota substituted its own process, which had little overlap with the industry standard. Even so, Toyota’s programmers often broke their own rules

Kennt ihr die reklame noch? *sing!* „Nichts ist unmöglich… toyota…“ 👿

VW (und rechtsfreier raum) des tages

Wisst ihr eigentlich, warum VW über jahre hinweg mit einen betrug durchgekommen ist, der so dreist ist, dass man sich nicht einmal mehr rausreden kann, wenn man erwischt wird? Das liegt am bananengeschmack in der bimbesrepublik deutschland, der dort aufkommt, wo von der p’litik ganz gezielt „rechtsfreie räume“ geschaffen werden:

Im VW-Skandal um manipulierte Abgaswerte hat der TÜV Nord schwere Vorwürfe gegen die Bundesregierung erhoben. Diese habe den Prüfern auf Drängen der Automobilindustrie untersagt, die Motorsoftware zu untersuchen […] „Wir haben leider gesetzlich keinerlei Möglichkeit, Einblicke in die Motorsteuerung und die dort verbaute Software der Fahrzeuge zu nehmen“

Wegen dieser bedingungen in korruptistan konnte sich die tief in die BRD-p’litik verflochtene organisierte kriminalität namens VW auch ihrer sache so sicher sein.

Ich wünsche euch übrigens auch weiterhin viel spaß mit allen geräten, die mit geheimgehaltener softwäjhr betrieben werden! Und natürlich mit regierungen und parlamenten, die mit ihrem gut geschmierten gestaltungswillen dafür sorgen, dass solche unverschämtheiten wie geheimgehaltene softwäjhr zum gesellschaftlichen standard werden.

Ach ja, apropos korruptistan — das funkzjoniert ja auch besser mit totaler verblödung der menschen, und dazu leistet auch die ARD-tagesschau ihren regelmäßigen beitrag:

Zudem manipulierte der Wolfsburger Konzern auch bei 800.000 Autos die Angaben zum Ausstoß des klimaschädlichen Kohlendioxids

Was die aktuelle kamera der BRD hier mal wieder verschweigt, ist die für käufer von autos vielleicht gar nicht so unwichtige bedeutung dieser angabe. Aber nein, das würde die leute ja zu schlau machen, wenn man ihnen deutlich macht, wie der betrug von VW mitten ins eigene geld reinragt. Ist eben besser fürs geschäft derer, die die BRD-p’litik kaufen, wenn die menschen in der BRD dumm bleiben — und somit fügt sich die verdummung der massen durch das BRD-staatsfernsehen prächtig in die von monströsen, verbrecherischen unternehmen gekaufte BRD-p’litik.

Autostilllegung des tages

Unterdessen erhöht das Kraftfahrtbundesamt (KBA) den Druck auf Volkswagen. Die Behörde habe die Rechtsabteilung von VW schriftlich aufgefordert, bis zum 7. Oktober einen „verbindlichen Maßnahmen- und Zeitplan“ vorzulegen, ob und bis wann die Fahrzeuge ohne Manipulationssoftware die verbindliche Abgas-Verordnung einhalten werden, berichtet die Zeitung.

In einem zweiseitigen Schreiben heiße es, die Behörde sei aufgrund der Rechtslage dazu gezwungen, „die erforderlichen Maßnahmen anzuordnen, um sicherzustellen, dass die hergestellten Fahrzeuge mit dem jeweiligen genehmigten Typ in Übereinstimmung gebracht werden“. Sollte Volkswagen die Aufforderung nicht beachten, könnten die Typengenehmigungen der Wagen entzogen werden. Dann dürften die betroffenen Autos nicht mehr verkauft oder bewegt [!] werden

Na, da würden sich aber alle „freuen“, die einen atmosfärenkonverter von VW gekauft haben! Aber hinstellen darf man ihn noch… sieht ja hübsch aus, wie er da steht und raum einnimmt. :mrgreen:

Aber keine sorge, VW wird schon etwas vorlegen; es ist ja nicht so schwierig, papier zu bedrucken. Ob die das auch einhalten, spielt fürs gestellte ultimatum zunächst keine rolle, und es wäre auch mal etwas völlig neues in der BRD, dass betrug in derartigen ausmaßen irgendeine konsekwenz für die täter hätte. Hier, in der bananigen republik täuschland, werden schließlich betrug, blenderei, hochstapelei und großkriminalität dermaßen kultiviert und allmedial verherrlicht, dass sie geradezu zur bedingung für gesellschaftlichen aufstieg und wirtschaftlichen erfolg geworden sind.

Deshalb kann auch eifrig erklärt (und von der scheißpresse unkommentiert zu den augen und hirnen der leser weitergetragen) werden, dass sich das problem mit einem softwäjhr-update lösen lässt, obwohl jedes mit gewöhnlichen funkzjonsmerkmalen ausgestattete gehirn bemerken sollte, was das für eine bullschittige lüge ist. Denn wenn die hardwäjhr die geforderten werte nicht einhalten konnte und deshalb eine vorsätzlich zu diesem zweck geproggte betrugssoftwäjhr einen falschen eindruck erweckte, dann wird sich das problem nicht in wohlgefallen auflösen, wenn man die betrugssoftwäjhr gegen eine nicht betrügerische softwäjhr austauscht. Allein die tatsache, dass die professjonellen PR-lügner von VW diese dürftige und für jeden durchschnittlich begabten zehnjährigen (so er nicht sohn eines jornalisten ist) durchschaubare lüge versuchen, zeigt, wie sehr man bei VW die intelligenz der eigenen kunden verachtet. Denn wenn das so einfach ginge, dann hätte VW den riskanten betrug mit vorsätzlich zu diesem zweck geschriebener betrugssoftwäjhr gar nicht erst nötig gehabt.

Aber was kümmert sich ein scheißjornalist schon um logik und hirnbenutzung, wenn es um die PR-lügen eines großes werbekunden einer scheißzeitung geht?! Was bin ich froh, dass ich den anfang vom ende der scheißpresse erlebt habe!

Stirb, scheißjornalist, stirb! Verrecke, scheißverleger, verrecke!

Bundesagentur für armut des tages

Wenn ihr jemals was mit einem jobcenter zu tun haben solltet…

BA-Mitarbeiter und Kunden berichten, dass es nach den üblicherweise am Wochenende eingespielten Updates regelmäßig zu Störungen kommt, wenn auch nicht so schweren wie in der vergangenen Woche

…dann akzeptiert am besten nur termine von mittwoch bis freitag. :mrgreen:

Prof. dr. Offensichtlich

Prof. dr. Offensichtlich sitzt gerade in der karl-wiechert-allee und hats da rausgekriegt: den leuten wird unfertige und oft unbrauchbare bananensoftwäjhr zum preis einer vollversjon verkauft. Jetzt muss prof. dr. Offensichtlich nur noch bemerken, dass das nicht nur für spiele gilt, sondern seit etlichen jahren für beinahe alle softwäjhr von so ziemlich jeder klitsche, die vom softwäjhr-verkauf lebt.

Ach, geht nicht, weils nicht zu den reklame-partnerschaften von heise passt? Schon gut, ich habs ja verstanden…

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.

Warum ich die libc hasse!

Nachtrag: ja, die überschrift ist ein „bisschen“ irreführend, und ich meine die glibc. Aber die hasse ich wirklich jeden tag ein bisschen mehr.

Ja, ich weiß, das ist jetzt ein ziemliches friek-tema. Aber ich hasse die normale libc (und könnte Fefe unentwegt für seine dietlibc küssen) und möchte mir unbedingt mal das bisschen luft verschaffen.

Das ich die glibc hasse, liegt daran, dass ich mein eigenes c-gehäcksel manchmal statisch binde, also keine shared libraries verwende, sondern ein binary haben möchte, das ich „einfach so“ auf einem anderen rechner verwenden kann. Ich sitze an ständig wexelnden geräten, und ich habe auch nicht überall eine entwicklungsumgebung zur verfügung oder die erforderlichen rechte, nach belieben softwäjhr nachzuinstallieren — einmal ganz davon abgesehen, dass ich die installazjon eines laufenden sörvers nur anfasse, wenn es gar nicht anders geht. Da ist es für mich oft das günstigste — meine eigenen, unentbehrlichen tuhls habe ich auf einer speicherkarte ständig bei mir — wenn ich ein binary habe, dass ich auch starten kann, selbst wenn bestimmte shared libraries nicht installiert sind. Die meisten libraries, die ich verwende, sind relativ klein, so dass dieses „vergnügen“ nicht zu „teuer“ wird.

Bis auf diese verdammte libc! Machen sich heutige programmierer eigentlich gar keine mühe mehr, bloatware zu vermeiden?

Nehmen wir einmal ein beispiel. Der folgende, sehr schlichte „programm“ ist eine kleine abwandlung eines klassischen lehrbuchbeispiels.

#include <stdio.h>
#include <stdlib.h>

int
main (int argc, char **argv)
{
  const char *s = "Hallo Welt";
  puts (s);
  return EXIT_SUCCESS;
}

Speichern wir es einmal unter dem namen hello.c. Wenn dieses programm mit der anweisung…

cc -s -Os hello.c -o hello

…kompiliert wird (-Os optimiert den erzeugten kohd auf geringe dateigröße, und -s entfernt die symboltabelle und andere für die lauffähigkeit nicht benötigte verwaltungsinformationen vom erzeugten binary), denn ist das ergebnis ja noch durchaus plausibel, wie ein anschließender ls -l verrät:

-rwxr-xr-x 1 elias elias 5652 2010-11-05 18:51 hello
-rw-r--r-- 1 elias elias  145 2010-11-05 18:29 hello.c

Fünfeinhalb kilobyte für eine schlichte textausgabe ist zwar ein bisschen mehr, als man von „einfachen“ betriebssystemen gewohnt ist, aber der startup code für so einen aufgeplusterten pinguin ist ja auch nicht trivial.

Die für die ausgabe verwendete funkzjon puts — ich habe für dieses beispiel mit absicht nicht printf verwendet, weil printf eine menge weiteren kohd benötigt, um die im formatstring angegebenen formate zu interpretieren — sollte relativ einfach implementiert sein, vielleicht ungefähr so¹:

/* Einfache beispielimplentazjon der standard-funkzjon puts */
int
puts (const char *s)
{
  register int c, n;
  for (n = 0; putchar ((c = *s) == 0 ? '\n' : c) >= 0 && c != 0; ++s, ++n)
    ;
  return ferror (stdout) ? EOF : n;
}

Nichts ist darin, was ehrfurchtgebietende komplexität erwarten lässt. Dieses ferror sollte einfach nur ein fehlerbit im FILE *stdout prüfen und im fehlerfall eventuell errno setzen und einen wert ungleich 0 zurückgeben; und dieses putchar ist ein makro, das ein zeichen an einen ausgabebuffer anfügt, einen index für die näxste bufferposizjon erhöht und gegebenenfalls den buffer mit write wegschreibt und anschließend den index für die näxte zeichenposizjon zurücksetzt. Ich könnte hier jetzt auf die schnelle ein beispiel angeben, wie man so etwas als makro implementieren kann, aber das würde durch die schwer lesbare verschachtelung einiger ?-operatoren (buffer voll? zeilenbufferung?) nicht gerade deutlicher als die verbale beschreibung, und deshalb lasse ich es.

Kurz gesagt: Es ist zu erwarten, dass diese puts-funkzjon nicht wesentlich mehr als — sagen wir einmal — 1000 bytes objektkohd erzeugt. Sie ist völlig trivial. Eine dereferenzierung, ein test auf das nullbyte am stringende und ein verhältnismäßig einfaches makro bilden die innere schleife, am ende wird der rückgabewert durch einen bit-test ermittelt, damit fehler an den aufrufenden kontext gemeldet werden können. Als zusätzlicher kohd kommen die vier bytes für die globale variable int errno hinzu und natürlich die funkzjon write für die native, ungebufferte ausgabe, die direkt an den kernel weitergeleitet werden sollte (natürlich wird auch hier anschließend errno gesetzt, wenn ein fehler auftrat — aber auch das sind auch nur eine handvoll bedingungen).

Nun, bei der libc, die mit einem normalen GNU/linux-system (in diesem fall eine debian-distribution) daher kommt, sieht das offenbar ein bisschen anders aus. Mit dem folgenden aufruf…

cc -s -Os -static hello.c -o hello

…kann man eine statisch gebundene versjon dieses schlichten hallo-welt-programmes erzeugen, das völlig bewusst so formuliert wurde, dass es nur eine triviale und den kohd nicht aufblähende funkzjion verwendet. Ein anschließendes ls -lh lässt einem die kinnlade herunterklappen und bei empfindlichem magen den mageninhalt nach oben steigen:

-rwxr-xr-x 1 elias elias  510K 2010-11-05 21:34 hello
-rw-r--r-- 1 elias elias   145 2010-11-05 18:29 hello.c

WTHF! 510 KiB für das dazulinken von ansich völlig trivialem kohd ist doch eine menge holz. 😦

Den blick in die (nicht gerade schnell erfassbaren) kwelltexte der libc, um diesem bloat auf die spur zu kommen, erspare ich mir mal. Stattdessen hier eine schnellere und schlampigere analyse, die auch schon erschüttert:

Lässt man die opzjon -s beim kompeiler-aufruf einmal weg, um die symboltabelle im binary zu belassen, kann man sich hinterher mit nm -g hello | awk '$2 == "T"' anschauen, welche symbole in der kohd-sekzjon des kompilates enthalten sind; und das zeigt wiederum, welche funkzjonen der linker dazugebunden hat, weil sie von der einzigen verwendeten funkzjon puts verwendet werden. Wer jetzt meint, dass sich seit den siebziger jahren doch einiges in sachen komplexität einer standard-ein-ausgabe getan haben könnte und dass die implementazjon von puts vor allem deshalb „ein bisschen“ fett geworden ist, der kann mir bitte einmal erklären, warum (unter anderem, denn ich nenne hier nur einige besonders absurde beispiele) die folgenden funkzjonen für die schlichte ausgabe einer nullterminierten zeichenkette benötigt werden sollten:

  • bsearch
    Wozu zum abgehackten pimmel nochmal benötigt die libc dafür eine binäre suche? Selbst beim wildesten spekulieren fällt mir kein grund ein, warum die benötigt werden sollte.
  • dprintf
    Hui, den printf für die direkte ausgabe in dateideskriptoren, den sieht man wirklich selten in „echtem“ kohd…
  • fprintf
    Haben die beim häcken der libc etwa die triviale standardfunkzjon puts (s) mit einem printf ("%s\n", s) implementiert? Das würde den ganzen bloat ja erklären. Aber es wäre auch so gnadenlos dumm, dass einem nichts mehr dazu einfällt.
  • localtime
    Was zum schwefelkackenden höllenhund?!?!
  • open_memstream
    Wozu soll hier eine ein-/ausgabe in einen speicherbereich benötigt werden? Die puts-funkzjon ist trivial und bedarf derartiger abstrakzjonen des stream-konzeptes nicht.
  • qsort
    OMFG! Was soll bei diesem einfachen vorgang bitte durchsortiert werden!?
  • setlocale
    Soll da etwa die ausgabe von einzelzeichen in einem stream an die landeseinstellungen angepasst werden?
  • sscanf
    Mir fehlen die passenden derben worte, um dazu noch etwas sagen zu können. m(

Wie gesagt, dass alles für die ausgabe einer nulltermierten Zeichenkette nach stdout.

Diese allgemein bekannten funkzjonen werden natürlich ergänzt um einen wust von internen funkzjonen, mit denen diese standards implementiert werden. Es ist einfach unfassbar. Wer immer an der libc herumprogrammiert hat, er schien sich gesagt zu haben, dass ruhig ein anständiger bloat entstehen kann, sein kompjuter hat ja kein problem damit. Und deshalb wurde jede disziplin abgelegt und man hat sich allgemein einen dreck darum geschert, ob bloat entsteht oder nicht. Und die meisten programmierer, die so einen dreckskohd nutzen, merken es niemals, weil ja der ganze bloat schön in einer dynamischen bibliotek versteckt bleibt und nicht die größe des binary aufbläht. Dass es speicher frisst und auf die performanz geht, drauf geschissen! Dass bei einer zentralen bibliotek wie der libc jedes einzelne programm von diesem bloat betroffen ist, dass es also eine last für das gesamte system wird, drauf geschissen! Sorgfalt und sparsamkeit waren gestern, lasset uns gewaltige mengen RAM voraussetzen und überall, wo dieses nicht wie vorausgesetzt vorhanden ist die platten auf die auslagerungspartizjon kratzen und gebet der CPU extrafette brocken kohd für die erfüllung noch der simpelsten und elementarsten aufgaben! Denn das ist die neue zeit, sie ist schäbig, verantwortungslos und schlecht und „erfreut“ zum ausgleich für die kwalitativen missstände im kernsystem mit polierten und effektheischenden benutzerschnittstellen zur verpackung dieser scheiße. So hat man doch etwas zum „freuen“, wenn man von ein paar billigen effekten unterhalten wird, während man sich fragt, warum trotz aller technischen fortschritte der letzten zehn jahre die trägheit der anwendungen gleich geblieben oder gar schlimmer geworden ist.

Und das — so viel noch zum ende — ist leider auch im bereich der freien softwäjhr symptomatisch für die entwicklung in den letzten anderthalb jahrzehnten. Früher einmal habe ich linux geschätzt, weil kompjuter — auch etwas betagtere — viel zu schade zum wegwerfen sind und weil ich eine menge guter softwäjhr auch auf „uralten trümmern“ einsetzen konnte. Inzwischen ist dort in der softwäjhr-entwicklung allerdings der gleiche gleichgültige irrsinn eingekehrt, der auch so prägend für alle anderen plattformen ist. Manchmal hasse ich das alles nur noch!

Die verwendung „moderner konzepte“ macht das ganze noch schlimmer. Wenn man das oben gegebene beispielprogramm einmal zeile für zeile in die hochgejubelte und für beinahe alle „modernen“ projekte verwendete bloatware-sprache c++ überträgt…

#include <iostream>
#include <cstdlib>

int
main (int argc, char **argv)
{
  std::string s("Hallo Welt!");
  std::cout << s << std::endl;
  return EXIT_SUCCESS;
}

…unter dem namen hello.c++ speichert und schnell mit…

c++ -Os -s -static hello.c++ -o hello++

…kompiliert, denn zeigt einem nicht nur die sehr spürbar gewordene wartezeit, die der kompeiler nun benötigt, um sich von diesen recht lächerlichen neun eingabezeilen zu „erholen“, dass hier noch etwas viel schlimmeres geschieht. Auch das anschließende ls -lh ist erschröcklich:

-rwxr-xr-x 1 elias elias 1006K 2010-11-05 21:05 hello++
-rw-r--r-- 1 elias elias   163 2010-11-05 21:09 hello.c++

Dass nach der übersetzung eines lehrbuchmäßig einfachen nullprogrammes nahezu ein MiB kohd benötigt werden soll, nur, um eine kurze zeichenkette in einer std::string-instanz abzulegen und diese zur standardausgabe zu schreiben, das ist wirklich pathologisch. Hier ist der bloat fest ins grundsystem und in die entwicklungswerkzeuge eingebaut, und er „vererbt“ sich von dort auf das gesamte system. Wer sich beim starten eines anwendungsprogrammes wie etwa des beliebten brausers firefox darüber wundert, warum so eine anwendung, die eigentlich nur ein bisschen netzwerkverkehr macht und HTML-dokumente in ein fenster rendert (eventuell ergänzt um den start von plugins, wenn die dargestellte webseit derartige objekte enthält), dafür so viele megabyte speicher belegt, der hat hier einen teil der antwort.

Und wer einen alten, ansich noch funkzjonsfähigen und dienstbaren rechner hat, auf dem sich die „moderneren“ anwendungen gar nicht mehr verwenden lassen; wer sich mit einem derartigen gerät im internetz bewegen will (was ja keine absurde anforderung ist, und was ansich auch keine riesigen ressorßen erfordert)², der ist genötigt, entweder alte, unsichere und in allen ihren bekannten fehlern ausbeutbare softwäjhr zu verwenden (Bog bewahre!), oder aber seinen alten, ansich noch funkzjonfähigen und dienstbaren rechner als sondermüll zu entsorgen und sich einen neuen rechner zu verschaffen.

Und draußen, vor den städten, wäxt das eigentliche monument unserer „zivilisation“: der müllberg. Was die kompjuter darin zu müll gemacht hat, ist allerdings müllsoftwäjhr.

Ach ja, bevor ich es vergesse: das kompilat der hallo.c gegen die dietlibc gelinkt hat bei mir eine dateigröße von 1004 bytes. Es tut das gleiche wie der megabytefette c++-kohd.

¹In wirklichkeit wird puts (s) wohl meist ein makro sein, das fputs (s, stdin) aufruft, aber die implementazjon von fputs ist auch nicht schwieriger. Ich habe das beispiel einfach gehalten, damit die primitivität einer derartigen funkzjon besser sichtbar wird, in einer realen implementazjon einer derartigen library wird ein gewisses augenmerk darauf gelegt werden, keinen kohd zu duplizieren, um sich keine alpträume bei der pflege zu bereiten. Die gleiche betrachtung gilt auch für das putchar-makro, das im regelfall mithilfe des fputc-makros implementiert werden wird.

²Natürlich gibt es immernoch pine und lynx

Guhgell will telefonate dolmetschen…

Ich finde es ja ganz „toll“, dass guhgell demnächst eine softwäjhr für händis auf den markt schleudern will, die sprache in echtzeit übersetzen kann. Wenn ich nur daran denke, dass die kwalität dieser übersetzungen ungefähr so hoch sein wird, wie es die guhgell-übersetzung heute im internetz ist. Bevor man sich mit diesem gestammel herumschlägt, sollte man doch besser endlich einmal auf die idee kommen, eine gut entworfene und alltagstaugliche plansprache auf der ganzen welt zu lehren — an stelle des jetzigen englischen. Esperanto war schon ein schritt in die richtige richtung, ist aber leider in der gegenwärtigen form zu europa-zentriert in seinem fonehm-vorrat.

Ach, und übrigens: Was es bedeutet, wenn eine guhgell-softwäjhr ein telefongespräch so richtig unmittelbar in eine andere sprache überträgt, das wisst ihr ja. Es bedeutet, dass die klänge der sprache irgendwo bei guhgell zwischendurch in leicht verarbeitbarer textform vorliegen und möglicherweise (ja, beinahe sicher) langfristig dort gespeichert werden. Wer diesen scheiß benutzt, kann sich auch gleich eine wanze ins telefon bauen. Der nächste schritt zur totalen orwellness des internet wird vorbereitet.

Wie gesagt, esperanto war ein schritt in die richtige richtung.

Überraschung des tages

Na, wer hätte das gedacht? Gut, dass doktor offensichtlich ein bisschen wisschenschaft betreibt, sonst würde das niemals jemand erfahren! Nicht nur, dass die softwäjhr erstellenden unternehmen rasend schnell ihre unfertige strokelware auf den markt schmeißen müssen, nein, da bemerkt in einer umfrage auch mehr als die hälfte der befragen, dass das auf die kwaltität der strokelware geht. Und oh riesiges wunder! Auch sagt mehr als die hälfte, dass die mängel erst nach inbetriebnahme entdeckt würden. Na, wie sollten sie auch vorher entdeckt werden? Zumindest in meiner zeit als anwendungsentwickler gab es niemals so etwas wie eine kwalitätssicherung mit definierten testfällen. Das kostet doch nur geld, wenn man programmierer mit so etwas beschäftigt, und es ist doch besser, wenn man möglichst viele stunden von kunden bezahlen lässt, und zwar so richtig fett teuer. Auch, wenn man da nur azubis ein paar blöde windohs-anwendungen zusammenklickern lässt, ohne aufsicht, hilfestellung oder auch nur überprüfung ihres strunzkohds. Nimmt ja nur der staat (in diesem fall das land niedersachsen) ab. Oder, wie es der scheff zu sagen pflegte: staatsgeld ist dummes geld.

Manchmal hätte ich lust, ein buch über alles erlebte zu schreiben. Titel: die softwäjhr-lüge… 😉

MAME history.dat lesen

Und heute mal wieder ein kleines skript, welches wohl der größte teil der menschheit überflüssig wie einen kropf finden wird. Wer MAME unter windohs benutzt, der hat meist ein gutes frontend und kann die texte in der history.dat komfortabel lesen. Und auch die meisten linuxer werden MAME wohl mit einem frontend benutzen und eine entsprechende möglichkeit haben. (Letzteres weiß ich allerdings nicht so genau, da ich eben kein MAME-frontend benutze.) Nur ich bin wie immer ein wackerer streiter an der kommandozeile und tippe lieber in einer komfortablen bash herum, bevor ich zur maus greife.

Deshalb hatte ich ein leichtes bedürfnis, mir ein kleines programm zu schreiben, das mir gewünschte informationen aus der history.dat an der kommandozeile verfügbar macht. Weil es (in dieser form) ein programm für einen eher engen anwenderkreis ist, ist es ein flüchtiger häck geblieben. Wie beinahe alle meine flüchtigen häcks habe ich das schnell in Python gemacht. Das program setzt übrigens kein installiertes MAME voraus, kann also auch allein mit der history.dat verwendet werden, um informatzjonen zu einer vielzahl von älteren arcarde-spielen schnell zur hand zu haben.


import sys
import os
import re
import locale
from codecs import EncodedFile
from formatter import AbstractFormatter, DumbWriter
from subprocess import Popen, PIPE

locale.setlocale(locale.LC_ALL, "")

PAGER = os.getenv("PAGER", "less")
DATFILE = os.getenv("HISTORYDAT", "/usr/share/games/xmame/history.dat")
LOCALENC = locale.getpreferredencoding()

if len(sys.argv)  2:
    exit("Too many arguments")
else:
    term = sys.argv[1]

inf_re = re.compile(r"\$info\=([0-9a-z]*)", re.I)
bio_re = re.compile(r"\$bio", re.I)
end_re = re.compile(r"\$end", re.I)

state = 0
hfh = open(DATFILE, "rU")
pro = None
of = None
af = None

for line in hfh:
    if state == 0:
        m = inf_re.match(line)
        if m:
            found = m.group(1)
            games = found.split(",")
            if term in games:
                state = 1
    elif state == 1:
        if bio_re.match(line):
            state = 2
            pro = Popen(PAGER, stdin=PIPE, shell=True)
            of = EncodedFile(pro.stdin, "iso-8859-1", LOCALENC)
            af = AbstractFormatter(DumbWriter(of))
    elif state == 2:
        if end_re.match(line):
            break
        line = line.strip()
        if len(line) == 0:
            af.end_paragraph(1)
        else:
            af.add_flowing_data(line)

if pro:
    of.close()
    pro.wait()
else:
    sys.exit("No %s in the history.dat\n" % (term,))

Wie man das mit den beiden variablen PAGER und DATFILE an die eigene arbeitsumgebung anpasst, beschreibe ich hier nicht weiter — und wohl jeder an dieses skript interessierte wird wohl wissen, wie man eine umgebungsvariable in seiner lieblingsshell definiert. Dieses skript einfach irgendwo in den $PATH legen, ausführbar machen und mit dem ROM-namen als parameter aufrufen.

Eine neue leiste und alte schmerzen

Und ganz plötzlich hat man hier bei WordPress.com eine neue leiste über den seiten, wenn man angemeldet ist.

Sah die rechte seite dieser leiste vormals so aus (das „Dashboard“ ist im plural, weil ich hier mehrere blogs habe):

Alte versjon der leiste

was ja schon recht nützlich war, so wird man jetzt — wenn man einen gravatar an seine mäjhladresse gebunden hat — jedesmal daran erinnert…

Die neue steuerleiste bei wordpress.com

…wie man selbst aussieht. Das ist unglaublich praktisch, wenn man mal gerade keinen spiegel zur hand hat, allerdings ist das bild als hilfe bei der rasur oder beim kämmen zu klein und bei weitem nicht aktuell genug. :mrgreen:

Diese kleinigkeit in der neuen steuerleiste ist also völlig sinnentleert, ist nur etwas zucker für die augen — als ob wördpress in den aktuellen versjonen damit gegeizt hätte! Etwas nutzbringender könnte da sein, was neuerdings auf der rechten seite der gleichen leiste prangt:

Blogsuche bei WordPress.com in der neuen steuerleiste...

Da bleibt nur zu hoffen, dass die globale suche über alle blogs bei WordPress.com etwas brauchbarer programmiert ist als die suche in einem einzelnen blog. Wenn man einen einzelnen blog nämlich nach „rabe“ durchsucht, findet man neben „kolkrabe“ (zufällig mal gut!) auch „rabenschrey“, „graben“ oder „brabeck“ (mies!) und damit so ziemlich jeden beitrag, in dem diese vier buchstaben vorkommen. Dabei müssen diese vier buchstaben noch nicht einmal sichtbar sein, es reicht auch, wenn sie im dateipfad eines einbetteten fotos oder in einem link vorkommen (ganz ganz mies!). Und was bei dieser mies gemachten suche gefunden wird, das wird nicht etwa irgendwie nach relevanz oder verlinkung oder kommentarzahl oder beliebtheit oder einem anderen für den suchenden menschen nützlichen kriterjum sortiert, sondern schlicht kronologisch absteigend (unbrauchbar!). Damit diese „suchfunkzjon“, die offenbar keine „findfunkzjon“ sein soll, wirklich völlig nutzlos bleibt, gibt es keine möglichkeit einer verfeinerten suche mit zusätzlichen kriterien wie einem zeitlichen bereich, einer blog-kategorie oder zusätzlichen angaben.

Ich habe mich schon mehr als einmal darin wiedergefunden, dass ich einen eigenen beitrag in einem wördpress-blog mit guhgell gesucht habe. Das kann doch nicht der sinn einer internen suchfunkzjon sein! Es ist einfach nur schlecht.

Meiner meinung nach wären die wördpress-entwickler gut beraten, wenn sie sich einmal gedanken um die grundfunkzjonen eines blogs und ihren nutzen für autoren und leser machten, statt immer nur funkzjonen hinzuzufügen, die nur von einer minderheit gebraucht oder gewünscht werden und genausogut in ein plackinn gepasst hätten. Was nützt mir eine komplette versjonsgeschichte eines alten artikels, wenn ich diesen kaum wieder auffinden kann.

Aber nein, man wird stattdessen von den entwicklern nach „media features“ für die näxte versjon von wördpress gefragt… 😦

Sandkasten-softwäjhr

Ich finde es eine richtige entscheidung, dass zukünftige versjonen der großen meikrosoft-programme in einer so genannten „sandbox“ laufen sollen. Ich wusste schon in der mitte der neunziger jahre aus der schlichten erfahrung besserer softwäjhr, dass dieses büro-paket von meikrosoft (vielleicht vom wirklich vielfach nützlichen excel einmal abgesehen) ein großes buntes spielzeug ist, und finde es total passend, dass es jetzt im sandkasten betrieben werden soll. Das passt auch zu den leuten, die animationen in eine textverarbeitung einfügen können wollen… :mrgreen: