.
Anmeldung | Registrieren | Hilfe

.NET-Blogs Archiv Dezember 2011

Binär, XML und JSON-Serialisierung im Vergleich

30.12.2011 15:21:03 | Klaus Bock

binär codeIn einem Kommentar zum vorherigen Artikel hatte Albert Weinert angeregt, auch JSON in den Vergleich mit einzubeziehen.
Da JSON, JavaScript und Konsorten wirklich nicht meine Welt sind, hat kurzer Hand Albert den Vergleich um drei verschiedene JSON Serialisierer ergänzt. Wer “den Albert” kennt, weis dass er keine halben Sachen macht. Ich schickte im ein kleines Testprojekt und erhielt ein komplettes Benchmark Programm zurück. Im Verlauf der Kommunikation brachte mir Albert auch JSON etwas näher und korrigierte damit meinen Blickwinkel. JSON bedeutet zwar namentlich JavaScript Object Notation und in der Wikipedia steht in der Erläuterung dazu:

Jedes gültige JSON-Dokument soll ein gültiges JavaScript sein …

Dies bedeutet aber nicht unbedingt, das JSON nur für JavaScript verwendet werden kann. Vielmehr stellt das JSON Format ein schlankes Textabbild des serialisierten Objekts ohne großen Overhead dar. Die gängigen JSON Serialisierer bieten alle sehr einfach zu handhabende Methoden zum Serialisieren und Deserialisieren von Objekten.

Zum direkten Vergleich der Effektivität verschiedener Methoden und Formate der Serialisierung, sind jetzt insgesamt fünf Serialisierer am Start. Die im Benchmark verwendeten Formatkürzel sowie die entsprechenden Produkte sind wie folgt aufgeschlüsselt.

  1. bin:           BinaryFormatter
  2. xml:          XmlSerializer
  3. jsondata:  DataContractJsonSerializer
  4. jsonweb:  JavaScriptSerializer
  5. jsonnet:    Json.NET von James Newton-King.

Um einheitliche Testbedingungen zu schaffen, wird für jeden Durchgang die benötigte Anzahl an Datensätzen einmal erzeugt und für alle Serialisierer verwendet. Jeder Serialisierer wird zweimal, einmal mit und einmal ohne GZip Komprimierung, verwendet und die benötigte Zeit in Millisekunden sowie die übertragene Datenmenge in Bytes erfasst. Es werden fünf Durchgänge mit 10, 100, 1.000, 10.000 und 100.000 Elementen ausgewertet.

Format Count Compression Milliseconds Bytes Transfered
bin 10
10
gzip 1
2
2.609
1.390
xml 10
10
gzip 1
2
3.638
972
jsondata 10
10
gzip 2
3
2.318
844
jsonweb 10
10
gzip 2 1.608
801
jsonnet 10
10
gzip
1
1.608
801
Format Count Compression Milliseconds Bytes Transfered
bin 100
100
gzip 2
3
18.559
8.832
xml 100
100
gzip 1
2
33.344
6.243
jsondata 100
100
gzip 1
3
22.934
5.717
jsonweb 100
100
gzip 8
5
15.834
5.382
jsonnet 100
100
gzip 1
2
15.834
5.382
Format Count Compression Milliseconds Bytes Transfered
bin 1.000
1.000
gzip 16
21
177.939
80.238
xml 1.000
1.000
gzip 9
22
329.675
58.287
jsondata 1.000
1.000
gzip 9
14
228.905
53.838
jsonweb 1.000
1.000
gzip 17
22
157.905
50.209
jsonnet 1.000
1.000
gzip 7
43
157.905
50.209
Format Count Compression Milliseconds Bytes Transfered
bin 10.000
10.000
gzip 125
214
1.772.619
795.178
xml 10.000
10.000
gzip 69
185
3.298.716
580.353
jsondata 10.000
10.000
gzip 62
130
2.290.386
536.307
jsonweb 10.000
10.000
gzip 116
183
1.580.386
500.012
jsonnet 10.000
10.000
gzip 51
116
1.580.386
500.012
Format Count Compression Milliseconds Bytes Transfered
bin 100.000
100.000
gzip 1.441
2.248
17.700.411
7.883.815
xml 100.000
100.000
gzip 883
1.584
32.885.009
5.782.222
jsondata 100.000
100.000
gzip 582
1.328
22.886.615
5.349.126
jsonweb 100.000
100.000
gzip 1.151
1.833
15.786.615
4.987.282
jsonnet 100.000
100.000
gzip 570
1.156
15.786.615
4.987.282

Wie in obigen Tabellen ersichtlich, setzen sich die beiden JSON Serialisierer JavaScriptSerializer und Json.NET in der Datengröße deutlich ab. Interessant auch die Beobachtung, dass beide Serialisierer die exakt gleiche Datenmenge übertragen.
Json.NET scheint, im Vergleich zum JavaScriptSerializer, effizientere Methoden zur Serialisierung zu verwenden, da er die Daten zum Teil doppelt so schnell liefert.

Interessierte können sich das Projekt gerne für eigene Tests herunterladen.

SerializeTesting.zip

Fazit:

Wer, wie ich, bis dato JSON bei der Serialisierung immer übersehen hat, sollte dies schleunigst ändern. Man sollte einfach das JS für JavaScript in JSON nicht überbewerten. Beherzigt man diesen Rat, hat man ein schlankes und schnelles Format zur Serialisierung der meisten .NET Objekte.
An dieser Stelle möchte ich mich noch einmal besonders bei Alber Weinert für die tatkräftige Unterstützung und das zurechtrücken meiner Sichtweise bedanken.

Technorati-Tags: | | | | |

SQL Server 2012 und neue Logikfunktionen

30.12.2011 14:12:00 | Martin Hey

Der SQL-Server 2012 bringt unter anderem auch ein paar neue Funktionen mit sich, die im SQL verwendet werden können. Über die Format-Funktion habe ich ja bereits berichtet. Heute soll es um neue Logik-Funktionen gehen.

IIF (Inline IF)

Vor vielen Jahren als ich von Access zu SQL-Server gewechselt bin war es eine ziemliche Umstellung, dass ich die von dort bekannte IIF-Funktion nicht mehr hatte und alle Abfragen angepasst werden mussten. Klar konnte man mit ähnlichen Konstrukten das gleiche erreichen.

SELECT LastName, FirstName, 
CASE WHEN Gender = 1 THEN 'männlich' ELSE 'weiblich' END Gender 
FROM Person

Solche einfachen CASE-WHEN-Konstrukte kann man jetzt (etwas) kürzer schreiben, indem man die IIF-Funktion verwendet.

SELECT LastName, FirstName, 
IIF(Gender = 1, 'männlich', 'weiblich') Gender 
FROM Person

Der Unterschied in der Syntax ist marginal, kann aber dazu führen, dass die Statements einfacher zu lesen sind - besonders dann wenn man die Argumente schachtelt kommt man in meinen Augen bei der Klammern-Schreibweise weniger schnell durcheinander als beim Suchen der Wörter CASE, WHEN, THEN und des jeweils passenden END. Bei der Ausführung wird IIF zu CASE WHEN übersetzt - es handelt sich hier also um eine Art von syntactic sugar. Daraus abgeleitet erlaubt IIF ebenso wie CASE WHEN eine Verschachtelungstiefe von 10.

CHOOSE

Ebenso wie IIF sollte auch CHOOSE allen Access-Jüngern bekannt vorkommen. CHOOSE ermöglicht es, indexbasiert aus Werten auszuwählen. Dazu zunächst ein Beispiel in der bisherigen Syntax:

SELECT LastName, FirstName, 
CASE MaritalStatus 
WHEN 1 THEN 'ledig'
WHEN 2 THEN 'verheiratet'
WHEN 3 THEN 'geschieden'
WHEN 4 THEN 'verwitwet'
WHEN 5 THEN 'getrennt lebend'
WHEN 6 THEN 'verpartnert'
ELSE NULL
END MaritalStatus 
FROM Person

Dieses Konstrukt kann mit CHOOSE anders geschrieben werden:

SELECT LastName, FirstName, 
CHOOSE(MaritalStatus, 'ledig', 'verheiratet', 'geschieden', 'verwitwet', 'getrennt lebend', 'verpartnert') MaritalStatus 
FROM Person

Wichtige Anmerkung für alle C#-Entwickler... der Index ist 1-basiert.

C++ Entwickler? UpToDate? Microsoft C++ Day 2012?

29.12.2011 17:08:46 | Christian Binder

Nach einem erfolgreichen C++ Day 2011 in München, führen wir dieses Event ab Februar 2012 auch in anderen Lokationen durch:

C++ Day 2012

C++ geht mit der Zeit – gehen Sie mit! Wir zeigen Ihnen die Neuerungen und Trends in der Microsoft C++-Welt, von neuen Sprachfeatures über effektive Parallelisierung bis hin zu professionellem Software Engineering durch Application Lifecycle Management. Termine gibt es in Berlin, Bad Homburg, Karlsruhe oder Köln. Die Teilnahme ist natürlich kostenlos, aber die Plätze sind begrenzt.

Zugegeben: In den letzten Jahren waren die Neuerungen rund um die „managed“ .Net-Programmierung mit einschlägigen Sprachen wie C# im Fokus der Aufmerksamkeit. So ist .Net zu einer der produktivsten Entwicklungsplattformen gewachsen.

Doch C++ ist zurück im Rampenlicht: Auch im 21. Jahrhundert wird C++ als Programmiersprache nicht weg zu denken sein. In C++ können Sie stets selbst zwischen Performance und Abstraktion wählen. Kein unnötiger Overhead, bei Bedarf volle Kontrolle. Und genau das wird C++ auch in der Zukunft seinen Platz unter den Programmiersprachen sichern – der Trend immer komplexere Anwendungen auf immer kleinere Hardware zu bringen unterstützt dies nachhaltig.

Seit Visual Studio 6.0 hat sich auch in der Microsoft C++-Welt viel getan –also höchste Zeit für ein Wissens-Update.

