Visual Studio Database Edition: Datenbankschemas vergleichen 31.01.2011

Markus Schwamberger
Markus Schwamberger, Senior eXpert

Im letzten Artikel wurde ein kurzer Überblick zu Datenbankprojekten gegeben.

Nun stellt sich die Frage, wie mit dem neu angelegten Projekt entwickelt werden kann? Muss nun jede Tabelle und Stored Procedure im Visual Studio geschrieben werden, oder kann weiterhin direkt in der (lokalen) Datenbank entwickelt werden? Und wie werden Änderungen am Projekt eigentlich in die Datenbank übertragen und umgekehrt?

Für all diese Fragen hat die Database Edition eine einfache Antwort: Schema Compare!

Schema Compare bietet mir die Möglichkeit, meine Entwicklungsdatenbank mit dem Datenbankprojekt zu vergleichen. Oder aber auch die Unterschiede zwischen zwei Datenbanken zu analysieren.

Um einen Schema Compare zu starten geht man auf "Data -> Schema compare -> New schema comparison". Dies öffnet den "New Schema Comparison" Dialog:

image

Hier wählt man Quelle und Ziel aus und startet den Vergleich.

Das Ergebnis sieht dann ungefähr so aus:

image

Es werden alle Unterschiede nach Objekt gruppiert aufgeführt. Der Entwickler hat nun die Möglichkeit weiter zu filtern, z.B. alle Objekte die sich geändert haben oder nur in Quelle/Ziel bestehen etc.

Wirklich nützlich ist die Möglichkeit, gezielt Unterschiede auszuwählen und in das Ziel übertragen zu lassen.

Ein Entwickler arbeitet z.B. auf seiner lokalen Sandbox Datenbank, erstellt eine neue Tabelle und passende Stored Procedures. Mit Hilfe des Schema Compare Tools können diese nun ganz einfach in das Projekt überführt und Versioniert werden.

Andere Entwickler können diese Änderungen nun einfach in ihre lokale Sandbox Datenbank übertragen. Sollten bereits Änderungen an anderen Tabellen vorgenommen worden sein, besteht nun die Möglichkeit die Unterschiede zu erkennen und zusammenzuführen.

Damit sind die Möglichkeiten der Database Edition aber noch nicht erschöpft. Darüber hinaus ist es mit dem Data Compare Tool möglich, die Daten zweier Datenbanken miteinander zu vergleichen. Anhand der Differenzen kann dann ein Script generiert werden, welches die Datensätze erstellt oder anpasst. Dies ist z.B. äußerst nützlich für die initiale Befüllung einer Datenbank.

Zum Abschluss noch zwei weiterführende Links zu ausführlichen Tutorials, in welchen das Thema sehr gut erklärt wird:

Schema Compare

Data Compare

Share |

Frisch gedruckt: eXperts WP7 Artikel in der dotnetpro 28.01.2011

Svenja Henß
Svenja Henß, Senior Assistant

Von unserer eXperts Patric Schouler und Matthias Jauernig ist in der aktuellen Ausgabe (02/2011) der dotnetpro ein brandaktueller Artikel zum Thema Windows Phone 7 erschienen:

Das Datenmobil: Datenzugriffe mit Windows Phone 7

Viele Anwendungen für mobile Geräte sind heute darauf angewiesen, Daten aus externen Quellen und der “Cloud” einzubinden bzw. Informationen lokal zu speichern.

Der Artikel unserer beiden eXperts beleuchtet nicht nur dieses Thema, sondern zeigt auch, dass sich beim Thema Datenzugriff Silverlight als Entwicklungsplattform für Windows Phone bewährt hat. Der Einsatz von Silverlight ermöglicht so jedem .NET-Entwickler, ohne großes Umdenken, mobile Applikationen zu entwickeln.

Erhältlich ist die dotnetpro ab dem 20. Januar online oder hier bei mir: E-Mail

Share |

SQL Azure - Cloud-Daten managen 26.01.2011

Patric Schouler
Patric Schouler, Chief eXpert

Hat man unter sql.azure.com seine Datenbank als SQL Azure Datenbank in die “Cloud” gehoben, möchte man diese als Entwickler oder Datenbankadministrator verwalten können.

Zieht man hier die bekannten Entwicklungswerkzeuge und die von Microsoft gelieferten Werkzeuge in Betracht, ergeben sich die nachfolgend beschriebenen Möglichkeiten.

Verwaltung über Management Studio

Es liegt zunächst einmal nahe, eine SQL Azure Datenbank über das SQL Server Management Studio verwalten zu wollen. Grundvoraussetzung ist hierfür die Version image2008 R2. Hat man die IP-Adresse seines Clients in die Firewall-Einstellungen unter sql.azure.com eingetragen kann man auch über tcp:<ServerName>.database.windows.net  eine Verbindung zur SQL Azure Datenbank hinzufügen. Als Benutzer ist hier die Angabe <Account>@<ServerName> notwendig.

Da man aber weder die Schemainformationen direkt bearbeiten, noch die Tabellendaten manipulieren kann, empfiehlt sich zur komfortablen Bearbeitung das Projekt “Houston”.  Die Verwendung des SQL Server Management Studios bietet sich lediglich zur Migration einer SQL Server Datenbank in die “Cloud” an. Hier kann man die Ursprungs-Datenbank skripten und dann dieses Skript gegen die SQL Azure Datenbank ausführen. Bei der Skript-Erstellung ist darauf zu achten, dass man in den Advanced-Options den “Engine Type” auf “SQL Azure Database” einstellt, da nicht alle DDL-Commands von SQL Azure unterstützt werden.

Verwaltung über Houston

Das Projekt “Houston” (Microsoft Project Code-Named “Houston” CTP) aus den SQL Azure Labs liegt derzeit in der CTP-Version vor und ist ein Web-basiertes Management-Tool für SQL Azure Datenbanken. “Houston” bietet viele Basisfunktionalitäten zur Datenbankverwaltung, wie das Erstellen und Ausführen von Abfragen, Entwerfen und Bearbeiten von Datenbank-Schemata sowie das Editieren von Tabellendaten.

Mit dem Update im August 2010 steht “Houston” in jedem Data Center von Microsoft zur Verfügung, sodass die Bearbeitung der eigenen SQL Azure-Datenbank noch schneller erfolgen kann.

image

Verwaltung über Visual Studio 2010

Auch über das Visual Studio 2010 lässt sich eine SQL Azure-Datenbank verwalten. imageGenau wie bei der Nutzung von SQL Server Management Studio ist es zunächst einmal erforderlich unter sql.azure.com eine Firewall-Regel zum Zugriff über den eigenen Client einzutragen. Danach kann über <ServerName>.database.windows.net mit dem Benutzer <Account>@<ServerName> eine ganz normale Datenbankverbindung angelegt werden.

Anschließend können die Tabellendaten abgerufen und bearbeitet werden. Eine Verwaltung der Datenbank-Schemata wird nicht unterstützt, sodass diese hier auch nur über entsprechende SQL-DDL-Skripte bearbeitet werden können.

Share |

SDX Technical Council: Federated Identity Management für Business Integration 24.01.2011

Simone Franz
Simone Franz, Marketing Manager

Herzlich laden wir zu zum ersten Technical Council in 2011 ein:

Thema: ”Federated Identity Management für Business Integration”
Termin: Mittwoch, 16.02.2011, 17:00 bei SDX
Zielgruppe: Projektleiter, techn. Projektleiter, Architekten und Lead Developer

17:00 Uhr Begrüßungskaffee
17:30-19:30 Uhr Themen: Federated Authentication, Claims Based Security, Windows Identity Foundation, Business Integration (intern, extern/Cloud)
     
