# Sunday, December 27, 2009

Der Grund der grauen Ordnernamen in Thunderbird 3

Vor kurzem habe ich mich über die schlechte Lesbarkeit von verschiedenen Ordnernamen in Thunderbird 3 beschwert. Nun habe ich eine erklärende Antwort auf meine Anfrage an die Mozilla Community bekommen. Thunderbird unterscheidet ab Version 3 zwischen Ordnern mit ungelesenen Elementen und Ordnern mit neuen Elementen. Ordner mit ungelesenen Elementen werden fett dargestellt, Ordner mit neuen Elementen fett und grau. Damit wäre ja dann der Grund geklärt. Ob dieses Feature sinnvoll ist, lasse ich aber mal dahingestellt.

Folgende Punkte stören mich persönlich daran:

  • Durch die graue Farbe sinkt der Kontrast und man kann nicht mehr so gut erkennen, wie der Ordner heißt und wie viele ungelesene Elemente in ihm enthalten sind
  • Grau signalisiert bei UI-Elementen so etwas wie “inaktiv” oder “nicht möglich”.
  • Es ist nicht konfigurierbar, auch nicht über about:config

 

An Hand der Community-Antwort lässt sich aber noch ein weiterer interessanter Aspekt von Softwarequalität erkennen. So schreibt da ein Nutzer, er wäre sicher, dass es einen Weg gibt, die Farbe der Ordnernamen über CSS anzupassen, aber wie das geht, solle doch bitte jemand anderes raussuchen, er wäre gerade zu faul dazu. Das Umfeld, in dem diese Aussage getätigt wurde, ist der von stackoverflow.com ähnlich. Für eine Antwort scheint es Punkte zu geben, sofern die Antwort hilfreich ist. Um eine hilfreiche Antwort zu schreiben, muss man entweder sehr schnell oder sehr gründlich sein. Sehr gründlich ist den meisten aber zu viel Arbeit oder übersteigt ihre Fähigkeiten oder ihr Wissen, sodass dann nur noch sehr schnell als Punktmultiplikator gilt. Dies führt dann dazu, dass nur noch der tatsächliche Grund eines Problems genannt wird mit dem Hinweis, dass es eine Lösung gibt. Die Lösung selbst ist aber etwas komplizierter und wird daher nicht genannt. Ich tätige hier nun mal die Vermutung, dass der Grund für ein Problem nur einer Minderheit weiter hilft, die Mehrheit sich wahrscheinlich über die Lösung mehr freuen würde. Aber durch das Belohnungssystem in der Community ist diese Art des Supports bei den Helfenden nicht mehr sehr beliebt.

Man kann sich also eine Support-Community á la stackoverflow.com aufbauen, muss sich aber bewusst sein, dass deren Niveau nicht der eines Wiki-Hilfetexts oder gar eines Manuals gleich kommt. Nicht jeder neue Web 2.0-Hammer schlägt Nägel besser als der Alte in die Wand.

Sunday, December 27, 2009 12:39:00 AM (W. Europe Standard Time, UTC+01:00) #  Comments [0] | Trackback
# Tuesday, December 22, 2009

Wo kommt die schlechte Software eigentlich her?

Für alle Informatiker ein Denkanstoß, für alle Nicht-Informatiker etwas Erschreckendes:

Dilbert.com

Tuesday, December 22, 2009 10:36:00 PM (W. Europe Standard Time, UTC+01:00) #  Comments [0] | Trackback

Und weil es gerade so schön ist, noch ein Beispiel für schlechte Software

Ich habe ein Depot bei einem größeren Geldinstitut, bei dem ich unter anderem etwas Geld in einem Tagesgeldfond liegen habe. Dieses Geld ist laut Geldinstitut “börsentäglich” verfügbar. Nun habe ich am Sonntag, den 20.12., dort einen Betrag angefordert. Da das Geld ja börsentäglich verfügbar ist, sollte man meinen, dass das Sonntags angeforderte Geld Dienstags auf dem Konto ist. Aber was muss ich gerade feststellen? Das Geld ist nicht da. Nach zwei Börsentagen noch kein Geld. Nun schau ich in meinem Orderbuch nach, wie denn der Status der Order ist. Dort ist lediglich zu entnehmen, dass die Order an das Depotsystem übertragen wurde.

