Wenn Atheisten und Christen durch Deutschland reisen

Wahrscheinlich haben schon einige von der http://www.buskampagne.de gehört. Es ist der Deutsche Ableger der Atheist Bus Campaign.
Zu Werbeflächen auf Bussen wie in England hat das Geld nicht gereicht, aber zu einer Tour durch Deutschland.
Das Missionswerk Campus für Christus hat sich an die „Versen“ der Tour gehängt und eine eigene Gott-kennen-Tour daraus gemacht.

Hier ein Bericht der ca. 3 Wochen von Thomas Schneider (aus christlicher Sicht). Ein vergnügliches Tagebuch, finde ich, dass auch so manche Begegnung zwischen den beiden Busbesatzungen schildert.

http://www.schneider-breitenbrunn.de/2009-06/wenn-atheisten-und-christen-durch-deutschland-reisen-1-9-tag/
http://www.schneider-breitenbrunn.de/2009-06/wenn-atheisten-und-christen-durch-deutschland-reisen/

PS: Viele der Links auf Zeitungs- und Medienberichte aus Rundfunk und Fernesehen sind lesens- und sehenswert.

Die Funktion ReportFault unter Vista kehrt nicht mehr zurück, entgegen der Dokumentation

Wer unter Windows XP angefangen die FaultRep.dll für Crash-Reports zu verwenden, wird unter Vista eine üble Erfahrung machen. Entgegen der Dokumentation kehrt ReportFault unter Vista nicht zurück.

Das ist besonders lästig, wenn man nach dem Melden des Fehlers aufgrund des Feedbacks des Kunden noch selber Aktivitäten in der eigenen Software vorgesehen hatte.

Wieder ein Fall wo es schwierig ist zwischen verschiedenen Windows-Betriebssystemen kompatibel zu bleiben. Da hat man sich auf Windows XP eingelassen und unter Vista ist das entsprechende Interface schon wieder deprecated.

Die HashKey Implementierung in der MFC in VC-2005 und VC-2008

Die Maps in der MFC werden ja auch zum Teil gerne verwendet. Auch wenn viele Programmierer eher auf die std::map bzw. std::hash_map verwenden.

Zwei interne Dinge sind jedoch vielen Entwicklern nicht klar.

  1. Die Standard-Maps der MFC werden mit 17 Hash-Buckets erzeugt. Man sollte sich also über die Anzahl der Elemente klar werden, die gespeichert werden sollen.
    Bei großen Datenmengen sollte man evtl. darüber nachdenken, die Anzahl der Buckets zu erhöhen.
  2. Ist die Hash Funktion zu beachten, die hier verwendet wird. Denn deren Effektivität entscheidet ja, wie die Einträge auf die Buckets verteilt werden.

Zu diesem zweiten Punkt macht man eine erstaunliche Entdeckung, wenn man sich ansieht, was Microsoft für eine Funktion vorgesehen hat um den Hask-Key zu erzeugen. Diese Funktion ist in der MFC für primitive Werte vordefiniert, als primitive Werte sehe ich alle numerischen Werte, Zeiger und Handle an.
Man findet eine Implementierung als Template-Funktion in afxtempl.h:

template<class ARG_KEY>
AFX_INLINE UINT AFXAPI HashKey(ARG_KEY key)
{
 // default identity hash - works for most primitive values
 return (DWORD)(((DWORD_PTR)key)>>4);
}

Das erstaunliche ist für mich, dass hier die untersten 4 Bits einfach abgeschnitten werden. Für mich hätte für Handles, Zeiger und Integer Werte einfach ein cast gelangt.

Nehmen wir jetzt mal an, wir haben eine einfache Datenmenge, die die Integer 1-100 auf eine Struktur abbilden. Man wird die erstaunliche Entdeckung machen, dass alle Werte nur in den Buckets 0-6 abgespeichert werden. Die Buckets 7 bis 16 werden nicht verwendet.

Der Nachteil ist offensichtlich. Man nutzt das Datenrauschen auf den untersten 4 Bits nicht.
Das macht sich sogar bei Fensterhandles bemerkbar. Bekanntlich sind das immer gerade Werte, aber auch auf den Bits 1-3 finden wir hier Informationen. Auch hier werden nützliche „zufällige“ Informationen nicht genutzt. Dadurch werden mehr Kollisionen in Kauf genommen als notwendig wären.

Ich möchte nicht unerwähnt lassen, dass die MFC Maps wirklich eine Berechtigung haben, weil sie grundsätzlich einen Pool-Allocator verwenden. Häufige Allokationen und Löschungen werden weitaus schneller behandelt, als durch die std::map, oder std::hash_map mit normalen Allocator.