19:30 Uhr Abendessen mit Bier vom Fass und Wein
 

Identität wird traditionell mit Benutzerkonten gleichgesetzt - bei der Nutzung von Services über Firmengrenzen hinweg (und erst recht in der Cloud) stoßen traditionelle Denkmuster und Technologien aber schnell an ihre Grenzen.
Federated Authentication und Authorisation auf Basis von Claims Based Security versprechen hier einen standardisierten Weg - ohne Benutzerkonten. Das TC gibt einen Überblick, was Identität eigentlich ist, wie sie in Claims zu verpacken ist, welchen Zusatznutzen Claims auch in traditionellen Szenarien bieten und wie die Windows Identity Foundation im Umgang mit den Claims hilft.

Unser Chief eXpert Sven Erik Matzen wird die verschiedenen Arten von Identität und Identitätsnachweisen erläutern, sowie Möglichkeiten aufzeigen, Identitätsnachweise in der notwendigen Granularität an Applikationen oder externe Partner sicher zu übermitteln.

Titel

Genießen Sie das abschließende Abendessen und unterhalten Sie sich in lockerer Atmosphäre mit den Teilnehmern und den SDX eXperts.

Das SDX Team freut sich über Ihr Kommen. Auf Wiedersehen im SDX Büro in der Borsigallee (Nähe Hessencenter).

Herzliche Grüße
Simone Franz

Die komplette Einladung bzw. die Teilnahmebedingungen erfahren Sie hier: Einladung zum Technical Council.

Share |

Visual Studio Database Edition: Überblick

Markus Schwamberger
Markus Schwamberger, Senior eXpert

Heute möchte ich ein Produkt von Microsoft vorstellen das leider weitgehend unbekannt ist. Die Rede ist von der Visual Studio Database Edition (aka „Data Dude“).

Wirklich neu ist die Database Edition allerdings nicht mehr. Schon seit 2005 ist sie als Teil der Team Suite verfügbar, was evtl. aber auch der Grund für die geringe Verbreitung sein könnte. Seit Version 2010 ist sie glücklicherweise bereits in der Professional Edition enthalten und sollte somit für die meisten Entwickler verfügbar sein.

Aufgabe der Database Edition ist es bei typischen Problemen der Datenbankentwicklung zu unterstützen:

  • Wie kann ich meine Datenbank einfach Versionieren? Im Gegensatz zu Code werden Datenbanken oft nicht in der Sourcenverwaltung verwaltet. Änderungen werden zumeist direkt auf einer Entwicklungsdatenbank vorgenommen. Es ist schwierig herauszubekommen was genau sich seit der letzten Version geändert hat.
  • Gibt es Unterschiede zwischen meinem Projekt und der Testdatenbank? Die Database Edition enthält Tools mit denen Unterschiede zwischen Projekt und Datenbank oder auch zwischen verschiedenen Datenbanken untersucht werden können. Dies beschränkt sich nicht nur auf die Struktur sondern es ist auch möglich die Unterschiede in den Daten zu vergleichen!
  • Wie deploye ich die neuste Version der Datenbank? Auch hier gibt es Tools die mir ermöglichen für die aktuelle Version Datenbank mit wenig Aufwand passende Alter Skripte zu erzeugen.
  • Wo bekomme ich valide Testdaten für meine Datenbank her? Jeder von uns kennt das Problem. Mit der Database Edition ist es recht einfach möglich, automatisiert Testdaten generieren zu lassen. Diese können auch bei einem Deployment der Datenbank gleich miterzeugt werden, z.B. für automatisierte Tests.
  • Wie kann ich meine Datenbank testen? Ja, es ist tatsächlich möglich Unit Tests für Datenbankobjekte zu schreiben!

In diesem Artikel möchte ich kurz auf die Grundlage der Database Edition eingehen: den Projekttyp des Datenbankprojektes. In nachfolgenden Artikel wird dann jeweils ein spezielles Feature näher beleuchtet.

Kern der Database Edition ist das so genannte Datenbankprojekt. In diesem werden Metainformationen aller SQL Server Objekte in Form von SQL-Skripten verwaltet. Es enthält alle Elemente der Datenbank wie Tabelle, Views, Stored Procedures, Indices, FK, Rollen, Schemas, aber auch Filegroups, Partitions und Collations. Nicht enthalten sind hingegen sind Objekte auf System Ebene wie z.B. Logins.

Alle Objekte werden dabei auf atomarer Ebene als Create oder Update .sql Script gespeichert. Atomar bedeutet, dass z.B. Schlüssel und Indizes unabhängig von der Tabelle gespeichert werden.

Das DB Projekt ist sich hierbei jederzeit über alle Abhängigkeiten zwischen den Objekten bewusst was z.B. Refactoring ermöglicht.

Die so erzeugten Skripte bilden den Source Code der Datenbank und können im Sourcenverwaltungsystem versioniert werden. Sourcecode und Datenbankcode befinden sich damit in der gleichen Solution. Dies bedeutet auch, dass zum Code auch immer die passende Datenbank vorhanden ist.

Nun aber mal ein Beispiel. Zunächst einmal erstellen wir ein neues Datenbankprojekt: File/Open/New Project/Database Project.

Hier wählen wir den SQL-Server Wizard.

Dann folgen wir dem Wizard mit Standardoptionen und wählen die gewünschte Datenbank aus:

Dann Start...

Und schon haben wir den “SourceCode” unserer Datenbank als Offline Version. Unser Datenbankprojekt sieht nun so aus:

Die so erzeugten Files können nun in der Sourcenverwaltung eingecheckt und zusammen mit dem Code in einer Solution verwaltet werden.

Im nächsten Teil erkläre ich wie man ganz einfach Änderungen zwischen Projekt und Datenbank erkennt und diese entweder in das Projekt übernimmt oder in der Datenbank ändert.

Share |

Training: Professional Scrum Developer 21.01.2011

Matthias Jauernig
Matthias Jauernig, Senior eXpert

ProfessionalScrumDeveloper_500px[1] Ende November fand bei Microsoft in Unterschleissheim (bei München) der erste einwöchige Workshop Professional Scrum Developer (.NET) in Deutschland statt, der mit der gleichnamigen Zertifizierung abschloss. Trainer war Neno Loje, der vorweggenommen seinen Job wirklich großartig gemacht hat. Im Namen der SDX habe ich selbst an diesem Workshop teilgenommen und die Woche genutzt, um mehr über sehr viele interessante Themen zu erfahren und dann auch die Zertifizierung erfolgreich abzulegen (s. Vorbericht).

Inhalt

