SucheBlog abonnierenVerwaltung des BlogsKategorienKontaktMarkus Brückner |
Mittwoch, 21. Dezember 2005A-Gen 0.1.2 released
Vorhin eben habe ich mal wieder ein paar kleinere Probleme an A-Gen behoben und eine neue Version veröffentlicht. Jetzt sollte das Package wieder unter Debian unstable und Ubuntu installieren und der Code mit GCC 4.x kompilieren. Damit ist Version 0.1 soweit am Ende ihrer Entwicklung. Welche Features Version 0.2 genau bieten wird, weiß ich noch nicht. Auf jeden Fall soll die Möglichkeit zum automatischen Aufsplitten der Index-Seite kommen.
Sonntag, 18. Dezember 2005Template-Spielereien die x-teDie schon vor längerer Zeit mal vorgestellten Templatespielereien sind irgendwann tatsächlich mal in ein paar Projekten benutzt worden. Aus verschiedenen Gründen kam plötzlich die Anforderung: "Mach den Logger doch mal bitte thread-safe!". Äh, ja... Konkret sollte der Ausdruck logger << LEVEL_DEBUG << "Eine Debug-Nachricht." << endl; nicht unterbrechbar sein, damit sich in der Ausgabe keine Nachrichten überlappen. Das ist nicht ganz so trivial, wie es scheint, denn in Wirklichkeit ist das nicht ein einziger Ausdruck, sondern dort stehen insgesamt 3 mehr oder minder unabhängige Teilausdrücke. Formt man dieses Zeile in die klassische Aufrufform um, so sieht das so aus (mal die Version der freien Operatoren, die nicht Element eines Typs sind, verwendet): operator<<(operator<<(operator<<(logger, LEVEL_DEBUG), "Eine Debug-Nachricht."), endl);. Man sieht also, daß hier dreimal ein operator<< aufgerufen wird, dessen Rückgabewert als Parameter für weitere Aufrufe verwendet wird. Um nun die gesamte Zeile thread-safe zu bekommen, muss der innerste Aufruf (welcher zuerst ausgeführt wird) einen Mutex locken und der äußerste muss ihn freigeben. Ersteres ist einfach: da das erste Element einer Zeile immer ein Level sein soll, kann man das locken des Mutex in diesen verlagern. Die zweite Anforderung ist schon schwieriger. Es ist für einen Operator nicht feststellbar, daß er der äußerste (und damit letzte einer Zeile) ist. Nun könnte man festlegen, daß jede Zeile mit endl angeschlossen werden muss und dann bei Empfang dieses Modifiers den Mutex wieder freigeben. Aus demselben Grund, wieso ein Operator nicht feststellen kann, daß er der letzte ist, kann man allerdings die Regel mit dem endl nicht erzwingen. Es ist zwar möglich, zu verhindern, daß auf ein endl noch etwas folgt, allerdings kann nicht erzwungen werden, daß überhaupt eines auftauchen muss. Um nun zu vermeiden, daß sich der Programmierer um diese internen Details kümmern muss, kann man die Lebenszeitregeln von C++-Objekten nutzen. Dazu modifiziert man die Ausgabeoperatoren so, daß der Typ von logger direkt nur noch Loglevel-Typen als Parameter akzeptiert. So erzwingt man, daß das erste einer Zeile ein Level ist. Der Ausgabeoperator verpackt den übergebenen Logger dann in ein temporäres Objekt und liefert dieses zurück. Außerdem lockt er den Mutex. Die folgenden Ausgabeoperatoren nehmen als ersten Parameter dieses temporäre Objekt, führen ihre Ausgabeoperation auf den enthaltenen Logger aus und liefern das Objekt wieder zurück. Auch der letzte Operator in der Zeile liefert dieses Objekt zurück. Da es von niemandem mehr entgegen genommen wird, wird es vernichtet. Dabei wird sein Destruktor aufgerufen, welcher den gelockten Mutex wieder freigibt. Auf diese Weise ist die gesamte Zeile vor Unterbrechung geschützt. Um den Logger nun portabel zu halten, sollte das schützende Mutex-Objekt nicht Element des Loggers sein. Leider ist Multithreading meist mit der Verwendung systemspezifischer Bibliotheken verbunden, so daß der Logger dadurch auf ein bestimmtes System festgelegt würde. Um das zu vermeiden, verwendet man ein Proxy-Objekt, welches eine Schnittstelle Lock() und Unlock() anbietet. Dieses nutzerdefinierte Objekt kapselt den eigentlichen, systemspezifischen Mutex. Dieses Objekt (bzw. genaugenommen dessen Typ) wird dem Logger in Form eines Templateparameters übergeben. Dieser ruft die entsprechenden Funktionen dann bei Bedarf auf. Auf diese Weise bleibt der eigentliche Logger-Code unabhängig vom zugrundeliegenden Threadframework. Diese skizzierten Ansätze habe ich im ursprünglichen Logger implementiert, den Code noch etwas aufgeräumt und auf einer eigenen Seite (Vorsicht: Englisch) abgelegt. Dort findet sich auch die Schnittstellendokumentation und etwas übersichtlichere Hinweise zur Benutzung. Probleme mit dem Parallelport am Dell Inspiron 510m
Schickt man das Dell Inspiron 510m unter Linux in den Suspend to RAM, so funktioniert nach dem Aufwachen der Parallelport nicht mehr. dmesg zeigt die Meldung "DMA write timed out" und der Drucker reagiert nicht. Um das Problem zu umgehen kann man im BIOS des Laptops den Parallel-Port vom ECP- auf Bi-Directional-Modus umstellen. Dann hat man allerdings keinen DMA-Transfer zum FIFO des Druckers mehr. Das bedeutet beim Drucken eine etwas höhere Systemlast, die allerdings kaum ins Gewicht fällt.
Dienstag, 6. Dezember 2005"Schneekompetenzpartner"Genau das habe ich vorhin im Radio gehört. Eine Gemeinde/ein Landstrich in Österreich macht Werbung und erklärt sich darin zum "Schneekompetenzpartner". Wie hab ich mir das vorzustellen? Sind die Gemeindevertreter speziell in der Erkennung von Schnee geschult? Früh morgens bei denen vorm Rathaus: Heinz H., ausgebildeter Schneekompetenzpartner betritt in spezieller Schutzkleidung (Stiefel, dicke Jacke und Handschuh) die Treppe. Sein Blick schweift für einige Sekunden prüfend über den Marktplatz. Er nickt, geht zurück in das Gebäude, nimmt den Telefonhörer wieder in die Hand und läßt sein Urteil hören: "Ja, es liegt Schnee!" Oder ist das vielleicht ganz anders und das ist der Laden, wo im Winter immer das ganze weiße Zeug herkommt? Sowas könnte man ja auch als "Schneekompetenzpartner" bezeichnen. Dann sollte sich vielleicht E.ON wegen der Schadensersatzforderungen ja einfach mal an die Gemeinde wenden. Schließlich kann das Schneechaos ja nur eine Fehllieferung gewesen sein! Vielleicht ist aber auch alles wie sonst immer und es haben bloss mal wieder einige Werbestrategen bei der verfrühten Weihnachtsfeier zu sehr am Koks genascht. "Höhö, Schneekompetenzpartner, hehehe..." Ja, klar... Donnerstag, 1. Dezember 2005Tiscali spielt DNS kaputtDer Anbieter meiner DSL-Flatrate, Tiscali, hat sich eine neue Dämlichkeit ausgedacht. Ähnlich wie damals VeriSign leitet man neuerdings alle Anfragen nach unbekannten Namen auf eine eigene Seite um. Die einfache Antwort "Du Depp, lern schreiben!" gibt es also nicht mehr. Tipp man beispielsweise "wwww.heise.de" (also mit 4 Ws), so sollte sich im Normalfall der Browser beschweren, daß diese Domain nicht existiert. Tut er aber nicht. Statt dessen tut er folgendes: ![]() Was für ein "netter" Service... Ist das nicht nett? Tiscali weißt mich darauf hin, daß ich zu blöd zum tippen bin und weil ich schonmal da bin, kann man mir ja noch ein wenig Werbung vor die Nase setzen. Ach ja und weil sie ja wissen, daß ich zu blöd zum tippen bin, leiten sie mich vorsichtshalber mal zur Seite eines ihrer Sponsoren weiter. Nicht, daß ich den nicht auch noch wegen eines simplen Fehlers nicht finde! ![]() Da wollte ich doch gar nicht hin... Wie damals schon bei VeriSign: Liebe Leute von Tiscali! Bitte, bitte lasst die Finger von DNS. Ihr habt es offensichtlich nicht verstanden, macht es bitte nicht kaputt!
Witzig ist übrigens, daß der Fehler nicht bei allen Anschlüssen auftritt. Mal tritt er auf, nach der nächsten Einwahl nicht mehr. Dafür dann bei einem anderen Kunden. Sehr "amüsant".
(Seite 1 von 1, insgesamt 5 Einträge)
|