Wo? Wann?

2.2.2012 14:00- 18:00  Berlin: ANMELDUNG
7.2.2012  14:00- 18:00 Bad Homburg: ANMELDUNG
13.2.2012 14:00- 18:00 Karlsruhe: ANMELDUNG
5.3.2012 14:00- 18:00 Köln: ANMELDUNG

NEU aufgrund der hohen Nachfrage haben wir einen Zusatztermin in ULM organisiert!

26.3.2012 14:00- 18:00 ULM : ANMELDUNG


Teilnahme: Kostenlos

Der C++ Day 2012 wird freundlicherweise unterstützt von artiso.

Folgende Themen erwarten Sie:

C++ 11: Modernes C++ im 21. Jahrhundert

C++ bleibt aktuell – neue Sprachfeatures machen den nativen Klassiker fit für neue Herausforderungen. Dieser Vortrag gibt Ihnen einen Überblick über die wesentlichsten Neuerungen in C++ 11 – wie beispielsweise Smartpointer mit Reference-Counting (shared_ptr), Lambda-Expressions, neue Container-Klassen, Iteratoren und Sprachkonstrukte wie for_each sowie RValue References.

Parallel-Power in Visual Studio 11: Konzepte und Tools

Effektive parallele Programmierung erhöht die Performance in vielen Fällen drastisch, braucht aber das richtige Know-How und spezialisierte Tools. Denn bei stetig steigender Anzahl an Cores und CPUs wird es immer wichtiger, das Anwendungsmodell in Richtung Skalierbarkeit hinsichtlich Multiprocessing auszulegen. Auch das Debugging bietet einige Herausforderungen. Verschaffen Sie sich einen Überblick über die neuen Konzepte rund um Parallelisierung in Windows API, Concurrency Runtime und Visual Studio.

Application Lifecycle Management für C++: Die nächste Generation

Application Lifecycle Management ist mittlerweile auch in der nativen Entwicklung Pflicht: Mit Team Foundation Server haben Projektteams jeder Größe ein zentrales Portal für Zusammenarbeit, Versionskontrolle, Work Item Tracking, Build-Management, Prozessunterstützung und Fortschrittsreports . Dies ermöglicht den Mitgliedern von Teams, besser und effizienter zusammenzuarbeiten. Der Haken bisher: Die wichtigsten Features wurden auch für C++ unterstützt, aber bestimmte interessante Features waren der .NET Welt vorbehalten. Die gute Nachricht: Visual Studio 11 zieht hier nun nach – sehen Sie, welche Neuerungen sie erwarten.

Der Referent


imageimage

Thomas Trotzki ist ALM Consultant bei der artiso AG nahe Ulm und Microsoft-C++-Profi der ersten Stunde.

Mit Microsoft C++ und den MFC beschäftigt er sich intensiv seit den ersten Beta-Versionen zu Microsoft C/C++ 7.0, also bereits vor der Geburtsstunde von Visual C++ und Visual Studio.

Technologisch ist er neben C++ und den MFC auch mit COM/DCOM und der gesamten „Managed Welt“ vertraut und hat umfangreiche Expertise im Application Lifecycle Management. Zurzeit betreut er Kunden bei der Einführung von Microsoft Team Foundation Server und berät bei der Etablierung eines Application Lifecycle Management in deren Entwicklungsabteilungen.

SQL Server 2012 und Contained Databases

29.12.2011 10:47:00 | Martin Hey

Ein sehr spannendes Feature von SQL Server 2012 sind Contained Databases. Dieses Feature ist besonders auf Hosting-Umgebungen ausgerichtet, erlaubt es doch eine bessere Trennung der jeweiligen Datenbank- und damit Anwendungskontexte als es bisher der Fall war.

Was bedeutet das nun de facto? Um bisher einen Nutzer auf einer Datenbank zuzulassen, legte man einen Server-Login an und ließ diesen Nutzer dann auf der jeweiligen Datenbank zu. Das ist ohne Frage auch durchaus sinnvoll, wenn man in Unternehmensgrenzen denkt. Und mal abgesehen von Recovery-Szenarien, bei denen es in der Vergangenheit häufig zu verwaisten Logins und/oder verwaisten Nutzern kam, ist an diesem Ansatz auch nichts auszusetzen. Er ist dann aber hinderlich, wenn man bedenkt, dass man auf einem SQL-Server die Datenbanken völlig voneinander unabhängiger Anwendungen hostet und sicherstellen möchte, dass die dort zugelassenen Nutzer keinesfalls Zugriff auf andere Datenbanken bekommen. Nun unterstelle ich mal, dass Microsoft dieses Feature nicht nur macht, weil es Entwicklern von Webanwendungen und Hostern entgegenkommt, sondern weil Microsoft dieses Feature selbst für Azure auch ganz gut brauchen kann.

Server konfigurieren und Datenbank im Contained Mode anlegen

Im Standard ist der bisher bekannte Modus aktiviert. Damit der Conained Mode verwendet werden kann, muss der Server zunächst dazu konfiguriert werden.

EXEC SP_CONFIGURE 'show advanced options',1
RECONFIGURE
GO
EXEC SP_CONFIGURE 'contained database authentication',1
RECONFIGURE
GO

Im Dialog zum Anlegen einer Datenbank gibt es zusätzlich die Option Containment Type.

Zur Verfügung stehen die Optionen None (= bisheriger Modus) und Partial (= partial contained mode). Dem aufmerksamen Betrachter fällt auf, dass keine Option Full (= full contained mode) zur Verfügung steht - zumindest noch nicht. das bedeutet im Umkehrschluss, dass noch immer keine hundertprozentige Trennung möglich ist und nach wie vor einige Funktionalitäten vorhanden sind, die Datenbankgrenze überschreiten können.

Contained Users

Wie schon kurz angedeutet erlauben Contained Databases nun, Nutzer anzulegen, die nicht mit Login global im Server registriert sein. Dazu wählt man im Create-User-Dialog die Option SQL user with password.

Ebenso wie SQL-Nutzer kann man auch Windows-User als Contained User anlegen. Dazu wählt man gleichen Dialog die Option Windows user und lässt das Feld Login name leer.

 

Die Nutzerinformationen werden nun lokal in der jeweiligen Datenbank gehalten und es gibt keine Verbindung zur master-Datenbank - keine Logins die dort angelegt werden und auch kein Datenbankzugriff auf die master-Datenbank.

Daraus folgt eine Einschränkung bei der Anmeldung. Bei der Anmeldung am SQL-Server muss der Datenbankname manuell im Verbindungsdialog eingegeben werden, da die Liste bestehender Datenbanken nicht abgefragt werden kann. Das spielt aber im realen Szenarien nur selten eine Rolle, da ich bisher noch keine Anwendung gesehen habe, die im ConnectionString keinen Datenbanknamen angibt und auf die Default-Database-Einstellung des Logins vertraut.

Verbindet man sich dann zur Datenbank, so sieht man den Unterschied zu bisherigen Nutzern - der Contained User sieht lediglich die Datenbank auf der er zugelassen ist.

Collation

Wer mit komplexen Datenbanken arbeitet, der kennt auch die Möglichkeit, temporäre Tabellen zu verwenden, um Zwischenergebnisse abzulegen. Diese temporären Daten werden in der tempdb abgelegt - so weit so gut. Probleme kann es dann geben, wenn man Textwerte zwischen der eigentlichen Datenbank und den temporären Daten vergleichen möchte (z.B. bei Joins) und die Collation der Datenbank (im Speziellen die Collation der Textspalte) von der Collation der model-Datenbank abweicht.

CREATE TABLE #p(
LastName nvarchar(50))

INSERT INTO #p
SELECT LastName FROM [dbo].[Person]

SELECT p.* FROM
[dbo].[Person] p INNER JOIN #p ON
p.LastName = #p.LastName;

Und bei Datenbanken, die nicht im Contained-Mode sind kommt es dann zu einer Fehlermeldung, die dieser hier sehr ähnlich ist:

Msg 468, Level 16, State 9, Line 8
Cannot resolve the collation conflict between "Latin1_General_CI_AS" and "SQL_Latin1_General_CP1_CS_AS" in the equal to operation.

Das Verhalten ist bei Datenbanken im Contained-Mode etwas anders. Wird normalerweise für neue Textspalten in temporären Tabellen die Collation der tempdb herangezogen, so wird bei aus Datenbanken im Contained-Mode erstellten temporären Tabellen die Standard-Collation der Datenbank verwendet. Das kann zwar immer noch zu Problemen führen, wenn die Collation der eigentlichen Spalte vom Datenbankstandard (database_default) abweicht, aber wer diese Einstellung macht, sollte sich der Konsequenzen auch bewusst sein.

Zusammenfassung

Die neue Einstellung Containment Type ist eine besonders in Hosting-Umgebungen sehr interessante Neuerung, die auch sehr viele der bisherigen bekannten Probleme in Umgebungen mit mehreren Datenbanken, die relativ unabhängig sein sollen, lösen kann - ich verweise hier nur auf die oben gezeigten Möglichkeit, Benutzer zu verwalten, ohne Bezug zur master-Datenbank.

Ich bin sehr gespannt darauf, was der Full Contained Mode noch an zusätzlichen Möglichkeiten bringt, sobald es ihn gibt.

dotnet Cologne 2012: Vorträge / Sponsoren gesucht

28.12.2011 22:17:01 | Roland Weigelt

Am 4. Mai 2012 findet zum vierten Mal die dotnet Cologne statt, wie bereits 2011 im Komed im Mediapark Köln. Diese von den .NET User Groups aus Bonn und Köln organisierte Konferenz zum Themen rund um .NET und verwandte Technologien hat sich im Laufe der Jahre zur größten deutschen .NET Community Konferenz entwickelt. Die bisherigen Veranstaltungen waren jeweils bereits Wochen vorher ausgebucht, für 2012 erwarten wir 350 Teilnehmer.