PSD_Contents Die Profesisonal Scrum Developer-Schulung ist (wie der Name schon sagt) darauf ausgelegt, Entwickler mit Scrum und Mitteln der modernen Softwareentwicklung (Design, Tools) vertraut zu machen. Die Schulung ist dafür in 3 Teilbereiche aufgeteilt, die gemischt bearbeitet werden.

  1. Scrum: Der erste Teilbereich ist Scrum selbst. In den “Scrumdamentals” lernen die Teilnehmer den Scrum-Prozess kennen und werden in die Begrifflichkeiten von Scrum (Rollen, Artefakte, Timeboxes) eingeführt. Ein Entwickler lernt, welche Regeln den Scrum-Prozess begleiten und wie sich Scrum als iteratives Vorgehen im Vergleich zu anderen Prozessmodellen verhält. Dabei wird vor allem auch ein differenziertes Licht auf Scrum geworfen, um Hindernisse und Nachteile von Scrum zu verstehen und dann in die Praxis übertragen zu können. Gegen Ende der Schulung gab es ein separates Modul “Dysfunctions”, das sich explizit diesem Thema gewidmet hat und auch Situationen aufzeigte, in denen eine angemessene Reaktion erforderlich war. Hier war es sehr interessant zu sehen, wie Scrum nicht nur einzelne Projekte beeinflusst, sondern auch Auswirkungen auf Unternehmen selbst und ihre teils starre Denkweise hat und dass eine solche Denkweise bei Scrum schnell zu einem Hindernis werden kann.
  2. Practices: Neben Scrum kamen auch Design und Architektur von Software zur Sprache, z.B. TDD, CI, agile DB-Entwicklung, Architektur-Entwicklung und Testen allgemein. Auch wenn es hier für mich nicht viel Neues gab, so wurde doch sehr gut bereits vorhandenes Wissen aufgefrischt, was vor allem in Verbindung mit den Tools wertvoll war, welche die Softwareentwicklung im Umfeld von Visual Studio 2010 unterstützen können.
  3. Tools: Bei den Tools wurden Werkzeuge im Umfeld von Visual Studio 2010 und dem Team Foundation Server (TFS) vorgestellt, welche den Entwickler bei der agilen Softwareentwicklung unterstützen. Dazu gehörten der Architecture Explorer und das Database Project von Visual Studio ebenso wie IntelliTrace, der Microsoft Test Manager und im Zusammenhang mit TFS z.B. Gated Check-Ins und Scrum-Templates.

Durchführung

Die Inhalte wurden im Wechsel von Theorie und Praxis in mehreren “Modulen” zu jeweils einem bestimmten Thema vermittelt. Für den praktischen Teil haben wir (als 5 Teilnehmer der Schulung) Scrum in 4 Mini-Sprints direkt anwenden und unsere Erfahrungen damit machen können. Dabei haben wir den gesamten Scrumprozess mehrfach durchlaufen und aus verschiedenen Rollen (Product Owner, Scrum Master, Entwickler-Team) betrachtet. Diese Sprints waren sehr gut, um ein Gefühl für Scrum zu erhalten und auch Stolpersteine zu erkennen, die beim Einsatz von Scrum auftreten können. Persönlich konnte ich gerade aus diesem praktischen Teil viele Erfahrungen und Anregungen mitnehmen.

Scrumprozess

Ein Sprint war so angelegt, dass sich Neno die Product Owner-Mütze aufgesetzt hat (real, nicht nur metaphorisch) und uns als Entwickler-Team Anforderungen (User Stories) gestellt hat. Initial wurden im ersten Teil des Sprint Plannings diese User Stories zusammen mit dem Product Owner besprochen und die umsetzbaren Stories für den Sprint ausgewählt. Im zweiten Teil des Sprint Plannings haben wir als Entwicklerteam die Task-Planung für die umzusetzenden User Stories durchgeführt. Anschließend wurden die resultierenden Tasks im Sprint umgesetzt, der bei der Schulung je 2 Stunden dauerte und in der Realität einen Zeitrahmen zwischen 2-4 Wochen einnimmt. Innerhalb des Sprints wurden Statusmeetings, die Daily Scrums, durchgeführt und die User Stories in ein Produkt-Inkrement (“potentially shippable increment”) umgesetzt. Das Resultat wurde am Sprintende im Sprint Review dem Product Owner vorgestellt, in der Sprint Retrospective wurde schließlich im Team noch besprochen, was während des Sprints gut lief und was besser hätte laufen können.

Mein Fazit

Für mich wurden meine Erwartungen an die Schulung übertroffen. Die Tiefe und Breite der Themen war genau richtig, Neno hat man es zudem angemerkt, dass er auf Erfahrungen aus der Praxis zugreifen kann, die er auch verständlich zu vermitteln weiß. Ich kann die Schulung mit ihren Inhalten zu Scrum, Practices und Tools daher uneingeschränkt weiterempfehlen.

Ich persönlich konnte viel Wissen und auch einige Erfahrungen zu Scrum sammeln und habe ein gutes Gefühl dafür bekommen, wie sich die einzelnen Bestandteile von Scrum zu einem großen Ganzen integrieren. Ich konnte selbst erleben, wie mit der iterativen Vorgehensweise von Scrum im Vergleich zu klassischen Prozessmodellen schneller Resultate erreicht werden können und schnell auf veränderte bzw. anfangs noch nicht absehbare Anforderungen reagiert werden kann. Ich hoffe, über die bisherigen Projekte hinaus meine positiven Erfahrungen mit Scrum für SDX im Rahmen kommender Projekte einsetzen zu können.

Share |

HP und Microsoft Appliances für Business Intelligence und Sharepoint 2010 20.01.2011

Nicolas Meseth
Nicolas Meseth, Senior eXpert

HP und Microsoft arbeiten auf dem Gebiet schon länger eng zusammen. Z.B. gibt es Appliances, also eine vorkonfigurierte abgestimmte Kombination aus Hardware und Software, schon länger für die SQL Server 2008 Parallel Data Warehouse Edition. Heute wurde nun eine neue Appliance der beiden Giganten vorgestellt, die auf die Integration von Business Intelligence Inhalten mit dem Sharepoint 2010 abzielt. Hier steht das Hype-Thema Self-Service BI im Fokus, das Microsoft mit PowerPivot, das auch als Serververiante im Sharepoint 2010 hostbar ist, bedient.

Lesen Sie hier den Artikel auf ZDNET.

Share |

FileWatcher Task mit SSIS Bordmitteln 19.01.2011

Michael Beuss
Michael Beuss, Principal eXpert

Ein typisches Problem in einem produktiven Integration Services Umfeld ist das Erkennen der Fertigstellung eines vollständigen Satzes von Input-Dateien aus Quellsystemen. SSIS soll normalerweise erst starten, wenn der vollständige Satz an Quelldateien vorliegt. Üblicherweise wird der SSIS-Start produktiv jedoch zu festgelegten Zeiten ausgeführt.

Hat das Quellsystem den vollständigen Satz an Input-Dateien noch nicht erzeugt, ist der gesamte ETL-Vorgang eventuell wertlos. Ist das Quellsystem dagegen schon längere Zeit fertig, wird womöglich in der Produktion wertvolle Zeit verschenkt.

Ein Lösungsansatz liegt darin, dass das Quellsystem eine Ready-Datei als Indikator für die Bereitstellung aller Quelldateien erzeugt. SSIS muss jetzt nur noch in regelmäßigen Abständen nach dieser Datei suchen, jedoch nicht ewig warten. Es soll möglich sein, eine Uhrzeit als späteste Startzeit zu setzen. Und das geht so:

  1. Anlegen von zwei String Variablen PackageStartTime und ReadyFilePath. Diese werden beim Paketstart als Parameter gesetzt.
  2. Im Paket wird ein ForLoop Container FLC WaitForReadyFile sowie eine Boolean Variable Wait angelegt, die als EvalExpression ausgewertet wird. Im ForLoop Container wird eine Script Task SCR CheckReadyFile platziert, die u.a. diese Variable setzt.
  3. In der Script Task werden PackageStartTime, ReadyFilePath sowie die aktuelle Uhrzeit ausgewertet. Ist die Ready-Datei noch nicht vorhanden und die späteste Startzeit noch nicht erreicht, bleibt User::Wait auf False und die Loop fährt fort. Der Code verwendet dazu Thread.Sleep(). Ausschnitt:
       1: try
       2: {
       3:     // PackageStartTime (Format 00:00) in dHour und dMin aufspalten
       4:     // ...
       5:     // Späteste erlaubte Startzeit
       6:     DateTime dtMax = DateTime.Today.AddHours(dHour).AddMinutes(dMin);
       7:     // Existiert die Ready-Datei schon ?
       8:     Boolean bReadyFileExists = 
       9:         File.Exists(Dts.Variables["ReadyFilePath"].Value.ToString());
      10:     // Späteste Startzeit erreicht?
      11:     if (DateTime.Now >= dtMax)
      12:     {
      13:         Dts.Variables["Wait"].Value = false;
      14:     }
      15:     // Späteste Startzeit noch nicht erreicht, existiert Ready File schon?
      16:     else if (bReadyFileExists)
      17:     {
      18:         Dts.Variables["Wait"].Value = false;
      19:     }
      20:     // Keine der Abbruchbedingungen erfüllt. Weiter warten.
      21:     else
      22:     {
      23:         Thread.Sleep(WAITING_MINUTES * 60 * 1000);
      24:     }
      25: }
      26: catch(Exception ex)
      27: {
      28:     // Ein Fehler ist aufgetreten. Fehlerhandling + Sofort weiterlaufen
      29:     // ...
      30:     Dts.Variables["Wait"].Value = false;
      31: }
      32:  
  4. Im Anschluss an den ForLoop Container können dann die weiteren Paketobjekte angefügt werden. Das Paket sieht jetzt beispielsweise so aus: Package
  5. Am Ende der Paketausführung nicht vergessen die Ready-Datei wieder zu löschen falls immer der gleiche Name dafür verwendet wird.
  6. Beim Starten des Paketes mit dem SSIS Execute Package Utility können die angesprochenen Paketvariablen mit der Option /SET gesetzt werden.

