h1

VS 2010 Extensions – meine Favoriten

Juni 30, 2011

Ich hatte ja schon mal vor langer Zeit einen beliebten Artikel zu Visual Studio Erweiterungen. Jetzt ist wieder viel Zeit vergangen und es ist inzwischen deutlich komfortabler geworden, dank des Extension Managers in Visual Studio. Hier also eine kleine Auflistung in verschiedenen Kategorien.

Ohne geht gar nicht:
Sollte man haben:
Kann man mal probieren und ist ganz nett:

Viel Spaß beim installieren und ausprobieren. Bis auf ReSharper sind alles kostenlose Extensions für Visual Studio 2010.

h1

TFS Check-In Policy | Nur auf “aktive” Work Items einchecken

Juni 30, 2011

Ein Kollege fragte heute, wie er seine Entwickler dazu bekommt nur auf aktive Work Items im TFS einzuchecken. Ja dafür gibt es eigentlich eine ganz passable Möglichkeit in dem man die “Work Item Query Policy” verwendet.

 image
Team Project Settings > Source Control

 image
Check-in Policy > Add > Work Item Query Policy

Jetzt noch eine entsprechende Team Query auswählen und fertig. Jetzt können die Entwickler nur noch Work Items auswählen, die durch die Query gefunden werden. Sinnvoll ist dann z.B. “All My Active WorkItems” als Query anzulegen. Es kann aber auch Sinn machen, dass ein Entwickler nur WorkItems aus einem aktuellen Sprint wählen kann. Auch dass kann man ja durch anpassen der Query entsprechend erreichen.

Wo kommt nun diese Check-in Policy her? Jeder Teilnehmer des Team Projektes muss in seinem Visual Studio die folgende Extension installieren: Team Foundation Server Power Tools March 2011

Der Projektadmin kann entsprechende Queries anlegen oder modifizieren und auch die Check-in Policies administrieren.

h1

Abfragen aller Builds auf einer Project Collection

Juni 23, 2011

Mit der TFS API ist es relativ einfach zu einer Project Collection alle Build-Definitions und deren Eigenschaften abzufragen. Im Beispiel werden z.B. die gesetzten BuildController und Tags abgefragt:

1: using System;


  2: using System.Linq;
  3: using System.Xml.Linq;
  4: using System.Xml.XPath;
  5: using Microsoft.TeamFoundation.Build.Client;
  6: using Microsoft.TeamFoundation.Client;
  7: 
  8: namespace ConsoleApplication1
  9: {
 10:     class Program
 11:     {
 12:         static void Main(string[] args)
 13:         {
 14:             Console.WriteLine("Collection Url:");
 15:             var MyCollectionUrl = "http://tfs:8080/collection";
 16:             Console.WriteLine("Collection Url: {0}", MyCollectionUrl);
 17:             var tfs = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri(MyCollectionUrl));
 18:             var bs = tfs.GetService<IBuildServer>();
 19:             var bsSpec = bs.CreateBuildDefinitionSpec("*", "*");
 20:             var results = bs.QueryBuildDefinitions(bsSpec);
 21: 
 22:             foreach (var qb in results.Definitions)
 23:             {
 24:                 if (qb.BuildController != null)
 25:                 {
 26:                     var cu = qb.BuildController.Name;
 27:                     var p2 = qb.BuildController.ServiceHost.Name;
 28:                     string tags = "null";
 29:                     if (qb.ProcessParameters != null)
 30:                     {
 31:                         var xmlProcessParameters = XElement.Parse(qb.ProcessParameters);
 32: 
 33:                         var agentsettings =
 34:                             xmlProcessParameters.Nodes().Select(xNode => xNode).Where(
 35:                                 name => name.ToString().Contains("AgentSettings"));
 36:                         if (agentsettings.FirstOrDefault() != null)
 37:                             tags = agentsettings.First().CreateNavigator().GetAttribute("Tags", string.Empty);
 38:                     }
 39: 
 40:                     string def = qb.TeamProject + @"\" + qb.Name;
 41:                     Console.WriteLine("{0}\t{1}\t{2}\tTags: {3} ", cu, p2, def, tags);
 42:                 }
 43:                 else
 44:                 {
 45:                     string def = qb.TeamProject + @"\" + qb.Name;
 46:                     Console.WriteLine("{0}\t{1}\t{2} ", "null", "null", def);
 47:                 }
 48:             }
 49: 
 50:             Console.ReadLine();
 51:         }
 52:     }
 53: }