Das Erfolgsrezept hinter der dotnet Cologne ist dass wir, hauptberuflich als Software-Entwickler tätig, genau die Konferenz organisieren, die wir selbst gerne besuchen würden – von Entwicklern, für Entwickler:

  • Kompetente Sprecher mit relevanten Themen, vom groben Überblick bis hin zur “Level 400”-Session
  • Angenehme Location
  • Versorgung mit Essen und Trinken den ganzen Tag über
  • …und das Ganze zu einem für jeden erschwinglichen Preis!
    (Informationen zur Anmeldung und den genauen Preisen folgen demnächst, aber es wird wieder den “Early Bird”-Preis für nur 25,- Euro geben)

Wichtig ist uns auch, dass die Konferenz trotz der Größe für die Teilnehmer kein “anonymes Abarbeiten der Vorträge” bedeutet. So ist z.B. genügend Zeit für interessante Gespräche mit Sprechern, Teilnehmern und den Sponsoren an ihren Ständen eingeplant.

Vorträge gesucht

Der “Call for Papers” läuft bereits und wir haben schon viele interessante Vorschläge von aus der Community bekannten Sprechern erhalten. Wir sind aber weiter auf der Suche – wer Interesse hat, findet hier alle Infos dazu.

Sponsoren gesucht

Möchten Sie 350 Entwicklern Ihr Produkt, ihre Dienstleistung oder ggf. Ihre Firma als Arbeitgeber vorstellen? Wir bieten eine Vielzahl von Sponsoring-Möglichkeiten, von der Software-Lizenz für die Verlosung bis hin zu Ständen vor Ort. Melanie Eibl (Melanie.Eibl [at] dotnet-koelnbonn.de) schickt ihnen gerne unsere Informationsbroschüre zu und beantwortet Ihre Anfragen zum Thema Sponsoring.

Rückblick: dotnet Cologne 2011

Einen Bericht aus ganz persönlicher Sicht hatte ich in diesem Blogeintrag geschrieben, hier noch ein paar Impressionen:

image   Keynote im großen Saal
image   Ausstellerbereich…
image   …in der Mittagspause
image image   Auch zwischen den Vorträgen immer wieder Gelegenheit für Gespräche an den Ständen
image   Einer der fünf Vortragsräume
image   Empfang/Information

28C3: ASP.NET Sicherheitslücke

28.12.2011 14:31:00 | Alexander Zeitler

Auf dem 28th Chaos Communication Congress (28C3) wurde eine Sicherheitslücke veröffentlicht, die neben anderen Plattformen auch ASP.NET betrifft.

Betroffen sind ASP.NET-Seiten, die application/x-www-form-urlencoded oder multipart/form-data verarbeiten.

Weitere Details gibts im Blog-Post des Security Research & Defense Blogs von Microsoft.

Microsoft arbeitet bereits mit Hochdruck an einem Fix, der evtl. sogar außerhalb des monatlichen Update-Zyklus’ verteilt werden soll.

Videos vom ALM Summit 2011 in Redmond

27.12.2011 12:33:05 | Christian Binder

e3619182-736f-49bd-8749-7fc73b2efc8c[1]

Auch dieses Jahr gab es in Redmond wieder einen ALM Summit mit dem Schwerpunkt  “Agile Software Entwicklung”. Da wir Europäer ja nicht mal schnell an die Westküste fliegen können, freuen wir uns natürlich darüber, dass nun alle Vortäge unter Ch9 verfügbar sind. Ich habe mal Vorträge, die ich gut finde direkt verlinkt. Es sind aber auch einige interessante Vortäge zur Cloud z.B. von Brian Harry dabei, also einfach mal auf Ch9 vorbeischauen.
Viel Spass.

Jason Zander : The Microsoft Vision for ALM

 

Aaron Bjork : Managing the Agile Process

 

Peter Provost : Agile Development

 

Unit Testing from the Trenches: Practical Lessons & Practices

 

Anu Bharadwaj : Exploratory Testing

 

Scrum Special : WIKISPEED

WIKISPEED is a real life scenario on the use of Agile and Scrum principles to build an environmentally friendly car that runs over 100 miles per gallon. Everything from creating collaborative work experiences to leveraging Scrum practices is demonstrated in this WIKISPEED presentation, where this…

Datensammlungen über HTTP serialisieren

27.12.2011 12:15:00 | Klaus Bock

binärer Code...aber in welchem Format?
Mein erster Kandidat - und heimlicher Favorit - war hier die binäre Serialisierung mit dem BinaryFormatter.
Für einen Vergleich habe ich den XmlSerializer herangezogen, wobei ich Anfangs die binäre Serialisierung als klaren Favoriten ansah. Bei lokaler Verwendung, zum speichern von Kollektionen wie etwa List<T> oder Collection<T> in einer Datei, zeigte der BinaryFormatter immer sehr gute Ergebnisse. Die hohe Datendichte bei vergleichsweise kleiner Dateigröße ist einer seiner großen Vorteile gegenüber der Serialisierung in eine Datei im XML-Format. Warum sollte dieser Vorteil nicht auch beim Transport über HTTP zum tragen kommen?

TestNodeNun aber der Reihe nach.
In einem aktuellem Projekt ist eine der Anforderungen, eine Auflistung von Informationen über einzelne Knoten eines Netzwerks bereitzustellen. Diese Auflistung ändert sich mit der Verfügbarkeit einzelner Knoten und soll an einem zentralen Ort, für alle Knoten zugänglich, bereitgestellt werden.
Die Funktionalität entspricht in etwa einem Boostrapping Node, oder Rendezvous Host, eines Peer-to-Peer Netzes. Wie an der Aufgabenstellung bereits ersichtlich, geht es hier um die Kommunikation zwischen Maschinen. HTTP wurde als Transportprotokoll gewählt, um Probleme mit der Firewall der beteiligten Maschinen zu vermeiden.
Die Visualisierung der Daten in irgendwelchen UIs spielt keine Rolle und ist auch nicht vorgesehen. Auf die Befindlichkeiten von Benutzern braucht nicht eingegangen zu werden. Insofern kann auf die Notwendigkeit der Kompatibilität zu Formaten wie JSON udgl. verzichtet werden.
Für die Testumgebung habe ich eine vereinfachte Klasse, siehe obige Grafik, verwendet, die sich auf wenige öffentliche Eigenschaften und die überschriebene Methode ToString beschränkt. Für eine Simulation und Begutachtung der Bedingungen ist dies vorerst vollkommen ausreichend.
Zum bereitstellen der Kollektion wird ein IHttpHandler in einer ASP.NET-Anwendung verwendet, der die Auflistung in der benötigten Größe dynamisch erzeugt. Die Namen der Knoten werden mit dem Präfix Node_ durchnummeriert. Die MessagingUrl wird aus dem Namen erzeugt und mit einem fiktiven Handler ergänzt. Der Token wird mit der Zeichenfolgendarstellung einer Guid simuliert und die Liste der Eigenschaft Ranges wird in zufälliger Länge mit zufälligem Inhalt erzeugt.
Der Handler verarbeitet die beiden Parameter format und size. Mit format wird entweder binäre oder XML serialisiert. Size gibt die Anzahl der Elemente in der Auflistung an.

public void ProcessRequest(HttpContext context)
{
    if (context == null)
    {
        return;
    }
    var format = context.Request.QueryString["format"];
    var size = int.Parse(
		context.Request.QueryString["size"],
		CultureInfo.InvariantCulture);
    this.data = this.data jQuery15206468763694679172_1384534695665 SerializationHandler.CreateData(size);
    context.Response.ContentEncoding = Encoding.UTF8;
    switch (format)
    {
        case "bin":
            context.Response.ContentType = "application/octet-stream";
            var binFormatter = new BinaryFormatter();
            binFormatter.Serialize(context.Response.OutputStream, this.data);
            break;
        case "xml":
        default:
            context.Response.ContentType = "application/xml";
            var xmlFormatter = new XmlSerializer(typeof(List<TestNode>));
            xmlFormatter.Serialize(context.Response.OutputStream, this.data);
            break;
    }
}
private static List<TestNode> CreateData(int entriesCount)
{
    var list = new List<TestNode>(entriesCount);
    var i = 0;
    var lengthRandom = new Random();
    var contenRandom = new Random();
    while (i < entriesCount)
    {
        var node = new TestNode();
        node.Name = "Node_" + i.ToString("D6", CultureInfo.InvariantCulture);
        node.MessagingUrl = "http://node." + node.Name + ".net/messaging.axd";
        node.Token = Guid.NewGuid().ToString();
        var length = lengthRandom.Next(1, 10);
        node.Ranges = new List<int>(length);
        var j = 0;
        while (j < length)
        {
            node.Ranges.Add(contenRandom.Next(1, 254));
            j++;
        }
        list.Add(node);
        i++;
    }
    return list;
}

Wie bereits weiter oben angesprochen, ist lediglich die Größe der übertragenen Daten von vorrangigem Interesse, da die Auflistung häufigen Änderungen unterworfen ist und oft abgerufen werden kann. Zur Bestimmung der Größe der übertragenen Daten bei der unterschiedlichen Anzahl der Einträge, verwende ich den Composer von Fiddler, der sehr einfach die Änderung des Query-String und der Request-Header zulässt.

Für einen ersten Vergleich habe ich eine Auflistung jeweils binär und als XML serialisiert mit 100, 1.000, 10.000 und 100.000 Einträgen verglichen. (Siehe folgende Grafik)

einfacher Test

Wie erwartet, ist die übertragene Datenmenge der XML-serialisierten Auflistungen beinahe doppelt so groß wie die binär serialisierten. Auch interessant zu beobachten war die Tatsache, dass die XML-Serialisierung schneller als die binär-Serialisierung wurde, je weiter die Anzahl der Elemente stieg. Bei 1.000 Einträgen benötigte binär 92ms und XML 69ms für den Transport.
Bei 10.000 Einträgen 298ms zu 92ms und bei 100.000 Einträgen immerhin schon 1800ms zu 820ms.

