TFS: Check-In Kommentare automatisch in Source-Code einfügen

TFS ist ja was wunderbare… nur wer bisher ohne sowas gearbeitet hat, oder cvs genutzt hat, der hat meistens seine Änderungen direkt im Header/Footer seiner cpp/h-Datei reingeschrieben. Dies hatte den großen Vorteil, dass man direkt zwei Dateien vergleichen konnte und sofort gesehen hat, wer was gemacht hat.
Dies geht so mit dem TFS nicht. Man benötigt immer den Team Explorer (oder VS) um die Kommentare einer Änderung zu sehen.
Es ist also so nicht so einfach möglich “disconnected” zu arbieten und trotzdem zu jeder Datei die ganzen Änderungen (zumindest anhand den Kommentaren) zu erkennen.

Im cvs gab es sowas wie ein “keyword-substitution“. Damit konnte man z.B. “$log$” in einen Kommentar seines Source-Codes einfügen und das cvs hat beim Check-In automatisch den Kommentar in die Source-Datei eingefügt.

Sowas habe ich auch für den TFS gesucht aber nicht gefunden. Mir wurde an diversen stellen gesagt, das sowas nicht geht…

Jetzt habe ich mich gestern selber drangemacht es zu probieren 😉

Und voila: Es klappt…
Habe nun ein kleines VS-PlugIn geschrieben (Check-In Policy), welche beim Check-In in den TFS den Kommentar in die Source-Datei reinschreibt, wenn dort ein “$log$” Eintrag vorhanden ist.

Ich bin jetzt wirklich begeistert!
Das Ding tut einwandfrei… hab es jetzt sogwar soweit, dass man es ganz hübsch parametrieren kann; d.h. man kann ganz frei “Templates” vorgeben, wie die Kommentare aussehen sollen.

Hier mal zwei Beispiele:

Man kann die Kommentare entweder von oben nach unten einfügen lassen:

/**************************************************************
 *
 *  Description: ...
 *
 *  History
 *  -------
 *
 *    Date   |Author | Comment
 *  ---------+-------+----------------------------------
 *  24.07.09 | kalmb | sdfsdf sdfsdf sdfs
 *  24.07.09 | kalmb | Zeile 1
 *           |       | Zeile 2
 *           |       | Zeile 3
 *           |       | Zeile 4
 *  24.07.09 | kalmb | sdafsdgdgdfsgsdfgdfsgdsfgdfs
 *  24.07.09 | kalmb | fgd dsfgdfsgdsfgdfgd
 *  24.07.09 | kalmb | asdasdf sadfsfsfsdfasdfas
 *  $log$
 *
 **************************************************************
 */

Oder auch von unten nach oben (wie cvs):

/*
 * $log$
 * 
 * Comment: Nochmals eine Änderung
 * User: DOMAIN\name
 * DateTime: 2009-07-23 22:04:22
 * Change: edit
 * 
 * Comment: dsfsdfsdfsd
 *          sdfsdfgsdfhgf hdfhfdghdfghfgdh
 * User: DOMAIN\name
 * DateTime: 2009-07-23 22:00:36
 * Change: edit
 */

Aus meiner Sicht ist dies das beste PlugIn, was ich seit langem gesehen habe 😉

Was meint Ihr dazu?
Wer interesse hat, darf sich gerne bei mir melden…

EDIT: Gestern hab ich meine “Keyword Substitution Check-In Policy” auf Codeplex veröffentlicht: http://logsubstpol.codeplex.com/

Simples XAML führt mich zur Verzweiflung…

Wer schon mal extensiver mit XAML (WPF) zu tun gehabt hat, der weiss: Debugging von DataBinding ist nicht so ganz trivial…

Ich hatte heute einen ganz simplen Cut-n-Past Error: Habe ein Binding Expression der Form

in ein MultiBinding eingefügt… wer nun schon mal mit MultiBindings gearbeitet hat weiss, dass man dazu nicht die “Kurzform” mit den geschweiften Klammern verwendet, sonder das ganze in die “Elemente” reinschreibt… also aus dem obigen Beispiel wird dann ein


So… das sieht ja einfach aus 😉 jetzt hab ich aber beim Copy-and-Paste dummerweise die geschweifte Klammer am Ende mitkopiert… dann noch einige Zeit weitergearbeitet… und dann wollte ich starten… lies sich auch alles wunderbar compilieren…
Nach dem Start kam aber das böse Erwachen…. ich hab min. 1 Stunde gesucht (und dabei in den tiefen des .NET-Source-Codes debuggt) bis ich den Fehler gefunden habe.

Der Grund: Es kam nicht wie sonst üblich eine Debug-Ausgabe, dass er das Property “Test}” nicht finden kann!
Sondern es kam eine “System.FormatException”… so und jetzt Ihr 😉 (nein, das war schon die InnerException!)