In der Ausgabe erhält man bei diesem Beispiel eine Ansicht aller Teamprojekte der Projektcollection “collection” auf die man als Ausführer Zugriff besitzt. Welcher Buildcontroller und welche Agent-Tags werden für welche Builddefinition verwendet.

h1

Microsoft Process Template (MPT) mit TFS2010

Juni 4, 2010

Microsoft hat auf Codeplex ein Template zur Verfügung gestellt, dass für Visual Studio Team System 2008 (VSTS) eine hierarchische Abbildung von Work Items ermöglicht. Mit TFS 2010 wird die Hierarchie nun aber von Haus aus unterstützt und somit ist mit Sicherheit eine Reimplementierung dieses Templates notwendig. Zur Zeit steht aber weder dieses Template auf Codeplex zur Verfügung noch, dass es Infos zu diesem Template im Zusammenhang mit TFS 2010 existieren.

Wir haben dieses Template etwas abgewandelt eingesetzt und standen jetzt aber vor dem Schritt, wie wir dieses weiter unter TFS 2010 supporten, bevor die Projekte auslaufen oder auf neue Templates migriert werden. Die gute Nachricht vorweg, wir haben einen Weg für uns gefunden, den zugehörigen Dienst weiterhin funktionstüchtig zu halten. Dazu hier ein kurzer Abriss zu den notwendigen Schritten:

  1. Es bietet sich an die Solution mit Visual Studio 2010 zu öffnen und die verwendeten Referenzen auf den TFS neu zu setzen (von Version 9.0.0.0 auf 10.0.0.0)
    image
    Das gilt für das Projekt “MptCodeLibrary” und “Test.UnitTest”
  2. Ein Recompile des Codes liefert jetzt einige Warnungen von denen man einige sehr schnell abarbeiten kann. Folgende Änderung sollte man auf jeden Fall durchführen:
       1: TeamFoundationServer tfs 

       2:   = TeamFoundationServerFactory.GetServer(serverName)

    ersetzen durch:

       1: TfsTeamProjectCollection tfs 

       2:   = TfsTeamProjectCollectionFactory.

       3:     GetTeamProjectCollection(new Uri(serverName));

  3. In der App.config müssen die WCF Einstellungen an 2 Stellen angepasst werden, weitere Infos findet man auch hier und hier

    image

    basicHttpBinding zu wsHttpBinding 
    und wsHttpBinding muss  an der entsprechenden Stelle noch konfiguriert werden:

       1: <bindings>

       2:     <webHttpBinding>

       3:     ...

       4:     </webHttpBinding>

       5:   <wsHttpBinding>

       6:     <binding name="noSecurity">

       7:       <security mode="None"/>

       8:     </binding>

       9:   </wsHttpBinding >          

      10: </bindings>

  4. Es muss jetzt die URL der Collection zu den Team Projekten in die App.config eingetragen werden.
       1: <teamServerSection>

       2:  <teamservers>

       3:   <teamserver servername="http://tfs:8080/tfs/default" />

       4:  </teamservers>

       5: </teamServerSection>

  5. In der TeamFoundationFacade muss in einer Methode die Sid ermittelt und mit übergeben werden (alter Code wurde auskommentiert):
       1: public void SignupForReceivingEvent(string serverName, 

       2:     string receiverPath, string filterExpression)

       3: {

       4: ...

       5:   try

       6:   {

       7:     //eventEndpoint.SubscribeEvent("Sid is ignored", 

       8:     //  "WorkItemChangedEvent", filterExpression, delPreference);

       9:     // get sid from current user

      10:     string sid 

      11:         = System.Security.Principal.WindowsIdentity

      12:         .GetCurrent().User.Value;

      13:     eventEndpoint.SubscribeEvent(sid, "WorkItemChangedEvent", 

      14:         filterExpression, delPreference);

      15:   }

      16: ...

      17: }

  6. Jetzt sollte man den Stand erreicht haben, dass wieder Events am Service ankommen, doch leider werden sie noch nicht richtig bearbeitet. Dazu muss eine weitere kleine Anpassung in GlobalListBuilder erfolgen (in diesem Fall wurde nur für eine Collection eine Unterstützung eingebaut!!!):
       1: private string DeriveTfsServerName(

       2:   XContainer workItemChangedEvent)

       3: {

       4:   ...

       5:   Uri artifactMoniker = new Uri(displayUrlElement.First().Value);

       6:   //IEnumerable<TeamServerConfiguration> teamServers 

       7:   //   = from teamServer in mptConfiguration.TeamServers where ...

       8: ...

       9:   //if (teamServers.Count() <= 0)

      10:   //    throw new MptException("Could not determine the TFS...

      11:   return artifactMoniker.Scheme + "://" 

      12:          + artifactMoniker.Authority 

      13:          +"/tfs/defaultCollection";

      14: }

  7. Jetzt sollte sowohl der Dienst als auch das TFS Event empfangen und bearbeiten funktionieren.