Die Übertragung einer Order dauert also 48 Stunden.  Wenn ich mal grob überlege, was da so alles übertragen werden muss:

  1. Die Kundennummer
  2. Die Depotnummer
  3. Die Fondsnummer
  4. Der Betrag
  5. Die Information, dass die Order sofort gültig ist

Alles zusammen macht grob geschätzt 48 Byte Information. Die Übertragung dauert 48 Stunden, das macht also 1 Byte pro Stunde oder auch 450 Sekunden pro Bit. Vertrauenerweckende Infrastruktur.

Allein dies ist schon bemerkenswert, aber leider geht die Geschichte noch weiter.

Da ich es etwas unverschämt fand, dass meine Order, mir mein börsentäglich verfügbares Geld zur Verfügung zu stellen, 48 Stunden lang übertragen wird, wollte ich mich umgehend beschweren. Das macht man am besten mit Hilfe des Links “E-Mail an XY”. Nur leider verbirgt sich dahinter keine E-Mailadresse, sondern nur ein Kontaktformular. Ich bin ja persönlich kein Freund von Kontaktformularen, aber das kann man dem Geldinstitut ja nicht anlasten. Was mich allerdings als Programmierer wieder zur Weißglut treibt, ist folgendes:

Das erste Feld soll mit der Zugangsnummer ausgefüllt werden. Ich bin ja auch gerade nur an das System angemeldet, da wäre es ja zu viel verlangt, wenn sich genau dieses System die Zugangsnummer merken sollte.

Das zweite Feld ist mit der Depotnummer zu füllen. Nun ist es leider so, dass ich aus der Depotübersicht auf einen Link klicke, der mich zu einem Formular bringt, in das ich die Nummer des Depots eintragen soll, in dem ich auf einen Link geklickt habe.

Als nächstes soll mein Name angegeben werden. Warum sollte ich im ersten Feld meine dem System ohnehin bereits bekannte Zugangsnummer angeben? Damit man einen Personendatensatz finden kann, im dem mein Name gespeichert ist, um diesen dann zu ignorieren?. Also fragen wir hier ruhig den Namen nochmal ab, dann sind wir auf jeden Fall sicher, dass der gerade angemeldete Benutzer, der auch noch seinen Anmeldenamen angegeben hat, seinen realen Namen auch noch weiß. Ach, was könnten wir denn noch abfragen? Was ist denn noch viel zu tippen? Hmmm?? Genau, lasst uns doch auch noch die E-Mailadresse abfragen. Und um zu prüfen, ob der Benutzer, über den wir eh schon alles dreimal abgefragt haben, auch richtig tippen kann, lassen wir ihn die E-Mailadresse zweimal eingeben.

Und zu guter letzt gibt es in diesem Kontaktformular noch das Pflichtfeld Postleitzahl. - Warum?

Nein, wirklich. Warum wird hier über ein Pflichtfeld die Postleitzahl abgefragt? Was soll das? Was bringt diese dem System mittlerweile über 5 verschiedene Ecken bestätigte und neu zuordnungsbare Information für einen Nutzen im Beantworten einer über ein Kontaktformular eingegebenen E-Mail???

Zu diesem Epic Fail der Softwareindustrie kann ich nur sagen:

Liebe Benutzer der Produkte, die meine Berufsgruppe so alle verbricht: Bitte seht es uns nach. Denn wir wissen nicht, was wir tun.

Tuesday, December 22, 2009 10:22:00 PM (W. Europe Standard Time, UTC+01:00) #  Comments [0] | Trackback

Graue Ordnernamen in Thunderbird 3

