Wenn man in Windows 8 Tiles oder Popups Bilder anzeigen möchte stellen sich mehrere Fragen. Zunächst das Format. Möglich ist png und jpg (auch jpeg). Auch Transparenz in PNG funktioniert.
Typischerweise wird ein Bild in das APPX Paket eingepackt und damit in die Visual Studio 11 Solution. In Silverlight Anwendungen war das eher verpönt, weil der Download eine Rolle gespielt hat.Bei WinRT wird die Anwendung ohnehin dauerhaft installiert und damit das oder die Images.

Der Eigenschaftsdialog muss dann das Bild als Content zeigen.
Dann lässt sich im Image Source Attribut über die neuen Protokoll Spezifikationen ms-appx auf das Bild verweisen. In diesem Fall liegt das Bild im Unterverzeichnis Images.
<Image HorizontalAlignment="Left" Height="100" Margin="36,39,0,0"
VerticalAlignment="Top"
Width="347" Source="ms-appx:///Images/ppedv.jpg"/>
Wenn Bild Link fehlerhaft ist erscheint keine Fehlermeldung.
Die zweite Möglichkeit ist, das Bild lokal auf der Festplatte in den Settings der Anwendung zu speichern (oder Roaming, dazu aber wann anders mehr). Der folgende Code liest das Verzeichnis aus.
Dim localSettings As Windows.Storage.ApplicationDataContainer =
Windows.Storage.ApplicationData.Current.LocalSettings
Dim localFolder As Windows.Storage.StorageFolder =
Windows.Storage.ApplicationData.Current.LocalFolder
Textbox1.Text = localFolder.Path
Am Ende kommt ein bekannter Pfad raus, der den Namen des Pakets aus den Visual Studio appx Manifest enthält plus einen Salt Wert.
C:\Users\pre\AppData\Local\Packages\BUILD.588a3b42-fdba-460e-8a17-f527a66ad183_89gf582k2a27c\LocalState
Ich habe eine Grafik Datei per Hand dort hin kopiert. Referenziert wird diese mit einer weiteren WinRT Protokoll Spezifikation mx-appdata und dem fixen Zusatz local.
<Image HorizontalAlignment="Left"
VerticalAlignment="Top"
Source="ms-appdata:///local/windows.png"/>
Natürlich kann man das Bild auch aus dem Web laden mit dem HTTP Protokoll.
Entgegen meiner Erwartungen wird das Bild auch gecacht. Konkret per Etag und 304 Meldung, so das die Anwendung dauerhaft dasselbe Bild nicht.
<Image HorizontalAlignment="Left"
VerticalAlignment="Top"
Source="http://www.firmenpresse.de/adpics/76898.jpg?id=2212"/>
Das Caching lässt sich nicht beeinflussen Abhilfe schafft ein alter Trick mit einem angehängten wechselnden Querystring.
In der letzten Folge dieser Architektur-Serie, haben wir die Phasen Design und Development kennengelernt. Bei der Design-Phase wurden die jeweiligen Prozesse zu Komponenten abstrahiert. Aus den Komponenten entstanden die jeweiligen Schichten und Contracts (Interfaces). Auch wenn der Punkt Development nicht komplett abgeschlossen wurde, somit ist zumindest die Hauptlogik durch TDD implementiert worden.
In diesem Teil wird die Development-Phase fortgesetzt, womit das Ziel mit dem Spiel „GoFish“ immer näher rückt.
Erstellen von Workflow Foundation Activities
Erst einmal kommt die Frage auf, wofür die Workflow Foundation verwenden? Die Workflow Foundation ist eine Art Framework für Geschäftslogik. Das Verhalten und die Verwendung der jeweiligen Prozesse werden visuell dargestellt. Gerade bei größeren Änderungen der Geschäftslogik ist eine visuelle Darstellung geradezu ideal. Es ist ersichtlicher ein paar Bausteine auszutauschen als Methoden und deren IF-Statements zu durchforsten. Außerdem kann man seine eigenen Komponenten ohne hohen Aufwand zu Activities erweitern. Sollte irgendwann zur Projektlaufzeit doch wieder auf klassischen Code gewechselt werden wollen, kann man einfach die Activities wieder löschen und die eigenen Komponenten bleiben unberührt. Activities dienen demnach als Adapter- oder Fassade-Pattern (siehe das Entwurfsmuster Adapterund Entwurfsmuster Fassade).
In der Design-Phase wurde das Komponentendiagramm entworfen. Dieses beschreibt bereits die jeweiligen Activities für die Geschäftslogik. Das Komponentendiagramm wurde anhand des Ablaufdiagramms abstrahiert.
Abbildung 1 – Das Komponentendiagramm mit den gewünschten Activities.
Das Komponentendiagramm beschreibt die zu benötigten Activities:
- AddCardsToPlayerActivity.cs
- FindQuartetsActivity.cs
- GetCardFromStackActivity.cs
- GetCardsActivity.cs
- GetSameCardValuesActivity.cs
- GetTheWinnerActivity.cs
- RemoveCardsActivity.cs
- SelectRandomCardActivity.cs
- SharedCardsToPlayerActivity.cs
Die Grundlagen für das Erstellen von Workflow Activities habe ich bereits gebloggt bzw. Microsoft Webcasts veröffentlicht. Es wird von der Basisklasse CodeActivity abgeleitet und das Input / Output via Arguments definiert. Das Input / Output entnehmen wir vom DomainModel.
Als Häuptling entspricht hier der GamblingTable, der als Aggregate (Domain-Driven Design) für die Entities Player und Card dient. Aggregate sind Zusammenfassungen von Entitäten und Wertobjekten und deren Assoziationen untereinander zu einer gemeinsamen transaktionalen Einheit.
Beim Spiel stehen für alle Activities dann alle relevanten Daten zur Verfügung. So entwarf ich je nach Anforderungen den I/O folgendermaßen:
AddCardsToPlayerActivity
- IN PlayerCards
- IN CardsToAdd
- OUT ResultPlayerCards
FindQuartetsActivity
- IN PlayerCards
- OUT ResultQuartets
GetCardFromStackActivity
- IN CardDeck
- IN PlayerCards
- OUT ResultCardDeck
- OUT ResultPlayerCards
GetCardsActivity
GetSameCardValuesActivity
- IN PlayerCards
- IN SelectedCard
- OUT SameValueCards
GetTheWinnerActivity
- IN Players
- OUT Result (string)
RemoveCardsActivity
- IN PlayerCards
- IN CardsForDelete
- OUT ResultPlayerCards
SelectRandomCardActivity
- IN PlayerCards
- OUT Result (Card)
SharedCardsToPlayerActivity
- IN Cards
- IN Players
- OUT CardsResult
- OUT PlayersResult
Und hier sind die Implementierungen der Activities:
AddCardsToPlayerActivity
1: using System.Activities;
2: using System.Collections.Generic;
3: using GoFish.Common.Entities;
4:
5: namespace GoFish.Domain.Activities
6: {
7: public class AddCardsToPlayerActivity : CodeActivity
8: {
9: [RequiredArgument]
10: public InArgument<List<Card>> PlayerCards { get; set; }
11:
12: [RequiredArgument]
13: public InArgument<List<Card>> CardsToAdd { get; set; }
14:
15: [RequiredArgument]
16: public OutArgument<List<Card>> ResultPlayerCards { get; set; }
17:
18: protected override void Execute(CodeActivityContext context)
19: {
20: List<Card> playerCards = PlayerCards.Get(context);
21: List<Card> cardsToAdd = CardsToAdd.Get(context);
22:
23: cardsToAdd.ForEach(playerCards.Add);
24:
25: ResultPlayerCards.Set(context, playerCards);
26: }
27: }
28: }
FindQuartetsActivity
1: using System.Activities;
2: using System.Collections.Generic;
3: using GoFish.Common.Entities;
4: using GoFish.Common.Extensions;
5:
6: namespace GoFish.Domain.Activities
7: {
8: public class FindQuartetsActivity : CodeActivity
9: {
10: [RequiredArgument]
11: public InArgument<List<Card>> PlayerCards { get; set; }
12:
13: [RequiredArgument]
14: public OutArgument<List<Card>> ResultQuartets { get; set; }
15:
16: protected override void Execute(CodeActivityContext context)
17: {
18: List<Card> playerCards = PlayerCards.Get(context);
19: List<Card> results = playerCards.FindQuartets();
20:
21: ResultQuartets.Set(context, results);
22: }
23: }
24: }
GetCardFromStackActivity
1: using System;
2: using System.Activities;
3: using System.Collections.Generic;
4: using GoFish.Common.Entities;
5:
6: namespace GoFish.Domain.Activities
7: {
8: public class GetCardFromStackActivity : CodeActivity
9: {
10: [RequiredArgument]
11: public InArgument<List<Card>> CardDeck { get; set; }
12:
13: [RequiredArgument]
14: public InArgument<List<Card>> PlayerCards { get; set; }
15:
16: [RequiredArgument]
17: public OutArgument<List<Card>> ResultCardDeck { get; set; }
18:
19: [RequiredArgument]
20: public OutArgument<List<Card>> ResultPlayerCards { get; set; }
21:
22: protected override void Execute(CodeActivityContext context)
23: {
24: List<Card> cardDeck = CardDeck.Get(context);
25: List<Card> playerCards = PlayerCards.Get(context);
26:
27: Random random = new Random();
28: int deckIndex = cardDeck.Count - 1;
29: Card pulledCard = cardDeck[random.Next(0, deckIndex)];
30:
31: playerCards.Add(pulledCard);
32: cardDeck.Remove(pulledCard);
33:
34: ResultCardDeck.Set(context, cardDeck);
35: ResultPlayerCards.Set(context, playerCards);
36: }
37: }
38: }
GetCardsActivity
1: using System.Activities;
2: using System.Collections.Generic;
3: using GoFish.Common.Entities;
4:
5: namespace GoFish.Domain.Activities
6: {
7: public class GetCardsActivity : CodeActivity<List<Card>>
8: {
9: protected override List<Card> Execute(CodeActivityContext context)
10: {
11: CardsGenerator cardsGenerator = new CardsGenerator();
12: return cardsGenerator.GetCards();
13: }
14: }
15: }
GetSameCardValuesActivity
1: using System.Activities;
2: using System.Linq;
3: using System.Collections.Generic;
4: using GoFish.Common.Entities;
5: using GoFish.Common.Extensions;
6:
7: namespace GoFish.Domain.Activities
8: {
9: public class GetSameCardValuesActivity : CodeActivity
10: {
11: [RequiredArgument]
12: public InArgument<List<Card>> PlayerCards { get; set; }
13:
14: [RequiredArgument]
15: public InArgument<Card> SelectedCard { get; set; }
16:
17: [RequiredArgument]
18: public OutArgument<List<Card>> SameValueCards { get; set; }
19:
20: protected override void Execute(CodeActivityContext context)
21: {
22: List<Card> playerCards = PlayerCards.Get(context);
23: Card selectedCard = SelectedCard.Get(context);
24:
25: List<Card> sameValueCards = playerCards.GetSameValueCards(selectedCard.Value);
26:
27: SameValueCards.Set(context, sameValueCards);
28: }
29: }
30: }
GetTheWinnerActivity
1: using System.Activities;
2: using System.Collections.Generic;
3: using GoFish.Common.Entities;
4: using GoFish.Common.Extensions;
5:
6: namespace GoFish.Domain.Activities
7: {
8: public class GetTheWinnerActivity : CodeActivity<string>
9: {
10: public InArgument<List<Player>> Players { get; set; }
11:
12: protected override string Execute(CodeActivityContext context)
13: {
14: List<Player> players = Players.Get(context);
15:
16: return players.GetTheWinner();
17: }
18: }
19: }
RemoveCardsActivity
1: using System.Activities;
2: using System.Collections.Generic;
3: using GoFish.Common.Entities;
4:
5: namespace GoFish.Domain.Activities
6: {
7: public class RemoveCardsActivity : CodeActivity
8: {
9: public InArgument<List<Card>> PlayerCards { get; set; }
10: public InArgument<List<Card>> CardsForDelete { get; set; }
11: public OutArgument<List<Card>> ResultPlayerCards { get; set; }
12:
13: protected override void Execute(CodeActivityContext context)
14: {
15: List<Card> playerCards = PlayerCards.Get(context);
16: List<Card> cardsForDelete = CardsForDelete.Get(context);
17:
18: cardsForDelete.ForEach(card => playerCards.Remove(card));
19:
20: ResultPlayerCards.Set(context, playerCards);
21: }
22: }
23: }
SelectRandomCardActivity
1: using System;
2: using System.Activities;
3: using System.Collections.Generic;
4: using GoFish.Common.Entities;
5:
6: namespace GoFish.Domain.Activities
7: {
8: public class SelectRandomCardActivity : CodeActivity<Card>
9: {
10: public InArgument<List<Card>> PlayerCards { get; set; }
11:
12: protected override Card Execute(CodeActivityContext context)
13: {
14: List<Card> playerCards = PlayerCards.Get(context);
15: Random random = new Random();
16:
17: int playerIndex = 0;
18:
19: if(playerCards.Count > 0)
20: playerIndex = playerCards.Count - 1;
21:
22: int randomIndex;
23:
24: if (playerCards.Count != 0)
25: randomIndex = random.Next(0, playerIndex);
26: else
27: return new Card();
28:
29: return playerCards[randomIndex];
30: }
31: }
32: }
SharedCardsToPlayerActivity
1: using System.Activities;
2: using System.Collections.Generic;
3: using GoFish.Common.Extensions;
4: using GoFish.Common.Entities;
5:
6: namespace GoFish.Domain.Activities
7: {
8: public class SharedCardsToPlayerActivity : CodeActivity
9: {
10: [RequiredArgument]
11: public InArgument<List<Card>> Cards { get; set; }
12:
13: [RequiredArgument]
14: public InArgument<List<Player>> Players { get; set; }
15:
16: [RequiredArgument]
17: public OutArgument<List<Card>> CardsResult { get; set; }
18:
19: [RequiredArgument]
20: public OutArgument<List<Player>> PlayersResult { get; set; }
21:
22: protected override void Execute(CodeActivityContext context)
23: {
24: List<Card> cards = Cards.Get(context);
25: List<Player> players = Players.Get(context);
26:
27: players.ForEach(player => player.Cards = cards.GetFiveRandomCards());
28:
29: CardsResult.Set(context, cards);
30: PlayersResult.Set(context, players);
31: }
32: }
33: }
Zusammenfassung und Vorschau auf den nächsten Teil
Jetzt sind die wichtigsten Funktionen/Aktivitäten als eigenständige Workflow Activities gekapselt. Diese könnten nun nachträglich mit Unit-Tests abgesichert werden. Jedoch reicht mir für diese Architektur-Serie der TDD-Part (siehe letzte Folge).
Beim nächsten Teil werden wir die Development-Phase fortsetzen und alle Bausteine (Activities) zu Workflows zusammenführen. Sodass, das Aktivitätsdiagramm aus der Design-Phase implementiert wird.
Viel Spaß und bis zur nächsten Folge, wenn Ihr mögt!
Windows Azure Blob Storage erlaubt die sichere, hoch-verfügbare Speicherung großer Binärdaten (BLOB = binary large objects) in Windows Azure. Inhalte werden automatisch 3-fach gespeichert. Darüber hinaus ist Geo-Replikation optional verfügbar. Ich erkläre in diesem Video, wie Blob Storage funktioniert, was es mit Block Blobs und Page Blobs auf sich hat und welche Einsatzszenarien für Blob Storage bestehen.
Hier das Video: Was ist Windows Azure Blob Storage? [10:46]
Weitere Informationen
Auf http://www.c-plusplus.de ist von mir jetzt ein Artikel zu der ADC C++ Konferenz in Ohlstadt erschienen, die am 03.04. Mai 2012 stattfand.
Über die Abendveranstaltung habe ich in meinem letzten Blogartikel auszugsweise berichtet.
Advanced Developers Conference C++ – native C++ im Blickpunkt (Tag 1)
Advanced Developers Conference C++ – native C++ im Blickpunkt (Tag 2)
Viel Spaß beim Lesen!
Copyright © 2010 Martin Richter
Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.
(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)
A few months ago I started to completely rethink my website. During this time, I also took the time to think about the comment functionality which is included in my current blog software WordPress. One of the outcomes of my thoughts on my websites was to change my blogging. Completely. Both from mental as well as from a technical perspective.
From ‘mental’ (or practical) perpective, I’ll change my blog gradually from a non-directed, spontaneuous blabbing, ranting and random thought disposal instrument towards a more topic-oriented and directed writing. I won’t start to write technical or theoretical articles or books. I want to keep my blogging small since I like the concept of small, chewable chunks of information for a specific topic.
Second, from technical perspective, I’m going to completely change the platform and infrastructure of my website (again). I’ll move off from WordPress and use a static website generator instead. I don’t have much interactive content or even applications. Hence, static webpages serve my purposes quite well. However, there’s one little dynamic thing I have until now. You guessed it already, it’s my blog comment functionality.