Also, nach langem suchen hab ich tatsächlich ein Bug in WPF gefunden 😉
Wenn Trace-Ausgaben aktiv sind, dann wird der Text in “Path” einfach ungeprüft der StringBuilder.AppendFormat-Methode als Formatstring übergeben… da aber in meinem Fall eine geschweifte Klammer drin war, konnte der String natürlich nicht erfolgreicht formatiert werden… deshalb die Exception (die mir aber nun mal gar nicht weitergeholfen hat).

Hab es mal gemeldet:
VS2008-SP1: FormatException in MS.Internal.AvTrace if Binding.Path contains curly braces…
VS2010-B1: FormatException in MS.Internal.AvTrace if Binding.Path contains curly braces…

Bitte abstimmen, ob Ihr den auch wichtig findet… (ich persönlich finde ja das ganze Debuggen des DataBindungs hundsmiserabel).

Ich hab es getan…

Ich bin tatsächlich von meinem Standard-Suchanbieter “google” zu “bing.com” gewechselt 😉
Bisher überzeugt mich Bing! Auch die “Related Searches” sind recht gut. Mir ist gerade noch nichts (wesentliches) aufgefallen, wo google besser sein sollte… (ausser bei Newsgroups-Suche).
Ich werde dies jetzt mal so lassen und mal schauen, wie es sich entwickelt.
Er findet sogar bei der Suche nach “CreateFile” sofort die passende API! Das konnt live-search nicht (da kam es erst auf der 2. Seite).
Auch gefällt mit der Hintergrund auf der Bing-Startseite besser als bei Google; auch die kleinen Infos zu dem Bild sind sehr hübsch…

Zumindest habe ich aktuell auch mehr vertrauen zu MS als zu Google, was die Speicherung “privater Daten” angeht. Google wird mir da langsam zur “Krake”…

PS: Was man machen sollte, ist die Ländereinstellung auf “United States (Deutsch)” umzustellen (ganz oben rechts); dann hat man auch alle neuen Features 😉

C++/CLI Rätsel: Wie sieht der Callstack aus?

Hier ist ein kleines Rätsel aus meiner C++/CLI Schulung, die ich letzte Woche gehalten habe:

Der Code wurde mit “/clr” kompiliert (das ist wichtig).
Kann mir jemand sagen, wie der genaue Callstack innerhalb der Methode “Foo” aussieht?
Und: Wie kann man indirekt nachweisen, was genau passiert?
Meine Schulungsteilnehmer dürfen natürlich nicht mitmachen, die wissen es ja schon 😉

struct V
{
  V() {}
  V(const V &v) 
  {
    this->i = v.i;
  }
  int i;
};

class C
{
public:
  void CallFoo()
  {
    V v;
    Foo(v);
  }
  virtual void Foo(V v)
  {
    // TODO: Wie sieht der Callstack aus?
  }
};

int main()
{
  C c;
  c.CallFoo();
}

Lösungen können als Kommentare gepostet werden.
Ein kleiner Hinweis noch: VS208 zeigt nicht den exakten Callstack an, aber er zeigt, dass da irgendwas noch passiert sein muss 😉

Schulung in C++/CLI!?

Ist Euere Firma gerade dabei, doch einmal die .NET-Welt zu erkunden?
Habt Ihr aber sehr viel C/C++-Code, der am besten Wiederverwendet werden soll?

Dann wäre vielleicht ein Einstige in C++/CLI eine gute Lösung und bestehende Buisness-Layers .NET-Konform zu machen oder den Datenaustausch mit .NET-Dingen zu ermöglichen.

Letzte Woche habe ich eine Schulung über C++/CLI durchgeführt.
Das Thema ist sehr umfangreich und beinhaltet u.a. eine Einführung in .NET, native InterOp, COM-InterOp / MFC-InterOp, usw.

Wer also Interesse an einer Schulung hat, darf sich gerne bei mir melden.

Wird es doch einen Jet-Treiber für x64 geben!?

Als ich vor drei Jahren zum ersten Mal x64 Systeme getestet habe, musste ich sehr schnell feststellen, dass es (leider) keinen Jet-Treiber gibt.
Nun scheint sich bei MS doch ein Wandel vollzogen zu haben. Office 2010 wird es zumindest als (native) x64-Version geben. Somit ist die Hoffnung groß, dass es vielleicht auch einen “offiziellen” Jet-Treiber für x64-Applikationen geben wird.

Wir lassen uns also überraschen…

IE8 macht Class-Wizard von VS2005 / VS2008 kaputt

Das ist mal wieder ein super Beispiel von ausführlichen Tests bei MS:
Nachdem Du IE8 installiert hast, geht der Class-Wizard von Visual Studio 2008 (incl. SP1) nicht mehr.
Es kommen dauernd irgendwelche Script-Fehler:
Visual Studio 2008 bug after installing IE8

