Die dicke Bärta

Nun haben wir erfolgreich unser Gefährt gegen ein neues getauscht. Das ging zwar ganz gut, aber ich habe trotzdem wieder eine Menge dabei gelernt. Hier sind so ein paar Punkte, die man nicht übersehen sollte. Manchmal vielleicht trivial, aber trotzdem:

  • Beim ADAC gibt es eine Gebrauchtwagenseite, bei der man unter Angabe von Eckdaten wie Typ, Baujahr und Kilometerleistung einen über den Daumen gepeilten Richtpreis erhält.
  • Die Ausstattung spielt eine große Rolle bei der Preisgestaltung. Hier geht es bis zu etwa 15%.
  • Taugen die Reifen noch was (Winterreifen? Ersatzrad?)
  • Unbehandelte Roststellen? Kriech, kriech, fress, fress.
  • Sind Kotflügelteile verschoben/nicht mehr bündig? Deutet auf einen Unfall hin. Mein erster Versuch sah (auf den zweiten dritten Blick) aus, als wäre es bereits auf jede Seite mal gefallen.
  • Werkstattbuch vorhanden? Werkstatteintragungen plausibel (Tachostand?)
  • Vorbesitzer? Anzahl, Alter, Fahrstil?

Ich kann nur jedem empfehlen, wenn man sich (so wie ich) mit KfZ nicht besonders gut auskennt: Vor dem Kauf das gute Stück in eine Werkstatt bringen und ab auf die Bühne damit, den Meister mal drunterschauen lassen. Die Jungs bei mir auf der Ecke sind so nett, die machen das einfach so. Da müßte jetzt noch ein Link hin aber die Kerle haben nicht mal eine Webseite.

VVS(childa)

Der Stuttgarter Verkehrsverbund hat seine alten Fahrkartenautomaten an unserem Bahnhof abgebaut. Inzwischen gibt es nur noch die bahneinheitlichen Automaten, an denen man jetzt auch Verbundtickets bekommt. Während eine derartige Vereinheitlichung sicherlich aus betriebswirtschaftlicher Sicht Vorteile bringt, hat der geneigte Kunde bisher nicht viel Freude damit. Gut, man kann inzwischen auch mit Karte zahlen, aber dafür dauert das Lösen eines Fahrscheins nun doppelt so lang. Die Touchscreens reagieren manchmal nur auf grobe physische Gewalt und die logische Verschachtelung der Menüs überfordert selbst gestandene Bahnfahrer. Heute morgen bildeten sich jedenfalls lange Schlangen von Menschen, die allenthalben zynisches Gelächter ausstießen.
Die von mir beliebt gewählte Mehrfahrtenkarte schoß dann aber den Vogel ab: Der Ausdruck kommt im Breitformat heraus, mit den Abschnitten jeweils nebeneinander. Äh, wie soll das bitteschön in den Entwerter passen? Man muß den Zipfel also ersteinmal der Länge nach falten und zwar ganz gerade, sonst bleibt das Teil stecken. Hier wird also keine Gelegenheit ausgelassen sich lächerlich zu machen. Das Ergebnis:

  • Zähneknirschen bei den Bahnfahrern, die wegen des Beförderungsmonopols diesen Quatsch mitmachen müssen.
  • Süffisante Bestätigung für alle Autofahrer die ausnahmsweise mal Bahn fahren, daß es eine Zumutung ist die bereits vor dem Einsteigen in den verspäteten Zug beginnt.

Geld her

Wir kennen unsere eigene gruslige Staatsverschuldung. Sie liegt derzeit irgendwo in der Nähe von 1.5 Billionen Euro. Juju, richtig viel Geld. Das ist allerdings ein Pups im Vergleich mit den Amerikanern.. die bewegen sich langsam auf die 8.5 Billionen Dollar Marke zu. Dieser Artikel liefert eine gute Übersicht / Zusammenfassung. Nur wird es die Amerikaner vermutlich wesentlich härter treffen, da sie - kaum zu glauben - noch konsumorientierter leben als wir. Das Bizarre an der Sache ist daß die USA im wesentlichen fremdfinanziert sind. Investoren vor allem aus Fernost haben dort ihr Geld gelassen (das sie vermutlich nie wiedersehen). Also leben da 200 Millionen Budweiser Light Trinker in ständiger Bedrohung, daß die Herrschaften irgendwann einmal hergehen könnten und ihre Gewinne(?) realisieren.
Wenn wir schon beim Zahlen sind - der Rundfunkgebührenzahler hat auch eine eigene Webseite. Tipps wie man sich die Jungs vom Hals hält findet man dort im Forum. Außerdem erheiternd: Die eine oder andere Schauergeschichte von echten Erlebnissen mit den Brüdern von der GEZ.

Sortierbare Spalten

Diesmal ein eher technischer Eintrag, dessen Zweck eher eigene Gedankenstütze als öffentliche Erheiterung ist. Hoffe ich zumindest.