Nach einem sehr erfolgreichen ersten C++Day dieses Jahr und einer sehr gut besuchten ADC C++ möchten wir weiter kontinuierlich Themen für C++ Entwickler anbieten. Daher laden wir zu einem weiteren kostenfreien C++ Day 2012 mit dem folgenden Schwerpunkten ein:
“Windows 8 für C++ Entwickler”, um die neuen sehr guten Möglichkeiten für C++ Entwickler mit Windows 8 zu beleuchten.
“ALM für C++ Entwickler”, für alle C++ Entwickler, die Ihre Entwicklungs Infrastruktur optimieren möchten.
Wann? und Wo?
14.6 Berlin Anmeldung
18.6 Unterschleißheim Anmeldung
25.6 Köln Anmeldung
26.6 Bad Homburg Anmeldung
3.7 Blaustein Anmeldung
Agenda:
14:00 – 15:15 Windows 8 Metro Style Apps mit C++
15:15 – 15:30 Pause
15:30 – 16:45 WinRT für C++ Entwickler
16:45 – 17:15 Pause
17:15 – 18:30 ALM in C++ Projekten
18:30 – 19:00 Q/A
Vortäge:
Windows 8 Metro Style Apps mit C++ und XAML
Unter Windows 8 erhält nun auch der C++ Programmierer die Möglichkeit optisch modernste Benutzerschnittstellen mit XAML zu „deklarieren“ und auf die Windows Runtime (WinRT) zurückzugreifen. Somit steht für Windows 8 Metro Style Apps erstmals ein neues UI Framework zur Verfügung. Dieser Vortrag vermittelt Ihnen die wesentlichen Grundlagen zu Windows 8 Metro Style Apps mit dem dazugehörigen Interaktionsmodell und zeigt, wie Sie mit Visual C++ und XAML eigene Metro Apps erstellen können. Das Konzept des App Stores rundet den Vortrag ab.
WinRT für C++ Entwickler
Die Windows Runtime (WinRT) ist die neue Library für Metro Style Apps. Mit native C++ lassen sich Komponenten und Treiber für WinRT und damit für Metro Style Apps erstellen. Hierfür hat Microsoft die C++ Syntax wie bereits für C++ /CLI erweitert, es steht nun C++ /CX zur Verfügung. Erfahren Sie in diesem Vortrag, wie Sie mit Visual C++ WinRT Komponenten erstellen und in Metro Apps verwenden können. Ein besonderer Fokus wird dabei auch auf die C++ /CX Spracherweiterungen gesetzt. Eine Abgrenzung von C++ /CX zu C++ /CLI und C# rundet diesen Vortrag ab.
ALM in C++ Projekten
Im C++ Umfeld werden bislang häufig bis auf Version Control nur vereinzelt weitere Bausteine des ALM verwendet, obwohl es hierfür aus technischer Sicht keine Gründe gibt. Dieser Vortrag richtet sich daher an alle Entwickler, die bislang auf die Vorzüge der Integration der unterschiedlichen ALM Aspekte in Team Foundation Server verzichtet haben. Anhand eines überschaubaren Beispiels wird die Arbeit mit Visual Studio 11 und Team Foundation Server 11 von der Definition eines Requirements, über die Implementierung und die Integration von automatisierten Tests in den zentralen Build Prozess bis hin zum Management von Bugs veranschaulicht. Abschließend gibt der Vortag einen kompakten Ausblick auf die für C++ Entwickler relevanten Neuerungen mit TFS 11.
Der Referent


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
Der TFs bietet ein relationales Warehouse und einen OLAP-Cube um auf Daten zuzugreifen,
z.B. für Reports. Leider gibt es keine Möglichkeit, PlainText-Felder im Warehouse
abzulegen. Es gibt aberhin und wieder die Situation, dass man diese Felder ausgeben
möchte. Dazu gibt es verschiedene Möglichkeiten. Die sauberste ist, wenn man die Felder
über die TFS API ausliest. Einen etwa schnelleren Weg zeige ich hier auf, auch wenn
der nicht ganz sauber ist. Dieser Weg geht direkt auf die operational Datenbank des
TFS und stellt damit ein von Microsoft nicht supportetes Szenario dar. D.h. Microsoft
kann die Datenbankstruktur jederzeit ohne Vorankündigung ändern was dazu führen kann,
dass der Ansatz so nicht mehr funktioniert.
Mit folgender Abfrage auf die Datenbank der entsprechenden Team Project Collection
kann man beispielsweise das Description-Feld für alle Work Items abfragen. Die Abfrage
ist für den TFS 2010 konzipiert.
SELECT dbo.WorkItemsLatest.ID ,dbo.WorkItemsLatest.Rev
,dbo.WorkItemsLatest.[Work Item Type] ,dbo.WorkItemsLatest.Title
,dbo.WorkItemsLatest.State ,LongTexts.Words FROM dbo.WorkItemsLatest LEFT JOIN (SELECT lt.ID
,lt.Rev ,lt.Words FROM (SELECT t1.* FROM dbo.WorkItemLongTexts
t1 LEFT OUTER JOIN dbo.WorkItemLongTexts
t2 ON t1.ID = t2.ID AND t1.Rev
< t2.Rev WHERE t2.id is NULL)
lt INNER JOIN dbo.Fields ON lt.FldID
= Fields.FldID AND Fields.ReferenceName = 'System.Description')
LongTexts ON dbo.WorkItemsLatest.ID = LongTexts.ID
Die Windows Azure Produktgruppe hat heute ein für alle Windows Azure Nutzer (und solche, die es werden wollen) äußerst wichtiges Online-Event angekündigt:
MEET Windows Azure
am 7. Juni 2012 ab 19:00 Uhr (MESZ)
Live per Streaming aus San Francisco übertragen geben Scott Guthrie und weitere Verantwortliche für Windows Azure einen Überblick über die neuesten Entwicklungen von und und für Windows Azure.
Persönlicher Tipp von mir: unbedingt reinschauen. Das wird großartig!!!
Weitere Informationen
Zwei Tage DDC liegen hinter mir. Übermüdet und voller neuer Eindrücke sitze ich nun in einem Regionalexpress nach Dresden der hoffentlich auch irgendwann einmal ankommt, vielen Dank Deutsche Bahn für die bescheidene Anbindung.
Gefühlte 95% der Zeit war ich dabei als üblicher Teilnehmer unterwegs. Die einzigen Unterscheidungsmerkmale gegenüber der Allgemeinheit waren das rote Bändchen am Namensschild und der große Aufdruck „Speaker“ auf meinem Poloshirt. Die Insignien der Konferenzelite wenn man so will, welche schnellere Kontaktaufnahme und einige detailliertere Einblicke in die Organisation garantierten.
Die Sicht des Teilnehmers
Bevor ich auf letzteres eingehe sei aber zunächst erst einmal die Infrastruktur gelobt. Die Internetverbindung war schnell und funktionierte fast immer tadellos, nur manchmal bedurfte es einiger Anläufe um zum gewünschten Ziel zu kommen. Das Essen fand ich reichlich und weitestgehend gutschmeckend. Vor allem die Cateringidee bei der OpenNight mit Burgern und Hotdogs zum selber basteln hatte einen hohen Kreativitätsfaktor.
Nur als ich mir am ersten Tag irgendein Wirsing-Matsch-Patsch auf den Teller hievte hätte ich mir zum einen gern einen Schildchen mit kurzer Beschreibung gewünscht und vor allem eine etwas breitere Aufstellung der Tische mit dem Essen. Diese standen in den Stoßzeiten leider zu nahe bei einander, wodurch sich die Schlangen daran gegenseitig im Weg standen, was wiederum die Inbesitznahme der Leckereien beim Mittagessen zu einem kleinen Spießrutenlauf werden ließ an dessen Ende man sich mit irgendwas auf dem Teller zufrieden gab, Hauptsache raus hier.
Von den Vorträgen her bin ich nach wie vor zu großen Teilen begeistert aber leider auch etwas zwiegespallten. So war die Themenauswahl wirklich gut und gliederte sich in acht Kategorien zu je vier Tracks pro Tag, mit denen vom Requirements-Engieneering über die Architektur, automatisierten Tests und Deployment alles abgedeckt wurde, einschließlich Tipps und Tricks fürs Alltagsgeschäft.
Auf der anderen Seite muss ich jedoch auch Kritik üben. So hielt leider nicht jeder Vortrag das was die Ankündigung versprach. Dies lag zum einen an der fehlenden Schwierigkeitsstufe, die schon frühzeitig vor allzu seichten Themen gewarnt hätte, und zum anderen ein paar zu große Versprechungen seitens der Vortragenden.
Positiv hervor zu heben seien jedoch vor allem die Vorträge von Chris Rupp („Spezifizierst du noch oder implementierst du schon?“) die auf beeindruckende Weise die Komplexität der Kommunikation analysierte, Golo Rodens „JavaScript Best Practices“ der mit einfachsten Mitteln die schlimmsten Stolpersteine von JavaScript beschrieb und mir als zuvor Unwissenden dabei genug Futter gab um im Grunde die, leider erst darauf folgende, Einführung in JavaScript im Internet surfend zu verbringen. Weiterhin war die Keynote von Jeff Potter sehr unterhaltsam, auch wenn manche Pointe durch das Raster fiel, weil der Tag doch etwas sehr anstrengend war und somit wenig Platz zum Übersetzen im vollgestopfte Kurzzeitspeicher blieb.
Leider nicht mitnehmen konnte ich „Guck mal – Codereviews in der Praxis“ von Laurin Still und „Gestern Entwickler, heute ScrumMaster“ von Dr. Jürgen Hoffman und Heiko Stapf die mir nachträglich als sehr gut bescheinigt wurden, aber etwas ungünstig zu meiner eigenen Session lagen.
Die Sicht des Sprechers
Damit sind wir auch schon beim eigentlichen Auslöser für meine Teilnahme. In meinem Vortrag „MS Test – Der missverstandene Stiefbruder!?!“ widmete ich mich einer Gegenüberstellung von NUnit und MS Test sowie den unterschiedlichen Teststufen in der Qualitätssicherung und deren Automatisierungsgrad. Ob ich den Nerv meiner Zuhörer dabei traf kann ich leider nicht ganz einschätzen und würde mich hier über Feedback freuen.
Sehr ermutigend war jedoch die große Anzahl der Beteiligten die ich grob auf etwas zwischen 60 und 80 von insgesamt ca. 500 Personen schätzen würde. Dies ist für mich insofern erfreulich, da mein Thema nach eigener Einschätzung ein vergleichsweise umfangreiches Wissen voraussetzte und nicht wenig komplex war, ich anderer seits im Hauptteil aber nie das Gefühl bekam die Zuhörerschaft zu überfordern oder in den Weiten der Langeweile verloren zu haben. Dies zeigte sich zum Beispiel durch beständig in die Höhe gehende Hände auf Fragen meinerseits und interessiertes Nicken oder amüsiertes Kopfschütteln ihrerseits.
Hauptteil, ist hier ein wichtiger Punkt, denn leider habe ich mich im Vorfeld zeitlich ein wenig verschätzt. So habe ich in der Vorbereitung alles in allem für den Vergleich der Frameworks samt Zusammenfassung fast immer etwas über 50 Minuten benötigt. Plus einen Puffer für Fragen und Anekdoten also ein solider Zeitrahmen, der mich dazu bewog den Vergleich der Isolation Frameworks als Backup zu verwenden. Leider war ich jedoch schon nach 40 Minuten fertig und bekam bis auf eine Frage, bei der ich nicht helfen konnte, kein weiteres Futter. Die nun doch gezeigten Backupfolien wirkten daraufhin für mich irgendwie wie angeflanscht, was dem Verständnis sicher nicht dienlich war.
Was lernen wir daraus? Never change a running system! Vor allem nicht einen Tag vor der Konferenz! Dabei war genau diese Devise eigentlich der Grund warum ich bis auf zwei Folien nicht das Layout der Konferenz übernahm. Mit den, für meinen Geschmack, etwas zu großzügigen Rändern samt Begleitinfos hätte ich mir meiner Meinung nach andernfalls den Vortrag gekillt bzw. einen unverhältnismäßig hohen Umbauaufwand gehabt.
Obwohl ich also nicht ohne Fehler bin muss ich auch aus Sicht eines Sprechers Kritik an meinen Kollegen äußern. Ich habe viele erfrischende Ideen und kreative Vorträge gesehen. Es wird auch niemand gezwungen voll gestopfte Powerpoint Monstren mit Myriaden Folien zu produzieren, aber bitte Jungs die Leute zahlen teils nicht gerade wenig Geld für die Veranstaltung also solltet ihr den Inhalt einer Session auch nicht dem Funfactor unterordnen.
Zusammenfassung
Alles in allem bin ich aber sehr zufrieden. Das Hotel war klasse und super gelegen, die Menschen waren nett und gesprächig, der Wissensgewinn war beträchtlich und dank meines Sprecherdaseins war das alles auch fast gänzlich kostenlos. Danke an der Stelle noch mal an meinen Arbeitgeber Saxonia Systems die alle Kosten übernahmen die der Veranstalter nicht trug.
Durch Zufall bin ich auf das Tool “Chocolatey” gestoßen. Wer die Website sich anschaut, wird evtl. eine Verwandschaft mit NuGet ausmachen.