Ich habe diesen Bug (oder miese Verhalten) bereits in der Beta für VC-2008 gemeldet. Es wurde aber nicht mehr geändert. Nun habe ich es an die Produktgruppe erneut  für VC-10 eingereicht.
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=100772
Nachtrag 22.06.2009: Da der Bug von Microsoft nicht neu geöffnet wird habe ich einen neuen für VS-2010 Beta 1 angelegt.
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=468860
Wer Lust hat, der kann ja abstimmen.

BTW: Die HaskKey Funktion in afxtempl.h ist für andere Maps (z.B. CMapPtrToPtr) direkt in der Klasse definiert. Dieses Template wird nur vom CMap-Template verwendet.

Vista SP2 Backup Dateien freigeben

Wer, wie auch beim Vista SP1, einige 100 MB Speicher nach der Vista SP2 Installation zurückhaben möchte, der kann einfach die angelegten Backup Dateien entfernen. Natürlich nur wenn man SP2 auch wirklich nicht mehr entfernen will.

Dazu einfach das kleine Programm compcln aufrufen.Dazu muss man ein CMD-Fenster im Admin Modus öffnen und einfach folgenden Befehl ausführen:

%windir%\system32\compcln.exe

Die komplette Dokumentation findet sich hier:
http://technet.microsoft.com/de-de/library/dd335037(WS.10).aspx

PS: Nett ist, dass dieses Tool auch die SP1 Dateien entfernt. Was ich noch nicht ganz verstanden habe ist ob auch andere Hotfix Backups entfernt werden. Bei mir auf meinem Laptop wurden durch dieses Tool ca. 500 MB freigegeben. Vista SP1 hatte ich bereits entfernt.

Tipps & Tricks: Wie man einen permanenten ASSERT direkt mit einem Kommentar versieht

Ich verwende gerne ASSERT’s in meinem Code.
Sie sind ein wirksames Mittel Zustände abzufragen und bereist in der Testphase unzulässige Konstellationen oder Funktionsaufrufe zu entdecken.

Nun gibt es ja auch if, else oder switch Blöcke an denen das Programm normalerweise nicht vorbei kommen sollte. So eine Stelle versieht man dann schon mal mit einem

_ASSERT( FALSE );
// oder wer die MFC benutzt eben ASSERT,
// obwohl dies auch nur ein Synonym für den CRT _ASSERT makro ist
ASSERT(FALSE);

Jetzt müsste man noch einen Kommentar davor setzen, damit klar wird was hier schief läuft. Man kann das Ganze aber auch einfach kombinieren und noch einen Zusatznutzen erreichen indem man den etwas unbekannteren Makro _ASSERTE verwendet:

_ASSERTE( !"MyFuncFooHandler: This is not allowed in my special Foo Handler" );

Die Negation macht aus dem Zeiger auf den konstanten String FALSE, und damit schlägt der ASSERT an.
Wenn man jetzt wie hier gezeigt noch den _ASSERTE Makro verwendet, dann wird diese Expression, also der Text, sofort mit anzeigt. Man sieht dann sofort was das Problem ist sobald der ASSERT Dialog angezeigt wird.

Vista: Nach Installation von SP2 wird immer wieder nach einem WPD-Gerätetreiber gesucht

Ich habe ja schon einmal von einem Problem mit dem WPD-Treiber berichtet:
Vista: Ausrufezeichen vor Microsoft WPD-Dateisystem-Volumen-Treiber im Gerätemanager

Jetzt habe ich Vista SP2 installiert und nach jedem Neustart meines Systems sucht Vista nun immer wieder nach einem WPD-Gerätetreiber. Wenn man Vista anweist nie wieder nach solch einem Treiber zu suchen, ignoriert es das gefliessentlich. Genauso wie die erneute Suche nach dem Treiber, der auch gefunden wird, interessiert meine Rechner gar nicht.

Abhilfe hat bei mir nur folgendes geschaffen.

  • Öffnen der Computerverwaltung, dort Datenträgerverwaltung aufrufen
  • Allen Laufwerken, die dort aufgeführt werden weisen wir nun einen beliebigen Laufwerksbuchstaben zu (das sind zu 100% die Laufwerke von den Speicherkartenleser, die einmal entfernt wurden)
  • Dann starten wir den Rechner neu
  • Entfernen alle diese Laufwerksbuchstaben wieder über die Datenträgerverwaltung in der Computerverwaltung
  • Und der Spuk ist vorbei.

Beim nächsten Neustart wird nicht wieder nach einem Treiber verlangt.