Glengamoi (Forum) · AspHeute (Artikel) · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs

ppedv Team Blog: Bilder in Windows 8 METRO Styled Apps

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.

image

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.

Gregor Biswanger: .NET-Architektur mit dem Beispiel „GoFish“ – Development–Erstellen von Workflow Activities

gofish-1_thumb1_thumbIn 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.

image

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

  • OUT Result (List<Card>)

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!

Holger Sirtl: Video-Reihe zu Windows Azure – Folge 11: Was ist Windows Azure Blob Storage?

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

Marco Scheel: Links for 2012-05-16 [del.icio.us]

Martin Richter: Bericht über die Advanced Developers Conference (ADC) für C++ in Ohlstadt vom 03.+04. Mai 2012

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)

Ilker Cetinkaya: No More Blog Comments

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.

What Is A Comment?

Ok. From technical perspective, comments aren’t much of an issue, since there’s a number of external providers for commenting, i.e. the popular Disqus. Nonetheless, I wanted to rethink everything on my website. Hence, I chewed on the comment thing as well. After a couple of days, I came to a conclusion I hadn’t thought I’d come to before: Just don’t do it.

Yes, that’s right. No more blog comments on my website. Even more, I’ll remove the blog comments from my old entries as well. The reason is quite simple. On-site comments are simply wrong. From almost any perspective it makes no real sense to me to enable commenting on an article/blog right just where the article is. And to be honest, this conclusion is quite new for me as well. I didn’t care much about it until recently.

The fundamental question for me to be answered was: What is a blog comment? To me, a blog comment is a published opinion or statement regarding the content/topic layed out in the original article. Such a statement must have an author – be it disclosed or undisclosed. As a side note: I never allowed anonymous commenting. But surely, impersonated or fake name commenting is/was possible as well.

As for the activity of commenting, the author writes and publishes her thoughts in the internet. Now hold on for a second and re-read that last sentence again. The important thing to notice is the internet. That’s actually what makes me believe that the entire concept of on-site commenting is wrong. The culture and nature of the internet is distributed and free information. Now, if information is useful or related to some other information, it’s simply interlinked. I’m a firm believer that the concept of linking is crucial for the internet.

I think that instead of posting a comment on the same site where the article resides, the comment actually needs to be published somewhere else on the internet and then interlinked with the original article. This is the natural way of information sharing on the internet. Yes, it’s the culture of the internet. The author can simply post her comment on her own website or blog. Nowadays, it’s just a few clicks to get a free personal blog.

Thinking a little more about the topic, one might inevitably notice that actually there’s a trend towards off-site commenting in recent years. With the rise of the social networks (you know, this Facebook, Twitter and G+ things), sharing links and quick commenting has become both popular and usable. Just post the link of the article or page in question, write your statement and fire off a new conversation.

Moreover, sharing on social networks is beneficiary for all parties involved. Be it the author of the original article, the commenting author, the social network platform, or the readers of the comment embodied as “social network status message”. Perhaps the best thing about it is that the comment (and a potential conversation) about the topic in question is being made intentionally and directed. The author of the comment makes many useful and helpful decisions before sharing her comments.

After it was clear for me that off-site commenting is far better than on-site commenting, I thought about a second, related question. I asked myself: “Why should I limit my readers?”. And of course, that’s a very valid question. Why should I, as author of an article, limit the feedback and conversation possibilities for my readers?

At first sight, I thought that it’s not a good idea to limit feedback channels. Even more, just switching off the comment feature on a blog is – well – quite unnatural, since most of the blogs out there have (excellent) on-site commenting. Additionally, from a open communication perspective, it’s counterintuitive to simply block a communication channel. Especially for someone like me, who really is very dedicated and passionate to develop and foster communication and feedback all the time. However, I finally decided to disable this communication/feedback channel and go for the hard way. The key argument here is based on a very simple idea: Providing a wrong option doesn’t improve anything.

That’s why I’ll no longer provide on-site comments on my website. You can share your feedback with me and others at any time. Write your thoughts on your own website, post your comment on a social network, link to original or related sources and let me know about your comment if you like. You can surely just send me an email as well.

Christian Binder [MS]: C++ Day 2012 : Windows 8 für C++ Entwickler

 

cplusplus_tour2-gelb

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

imageimage

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

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

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

Thomas Schissler: Im TFS Plain Text Felder aus der Datenbank auslesen

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 

Holger Sirtl: Veranstaltungshinweis: MEET Windows Azure am 7. Juni

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

Hendrik Lösch: Dotnet Developers Conference 2012 – Eine subjektive Zusammenfassung

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.

Code-Inside Blog: Chocolatey–apt-get für Windows

image.png

Durch Zufall bin ich auf das Tool “Chocolatey” gestoßen. Wer die Website sich anschaut, wird evtl. eine Verwandschaft mit NuGet ausmachen.

image

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:

image

@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:

SNAGHTMLb39dd9c

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? :D

Jan Welker: .NET Developer Conference 2012 – ein Rückblick

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.

DDC-Tasse 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.

DDC-Essen 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.

Sven Hubert: Agile Entwicklung mit ScrumTable für TFS 2010 – Teil 3

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

Christian Binder [MS]: C++ Webcasts zu C++ 11, Going Parallel und ALM

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 Beta für C++ Entwickler

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.

Christian Binder [MS]: SQL Server Data Tools Workshop in Bad Homburg

image

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.

Ilker Cetinkaya: Der Agilist: Agile Scrum-Master

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”

Hans-Peter Schelian: DotNetNuke – Nach Upgrade auf DNN 6.1.X – HTML Modul speichert keine Änderungen mehr

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 Smiley

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>
Twitter del.icio.us Digg Facebook linked-in Yahoo Buzz StumbleUpon

