Markus Alt hat in seinem Blog einen Link zu einem Whitepaper, das die Umsetzung eines Entwicklungsprozesses nach dem V-Modell XT mit Hilfe des Team Foundation Servers beschreibt. Das Dokument ist als PDF und als MSDN-Artikel verfügbar.
Ich nutze von meinem Notebook eine VPN-Verbindung über WLAN. Dabei habe ich immer wieder das Problem, dass die VPN-Verbindung behauptet, ich brauche zuerst eine Internet-Verbindung um die VPN-Verbindung nutzen zu können obwohl die Internet-Verbindung steht.
Inzwischen habe ich rausgefunden, dass das an den Virtal Ethernet Adapter liegt, die VMware auf meinem Rechner installiert haben. Wenn ich diese Adapter disable, dann funktioniert die VPN-Verbindung auf Anhieb.
In Excel kann man ein Textfeld anlegen und diesem einen variablen Inhalt geben. Hierzu markiert man das Textfeld und gibt in der Formelzeile z.B. einen Verweis auf eine Zelle ein (=A1). In A1 kann nun eine beliebige Formel stehen, z.B. ="Summe: " & SUMME(A2:A20). Möchte man in den text einen Zeilenumbruch einfügen, dann kann man die Funktion ZEICHEN(10) verwenden, also z.B. = "Summe 2006: " & SUMME(A2:A20) & ZEICHEN(10) & "Summe 2007: " & SUMME(B2:B20)