Ergebnis: Nach dem Starten des Paketes verbleibt die Ausführung so lange in der ForLoop bis die späteste Startzeit erreicht ist oder die Ready-Datei bereitgestellt wurde. Danach wird die weitere Verarbeitung fortgesetzt.

Fazit: Bereits mit SSIS-Bordmitteln lässt sich eine produktionsfähige Filewatcher-Funktionalität aufbauen. Custom Components wie z.B. Konesans Filewatcher Task sind hierzu nicht unbedingt erforderlich. Damit gestaltet sich die Produktivnahme besonders einfach und flexibel.

Share |

HTML5 – Die Grenzen 17.01.2011

Alexander Jung
Alexander Jung, Chief eXpert

Die Chancen von HTML5 habe ich bereits ausgeführt, aber um HTML5 ranken sich auch viele überzogene Erwartungen.

Anmerkung: Dies ist Teil einer kleinen Serie, der erste Beitrag mit Übersicht findet sich hier.

Kommen wir nochmal zur Frage zurück…

“Will HTML 5 one day make Flash, Silverlight and other plug-in technologies obsolete?” (link)

Tatsächlich wird mir genau diese Frage in Diskussionen immer wieder gestellt. Oder sie wird gleich zur Behauptung umformuliert… .

Ich habe ja bereits ausgeführt, dass HTML5 mit Video und Canvas Aufgaben übernimmt, die bislang vornehmlich von Flash abgedeckt wurden. Genaugenommen geht es dabei aber gar nicht um RIA-Themen, vielmehr gab es bislang schlicht keine Technologie außer eben Flash, die dank ihrer Fähigkeiten und Verbreitung diese Anforderungen erfüllen konnte. Dass mit Flash eine RIA-Technologie diese Lücken füllen konnte ist im Grunde Zufall.

Microsoft trat mit Silverlight zunächst als Flash-Konkurrent auf. Aber auch wenn die Verbreitung des Silverlight-Plugins kontinuierlich steigt, konnte Silverlight sich in diesen typischen Anwendungsfällen nie ernsthaft gegen Flash positionieren. Auch das dürfte mit eine Motivation für das deutliche Bekenntnis von Microsoft zu HTML5 sein.

Schauen wir also, wo in den verschiedenen Bereichen HTML5 an seine Grenzen gerät und RIA Technologien punkten können.

Das wirft zunächst die Frage nach einer Definition des Begriffs “RIA” bzw. “RIA-Technologie” auf. Selbst Wikipedia hatte noch vor einem Jahr eine recht breite Definition der entsprechenden Technologien, die u.a. AJAX-Frameworks einschloss, spricht aber heute von Flash, Java und Silverlight.

Ich mache die Definition von RIA gerne an der Frage “zustandsbehaftetes, seitenübergreifendes Programmiermodell für Anwendungen, die im Browser/in einer Sandbox laufen” fest. Oder in Technologien: Flash (AIR), JavaFx, Silverlight (als Browser-Plugin/Out-of-Browser; nicht aber als Plattform, etwa in WP7).

Dass HTML/AJAX dabei außen vor bleibt ist in keinster Weise abwertend gemeint, es gibt lediglich die übliche Abgrenzung in der Diskussion wieder.

Web-Anwendungen

HTML5 wird die Standardanforderungen von Web-Anwendungen abdecken, und damit viele Dinge anbieten, die heute von Flash bedient werden. Das wird zweifellos ein Zurückdrängen von RIA Technologien zur Folge haben. Aber genau dort wo Anforderungen über das übliche Maß hinausgehen werden diese Ihre Nische finden – eine Nische in der noch genügend Raum für Innovation bleibt:

Bezüglich Video werden die Hersteller durchaus darauf achten im zukünftig sicher wichtiger werdenden Markt WebTV und HD-Videos Alleinstellungsmerkmale bieten zu können.

Da Flash nicht mehr den Vorteil der alleinigen oder der breiten Verfügbarkeit für sich verbuchen kann, werden in diesem Bereich sicher auch Karten zwischen den verschiedenen Technologien neu verteilt. Gerade Silverlight hat hier mit den Olympischen Spielen oder maxdome gut vorgelegt.

Ähnliches gilt für komplexe Controls, die mit Canvas und JavaScript einfach nicht mehr sinnvoll umsetzbar sind. Beispiel Mazda; oder auch Datenauswertungen.

Und schließlich sind da die Unterstützung von Hardware (Kamera, Game-Controller), spezielle Features (Animationen, 3D), und ganz generell die höhere Innovationsgeschwindigkeit, mit der die Hersteller agieren können.

Gemeinsam ist diesen Szenarien, dass der Anwender sich auf die Nutzung des jeweiligen Plugins einlassen muss. Für den Anbieter ist dies immer mit der Abwägung verbunden, ob er sein Angebot exklusiv daran binden kann (etwa weil es faktisch alternativlos ist, Beispiel HD-Videos), oder ob er (um Kunden nicht zu verprellen) eine einfachere Alternativ-Variante anbieten muss.

RIA-Anwendungen

Auch HTML5 wird aus HTML keine RIA Technologie machen. HTML5 bringt kein neues Programmiermodell, es ändert nichts an der rein serverseitigen Verarbeitung, am Page-Modell, an Postbacks.

Für viele Anwendungen – gerade auch Line-of-Business-Anwendungen – kommt HTML zu schnell an seine Grenzen. Typische Anforderungen sind dabei:

  • Datenlastigkeit: Umgang mit großen Datenmengen; Eingabe und Bearbeitung mit komplexen Validierungen, Listendarstellungen mit erweiterten Funktionalitäten, etc..
  • Usability: Schnelle Rückmeldung (ohne Postback!), dynamische Benutzerführung, dynamischer Maskenaufbau oder Anpassung während der Eingabe, …
  • Business-Funktionalitäten: Drucken, grafische Aufbereitung, Integration mit Office-Produkten.
  • Offline-Fähigkeit
  • Connectivity: Unterstützung verschiedener Netzwerkprotokolle (z.B. security, duplex)
  • Multimedia und Hardware-Unterstützung: Animationen, Kamera, Mikrofon, Multitouch, …
  • Entwicklungsplattform: Stateful Programmiermodell, Komponentenmodell, Controls, Databinding, …