Was macht Chocolatey?
Chocolatey ist ein “Maschine Package Manager”, das bedeutet, dass man für seine Maschine einfach Tools runterladen und Updaten kann – direkt über die Konsole.
Was ist der Unterschied zu NuGet?
NuGet ist für Development Libraries, wohingegen Chocolatey eher auf das Tooling eingeht.
Demonstration gefällig?
Das Chocolatey Team hat ein Video bereitgestellt, welches die Funktionsweise zeigt:
Wie installier ich Chocolatey:
Einfach CMD starten und dies befolgen:

@powershell -NoProfile -ExecutionPolicy unrestricted -Command “iex ((new-object net.webclient).DownloadString(‘http://bit.ly/psChocInstall’))”
Ausprobieren…
Ich musste zwar erst noch die Konsole schließen und die Powershell Konsole aufmachen, konnte dann aber erfolgreich “cinst Console2” ausführen:

Tadaa…
Open Source, für Windows und basiert auf NuGet
Es ist zudem Open Source, basiert auf NuGet (wie unschwer zu sehen war) und die Idee ist uralt und doch irgendwie hat es noch keiner auf Windows toll gelöst. Schaut euch Chocolatey mal an – für die Entwicklertoolbox
.
Weitere Hintergründe erfährt man auch auf im Wiki auf GitHub!
Wer das Tool schon länger kennt kann auch gerne Informationen auf KnowYourStack hinterlegen
PS: Bei dem Namen kommen Erinnerung zu Azure hoch – Wie spricht man das aus?
Genau wie im
letzten Jahr fand die .NET Developer Conference in der Meistersingerhalle in Nürnberg
statt. Die Konferenz wird von der Neuen Mediengesellschaft Ulm veranstaltet, die auch
Herausgeber der Entwicklerzeitschrift dotnetpro ist. Im letzten Jahr konnte die Veranstaltung
die Meistersingerhalle noch nicht ganz ausfüllen, in diesem Jahr waren deutlich mehr
Besucher da.
Die Vortragsräume waren oft bis auf den letzten Platz gefüllt und das Catering hatte
das ein oder andere Mal Probleme, dem Ansturm hungriger Entwickler standzuhalten.
 |
Diese Tasse bekam jeder Besucher bei der Begrüßung.
C64 – Basic. Das nächste “große Ding” nach JavaScript? |
Erfreulicherweise gab es in diesem Jahr einige Verbesserungen. Zum Beispiel stand
in jedem Raum ein W-Lan Repeater, die einen stabilen Internetzugang ermöglichten,
so dass die Social-Media Angebote des Veranstalters genutzt werden konnten. Im Gegensatz
zur Basta! Spring, die ich Ende Februar besuchte, wurde bei dieser Konferenz kräftig getwittert.
Die Konferenz deckte ein breites Themenspektrum ab, die vier Tracks waren Sprachen,
Architektur, Datenzugriff und Soft Skills.
Die Pausen zwischen den Vorträgen waren ausreichend und man hatte genügend Gelegenheit
fürs Networking und für den Besuch der Sponsoren. Leider gab es nur 3 Aussteller,
die vor Ort waren.
 |
Hamburger, Hot Dogs zum selber bauen und reichlich fränkisches Bier gab es bei der
so genannten Open Night am Ende des ersten Tages.
|
Meine größte Kritik bei der DDC 2012 betrifft die Agenda. Es ist mir insgesamt drei
Mal passiert, dass ich in einem Vortrag saß, der für absolute Einsteiger ausgelegt
war. Zum Beispiel gab es einen Vortrag, in dem erklärt wurde, dass es in JavaScript
Schleifen und Variablen gibt. In diesem Vortrag habe ich zum Beispiel auch “gelernt”,
dass man JavaScript sogar in ASP.NET einsetzten kann.
Ich habe nichts gegen solche Low-Level Vorträge, ganz im Gegenteil, jedoch sollte
das Level in der Agenda angegeben werden, wenn sich das Niveau der Vorträge so stark
unterscheidet wie auf dieser Konferenz, denn es gab auch Vorträge die deutlich anspruchsvoller
waren. Mit dieser Meinung war ich nicht allein, wie ich in einigen Gesprächen mit
anderen Entwicklern erfahren habe.
Alles in allem war die .NET Developer Conference 2012 eine gelungene Konferenz zu
einem fairen Preis.
Die letzten beiden Blog-Einträge über Team Foundation Server mit ScrumTable befassten sich mit dem Backlog grooming. Die Vorzüge der Kombination zwischen ScrumTable und Team Foundation Server treten ebenfalls bei den Sprint Planning Meetings zum Vorschein. Dieser Artikel beschreibt, wie sich die Interaktion mit ScrumTable während der Sprint Planning Meetings gestaltet.
Sprint Planning wird üblicherweise in zwei Meetings aufgeteilt. Im ersten Teil wählt das Team die User Stories aus, welche im nächsten Sprint realisiert werden. Das Meeting definiert also „was“ realisiert werden soll.
Im zweiten Teil werden die einzelnen User Stories in Aufgaben unterteilt. Somit wird definiert, „wie“ das Team die User Stories des zu planenden Sprints realisiert.
Durch die oben beschriebene Unterteilung in Sprint Planning 1 und 2 kann ein Fokus gesetzt und effizienter geplant werden, da bei den Meetings jeweils andere Scrum Rollen vertreten sein sollten.
Im ersten Teil stellt der Product Owner die von ihm gewünschten User Stories (meistens die obersten im Product Backlog) vor. Skizzen und Anhänge (siehe Bild rechts) helfen beim Verstehen. Das Ziel dieses Meetings besteht darin, dass das Team die zu realisierenden User Stories versteht und deren Abnahmekriterien kennt.
Das Team prüft so bei jeder User Story, ob diese zeitlich im nächsten Sprint realisiert werden kann und ob Abhängigkeiten zu anderen User Stories bestehen. User Stories können vom Team zurückgestellt werden, falls deren Realisierung weitere User Stories nach sich zieht – somit würde die Sprint-Dauer nicht mehr ausreichen. Sobald genügend Arbeitslast fürs Team eingeplant wurde, wird der erste Teil des Meetings üblicherweise beendet.
Im zweiten Teil, bei welchem der Product Owner nicht mehr anwesend ist, werden die einzelnen User Stories technisch analysiert und eine grobe Architektur entworfen. Anschliessend wird die Story in Aufgaben unterteilt, welche von einzelnen Team-Mitgliedern implementiert werden können. Am Ende sollte eine Liste von Aufgaben vorhanden sein, welche von den einzelnen Team Mitgliedern ausgewählt und ausgeführt werden kann.
Das folgende Video beschreibt eine mögliche Interaktion mit ScrumTable während der Sprint Planning Meetings:

Agile Entwicklung mit ScrumTable für TFS 2010 – Teil 3 is a post from: AIT Blog
Im Rahmen der ersten C++ Days in diesem Jahr haben wir die Inhalte auch als Webcasts zur Verfügung gestellt.
Die Demos und Slides zum C++ Day gibt es hier. Viel Spass
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 VC++ 11 Beta
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.
Visual Studio ALM 11 bringt für "C++"-Teams einige Neuerungen. Dashboards unterstützen Teams vom Backlog über die Sprint-Planung bis zum täglichen Standup. Code Review Support und VS Context Switching macht Team Collaboration mit TFS 11 besser denn je. Neues natives "C++"-Unittesting und "Architecture Discovery" ist nun auch für native C++ verfügbar. Dieser Webcast greift einige der Änderungen für "C++"-Entwickler auf.

Am 2. Juli veranstalten wir einen Workshop zu den SQL Server Data Tools. Gerd Drapers Principal Group Program Manager SQL Server wird mit Kollegen diesen Tagesworkshop halten. Gerd ist im Kontext der TechEd in Europa und wir konnten Ihn für diesen Workshop exklusiv nach Deutschland holen. Also ein einmalige Chance sich mit den Entwicklern der SQL Server Data Tools auszutauschen. Leider haben wir nur eine begrenzte Anzahl an Plätzen zur Verfügung.
Zur Anmeldung und den Details geht’s hier.
Nach einer kurzen Verschnaufpause möchte ich heute meine Interview-Serie der Agilisten fortführen und gleich mit einem interessanten Thema einsteigen: Der Stand der heutigen agilen Software-Entwicklung aus der Perspektive des Scrum-Master. Der Scrum-Master ist eine besondere Rolle im Rahmenwerk Scrum. Wenn auch nicht die wichtigste, ist es dennoch eine intensive und spannende Rolle.
Im Interview: Bettina Ruggeri
Gerade wegen des intensiven Wirkungsspektrums der Rolle ist es mir eine Freude, mit Bettina Ruggeri eine erfahrene Scrum-Masterin für ein Interview gewinnen zu können. Bettina blickt nicht nur auf vielschichtige Erfahrungen als Scrum-Master zurück, sondern ist darüber hinaus eine engagierte Scrum-Masterin, die gerne den Austausch mit Kollegen sucht und das stetige Lernen befürwortet – ja sogar vorlebt. Es folgt ein komprimiertes Gesprächsprotokoll. Viel Spaß!
Hallo Bettina. Was machst Du beruflich?
Aktuell verbreite & lebe ich agile Werte und Methoden als Scrum Master und Kanban Coach. Dazu betreue ich die Ausbildung in unserem Unternehmen und werde vielfach als Moderator eingesetzt.
Darüber hinaus arbeite ich im beruflichen und privaten Umfeld als Konfliktmoderatorin/Mediatorin und begleite Menschen als systemischer Coach.
Welches sind Deine Ziele bei der agilen Software-Entwicklung?
Mein Ziel ist eine verbesserte Zusammenarbeit, um gemeinsam Ziele zu erreichen. Deshalb möchte ich eine Firmenkultur fördern, in der die Interessen aller Mitarbeiter gesehen werden, Freude an Weiterentwicklung und ein wertschätzendes Fehler- und Konfliktverhalten gelebt wird.
Und so konzentriere ich mich immer mehr auf die Menschen, die mir im Leben begegnen – sei es jeder Einzelne, Teams und auch das Management.
Aus meiner Sicht sind Akzeptanz und ein vertrauensvolles Umfeld der notwendige Raum, um Kreativität und Begeisterung für erfolgreiche Produkte zu entwickeln.
Scrum ist mittlerweile das bekannteste und beliebteste agile methodische Vorgehen. Warum?
Nun, es ist in erster Linie natürlich eine vielerorts erfolgreiches agiles Methodenwerk. Darüber hinaus erscheint es dem Neuling bzw. Interessierten auch als ein einfaches Methoenmodell, weil es nur wenige “Regeln” mit sich bringt.
Betrachtet man die Zuneigung zu Scrum etwas genauer, fällt einem schnell auf, das ein Großteil der Vorliebe dem agilen Wert der “Menschenorientierung” zu schulden ist. Scrum stellt den Menschen in den Vordergrund, wie jede andere agile Vorgehensweise auch. Das ist ein Schlüsselfaktor denke ich.
Ist Scrum wirklich so einfach, wie es immer gesagt und vermittelt wird?
Nein, Scrum ist nicht wirklich einfach. Ich denke, Scrum will das auch gar nicht sein. Der “Schein” des einfachen mit den wenigen Rollen, Regeln und Gremien ist zwar da, aber das war’s auch schon. Themen wie Selbstorganisation und Eigeninteresse an Weiterentwicklung sind äußerst schwierig. Sowohl für den Einzelnen, wie auch für die Gemeinschaft.
Ein kurzes Beispiel hilft vielleicht zur Veranschaulichung. In agilen Methoden – so auch in Scrum – gibt es vielschichtige Feedback- und Reflektionsmechanismen. Menschen werden daduch quasi gezwungen, eine Überprüfung der Lage und Ihres Handelns durchzuführen. Das ist schwerer als man denken mag, denn wir Menschen tun uns meist leichter zu sagen, was wir nicht wollen. Doch das zu sagen, was wir stattdessen wollen, ist ungleich schwieriger.
Wieso ist der Scrum-Master für ein Scrum-Team so wichtig? Alle im Team ‘können’ ja Scrum, oder nicht?
Nun, es liegt in der Natur des Menschen, das man in seinem Aufgabenfeld von Zeit zu Zeit in eine gewisse Routine kommt. Dinge, Methoden und Auffassungen schleifen sich ein und der Blick über den Tellerrand fällt dann dem einen oder anderen schwerer.
Ein “frischer Wind” von außen, eine Kraft, die manche steife Blicke wieder aufweitet tut in diesem Moment meines Erachtens gut. Als Scrum-Master erlebe ich mich als die Kraft, die hilft, die gemeinsame Komfort-Zone zu hinterfragen. Insofern kann man sagen, dass es auch eine meiner Aufgaben ist, “unbequem” zu sein. Das Ziel dabei ist die Weiterentwicklung der Arbeitsweisen.
Warum wird oft bei agilen Einführungen der Scrum-Master als neuer ‘Projekt-Manager’ gesehen?
Diese Wahrnehmung hat viele Gründe. Meistens hat es mit der Ab- und Übergabe von Vertrauen und Verantwortung zu tun. Ein klassisches Management ist es gewohnt, Verantwortung explizit an Personen zu übertragen. Es braucht eine Bezugsperson, der sie die Verantwortung buchstäblich ‘in die Hände’ legt.
Manchmal ist es auch etwas banaleres, wie z.B. die nackte Tatsache, dass die völlige Transparenz zwischen Team und Produktverantwortlichen nicht erwünscht ist. Das mag aus vielerlei Motivationsfaktoren entstehen. Entscheidend ist aber meiner Meinung nach, dass man solche Faktoren erkennt. Nur dadurch lässt sich auch ein überlegter Umgang mit der Situation ermöglichen.
Welches sind Deiner Meinung nach die Kern-Eigenschaften eines guten Scrum-Masters?
Die wichtigste Eigenschaft ist sicherlich die “Liebe zu den Menschen”. Als Scrum-Master arbeitet man viel mit und an den Menschen. Da ist es quasi fundamental, den Umgang mit vielerlei Charakteren und Meinungen zu mögen.
Darüber hinaus zeichnet sich ein Scrum-Master für mich durch das leben und vermitteln von Werten wie Akzeptanz, Wertschätzung und Vertrauen aus. Das sind elementare Werte, um den Raum für Kreativität zu schaffen und zu schützen.
In wie weit lässt sich Scrum-Master als Rolle mit disziplinarischer Führung vereinbaren?
Meiner Meinung nach ist das eine Frage der Integration in die Unternehmensorganisation. Natürlich wird auch in die Scrum-Master-Rolle viel Verantwortung “hineininterpretiert”. Das man auch ein ausschlaggebender Faktor sein, muss es aber nicht. Ich denke das mangelnde Vertrauen in das Team ist eher kontraproduktiv. Ich persönlich möchte als Scrum-Master lieber keine disziplinarische Verantwortung übernehmen. Ich denke es wäre für mich und meine Arbeit mit den Menschen eher ein Hindernis als ein Vorteil.
Welches sind die Nachteile der Scrum-Master-Rolle in der Praxis?
Ich glaube das ein Scrum-Master schon vor der Herausforderung steht, sich, seine Aufgaben und seine Rolle jederzeit klar nach außen zu kommunizieren und darzulegen. Der Scrum-Master wird im Alltag meist aus dem Hintergrund agieren und das Team in den Vordergrund stellen. Das ist mit eine der Hauptaufgaben. Schließlich ist die Förderung der Selbst-Organisation des Teams ein wichtiger Eckpfeiler in Scrum.
Daraus kann sich aber auch eine Wahrnehmung Dritter ergeben, die den Scrum-Master als passiv oder so ähnlich empfinden. Eine klare Kommunikation und das ständige Feedback der Mitarbeiter können diesen Wahrnehmungen entgegenwirken.
Was ist für Dich das wichtigste an einem agilen Team?
Die Freude an der Arbeit und an der gemeinsamen Leistung ist sicherlich ein sehr hohes Gut. Das ist natürlich auch eine individuelle Frage der Motivation. Gerade diese Individualität fordert von einem agilen Team eine gesunde Kompromiss- und Konfliktfähigkeit. Besonders die gemeinschaftliche Findung und Beschreitung eines Konsens ist für ein agiles Team von großem Wert.
In diesem Zusammenhang ist es auch wichtig zu erkennen, dass diese Werte nicht einfach “erlangt werden”, sondern von allen stetige Aufmerksamkeit abverlangen. Konsens- und Kompromissfähigkeit ist keine Eigenschaft, sondern ein Ziel, welches jedes Mal angegangen und erarbeitet werden will.
Was fehlt Deiner Meinung nach in der agilen Lebens- und Arbeitsweise?
Ich bin der Überzeugung, dass mangelndes Vertrauen eine große Hürde darstellt. Meine Erfahrung hat mir gezeigt, das gerade diese Öffnung des Einzelnen dem Anderen gegenüber ein großer und schwieriger Schritt ist. Gerade in unserer heutigen Zeit, in der die Professionalisierung mit Klarheit, Sachlichkeit und Nüchternheit assoziiert wird. Vertrauen passt zwar nicht in dieses Bild, aber das liegt nicht am Vertrauen, sondern eben an diesem verzerrten Bild der Professionalität.
Akzeptanz und Wertschätzung sind weitere wichtige Werte, die oftmals – ja sogar in agilen Projekten und Unternehmen – vernachlässigt werden. Hier können und müssen wir dran bleiben.
Wenn Du Dir für die agile Arbeitswelt etwas wünschen könntest, was würdest Du Dir wünschen?
Eine vertrauensvolle und optimistische Firmenkultur, die sich auf die Erreichung der gemeinsamen Ziele konzentriert. Es mag sich etwas abgehoben oder esoterisch anhören, aber es ist durchaus aller Ehren wert, wenn man sich vornimmt, einfach “Licht in die Welt zu tragen”. Manchmal geht uns Menschen der Blick für das große Ganze auch verloren, dann hilft es, sich wieder auf die grundlegenden Dinge zu stützen.
Oft wird z.B. vergessen, dass wir nicht arbeiten, um zu Leben, sondern das die Arbeit Teil unseres Lebens ist. Man kann und sollte nicht einfach 8 oder mehr Stunden seines täglichen Lebens einfach so ausblenden. Das Ziel sollte sein, dass wir als Menschen unsere Arbeit mit Freude erledigen und dass alle Interessen umgesetzt und gelebt werden können. Vertrauen, Akzeptanz, Wertschätzung sind die Kräfte, die uns dabei helfen können.
Vielen Dank, Bettina!
Weitere Interviews der Serie “Der Agilist”
Heute Vormittag habe ich den Anruf eines Kunden erhalten der mir folgendes Problem geschildert hat.
Nach der Aktualisierung eines DotNetNuke Portals von DNN 5.6.X auf DNN 6.1.1 werden Änderungen die man an Texten im HMTL Modul vornimmt nicht gespeichert.
Keine Fehlermeldung, kein Eintrag im Ereignisprotokoll, einfach nichts!
Nachdem ich mir die Konfiguration genauer angeschaut hatte, konnte ich einen Fehler in der Konfiguration des System (IIS und App Pool) ausschließen.
Das Problem war aber trotzdem relativ schnell gefunden.
Mit dem “früher” als Standardeditor eingesetzten FCK Editor gibt es mit der aktuellen Version (Ich glaube schon seit Version 5.6.X) von DotNetNuke an einigen Stellen Probleme, unter anderem eben auch im Text/HMTL Modul.
Irgendwelche JavaScripte des Editors kollidieren mit anderen JavaScript aufrufen in irgend einer der vielen verwendeten JavaScript Frameworks.
JavaScript eben 
Ich weiß schon warum sich meine Begeisterung für dieses (Java)Script Gedöns in Grenzen hält.
OK, aber lassen wir das.
Ob es einen aktualisierte Version des FCK Editors gibt, die mit DNN Version 6.1 und höher läuft, weiß ich nicht, sollte jemand näheres dazu wissen, würde ich mich über einen entsprechenden Kommentar freuen.
Um das Problem mit den Bordmitteln von DNN zu lösen kann man aber einfach den Texteditor umstellen und anstelle des FCK Editors den Telerik Texteditor, der aktuell als Standardeditor von DotNetNuke verwendet wird.
Hierzu öffnet man die web.config und nimmt folgende Änderung vor:
Den defaultProvider von “FckHtmlEditorProvider” (siehe Vorher) auf “TelerikEditorProvider” (siehe Nachher) ändern
Vorher:
<htmlEditor defaultProvider="FckHtmlEditorProvider">
<providers>
<clear />
<add name="TelerikEditorProvider" type="DotNetNuke.HtmlEditor.TelerikEditorProvider.EditorProvider, DotNetNuke.HtmlEditor.TelerikEditorProvider" providerPath="~/Providers/HtmlEditorProviders/Telerik/" toolsFile="~/Providers/HtmlEditorProviders/Telerik/Config/ToolsDefault.xml" configFile="~/Providers/HtmlEditorProviders/Telerik/Config/ConfigDefault.xml" FilterHostExtensions="True" />
<add name="FckHtmlEditorProvider" type="DotNetNuke.HtmlEditor.FckHtmlEditorProvider.FckHtmlEditorProvider, DotNetNuke.FckHtmlEditorProvider" providerPath="~/Providers/HtmlEditorProviders/Fck/" CustomConfigurationPath="~/Providers/HtmlEditorProviders/Fck/custom/FCKConfig.js" EnhancedSecurityDefault="false" SecureConfigurationPath="~/Providers/HtmlEditorProviders/Fck/custom/FCKConfigSecure.js" ImageGalleryPath="~/Providers/HtmlEditorProviders/Fck/fckimagegallery.aspx" ImageUploadPath="~/Providers/HtmlEditorProviders/Fck/fckimagegallery.aspx" ImageAllowedFileTypes="gif,png,bmp,jpg" FlashGalleryPath="~/Providers/HtmlEditorProviders/Fck/fckimagegallery.aspx" FlashUploadPath="~/Providers/HtmlEditorProviders/Fck/fckimagegallery.aspx" FlashAllowedFileTypes="fla,swf" LinksGalleryPath="~/Providers/HtmlEditorProviders/Fck/fcklinkgallery.aspx" DynamicStylesGeneratorPath="~/Providers/HtmlEditorProviders/Fck/FCKStyles.aspx" DynamicStylesCaseSensitive="true" DynamicStylesGeneratorFilter="controlpanel|filemanager|mainmenu|wizard" StaticStylesFile="~/Providers/HtmlEditorProviders/Fck/FCKeditor/fckstyles.xml" StylesDefaultMode="dynamic" DynamicCSSGeneratorPath="~/Providers/HtmlEditorProviders/Fck/FCKCSS.aspx" StaticCSSFile="~/Providers/HtmlEditorProviders/Fck/FCKeditor/editor/css/fck_editorarea.css" CSSDefaultMode="dynamic" spellCheck="ieSpell" AvailableToolbarSkins="Office2003,Silver" DefaultToolbarSkin="Office2003" AvailableToolBarSets="DNNDefault,Default,NoGallery,Basic" DefaultToolbarSet="DNNDefault" DefaultImageGallerySkin="Default" DefaultFlashGallerySkin="Default" DefaultLinksGallerySkin="Default" FCKDebugMode="false" UseFCKSource="false" OptionsOpenMode="ShowModalDialog" ShowModuleType="true" FixOldDNNPostback="false" CustomOptionsDialog="Admin" />
</providers>
</htmlEditor>
Nachher:
<htmlEditor defaultProvider="TelerikEditorProvider">
<providers>
<clear />
<add name="TelerikEditorProvider" type="DotNetNuke.HtmlEditor.TelerikEditorProvider.EditorProvider, DotNetNuke.HtmlEditor.TelerikEditorProvider" providerPath="~/Providers/HtmlEditorProviders/Telerik/" toolsFile="~/Providers/HtmlEditorProviders/Telerik/Config/ToolsDefault.xml" configFile="~/Providers/HtmlEditorProviders/Telerik/Config/ConfigDefault.xml" FilterHostExtensions="True" />
<add name="FckHtmlEditorProvider" type="DotNetNuke.HtmlEditor.FckHtmlEditorProvider.FckHtmlEditorProvider, DotNetNuke.FckHtmlEditorProvider" providerPath="~/Providers/HtmlEditorProviders/Fck/" CustomConfigurationPath="~/Providers/HtmlEditorProviders/Fck/custom/FCKConfig.js" EnhancedSecurityDefault="false" SecureConfigurationPath="~/Providers/HtmlEditorProviders/Fck/custom/FCKConfigSecure.js" ImageGalleryPath="~/Providers/HtmlEditorProviders/Fck/fckimagegallery.aspx" ImageUploadPath="~/Providers/HtmlEditorProviders/Fck/fckimagegallery.aspx" ImageAllowedFileTypes="gif,png,bmp,jpg" FlashGalleryPath="~/Providers/HtmlEditorProviders/Fck/fckimagegallery.aspx" FlashUploadPath="~/Providers/HtmlEditorProviders/Fck/fckimagegallery.aspx" FlashAllowedFileTypes="fla,swf" LinksGalleryPath="~/Providers/HtmlEditorProviders/Fck/fcklinkgallery.aspx" DynamicStylesGeneratorPath="~/Providers/HtmlEditorProviders/Fck/FCKStyles.aspx" DynamicStylesCaseSensitive="true" DynamicStylesGeneratorFilter="controlpanel|filemanager|mainmenu|wizard" StaticStylesFile="~/Providers/HtmlEditorProviders/Fck/FCKeditor/fckstyles.xml" StylesDefaultMode="dynamic" DynamicCSSGeneratorPath="~/Providers/HtmlEditorProviders/Fck/FCKCSS.aspx" StaticCSSFile="~/Providers/HtmlEditorProviders/Fck/FCKeditor/editor/css/fck_editorarea.css" CSSDefaultMode="dynamic" spellCheck="ieSpell" AvailableToolbarSkins="Office2003,Silver" DefaultToolbarSkin="Office2003" AvailableToolBarSets="DNNDefault,Default,NoGallery,Basic" DefaultToolbarSet="DNNDefault" DefaultImageGallerySkin="Default" DefaultFlashGallerySkin="Default" DefaultLinksGallerySkin="Default" FCKDebugMode="false" UseFCKSource="false" OptionsOpenMode="ShowModalDialog" ShowModuleType="true" FixOldDNNPostback="false" CustomOptionsDialog="Admin" />
</providers>
</htmlEditor>

In einem meiner letzten Projekte sollte ein Startup Skript, sowie die Run Methode der RoleEntryPoint Klasse, auf die Webseiten einer Windows Azure Web Rolle zugreifen. Die Herausforderung hierbei bestand in den sich wechselnden Pfaden zu den Webseiten der Rolle. Diese können sich in verschiedenen Situationen, wie z.B. beim Upgrade der bestehenden Cloud Anwendung, ändern.
Genauer gesagt, ändert sich hierbei "nur" der Laufwerksbuchstabe.
Dennoch suchte ich nach einem Weg, der mir alle Webseitenpfade in Form einer Collection wiedergeben kann.
Die Lösung lag in der RoleModel.xml Datei der Web Rolle...
Die RoleModel.xml
Um an eine Auflistung aller Webseiten (inkl. relativer Pfadangabe) zu gelangen, kann die RoleModel.xml Datei verwenden werden.
Diese befindet sich im Stammverzeichnis der Web Rolle, welches über die Umgebungsvariable "RdRoleRoot" abgefragt werden kann.
Bespiel einer RoleModel.xml Datei:
<?xml version="1.0" encoding="utf-8"?>
<RoleModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
name="DemoApp.WebRole" version="1.6.21103.1459"
xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
<Runtime>
<EntryPoint>
<NetFxEntryPoint assemblyName="DemoApp.WebRole.dll" />
</EntryPoint>
</Runtime>
<Properties>
<Property name="RoleType" value="Web" />
<Property name="RoleName" value="DemoApp.WebRole" />
<Property name="ProjectName" value="DemoApp.WebRole" />
<Property name="Configuration" value="Release" />
<Property name="Platform" value="AnyCPU" />
<Property name="OutputDir"
value="C:\TFS\DemoApp\DemoApp\obj\Release\DemoApp.WebRole\" />
<Property name="EntryPoint" value="CloudBloggers.WebRole.dll" />
<Property name="SourceDir" value="C:\TFS\DemoApp\DemoApp.WebRole\" />
<Property name="RoleTargetFramework" value="v3.5" />
<Property name="SitePhysicalPath"
value="C:\TFS\DemoApp\DemoApp\obj\Release\DemoApp.WebRole\" />
<Property name="OriginalItemSpec"
value="C:\TFS\DemoApp\DemoApp\DemoApp.ccproj" />
<Property name="MSBuildSourceProjectFile"
value="C:\TFS\DemoApp\DemoApp\DemoApp.ccproj" />
<Property name="MSBuildSourceTargetName"
value="ResolveSingleWebRoleReference" />
<Property name="TargetFrameworkVersion" value="v3.5" />
<Property name="TargetRuntimeVersion" value="v2.0" />
</Properties>
<Sites>
<Site name="Web1" physicalDirectory="sitesroot\0">
<Bindings>
<Binding name="Endpoint1" endpointName="Endpoint1" />
</Bindings>
</Site>
<Site name="Web2" physicalDirectory="sitesroot\1">
<Bindings>
<Binding name="Endpoint1" endpointName="Endpoint1" />
</Bindings>
</Site>
</Sites>
</RoleModel>
Das Windows Azure Startup Task
Für das Windows Azure Startup Task, habe ich ein PowerShell Skript verwendet, da ich hierbei, ohne größeren Aufwand, Zugriff auf die Umgebungsvariable, sowie die Daten der XML Datei, erhalte:
$roleRoot = $Env:RdRoleRoot
$roleModelFile = Join-Path $roleRoot "RoleModel.xml"
$roleModel = [xml](Get-Content $roleModelFile)
foreach ($site in $roleModel.RoleModel.Sites.Site)
{
Write-Output $site.name
Write-Output $site.physicalDirectory
}
Die RoleEntryPoint Klasse
Für die Verwendung innerhalb der RoleEntryPoint Klasse, wurde eine statische Eigenschaft erstellt, die auch hier den Zugriff auf die XML Datei gewährt:
private static IEnumerable<string> WebSiteDirectories
{
get
{
var roleRootDir = Environment.GetEnvironmentVariable("RdRoleRoot");
if (roleRootDir == null)
return Enumerable.Empty();
XNamespace roleModelNs =
"http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition";
var roleModelDoc = XDocument.Load(Path.Combine(roleRootDir, "RoleModel.xml"));
if (roleModelDoc.Root == null)
return Enumerable.Empty();
var sites = roleModelDoc.Root.Element(roleModelNs + "Sites");
if (sites == null)
return Enumerable.Empty();
var siteElements = sites.Elements(roleModelNs + "Site");
return
from siteElement in siteElements
where siteElement.Attribute("name") != null
&& siteElement.Attribute("name").Value == "Web"
&& siteElement.Attribute("physicalDirectory") != null
select Path.Combine(roleRootDir,
siteElement.Attribute("physicalDirectory").Value);
}
}
 |
Weitere Informationen:
|
Verwendete Bildquellen:
© Barbara Eckholdt / PIXELIO
Jede Projektmanagement-Strategie fordert, dass zunächst ein Ziel/Produkt definiert werden soll, damit alle Beteiligten wissen wo die Reise hin gehen soll.

Was Entwicklern für Windows momentan fehlt ist eben diese Ziel!
Der große Trampel Steve hat dazu nur die Worte: Windows, Windows, Windows, … (nur lauter und mit aufstampfen)
Angefangen hat das Drama mit Windows Phone 7, das auch mit Mango keine wirkliche Bereicherung ist. Lieblos implementierte Features und teilweise fehlende Klassenimplementierungen. Ja, ich weiß, “Delivery is also a feature” – aber es sollte nicht das Einzige sein.
Jetzt stehen die WP7 Entwickler vor einem Scherbenhaufen und keiner will sagen wie es damit weiter gehen soll. Laufen denn WP7 Anwendungen auf WP8???
Ohne ein Ziel hat doch keiner Lust auf so eine Plattform zu setzen.
Die Fortsetzung kommt jetzt auf den Desktop. Was auf einem Tablett ganz gut funktioniert aber nicht auf meinem 30” am Arbeitsplatz. Acht mal acht Zentimeter große Kacheln und eine umständliche Bedienung mit der Maus.
Aus Entwicklersicht habe ich immer noch nicht klären können was nun mit .NET Anwendungen ohne WinRT auf ARM Plattform möglich sein wird. Und der unsägliche Schlingerkurs um .NET. Vor 10 Jahren begonnen hat man damals wohl alle Gegenargumente gesammelt, um sie jetzt selbst wieder anbringen zu können.
Also hier MEINE Roadmap:
| |
WP7 / WP8 |
Windows 8 |
| Q2 2012 |
Marktanteil 1,4% fallend |
Consumer Preview |
| Q3 2012 |
Ankündigung WP8 |
Release Preview |
| Q4 2012 |
|
Release |
| Q1 2013 |
Marktanteil unter 1% |
Mehrere Milliarden in Werbung versenken |
| Q2 2013 |
|
Windows 8 Classic |
Während ich WP7 keine weitere Beachtung schenke freue ich mich doch auf Windows 8 Classic, dann kann ich wieder vernünftig arbeiten.
CSS und Javascript sind die “kleinste” Schnittmenge von allen Browsern für die Erstellung von Web-Applikationen. Leider geht dabei etwas komfort verloren, daher lieben alle Webentwickler jQuery! SASS und LESS sind zwei Varianten, wie man “schöner” CSS schreiben kann und Coffeescript versucht Javascript Entwicklung zu vereinfachen. Aber immer der Reihe nach…
Was ist SASS?

SASS steht für Syntactically Awesome Stylesheets und kommt ursprünglich aus der Ruby Welt. SASS ist eine Erweiterung von CSS3 und erweitert den Syntax um einige praktische funktionionen, wie z.B. definition von Variablen oder erweiterte Verschachtelung von Style. Eine komplette Liste kann man hier sehen.
Grundsätzlich war hier die Idee: Man schreibt seinen Stylecode in SASS und er wird während der Entwicklung stetig nach CSS “kompiliert” bzw. transformiert (was man auch immer dazu sagen möchte).
Bsp:
$blue: #3bbfce;
$margin: 16px;
.content-navigation {
border-color: $blue;
color:
darken($blue, 9%);
}
.border {
padding: $margin / 2;
margin: $margin / 2;
border-color: $blue;
}
Wird zu:
/* CSS */
.content-navigation {
border-color: #3bbfce;
color: #2b9eab;
}
.border {
padding: 8px;
margin: 8px;
border-color: #3bbfce;
}
Was ist LESS?

LESS “the dynamic stylesheet language” hat einen ähnlichen Funktionsumfang wie SASS und verfolgt dasselbe Ziel. Ursprünglich war die Idee hier, dass der Client (über Javascript) das CSS erzeugt. Ich habe auch schon über LESS hier gebloggt und dort eine Serverseitige Variante mit dem Framework Combres gezeigt.
Bsp:
@color: #4D926F;
#header {
color: @color;
}
h2 {
color: @color;
}
Wird zu:
#header {
color: #4D926F;
}
h2 {
color: #4D926F;
}
Was ist CoffeeScript?