Seit Anfang Mai bin ich nun CLIP-Mitglied. Leider bin ich im Moment derart im Stress, dass ich erst jetzt dazu komme das hier zu bloggen. Leider leidet unter meiner aktuellen Arbeitsbelastung auch mein Blog, den ich momentan sehr vernachlässige, aber das wird sich hoffentlich bald wieder ändern.
http://www.microsoft.com/germany/community/programme/clip.mspx
Gerade hatte ich mal mit den Settings für Winform-Anwendungen etwas rumgespielt und bin dabei darauf gestoßen dass man auch für Klassenbibliotheken eine Settings-Datei anlegen und darin Werte erfassen kann. Die Frage war nun, wie kann ich diese Werte einstellen, wenn ich die Klassenbibliothek in eine Anwendung integriere? Nach einigem Googeln und Testen hier nun meine Ergebnisse:
- Die Konfiguration der Anwendung inkl. aller Klassenbibliotheken werden über eine zentrale konfigurationsdatei (app.config bzw. <Anwendungsname>.exe.config) vorgenommen.
- Die Konfigurationsparameter der Klassenbibliothek werden in diese zentrale Konfigurationsdatei leider nicht automatisch übertragen.
- Werden keine Konfigurationsparameter für die Klassenbibliothek angegeben, behält diese ihre Default-Werte (das sind die, die beim Kompilieren in der app.config der Klassenbibliothek standen). Diese Default-Werte sind in der Settings.Designer.cs hinterlegt und werden in die DLL reinkompiliert.
- Man kann diese Default-Werte übersteuern, indem man in der app.config der Anwendung einen zusätzlichen Settings-Block einfügt (im unteren Beispiel der Bereich ClassLibrary1.Properties.Settings). Diesen kopiert man am besten aus der app.config der Klassenbibliothek. Wichtig ist, dass dieser neue Block noch registriert wird. Dies passiert im Bereich <configSections> mit der Zeile.
<section name="ClassLibrary1.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
Sonst erhält man eine Exception, dass die Configuration ungültig ist.
Nun kann man aus der Anwendung heraus auch die Parameter der Klassenbibliothek einstellen. Ich habe das z.B. verwendet um mir die Übergabe von Konfigurationsparametern an die Klassenbibliothek zu ersparen.
Was mir allerdings nicht besonders gut gefällt, ist die Tatsache, dass ich beim hinzufügen von neuen Config-Parametern für die Klassenbibliothek immer daran denken muss, auch in der Anwendung diese hinzuzufügen. Vergesse ich das, erhalte ich zwar keinen Fehler aber es wird einfach mit dem Default-Wert gearbeitet. Das kann manchmal durchaus erwünscht sein, in anderen Fällen ist das aber eher problematisch.
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > <section name="WindowsApplication1.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> <section name="ClassLibrary1.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </sectionGroup> </configSections> <applicationSettings> <WindowsApplication1.Properties.Settings> <setting name="Setting" serializeAs="String"> <value>abc</value> </setting> </WindowsApplication1.Properties.Settings> <ClassLibrary1.Properties.Settings> <setting name="Setting" serializeAs="String"> <value>zzzz</value> </setting> </ClassLibrary1.Properties.Settings> </applicationSettings> </configuration>
Wird ein Connection-String in der config-Datei abgelegt, sollte man darin das Kennwort verschlüsseln. Der Connection-String sieht dann ungefähr so aus:
Data Source=MeinServer;Persist Security Info=True;User ID=User1;Password=vM17E6mtBos=;Unicode=True
Wenn man den Connection-String nun verwenden möchte, muss man darin das Passort erst einmal finden, entschlüsseln und dann im Connection-String das verschlüsselte Kennwort mit dem entschlüsselten ersetzen. Zum Entschlüsseln habe ich eine kleine Funktion eingesetzt, die einfach die Funktionen aus dem System.Security.Cryptography-Namespace verwendet. Das Suchen des Passworts mache ich dann mit einem RegEx:
private string Decrypt(string _connectionString) { Regex r = new Regex(@"^.*?Password=(?<Password>[^;]*)(;|$)", RegexOptions.IgnoreCase); string encrypted = r.Match(_connectionString).Groups["Password"].Value; string decrypted = Decrypt(encrypted, key); return _connectionString.Replace(encrypted, decrypted); }
Nachtrag:
OK, OK, auf dieses Post habe ich zum ersten mal seit ich blogge Kommentare bekommen und das gleich dutzendweise. Leider funktioniert die Bestätigungsfunktion für die Kommentare bei meinem Blog momentan nicht, da muss ich mal schauen.
Die meisten Kommentare bezogen sich darauf, dass man die config-Datei ja auch mit .net Bordmitteln einfach verschlüsseln kann. In meinem Fall war aber der Wunsch im Vordergrund, dass nur das Kennwort verschlüsselt werden sollte. Der Server sollte im ConnectionString frei editierbar sein. Und das ist meines Wissens nach mit den Standardmethoden nicht möglich. Gut, das hätte ich vielleicht im Post etwas klarer rausstellen sollen, aber...
Trotzdem hier als Ergänzung ein paar Links, die aus den Kommentaren, die das Thema Verschlüsselung der config-Datei beschreiben.
http://www.primetime-software.de/rouven.haban/PermaLink,guid,603e3d04-c67e-4837-9f9b-bc9fc3a15b9c.aspx
http://aspnet.4guysfromrolla.com/articles/021506-1.aspx
Hoffe damit sind nun alle zufrieden. Eigentlich ist es schon erstaunlich, dass man auf einen "schlechten" Post Antworten ohne Ende bekommt, auf die normalen oder vielleicht den einen oder anderen guten tut sich da gar nichts. Na ja, vielleicht überlege ich mir einfach in Zukunft hin und wieder Murks zu schreiben, ist doch recht interessant zu sehen, wer so alles meine Posts liest.
Mit der statischen Codeanalyse in VS kann der Quellcode nach verschiedenen Regeln analysiert werden. Es lassen sich auch eigene Regeln erstellen. Beginnt man damit zu arbeiten, ergibt sich die Frage, wie kann man die benutzerdefinierten Regeln und die Einstellung, welche Regeln verwendet werden sollen auf mehrere Projekte und für mehrere Entwickler anwenden.
Dazu ein paar Überlegungen:
1.) Benutzerdefinierte Regeln können durch Kopieren der entsprechenden DLL-Dateien auf die einzelnen Rechner verteilt werden. Dies kann z.B. über das Login-Script erledigt werden.
2.) Die Einstellungen welche Regeln aktiviert sind, sind im Projekt hinterlegt. Über die Quellcodeverwaltung nutzen somit alle Entwickler, die das Projekt bearbeiten, die gleiche Einstellung.
3.) Um die Einstellungen für neue Projekte zu übernehmen bietet sich die Erstellung einer entsprechenden Projektvorlage an, in der die entsprechenden Einstellungen vorgenommen werden. Wird ein neues Projekt auf dieser Vorlage erstellt, so erbt dieses die Einstellungen aus der Vorlage.
Gruppierungen in Excel sind eine feine Sache. Möchte man allerdings untenstehendes Beispiel gruppieren, ergibt sich ein Problem.
Die Gruppenzeile soll in diesem Fall oben stehen. Standardmäßig geht Excel aber davon aus, dass die unterste Zeile einer Gruppe bei einer eingeklappten Gruppierung übrig bleibt. Damit sieht dann das Resultat in dem Beispiel so aus, dass die Gruppe gar nicht mehr angezeigt wird:
Es gibt eine Möglichkeit, dies über eine Einstellung zu ändern. In Excel 2003 findet man die Menü Daten / Gruppierung und Gliederung / Einstellungen. In Excel 2007 ist die Einstellung etwas versteckt. Unter Data befindet sich im Bereich Outline rechts unten ein kleines Kästchen.