Sascha Dittmann: Webseitenpfade einer Windows Azure Web Rolle bestimmen

Die Suche nach den WebseitenpfadenIn 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 Weitere Informationen:

Verwendete Bildquellen:
© Barbara Eckholdt / PIXELIO

Frank Pfattheicher: Meine! Windows Roadmap

Jede Projektmanagement-Strategie fordert, dass zunächst ein Ziel/Produkt definiert werden soll, damit alle Beteiligten wissen wo die Reise hin gehen soll.

image

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.


Code-Inside Blog: SASS, LESS & Coffeescript in Visual Studio mit der Web Workbench

image.png

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?

image

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?

image

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?

image

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.

image

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?

image

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 :)

Klaus Aschenbrenner: Chance to win a free seat in my SQL Server 2012 Deep Dive Days workshop in London!

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.
  • The registrations have to be done through the registration site available on http://www.SQLpassion.at/events.html

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

Klaus Aschenbrenner: Slides & Samples for my SQLConnections sessions

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

Holger Sirtl: Presseschau 2012-KW19: Neues zu Windows Azure

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.

Swiss DPE Team [MS]: Become an expert: Learn about Microsoft Test Manager 2010

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.

Holger Schwichtenberg: Im Release Candidate von Visual Studio 11 kehrt Farbe zurück

Microsoft hat das farblose neue Design von Visual Studio 11 Beta revidiert.

Marco Scheel: Links for 2012-05-10 [del.icio.us]

Manfred Steyer: Folien und Beispiele zu Vortrag über Azure Servide Bus EAI & EDI bei .NET User Group Graz

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)

 

Kay Giza [MS]: 00001111 - Die 15-Jahres-Konferenz von ppedv - wir sehen uns in Burghausen am 14. Mai 2012

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 | Giza-Blog.de: RSS Feed
© Copyright 2006-2012 Kay Giza. All rights reserved. Legal
Subscribe

Christian Binder [MS]: Visual Studio 11 UI Update für den RC

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.

Holger Sirtl: Video-Reihe zu Windows Azure – Folge 10: Was ist Windows Azure Queue Storage?

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

Constantin Klein: .NET User Group Frankfurt: Nächstes Treffen am 24.05.2012 – “Advanced UI-Testing für WPF”

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) [...]

Kay Giza [MS]: MSDN Online fuer Entwickler optimiert mit neuen Funktionen [Fruehjahrsputz 2012 im Microsoft Developer Network]

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 | Giza-Blog.de: RSS Feed
© Copyright 2006-2012 Kay Giza. All rights reserved. Legal
Subscribe

ppedv Team Blog: Windows Phone 7 Root Zertifikat installieren

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)

image

Zertifikat anzeigen

image

Reiter Details und in Datei kopieren

image

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)

image

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.

image

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)

Swiss DPE Team [MS]: Updates in der Benutzeroberfläche von Visual Studio 11 Beta

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.

 

imageimage

image

Marco Scheel: Links for 2012-05-08 [del.icio.us]

Swiss DPE Team [MS]: Kurzvideos zu Visual Studio 11 Beta

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:

Sascha Dittmann: dotnet Cologne 2012 - RavenDB auf Windows Azure

dotnet Cologne 2012Am 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.

Marco Scheel: Links for 2012-05-07 [del.icio.us]

Code-Inside Blog: Code-Inside Sample nun auf GitHub: Google Code zu GitHub Migration

image.png

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:

image

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:

image

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

image

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:

image

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

image

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.

image

Push!

Nochmal nachschauen ob alles stimmt:

image

Und dann ein git push –u origin master:

image

Tadaaaa…

image

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!

ppedv Team Blog: Live Tiles in Windows 8 angewendet

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.

image

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>

 

image

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)

image

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

image

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

image

Theoretisch sollten man den Update auch per Javascript ausführen können. Die nötige Methode  window.external.msSiteModeRefreshBadge(); funktioniert leider bei mir nicht.

Christina Hirth : Regions or no regions – this is the question

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!)

Ilker Cetinkaya: .NET Cologne 2012: CI Secrets

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.

Manfred Steyer: Als Windows Azure-Insider ausgezeichnet

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.

ppedv Team Blog: Windows 8 CarouselPanel

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.

image

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.

ppedv Team Blog: Windows 8 Search Contract

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.

image

Wie üblich muss zunächst im Manifest die Declarationsearch aktiviert werden. Dann wird eine neue Seite mit dem Template “Search Contract” erstellt.

image\

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.

image

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

Kay Giza [MS]: Sicherheitsbestaetigung fuer Microsoft Office 365: FISMA-Zertifikat

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 | Giza-Blog.de: RSS Feed
© Copyright 2006-2012 Kay Giza. All rights reserved. Legal
Subscribe

Christian Binder [MS]: Visual Studio 11 Beta QuickHit Videos Vol.6 (Neue VS IDE, Neuer Team Explorer, TFS Team Build, C++ AMP)

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

Torsten Weber: UI-/UX-Grundlagen &amp; Patterns f&uuml;r Entwickler, Roland Weigelt


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

Holger Schwichtenberg: Vortrag "ADO.NET Entity Framework 5.0"

Die Folien und Beispiele zum Vortrag "ADO.NET Entity Framework 5.0 – Was ist neu seit 4.0?" stehen zum Download zur Verfügung.

Holger Sirtl: Presseschau 2012-KW18: Neues zu Windows Azure

Auch heute wieder ein Rückblick auf interessante News, Blogposts und sonstigen Informationen zu Windows Azure:

friends header

bloggers headline

links header

 
Don't contact us via this (fleischfalle@alphasierrapapa.com) email address.