CoffeeScript soll die Entwicklung mit Javascript vereinfachen. Javascript hat einige Tücken zu bieten und einige Schreibweisen sind etwas seltsam. CoffeeScript sieht für C# Entwickler etwas seltsam aus, da man bewusst auf einige Syntax-Elemente verzichtet. Am Ende soll natürlich wieder Javascript Code verstehen, sodass man es auch in allen Browsern ohne Probleme ausführen kann. Insbesondere könnte diese “Sprache” für Node.js Entwickler interessant sein – rein aus der Natur heraus
Bsp:
# Assignment:
number = 42
opposite = true
# Conditions:
number = -42 if opposite
# Functions:
square = (x) -> x * x
# Arrays:
list = [1, 2, 3, 4, 5]
# Objects:
math =
root: Math.sqrt
square: square
cube: (x) -> x * square x
# Splats:
race = (winner, runners...) ->
print winner, runners
# Existence:
alert "I knew it!" if elvis?
# Array comprehensions:
cubes = (math.cube num for num in list)
Wird zu:
var cubes, list, math, num, number, opposite, race, square,
__slice = [].slice;
number = 42;
opposite = true;
if (opposite) {
number = -42;
}
square = function(x) {
return x * x;
};
list = [1, 2, 3, 4, 5];
math = {
root: Math.sqrt,
square: square,
cube: function(x) {
return x * square(x);
}
};
race = function() {
var runners, winner;
winner = arguments[0], runners = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
return print(winner, runners);
};
if (typeof elvis !== "undefined" && elvis !== null) {
alert("I knew it!");
}
cubes = (function() {
var _i, _len, _results;
_results = [];
for (_i = 0, _len = list.length; _i < _len; _i++) {
num = list[_i];
_results.push(math.cube(num));
}
return _results;
})();
Schön und gut, aber wie passt das in meine Visual Studio Welt?
Hier gibt es eine gute und eine schlechte Nachricht. Die Gute: Es gibt ein Plugin. Die Schlechte: Für den vollen (oder nützlichen) funktionsumfang benötigt man eine Lizenz, welche 39$ kostet.

