Sonntag, Mai 30, 2010

NVidia Treiber Aktualisierung (Win7)

Eigentlich wollte ich letzte Woche Donnerstag mal ein bisschen was bloggen, allerdings hat mich mein Rechner geärgert. Unter Umständen habe ich einen Bluescreen, HP empfiehlt den Grafikkarten-Treiber zu aktualisieren. Da hatte ich mir nichts böses bei Gedacht und einfach mal den aktuellen (schon 2 Versionen) von der HP-Seite heruntergeladen. Treiber installiert und dann das große Wundern, nach einem Neustart erschien kein Login-Window, nur ein schwarzer Bildschirm immerhin mit Mauszeiger. Dann ging das große Rätseln los, was denn das? Da ich unterwegs war, konnte ich auch nicht an einem anderen Rechner googlen, also versuchte ich in den Abgesicherten Modus zu booten. Im Abgesicherten Modus mit einem BitLocker geschützten System, muss der Recovery-Key eingegeben werden, ansonsten ist kein Booten möglich. Den Key hatte ich natürlich nicht, aber unser IT-Dienstleister, zum Glück ist der meistens erreichbar, so dass nach einigen Minuten der Key kam. Aber zum Erschrecken war das gleiche Verhalten auch im abgesicherten Modus vorhanden. Ich habe mehrere male gebootet und nach dem Modus gesucht, wo man wählen konnte, welche Treiber geladen werden sollen. Alles booten in den abgesichtern Modus half nichts. Der versuch “Last Known Good” zu booten, änderte auch nichts, so dass das Suchen nach einer Windows DVD los ging. Man kann nur mit einer Windows DVD oder mit einer Windows Rettungs DVD System Restore aktivieren und einen alten Zustand zurückrollen.

Gott sei Dank, wurde von Microsoft seit Vista System Restore als Komponente mitgeliefert. Ach wichtig ist natürlich, dass System Restore aktiviert ist. Wer nicht sichert ist, ob es aktiv ist, sollte es prüfen. Dazu ”Control Panel\System and Security\System” öffnen und anschließend “Advanced system settings” öffnen. Der Tab “System Protection” enthält die hilfreichen Funktionen. Wenn neben dem Laufwerk unter “Protection” “On” steht, dann sieht es gut. Man kann für das Laufwerk den maximal nutzbaren Speicherregeln und noch einiges mehr.

System Properties\System RestoreBei der Ausführung von MSI-Installation werden durch Windows automatisch Restore Points angelegt, so dass anschließend ggf. die Installation komplett zurückgerollt werden kann. In meinem Fall habe musste ich den Eintrag vor der Treiber Installation wählen.  Leider kann man System Restore nur mit einer DVD oder im gestarteten Windows (siehe Screenshot “System Restore”) durchführen, aber ansonsten eine super Sache.

Nach dem zurücksetzen hatte ich immer noch einige Probleme, aber nach und nach ist das System wieder Ok, hoffe ich. Meine Empfehlung, System Restore aktivieren und im Hintergrund mitlaufen lassen.

Montag, Mai 03, 2010

Oracle Batch Operation

Ich hatte mich letzte Woche bei einer Anwendung mit der Geschwindigkeit bei Datenbankoperationen beschäftigt. Die Anwendung schreibt etwa 100 Datensätze in einer große Tabelle mit ca. 60 Mio Datensätzen. Beim einfügen der Daten musste ich leider 20s warten, was für mein Verständnis für Datenbankzugriffe einfach nichz akzeptabel ist. Demzufolge habe ich die Gründe untersucht.

  1. Werden alle Daten in einer Transaktion geschrieben. In dem Thema verbirgt sich eine etwas heßliche Problemstellung. Die Oracle-Clientversion ist so eine seltsame Version, dass ich kein ODP.NET Treiber bekomme, der ohne Client-Neuinstallation arbeitet. Ich habe keine Möglichkeit die Ora-Client-Installation auf den Zielsystemen zu verändern. Um meine Absichten deutlich zu machen, habe ich trotz des Bewußtseins, dass es nicht funktioniert den TransactionScope benutzt. Im Anschluss die manuelle “old-style” Transaction geöffnet, IDbConnection.BeginTransaction.
  2. Trigger auf der Tabelle prüfen. Trigger verlangsamen die Ausführung der Änderungsoptionen und könnten schon einen negativen Effekt erklären.
  3. Indizes beeinflußen die Geschwindigkeit von Änderungsoperationen ebenso, so dass diese auch geprüft werden sollten.
  4. Andere Abhängige Datenbankobjekte prüfen, z. B. Materialized views (Snapshots).

Nunja, da ich mich mit der Anwendungsprogrammierung deutlich besser auskenne als in der DB-Programmierung, habe ich mich mit dem ersten Punkt beschäftigt. Meine Transaktionen waren vorhanden, aber die Geschwindigkeit war immer noch nicht befriedigend. Also die Idee eines Kollegen aufgegriffen, einen PL/SQL aus meinen Operationen zu erstellen. Bei der Ausführung eines PL/SQL-statements wird dieses durch die DB optimiert und als ein Block  übergeben, evtl. greifen auch einige zusätzliche Optimierungen. PL/SQL-Blöcke beginnen mit “BEGIN” und Enden mit “END”. Um den Befehl aus dem .NET-Framework über den ODP-Provider zu übergeben, müssen alle Anweisungen in einer Zeile aufgeführt werden. Zum Beispiel: BEGIN Stmt1; Stmt2; … END; Nach all der Mühe war ich von dem Ergebnis enttäucht. Es gab eine Verbesserung, allerdings nur maginal. Es gab auch nix an Triggern, die ich hätte verantwortlich machen können.

Allerdings gabe es 3 Indizes, 1 PK und 2 Indizes, bei einer 4 Spalten-Tabelle. Die Wahrscheinlichkeit ist sehr hoch, dass bei den Abfragen die definierten Indizes genutzt werden, so dass ich mich nicht daran zu schaffen machen wollte. Ein Kollege meinte zu dem, dass die Berechnung der Indizes nicht die Operation merklich beeinflußt.

Blieb nur noch der Punkt 4., es gibt 4 MVs, 2 werden OnDemand aktualisiert, 2 werden OnCommit (fast) aktualisiert. Also der Versuch alle Views mittels Demand von Operationen auf der Tabelle abzuklemmen. Oh Wunder, von 20s auf unter 1s, dass sind schon Zahlen, die ich für 100 einfüge Operationen in eine große Tabelle erträglich finde. Das Aktualisieren der Views wird durch einen seperaten Aufruf am Ende der Verarbeitung angetriggert und dauert einige Sekunden, allerdings weniger, als 100 Inserts mit Daueraktualisierng. MVs haben viele Vorteile, gerade beim Abfragen der Daten und könen die Performance von Abfragen um ein vielfaches Steigern. Wie aber auch geschehen, können andere Operationen verlangsamt werden.

Sonntag, April 25, 2010

ASP.NET SQL Membership database schema

AAAAAhhhh!!!

Mir war mal wieder nach Fluchen, als ich eine ASP.NET DB mit dem SQL-Express als File DB angelegt hatte. Ich konnte das Schema mit “ASPNET_REGSQL” nicht anlegen. Irgendwie ist es doof gemacht, dass das Tool nicht die Möglichkeit bietet auf eine File-DB zu zugreifen. Zugriff über das im SQL Server (Express) gemountet File ist eigentlich auch nicht so schwer, wenn manweiß wie, aber…

Ich habe den Weg direkt über ASPNET_REGSQL versucht und auch über SQL Server Management Studio und dann AttachDB. Beide Wege führten zu einem “Unable to attach physical file …” Operation System Error 5 --- WAS? Eigentlich könnte man den Fehler mit keine/zu wenig Rechte auf der Datei. Ich glaube, man muss auf dem Verzeichnis “Full Control” für den Dienst Nutzer vergeben. Ich habe es noch einfach gemacht, einfach “Everyone” auf FullControl für mein Projektverzeichnis.

Anschließend ASPNET_REGSQL starten. Auf der 2. Seite als Server “.\SQLEXPRESS” eingeben und den kompletten Pfad zum MDF-File.

image Anschließend nur noch warten und das Schema ist erstellt. Schade, dass es nicht aus dem Studio einfach durch einen klick auf die DB geht. (auch in VS 2010 nicht)

Auf jeden Fall habe ich nun mein Datenbank-Schema und kann mich weiter mit OpenID beschäftigen, denn ich will gar kein SqlMembership. ;) Ich bin der Meinung, dass Passwortverwaltung auf der eigenen Website gestern war. Dazu kommt bestimmt demnächst auch mehr.

SQL Server 2008 R2 Released? – Office 2010

Laut Microsoft Newsletter gibt es das neue Release des SQL Servers, also ab zu Technet/MSDN. Nur leider war ich sehr enttäucht, dass es nur CTPs für den R2 gab. Komisch aber am 21.4. war das Launch-Event. Dann muss ich leider noch warten, bis ich das neue Release installieren kann, Express, Management Studio.

Als Alternative gab es dafür bereits für Technet/MSDN Abbonennten Office 2010 zum Download. Den download habe ich dann natürlich sofort angeschmissen. Anschließend habe ich 1-2h überlegt, ob ich es installieren sollte. Wie sich die meisten denken können, ich habe das neue Office installiert. Ich muss sagen, dass es schon schick, anders aussieht. Ich freue mich jetzt schon auf die Conversation-View im Outlook, ich bin die Anzeige in Threads schon so aus Google gewöhnt, dass ich es dieses Feature im Outlook vermisst habe. Bei allen Office-Applikationen hat sich mal wieder das Ribbon verändert.

imageAls Entwickler ist das schon …. Zum einen fand ich diesen Buuble oben-links sehr ansprechend, zum anderen hat es bei der Entwicklung etwas genervt.

Dann hoffe ich mal auf den baldigen SQL Server Download.

Sonntag, März 21, 2010

SharePoint deployment

Letzte Woche wurde durch einige meiner Kollegen das erste CodePlex-Projekt unserer Firma veröffentlicht. Das Projekt XML based Content Deployment in SharePoint beschäftigt sich mit der Veröffentlichung von SharePoint-Projekten und –Artefakten. Das Projekt ist ein Ergebnis unserer Erfahrungen bei der Entwicklung und Veröffentlichung von SharePoint-Projekten und wird in Kundenprojekten verwendet. Soviel kann ich leider nicht zu dem Projekt sagen, da ich an dem Projekt nicht beteiligt bin und bisher kein Deployment mit dem Projekt gemacht habe. Die Verwendung des Projektes ist meines Wissens nicht eingeschränkt und kann beliebig verwendet werden, bitte trotzdem das Licence agreement beachten. Feedback zum Projekt wäre schön, bitte nutzt dafür den Diskussionsbereich.

Sonntag, März 14, 2010

Applikationsperformance

PPPuuuhhh, die Woche wurden größere Probleme mit der Performance festgestellt. Das Problem war so Akut, dass dringend gehandelt werden musste.

Um die Performance einer Anwendung zu verbessern muss man immer wieder messen, was wie lange braucht. Bei den Problemen, die bei uns aufgetreten sind, sind alle Schichten/Anwendungskomponenten involviert, so dass eine Fehlersuche nicht das einfachste ist. Simple Messung der Zeiten an bestimmten Punkten ist meistens schon genug. Ein ganzes Stück schicker geht es mit einem Profiler. Beim Messen musste ich feststellen, dass es überall nicht optimal läuft. Beim Client dauerte das Aufbereiten der Eingaben schon ewig, im Service brauchte das Speichern viel Zeit bei der Übergabe an die DB und noch schlimmer war die Verarbeitung in der DB.

Die Verarbeitungszeit im Service war nicht so tragisch, allerdings auch störend. Uns war bereits bei der Realisierung bewusst, dass das Speichern mit Linq to Sql bei Massendaten nicht optimal läuft, trotzdem wir schon einige Optimierungen genutzt haben. Der letzte Optmierungsschritt für die L2S-Verarbeitung war die Übergabe an die DB vorbei durchzuführen. Im letzten Jahr hatten wir in einem anderen Projekt bereits ähnliche Optimierung durchgeführt, allerdings habe ich diesmal einen anderen Weg, vermutlich effektiveren Weg gewählt, die Daten werden mittels Table-Valued Parametern übergeben, dadurch is eine einfache Übergabe der Massendaten möglich. Ein super Einführung in das Thema mit Beispielen für die .Net-Realisierung gibt es unter http://www.sommarskog.se/arrays-in-sql-2008.html. Letztendlich muss man einen eigenen Type im Sql-Server erstellen, optional eine Stored Procedure anlegen, bei mir enthält sie Insert/Update/Delete und anschließend im .NET-Code eine DataTable mit den Feldern des SqlServer Types anlegen und den Parameter konfigurieren. Beim Parameter muss der TypeName gesetzt werden, sowie der SqlDbType auf Structure.

Diese Optimierung entspannte die Lösung schon um einiges, aber weiterhin festzustellen war, dauerte die Ausführung in der DB immer noch viel zu lange. Bei aktivierten Triggern in der DB dauerte die Verarbeitung mehrere Minuten, ohne Trigger 10s. Für das Problem haben wir bisher noch keine Lösung, dies ist ein akuter Eingriff in das Verarbeitungsverhalten unserer DB. Ich bin überhaupt kein Freund von Triggern und bin auch der Meinung, dass Trigger versteckte DB-Logik sind. Vermutlich muss die gesamte Trigger-Verarbeitung herausgelöst werden.

Im Client war der Code nicht optimal, allerdings nun auch nicht so ineffektiv, allerdings für den Fall traten 20000 Aufrufe auf einen Code-Block auf, der Xml-Verarbeitung durchführte. 20000-Aufrufe in 3-4min, ungefähr 100 Aufrufe pro Sekunde, sind zu langsam und zum Teil für den Benutzer nur schwer nachzuvollziehen. Das Ergebnis wurde auch durch die Trial-Version von RedGates ANTS Profiler bestätigt. Die Optimierungen durchzuführen vielen mir relativ schwierig, so dass ich einen Kollegen gebeten habe, einfach den Code mal mit mir durchzusehen und Anmerkungen abzugeben. Die Fragen und Anregen waren sehr effektiv, so dass die Geschwindigkeit verdreifacht wurde. Eigentlich waren es ganz einfache Sachen, versuchen Type-Konvertierungen zu vermeiden, die 2. Xml-Verarbeitung reduzieren. Eine andere kleinere Optimierung war die Anpassung des XPaths, statt “//” (decendant-or-self) in der Abfrage zu verwenden, wird nun der XPath voll angegeben. Des Weiteren habe ich das Konvertierungsergebnis bei Type-Konvertierungen gespeichert und für eine erneute Konvertierung gespeichert, ob das sich als Vorteil im regulären Betrieb erweist, muss sich noch zeigen. Mit allen Optimierungen ist der Client bis 4 mal schneller, allerdings vermutlich nur unter Entwicklerbedingungen (wenige unterschiedliche Werte). Allerdings bringt auch das Release-Compile durch Inlining evtl. noch einige kleinere Vorteile.

Die Optimierung in Service und Client sind extrem wichtig und sollen die Nutzbarkeit deutlich verbessern, allerdings ohne eine Anpassung in unserer Datenbank, werden die Ergebnisse nichts bringen, da unsere Trigger noch immer zu viel Zeit verschlingen. Also noch einmal Ideen sammeln, wie wir das Problem reduzieren können.

Hoffentlich wieder mehr Zeit

Ich habe die vergangenen Wochen das bloggen komplett vernachlässigt. Grund für die Vernachlässigung waren massig Tätigkeiten im Job, ich musste noch “alte” Aufgaben aus 2009 erledigen, zu dem lief es in einem Projekt nicht rund. Das Problem waren im Projekt halt die Ressourcen und die Anzahl der Tätigkeiten, die noch zu tun waren.

Einiges kommt in den nächsten Wochen noch auf mich zu, im Unterschied zu sonst sind es einige größere Private-Events. Allerdings bin ich mal ich die nächsten Wochen auf Dienstreise und muss die Zeit im Hotel verbringen.

Freitag, Januar 15, 2010

jQuery 1.4 verfügbar

Ich habe gerade festgestellt, dass endlich das finale Release von jQuery 1.4 verfügbar ist.

Es hat sich einiges getan, mal wieder soll es deutlich schneller gehen und viele, viele Verbesserung bei der Programmierung. Ich habe noch einiges zu lesen heute. Ich freue mich schon auf den nächsten Einsatz von jQuery bei der Entwicklung.

Download unter: http://jquery.com/ oder 14 Days of jQuery

Freitag, Januar 01, 2010

Happy New Year

Nun ist schon fast der 1. Tag des Jahres vorbei, ich habe bisher noch nicht mal einen Rückblick auf das alte Jahr gepostet.

2009

In 2009 war fast alles mit einem Projekt vollgepackt. Das Projekt hat Spaß gemacht und war auch sehr interessant, sowohl menschlich als auch technologisch. Vielleicht bleibt der Kontakt mit den Kollegen bestehen, freuen würde es mich. Ein weiterer Vorteil des Projektes war die Lage, es war in Berlin und erforderte somit wenig Reiseaufwand, zu dem war ich nicht so abhängig von der DB. Leider muss ich auch sagen, dass in 2009 viele Kontakte zu “alten” Kollegen noch weniger geworden sind.

Die letzten Tage des Jahres habe ich mal fast komplett ohne Arbeit verbracht. Mal 1h um einen Kollegen zu helfen, ansonsten den Rechner nicht für Arbeit benutzt. Es war wirklich Zeit, dass ich mal entspannen konnte, pünktlich zum Urlaub kam eine kurze Krankheit dazu, die mich 1,5 Tage ziemlich belastet hatte, aber dann war alles wie weg geblasen. Die restlichen Tage habe ich mit Familie und Freunden verbracht. Etwas Stress kam dann für die Silvestervorbereitungen auf, nach dem wir keine bessere Idee gefunden haben, war wieder Raclette-Abend angesagt. Das Beste an den letzten Tagen des Jahres war das schöne Schneewetter. Die letzten Stunden waren richtig schön und auch die ersten Stunden haben viel Spaß gemacht, der Rest des ersten Tages war dann eher Dösen und Erholen.

Bloggen habe ich 2009 irgendwie nicht wie erwünscht auf die Reihe bekommen. Vielleicht wird es 2010 wieder regelmäßiger. Allerdings ohne entsprechende Themen kann man nix bloggen.

2010

Ich bin sehr gespannt, was das Jahr 2010 bringen wird. Im Gegesatz zum letzten Jahr, ist dieses Jahr wieder alles offen was das Projektgeschäft bei mir betrifft. Ich muss leider noch einige ältere Projekte abschließen, aber was dann …

Technologisch wird mit .NET 4.0, VS2010 und die Office 2010 Produkte wieder einiges Neues von Microsoft kommen, ob es direkt Auswirkungen in die aktuelle Arbeit bringen wird, bleibt abzuwarten. Als Entwickler möchte man natürlich immer das Neueste nutzen, aber nicht immer ist das auch sinnvoll. *leider*

Vielleicht ist Jahr 2010 auch ein Jahr von Veränderungen, keine Ahnung, einfach mal schauen. Einige Veränderungen bringt uns die neue „tolle“ Regierung, aber nutzen sie uns?

Freitag, Dezember 18, 2009

Xml Schema Documentation

In meinem aktuellen Projekt arbeiten wir/ich mal wieder mit einem Xml-Schema (XSD), dass die Grundlage für viele Operationen des Systems bildet. Demzufolge muss der Inhalt des Schemas “ausführlich” dokumentiert werden, so dass es für alle verständlich ist. Die ersten Schema-Knoten habe ich mittels Visual Studio dokumentiert, war ok, aber das war nicht wirklich angenehm und lesbar, also habe ich einfach noch eine andere alternative gesucht. In Google mal bisschen nach XSD-Tools gesucht und natürlich auf kostenlos geachtet, nur für Doku will ich nicht zahlen. Der Klassiker XmlSpy ist definitiv ein Klasse-Tool für X-Standards. Dann bin ich auf Liquid XML Studio 2009 gestoßen, von dem es auch eine kostenlos Version gibt, leider aber ohne viele Schema Features, aber einfach mal in der Trial-Version mit Schema-Editor gespielt. Letztendlich hat mich bei den grafischen Tools die Dokumentation der Elemente nicht wirklich überzeugt, ich will möglichst mit der Tastatur steuern.

Als Fazit aus dem Versuch habe ich mich wieder mit WPF beschäftigt und mir mal ein kleines Tool geschrieben, ich bin nicht super zufrieden mit dem Ergebnis, aber ich kann mein Schema nun recht nett bearbeiten, um es zu dokumentieren. Während der Arbeit an dem Tool habe ich gleich wieder viel WPF-Wissen zu DataBinding aufgefrischt und erworben. Außerdem habe ich endlich herausgefunden, wie ich sehr einfach meine ganze WPF-App Skalieren kann Es war sehr interessant.

Mein Xml Schema Comment Tool

Hier natürlich der download Link für den Source-Code. (Kompilierte Release Version für .net 3.5 sp1) Ich war dabei endlich die Navigation auszulagern, aufzuräumen und ein Ribbon einzuziehen, der Teil des Codes ist aber noch nicht brauchbar. Kommt wahrscheinlich später.

Bei der Entwicklung habe ich nicht nur viel zu WPF mal wieder gelernt, sondern habe auch einen kostenlosen Hoster für Projekte inklusive Versionsverwaltung gefunden. Die Features inkl. Project-Tracking gibt es bei Unfuddle. Ich bin mir nur noch nicht sicher mit dem Backup, ob es dort gemacht wird. Wobei bei GIT-Projekten Backups nicht ganz so kritisch sind, da jeder das komplette Repository hat.

Sonntag, November 29, 2009

CruiseControl.Net Xmpp-Notifier Plugin

Plugin Erstellung

Endlich mal wieder einen Tag frei. Da ich mit dem freien Tag nicht so viel anzufangen wusste, habe ich einfach mal ein CCNet Plugin erstellt. Allerdings musste ich erst mal herausfinden, was dafür zu tun ist. Die notwendigen Aktionen halten sich in Grenzen, allerdings ist es “gewöhnungsbedürfitg” das Plugin zu erstellen. Ich finde die Entwickler vom CCNet-Team hätten hier einen anderen Weg verfolgen soll. Andererseits muss das jeder selber beantworten. Als Einstieg sollte man die Custom Builder Plug-in Seite sich zu Gemühte führen.

Der 2. Schritt war nun das Suchen nach der richtigen Xmpp-Library (Xmpp==Jabber). Es gibt 3 Libraries für .Net, zumindest laut Wikipedia, also agsXMPP war mir bereits bekannt, also einfach mal Jabber-NET probieren. Um es vorweg zu nehmen – Jabber-NET hat nicht funktioniert, es wurden einfach keine Messages gesendet, also zurück zur bekannten Implementierung.

Nach dem alles zusammengesammelt war, musste das Projekt angelegt werden. Das Assembly muss definierten Regeln für CCNet-Plugins entsprechen, für mein Projekt also “ccnet.xmpp-notifier.plugin”. Anschließend eine Klasse anlegen und mit dem [ReflectorType("xmpp-notifier")]-Attribut versehen. Das letzte sind Attribute definieren und die Logik scribbeln. Ist alles getan kann man mit dem Testen loslegen. Das größte Problem war das herausfinden der .Net Reflector Attribute, aber wenn man sich am CCNet-Code entlang hangelt, war es relativ leicht zu schaffen. Ein bisschen Tricky, wenn das Kommunikationsobjekt zu schnell geschlossen wird, dann scheinen einfach Meldungen verschluckt zu werden.

Die Klasse für den CCNet-Task ist völlig unspektakulär, dort geschieht das reine Handling des Xmpp-Objektes

CCNet-Reflector-Attribute

Attribute-Name

Beschreibung

ReflectorType Name des des Tasks, wie dieser in der ccnet.config angesprochen wird. Der Name muss einem Teil des Namespaces entsprechend, unbedingt in der CCNet-Dokumentation genau befolgen.
ReflectorProperty Definition einer Property, die mittels Xml-Attributen konfiguriert wird. Der Name muss dem Attribut in der Konfiguration exakt entsprechen. Wenn Required=true angegeben wird, so wird im CCNet-Validator eine Meldung ausgegeben.
ReflectorArray Property um Arrays aus der Konfiguration abzulegen, zum Beispiel die Empfängerliste. Der Name der angegeben wird, ist das Gruppierungselement, anschließend müssen die einzelnen Einträge der Property entsprechen.
ReflectorHash so ähnlich wie Array

Configuration Sample

   1: <xmpp-notifier 
   2:     server="servername.domain.de" 
   3:     UserName="user@domain.de" 
   4:     Password="xyz1234">
   5:   <jids>
   6:     <Jid>user@anydomain</Jid>
   7:     <Jid>user2@anydomain</Jid>
   8:   </jids>
   9: </xmpp-notifier>

Properies

Property Name Beschreibung Default
server Optional, ein expliziter Servername für den connect, ansonsten wird dieser über die JID des Nutzers ermittelt.  
UserName JID des Benutzer für den Login  
Password Passwort des Benutzers  
jids/jid Nutzer, an die die Benachrichtung zu senden ist.  
message Meldung, die an die Nutzer gesendet wird

Project $(project) was integrated with status $(status) in $(time) min
Project Url $(projectUrl)

timeout Maximale Laufzeit für die Verarbeitung. 120s
headline Angabe, ob die events als HeadLine-Event gesendet werden sollen oder als normale Message. false

Download Code http://zieschang-jan.de/documents/Xmpp-Notifier.zip

Montag, November 09, 2009

Installing Windows 7

Heute habe ich mir endlich vorgenommen Windows 7 zu installieren. Für die Installation habe ich 1h veranschlagt, für die darauffolgende Einrichtung von Anwendungen 1 Woche ;).

Planung ist alles, zumindest hatte ich schon einen Großteil meiner Daten auf eine andere Platte kopiert, so dass es relativ zügig losgehen konnte. DVD ins Laufwerk booten und dann Setup auswählen. Aber dann die große Hürde – bei der Auswahl des Laufwerks ging nichts mehr Windows weigerte sich meine freie Partition mit 50Gb für die Installation zu nutzen. Wütend entschloss ich mich die angehangene 2. Partition auch noch dafür zu opfern, allerdings zu erst die Datensicherung. Oh man, aber ohne das geeignete Tool, Acronis CD funktioniert nicht, geht nix, also schnell Knoppix gesaugt. Dann dass kopieren der Daten, irgendwelche Platten haben bestimmt noch Platz.

Nach dem 2h vergangen sind seit dem Einschalten des Rechners der nächste Versuch der Installation. Versuch, weil es auch diesmal nicht ging. Verdammt, was zur Hölle soll das sein! Im Internet die Posts meinten Drives Partitionieren und Formatieren – nun ja, aber auch das schlug fehl. Eine Option viel mir später noch ein, wobei ich das nicht geglaubt hätte. Bei mir ist das Boot-Laufwerk nicht das Installationslaufwerk von Windows 7, ich switche beim Booten öfter mal die Platten um in meinen ESXi zu booten. Also schnell ins Bios, die Standard-Boot-Platte auf die “Empty” Partition einstellen. Oh Himmel, es geht!

30min nach dem Start der Installation war Windows 7 installiert ohne die ersten Anwendungen konnten installiert werden:

- VMWare Player 3

- Notepad++

- Security Essentials

- Paint.Net

Richtig, kein Firefox, vorerst zumindest.

Nun ja und dann gleich die Installation mit Visual Studio 2010 Beta 2 zu kleistern. Ob das irgendwann wieder weg geht? Irgendwann muss ich noch meine Lieblingsgames installieren.

Montag, Oktober 19, 2009

VS2010 Beta 2 und SharePoint 2010 Evaluation Guide verfügbar

Es gibt seit heute VS2010 Beta 2 zum Download in der MSDN. Einige Neuerung des .NET 4 im Blog von Scott Hanelman, unbedingt man vorbei schauen. Gut finde ich im neuen Studio, das der Multitargeting-Support auch für .NET 2 Apps erhalten bleibt, so kann man gerade für Silverlight-Projekte auf die neue Umgebung setzen, es lohnt sich sicherlich auch für andere Umgebungen.

Des Weiteren gibt es den SharePoint 2010 Eval Guide, der “kurz” über die Neuerungen im Sharepoint aufklären soll. Ich werde gleich mal drin rumstöbern.

Update: Ganz vergessen, seit heute steht auch das Release Datum für VS2010 fest – 2010-03-22.

Sonntag, Oktober 18, 2009

Git – Konkurrent für SVN

Ich habe schon seit einigen Wochen, oder ist es schon Monate her, GIT neben SVN auf dem Rechner. Seit einigen Tagen nutze ich es intensiv beim Arbeiten mit unseren SVN-Repositories. Ich nutze GIT derzeit meist eher um auf die SVN-Repos zuzugreifen, aber es macht sich schon relative gut. Besonders gut gefällt mir, dass es trotz gesamter Historie, das Verzeichnis auf lokal viel kleiner ist. Apropos Historie, im Unterschied zu SVN ist bei GIT die gesamte Historie lokal verfügbar und man kann zwischen den Ständen hin und her springen.

Der Einstieg in GIT ist ziemlich holprig, zumindest für mich. Ich habe mir eine aktuelle Version von msysGIT gezogen und dann losgelegt. Ich habe zuerst viel über das GUI versucht, aber momentan bin ich der Meinung, dass man am besten mit der Shell arbeiten kann.

Den Einstieg findet man am besten, wenn man sich mit dem Tutorial Git - SVN Crash Course befasst. Danach gibt einen GIT-SVN noch viele Fragen auf, aber  man kommt mit Google schon recht weit. Bisher ist der SVN-Zugriff in GIT a manchen Stellen noch etwas holprig, und reportet öfter mal Fehler. Zurzeit geht der Zugriff auf SVN:EXTERNALS nicht, so dass man sich die Verzeichnisse herein kopiert oder ein weiteres Repository anlegt. Eine andere Stelle, an der ich lange gesucht habe, sind die Ignores. Um Ausschlüsse zu definieren, muss man im Root-Folder des Repository eine Datei “.gitignore” anlegen. In der Datei kann man anschließend mit Mustern die Verzeichnisse oder Dateien definieren. Hier ein Auszug meiner Exclude-Datei:

   1: bin/**/*
   2: obj/**/*
   3: bin/
   4: obj/
   5: *.bak 
   6: *.~?? 
   7: *.jar 
   8: *.[Tt]mp. 
   9: *.suo 
  10: *.vss* 
  11: *.scc 
  12: *.suo
  13: *.resharper.user
  14: *.csproj.user
  15: *.webinfo 
  16: *.pdb 
  17: thumbs.db