Im .NET Framework 2.0 gibt es zusätzlich zum bekannten DataGrid Steuerelement das neue DataGridView. Dessen Fähigkeiten wurden gegenüber dem Vorgänger stark erweitert, so daß es inzwischen nur noch Sekunden dauert, um eine Datenquelle über ADO oder eine eigene Implementierung an die Tabelle anzuschließen. Das Ding bringt bereits nette Fähigkeiten mit, z.B. die Spalten umzuordnen. Die Spalten allerdings (durch einen Klick auf den Spaltenkopf) automatisch umzusortieren ist leider nicht so einfach, wie es zunächst aussieht. Das Sortieren der Datenquelle funktioniert nur dann problemlos, wenn ein Datagrid bzw. ein Dataview angebunden ist. Kommen die Daten direkt aus der Datenbank ist das auch kein Problem. Hat man jedoch die anzuzeigenden Objekte woanders her, z.B. aus einer Liste, funktioniert das leider nicht mehr. Die Liste weiß nicht, nach welchen Kriterien sie sortieren soll. Die Lösung besteht darin, eine eigene Listenimplementierung einzuführen, die von der ursprünglichen Liste erbt und zusätzlich IBindingList implementiert.

public void ApplySort(PropertyDescriptor property, ListSortDirection direction)
{
Trace.WriteLine(string.Format("sorting column {0}",property.DisplayName));
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(AISShip));
this.sortProperty = properties.Find(property.DisplayName, true);
this.Sort(this.Comparison);
this.OnListChanged(resetEvent);
}

Diese Methode ist ein Teil der Implementierung von IBindingList. Sie wird beim Sortieren der Liste implizit (vom DataGridView durch ein callback) aufgerufen. Das spaltenrelevante Sortieren habe ich so gelöst, daß die entsprechende Spalte lokal gespeichert wird und die Suchfunktion mit einem Vergleichs-Delegaten aufgerufen wird. Das wirkt etwas ungewöhnlich, es ist auch eine Neuerung in .NET 2.0.
Die eigentliche Vergleichsfunktion sieht etwas lahmarschig aus, man hätte hier sicher noch eleganter mit Reflection arbeiten können (wenn auch weniger performant):

protected int Comparison(AISShip a, AISShip b)
{
if (this.sortProperty.Name.Equals("Timestamp"))
return a.Timestamp.CompareTo(b.Timestamp);
if (this.sortProperty.Name.Equals("Name"))
return a.Name.CompareTo(b.Name);
if (this.sortProperty.Name.Equals("Callsign"))
return a.Callsign.CompareTo(b.Callsign);
if (this.sortProperty.Name.Equals("IMO"))
return a.IMO.CompareTo(b.IMO);
// usw.
return 0;
}

Eine weitere Verbesserung kann man noch einbauen, wenn man sich beim Suchen außerdem die letzte Sortierrichtung merkt und diese dann umdreht, falls sich die Spalte nicht geändert hat. Damit erreicht man dann das typische Verhalten, daß der Benutzer aus dem Windows Explorer her kennt.

Osterei

War das nun schon Wallers letzter Gang? Ich hoffe nicht. Sah aber nicht gut aus. Der Kerl vom ADAC erzählte was von einem defekten Kupplungsgeber, ich kann leider keine Expertise dazu beisteuern. Kann man sich so ein Glück vorstellen? Da fährt Madame das Ding quer durch die Republik fast 1000km auf der Autobahn, und wo streckt er die Federn? 2km weg von zuhaus auf dem Supermarktparkplatz.

Keinen Durst mehr

Klaas Huizing, "Der Buchtrinker" https://www.puls200.de/wp-content/plugins/Sterne/img/icon-rating-star_f_blue.gifhttps://www.puls200.de/wp-content/plugins/Sterne/img/icon-rating-star_n_blue.gifhttps://www.puls200.de/wp-content/plugins/Sterne/img/icon-rating-star_n_blue.gifhttps://www.puls200.de/wp-content/plugins/Sterne/img/icon-rating-star_n_blue.gifhttps://www.puls200.de/wp-content/plugins/Sterne/img/icon-rating-star_n_blue.gif

Wieder so ein Fall. Im zweiten Anlauf habe ich dieses Büchlein geschafft. Leider kann ich über den Inhalt nicht viel mehr wiedergeben als auf dem Klappentext steht. Deswegen lass ich es lieber. Es ist zwar klein und hat nicht viele Seiten, doch scheint es mir intellektuell haushoch überlegen zu sein. Ob das nun wirklich so ist oder nur Eindruck geschunden wurde kann ich nicht sagen. Es sind durchaus nette Ideen eingebaut. Seitenweise ist es z.B. zweispaltig, parallel werden zwei Varianten einer Geschichte erzählt. Oder ein Abschnitt wird mehrfach umformuliert und bei jeder Version wird ein weiterer Buchstabe weggelassen. Ein paar Botschaften im Morsecode. Das klingt ein bißchen nach einer schriftstellerischen Programmierübung und ist es vielleicht auch. Dadurch gewinnt man bei mir zwar Sympathiepunkte, eine durchgängig lesbare Geschichte (oder gar die Bezeichnung "Roman") auf dem Titelblatt ist damit aber noch nicht gewonnen. Dabei ist der Autor durchaus nicht unbegabt, was er in einzelnen "Bildern", erzählerischen Einstellungen könnte man sagen gut demonstriert. An diesen Stellen schafft er es, mit wirklich wenigen Sätzen eine vollständige Vorstellung einer Szenerie zu erwecken, durchaus keine einfache Sache. Daß der Autor leider auch beliebt, "von der Seite" reinzusabbeln macht es nicht viel unterhaltsamer. Es nervt eher. Daher bleibt es leider bei einem Experiment, daß ich nur den härtesten Deutsch-LK'lern ans Herz legen will.