Die Rede ist von der Web Workbench von Mindscape.
Wie ich auf das Tool kam…
Ich hatte bislang immer Combres genutzt. Für KnowYourStack.com nutze ich Twitter Bootstrap als UI Baukasten. Nun wollte ich allerdings den Style des UIs etwas verändern, allerdings sieht man im generierten Twitter Bootstrap UI CSS Source nicht so recht durch und zudem kann man ohnehin viele Sachen leichter direkt in den .less Dateien fixen. Hiermit kam allerdings Combres nicht zurecht, da Twitter für jede einzelne Komponente eine eigene .less Datei erstellt hatte und diese in einer Master-Datei importierte. Alles in allem: Combres mochte nicht und ich musste eine Alternative suchen.
Wie man mit der Web Workbench Twitter Bootstrap bearbeitet
Auf dem Blog von Mindscape ist auch ein Post, der beschreibt, wie man Twitter Bootstrap damit bearbeiten kann und ich kann es bezeugen: Es funktioniert wirklich. .LESS Datei bearbeiten –> Speichern –> neue .CSS Datei fällt heraus. Combres nutz nur noch die originale CSS Datei und alles ist gut.
Die kostenlose Variante von der Web Workbench hat bei mir (bis auf das Syntaxhighlighting), allerdings nix gemacht, daher war ich erst mal etwas enttäuscht. Die Pro Version lohnt sich aber, wenn man mit .LESS arbeitet
Auch Scott Hanselman hatte bei dem ersten Release darüber gebloggt, da ich damit aber noch nichts direktes zutun hatte, kam ich jetzt erst wieder darauf.
Es gibt noch andere Tools, allerdings musste man dort meist ein eigenen Build-Mechanismus einbauen, was das ganze schnell komplizierter werden ließ.
Eure Meinungen zu CoffeeScript, Sass oder LESS?