Damit sind sicher nicht die typischen Web-Anwendungen für die breite Masse gemeint, aber z.B. Intranet-Anwendungen, oder Anwendungen für einen geschlossenen Benutzerkreis. Ein prominentes Beispiel ist SAP, ebenso sind Homebanking- oder andere Anwendungen für einen geschlossenen Kundenkreis denkbar. In der Vergangenheit wurde dies oft – mehr schlecht als recht – über Java Applets gelöst; heute findet man häufiger AJAX-Ansätze, die das gesteckte Ziel aber nicht erreichen können. Tatsächlich hat (nur) Microsoft mit Silverlight eine ideale Plattform für LOB-Anwendungen anzubieten. Adobe AIR hat im Gegensatz zu Flash eine deutlich geringere Verbreitung. Und JavaFx scheint einen langsamen Tod zu sterben.

Fazit

HTML5 wird ganz generell RIA-Technologien aus ihrer Rolle als Lückenbüßer für bislang fehlende Funktionalitäten (Video, Canvas) zurückdrängen. Auf die Notwendigkeit eines Einsatzes von RIA-Technologien in speziellen Web-Szenarien und in LOB-Anwendungen bzw. bei RIA-Anwendungen ganz allgemein wird das aber keine Einfluss haben.

Da HTML5 aber gerade auch als Waffe gegen die vorherrschende Stellung von Flash ins Feld geführt wird, kann es durchaus den Markt der RIA Technologien aufmischen. Nimmt man noch die unsichere Zukunft von JavaFx hinzu, so spielt diese Entwicklung am ehesten Microsoft in die Hände. Silverlight profitiert in diesem Bild zusätzlich davon, dass die Technologie nicht auf RIA beschränkt ist, sondern als Plattform für Devices in weitere Bereiche vordringt (WP7, WebTV).

Neben diesem indirekten Effekt auf RIA-Technologien wird HTML5 aber eine Eigenschaft haben, die vermutlich keine RIA-Technologie absehbar aufbieten kann: Es wird – bei allen Einschränkungen – auf jeder Plattform verfügbar sein.

Was heißt das also?

Als Gesamtfazit dieser kleine Serie kann man also schließen: Das Gegeneinander von HTML5 und RIA, das von manchen herbeigeredet wird, existiert im Grunde nicht. Bestenfalls gibt es ein HTML5 gegen Flash, aber auch das ist mag anders ausgehen als es vordergründig erscheint. Tatsächlich ergänzen sich beide Ansätze und jede Technologie hat zudem ihren Bereich, in dem die jeweils andere wenig Sinn macht. Beispiele:

  • Eine Webanwendung die für eine möglichst großer Anwenderschaft im Internet verfügbar sein soll? HTML5.
  • Eine LOB-Anwendung, die deutlich höhere Anforderungen an Mächtigkeit und Usability stellt? Silverlight.
  • Eine mobile Anwendung, die breit verfügbar sein soll? HTML5. Außer man benötigt eine engere Integration in das Device, dann führt kein Weg an den diversen Plattformen vorbei.

Und zwischen diesen pauschalen Hinweisen bleibt jede Menge Platz für Einzelfallentscheidungen. Wichtig ist dabei wie so oft nur, dass es informierte Entscheidungen sind.

Share |

InfoWorld: Silverlight ist beste RIA-Plattform 14.01.2011

Matthias Jauernig
Matthias Jauernig, Senior eXpert

Silverlight hat von InfoWorld 2011 die Auszeichnung als beste RIA-Plattform erhalten und schlägt damit Flash/AIR/Flex/JavaFx. Silverlight wird vor allem in den Bereichen Development Tools, Integration und allgemeinem Anwendernutzen gelobt:

Right now, we favor Silverlight. In the two categories most important to decision makers -- developer tools and design integration -- Silverlight trumps Flash/AIR/Flex. The toolset in Microsoft Visual Studio 2010 is demonstrably excellent, and Microsoft Expression Blend bridges the design-development gap much better than Adobe Flash Catalyst.

http://www.infoworld.com/d/infoworld/infoworlds-2011-technology-the-year-award-winners-285&current=19

Auch in einem ausführlichen Review von InfoWorld Silverlight vs. Flash müssen sich Flash/AIR gegenüber Silverlight geschlagen geben:

http://www.infoworld.com/d/developer-world/infoworld-review-microsoft-silverlight-4-vs-adobe-flash-101-260

Share |

HTML5 – Neuer Standard für Webanwendungen

Alexander Jung
Alexander Jung, Chief eXpert

Alle Welt redet über HTML5, aber was steckt eigentlich dahinter? Was ist die Bedeutung von HTML5, wo liegt das Potential?

Anmerkung vorne weg: Dies ist Teil einer kleinen Serie, der erste Beitrag mit Übersicht findet sich hier.

HTML5 ist viele Dinge für viele Leute. Video in HTML5 wird zum Vehikel um das Web von patentierten Video-Formaten zu befreien. Für Apple ist es ein Mittel, Flash von iPhone und iPad fern zu halten. Microsoft nutzt HTML5 um den IE9 zu puschen. Und nebenbei soll auch noch RIA-Technologien ganz allgemein der Garaus gemacht werden. Was habe ich vergessen… ? Ach ja, es gibt auch Leute, die sich inhaltlich damit auseinander setzen.

Ganz gegen den Trend hier ein Betrachtung, was sich hinter dem Namensschild “HTML5” tatsächlich verbirgt, und was es in Zukunft bedeuten kann.

Der Standard

Formal gesehen ist HTML5 die nächste Version von HTML, fasst darunter aber nicht mehr nur die aus HTML 4.1 bekannte Markup-Sprache selbst, sondern auch die vormals getrennt betrachteten Standards XHTML und DOM.

Nachdem HTML 4.0 bereits 1997 verabschiedet wurde, könnte man sagen: Wurde aber auch Zeit! Die Tatsache, dass HTML 4.x nicht mehr auf der Höhe der Zeit ist, hat uns genau die Situation beschert, dass die Browserhersteller unterschiedliche Süppchen kochen und Technologien wie Flash – oder vielfach auch noch ActiveX – die Lücke füllen müssen.

HTML5 liegt seit Oktober als Working Draft vor und wird zur Zeit von den Browserherstellern angegangen:

Bei der Unterstützung von HTML5 ist man sich also grundsätzlich einig, im Detail muss man aber aufpassen, welche Browser-Version welche Anteile von HTML5 in welchem Maße unterstützt. Es wird noch etwas dauern, bis hier eine verlässliche Basis auf breiter Front vorhanden sein wird.

Die Details

Inhaltlich betrachtet ist HTML5 ein Sammelsurium unterschiedlicher Verbesserungen und Neuerungen. Da sind zunächst die beiden in aller Regel genannte Dinge: Video und 2D-Grafiken (a.k.a. “Canvas”).

Die Video-Funktionalität bringt nichts Besonderes oder Überraschendes mit sich. Sie stellt einfach Videos dar, aber ohne dabei auf spezifische Plug-Ins angewiesen zu sein. Der Vorteil für den Webentwickler ist eine einheitliche Schnittstelle (HTML und JavaScript), und die Tatsache, dass er sich nicht in eine weitere Technologie einarbeiten muss. Der Vorteil für den Anwender ist, dass er sich das Video anschauen kann, unabhängig davon, auf welchem Gerät und welche Plug-Ins ihm zur Verfügung stehen.

Mittels Canvas lassen sich 2D-Grafiken darstellen, ergänzt um JavaScript auch animiert. Damit lassen sich prinzipiell weitere Anwendungsfälle adressieren, die heute primär von Flash abgedeckt werden: Diagramme, etwa Nutzungsstatistiken, Aktienkurse oder ähnliches; im Gegensatz zu einfachen Images auch mit Benutzerinteraktion. Aber auch komplexere Dinge wie etwa Web-Games (heute ebenfalls oft in Flash gelöst) sind möglich, wie dieser Klassiker beweist.