Seit einigen Tagen habe ich Thunderbird 3 installiert. Doch leider muss ich sagen, dass ich von den neuen Features noch keines wirklich nützlich einsetzen konnte, einige wünsche ich mir sogar schon wieder ausgeschaltet. Am störendsten ist für mich nicht nachvollziehbare Einfärbung der Ordnernamen. Befinden sich in einem Ordner ungelesene Elemente, so wurde bisher der Ordner fett geschrieben und in Klammern die Anzahl der ungelesenen Elemente an den Namen angehängt. Neuerdings wird nach mir schleierhaften Kriterien der Ordnername zusätzlich hellgrau dargestellt, sodass ich ihn fast nicht mehr vom weißen Hintergrund unterscheiden kann. Leider kann ich nirgends finden, warum die Ordnernamen ausgegraut werden oder wie man dieses Feature abschalten kann.

Falls jemanden bekannt sein sollte, was es mit den ausgegrauten Ordnernamen auf sich hat oder wie man dieses Feature ausschalten kann, freue ich mich über einen Hinweis. Sollte auch sonst niemand etwas darüber wissen, bestärkt sich mein aktueller Eindruck, nämlich dass es mal wieder ein großes Softwareprojekt nicht hinbekommt, eine für den Anwender benutzbare oder wenigstens dokumentierte Software zu bauen.

Tuesday, December 22, 2009 9:14:00 PM (W. Europe Standard Time, UTC+01:00) #  Comments [1] | Trackback
# Wednesday, November 11, 2009

Alle Gammelfleischverfahren in Deutschland wurden eingestellt

Gerade auf Phoenix gesehen: Ein Lebensmittelkontrolleur aus Frankfurt erzählt, dass alle Verfahren wegen Gammelfleischs zumindest im Raum Frankfurt eingestellt wurden, weil nur der Handel mit Gammelfleisch strafbar ist, nicht aber der Besitz. Und bisher wurde immer nur der Besitz nachgewiesen. Da kann man eigentlich nur mit dem Kopf schütteln...

Wednesday, November 11, 2009 10:08:13 PM (W. Europe Standard Time, UTC+01:00) #  Comments [0] | Trackback
# Thursday, November 05, 2009

Quick-GPS verweigert die Aktualisierung

Sollte Quick-GPS, ein Tool für Windows Mobile, um die Bahndaten der GPS-Satelliten für einen schnelleren Fix vorzuhalten, einmal mit der Fehlermeldung

Datenaktivierung fehlgeschlagen
Die Ortseinstellung muss aktiviert sein, damit die aktuellsten Satellitendaten für die Beschleunigung der GPS-Positionierung genutzt werden

die Aktualisierung der Bahndaten quittieren, nachdem diese erfolgreich heruntergeladen wurden, hilft ein Neustart des Gerätes. Was sich dort genau verhakt, ist mir nicht bekannt, aber aktuell kenne ich keinen Weg, die Übernahme der Daten wieder funktionsfähig zu bekommen.

Thursday, November 05, 2009 7:53:00 PM (W. Europe Standard Time, UTC+01:00) #  Comments [0] | Trackback
# Monday, September 07, 2009

Led Lenser M5

[Trigami-Review]

Für einen Produkttest erreichte mich die Taschenlampe Led Lenser M5 der Firma Zweibrüder Optoelectronics. Dabei handelt es sich um eine durch einen Mikroprozessor gesteuerte LED-Taschenlampe.

IMG_1089_1 

Lieferumfang

Die Taschenlampe kam in Verbindung mit einer Menge nützlichem Zubehör in einerSmartCard formschönen Schachtel. Beginnen wir mit der Smart Card. Dies ist eine prägnante Bedienungsanleitung mit den wichtigsten Schaltfunktionen der Lampe im Format einer ID-1-Karte, sie eignet sich also bestens für die Hosentasche. Neben der Smart Card gibt es eine eigentlich alles umfassende und trotzdem recht kurze Bedienungsanleitung in Papierform.

Als nächstes ist eine praktische Handschlaufe enthalten, die man an einer entsprechenden Öse am Ende der Lampe befestigen kann.

Wer die Handschlaufe nicht benutzen möchte, die Lampe aber trotzdem immer griffbereit wünscht, kann die Nylontasche zur Befestigung am Gürtel verwenden. Die Tasche lässt sich mit Hilfe des beiliegenden Karabiners aber auch einfach am Rucksack oder dem Materialhaken unterbringen.