Speicherhunger

Wir haben ein Speicherleck! (oder doch nicht?) Konkreter Fall: Der Kunde meldet sich und beschwert sich über den exorbitanten Speicherverbrauch der Anwendung. Beigelegt hat er einen Screenshot vom Task Manager.

Was wird eigentlich im Task Manager angezeigt?

Der Task Manager zeigt die sog. "Working size" des Prozesses an. Dies bezeichnet den derzeit real (physikalisch) allokierten Speicher der Anwendung. Dieser "Speicherverbrauch" ist aber aus folgenden Gründen irreführend und sollte nicht (oder nur als grober Anhaltspunkt) für die Performance der Anwendung herangezogen werden:

  • Der Speicher wird von Windows gemäß der Priorisierung allokiert. Minimiert man die Anwendung, kann man sofort sehen wie der Speicherverbrauch zurückgeht.
  • .NET Anwendungen laufen in einer sog. "Sandbox", der .NET Runtime Umgebung. Diese ist auch in der angegebenen Speichermenge enthalten. Die eigentliche Anwendung macht also nur einen Teil dieses Speicherverbrauchs aus.
  • Laufen mehrere .NET Anwendungen gleichzeitig, können diese Teile der .NET Runtime Umgebung gemeinsam nutzen.

Ein besserer Anhaltspunkt für den Speicherverbrauch sind die sog. "private bytes". Dies bezeichnet die Menge an Speicher, die von der Anwendung nicht mit anderen Anwendungen geteilt werden kann. Der Task Manager kann diese jedoch nicht anzeigen. (Das gelingt jedoch mit dem ProcessExplorer oder perfmon (Start -> Ausführen -> Perfmon). Diese Zahl ist jedoch auch mit Vorsicht zu genießen: Sie bezeichnet sowohl aktiven als auch ausgelagerten (paged) Speicher, d.h. Hauptspeicheranteile, die aufgrund von Inaktivität auf die Festplatte ausgelagert wurden. Steigen die "private bytes" im Laufe der Zeit immer weiter an, ist ein Speicherleck vorhanden. Dies muß jedoch über einen langen Zeitraum beobachtet werden, da die Speicherverwaltung von der .NET Runtime durchgeführt wird und es teilweise recht lange dauert, bis Objekte wieder freigegeben werden (besonders wenn sie ausgelagert sind).

Die Kunden müssen weiterhin zu Fuß gehen

Nach meinem letzten Versuch dachte ich mir, ich gebe mal dem anderen Fahrradgeschäft am Ort eine Chance, diesmal bei der Bestellung einer neuen Felge. Dort lief es allerdings nicht viel besser: In einem netten Gespräch vergangenen Samstag sagte man mir, das betreffende Teil wäre nicht vorrätig aber spätestens am nächsten Freitag im Laden. Naja, in den Tagen der modernen Amazon-Logistik schon eher länger aber ich dachte ok warum nicht. Jetzt komme ich heute hin, wieder am Samstag. Jetzt wird mir beschieden, daß man leider von meiner Bestellung nicht die leiseste Ahnung hätte und der betreffende Kollege auch erst wieder am Dienstag da wäre. Na riesig. Also noch eine Woche mit der S-Bahn wenn doch schönstes Wetter ist. Die Auftragsannahme wird übrigens über ein fleddriges Ringbuch im DIN-A6 Format abgewickelt, in dem zig Kollegen mit unterschiedlicher handschriftlicher Begabung ihre Anmerkungen reinkritzeln. Hat mich also nicht weiter gewundert, nur etwas zornig gemacht. Es ist übrigens kein altes Lädchen, sondern ein taunagelfrischer Bike-Shop. Weiterhin rätselhaft bleibt mir, wie das überhaupt funktionieren kann. GRrrrrrr. So, jetzt geht's mir wieder besser. :-)

Frische Bananen

Es war ein bißchen wie Zonen-Gabis erste Banane nach dem Fall der Mauer: Die Neueröffnung einer Media-Markt Filiale in unserem bescheidenen Dorf. Man könnte meinen, sie hätten noch nie einen DVD Spieler in Händen gehalten so stürzten die Kunden ins Getümmel, blockierten mit ihren Autos die viel zu knapp bemessenen Parkmöglichkeiten bis zum Kollaps. Und ich dachte immer, bei der Landung in der Normandie sei viel los gewesen. Morgen ist der Laden leergekauft. Alles weg. Ich weiß es.