Im Multimediabereich muss man ergänzend noch Audio Unterstützung nennen.

Video und 2D-Grafiken werden deshalb so oft und gerne genannt, weil sie die typischen Einsatzszenarien von Flash darstellen. Dennoch sollte man HTML5 nicht darauf reduzieren.

Für die klassische HTML Erstellung bringt HTML5 eine Reihe von Verbesserungen bei der JavaScript-Steuerung, sowie bei der semantischen Auszeichnung des Inhalts (etwa “Header” und “Footer”).

Bzgl. Benutzerinteraktion kommen neue Typen von Formularfeldern, bei denen der Browser spezielle Darstellungen wählen kann (etwa einen Date-Picker), oder auch die Format-Validierung übernimmt (etwa bei einer Email-Adresse). Aber auch APIs für drag-and-drop, browser history management, und einige Kleinigkeiten mehr.

Details nachzulesen beim W3C oder auf wikipedia. Einen schönen und illustrierten Überblick bietet http://www.drweb.de/magazin/html5-ueberblick/.

Aber auch hier ist noch nicht Schluss. Dazu kommen verwandte Themen, die nominell nicht zu HTML5 gehören aber oft im Zusammenhang genannt werden: CSS3, Web Storage und gerade für mobile Anwendungen Geolocation.

Nicht unwesentlich in diesem Zusammenhang sind auch die Verbesserungen der JavaScript Engines, der gängigen Browser (in Microsofts Fall ab IE9…), denn viele dieser Einzelpunkte entfalten erst im Zusammenhang mit Scripting ihr Potential. Mit HTML5 dürfte eine weitere Zunahme von Scripting allgemein bzw. auf entsprechenden AJAX-Frameworks basierende Anwendungen im Besonderen einhergehen.

Die Bedeutung

Bei Licht betrachtet ist HTML5 ein bunter Mix aus sehr unterschiedlichen Dingen. Dabei sind nicht mal sonderlich herausragende Themen enthalten. Im Grunde wird HTML nur auf den aktuellen Stand der Technik gehoben, indem typische, seit langem vorhandene Anforderungen aufgenommen werden. In Summe also eine (längst überfällige und daher vielleicht etwas umfangreichere) Evolution, aber sicher keine Revolution oder ein “groundbreaking upgrade” (link).

Die Bedeutung von HTML5 liegt mithin nicht in den Funktionalitäten selbst. Sie liegt in zwei Dingen:

  1. Der breiten Unterstützung seitens der Browserhersteller. Aus welcher Motivation diese auch immer hinter HTML5 stehen sei dahingestellt, aber eine derart breite und ernst gemeinte Unterstützung gab es in dieser Form noch nicht. Das wird auch dazu führen, dass sich die Browser wieder auf vergleichbarem Leistungsniveau und Funktionsumfang einpendeln – durchaus wichtig um eine Verzettelung und Inkompatibilitäten (wie wir sie heute haben) im Web zu verhindern. Damit wird es mit HTML5 wieder eine Plattform für Webanwendungen geben, die dem Stand der Technik entspricht und die breit verfügbar ist.
     
  2. Der zeitlichen Nähe zur Entwicklung im an Bedeutung gewinnenden mobilen Bereich (Smartphones und Pads). In diesem Bereich sind die Plattformen deutlich inhomogener, als das im Desktopbereich der Fall ist (iOS, Android, WP7, dazu Desktop-Betriebssysteme für Pads). Daher wird Webanwendungen für mobile Clients eine deutlich höhere Bedeutung zukommen. Selbst wenn HTML5 nicht die volle Geräteintegration (etwa Telefon-Integration oder Multitouch) bieten kann, wird es die einzige übergreifend verfügbare Plattform sein. Die besondere Unterstützung durch Web Storage, Geolocation und rudimentäre Offline-Fähigkeit wird dazu ein Übriges tun.

HTML5 wird also nicht nur ein akademischer, sondern ein echter Industriestandard werden. Zusammen mit Verbesserungen der JavaScript Engines gängiger Browser wird HTML damit wieder zu einer adäquaten Entwicklungsplattform für Webanwendungen auf der Höhe der Zeit. Und der wachsenden Bedeutung mobiler Szenarien wird ebenfalls Rechnung getragen.

Um der Vollständigkeit halber auch den letzten Kritikpunkt aus dem Weg zu räumen: Von Kritikern wird gerne ins Feld geführt, dass HTML5 gerade mal ein erster Working Draft ist und mit dem Status als “W3C Recommendation” erst für 2022 gerechnet wird.

Selbst wenn es tatsächlich noch so lange dauern sollte – was keineswegs sicher ist – ist das aus praktischen Erwägungen heraus völlig belanglos. Viele Einzelaspekte von HTML5 werden in naher Zukunft breit und stabil über alle relevanten Browser hinweg verfügbar sein. Faktisch kommt dies einer Standardisierung gleich.

Für Web-Entwickler ist HTML5 also eine gute Nachricht. Jedenfalls solange die Einigkeit der Browserhersteller anhält – und wir nicht wieder 10 Jahre auf die nächste Evolution warten müssen.

Share |

Viele Wege führen nach Rom (IEqualityComparer) 12.01.2011

Sebastian Weber
Sebastian Weber, Senior eXpert

Für ein Problem gibt es häufig viele Lösungen.Für kaum ein Arbeitsfeld gilt das so sehr wie für die Informatik, wo es häufig dutzende konkurrierender Ansätze gibt. Ein Beispiel dafür, wie mannigfaltig das Spektrum an Lösungen sein kann, zeigte sich kürzlich in einem Projekt, als es darum ging ein Kreuzprodukts über einen selbstgeschriebenen Datentypen zu erzeugen. Für dieses spezielle Kreuzprodukt gilt das aus der Mathematik bekannte Kommutativgesetz (a*b = b*a). D.h. für eine Kombination aus zwei Objekten dieses Typs ist es gleich, ob man ein Paar (InstanzA, InstanzB) oder das “umgekehrte” Paar (InstanzB, InstanzA) vor sich hat.

Mittels Linq ist es ein Leichtes, ein solches Kreuzprodukt zu berechnen:

var crossProduct = from b1 in blocks
                  from b2 in blocks
                  where b1.Id != b2.Id &&
                          b1.Length + b2.Length <= parameters.MaximumSizeInMeters &&
                          b1.Weight + b2.Weight <= parameters.MaximumWeightInTons
                  select new { Block1 = b1, Block2 = b2 };

Allerdings erhält man hierdurch beide Paare (A,B) und (B,A). Es böte sich an dieser Stelle an, mit einem Aufruf der Extension-Methode Distinct(), alle Duplikate herauszufiltern.

Diese Methode funktioniert zwar prinzipiell mit anonymen Datentypen (also den Objekten, die ich mittels new {Block1, Block2} erzeuge). Es gibt jedoch keinen (direkten) Weg, der Abfrage beizubringen, dass die Reihenfolge der Elemente eines Paares in diesem Fall keine Rolle spielt.

Für die Methode Distinct() gibt es aber eine Überladung, die einen Parameter vom Typ IEqualityComparer<T> erwartet. Implementierungen dieses Interface werden verwendet um Objekte auf Gleichheit zu prüfen und funktionieren analog zum Überschreiben der Methoden Equals() und GetHashCode(). Der Vorteil ist, dass man diese Comparer jederzeit austauschen kann, wohingegen Änderungen an den überschriebenen Methoden immer mit Vorsicht zu genießen sind, weil schnell unerwartete Seiteneffekte auftreten.