Wer schon Erfahrungen mit den Sprachen gemacht hat, kann dies gerne auf KnowYourStack kund tun: CoffeeScript, LESS & Sass.
Feedback zur Seite oder zu dem Blogpost ist natürlich auch immer willkommen
As you might know, I'm
running my "SQL Server 2012 Deep Dive Days Workshop" from May 28
– 30 in Central London. You can find out further information about the detailed agenda
here: http://www.SQLpassion.at/SQL2012_UK.pdf
Next week you have the
amazing possibility to win a free seat in that workshop! It's very easy: Just register
as the first person throughout next week (May 13 – May 18) for the workshop and get
an additional seat for one of your colleagues for free!
Here are the exact eligibility
requirements to get the free seat:
-
You
have to be the FIRST person who registers for my SQL Server 2012
Workshop in London, during the week from May 13 – May 18.
-
You
have to use the discount code TWO4ONE during the registration.
-
You
have to register the second person also through the discount code TWO4ONE.
-
Both
registrations must have the same invoice address.
-
This
offer is only available for persons/companies who haven't yet registered an attendee
for the workshop.
-
Everyone
else who registers throughout the week from May 13 – May 18 with the discount code TWO4ONE,
and has not won the free seat, receives a 10% discount of the original price of GBP
1,290.
-
The
10% discount does not apply to the first person who wins the additional seat for the
workshop.
-
So let's be very fast,
and register for my upcoming workshop in London, and if you are the first one, you
will get an additional seat for free!
See you
soon in London
-Klaus
As I have announced announced in my sessions at the SQLConnections conferences in
Berchtesgaden/Germany, you can find my session materials (slides & samples) here
for download
Thanks for attending my sessions J
-Klaus
Auch heute wieder ein Rückblick auf interessante News, Blogposts und sonstigen Informationen zu Windows Azure in dieser Woche:
- Hanu Kommalapatis Blog: Top Benefits of Running Node.js on Windows Azure
Windows Azure erlaubt die Ausführung von Node Anwendungen auf IIS. Hanus Blog erläutert die Vorteile, die sich aus dem Zusammenspiel von Node Anwendungen mit Windows Azure ergeben. Im einzelnen geht er auf die Aspekte Deployment-Architektur, Skalierbarkeit, Agilität bei der Entwicklung, sowie Verwaltung und Betrieb ein.
- Zoiner Tejada: Add Authentication Options to Your Windows Azure Website
In diesem Artikel beschreibt Zoiner Tejada, wie Websites mit verschiedenen Authentifizierungsmechanismen ausgestattet werden können. Dabei geht er auch auf die Möglichkeit ein, wie ID Provider wie Windows Live ID, Google, Yahoo mit bestehenden SQL Membership Providern kombiniert werden können. Hierbei kommt der thinktecture IdentityServer zum Einsatz.
- Microsoft: System Center Cloud Services Process Pack now available for download!
Dieses Process Pack ist Microsofts Infrastructure-as-a-Service Lösung auf Basis der System Center Plattform.
Microsoft Switzerland offers together with SwissQ Consulting AG two different workshops to get insights in the wide range of possibilities with Microsoft Test Manager 2010. Visit one of the workshops to become an expert of testing.
Workshop 1: MS Test Manger - Introduction Day
A proper management of the testing activities is the key for an efficient test artefact and result delivery. It's almost impossible to reach your targets in time and budget, if you don't use a tool. With Test Manager 2010, Microsoft presents a new tool which is fully integrated in their "Team Foundation Server" platform.
Learn how to use Microsoft Test Manager 2010 in the most efficient way and how you implement your daily testing business into this powerful tool. This training delivers the information how to implement the testing activities with the following topics:
- Testing fundamentals
- Introduction to MS Test Manager 2010
- Testcase design and -management
- Testmanagement
- Planning and execution of tests
Workshop 2: MS Test Manger - Functional Testing Day
Tools in testing are vital for a proper planning and tracking of all testing activities in every software development life cycle.
Efficiency and target-driven testing is a must in every project and the amount of testing artefacts can‘t be managed without an intuitive and highly sophisticated test management tool. Microsoft Test Manager 2010 supports you in structured and in exploratory testing as the tool records all activities on the go.
This training provides you the testing fundamentals, independent from a development life-cycle with an eye on the functional tests.
- Functional test case design
- Test management
- Test planning
- Structured test case design and execution
- Unstructured test case design and execution
Detailed information and registration can be found here.
Microsoft hat das farblose neue Design von Visual Studio 11 Beta revidiert.
Nachfolgend die Unterlagen und Beispiele, die ich heute bei meinem Vortrag bei der .NET User Group in Graz verwenden werde. Zum Einrichten der Beispiele kann die Anleitung unter [1] verwendet werden.
Zum Nachvollziehen des erweiterten Beispiels mit dem LOB-Adapter und Lookup-Provider muss man:
- Einen SQL-LOB-Adapter einrichten, der auf eine lokale Orders-Tabelle (ID int identity(1,1) primary key, PNR varchar(50), ONR varchar(50), cnt int) verweist, einrichten
- Die Maps und den Verweis auf den LOB-Adapter in der Bridge-Konfiguration anpassen oder entsprechend neu gestalten
- Die Konfiguration des Lookup-Providers auf eine SQL Azure DB mit einer entsprechenden Tabelle anpassen
Infos dazu findet man unter [2]. Dort findet man zwei Tutorials, welche die Arbeit mit dem Service-Bus veranschaulichen.
[1] http://www.softwarearchitekt.at/post/2012/04/29/Azure-Service-Bus-EAI-und-EDI-Folien-und-Beispiele-von-Basta-on-Tour-2012-in-Koln.aspx
[2] http://msdn.microsoft.com/en-us/library/windowsazure/hh689864
Azure Service Bus.pdf (1,38 mb)
Azure-Service-Bus-Sample.zip (2,69 mb)
Burgahusen? In Burghausen gibt es viel zu entdecken: Das Highlight ist die längste Burg Europas, die umrahmt wird von Salzach und Wöhrsee. Die Altstadt mit historischen Häuserzeilen mit herrschaftlichen Fassaden und mediterranen Gassen, liegt zu Füßen der Burg. Und natürlich die 00001111 - die 15 Jahre Konferenz von ppedv, eine Jubiläums-Konferenz zum 15-jährigen Bestehen der PPEDV AG.
Ich freue mich sehr, vor Ort beim Firmen-Geburtstag dabei zu sein und sogar mit zwei Vorträgen vertreten sein zu dürfen... [... mehr in diesem Blogeintrag auf Giza-Blog.de]
This post is powered by
www.Giza-Blog.de |
©
Copyright 2006-2012 Kay Giza. All rights reserved.
Legal
Das Visual Studio 11 UI wurde ja mit der VS 11 Beta überarbeitet und sehr kontrovers diskutiert. Für den kommenden VS 11 RC haben wir daher das Feedback umgesetzt und einige Änderungen vorgenommen. Was genau? Findet Ihr Hier auf dem Visual Studio Blog.
Mit Windows Azure Queue Storage offeriert die Windows Azure Plattform einen Messaging Dienst, über den Kommunikationspartner asynchron über Nachrichtenaustausch miteinander kommunizieren können. Zugriffe erfolgen grundsätzlich über http/https. Für die wichtigsten Programmiersprachen und Technologien wie .NET, Java, PHP stehen APIs zum komfortablen Zugriff auf Queues und Nachrichten zur Verfügung. In dem Video erläutere ich die Funktionsweise von Windows Azure Storage Queues.
Hier das Video: Was ist Windows Azure Queue Storage? [10:22]
Weitere Informationen
Das nächste Treffen der .NET User Group Frankfurt findet am 24.05.2012 statt. Das Thema “Softwaretests” bekommt eine stetig wachsende Bedeutung. Die Liste möglicher Tests ist lang: Funktionale Tests, Integrationstests, Lasttests und viele mehr. Auch Oberflächentests (UI-Test) setzen sich mehr und mehr durch. Dem hat Microsoft Rechnung getragen und mit Visual Studio 2010 (Ultimate oder Premium) [...]
In der letzten Woche hat das MSDN Online Team - dass den Webauftritt von Microsoft für Entwickler betreut, MSDN Online ein neues Gesicht verpasst. Eine ganze Reihe von Änderungen wurden während des Frühjahrsputzes umgesetzt, auf die ich Sie - den Bloglesern von Giza-Blog.de, gerne aufmerksam machen möchte... [... mehr in diesem Blogeintrag auf Giza-Blog.de]
This post is powered by
www.Giza-Blog.de |
©
Copyright 2006-2012 Kay Giza. All rights reserved.
Legal
Unser Exchange Server Zertifikat für https ist abgelaufen. Da ich bei StartSLL einen verifizierten Account habe und das *.ppedv.de Wildcard Zertifikat dort sogar gratis ist, habe ich dort eines besorgt. Unsere Kollegen haben es installiert und es ging fast alles , OWA, Outlook außer Windows Phone 7.
Wie man in den Foren nachlesen kann ist Startcom als Stammzertifizierungstelle im Windows Phone 7 (und 7.5) nicht hinterlegt. Im IE übrigens schon. Also wie kommt das Root CA auf das Handy. Lustig fand ich den Tipp sich das als .CER Datei zusenden zu lassen. Mail geht nicht –HALLLOOO.
Also Outlook Web Access im Browser öffnen. Dort in der URL auf das Zertifikat klicken (Schloss)