Es gibt aber ein Workaround, bis ein “echter” Hotfix verfügbar ist:

  • regedit öffnen
  • Unter HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Internet Settings \ Zones
    einen Schlüssel mit dem Namen 1000 anlegen (wenn er nicht schon da ist)
  • Unter diesem Schlüssel 1000, ein DWORD-Eintrag anlegen:
    • Name = 1207
    • Type = REG_DWORD
    • Data = 0x000000

Visual Studio 2008 hotfix for IE8

Die gezippte reg-Datei kann man sich auch runterladen.

Nur der vollständigkeit halber: Auf Connect gibt es auch schon seit 9 Tagen einen Eintrag…

Kleine Ergänzung: Das Problem tritt auch mit VS2005 auf; der Workaround funktioniert aber wohl nur, wenn das SP1 installiert wurde.

Hier gibt es auch mehr Infos vom VC-Team.

Neues in Windows 7

Wer sich heute schon mit den neuen Features (aus Entwickler-Sicht) von Windows 7 beschäftigen will, kann diverse “White-Paper” aus der MSDN-Code-Gallery runterladen:
Microsoft Developer White Papers: PDC08
Wie man an dem Titel erkennen kann, wurden die Dokumente auch auf der PDC08 präsentiert.

Eine kurze Übersicht über die Neuerungen gibt es auch hier:
New Windows 7 White Papers

Was mir aufgefallen ist:

  • Es gibt ein neues API bzgl. “Windows Scenic” (sozusagen das Ribbon-UI in Windows integriert… da bin ich mal gespannt was die MFC-Produkt-Gruppe damit macht 😉 jetzt haben die den Zukauf des Toolkits sozusagen umsonst gemacht… da sie jetzt wieder alles auf die neue API portieren müssen, oder? )
  • Direct3D 10.1 Command Remoting: Da ich sehr oft via Remote-Desktop arbeitem scheint mir dies ein sehr intressantes Feature zu sein.

Syntax highlighting für TR1-header!?

Wer schon mit TR1 und den neuen Features gearbeitet hat, dem wird aufgefallen sein, dass es zu den Headern keine Syntax-Highlighting gibt. Dies ist wohl ein Bug…
Man muss es nur in der Registry eintragen, dann wird es passenden angezeigt:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\Languages\Extensionless Files\{B2F072B0-ABC1-11D0-9D62-00C04FD9DFD9}]
"array"=""
"random"=""
"regex"=""
"tuple"=""
"type_traits"=""
"unordered_map"=""
"unordered_set"=""
"xawrap"=""
"xawrap0"=""
"xawrap1"=""
"xawrap2"=""
"xfwrap"=""
"xfwrap1"=""
"xrefwrap"=""
"xtr1common"=""
"xxbind0"=""
"xxbind1"=""
"xxcallfun"=""
"xxcallobj"=""
"xxcallpmf"=""
"xxcallwrap"=""
"xxfunction"=""
'xxmem_fn"=""
"xxpmfcaller"=""
"xxrefwrap"=""
"xxresult"=""
"xxtuple0"=""
"xxtuple1"=""
"xxtype_traits"=""

Siehe auch: Enable syntax highlighting for TR1 headers in VS2008 SP1

Debugging .NET Apps wird ab .NET4 besser…

Eines der größten Nachteile in der aktuellen .NET-Welt ist der sehr schlechte support für das Debuggen von MiniDumps. Dies ist aktuell nur mit sehr viel Aufwand möglich. Geschweige denn, dass es irgendeine Unterstützung gäbe um den .NET Source-Code anzuzeigen.
Es gab mal eine WinDbg-Version (6.7.5.0) die dies konnte. Das war aber ein “Missverständniss” und diese Version wurde 3 Tage später wieder aus der offizielen Seite entfernt. Der Grund ist wohl, dass hier undokumentierte Schnittstellen des CLR-Teams verwendet wurden. Und wie dies bei MS so üblich ist, kann man nicht einfach zwischen zwei Teams kommunizieren. Das geht nunmal nicht.
Das ist auch der Grund, warum nun von WinDbg-Team ganz offiziell die Zusammenarbeit mit dem CLR-Team beendet wurde. Es wird also in absehbarer Zeit keine .NET-Unterstützung in WinDbg geben (Anmerkung: sos.dll kommt *nicht* vom WinDbg-Team sondern vom CLR-Team!).

Auf der PDC wurde jetzt aber dieses Jahr doch ein neues “Konzept” für das Debuggen von .NET4-Applikationen vorgestellt. Es wurde (endlich) erkannt, dass es doch wichtig ist z.B. (Mini-) Dumps zu analysieren. Deshalb haben sie wohl das ganze Debugging in .NET4 umgestellt und diese Unterstützung auch mit eingebaut. Endlich mal gute Nachrichten für .NET.