Doch zunächst einmal braucht man eine Implementierung von IEqualityComparer<T>, der man on-the-fly Vergleichs- und Hashfunktion mitgeben kann. Diese Implementierung heißt LambdaEqualityComparer:

public class LambdaEqualityComparer<T> : EqualityComparer<T>
{
   private readonly Func<T, T, bool> equals;
   private readonly Func<T, int> hash;

   public LambdaEqualityComparer(Func<T, T, bool> equals)
       : this(equals, obj => obj.GetHashCode())
   {
   }

   public LambdaEqualityComparer(Func<T, T, bool> equals, Func<T, int> hash)
   {
       if (equals == null) throw new ArgumentNullException("equals");
       if (hash == null) throw new ArgumentNullException("hash");

       this.equals = equals;
       this.hash = hash;
   }

   public override bool Equals(T x, T y)
   {
       if (x == null) throw new ArgumentNullException("x");
       if (y == null) throw new ArgumentNullException("y");

       return equals(x, y);
   }

   public override int GetHashCode(T obj)
   {
       if (obj == null) throw new ArgumentNullException("obj");

       return hash(obj);
   }
}

Und um diesen für anonyme Typen verwenden zu können kommt ein weiteres Feature aus .NET3.0 zum Einsatz: Extension-Methoden.

public static class EnumerableExtensions
{
   public static IEnumerable<T> Distinct<T>(this IEnumerable<T> items,
       Func<T, T, bool> equals, Func<T, int> hash)
   {
       if (items == null) throw new ArgumentNullException("items");
       if (equals == null) throw new ArgumentNullException("equals");
       if (hash == null) throw new ArgumentNullException("hash");

       return items.Distinct(new LambdaEqualityComparer<T>(equals, hash));
   }
}

Damit kann man folgende Abfrage definieren, die das Kreuzprodukt mit lediglich einem Repräsentanten jeder Kombinationsmöglichkeit liefert:

var crossProduct = (from b1 in blocks
                   from b2 in blocks
                   where b1.Id != b2.Id &&
                           b1.Length + b2.Length <= parameters.MaximumSizeInMeters &&
                           b1.Weight + b2.Weight <= parameters.MaximumWeightInTons
                   select new { Block1 = b1, Block2 = b2 })

                   .Distinct((x, y) =>
                                       {
                                           if (x.Block1.Id == y.Block1.Id && x.Block2.Id == y.Block2.Id)
                                               return true;

                                           if (x.Block1.Id == y.Block2.Id && x.Block2.Id == y.Block1.Id)
                                               return true;

                                           return false;
                                       },
                                                  
                               x => x.Block1.Id.GetHashCode() ^ x.Block2.Id.GetHashCode());

Diese Lösung verwendet einige Bausteine aus dem .NET 3.x Feature-Set und zeigt durchaus eindrucksvoll, wie mächtig diese Funktionen sein können. Allerdings leidet durch die Verschachtelung der Abfragen für das eigentliche Kreuzprodukt und der Vergleichslogik die Lesbarkeit sehr stark. Eine sehr viel leichter zu durchschauende Lösung würde entstehen, wenn man den Comparer durch ein simples new() erzeugen, und als Parameter verwenden könnte. Dafür müsste man allerdings auf die Verwendung von anonymen Typen verzichten. Eine solche Lösung sähe dann folgendermaßen aus:

[DebuggerDisplay("{Block1.Id} {Block2.Id}")]
public class BlockPair
{
   public Block Block1 { get; set; }
   public Block Block2 { get; set; }
} 

Steht statt eines anonymen Typen ein deklarierter .NET-Datentyp zur Verfügung, so kann auch der Comparer durch eine spezifische, dafür aber einfachere, Implementierung ersetzt werden.

public class CompareCrossProduct : IEqualityComparer<BlockPair>
{
   public bool Equals(BlockPair x, BlockPair y)
   {
       if (x.Block1.Id == y.Block1.Id && x.Block2.Id == y.Block2.Id)
           return true;

       if (x.Block1.Id == y.Block2.Id && x.Block2.Id == y.Block1.Id)
           return true;

       return false;
   }

   public int GetHashCode(BlockPair x)
   {
       return x.Block1.Id.GetHashCode() ^ x.Block2.Id.GetHashCode();
   }
} 

Und so erhält man wieder eine deskriptive Abfrage, die man nicht erst gedanklich kompilieren muss, um sie zu verstehen:

var crossProduct = (from b1 in blocks
                   from b2 in blocks
                   where b1.Id != b2.Id &&
                         b1.Length + b2.Length <= parameters.MaximumBlockSizeInMeters &&
                         b1.Weight + b2.Weight <= parameters.MaximumBlockWeightInTons
                   select new BlockPair { Block1 = b1, Block2 = b2 })
                  .Distinct(new CompareCrossProduct());

Einen Pferdefuß haben allerdings beide Lösungen noch. Durch den Vergleich b1.Id != b2.Id handelt es sich immer um eine Abfrage mit quadratischer Komplexität O(n2). Mit dieser Überlegung im Hinterkopf ergibt sich noch eine dritte Lösung. Durch zwei ineinander geschachtelte Schleifen kann man die die Prüfung der Paarungen geschickt umgehen.

List<Block> blockList = new List<Block>(blocks);
List<BlockPair> crossProduct = new List<BlockPair>();

for (int i = 0; i < blockList.Count; i++)
{
   for (int j = i + 1; j < blockList.Count; j++)
   {
       Block b1 = blockList[i];
       Block b2 = blockList[j];

       if (b1.Length + b2.Length <= parameters.MaximumSizeInMeters &&
           b1.Weight + b2.Weight <= parameters.MaximumWeightInTons)
       {
           crossProduct.Add(new BlockPair { Block1 = b1, Block2 = b2 });
       }
   }
} 

Keine Lambdas, kein Linq. Technologisch vollkommen unaufgeregt. Und doch funktioniert dieser Ansatz mindestens genauso gut, wie die beiden vorherigen. Die innere Schleife beginnt eine Position hinter dem aktuellen Laufindex der äußeren zu zählen. Dadurch kommen keine Permutationen bei der Kombination zustande und man kann zwei Instanzen des Datentyps, die die vorgegebenen Rahmenbedingungen einhalten, ganz einfach miteinander verknüpfen.

Wie man deutlich sieht erlauben neue Technologien dem Entwickler erhöhten Freiraum bei der Umsetzung von Anforderungen. Viele Aufgaben lassen sich komfortabler und schneller lösen. Doch wie so häufig gilt auch hier, dass man genau abwägen muss, ob eine technologisch machbare Lösung zugleich auch eine für das Projekt vorteilhafte ist.

Share |

HTML5 – Der Hype 10.01.2011

Alexander Jung
Alexander Jung, Chief eXpert

Um HTML5 gibt es seit einiger Zeit einen kleinen Hype. Auch wenn HTML5 schon jetzt auf eine durchaus bewegte Historie zurückblicken kann (seien es die Querelen organisatorischer Natur im Vorfeld, oder das Rangeln um ein Videoformat) erhielt dieser Hype sicher einen besonderen Aufschwung durch die Haltung Apples, Flash nicht auf iPhone und iPad haben zu wollen. Und spätestens seit der PDC im Oktober macht auch Microsoft erkennbar ernst mit HTML5.

Und das ist gut so, gerade auch für den mobilen Bereich. Denn dieser ist bzgl. der Plattform weitaus inhomogener, als der normale Web Client, wird aber in Zukunft immer wichtiger.