Als nächste Maßnahme zog ich die Kompression der übertragenen Daten via GZip in Betracht. Die Kompression wird nicht vom IIS , sondern von einem eigenem IHttpModule vorgenommen. Damit bleibt mehr Spielraum für weitere Optimierungen.
Mit der Kompression sollte XML einen Vorsprung erfahren, da sich erfahrungsgemäß Textinhalte besser komprimieren lassen als binäre Daten.

Test der Komprimierung

Wie obige Grafik zeigt, lassen sich auch die binären Daten noch auf über die Hälfte ihrer ursprünglichen Größe komprimieren. XML zieht, in der reinen Größe der übertragenen Daten, mit einem Kompressionsfaktor von rund 5,8 deutlich vorbei.
Da die Kompression Zeit kostet, sind die Transportzeiten beinahe gleich. Erst bei 100.000 Einträgen macht XML mit rund 1,8s gegenüber 2,5s etwas Boden gut.

Als vorläufig letzte Maßnahme, kommt noch ein HttpResponse.Filter zum Einsatz, der überflüssige Zeilenumbrüche und Leerzeichen aus dem generierten XML entfernt. Das Prinzip eines solchen Filters, habe ich schon einmal in einem früheren Artikel beschrieben.

Test mit Komprimierung und Filter

Der Filter brachte noch einmal eine Ersparnis von rund 3.5% der übertragenen Datenmenge.
Allerdings auf Kosten der Zeit, denn das Filtern ist relativ zeitaufwendig. Bei 100.000 Datensätzen verlängerte sich die Transportzeit von 1,8s auf stolze 3,1s und somit langsamer als die binäre Serialisierung der gleichen Datensätze.

Eine weitere Möglichkeit die Datenmenge zu reduzieren, besteht in der Minimierung des ausgegeben XML. Dabei werden die Namen der Tags durch entsprechend kurze Zeichenfolgen ersetzt. Z.B.: <MessagingUrl> durch <MU> oder <Token> durch <T>. Mit den Daten aus dem obigen Beispiel, können so noch einmal rund 8% eingespart werden.
Es darf dann nicht vergessen werden, beim Deserialisieren des XML, die Minimierung wieder rückgängig zu machen.

Fazit:

Die Einstellung zu meinem anfänglichem Favoriten hat sich geändert. Wenn eine überschaubare Menge an Daten einfach und effizient serialisiert werden sollen, ist der BinaryFormatter nach wie vor die erste Wahl.
Soll die Serialisierung maximal optimiert werden, bietet der XmlSerializer deutlich mehr Möglichkeiten ohne einen komplett eigenen Serializer entwickeln zu müssen.

Technorati-Tags: | | | |

knockoutjs: Uncaught Error: ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node

26.12.2011 19:16:00 | Alexander Zeitler

When applying bindings in knockoutjs explicitely to a specific DOM element, you may get this error:

Uncaught Error: ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node

Your HTML might look like this:

...and your Javascript like this:

Whats wrong with it? Let's try document.getElementById instead:

Now everything works as expected:

correct list

So what’s wrong with the jQuery way of selecting the DOM element?

When using var menu = $("#menu") we don’t get a DOM object but a jQuery object instead.

To get the correct DOM element, we have to use one of the ladder two of the following (first one is for understanding purposes only):

SQL Server 2012 und die Format-Funktion

26.12.2011 17:24:00 | Martin Hey

Eigentlich ist Formatierung von Daten in meinen Augen nicht wirklich eine Aktion, die zwingend von der Datenbank durchgeführt werden muss. Aber wie es häufig ist, so gibt es auch hier Anwendungsszenarien in denen dies ein durchaus sinnvoller Weg ist.

In den bisherigen Versionen von SQL Server gestaltete sich dies aber immer etwas schwierig, denkt man nur an verschiedene Datumsformatierungen. Die Funktion CONVERT bot zwar schon begrenzt die Möglichkeit, hier Einfluss zu nehmen, aber wenn man bedenkt, dass für Datumsformate die Auswahlmöglichkeit auf "mit Jahrhundert oder ohne" begrenzt war, so schaute man schon etwas neidisch auf die Möglichkeiten, die beispielsweise die .NET CLR mit string.Format bot.

Mit SQL Server 2012 steht nun ein Pendant auch in T-SQL zur Verfügung - die Format-Funktion. Und die Funktionsweise gleicht der eben angesprochenen string.Format-Funktion sehr. Parameter sind zunächst der Ausgangswert, dann das Pattern und im Anschluss noch die Culture als optionaler Wert.

Erste Möglichkeit ist, Datumswerte beliebig zu formatieren. dabei wird wie gewohnt auch der sprachspezifische Trenner berücksichtigt.

DECLARE @date DATE = '2012-01-12';
SELECT FORMAT( @date, 'dd/MM/yyyy', 'en-US' );
SELECT FORMAT( @date, 'dd/MM/yyyy', 'de-DE' );
SELECT FORMAT( @date, 'yyyy-MM-dd' );
SELECT FORMAT( @date, 'dddd, dd. MMM yyyy', 'de-DE' );

Zum anderen können damit aber auch beispielsweise Zahlenwerte als Währung dargestellt werden...

DECLARE @amount DECIMAL(12,2) = 1234567.34;
SELECT FORMAT(@amount, 'C', 'de-DE')
SELECT FORMAT(@amount, 'C', 'en-US')
SELECT FORMAT(@amount, 'C', 'en-GB')

...oder auch so lustige Sachen wie Zahlenwerte hexadezimal darstellen.

DECLARE @value int = 255;
SELECT FORMAT(@value, 'X');

Alles in allem ist das eine interessante Verbesserung von T-SQL, wie immer sollte man aber abwägen, ob es wirklich Aufgabe der Datenbank ist, Daten für die Ausgabe zu formatieren.

Frohe Weihnachten 2011 und ein erfolgreiches Jahr 2012!

24.12.2011 11:56:40 | Kay Giza

Jetzt kommt die Zeit, um das Jahr 2011 langsam ausklingen zu lassen. Die Weihnachtsfeiertage und das Jahr 2011 stehen vor der Tür. In diesem Jahr gab es sehr viel zu berichten und selbstverständlich viel zu bloggen und ich möchte mich bei Ihnen für Ihr beständiges Interesse bedanken. Natürlich findet man in dieser ruhigen Zeit auch einige Minuten, um auf das Jahr 2009 zurückzublicken... [lesen Sie den vollständigen Artikel auf Giza-Blog.de inkl. Videos]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
© Copyright 2006-2012 Kay Giza. All rights reserved. Legal
Subscribe

Mitmachen am 26.12.2011: Update den Browser Deiner Eltern-Tag

24.12.2011 11:53:49 | Kay Giza

Viele Eltern denken beim Thema Java an eine indonesische Insel, bei Phishing an ihr Aquarium und bei Cookies an Weihnachtsplätzchen. Die Notwendigkeit, alte unsichere und langsame Browser auf eine aktuelle Version zu aktualisieren, sehen sie oft nicht. Meine Kollegen von Microsoft/TechStudent wollen dies ändern und rufen deswegen auf, mit ihnen am 26. Dezember 2011 den 'Update den Browser Deiner Eltern-Tag' zu bestreiten... [... mehr in diesem Blogeintrag auf Giza-Blog.de]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
© Copyright 2006-2012 Kay Giza. All rights reserved. Legal
Subscribe

SharePoint Adventskalender 2011 – Mein ReCap

22.12.2011 12:33:16 | Thorsten Hans

Bis zum Gipfel sind es noch zwei Türchen hin, allerdings möchte ich bereits an dieser Stelle kurz meinen persönlichen SharePoint Adventskalender zusammenfassen.

SPAdventKaum ein Leser glaubt mir wie anstrengend so ein Adventskalender ist. Eigentlich hat man ja 11 Monate Zeit seine Posts vorzubereiten wenn man ein ganzes Jahr betrachtet. Aber aufgrund der Tatsache dass ich mich erst Anfang November dazu durchgerungen habe den Adventskalender wieder zu machen, schrumpft diese Vorbereitungszeit enorm. Wenn dann noch ein paar SharePoint Projekte und Konferenzen dazwischen kommen, ist der Vorlauf im Handumdrehen verschwunden.

Auch die Kommunikation von verteilten Bloggern ist im Zeitalter des Web 2.0 alles andere als einfach. So haben wir acht MVPs geschätzte 137 Emails zum Thema SharePoint Advent 2011 gewechselt.

Aber! Es hat Spaß gemacht! Es ist einfach schön jeden Tag auf den Blog zu gehen und einen neuen Beitrag zu sehen, vor allem die gesamte Themenliste ist echt schon prall gefüllt mit super Ideen und Features rund um SharePoint.

Aber auch ihr, die Community, habt dieses Jahr toll am SharePoint Adventskalender teilgenommen. Die Anzahl der Kommentare ist mit 70 schon relativ hoch für einen Blog. Das freut mich sehr und macht das große Gewinnspiel etwas interessanter. :D

Die Besucherzahlen steigen für bekanntlich immer erst im kommenden Jahr an, dann wenn diverse Suchmaschinen unseren Blog indiziert haben und die täglichen Suchanfragen auch dorthin geroutet werden. Für diejenigen, die es dennoch bereits jetzt interessiert hier mal ein kleiner Auszug aus den WordPress Stats.

clip_image002

Ich habe dieses Jahr zum Adventskalender fünf Artikel beigetragen, wobei der erste Artikel mehr als Introduction und Bekanntmachung des Gewinnspiels anzusehen ist. Konkreten SharePoint Content habe ich in den Artikeln

beigetragen. Wie wahrscheinlich von mir erwartet gab es auch in 2011 nur Developer Content, weil meiner Meinung nach hier in Deutschland noch sehr, sehr viel Bedarf ist.

 

Was geschieht mit dem SharePoint Adventskalender

Die Artikel des SharePoint Adventskalenders werden weiterhin online verfügbar bleiben. Es wird auch in 2012 wieder einen SharePoint Adventskalender geben – wenn auch an dieser Stelle die Teilnehmer und Rahmenbedingungen nicht geklärt sind. Aber es wird sicherlich eine Neuauflage geben!

 