Ziel ist es nach der Migration des TFS 2008 auf TFS 2010 die Projekte mit dem MPT Template weiter zu unterstützen, aber perspektivisch auf ein neues Template zu migrieren. Dazu wollen wir die Tools von der TfsIntegration Plattform verwenden. Vielleicht kann ich ja dazu in den kommenden Wochen auch noch Erfahrungsberichte veröffentlichen.

h1

SmartCard Reader Cherry ST-2000 mit Windows 7 und StarMoney 7

März 5, 2010

Da mein letzter Artikel zu einem Windows 7 Problem mit einem HP Scanner so großen Zuspruch genießt, dachte ich mir ich werde auch eine weitere Problemlösung die nicht zum sonstigen Inhalte meines Blogs passt hier veröffentlichen.

ST-2000_468[1]

Mir ging es darum meinen SmartCard Reader von Cherry (ST-2000U) unter Windows 7 zum Laufen zu bekommen und vor allem den PIN-Modus 2 (PIN Eingabe am Card Reader und nicht auf der Computertastatur) im Zusammenhang mit Starmoney (HBCI) verwenden zu können.

Auf den Seiten von Cherry gibt es zwar einen aktuellen Treiber auch für Windows 7, doch leider hat bei mir immer nur der PIN Modus 1 (PIN auf der Computer Tastatur eingeben) funktioniert.

Um den Kartenleser mit Starmoney zu verwenden öffnet man das Kartenleser Setup und findet dann unter Ct API leider keinen Kartenleser zur Auswahl. Auch das Manuelle einrichten (wie hier beschrieben) hat bei mir nicht funktioniert.

image
Starmoney 7 Kartenleser Setup

Nach ein bisschen Recherche bin irgendwie auf SCM Microsystems SPR 532 gekommen und habe mir das Packet “SCM Microsystems SPR 532 SmartCard Reader (SPR532 PC/SC CT-API installer)” heruntergeladen und installiert.

Nach einem Neustart tauchte auch im Starmoney Kartenleser Setup unter Ct API der neue Eintrag auf.

image
Starmoney 7 Kartenleser Setup – Neuer Eintrag unter Ct API

image
Starmoney 7 Kartenleser Setup – PIN-Modus 2 in den Eigenschaften

In den Eigenschaften war der Test auch mit PIN Modus 2 erfolgreich. Im Starmoney kann mit diesem Standard-Reader wie gewohnt auch unter Windows 7 die HBCI Pin am PIN Pad eingegeben werden.

image
PIN Abfrage mit Eingabe am PIN Pad 

Vielleicht habe ich nur irgendetwas Falsch gemacht, aber da das gewünschte Ergebnis in dieser Variante erreicht ist bin ich vorerst zufrieden und vielleicht hilft der Post trotzdem dem ein oder anderen mit ähnlichen Problemen und Anforderungen.

h1

HP ScanJet 4100C Scanner unter Windows 7 verwenden

Januar 30, 2010

Weil ich daran eine Weile gebastelt habe und mich dann so gefreut habe, dass es doch funktioniert einen 11 Jahre alten Flachbettscanner von HP unter Windows 7 zum laufen zu bringen möchte ich die Lösung hier mal teilen, auch wenn es sonst eher nicht zu den Inhalten auf meinem Blog passt.  Wer will schon einen eigentlich funktionierenden Scanner den man nur 1 mal im Monat benötigt durch einen neuen ersetzen?

Ich bin folgend vorgegangen:

  1. Hier habe ich ein HP-TWAIN-DS Paket heruntergeladen.
    Das ist für folgende Scanner unter Windows 95/98/2000/XP/2003/NT:
    • Hewlett-Packard ScanJet 7400C
    • Hewlett-Packard ScanJet 5p
    • Hewlett-Packard ScanJet 6100C
    • Hewlett-Packard ScanJet 4p
    • Hewlett-Packard ScanJet 3p
    • Hewlett-Packard ScanJet IIcx
    • Hewlett-Packard ScanJet IIp
    • Hewlett-Packard ScanJet IIc
    • Hewlett-Packard ScanJet 5100C
    • Hewlett-Packard ScanJet 6200C
    • Hewlett-Packard ScanJet 5200C
    • Hewlett-Packard ScanJet 6300C
    • Hewlett-Packard ScanJet 4100C
  • Das habe ich entpackt und anschließend im Gerätemanager für den Scanner nach einem Treiber auf dem Rechner im entpackten Ordner gesucht.
    image
    Wichtig ist dabei, dass man manuell “Auf dem Computer nach einem Treiber” sucht und dort “Aus einer Liste von Gerätetreibern auf dem Computer” wählt und im Anschluss auf “Datenträger” klickt um den Ordner auszuwählen.
  • Der Treiber für den HP ScanJet 4100C steht zur Auswahl und wurde erfolgreich installiert.
  • Leider konnte man nun trotz erfolgreich installierten Treiber mit keiner Software einen Scan starten also versuchte ich HP Software zu finden.
  • Danach benötigt man die HP Scansoftware die man hier findet heruntergeladen, entpackt und installiert. (Ggf. Windows XP kompatibilitätsmodus einschalten, bei mir ging es auch ohne)
  • Rechner neu starten.
  • Sowohl mit den Tasten am Scanner als auch direkt über die Programme (Scannen bzw. kopieren) konnte ich den Scanner nutzen. Die Programme habe ich auf “Windows XP SP3” Kompatibilitätsmodus konfiguriert.
  • Windows Fax und Scan erkennt den Scanner leider trotzdem nicht, stört mich aber nicht solange die anderen HP Tools den Scanner ansprechen können.
  • Dieser Eintrag hat mich auf diese Idee gebracht. Das ganze sollte auch unter Windows Vista funktionieren denke ich. Auch da hatte ich eine Weile geforscht, den Scanner aber nie richtig zum laufen bekommen (außer mit VueScan). Viel Spaß, vielleicht hilft der Tipp ja noch dem einen oder anderen.

    h1

    Visual Studio 2010, TFS 2010 Linksammlung

    Januar 27, 2010

    Hier ein paar gesammelte und kategorisierte Links zum Thema TFS 2010, Visual Studio 2010.

    Links | Guidance, best practices

    Links | Entwicklung

    Links | Infrastruktur

    Links | Installation

    Links | Blogs