Gleichzeitig stelle ich aber auch immer wieder fest, dass es um HTML5 und das, was es zu leisten im Stande ist, eine Menge Missverständnisse gibt. Das liegt sicher auch an der oft geführten Diskussion um HTML5 und RIA, bei der HTML5 oft als legitimer Nachfolger aller RIA Technologien hochstilisiert wird:

“HTML5, a groundbreaking upgrade to the prominent Web presentation specification, could become a game-changer in Web application development, one that might even make obsolete such plug-in-based rich Internet application (RIA) technologies as Adobe Flash, Microsoft Silverlight, and Sun JavaFX.” (link)

“Will HTML 5 one day make Flash, Silverlight and other plug-in technologies obsolete? Most likely, but unfortunately that day is still quite a way off.” (link)

“Sure maybe today, we have to rely on these proprietary browser plugins to deliver content to users, but the real innovative developers and companies are going to standard on HTML 5 and in turn revolutionize how users interact with data.  We all want faster web applications and the only way to deliver this is to use HTML 5.” (link)

Um es gleich deutlich sagen: HTML5 kann diesen Anspruch nicht erfüllen. HTML ist keine RIA Technologie und wird es auch mit HTML5 nicht werden.

Andererseits kann HTML5 aber unbestreitbar Fortschritte in Bereichen machen, die heute von RIA Technologien – insbesondere Flash – besetzt sind.

Wo also liegt nun die Wahrheit? Ist HTML5 tatsächlich – und ausschließlich, wie es oft den Anschein hat – angetreten, RIA Technologien zu ersetzen?

Um im Einzelfall einschätzen zu können, was HTML5 tatsächlich zu leisten im Stande ist, in welchen Anwendungsfällen es die richtige Wahl ist, und wo eben doch wieder RIA-Technologien ins Spiel kommen, ist eine deutlich differenzierter Betrachtung nötig…

… die aber den Rahmen eines einzelnen Beitrags sprengen würde. Daher bis hierher als Einleitung zum Thema. Chancen und Grenzen werden in folgenden Beiträgen beleuchtet:

  • HTML5 – Neuer Standard für Webanwendungen (link)
  • HTML5 – Die Grenzen (link)

Share |

Powerpoint 2010 und Broadcasting 07.01.2011

Patric Schouler
Patric Schouler, Chief eXpert

Wer kennt es nicht? Eine überfüllte Konferenz, man sitzt in der letzten Reihe und hat sein Opernglas vergessen, um die Folien auf der kleinen Präsentationsfläche entziffern zu können.

Powerpoint 2010 bietet hier ein Feature, was Abhilfe schaffen könnte: Broadcasting der Präsenation an die Teilnehmer.

image

Diese neuere Funktion in PowerPoint ermöglicht die Übertragung der Präsentation an Personen an einem oder mehreren Standorten. Dies erleichtert nicht nur Telefonkonferenzen, sondern kann auch bei Konferenzen dazu genutzt werden, um die Präsentation auf die mobilen Geräte der Teilnehmer zu übertragen. Windows Phone 7 unterstützt dies z.B. ohne weiteren Konfigurationsaufwand. Einfach auf den versendeten Link klicken.

Der nachfolgende Link beschreibt, welche Vorbereitungsarbeiten zur Verwendung dieses Features zu leisten sind:

PowerPoint 2010 Broadcast to WP7 | Windows Phone Central

Share |

Microsoft verlost XBOX 360 gegen Ihre Einschätzung zu BI in der Cloud 06.01.2011

Nicolas Meseth
Nicolas Meseth, Senior eXpert

Microsoft tauscht Einschätzungen zu den Chancen/Risiken von Business Intelligence Anwendungen in der Cloud mit SQL Azure gegen die Chance eine XBOX 360 mit KINECT zu gewinnen:

http://blogs.technet.com/b/sqlman/archive/2011/01/05/fill-out-cloud-bi-survey-and-win-xbox-360-with-kinect.aspx

Mit den bald erscheinenden Reporting Services in der Cloud als integrierter Dienst in SQL Azure startet Microsoft mit seinem ersten BI Produkt gen Himmel. Es wird interessant sein zu sehen, welche Produkte folgen werden. Interessant wird sicher auch, welche neuen Anwendungen und Szenarien sich für Business Intelligence in der Cloud ergeben werden. Teilen Sie uns Ihre Meinung mit, und nicht vergessen, nehmen Sie an der Umfrage teil!

Share |

WinForms/C#: Anwendung in der Taskleiste "blinken" lassen 05.01.2011

Matthias Jauernig
Matthias Jauernig, Senior eXpert

Implementiert man als Entwickler eine WinForms-Anwendung, die einen langlaufenden Prozess beinhaltet (z.B. zum Import größerer Datenmengen), so stellt sich die Frage, wie der Abschluss des Prozesses dem Anwender bekannt gemacht wird.

Langlaufende Prozesse wird ein Anwender zwar initial anstoßen, dann aber zu anderen Aufgaben übergehen und die Anwendung in den Hintergrund verlagern. Daher ist es oftmals sinnvoll, den Abschluss des Prozesses durch “Blinken” des Anwendungssymbols in der Taskleiste deutlich zu machen.

Hier kommt man mit WinForms-Mitteln allein nicht aus und muss auf Win32-API-Funktionen zurückgreifen. Folgender Code realisiert z.B. ein dauerhaftes Blinken des Anwendungs-Icons in der Taskleiste, bis die Anwendung in den Vordergrund geholt wird:

   1: public static class FlashWindowHelper
   2: {
   3:     #region Helper Structures
   4:         
   5:     [StructLayout(LayoutKind.Sequential)]
   6:     private struct FLASHWINFO
   7:     {
   8:         public uint cbSize;
   9:         public IntPtr hwnd;
  10:         public uint dwFlags;
  11:         public uint uCount;
  12:         public uint dwTimeout;
  13:     }
  14:  
  15:     #endregion
  16:  
  17:     #region Win32 API Members
  18:         
  19:     [DllImport("user32.dll")]
  20:     [return:MarshalAs(UnmanagedType.Bool)]
  21:     private static extern bool FlashWindowEx(ref FLASHWINFO pwfi);
  22:     public const uint FLASHW_ALL = 3;
  23:     public const uint FLASHW_TIMERNOFG = 12;
  24:         
  25:     #endregion
  26:         
  27:     #region Public Methods
  28:         
  29:     public static bool Flash(Form form)
  30:     {
  31:         // funktioniert nur unter Windows 2000 oder sp„ter
  32:         if (IsWin2000OrLater())
  33:         {
  34:             FLASHWINFO fi = Create_FLASHWINFO(form.Handle, FLASHW_ALL | FLASHW_TIMERNOFG, uint.MaxValue, 0);
  35:             return FlashWindowEx(ref fi);
  36:         }
  37:         return false;
  38:     }
  39:         
  40:     #endregion
  41:         
  42:     #region Private Helper Methods
  43:         
  44:     private static FLASHWINFO Create_FLASHWINFO(IntPtr handle, uint flags, uint count, uint timeout)
  45:     {
  46:         FLASHWINFO fi = new FLASHWINFO();
  47:         fi.cbSize = Convert.ToUInt32(Marshal.SizeOf(fi));
  48:         fi.hwnd = handle;
  49:         fi.dwFlags = flags;
  50:         fi.uCount = count;
  51:         fi.dwTimeout = timeout;
  52:         return fi;
  53:     }
  54:         
  55:     private static bool IsWin2000OrLater()
  56:     {
  57:         return Environment.OSVersion.Version.Major >= 5;
  58:     }
  59:         
  60:     #endregion
  61: }

Auf diese Weise kann die gewünschte Funktionalität leicht implementiert werden. Die Grundstruktur dieser Klasse stammt von C#: Flash Window in Taskbar via Win32 FlashWindowEx

Share |