Anfragen für Sponsoring

Vielen Dank für die vielen Sponsoring-Angebote die an uns herangetragen wurden. Wir hatten uns allerdings bereits im Vorfeld darauf geeinigt, dass wir nur die Sponsoren aufnehmen, die bis zum 30.11.2011 zugestimmt hatten.

Gerne könnt ihr bereits jetzt euer Engagement für das Jahr 2012 bekunden und mich kontaktieren, damit auch euer Unternehmen, Verbund, UserGroup in 2012 dabei ist.

 

Kommentarfunktion

Die Kommentarfunktion im Blog wird nach dem 24.12. weiterhin geöffnet bleiben. Ich werde manuell die Kommentare administrieren. Allerdings behalten wir uns vor, die Kommentarfunktion zu deaktivieren sobald der SPAM Anteil – wie es auf öffentlichen Blogs zu erwarten ist – wächst.

 

Ziehung der Gewinner

Die Gewinner des SharePoint Adventskalender Gewinnspiels werden in der ersten Januarwoche 2012 gezogen. Jeder Teilnehmer nimmt mit maximal einem Los teil. Die Gewinner werden via Mail benachrichtigt und auf dem Blog veröffentlicht.

Der Rechtsweg ist, wie bereits auf dem Blog beschrieben, ausgeschlossen

 

Finally

Schlußendlich ein großes Danke! Danke für alle die am SharePoint Adventskalender teilgenommen haben. Danke an die Blogger, die Sponsoren, die Gewinnspielteilnehmer, die Online- und Offline-Communities die unsere Status Updates oder Tweets geforwarded haben. Ohne euch alle wäre der SharePoint Advent in dieser Form nicht möglich gewesen.

Frohe Weihnachten kann ich an dieser Stelle bereits sagen, allerdings möchte ich eigentlich noch ein bis zwei Blogposts schreiben bis wir ins Jahr 2012 starten, von daher…

DotNetKicks-DE Image

WIX und das "Unhandled Extension Element"

21.12.2011 21:00:00 | Martin Hey

Zur Erstellung eines Installers für eine Webanwendung verwende ich WIX (Windows Installer XML). Teil dieses Installers ist es auch, das Virtual Directory im IIS anzulegen. Dafür gibt es die WIX IIS Extensions. Um diese verwenden zu können, muss man einfach einen neuen XML-Namespace hinzufügen - so die Information in verschiedenen Blogbeiträgen zum Thema. Gesagt - getan:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
     xmlns:iis="http://schemas.microsoft.com/wix/IIsExtension">
</Wix>

Und schon funktioniert Intellisense im Visual Studio und man kann die Erweiterungen iis:WebVirtualDir oder iis:WebApplication verwenden. Was diese Blogeinträge nicht verraten: Versucht man nun einen Build des Projekts, so wirft Visual Studio die Fehlermeldung

The Component element contains an unhandled extension element 'iis:WebVirtualDir'.  Please ensure that the extension for elements in the 'http://schemas.microsoft.com/wix/IIsExtension' namespace has been provided.

Problem ist nun nämlich noch, dass zwar der Namespace deklariert ist, aber die Implementierung der Erweiterung nicht gefunden werden kann, weil die dazu passende Assembly nicht referenziert ist. 

Die Lösung des Problems ist dann auch denkbar einfach: Zusätzlich zur Deklaration des Namespaces IIsExtension muss auch die Assembly WixIIsExtension.dll referenziert werden.

git – Einfach und schnell zur Versionskontrolle

21.12.2011 20:45:38 | Rainer Schuster

Angenommen ihr wollt eure Projekte mit einem guten Source Code Management (SCM) Tool verwalten. Und angenommen ihr wollte keine aufwendige Installation durchführen. Dann werdet ihr schnell bei git im Lokalen Netzwerk landen Zwinkerndes Smiley

Entweder weil ihr z.B. nicht den Luxus besitzt private Repositories in der Cloud zu hosten. Oder ihr in eurer Firma gegen ein SVN die Quellen einchecken müsst und trotzdem mit Kollegen arbeiten wollt. Oder euch das für euer Allerheiligstes das Internet zu unsicher ist. Na wie dem auch sei. Angenommen ihr wollte ein SCM aufsetzen…

Der schnellste Weg zum git “Server” unter Windows:

msysgit downloaden und installieren. Ich bevorzuge mittlerweile die Portable Version, da ich nur an den git Kommandos interessiert bin, und ich dann nicht jedes mal neu installieren muss, wenn es ein Update gibt. Dazu muss das Verzeichnis PortableGit*\cmd zur Umgebungsvariable PATH hinzugefügt werden.

Erstellt euch dazu einfach ein Startskript:

  1. Batch
    1. set PATH = %PATH%;[PortableGit*\cmd]
  2. Powershell
    1. $env:PATH += “;[PortableGit*\cmd]”

Danach könnt ihr git von der Konsole aus nutzen. Wenn ihr lieber eine Installation bevorzugt … nehmt sie. Das war im Prinzip auch schon alles was ihr braucht. Für den Server brauchen wir nichts, denn alles lokal auf eurem Rechner läuft. Ihr braucht nur noch ein Datensilo im Netz, falls überhaupt notwendig. Ansonsten, solange ihr alleine seid, einfach das Verzeichnis mit in euer Backup legen. Wie gehts also weiter?

  1. Projekteverzeichnis erstellen
    1. $ mkdir myrepo
    2. $ cd myrepo
  2. Repository initialisieren (gitflow empfohlen)
    1. $ git flow init
    2. Standards übernehmen die abgefragt werden oder individuell anpassen
    3. Ansonsten, wenn ihr kein gitflow nehmt, einfach ein $ git init
  3. Repository vorbereiten
    1. Initiale Dateien (z.B. README) und andere Verzeichnisse erstellen und zum Verzeichnis hinzufügen
    2. $ git add .
    3. $ git commit -a -m “added README”
  4. Zentrales “Server” (Remote) Verzeichnis erstellen
    1. $ git clone ./myrepo myrepo.git –bare
    2. danach entweder
      1. lokal lassen und ins Backup mit aufnehmen
      2. oder auf den Server kopieren auf dem ihr einen SSH Zugang habt
  5. Lokals Repositor behalten
  6. oder myrepo löschen und
  7. Vom Remote nochmal (lokal oder Server) klonen
    1. entweder lokal $ git clone [url_to_]myrepo.git

Wenn ihr euch für das löschen (Punkt 6.) entschieden habt oder dann doch mal mit Kollegen/Freunden/Spezialisten kollaborieren wollt (die dank Punkt 7. ausführen), sind noch ein paar Arbeitsschritte für diese notwendig. Wenn ihr mit gitflow arbeitet müsst ihr noch eine kleine Anpassung durchführen. gitflow kann bis jetzt nicht damit umgehen ein geklontes Repository richtig zu initialisieren, da diesem der master fehlt. Dazu müssen wir den master Branch vom Remote nach lokal auschecken und tracken! Das geht ganz schnell per

$ git checkout -t origin/master

$ git flow init

Nun habt ihr ein Rezept mit dem ihr

  • lokal in 10 Minuten ein SCM augebaut habt
  • das jederzeit ohne Aufwand ins Netzwerk schieben könnt
  • mit etwas zusätzlichem Aufwand (SSHs für die Nutzer anlegen) auf einem Linux Server eine Nutzerverwaltung anlegen
  • und dann zusammen auf einem gemeinsamen GIT Repository arbeiten

Wenn ihr sowieso schon unter Linux unterwegs seid, dann folgt den Anweisung von ProGit; 4.2 Getting Git on a Server (das sollte sowieso jeder gelesen haben).

Viel Spaß beim clonen, pullen, pushen, fetchen, branchen.

Less work, more success!

 

P.S.: Heute Abend beim Buchbummel durch den ansässigen Thalia Shop bei GIT – Kurz & Gut hängen geblieben. Dabei festgestellt, das obiges Rezept ähnlich so ziemlich am Anfang des Buches steht. Danach hab ich gleich einmal in dem Buch geschmökert und muss sagen es gefällt mir. Name ist Programm: Kurz & Gut. Nicht viel neues, aber kompakt. Mal schauen. Ich denke für den 10er werde ich es mir noch holen.

git submodule– Der Jailbrake Versuch

20.12.2011 21:41:00 | Rainer Schuster

Ich habe schon seit einiger Zeit gitflow auf dem Radar. Leider konnte ich dafür aber noch keine Zeit verschwenden, es mir mal anzuschauen, geschweige denn auszuprobieren. Gestern bin ich bei der Suche nach etwas völlig anderem wieder darüber gestolper. Als ich dann kurz vor einem Meeting noch 15 Minuten Zeit hatte war es dann soweit. Jetzt versuchst du es schnell zu installieren. In der kurzen Zeit kannst du sowieso kein Thema mehr sinnvoll anfangen. Auf gings gitflow unter msysgit zu installieren.

Dabei bin bin dann gleich erst einmal daran gescheitert, das ich in meiner Firma hinter dem Proxy nicht über das git:// Protokoll klonen kann, da der Port gesperrt ist. D.h. alle URLs die per git:// abgerufen werden funktionieren nicht. Das an sich ist kein Problem, da ich bei github für diesen Zweck auch das klonen über http:// durchführen kann. Mein eigentliches Problem ist das klonen der Submodule in dem Projekt gewesen.

$ git clone --recursive git://github.com/nvie/gitflow.git

schlug dabei gnadenlos fehl. Da ich zuvor mit Submodulen nichts zu tun hatte. War ich erst einmal ratlos was zu tun ist. Der erste Versuch von mir war es, über socat und git config --global core.gitproxy den port zu tunneln, was aber leider auch nicht funktioniert hatte. Da ich aber keine Zeit hatte den Port freischalten zu lassen, hab ich dann einen anderen weg versucht. Ein kurzer Blick ins Kapitel 6 von Pro Git über Submodule zeigte mir die Lösungsansatz, der dann auch gleich zum Erfolg geführt hat:

Die Submodule werden in der Datei .gitmodules mit git:// als Protokoll gespeichert. Also einfach die Option --recursive für das Abrufen der Submodule weglassen

$ git clone git://github.com/nvie/gitflow.git

$ cd gitflow

In der .gitmodules habe ich dann die URL auf http:// umgestellt.

[submodule "shFlags"]
    path = shFlags
    url =
http://github.com/nvie/shFlags.git

Danach war der Rest nur noch ein Kinderspiel

$ git submodule init

$ git submodule update

Danach konnte ich dann ohne Probleme

$ contrib\msysgit-install.cmd

ausführen. Ich nutze im übrigen immer die Portable Version von msysgit und füge dann in meinem Init-Script in der Powershell das CMD Verzeichnis meinem PATH hinzu. Somit erspar ich mir immer das lästige installieren und deinstallieren neuer Versionen und muss lediglich mein Skript anpassen.

VORSICHT: Dieser Lösungsansatz ist nur sinnvoll, wenn ihr von den Repositories ein pull ausführt. Wenn ihr auch Änderungen hochschieben wollt, wird das wohl schiefgehen. Über weitere Lösungen eurerseits wäre ich dankbar. Wer also etwas hat… nur her damit.

Office365–Neue Datenschutzregelung

20.12.2011 02:06:01 | Lars Keller

Office365 ist in aller Munde und ich selber habe auch einen Testaccount und bin bis jetzt sehr zufrieden damit! Auch das “anprogrammieren” dieses Accounts klappt gut, dank PowerShell & Co.

Das einzige was mich immer noch ein bissel Abschreckt, sind die Datenschutzbedingungen. Genau da hat sich gerade etwas getan! Seit Anfang Dezember bietet Office365 jedem Kunden die EU Model Clauses standardmäßig an.

Hier ist ein guter Artikel von Werner Leibrandt (Leiter Markt- und Wettbewerbsstrategie, Microsoft Deutschland GmbH) zu dem Thema.

Link: http://blogs.technet.com/b/microsoft_presse/archive/2011/12/12/warum-office-365-die-bessere-l-246-sung-ist.aspx

Langsam geht alles in die richtige Richtung! :-)

Prototyp eines Skateboard-Controllers

19.12.2011 18:30:00 | Daniel Springwald

 

 

Zur Steuerung eines Video-Spieles ist dieser Skateboard-Controller entstanden.

Es ist nur ein Prototyp und daher nicht sonderlich robust, funktioniert aber technisch einwandfrei.

Als Basis habe ich ein preiswertes Skateboard aus dem Sportgeschäft erstanden:

Von unten sieht es so aus...

Da der spätere Controller fixiert und unbeweglich sein soll, mussten zuerst die Räder entfernt werden:

Bei diesem Prototyp wird sämtliches Gewicht des Spielers durch Tür-Buffer aus Gummi aus dem Baumarkt aufgenommen...

...die auf einer Seite über eine Klebefläche verfügen. Leider sind diese in der Mitte hohl, was für die Verwendung der Drucksensoren nicht ganz optimal ist - doch dazu später mehr...

Da die Mitte des Skateboards nicht relevant für die Richtungsmessung ist (und damit die Drucksensoren später nicht das komplette Gewicht des Spielers verarbeiten müssen),  können zwei der Gummi-Buffer direkt in die Mitte des Boards geklebt werden:

In den vier Ecken des Skateboards wird nun jeweils ein Drucksensor angebracht.

Ich habe mich bei diesem Prototyp für einen 12,7mm großen Sensor entschieden, welcher für den Messbereich von 100g bis 10kg optimiert und mit unter 10,- EUR noch relativ günstig ist.

Nachdem an die Sensoren jeweils ein zweipoliges Kabel angelötet ist, können diese grob auf dem Board fixiert werden.

Jetzt kommt die kleine Problematik mit den hohlen Gummi-Buffern. Diese habe ich mit jeweils einer kleinen Portion Heißkleber gelöst.

Vorher wurde natürlich die ursprüngliche Klebeschicht entfernt.

Wichtig ist dabei, dass die Oberfläche in etwa plan ist:

Die so vorbereiteten Buffer benötigen nun wieder eine Klebefläche. Dazu verwende ich hier einfach doppelseitiges Klebeband:

Nun kann auf die vier Sensoren jeweils ein Gummi-Buffer aufgeklebt werden:

Die Verkabelung zum Arduino-Board wird später auf die analogen Eingänge A0 bis A3 geführt.

Hier die Kabel-Belegung:

Als Controller wird hier ein Ardunio Uno Rev 3 verwendet.

Die Drucksensoren werden nun mit jeweils einem Anschluss an den 5V Port des Arduino und mit dem anderen Anschluss an einen analogen Ausgang (A0-A3) angeschlossen.

Gleichzeitig muss noch ein Widerstand zwischen dem jeweiligen analogen Port und dem GND Port des Arduino angeschlossen werden. Ich habe hier 470 Ohm verwendet, was vom späteren Messergebnis her prima funktionioniert.

Als Versuchsaufbau für einen einzelnen Drucksensor sieht das dann so aus (die blauen Kabel führen zum Drucksensor):

Um das Ganze für die vier Sensoren etwas stabiler und übersichtlicher auszulegen, habe ich die Verkabelung und die Widerstände in Form eines Shields an entsprechende Kontaktleisten und eine Platine angelötet:

Das Shield lässt sich nun auf den Ardunio aufstecken.

Damit ist der Hardwareteil erfolgreich abgeschlossen. Ein kleiner Test mit einem Arduino-Programm, welches über den seriellen Port die vier Messwerte sendet, war erfolgreich und zeigt entsprechend der Gewichtsverlagerung auf dem Skateboard entsprechende Messwerte an.

Am Ende muss das Skateboard nur noch auf einer Untergrund-Platte fixiert werden (hier nicht als Foto zu sehen). Dabei verwende ich die bereits vorhandenen 8 Löcher, an welchem früher die Rollen befestigt waren. Die Schrauben sollten nur so fest angezogen werden, dass das Board gut auf den Gummie-Buffern fixiert ist, aber dennoch noch nicht zu viel Druck auf diese ausübt.

Windows Azure, ASP.NET Webforms 4.0 und System.Web.Routing, 404 vorprogrammiert

19.12.2011 00:36:45 | Jan Welker

Azure 404Vor gut einer Woche habe ich mich dazu durchgerungen, meine ersten Gehversuche in der Microsoft Wolke zu wagen.
Es ging um die Portierung einer mittelgroßen ASP.NET 4.0 (Webforms) App zu Windows Azure. Der erste Schritt was das Umziehen der Datenbank zu SqlAzure, was sehr unproblematisch war. Die einzige Änderung, die ich an der Datenbank machen musste, war das Anlegen von Clustered Indexes auf Zuordnungstabellen. Diese sind notwendig, weil die Datenbank bei SqlAzure repliziert wird. Mehr dazu hier: http://blogs.msdn.com/b/sqlazure/archive/2010/05/12/10011257.aspx

Die eigentliche Webseite hatte ich vorerst auf meinem eigenen Server gelassen und die Datenbank lief in der Cloud. Von dieser Kombination hatte ich mir eine schlechte Performance erwartet, da für jede Datenbankabfrage ein Round Trip von Berlin nach Amsterdam notwendig war. Jedoch konnte ich keine zusätzliche Verzögerung messen.

Jetzt hatte ich genug Zeit, um auch die Webseite zu Windows Azure zu bringen. Die brauchte ich auch. Der einfache Weg, den man in vielen Webcasts sehen kann, lief wie geschmiert:

  • Hinzufügen eines Windows Azure Projects zur Solution
  • 2, 3 Settings anpassen
  • Publish im Windows Azure Projects klicken
  • Kaffee holen weil Windows Azure die VM’s einrichtet und hochfährt, dies dauert ca. 10 Minuten

Schön, die Webseite war online und die Freude war groß. Leider währte dieses Erfolgserlebnis nur kurz. Genauer gesagt, bis ich den ersten Link auf der Webseite klickte und ich feststellen musste das das ASP.NET Routing nicht funktionierte.
Jede geroutete URL lieferte ein „404 – File not found“ zurück.
Die Fehlersuche begann im IIS, der auf der VM in Windows Azure lief. In meiner App konnte kein Fehler sein, da sie schon ein paar Monate fehlerfrei auf meinem eigenen Server lief. Die Einstellungen im IIS waren alle sauber. Das Rätselraten begann.

Wenn kann man an Wochenende um Rat fragen?

Leider ist die Azure - Community in Deutschland praktisch nicht vorhanden, nur ein Blogger schlägt sich tapfer und veröffentlicht regelmäßig Artikel rund um Windows Azure: Sascha Dittmann.
Bei einem Telefonat mit ihm erfuhr ich, dass die Azure VM’s per default nicht mit Windows Server 2008 R2 laufen, sondern mit Windows Server 2008!
Warum das so ist, kann ich nicht nachvollziehen. Bei der Datenbank setzt Microsoft schon auf Denali und in der Azure Management App können sogar schon CTP Features des nächsten SQL Servers genutzt werden.

Es ist möglich, vor der Instanziierung einer VM das OS zu bestimmen und den Windows Server 2008 R2 auszuwählen:

  • ServiceConfiguration.Local.cscfg bzw. in der ServiceConfiguration.Cloud.cscfg öffnen
  • Im Tag ServiceConfiguration folgende Attribute ändern/hinzufügen: osFamily="2"

Gesagt – getan, schon lief mein Routing.

Tja, da fehlte wohl irgendein Patch in der Windows Azure - Windows Server 2008 Installation, der in der R2 Version vorhanden ist.

Hier noch mal eine kurze Zusammenfassung:

Per default bekommt man in Windows Azure nur eine Windows Server 2008 Installation. Mit dieser kann man das Routing in ASP.NET 4.0 Webforms nicht nutzen, es hagelt 404’er.
Abhilfe schafft die Auswahl des Windows Servers R2.

ReadOnly(true) vs. Editable(false)

15.12.2011 13:31:00 | Martin Hey

Der DefaultModelBinder in ASP.NET MVC ist die Klasse, die anhand von jeder Menge Magie die im Post enthaltenen Daten in die jeweiligen Properties im Model schreibt. Wenn alle Eigenschaften öffentliche Getter und Setter haben und auch auf der Seite bearbeitbar sein sollen, dann funktioniert diese Magie auch problemlos.

Spannend wird es beispielsweise dann, wenn man Eigenschaften des Models auf der Seite zwar anzeigen, dem Benutzer aber nicht erlauben möchte diese Werte zu ändern. Nichts leichter als das, gibt es doch das ReadOnlyAttribute. Aber schon dann wenn das erste Mal ein Post vom Client zurück an den Server geschickt wird, merkt man, dass ReadOnly keine so gute Idee ist, denn der DefaultModelBinder nimmt dieses Attribut sehr ernst und mit dem ReadOnly-Attribut markierte Eigenschaften werden genauso behandelt, wie auch Eigenschaften ohne öffentlichen Setter behandelt werden würden - sie werden ignoriert.

Ursache ist die interne Methode ShouldUpdateProperty. Diese ermittelt (wie der Name schon sagt), ob es sich um eine Eigenschaft handelt, die beim Binden beachtet wird oder nicht.

private static bool ShouldUpdateProperty(PropertyDescriptor property, Predicate<string> propertyFilter)
{
    if (property.IsReadOnly && !CanUpdateReadonlyTypedReference(property.PropertyType))
    {
        return false;
    }

    // if this property is rejected by the filter, move on 
    if (!propertyFilter(property.Name))
    {
        return false;
    }

    // otherwise, allow
    return true;
}

Die Werte werden also unter anderem nur dann geschrieben, wenn ReadOnly false ist. Wann ist eine Property aber ReadOnly? 

public override bool IsReadOnly { 
    get {
        return SetMethodValue == null || ((ReadOnlyAttribute)Attributes[typeof(ReadOnlyAttribute)]).IsReadOnly;
    }
}

ReadOnly ist die Eigenschaft also, wenn kein öffentlicher Setter da ist oder das ReadOnly-Attribut gesetzt ist. Dieses ReadOnly ist im übrigen das gleiche, das auch über die Klasse ModelMeta (z.B. in ModelMetadata.FromLambdaExpression) abgefragt werden kann.

Um das gewünschte Ziel nun doch zu erreichen, gibt es seit .NET 4 das EditableAttribute.

[Editable(false)]
public string MyReadOnlyProperty { get; set; }

Ist dieses an einer öffentlichen Eigenschaft mit AllowEdit = false definiert, so wird der Wert beispielsweise in eine deaktivierte TextBox gerendert, beim Post aber auch wieder an das Model gebunden, da das EditableAttribute die Methode ShouldUpdateProperty nicht beeinflusst.

Interview meinerseits bei Intel´s Software Dev Blog: Trend Report 2011

14.12.2011 09:13:37 | Gregor Biswanger

image

Ab heute gibt es eine weitere Folge vom Trend Report 2011. Die neue Folge zeigt ein Interview meinerseits zum Thema “Tools, Programmiersprachen und mehr”.

 

image

http://www.software-dev-blog.de/trend-report-2011-gregor-biswanger-gibt-antworten-zu-tools-programmiersprachen-und-mehr/12/2011/

 

Vielen Dank an Oliver Ibelshäuserfür das tolle Interview.

Erste Schritte mit der Team Foundation Service Preview

14.12.2011 06:43:00 | Sascha Dittmann

TFS Preview

An der //build/, die vor ca. 3 Monaten stattgefunden hatte, wurde u.a. die Team Foundation Service Preview (TFS Preview) vorgestellt.
Diese stellt die Team Foundation Server Funktionalitäten als Cloud Dienst bereit.
Die Ersten Schritte mit diesem Dienst, werde ich in diesem Blog Post kurz vorstellen.

 

TFS Preview Konto

Als Erstes muss man sich ein Konto für die TFS Preview erstellen:

TFS Preview - Home

Hierzu gab es für jeden Teilnehmer der //build/ Konferenz einen Invitation Code.
Alternativ kann man sich entweder mit dem Link auf dem Anmeldeformular einen Code anfordern, ...

TFS Preview - Anmeldeformular

... oder, seit dem "Team Foundation Service December Update", den Invitation Code
TfsDecUpdate
benutzen.

 

Teamprojekt

Nachdem man nun ein Konto erstellt hat, kann man als nächstes ein Teamprojekt anlegen:

TFS Preview - Dashboard

Hierbei muss ein Name und eine Prozessvorlage ausgewählt werden.
Die Beschreibung ist optional:

TFS Preview - Neues Teamprojekt

Anschließend steht das neue Teamprojekt zur Verfügung.

 

Visual Studio mit der TFS Preview verbinden

Sobald das Konto und ein Teamprojekt angelegt wurde, kann man sich out-of-the-box mit der Visual Studio 11 Preview verbinden oder, wie folgt, mit Visual Studio 2010.

 

Voraussetzungen

Um Visual Studio 2010 mit der TFS Preview verbinden zu können, müssen folgende Komponenten installiert sein:

 

Verbindung mit Visual Studio 2010 herstellen

Nachdem die Komponenten installiert wurden, kann man über den Menüpunkt "Team > Connect to Team Foundation Server..." den Verbindungsdialog öffnen ...

Visual Studio 2010 - Team Menüpunkt

Hier klick man, wie gewohnt, auf "Servers" ...

Visual Studio 2010 - Connect to Team Project

... und anschließend auf "Add...".

Visual Studio 2010 - Add/Remove Team Foundation Server

Im "Add Team Foundation Server"-Dialog muss dann die TFS Preview URL angegeben, sowie das HTTPS Protokoll ausgewählt, werden:

Daraufhin folgt noch eine Authentifizierung mittels Windows Live Konto:

Sobald diese durchgeführt wurde, ist die Verbindung zwischen Visual Studio 2010 und der TFS Preview hergestellt, und die Teamprojekte können ausgewählt werden:

 


Weitere Informationen Weitere Informationen:

Silverlight 5 Download und Neuigkeiten (Silverlight 5 RTM)

12.12.2011 11:18:06 | Kay Giza

Bereits am 09.12.2011 hat Microsoft - respektive das Microsoft Silverlight Team - die finale Version von Silverlight 5 angekündigt. Sie können Silverlight 5 direkt und kostenfrei installieren. Was Silverlight 5 Neues mitbringt sowie weiterführende Informationen entnehmen Sie bitte diesem Blogeintrag auf Giza-Blog.de... [... mehr]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
© Copyright 2006-2012 Kay Giza. All rights reserved. Legal
Subscribe

HTTP Error 404.0 - Not Found (MapRequestHandler / StaticFile) when deploying WCF Web API on IIS 7.x

11.12.2011 00:05:00 | Alexander Zeitler

If you’re deploying a WCF Web API application to your IIS 7.x you might receive a HTTP Error 404.0 (MapRequestHandler / StaticFile):

404

As you know, WCF Web API relies on .NET Framework 4.0.

So lets take a look into the application pool for our application:

.NET Framework 4.0 selected

Everything looks fine here.

So lets dig a little bit deeper – namely inspect the ISAPI Filters:

IIS Manager / choose ISAPI Filters

IIS Manager / ISAPI Filters ... ASP.NET 4. is missing

Looks like ASP.NET 4 is missing here… so lets fix it:

PS C:\Windows\Microsoft.NET\Framework64\v4.0.30319> .\aspnet_regiis.exe -i
Start installing ASP.NET (4.0.30319).
........
Finished installing ASP.NET (4.0.30319).

Now hit F5 in your browser:

yay!

(If it’s not working after installing ASP.NET 4.0.x please review the version in your application pools settings again and fix it if necessary).

TFS Service Dezember Update mit Neuem UI

09.12.2011 16:21:27 | Christian Binder

Für den TFS Service http://tfspreview.com sind nun monatliche Updates geplant. Mit dem Dezember Update gibt es einige Neuerungen, die jetzt live verfügbar sind. Die Navigation wurde komplett überarbeitet und vereinfacht. Auf der Homepage hat jetzt auch der Metro Style Einzug erhalten. So sind Team Favoriten, wie Builds oder Workitem Abfragen  direkt  als Kachel auf der Team Startseite platzierbar.

image

Forecast Lines helfen das Backlog basierend auf der Team Velocity zu visualisieren.

image

Mehr Details zu den Neuerungen gibt’s in Doug’s Post.

Jetzt den Office 365-Datenverarbeitungsvertrag mit EU-Standardvertragsbestimmungen nutzen

08.12.2011 09:02:38 | Kay Giza

Jetzt den Office 365-Datenverarbeitungsvertrag mit EU-Standardvertragsbestimmungen nutzen! Die Zuordnung zu einem bestehenden Office 365 Services Vertrag kann seit gestern, Mittwoch 07.12.11, online auf der EU Model Clauses Zeichnungsseite vorgenommen werden. Hier kann sich jeder Kunde mit seiner Office 365 Administrator-Kennung anmelden und danach die neuen zusätzlichen Bedingungen 'Office 365-Datenverarbeitungsvertrag mit EU-Standardvertragsbestimmungen' im Detail ansehen und prüfen bzw. prüfen lassen (z.B. von seinem Datenschutzbeauftragten oder einer Anwalt). Am Ende des Prozesses erhält der Kunde eine elektronische Gültigkeitsbestätigung von Microsoft... [... detaillierte Beschreibung und weitere Informationen in diesem Blogeintrag auf Giza-Blog.de]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
© Copyright 2006-2012 Kay Giza. All rights reserved. Legal
Subscribe

T-Domain: Konfiguration und Nutzung von Office 365 fuer Exchange, Lync und SharePoint

07.12.2011 14:36:12 | Kay Giza

T-Domain: Office 365 erlaubt Ihnen mit Ihrem eigenen Domänennamen die Nutzung der Dienste Exchange Online, Lync Online und SharePoint Online. Um diese Dienste mit Ihrem eigenen Domänennamen nutzen zu können, ist es erforderlich, die DNS-Datensätze Ihrer Domäne zu bearbeiten. Diese Änderungen werden Ihnen von dem Unternehmen, bei dem Sie Ihren Domänennamen registriert haben (Ihrem Hosting-Anbieter), in der Regel über Kundendienst-Webseiten zur Selbstvornahme ermöglicht, oder über eine persönliche Inanspruchnahme des Kundendienstes Ihres Anbieters vorgenommen. In dieser Anleitung werden die notwendigen Schritte für Kunden des Hosting-Anbieters T-Domain beschrieben... [... mehr in diesem Blogeintrag auf Giza-Blog.de]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
© Copyright 2006-2012 Kay Giza. All rights reserved. Legal
Subscribe

T-Domain: Hinzufuegen bzw. Ueberpruefen einer Domaene bzw. Domain bei Office 365 (DNS, TXT-, MX-Eintrag)

07.12.2011 14:27:52 | Kay Giza

T-Domain: Hinzufügen bzw. Überprüfen von Domänen bzw. Domains bei Office 365 (DNS, TXT-, MX-Eintrag) Wenn Sie bereits eine Domäne (englischsprachig: Domain) bei T-Domain registriert haben und diese nun mit Microsoft Office 365 für Unternehmen einsetzen möchten, ist eine Überprüfung erforderlich, die Sie als über diese Domäne verfügungsberechtigt ausweist. Office 365 nimmt diese Überprüfung anhand eines neuen DNS-Eintrags vor, den Sie für Ihre Domäne auf die T-Domain-Website erstellen... [... mehr dazu in diesem Blogeintrag auf Giza-Blog.de]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
© Copyright 2006-2011 Kay Giza. All rights reserved. Legal
Subscribe

Microsoft uebernimmt Fuehrung beim Datenschutz im Cloud Computing: Office 365, EU Model Clauses, Auftragsdatenverarbeitung, ISO-Zertifizierungen

05.12.2011 18:28:03 | Kay Giza

Microsoft geht in die Datenschutz-Offensive. Das Unternehmen hat sich die 'Orientierungshilfe – Cloud Computing' des Arbeitskreises Technik und Medien der Konferenz der Datenschutzbeauftragten des Bundes und der Länder zum Maßstab genommen und in konkrete Vertragsbestimmungen für Office 365 umgesetzt. Damit unterstützt Microsoft die Office 365-Kunden, ihrer rechtlichen Verpflichtung zum Datenschutz einfacher nachzukommen. Ab Mitte Dezember 2011 stehen den Microsoft-Kunden, die Office 365 nutzen, neue Vertragsdokumente zur Verfügung, die neben anderen datenschutzrechtlichen Regelungen auch die EU-Standardvertragsklauseln – auch als EU Model Clauses bekannt – beinhalten. Diese neuen Vertragsdokumente reflektieren damit auch die deutschen und europäischen Datenschutzbestimmungen und sind – ebenfalls ab Mitte Dezember – unter ... [... mehr in diesem Blogposting auf Giza-Blog.de]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
© Copyright 2006-2011 Kay Giza. All rights reserved. Legal
Subscribe

Treffen der DNUG Braunschweig: Advanced UI-Testing für WPF

04.12.2011 01:47:00 | Lars Keller

Die DNUG Braunschweig trifft sich am 08.12.2011 um 19:00 Uhr im Restaurant Zucker (Tagungsraum). Uns kommt der Microsoft MVP Thomas Schissler mit einem Vortrag über GUI Unit-Testing besuchen.

Abstract:
Haben sie schon eine der schönen Demos für Coded UI Tests in Visual Studio 2010 gesehen? Haben sie vielleicht sogar schon mal an ihrer eigenen Applikation versucht, diese Testmethode anzuwenden und sind damit gescheitert? Dann sollten sie unbedingt diese Session besuchen. Der von Microsoft vorgesehene Record & Play Ansatz sieht in Demos zwar schön aus, in der Praxis gibt es jedoch eine Reihe von Problemen. In dieser Session werden diese Probleme erläutert und es werden Lösungen und Alternativen speziell für WPF-Applikationen aufgezeigt. UI-Testing kann funktionieren!

Bio:
Thomas entwickelt seit 1996 Software, seit dem Jahr 2001 ausschließlich mit .NET. Er arbeitet als Coach und Berater in der Nähe von Ulm. Er ist MVP für Visual Studio ALM und Professional Scrum Trainer. Seine Schwerpunkte sind Team Foundation Server, Entwicklungsprozesse, insbesondere SCRUM und Softwarearchitektur. Als Sprecher ist er auf verschiedenen Konferenzen und bei Usergroups unterwegs. Selbst leitet er die .Net Developer Group Ulm (www.dotnet-ulm.de) und die EMEA-Sektion der Visual Studio ALM User Group (www.vsalmug.com).

Wie immer ist die Veranstaltung kostenlos! Weitere Informationen zur DNUG Braunschweig können hier gefunden werden: http://www.dotnet-braunschweig.de

Weihnachtszeit 2011 ist Gewinnspielzeit! Gewinnspiele und Adventskalender in der Uebersicht

02.12.2011 11:07:01 | Kay Giza

Die Weihnachtszeit und Adventszeit 2011 wird erneut wieder atemberaubend, denn wenn ich mir die Preise anschaue, die man bei diversen Gewinnspielen, Veranstaltungen und Adventskalendern gewinnen kann - dann braucht man bald keine Geschenke mehr unterm Weihnachtsbaum :) In diesem Blogartikel auf Giza-Blog.de finden Sie eine kurze Übersicht über bestehende Gewinnspiele... [... mehr auf Giza-Blog.de]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
© Copyright 2006-2011 Kay Giza. All rights reserved. Legal
Subscribe

Gratis E-Books von Microsoft Press zur Adventszeit 2011

01.12.2011 10:06:18 | Kay Giza

Nach dem großen Erfolg im vergangenen Jahr bietet Microsoft Press auch in diesem Advent jede Woche ein aktuelles E-Book zum kostenlosen Download an. So bekommt man in den 4 Wochen vor Weihnachten 2011 jeweils ein Titel zum gratis Download. Zum 1. Advent verschenkt Microsoft Press den Topseller 'Microsoft Office 2010 - auf einen Blick'. Der Titel kann noch bis 3.12.11 komplett und kostenlos heruntergeladen werden. Der Download-Link... [... mehr in diesem Blogeintrag auf Giza-Blog.de]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
© Copyright 2006-2011 Kay Giza. All rights reserved. Legal
Subscribe

Windows Azure Startup Tasks im Emulatorbetrieb unterbinden

01.12.2011 07:39:00 | Sascha Dittmann

Azure LogoAuf der Suche nach einer Möglichkeit regelmäßige SQL Azure Backups als "Hintergrundprozess" durchführen zu lassen, bin ich über einen netten Blog Post von Steve Marx gestolpert:
Skipping Windows Azure Startup Tasks When Running in the Emulator
Dieser beschreibt, wie man die Ausführung von Startup Tasks, während des Betriebs im Compute Emulator, unterbindet.

 

Anpassen der Service Definition

Das, mit dem Windows Azure SDK 1.5 hinzugekommene, Feature "xPath Values in Windows Azure" erlaubt es, Umgebungsvariablen mit Werten aus der Azure Laufzeitumgebung zu befüllen.
Somit kann man zum Beispiel eine Umgebungsvariablen TestIsEmulated erzeugen, die den Wert aus der RoleEnvironment.IsEmulated Eigenschaft enthält.

Auszug aus der ServiceDefinition.csdef:

<ServiceDefinition name="StartupTasksUnterbinden" 
  xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <WorkerRole name="DummyRole" vmsize="ExtraSmall">
    <Startup>
      <Task commandLine="Startup.cmd"
            executionContext="elevated"
            taskType="background">
        <Environment>
          <Variable name="TestIsEmulated">
            <RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated"/>
          </Variable>
        </Environment>
      </Task>
    </Startup>
    <Imports>
      <Import moduleName="Diagnostics" />
    </Imports>
  </WorkerRole>
</ServiceDefinition>

 

 

Anpassen der Startup Skripte

Anschließend lässt sich dieser Wert im Startup Skript abfragen, um so die Ausführung zu unterbinden.
Hierzu fügt man zu Beginn des Skriptes folgende Zeile hinzu:

if "%TestIsEmulated%"=="true" goto :EOF

 

Beispielanwendung

Hierzu ein kleines Beispiel:

Ich habe ein Cloud Projekt mit einer Worker Rolle erstellt.
Diese Worker Rolle enthält folgendes Skript (Startup.cmd):

@echo off
del Ergebnis.txt
if "%TestIsEmulated%"=="true" goto :EOF
echo Startup Task wurde ausgefuehrt. > Ergebnis.txt

 

Wenn also das Startup Task ausgeführt wird, wird eine Text Datei mit dem Inhalt "Startup Task wurde ausgefuehrt." erstellt.

In der Run Methode des Worker Role Entry Points prüfe ich nun, ob diese Datei exisiert und gebe die entsprechene Trace Meldung aus:

Auszug aus dem Worker Role Entry Point:

public class WorkerRole : RoleEntryPoint
{
  public override void Run()
  {
    while (true)
    {
      Thread.Sleep(10000);
      if (File.Exists(@"Ergebnis.txt"))
        Trace.WriteLine(File.ReadAllText(@"Ergebnis.txt"));
      else
        Trace.WriteLine("Startup Task wurde NICHT ausgeführt.");
    }
  }
  // ...	
}

 

Bei Ausführung im Compute Emulator sieht das Ergebnis wie folgt aus:

Compute Emulator - Worker Role Trace

 


Download Download der Beispielanwendung:
Weitere Informationen unter:

Regeln | Impressum