web 2.0

MsDeploy Error

Beim Einsatz von MsDeploy (Web Deploy) bin ich über folgenden Fehler gestossen:

C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(3847,5): Warning : Retrying the sync because a socket error (10054) occurred. 
Retrying operation 'Serialization' on object sitemanifest (sourcePath). Attempt 1 of 10.

 

Bei der Service Url stand bei mir “http://<remoteServer>:8172/MsDeploy.axd”. Nach Änderung der Service Url auf “<remoteServer>” funktionierte alles einwandfrei.

Tags:

1. Skillscamp: Klumpatsch und Gedöns

Am 26. und 27. August fand in Köln das erste Skillscamp statt. Hierbei handelt es sich um eine Veranstaltung, die ähnlich einem Open Space ist, nur dass das Thema wesentlich eingeschränkter und damit mehr fokussiert ist. Das erste, von Albert Weinert organisierte, Skillscamp hatte den Titel “.NET und das Web”, wobei die Schwerpunkte auf ASP.NET MVC, HTML5, CSS3 und Javascript gelegt wurden.

Los ging es am Freitag Abend mit einer gemütlichen Kennenlern-Runde in Peters Brauhaus. In lokaler Atmosphäre bei ein paar Glass Kölsch wurden Session-Ideen für den nächsten Tag gesammelt. Hier war natürlich auch genug Zeit, mit alten und neuen Bekannten interessante Gespräche zu führen.Photo_C27EBE6E-141D-B6F6-CA01-4E625DF91AB2

Am nächsten Morgen sollte es dann pünktlich losgehen. Dummerweise hinderte uns eine verschlossene Tür an einem pünktlichen Beginn. Das klärte sich dann glücklicherweise und es konnte endlich losgehen. Albert erklärte noch einmal das Prinzip eines Open Space und ging dann zur Sessionplanung über. Dabei zeigte sich, dass nahezu alle Themen bei allen Besuchern auf großes Interesse stießen und eine Trennung in mehrere parallele Sessions zumindest am Anfang nicht stattfand.

Photo_8A8DD673-FB63-BA9B-A25A-880DDBBB3511

In der ersten Session (LESS, Sass and many more) fing Albert notgedrungen mit einigen Erläuterungen zu LESS und Sass an. Beide CSS-Frameworks erweitern die bestehenden CSS-Spezifikation um Variablen, Operatoren und weitere Funktionen, die eine CSS-Datei wesentlich pflegleichter machen. Vom Funktionsumfang unterscheiden sich beide nicht wesentlich und im .NET-Bereich ist im Moment Sass durch die VisualStudio-Unterstützung mit Mindscape Workbench wohl die bessere Wahl. Danach wurden noch Frameworks zur Performance-Optimierung vorgestellt, z.B combres und squishit, sowie das Konzept von Sprites erklärt.

Die zweite Session teilte sich dann auf. Ich entschied mich für Unit-Testing für Javascript. Leider stellte sich heraus, dass nahezu keiner Ahnung von diesem Thema hatte. So googelten wir etwas herum und fanden QUnit, welches wir dann live austesteten. Außerdem schauten wir uns noch kurz Jasmine, ein BDD-Framework für Javscript, an.

In der dritten Session entschied ich mich für HTML5 und CSS3. Auch diese Session war von Albert geprägt, der einen kleinen Ausflug durch Tools rund um HTML5 und CSS3 machte. Sehr interessant war hier JSIL, ein Compiler der .NET Code in Javascript verwandelt. Außerdem warfen wir ein Blick auf yepnope und modernize, zwei Javascript-Bibliotheken die einem beim Testen auf vorhandene HTML5-Features helfen.

Nach der Mittagspause machten wir mit einer “Best Practices für MVC”-Session weiter. Hier war die Beteiligung wesentlich größer als in den Sessions zuvor. Entweder waren die Teilnehmer die jetzt wach geworden oder das Thema lag einfach allen. Aus dieser Session nahm ich hauptsächlich die von Daniel Fisher erwähnten Monitor-Funktionen aus dem System.Diagnostics Namespace mit. Dieser Hinweis war Daniel wohl sehr wichtig, denn er erwähnte ihn mehrmals eindringlich Zwinkerndes Smiley.

Die letzte Session war dann ein Rundflug durch alle bekannten Javascript-Frameworks. Jeder sollte ein Beispiel sagen und so kam eine ziemlich große Liste zusammen. Neben den schon vielseits diskutierten knockout.js und backbone.js nahm ich für mich spin.js und script# aus der Session mit. Neben diversen kleinen anderen Frameworks erheiterten Bacon Ipsum und eine Runde Angry Birds im Browser die Runde.

Das Skillscamp wurde dann mit einer Tour durch diverse Lokalitäten in der Kölner Altstadt beschlossen. Auch hier wurde wieder reichlich Kölsch getrunken und noch viele weitere Themen, die vom Skillscamp nicht abgedeckt wurden, besprochen.

Fazit: Das erste Skillscamp war ein Versuch, die teilweise überladen wirkenden Konferenzen, auf ein “kleines” Thema zu fokussieren. Leider war die Beteiligung nicht so rege wie gewünscht und es stellten sich einige wenige Personen als Redner/Alleinunterhalter heraus. Hier muss ich mich auch selbst in die Kritik nehmen, da ich meiner Meinung nach viel zu wenig beigetragen habe. Ich hoffe trotzdem, das Albert das Konzept weiter betreiben wird und beim nächsten Mal ein offenerer und breitere Meinungsaustausch stattfinden wird.

Tags:

Misc

.NET Open Space Süd 2011 in Karlsruhe

Nachdem ich in den letzten 2 Jahren den .NET Open Space in Leipzig besucht habe, war dieses Jahr Premiere für mich in Karlsruhe. Im Gegensatz zu Leipzig ist in Karlsruhe alles etwas kleiner und gemütlicher, was natürlich auch schon durch die Anzahl der Teilnehmer (etwa 60-70) bedingt ist.

Schon kurz nach der Anreise am Freitag wurden die ersten “Open Air Sessions” im Jean Claude abgehalten. Dies macht für mich auch einen nicht unerheblichen Teil eines Open Space aus: das gemütliche Beisammensitzen bei einem Bier und Diskussionen auch abseits der Veranstaltung.

Am Samstag Morgen gab es dann eine kleine Überraschung. Die Sessionplanung fand diesmal nicht analog mit Zettel und Stift, sondern per digitalem Board inkl. Kinect-Steuerung statt. Das sah auch richtig gut aus, leider fehlten aber “Features” aus der analogen Welt und es wurden Hürden aufgebaut (siehe auch Roberts Post).

Die Themen der Sessions waren wie immer breit gefächert und für jeden war etwas dabei. Bei mir lag der Schwerpunkt eher auf Datenbanken. So war ich in den NoSQL-Sessions und in der kleinen “SQL Server Denali”-Runde mit Kostja.

Da ich als Mitbegründer der ALT.NET Berlin UG auch aktiv in der Community bin, war für mich auch die Session “Ideen für die .NET-Community” sehr wichtig. Hier wurde unter anderem eine neu Community-Plattform(communityblendr) vorgestellt. Auch den Vorschlag von Jürgen Gutsch für einen Community-Award fand ich interessant. Danach entwickelte sich ein spannende Diskussion über Community vs. Consumity. Hier wurde zum Teil das Überangebot an Community-Veranstaltungen und das aktive Selbst-Marketing einiger Community-Member kritisiert/diskutiert. Ich persönlich sehe darin kein so großes Problem. Community hat für mich immer etwas mit Geben und Nehmen zu tun. Jeder Beteiligte einer Community-Veranstaltung will sicher auch etwas für sich mitnehmen, sei es einfach nur neue Impulse und Erfahrungen. Wenn er dabei auch noch etwas gibt und sich aktiv an Diskussionen beteiligt, hab ich kein Problem damit, dass er auch Werbung in eigener Sache macht.

Was nehme ich jetzt persönlich aus diesem Open Space mit? Viele Ideen und Erfahrungen, nette Gespräche und neue Bekanntschaften. Und ganz sicher wird jetzt die Kinect rausgeholt und etwas mit dem SDK “rumgespielt”.

Vielen Dank nochmal an die Organisation und hoffentlich sieht man sich auch im nächsten Jahr wieder.

Tags:

Veranstaltungshinweis: UI/UX für Entwickler und andere Nicht-Designer

Viele Softwareetwickler behaupten von sich freimütig, kein Gespür für die Gestaltung von User Interfaces (UI) zu haben und können mit dem Begriff "User Experience" (UX) noch weniger anfangen. Wer es dabei belässt, macht sich die Sache jedoch ein wenig zu einfach, denn häufig ist es nur ein kleiner Schritt von einer schlechten zu einer durchaus akzeptablen GUI.

Der Vortrag von Roland Weigelt stellt einige grundlegende Gestaltungsprinzipien vor, gibt praktisch einsetzbare Tipps und klärt u.a. was zugekniffene Augen und das Wissen um Fluchtreflexe mit Usability zu tun haben. Er ist dabei unabhängig von konkreten GUI-Technologien.

Der Termin ist Teil einer kleinen User Group Tour von Roland mit Vorträgen in Berlin (Anmeldung), Leipzig (Anmeldung) und Dresden. Vielen Dank nochmal an Torsten Weber für seine Hilfe.

Tags:

ALT.NET Berlin UG

New York City revisited

Nachdem ich im Jahr 2001 das erste Mal in New York war, konnte ich nach 10 Jahren der Stadt erneut einen Besuch abstatten. 2001 war ich im November dort, also kurz nach 9/11. Ich denke, jeder kann sich noch genau erinnern was er damals gemacht hat, als er von den Anschlägen auf die Twin Towers erfuhr. Ich hatte ein ziemliches mulmiges Gefühl mit dem Wissen, sehr zeitnah vor Ort zu sein. Umso begeisterter war ich von der Stadt, den Leuten und dem Umgang mit diesem tragischen Ereignis.

Nun war ich dieses Jahr wieder in New York und will einfach ein paar Eindrücke vermitteln. Was mir die Fotos am deutlichsten zeigen: ich brauch eine vernünftige Kamera ;)

Statue of Liberty NYSE Brooklyn Bridge Auf der Brooklyn Bridge Brooklyn Bridge Little Italy Washington Square Arch Flat Iron Building Empire State Building Blick vom Empire State Building Blick vom Empire State Building Chrysler Building New Yorker Straßenbild Guggenheim Museum Im Central Park Im Central Park Baseball im Central Park Dakota Building Times Square

Tags:

Misc

SSIS: CSV-Dateien mit Textbegrenzungszeichen innerhalb des Textes importieren

Damit man Sonderzeichen innerhalb der Daten einer CSV-Datei nutzen kann, gibt es Textbegrenzungszeichen (engl.: text qualifier). Soll dieses Begrenzerzeichen in den Daten vorkommen, so wird dieses einfach verdoppelt (maskiert). Nachfolgend eine Beispieldatei mit dem “ als Textbegrenzungszeichen:

1|"John Doe"|17.01.1946
2|"Dwayne ""The Rock"" Johnson"|02.05.1972
3|"Steve ""Stone Cold"" Austin"|18.12.1964
4|"Randy ""Macho Man"" Savage"|15.11.1952
5|"Hulk Hogan"|11.10.1953
6|"Mark "The Undertaker" Calaway"|24.03.1965

Fügt man einen Verbindungsmanger für die CSV-Datei hinzu und wählt das doppelte Anführungszeichen(“)als “Text qualifier” aus

1 Flat File Connection Manager Editor

dann kommt es beim Wechsel auf Columns zu folgender Fehlermeldung:

2 Error

Ignoriert man diese Meldung und führt das Paket trotzdem aus, schlägt dieses fehl mit der Meldung:

[SSIS.Pipeline] Error: SSIS-Fehlercode 'DTS_E_PRIMEOUTPUTFAILED'. Die PrimeOutput-Methode in 'Komponente 'Flatfilequelle' (1)' hat den Fehlercode 0xC0202092 zurückgegeben. Die Komponente gab einen Fehlercode zurück, als das Pipelinemodul 'PrimeOutput()' aufgerufen hat. Die Bedeutung des Fehlercodes wird von der Komponente definiert. Der Fehler ist jedoch schwerwiegend, und die Ausführung der Pipeline wurde beendet. Möglicherweise wurden bereits Fehlermeldungen veröffentlicht, die weitere Fehlerinformationen beinhalten.

Damit ist klar, SSIS unterstütz keine Textbegrenzungszeichen innerhalb eines Datenfeldes (zumindest bis einschließlich der Version für SQL Server 2008).

Wichtig: Als Workaround zeige ich jetzt einen kleinen Trick, der allerdings nur hilft, wenn das Spaltentrennzeichen nicht im Text vorkommt.

Als erstes entfernt man das Textbegrenzungszeichen  im Verbindungsmanager für die CSV-Datei. Würde man dann die Daten in eine Datenbank importieren, würde man dieses Ergebnis sehen:

3 unerwuenschtes Ergebnis

Hier sind jetzt natürlich eine Menge Anführungszeichen zu sehen. Innerhalb des Textes kommen diese auch doppelt vor, was so nicht beabsichtigt ist. Deshalb führt man im Datenflusstask eine Abgeleitete Spalte (engl.: derived column) hinzu. Damit kann man die Daten in der Spalte mit diversen Funktionen bearbeiten.

4 Datenfluss

Zuvor benötigt man noch zwei Variablen, auf die ich gleich noch einmal zurückkomme.

5 Variablen

Jetzt ist alles vorbereitet und man kann den Transformationstask “Abgeleitete Spalte” bearbeiten. Dort wird unter Derived Column die zu bearbeitende Spalte ausgewählt und bei Expression folgender Wert eingegeben:

REPLACE(SUBSTRING([Column 1],2,LEN([Column 1]) - 2),@[User::q1],@[User::q2])

Im Prinzip wird hier nur der String am Anfang und Ende beschnitten (die Anführungszeichen entfernt) und doppelte Vorkommen durch ein Anführungszeichen ersetzt.

Das Ganze sieht dann so aus:

6 Derived Column Transformation Editor

Führt man jetzt das Paket aus, erscheint folgendes Ergebnis:

7 Ergebnis

Die Anführungszeichen am Anfang und Ende sind verschwunden und innerhalb des Textes kommen diese nur noch einfach vor.

Hinweis: Anscheinend kommt es nur bei Dateien im Unicode-Format zu diesen Fehler. Bei einem Test mit einer ANSI-Datei lief alles fehlerlos.

Tags:

SSIS | Datenbanken

SSIS: Importieren von CSV-Dateien mit unterschiedlicher Spaltenanzahl

Der Import von CSV-Dateien in eine Datenbank stellt ein paar Tücken bereit. Nicht immer hat man die volle Kontrolle über die CSV-Datei. Besonders wenn die Daten von einem Fremdanbieter kommen, der nicht so auf die Qualität seiner Daten achtet. Da kann es schon mal vorkommen, dass die Spaltenanzahl in den Zeilen abweicht oder durch falsches Escaping von Trennzeichen(Delimeter) erst gar nicht richtig erkannt werden.

In meinem Beispiel verwende ich eine Datei mit Komma als Spaltentrennzeichen:

1,Wert1,01.01.2001
2,Wert2,12.06.1999
3,Wert3
4,Wert4,31.01.2002
5,Wert5,01.01.2011
6,Wert6
7,Wert7
8,Wert8,24.12.1953
9,Wert9,15.09.1988
10,Wert10

Würde man diese Datei mit den Standardeinstellungen importieren, käme die folgende Zuordnung heraus:

1 falsche Zuordnung

Um dieses Problem zu umgehen, gibt es einen Workaround: Man importiert die CSV-Datei komplett als eine Spalte und extrahiert sich anschließend per Transformationstask die vorhandene Spalten.

Hierfür löscht man im Connection-Manager für die CSV-Datei alle erkannten Spalten und legt eine einzelne neue Spalte an. Da in CSV-Dateien durchaus auch größere Daten vorkommen können (z.B. Beschreibungstexte), wähle ich Textdatenstrom als Datentyp. Daher muss später im Skript-Task auch noch eine Konvertierung vorgenommen werden.

2 eine Spalte

Daraus ergibt sich folgende Zuordnung:

3  Zuordnung mit einer Spalte

Jetzt kann man einen Datenflusstask anlegen, der wie folgt aussehen könnte:

4 Datenflusstask

Im Transformationstask muss dann die zuvor festgelegte Spalte aus dem Verbindungsmanager als Input definiert werden:

5 Input

Des weiteren müssen die Ausgabespalten für den Transformationstask definiert werden:

6 Output

Das Skript für den Transformationstask sieht wie folgt aus:

   1:  public class ScriptMain : UserComponent
   2:  {
   3:   
   4:      private char[] columnDelimiter = new char[] { ',' };
   5:   
   6:      public override void Eingabe0_ProcessInputRow(Eingabe0Buffer Row)
   7:      {
   8:          string[] columnValues = null;
   9:   
  10:          var blobLen = Convert.ToInt32(Row.Line.Length);
  11:          byte[] blobBytes = new byte[blobLen];
  12:          blobBytes = Row.Line.GetBlobData(0, blobLen);
  13:   
  14:          string line = System.Text.Encoding.Unicode.GetString(blobBytes);
  15:          columnValues = line.Split(columnDelimiter);
  16:   
  17:          // Test Correct number of rows
  18:          if (columnValues.Length == 3)
  19:          {
  20:              // Row is OK, output values
  21:              Row.Column1 = columnValues.GetValue(0).ToString();
  22:              Row.Column2 = columnValues.GetValue(1).ToString();
  23:              Row.Column3 = columnValues.GetValue(2).ToString();
  24:          }
  25:          else
  26:          {
  27:              //Row is not complete - Handle error
  28:              Row.Column1_IsNull = true;
  29:              Row.Column2_IsNull = true;
  30:              Row.Column3_IsNull = true;
  31:          }
  32:      }
  33:  }

In der columnDelimeter-Variable wird das Spaltentrennzeichen definiert. Da ich für den Eingabeparameter Line den Datentyp Textdatenstrom  gewählt habe ist Row.Line vom Typ Microsoft.SqlServer.Dts.Pipeline.BlobColumn. Dieser wird in den Zeilen 10 –14 in einen String umgewandelt und kann anschließend per Split-Funktion geteilt werden. Ist die korrekte Anzahl an Spalten vorhanden (in meinem Fall 3), werden die Daten an die Ausgabeparameter übergeben. Andernfalls werden NULL-Werte zurückgegeben.

Die Daten importiert in eine Datenbank liefern folgendes Ergebnis:

7 Ergebnis

Alle Zeilen, die nicht die korrekte Anzahl an Spalten haben werden ignoriert und es werden NULL-Werte in die Datenbank geschrieben. Dieses Verhalten kann man natürlich im Skript-Task nach seinen Wünschen anpassen.

Tags:

SSIS | Datenbanken

IIS: UNC-Pfad als virtuelles Verzeichnis anlegen

Ich hatte letztens ein kleines Problem mit dem IIS. Ich sollte eine CDN-Light-Version entwickeln. Dabei sollte eine Freigabe eines Fileservers als virtuelles Verzeichnis im IIS eingebunden werden. Zum Testen nutzte ich den lokalen IIS (Version 7.5) auf meinem Rechner.  Dieser befindet sich in einer Domäne. Leider ist der Fileserver nicht in der Domäne sondern nur in einer Arbeitsgruppe.

Da beide Rechner nicht zusammen in einer Domäne sind, muss auf beiden Rechnern (Fileserver und Webserver) der gleiche Benutzer mit demselben Passwort angelegt werden. In meinem Beispiel nennen wir ihn UNCUser.

Wichtig: Dieser User muss sowohl Freigabeberechtigungen wie auch NTFS-Berechtigungen für die Freigabe auf dem Fileserver haben.

Da jetzt alle Vorkehrungen getroffen sind, können wir jetzt das virtuelle Verzeichnis anlegen. Hierfür starten wir den den IIS-Manager und wählen aus dem Kontextmenu der Website den Punkt “Virtuelles Verzeichnis hinzufügen … ” aus.

1 IIS

In dem folgenden Dialog können dann die Daten für das virtuelle Verzeichnis eingeben: der Alias und der Physikalische Pfad in UNC-Form (\\<Fileservername>\<Freigabename>).

2 virtuelles Verzeichnis

Da sich der physikalische Pfad in meinem Beispiel auf einem anderen Rechner befindet, wählen wir jetzt “Verbinden als …” aus.

3 verbinden als

In diesem Dialog werden die Credentials für den Zugriff auf die Freigabe angegeben. Wichtig ist hierbei, dass der Benutzername ohne Rechnername eingetragen wird. Also nicht in der Form <Fileserver>\UNCUser oder <Webserver>\UNCUser (wobei <Fileserver> und <Webserver> die entsprechenden Namen der Server sind).

Hinweis: Mit Eingabe des Rechnernamens klappt zwar das Anlegen des virtuellen Verzeichnis, aber bei einem Aufruf der Website kommt es zu Berechtigungsfehlern (z.B. 0x80070003 und 0x8007052e).

4 Credentials

Jetzt muss man nur noch die offenen Dialoge mit “OK” bestätigen und das virtuelle Verzeichnis ist eingerichtet.

Tags:

IIS

Dynamische Connectionstrings für SSIS

Gerade beim Erstellen von SSIS-Packages probiert man oft viel aus und ändert gern mal ein paar Einstellungen. Besonders nervend ist das, wenn man mal den Connectionstring für eine Datenbank ändern muss. Das SSIS-Package öffnen, die Werte anpassen und neu auf dem Server bereit stellen ist da keine gute Lösung.

Hierfür bietet sich die Paketkonfiguration an. Man kann alle verwendeten Variablen als Konfiguration abspeichern, unter anderem auch als XML-Datei. Diese XML-Datei kann man dann anpassen, ohne das SSIS-Package neu zu veröffentlichen.

Als erstes legen wir uns ein neue Connection an. In meinem Beispiel ist es eine ADO.NET Connection. Die eingegebenen Werte sind hier erst einmal nicht wichtig, da sie später durch die Variablenwerte überschrieben werden.

1 ConnectionManager

Dazu werden folgende vier Variablen vom Typ String angelegt: DatabaseServer, DatabaseName, DatabaseUsername und DatabasePassword. Als Value werden hier die entsprechenden Werte für den Namen des Datenbankservers usw. angegeben.

2 Variables

Wenn man sich dann die Eigenschaften der neu erstellen Connection anschaut (Rechtsklick auf die Connection und den Punkt Properties aus dem Kontextmenu wählt), erscheint dort auch ein Eintrag für Expressions.

3 Connection Properties b

Durch einen Klick in das leere Feld unter Property öffnet sich eine Auswahlliste aller verfügbaren und anpassbaren Eigenschaften. Wir wählen hier ConnectionString aus und klicken anschließend auf die entsprechende Expression.

4 Expression

In dem geöffneten Expression Builder geben wir den folgenden Wert in das Feld Expression ein:

"Data Source=" + @[User::DatabaseServer] + ";User ID=" + @[User::DatabaseUsername] + ";Password=" + @[User::DatabasePassword] + ";Initial Catalog=" + @[User::DatabaseName] +";"

Die Expression kann natürlich durch eigene Variablen weiter angepasst werden. Diese kann man entweder per Hand eintippen oder per Drag&Drop in das Eingabefeld der Expression ziehen.

5 Expression Builder

Ob die Expression korrekt erstellt wurde, kann man durch einen Klick auf den Button “Evaluate Expression” testen. Wenn alles in Ordnung ist, wird die Expression in das ausgegraute Feld “Evaluated value” übernommen.

Damit ist die erzeugte Connection jetzt vollständig über die Variablen konfigurierbar. Der Vorteil der eingangs erwähnten Konfigurationsdateien ist die Entwicklung von SSIS-Packages auf einem anderen Rechner als den später verwendeten Server.

Hinweis: Alternativ könnte man auch den kompletten Connectionstring in eine Variable speichern. Aus Gründen der Übersichtlichkeit bevorzuge ich aber die Variante mit mehreren Variablen.

Tags:

SSIS | Datenbanken

Linksammlung für April 2010

Im Januar hatte ich angefangen, Links, die sich im Verlauf eines Monats so ansammeln, noch einmal durchzugehen, zu sortieren und dann hier zu veröffentlichen. Nachdem ich im letzten Monat nicht dazu gekommen bin, möchte ich diesen Monat die Idee wieder aufgreifen.

Hier sind also meine ausgewählte Links für den April 2010:

CSS + HTML:


Social Media:


Verschiedenes:

Bisher sind folgende Artikel zu diesem Thema erschienen:

Tags:

(X)HTML | ASP.NET | CSS | SEO