Mit der handelsüblichen AA-Batterie, welche kostengünstig nachgekauft werden kann, ist dann der Lieferumfang vollständig und alles nötige vorhanden, um die Lampe in Betrieb zu nehmen.

IMG_1111_1

Inbetriebnahme und erster Eindruck

Die Inbetriebnahme gestaltet sich Taschenlampengerecht. Batterie einlegen (auf die korrekte Polung achten) und loslegen. Die Lampe liegt gut in der Hand, sie ist sehr hell und die Bedienung geht flott von der Hand. Machen wir uns also ans Eingemachte.

Ausführliche Beschreibung

Bei der Led Lenser M5 handelt es sich nicht um eine übliche Taschenlampe. Sie ist, wie der Name schon suggeriert, mit einer LED als Lichtquelle ausgestattet. Für die LED sprechen:

  • Geringere Verlustleistung durch Abstrahlung von Wärme
  • Längere Haltbarkeit als eine Glühlampe
  • Robuster im härteren Einsatz

Durch die geringere Verlustleistung der LED kann diese mit der gleichen Energiemenge entsprechend heller oder länger leuchten, je nach Einsatzzweck. Da nun eine LED im Normalfall immer die gleiche Menge Licht abgibt, mussten sich die Entwickler etwas einfallen lassen. Und hier kommt der Mikrochip ins Spiel, welcher der Lampe auch ihren Namen gibt (das M steht eben für Mikrochip). Mit Hilfe dieses kleinen Chips kann die LED mit “Vollgas”, im blendfreien, gedimmten 15%-Modus oder Strobe Modus betrieben werden. Der Strobe Modus erzeugt ein grelles Blitzen, was zur Selbstverteidigung eingesetzt werden kann.

Die LED ist aber nur die erste Besonderheit der M5. Als nächstes wirklich interessantes Feature ist das Speed-Focus-System mit seiner Gleitschlittenmechanik zu nennen. Dies ermöglich es, die Lampe mit einer Hand zu fokussieren, da einfach nur der Lampenkopf mit Daumen und Zeigefinger vor- und zurückgeschoben werden muss. Außerdem besteht es nicht wie bei anderen Lampen aus einem einfachen verschiebbaren Reflektor, sondern aus einem Reflektor in Kombination mit einer Linse, dem sogenannten Advanced Focus System. Damit lässt sich das Licht viel besser auf den gewünschten Bereich bündeln. Es wird so ein klar abgegrenzter Spot oder eine homogen ausgeleuchtete Fläche angestrahlt.

Das hört sich auf den ersten Moment sehr fragil und fehleranfällig an, ist es aber nicht. Die Lampe ist spritzwassergeschütz in einem robusten Metallgehäuse untergebracht, kann im Aquarium versenkt oder mit dem Auto überrollt werden, ohne dass ihre Funktionsfähigkeit beeinflusst würde.

Um die Verlustleistung weiter zu minimieren und die Lampe robuster zu machen, sind die Kontakte hartvergoldet. Somit wird zum einen Korrosion vermieden, welche den Übergangswiderstand negativ beeinflusst und zum anderen werden die Kontakte damit unanfälliger gegen eventuell austretende Batteriesäure.

Sollte trotz der robusten Bauweise mal etwas kaputt gehen, muss nicht gleich eine Neue her. Die Lampe ist modular aufgebaut, sodass lediglich das defekte Teil getauscht werden muss.

Der aus meiner Sicht einzige Wermutstropfen ist der am Lampenende angebrachte Schalter. Für manche Anwendungszwecke ist dies durchaus sinnvoll, hält man die Lampe jedoch mit dem Daumen nach vorne, um das Speed-Focus-System zu bedienen, muss man die zweite Hand zu Hilfe nehmen, um die Lampe ein- oder auszuschalten.

Technische Details

Gewicht 74g
Länge 11cm
Durchmesser Kopf 2,1cm
Durchmesser Schaft 1,8cm
Leuchtdauer 15% ca. 8 Stunden
Lichtstrom 88 Lumen

Wie man auf dem folgenden Bild sehen kann, eignet sich die Lampe nicht nur als Lampe, sondern man kann sie auch zur Fotographie einsetzen. Durch die tageslichtähnliche Farbtemperatur lässt sie sich sehr als Spot nutzen, um bestimmte Bildbereiche hervorzuheben. Alternativ kann sie mit ihrer homogenen Ausleuchtung das komplette Motiv aufhellen.

IMG_1036_1

Außerdem gibt es für verschiedene Lampen der Firma Zweibrüder Optoelectronics Halterungen fürs Fahrrad. Auch wenn sie nicht nach der StVO als Beleuchtung im Straßenverkehr zugelassen sind, sind sie meiner Meinung nach doch um längen besser als manche Fahrradlampe. Wer sein Fahrrad also als Sportgerät nutzt, sollte die LED Lenser als Beleuchtungsalternative unbedingt in Betracht ziehen.

Weitere Informationen

Sehr viele Informationen zur Technik und interessante Anwendungsmöglichkeiten und –beispiele gibt es auf der allgemeinen LED Lenser-Seite. Dort gibt es außerdem eine rührige Community, die den Kontakt zu den Entwicklern herstellt. Somit kann jeder Anwender Einfluss auf zukünftige Entwicklungen nehmen.

Monday, September 07, 2009 6:29:00 PM (W. Europe Daylight Time, UTC+02:00) #  Comments [0] | Trackback
# Saturday, August 29, 2009

Eine Anwendung nur einmal öffnen

Gerade bin ich in Klaus’ Blog auf einen Post gestoßen, der mich etwas irritiert hat. Im deutschen stackoverflow.com tauchte die Frage auf, wie man eine Anwendung so gestalten kann, dass sie nur einmal gestartet werden darf. Dafür nimmt ja bekanntlich einen Mutex, da dieses Verriegelungsobjekt systemweite Gültigkeit hat und daher zwar nicht explizit für diesen Fall geschaffen wurde, sich aber am besten von allen Verriegelungsobjekten dafür eignet.

Klaus präsentiert jedoch einen Vorschlag, den er persönlich besser findet. Er ermittelt über die statische Methode Process.GetProcesses alle im System vorhandenen Prozesse und sucht dann den Prozess, der den Namen seiner Anwendung trägt. Warum er Mutexe meidet und lieber über alle Prozesse iteriert, sagt er leider nur in einem Kommentar:

Mit Kanonen auf Spatzen ist da noch untertrieben.[..]

Auf Peter Buchers Kommentar, man möge doch einen Mutex verwenden Antwortet Klaus:

Hallo Peter,
ich weiß dass viele den Mutex bemühen. Doch gerade die Verwendung eines Mutex, und er muss als System-Mutex registriert werden, verlangt einiges an Disziplin. Der Mutex muss sauber gegen Exceptions abgesichert werden, er muss auf alle Fälle freigegeben werden und der Benutzer muss über die nötigen Rechte verfügen.
Um all das zu umgehen, hab ich mir diese einfache "use and forget" Methode überlegt.

Allerdings ist es nicht die Vorgehensweise, einen Mutex zu verwenden (je nach verwendetem Konstruktor), sondern seine eigene, bei der der Benutzer über die nötigen Rechte verfügen muss.

Die Methode Process.GetProcesses erfordert vollen Systemzugriff, also muss die Anwendung in der Sicherheitsgruppe FullTrust ausgeführt werden.

Dass man sich bei Verriegelungsobjekten Gedanken darüber machen muss, wie man sie sauber freigibt, sollte in Zeiten des Multithreadings jedem Programmierer klar sein. Gegen Exceptions kann er über den globalen ExceptionHandler abgesichert werden, den ebenfalls jede Anwendung haben sollte, um Unhandled Exceptions protokollieren zu können. Bei einem sauberen Systemdesign ist der “Mit dem Kopf durch die Wand”-Methode von Klaus nicht unbedingt die einfachere Alternative.

In den letzten Jahren ist das Thema Sicherheit immer mehr in den Fokus gerückt. Microsoft versucht, die Programmierer von Windows-Software dazu zu bewegen, sich endlich an die Implementierungsvorschriften zu halten, damit es möglich werden kann, dass ein Windows-Benutzer nicht grundsätzlich Administrator sein muss, um seinen PC benutzen zu können. In diesen Zeiten kann ich den Hinweis von Klaus daher nicht unkommentiert stehen lassen, vor allem, da er nur einseitig eine Halbwahrheit beschreibt.

Saturday, August 29, 2009 9:33:00 AM (W. Europe Daylight Time, UTC+02:00) #  Comments [2] | Trackback
# Saturday, August 22, 2009

stackoverflow nun auch auf deutsch

Ja, es gibt eine deutsche Version von stackoverflow.com: codekicker.de

Laut der Seite selbst existiert codekicker.de seit circa einem Monat. Und ist im Grunde ein stackoverflow-Klon. Klaus findet es eine Bereicherung der deutschen .NET-Community, ich halte es eher für eine Separation, da alle Fragen von codekicker nur der deutschsprachigen, nicht jedoch der weltweiten .NET-Community zur Verfügung stehen. Und die Sprache der weltweiten Community ist nun einmal Englisch. Daher ist codekicker aus meiner Sicht überflüssig. Jedenfalls so lange, bis mir die Suchmaschine meines Vertrauens als Treffer einen Link zu codekicker präsentiert und keinen zu Stackoverflow.

Saturday, August 22, 2009 1:48:00 PM (W. Europe Daylight Time, UTC+02:00) #  Comments [0] | Trackback
# Thursday, August 06, 2009

WaitOne(Int32) erzeugt MissingMethodException

Heute bin ich über ein Problem gestolpert, das mich etwas schockiert hat. Wir setzen NUnit in Verbindung mit CruiseControl für den Test eines Embedded Systems ein. Die NUnit-Test werden mit .NET 3.5 entwickelt. Um mit dem Device kommunizieren zu können, gibt es ein proprietäres Netzwerkprotokoll, für das wir eine .NET-API entwickelt haben. Diese API wird gegen .NET 2.0 und .NET CF 2.0 kompiliert.

In meiner letzten Erweiterung der API habe ich unter anderem eine Ressource mit einem Mutex verriegelt. Der anschließende Entwicklertest verlief unauffällig, sodass die neue API sozusagen “RTM” wurde und an den Testentwickler ging, der die neuen Tests gegen die API programmieren sollte. Dabei stolperte er relativ schnell über eine MissingMethodException. Interessant war, dass dies durch den Aufruf von Mutex.WaitOne(Int32) hervorgerufen wurde. Darauf konnte ich mir nun gar keine Reim machen, da diese Funktion so vertraut schien. Ist sie aber nicht.

Mutex.WaitOne(Int32) ist eine neue Überladung der Funktion WaitOne(). Bisher gab es diese ohne Parameter, WaitOne(), oder mit zweien, WaitOne(Int32, Boolean) und WaitOne(TimeSpan, Boolean). Die Überladungen WaitOne(Int32) und WaitOne(TimeSpan) sind erst mit dem Service Pack 1 für .NET 3.5 hinzugekommen. Prinzipiell sollten sie damit auch nur in.NET 3.5 verfügbar sein. In .NET 2.0 sind sie nun deshalb enthalten, weil die WaitHandle-Klasse im Namensraum System.Threading untergebracht ist, der in mscorlib enthalten ist. Diese Assembly liegt nur in der Version 2.0 vor. So lange also .NET 3.5 SP1 installiert ist, ist alles ok. Wenn nicht, ist das jedoch nicht so schön, da man während der Entwicklung den Fehler nicht bemerkt.

Hoffentlich ist das der einzige Fallstrick, der durch .NET 3.5 SP1 für .NET 2.0-Entwicklungen gelegt wurde. Oder kennt jemand andere?

Thursday, August 06, 2009 7:47:00 PM (W. Europe Daylight Time, UTC+02:00) #  Comments [0] | Trackback