Mehr Infos gibt es hier:
CLR 4.0 advancements in diagnostics

Die Neuerungen sind u.a.:

  • Managed dump debugging
  • Profiler attach (and detach) for memory diagnostics and sampling
  • Registry-free profiler activation
  • x64 mixed-mode debugging
  • lock inspection
  • Corrupted-state exceptions

TechEd Barcelona – Windows Server Logo/Certification Programm

Nachdem ich jetze hier auf dem “App Readiness 2008 (R2)” Stand bin, hab ich mich da auch mal ein wenig eingearbeitet 😉
Es gibt jetzt ein kostenloses Tool um den (einfachen) Level “Works with …” zu erreichen. Dabei ist mir auch aufgefalen, dass es das “Certified for…” Programm auch kostenlos zum Download gibt. Und dabei ist mir wiederum aufgefallen, dass es ein schoenes Tools gibt um z.B. vor einer Installation und danach ein Snapshot des Systems zu machen und diese beiden zu vergleichen:
Windows System State Analyzer

Zum Testen gibt es noch mehr Tools:
Logo Testing Tools (x86)
Logo Testing Tools (x64)
Server Certification Tool (x86) for Self-Testing
Server Certification Tool (x64) for Self-Testing

Auch wenn man selber nicht an dem “Logo”, “Works with” oder “Certified for” Programm teilnehmen will, so ist es doch eine sehr gute Hilfe um seine Applikation/Installer korrekt zu schreiben, dass er bestmoeglichst funktioniert!

TechEd Developers Barcelona – Day 2

Die Keynote gestern fand ich sehr schön. Dort wurden 4 Themenbereiche vorgestellt. Und einer der Themenbereiche war “Using the power of C++” 😉
Und die neuen Featured von VS2010 sind schon beeindruckend. Neben dem neuen Paralell-Syntax-System (es geht wieder weg von OpenMP, hin zu einem “eigenen” System) hat er auch das Debugging gezeigt. Hier gibt es wesentliche Verbesserungen was das Debuggen von Multi-Threaded-Applikationen anbelangt (was IMHO heute immer wichtiger wird). Auch gibt es den VC6-Class-Wizard wieder 😉
Hab leider keine Screen-Shots… aber am 13.11. werden die Videos auf Channel9 veröffentlicht.
Heute gibt es das Video: “C++ 10: 10 is the new 6, Amit Mohindra”.
Heute wird es auch eine Session über “Bringing out the Best in Multicore Systems” und “Bulding fast and secure native applications with VSTS2008”. Ansonsten werde ich heute noch ein bisschen arbeiten…

Das Video ist auf jeden Fall zu Empfehlen:
http://channel9.msdn.com/posts/VisualStudio/Visual-Studio-2010-Overview/

TechEd Developer Barcelona – Tag 1

So, gestern bin ich hier in Barcelona am späten Abend angekommen um ab heute an der TechEd-Developers teilzunehmen. Leider gibt es dieses Jahr von MS keinen Bus-Transfer zum Conference-Center. Auch MS muss wohl sparen… also ein Taxi genommen (28,40 Eur) um zum Hotel zu kommen.
Heute morgen zuerst mal gemütlich gefrühstückt und dann am Strand entlang zum CCIB (Conference Center) gelaufen. Dort dann registriert. Es gibt dieses Jahr wieder die gleiche Tasche wie letztes Jahr… da ich als ATE (Ask the Expert) da bin und ich nix dafür bezahlen muss (ich bekomme aber auch nix), war meine Tasche *leer*! Naja, ist auch nicht so schlimm. Kann ich doch auch auf die ganze Werbund verzichten die da sonst immer so mitkommt. Immerhin konnte ich mir noch einen Conference Guide (kleines Büchlein) besorgen.
Heute geht es erst um 14:00 Uhr mit der Keynote los. Davor gibt es natürlich ab 11:30 Uhr noch Mitagessen 😉
Die erste Session beginnt dann um 16:00 Uhr. Entweder gehe ich zu “Sharepoint Technology: Past, Present and Future in SaaS World” (finde Sharepoint faszinierend), oder zu “.NET Framework: Application Life Cycle Best Practices”. Mal schauen.
Die zweite Session ist dann um 17:45 Uhr: Entweder “Best Practices for Managing Project with VSTS” oder “Buildung Data Visualization Apps with WPF” (wobei das hab ich schon oft gesehen und gemacht 😉 ).
Ab 19:00 Uhr hat dann der ATE-Stand offen, wo ich auf dem “Application Readiness”-Stand bin. Hab zwar keine Ahnung was das genau ist, aber ich werde mich bemühen (vermutlich AppCompat / x64 / Signing / Porting / usw. das passt ja dann auch genau in mein Profil 😉 )