Klickt man darauf, dann öffnet sich ein Fenster, in dem man nun die Option Summary rows below detail abwählen kann.
Damit kann man die Gruppierung nun wie gewünscht einstellen.
Noch ein kleiner Tipp: Mit Shift + Alt + Pfeil rechts kann man die Gruppierung auch per Tastatur für die aktuell markierten Zeilen einstellen. Shift + Alt + Pfeil links hebt die entsprechende Gruppierung auf.
Das PropertyGrid ist ein sehr hilfreiches Control, mit dem man einfach die Inhalte der Properties einer Klasse an der Oberfläche anzeigen und bearbeiten kann. Ich hatte hierzu schon zwei Posts : Verwendung des Property-Grids, Dateien und Ordner im Property-Grid auswählen
Das Property-Grid stößt allerdings an seine Grenzen, wenn man damit mehrsprachige Umgebungen unterstützen möchte. Die Anzeige im PropertyGrid ist immer direkt vom Namen der Properties abgeleitet und die Description etc. wird über Attribute angegeben, die nicht über Ressource-Files lokalisiert werden können.
Auf Code-Project habe ich ein erweitertes Property-Grid gefunden, das genau dieses Problem beseitigt.
Link to PropertyGrid utilities - The Code Project - C# Programming
Danke an Chris für den Link!
Vor allem wenn man mit Services programmiert, hat man oft die Anforderung, dass beim Debuggen mehrere Projekte innerhalb der Solution gestartet werden müssen, z.B. ein Service und ein entsprechender Client. Der manuelle Weg war hier, dass man den Service als Startup-Projekt eingertragen hat, das debuggen startet und dann auf den Client im Solution Explorer mit der rechten Maustaste klickt und dann hier Debug / Start new Instance auswählt. Es gibt aber auch noch eine elegantere Möglichkeit. Auf der Eigenschaftsseite der Solution (rechte Maustaste / Properties) kann man unter Startup Project auch die Option Multiple startup projects wählen. Hier kann man nun bei mehreren Projekten die Action auf Start bzw. Start without debugging einstellen. Sogar die Startreihenfolge der einzlnen Projekte lässt sich definieren. Damit starten nun die eingestellten Anwendungen auf einmal.
Will man eine Liste nach XML serialisieren, die über ein Interface definiert ist, dann funktioniert das nicht. Es bleibt hier wohl nur die Möglichkeit, einen eigenen Serialisierer zu schreiben. In meinem Fall konnte ich das umgehen, indem ich auf das Interface verzichtet habe. Sollte jemand hier eine gute Idee haben, dann wäre ich für ein kurzes Feedback dankbar um das zukünftig zu berücksichtigen. Im Moment heißt das für mich, dass beim Serialisieren Interfaces tabu sind.
Ein Beispiel für eine nicht serialisierbare Liste ist z.B.
List<IMyInterface>
Bei der Dotnet Usergroup Bremen wurde das Thema in einem kleinen Artikel ausführlich diskutiert. Link to DOTnet Usergroup Bremen Danke an Chris für den Link
Eine umfangreiche Sammlung von Videos für die Entwicklung mit ASP.Net finden sich unter dem unten stehenden Link. Dabei wird ein weites Themenfeld abgedeckt. Vom Umstieg von ASP.Net 1.1 auf ASP.Net 2.0, Einstieg in ASP.Net 2.0, ASP.Net AJAX und auch zuküftige Themen wie LINQ, BLINQ etc. Link to ASP.NET-Videos für jeden Entwickler
Will man die Kalenderwoche zu einem Datum herausfinden, dann kann man die Funktion GetWeekOfYear nutzen.
CalendarRow.Week = Application.CurrentCulture.Calendar.GetWeekOfYear(CurrentDate, System.Globalization.CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
Diese Funktion hat allerdings einen kleinen Bug. So wird beispielsweise für den 31.12.2007 KW 53 zurückgegeben. Der darauffolgende Tag, ein Dienstag, ist dann allerdings in KW 1. Eigentlich müssten die Tage einer Woche aber immer in der selben KW sein. Abhilfe schafft hier eine kleine Korrektur. Wir haben ja eingestellt, dass unsere Woche am Montag beginnen soll (DayOfWeek.Monday) und dass die Woche immer dann als KW 1 betrachtet werden soll, wenn wenigstens 4 Tage davon im neuen Jahr liegen (System.Globalization.CalendarWeekRule.FirstFourDayWeek). Der Trick ist nun, dass man einfach immer 3 Tage hinzuzählt, wenn das gesuchte Datum zwischen Montag und Mittwoch liegt. Damit wird aus dem Montag Donnerstag, aus Dienstag der Freitag und aus dem Mittwoch ein Samstag. Da der Donnerstag der Tag ist, von dem abhängt, ob die Woche im neuen oder im alten Jahr liegt, haben wir Montag bis Mittwoch einfach nach hinten geschoben, so dass diese auf jeden Fall im neuen Jahr liegen und damit auch korrekterweise die KW 1 ergeben.
CalendarRow.Week = Application.CurrentCulture.Calendar.GetWeekOfYear(CurrentDate.DayOfWeek >= DayOfWeek.Monday && CurrentDate.DayOfWeek <= DayOfWeek.Wednesday?CurrentDate.Add(new TimeSpan(3,0,0,0)):CurrentDate, System.Globalization.CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
Mit diesem kleinen Plugin kann man Code-Ausschnitte direkt aus VS mit dem Windows Live Writer bloggen. Das Plugin übernimmt dabei die komplette Formatierung. Die Farbcodierung von VS bleibt dabei erhalten. Link to BlogMyCode VS2005 plugin
Ralf Westphal war am 20.03 in Ulm. Von 10:00 bis 17:00 konnten ihn in einer Kaffeehaus-Konsultation Entwickler mit Fragen löchern. Das Angebot wurde rege angenommen.
Sogar die regionale Presse hat über das Ereignis berichtet.
Danach hielt Ralf im Rahmen des Treffens der .net Developer-Group Ulm einen Vortrag zur Komponentenorientierung in der Software-Entwicklung.

 George Shepherd hat eine Vielzahl von wirklich guten Tipps & Tricks zur Windows- und Web-Programmierung in zwei FAQ-Listen zusammengetragen. Wirklich ein Quell von Anregungen, Problemlösern und Tipps & Tricks. Nicht nur zum Nachschlagen, sondern auch mal zum durchlesen empfohlen. Link zu Windows Forms FAQ Link zu ASP.NET FAQ
Um den Inhalt einer DataRow in eine andere DataRow zu kopieren kann einfach folgende Anweisung verwendet werden:
newRow.ItemArray = ( object[])copyRow.ItemArray.Clone();
Am 20. März ist Ralf in Ulm, um eine seiner berühmten Kaffehauskonsultationen im Cafe Bellavista zu geben. Wer sich also schon immer mal mit einem ausgewiesenen Experten in Sachen .net über ein Problem oder eine Idee unterhalten wollte, der kann jetzt die Gelegenheit nutzen - kostenlos! In der entspannten Umgebung eines Cafes lässt sich über vieles angenehmer diskutieren als auf Konferenzen oder sonstigen Veranstaltungen. Interessenten sollten sich unbedingt vorher bei Ralf per Mail anmelden.  Link to One Man Think Tank Gedanken: Kaffeehauskonsultation in Ulm
Das PropertyGrid ist ein sehr hilfreiches Control, mit dem man einfach die Inhalte der Properties einer Klasse an der Oberfläche anzeigen und bearbeiten kann. Ich hatte hierzu schon zwei Posts : | |