Zertifikat anzeigen

Reiter Details und in Datei kopieren

Datei auf Webserver kopieren (iis 7.5) Für .CER muss man einen eigenen Mime Type anlegen. Für DER existiert der passende Typ schon (application/x-x509-ca-cert)

Ein einfaches umbenennen der .cer in .der hat es in meinem Falle getan.
Dann noch einen QR generieren zb http://createqrcode.appspot.com/für die URL des Zertifikates.

Und jetzt kommt das erste und einzige Mal die Schönheit der dritten Taste auf dem Windows Phone zum Einsatz, der QR Scanner. Der Scanner ist über das Auge Symbol erreichbar.

Wenn das Phone den Tag lesen kann, erscheint die URL und er wird eingerahmt. Dann nochmal drauftippen und es erscheint die Dialog Meldung ob das Zertifikat installiert werden soll.
Dann den Smarttag ausdrucken und an die User verteilen oder per Mal aufs Handy zuschicken (joke)
Am 8. Mai kündigte Microsoft ein Update für die kommenden Versionen der Visual Studio Benutzeroberfläche (UI) an. Bereits in der Visual Studio 11 Beta, zeigte Microsoft eine aktualisierte Benutzeroberfläche, die es Entwicklern erlaubt, durch die Reduktion der Komplexität noch produktiver zu werden und damit auch die allgemeinen Benutzerfreundlichkeit zu steigern. Durch Rückmeldungen aus der Entwickler-Community im Rahmen des Visual Studio 11 Beta-Zyklus wurden weitere verschiedene Aktualisierungen vorgenommen. Die Updates der Benutzeroberfläche werden in künftigen Produktversionen zur Verfügung stehen, einschließlich des RC von Visual Studio 11.
Die vorgenommenen Änderungen betrafen beispielsweise den Wunsch nach mehr Klarheit und Differenzierung der Symbole durch den Einsatz von Farbe, mehr Kontrast und eine verstärkte Umsetzung des Metro Styles.
Weitere Screenshots zu den Änderungen und den ausführlichen Artikel um die Neuerungen der UI können hier nachgelesen werden.



Wer sich mit den neuen Features rund um Visual Studio 11 Beta bisher noch nicht vertraut gemacht hat, sollte dies jetzt unbedingt tun: Hier finden Sie kurze prägnante deutschsprachige Videos, die verschiedene Funktionalitäten in Visual Studio 11 Beta kurz und bündig erläutern.
Inhalt der Videos:
Am vergangen Freitag war es wieder soweit:
Die dotnet Cologne öffnete zum vierten mal seine Pforten.
Aydin Mir Mohammadi, Alexander Zeitler und ich sind hierbei kurzfristig für Thorsten Hans eingesprungen und haben einen Vortrag zum Thema "RavenDB, schnell und skalierbar" gehalten...
Hintergründe zur Themenwahl
Vor einigen Wochen kam Alexander Zeitler auf mich zu und frage, ob man RavenDB nicht auch in der Windows Azure Plattform betreiben könnte.
Spontan hatte ich leider keine Antwort, und ein Blick ins Internet war auch sehr ernüchternd.
Es gab zwar einige Lösungsansätze, aber die meisten davon waren entweder nicht skalierbar, veraltet oder unvollständig.
Aber prinzipiell sollte das doch funktionieren, oder!?
Also begannen wir unsere eigene Windows Azure Worker Role zu bauen, die die aktuelle RavenDB Version (Build 1.0.888) in die Microsoft Cloud bringen sollte.
Als dann Thorsten Hans kurzfristig bei der dotnet Cologne 2012 ausgefallen ist, war der Plan geboren, dieses Projekt der .NET Entwickler Community vorab zu präsentieren.
PowerPoint Slides
Source Code
Den aktuelle Source Code, haben wir auf github zur Verfügung gestellt:
http://github.com/SaschaDittmann/RavenDbOnAzure
Leider ist dieser noch ein wenig fehlerbehaftet.
Sobald aber eine gewisse Produktionsreife erreicht ist, geben wird dies in einem weiterem Blog Post bekannt.
Seit einiger Zeit habe ich Beispielcode auf Google Code bereitgestellt.
Einfach nur noch weg von Google Code
O-Ton damals war:
Ich hatte mich für Google Code entschieden, weil ich hoffe dass früher oder später die Google Code Suche nutzbar ist und es dadurch wenigstens ein kleiner Mehrwert entsteht. Allerdings wirft es momentan noch ein Fehler. Bei zukünftigen Posts werde ich den Code auch entsprechend Verlinken, sodass man nicht immer das komplette .zip runterladen muss.
Meine Hoffnung, dass man das Repository in irgendeiner Weise durchsuchen kann, hat sich völlig zerschlagen:

Da auch die Authentifizierung bei Google Code irgendwie immer arg seltsam im Gegensatz zu GitHub war, verlager ich meinen Source Code nun komplett zu GitHub.
Da ich ein Anfänger in Sachen Git bin (und ich so vielleicht Anderen helfen kann), hier meine Schritt für Schritt Anleitung, wie man vom von einem Git Repository von Google Code auf GitHub wechselt (dasselbe klappt vermutlich auch mit anderen Providern) :
Git Clone des alten Repository
git clone ADRESSE
Über git glone lädt man sich den letzten Stand in den jeweiligen Ordner auf die lokale Festplatte:

Dieser Befehl ist zudem auch auf der Google Code Seite deutlich hervorgehoben:

Für die Git Anfänger: Es wird die gesamte Historie des Projekts geladen. Über den Befehl gitk kann man sich dies auch visualisieren lassen:

Information über die Git Remote Einstellungen
Laut Convention ist “origin” die Source Quelle, d.h. wenn wir von Google Code wegmigrieren wollen ist dies als origin eingetragen. Über diesen Befehle kann man sich ein Überblick verschaffen und auch die Details anschauen:
git remote show
git remote show origin

Bestehende Remote Verbindung löschen
Da ich nun die Verbindung zu Google Code kappen möchte, lösche ich über diesen Befehl die bestehende “Verbindung”
git remote rm origin
Achtung: Git ist dezentral – diesen Schritt muss man nicht gehen
Anders als bei Subversion oder TFS kann man bei Git mehrere Remotes hegen und Pflegen. Ich hätte (vermutlich) parallel Google Code und GitHub als Remote Repositories laufen lassen können, allerdings ging mir Google Code auf den Keks, daher wird es in Zukunft dort keine Updates mehr geben.
GitHub als Origin hinzufügen
Über diesen Befehl fügen wir nun GitHub als Origin hinzu:
git remote add origin git@github.com:ACCOUNT/REPO.git
Vorraussetzung ist, dass man bereits seinen Rechner mit GitHub bekannt gemacht hat. Nachzulesen in der GitHub Hilfe oder auch hier.

Push!
Nochmal nachschauen ob alles stimmt:

Und dann ein git push –u origin master:

Tadaaaa…

Wieder was gelernt
Git sieht zwar am Anfang gruselig aus, macht aber nach einer Zeit durchaus Spaß. Da GitHub mir noch keine solche Probleme wie Google Code beschert hat (Auth Probleme), komm ich vermutlich auch häufiger in die Verlegenheit den kompletten Code bereitzustellen.
Das Vorgehen sollte eigentlich bei allen Git Migrationen gleich sein – auch wenn ich mich auf GitHub und Google Code gestueürzt habe.
Erfahrungen in Git oder GitHub?
Fuer mein OpenSource Projekt KnowYourStack.com, welches auch auf GitHub ist, suche ich immer Meinungen zu unterschiedlichen Technologie-Stacks, z.B. GitHub oder Git – wer Gutes, Schlechtes oder Wissenwertes hat – immer her damit!
Wenn sich der Inhalt einer Kachel (also dem Menüpunkt) ändert, spricht man von einer Live Tile. Der Internet Explorer 10 Metro Styled nutzt das um Websites in das METRO Menü zu bringen. In der Appbar einfach Pin auswählen und schon kann die Seite in Zukunft vom Benutzer direkt angesprungen werden.

Wenn die Webseite ein Icon (32x32) enthält, wird dieses dann in die Kachel eingebaut. Außerdem kann man die Beschriftung per Metatag vorbelegen. Der Benutzer kann den Titel aber immer anpassen.
<head runat="server">
<title></title>
<link href="favicon.ico" rel="shortcut icon" />
<meta name="application-name" content="ppedv Demo" />
<meta name="msapplication-badge" content="frequency=30;polling-uri=http://localhost/badge.aspx" />
</head>

In der letzten Zeile der Metatags (Badge) kann man sogar ein aktives Element definieren. Das heißt eine andere Webseite liefert einen WinRT Badge typischen XML String. In diesem Beispiel verwende ich eine komplett entkernte ASPX Datei. Es sind wirklich nur die beiden Zeilen XML bzw. VB.NET Code enthalten.
<?xml version="1.0" encoding="utf-8" ?>
<badge value="<%=cint(rnd(1)*100) %>"/>
Die Wiederholintervall ist in Minuten, also in dem Fall 30 Minuten. Wenn der Badge Value auf unavailable gesetzt wird erscheint ein kleines rundes Bullet Icon im Tile. Gültige Werte sind laut Doku 30, 60, 360, 720, 1440 (default=1 Tag)

Wenn es Neuigkeiten gibt zeigt die Kachel dies dann an. Hier ist die Kachel auch gleich markiert.

Damit kann man in der Appbar dann auch das “Live” an und abschalten.

