2011-08-21

Nuget package für verschiede Frameworks

von JZieschang

Eigentlich sollten in der Zwischenzeit alle .NET Entwickler von Nuget gehört haben. Nuget ist wirklich ein sehr schönes Mittel Bibliotheken, Komponenten und Artefakte zu verteilen und für anderen zur Verfügung zu stellen. Für Nuget gibt es eine gute Integration ins Visual Studio 2010, leider nicht in die älteren Versionen, zusätzlich eine Kommandozeilen und Powershell Version. Da ich viel auf Reisen bin, habe ich mir die wichtigsten Pakete, die ich immer wieder brauche in ein lokales Repository gezogen.

nuget install <packagename>

Aus dem heruntergeladenen und installierten Paketen habe ich anschließend alle nupkg-files in einen Ordner kopiert, fertig war mein Repo. Wer mag kann noch eine Nuget-Server (http) daraus machen, dazu muss man nur das Paket “nuget server” 
Im Package Manager im VS kann man mittels Add superleicht seine eigenen Quellen hinzufügen.

Visual StudioNuget Manager Konfiguration

Ein Paket kann man superleicht aus jedem Projekt erzeugen.

Nuget spec <packageName>
Nuget pack <projectFile>

Erzeugt ein Spec file. Wenn es zusätzlich im Verzeichnis der SLN ausgeführt wird, dann werden die Parameter als Platzhalter übernommen. mit dem 2Kommando wird das nupkg erzeugt und der Output des Projektes hinzugefügt.

Der Teil war einfach. Nun sollte das Paket allerdings mehrere FX-Versionen unterstützen. Dazu muss man im SPEC-file den Output entsprechend in verschiedenen Ordnern einsortieren. Im file-Element kann man mittels des target-Attributes das Verzeichnis im Package definieren. Im Beispiel unten werden die Assemblies für Framework 2.0 in den Ordner “lib\net20” einsortiert.

lib\net20 .NET Framework 2.0
lib\net40 .NET Framework 4.0
lib\sl40 Silverlight 4.0

Nach dem editieren sah mein Spec File so (oder so ähnlich aus):

1 <?xml version="1.0"?> 2 <package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd"> 3 <metadata> 4 <id>MyPackageName</id> 5 <version>$version$</version> 6 <authors>Jan Zieschang</authors> 7 <owners>Jan Zieschang</owners> 8 <!--<licenseUrl>http://LICENSE_URL_HERE_OR_DELETE_THIS_LINE</licenseUrl> 9 <projectUrl>http://PROJECT_URL_HERE_OR_DELETE_THIS_LINE</projectUrl> 10 <iconUrl>http://ICON_URL_HERE_OR_DELETE_THIS_LINE</iconUrl>--> 11 <requireLicenseAcceptance>false</requireLicenseAcceptance> 12 <description>Here I should describe my package a bit</description> 13 <tags>Tags For Grouping And Finding</tags> 14 <dependencies> 15 <dependency id="PostSharp" version="2.1"/> 16 <dependency id="log4net" version="1.2" /> 17 </dependencies> 18 </metadata> 19 <files> 20 <file src="bin\Release\myPackageLib.dll" target="lib\net40"/> 21 <file src="bin\Release\myPackageLib.xml" target="lib\net40"/> 22 <file src="bin\Release\myPackageLib.pdb" target="lib\net40"/> 23 <file src="bin\Release2\myPackageLib.dll" target="lib\net20"/> 24 <file src="bin\Release2\myPackageLib.xml" target="lib\net20"/> 25 <file src="bin\Release2\myPackageLib.pdb" target="lib\net20"/> 26 </files> 27 </package>

Nun schlug aber der “Nuget pack” Aufruf fehlt. Nach etwas probieren musste ich feststellen, dass der Aufruf nun das Spec file direkt benötigt.

1 "%nugetPath%" pack "MyPackageName.nuspec" -Version %1 -OutputDirectory "%output%" -symbols -Properties Configuration=Release

Wie man ein Package erstellt kann man noch viel detaillierter unter http://docs.nuget.org/docs/creating-packages/creating-and-publishing-a-package nachlesen. Hier noch einige Tipps für die Paketierung – http://lostechies.com/joshuaflanagan/2011/06/23/tips-for-building-nuget-packages/. Publishen von Packages ist mehr als simpel. Paket in den Ordner kopieren und oder mittels nuget push auf den Paket Server schieben. Ich kam nun aber zu meinem eigentlich Problem.

Da ich für mein Projekt mehrere Ausgaben für unterschiedliche Frameworks erzeugen wollte, musste ich irgendwie meine Projekt-Referenzen austauschen. Letztendlich habe ich mein Project files editiert und die Hint-Paths für die Assemblies verändert.

1 <Reference Include="log4net"> 2 <HintPath>..\packages\log4net.1.2.10\$(Log4NetHintPath)\log4net.dll</HintPath> 3 </Reference> 4 <Reference Include="PostSharp, Version=2.1.0.0, Culture=neutral, PublicKeyToken=b13fd38b8f9c99d7, processorArchitecture=MSIL"> 5 <HintPath>..\packages\PostSharp.2.1.2.8\$(PostSharpHintPath)\PostSharp.dll</HintPath> 6 </Reference>

Die beiden Hint-Paths für die Referenzen PostSharp und Nunit werden mittels einer Variable dynamisiert. In einer PropertyGroup mit einem Condition-Element können die Referenzen ausgetauscht werden.

1 <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release3.5|AnyCPU'"> 2 <PostSharpHintPath>lib\net20</PostSharpHintPath> 3 <Log4NetHintPath>lib\2.0</Log4NetHintPath> 4 <TargetFrameworkVersion>v3.5</TargetFrameworkVersion> 5 </PropertyGroup>

Achtung: Sollte man die Referenzen aktualisieren, zum Beispiel weil es neue Versionen als Nuget-Package gibt, muss ggf. der Hint-Pfad erneut korrigiert werden.

Außer dem Hint-Path muss die Property “TargetFrameworkVersion” gesetzt werden. Dadurch kann man mit MSBuild 4.0 alle Fx Versionen bauen. (Ich glaube, es gebe auch schon in MSBuild 3.5)

Das war die minimal Version. Aber ich habe schon seit Wochen TeamCity auf meinem Rechner gehabt und CI Builds von meinem Paket zu erzeugen. Außerdem wollte ich auch eine minimal Validierung meines Setups haben.

TeamCity Build Steps for my build

Aus bauen und Paket erstellen ist sind 4 Schritte geworden. Baue Fx4 Version, Validiere diese Version, Baue Fx3.5 Version Validiere diese und anschließend erstelle mein Nuget-Paket. Natürlich übernimmt der CI Server auch die Versionierung der Assemblies und des Paketes und checkt die Version immer sauber aus.

Technorati Tags:
Schlagwörter: , , , ,
2011-08-21

Braucht man für DVCS auch lokale Build-Server?

von JZieschang

DVCS steht für Distributed Version Control System. DVCS  ist nicht neu, aber es ist seit einigen Jahren noch stärker in Mode gekommen. Die beiden gängigsten Vertreter sind Mercurial (HG) und GIT. Zurzeit nutze ich für meine “Spiel”-Projekte Mercurial, da es unter Windows etwas angenehmer ist und BitBucket unbegrenzte (private) Repos zur Verfügung stellt.

Das Gute an DVCS ist, dass man sämtliche Informationen lokal hat und auch alle Interaktionen mit dem Repository lokal durchführt. Nur ab und an muss man sich mit dem “source” Repo verbinden und die Informationen updaten. Andere haben die Möglichkeit vom eigenen Repo eine komplett arbeitsfähige Kopie zu ziehen. Ich nutze am meisten lokale Branches und Commits (Reverts). Ich hatte leider einige mal Dateien vergessen einzuchecken (genau wie bei zentralen Repos). Ohne Continuous Integration (CI)  Build merkt man das vermutlich erst, wenn man mal einen anderen Rechner nutzt. Bei zentralen Repos nutze ich eigentlich immer CI, bisher bei DVCS eher weniger. Nach vergessenen Dateien und der Frage, wie ich das abstellen kann, habe ich mich entschieden lokal zu integrieren.

Ich habe mein lokales DVCS Repo in einem Build-Server konfiguriert, so dass dieser einen Clone erzeugt und anschließend gegen die Version kompiliert. Später habe ich auch noch die Ausführung von Tests hinzugefügt. Mir ist dabei erst wieder aufgefallen, wie viel man beachtet, wenn man ein weiteres Feedback der Kompilierung erhält. Denn im Studio geht doch fast immer alles. Man kann das lokale CI noch verbessern, in dem man einen Remote-Build-Agent benutzt, so dass auch ggf. Abhängigkeiten zu VS.NET Installation oder anderer Software erkannt werden können. Seit einiger Zeit habe ich mir auch angewöhnt Unit-Tests zu schreiben, es wird immer leichter einen Test zu schreiben, leider vergesse ich aber öfters die Tests vor dem Checkin laufen zu lassen. Mein Build-Server nimmt mir diese Arbeit ebenfalls ab, so dass ich schnell merke, dass etwas nicht passt. Normalerweise sind die heutigen Rechner leistungsfähig genug und eine Software zügig zu kompilieren ohne, dass die Arbeit maßgeblich leidet. Ich werde in Zukunft, sofern ich mit DVCS arbeite, meinen lokalen Build Server nutzen. Aber noch ein weiterer Vorteil entsteht, Reproduzierbarkeit. Ich kann, sofern ich mal eine Version meines Codes zur Verfügung stelle, diese leicht noch einmal bereitstellen. Es ist nicht notwendig Dateien von Hand zusammen zu sammeln und an die richtigen Stellen für meine Auslieferung zu kopieren.

Ich bin ein riesiger Fan von CCNet und finde den Server für .NET einfach sehr schön. Allerdings gibt es einige Dinge, die mich (vermutlich eher andere) stören. So ist die Konfiguration nicht sehr intuitiv und erfordert schon etwas wissen. Zum Anpassen der Konfiguration muss man eigentlich immer das XML manipulieren und auf dem Server aktualisieren. Das war der Grund mich mal wieder umzuschauen und eine sehr schnell aufkommende alternative war TeamCity. Es ist für kleinere Build-Umgebungen, die man vermutlich lokal auch nur hat, kostenlos und ermöglicht in der Website relativ leicht die Konfiguration und Statusabfrage. Ich finde die Webseite des lokalen Build-Servers schick und übersichtlich, es wird viel Ajax genutzt um Informationen bereitzustellen.

ScreenShot 019 http___localhost_81_project.html;jsessionid=F1931030A2F886EF4688798E3307BF1A_projectId=project2 - IE

In TeamCity kann man dem Build-Agent Bedingungen zuweisen die dieser Erfüllt und einer Build-Konfiguration Bedingungen, die erfüllt sein müssen um eine Integration auszuführen. Man kann sich auch einfach mittels verschiedener Kommunikationskanäle über den Status informieren lassen.

Technorati Tags: ,
2010-10-14

Hello world!

von JZieschang

Welcome to WordPress.com. This is your first post. Edit or delete it and start blogging!

2010-10-03

GIT, Putty and SSH auth (Windows)

von JZieschang

Ich hatte heute morgen Problem beim Zugriff auf mein GIT-Repository. Eigentlich hatte es immer super geklappt, allerdings habe ich auf dem Rechner nur die Portable Version von msysgit benutzt. Also mal wieder das typische Googlen bis man was findet, etwas passendes zu finden, war aber eher ein Glücksspiel. Zumindest wußte ich zu 90% was ich zu tun habe.

Zu erst benötigt man natürlich GIT, unter Windows würde ich derzeit immer auf msysgit zurückgreifen. Außerdem werden für Zugriff auf Repositories mit SSH/Public Key Access noch die Putty-Tools benötigt, eigentlich braucht man nur pageant.exe, plink.exe und puttygen.exe.

Zuerst erzeugt man sich ein einen Private-Key mittels puttygen erzeugen. Nach dem das Zertifikat erstellt wurde, muss dieses nur noch gespeichert werden. A

PuttGen Interface after Key has been created.

Außerdem sollte man den Text für Public Key kopieren. Dieser wird für den Import bei dem GIT-Anbieter oder Server benötigt, genauso wie bei vielen anderen Applikationen. Bei Unfuddle zum Beispiel wird der Key beim Benutzer registriert und ermöglicht erst dadurch die Authentifizierung und den Zugriff auf das Repository.

Den gespeicherten Private-Key (ppk-Erweiterung) öffnen man nun mit pageant. Um den Key zu lesen muss die Passphrase angegeben werden.

pageant-opened

Ist der Key geöffnet, so kann man versuchen das Repository zu öffnen. Dazu "plink.exe –v git@<project>.unfuddle.com:user/<projectrepo>.git" ausführen. Die Antwort sollte dann etwa so aussehen:

   1: Looking up host "<project>.unfuddle.com"
   2: Connecting to 174.129.5.196 port 22
   3: Server version: SSH-2.0-OpenSSH_5.1p1 Debian-5
   4: We claim version: SSH-2.0-PuTTY_Release_0.60
   5: Using SSH protocol version 2
   6: Doing Diffie-Hellman group exchange
   7: Doing Diffie-Hellman key exchange with hash SHA-256
   8: Host key fingerprint is:
   9: ssh-rsa 2048 a6:74:33:36:95:31:6e:a6:d7:71:87:b8:3c:38:e2:60
  10: Initialised AES-256 SDCTR client->server encryption
  11: Initialised HMAC-SHA1 client->server MAC algorithm
  12: Initialised AES-256 SDCTR server->client encryption
  13: Initialised HMAC-SHA1 server->client MAC algorithm
  14: Pageant is running. Requesting keys.
  15: Pageant has 1 SSH-2 keys
  16: Using username "git".
  17: Trying Pageant key #0
  18: Remote debug message: Forced command: gitosis-serve <user>_<user>
  19: Remote debug message: Port forwarding disabled.
  20: Remote debug message: X11 forwarding disabled.
  21: Remote debug message: Agent forwarding disabled.
  22: Remote debug message: Pty allocation disabled.
  23: Authenticating with public key "<key comment>" from agent
  24:  
  25: Sending Pageant's response
  26: Remote debug message: Forced command: gitosis-serve <user>_<user>
  27: Remote debug message: Port forwarding disabled.
  28: Remote debug message: X11 forwarding disabled.
  29: Remote debug message: Agent forwarding disabled.
  30: Remote debug message: Pty allocation disabled.
  31: Access granted
  32: Opened channel for session
  33: Server refused to allocate pty
  34: Started a shell/command
  35: ERROR:gitosis.serve.main:Need SSH_ORIGINAL_COMMAND in environment.
  36: Server sent command exit status 1
  37: Disconnected: All channels closed

Evtl. kann eine Bestätigung des Server Keys notwendig sein, dass sollte allerdings nur beim 1. mal der Fall sein.

Hat der Teil geklappt, dann fehlt nur noch git korrekt zu konfigurieren. Hat mit den msysgit installer benutzt und die Option plink.exe während der Installation ausgewählt, so sollte bereits alles funktionieren, anderenfalls muss noch etwas nachgearbeitet werden. Um git beizubringen, dass er mittels pageant/plink sich authentifizieren soll, muss noch eine Umgebungsvariable gesetzt werden.

   1: GIT_SSH=<path to plink>\plink.exe

Anschließend kann mit git auf das Repo zugegriffen werden

Der Zugriff kann durch registrieren des Remote-Repo ordentlich verkürzt und vereinfacht werden. Beim erzeugen des Repo mit git clone … sollte das bereits passiert sein.

Hier noch mal ein kleiner Git-Ablauf (nach meinem Verständnis)

   1: cd myproject
   2: git init
   3: git remote add unfuddle git@<project>.unfuddle.com:<user>/<repo>.git
   4: git config remote.unfuddle.push refs/heads/master:refs/heads/master
   5: git pull unfuddle master
   6: git checkout -b dev
   7: ... changes ...
   8: git add **/*
   9: git commit -a -s -m ""
  10: git checkout master
  11: git merge dev
  12: git push unfuddle master

In der ersten Zeile wird in ein leeres Verzeichnis gewechselt und anschließend das Repository angelegt. Zeile 3 und 4 registrieren das Remote-Repository, so dass in Zeile 5 mit unfuddle auf dem Repo zugegriffen werden kann. Zum arbeiten wird dann in einen neuen Branch dev gewechselt. Anschließend können die Arbeiten durchgeführt werden. mittels git add werden neue Dateien für das Change-Tracking und den anschließenden Commit registriert. Mittels commit werden die Änderungen lokal übernommen. Der Parameter "-s" sorgt dabei für das hinzufügen des "Sign-off"/Abzeichnen und der Parameter –a übernimmt alle Änderungen in den Commit. Danach wird zum "Hochschieben" der Änderungen in den master gewechselt und die Änderungen aus dem "dev" Zweig übernommen. Git push shiebt in Zeile 12 die Änderungen ins Repository.

Weiterhin sind die Befehle git init/git gui zu empfehlen, ich nutze diese immer wieder mal. Manche Sachen sind einfach nicht geläufig.

Hier sind noch einige interessante Links:

2010-08-23

Projektgeschäft …

von JZieschang

Hmmm, mein letzter Post ist 3 Monate her. :( Sorry, habe ich in den letzten Wochen einfach viel mit meinem Projektbeschäftigt und hatte dann nicht mehr so viel Lust am Abend noch zu bloggen oder etwas anders zu machen. Zudem war das Wetter auch sehr schön, Fußball, ….

Ich werde versuchen in nächster Zeit wieder etwas mehr zu bloggen und auch einige Themen finden. Bisschen was habe ich noch an Ideen, aber Aufgrund von Lustlosigkeit nicht geblogged.

Aktuell habe ich eigentlich ein Projekt ohne "wow"-Effekt, dafür aber sehr anstrengend aufgrund der Konzeption. Ich finde es sehr schade, dass ich das Projekt nicht von Anfang an gestalten konnte, sondern ein "*****" weiterführen sollte. Schön ist es aber trotzdem jeden Tag wieder Lösungen zu finden.

Was sich auch bei diesem Projekt wieder zeigt, mit Continous Integration lässt sich die Qualität eines Projektes steigern, allein dadurch, dass das Vertrauen in die kompilierfähigkeit steigt. Wer wenige Erfahrungen mit Continous Integration hat, sollte sich mittels CI-Factory dem Thema zu nähern. CI-Factory setzt eine komplette Projektbuildumgbung mit allen wichtigen Tools und Konfiguration nach Best Practices auf. Ich bin nicht mit allen Sachen einverstanden, aber dabei handelt es sich um Details. Zusätzliche Aktionen, wie Code-Analysen oder Unit-Tests, sorgen für deutlich mehr vertrauen. Unit-Tests sind ein wichtiges Mittel, wie man auch immer wieder liest. Wir hatten innerhalb unseres Teams in den letzten Wochen mehrfach die Diskussion, was ein Unit-Test ist. Ich bin derzeit absolut der Meinung, dass ein Unit-Test komplett ohne äußere Einflüsse auskommen muss, zum einen beschleunigt dies die Ausführung, zum anderen sichert es einen wiederherstellbaren Ausführungszustand. Leider arbeiten wir mit VB.NET, ich finde es eine furchtbare Entscheidung und könnte während des Schreibens von Unit-Tests nur fluchen, obwohl es auch während der normalen Entwicklung schon ein "Krampf" ist. Leider hört man oft das Argument, dass sich die VB6-Entwickler nicht an etwas Neues gewöhnen müssen, aber mal ehrlich, VB6 und .NET sind schon sehr unterschiedliche Technologien.

Jeder der dennoch VB.NET-Projekte realisiert sollte darauf achten, dass Option Strict und Option Explicit auf jeden Fall aktiviert sind. Leider war das in meinem Projekt nicht der Fall, es gibt einige Ausführungspfade, wo ich nicht sagen kann, was wirklich bei den Typ-Umwandlungen passiert.

Eine andere Sache, die sich (wieder) sehr positiv gezeigt hat, sind DI/IoC. Dadurch wird die Wartung und Austauschbarkeit von Komponenten deutlich erhöht.

Nebenbei beschäftige ich mich wieder mit Prism/CompositeWPF. Ich finde das Konzept richtig schick und es macht viel Spaß damit zu arbeiten. Ich muss dabei noch so viel lernen, auch bei MVVM lerne ich bei jeder Benutzung wieder etwas dazu. Bei Prism gibt es demnächst ein neues Release (Version 4).

2010-06-20

Oracle Client und die Versionen …

von JZieschang

Leider muss ich schon wieder eine ganze Weile mit Oracle Datenbanken arbeiten. Es gibt sovieles, was mich an Oracle stört, aber ein Austauschen ist nicht möglich. Das Schlimmste bei der Arbeit mit Oracle-Datenbanken ist diese nervige Client-Problematik und diese TNSNames-Konfiguration Sch…. In dem Unternehmen in dem ich zur Zeit aktiv bin, gibt es ein relativ umfangreiches Software Management, man hat für Oracle eine Standardversion definiert, die Version 10. Leider gibt es zu der Version nicht den passenden ODP.NET Provider für .NET-Framework 2.0, so dass bisher den FX 1.0 Treiber benutzt wird. Wie man sich denken kann, wird dabei auch nicht alles unterstützt, unteranderem fehlt die Unterstützung für Framework 2.0 Transaktionen. Ein noch viel größeres Problem ist aber, dass es auch durchaus noch Arbeitsplätze mit Ora Client 9 gibt und auf diesen funktioniert es gar nicht. Bei manchen klappt es, wenn die OraOps10.dll vorhanden war, aber  dann ging es auch auf einigen Oracle Client 10 Installationen nicht.

Seit der Version 11, vielleicht auch 10 gibt es eine halbwegs akkzeptable Lösung, der Oracle Instant Client. Mit etwas Aufwand kann man sogar den Client komplett mit nur 5 Dateien mit der eigenen Applikation verteilen und ist nicht damit nicht mehr auf die vorhandene Installation, welche Version auch immer es ist, angewiesen. Nach dem ersten Schritt, finden des Instanat Clients als mögliche Lösungsoptionen, hatte ich mein Problem mit dem Oracle Client nocht nicht final gelöst. Laut Oracle müssen Umgebungsvars gesetzt werden, was dann aber evtl. höhere Rechte beim Einrichten erforderlich machen würde. Nach einigem googlen bin auch den Post "Deploying ODP.NET with Oracle Instant Client" gestoßen und das sieht genau nach der Lösung aus, die ich brauchte. Ich habe mich für den Basic Client entschieden, es gibt auch noch eine Lite-Version, ich wollte nicht das Risiko eingehen, dass Funktionalitäten nicht mehr gehen. (Lite würde ungefähr 30MB ergeben, Basic etwas über 100 MB) Die Dateien

  • oci.dll
  • Oracle.DataAccess.dll
  • oramts.dll
  • oramts11.dll
  • oramtsus.dll
  • orannzsbb11.dll
  • oraocci11.dll
  • oraociei11.dll und
  • OraOps11w.dll

müssen sich bei der Ausführung im Applikationsverzeichnis liegen. OraMTS wird für Transaktionen benötigt. Am besten im Visual Studio Projekt einbinden und "Copy to output directory" auf "Copy if newer" setzen, so dass die Dateie im richtigen Verzeichnis landen.

Einige Probleme gab es noch bei der Konfiguration auf den Rechnern, Oracle ermöglich es viele Einstellungen über Umgebungsvariablen oder Registry vorzunehmen, offensichtlich war durch die vielen Client Versionen auf meinem Rechner einiges "merkwürdig". Ich habe die Einstellungen für "NLS_LANG" und "TNS_ADMIN" in meiner Applikation gesetzt.

   1:  Environment.SetEnvironmentVariable("NLS_LANG", "GERMAN_GERMANY.WE8MSWIN1252")
   2:  Environment.SetEnvironmentVariable("TNS_ADMIN", AppDomain.CurrentDomain.BaseDirectory)

NLS_LANG bei Oracle nachschlagen. TNS_ADMIN ermöglich das Auffinder der TNSNAMES.ORA, ich konnte Transaktionen nicht ohne TNSNAMES aufbauen, es gab immer einen seltsamen Fehler, wenn die "Data Source" im Connection String den TNS-Eintrag enthielt. Nach dem beide Werte gesetzt waren, klappt es wunderbar, hoffentlich auch weiterhin. Vielleicht sollte sich Oracle mal überlegen, ob es nicht schick wäre einen komplett Managed Treiber zu erstellen.

2010-05-30

NVidia Treiber Aktualisierung (Win7)

von JZieschang

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.

2010-04-25

ASP.NET SQL Membership database schema

von JZieschang

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.

2010-03-21

SharePoint deployment

von JZieschang

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.

2009-12-18

Xml Schema Documentation

von JZieschang

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.