Zum Schluss noch der entscheidene Tip. Zur Vereinfachung der Arbeit einfach TortoiseGit installieren. Damit arbeitet sich fast alles wie mit TortoiseSvn. Einige Regeln von Git sollte man allerdings immer im Kopf haben.

Sonntag, Oktober 11, 2009

CCNet 1.5 Security

Letzte Woche habe ich bestimmt 3-4h rumgefummelt um Security von einem CCNet-Server zu konfigurieren. Die Beschreibungen in der Dokumentation finde ich noch nicht so aussagekräftig.

Um Security zu nutzen ist es erst mal erforderlich, die Security auf Server-Ebene zu aktivieren, dies geschieht durch das internalSecurity-Attribute direkt unter dem Root-Node “cruisecontrol”.

   1: <internalSecurity>
   2:   <cache type="inMemoryCache" duration="20" mode="sliding"/>
   3:   <users>
   4:     <ldapUser name="*" domain="YOURDOMAIN.local"/>
   5:   </users>
   6:   <!--<audit>
   7:     <xmlFileAudit location="c:\ccnet_audit.log"/>
   8:   </audit>-->
   9:   <permissions>
  10:     <rolePermission name="SpecialPermission" forceBuild="Allow" viewProject="Allow" viewConfiguration="Allow" defaultRight="Deny">
  11:       <users>
  12:         <userName name="Special.User1"/>
  13:       </users>
  14:     </rolePermission>
  15:     <rolePermission name="ServerAdministrators" defaultRight="Allow">
  16:       <users>
  17:         <userName name="Special.User2"/>
  18:       </users>
  19:     </rolePermission>
  20:     <rolePermission name="general" forceBuild="Deny">
  21:       <users>
  22:         <userName name="*"/>
  23:       </users>
  24:     </rolePermission>
  25:   </permissions>
  26: </internalSecurity>

Da ich nicht extra Benutzer und ggf. Passwörter definieren, verwalten und sichern möchte, muss unser Active Directory dafür herhalten. Hierfür gibt es bei ccnet das “ldapUser”-Element. In meinem Build von 08.10.2009 funktionierte es nicht richtig in unserer Domaine, ich habe dazu einen Bug entsprechend angelegt. Es scheint als muss der Ldap-Helper für komplettes durchsuchen des ADs konfiguriert werden. Zu dem ist vermutlich der Zugriff über den Global Catalog (GC) schneller.

Anschließend ist für den Server die Security aktiviert. Nun kann man mit der “defaultProjectSecurity” die Rechte für das aktuelle Projekt definieren. Da die Security für ein Projekt ist, muss dieses auch unterhalb eines “project”-Tags folgen. Man kann bei der Permission des Projects  auf die Permissions des Servers referenzieren. Ich habe direkt die Permission zu spezifizieren nicht ausprobiert, kann aber noch kommen.

   1: <security type="defaultProjectSecurity">
   2:   <permissions>
   3:     <rolePermission  name="Administrators" ref="ServerAdministrators"/>
   4:     <rolePermission  name="Testers" ref="SpecialPermission"/>
   5:   </permissions>
   6: </security>

Nach der Aktivierung der Security sieht man auf der Startseite von CCNet nichts mehr, sofern nicht jeder Berechtigt ist.

image

Erst durch Auswahl des Servers, zumeist auf der linken Seite, und anschließendem Login, bekommt man die Projekte zu sehen.

image

Schade ist, dass man sich separate anmelden muss um Zugang zu bekommen, allerdings ist das nachvollziehbar, da die Security nicht durch die Web-App geprüft und verwaltet wird, sondern durch den CC-Server, der über Remoting mit der Web-App redet. Vorteil ist allerdings, dass so viele verschiedene CCNet-Server durch eine WebApp verwaltet werden können und unterschiedliche Berechtigungskonfigurationen aufweisen können.

Größtes Hinderniss war der oben erwähnte Bug, mal schauen, ob die Änderung in das Release noch hereinkommt. Aber nun funktioniert es sauber und ich kann alle auf das Web-Interface loslassen, da jeder nur seinen Teil sieht. :)

Vielleicht kommt demnächst noch etwas zu Parametern, die ebenfalls neu in 1.5 sind und etwas Dynamic in der CCNet-Prozess bringen.

Zum Schluß noch ein kleiner Verweis auf einen ineressanten Blog-Post zum Thema “Bootstrap your build – good practice for CruiseControl.Net”. Projektbestandteile oder ganze Bereiche auszulagern, ist super interessant.

Dienstag, Oktober 06, 2009

CCNet 1.5 – Security für Multi-Projektumgebungen

Wow, ich bin Ende der letzten Woche auf die aktuelle Pre-Release von CCNet gestoßen. Das nächste Release wird Security enthalten, so dass man super in Multi-Projekt-Umgebungen regeln kann, was wer darf. Der Download ist auf der WebSite bzw. CCNet LIVE. Die neuen Security Features sind sehr interessant, leider auch noch etwas sporadisch in der Dokumentation und daher auch nicht ganz so leicht zu verstehen.

Ich bin gerade mal wieder dabei eine Projekt-Build-Umgebung bereitzustellen, mal schauen, was dort wieder an Tasks/Tipps abfällt.

Es ist schön, wenn sich der Vorteil eines Build-Systems im Projekt deutlich bemerkbar macht. Wir haben vor einem Jahr ein Build-System in einem Projekt aufgesetzt und ich glaube es bereits zweistellig Projekttage gespart, die nur durch das Aktualisieren von Entwicklungs- und Testumgebung verbraucht worden wären. Wir haben zu dem Unit-Tests im Build-Vorgang integriert, die uns an kritischen Stellen auf Veränderungen hinweisen und einie minimale Build-Qualität sicherstellen.

To be continued …

Dienstag, September 29, 2009

Vorbereitung auf VS 2010