Theoretisch sollten man den Update auch per Javascript ausführen können. Die nötige Methode window.external.msSiteModeRefreshBadge(); funktioniert leider bei mir nicht.
Die dnc12 ist gerade vorbei und wir könnten uns schon wieder zusammensetzen 
Heute gab es auf Twitter eine kurz angerissene Diskussion, die das Zeug dazu hatte, die Gemüter aufzuheizen: soll man oder soll man nicht #regions nutzen?
Nach dem kurzen Tweet-Austausch wurde es klar, dass es viele Entwickler gibt, die Regions gerne nutzen. Ich habe zwar den ganzen Abend nachgedacht, habe allerdings keine Gründe gefunden, sie selbst verwenden zu wollen.
Ich meine, warum sollte man Code NICHT sehen wollen?
- Geht es vielleicht um eine oder mehrere Methoden, die man ausblenden will? Das würde aber entweder bedeuten, dass man
- die Funktionalität der ganzen Klasse ausblendet, aber dann wozu, man öffnet einfach die Klasse nicht 
- nur ein Teil der Funktionen ausblendet, und dann stellt sich die Frage, warum manche Funktionen viel öfter angeschaut werden als andere? Das hat für mich irgendwie ein CodeSmell
- Geht es vielleicht um ein Teil einer einzigen Methode, und zwar einer ganz großen, sonst würde man sie nicht teilweise ausblenden wollen? Zusammengeklappt würde man dann eine Art Kommentar sehen, was mich sofort an Martin Fowlers Hinweis bezüglich Kommentare erinnert hat: Kommentare sind ideale Namensgeber. Wenn man im Code einen Kommentar braucht, dann ist das meistens ein Smell für ein Extract Method (genauso wie die Tatsache, dass die Methode wahrscheinlich zu lang ist)
You have a code fragment that can be grouped together.
Turn the fragment into a method whose name explains the purpose of the method.
- Geht es vielleicht um Regionen um Methoden, Events, Fields, Properties, also nach Sichtbarkeit und Rolle? Dafür könnte ich einen einzigen Grund vorstellen, und zwar den, dass man auf Anhieb die öffentliche Methoden und Eigenschaften sehen will. Das wäre allerdings die Aufgabe eines Interfaces, oder? Dazu kommt auch noch meine – persönliche – Vorliebe, Code wie ein Buch zu lesen, von oben nach unten, also von einer öffentlichen Methode weiter in die Details, also zu den privaten Methoden (ganz nach CCD – Single Level of Abstraction (SLA))
Hilfreich als Analogie ist der Blick auf Artikel in der Tageszeitung: dort steht zu oberst das Allerwichtigste, die Überschrift. Aus ihr sollte in groben Zügen hervorgehen, wovon der Artikel handelt. Im ersten Satz des Artikels wird dies auf einem hohen Abstraktionsniveau beschrieben. Je weiter man im Artikel fortschreitet, desto mehr Details tauchen auf. So können wir auch unseren Code strukturieren. Der Name der Klasse ist die Überschrift. Dann folgen die öffentlichen Methoden auf hohem Abstraktionsniveau. Diese rufen möglicherweise Methoden auf niedrigerem Niveau auf, bis zuletzt die “Bitpfriemelmethoden” übrig bleiben. Durch diese Einteilung kann ich als Leser der Klasse entscheiden, welchen Detaillierungsgrad ich mir ansehen möchte. Interessiert mich nur grob, wie die Klasse arbeitet, brauche ich mir nur die öffentlichen Methoden anzuschauen. In ihnen wird die Funktionalität auf einem hohen Abstraktionsniveau gelöst. Interessieren mich weitere Details, kann ich tiefer einsteigen und mir die privaten Methoden ansehen.
Was meint ihr, übersehe ich da was? (Notiz an mich: bei #nossued das Gespräch fortsetzen!)
Die diesjährige .NET Cologne war für mich ein einzigartiges Erlebnis. Ich habe die ganze Intensität der Community und der Teilnehmer erleben dürfen. Obgleich ich zum Konferenztag später ankam als ursprünglich geplant, war ich dennoch froh darüber, dann bei Ankunft viele alte und neue Gesichter sehen zu können.
Das spannende an der Konferenz ist sicherlich die Größe und Qualität. Es gibt de facto keine größere (und für mein Empfinden auch beeinflussendere) Community-Konferenz für das Microsoft & .NET-Umfeld als die .NET Cologne. Schaut man sich die Agenda der Konferenz an, weiß man auch, warum.
Ich habe bei der diesjährigen Konferenz einen kleinen Beitrag leisten dürfen, in dem ich meinen Vortrag über die Geheimnisse der Continuous Integration “CI-Secrets” gehalten habe. In diesem Vortrag bin ich in klaren Worten auf die offensichtlichen und etwas versteckteren Kniffe eingegangen, die man methodisch und technisch anwenden kann, um eine Continuous Integration erfolgreich im Team zu manifestieren. Meine drei Haupt-Themen-Gebiete waren dabei Kultur, Automatisierung und Qualität.
Ich möchte jetzt nicht weiter auf die einzelnen Talks oder Eindrücke eingehen, die ich bei der Konferenz sammeln konnte. Viel mehr liegt es mir am Herzen, dem Veranstalter, Sponsoren, Vortragenden und Teilnehmern für eine absolute Spitzen-Konferenz zu danken. Ganz Besonders die Veranstalter und Sponsoren haben es ermöglicht, nun mittlerweile über mehrere Jahre der .NET Community eine Konferenz im Stile einer Top-Wissenstransfer-Plattform bereitzustellen.
Die .NET Cologne ist unverzichtbar – für ausnahmslos jeden, der im .NET Software-Development tätig ist. Ich kann es jedem .NET Enthusiasten oder Interessierten uneingeschränkt empfehlen.
Microsoft hat mich letzte Woche für meine Community-Aktivitäten als Azure-Insider ausgezeichnet, was mich sehr freut. Das bedeutet unter anderem, dass ich nun einen direkten Draht zum Produkt-Team in Redmond habe und somit vorab mit wichtigen und vertraulichichen Informationen versorgt werde. Daneben kann ich mich mit Fragen direkt an die Leute vor Ort wenden.
Ein Karussell dreht sich. Ein WinRT Steuerlement laesst vermuten das es sich um ein Liste mit drehenden 3D Darstellung handelt. Nicht in Windows 8 Consumer Preview. Ursprünglich wurde das Control entwickelt für die Combobox, um am Ende der Liste wieder am Anfang zu beginnen.
Das ganze funktioniert aber nun auch mit typischen Listen.
<ListBox x:Name="listbox1"
DisplayMemberPath="name"
Height="300" Width="600">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<CarouselPanel />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ListBox>
Die Liste ( hier weiß) beginnt nach Vanessa wieder mit Hannes, scrollt also unendlich von unten nach oben.

Wenn man nun andere Listen nimmt und das Scrollen Horizontal machen möchte, geht dies z.B, mit einem Gridview und einem Stackpanel.
<GridView
x:Name="gridview1" HorizontalAlignment="Left" Margin="283,17,-813,0" VerticalAlignment="Top" Width="721" Height="237">
<GridView.ItemTemplate>
<DataTemplate>
<Border CornerRadius="5" >
<TextBlock Text="{Binding name}">
<TextBlock.RenderTransform>
<CompositeTransform Rotation="90"/>
</TextBlock.RenderTransform>
</TextBlock>
</Border>
</DataTemplate>
</GridView.ItemTemplate>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<!--<CarouselPanel CanHorizontallyScroll="true"/>-->
<StackPanel Orientation="Horizontal"></StackPanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</GridView>
Wie man am auskommentierten Block erkennen kann, könnte das WinRT CarouselPanel zwar Horizontales Scrollen- als Attribut - aber zur Laufzeit gibt's einen Fehler. Ich vermute, das hier der .NET Part einfach noch nicht fertig auscodiert ist. Aber die letzte Windows 8 Beta steht ha schon in den Startlöchern.
Mit den Windows 8 Contracts, können Anwendungen oder das Betriebssystem mit einer App kommunizieren, auch wenn diese nicht läuft. So kann der Benutzer über dem Charme Suchdialog in verschiedenen APPs suchen.

Wie üblich muss zunächst im Manifest die Declarationsearch aktiviert werden. Dann wird eine neue Seite mit dem Template “Search Contract” erstellt.
\
Dies erzeugt die Page die gestartet wird, wenn die APP per Search aktiviert wird. Gesteuert wird dies in der app.xaml.vb. mit dem Event OnSearchActivated. Der folgende Codeblock wird automatisch vom “Search Contract” Template mit erzeugt.
Protected Overrides Sub OnSearchActivated(ByVal e As Windows.ApplicationModel.Activation.SearchActivatedEventArgs)
SearchResultsPage1.Activate(e.QueryText)
' TODO: Move the following code to OnLaunched to speed up searches when your
' application is already running:
AddHandler Windows.ApplicationModel.Search.SearchPane.GetForCurrentView().QuerySubmitted,
Sub(sender, queryArgs)
SearchResultsPage1.Activate(queryArgs.QueryText)
End Sub
End Sub
In meinem Beispiel baue ich allerdings eine davon unabhängige Suche in die APP ein. Da eine APP durchaus mehrere Listen darstellen kann, sollte in diesen auch gesucht werden können.
Hier wird vom ppedv Twitter Account die Neuigkeiten geladen. Dazu kommt der SyndicationClient zum Einsatz. Alles in WinRT und .NET vorhanden und mit einem Vierzeiler an VB Code zu erledigen.
Private Async Sub UserControl31_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
Dim uri As Uri = New Uri("http://twitter.com/statuses/user_timeline/ppedv.rss")
Dim clt As SyndicationClient = New SyndicationClient()
feed = Await clt.RetrieveFeedAsync(uri)
listview1.ItemsSource = feed.Items
End Sub
Die Darstellung erfolgt im WinRT Listview Control. In diesem soll dann per Search Charme gesucht werden können. Bereits verwendete Suchphrasen werden sogar schon seitlich vorgeschlagen.

Die Anwendung muss nur das Event der auftauchenden SearchPane abonnieren, hier mit onQuerySubmitted. In den Feed Elementen wird dann per LINQ eine Abfrage durchgeführt und dem Listview wiederum zugewiesen.
Dim feed As SyndicationFeed
WithEvents sp As SearchPane = SearchPane.GetForCurrentView
Public Sub OnQuerySubmitted(ByVal sender As Object, ByVal args As SearchPaneQuerySubmittedEventArgs)
Handles sp.QuerySubmitted
Dim q = From i In feed.Items
Where i.Title.Text.ToLower.Contains(args.QueryText.ToLower)
Select i
listview1.ItemsSource = q
TextBox1.Text = "Suche nach " & args.QueryText
End Sub
Office 365 hat in dieser Woche eine 'Sicherheitszulassung' für die Verwendung in US-amerikanischen Behörden erhalten. Die Vorgaben des Federal Information Security Management Acts (FISMA) setzen verpflichtende Standards im Bereich der Informationssicherheit für den öffentlichen Sektor. Neben dieser FISMA-Zertifizierung, die auch Microsofts Cloud-Infrastruktur bereits seit Ende 2010 innehat, ist hierzulande natürlich erheblich interessanter... [... mehr in diesem Blogeintrag auf Giza-Blog.de]
This post is powered by
www.Giza-Blog.de |
©
Copyright 2006-2012 Kay Giza. All rights reserved.
Legal
Die Neue VS IDE bringt neben dem Design auch neue Funktionen im Solution Explorer und Team Explorer mit, die jedem Developer das Leben einfacher machen. Zwei kurze Videos zeigen einige Aspekte. Im dritten Video stehen die Neuerungen TFS Team Build im Vordergrund. Und im letzten Video, stellen wir C++ AMP vor. Viel Spass
Visual Studio 11 Beta - Die neue IDE
Visual Studio 11 Beta - Der neue Team Explorer
Visual Studio 11 Beta - Team Foundation Build in TFS 11 Beta
Visual Studio 11 Beta - GPU Programmierung mit C++ AMP
Teil 1: UI-/UX-Grundlagen für Entwickler
Überall dort, wo entweder kein dedizierter UI-/UX-Spezialist zur Verfügung
steht oder aber dieser in Arbeit ertrinkt, ist es umso wichtiger, dass auch Softwareentwickler
ein gewisses Gespür für die Gestaltung von UIs haben. Nun wird zwar niemand über Nacht
zum Designer, aber der Schritt von "schlimm" nach "brauchbar"
ist nicht so groß, wie es vielleicht scheint.
Teil 2: UI-Patterns für die Gestaltung von GUIs
Bei den Begriffen UI und Patterns mag mancher an MVC (Model View Controller)
oder MVVM (Model-View-ViewModel) denken. Nicht nur in der technischen Umsetzung, sondern
auch bei der Gestaltung von User Interfaces gibt es - im wahrsten Sinne des Wortes
- Design Patterns. Quellen dafür gibt es einige, doch wie beim Kochen garantiert die
bloße Kenntnis eines Rezepts nicht automatisch auch das Gelingen.
Anmeldung
Die Folien und Beispiele zum Vortrag "ADO.NET Entity Framework 5.0 – Was ist neu seit 4.0?" stehen zum Download zur Verfügung.
Auch heute wieder ein Rückblick auf interessante News, Blogposts und sonstigen Informationen zu Windows Azure: