Build Redmond 2012; Tag 1; Eine subjektive Zusammenfassung

imageBevor Steve Balmer mit der Keynote die diesjährige Build in Redmond auf dem Microsoft Campus eröffnet hat, hat Jordan Rudess in einem beeindruckendem Live-Konzert den Teilnehmern eingeheizt. Unter anderem hat er mit den Win8 Apps MorphWiz und Tachyon  auf einem Surface Tablet und einem Lenovo A720 Desktop für ordentlich Stimmung gesorgt.

Steve Balmer hat in einer gewohnt souveränen und mitreißenden Keynote das Publikum auf die kommenden Tage eingestimmt. Unter anderem hat er Windows 8 auf den verschiedenen Formfaktoren (vom Riesen-Touch-Screen über verschieden Slate bzw. Ultrabookm Formate bis hin zu Windows Phone 8 Geräten) die Datensynchronisation innerhalb von OneNote sehr anschaulich präsentiert.  Neben den bekannten Ankündigungen der vergangenen Wochen und den Informationen des Windows Phone 8 Launch vom 29.10.2012 hat er ebenfalls präsentiert, dass jede Windows 8 Lizenz eine kostenlose “XBox Music” Lizenz enthält. Ob es sich hier um einen mit Werbung finanzierten, einen zeitlich begrenzten Zugang oder um den sog. “Xbox Music pass” der bisher für 9,99 Euro / Monat zu Buche schlägt, handelt wurde jedoch nicht näher erläutert.

Die Halle hat förmlich getobt, als Steve Balmer das Giveaway der diesjährigen Build

image

image

vorgestellt hat. Jeder Teilnehmer erhält ein Surface RT 32 GB mit Touch Cover. Genau diese Geräte waren in den letzten Tagen in allen Microsoft Shops im Großraum Seattle ausverkauft. Als Richard Karris wenig später noch ankündigte, dass alle Teilnehmer zusätzlich ein Nokia Lumia 920 mit Windows Phone 8 bald Ihr Eigen nennen dürfen, war es um die Massen geschehen und die Einstimmung auf die weiteren technischen Vorträge war gelungen.

Building Awesome HTML Applications in Blend for Windows 8

Im Talk “Building Awesome HTML Applications in Blend for Windows 8” hat Kirupa Chinnathambi noch einmal sehr anschaulich aufgezeigt, wie HTML/JS Apps mit Hilfe von Blend einfach erstellt und optisch aufgepeppt werden können. Auch ohne eine tiefen Einblick in die aktuelle HTML5 Unterstützung des IE 10 zu haben.

Identische Code Basis für Win8 und Windows Phone 8 Apps

Gleich drei Sprecher wurden für das Thema aufgefahren. Dough Rothaus, Andrew Byrne und Larry Liebermann haben sich dem Thema in einem Talk angenommen. Als Best Practice wurde vorgestellt, das UI von der Applikationslogik zu trennen. Da es sich hier um ein allseits bekanntes Pattern handelt, ist es aus meiner Sicht keine spezielle Anforderung für die Entwicklung von Win8 und Windows Phone 8 Apps, sondern ein allgemein angewendetes Pattern.

Interresant wurde es, als gezeigt wurde, welche Komponenten Plattformübergreifend

image

verwendet werden können. Leider bezieht sich dies ausschließlich auf die Applikations Logik, die in eine sog. “Portable Client Library” ausgelagert werden kann. In solch einer Library

image 

kann hinterlegt werden, für welche Zielplattformen letztendlich das Assembly gebaut werden soll. Zu beachten ist zusätzlich, dass 3rd Party WinRT Komponenten oder selbst erstellte WinRT Komponenten für die jeweilige Plattform kompiliert werden müssen, da die Assemblies nicht binärkompatibel zwischen den Plattformen ausgetauscht werden können.

Letztendlich gab es noch eine sehr hilfreiche Übersicht, welche Komponenten in der Windows Runtime API für Windows Phone und Windows 8 übergreifend und damit von beiden Plattformen identisch vorhanden sind:

image

Optimistic Concurrency im Windows Azure Blob Storage

imageBei Azure Blob Storage denkt man sofort an große Dateien wie z. B. VHDs oder Filmmaterial.

Der Blob Storage bietet jedoch eine sehr einfache Möglichkeit um kleinere Datendateien wie z. B. Konfigurationen, XML Daten oder persistierte Objekte abzuspeichern.

Verwendet man den Blob Storage um Applikationsdaten zu speichern, kommt man sehr schnell auf die Problemstellung wie man gemeinsamen Zugriff von mehreren Instanzen bzw. Usern auf die Dateien regelt. Der Blob Storage liefert hier einen einfach zu integrierenden Mechanismus der für “Optimistic Concurrency” Implementationen verwendet werden kann.

Auslesen E-Tag Property

Beim Lesen oder bei der Erzeugung eines Blob kann über das Object Properties (Typ: Microsoft.WindowsAzure.StorageClient.BlobProperties) der BlobReference das Property ETag ausgelesen werden.

 

string eTag = "";
string containerName = "BlobContainer".ToLower();
string blobName = String.Concat(containerName, @"/DataInBlob");
string connectionString = "UseDevelopmentStorage=true”;

CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse(connectionString);
CloudBlobClient cloudBlobClient = cloudStorageAccount.CreateCloudBlobClient();
cloudBlobClient.RetryPolicy = RetryPolicies.Retry(5, TimeSpan.FromSeconds(1));
CloudBlockBlob cloudBlockBlob = cloudBlobClient.GetBlockBlobReference(blobName);
eTag = cloudBlockBlob.Properties.ETag;

 

ETag ist ein Read-Only Property welche eine spezifische Version des Blob eindeutig identifiziert. Der Wert wird vom Azure Storage System bei jedem Update bzw. bei der Anlage eines Blobs neu vergeben.

 

Verwendung E-Tag Property beim Upload

Verwendet man nun den Wert des ETag bei einem Update kann einfach geprüft werden, dass das Blob noch im Originalzustand ist und nicht von jemand anderem zwischenzeitlich geändert worden ist.

string eTag = "";
string containerName = "BlobContainer".ToLower();
string blobName = String.Concat(containerName, @"/DataInBlob");
string connectionString = "UseDevelopmentStorage=true”;

CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse(connectionString);
CloudBlobClient cloudBlobClient = cloudStorageAccount.CreateCloudBlobClient();
cloudBlobClient.RetryPolicy = RetryPolicies.Retry(5, TimeSpan.FromSeconds(1));
CloudBlockBlob cloudBlockBlob = cloudBlobClient.GetBlockBlobReference(blobName);
eTag = cloudBlockBlob.Properties.ETag;

cloudBlockBlob.UploadText("Upload Will Work!");

try
{
    cloudBlockBlob.UploadText("Upload Will Fail", Encoding.ASCII, new BlobRequestOptions()
    {
        AccessCondition = AccessCondition.IfMatch(eTag)
    });

}
catch (StorageClientException exception)
{
    if (exception.ErrorCode == StorageErrorCode.ConditionFailed)
    {
        throw new System.Data.DBConcurrencyException()
        {
            Source = "Blob Storage"
        };
    }
    throw;
}

Im obigen Beispiel wird der erste Upload mit dem Textinhalt “Upload Will Work” ohne weitere Prüfung durchgeführt. Dadurch ändert sich im Blob Storage das ETag des Blobs.

Beim zweiten Upload im obigen Beispiel wird der Upload unter Verwendung des ursprünglichen ETag durchgeführt (siehe AccessCondition.IfMatch(eTag)). Dies führt zu einer Exception die im weiteren Verlauf für das Erkennen und Auslösen einer DBConcurrencyException() verwendet werden kann.