Boah, im aktuellen MSDN-Magazin gibt es massig Artikel zu Parallelisierung in VS 2010. Die Artikel sind sehr interessant und beschreiben ausführlich die Parallel Library (PL). Die Parallel Library gab es zum Glück schon für VS 2008 als Beta. Leider wird es diese nicht in der Finalen Version geben, meine Erfahrungen mit PL waren zu meist positiv. Für .NET 4 kann man diese einfach nur empfehlen, so einfach kann man Applikationen einfach nicht Parallelisieren.

Hier noch mal die Artikel:

Gibt noch viele andere Artikel, ein guter Einstiegspunkt ist das Parallel Computing Developer Center in der MSDN.

Montag, September 21, 2009

My own hypervisor

Wow, ich habe es endlich mal geschafft mir einen eigenen Hypervisor zu installieren. Als Entwickler hat man immer mal den Wunsch etwas Neues auszuprobieren. Neues probiere ich meistens in einer VM aus und auch ein großteil meiner Entwicklungsarbeit läuft in VMs. Wir nutzen auf Arbeit fast ausschließlich VMWare Produkte, d.h. ESX-Server und Workstations, auch Player. Daher habe ich für mich entschieden einen ESXi zu installieren, da dieser dann auch super mit meiner Arbeitsumgebung zusammenarbeitet und ich mir keine Sorgen um eine Windows-Lizenz machen muss. Zu dem gehört der ESX(i) mit sicherheit immer noch zur Besten Software auf dem Gebiet.

Nunja mein erster Installationsversuch scheiterte kläglich, ich bekam immer die Meldung “Failed to load lvm driver”. Ich dachte es handelt sich um ein Problem mit den SATA-Controllern auf meinem Board. Zum Glück kennt Google fast alles und so half etwas Googlen schon zu Einschränkungen des Problems. Die meisten mit einem ähnlichen Problem konnten es auf die Netzwerkkarte einschränken. Dann habe ich doch mal den Hardware Compatibility Guide zum ESXi bei VMWare aufgesucht. Oha, Board ist nicht in der Liste, hmm. Probieren wir es einfach mit einer Netzwerkkartenempfehlung. Also 4 Tage später, als mal etwas Zeit war in den Store gegangen und eine “Intel Pro 1000 GT” besorgt. Aufgrund des Guides habe ich wenig Hoffnung für die Installation gehabt. Allerdings oh Wunder nicht mal 10min später Stand das System. Für das Management soll man den VMware vSphere Client benutzen, der Client kommt mir dank VMWare Infrastructure bereits recht bekannt vor.

Am Wochenende habe ich dann noch einige VMs auf den Server geschoben, um endlich auch zu checken, wie das ganze nun läuft. Ohne besondere Investitionen in super performante Hardware läuft es sehr gut. Ich glaube, mein System ist über 3 Jahre alt und hat nur wenig Upgrades (Platte, Speicher, Netzwerkkarte) erhalten. Freue mich schon auf die nächsten VM mit denen ich arbeiten werde. :)

Sonntag, September 13, 2009

Endlich mal Zeit zum Lesen

Dieses Wochenende, genauer Sonntag, habe ich mir endlich mal die Zeit genommen einige Artikel von Patrick Smacchia zu lesen. Ich habe mir schon seit über einem Monat vorgenommen mich intensiv mit NDepend auseinander zu setzen. Mit dem Lesen der interessanten Artikel komme ich so wenigstens einen Schritt voran.

Die letzten Wochen waren sehr arbeitsreich, allerdings weniger am Computer, sondern viel mehr körperliche Arbeit. Da diese nun aber zum Großteil vorbei ist, kann ich mich wieder auf die IT-Themen konzentrieren. Am liebsten möchte ich alles machen; WPF, WCF, Silverlight, MVC, JQuery, Build Management, Entity Framework, ESXi, …. Ich muss mich doch mal wieder etwas mehr auf weniger Themen fokussieren. Dann sollten in nächster Zeit wieder mehr Blog-Einträge entstehen.

Sonntag, Juli 26, 2009

NDepend – Analyze code quality

Ich bin nun seit fast einem Monat stolzer Besitzern einer NDepend Lizenz. Leider komme ich bisher kaum dazu mal richtig mit den Ergebnissen mich auseinanderzusetzen. Cool ist es Grafisch die Abhängigkeiten zu sehen und auch zu verfolgen. Man sieht nicht nur die Abhängigkeiten, sondern auch eine vielzahl von Code-Metriken, wie zum Beispiel die zyklomatische Komplexität. Gelungen ist auch die Abfrage der Metriken mittels eine Code Query Language. CQL ist dem SQL nach empfunden und auch nach etwas lesen der vorhandenen Abfragen verständlich. Es ist auch eigentlich immer das einfachste vorhandene Queries anzupassen. Ich habe mir für die Arbeit mal einige Einführungen zusammengesucht mittels dem ich besser das Vorgehen für Refactoring lernen will. Auf der NDepend Seite gibt es zudem auch einige Webcasts, leider ohne Sprache, die das Vorgehen ebenfalls erklären.

Ach grundsätzlich ist es sehr hilfreich nach Blog-Posts oder Artikel von Patrick Smacchia, übrigens der Lead-Developer von NDepend. Zudem gibt es noch eine schicke Übersicht zu den Metriken von Scott Hanselman http://www.hanselman.com/blog/content/binary/NDepend%20metrics%20placemats%201.1.pdf.

In den Projekten muss leider immer erst der ”Need”, meist von außen, für das verstärkte Monitoring von Code Metriken und das anschließende verbessern des Codes entstehen. Ich hoffe mal, dass ich irgendwie mehr dazu kommen zumindest meinen Code mal zu optimieren, fals es sinnvoll ist. Nun erstmal möglichst viel lesen.

Sonntag, Juli 19, 2009

SharePoint (Web services) - MSBuild

Ich habe mich seit Freitag, hautpsächlich am Freitag, mal mit der Integration von MSBuilds und SharePoint Webservices beschäftigt. Ich möchte bei einem Integration-Build möglichst ohne Aufwände Daten in einer Sharepoint-Liste aktualisieren, oder auch mal neue Daten anhängen. Beim bingen nach einer out-of-the-box Lösung bin ich leider ins Leere gelaufen, daher der eigene Ansatz – Erstellen eines MSBuild Tasks.

Wer mit SharePoint über die Webservices arbeiten will, der sollte sehr fit mit Xml sein. Die Webservices arbeiten ausschließlich mit Xml Eingaben zur Steuerung. Mit den Beispielen in der MSDN kommt man gut voran, daher kann man sich schnell in die Webservice-Schnittstelle(n) einarbeiten.

Ergebnis der “Session” sind 3 MSBuild-Tasks um mit Listen im SharePoint zu interagieren. Den Source Code dafür gibt es hier: http://www.zieschang-jan.de/documents/MsBuildExtensions.zip. Ob ich den günstigsten Weg für die Abbildung der Eigenschaft für den Aufruf gewählt habe, weiß ich selber nicht so richtig, aber mir ist kein besser Weg dazu eingefallen.

Einrichtung

Um die Tasks nutzen zu können muss das Projekt compiliert werden, anschließend sind im Ausgabe-Verzeichnis  4 Dateien vorhanden. Es gibt nun 2 Möglichkeiten die Tasks zu nutzen:

  1. Kopieren der DLL und der “*.target”-Datei in den MSBuildExtensionsPath, welcher normalerweise “%programfiles%\MSBuild” ist. Anschließend im Import das Target-File referenzieren <Import Project="$(MSBuildExtensionsPath)\CapeVision.MsBuildExtensions.targets"/>
  2. Die Build-Dateien sollen lokal für das Projekt genutzt werden ohne globale Verfügbarkeit. In diesem Fall ist muss die Referenz für das Target angepasst werden, wie das geht ist im Sample.msbuild im Zip gezeigt.

Usage im MSBuild

Einbindung der Tasks:

   1: <PropertyGroup>
   2:   <CapevisionMsBuildExtensionsTasksPath>.</CapevisionMsBuildExtensionsTasksPath>
   3:   <SharePoint>http://sdc-srv-moss/SiteDirectory/mcc/</SharePoint>
   4:   <List>Bücher</List>
   5: </PropertyGroup>
   6: <Import Project="$(MSBuildExtensionsPath)\CapeVision.MsBuildExtensions.targets"/>

Abrufen alle Listen der SharePoint Site

Dazu muss die Url der SharePoint Site übergeben werden, anschließend werden alle Libraries (Bibliotheken) der Site zurückgegeben. Die Rückgabe kann mittels des Output-Parameters abgefragt werden und anschließend wie andere TaskItems behandelt werden. Das Item verfügt über die folgendenen MetaDaten:

  • ID
  • Title
  • Description
  • Modified
  • Created
  • ItemCount
  • EnabledAttachments
   1: <SharepointListGetListsTask SharePointUrl="$(SharePoint)">
   2:   <Output TaskParameter="Libraries" ItemName="myItems"/>      
   3: </SharepointListGetListsTask>
   4: <Message Text="@(myItems)"/>

Hinzufügen eines neuen Eintrages

Zum Anlegen eines Eintrages werden die Listen Felder und die Werte für diese Einträge benötigt. Beides wird als Items an den Task übergeben. Da ein Item benötigt wird und dies mit den Standardmitteln immer eine Datei erfodert wird im Beispiel immer das Build-Script selber referenziert. Die Spalten und die Werte müssen von der Anzahl übereinstimmen und werden entsprechend der Reihenfolge ausgewertet. Zusätzlich wird der Name der Liste benötigt, in die die Daten eingefügt werden.

   1: <ItemGroup>
   2:   <!-- Include schould result in only one file, item requires file present!-->
   3: <ListFields Include="Sample.msbuild">
   4:   <Name>Title</Name>
   5: </ListFields>
   6: <ListFields Include="Sample.msbuild">
   7:   <Name>Description</Name>
   8: </ListFields>
   9: <Add Include="Sample.msbuild">
  10:   <Name>New MsBuild Script Item</Name>
  11: </Add>
  12: <Add Include="Sample.msbuild">
  13:   <Name>This item was inserted by a script/Name>
  14: </Add>
  15: </ItemGroup>
  16: <SharepointListAddTask SharePointUrl="$(SharePoint)" 
  17:                        ListName="$(List)" ListFields="@(ListFields)"
  18:                        Values="@(Add)"/>

Ändern eines Eintrages

Am kompliziertesten ist das Ändern eines Eintrages, es muss zu den Felder und den Werten noch eine Bedingung übergeben werden, welche Einräge zu ändern sind. Aber an sich doch dann selbstsprechend, oder? Es gibt eine Einschränkung, maximal werden 200 Elemente geändert, weil nur 200 mit der Bedingung geladen werden. Die Bedingung kann sich aus mehreren Einträgen zusammensetzen, diese werden mit UND verbunden. Bei Condition könnte noch ein “operator” mitgegeben werden, der definiert, wie der Vergleich auszuführen ist. Der Standard-Operator ist “Eq”, also Gleichheit.

   1: <ItemGroup>
   2:   <!-- Include schould result in only one file, item requires file present!-->
   3:   <ListFields Include="Sample.msbuild">
   4:     <Name>Title</Name>
   5:   </ListFields>
   6:   <Update Include="Sample.msbuild">
   7:     <Name>Updated MsBuild Script Item</Name>
   8:   </Update>
   9:   <Condition Include="Sample.msbuild">
  10:     <field>Title</field>
  11:     <value>New MsBuild Script Item</value>
  12:   </Condition>
  13: </ItemGroup>
  14: <SharePointListUpdateTask SharePointUrl="$(SharePoint)"
  15:                        ListName="$(List)" ListFields="@(ListFields)"
  16:                        Values="@(Update)"
  17:                        QueryCondition="@(Condition)"/>

TODOs

  • Momentan kann man keine ListItems abfragen, dass muss ich definitiv noch für MSBuild nach ausenlegen. Eigentlich ist der Code bereits vorhanden, denn beim Update werden die Einträge für die Referenzierung (ID) benötigt.
  • Ich werde die Abfragesprache für das Updaten und Laden von Items auf SQL-like Queries umstellen. Dazu gibt es bereits ein interessantes Projekt auf Codeplex http://yacamlqt.codeplex.com/. Die Integration sollte auch nicht so schwer sein.