.
Anmeldung | Registrieren | Hilfe

.NET-Blogs Archiv Mai 2010

Ein perfekter Tag in der .NET Community

31.05.2010 23:43:11 | Jan Welker

dnc2010_1 Nach dem ich nach der dotnet Cologne 2010 noch ein paar Tage in NRW verbracht habe, komme ich heute endlich dazu über die Community Konferenz zu schreiben.
Leider ist es fast unmöglich irgendetwas zu berichten was nicht schon von anderen veröffentlicht wurde, denn die positive Resonanz auf dieses Entwicklerevent war überwältigend wie die folgende Liste von Blogbeiträgen, Bildergalerien und Artikeln belegt.

Wie schon im letzten Jahr haben die beiden Usergroups DNUG Köln und Bonn-to-Code.net hervorragende organisatorische Arbeit geleistet. Hinter den Namen der Usergroups stecken als Organisatoren Albert Weinert, Roland Weigelt sowie Stefan Lange. Unterstützt wurden die drei in den letzen Wochen von Melanie Eibl.

Die ersten beiden Vorträge, die ich besuchte, wurden von Rainer Stropek gehalten, er erklärte die Möglichkeiten von Windows Azure und stelle kritisch alle Vor- und Nachteile der Cloud Computing Plattform gegenüber. Ganz nebenbei entwickelte er eine Hello World Webseite und veröffentlichte diese in einem Europäischen Azure Rechenzentrum.

dnc2010_3 Da ich mit dem Thema MSBuild noch nicht sehr vertraut war, besuchte ich anschließend den Vortrag von Thorsten Hans. Er schaffte es in 45 Minuten MSBuild vorzustellen und ging auf Neuerungen in der Version 4.0 ein.

dnc2010_2Ganz neu war für mich das Konzept der Lunch Sessions. In einer der Lunch Sessions stelle Stefan Lieser das produkt TypeMock vor und erklärte wie man damit die Karre aus dem Brownfiled-Sumpf ziehen kann. Während des Vortrages wurde gegessen so hatte es Stefan nicht immer leicht, sich Gehör zu verschaffen.

Nach dem Essen machte ich eine kleine Vortragspause um mich noch kurz auf meinen Vortrag "Neues in ASP.NET 4.0 Webforms" vorzubereiten den ich um 16:15 gehalten habe.

Zu guter letzt besuchte ich einen Vortrag von Jörg Krause. Unter dem Titel "ASP.NET 4.0 Extensibility" konnten sich die meisten nicht viel vorstellen, deshalb war der Vortrag wahrscheinlich auch nur sehr mäßig besucht.
Die wenigen, die den Vortrag besucht haben, waren aber hinterher positiv überrascht. Jörg klopfte zu Beginn des Vortrages die Kenntnisse der Teilnehmer ab und setzte dann dort an, wo sich viele nicht mehr auskannten. Er zeige wie mächtig ASP.NET sein kann und stelle Möglichkeiten vor, mit denen man sich viel Handarbeit ersparen kann. Es ging hauptsächlich um unbekannte Provider, geschickte Ableitungen von vorhandenen Klassen und verborgene Einstellungen im IIS. Ich bin mir sicher, dass sich der ein oder andere geärgert hat, weil er im Vortrag erkannt hat, dass man vieles in ASP.NET nicht selber machen muss. Um die Möglichkeiten kennen zu lernen ist das Buch Pro ASP.NET Extensibility (Expert's Voice in .Net) von Jörg Krause sicher hervorragend geeignet.

Nach diesem Vortag begann die Verslosung. Auch neu in diesem Jahr war, dass man nur an der Verlosung teilnehmen konnte, wenn man vorher Stempel bei den Ständen der Sponsoren gesammelt hat. Es war spürbar, das dadurch die Stände besser besucht waren als im Vorjahr.

dnc2010_4

Als viele hochwertige Preise bei der Verlosung verteilt waren, versammelten sich geschätzte 80 Personen hinter dem Hotel. Von dort aus hatte man einen sehr schönen Blick auf den See des Stadtwaldes. Dort gab es reichlich zu essen und zu trinken. Das .NET Forum gewann Ende letzten Jahres eine Grillfete bei einem Wettbewerb den Microsoft zum Thema Webslices und Schnellinfos für den IE8 veranstaltet hatte. Der Gewinn, ein 3000€ Gutschein, wurde bei dieser Grillfete aufgebraucht. Nach der Grillfete traf sich der harte Kern zu dem ein oder anderen Glas Kölsch in der Hotelbar um den gelungenen Tag ausklingen zu lassen.

Mein jQuery Vortrag auf der dotnet Cologne

31.05.2010 23:24:51 | Andre Kraemer

Das Beispielprojekt meines jQuery Vortrags während der dotnet Cologne kann ab sofort hier herunter geladen werden.

Es handelt sich dabei um ein kleines ASP.NET MVC 2 Projekt, in dem folgendes genutzt wurde:

  • ASP.NET MVC 2 ;-)
  • StructureMap als IOC Container
  • SQLite als leichtgewichtige In-Memory-DB
  • NHibernate für den Datenbankzugriff
  • jQuery für den Wow-Faktor ;-)

Die Solution liegt passend zur Veranstaltung im VS 2010 Format vor. Bei Bedarf kann ich aber auch eine VS 2008 Solution bereit stellen.

Hauptaugenmerk solltet ihr auf die Datei aufgabenlist.js setzen. Hier befindet sich der relevante jQuery / JavaScript Code. Der ganze Rest ist nur "Infrastruktur", damit ich jQuery an einem halbwegs realistischen Beispiel zeigen kann ;-)

An Feedback zu den Quellcodes bin ich immer interessiert. Am besten über das Kontaktformular, oder die während des Vortrags mitgeteilte E-Mail Adresse.

Ich weiß übrigens, dass das ASP.NET MVC Projekt keine Unit Tests beinhaltet. Angesichts der Projektgröße und der verfügbaren Zeit habe ich hier ein wenig geschludert. Thomas Bandt hat mich während des Vortrags übrigens auch darauf aufmerksam gemacht, dass mein JavaScript Code nicht via Unit Tests geprüft wurde. Auch hier gelobe ich Besserung :-)

Literaturempfehlungen

Im Anschluss an den Vortrag wurde ich außerdem gefragt, welche Literatur ich zu dem Thema empfehlen könnte.

Nun, da sich jQuery hauptsächlich mit der Modifikation des DOMs, insbesondere dem Ein- / Ausblenden sowie dynamischem CSS befasst, sollte man meiner Meinung nach zunächst über solide (X)HTML und CSS Kenntnisse verfügen (kein Witz).

Zu diesem Thema kann ich das Buch Head First HTML with CSS & XHTML empfehlen:

Außerdem können generelle JavaScript Kenntnisse auch nicht schaden ;-) Hier habe ich persönlich sehr gute Erfahrung mit dem Buch Professional JavaScript for Web Developers gemacht.

Speziell zum Thema jQuery hat mir das Buch jQuery in Action, Second Edition sehr gut gefallen. Ich habe es mir im Rahmen des Manning Early Access Program als E-Book bestellt. Wer lieber ein gedrucktes Exemplar haben möchte, muss sich noch ein wenig gedulden, kann es aber dann auch z. B. bei Amazon bestellen.



blog.codemurai.de © André Krämer |Impressum | Abonieren

dotnet Cologne 2010 - was ein riesen Spaß

31.05.2010 23:03:46 | Andre Kraemer

Letzten Freitag hatte ich die Freude, an der dotnet Cologne teilzunehmen. Mit über 300 Teilnehmern war es ein wirklich riesiges Event, dass sich vor "professionellen", oder besser gesagt kommerziellen Konferenzen nicht verstecken muss.

Der Teilnehmer

Vor Ort war ich in mehreren Rollen. Zum einen natürlich als Teilnehmer. In dieser Rolle nutzte ich die Möglichkeit, endlich mal die Gesichter zu einigen Bekannten aus der Community zu sehen und auch mal persönlich das ein oder andere Wort zu wechseln. Außerdem hörte ich mir auch spannende Vorträge, unter anderem von Jörg Krause zu Sharepoint als Entwicklungsplattform, Neues in Silverlight 4 von Stefan Lange sowie Neues in ASP.NET 4.0 von Jan Welker.

Irritierend fand ich, dass gefühlte 90 % der Besucher von Jörg Krauses Sharepoint Vortrag keinerlei Sharepoint Vorkenntnisse hatten und somit wohl nicht im geringsten wussten, wie so eine Site, eine Sitecollection, ein Web, eine Liste, ein Webpart ... an der Oberfläche wohl aussehen. Die gleiche Situation habe ich übrigens auch mehrfach schon auf der Shareconnect (Basta Sharepoint Days) beobachtet. Vielleicht wäre hier einfach mal ein "Was ich über Sharepoint wissen sollte, bevor ich Visual Studio aufmache" Vortrag angebracht. Leider habe ich einen solchen Vortrag bisher noch auf keiner (Entwickler-)Konferenz im Angebot gesehen. Nichts desto trotz fand ich Jörgs Vortrag prima! Auch die anderen besuchten Vorträge haben mir gut gefallen, daher mein Fazit als Teilnehmer:

Voller Erfolg! Gute Vorträge, gute Kontaktmöglichkeiten zur Community, was will man mehr.

Der Aussteller

Unter den Sponsoren des Events war unter anderem auch die Firma Infragistics. Wie auch auf anderen Konferenzen lies ich es mir als fleißiger Infragistics MVP  in den Pausen natürlich nicht nehmen, Kiril und Nils tatkräftig zu unterstützen. Dies war auch bitter nötig, da der Andrang am Stand weit höher war, als ich es von anderen Konferenzen gewohnt war. Kamen wir normalerweise zu zweit immer ganz gut zurecht, waren dieses Mal sogar drei Personen eigentlich schon fast zu wenig.

Fazit als Aussteller: Tolle Veranstaltung! Viele Kontakte, interessante und zum Teil sogar sehr trickreiche Fragen, genauso muss es sein!

Der User Group Leader

Jeder der schon mal ein User Group Treffen besucht hat wird sich sicherlich fragen:

Wo kommen eigentlich die Sprecher her?

Nun ja, als sie ganz klein waren, wird sie voraussichtlich einer der beiden hier unten gebracht haben.

image

Foto: Valter Jacinto | Portugal   http://www.flickr.com/photos/valter/87429062/sizes/m/
Creative Commons License

Irgendwann werden die Jungs und Mädels dann aber groß und spätestens dann stellt sich für einen User Group Leiter die Frage:

Wo bekomme ich eigentlich Sprecher her?

Ein besonders guter Ort, Sprecher für die eigene User Group zu finden ist selbstverständlich eine Konferenz, denn dort treten Speaker häufig in Rudeln auf ;-)

Also machte ich mich während der dotnet Cologne auf den Weg und zog Sprecher für die nächsten Treffen der .NET User Group Koblenz an Land.

Die Ausbeute war übrigens mit zwei definitiven, einer relativ verbindlichen und einer losen Zusage recht gut. Daher auch hier: dotnet Cologne, 12 Points ;-)

Der Sprecher

Zu guter letzt (und angesichts der Agenda ist dies wörtlich gemeint), war ich auch als Sprecher unterwegs. Mein Thema war die Einführung in jQuery unter dem spontan geänderten Titel:

jQuery - oder warum Sie JavaScript in Zukunft nicht mehr hassen werden.

Den Verlauf des Vortrags würde ich wie folgt beschreiben

  • Der Saal füllt sich, die Menge wird still. Ich will loslegen, aber mein Mikro überlegt sich, dass es sich lieber in meinem T-Shirt verdreht. Kein Mensch hört mich ... so ein Mist
  • Mikro Problem gelöst, schnell durch die Folien gejagt. Auf gehts zur Demo!
  • Meine ASP.NET MVC Anwendung reißt niemand vom Hocker und stößt kaum auf Interesse
  • Ist zum Glück nicht schlimm, schließlich ist mein Thema ja auch jQuery und nicht ASP.NET MVC ;-)
  • Die ersten UI Gimmicks (alternierende Tabellenzeilen, Hover Effekte) zaubern ein müdes Lächeln auf die Gesichter der Menge - da muss wohl noch mehr her
  • Ich erstelle mit einer Zeile jQuery Code auf- und zuklappbare Bereiche in der Sidebar der Anwendung. Im Publikum sehe ich die ersten funkelnden Augen
  • Auf der Welle muss ich weiter reiten, also jetzt schnell ein wenig Ajax;-)
  • In der Einleitung habe ich etwas vom Update Panel erzählt. Heißt dann wohl ich sollte auch ein wenig WebForms zeigen. Ich entschließe mich also, im Firebug mal zu zeigen, was über die Leitung geht wenn man Ajax mit dem Update Panel erlegt erledigt. Als ich zum ViewState scrolle scheinen einige Teilnehmer zu glauben ich hätte gerade die Matrix gehacked oder zumindest gedebugged.
  • Oh je, nur noch 3 Minuten Zeit und ich habe doch versprochen früher Schluss zu machen - jetzt muss schnell etwas großartiges her. Ich greife also noch mal in die Trickkiste und greife zu meinem größten Trumpf:
    runde Ecken;-)
    Puh, geschafft, die Zuschauer jubeln. Ein Glück, dass es runde Ecken gibt ;-)

Mein Fazit als Sprecher lautet also:

Wahnsinn! Auch wenn es nur ein Einsteiger Vortrag war und laut Handzeichen mindestens die Hälfte der Anwesenden jQuery bereits kannte und nutzte war das Publikum allem Anschein nach während des Vortrags voll dabei. So macht vortragen Spaß!

Der Grillfreund

Zum Abschluss fand für einige Teilnehmer, Sprecher und Sponsoren dann noch die durch Microsoft gesponsorte und durch Jan Welker gestifftete Grill-Party des dotnet Forums statt. Essen und Getränke waren sehr lecker, die Gespräche spannend, von daher auch hier mein Kompliment.

Fazit

Der Besuch der dotnet Cologne hätte in keinster Weise besser laufen können. Großes Lob und alle Achtung an die Organisatoren! Nächstes Jahr bin ich - in welcher Form auch immer - sicherlich auch wieder mit dabei!

 

Hey, du hast dir die Zeit genommen, den ganzen Beitrag zu lesen, oder zumindest bis hier hin zu scrollen. Nimm dir doch bitte auch noch die Zeit, ihn über den unten stehenden Button bei dotnet-kicks.de zu kicken!



blog.codemurai.de © André Krämer |Impressum | Abonieren

Expression Blend 4 for Windows Phone in 90 Seconds

31.05.2010 12:47:38 | Oliver Scheer

Jon Harris zeigt was man in 90 Sekunden mit Expression Blend 4 for Windows Phone so alles zaubern kann.

image

Link

dotnet Cologne 2010: Ein Rückblick (aktualisiert 3)

31.05.2010 11:26:51 | Gordon Breuer

dc2010_Teilnehmer_180x80Aktualisierung: Neue Links hinzugefügt sowie eine Anmerkung zum Windows Phone 7 Beitrag von Peter Nowak ergänzt.

Aktualisierung 2: Weitere Links zu Blogpostings und Hinweis auf Gewinnspiel von Albert Weinert hinzugefügt.

Aktualisierung 3: Blog-Artikel von Peter Nowak verlinkt, in dem er Infos und Beispiele seines “Silverlight für Windows Phone 7”-Vortrages nachreicht.


Nach dem ich einige Konferenzen in der Vergangenheit in letzter Minute doch nicht besuchen konnte, hatte ich mir für die dotnet Cologne 2010 fest vorgenommen den Termin nicht platzen zu lassen. Erstaunlicherweise hat das sogar funktioniert. Noch erstaunlicher war die Fahrt mit der Bahn, die sowohl pünktlich als auch ohne Probleme stattfand: Keine Verspätungen, Sitzplatz-Reservierung im ICE war wie gewünscht, alle regionalen Anschlüsse bekommen. Warum klappt das nicht immer so?

Um der DC2010 ausgeschlafen gegenübertreten zu können bin ich bereits donnerstags angereist. Gut gelaunt wurden dann am Freitag die ersten Hände geschüttelt und endlich bekamen einige bekannte Namen aus der Community auch ein Gesicht! Vielleicht hätte ich mir stattdessen auch rechtzeitig einen Platz für die Keynote von Roland Weigelt sichern sollen: Als diese anfing war der Saal schon voll und man hätte sich nur noch mit viel Dazwischenquetschen einen Stehplatz erhoffen können. Dafür war in der Zwischenzeit aber beim Frühstücksbuffet kaum noch etwas los – lecker! :-)

Rainer Stropek Ab 10:25 Uhr fingen dann die ersten Vorträge an. Den Anfang machte bei mir Rainer Stropek mit “Blauer Himmel Teil 1 – Einführung in Windows Azure”. Bisher hatte ich noch nicht die Gelegenheit mit Azure zu arbeiten und fand die Einführung von Rainer hier sehr hilfreich. Das Thema Cloud-Computing wurde von ihm sehr anschaulich, aber auch recht schonungslos behandelt. So hat er klar gemacht, dass sich Anwendungen “in the cloud” nicht für jeden Zweck eignen, vor allem wenn es Rechtsunsicherheiten gibt was die Datenhaltung im Ausland betrifft. Auch die Kosten sind ein kritischer Punkt, der erste Schritt soll laut Rainer Stropek also immer der Griff nach einem Taschenrechner sein.

Stefan Lange Die zweite Session führte mich nach Nürnberg – zumindest raumtechnisch – zu Stefan Lange mit seinem Vortrag “Neues in Silverlight 4”. Eine Stunde reicht bei weitem nicht um alle Neuerungen im Detail zeigen zu können, doch Stefan hat hier eine ganz gute Auswahl zum Vorführen getroffen. Auch wenn bei dem einen oder anderen neuem Feature noch nicht ganz klar ist, wozu sie in der Praxis gut sein können: Die visuellen Möglichkeiten sind beeindruckend und machen Lust auf mehr!

Thorsten Hans Wieder zurück nach “Köln” (wer hat sich eigentlich diese Raumbezeichnungen ausgedacht?!) ging es dann gegen 13 Uhr weiter mit “Von 0 auf MSBuild 4.0 in 45 Minuten” von Thorsten Hans. Diese Präsentation hat mir vermutlich am meisten gebracht: Mir war vorher gar nicht bewusst wie mächtig die MSBuild-Scripte – besser bekannt als Projektdateien – sind! Hier werde ich auf jeden Fall noch einiges zu lesen und ausprobieren. Aus den anvisierten 45 Minuten wurden dann auch ganz schnell 60 und als wir dann zum Mittagsbuffet stießen tobte dort bereits eine Schlacht.

Stefan Lieser Meine “Lunch Session” bestand dann auch lediglich aus einer Portion TypeMock Isolator für Brownfield-Anwendungen, garniert mit einem kräftigen Spritzer Clean-Code-Paradigmen; das Ganze in bekömmlichen kleinen Häppchen serviert von Stefan Lieser in einer unvergleichbaren Vortragsart die durchaus Lust auf mehr machte. Im Anschluss gab es noch zwei bzw. drei Lizenzen von Typemock zu gewinnen und für alle anderen die leer ausgingen immerhin einen Gutschein für 25% Rabatt.

Gregor Biswanger Etwas schwerer hatte es da schon Gregor Biswanger im Anschluss mit seinem Vortrag “Debugging in Deep mit VS2010 und WinDbg”. Der Schwerpunkt lag hier wohl definitv auf den Debugging-Möglichkeiten vom Visual Studio, die viele wohl nur recht rudimentär nutzten. Auch hier konnte ich einige neue Ideen mitnehmen auf die ich bei der Fehlersuche in Zukunft sicher noch zurückgreifen werde. Etwas zu kurz kam dabei für mein Empfinden allerdings das Debuggen von Web-Anwendungen, dass noch mal eine ganz andere Herausforderung darstellt. Auch auf das Tool WinDbg wurde erst recht spät eingegangen. Wobei ich hier gestehen muss, den Vortrag etwa 10 Minuten früher verlassen zu haben – mich plagte ein menschliches Bedürfnis nach einem “stillen Örtchen” und anschließend war auch am Buffet mit dem Nachmittags-Gebäck noch wenig los.

Peter Nowak Nach einer kleinen Stärkung dann also auf zur nächsten Runde nach “Bremen” zu Peter Nowak und “Silverlight für Windows Phone 7 Series”. Und auch wenn Peter viele Detailfragen mit “Interessant, würde ich auch gerne wissen…” beantwortet hat war die Session an sich einfach klasse! Bei der genial lockeren Vortragsweise hat man ganz nebenbei einige interessante Blicke auf den Windows Phone 7 Emulator werfen können, den einen oder anderen Vergleich mit Eier-Produkten gezogen und schließlich verging die Zeit so rasend schnell, dass am Ende trotz dem Weglassen vieler Demos Albert Weinert mehrfach auf das Ende der Zeit hinweisen musste. Gestört hat das Überziehen wohl niemanden, auch wenn es einige Enttäuschungen in Hinblick auf das neue Consumer-Mobile-Gerät von Microsoft gab. Und wieso man zwar nur noch mit Silverlight für das Windows Phone 7 entwickeln kann, aber der Internet Explorer Mobile nicht in der Lage ist Silverlight anzuzeigen, wird wohl ein Geheimnis von Microsoft bleiben.

Nachtrag: Beim Chatten mit Peter habe ich zum letzten Punkt, Silverlight im Internet Explorer Mobile, noch ein paar Informationen erhalten die während der Session aus Zeitgründen untergegangen waren. Zwar wird für das Windows Phone 7 mit Hilfe von Silverlight entwickelt, jedoch mit einer leicht anderen Runtime-Version. Das “Mobile-Silverlight” basiert auf dem .NET Compact Framework wohingegen das “Desktop-Silverlight” auf dem ganz normalen .NET Framework basiert. Das hat neben einigen Phone-Spezifischen Anpassungen (wie dem Panorama-Steuerelement und anderen Touch-Funktionen) auch zur Folge, dass eine für das “Desktop-Silverlight” entwickelte Applikation nicht nativ auch im Mobile-Browser funktioniert. So betrachtet ergibt das also durchaus einen Sinn, wenn das für den normalen Consumer-Benutzer auch schwer zu vermitteln sein wird. Da es sich bei Windows Phone 7 aber um ein 1.0er Release handelt sind hier für die Zukunft noch alle Türen offen und die CE 6/7 Basis erleichtert das Updaten später ebenso. Warten wir also ab wie sich das Windows Phone entwickeln wird, das  iPhone hatte in seiner ersten Version auch einige Kinderkrankheiten die erst später beseitigt wurden. Danke noch mal an Peter für den Nachtrag / Hinweis :-)

Weitere Informationen und die aus Zeitgründen nicht mehr gezeigten Beispiele finden sich nun in Peters Blog: dotnet Cologne 2010: Silverlight für Windows Phone 7

Christoph Wille Gegen 17:30 Uhr hatte ich dann leider meinen Tiefpunkt erreicht was die Aufmerksamkeit anging: So interessant das “Managed Extensibility Framework (MEF)”, von Christoph Wille vorgestellt, auch sein mag, es fiel mir schwer den Ausführungen zu folgen. Das lag zum einen sicher an der fortgeschrittenen Uhrzeit, dem ausgelassenen Mittagessen und schlußendlich auch daran, dass ich meine Kontaktlinsen vergessen hatte und den sehr codelastigen Vortrag trotz Beamer kaum verfolgen konnte. Eigentlich sehr schade, aber ganz sicher nicht die Schuld vom Christoph. Hier werde ich also auf eigene Faust noch mal ein wenig Nachrecherchieren müssen!

Als um 18:40 Uhr die Verlosung anfing wurde mir schnell bewusst, was ich in der überfüllten Keynote verpasst hatte: Man hätte einen Zettel von den anwesenden Sponsoren und Partnern abstempeln lassen müssen und diesen dann zur Verlosung einreichen um eine Chance auf einen Gewinn zu haben! Das hätte ich früher wissen müssen, jetzt war es dafür wohl ein wenig zu spät :-(
Aber wenigstens den Bewertungsbogen konnte ich noch in Ruhe ausfüllen und abgeben – als Dankeschön gab es immerhin eine blaue “dotnet Cologne 2010”-Tasse.

29248_1434706460945_1031435211_31278856_6906674_n Sicherlich ein weiteres Highlight fing dann erst um 19 Uhr an: Die Grillfete des .NET-Forums! Letztes Jahr hatten wir beim EYSA-Wettbewerb von Microsoft den ersten Preis gewonnen, eine Grillfete für die Community die wir nun auch endlich veranstalten wollten. Da hat sich die dotnet Cologne geradezu angeboten und mit rund 100 Leuten waren auch viele gerne noch ein wenig länger geblieben. Kurz nach 23 Uhr habe ich mich dann doch so langsam auf die Suche nach einem Taxi gemacht (“Broadcast: Ciao!”) und mich schließlich auf mein Bett gefreut. Alles in allem war es ein langer, anstrengender, aber auch durchweg lohnender und lehrreicher Tag von, mit und in der Community gewesen und ich freue mich schon auf nächstes Jahr! :-)

In diesem Sinne noch einmal ein großes Dankeschön an die Veranstalter, Sponsoren, Sprecher und einfach an alle die dabei waren!

Bildergalerien:

Weitere Artikel / Berichte:

Und ein Gewinnspiel zum Schluss:

Albert Weinert hat ein kleines Gewinnspiel zu Artikeln über die dotnet Cologne 2010 gestartet: Schreibt über die dotnet Cologne 2010, stürmt dotnet-kicks.de und gewinnt ein Tekpub Abo

Artikel empfehlen auf .NET-Kicks Deutschland

Zusammenarbeit mit der HTML5-Gemeinde

31.05.2010 09:21:55 | Oliver Scheer

Wir sind immer sehr daran interessiert mit den Mitgliedern des W3C zusammenarbeiten zu können. Dazu gehört dann auch der Austausch mit den Entwicklern von anderen Browserherstellern, sowie einer sehr breiten Webentwickler-Community, wenn es darum geht die aktuelle und aufkommende Webstandards zu “formen”, wie z.B. gerade HTML5 oder die Mitarbeit in der Arbeitsgruppe rund um SVG.

In diesem Beitrag möchte ich einige Ansprechpartner und Informationen zu den verschiedenen Aktivitäten von Microsoft liefern, damit sich jeder gerne direkt an die entsprechenden Beteiligten wenden kann.

Feedback für HTML5
Tony Ross ist ein Internet Explorer Program Manager und Jonas Sicking das Pendant bei Mozilla. Beide führen seid geraumer Zeit eine Diskussion über die Erweiterbarkeit innerhalb von HTML5 (Link: hier). Derzeit ist diese Herausforderung noch nicht gelöst, allerdings gibt es inzwischen einige interessante Vorschläge, die dem Komitee basierend auf dem Austausch vorgelegt wurden. 

Testen von HTML5
Kris Krueger ist Internet Explorer Test Lead und Moderator der W3C HTML5 Testing Task Force.  Diese Task Force hat die notwendige Infrastruktur aufgebaut (Wiki, Bugzilla, ein Work Item Tracker und ein CVS Repository für Testfälle). Damit beginnend, haben sie sich drangemacht die DOM Level 2 HTML Testfälle als Basis für die HTML5 Tests zu verwenden. Genau so wie bei CSS2.1, denken wir, das eine gute Testsuite ein kritischer Faktor für die Spezifikation der interoperablen Standards wird.

Sicherstellen das neue Spezifikationen die Barrierefreiheit verbessern
Wir sind sehr an der Verbesserung der Barrierefreiheit interessiert, besonders im Internet. Deshalb implementieren wir diverse Barrierefreiheit-fokusierte Browser-Features, darüberhinaus arbeiten wir mit Apple, IBM und anderen interessierten Parteien daran, das die neuen HTML5 Elemente <canvas> und <video> eine gute Barrierefreiheit beinhalten, so das entsprechende Websites diese auch voll und ganz verwenden können. Diese Arbeit wird von der Accessibility Task Force geleitet.  Zusammen arbeiten wir an <canvas> HTML Prototypen als ‘proof of concepts’ um sicherzustellen das diese Features auch gut “spezifiziert” und implementiert werden können (Teleconference

Indexed DB Proposal
Zusammen mit Mozilla arbeiten wir an einem neuen Design für lokale Datenspeichern, die als sogenannte Indexed DB bezeichnet werden. Wir denken, das dies eine großartige Lösung für das Web wird. Der “Working Draft” dazu kann hier genau betrachtet werden (Link).

DOM Level 3 Events
Travis Leithead ist Internet Explorer Program Manager. Er arbeitet derzeit an der Behebung noch offener Probleme im aktuellen Draft. Es ist schon eine Weile her seit dem die Arbeitsgruppe ihren letzten Stand veröffentlich hat. (Link: working draft).

Abschließend ist dieses Interview mit Paul Cotton (Microsoft Mitarbeiter und Co-Chair der W3C HTML Working Group) sehr lesenswert (Link: Interview with Paul Cotton).

360° Panorama mit Silverlight und Photosynth

31.05.2010 08:47:55 | Oliver Scheer

Photosynth ist ein sehr einfaches Werkzeug um Fotos in einem Dreidimensionalen Raum anordnen zu lassen. Es ist sehr einfach zu bedienen und macht dabei unglaublich viel Spaß.

Man muss lediglich Bilder in Photosynth hineinladen und der Rest geschieht von selbst. Photosynth erkennt Ecken, Kanten und diverses mehr und setzt die Bilder in einem 3D-Raum neu zusammen.

image

Link: www.photosynth.net

TechEd Europe 2010- Anmeldeseite LIVE!

31.05.2010 08:20:55 | Oliver Scheer

clip_image002

Bereits seit 17 Jahren findet inzwischen die Tech∙Ed Europe, die größte europäische Konferenz von Microsoft für IT-Pros und Entwickler, statt.

Wir freuen uns, dass wir auch in diesem Jahr Gastgeberland sind und erneut tausende von IT Begeisterten in Berlin begrüßen dürfen. Vom 8. bis 12. November  2010 stellt Microsoft im Convention Center der Messe Berlin technische Neuerungen im Detail vor und gibt einen Ausblick auf zukünftige Technologien. 

Die Anmeldung ist seit Mittwoch, 19.05.2010  auf der offiziellen Homepage möglich.

Alle aktuellen Informationen zur Tech∙Ed gibt es auch über Twitter (http://twitter.com/teched_europe/).

dotnet Cologne 2010

31.05.2010 01:40:00 | Jürgen Gutsch

Um das nächtliche Fahren mit der Deutschen Bahn zu testen fuhr ich am Donnerstag Abend mit genau dieser nach Köln. Meine erste und einzige Autofahrt vor einigen Jahren in Köln war eher ein negatives Erlebnis, also entschloss ich mich zu dieser sehr drastischen Entscheidung. (start fishing for compassion) Aber auch das stellte sich als eher negatives Erlebnis dar. Auf der Hinfahrt gab es weder den reservierten Platz im angegebenen Wagen, noch war es ein Ruhesessel. Der ICE auf der Rückfahrt hatte zwar eine Steckdose für meinen Laptop, allerdings war ich zu Müde zum arbeiten. Leider war der Platz im ICE auch zu unbequem zum Schlafen. (finish fishing for compassion)

Die Community-Konferenz zum Launch von Visual Studio 2010 und .NET Framework 4

Nur gut, dass “rein zufällig” in Köln auch dieses mal wieder die dotnet Cologne stattfand. Das entschädigte die An- und Abreise erheblich.

Ich war natürlich zu früh am Veranstaltungsort was allerdings durch eine Elster (die sich entweder verflogen hatte oder auch etwas vom reichhaltigen Frühstücksbuffet haben wollte) in der Lobby-Bar und Thorsten Kansy Buch Datenbankprogrammierung mit .NET 4.0. Mit Visual Studio 2010 und SQL Server 2008 R2 doch noch sehr Kurzweilig wurde.

Veranstaltet wurde die Konferenz auch dieses mal wieder von Albert Weinert, Stefan Lange und Roland Weigelt. Nach einigen kleinen technischen Schwierigkeiten bei der Begrüßung hielt Roland Weigelt die Keynote zum Thema Community, Konferenz und .NET 4.0 und VS 2010

Anschließend gab es ein volle Programm. Eine tolle Session nach der anderen. Interessant fand ich die sogenannte Lunch-Session die man während dem Essen mit verfolgen konnte. So gab es für mich Canneloni mit einem Becher griechischem Salat garniert mit Brownfield und Typemock Isolator welches von Stefan Lieser serviert wurde. Zum Nachtisch verteilte Britt King 25% Rabatt auf den Typemock Isolator

Ebenfalls ein Erlebnis war die Session von Dariusz Parys der Windows Workflow vorstellte.

Für mich war die Session die Thorsten Hans zum Thema MSBuild auch eine Vorschau auf das 21. Treffen des .NET-Stammtisch Konstanz-Kreuzlingen. Ich freu mich drauf :-)

Wer ein paar Eindrücke von der dotnet Cologne haben möchte kann sich diese Gallery auf .NET Forum anschauen: http://dotnet-forum.de/photos/grillparty2010/slideshowpro.aspx

Von mir gibt es auf jeden Fall ein fettes Dankeschön an die Veranstalter für das tolle abwechslungsreiche Programm und für die Sponsoren, die das mit möglich gemacht haben. Und hoffe das nächste Mal wieder dabei sein zu können. :-)

DotNetKicks-DE Image

Nachlese zur dotnet Cologne 2010

29.05.2010 21:13:00 | Martin Hey

28. Mai 2010, 8:45 Uhr: Etwa 300 Leute treffen am Veranstaltungsort der dotnet Cologne in Köln ein. Alle gehören zu den Interessierten, die aus allen Ecken von Deutschland gekommen sind und erfahren möchten, was es Neues rund um Visual Studio 2010 und .NET 4.0 gibt. Nachdem ich mir am Eingang mein Namensschild besorgt habe, geht es gleich hinauf in die erste Etage, wo Kaffee und belegte Brötchen warten - und nicht nur das, sondern auch das eine oder andere bekannte Gesicht.

28. Mai 2010, 9:45 Uhr: Roland Weigelt, Albert Weinert und Stefan Lange eröffnen den Event - trotz einiger technischer Schwierigkeiten. Uns wird gesagt, dass wir interessant sind, weil wir zu den interessierten Leuten gehören, die heute hier sind, was irgendwie ein gutes Gefühl gibt. Ich lerne, dass ich die Tasche mit den ganzen Zetteln am Eingang doch hätte mitnehmen sollen, weil ich den Bewertungszettel daraus noch brauche, um am Ende des Tages eine Tasse zu bekommen und dass ich durch das erfolgreiche Absolvieren von Laufzettelstationen abends an einer Verlosung teilnehmen kann, in der es Bücher und Softwarelizenzen zu gewinnen gibt... ok, also noch schnell die Zettel gesucht und die Tracks können beginnen.

28. Mai 2010 10:25 Uhr: Erste Session des Tages ist für mich "Neues in Visual Studio 2010" und Jörg Freiberger zeigt einige der Key-Features der Ultimate-Version - z.B. IntelliTrace oder Zoomen per Mausrad. Nach einer kurzen Pause geht es in die Session von Dariusz Parys ("Anpassbare Anwendungen mit Windows Workflow 4") und in einer sehr sehr lockeren Präsentation zeigt er, was man mit der Workflow Foundation alles anstellen kann. Im neu erstellten Workflow21 erstellt er eine Rabattberechnung, die so konzipiert ist, dass der Endanwender diese dann theoretisch selbst durch Anpassung des Xaml-Codes anpassen könnte. Thorsten Hans führt dann mich und die anderen Zuhörer in "Von 0 auf MSBuild in 45 Minuten" in die Erstellung von MSBuild-Skripten ein. Zusammenfassung der ersten Konferenzhälfte: Vieles wusste ich schon, aber es waren auch einige für mich neue und damit sehr interessante Aspekte dabei.

28. Mai 2010 13:55 Uhr: Trotz der geplanten Lunch-Sessions herrscht reges Gedränge an den beiden Tischen an denen das Mittagessen aufgebaut ist und so halten sich einige über Wasser, indem sie nur Vorspeisen oder Nachtisch essen - eben weil sie da gerade einen guten Platz gefunden haben. Eine Lunch-Session hab ich mir dann doch angehört: "Internationalisierung von WPF-Anwendungen", in der Mathias Raake mit NLocalize im Grunde das Ergebnis seiner Diplomarbeit zeigte - es ist immer wieder interessant, was dabei rauskommt, wenn man ein interessantes Projekt hat.

28. Mai 2010 15:00 Uhr: Die erste After-Lunch-Session für mich war "ASP.NET MVC 2" und Thomas Mentzel zeigte eine Basiseinführung zum MVC-Konzept und ging dann näher auf die Implementierung in ASP.NET MVC 2 ein. Aufgrund der Fragen aus dem Publikum schweifte die Präsentation ganz schnell in Richtung "Unterschiede zu ASP.NET Webforms" ab, da dies das für die meisten doch bekanntere Konzept ist. Eine in meinen Augen sehr gute Präsentation war "Silverlight für Windows Phone 7 Series" von Peter Nowak, der zwar nur etwa die Hälfte des eigentlich vorgesehenen Vortrags schaffte, dafür aber mit Hintergrundinformationen aufwarten konnte, die sehr spannend waren. Als letzte Session des Tages hab ich mir dann "ASP.NET 4.0 Extensibility" angeschaut und Jörg Krause zeigte, dass man das Rad nicht neu erfinden muss, sondern in vielen Fällen durch Vererbung oder Implementierung von Interfaces und anschließender Konfiguration das Framework so erweitern kann, dass eigene Logik ohne viel Aufwand zu implementieren ist - man muss halt nur wissen, an welchem Punkt man angreifen kann.

28. Mai 2010 19:00 Nachdem ich der Verlosung als Zuschauer beigewohnt habe und mich für die glücklichen Gewinner mitgefreut hab, geht es jetzt zur Grillfeier des dotnet-Forums (nochmal vielen Dank an Jan Welker) - endlich mal Gelegenheit für einen Schwatz mit anderen Community-Mitstreitern. Mit einer neuen Tasse mit dem dotnet-Cologne-Schriftzug, gesättigt, mit einigen Kölsch im Bauch und dem guten Gefühl, den Tag in der Community verbracht zu haben, endet der Abend. Nochmal vielen Dank an die Veranstalter. Und hier schonmal mein Versprechen: Beim nächsten Mal bin ich wieder dabei.

DataTemplate Selector with Silverlight

29.05.2010 13:20:00 | Patric Schouler

With Windows Presentation Foundation (WPF) it is very easy to switch your datatemplate in dependency of for example the type of data you want to bind. But Silverlight does not support this “Out-of-box”. So we have investigated some time in our current project to get a similar mechanism. The idea for my solution is, that we have a area in our form which should contains dynamic objects.One of the conditions for the solution was that it should support the common MVVM pattern.

The key point of my solution is to use a DependencyProperty and bind this to our viewmodel instance.

Step 1: Write a user control for the dynamic area which binds the view model
   1: <UserControl x:Class="SDX.FinancialPlanning.Views.Uebersicht.EinzelItemView"
   2:     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   3:     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   4:     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
   5:     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
   6:     xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
   7:              xmlns:Detail1="clr-namespace:SDX.FinancialPlanning.ViewModels.Detail" 
   8:              xmlns:System="clr-namespace:System;assembly=mscorlib" xmlns:CommonHelpers="clr-namespace:SDX.FinancialPlanning.CommonHelpers" 
   9:              xmlns:Detail="clr-namespace:SDX.FinancialPlanning.Views.Detail" 
  10:              mc:Ignorable="d"
  11:     d:DesignHeight="300" d:DesignWidth="400">
  12:     
  13:     <Detail:DetailsViewSelector Content="{Binding SelectedEntryDetails}"  TemplateType="{Binding SelectedEntryDetails}"  >
  14:         <Detail:DetailsViewSelector.Resources>
  15:            <DataTemplate
  16:             x:Key="DetailWertpapierView"
  17:                         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  18:                         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  19:                         xmlns:Control="clr-namespace:SDX.FinancialPlanning.Views.Detail">
  20:                 <Control:DetailWertpapierView />
  21:             </DataTemplate>
  22:             <DataTemplate x:Key="EmptyTemplate">
  23:             </DataTemplate>
  24:         </Detail:DetailsViewSelector.Resources>
  25:         
  26:        
  27:     </Detail:DetailsViewSelector>
  28: </UserControl>

The DetailsViewSelector have two bindings

  • Content: Binds the view model to the choosen control
  • TemplateType: Binds also the view model to select the view by naming comventions

In my sample I habe only one DataTemplate and a empty Data Template if no corresponding objects could be bound.

Step 2: Implement the Detail View Selector
   1: <ContentPresenter x:Class="SDX.FinancialPlanning.Views.Detail.DetailsViewSelector"
   2:     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   3:     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   4:     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
   5:     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
   6:                   Content="{Binding}">
   7:     <ContentPresenter.Resources>
   8:     </ContentPresenter.Resources>
   9: </ContentPresenter>

Code for the Control:

   1: public partial class DetailsViewSelector : ContentPresenter
   2:    {
   3:  
   4:        public static readonly DependencyProperty TemplateTypeProperty =
   5:        DependencyProperty.Register("TemplateType", typeof(DetailViewModelBase),
   6:        typeof(DetailsViewSelector), new PropertyMetadata(new DetailWertpapierViewModel()));
   7:  
   8:        public DetailViewModelBase TemplateType
   9:        {
  10:            get { return (DetailViewModelBase)GetValue(TemplateTypeProperty); }
  11:            set { SetValue(TemplateTypeProperty, value); }
  12:        }
  13:  
  14:        public DetailsViewSelector()
  15:        {
  16:            Loaded += new RoutedEventHandler(OnLoaded);
  17:        }
  18:  
  19:        private void OnLoaded(object sender, RoutedEventArgs e)
  20:        {
  21:            DetailViewModelBase templateType = TemplateType;
  22:            string viewName = templateType.GetType().FullName.Replace("Model", "");
  23:            Type viewType = Type.GetType(viewName);
  24:            if (viewType == null)
  25:            {
  26:                ContentTemplate = (DataTemplate) Resources["EmptyTemplate"];
  27:            }
  28:            else
  29:            {
  30:                DataTemplate dataTemplate = (DataTemplate)Resources[viewType.Name];
  31:                ContentTemplate = dataTemplate;
  32:            }
  33:        }
  34:    }

To have a very flexible mechanism the DetailsViewSelector works with naming conventions to choice the View for the given view model.

dotnet Cologne 2010

29.05.2010 13:19:51 | Mathias Raacke

Gestern war wieder dotnet Cologne. Dieses Jahr noch größer mit 300 Teilnehmern und deshalb auch nicht in der Microsoft Niederlassung in Köln, sondern im Holliday Inn Am Stadtwald.

Ich war mit zwei Vorträgen dabei:

  • Visual Studio 2010 Extensibility (Folien)
  • Internationalisierung von WPF Anwendungen mit NLocalize (Folien)

Beide Vorträge waren gut besucht und das Feedback der Teilnehmer nach den Vorträgen (insbesondere bei NLocalize) sehr positiv.

Leider bin ich selbst mal wieder nicht wirklich dazu gekommen, mir Vorträge anzusehen. Die Vorträge, die mich am meisten interessiert hätten, liefen immer dann, wenn ich gerade keine Zeit hatte. Wenn ich Zeit hatte ging es meistens um Grundlagen zu irgendwelchen Themen, die ich selbst schon kannte. Trotzdem war es eine sehr gelungene Veranstaltung mit vielen Möglichkeiten zum Networking. Sehr gut gefallen hat mir auch die Grillparty des dotnet-Forums, die im Anschluss an die dotnet Cologne stattgefunden hat.

Weniger zufrieden war ich mit dem Hotel. Die 99€ pro Nacht waren absolut unangemessen, ich habe schon oft in schöneren Zimmern für deutlich weniger Geld übernachtet. Dazu kamen dann noch absolut unverschämte und meiner Meinung nach schon an Betrug grenzende Preise für Internet und Telefon, und 10€ pro Tag Parkgebühren. Internet für 7€ / Std, Ortsgespräche für 50 cent / Minute, deutschlandweit für 1€ / Minute und ins Mobilfunknetz für 1,50€ / Minute. Da fragt man sich, ob das Hotel per Satellitentelefon an das Telefonnetz angeschlossen ist (tatsächlich sind die Gebühren für Satellitentelefongespräche sogar teilweise günstiger). Zum Glück habe ich nicht telefoniert. Hätte ich versehentlich (ohne die Preise zu sehen) telefoniert, hätte ich mich jedenfalls geweigert, solche Gebühren zu bezahlen. Für mich heisst das jedenfalls, dass ich nicht noch einmal in einem Holliday Inn übernachte, sofern es sich irgendwie vermeiden lässt.

dotnet Cologne 2010 – 300 ist ‘ne Menge…

28.05.2010 00:37:51 | Roland Weigelt

Eine Papiertasche auffalten und mit einer Zeitschrift, einem Bewertungsbogen, einem Zeitplan, einem Los für Abschlussverlosung sowie etwas Infomaterial von den Sponsoren zu befüllen, das dauert nicht sonderlich lang.

Das ganze allerdings mit 300 Taschen zu machen, das kann eine Handvoll erwachsener Männer schon eine ganze Zeit lang beschäftigen.

Taschen

Es fand sich zwar recht bald ein geeigneter Ansatz, um das Befüllen schnell und effektiv zu machen (Entwickler optimieren halt gerne), aber ohne den einen oder anderen Tropfen Schweiß und ein deutlich spürbares Ziehen im Rücken ging die Aktion dann doch nicht ab.

Für den Abtransport wurden drei Autos voll beladen, ein viertes zur Hälfte:

Autos

Manchmal sind es halt die scheinbar kleinen Dinge, die einem eine zunächst abstrakte (Teilnehmer-)Zahl sehr anschaulich vor Augen führen…

VSTO 4: Wie erweitere ich den Backstage für Outlook 2010

27.05.2010 09:18:00 | Lars Keller

Mit Einführung von MS Office 2010 gibt es einige Neuerungen in der VSTO Entwicklung. Ich möchte in diesem Post zeigen, wie einfach der neue Backstage Bereich in Outlook 2010 angepasst werden kann.

Was ist überhaupt der “Backstage Bereich”?

Backstage Bereich in Outlook 2010

Der Backstage Bereich wurde in allen Office Applikationen eingeführt. In diesem hat der Entwickler die Möglichkeit, Konfigurationsdaten zu visualisieren und/oder zur Bearbeitung zur Verfügung zu stellen.

Ich habe vor kurzem ein VSTO 4 Add-In geschrieben, in dem ich den Backstage genau dafür eingesetzt habe. Ich benötige für mein Add-In Benutzerdaten damit sich der Benutzer mit einer Telefonanlage verbinden kann. Früher hätte ich dafür einen Dialog mit der gesamten Verwaltung erstellt. Dabei musste ich immer schauen, wie integrieren ich diesen Dialog in Outlook, so dass der Benutzer diesen auch findet und ich wenig “Ärger” damit habe. Genau dieses Problem ist nun aus der Welt.

Wie erweitere ich den Backstage Bereich?

Leider steht die Erweiterung des Backstage Bereiches nicht im Visual Studio Ribbon Designer zur Verfügung, sondern muss über den XML Weg gemacht werden. In Visual Studio 2010 muss dafür eine neue Ribbon1.xml und Ribbon1.cs Datei angelegt werden.  Nun kann beim Öffnen der XML Datei der <backstage> Tag ausgewählt werden:

<?xml version="1.0" encoding="UTF-8"?>
 
	
		
			
				
					
						
						
						
						
					
				
			
		
	

Innerhalb des Backstage-Tag können verschiedene Bereiche deklariert werden. In meinem Beispiel habe ich einen Tab <tab> erstellt und innerhalb dieses Tabs eine <firstColumn>. In diesen Bereich erstelle ich ein Label, ein Button und zwei editBoxen. Die Daten sollen automatisch in der Registry abgespeichert und wieder geladen werden. Damit dies passiert, müssen verschiedene Callback Methoden definiert werden.

Mit der Funktion getText lese ich den Text aus der Registry aus und zeige ihn in der editBox an. Änderungen in der editBox bekommt man nur mit, wenn der Callback onChange implementiert wird. Damit nicht für jeden Callback eine eigene Methode geschrieben werden muss, kann ein tag vergeben werden. Anhand dieses Tags kann im CodeBehind heraus´gefunden werden, welches Control gerade angesprochen werden soll.

public  string GetConfig(IRibbonControl control)
{
	if  (control.Tag == "ebPhoneIP")
	{
		return _phoneIp;
	}
	else if (control.Tag == "ebPhoneExtension")
	{
		return _phoneExtension;
	}
	return String.Empty;
}

Eine typische Callback Methode erwartet als Parameter ein IRibbonControl. Das Control liefert einen control.Tag, den man zum Vergleich heranziehen kann. Die Signatur des onChange-Callback übergibt die Änderungen der editBox als String:

public void OnChangeConfig(IRibbonControl control, string text)
{
	if (control.Tag == "ebPhoneIP")
		_phoneIp = text;
	else if (control.Tag == "ebPhoneExtension")
		_phoneExtension = text;
}

Dies ist nur ein einfaches Beispiel für die Backstage Erweiterung. Im Backstage Bereich können Combox-Boxen, Bilder, Style-Elemente etc. benutzt und somit komplexere Einstellungsmöglichkeiten für das Add-In hinterlegt… oder die neuste Twitter-Message dargestellt werden. ;-)

 

Weiterführende Links:

 

 

Ich bin zum Twitter-Chat bei @MicrosoftTalk eingeladen worden!

27.05.2010 06:33:00 | Lars Keller

Ich bin am 31.05.2010 von 10-11 Uhr Gast beim Microsoft Twitter-Chat “@MicrosoftTalk”. Hier die original News:

Am kommenden Montag, 31. Mai, findet auf dem Microsoft Twitter-Kanal „@Microsoft Talk“ mal wieder ein Community-Chat statt. Zu Gast ist diesmal Lars Keller, seines Zeichens Leiter der .NET Developer Group Braunschweig und „Most Valuable Professional“ für „VSTO Development“. Das Thema des rund einstündigen Online-Events lautet „Wie sieht eigentlich das Microsoft Community-Engagement aus?“. Los geht’s um 10 Uhr.

http://www.microsoft.com/germany/community/archiv.mspx?xd=/germany/community/components/data/Guidenews.xml&dt=description

Auf diesem Twitter-Kanal wurden bereits Achim Berg (ehemaliger Geschäftsführer MS Deutschland) und Donald Farmer (SQL Server 2008 R2) interviewt.

Dies ist mein erster Twitter-Chat! Ich muss zugeben, den Begriff “Twitter-Chat” hörte ich zum ersten Mal, als ich gefragt wurde, ob ich für den Chat zur Verfügung stehe. Ich bin sehr gespannt was mich erwartet.

Also wenn das kein Grund ist, sich bei Twitter anzumelden, dann weiß ich es auch nicht! ;-)

Mein eigenes Twitter-Profile findet Ihr hier: http://twitter.com/larskeller

ice:2010 & NRW Conf 2010 – Ich bin dabei

27.05.2010 04:07:00 | Lars Keller

Ich freue mich sehr, dass ich zum dritten Mal auf der NRW Conf und zum zweiten Mal auf der ice:2010 - Intelligent Communities for Europe sprechen darf!

Nicki Wruck lädt am 14.08.2010 in Lingen/Ems zur ice:2010 ein. Ich werde mit einem Vortrag über das neue Office 2010, VS 2010 und VSTO 4 dabei sein.

ice2010

Bei der NRW Conf werde ich einer der Spezialagenten vor Ort sein. Die NRW Conf steht unter dem Motto “Mission: IT-Community & Wissensaustausch” und findet am 09 + 10.09.2010 in Wuppertal statt. Organisiert wird diese vom Just Community e.V. Auch hier werde ich mit einem Vortrag über Office 2010, VS 2010 und VSTO 4 dabei sein.

 nrwconf

Ich freue mich drauf! Man sieht sich dort!

70-541 – Windows SharePoint Services 3.0 Application Development – passed

27.05.2010 02:38:01 | Lars Keller

Ist zwar schon ein paar Tage her, aber nun habe ich endlich das Logo dazu erstellt:

mctswss

Das ist wohl eine der Prüfungen mit dem längsten Namen ;-)

dotnet Cologne 2010 – jetzt wird’s ernst!

26.05.2010 22:44:07 | Roland Weigelt

Der Endspurt bei den Vorbereitungen für die dotnet Cologne 2010 am Freitag 28.5.2010 läuft. Stefan Lange, Albert Weinert, Melanie Eibl (vor einigen Wochen zum Orga-Team gestoßen und seitdem nicht mehr wegzudenken) und ich haken nach und nach die letzten Punkte auf der TODO-List ab.

Die Konferenz ist seit langem ausgebucht, da hat dann auch die Verdopplung der Teilnehmerzahl gegenüber letztem Jahr nichts geholfen. Das ist einerseits natürlich erfreulich, andererseits ist es immer wieder schade, Interessenten abweisen zu müssen.

Morgen (Donnerstag) wartet nochmal ein Tag mit allerletzten Vorbereitungen, Abends geht es zum von Microsoft organisierten regionalen CLIP & MVP Treffen, wo es auch ein erstes Wiedersehen mit einigen der Sprecher gibt.

Die Vorfreude steigt…

Nur 30 Sekunden

26.05.2010 19:47:00 | Martin Hey

Auf den ersten Blick mag der Titel wie der Aufmacher eines Hollywood-Action-Films sein, aber eigentlich handelt dieser Post von SQL Server Managment Studio Express 2005. Nur 30 Sekunden gibt es dem Anwender, um Queries zu einem erfolgreichen Ende zu bringen, bis der Timeout kommt.

Wie lässt sich das nachstellen? Ganz einfach: Man erstellt eine etwas komplexere View und klickt dann im Kontextmenü der View auf "Open View". Kurze Zeit später erscheint folgende formschöne Meldung:


In einem solchen Fall ist der erste Ansatz meist, in den Optionen (Tools / Options) des Management Studios nachzusehen. Und da finden sich auch wirklich zwei Einträge, die den Timeout bestimmen. Der erste findet sich unter Query Execution / SQL Server und nennt sich Execution Timeout. Bei mir steht dieser schon auf 0, was laut Beschreibung "unlimited" bedeutet und damit nicht Grund des Problems sein dürfte. Der zweite Eintrag findet sich unter Designers und erlaubt laut Beschreibung das Überschreiben des Timeouts in den Tabellendesignern. Der Haken ist bei mir deaktiviert und der Wert steht ausgegraut auf 30.

30? 30 und TimeOut? Ok, kann ja sein, dass hier jemand den Haken nicht korrekt auswertet und sinngemäß könnte das "Open View" ja schon noch unter Designerbedienung fallen. Also Haken rein, Wert auf 3600 gesetzt, Management Studio neu gestartet und... (Trommelwirbel) ... nach 30 Sekunden die Ernüchterung.

Um es kurz zu machen: Anscheinend gibt es für das Problem kein passendes Eingabefeld. Ich hab letztenendes alle Einstellungen wieder zurückgesetzt und den Wert in der Registry gesetzt. Verantwortlich für diesen TimeOut ist der Wert SQLQueryTimeOut unter HKEY_CURRENT_USER\Software\Microsoft\Microsoft SQL Server\90\Tools\ShellSEM\DataProject. Setzt man diesen auf einen höheren Wert als 30, so gibt man damit dem Management Studio mehr Zeit, die View zu öffnen. Problem daran: Dieser Wert wird anscheinend bei jedem Start des Management Studios zurückgesetzt - das ist also nur eine temporäre Lösung.

NRWConf in Wuppertal am 10. September 2010

26.05.2010 15:41:08 | Jan Schenk

clip_image001[1]

Mehr brauch ich nicht zu sagen, oder?

 

Oh doch, eins noch: Keynote! =)

 

Mehr weiss ich auch noch nicht!

jan

02.06.10 Treffen der .NET Developer Group Braunschweig - Agilität im Wasserfall - Scrum: nur Ganz oder Gar nicht?

26.05.2010 13:44:00 | Lars Keller

Die DNUG Braunschweig trifft sich am 02.06.10 um 19:00 im Restaurant Zucker (Tagungsraum). Dieses Mal kommt uns Gernot Glawe zum Thema “Agilität im Wasserfall - Scrum: nur Ganz oder Gar nicht?” besuchen.

Agile Methoden wie Scrum werden heute als Nachfolger der eher klassischen Projektmanagementansätze, wie PMBoK oder PRINCE2 diskutiert. Im Entwicklerumfeld gilt Agilität als der einzig erfolgreiche Weg: Dem Entwickler wird Eigenverantwortung übertragen und Kreativität wird gefördert. Dabei ist es unter Scrum Evangelisten - Stichwort „ScrumBut“ - verpönt, Methodologien zu mixen – ganz im Widerspruch zu dem agilen Grundsatz, eben nicht am Prozess festzuhalten. CS Consulting hat in Workshops die Erfolgsfaktoren von Projekten im Banken- und Versicherungsumfeld untersucht. Das erstaunliche Fazit vieler erfolgreicher Projektleiter im klassischen Umfeld ist: „Aber dann arbeiten wir ja bereits agil!“ – In diesem Vortrag werden die Aspekte der Vermischung beleuchtet und Ansätze zur Integration der „alten“ und der „neuen“ Welt aufgezeigt.

Gernot Glawe ist Leiter des Competence Centers Software Engineering bei der CS Consulting AG. Als Coach für Vorgehensmodelle gehören die agilen Methoden und die Softskills zu seinen Hauptarbeitsgebieten. Neben der Projektarbeit direkt bei Kunden agiert er als Trainer oder Referent z.B. bei User Groups sowie als Autor z.B. im Java Magazin.

Wie immer ist dieses Event kostenlos und jeder .NET Interessierte ist herzlich willkommen!

Weitere Informationen zur DNUG Braunschweig findest du hier.

Transparenz-Simulation in Silverlight

25.05.2010 17:55:00 | Stefan Lange

Anhand von zwei Projekt-Beispielen wird die Anwendung von nicht ganz alltäglichen Transparenz-Effekten vorgestellt.

1. Transparentes Video

Die Vorgabe der Grafikerin klang eigentlich ganz einfach: Das zu bewerbende Produkt sollte aus sich bewegendem Nebel herausragen und dabei aber noch teilweise mehr oder weniger vom Nebel verdeckt werden. Da Nebel an sich ja durchsichtig ist, sollte dies eigentlich kein Problem sein.

Der Nebel lag in Form eines HD Videos von real gefilmtem Nebel vor, das Bild vom Produkt war ein freigestelltes PNG. Nun ist aber ein Video von Nebel etwas anderes als realer Nebel. Natürlich kann man der Property Opacity des Media-Elements, welches den Nebel abspielt, einen Wert kleiner eins geben. Damit erhält man zwar ein durchsichtiges Video, aber nicht den gewünschten Effekt. So einfach geht es leider nicht.

Das folgende Bild zeigt einen Screenshot der fertigen Seite. Durch Anklicken kommt man auf die echte Seite.

Die Lösung besteht darin, das Produktbild vor das Video zu legen und es mit Hilfe einer OpacityMask nach unten hin immer durchsichtiger werden zu lassen. Hier ein Auszug des dazugehörigen XAML-Codes:

<MediaElement x:Name="fog1" Source="http://localhost/newblonde/assets/NewBlondeFog.wmv" AutoPlay="True" Stretch="UniformToFill"/>
<SSME:SmoothStreamingMediaElement x:Name="fog2" SmoothStreamingSource="http://localhost/newblonde/assets/NewBlondeFog.ism/Manifest" AutoPlay="True" Stretch="UniformToFill"/>
...
<Image x:Name="imgPackShot" Height="501" Width="356" Canvas.Left="321" Canvas.Top="94" Source="Assets/packshot.png" Stretch="Fill" RenderTransformOrigin="0.5,0.5">
  <Image.OpacityMask>
    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
      <GradientStop Color="White" Offset="0"/>
      <GradientStop Color="#7FFFFFFF" Offset="0.33"/>
      <GradientStop Color="Transparent" Offset="1"/>
    </LinearGradientBrush>
  </Image.OpacityMask>
</Image>

Die ersten beiden Elemente sind zwei verschiedene Videoplayer. Der erste ist der Standardplayer für WMV-Dateien, während der zweite aus dem Smooth Streaming SDK stammt. Durch Silverlight Smooth Streaming kann wahlweise eine höhere Qualität des Nebel-Videos erreicht werden. Welcher der beiden Player verwendet wird, kann per Konfiguration festgelegt werden.

Das dritte Element ist das Foto des Produktes. Die OpacityMask sorgt dafür, das im unteren Bereich des Bildes mehr und mehr vom dahinterliegenden Nebel zu sehen ist. Beim Betrachter entsteht so die Illusion, das Produkt schwebe mitten im Nebel. Durch eine leichte, mittels PowerEase gedämpfte Bewegung des Bildes wird dieser Effekt noch unterstrichen. Es ist schon erstaunlich: Obwohl ich es gemacht habe, kann ich nicht "sehen", dass sich der Nebel in Wirklichkeit hinter dem Bild befindet.

Der Nebel

Das Nebel-Video ist übrigens wie folgt gemacht: Das von der Agentur gelieferte ca. 25 Sekunden lange HD Video habe ich mit Sony Vegas so bearbeitet, dass die letzten 5 Sekunden mit dem Anfang per Kreuzblende überlagert wurden. Damit sehen der letzte Frame und der Frame aus Sekunde 5 des Originalvideos identisch aus. Das so entstandene neue und um 5 Sekunden kürzere Video kann nun in einer Endlosschleife abgespielt werden und der Sprung an den Anfang ist dabei fast nicht zu bemerken.

 

2. Transparente Silverlight Anwendung

Hier bestand die Aufgabe darin, ein mit Silverlight animiertes Firmenlogo auf einer normalen HTML-Seite anzuzeigen. Eine Silverlight-Anwendung von beispielsweise 150 x 150 Pixeln Größe zu erstellen, in der ein Logo animiert wird, ist trivial. Das Problem bestand darin, durch die Anwendung hindurch das Hintergrundbild der darunterliegenden HTML-Seite sehen zu können.

Die einfachste Lösung ist, die Silveright-Anwendung auf windowless zu schalten. Dies sollte jedoch gerade nicht gemacht werden, da dieser Modus möglicherweise nicht bei allen Browsern einwandfrei funktioniert.

Eine alternative Lösung besteht darin, dass die Silverlight-Anwendung das gleiche Hintergrundbild wie die HTML-Seite lädt und dann exakt den Ausschnitt davon anzeigt, den sie selbst gerade verdeckt. Die folgende Test-Anwendung zeigt, wie man das im Prinzip machen kann:

Das Bild mit dem Baum soll den Hintergrund einer HTML-Seite darstellen. Die eigentliche Silverlight-Anwendung ist zur Verdeutlichung mit gelben Punkten umrandet. Durch Anklicken kann die Umrandung ab und auch wieder angeschaltet werden.

Als Logo Beispiel dient hier ein Dodekaeder, dessen Seiten mit einem teiltransparenten ImageBrush gefüllt sind. 5 Sekunden nach dem Laden der Seite beginnt der Dodekaeder sich zu drehen. Nach weiteren 15 Sekunden fängt die Silverlight-Anwendung an, sich zusätzlich noch auf dem Hintergrund herumzubewegen.

Es entsteht dabei die Illusion, die Silverlight-Anwendung sei transparent, obwohl sie in Wirklichkeit nur geschickt ihren Hintergrund zeichnet.

Das div Element, welches das Silverlight object Element enthält, liegt wiederum in einem div mit dem background Bild:

<div style="height:375px; width:600px; background:url(http://.../background.jpg)">
  <div id="silverlightControlHost" style="height:150px; width:150px; left:90px; top:50px;
      position:relative">
    <object data="data:application/x-silverlight-2," type="application/x-silverlight-2"
       width="150" height="150">

Dieses div mit dem Namen "silverlightControlHost" sorgt dafür, dass sich die Anwendung 90 Pixel vom linken und 50 Pixel vom oberen Rand entfernt befindet. Hier nun der XAML-Code der eigentlichen Anwendung:

<UserControl x:Class="PseudoTransparentBackground.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:PseudoTransparentBackground" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d" 
    Height="150" Width="150">
  <Grid x:Name="LayoutRoot" Cursor="Hand">
    <Grid.Background>
      <ImageBrush ImageSource="http://.../background.jpg"
          Stretch="None" AlignmentX="Left" AlignmentY="Top">
        <ImageBrush.Transform>
          <CompositeTransform x:Name="Offset" TranslateX="-90" TranslateY="-50"  />
        </ImageBrush.Transform>
      </ImageBrush>
    </Grid.Background>
    <local:DodecahedronLogo RenderTransformOrigin="0.5 0.5" >
      <local:DodecahedronLogo.RenderTransform>
        <ScaleTransform ScaleX="0.25" ScaleY="0.25"/>
      </local:DodecahedronLogo.RenderTransform>
    </local:DodecahedronLogo>
    <Rectangle x:Name="ControlBorder" Stroke="Yellow" StrokeThickness="4" StrokeDashArray="0 2"
        StrokeDashCap="Round" StrokeDashOffset="0.5" />
  </Grid>
</UserControl>

Das selbe Hintergrundbild wie aus der HTML-Seite wird über eine ImageBrush als Background verwendet. Dabei wird das Bild über eine CompositeTransform entsprechend so verschoben, dass es den gleichen Ausschnitt zeigt wie die Stelle, die die Anwendung momentan verdeckt.

Damit habe ich erreicht, eine nicht-windowless Silverlight-Anwendung mit einem scheinbar transparenten Hintergrund zu erstellen.

Noch mehr Bewegung

Nur so zum Ausprobieren habe ich dann auch noch die Position der Silverlight-Anwendung animiert. Dazu wurde eine neue Klasse AppPosition mit zwei Dependency Properties Left und Top angelegt. Mittels zweier DoubleAnimation Objekte werden Left und Top animiert und so die Anwendung immer wieder auf neue Zufallspositionen innerhalb der Grenzen des Hintergrundbildes bewegt.

Damit nun die Silverlight-Anwendung ihre eigene Position im Browserfenster verändern kann, verwendet sie die Funktion SetStyleAttribute der Klasse HtmlElement. Hier der Code, der aufgerufen wird, wenn sich beispielsweise der Wert der Property Left ändert:

private static void LeftChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
  int x = Convert.ToInt32((double)e.NewValue);
  MainPage.Offset.TranslateX = -x;
  SilverlightControlHost.SetStyleAttribute("left", String.Format("{0}px", x));
}

Zum einen wird die Property TranslateX aus dem ImageBrush angepasst, zum anderen das Attribut left des Styles des SilverlightControlHost div Elements. Analoges gilt für die Property Top. Diesen Effekt hätte man vielleicht auch mit JavaScript erreichen können, aber mit Silverlight fiel mir das Programmieren deutlich leichter.

Im Internet Explorer 8 funktioniert diese Bewegung übrigens ganz gut, während der Hintergrund im Firefox 3.6 und in Chrome 4.1 relativ stark zittert. Im aktuellen Internet Explorer 9 Platform Preview sieht es am geschmeidigsten aus.

Für alle, die es sich genauer anschauen wollen, hier der Quellcode zum Downloaden:

PseudoTransparentBackground.zip (235 kB)

(Hinweis: Vor dem Build muss möglicherweise die Datei Petzold.Media3D.dll über Eigenschaften/Sicherheit zur Verwendung zugelassen werden.)

Die MSDN Blog-Parade geht in die zweite Runde! Mitmachen und gewinnen!

25.05.2010 11:20:10 | Peter Kirchner

MSDN Deutschland veranstaltet wieder eine Blog-Parade! Und wie beim letzten Mal, können Sie mit etwas Glück wieder ein von drei Xbox 360 Elite-Paketen inkl. zwei Spielen gewinnen!

Die letzte Blog-Parade war ein toller Erfolg und fast 60 Teilnehmer hatten Ihren Spaß dabei, Ihre favorisierten Entwickler-Tools vorzustellen. Und drei glückliche Gewinner hatten sogar noch mehr Spaß, da sie am Ende auch ein Paket von uns auspacken durften. :-)

Thema der Blog-ParadeDieses Mal ist Ihre Kreativität gefragt! Wie Sie alle mitbekommen haben, ist das Thema Cloud Computing ein wesentlicher Bestandteil der zukünftigen Plattform von Microsoft. Aus diesem Grund wird das Thema dieser Blog-Parade sein, coole Ideen zu sammeln, was man alles mit Windows Azure machen kann. Ihrer Phantasie sind hier keine Grenzen gesetzt, ob es nun spezielle Web-Anwendungen sind oder Anwendungen, die sowohl lokal auf dem PC oder einem Windows Handy laufen, aber auch für innovative Funktionen, die die Cloud benötigen.

Wer das letzte Mal schon teilgenommen hat, kann hier jetzt gleich in den Kreativmodus übergehen und die ersten Ideen posten. Damit es sich auch lohnt wirklich kreativ zu sein, werden zusätzlich die besten Ideen in unserem /Partner-Portal veröffentlicht. (Wer es noch nicht kennt, kann sich hier informieren.) Natürlich ist dies vollkommen unabhängig davon, ob Sie als Gewinner ausgelost werden.

Ich habe versucht, möglichst viele Fragen schon im Vorfeld zu klären, sollte nach dem Lesen dieses Start-Artikels noch etwas unklar sein, schreibt mir einfach eine E-Mail (z.B. über die PingMe-Karte auf der rechten Seite) oder schreibt Eure Frage hier als Kommentar rein.

Wer noch nicht weiß, was eine Blog-Parade ist, was Windows Azure ist oder noch ein paar Beispiele für Ideen braucht, hier einfach weiterlesen.

Was ist Windows Azure?

Einen Überblick zu Windows Azure können Sie sich in diesem Webcast verschaffen. Wenn ein bisschen mehr sein darf, haben wir hier auch über 25 Webcasts zum Thema Windows Azure! Und wer noch tiefer einsteigen möchte, schaut hier auf Channel 9 an, was wir zu diesem Thema haben.

Keine Ideen? Hier ein paar Beispiele!

  • Ein Beispiel für eine coole Azure-Anwendung hat ein Kollege von mir geschrieben und vor kurzem veröffentlicht. Er hat eine Suche für Group Policies geschrieben und diese in die Cloud gestellt. Schauen Sie es sich am besten sofort an. (Welche Vorteile damit verbunden sind, können Sie hier erfahren.)
  • Weitere Ideen von mir (keine Angst, ich nehme am Gewinnspiel nicht teil…):
    • Auf dem Desktop: Ein Passwortverwaltungsprogramm könnte zusätzlich die Passwörter in Windows Azure speichern, damit der Benutzer von überall auf der Welt auf seine Daten zugreifen kann.
    • Im Web: Eben erwähntes Passwortverwaltungsprogramm bietet für Kunden zusätzlich ein Web-Frontend, um auch nur über den Browser auf die eigenen Daten zuzugreifen.
    • Auf dem Handy: Zusätzlich erstellen wir eine Anwendung für Windows Mobile oder Windows Phone 7, um auch vom Handy aus, auf die Daten in der Cloud zuzugreifen.

Was ist eine Blog-Parade, wer kann mitmachen und wie funktioniert es?

1. Bei einer Blog-Parade gibt es immer ein Thema, das vorgegeben wird. Gestartet wird eine Blog-Parade, wie sollte es anders sein, ebenfalls durch einen Blog-Beitrag.

2. Jeder kann an einer Blog-Parade teilnehmen, indem man in seinem eigenen Blog einen Beitrag zu dem gestellten Thema schreibt.

  • Schreiben Sie also einen Artikel mit Ihren Ideen für eine Anwendung, die sich die Vorteile von Windows Azure zunutze macht. Erläutern Sie zum Verständnis Ihre Idee, damit Sie auch für die anderen Leser nachvollziehbar ist.
  • Wir sammeln Ideen! Die Lösung muss also nicht bereits implementiert sein.

3. Indem man im eigenen Artikel zum Ursprungs-Beitrag der Blog-Parade verweist, wird von Blog-Programmen in der Regel automatisch ein Verweis beim Ursprungs-Blog-Beitrag erstellt.

    1. Verweisen Sie in Ihrem Artikel auf diesen Start-Artikel hier, damit von Ihrem Blog ein Trackback (Rückverweis) erzeugt wird. So sehen wir, wer an der Aktion teilgenommen hat.
    2. Sollte das nicht automatisch geschehen, schreiben Sie hier einfach einen Kommentar mit einem Link zu Ihrem Blog-Beitrag. Keine Angst, wenn Sie Ihren Kommentar nicht sofort sehen. Die Kommentare müssen von mir erst freigeschaltet werden.

4. Und damit sind Sie schon dabei!

5. Die Blog-Parade läuft bis zum 21.06.2010 (einschließlich).

    • Innerhalb der darauf folgenden zwei Wochen werden wir dann die glücklichen Gewinner anschreiben und bekannt geben.

Gibt es auch etwas zu gewinnen?

Um die Motivation für die Teilnahme wieder etwas zu heben, verlosen wir unter allen Teilnehmern drei Mal je ein Xbox Elite Paket inkl. zwei Spielen! Wer an der Verlosung teilnehmen möchte, sollte in seinem Blog ein Kontaktformular- oder -adresse haben, damit wir Sie anschreiben können. (In Bezug auf die Verlosung bitte das "Kleingedruckte" unten beachten.)

3 Xboxen 360 Elite und jeweils zwei Spiele

Ideen klauen gilt nicht! ;-)

Um zu verhindern, dass einfach Ideen von anderen übernommen werden, machen wir es dieses Mal so, dass nur einzigartige Ideen zählen. Das bedeutet auch, wer zuerst kommt, mahlt zuerst. Hierbei gilt dann das Datum und die Uhrzeit, die vom Trackback erzeugt wurde oder vom Kommentar, den Sie hier schreiben.

Das Kleingedruckte

  1. Teilnahmeberechtigt an der Verlosung ist jeder, ausgenommen Mitarbeiter von Microsoft und deren Angehörige.
  2. Jeder Teilnehmer darf mehrmals teilnehmen. Die Chancen für die Verlosung erhöhen sich dadurch nicht.
  3. Teilnahmeschluss für die Verlosung ist der 21.06.2010.
  4. Aus allen Einsendungen werden drei Gewinner per Los gezogen.
  5. Gewinn ist jeweils ein Xbox 360 Elite Paket inklusive zwei Spielen.
  6. Alle Gewinner werden per E-Mail benachrichtigt.
  7. Die Zustellung des Gewinns erfolgt auf dem Postweg auf eigene Gewähr. Eine korrekte Angabe Ihrer Daten ist Voraussetzung für die korrekte Zustellung im Falle eines Gewinns.
  8. Die Gewinner erklären sich mit einer Veröffentlichung Ihrer Vornamen und des Anfangsbuchstabens des Nachnamens mit Wohnortangabe im Blog blogs.msdn.com/softwarehersteller einverstanden.
  9. Die Ausbezahlung der Preise in bar ist nicht möglich.
  10. Der Rechtsweg ist ausgeschlossen.
  11. Gewährleistungsansprüche hinsichtlich der Gewinne sind gegenüber Microsoft Deutschland GmbH ausgeschlossen.

 

[Update 25.05.10] Re-Post aufgrund der Umstellung unserer Blog-Plattform.

Von Thunderbird zurück zu Outlook

25.05.2010 05:45:00 | Timo Rehl

Einleitung:
Ich habe mich nach langer Nutzungsdauer dazu entschieden vom Mailclient Thunderbird zurück zu Outlook zu wechseln. Ich bin von Office2010 und dessen Outlook derart begeistert, dass ich diesen Schritt wagen wollte. Leider stellte sich heraus, dass das aber nicht so einfach war, denn so komfortabel Thunderbird auch ist, es gibt darin keine Export Funktion, und auch keine Möglichkeit, dass ein externes Programm bequem auf die E-Mails zugreifen kann.


Quelle: http://www.office2010-blog.de

Problembeschreibung:
Alle im Internet gefundenen Vorschläge waren sehr schwierig umzusetzen, oder bereits veraltet. So gibt es sehr viele Anleitungen, die besagen, dass Thunderbird E-Mails im Profilordner im MBox Format abspeichere und dass es Konvertierungsprogramme wie MBox2Eml möglich machen würden E-Mails zu konvertieren und sie für Outlook Express zugänglich zu machen. Also wäre hier der Weg MBox2Eml -> Outlook Express -> Outlook, aber...
Ja das war so, jedoch ab Version 3.x (oder schon früher) verwendet Thunderbird die Datenbank SQL Compact. Das macht das Konzept schon wieder hinfällig. Eine kurze Verwendung des SQLCE Viewer brachte zwar Einblicke in die Datenbankstruktur, und auch E-Mails habe ich gefunden, jedoch ist das deutlich zu unkomfortabel und auch zu unsicher daraus manuell Daten zu extrahieren.

Lösungsfindung:
Es gibt auch im Internet die zahlreichen Hinweise, dass man den Umweg über IMAP gehen kann. Dieser Weg habe ich zunächst verfolgt und als Lösungsweg erachtet. Aber auch hier gibt es genügend Probleme, um damit einen ganzen Tag zu verbringen. Ich wollte nicht den Umweg über meinen Mail-Provider (Freenet oder T-Online) zu gehen, um alle Mails erst Online zu bringen, weil ich doch eine recht beschränkte DSL Leitung habe, und weil meine Online Postfachgröße auch nur beschränkt ist. Also wollte ich einen Mailserver lokal aufsetzen...

Unter der englischen Wikipadia Seite Comparison of mail servers findet sich schnell ein Überblick über alle gängigen Mail Server, vor allem auch welche, die kostenfrei einsetzbar sind. Ich möchte es kurz machen: kein E-Mail Server, der kostenlos ist, und sich unter Windows installieren lässt war dazu geeignet, einmal schnell einen lokalen Mailserver aufzusetzen. Ausprobiert habe ich folgende Server mit folgendem Ergebnis:
- Apache James -> gescheitert aufgrund der fehlenden Java-Umgebung
- hMailServer -> dieser kann leider nur SMTP Forwarding, weshalb ich nicht wusste, was bei IMAP Zugriff und Mailupload letztendlich passiert
- UW Imap -> Die Webseite ist sehr undurchschaubar, und es gibt dort nur die Möglichkeit zig Dateien per FTP herunterzuladen, aber keine anständige Anleitung was und wie ich da vorgehen sollte, also habe ich es erst gar nicht probiert
- Meldware Mail Server (Pegasusmail aka pMail) -> sehr komplexe Bedienung, und irgendwie habe ich es nicht geschafft, das Ding nur unter lokalem Netzwerk zum Fliegen zu bringen (macht dem Namen nicht die Ehre ;-)

Lösung:
Ich erinnerte mich, dass ich vor nicht allzu langer Zeit einen SME Server bei mir laufen hatte. Das ist ein File/Mail/Internet Server, dessen Fokus auf die Bedienbarkeit und Installationsleichtigkeit gelegt wurde.


Quelle: http://www.linux-user.de/ausgabe/2006/10/014-sme-server/index.html

Also nur kurz über VMWare eine neue VM aufgesetzt, diesen SME Server installiert, so konfiguriert, dass er als "nur Server" betrieben wird, und dass die VM netzwerktechnisch so eingebunden ist, dass die VM wie ein Rechner im lokalen Netzwerk sich verhält (bridged). Dem SME Server noch eine IP Adresse aus dem lokalen Bereich angegeben, und dann über den Host via Web-Admin Schnittstelle auf die Serverkonfiguration zugegriffen (Bild oben). Als letztes ToDo ist noch ein neuer Benutzer anzulegen, und ein neues Passwort ihm zu verpassen. Ansonsten ist nichts zu konfigurieren, alles andere macht standardmäßig SME Server für einen!

Nun kann man im Thunderbird ein neues Konto anlegen, und auf den SME Server verweisen lassen (ich hab das z.B. so realisiert, dass die Mailadresse dann timo@192.168.0.123 hieß). Thunderbird erkennt automatisch den möglichen IMAP Zugriff, bringt dann aber eine Warnung, dass das SMTP Zertifikat nicht vertrauenswürdig sei. Klar, es ist ein von SME Server erstelltes Zertifikat, das in keiner Zertifizierungsstelle bekannt ist; diese Meldung kann man aber getrost ignorieren. Als letztes Feintuning habe ich in den Konteneinstellungen noch das Häkchen gelöscht, das bewirkt eine lokale Kopie vorzuhalten und dass E-Mails größer als 1 KB nicht heruntergeladen werden. Sorry, ich habe bereits Thunderbird deinstalliert, ich hätte gleich dran denken sollen Screenshotbilder zu machen, nun habe ich keine.

Ist das neue Konto eingerichtet, dann kann man alle Ordner per Drag & Drop in das neue IMAP Konto ziehen. Dabei werden alle darin enthaltenen Mails auf den SME Server transferiert, die Ordner werden automatisch mit angelegt. Abschließend zu diesem Vorgang darf man die E-Mails in den Standardordnern "Posteingang", "Gesendete Mails" etc. nicht vergessen, dort muss man alle Mails durch "Alle markieren" in entsprechende IMAP Ordner (gegebenenfalls neue anlegen) schieben. Dann Thunderbird schließen.

Zum Schluss Outlook2010 starten, das gleiche IMAP Konto anlegen, und kurz warten, bis Outlook alle Mails heruntergeladen hat (standardmäßig macht Outlook eine lokale Kopie). Sobald Outlook fertig ist, alle Ordner wieder per Drag & Drop in die lokale Datendatei ziehen und fertig.

Zum Aufräumen empfiehlt es sich dann Thunderbird zu deinstallieren, das lokale Profilverzeichnis manuell zu löschen (bei mir waren dort noch Reste zu finden), in Outlook das lokale IMAP Konto wieder entfernen, dann die Virtuelle Maschine wieder entfernen. Ich würde schätzen, dass je nach Menge von Mails, das Ganze zwischen einer halben Stunde und 1 Stunde erledigt sein sollte (inkl. Installation SME Server, aber ohne Download).

Ich hoffe, es war nützlich, über Kommentare würde ich mich freuen.

Speicherort der Help (MSDN) Library von Visual Studio 2010 ändern

23.05.2010 20:53:00 | Alexander Zeitler

Mit Visual Studio 2010 wurde die lokale MSDN-Installation auf MS Help Viewer (vorher auch als MS Help 3 bekannt) umgestellt.

Beim ersten Aufruf der Hilfe in Visual Studio kann man den Pfad für die lokale Installation der Library-Dateien festlegen:

Help Library Manager: Festlegen des Pfades für die Library

Danach werden alle Library-Inhalte, die man herunterlädt und installiert, in diesem Ordner abgelegt.

Möchte man den Pfad ändern, muss man wie folgt vorgehen:

  1. Help Library Agent im Systray stoppen
  2. Alle Dateien und Ordner in o.g. Ordner (siehe Screenshot) löschen
  3. In der Datei C:\Program Files\Microsoft Help Viewer\v1.0\HelpLibManager.exe.config
    • <add key="FirstTimeRun" value="True" /> setzen
  4. "%programfiles%\Microsoft Help Viewer\v1.0\HelpLibManager.exe" /product VS /version 100 /locale en-us /brandingPackage dev10.mshc” ausführen, um den Help Library Manager mit dem Visual Studio 2010 Branding zu starten und die Help Library nun an einem anderen Ort installieren zu können

Im Help Library Manager kann nun der neue Pfad angegeben werden:

Neuer Pfad für die Help Library

Danach müssen noch die gewünschten Inhalte der Help Library installiert werden.

Ein zweites Zuhause

23.05.2010 19:24:47 | Andre Kraemer

Habe ich für meine Blog Beiträge gefunden. Zumindest die englischen, die einen Bezug zu den Infragistics NetAdvantage Controls haben.

Seit kurzem gibt auf der Infragistics Homepage nämlich einen MVP Blog, für das ich einer der Autoren bin.

Selbstverständlich gibt es auch schon einen ersten Blog Post von mir. Dieser beinhaltet neben einer kurzen (OK, langen ;-)) Vorstellung ein kleines jQuery Script, welches hilfreich beim Einsatz des Infragistics ASP.NET Aikido WebDropdown Controls ist.

igmvpblog

Ein zweites Zuhause

23.05.2010 16:24:47 | Andre Kraemer

Habe ich für meine Blog Beiträge gefunden. Zumindest die englischen, die einen Bezug zu den Infragistics NetAdvantage Controls haben.

Seit kurzem gibt auf der Infragistics Homepage nämlich einen MVP Blog, für das ich einer der Autoren bin.

Selbstverständlich gibt es auch schon einen ersten Blog Post von mir. Dieser beinhaltet neben einer kurzen (OK, langen ;-)) Vorstellung ein kleines jQuery Script, welches hilfreich beim Einsatz des Infragistics ASP.NET Aikido WebDropdown Controls ist.

igmvpblog



blog.codemurai.de © André Krämer |Impressum | Abonieren

Ein ganzer Tag C# deep dive am 22. Juni in München

21.05.2010 09:00:00 | Albert Weinert

Meine Sommerreise ist noch nicht zu Ende, auch in München mache ich Station und werde zusammen mit Golo Roden und David Tielke einen ganzen Tag einen C# Deep Dive machen und jeden Winkel der Sprache und deren Möglichkeiten erörtern.

dotnetpro.powerday C# für Profis am 22. Juni 2010

Warum das ganze?

Leider bekomme ich bei meinen Vorträgen und Rundreisen öfters mit wie der Wissenstand bei C# ist. Es hört hier und da schon bei C# 2 und dessen Generics auf. Bei vielen Vorträgen stoße ich auf fragende Gesichter sobald ich auf C# 3 Features verwenden. Dies ist sehr schade und einem entgehen viele Verbesserungsmöglichkeiten am eigenen Code.

Nicht jeder hat die Möglichkeiten sich im Selbststudium alles beizubringen, oder im Job mal eben zu erarbeiten. Hier und da wendet man bestimmte Features nur an und kennt die Hintergründe nicht und kann somit nicht dass volle Potential nutzen.

Deshalb einen Tag C# einmal komplett durchleuchtet, dies sollte man sich nicht entgehen lassen.

Technorati-Tags: ,,,

Neues Projekt: FluentMetadata

20.05.2010 12:56:38 | Albert Weinert

Ich bastel da einem neuen Projekt rum. Dabei ist mehr oder weniger FluentMetadata “abgefallen”, bzw. es noch in der Entwicklung. Jedoch ist es zumindest mit ASP.NET MVC 2 schon funktionsfähig und es wird Zeit damit mal an die Öffentlichkeit zu gehen.

FluentMetadata ist eine Möglichkeit Metadaten für Klassen zu definieren diese dann im weitere Programmablauf zu verwenden. Diese kann dann genutzt werden um andere Frameworks mit Informationen zu versorgen.

Seit es nun für die Validierung oder Typ-Informationen. Ganz nach dem DRY Prinzip sollen diese nur an einer Stelle definiert müssen.

Warum?

Ich habe das ganze entwickelt weil ich es Leid war Validierungen mehrfach zu implementieren. Sowohl für meine Entities als auch für die Models des Views.

Um dies zu vermeiden kann man Metadaten die zu einer Klasse definiert sind auch auf anderen Klassen anwenden, aktuell wird dies per Konvention über die gleichen Propertynamen möglich. Dies soll dann noch flexibler werden.

Aktuell implementiert ist ein Metadata Provider für ASP.NET MVC 2. Einer für FluentNHibernate ist auch in Grundzügen vorhanden.

Ziel ist es diese Metadaten mit Adaptern auch anderen Frameworks oder Technologien zu Verfügung zu stellen, z.B. WCF Ria Server, WCF DataServer, WPF ViewModels etc. so dass Metadaten nur noch an einer zentralen Stelle definiert werden.

Der Quelltext ist auf GitHub gehostet.

http://github.com/DerAlbertCom/FluentMetadata/

Die Projektverwaltung versuche ich mal mit Assembla zu machen.

http://www.assembla.com/wiki/show/FluentMetadata/

Die Metadata-Zuweisung ist ähnlich wie bei AutoMapper aufgebaut. Einfach von ClassMeta<> ableiten und im Konstruktur die Metadatan erstellen.

public class NewsMetadata : ClassMetadata<News>
{
    public NewsMetadata()
    {
        Property(x => x.Created).Is.Required();
        Property(x => x.Updated).Is.Required();
        Property(c => c.Title).Is.Required().Length(255);
        Property(c => c.Author).Is.Required();
        Property(c => c.DisplayStart).Is.Required();
        Property(c => c.DisplayEnd).Is.Not.Required();
    }
}

Für ein ViewModel kann ist dies genauso, jedoch sollte man dort mit CopyMetadataFrom<>() die Metadaten eines vorhandenen Type kopieren, falls notwendig kann man noch zusätzliche Metadaten angeben, jedoch kann man diese sofern sinnvoll auch schon in der News-Klasse angegeben haben.

public class PartialNewsModelMetadata : ClassMetadata<PartialNewsModel>
{
    public PartialNewsModelMetadata()
    {
        CopyMetadataFrom<News>();
        Property(x => x.Id).Should.HiddenInput();
        Property(x => x.AuthorId).Should.HiddenInput();
        Property(x => x.Title).Display.Name("Überschrift:");
        Property(x => x.AuthorUserName).Display.Name("Benutzername:").Is.ReadOnly();
        Property(x => x.DisplayStart).Display.Name("Anzeigen ab:");
        Property(x => x.DisplayEnd).Display.Name("Anzeigen bis:");
    }
}

Für jede Klasse muss eine Zuordnung der Metadaten geschehen. Dann kann diese verwendet werden.

Für die Anwendung muss dann nur noch beim Programmstart die Metadaten zusammen gesucht werden und um Falle von ASP.NET MVC 2 der Provider gesetzt werden.

FluentMetadataBuilder.ForAssemblyOfType<News>();
FluentMetadataBuilder.ForAssemblyOfType<PartialNewsModelMetadata>();


ModelMetadataProviders.Current = new FluentMetadataProvider();

Beispiel mit den deklarierten Entities:

http://www.assembla.com/wiki/show/FluentMetadata/Examples

Das ganze ist noch nicht fertig und Bedarf noch einiger Verbesserungen, für Feedback bin ich offen also gebt es mir.

Andere Frameworks

Es gibt zwar schon FluentValidation, jedoch ist da der Ansatz komplett über die Validierung zu gehen und da im Falle für MVC zusätzliche Metadaten drauf zu stülpen. Bei meinem Ansatz setze ich ganz unten an und die Daten werden weiter nach oben Gereicht ohne sie erneut definieren zu müssen.

Nachlese zum Treffen der .NET Usergroup am 05.05.2010

20.05.2010 11:27:00 | Martin Hey

Am 05.05. war es wieder soweit und viele begeisterte .NETler trafen sich bei der Communardo Software GmbH, um von Peggy Reuter und Lars Heinrich im Rahmen der .NET Usergroup Dresden durch einen spannenden Abend geführt zu werden.
Zentraler Punkt des Abends war die Zusammenarbeit von Entwicklern, die ja eher das Auge auf die Funktionalität haben, und Designern, die das ganze dann für den Anwender verwendbar machen. Dabei gibt es einige Fallstricke, wie uns Lars gleich zu Beginn des Abends mitteilte. Unter bestimmten Voraussetzungen ist das im Visual Studio entworfene Design nämlich nicht im Blend bearbeitbar (weil Blend z.B. referenzierte Ressourcen nicht finden kann) und sowohl Entwickler als auch Designer sind unzufrieden. Damit das nicht passiert, teilte er uns einige Tipps und Tricks mit. Danach gab Peggy, welche eher im Bereich Design beheimatet ist, anhand einer prototypischen Umsetzung, Einblicke in die facettenreiche Nutzung von Expression Blend. Wer Lust und das entsprechende Equipment dabei hatte, konnte die Applikation live nachbauen.

Wer möchte, kann sich die Sourcen (ca. 100 MB) herunterladen und sich die Beispiele selbst nochmal ansehen.

Es war ein sehr spannender Abend und ich freue mich schon auf eine Fortsetzung, die dann einige der Facetten noch etwas näher beleuchtet.

TT.DOM in der aktuellen dotnetpro, Teil 3

20.05.2010 11:19:00 | Jörg Neumann

In der aktuellen Ausgabe der dotnetpro (6/2010) ist der dritte Teil meiner vierteiligen Artikelserie über die Entwicklung von Datenklassen erschienen. Hierin beschreibe ich das View-Modell von TT.DOM.

Aus dem Abstract:

Benutzer schätzen es, Darstellungen von Daten individuell anpassen zu können – sortieren oder filtern, Spalten ausblenden oder berechnete Spalten anzeigen. All dies erlaubt normalerweise die DataView-Klasse. Bei eigenen Objekten müssen Sie sich selbst um solche Anforderungen selbst kümmern. Das Thinktecture.DataObjectModel hilft auch hierbei.

dnp_062010[1]

Zwei Vorträge am 16.-17. Juni auf der APPs-Konferenz in Burghausen

20.05.2010 09:00:00 | Albert Weinert

Ein weiterer Zwischenstopp meiner kleinen Vortrags-Sommerreise ist am 16. und 17. Juni in Burghausen.

die APPs-Konferenz in Burghausen ist eine kleine und feine Konferenz mit wenigen aber guten Vorträgen, toller Stimmung und schönem Wissen-Transfer unter den Teilnehmern.

http://www.apps-konferenz.de/

Meine Themen sind

  • Mobile Web-Anwendungen für iPhone & Co mit ASP.NET MVC 2
  • Sketching von User Interfaces mit Balsamiq Mockup

Also, meldet euch. Es gibt gute Vorträge, tolle Leute sowie schöne Giveaways.

 

LINQ Extension Methods: Intersect

19.05.2010 20:25:00 | Wolfgang Kluge

Mit der Intersect-Erweiterungsmethode vergleicht man zwei Sequenzen des gleichen Typs miteinander und erhält als Ergebnis eine neue Sequenz, in der die Elemente der ersten Sequenz vorhanden sind, die auch in der 2. Sequenz vorkommen (Gegenteilig zur Except-Erweiterungsmethode). Dabei wird jedes Element nur einmal aufgeführt. Verglichen wird - wenn man nichts anderes angibt - mit EqualityComparer<T>.Default.

Ohne Intersect Extension Method kann man das Verhalten in etwa so nachbilden

private List<T> Intersect<T>( List<T> list1, List<T> list2, EqualityComparer<T> comparer ) {
    var ret = new List<T>( );
    if( comparer == null ) comparer = EqualityComparer<T>.Default;

    for( int i = 0; i < list1.Count; i++ ) {
        if(
            !ret.Contains( list1[i], comparer ) &&
            list2.Contains( list1[i], comparer )
        ) {
            ret.Add( list1[i] );
        }
    }

    return ret;
}

Der Aufruf mit Erweiterungsmethode kann so erfolgen

list1.Intersect( list2 );
list1.Intersect( list2, EqualityComparer<T>.Default );

xUnit.net und IUseFixture<> für die TestFixture Initialisierung

19.05.2010 17:14:36 | Albert Weinert

Mein seit ein paar Monaten favorisiertes Unit Testing Framework ist xUnit.net. Vorher war es MbUnit, dies ist jedoch mit Gallio/MbUnit 3 in eine Richtung gegangen die mir nicht mehr zugesagt (Fett, Groß, Langsam).

xUnit.net ist ein kleines Framework was erweiterbar ist. Meine Hauptgründe für dessen Nutzung sind

  • neue Instanz der Testklasse für jeden Test
  • Minimale notwendige Attributierung
  • “schönere” Assert-Syntax
  • die xunit bdd externsions
  • Mitgelieferte Build-Tasks für Nant, MSBuild etc.
public class SimpleTest
{
    [Fact]
    public void SuperKlasse_macht_es_richtig()
    {
        var foo = new SuperKlasse();

        var result = foo.TolleMethode();

        Assert.Equal("SollSein",result);

    }
}

Was einem auffällt ist dass nur [Fact] an der Test-Methode steht, mehr nicht. Kein weiteres Attribut ist für den Test notwendig. Auch gibt es keine [SetUp] Attribut, ein Setup für einen Test wird im Konstruktor der Klasse gemacht.

public class SimpleTest
{
    SuperKlasse foo;

	public SimpleTest()
    {
        foo = new SuperKlasse();
    }

    [Fact]
    public void SuperKlasse_macht_es_richtig()
    {
        var result = foo.TolleMethode();

        Assert.Equal("SollSein",result);

    }
}

Da die Klasse für jede Test-Methode neu instanziiert wird wird auch der Konstruktor jedesmal aufgerufen. Somit ist auf diesem Wege auch kein Setup für das komplette TestFixture möglich. Dazu stellt xUnit.net  das IUseFixture<> Interface zu Verfügung. Damit ist es möglich Fixtures für Test zu verwenden, dies kann z.B. notwendig werden wenn das zusammenstellen der Daten länger dauert.

Die Anwendung sieht dann so aus.

public class SimpleTest : IUseFixture<SimpleFixture>
{
    SuperKlasse foo;

    public void SetFixture(SimpleFixture data)
    {

    }

	public SimpleTest()
    {
        for = new SuperKlasse();
    }

    [Fact]
    public void SuperKlasse_macht_es_richtig()
    {
	   // der Test	
    }
}

SimpleFixture ist eine beliebige Klasse die überlicherweise im Konstruktur die Initialisierung der notwenden Daten oder Funktionen übernimmt. Sie wird nur einmal pro TestKlasse erzeugt und für für alle Test wird die SetFixture() Methode aufgerufen um eventuell erzeugte Daten in den Test übernehmen zu können.

public class SimpleFixture: IDisposable
{
    public SimpleFixture()
    {
        new Bootstrap.BootstrapMetaData().Execute();
    }

    public void Dispose()
    {
        FluentMetadataBuilder.Reset();
    }
}

Am Ende des Tests wird, sofern implementiert, Dispose() der Fixture Klasse zum aufräumen der Daten aufgerufen

Das schöne daran finde ich dass man sich kleine Fixtures aufbauen kann und diese in verschiedenen Tests verwenden kann. Außerdem sieht man direkt in der Klassendefinition des Test welche Fixtures in den Tests gebraucht werden. Weiter ist es möglich IUseFixture<> mehrfach in einer Test-Klasse einzusetzen.

Technorati-Tags: ,,

Am 10. Juni spreche ich bei der User Group Frankfurt

19.05.2010 11:19:06 | Albert Weinert

Es ist mal wieder soweit, ich bin wieder Unterwegs und verlasse Köln um mal wieder woanders Vorträge zu halten.

Die erste Station ist am 10. Juni bei der .net Usergroup Frankfurt.

Meine Thema ist mal wieder ASP.NET MVC (kann wohl nichts anderes ;-), diesmal in der Version 2. Jedoch werden diesmal die Grundlagen nur einen kleinen Teil des Vortrags/Live Codings ausmachen.

Den Abstrakt und die erforderliche Anmeldung (da es in einem Microsoft Gebäude stattfinden) findet Ihr

http://www.dotnet-ug-frankfurt.de/Event/tabid/119/ID/39/Default.aspx

Ich freue mich euch dort zu sehen und danach ins Brauhaus zum Fachsimpeln zu gehen. Also seht dies als Anmeldebefehl!

ASP.NET MVC 2 und Entity Framework: Folien, Beispiele, Übungsblätter (BASTA on tour, Mai 2010 in München)

19.05.2010 11:00:50 | Manfred Steyer

Nachfolgend können die Folien, Beispiele und Überblätter meines Workshops zu ASP.NET 2 MVC und Entity Framework von der BASTA on tour im Mai 2010 (München) heruntergeladen werden.

ASP.NET MVC - Erste Schritte
Folien | Beispiel | Übungsblatt

Anpassen der Standard-Fehlermeldung des Model-Binders:
http://www.softwarearchitekt.at/comment ... 404-211321

Entity Framework
http://www.softwarearchitekt.at/downloa ... in-one.zip


IIS Media Services to Include PlayReady DRM for HTTP Streaming

18.05.2010 22:11:52 | Damir Tomicic

Eine interessante Neuigkeit: die IIS Media Services (ein kostenfreie Erweiterung von IIS für das HTTP Streaming) wird mit kostenfreier DRM-Unterstützung (keine Lizenzkosten und -Abgaben) auf Basis der Microsoft PlayReady DRM Technologie [1] erweitert. Unterstützt dabei wird das Smooth Streaming [2] Szenario. Mit nur einem Klick in der IIS Management Konsole sollte das Stream geschützt werden können. Eine interessante Anwendung bspw. für die Live Streaming Events, die über HTTP Streaming angeboten werden (meistens natürlich die Sport- und Musikveranstaltungen).

Diese Funktionalität sollte nicht mit der vollständigen PlayReady-Funktionalität verwechselt werden. Es werden keine sonstigen Übertragungsprotokolle (bspw. Progressive Download) und Business Rules (DRM-Lizenzverwaltung für verschiedenen Kundenszenarien) angeboten. Durch die Implementierung werden lediglich die (Live) Streams automatisch mit PlayReady geschützt. Es ist keine Offline-Fähigkeit, wie mit Silverlight 4 angeboten, möglich. Trotzdem eine sehr interessante Erweiterung, die aufgrund der Einfachheit und Kostenfreiheit für einige Anbieter interessant sein wird.

[1] http://www.microsoft.com/playready/
[2] http://www.iis.net/SmoothStreaming

The length of the string exceeds the value set on the maxJsonLength property

18.05.2010 20:30:41 | Jan Welker

Wenn ein ASP.NET Webservice (ASMX) von Heute auf Morgen seinen Dienst mit folgender Exception verweigert:

“Error during serialization or deserialization using the JSON JavaScriptSerializer. The length of the string exceeds the value set on the maxJsonLength property.”

Liegt es wahrscheinlich daran, das sich die Datenmenge, die JSON-serialisiert zum Client geschickt wird, erhöht hat.

Diese Datenmenge ist dummerweise begrenzt wenn in der Web.config nichts anderes eingestellt ist.

Der Wert lässt sich erhöhen wenn in der Webconfig direkt nach dem Tag </ConnectionStrings> folgendes eingetragen wird:

<system.web.extensions>

<scripting>
<webServices>
<jsonSerialization maxJsonLength="2147483647"></jsonSerialization>
</webServices>
</scripting>
</system.web.extensions>

2147483647 sind Int32.MaxValue, das sollte reichen ;-)

Help & Support Center for AxCMS.net

18.05.2010 13:22:25 | Damir Tomicic

Meine Kollegen waren sehr fleissig in den letzten Wochen und haben den "Help & Support Center", die zentrale Anlaufstelle für alle Fragestellungen rund um das AxCMS.net vollständig überarbeitet - mehr Inhalte, mehr Interaktivität und eine ganz neue, gewichtete Suche:

[1] http://help.axcms.net/

Microsoft kündigt den Wechsel von Newsgroups (NNTP) zur Microsoft Foren-Plattform an

18.05.2010 08:55:48 | Oliver Scheer

Ab Juni 2010 wird Microsoft damit beginnen, seine Newsgroups (NNTP) im Usenet zu schließen und Diskussionen und Benutzer auf die Online-Foren von Microsoft Answers, TechNet und MSDN zu migrieren. Durch den Wechsel auf die Web-Foren werden Beiträge aus der Community künftig leichter auffindbar sein, darüber hinaus bieten die Microsoft-Foren Vorteile wie Abo- und Benachrichtigungsdienste, ein integriertes und individuell zu gestaltendes Online-Profil für jeden Benutzer sowie bessere Möglichkeiten zur Spambekämpfung. Über die Details der Umstellung informiert ein ausführlicher Hintergrund-Artikel im Microsoft Community Guide, dort gibt’s auch Antworten auf die wichtigsten Fragen zum Zeitplan und Erläuterungen zu den Vorteilen der webbasierten Microsoft Foren.

Die MSDN Blog-Parade geht in die zweite Runde! Mitmachen und gewinnen!

18.05.2010 08:53:23 | Oliver Scheer

MSDN Deutschland veranstaltet wieder eine Blog-Parade! Und wie beim letzten Mal, können Sie mit etwas Glück wieder eine Xbox 360 Elite plus zwei Spiele gewinnen! Bei der letzten Blog-Parade hatten viele Ihren Spaß dabei, Ihre favorisierten Entwickler-Tools vorzustellen. Und drei glückliche Gewinner hatten sogar noch mehr Spaß, da sie am Ende auch ein Paket von uns auspacken durften. :-)

Dieses Mal ist Ihre Kreativität gefragt! Wie Sie alle mitbekommen haben, ist das Thema Cloud Computing ein wesentlicher Bestandteil der zukünftigen Plattform von Microsoft. Aus diesem Grund wird das Thema dieser Blog-Parade sein, coole Ideen zu sammeln, was man alles mit Windows Azure machen kann. Ihrer Phantasie sind hier keine Grenzen gesetzt, ob es nun spezielle Web-Anwendungen sind oder Anwendungen, die sowohl lokal auf dem PC oder einem Windows Handy laufen, aber auch für innovative Funktionen, die die Cloud benötigen.

Viele weitere Informationen zum Ablauf der Blog-Parade können Sie im Blog Softwarehersteller in Deutschland finden. Hier finden Sie Infos, wie Sie teilnehmen können, was es zu beachten gilt und auch natürlich die Bedingungen für die Verlosung!

Ich wünsche viele gute Ideen und und auch viel Glück bei der Verlosung!

Hier geht’s zur Blog-Parade!

Windows 7 Media Center in 7 Sekunden

18.05.2010 08:09:48 | Damir Tomicic

Udo Sachansky, sehr guter Freund und unermüdlicher Leiter der Windows Media Center Community [1] in Deutschland, ist die neue Werbeikone für das Windows Media Center. Eine bessere Wahl gibt es nicht. Einfach Klasse Udo! :-)

[1] http://www.mce-community.de

Was hast du vor 10 Jahren programmiert

17.05.2010 23:14:13 | Andre Kraemer

Vor ein paar Wochen haben unter anderem Darius, Alex und Thomas darüber geblogged, was sie vor 10 Jahren programmiert haben.

Natürlich kam ich auch ins Grübeln und so fiel mir ein, dass ich zu dieser Zeit meine Zeit meist mit VB 6 Desktop Anwendungen, Outlook Formularanwendungen, oder aber PHP oder Classic ASP Webanwendungen verbracht habe. Allerdings habe ich seitdem mehrfach den Arbeitgeber gewechselt und die Source Codes daher auch nicht mehr im Zugriff. Somit war das Thema, einen Blogeintrag zu dieser Frage zu schreiben für mich eigentlich erledigt.

Eigentlich ...

Aber auch nur eigentlich, denn lustigerweise schickte mir letzte Woche ein ehemaliger Kollege aus heiterem Himmel einen alten Screenshot, den er irgendwo gefunden hatte.

Bei diesem Screenshot handelte es sich um einen Gag Screen einer Anwendung, die wir 1999 für die Finanzbuchhaltung der Nürburgring GmbH geschrieben hatten. Das Bild öffnete sich übrigens, wenn ich mich recht erinnere beim Klick auf ein Label. In den vier Jahren, in denen ich die Anwendung anschließend noch weiter betreut habe, kam allerdings nie eine Anfrage zu dieser Bildschirmmaske. Daher gehe ich mal davon aus, dass es niemand gefunden hat :-)

Auf dem Bild zu sehen sind übrigens mein damaliger Kollege, der ein ehemaliger Schulkamerad und mein späterer WG Mitbewohner war, und ich. Das Bild wurde allerdings nicht während der Arbeit, sondern während eine Pre-Game Grill Party eines Spiels der Frankfurt Galaxy aufgenommen. Zu rätseln, wer von uns beiden wer ist, überlasse ich den Lesern dieses Blogs.

programmierer

Schöne Erinnerung! Vielen Dank für das Bild Oliver!



blog.codemurai.de © André Krämer |Impressum | Abonieren

Nur noch 14 Tage bis zum Einsendeschluss beim Artikel-Wettbewerb im .NET-Forum

17.05.2010 21:59:26 | Jan Welker

Windows 7 Ultimate Heute in genau 14 Tagen ist der Einsendeschluss beim Zweiten Artikel Wettbewerb im dotnet-forum.de. Das Team des Forums ist auf der Suche nach Artikeln zu aktuellen Themen aus der .NET Welt. Interessant wären Artikel aus folgenden Bereichen: .NET 4.0, Visual Studio 2010, SharePoint 2010, F#, jQuery und PowerShell 2.

Bis jetzt ist die Anzahl eingereichter Artikel noch sehr überschaubar, die Chance auf einen der Preise ist also gar nicht so schlecht.

Zu gewinnen gibt es unter anderem ein Windows 7 Ultimate, eine Resharper Lizenz oder eine Freikarte für die dotnetpro Powerdays.

Alle Informationen zum Wettbewerb gibt es im Forum, wo natürlich auch eventuelle Fragen zur Veröffentlichung der Artikel in der KnowlegeBase beantwortet werden.

Das Team des Forums drückt allen Autoren die Daumen!

Hier geht’s direkt zum Wettbewerb

Converting Excel to XML using a macro

17.05.2010 15:35:00 | Andreas Mehl

VBA programs can be used to export data tables from Excel into simple XML files.

- Just open your Excel File and go on: (Extras -> Macros -> Visual Basic Editor)

- Right Click on the left Pane VBA Project on your VBAProject

- Add new Modul and Copy the following code into it:

 

Sub MakeXML()
' create an XML file from an Excel table
Dim MyRow As Integer, MyCol As Integer, Temp As String, YesNo As Variant, DefFolder As String
Dim XMLFileName As String, XMLRecSetName As String, MyLF As String, RTC1 As Integer
Dim RangeOne As String, RangeTwo As String, Tt As String, FldName(99) As String

MyLF = Chr(10) & Chr(13)    ' a line feed command
DefFolder = "C:\"   'change this to the location of saved XML files

YesNo = MsgBox("This procedure requires the following data:" & MyLF _
 & "1 A filename for the XML file" & MyLF _
 & "2 A groupname for an XML record" & MyLF _
 & "3 A cellrange containing fieldnames (col titles)" & MyLF _
 & "4 A cellrange containing the data table" & MyLF _
 & "Are you ready to proceed?", vbQuestion + vbYesNo, "MakeXML CiM")
 
If YesNo = vbNo Then
 Debug.Print "User aborted with 'No'"
 Exit Sub
End If

XMLFileName = FillSpaces(InputBox("1. Enter the name of the XML file:", "MakeXML CiM", "xl_xml_data"))
If Right(XMLFileName, 4) <> ".xml" Then
 XMLFileName = XMLFileName & ".xml"
End If

XMLRecSetName = FillSpaces(InputBox("2. Enter an identifying name of a record:", "MakeXML CiM", "record"))

RangeOne = InputBox("3. Enter the range of cells containing the field names (or column titles):", "MakeXML CiM", "A3:D3")
If MyRng(RangeOne, 1) <> MyRng(RangeOne, 2) Then
  MsgBox "Error: names must be on a single row" & MyLF & "Procedure STOPPED", vbOKOnly + vbCritical, "MakeXML CiM"
  Exit Sub
End If
MyRow = MyRng(RangeOne, 1)
For MyCol = MyRng(RangeOne, 3) To MyRng(RangeOne, 4)
 If Len(Cells(MyRow, MyCol).Value) = 0 Then
  MsgBox "Error: names range contains blank cell" & MyLF & "Procedure STOPPED", vbOKOnly + vbCritical, "MakeXML CiM"
  Exit Sub
 End If
 FldName(MyCol - MyRng(RangeOne, 3)) = FillSpaces(Cells(MyRow, MyCol).Value)
Next MyCol

RangeTwo = InputBox("4. Enter the range of cells containing the data table:", "MakeXML CiM", "A4:D8")
If MyRng(RangeOne, 4) - MyRng(RangeOne, 3) <> MyRng(RangeTwo, 4) - MyRng(RangeTwo, 3) Then
  MsgBox "Error: number of field names <> data columns" & MyLF & "Procedure STOPPED", vbOKOnly + vbCritical, "MakeXML CiM"
  Exit Sub
End If
RTC1 = MyRng(RangeTwo, 3)

If InStr(1, XMLFileName, ":\") = 0 Then
 XMLFileName = DefFolder & XMLFileName
End If

Open XMLFileName For Output As #1
Print #1, "<?xml version=" & Chr(34) & "1.0" & Chr(34) & " encoding=" & Chr(34) & "ISO-8859-1" & Chr(34) & "?>"
Print #1, "<meadinkent>"

For MyRow = MyRng(RangeTwo, 1) To MyRng(RangeTwo, 2)
Print #1, "<" & XMLRecSetName & ">"
  For MyCol = RTC1 To MyRng(RangeTwo, 4)
  ' the next line uses the FormChk function to format dates and numbers
     Print #1, "<" & FldName(MyCol - RTC1) & ">" & RemoveAmpersands(FormChk(MyRow, MyCol)) & "</" & FldName(MyCol - RTC1) & ">"
  ' the next line does not apply any formatting
  '  Print #1, "<" & FldName(MyCol - RTC1) & ">" & RemoveAmpersands(Cells(MyRow, MyCol).Value) & "</" & FldName(MyCol - RTC1) & ">"
    Next MyCol
 Print #1, "</" & XMLRecSetName & ">"

Next MyRow
Print #1, "</meadinkent>"
Close #1
MsgBox XMLFileName & " created." & MyLF & "Process finished", vbOKOnly + vbInformation, "MakeXML CiM"
Debug.Print XMLFileName & " saved"
End Sub
Function MyRng(MyRangeAsText As String, MyItem As Integer) As Integer
' analyse a range, where MyItem represents 1=TR, 2=BR, 3=LHC, 4=RHC

Dim UserRange As Range
Set UserRange = Range(MyRangeAsText)
Select Case MyItem
 Case 1
 MyRng = UserRange.Row
 Case 2
 MyRng = UserRange.Row + UserRange.Rows.Count - 1
 Case 3
 MyRng = UserRange.Column
 Case 4
 MyRng = UserRange.Columns(UserRange.Columns.Count).Column
End Select
Exit Function

End Function
Function FillSpaces(AnyStr As String) As String
' remove any spaces and replace with underscore character
Dim MyPos As Integer
MyPos = InStr(1, AnyStr, " ")
Do While MyPos > 0
 Mid(AnyStr, MyPos, 1) = "_"
 MyPos = InStr(1, AnyStr, " ")
Loop
FillSpaces = LCase(AnyStr)
End Function

Function FormChk(RowNum As Integer, ColNum As Integer) As String
' formats numeric and date cell values to comma 000's and DD MMM YY
FormChk = Cells(RowNum, ColNum).Value
If IsNumeric(Cells(RowNum, ColNum).Value) Then
 FormChk = Format(Cells(RowNum, ColNum).Value, "#,##0 ;(#,##0)")
End If
If IsDate(Cells(RowNum, ColNum).Value) Then
 FormChk = Format(Cells(RowNum, ColNum).Value, "dd mmm yy")
End If
End Function

Function RemoveAmpersands(AnyStr As String) As String
Dim MyPos As Integer
' replace Ampersands (&) with plus symbols (+)

MyPos = InStr(1, AnyStr, "&")
Do While MyPos > 0
 Mid(AnyStr, MyPos, 1) = "+"
 MyPos = InStr(1, AnyStr, "&")
Loop
RemoveAmpersands = AnyStr
End Function

 

- Execute the script and Insert your Ranges to get the data.

Note that the program formats numeric and date values using a function called FormChk(). You may choose to either remove the function and edit the reference to it in the main procedure, or alternatively enter your own formatting strings.

The program also includes a function called RemoveAmpersands() which replaces the '&' symbol with '+'. Certain characters such as '&' need special instructions to get correctly displayed in a browser.

 

Fehler : Testverwaltungsfunktionen werden unter Windows Home nicht unterstützt

17.05.2010 13:56:30 | Christian Binder

Was meint diese Fehlermeldung, wenn der Testmanager 2010 auf einem Windows Home gestartet wird?

image

Dass die Windows Home Edition nicht die Verwaltung von Testplänen unterstützt, wenn der TFS lokal installiert und verwendet wird. Die Windows Home Editionen unterstützen natürlich die Testausführung als Client und die Verwaltung der Testpläne, wenn der TFS nicht lokal auf der Windows Home Edition verwendet wird. Wer aber alles lokal auf einem Windows Client nutzen möchte, benötigt eine höhere Windows Edition als Home. Diese Limitierung ist leider nicht eindeutig Dokumentiert, was wir schnellstens nachholen werden.

Hinweis: Der technische Hintergrund der Limitierung ist, dass der IIS auf der Windows Home Edition kein NTLM Authentication unterstützt.

Chris

Die MSDN Blog-Parade geht in die zweite Runde! Mitmachen und gewinnen!

17.05.2010 13:30:00 | Peter Kirchner

MSDN Deutschland veranstaltet wieder eine Blog-Parade! Und wie beim letzten Mal, können Sie mit etwas Glück wieder ein von drei Xbox 360 Elite-Paketen inkl. zwei Spielen gewinnen!

Die letzte Blog-Parade war ein toller Erfolg und fast 60 Teilnehmer hatten Ihren Spaß dabei, Ihre favorisierten Entwickler-Tools vorzustellen. Und drei glückliche Gewinner hatten sogar noch mehr Spaß, da sie am Ende auch ein Paket von uns auspacken durften. :-)

Thema der Blog-ParadeDieses Mal ist Ihre Kreativität gefragt! Wie Sie alle mitbekommen haben, ist das Thema Cloud Computing ein wesentlicher Bestandteil der zukünftigen Plattform von Microsoft. Aus diesem Grund wird das Thema dieser Blog-Parade sein, coole Ideen zu sammeln, was man alles mit Windows Azure machen kann. Ihrer Phantasie sind hier keine Grenzen gesetzt, ob es nun spezielle Web-Anwendungen sind oder Anwendungen, die sowohl lokal auf dem PC oder einem Windows Handy laufen, aber auch für innovative Funktionen, die die Cloud benötigen.

Wer das letzte Mal schon teilgenommen hat, kann hier jetzt gleich in den Kreativmodus übergehen und die ersten Ideen posten. Damit es sich auch lohnt wirklich kreativ zu sein, werden zusätzlich die besten Ideen in unserem /Partner-Portal veröffentlicht. (Wer es noch nicht kennt, kann sich hier informieren.) Natürlich ist dies vollkommen unabhängig davon, ob Sie als Gewinner ausgelost werden.

Ich habe versucht, möglichst viele Fragen schon im Vorfeld zu klären, sollte nach dem Lesen dieses Start-Artikels noch etwas unklar sein, schreibt mir einfach eine E-Mail (z.B. über die PingMe-Karte auf der rechten Seite) oder schreibt Eure Frage hier als Kommentar rein.

Wer noch nicht weiß, was eine Blog-Parade ist, was Windows Azure ist oder noch ein paar Beispiele für Ideen braucht, hier einfach weiterlesen.

Was ist Windows Azure?

Einen Überblick zu Windows Azure können Sie sich in diesem Webcast verschaffen. Wenn ein bisschen mehr sein darf, haben wir hier auch über 25 Webcasts zum Thema Windows Azure! Und wer noch tiefer einsteigen möchte, schaut hier auf Channel 9 an, was wir zu diesem Thema haben.

Keine Ideen? Hier ein paar Beispiele!

  • Ein Beispiel für eine coole Azure-Anwendung hat ein Kollege von mir geschrieben und vor kurzem veröffentlicht. Er hat eine Suche für Group Policies geschrieben und diese in die Cloud gestellt. Schauen Sie es sich am besten sofort an. (Welche Vorteile damit verbunden sind, können Sie hier erfahren.)
  • Weitere Ideen von mir (keine Angst, ich nehme am Gewinnspiel nicht teil…):
    • Auf dem Desktop: Ein Passwortverwaltungsprogramm könnte zusätzlich die Passwörter in Windows Azure speichern, damit der Benutzer von überall auf der Welt auf seine Daten zugreifen kann.
    • Im Web: Eben erwähntes Passwortverwaltungsprogramm bietet für Kunden zusätzlich ein Web-Frontend, um auch nur über den Browser auf die eigenen Daten zuzugreifen.
    • Auf dem Handy: Zusätzlich erstellen wir eine Anwendung für Windows Mobile oder Windows Phone 7, um auch vom Handy aus, auf die Daten in der Cloud zuzugreifen.

Was ist eine Blog-Parade, wer kann mitmachen und wie funktioniert es?

1. Bei einer Blog-Parade gibt es immer ein Thema, das vorgegeben wird. Gestartet wird eine Blog-Parade, wie sollte es anders sein, ebenfalls durch einen Blog-Beitrag.

2. Jeder kann an einer Blog-Parade teilnehmen, indem man in seinem eigenen Blog einen Beitrag zu dem gestellten Thema schreibt.

  • Schreiben Sie also einen Artikel mit Ihren Ideen für eine Anwendung, die sich die Vorteile von Windows Azure zunutze macht. Erläutern Sie zum Verständnis Ihre Idee, damit Sie auch für die anderen Leser nachvollziehbar ist.
  • Wir sammeln Ideen! Die Lösung muss also nicht bereits implementiert sein.

3. Indem man im eigenen Artikel zum Ursprungs-Beitrag der Blog-Parade verweist, wird von Blog-Programmen in der Regel automatisch ein Verweis beim Ursprungs-Blog-Beitrag erstellt.

    1. Verweisen Sie in Ihrem Artikel auf diesen Start-Artikel hier, damit von Ihrem Blog ein Trackback (Rückverweis) erzeugt wird. So sehen wir, wer an der Aktion teilgenommen hat.
    2. Sollte das nicht automatisch geschehen, schreiben Sie hier einfach einen Kommentar mit einem Link zu Ihrem Blog-Beitrag. Keine Angst, wenn Sie Ihren Kommentar nicht sofort sehen. Die Kommentare müssen von mir erst freigeschaltet werden.
    3. Update (18.5.10): ich habe gerade gesehen, dass derzeit für unsere Blog-Plattform ein Upgrade durchgeführt wird. Bitte senden Sie mir über das Kontaktformular einen Verweis auf Ihren Blog-Beitrag, solange die ersten beiden Punkte nicht funktionieren. Ich werde Ihre Links dann später bei den Kommentaren nachtragen.

4. Und damit sind Sie schon dabei!

5. Die Blog-Parade läuft bis zum 21.06.2010 (einschließlich).

    • Innerhalb der darauf folgenden zwei Wochen werden wir dann die glücklichen Gewinner anschreiben und bekannt geben.

Gibt es auch etwas zu gewinnen?

Um die Motivation für die Teilnahme wieder etwas zu heben, verlosen wir unter allen Teilnehmern drei Mal je ein Xbox Elite Paket inkl. zwei Spielen! Wer an der Verlosung teilnehmen möchte, sollte in seinem Blog ein Kontaktformular- oder -adresse haben, damit wir Sie anschreiben können. (In Bezug auf die Verlosung bitte das "Kleingedruckte" unten beachten.)

3 Xboxen 360 Elite und jeweils zwei Spiele

Ideen klauen gilt nicht! ;-)

Um zu verhindern, dass einfach Ideen von anderen übernommen werden, machen wir es dieses Mal so, dass nur einzigartige Ideen zählen. Das bedeutet auch, wer zuerst kommt, mahlt zuerst. Hierbei gilt dann das Datum und die Uhrzeit, die vom Trackback erzeugt wurde oder vom Kommentar, den Sie hier schreiben.

Das Kleingedruckte

  1. Teilnahmeberechtigt an der Verlosung ist jeder, ausgenommen Mitarbeiter von Microsoft und deren Angehörige.
  2. Jeder Teilnehmer darf mehrmals teilnehmen. Die Chancen für die Verlosung erhöhen sich dadurch nicht.
  3. Teilnahmeschluss für die Verlosung ist der 21.06.2010.
  4. Aus allen Einsendungen werden drei Gewinner per Los gezogen.
  5. Gewinn ist jeweils ein Xbox 360 Elite Paket inklusive zwei Spielen.
  6. Alle Gewinner werden per E-Mail benachrichtigt.
  7. Die Zustellung des Gewinns erfolgt auf dem Postweg auf eigene Gewähr. Eine korrekte Angabe Ihrer Daten ist Voraussetzung für die korrekte Zustellung im Falle eines Gewinns.
  8. Die Gewinner erklären sich mit einer Veröffentlichung Ihrer Vornamen und des Anfangsbuchstabens des Nachnamens mit Wohnortangabe im Blog blogs.msdn.com/softwarehersteller einverstanden.
  9. Die Ausbezahlung der Preise in bar ist nicht möglich.
  10. Der Rechtsweg ist ausgeschlossen.
  11. Gewährleistungsansprüche hinsichtlich der Gewinne sind gegenüber Microsoft Deutschland GmbH ausgeschlossen.

Keynote beim .NET Day Franken

17.05.2010 11:30:05 | Damir Tomicic

Ich freue mich sehr über die Gelegenheit wieder in der Metropolregion auf der Bühne zu stehen. Eine Keynote beim ".NET Day Franken" [1] am 26.06.2010 im NH City Hotel in Nürnberg. Und ich überlege mir gerade was feines für die Keynote: dodned at its best .. :-)

[1] http://www.dotnet-day-franken.de/Agenda.html

dotnet Cologne 2010: Vortrag zur Windows Phone 7 Entwicklung

17.05.2010 09:18:48 | Peter Nowak

Bereits nächste Woche, am 28.05.2010, findet die dotnet Cologne 2010, wie der Name schon vermuten lässt, in Köln statt.

Auch ich werde dieses Mal mit von der Partie sein. Thema ist dieses Mal die Entwicklung für das Windows Phone 7.

Der Vortrag hierzu findet um 16:15 Uhr statt .

Weitere Informationen zur dotnet Cologne findet Ihr hier.



This posting is provided "AS IS" with no warranties, and confers no rights.

Windows Phone 7 und das Einbinden von Webservices

17.05.2010 08:10:00 | Oliver Scheer

Die Werkzeuge für Windows Phone 7 sind zwar schon sehr gut, aber einfach noch nicht ganz fertig. Das merkt man unter Visual Studio 2010 (RTM) besonders dann, wenn man mal eben einen Webservice in seine Windows Phone 7 Anwendung integrieren möchte.

Dort fehlt nämlich einfach dieser Menüpunkt:

image

Aber nicht verzagen … Visual Studio 2010 Express For Windows Phone fragen:

image

Da geht es nämlich schon … muss man nur wissen :-)

Was bedeutet eigentlich System.webServer – “validateIntegratedModeConfiguration” & “runAllManagedModulesForAllRequests”

17.05.2010 01:03:41 | Robert Mühsig

Ein Kollege, der eine IIS6 Webapplikation auf IIS7 migriert, fragte mich was denn eigentlich dieses Validation Tag bedeutet. Unter ASP.NET 4.0 ist die Web.config um einiges schlanker, allerdings taucht das Validation und Modules Tag wieder auf. Was hat es mit den beiden Flags auf sich? Migration auf IIS7 Der Post soll nur die beiden Properties [...]SHARETHIS.addEntry({ title: "Was bedeutet eigentlich System.webServer – “validateIntegratedModeConfiguration” & “runAllManagedModulesForAllRequests”", url: "http://code-inside.de/blog/2010/05/17/was-bedeutet-eigentlich-system-webserver-validateintegratedmodeconfiguration-runallmanagedmodulesforallrequests/" });

Auf den Spuren von Ruby on Rails: ASP.NET Dynamic Data - Beispiel und Artikel

16.05.2010 15:39:49 | Manfred Steyer

ASP.NET WinForms ist längst nicht mehr das einzige Web-Framework im Lieferumfang von .Net 4. Neben ASP.NET MVC wurde vor einiger Zeit auch ASP.NET Dynamic Data als Alternativen hinzugefügt. Dynamic Data verfolgt dabei die von Ruby on Rails bekannten Ansätze Scaffolding und Convention over Configuration . Diese erlauben ein sehr rasches Erstellen von Datenbank-getriebenen Web Sites anhand eines gegebenen Datenmodells.

Im aktuellen dot.net-Magazin zeige ich anhand eines Beispiels, wie man die neue Version 4 von Dynamic Data nutzen, aber auch durch Templates und Attribute erweitern kann.

Downloaden kann man das Beispiel hier .



MVVM Pattern und user interaction (modal dialogs)

15.05.2010 11:10:00 | Patric Schouler

If you are using a MVVM pattern you have quickly the problem, that you need stuff like confirmation dialogs or message boxes to interact with the user. In my actual project (Silverlight 4 project with RIA Services hosted at the Windows Azure cloud) I use the approach to define a neutral interface IDialogProvider and a implementation with specific coding to show popup windows and return optional the result via callbacks. With this approach the view model is still independent from the presentation layer and testable with unit tests.

Architecture

image 

Implementation draft

The interface:
   1: public interface IDialogControlProvider
   2:     {
   3:         void DisplayErrorDialog(string errorMessage);
   4:         void DisplayInformationDialog(string informationMessage);
   5:         void DisplayConfirmationDialog(string title,string message,Action<int> callback);
   6:  
   7:     }
The implementation:
   1: public class DialogControlProvider:IDialogControlProvider
   2:     {
   3:  
   4:         #region IDialogProvider Members
   5:  
   6:         public void DisplayErrorDialog(string errorMessage)
   7:         {
   8:             var popup=new PopupErrorMessage("Fehlermeldung",errorMessage,true);
   9:             popup.Show();
  10:         }
  11:  
  12:         public void DisplayInformationDialog(string informationMessage)
  13:         {
  14:             var popup = new PopupErrorMessage("Information", informationMessage, false);
  15:             popup.Show();
  16:         }
  17:  
  18:         public void DisplayConfirmationDialog(string title,string message, Action<int> callback)
  19:         {
  20:             var result = SdxDialogResult.Yes;
  21:             callback(result);
  22:         }
Usage in the View model:

private IDialogControlProvider _dialogControl;

_dialogControl can be set via the contructor of the view model instance (in my case a view model locator class) or with a special initialize method.

   1: _dialogControl.DisplayConfirmationDialog("Frage", "Soll wirklich gespeichert werden?",
   2:     (dialogResult) =>
   3:     {
   4:         if (dialogResult == SdxDialogResult.Yes)
   5:         {
   6:             // do something
   7:         }
   8:     }

Zwei Properties beim ViewModel auf Gleichheit prüfen mit ASP.NET MVC 2

15.05.2010 01:21:08 | Albert Weinert

Es gibt Anlässe bei denen man beim Input ViewModel prüfen muss ob zwei Properties den gleichen Inhalt haben. Ein typischer Fall ist die Kennwort-Eingabe in einem Webformular.

ASP.NET MVC 2 bietet da nichts out of the Box, aber über die DataAnnotations-Validierung kann man sich einfach eigenen Attribute bauen die dies machen können.

Vor einiger Zeit stellte Thomas Bandt eine Lösung vor, diese war mit bei den Property-Namen ein wenig zu tolerant (die Groß- und Kleinschreibung war egal) und es wurde ein eventuell angegebener Display Name nicht in die Fehlermeldung übernommen.

Diese Lösung habe ich verbessert und stelle dies nun auch der Allgemeinheit zu Verfügung.

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
public sealed class PropertiesMustMatchAttribute : ValidationAttribute
{
    private const string DefaultErrorMessage = "'{0}' and '{1}' do not match.";

    private readonly string confirmProperty;
    private readonly string originalProperty;
    private ModelMetadata metaData;

    public PropertiesMustMatchAttribute(string originalProperty, string confirmProperty)
        : base(DefaultErrorMessage)
    {
        this.originalProperty = originalProperty;
        this.confirmProperty = confirmProperty;
    }

    public override string FormatErrorMessage(string name)
    {
        return String.Format(CultureInfo.CurrentCulture,
                             ErrorMessageString,
                             GetPropertyDisplayName(originalProperty),
                             GetPropertyDisplayName(confirmProperty)
            );
    }

    private string GetPropertyDisplayName(string propertyName)
    {
        var displayName = metaData.Properties
            .Where(s => s.PropertyName == propertyName)
            .Single().DisplayName;
        return string.IsNullOrEmpty(displayName) ? propertyName : displayName;
    }

    public override bool IsValid(object instance)
    {
        metaData = ModelMetadataProviders.Current.GetMetadataForType(() => instance, instance.GetType());

        return Equals(GetValueFromProperty(instance, originalProperty),
                      GetValueFromProperty(instance, confirmProperty));
    }

    private static object GetValueFromProperty(object value, string propertyName)
    {
        return value.GetType().GetProperty(propertyName).GetValue(value, null);
    }
}

Die Anwendung ist identisch mit der Variante von Thomas. Einfach eine Klasse damit attributieren und gut ist.

[PropertiesMustMatch("Password", "PasswordConfirmation")]
public class UserRegistrationModel
{
    [Required]
    [StringLength(32)]
    public string Username { get; set; }

    [Required]
    [StringLength(256)]
    public string EMail { get; set; }

    [Required]
    public string Password { get; set; }

    [Required]
    public string PasswordConfirmation { get; set; }
}

Die Validierung funktioniert auch mit meiner Methode zum Unit-Testen von Validierungen.

Bei meinem Projekt ist die Klasse natürlich selbst auch komplett mit Unit-Tests abgedeckt, diese könnt Ihr euch im Repository ansehen. Die Tests sind im BDD Style mit den von mir verwendeten Framework xUnit.net mit den xunitbddextensions von Björn Rochel.

Input Validierung im Unit Test mit ASP.NET MVC 2

14.05.2010 16:25:51 | Albert Weinert

Mit ASP.NET MVC 2 ist es ja nun möglich über DataAnnotations oder mit eigenen ModelValidatoren eine schnelle und einfache Validierung der Eingabedaten vorzunehmen. Dieses im Unit Test zu machen ist jedoch out of the Box nicht möglich.

Thomas Bandt hat dazu mal einen Blog Beitrag geschrieben. Der sich jedoch rein auf DataAnnotations bezieht und keine anderen ModelValdator berücksichtigt. Dies ist natürlich nicht ganz so gut. Desweiteren funktioniert sie nur unter .NET 4 und man kann damit nicht den Programmfluss im Controller selbst testen (was macht dieser bei invaliden Daten?).

Hier stelle ich eine Extension-Method vor die ohne diese Schwachpunkte auskommt.

public static class ControllerValidationExtensions
 {
     public static void ValidateModel(this Controller controller, object model)
     {
         ValidateModel(controller, model, null);
     }

     public static void ValidateModel(this Controller controller, object model, string prefix)
     {
         if (model == null)
         {
             throw new ArgumentNullException("model");
         }
         EnsureControllerContext(controller);
         foreach (ModelValidationResult validator in model.GetModelValidator(controller).Validate(model))
         {
             controller.AddModelError(prefix, validator);
         }
     }

     private static void EnsureControllerContext(Controller controller)
     {
         if (controller.ControllerContext==null)
         {
             controller.ControllerContext=new ControllerContext();
         }
     }

     private static ModelValidator GetModelValidator(this object model, Controller controller)
     {
         return ModelValidator.GetModelValidator(
             ModelMetadataProviders.Current.GetMetadataForType(() => model, model.GetType()),
             controller.ControllerContext
             );
     }

     private static void AddModelError(this Controller controller, string prefix, ModelValidationResult validator)
     {
         controller.ModelState.AddModelError(
             CreateSubPropertyName(prefix, validator.MemberName),
             validator.Message);
     }

     private static string CreateSubPropertyName(string prefix, string propertyName)
     {
         if (string.IsNullOrEmpty(prefix))
         {
             return propertyName;
         }
         if (string.IsNullOrEmpty(propertyName))
         {
             return prefix;
         }
         return (prefix + "." + propertyName);
     }
 }

Ruft man dies nun im Testlauf vor dem Aufruf der Controller-Action auf, so ist auch der ModelState mit den entsprechenden Fehlern gefüllt. Auch werden die im ASP.NET MVC registrierten MetaDataProvider und ModelValidatoren dafür verwenden. Eine eventuelle Registrierung dieser muss natürlich im Test erfolgen.

Nun ein kleines, einfaches Beispiel.

Gegeben ist folgendes ViewModel

public class UserRegistrationModel
{
    [Required]
    public string Username { get; set; }

    [Required]
    public string EMail { get; set; }

    [Required]
    public string Password { get; set; }

    [Required]
    public string PasswordConfirmation { get; set; }
}

und dieser Controller, der bewusst einfach gehalten ist, damit schneller erfasst werden kann.

public class UserRegistrationController : RegularlyController
{
    private readonly IUserRegistration userRegistration;
    private readonly IRegularlyContext regularlyContext;

    public UserRegistrationController(IUserRegistration userRegistration, IRegularlyContext regularlyContext)
    {
        this.userRegistration = userRegistration;
        this.regularlyContext = regularlyContext;
    }

    public ActionResult Index()
    {
        return View(new UserRegistrationModel());
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Index(UserRegistrationModel model)
    {
        if (ModelState.IsValid)
        {
            /* magie */
            return RedirectToAction("ThankYou");
        }
        return View(model);
    }
}

Der Ablauf eines typischen Test wäre dann folgender

[Fact]
public void SimpleValidationTest()
{
    var controller = new UserRegistrationController(null,null);
    var postModel = new UserRegistrationModel
    {
        EMail = "info@der-albert.com",
        Password = "password",
        PasswordConfirmation = "password"
    };

    controller.ValidateModel(postModel);
    var result = controller.Index(postModel);

    result.ShouldBeAnInstanceOf<ViewResult>();
}

Die Validierung muss manuell durchgeführt werden bevor die Action aufgerufen wird. Dies passiert im Framework auch davor. Bei einem Test ohne die Validierung würde immer ein RedirectRouteResult zurückgegeben.

Viel Spaß damit!

Telling the Media Transformation Story: The Olympic Games

14.05.2010 14:47:59 | Damir Tomicic

Ob Sport, Musik oder Kultur - die Events werden zunehmend interaktiver, immer mehr Menschen konsumieren die Medien im Netz. Die Fragestellung der Live-Übertragung über das Netz beschäftigt sowohl die Technologen als auch die Anbieter seit vielen Jahren. Es sind viele Hürden zu überwinden, angefangen von einer einfachen Einspeisung des Signals und der Konvertierung in ein geeignetes Internet-fähiges HD Stream-Format mit möglichst kleiner Zeitverschiebung (die Nachbarn jubeln bereits, obwohl der Angriff noch läuft .. ) bis hin zu den Monetarisierungsstrategien - ob werbebasiert oder pro Abruf mit angeschlossenen Zahlungssystemen.

Diese Fragestellung wird zu einer Herausforderung sobald die Übertragung eine verhältnismässig große Anzahl der Benutzer anspricht. So wie im Fall der olympischen Spiele. Ich habe im Jahr 2008 ausführlich über die die olympischen Sommerspiele berichtet. Damals haben wir gemeinsam mit Akamai die neue Smooth Streaming Technologie vorgestellt:

[1] http://tomicic.de/2008/11/14/Xtopia08ImZeichenVonHD.aspx
[2] http://tomicic.de/2008/12/17/Xtopia2008Videos.aspx

Die olympischen Winterspiele in diesem Jahr brachten einige Neuheiten mit sich, die in den folgenden drei Referenzstudien ausführlich beschrieben sind:

[3] http://www.microsoft.com/casestudies/Case_Study_Detail.aspx?casestudyid=4000007275
[4] http://www.microsoft.com/casestudies/Case_Study_Detail.aspx?casestudyid=4000007271
[5] http://www.microsoft.com/casestudies/Case_Study_Detail.aspx?casestudyid=4000007258

Neben der bekannten NBC-Referenz, wurden die gleiche Technologien (Silverlight, IIS Media Services etc.) in Frankreich (France TV) und in Norwegen (NRK) eingesetzt. Es wurde nicht nur live gestreamt, sondern gleich dazu auch in HD-Qualität mit automatisch wechselnder Qualität pro verfügbaren Bandbreite (Smooth Streaming) aus verschiedenen Perspektiven mit interaktiver Werbung.

Bei NBC lag bspw. die maximale Anzahl der gleichzeitigen Abrufe (Concurrent Active Live Streams) bei unglaublichen 181.000 parallelen Streams. Insgesamt haben rund 16 Millionen Unique Users das Angebot abgerufen und 50 Millionen streams konsumiert.

Die Zahlen aus Kanada (CTV) sind genauso beeindruckend: "... CTV Streams 6.2 Petabytes of Winter Olympics To over 3.9 Million Visitors, Making Every Second Count .."

[6] http://www.microsoft.com/casestudies/Case_Study_Detail.aspx?CaseStudyID=4000007347

Mit solchen Zahlen lässt sich sehr gut die notwendige Skalierung und das Verhalten der verschiedenen Technologien abschätzen.

[7] http://www.iis.net/extensions/SmoothStreaming

[Update]

Inzwischen ist auch ein Whitepaper zum Thema (NBC Online) veröffentlicht worden:

[8] http://learn.iis.net/page.aspx/900/nbc-online-video-monetization-and-highlights-creation-for-the-2010-winter-olympics/

Neues in Expression Blend 4: Liebe macht Blend!

13.05.2010 14:47:50 | Gregor Biswanger

expression-blend-4-logo

In Expression Blend 4 haben sich einige neue Dinge getan. Das Beste daran ist, das alle Vorbesitzer von Expression Blend 3 die neue Version kostenfrei beziehen können. Aktuell gibt es nur die RC-Version, die es hier zum kostenfreien Download gibt.

 

Interoperabilität mit Visual Studio 2010

Expression Blend 4 und Visual Studio 2010 verwenden dasselbe Projektformat. Somit wird weiterhin die gemeinsame Arbeit der beiden Tools unterstützt. Wichtig dabei zu beachten gilt, dass ein VS2008-Projekt automatisch zu einem VS2010-Projekt abgeändert wird.

 

Das PathListBox Control

Die PathListBox ist ein neues Control, das eine ganz neue Art zur Veranschaulichung der Daten widergibt. Die Items werden mit einem flexiblen Layout dargestellt. Dabei geben Path-Elemente eine Vorlage für deren Position ab.

Als Beispiel wird ein neues Projekt in Expression Blend 4 angelegt. Dieses Projekt bekommt dann ein PathListBox links oben in die Ecke rein.

abb1-Path-Element-hinzufuegen

Abb.1. – PathListBox hinzufügen.

Anschließend werden Beispieldaten mittels Data-Funktionalität bereitgestellt. Wie die Data-Funkion in Expression Blend verwendet werden kann, beschreibt bereits dieser Blog-Post: “Expression Blend 3 - Daten für Designer bereitstellen”. In diesem Beispiel wurden zwei Properties der Collection hinzugefügt. Einmal ein Image und zum zweiten ein Price-Property.

abb2-beispieldaten-anlegen

Abb.2. – Mittels Data-Feature Beispieldaten bereitstellen.

Anschließend wird mittels Drag & Drop die Collection auf das PathListBox-Element gedroppt. Wenn alles richtig gemacht wurde, wird bereits das erste Item angezeigt.

Abb3–Beispieldaten-mit-PathListBox-binden

Abb.3. – Beispieldaten mit PathListBox binden.

Als Path-Element soll hier eine Ellipse dienen, die in die Mitte des Bildschirms platziert wird.

Abb4–Ellipse-zeichnen

Abb.4. – Ellipse zeichnen

Nun muss der PathListBox die Ellipse zugewiesen werden. Dazu wird die PathListBox ausgewählt und im Eigenschaftenfenster unter „Layout Paths“ mit gedrückter Maustaste das SelectionIcon auf die Ellipse gezogen. Nun sollten bereits alle Beispieldaten der Ellipse entlang Anzeigen.

Abb5–Ellipse-der-PathListBox-zuweisen

Abb.5. – Ellipse der PathListBox zuweisen.

Zum Ende wird nun der Ellipse die Hintergrund- und Rahmenfarbe zurückgesetzt. Somit verabschiedet sich quasi die Ellipse von der Bildfläche.

Abb6–Die-Ellipse-unsichtbar-machen

Abb.6. – Die Ellipse „unsichtbar“ machen.

Beim Starten der Anwendung mittels F5-Taste, können die Stuhl-Produkte ganz angenehm mit einer neuen Usability bedient werden.

Abb7–Die-fertige-WPF-Anwendung-mit-PathListBox

Abb.7. – Die fertige WPF-Anwendung mit PathListBox.

Das MVVM mit Expression Blend 4

Während ich vor langer Zeit versuchte ein MVVM mittels Expression Blend zu erzeugen und dies hier bloggen wollte, bringt Expression Blend 4 nun endlich eine eigene Projektvorlage für dieses Pattern mit.

Beim Startbildschirm, ganz gleich ob WPF oder Silverlight, werden „Databound“-Applications als Projektvorlage angeboten.

Abb8-Neue-databound-Projektvorlagen

Abb.8.- Neue Databound-Projektvorlagen für ein integriertes MVVM-Pattern.

Das Projekt hat bereits ein einfaches Beispiel integriert. Dieses kann vorerst mit der Taste F5 betrachtet werden. Es zeigt einen einfachen Text und einem Button in der Mitte des Bildschirms. Beim Klicken des Buttons, ändert sich die Information des Textes.

Abb9-Vorschau-der-fertigen-Anwendung

Abb.9. – Vorschau der fertigen Anwendung.

Bei genauerer Betrachtung ist eine fertige Vorlage wie folgt aufgebaut. Unter Views ist ein einzelnes Oberflächen-Element enthalten. Bei genauerer Betrachtung, besteht Sie nur aus einem TextBlock- und einem Button-Element. Zudem wurde diesem Button eines der neuen CallMethodAction-Behavior zugewiesen. Bei diesem Behavior wird automatisch ein Command auf eine gewünschte Methode eines ViewModels definiert, ohne das eine Zeile Code dazu selbst geschrieben werden muss. Das ViewModel beinhaltet ein String-Property, das mittels INotifyPropertyChanged vollste Data-Binding Funktionalität liefert. Weitere Infos hier unter Norbert Eders Blog, zum Thema: View, ViewModel und Model im Detail.

Abb10-Projektstruktur-der-fertigen-MVVM-Vorlage

Abb.10. – Projektstruktur der fertigen MVVM-Projektvorlage.

Neue View + dazugehöriges ViewModel anlegen

Sehr angenehm ist das hinzufügen einer neuen View inklusive einem dazugehörigen ViewModel. Dazu wird einfach mit der rechten Maustaste auf das Projekt, ein neues Item hinzugefügt. Hier hat man nun die Auswahl, eine neue View + ViewModel anzulegen. Die View beinhaltet automatisch eine Zuweisung zum ViewModel. Das ViewModel beinhaltet nur noch eine fertige INotifyPropertyChanged Implementation.

Abb11–Neue-View ViewModel-anlegen

Abb.11. – Neue View + ViewModel anlegen.

 

Bestendes Model mit Data-Funktionalität für Designer nutzen

Ab Expression Blend 3 kann wie bereits hier im Artikel genannt wurde, für Desinger gemockte Daten zur Verfügung gestellt werden. Dabei musste der Designer das später zu Erwartende Schema mühsam selbst zusammenklicken. Ab Expression Blend 4 wird bei diesem Problem abgeholfen. Indem ein bestehendes Model mit Testdaten gefüllt werden kann. Dazu hat man zum Beispiel ein Model und ein Entity wie Listing 1 veranschaulicht.

   1:  using System.Collections.Generic;
   2:   
   3:  namespace Wpf_MVVM_Example.Model
   4:  {
   5:      public class CustomerModel
   6:      {
   7:          public List<Customer> GetCustomers { get; set; }
   8:      }
   9:      
  10:      public class Customer
  11:      {
  12:   
  13:              public string Name { get; set; }
  14:              public string Company { get; set; }
  15:      }
  16:  }

Listing 1 – CustomersModel.

Anschließend wird in Expression Blend 4 im Data-Bereich die Funktion “Create Sample Data from Class..“ hinzugefügt.

Abb12–Create-Sample-Data-from-Class-hinzufuegen.

Abb.12. – „Create Sample Data from Class..“ hinzufügen.

Daraufhin folgt ein Auswahlfenster für das gewünschte Model. Hier wird CustomerModel ausgewählt.

Abb13–CustomerModel-auswaehlen

Abb.13. – CustomerModel auswählen.

Nun generiert Expression Blend 4 ein Model das nun Testdaten passend zu den Properties bietet. Blend hat auch Formatvorlagen, die nun den einzelnen Properties zugewiesen werden können. Bei diesem Beispiel wird dem Property Name das Format „Name“ zugewiesen und das Property Company bekommt „Company Name“.

Abb14–Model-mit-Formatvorlagen-zuweisen

Abb.14. – Model mit Formatvorlagen zuweisen.

Beim klick auf das Daten-Icon können dann die Testdaten eingesehen werden. Bei der RC-Version von Expression Blend 4 ist dies eine XAML-Datei die sich dann Öffnet. Die Final-Version wird bestimmt gleichermaßen wie gewohnt mit einem Datenvorschau-Fenster die Daten präsentieren.

Abb15–Testdaten-einsehen

Abb.15. – Testdaten einsehen.

Jetzt kann das generierte Model mittels Drag & Drop nun einem DataGrid zugewiesen werden. Das DataGrid füllt sich dann sofort mit diesen Beispieldaten, so dass der Designer mit seiner Arbeit sofort starten kann.

Abb16–Einem-DataGrid-das-Model-mit-den-Testdaten-zuweisen

Abb.16. – Einem DataGrid das Model mit den Testdaten zuweisen.

Transition Effekte

Ab Expression Blend 4 folgen nun zahlreiche neue Effekte, die zu VisualStates zugewiesen werden können.

Abb17–Transition-Effekte

Abb.17. – Transition Effekte

 

Fazit

Bei Expression Blend 4 steht ganz klar ein verbesserter Arbeitsprozess zwischen Designer und Entwickler an erster Stelle. Die neuen Features lassen sich ganz angenehm Anwenden und zeigen Vielversprechendes. Eine Verspätung der Final-Version kann bestimmt daran liegen, das für Expression Blend 4 die Unterstützung des Windows Phone 7 vorgesehen ist.

Das MVVM und Events

13.05.2010 14:47:50 | Gregor Biswanger

Bei der Implementierung des Entwurfsmusters MVVM (Model-View-ViewModel) wird im ViewModel die Oberfläche durch Properties abgebildet. Dabei gelten für Aktionen, zum Beispiel die Logik beim Auslösen eines einfachen Buttons, dass das Handling mittels Commands umgesetzt wird. Das bringt einen enormen Vorteil mit sich, zum einen wäre das die 100% Entkopplung mittels Data-Binding. Allerdings erhält man zudem einen großen Nachteil. Commands beschränken sich nur auf die gängigen Standardaktionen. Dabei wird zum Beispiel nur beim betätigen eines Buttons das Command ausgelöst. Bei einer ListBox wäre dies wiederrum die Auswahl eines Items.

Diese Einschränkung kann unter WPF mittels EventTrigger elegant gelöst werden. Dennoch gibt es ein weiteres Problem, man erhält leider keine weiteren Informationen die im Normalfall von klassischen Events mittels EventArgs übergeben werden würden. Zudem gibt es unter Silverlight keine Trigger-Funktionalität.

In manchen Situationen können die Informationen zwar über CommandParameter übertragen werden, trotzdem tritt man immer wieder auf das fehlende Informationsproblem. Zudem möchte man Commands eventuell gar nicht auf die Standardaktionen binden. Viel eleganter wäre es, wenn man auf jeden beliebigen Event eines Controls ein Command auslösen könnte. Dazu müsste man dann vom ViewModel auf den EventManager zugreifen. Das benötigt leider etwas Source-Code und leider besteht eine gewisse Anhänglichkeit zu den jeweiligen Controls. Es müsste eine Lösung geben womit vom ViewModel entkoppelt auf Events Reagiert werden kann. Zudem wäre es wünschenswert, das kaum Source-Code dazu nötig ist.

Genau zu diesem Problem bietet Expression Blend 4 die Lösung mittels Behaviors. Behaviors sind fertige UI-Funktionalitäten die in gewisser Art als Snippet auf das gewünschte Control gezogen werden. Ab Expression Blend 4 bieten folgende Behavios die gewünschte Funktionalität:

 

Name:

Funktion:

CallMethodAction

Löst bei einem bestimmten Event eine beliebige Methode eines Zielobjekts (z.B. ViewModel) aus. Dabei werden die jeweiligen EventArgs mit übertragen.

ChangePropertyAction

Bei einem Event wird ein Propertie eines beliebigen Zielobjekts (z.B. ViewModel), nach einer beliebigen Iteration ein Wert zugewiesen.

InvokeCommandBehavior

Erweitert ein Control durch ein Command, das auch auf jedem beliebigem Event ausgelöst werden kann. Es werden dabei keine EventArgs übertragen, nur CommandParameter .

 

Ein Beispiel: Das SelectionChanged-Event einer Liste im ViewModel behandeln

Als einfaches Beispiel bietet sich das abfangen des SelectionChanged-Event einer Liste an. Dazu wird ein WPF oder Silverlight-Projekt mit einer ListBox benötigt. Die Beispieldaten können mit dem Data-Feature das es ab Expression Blend 3 gibt, zur Verfügung gestellt werden. Ein How-To dazu gibt es hier: Expression Blend 3 - Daten für Designer bereitstellen

 

Abb-1-1-Eine-Liste-mit-Beispieldaten

Abb.1.1. – Eine Liste mit Beispieldaten

 

Der nächste Schritt ist das Anlegen des ViewModels. Dazu wird eine einfache Klasse mit dem Namen „ExampleViewModel“ erzeugt. Hier wird eine Methode und die dazugehörige SelectionChangedEventArgs-Signatur hinzugefügt.

 

   1:  using System;
   2:  using System.Windows.Controls;
   3:   
   4:  namespace WpfCallMethodExample.ViewModels
   5:  {
   6:      public class ExampleViewModel
   7:      {
   8:          public void SelectionChangedMethod(object sender, SelectionChangedEventArgs e)
   9:          {
  10:              throw new NotImplementedException();
  11:          }
  12:      }
  13:  }

Listing 1 – CustomersModel.

Anschließend wird in Expression Blend 4 im Data-Bereich die Funktion “Create Sample Data from Class..“ hinzugefügt.

Abb12–Create-Sample-Data-from-Class-hinzufuegen.

Abb.12. – „Create Sample Data from Class..“ hinzufügen.

Daraufhin folgt ein Auswahlfenster für das gewünschte Model. Hier wird CustomerModel ausgewählt.

Abb13–CustomerModel-auswaehlen

Abb.13. – CustomerModel auswählen.

Nun generiert Expression Blend 4 ein Model das nun Testdaten passend zu den Properties bietet. Blend hat auch Formatvorlagen, die nun den einzelnen Properties zugewiesen werden können. Bei diesem Beispiel wird dem Property Name das Format „Name“ zugewiesen und das Property Company bekommt „Company Name“.

Abb14–Model-mit-Formatvorlagen-zuweisen

Abb.14. – Model mit Formatvorlagen zuweisen.

Beim klick auf das Daten-Icon können dann die Testdaten eingesehen werden. Bei der RC-Version von Expression Blend 4 ist dies eine XAML-Datei die sich dann Öffnet. Die Final-Version wird bestimmt gleichermaßen wie gewohnt mit einem Datenvorschau-Fenster die Daten präsentieren.

Abb15–Testdaten-einsehen

Abb.15. – Testdaten einsehen.

Jetzt kann das generierte Model mittels Drag & Drop nun einem DataGrid zugewiesen werden. Das DataGrid füllt sich dann sofort mit diesen Beispieldaten, so dass der Designer mit seiner Arbeit sofort starten kann.

Abb16–Einem-DataGrid-das-Model-mit-den-Testdaten-zuweisen

Abb.16. – Einem DataGrid das Model mit den Testdaten zuweisen.

Transition Effekte

Ab Expression Blend 4 folgen nun zahlreiche neue Effekte, die zu VisualStates zugewiesen werden können.

Abb17–Transition-Effekte

Abb.17. – Transition Effekte

 

Fazit

Bei Expression Blend 4 steht ganz klar ein verbesserter Arbeitsprozess zwischen Designer und Entwickler an erster Stelle. Die neuen Features lassen sich ganz angenehm Anwenden und zeigen Vielversprechendes. Eine Verspätung der Final-Version kann bestimmt daran liegen, das für Expression Blend 4 die Unterstützung des Windows Phone 7 vorgesehen ist.

msdn tv – Nachrichten für Entwickler (Ausgabe 08/2010)

13.05.2010 13:16:56 | Jan Schenk

Get Microsoft Silverlight

Für die aktuelle Ausgabe von msdn tv hat Moderator Jan Schenk in München mit Ilker Cetinkaya gesprochen, einem Pionier der Coding Dojo-Bewegung hierzulande.
In den Kurznachrichten vorab: News zur jetzt verfügbaren Version 2010 der kostenlosen Entwicklertools aus der Reihe Visual Studio 2010 Express und zum neuen Visual Studio Express for Windows Phone, zur Microsoft-Entwicklerkonferenz Tech·Ed Europe 2010 in Berlin, einer neuen Webcast-Serie rund um SharePoint 2010 und einem Whitepaper, das sich mit der Software-Entwicklung mit Microsoft SharePoint 2010 und Microsoft Visual Studio 2010 beschäftigt. Schließlich gibt’s noch Infos zu einer nützlichen DeepZoom-Übersicht der Visual Studio 2010 Testtools.

Neue Folge von Silverlight-Expertise: "TextBlock-Texte selektierbar machen" und "Parameter an Silverlight übergeben"

12.05.2010 23:35:31 | Gregor Biswanger

dotnet-magazin-logo

In der aktuellen Ausgabe vom dot.net magazin gibt es eine neue Folge von meiner Silverlight-Kolumne “Silverlight-Expertise”:

Silverlight-Expertise - Die Crème de la Crème des Monats

Die Serie „Silverlight Expertise“ des dot.NET Magazins präsentiert monatlich zwei leckere Top-How-tos zum Thema Silverlight von Gregor Biswanger (www.dotnet-blog.net), sodass Einsteiger und fortgeschrittene Silverlight-Experten durch geballtes Wissen gesättigt werden. Heute stehen auf der Menükarte „TextBlock-Texte selektierbar machen“ und „Parameter an Silverlight übergeben“. Viel Spaß und einen guten Appetit.

Cover_orig4bdee176487f9

Zu lesen sind die How-To´s beim dot.net magazin, Ausgabe 06/2010.

.NET Open Space Süd 2010 in Karlsruhe

12.05.2010 21:21:39 | Alexander Zeitler

.NET Open Space Süd 2010 in Karlsruhe

Zusammen mit Aydin, Frank, Ralf, Thomas und Kostja organisiere ich den .NET Opensapce Süd 2010 in Karlsruhe. Seit ein paar Tagen ist die offizielle Homepage online und ich freue mich, die Veranstaltung hier ankündigen zu dürfen.

Die besten Gespräche hat man fernab von einer festgelegten Agenda, bei einem Kaffee und beim "du". Dort gibt es keine Rollenaufteilung in Sprecher / Zuhörer, Entwickler / Administrator usw. und die Themen finden sich vor Ort ganz von selbst. Das ist die Idee vom .NET Open Space, die sich bereits 2008 und 2009 in Leipzig und Ulm bewährt hat. Hier sind alle gleich. Auch die Organisatoren halten sich im Hintergrund und moderieren nur ab und an etwas.

Der .NET Open Space Süd 2010 läuft vom 19.06.2010 bis 20.06.2010. Welche Inhalte in dieser Zeit bearbeitet werden, wird vor Ort bestimmt, denn die Veranstaltung ist Open Space.

Die Teilnahme ist kostenlos. Die Teilnehmer gestalten das Programm selbst. Erfahrungsaustausch ist das A und O und steht im Vordergrund.

Mehr Informationen und Anmeldung unter: http://karlsruhe.netopenspace.de

Twitter-Nutzer erhalten aktuelle News von @nos_sued.

Der offizielle Twitter-Hash-Tag ist #nos_sued.

Ich würde mich natürlich freuen, möglichst viele bekannte Gesichter (insbesondere vom .NET Open Space Süd 2009 in Ulm) und den einen oder anderen Leser meines Blogs bei diesem Event begrüßen zu dürfen.

Ausdrücklich möchte ich betonen, dass dies nicht nur ein Event für Experten ist, sondern dass natürlich auch Teilnehmer willkommen sind, die sich noch nicht für solche halten.

An dieser Stelle auch ein herzliches Dankeschön an Alexander Groß für die Unterstützung bei der Einrichtung der Website für den .NET Open Space Süd 2010.

Wenn Ihr für den .NET Open Space Süd 2010 in Karlsruhe werben wollt, könnt Ihr dieses Logo verwenden:

.NET Open Space Süd 2010 in Karlsruhe

LINQ Extension Methods: Except

12.05.2010 21:00:00 | Wolfgang Kluge

Mittels Except-Erweiterungsmethode vergleicht man zwei Sequenzen des gleichen Typs miteinander und erhält als Ergebnis eine neue Sequenz, in der die Elemente der ersten Sequenz vorhanden sind, die in der 2. Sequenz nicht vorkommen. Dabei wird jedes Element nur einmal aufgeführt. Verglichen wird - wenn man nichts anderes angibt - mit EqualityComparer<T>.Default.

Ohne Except Extension Method kann man das Verhalten in etwa so nachbilden

private List<T> Except<T>( List<T> list1, List<T> list2, EqualityComparer<T> comparer ) {
    var ret = new List<T>( );
    if( comparer == null ) comparer = EqualityComparer<T>.Default;

    for( int i = 0; i < list1.Count; i++ ) {
        if(
            !ret.Contains( list1[i], comparer ) &&
            !list2.Contains( list1[i], comparer )
        ) {
            ret.Add( list1[i] );
        }
    }

    return ret;
}

Doch zum Glück gibt es die Erweiterungsmethoden, der Aufruf erfolgt in etwa so

list1.Except( list2 );
list1.Except( list2, EqualityComparer<T>.Default );

Externe Change Callbacks für Dependency Properties

12.05.2010 09:48:00 | Jörg Neumann

Neulich kam in einem Training die Frage auf, wie man einen Change Callback an eine Dependency Property hängen kann. Im konkreten Fall ging es darum auf Eingabeänderungen in einer ComboBox zu reagieren. Da diese jedoch kein passendes Event hierfür vorsieht, muss manuell nachgeholfen werden.
Zwar bieten Dependecy Properties grundsätzlich die Möglichkeit über die Metadaten einen Change Callback einzuhängen, jedoch nur von der Klasse, welche die Property registriert.
Über die Klasse DependencyPropertyDescriptor kann man jedoch auch einen externen Handler einklinken und sich auf diese Weise - auch ohne Event - über Änderungen informieren lassen.
Das ganze funktioniert wie folgt:

DependencyPropertyDescriptor desc =
  DependencyPropertyDescriptor.FromProperty(
    ComboBox.TextProperty, typeof(ComboBox));
if (desc != null)
{
    desc.AddValueChanged(cbx, (s, e) => ... );
}

Aber wie immer gilt: Abmelden nicht vergessen (RemoveValueChanged), damit der Gargabe Collector später aufräumen kann ;)

LINQ Extension Methods: Union

12.05.2010 01:00:00 | Wolfgang Kluge

Die Erweiterungsmethode Union bietet die Möglichkeit, 2 Sequenzen des gleichen Typs zu einer so zusammenzuführen, dass von jedem Element nur noch eine Entsprechung übrig bleibt. Damit verhält sich Union wie der Aufruf von Concat().Distinct().

Die Reihenfolge der Elemente in der Ergebnissequenz ergibt sich aus der Reihenfolge innerhalb der einzelnen Listen, die nacheinander abgearbeitet werden.

Ohne Union - Extension Method sieht das in etwa so aus

private List<T> Union<T>( List<T> list1, List<T> list2, EqualityComparer<T> comparer ) {
    var result = new List<T>( );
    if( comparer == null ) comparer = EqualityComparer<T>.Default;
    for( int i = 0; i < list1.Count; i++ ) {
        if( !result.Contains( list1[1], comparer ) ) {
            result.Add( list1[i] );
        }
    }

    for( int i = 0; i < list2.Count; i++ ) {
        if( !result.Contains( list2[1], comparer ) ) {
            result.Add( list2[i] );
        }
    }

    return result;
}

Der Vergleich wird - wenn nicht anders angegeben - mit dem Default - EqualityComparer<T> vollzogen.

Genauso verhält sich auch die Union-Erweiterungsmethode, die wie folgt aufgerufen wird

list1.Union( list2 );
list1.Union( list2, EqualityComparer<T>.Default );

LINQ Extension Methods: Zip

11.05.2010 18:51:00 | Wolfgang Kluge

Mit der Zip-Erweiterungsmethode können die Elemente zweier Sequenzen 1:1 zusammengeführt werden. Das Ergebnis ist eine neue Sequenz.
Zip ist somit eine spezialisierte Form von Join, wobei der Index als Key verwendet wird. Daher ist es auch egal, wie viele Elemente die jeweiligen Listen haben - zurückgegeben werden nur diejenigen Elemente, die in beiden Listen vorkommen.

Angenommen, man hat die 2 Listen firstNames und lastNamens mit den Vor- bzw. Nachnamen und möchte diese miteinander so kombinieren, dass eine string-Sequenz herauskommt, in der diese Namen durch Komma getrennt zusammengesetzt stehen. Die beiden Listen sind entsprechend sortiert.

Ohne Zip-Methode würde das in etwa so aussehen

var fullNames = new List<string>();
int count = Math.Min( firstNames.Count, lastNames.Count );
for( int i=0; i<count; i++ ){
    fullNames.Add( string.Format( "{1}, {0}", firstNames[i], lastNames[i] ) );
}

wobei die 2. Zeile vereinfacht werden kann, wenn sichergestellt ist, dass die beiden Listen gleich viele Elemente enthalten.

Mit der Zip-Methode geht das wesentlich kürzer (und ist meiner Meinung nach auch etwas leichter lesbar).
Wer noch Probleme mit den Lambda-Ausdrücken hat, der kann sich mit dem Artikel Tanz den => Lambda mit mir... ein wenig einlesen.

var fullNames = firstNames.Zip(
                    lastNames,
                    ( firstName, lastName ) => string.Format( "{1}, {0}", firstName, lastName )
                );

Der Rückgabewert ist nicht auf string-Sequenzen beschränkt. Es kann eine beliebige Klasse (z.B. eine anonymen Klasse) angegeben werden.

Z.B. ist fullNames hier

var fullNames = firstNames.Zip(
                    lastNames,
                    ( firstName, lastName ) => new {
                                                     FirstName = firstName,
                                                     LastName = lastName
                                               }
                );

eine Sequenz von Klassen, in denen die Eigenschaften FirstName und LastName gesetzt sind.

Microsoft Office 2010: Windows 7-Theme

11.05.2010 12:16:42 | Gordon Breuer

Those of you who couldn’t download the final Microsoft Office 2010 version via the Volume Licensing Service Center have to wait until June when it will become available to retail stores. To shorten the waiting-time you can download the Windows 7 Themepacks I created again with the great wallpapers from the guys at www.microsoftfeed.com! They contain the yellow/orange wallpapers (bright version) respectively the anthracite wallpapers (dark version), in each case combines with a corresponding color-pattern. Just click the particular image below to download the .themepack-file:

Microsoft Office 2010 (bright) Themepack Microsoft Office 2010 Themepack



Artikel empfehlen auf .NET-Kicks Deutschland kick it on .NET Kicks

TechDay Spezial – Office 2010 im Juni

11.05.2010 12:04:12 | Steffen Krause

Office 2010 und SharePoint Server 2010 sind fertig, und es wird Zeit, die endgültigen Produkte zu präsentieren. Daher gibt es im Juni an 4 Orten einen TechDay Spezial. Am Vormittag gibt es nach einer Business Keynote und einer Kundenreferenz (von der HHP Berlin, mit der ich schon einige interessante Projekte gemacht habe) zwei Stunden Demo von Daniel Melanchthon und mir – wir zeigen die wichtigsten Neuerungen in Office 2010 und SharePoint Server 2010. Der Nachmittag teilt sich in einen Track für IT-Entscheider, in dem es unter anderem um Fragen wie Lizenzierung, Cloud und Software Assurance geht, und einen Track für IT Professionals. Daniel und ich sprechen hier über Security, Deployment und SharePoint Administration. Die Termine (WM-kompatibel!): 14.06.2010 Karlsruhe 15.06.2010 Düsseldorf/Neuss 21.06.2010 Leipzig 23.06.2010 München Mehr Informationen udn Anmeldung hier Gruß, Steffen...(read more)

SQL Server: Von wiederhergestellten Datenbanken und verwaisten Benutzern

10.05.2010 23:04:00 | Wolfgang Kluge

Immer wieder - jedoch insgesamt selten und aus dem Grund auch leider immer wieder mit einer Suche verbunden - brauch ich nach der Wiederherstellung einer Datenbank eine Stored Procedure, um die Benutzer aus der wiederhergestellten Datenbank und die Logins des Servers wieder in "Einklang" zu bringen.

Das Problem tritt z.B. auf, wenn die DB in einem anderem Server wiederhergestellt wird. Die Ursache ist, dass zwar evtl. der Login- und der Username gleich, die im Hintergrund wirkenden ID's aber unterschiedlich sind.

Nun. Hierfür gibt es die SP sp_change_users_login. Mit einem Administratorkonto (sysadmin oder db_owner) an der Datenbank anmelden und folgendes Ausführen:

Um eine Übersicht über die Benutzer zu bekommen, die verwaist sind

EXEC sp_change_users_login @action='Report'


Wenn der Login inkl. Passwort bereits eingerichtet ist, der Benutzer aber noch zugeordnet werden muss.

EXEC sp_change_users_login @action='Auto_Fix', @userNamePattern='user'


Wenn der Benutzer zugeordnet und ein Login mit Passwort erstellt werden muss (ist der Login bereits vorhanden, wird @password ignoriert)

EXEC sp_change_users_login @action='Auto_Fix', @userNamePattern='user', @password='password'


Man kann auch einen Benutzer mit einem Login verbinden, wenn die beiden nicht den gleiche Namen haben. Dann sieht es so aus (auch hier kann noch optional ein Passwort angegeben werden)

EXEC sp_change_users_login @action='Update_One', @userNamePattern='user', @loginName='login'

 

So, und beim nächsten Mal weiß ich, wo ich suchen muss ;)

Entity Framework and datetime2

10.05.2010 18:36:00 | Patric Schouler

Today I was a little bit confused about a error message “…conversation error for datetime2 in datetime…”. Because in my database scheme I am not using any new SQL Server 2008 datetime2 data types. After a while of researching, I found out that the Entity Framework 4 internally works with the datetime2 data type and wants to convert it in my datetime database type.

To use the datetime data type in Entity Framwork 4 you have to switch the ProviderManifestToken in the edmx-file to "2005". After thisn the Entity Frameweok 4 will work with the datetime data type.

SharePoint UG Nürnberg: SharePoint 2010 liebt Silverlight!

10.05.2010 16:02:00 | Gregor Biswanger

Am Mittwoch den 12.05.2010 findet bereits ab 16:30 Uhr das nächste SharePoint User Group Nürnberg treffen statt.

Hierbei gibt es ab ca. 18 Uhr, zum folgenden Thema einen Vortrag meinerseits:

SharePoint 2010 liebt Silverlight!

SharePoint wie auch Silverlight sind derzeit sehr häufig angepriesene Technologien im Microsoft-Umfeld. Beide Welten haben auf den ersten Blick nur wenig gemeinsam. Wenn man jedoch näher hinsieht, erkennt man die Synergieeffekte. Teile der Oberfläche von SharePoint 2010 sind bereits mit Silverlight gestaltet, und die Integration von Silverlight-Applikationen wird durch das mitgelieferte Webpart sogar "out-of-the-box" unterstützt.

Gregor Biswanger zeigt in diesem Vortrag, wie Sie Ihren Anwendungen durch den Einsatz von Silverlight eine komfortable Oberfläche geben und wie Sie dadurch an erhöhter Effektivität durch neue Usability-Experience für SharePoint dazu gewinnen.

Weitere Informationen & Anmeldung unter:
https://www.xing.com/events/14-sp-user-group-wave-14-office-2010-sharepoint-2010-launch-event-500477


Ich freue mich jetzt schon auf Eurer kommen!

 

Neuer Artikel beim SharePoint Magazin: "LINQ to SharePoint"

10.05.2010 14:51:00 | Gregor Biswanger

In der neuen Ausgabe vom SharePoint Magazin gibt es einen neuen Artikel von Thorsten Hans (.NET rocks) und meinerseits:

LINQ to SharePoint – Schnell und einfach mit LINQ to SharePoint Abfragen erstellen
Abfragen gegen SharePoint-Listen wurden bis zur Version 2007 des SharePoint Servers durch CAML-Queries realisiert. Mit dem neuen SharePoint 2010 kann man LINQ to SharePoint für solche Abfragen verwenden. Im folgenden Artikel werden die verschiedenen Möglichkeiten von LINQ to SharePoint erläutert.

Zu lesen ist der Artikel beim SharePoint Magazin, Ausgabe 02/2010.

NEW Version 3.5 TeamSpeak Sidebar Gadget für Windows Vista und Windows 7

09.05.2010 10:05:00 | Andreas Mehl

Version 3.5 released
- Added 64 bit Modus for Direct Query over your PC
- Bugfixes
- Optimizied Querys with the help of json, it means faster querys.
- New Server Query IP's 212.227.134.98 , 212.227.141.223 , 93.186.201.146 (Please add them in your query_ip_whitelist.txt)

 

Screenshots can be found here: Screenshots

Documentation can be found here: Documentation

Have fun Laughing

Download Sidebar Gadget Teamspeak 3.5

Mitmachen und gewinnen! Artikel-Wettbewerb im .NET-Forum.de!

08.05.2010 20:46:00 | Gregor Biswanger

Im dotnet-forum.de wird momentan ein Artikel-Wettbewerb veranstaltet. Beim Wettbewerb können Artikel zu aktuellen Themen aus der .Net-Welt eingereicht werden, zum Beispiel SharePoint 2010, PowerShell 2 und F#.
Bis zum 31.Mai ist noch Gelegenheit Artikel für die KnowledgeBase des Forums zu schreiben. Es lohnt sich, denn es gibt super Preise zu gewinnen. Zum Beispiel ein Windows 7 Ultimate oder eine Resharper Lizenz.

Hier geht es zum Wettbewerb: http://dotnet-forum.de/forums/t/2472.aspx

Auch ich hab mit einem kleinen How-To beim Wettbewerb mitgemacht:
.NET 4.0 - LINQ– Neue Extension Method: Zip

Refresh cached EntitySet of Silverlight Client

07.05.2010 15:27:00 | Patric Schouler

If we loads a set of entities with WCF RIA Services they will be cached in an EntitySet on the client-side (Silverlight client), so after submitting changes or a after making a other query for the same EntitySet, only the entities we have removed on the client will be removed from the client-side’s EntitySet. If someone else have removed some of the entities from the database we work against, we still have those cached on the client-side. At the moment there aren’t any reload features added to the WCF RIA Services, so we need to handle it by our self.

We can’t just make a new call to the Load method of our DomainContext, it will only merge the existing EntitySet with changes or add new entities, but not removing anything. So for example if you query objects with a special condition and make a other query with a different condition it will bring back a merged list of entities.

So, what I am doing is:

   1: // Clear the client cache
   2: _DomainContext.Geldanlages.Clear();
   3: // make the query
   4: _DomainContext.Load(queryWertpapier);
   5: _DomainContext.Load(queryWertpapier).Completed += new EventHandler(LoadItemsWP_Completed);

Ressourcen der .NET User Group Tour zu Windows 7

07.05.2010 13:32:53 | Peter Kirchner

Die Hälfte der Tour ist bereits geschafft und natürlich sind Sie an den Vortragsfolien und auch an den Beispielen interessiert, die wir auf der Tour verwendet haben.

Den Download des Vortrags finden Sie hier.

Die Code-Beispiele, die wir verwendet haben, können Sie in den folgenden “Paketen” finden:

Und wenn Sie schon Ideen für unseren /Partner-Bereich haben, dann schreiben Sie mir bitte direkt eine E-Mail. (Einfach auf der rechten Seite auf die PingMe-Karte klicken oder an meine E-Mail-Adresse.) Ich freue mich, Ihre Ideen mit Ihnen zu besprechen.

I'm lovin' it!

07.05.2010 12:11:14 | Damir Tomicic

AxDay 2010, unsere jährlich stattfindende Technologie-Konferenz rund um die Themen AxCMS.net und die Web-Entwicklung mit Microsoft-Technologien, findet in diesem Jahr am 17.09. statt. Zwei Tracks (Technologie und Business), spannende Sessions, Berichte aus der Praxis und der Launch von AxCMS.net 10 sind nur einige der Highlights. Wir bereiten auch das Produkt-Launch eines ganz neuen Produkts sowie einen aussergewöhnlichen Vortrag mit einem aussergewöhnlichen Sprecher .. Es wird wirklich aussergewöhnlich in diesem Jahr. Weitere Details folgen :-)

[1] http://de.AxCMS.net
[2] http://facebook.com/axinom

Windows Phone 7: Bildschirm-Orientierung

07.05.2010 11:09:49 | Oliver Scheer

Windows Phone 7 unterstützt generell zwei Ausrichtungen des Bildschirms: Portrait (hochkant) und Landscape (also um 90° gedreht ;) ).

Beim Anlegen einer neuen Seite für Windows Phone muss man sich zu Beginn leider für eine Ausrichtung entscheiden. Diese Entscheidung lässt sich aber in nur wenigen Sekunden korrigieren bzw. dynamisch ändern.

Das folgende Beispiel zeigt, wie leicht man die gewünschte Ausrichtung auf seinem Bildschirm einstellen kenn.

image

private void _onlyPortrait_Checked(object sender, System.Windows.RoutedEventArgs e)
        {
            SupportedOrientations = SupportedPageOrientation.Portrait;
        }

 

image

 

Okay … der Windows Phone Emulator dreht sich leider nicht automatisch um, aber manuell mittels Button auf der rechten Seite geht es dann schon ;-)

image

image

Der Code dazu:

private void _onlyLandscape_Checked(object sender, System.Windows.RoutedEventArgs e)
        {
            SupportedOrientations = SupportedPageOrientation.Landscape;
        }

 

Und jetzt beides auf einmal bitte:

private void _portraitAndLandscape_Checked(object sender, System.Windows.RoutedEventArgs e)
        {
            SupportedOrientations = SupportedPageOrientation.PortraitOrLandscape;
        }

 

Das ist doch einfach, oder?

Windows Phone 7: Die Application Bar

07.05.2010 10:34:36 | Oliver Scheer

Die Application Bar ist im Prinzip das Menü einer Windows Phone Anwendung.

image

In die Application Bar lassen sich bis zu vier Symbole (ApplicationBarIconButton) integrieren, denen bestimmte Funktionen zugeordnet werden können. Zusätzlich ist es möglich noch ein erweitertes Menü zu integrieren (im Bild an den kleinen Punkten rechts, neben den vier Symbolen). Drückt man darauf, bekommt man ein Textmenü eingeblendet.

image

Damit hat man die Möglichkeit mehr Funktionen als über vier Symbole möglich wären, einzubauen.

Die Application Bar-Funktionalität ist nur verfügbar, wenn man als Enwickler die Bibliothek “Microsoft.Phone.Shell” integriert, ansonsten sucht man nach der ApplicationBar vergeblich.

Der Code für das Anlegen der Application Bar:

ApplicationBar = new ApplicationBar();
ApplicationBar.IsMenuEnabled = true;
ApplicationBar.IsVisible = true;
ApplicationBar.Opacity = 1.0;

Der Code für das Erzeugen der Symbole:

ApplicationBarIconButton add = 
    new ApplicationBarIconButton(
        new Uri("/Images/appbar.add.rest.png", UriKind.Relative));
add.Click += (s, e) =>
    {
        MessageBox.Show("Add-Clicked", "Info", MessageBoxButton.OK);
    };
ApplicationBar.Buttons.Add(add);
            
ApplicationBarIconButton remove = 
    new ApplicationBarIconButton(
        new Uri("/Images/appbar.delete.rest.png", UriKind.Relative));
ApplicationBar.Buttons.Add(remove);
            
ApplicationBarIconButton edit = 
    new ApplicationBarIconButton(
        new Uri("/Images/appbar.edit.rest.png", UriKind.Relative));
ApplicationBar.Buttons.Add(edit);
            
ApplicationBarIconButton question = 
    new ApplicationBarIconButton(
        new Uri("/Images/appbar.questionmark.rest.png", UriKind.Relative));
ApplicationBar.Buttons.Add(question);

Der Code für die Menüeinträge:

ApplicationBarMenuItem setUserSettings = 
    new ApplicationBarMenuItem("set usersettings");
ApplicationBar.MenuItems.Add(setUserSettings);
            
ApplicationBarMenuItem changeColor = 
    new ApplicationBarMenuItem("change color");
ApplicationBar.MenuItems.Add(changeColor);

ApplicationBarMenuItem orderCoffee =
    new ApplicationBarMenuItem("order coffee");
ApplicationBar.MenuItems.Add(orderCoffee);

Um nun die Application Bar dynamisch aus der Anwendung heraus aufzurufen gibt es verschiedene Möglichkeiten.

// Einfaches einblenden
ApplicationBar.Opacity = 1.0;
ApplicationBar.IsMenuEnabled = true;
ApplicationBar.IsVisible = true;

// Ausblenden

ApplicationBar.IsVisible = false;

// Transparentes Darstellen

ApplicationBar.Opacity = .5;
ApplicationBar.IsMenuEnabled = true;
ApplicationBar.IsVisible = true;

// Darstellen ohne Menü

ApplicationBar.Opacity = 1.0;
ApplicationBar.IsVisible = true;    
ApplicationBar.IsMenuEnabled = false;

Windows Phone 7: Navigieren durch eine Anwendung

07.05.2010 10:21:05 | Oliver Scheer

Windows Phone 7 verwendet als Anwendungsstruktur das Page-Navigationsmodell von Silverlight. Mit einer kleinen Ausnahme, es gibt keinen Frame in dem navigiert wird. Die Anwendung ist der Frame :)

Hier ein kleines Beispiel:

image

Meine Anwendung die eine Startseite hat und zwei Buttons. Mit diesen Button möchte ich auf jeweils eine andere Seite wechseln. Diese Seiten müssen vom Typ Windows Phone Page sein.

Der Code der zum Navigieren notwendig ist sieht dann wie folgt aus.

using System;
using Microsoft.Phone.Controls;

namespace FeatureDemo
{
    public partial class MainPage : PhoneApplicationPage
    {
        public MainPage()
        {
            InitializeComponent();

            SupportedOrientations = SupportedPageOrientation.Portrait | SupportedPageOrientation.Landscape;
        }

        private void _applicationBarDemo_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            NavigationService.Navigate(new Uri("/Pages/ApplicationBarPage.xaml", UriKind.Relative));
        }

        private void _rotationDemo_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            NavigationService.Navigate(new Uri("/Pages/RotationPage.xaml", UriKind.Relative));
        }
    }
}

Dieses Codebeispiel geht davon aus, das sich die beiden Unterseiten in einem Unterordner namens “Pages” befinden innerhalb meines Projekts befinden.

Das Zurück-Navigieren geht einfach mit dem “Zurück”-Button des Telefons.

Silverlight 4: Die rechte Maustaste und das Kontextmenü

07.05.2010 10:01:00 | Oliver Scheer

Im WWW-Standard gibt es ja eigentlich gar keine rechte Maustaste. Es soll ja auch tatsächlich noch Menschen geben, die mit Mäusen auskommen die nur eine Taste haben.

Allerdings gibt es ja Tricks, die es dennoch erlauben.

In Silverlight 4 ist die Unterstützung der rechten Maustaste jetzt voll und ganz integriert. Man kann überall, außer dem Root-Element der Silverlight-Anwendung die rechte Maustaste abfangen.

void _rectangle_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
    e.Handled = true;
    MessageBox.Show("Right Mouse Button Clicked");
}

Man muss lediglich im Eventhandler für das Ereignis “MouseRightButtonDown”, die “Handled”-Eigenschaft auf “true” setzen. Anschließend kann man an dieser Position nun ein eigenes Kontextmenü integrieren.

Für die Darstellung von Kontextmenüs kann jedes beliebige Steuerelement entwickeln. In meinem Fall, erstelle ich einfach ein StackPanel an Textblöcken, die angeklickt werden können. Um allerdings dieses Kontextmenü darzustellen, benötigt man ein Popup-Steuerelement. Dieses bekommt als Inhalt, das eigentliche Steuerelement.

Popup _popup;

void _rectangle_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
    e.Handled = true;
            
    MessageBox.Show("Right Mouse Button Clicked");
}

void MainPage_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
    ClosePopup();
}

void MainPage_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    ClosePopup();
}

void _source_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
    e.Handled = true;

    Point position = e.GetPosition(null);
    ShowContextMenu(position);
}

private void ClosePopup()
{
    if (_popup != null)
    {
        _popup.IsOpen = false;
        _popup = null;
    }
}

private void ShowContextMenu(Point position)
{
    if (_popup != null)
    {
        _popup.IsOpen = false;
        _popup = null;
    }

    StackPanel sp = new StackPanel();
    sp.Background = new SolidColorBrush(Colors.LightGray);
            
    sp.Children.Add(
        CreateMenuItem(
            "Kopieren", () => { ClosePopup(); CopyToClipboard(); }));

    sp.Children.Add(
        CreateMenuItem(
        "Ausschneiden", () => { ClosePopup(); CutText(); }));

    sp.Children.Add(
        CreateMenuItem(
        "Einfügen", () => { ClosePopup(); PasteText(); }));

    _popup = new Popup();
    _popup.Child = sp;
    _popup.Margin = new Thickness(position.X, position.Y, 0, 0);
    _popup.IsOpen = true;
}

delegate void MyDelegate();

private FrameworkElement CreateMenuItem(string caption, MyDelegate func)
{
    TextBlock tb = new TextBlock();
    tb.Text = caption;
    tb.MouseLeftButtonDown += (s, e) =>
        {
            func.Invoke();
        };
    return tb;
}

Silverlight 4: Copy and Paste and Cut

07.05.2010 09:20:00 | Oliver Scheer

In Silverlight 4 hat man nun Zugriff auf die Zwischenablage. Im Zuge der Vorbereitung für einen neuen Webcast, habe ich mir das ganze mal angesehen und war positiv überrascht, wie einfach das ist.

Der folgende Code zeigt wie die typischen Copy, Paste und Cut (Kopieren, Einfügen und Ausschneiden) – Befehle für Textboxen implementiert werden können.

 

private void CopyToClipboard()
{
    if (_source.SelectedText.Length > 0)
    {
        Clipboard.SetText(_source.SelectedText);
    }
    else
    {
        Clipboard.SetText(_source.Text);
    }
}

private void CutText()
{
    CopyToClipboard();

    if (_source.SelectedText.Length > 0)
    {
        _source.Text = _source.Text.Remove(_source.SelectionStart, _source.SelectionLength);
    }
    else
    {
        _source.Text = string.Empty;
    }
}

private void PasteText()
{
    if (Clipboard.ContainsText())
    {
        string pasteText = Clipboard.GetText();
        if (_target.SelectedText.Length > 0)
        {
            int insertPosition = _target.SelectionStart;
            string text2change = _target.Text;
            text2change = text2change.Remove(insertPosition, _target.SelectionLength);
            text2change = text2change.Insert(insertPosition, pasteText);
            _target.Text = text2change;
            _target.Select(insertPosition, pasteText.Length);
        }
        else
        {
            _target.Text = pasteText;
        }
    }
}

The Bandt way of TDD

07.05.2010 06:44:00 | Jürgen Gutsch

Seit einiger Zeit baue ich nebenher an einem kleinen multi-mandantenfähigen Lizenzserver. Ziel ist es diese Anwendung komplett mit TDD zu schreiben.

Wie ich sicher bisweilen schon erwähnt hatte, war es bisher für mich sehr schwer, TDD wirklich konsequent einzusetzen. Wenn man Jahrelang auf die herkömmliche Art und Weise programmiert, ist es in einem kleinen privaten Projekt ein enormer Kraftakt, sein Denken so umzustellen, dass man

  1. Erst penibel die Anforderungen definiert
  2. Die Tests definiert
  3. Die Tests schreibt
  4. und dann implementiert, ohne zu viel Code zu schreiben

Allerdings hat mir ausgerechnet folgender Blogbeitrag von Thomas Bandt den Anstoß gegeben es noch einmal ernsthaft zu versuchen: TDD, BDD - Status Quo

The Bandt way of TDD

Das interessante an diesem Weg ist, dass ich einen Schritt spare: Die Anforderungen sind schon die Definitionen der Tests und das sogar Wort wörtlich. Die Anforderungen werden im Klartext, auf deutsch mit allen Umlauten als Test geschrieben. Das vereinfacht das schreiben der Tests ungemein.

Der zweite interessante Punkt ist die Kapselung wiederkehrender Aufgaben (erzeugen des SuT und der abhängigen Stubs) in eine Basisklasse.

Es flutscht

Also hatte ich beschlossen den Lizenzserver (den ich schon länger schreiben wollte) mit dem Bandt way of TDD zu entwickeln. Interessanterweise habe ich mich bei diesem Projekt bisher noch nicht dabei erwischt, an den Tests vorbei zu implementieren. Und noch schlimmer: Es fängt an Spaß zu machen, wenn man alle Tests die sich inzwischen angesammelt haben, laufen lässt und alles grün ist.

Word to Code

Nach dem die Zahl der Tests nun ständig ansteigt, habe ich mir so langsam Gedanken gemacht, wie ich diese dokumentiere. Bisher hatte ich (da es sich um ein rein privates Projekt handelt) die Anforderungen direkt in Tests umgesetzt, und dann nach einer Weile alle Definitionen der Tests in einer HTML-Datei gespeichert.

Aber die bessere Lösung stammt wieder einmal von Thomas: mit "Word to Code" hat Thomas ein kleines Helferlein geschrieben, mit dem sich in Word formulierte Anforderungen, nach den Konventionen des Bandt way of TDD, in fertige Unit Tests konvertieren lassen.

Fazit

Wer also, wie ich, selber noch Schwierigkeiten hat, TDD wirklich einzusetzen, sollte mal diesen Weg probieren. Sobald man richtig mit den Mocking und Testing Frameworks seiner Wahl vertraut ist, flutscht es wirklich. Den Aufwand den man auf die Herkömmliche Art noch ins Debugging und ins testen von Hand gesteckt hat, steckt man nun mit TDD in die Tests. Die Tests geben einem zusätzlich noch die Sicherheit, dass der eigene Code den Anforderungen entspricht :-)

Einfach mal ausprobieren :-)

DotNetKicks-DE Image

Silverlight 4: How to integrate Microsoft Translator Service into Silverlight and Windows Phone

07.05.2010 05:52:41 | Oliver Scheer

A few weeks ago, I found the Microsoft Translator Interactive SDK, and I recognized that it is very easy to use in .NET applications, like Silverlight and Windows Phone.

So I started a sample application. After a while I got the idea to build a “UserControl” out of this feature. Why? Because it is “pickable” in the UI for a developer or Designer. The control itself is not visible at runtime, it only appears at designtime, as an ugly looking red box with its name on it.

You can see the App here in action.

Sample of the control in Silverlight 4 App

image

Sample of the control in Windows Phone 7 Application

 image

Why it is so interesting for me? Because you can reuse it very easy, without knowledge of the internas. It has just a few properties for configuration and one Load-Method.

It just has one important property you have to set, the Application Id of Microsoft Translator. You can get one here (http://developer.live.com).

image

The control has two events.

image

To translate text from one language (de-de = Germany) into one other (en-us = English US) is extremly simple. Problems like synchronizing the background thread into the UI-Thread is hidden in the control.

The following code demonstrates the easiness of using.

private void MicrosoftTranslator_Translated(object sender, TheOliver.Controls.TranslatorEventArgs args)
{
    _out.Text =args.TranslatedText;
}

private void MicrosoftTranslator_TranslationError(object sender, TheOliver.Controls.TranslatorErrorEventArgs args)
{
    _out.Text= args.Error.Message;
}

private void Button_Click(object sender, System.Windows.RoutedEventArgs e)
{
    _mts.Translate(_in.Text, "de-de", "en-us");
}

Here is the complete code of the Microsoft Translator Service:

// Copyright © Microsoft Corporation.  All Rights Reserved.
// This code released under the terms of the 
// Microsoft Public License (MS-PL, http://opensource.org/licenses/ms-pl.html.)

using System;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace TheOliver.Controls
{
    public class MicrosoftTranslator : UserControl, INotifyPropertyChanged
    {
        private string _appId;
        public string AppId
        {
            get { return _appId; }
            set { _appId = value; }
        }

        private bool _isBusy = false;
        public bool IsBusy
        {
            get { return _isBusy; }
            set
            {
                _isBusy = value;
                OnPropertyChanged("IsBusy");
                this.IsIdle = !_isBusy;
            }
        }

        private bool _isIdle = true;
        public bool IsIdle
        {
            get { return _isIdle; }
            set
            {
                _isIdle = value;
                OnPropertyChanged("IsIdle");
            }
        }

        private byte[] _bytes;

        public MicrosoftTranslator()
        {
            if (DesignerProperties.GetIsInDesignMode(this))
            {
                StackPanel sp = new StackPanel();
                sp.Background = new SolidColorBrush(Colors.Red);

                TextBlock tb = new TextBlock();
                tb.Text = "[Microsoft Translator Service]";

                sp.Children.Add(tb);
                this.Content = sp;
            }
        }

        public void Translate(string sourceText, string sourceLanguage, string targetLanguage)
        {
            if (this.AppId == string.Empty || this.AppId == null)
            {
                MessageBox.Show("No AppId for Translator service defined. You can get an AppId at http://dev.live.com.");
                return;
            }

            this.IsBusy = true;

            // Creating a string with the request URL
            // The URL includes the Bing developer appId and in this case hardcoded to translate from 
            // English to Spanish
            string translateUri =
                "http://api.microsofttranslator.com/V1/Http.svc/Translate?appId=" + _appId
                + "&from=" + sourceLanguage
                + "&to=" + targetLanguage;

            // Create a web request to the URL
            HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(translateUri);

            // Set the request method to POST
            httpWebRequest.Method = "POST";

            // Set the content type (needs to be text/plain for POST methods)
            httpWebRequest.ContentType = "text/plain";

            // Encode the txtInput value bytes for the POST
            _bytes = Encoding.UTF8.GetBytes(sourceText);

            // Create a stream for the request
            httpWebRequest.BeginGetRequestStream(new AsyncCallback(OnGetRequestStream), httpWebRequest);
        }

        private void OnGetRequestStream(IAsyncResult iar)
        {
            try
            {
                HttpWebRequest httpWebRequest = (HttpWebRequest)iar.AsyncState;
                Stream os = httpWebRequest.EndGetRequestStream(iar);

                os.Write(_bytes, 0, _bytes.Length);

                if (os != null)
                {
                    // Close the stream when finished
                    os.Close();
                }

                // Send the request and get the response
                httpWebRequest.BeginGetResponse(new AsyncCallback(OnGetResponse), httpWebRequest);
            }
            catch (Exception exc)
            {
                RaiseError(exc);
            }
        }

        private void OnGetResponse(IAsyncResult iar)
        {
            try
            {
                HttpWebRequest request = (HttpWebRequest)iar.AsyncState;

                if (!iar.IsCompleted)
                {
                    Debug.WriteLine("Not completed");
                }
                WebResponse response = request.EndGetResponse(iar);

                // Open a stream for the response
                Stream stream = response.GetResponseStream();
                StreamReader reader = new StreamReader(stream);

                // Create a string for the contents of the web response
                string output = reader.ReadToEnd();

                // Return the output string
                OnTranslated(output);
            }
            catch (Exception exc)
            {
                RaiseError(exc);
            }
        }

        public event TranslatorEventHandler Translated;
        public event TranslatorErrorEventHandler TranslationError;

        private void OnTranslated(string output)
        {
            this.IsBusy = false;
            if (Translated != null)
            {
                Dispatcher.BeginInvoke(() =>
                    {
                        TranslatorEventArgs args = new TranslatorEventArgs();
                        args.TranslatedText = output;
                        Translated(this, args);
                    });
            }
        }

        private void RaiseError(Exception exc)
        {
            this.IsBusy = false;
            if (TranslationError != null)
            {

                Dispatcher.BeginInvoke(() =>
                    {
                        TranslatorErrorEventArgs args = new TranslatorErrorEventArgs();
                        args.Error = exc;
                        TranslationError(this, args);
                    });
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                Dispatcher.BeginInvoke(() =>
                    {
                        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                    });
            }
        }
    }

    public delegate void TranslatorEventHandler(object sender, TranslatorEventArgs args);

    public class TranslatorEventArgs : EventArgs
    {
        public string TranslatedText { get; set; }
    }

    public delegate void TranslatorErrorEventHandler(object sender, TranslatorErrorEventArgs args);

    public class TranslatorErrorEventArgs
    {
        public Exception Error { get; set; }
    }
}

I hope you like this sample and the translator app.

Best regards,
The-Oliver

Wie Projekte mit TDD starten? So geht’s!

07.05.2010 00:31:57 | Gregor Biswanger

Angeregt zu einem verzweifelten Blog-Post von Christina mit „Coding Dojo – aber wie?“, mit der großen Frage: „Wie soll eine mit TDD entwickelte Anwendung entstehen?“, wird dieser Artikel den Einstieg von „Projekte mit TDD starten“ erläutern. Dazu hat Christina noch folgende Fragen gestellt: „Vom Anfang an mit der Tastatur unter den Fingern oder darf es etwas Planung in den Köpfen und auf Papier stattfinden?“.

 

Das Problem im Detail

Doch „wie“ kann sich so eine Frage auf TDD beziehen? Wieso kristallisiert sich hierbei nicht vorerst die Frage: „Wie beginne ich ein Softwareprojekt?“. Ich sehe das als ein verständliches Problem, denn TDD gibt dem Entwickler gewisse beeinflussende Gefühle von Hilfestellung des Architekturdesigns.

Bei TDD wird von Beginn an eine spätere Sichtweise zur Handhabung der jeweiligen Komponente gewährleistet. Dabei entstehen hochwertige Komponenten, die sich auf deren Anforderungen zur späteren Weiterverwendung lohnen, indem zuerst von der äußeren Sichtweise der Komponenten begonnen wird. Genau so, wie sie eben später verwendet werden sollen. Doch leider hat das nichts mit einer automatischen Anforderungsanalyse zu tun.

Allerdings ist dieses häufige Missverständnis absolut verständlich. Denn TDD hilft genauso fehlende Anforderungen zu finden, indem bestimmte Schwierigkeiten auftreten, die vorerst nicht bedacht wurden. So entstehen dabei neue Anforderungen, oder anders ausgedrückt, sie ergänzen vorhandene Anforderungen.

Als Beispiel soll eine PLZ-Komponente für ein besseres Verständnis dienen. Diese Komponente verwendete ich gleichermaßen auch auf meiner TDD-Roadshow, die ich gemeinsam mit Robert Walter seit 2009 quer durch Deutschland vortrage. Hierbei hatten wir eine klare Anforderung als Ziel. Es soll die PLZ von meinem Heimatort Ingolstadt geliefert werden. Doch schlug bereits nach der fertigen Implementierung der Test fehl! Listing 1 demonstriert meinen ersten Testaufbau.

   1: [Test]
   2: public void Plz_from_Ingolstadt()
   3: {
   4:     // Arrange
   5:     IPlzReader plzReader = new PlzReader();
   6:  
   7:     // Act
   8:     string result = plzReader.GetPlzFrom("Ingolstadt");
   9:  
  10:     // Assert
  11:     Assert.AreEqual("85055", result);
  12: }

Listing 1 – Erwartet wird die PLZ von Ingolstadt

Dabei wurde selbstverständlich die PLZ verwendet, die ich durch meine Adresse gewohnt war. Also die Anforderung stand sicher fest. Ich erwarte ein Ergebnis das mir vorher bewusst war. Dennoch ist ein Fehler aufgetreten. Was habe ich übersehen? Woran habe ich nicht gedacht?

unit-test-fail

Abb.1. – Unit-Test schlieg fehl

Eine kleine Analyse des Fehlers zeigte mir, dass ich in jenem Augenblick nicht daran gedacht hatte, dass bei Städten auch mehrere PLZ Ergebnisse zurückkommen. Mit einem kurzen Grinsen und Kopfschütteln folgte auch ein: „Achja, ist doch klar! Weshalb habe ich nicht gleich daran gedacht?!“.

Aber meist liegt ja gerade an den einfachsten Dingen das große Problem. Ob es nun an meiner Intelligenz lag, mag ich bezweifeln, denn es ist „unmöglich“ an alles zu denken. So wie ein Testen auf alle je auftretenden Problemsituationen auch „unmöglich“ ist. Allerdings half mir dafür TDD weiter, indem mir eine fehlende Anforderung bewusst wurde. Ich musste anstatt eines einfachen String-Wertes ein String-Array von Ergebnissen erwarten.

Also Fakt ist, das TDD bei fehlenden Anforderungen weiterhilft. Dennoch dient TDD nicht zur Anforderungsanalyse für ein Softwareprojekt. Weil die hauptsächliche Anforderung „das erwarten meiner PLZ“ bereits bestand. TDD gibt einfach nur Hilfestellung, wenn zu der bereits stehenden Anforderung noch etwas vergessen wurde.

Darum wird eine Lösung benötigt, die vor TDD stattfinden muss, sodass die Frage doch eher lauten sollte: „Wie beginne ich ein Softwareprojekt?“. Wie dann mit TDD weiter gemacht wird, beantwortet sich dann ganz von selbst.

 

Die Lösung: Wie beginne ich ein Softwareprojekt?

Zu diesem Thema gibt es bereits zahlreiche Bücher, die jeden einzelnen Schritt bis ins Detail erklären. Ich möchte mich jedoch recht an der Oberfläche halten, so dass ein Gesamtbild zum Einstieg von TDD hilft.

 

Die Vision

Bevor es zur Konzeption des Projektes geht, spielt vorerst die Vision eine große Rolle. In den meisten Fällen erhalten wir einen Kunden, der eine großartige Idee für eine spätere Anwendung hat. Er hat viele, sogar sehr viele Bilder im Kopf, was er von seiner späteren Software erwartet.

Nun geht es darum, dass der Softwareentwickler gemeinsam mit dem Kunden über seine Wünsche spricht. Die schwierige Herausforderung in der Software-Branche ist, dass die Wünsche berufsspezifisch sind. Wird eine Software für einen Vermarkter entwickelt, müssen Grundkenntnisse in dessen Bereich aufgebaut werden.

 

Eine „Common Language“ aufbauen

Doch hierbei folgt schon das erste Problem: Kommunikation! Der Kunde ist Business-Experte in seinem Bereich und der Softwareentwickler ist der Business-Experte bei der Entwicklung von Software. Genauso wenig wie der Kunde sich für unseren Entwicklungsbereich interessiert, möchte der Entwickler so wenig wie möglich dessen Bereich lernen - nur so viel wie es nötig ist, um die Wünsche des Kunden zu befriedigen.

DieCommonLanguage

Abb.2. – Die Common Language

Für dieses Problem, gibt es nur eine Lösung. Es muss mit dem Kunden eine gemeinsame Sprache gefunden werden. Ich bezeichne es als die „Common Language“. Bei der Abb.2. zeigt die Grafik, dass es nur einen Weg gibt, wo der Kunde und der Entwickler auf eine gemeinsame Sprache stoßen. Diese beiden Welten treffen sich ausschließlich auf dem Bildschirm. Nachdem der Kunde seine Anforderungen gestellt hat, sollen dessen wünsche als Sketch (Zeichnung) festgehalten werden.

sketch

Abb.3. – Ein Sketch der Vision

Ist der Sketch abgesegnet worden, beginnen nun zwei weitere Prozesse. Der erste Prozess beginnt mit einer Abstraktion. Der Entwickler schaut sich in der Zeichnung alle Anwendungsfälle an und schreibt sie als User-Story auf. In der Regel sollte „eigentlich“ der Kunde diese User-Stories schreiben, allerdings zeigt die praktische Erfahrung dass es in den meisten Fällen besser ist, wenn die Entwickler diese selbst oder gemeinsam mit dem Kunden anfertigt. Der zweite Prozess beginnt nun beim Screen-Designer (falls vorhanden). Er baut aus dem Sketch einen Prototyp, zum Beispiel mittels Microsoft SketchFlow. Dabei wird auf die richtige Usability geachtet. Auf bestimmte Verhaltensmuster, die sichergestellt werden müssen, und ob der Kunde das auch so erwartet hat. Also gilt seine Vision vorerst spürbar zu Verfügung zu stellen.

sketchflow-prototype

Abb.4. – Ein SketchFlow-Prototype

 

Abstraktion der Anforderungen

Nun konnte durch die „Common Language“ die Anforderungen sichergestellt werden. Diese liegen nun als einfache User-Stories parat. Das Schreiben von User-Stories verlangt allerdings eine Art Disziplin. Sie sollten in der Sprache des Kunden liegen. Daher sollen technische Aspekte auf keinen Fall enthalten sein. Genau aus diesem Grund, sollte auch der Kunde „eigentlich“ selbst die User-Stories schreiben.

Softwarearchitektur-Abstraktionspyramide

Abb.5. – Die Abstraktionspyramide

Ein Beispiel als User-Story: „Bei der Eingabe eines Orts erhalte ich die jeweilige PLZ.“

Nun hat der Kunde seinen Prototyp erhalten und kann mittels SketchFlow-Player direkt Feedback an den Designer abgeben. Parallel zur gleichen Zeit, wird der Entwickler mit der Abstraktion der Anwendungsfälle (User-Stories) zu einzelnen Tasks beginnen. Diese Tasks beschreiben die benötigten Schritte um die Anforderung zu erfüllen.

Als Beispiel sind hier die Tasks zur oben angezeigten User-Story gelistet:

1: „Repository zur DB Abfrage für die PLZ coden“.

2: „Repository mittels Web-Service zur Verfügung stellen“.

3: „Web-Service Abfrage Client-seitig entwickeln“.

4: „PLZ-UserControl designen“.

5: „Design mit Code koppeln (MVVM)“.

Schnell wird ersichtlich, dass aus einer einfachen Anforderung viele Tasks entstehen.

Ziel erreicht! Ready to go for TDD!

Jetzt ist der Punkt erreicht, wo es klare Vorgaben durch Tasks gibt. Diese können nun mit TDD begonnen werden. Meist bildet man Tests genau nach den Softwareprozess mittels BDD (Behavior-Driven Development) ab. Das behilft gleichermaßen das Auffinden von unbedachten Anwendungsfällen.

 

Fazit

TDD ist ein mächtiges Werkzeug. Allerdings eben nur ein Werkzeug, das zu bestehenden Wünschen (Anforderungen) eingesetzt werden kann. Dass dazu Anforderungen vorerst nötig sind, wusste Christina laut ihres Blog-Posts bereits. Dennoch müssen diese Anforderungen mittels Abstraktion in einzelne Tasks gegliedert werden. Der Rest löst sich dann mit TDD meist von selbst. Wenn irgendwo eine Unsicherheit zur Umsetzung besteht, soll vorerst ein einfacher experimenteller Prototyp geschrieben werden. Ich hoffe ihr und anderen Lesern geholfen zu haben. Ready to go for TDD!

Flash Converter für Windows Phone 7

06.05.2010 15:03:10 | Oliver Scheer

image

Wie toll wäre es, wenn man als Flash-Entwickler seine Spiele auch auf ein Telefon bringen könnte. Leider ist dies für viele nur ein Traum. Nicht so für diejenigen, die für das neue Windows Phone 7 entwickeln möchten.

SWFLight portiert Flash-Spiele auf Windows Phone 7 und damit auch direkt nach Silverlight.

Wie cool!

Link

ICANN: First IDN ccTLDs Available

06.05.2010 14:54:30 | Damir Tomicic

Wie die Zeit vergeht .. Am ersten Juli 2008 habe ich auf der ICANN-Tagung [1] in Paris teilgenommen [2] und einen Beitrag zur Diskussion um die neuen internationalen TLDs (Top-Level-Domains) geleistet. Es war mehr als interessant ...

[1] http://www.icann.org
[2] http://tomicic.de/2008/07/01/KurzerBerichtVomICANNMeetingInParis.aspx

Die finale Entscheidung ließ auf sich warten (sie fiel am 30.09.2009 in Seoul, Süd Korea), nun ist es aber soweit. Zum erstan Mal in der Geschichte des Internet sind die nicht-lateinischen Zeichensätze für die Nutzung bei den Top-Level Domains zugelassen und mit dem Eintrag in der DNS root zone auch bereits aktiv. Die ersten Top-Level-Domains sind:

  • Egypt: مصر (Egypt)
  • Saudi Arabia: السعودية (AlSaudiah)
  • United Arab Emirates: امارات (Emarat)

[3] http://www.icann.org/en/announcements/announcement-05may10-en.htm 

Ein Beispiel einer solchen Domain ist:

وزارة-الأتصالات.مصر 

Am besten Copy+Paste in den Browser und nicht wundern über die Übersetzung in die kryptischen lateinischen Zeichen in der URL-Zeile. Es liegt an der mangelnden Unterstützung der neuen internationalen Domains:

If your software does not have full IDN support, this might not work exactly as expected. You may see a mangled string of letters and numbers, and perhaps some percent signs or a couple of “xn--”s mixed into the address bar. Or it may not work at all.

Übrigens, die nächste ICANN-Tagung ist Mitte Juni und ich werde erneut dabei sein. Ein Bericht folgt...

Zurück in die Zukunft mit Silverlight 4 – Roadshow von Gregor Biswanger

06.05.2010 12:21:46 | Oliver Scheer

Gregor Biswanger ist derzeit sehr kräftig im Lande unterwegs um über die Highlights von Silverlight 4 zu sprechen.

  • .NET User Group Frankfurt 04.05.2010
  • .NET User Group Saar  05.07.2010
  • .NET User Group Braunschweig 20.07.2010
  • .NET User Group Hamburg 18.08.2010

Weitere Termine folgen.

Mehr Informationen dazu gibt es hier und in seinem Blog.

Silverlight: Chrome und Glass Theme

06.05.2010 10:07:00 | Oliver Scheer

Auf Silverlight Scratchpad ist ein sehr gutes Tutorial zum Thema Theming in Silverlight 4 veröffentlicht worden. Kleiner Nebeneffekt, es wird direkt ein sehr schönes Theme im Chrome Glass Look bereitgestellt.

image

Link

Neuigkeiten bei der Team System User Group Virtual Edition

06.05.2010 02:04:00 | Thomas Schissler

Bei der weltweiten Usergroup Team System User Group Virtual Edition hat sich in den letzten Tagen einiges geändert, z.B. der Name. Wie das Produkt das im Zentrum unserer Aktivitäten steht, wurde die Gruppe in Visual Stuido ALM User Group umbenannt. Gleichzeitig haben wir eine neue Website online geschaltet. Sie finden uns jetzt unter http://www.vsalmug.com/default.aspx

In diesem Zuge werden wir zukünftig die Benachrichtigungen für unsere Meetings nicht mehr per E-Mail zustellen, sondern sie können sich Neuigkeiten unseren Blog mit den Ankündigungen per RSS abrufen (http://www.vsalmug.com/CMSPages/BlogRss.aspx?aliaspath=/Meetings/Announcements).

Zusätzlich ahben wir auf LinkedIn eine Gruppe eingerichtet über die sich die Mitglieder besser untereinander vernetzen können: http://www.linkedin.com/groups?home=&gid=2860483&trk=anet_ug_hm

Abschließend möchte ich auf unseren nächsten Vortrag noch hinweisen. Am Donnerstag, 06.05.2010 ab 19:00 wird Martin Woodward vorstellen wie die Integration mit nicht Microsoft-Plattformen über den Team Explorer Everywhere (vormals Teamprise) gelingt.

Martin Woodward

Team Explorer Everywhere 2010

Meeting Date: Thursday, May 6th, 2010
Time: 10:00AM PT (UTC-0700)
[Add to Calendar]
[Join Meeting]

Did you know that Team Foundation Server can be used for software development by your entire organization - not just the team using Microsoft platforms and technologies? In this session Martin Woodward will show you how you can get your Java, Mac, Linux, and Eclipse developers on board using Team Explorer Everywhere 2010. This session shows you how you can standardize on Team Foundation Server for the Application Lifecycle Management of your entire enterprise. See how to manage work items, version control, and build automation across technology and platform boundaries in your company and understand the features and functionality available to the people in your organization.

Speaker:  Martin Woodward

Martin Woodward is the Program Manager for the Microsoft Visual Studio Team Foundation Server Cross-Platform Tools Team and co-author of the book "Professional Application Lifecycle Management with Visual Studio 2010". Before joining Microsoft, Martin was voted Team System MVP of the Year and has spoken about Team Foundation Server at events internationally. Not only does Martin bring a unique insight into the inner workings of the product he has experience from over a half-decade of real world use at companies big and small that he is always happy to share. When not working or speaking, Martin can be found at his blog http://www.woodwardweb.com.

Microsoft Silverlight 4 Data and Services Cookbook @gillcleeren

05.05.2010 15:18:29 | Damir Tomicic

Irgendwie ist das Thema Kochen immer wieder präsent :-)

Gill Cleeren, belgischer Microsoft Regional Director und ein guter Freund von mir, veröffentlicht in seinem Buch [1] (gemeinsam mit Kevin Dockx geschrieben) eine Menge nützlicher "Rezepte" für den Aufbau von Unternehmensapplikationen mit Microsoft Silverlight 4 Technologie.

Das Buch ist sehr praktisch geschrieben. Der Leser merkt sofort, dass Gill und Kevin die Ansätze selbst ausprobiert und für die Leser optimiert haben. Die gewählte Sprache ist einfach, die Beispiele auch für Anfänger geeignet. Ein guter Einstieg in das Thema.

Prädikat: Lesenswert!

[1] https://www.packtpub.com/microsoft-silverlight-4-data-and-services-cookbook/book

BizTalk: Maps mit Referenzen zu externen Assemblies debuggen

05.05.2010 14:25:00 | Wolfgang Kluge

Um BizTalk-Maps zu debuggen, die eine exterene Assembly aufrufen, reichen die Standard-Möglichkeiten nicht mehr aus. Es erscheint die Fehlermeldung

Cannot find the script or external object that implements prefix 'http://schemas.microsoft.com/BizTalk/2003/ScriptNS0'

Um das zu umgehen, müssen die externen Assemblies dem Debugger bekannt gemacht werden. Um allgemein XSLT zu debuggen kann, neben der Möglichkeit dies über das Menü "XML" -> "Debug XSLT" zu erledigen, auch das Objekt XslCompiledTransform verwendet werden. Hierdurch ist man wesentlich flexibler und kann z.B. StartParameter angeben und/oder eben Extension Objects". Und da eine BizTalk-Map letztendlich auch nur ein XSLT-Dokument darstellt, gilt das auch dafür.

Als erstes sollte man ein C#-Projekt zur BizTalk-Solution hinzufügen. Darin wird lediglich unten stehende Methode eingefügt und die "Main"-Methode so angepasst, dass ein Aufruf der Methode "DebugXslt" mit den jeweiligen Parametern erfolgt.

/// <summary>
/// Helper Method to debug Maps with Extension Objects
/// </summary>
/// <param name="mapXslt">Path to xslt-file generated by the MapperCompiler (Validate Map)</param>
/// <param name="inputXml">Path to input-file (Test Map)</param>
/// <param name="extensionObjectsXml">Path to Extension Object XML (Validate Map)</param>
static void DebugXslt( string mapXslt, string inputXml, string extensionObjectsXml ) {
    if( !string.IsNullOrEmpty( mapXslt ) && !string.IsNullOrEmpty( inputXml ) && File.Exists( mapXslt ) && File.Exists( inputXml ) ) {
        XslCompiledTransform xslt = new XslCompiledTransform( true );

        // allow embedded scripts and document()-function
        XsltSettings xsltSettings = new XsltSettings( true, true );

        // Load the style sheet.
        xslt.Load( mapXslt, xsltSettings, null );

        // resolve extension objects
        XsltArgumentList xsltArgs = new XsltArgumentList( );
        if( !string.IsNullOrEmpty(extensionObjectsXml) && File.Exists( extensionObjectsXml ) ) {
            XmlReaderSettings rsettings = new XmlReaderSettings( );
            rsettings.IgnoreComments = true;
            rsettings.IgnoreProcessingInstructions = true;
            rsettings.IgnoreWhitespace = true;

            using( XmlReader reader = XmlReader.Create( extensionObjectsXml, rsettings ) ) {
                reader.ReadStartElement( "ExtensionObjects" );

                do {
                    string ns = "", an = "", cn = "";
                    while( reader.MoveToNextAttribute( ) ) {
                        switch( reader.LocalName ) {
                            case "Namespace":
                                reader.ReadAttributeValue( );
                                ns = reader.Value;
                                break;
                            case "AssemblyName":
                                reader.ReadAttributeValue( );
                                an = reader.Value;
                                break;
                            case "ClassName":
                                reader.ReadAttributeValue( );
                                cn = reader.Value;
                                break;
                        }
                    }

                    // load type and add instance to xslt-Arguments
                    if( !string.IsNullOrEmpty( ns ) && !string.IsNullOrEmpty( an ) && !string.IsNullOrEmpty( cn ) ) {
                        Type t = Type.GetType( Assembly.CreateQualifiedName( an, cn ) );
                        xsltArgs.AddExtensionObject( ns, System.Activator.CreateInstance( t, false ) );
                    }
                } while( reader.ReadToNextSibling( "ExtensionObject" ) );

                reader.Close( );
            }
        }

        // Execute the transformation.
        using( XmlWriter writer = XmlWriter.Create( TextWriter.Null ) ) {
            xslt.Transform( inputXml, xsltArgs, writer );
            writer.Close( );
        }

        xsltArgs.Clear( );
    }
}

Parameter Beschreibung
mapXslt Pfad zur XSLT-Datei
inputXml Pfad zur der Datei, die die Testdaten enthält
extensionObjectsXml

Pfad zur Datei, in der die Erweiterungsobjekte stehen (darf leer sein)

Nun müssen noch die einzelnen Pfade ermittelt werden. Mittels "Validate Map" (rot im Bild) werden die XSLT-Datei und die extensionObjects-Datei erstellt. Im Output-Window erscheinen die jeweiligen Pfade und müssen nur noch übernommen werden.
Hat man kein XML-Dokument, mit dem man Testen kann, sondern ein natives Format, so hilft "Test Map". Auch hier erscheint im Output-Window der Pfad mit dem Hinweis "Test Map used the following file".

 

Sind nun alle 3 Pfade ermittelt und eingetragen, kann es auch endlich losgehen. Damit der Debugger nicht einfach durchläuft, sollte die XSLT-Datei geöffnet und eine Haltepunkt eingefügt werden.

 

Nun muss das Projekt gestartet werden. Dazu mit der rechten Maustaste auf das Projekt zeigen und "Debug" -> "Start new instance" ausführen.
Alternativ das Projekt als StartUp-Project einrichten und F5 drücken...

Silverlight Smooth Streaming in 3D

05.05.2010 10:25:00 | Oliver Scheer

image Gut das ich meine 3D-Brille aus “Avatar” nicht direkt weggeschmissen habe. Auf der NABShow (Broadcasting-Messe) wurde Mitte April nämlich die Möglichkeit des Live-Streamens von Content in 3D demonstriert.

Dazu dient der Radio Sender “Antenne Niedersachsen” als “Versuchskaninchen”, denn dieser streamt mittels zwei Kameras ein 3D-Bild übers Web … Live …

Der Link: hier.

Dependency Inection mit LightCore im dot.NET Magazin

05.05.2010 04:51:00 | Jürgen Gutsch

Ganz stolz kann ich heute mal folgendes schreiben:

Mit dem Artikel “Keine Sorge, es piekst nur ganz kurz – Dependency Injection mit LightCore” ist mein erster Artikel in einer deutschsprachigen Fachzeitschrift erschienen.

Zu finden ist der Artikel in der Ausgabe 6.2010 des dot.NET Magazins, welche die meisten Abonnenten bereits in der Hand halten sollten.

In diesem Artikel beschreibe ich kurz das Dependency Injection Pattern und vor allem die einfache Umsetzung des Patterns mit Peter Buchers Dependency Injection Container LightCore.

 

 

 

 


Übrigens gibt es LightCore auch auf FaceBook und Twitter:
FaceBook Seite: http://www.facebook.com/pages/LightCore/
Twitter: http://twitter.com/lightcore

DotNetKicks-DE Image

DI/IoC und StartUp in VSTO Projekten

04.05.2010 22:40:00 | Jan Christian Selke

Vor einiger Zeit schrieb ich über einen Ansatz in VSTO Projekten das MVP Pattern einzusetzen und damit auch – zumindest mehr oder weniger indirekt – über Testbarkeit und DI. Zugegeben, damals fand ich den Ansatz schon recht gut. Recht gut finde ich den Ansatz noch immer, aber so richtig zufrieden war ich damit eigentlich nicht.

Als Konsequenz habe ich immer wieder darüber nachgedacht, wie der Ansatz weiter verfeinert werden könnte. Mittlerweile bin ich bei einer Variante angekommen, die ich noch wieder ein Stück weit besser finde.

Was mich an der ersten Variante besonders störte, war die Initialisierung des AddIns und das Anhängen des ersten Presenters an den Ribbon. Den passive view Ansatz halte ich mittlerweile auch nicht mehr für notwendig. Die Logik muss nicht maximal von der Oberfläche isoliert werden. Es kann also genauso gut ein anderes presentation pattern, etwa der supervising controller, angewandt werden. Hierbei handelt es sich aber eher um eine Frage des persönlichen Geschmacks.

Das eigentliche Thema ist also der Einstieg ins bzw. die Initialisierung des AddIns. Viele AddIns weisen sich durch komplexere Initialisierungslogik aus. Damit diese aber nicht etwa die Word Instanz vor weiterer Ausführung blockiert, sollte die Initialisierung asynchron im Hintergrund ablaufen. Zuerst dachte ich an den guten alten Backgroundworker: Nach einiger dieser erschien mir aber schnell als etwas zu umständlich, schwerfällig und unflexibel.

Die Lösung, für die ich mich letztlich entschieden habe, ist eine Variante des Command Executors. Der erste Aufruf erfolgt innerhalb der StartUp-Methode des AddIns.

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
new BackgroundExecutor(new SynchronizationContext()).Execute(() =>
{
new Bootstrapper().BootstrapAddInDIContainer<IRibbonPresenter<IRibbonView>>();
return () => this.Initialized = true;
});
}

Die Rückmeldung an das AddIn erfolgt als continuation. Das Initialisierungsflag des AddIns wird gesetzt und damit erst die Funktionalität des AddIns zur Verfügung gestellt. So bleibt Word trotz möglicher aufwändiger Initialisierungslogik reaktionsfähig.

Bleibt die Frage, wie wird der Presenter zugewiesen? Dies steckt bereits im Bootstrapper des DI Containers. In meinem Beispiel verwende ich mal wieder StructureMap.

public STARTTYPE BootstrapAddInDIContainer<STARTUPTYPE>() where STARTUPTYPE : class
{
var container = BuildUpContainer();
return container.GetInstance<STARTUPTYPE>();
}

Nachdem der Container konfiguriert und aufgebaut ist, wird der Presenter ein Mal aus dem Container abgerufen. Aufgrund der Anweisung mit OnCreationForAll(Action<PLUGINTYPE>) wird ein TypeInterceptor registriert, der die hinterlegte Aktion gegen jede neu erstellte Instanz durchführt.

public class AddInRegistry : Registry
{
public AddInRegistry()
{
For<IRibbonPresenter<IRibbonView>>().Use<RibbonPresenter>();
For<IRibbonPresenter<IRibbonView>>().OnCreationForAll(x =>
x.View = (IRibbonView) Globals.Ribbons.FirstOrDefault(y =>
y is MvpDiSampleRibbon));
}
}


Der AddIn Ribbon wird aus der Liste der Ribbons ausgelesen und als View für den Presenter übergeben. Und da diese Instanz nur einmal beim StartUp abgerufen wird und dabei an den Ribbon gebunden wird, muss man sich keine Sorgen über Mehrfachinstanziierungen machen.

Mal abwarten, an welchem Teil ich als nächstes weiter drehen werde…

Lebendige ASP.NET Webseiten mit jQuery

04.05.2010 19:47:09 | Andre Kraemer

Moderne Webseiten beinhalten in der heutigen Zeit einen hohen Anteil clientseitiger Quellcodes in Form von JavaScript. Für diesen Anwender führt dies im Idealfall zu einer verbesserten Benutzbarkeit der Applikation, da diese neben netten UI Effekten nun meist durch Ajax auch weitaus flüssiger bedienbar ist.

Bei vielen Entwicklern solcher dynamischer Webseiten führt der vermehrte JavaScript Anteil allerdings häufig zu Wein- und/oder Schreikrämpfen, denn nur die wenigsten mögen JavaScript wirklich. Die Ursachen für diese Antipathie liegen jedoch selten an JavaScript als Sprache selbst, sondern in den meisten Fällen eher an der unterschiedlichen Implementation des DOMs / BOMs durch die verschiedenen Browserhersteller. Diese Inkonsistenz führt nämlich dazu, dass JavaScript Code, der in einem Browser bzw. einer Version eines Browsers problemlos läuft im nächsten Browser Fehler verursacht und schlichtweg nicht läuft.

Weiter wird häufig bemängelt, das Selektionen fernab von einem einfachen document.getElementById(IdMeinesElements) relativ kompliziert sind. Als Beispiel wären hier zu nennen: alle Elemente mit einer bestimmten Klasse, ungerade Zeilen einer Tabelle, das aktivierte Element einer RadioButtonGroup usw.

Und nun?

Nun gibt es folgende Strategien mit diesen Problemen umzugehen:

  1. Man drückt sich immer davor JavaScript zu schreiben und wälzt dies auf einen Kollegen ab
  2. Man kopiert sich irgendwoher JavaScript Codeschnippsel, die angeben browserunabhängig zu sein und hofft, das dem auch so ist
  3. Man investiert Unmengen Zeit in die eigene browserübergreifende Implementierung diverser Funktionalitäten
  4. Man bedient sich eines der am Markt verfügbaren JavaScript Frameworks

Strategie Nr. 1 mag eine Weile ganz gut funktionieren, früher oder später wird aber der Zeitpunkt kommen, an dem man sich nicht mehr drücken kann (ich spreche da aus eigener Erfahrung ;-)).

Strategie Nr. 2 funktioniert immer dann, wenn der Umfang des benötigten JavaScript Codes überschaubar ist. Gemeinsam mit der Applikation wird aber auch irgendwann der zusammenkopierte Code wachsen und die Wartbarkeit entsprechend sinken.

Strategie Nr. 3 ist sicherlich eine prima Idee für alle die außerdem auch ein eigenes Logging Framework, einen eigenen OR Mapper usw implementiert haben, oder kurz gesagt für alle die gerne das Rad neu erfinden ;-)

Gangbar scheint also nur Strategie Nr. 4 zu sein. Schaut man sich nun am Markt um, stößt man unweigerlich auf jQuery. Die freie JavaScript Library adressiert unter anderem genau die zuvor genannten Probleme und hat in letzter Zeit einen wahren Hype verursacht. Dieser Rummel wurde sicherlich auch dadurch verstärkt, dass Microsoft jQuery offiziell supportet, mit Visual Studio ausliefert und die Arbeiten an der hauseigenen JavaScript Bibliothek ASP.NET Ajax Library zugunsten von jQuery eingestellt hat.

Wie legen wir nun aber mit jQuery los? Genau diese Frage möchte ich in diesem und den folgenden Blog Posts beantworten. Da jQuery in einem neuen ASP.NET MVC Projekt automatisch hinzugefügt wird und ASP.NET MVC Entwickler somit sowieso jQuery gewöhnt sind, soll als Beispiel zunächst eine Webforms Anwendung dienen.

Auf die Plätze, fertig, los!

Wenn man jQuery benutzen möchte, besteht der erste Schritt darin, die freie JavaScript Library in seine Seite einzubinden. Dazu lädt man unter http://www.jQuery.com einfach die aktuelle Version der Bibliothek herunter und kopiert diese anschließend zum Beispiel in einen Unterordner Scripts seiner Webanwendung. jQuery ist übrigens in einer für Menschen lesbaren (z. B. jQuery-1.4.2.js) und in einer verkleinerten Version (z, B. jQuery-1.4.2.min.js) verfügbar. In der verkleinerten Version sind unnötige Leerzeichen, Zeilenumbrüche und Kommentare entfernt. Außerdem wurden die Namen der Variablen und nicht öffentlichen Funktionen auf ein oder zwei Buchstaben verkürzt. Sinn dieser Maßnahme ist es die zum Client übertragene Datenmenge zu reduzieren. So ist die verkleinerte Version knappe 100 kb kleiner als die lesbare Variante. Für Produktivszenarien sollte demnach also in jedem Fall die .min Version genutzt werden, wohingegen während der Entwicklungszeit eher die lesbare Variante eingebunden werden sollte. So kann man den Scriptcode im Fall der Fälle nämlich noch debuggen.

So, genug der Vorrede und zurück zur Praxis. Tatsächlich einbinden können wir jQuery nun über folgende Zeile:

<script src="Scripts/jquery-1.4.2.js" type="text/javascript"></script>

Platzieren sollte man diese Zeile übrigens innerhalb des Kopfbereichs der Seite:

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script src="Scripts/jquery-1.4.2.js" type="text/javascript"></script>
</head>

Prima, aber was mache ich nun damit?

Gute Frage! Jetzt haben wir jQuery zwar eingebunden, aber wie geht es jetzt weiter. Dazu sollten wir zunächst kurz einen Blick darauf werfen, was wir normalerweise mit JavaScript machen. In den meißten Fällen reduziert sich dies auf:

  • Elemente aus dem DOM zu selektieren
  • Selektierte Elemente zu manipulieren (ein- / ausblenden, Styledefinitionen zu verändern...)
  • Code bei bestimmten Ereignissen ausführen (z. B. click event)
  • Neue Elemente dem DOM hinzuzufügen
  • Elemente aus dem DOM zu löschen
  • AJAX Aufrufe zum Server zu machen und die Antwort zu Verarbeiten

Als kleinen Einstieg picken wir uns exemplarisch die ersten drei Punkte heraus. Wir werden also DOM Elemente selektieren und diese manipulieren. Geschehen wird dies bei dem Klick auf einen Button.

Dazu werden wir eine Meldungszeile, ähnlich wie man sie von Stackoverflow kennt nachbauen.

01_so_message

Der erste Schritt besteht in der Erstellung eines HTML und CSS Grundgerüsts:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>jQuery Demo</title>

    <style type="text/css">
        body
        {
            margin: 0px;
        }
        #message
        {
            background-color: #FFFF88;
            border-bottom: solid 1px #000000;
            font-weight: bold;
            text-align: center;
            padding: 8px;
            margin: 0px;
            display:none;
            font-family: Arial, Verdana, Sans-Serif;
        }
        #message a
        {
            float: right;
            border: solid 3px black;
            font-family: Arial, Verdana, Sans-Serif;
            font-weight: bold;
            text-decoration: none;
            color: Black;
        }
    </style>
</head>
<body>
    <form id="form1" runat="server">
    <div id="message"><span>Dummy Nachricht</span><a href="Default.aspx">X</a>
    </div>
    <div id="content">
        <p>
            Dies ist eine jQuery Demowebsite</p>
        <button id="showMessage">
            Klick mich</button>
    </div>
    </form>
</body>
</html>

Wie man sieht, wird ein DIV Element  mit dem Namen "message" erstellt, dass als Unterlemente ein SPAN Element und einen Link enthält. Über CSS wird dieses DIV Element noch ein wenig gestyled und initial ausgeblendet. Außerdem ist auf der Seite noch ein Button definiert. Ein Klick auf diesen Button soll der Auslöser sein, um die Meldung anzuzeigen.

Wie aber genau sieht nun der Code aus, um die Nachricht - mit verändertem Text - anzuzeigen?

Mit der Hilfe von jQuery ist dies garnicht so schwer:

$("#showMessage").click(function(evt) {
    evt.preventDefault();
    $("#message span").text("Du hast den Button geklickt. Klicke nun auf das X, um die Nachricht auszublenden.");
    $("#message").fadeIn(2000);
});
Auf den ersten Blick mag der Code etwas verwirrend aussehen. Vor allem durch die vielen $-Zeichen. Daher ein paar erklärende Worte:

In Zeile 1 selektieren wir mit dem Befehl: $("#showMessage") zunächst das DOM Element mit der ID showMessage, also unseren Button. Das $-Zeichen ist übrigens ein Alias für die jQuery Funktion. Statt $("message") hätte ich also auch jQuery("$message") schreiben können. Die Rückgabe des Aufrufs - unabhängig ob via jQuery(...) oder $(...) ist ein Objekt vom Typ jQuery. Dieses Objekt beinhaltet die selektieren DOM Elemente bzw. das selektierte DOM Element sowie einige weitere Funktionen.

In unserem Fall bekommen wir also ein Objekt vom Typ jQuery zurück, dass das DOM Element showMessage beinhaltet. Für dieses DOM Element wird nun eine anonyme Funktion als Handler für das Ereignis Click registriert.

In Zeile 2 wird mit dem Befehl evt.preventDefault(); nun die Standardaktion die der Browser bei diesem Ereignis, also z. B. das posten des Formulars nach Klick auf den Button, verhindert.

In Zeile 3 werden anschließend alle span Elemente innerhalb des DOM Elements mit der Id message selektiert. In unserem Fall ist dies also genau eins. Für dieses span Element wird mit der Funktion text jetzt ein neuer Text vergeben. Außerdem wird das Element mit der Id message in Zeile 4 langsam (über einen Zeitraum von zwei Sekunden) eingeblendet.

Der Quellcode zum Ausblenden der Nachricht sieht ähnlich aus:

$("#message a").click( function(evt) {
     evt.preventDefault();
     $("#message").fadeOut("slow");
 });

In Zeile 1 wird an alle A-Elemente innerhalb des DOM Elements mit der Id message ein Eventhandler für das Ereignis Click angehangen. Dieser verhindert in Zeile 2 die Standardaktion des Links und blendet in Zeile 3 unsere Nachrichtenzeile wieder aus. Dieses mal wird statt einer Angabe in Millisekunden der String "slow" als Argument übergeben. Dieser ist in den jQuery Quellcodes mit einem Wert von 600 ms hinterlegt.

Perfekt, aber wo schreibe ich den Code nun rein?

So, jetzt wo wir eigentlich den ganzen Quellcode fertig haben stellt sich natürlich die Frage, wie wir ihn in unsere Seite einbinden. Eine naive Implementierung sähe wie folgt aus:

<head>
<!-- ... -->
<script type="text/javascript">
    $("#showMessage").click(function(evt) {
        evt.preventDefault();
        $("#message span").text("Du hast den Button geklickt. Klicke nun auf das X, um die Nachricht auszublenden.");
        $("#message").fadeIn(2000);
    });
    $("#message a").click( function(evt) {
        evt.preventDefault();
        $("#message").fadeOut("slow");
    });
</script>
<!-- ... -->
</head>

Der Code würde also einfach in ein Scripttag innerhalb des Head Tags kopiert werden. Dies läuft so nicht! Der Grund ist, dass mit diesem Code versucht wird, ein Eventhandler an ein DOM Element zu binden, das es zu diesem Zeitpunkt noch garnicht gibt.

Wie sieht aber die Lösung für das Problem aus?

Alles zu seiner Zeit

Wie wir zuvor gesehen haben, ist unser Code wirkungslos, wenn wir ihn ausführen ehe es ein entsprechendes DOM Element gibt. Daher sollten wir ihn erst auslösen, sobald das DOM vollständig initialisiert ist.

Ein weg dies zu erreichen wäre es, den Code aufzurufen wenn das Ereignis window.onload eintritt:

window.onload = function() {
  $("#showMessage").click(function(evt) {
     evt.preventDefault();
     // Restlicher Code hier
  });
}

Diese Variante würde bereits fehlerfrei funktionieren. Allerdings wird das Ereignis onload erst ausgelöst, wenn das DOM vollständig initialisiert wurde und alle externen Ressourcen, wie zum Beispiel Bilder oder Stylesheets geladen wurden. Dies kann von Fall zu Fall recht lange dauern, so dass der Anwender den Button bereits anklicken könnte, ohne dass unser Script ausgeführt wird. Zum Glück bietet jQuery einen besseren Ansatz, nämlich $(document).ready. In dieser Variante wird das Ereignis ready ausgelöst, sobald das DOM vollständig initialisiert wurde, aber bevor externe Ressourcen geladen wurden.

Das vollständige Beispiel mit $(document).ready sieht dann wie folgt aus:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>jQuery Demo</title>

    <script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script>

    <style type="text/css">
        body
        {
            margin: 0px;
        }
        #message
        {
            background-color: #FFFF88;
            border-bottom: solid 1px #000000;
            font-weight: bold;
            text-align: center;
            padding: 8px;
            margin: 0px;
            display:none;
            font-family: Arial, Verdana, Sans-Serif;
        }
        #message a
        {
            float: right;
            border: solid 3px black;
            font-family: Arial, Verdana, Sans-Serif;
            font-weight: bold;
            text-decoration: none;
            color: Black;
        }
    </style>

    <script type="text/javascript">
        $(document).ready(function() {
            $("#showMessage").click(function(evt) {
                evt.preventDefault();
                $("#message span").text("Du hast den Button geklickt. Klicke nun auf das X, um die Nachricht auszublenden.");
                $("#message").fadeIn(2000);
            });
            $("#message a").click(function(evt) {
                evt.preventDefault();
                $("#message").fadeOut("slow");
            }
        }
      });
    </script>

</head>
<body>
    <form id="form1" runat="server">
    <div id="message"><span>Dummy Nachricht</span><a href="Default.aspx">X</a>
    </div>
    <div id="content">
        <p>
            Dies ist eine jQuery Demowebsite</p>
        <button id="showMessage">
            Klick mich</button>
    </div>
    </form>
</body>
</html>

Ausblick und Fazit

Wie dieser Blog Eintrag gezeigt hat, ist jQuery eine recht komfortabel zu bediene JavaScript Library, mit der sich mit wenigen Zeilen Script Code interessante Effekte erzielen lassen. Neben der intuitiven und Browser unabhängigen API besticht die Bibliothek vor allem durch die Fülle an Funktionen und erhältlichen Plug-Ins. Selbstverständlich konnte ich hier nur einen kurzen (ersten) Einblick verschaffen. Da ich das Thema Clientseitige Entwicklung in (ASP.NET) Webanwendungen jedoch für sehr interessant halte, habe ich vor in der nächsten Zeit weitere Einträge zum Thema jQuery mit folgenden Schwerpunkten zu schreiben:

  • Nutzen von Content Delivery Networks (CDNs)
  • jQuery Selektoren
  • Möglichkeiten der DOM Manipulation
  • jQuery und Firebug
  • jQuery Plugins selber entwickeln
  • jQuery UI
  • jQuery Utility Funktionen
  • jQuery und Ajax für Webforms und ASP.NET MVC

Eventuell werde ich im Anschluss an die Artikel auch kurze Video Tutorials bereitstellen.

Bevor ich allerdings loslege würde mich natürlich interessieren, ob das Thema für euch überhaupt von Interesse ist. Am liebsten in Form eines kurzen Kommentars.

Sollte jemand von euch übrigens das Verlangen haben, das Thema jQuery, oder auch generell ASP.NET mit mir persönlich in lockerer Atmosphäre zu diskutieren: Am 28. Mai werde ich einen Einsteigervortrag zu jQuery auf der dotnet Cologne 2010 halten. Über zahlreiche Besucher des Vortrags und natürlich auch spannende Diskussionen danach würde ich mich sehr freuen.

In den Pausen findet man ihr mich übrigens wahrscheinlich im Ausstellerbereich am Stand der Firma Infragistics. Dort wäre ich dann zusätzlich auch für den ein oder anderen Plausch über die Infragistics NetAdvantage Komponenten zu haben.

War dieser Artikel hilfreich für dich? Dann kicke ihn doch bitte bei dotnet-kicks.de!



blog.codemurai.de © André Krämer |Impressum | Abonieren

Windows Phone 7 Tools Refresh!

04.05.2010 19:18:20 | Oliver Scheer

Aus dem Windows Phone Blog:

WPDTCTPR“Die seit der MIX verfügbaren Vorabversionen der Windows Phone 7 Developer Tools (VS 2010 Express for Windows Phone, Expression Blend 4, XNA Game Studio 4.0, diverse Plug-Ins) sind ab sofort in einer Refresh-Version verfügbar! Besonders wichtig zu erwähnen ist, dass diese nun kompatibel mit der finalen Version von VS 2010 und dem .NET Framework 4 sind.

Im einzelnen sind neu und hier verfügbar:

.NETFx 4 RTM
http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=0a391abd-25c1-4fc0-919f-b21f31ab88b7

Windows Phone Developer Tools CTP - April Refresh
http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=cabcd5ed-7dfc-4731-9d7e-3220603cad14

Microsoft Expression Blend® 4 Release Candidate (RC)
http://www.microsoft.com/downloads/details.aspx?FamilyID=88484825-1b3c-4e8c-8b14-b05d025e1541&displaylang=en

Microsoft® Expression Blend® Add-in Preview 2 for Windows® Phone
http://www.microsoft.com/downloads/details.aspx?FamilyID=47f5c718-9dec-4557-9687-619c0fdd3d4f&displaylang=en

Microsoft® Expression Blend® Software Development Kit (SDK) Preview 2 for Windows Phone
http://www.microsoft.com/downloads/details.aspx?FamilyID=86370108-4c14-42ee-8855-226e5dd9b85b&displaylang=en

Vor der Installation bitte die Vorgängerversionen der o.g. Tools komplett de-installieren. Eine Installation der Refresh-Versionen in der o.g. Reihenfolge hat bei mir funktioniert.

Zu den Neuerungen (neben der VS2010 RTM-Kompatibilität) s. die aufgefrischte Dokumentation und diesen Eintrag im WP Developer Blog.

Happy coding, happy designing! :-)“

Installing SharePoint Foundation 2010 on a Single Server - Part 1

04.05.2010 18:45:00 | Ozgur Aytekin

SharePoint Foundation 2010 is the next version of Windows SharePoint Services. Formerly known as Windows SharePoint Services 4.0, SharePoint Foundation 2010 provides essential solutions for organizations to do secure, manageable and web-based collaboration. Best of all, it's technically free.

With the availability of 64-bit hardware, SharePoint Foundation 2010 (including the full-blown SharePoint Server 2010) now requires the 64-bit version of Windows Server 2008.

* Windows Server 2008 Service Pack 2 for non-R2 systems
* Web Server Role (IIS 7)
* Windows PowerShell 2.0 for non-R2 systems (Windows PowerShell 2.0 ships with Windows Server 2008 R2 and Windows 7 so you no longer have to worry about that)
* .NET Framework 3.5 with Service Pack 1 (in R2 systems, this can be enabled via the Add Roles Wizard)
* Windows Server 2008 hotfix for token authentication (non-R2 and R2 systems)

http://www.mssharepointtips.com/tip.asp?id=965

xtopia[kompakt] Roadshow 2010 – Videos und Präsentationen ab sofort verfügbar.

04.05.2010 16:30:00 | Peter Kirchner

Vom 19. bis 28. April fand in 6 Städten die xtopia[kompakt] Roadshow statt. 580 Besucher konnten sich bei dieser kostenlosen Kundenveranstaltung über Innovationen von Microsoft im Bereich Silverlight, Microsoft Expression, Web-und RIA-Design, Windows Azure, Sharepoint und Windows Phone informieren.

Für alle, die sich die Sessions noch einmal zu Hause bequem ansehen möchten und natürlich auch für alle, die nicht live dabei sein konnten, sind ab sofort alle Sessions auf Video sowie Präsentationen und weitere Informationen unter www.microsoft.de/expression/xtopia verfügbar.

Alle News über kommende Events rund um Web-und Interface Entwicklung finden Sie wie immer auf dem deutschen RIA-Blog unter blogs.msdn.com/riablog.

Die Themen im Überblick:

Jan Schenk: Heiter trotz wolkig - Cloud Computing mit Windows Azure

Cloud Computing ist in aller Munde. Das Konzept und die Philosophie hinter Windows Azure sehen Sie hier im Schnelldurchlauf: Für welche Einsatzbereiche macht Cloud Computing wirklich Sinn? Wann rechnet sich Windows Azure? Gehen Sie in dieser Session auf Tuchfühlung mit der Wolke!

Frank Prengel: Windows Phone – neue Ansätze, neue Möglichkeiten

Das Jahr 2010 wird viele signifikante Neuerungen für Windows Phones bringen – für Anwender, Entwickler und Designer. Diese Session vermittelt Ihnen in komprimierter Form, wie Microsoft seine mobile Plattform auffrischt und Maßstäbe im Smartphone-Bereich setzen wird.

Oliver Scheer:  Silverlight 4 – Die Highlights

Rich Internet Applications mit Microsoft Silverlight: Einfach, Schnell und Beeindruckend. Silverlight 4 bringt eine Fülle von neuen Möglichkeiten mit und macht das Entwickeln und Designen von interaktiven Webanwendungen noch einfacher. Dieser Vortrag zeigt die Highlights der neuen Version von Silverlight.

Tom Wendel: „SharePoint 2010 spricht Silverlight“

Mit der Einführung von SharePoint 2010 wächst zusammen, was zusammen gehört. Mit Hilfe von Silverlight lassen sich Daten in SharePoint perfekt visualisieren.  Eine nahtlose Integration der beiden Technologien verschafft völlig neue Möglichkeiten – sei es direkt als Webpart oder als eigenständige Silverlight-Anwendung.

Clemens Lutsch: Metro UI // Silverlight & WPF in der Design-Praxis

Führende Design-Agenturen berichten von Erfahrungen mit WPF & Silverlight in aktuellen, innovativen Projekten. So erfahren Sie aus erster Hand, wie moderne UX mit modernen Tools entsteht.

Georg Christoph, Nero AG: Microsoft Expression im Einsatz bei Nero

Wie Expression dabei hilft, Brücken zwischen Usability, Design und Entwicklung zu bauen.

xtopia [kompakt] Roadshow als On-Demand Inhalte

04.05.2010 15:18:45 | Jan Schenk

Ab sofort findet ihr unter www.microsoft.de/expression/xtopia alle Sessions der xtopia[kompakt] Roadshow 2010 als Video inklusive aller Präsentationen.

Und diese Videos findet ihr dort:

Jan Schenk: Heiter trotz wolkig - Cloud Computing mit Windows Azure

Cloud Computing ist in aller Munde. Das Konzept und die Philosophie hinter Windows Azure sehen Sie hier im Schnelldurchlauf: Für welche Einsatzbereiche macht Cloud Computing wirklich Sinn? Wann rechnet sich Windows Azure? Gehen Sie in dieser Session auf Tuchfühlung mit der Wolke!

Frank Prengel: Windows Phone – neue Ansätze, neue Möglichkeiten

Das Jahr 2010 wird viele signifikante Neuerungen für Windows Phones bringen – für Anwender, Entwickler und Designer. Diese Session vermittelt Ihnen in komprimierter Form, wie Microsoft seine mobile Plattform auffrischt und Maßstäbe im Smartphone-Bereich setzen wird.

Oliver Scheer:  Silverlight 4 – Die Highlights

Rich Internet Applications mit Microsoft Silverlight: Einfach, Schnell und Beeindruckend. Silverlight 4 bringt eine Fülle von neuen Möglichkeiten mit und macht das Entwickeln und Designen von interaktiven Webanwendungen noch einfacher. Dieser Vortrag zeigt die Highlights der neuen Version von Silverlight.

Tom Wendel: „SharePoint 2010 spricht Silverlight“

Mit der Einführung von SharePoint 2010 wächst zusammen, was zusammen gehört. Mit Hilfe von Silverlight lassen sich Daten in SharePoint perfekt visualisieren.  Eine nahtlose Integration der beiden Technologien verschafft völlig neue Möglichkeiten – sei es direkt als Webpart oder als eigenständige Silverlight-Anwendung.

Clemens Lutsch: Metro UI // Silverlight & WPF in der Design-Praxis

Führende Design-Agenturen berichten von Erfahrungen mit WPF & Silverlight in aktuellen, innovativen Projekten. So erfahren Sie aus erster Hand, wie moderne UX mit modernen Tools entsteht.

Georg Christoph, Nero AG: Microsoft Expression im Einsatz bei Nero

Wie Expression dabei hilft, Brücken zwischen Usability, Design und Entwicklung zu bauen.

Kostenloses PowerCommands Add-in für Visual Studio 2010

04.05.2010 07:27:00 | Michael Schwarz

Gestern hat Microsoft die PowerCommands 10.0 veröffentlicht, eine Ansammlung von hilfreichen kleinen Tools, einfach mal anschauen und ausprobieren.

PowerCommands

  • Enable/Disable PowerCommands in Options dialog
  • Format document on save / Remove and Sort Usings on save
  • Clear All Panes
  • Copy Path
  • Email CodeSnippet
  • Insert Guid Attribute
  • Show All Files
  • Undo Close
  • Collapse Projects
  • Copy Class
  • Paste Class
  • Copy References
  • Paste References
  • Copy As Project Reference
  • Edit Project File
  • Open Containing Folder
  • Open Command Prompt
  • Unload Projects
  • Reload Projects
  • Remove and Sort Usings
  • Extract Constant
  • Clear Recent File List
  • Clear Recent Project List
  • Transform Templates
  • Close All

Mehr Infos bei Scott Guthrie zum Thema Visual Studio 2010 Extension Manager oder auf dem Visual Studio Team Blog.

Ist der Entwicklerspaß mit C# 2.0 vorbei?

03.05.2010 22:18:00 | Jan Christian Selke

C# 4.0 und dynamics sind cool.

C# 3.5 mit extension methods, lamda-Ausdrücken und LINQ war fast noch spannender… was aber ist mit 2.0?

Leider hat man nicht immer die Chance in Projekten mit der neuesten Technologie zu arbeiten. Es gibt schließlich auch noch Pflege-Projekte, die auf einer älteren Version aufsetzen, aber auch betreut sein wollen. Ist dann der Spaß vorbei?!

Nein. Die Syntax wirkt vielleicht nicht mehr ganz so elegant; lambda-Ausdrücke und extension methods gibt es schließlich noch nicht. Dafür gibt es aber noch immer die anonymen Methoden. Diese werden, völlig zu unrecht, zu wenig beachtet.

Sicherlich, Entwicklung darf nicht allein auf den Spaß reduziert werden - aber es macht doch auch einen großen Anteil aus. Wer keinen Spaß hat, ist nicht kreativ. Wer allgemein keinen Spaß daran hat, sollte sich lieber überlegen, ob er wirklich das Richtige tut…

Zurück zum Thema. Anonyme Methoden bieten beachtliche Möglichkeiten. Mit dem 3.5er Framework wurde das Rad der Sprache nicht neu erfunden. Deutlich wird dies bereits an einem einfachen Quelltextauszug.

var liste = new List<string>{"Test", "Test2"};
liste.Any(x => x.Contains("Test"));

Schaut man sich nun das Kompilat in einem Reflektor an, stellt man fest: Es gibt nichts bedeutend neues.


List<string> <>g__initLocal0 = new List<string>();
<>g__initLocal0.Add("Test");
<>g__initLocal0.Add("Test2");
<>g__initLocal0.Any<string>(delegate (string x) {
return x.Contains("Test");
});

Der Typ-Initialisierer wird in Einzelaufrufe ausgewertet und der lambda-Ausdruck in eine anonyme Methode übersetzt. Also sind lambdas im Endeffekt auch nichts anderes als hübsch verpackte anonyme Methoden und damit, mit Ausnahme der Anwendung in extension methods, auch in 2.0 umsetzbar.


Auf diesem Wissen aufbauend, habe ich vor kurzem eine FileService Klasse geschrieben. Dieser Service macht nichts anderes, als ein byte-Array in eine Datei zu schreiben. Der Kontrakt dieses Service ist relativ schmal gehalten. Auffällig sind nur die Methoden Write(…), die zum Einen einen Action delegate als Paramter erwarten, zum Anderen als Rückgabewert einen Typ von sich selbst übergeben. Alles bereits in Vorbereitung auf das method chaining im Stile einer fluent API.


public interface IFileService 
{
void Write(Action<FileExpression> expression);
IFileService Write(byte[] bytes);
void ToFile(string path);
}

Auch die Implementierung ist noch recht übersichtlich. Alles weder Hexenwerk noch Raketentechnik…


public class FileService : IFileService 
{
private byte[] fileBytes;

public FileService()
{
}

public void Write(Action<FileExpression> expression)
{
expression(new FileExpression(this));
}

public IFileService FileContent(byte[] bytes)
{
this.fileBytes = bytes;
return this;
}

public void ToFile(string path)
{
FileStream fs = new FileStream(path, FileMode.Create, FileAccess.ReadWrite);
using (BinaryWriter bw = new BinaryWriter(fs))
{
bw.Write(this.fileBytes);
}
}
}

Über den fertigen Service habe ich dann einen Expression Builder gebaut. Als Einstiegspunkt dient die Methode Write(Action<FileNameExpression> expression). Der Expression Builder sieht wie folgt aus:


public class FileExpression 
{
private readonly IFileService Service;

public FileExpression(IFileService service)
{
Service = service;
}

public FileExpression File(byte[] bytes)
{
this.Service.FileContent(bytes);
return this;
}

public FileSaveAction Named(string filename)
{
return new FileSaveAction(this.Service, filename);
}
}

Der Expression Builder nimmt die spätere Datei als byte[] in der Methode File(byte[]) und den Dateinamen in der Methode Named(string) entgegen. Die Expression wird schließlich mit einer entsprechenden FileSaveAction beendet. Diese nimmt den vorher festgelegten Namen sowie das byte[] entgegen und schreibt es via ToDisc() mittels unterlegtem Service auf die Festplatte.


public class FileSaveAction 
{
private readonly IFileService service;

private readonly string filename;

public FileSaveAction(IFileService service, string filename)
{
this.service = service;
this.filename = filename;
}

public void ToDisc()
{
this.service.ToFile(filename);
}
}

Der Aufruf zum Speichern der Datei wird dann im Code folgendermaßen zusammengesetzt.


IFileService fileService = new FileService();
fileService.Write(delegate(FileExpression x)
{
x.File(queryResult.Content).Named(queryResult.SuggestedFileName)).ToDisc();
});


An der einen oder anderen Stelle kann nochmal ein Refactoring angesetzt werden, aber hey! Jetzt soll noch einmal jemand sagen, dass C# unter .Net 2.0 nicht auch schon spannend wäre! :-)

.NET Usergroup Dresden: "Zurück in die Zukunft mit Silverlight 4" als Video

03.05.2010 20:34:00 | Gregor Biswanger

Wie bereits am 17.03.2010 auf MSDN-TV berichtet wurde, bin ich derzeit mit meiner Silverlight 4 Roadshow "Zurück in die Zukunft mit Silverlight 4" bei den User Groups Deutschlandweit unterwegs.

Nach der Veranstaltung in Ingolstadt, München und Karlsruhe war ich am 24.03.2010 auch bei der User Group Dresden gelandet. Die Veranstaltungen in Dresden finden jeweils bei T-Systems MMS statt, die auch meinen Auftritt gefilmt und ins Internet gestellt haben.

Die Folge kann sich hier jederzeit kostenfrei angesehen werden:

(http://vimeo.com/10821459)

Die nächste Veranstaltung findet Morgen (Dienstag den 04.05.2010) bei der User Group Frankfurt statt. Wer allerdings jetzt glaubt nach dem Video nicht mehr meine Veranstaltung besuchen zu müssen, hat sich leider getäuscht. Denn Silverlight 4 ist bereits auf dem Markt und hat noch viele weitere Überraschungen parat gehabt, die bei den bisherigen Veranstaltungen noch nicht bekannt waren. Zudem dürfen wir entdecken was Expression Blend 4 neues für Designer und Entwickler mit sich bringt.

Lust auf mehr? Kein Problem! Hier sind auch schon die nächsten User-Group-Termine "vielleicht" auch in deiner Nähe:

.NET User Group Frankfurt

04.05.2010

.NET User Group Ulm

25.05.2010

.NET User Group Saar

05.07.2010

.NET User Group Braunschweig

20.07.2010

.NET User Group Hamburg

18.08.2010

"Zurück in die Zukunft mit Silverlight 4" gibt es auch als Artikel beim dot.net-magazin.

Ich freue mich auf Euer kommen!

Howto: Show User Interface Errors

03.05.2010 09:34:33 | Jens Häupel

Beim Entwickeln von RibbonX Erweiterungen für Office kommt es zwangsläufig zu (Tipp-) Fehlern im XML Markup. Out of the box werden die Office Clients aber nichts Genaues dazu sagen, resp. anzeigen. Im (für den Entwickler) schlimmsten Fall erscheint einfach das erwartete UI nicht. Damit die Fehlermeldungen ausgegeben werden, muss die Option “Show add-in user interface errors” (“Fehler des Benutzoberflächen-Add-Ins anzeigen”) aktiviert sein. Diese ist aber nicht immer an der gleichen Stelle, wie die folgenden Bilder zeigen.

Outlook 2010 Outlook
Excel 2010 Excel
Word 2010 Word
Powerpoint 2010 PPT

Katastrophenfall ‘NULL’?

03.05.2010 06:29:00 | Jürgen Gutsch

Mit seinem Beitrag Kleiner Helper für Linq to Sql: ToListOrDefault() hat Thomas Bandt am Wochenende eine Diskussion zum Thema “Null als Rückgabewert” angestoßen (man beachte die Kommentare). Wie nicht anders zu erwarten (:-P), wurde die Diskussion natürlich auch von Ralf Westphal aufgenommen: Null oder nicht Null, das ist hier die Frage (auch hier die Kommentare beachten).

Weiter ging es wieder Bei Thomas Bandt mit dem Beitrag Null Verständnis der es tatsächlich auf 40 Kommentare gebracht hat. Auch Ilker Cetinkaya konnte es sich diesmal nicht verkneifen ebenfalls etwas zu dem Thema zu schreiben: Null Toleranz, vorauf hin Ralf schlagfertig reagierte: Es hilft nichts, dass es darauf ankommt – nicht nur beim Null-Problemo [OOP 2010] und Ilkers Haltung kritisierte. [Update] Ilkers Antwort folgte gestern relativ schnell: Kein Yin ohne Yang, kein Null ohne Pointer (Auch hier bitte unbedingt die Kommentare lesen)

Ein scheinbar vorläufiges Fazit zur Diskussion schreibt Thomas in seinem letzten Beitrag zum Thema Null: Null Erkenntnis? Ganz im Gegenteil. 

[UPDATE]
Eben hat sich auch der Karsten zum Thema geäußert: #Handwerk: Clean vs. pragmatisch?

Was hier fast wie ein Sportbericht aussieht, ist ein Diskussion über ‘Null’ als Rückgabewert und über eine fehlende Regel zu dem Thema ob und wann ‘Null’ als Rückgabe erlaubt ist, oder nicht.

Verschiedenste Lösungen kommen in allen Beiträgen und deren Kommentaren vor. So unter anderem:

  1. Exception statt ‘Null’
  2. Leere Objekte statt ‘Null’
  3. ‘Null’ nur passend zur Kategorie
  4. ‘Null’ nur mit Vorsicht
  5. it depends
  6. ‘Null’ im Katastrophenfall

Katastrophenfall ‘NULL’

Und dieser letzte Punkt ist eigentlich der einzige, an dem ich mich wirklich anstoße:

Ilker Cetinkaya [http://www.gmbsg.com/null-toleranz/]
Ich gebe in einigen Methoden NULL zurück. Meistens genau dann, wenn ich wirklich damit ausdrücken möchte, dass etwas katastrophales passiert ist.

Wenn etwas eine Katastrophe ist, sollte diese Katastrophe nur in wirklich unvermeidbaren Ausnahmen auftreten. In diesem Fall kann auch eine Ausnahme erzeugt werden. Ich bin in so einem Fall tatsächlich für eine Exception, statt einer ‘Null’ (Punkt 1).

Als Webentwickler dagegen bin ich der Ansicht das man die Erzeugung von Exceptions unbedingt mit Vorsicht genießen sollte und nur dann einsetzen sollte, wenn es wirklich unvermeidbar ist. Den Exception Handling kostet Performance. Exceptions sollten also auch Exceptions bleiben und “exceptionally used” werden. Im Web ist es IMHO wichtiger Fehler zu vermeiden, als für jeden möglichen Fall eine neue Exception zu erzeugen. Zum Thema “Fehler vermeiden” gehört IMHO auch, das Auslösen von Exceptions vermeiden, wenn es sich irgendwie vermeiden lässt. Aus diesem Grund sollte der erste Punkt “Exceptions statt ‘Null’” ebenfalls mit Vorsicht genossen werden.

Und was ‘Null’ als Rückgabewert angeht, enthalte ich mich fürs erste (was spezielle Regeln angeht) und bleibe Beobachter dieser Grundlagendiskussion. Ich bin mir einfach selber noch nicht schlüssig, was hier richtig und was falsch ist. Die Rückgabe von ’Null’ ist bequem, harmlos und tastbar, kann also nicht grundlegend falsch sein.

Im Moment tendiere ich noch zu dem Punkt “it depends” ;-)

DotNetKicks-DE Image

Download: Office 2010, SharePoint 2010, Visio 2010 und Project 2010 sind da!

02.05.2010 18:53:17 | Kay Giza

Am 23. April 2010 kündigten wir auf MSDN Online an, dass für Inhaber einer MSDN Subscription ab sofort zum Download bereit stehen, in den Stufen Ultimate oder Premium, die finalen Versionen von Office Professional Plus 2010, SharePoint Server 2010, Visio Premium 2010 und Project Professional 2010. Zunächst 14 Sprachversionen, darunter natürlich auch Deutsch und Englisch, stehen für 32 Bit- und 64 Bit-Plattformen zur Verfügung. Mit Ausnahme von SharePoint Server 2010 erstreckt sich die MSDN-Lizenz der neuen Office-Produkte, erstmalig auch für Microsoft Project, nicht nur auf den Entwicklungs-, sondern für einen Arbeitsplatz auch auf den Arbeitseinsatz. Zwischenzeitig erreichten mich einige Fragen, die ich hier gerne beantworten möchte: Wo finde ich allgemeine Produktinformationen über Microsoft Office 2010? Stimmt es, wenn ich Office 2007 jetzt kaufe, dass ich dann ein kostenloses Upgrade-Recht auf Office 2010 habe? Was ist in Office 2010 neu? Soll ich die 64-Bit-Editionen von Office 2010 installieren? Wo finde ich weiterführende technische Informationen?... [... lesen Sie den ausführlichen Artikel auf Giza-Blog.de]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  MSDN Online | Follow MSDN Online on Twitter | Follow Kay Giza on Twitter
Daily News on MSDN:  MSDN Aktuell
© Copyright 2006-2010 Kay Giza. All rights reserved. Legal
Subscribe

Geplante Neuerungen in StructureMap 3.0

02.05.2010 13:38:00 | Jan Christian Selke

Voraussichtlich noch diesen Monat wird es die Version 3.0 von StructureMap geben.

Jeremy D. Millers eigenem Bekunden zu folgen, sind die beiden Highlights der neuen Version

  • das Löschen aller obsoleten Methoden,
  • verbesserter Support für nested containers.

Dem möchte ich noch das verbesserte object tracking hinzufügen. Ebenfalls interessant klingen On StartUp Actions, auch wenn mir noch nicht ganz klar ist, was genau darunter zu verstehen ist…

Wer sich dafür interessiert, kann die vollständigen Release Plans bei github einsehen.

DotNet-Forum.de: 2. Artikel-Wettbewerb gestartet! Jetzt mitmachen und coole Gewinne abstauben!

02.05.2010 10:22:43 | Kay Giza

Die Community dotnet-forum.de hatte pünktlich zum Launch von Visual Studio 2010 und .NET 4.0 ihren 2. Artikel-Wettbewerb gestartet, bei dem Teilnehmer insgesamt zehn coole Preise ergattern können, darunter ein Windows 7 Ultimate und eine Eintrittskarte für die dotnet-powerdays im Juni in München. Wer gewinnen möchte, sollte bis zum 31. Mai 2010 mindestens einen Artikel zu den Themen .NET 4.0, Visual Studio 2010, Sharepoint 2010, F# oder PowerShell 2... [... lesen Sie den vollständigen Blogeintrag auf Giza-Blog.de]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  MSDN Online | Follow MSDN Online on Twitter | Follow Kay Giza on Twitter
Daily News on MSDN:  MSDN Aktuell
© Copyright 2006-2010 Kay Giza. All rights reserved. Legal
Subscribe

Urlrewriting.net auf dem IIS 7.5 installieren

01.05.2010 18:00:07 | Jan Welker

Thomas Bandt und Albert Weinert haben vor über 4 Jahren ein sehr populäres URL Rewriting Framework veröffentlicht welches das suchmaschinenfreundliche Umschreiben von URLs in ASP.NET ermöglicht. Dieses Framework wird zum Beispiel von dotnet-kicks.de verwendet.
Bis jetzt lief dotnet-kicks bei mir auf einem IIS 6 wo es bei der Installation von Urlrewriting.net eigentlich nichts zu beachten gab.

Heute hab ich dotnet-kicks.de auf einem IIS 7.5 aufgesetzt wo das Umschreiben der URLs nicht ohne weiteres funktionierte.

Hier eine kurze Anleitung wie es im IIS 7.5 zum laufen gebracht werden kann:

1. Application Pool

Der Application Pool der Webanwendung muss auf Classic und .NET Version 2.0 eingestellt werden:

ApplicationPool

Anschließend wird in den erweiterten Einstellungen des Application Pools der Schalter “Enable 32-Bit Applications” auf true gesetzt.

ApplicationPool_32bit

2. Wildcard script mapping

Auf learn.iis.net ist sehr schön beschrieben wie das Wildcard script mapping im IIS 7 classic pipeline mode eingerichtet wird. Bei mir sieht das Ergebnis in der Web.config dann folgendermaßen aus:

<handlers>

<remove name="StaticFile" />
<remove name="ASP.NET-ISAPI-2.0-Wildcard" />
<add name="ASP.NET-ISAPI-2.0-Wildcard" path="*" verb="*" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="None" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
<add name="StaticFile" path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" resourceType="Either" requireAccess="Read" preCondition="bitness32" />
</handlers>

Dabei ist die Reihenfolge der Einträge ‘ASP.NET-ISAPI-2.0-Wildcard’ und ‘StaticFile’ zu beachten. ‘StaticFile’ muss nach ‘ASP.NET-ISAPI-2.0-Wildcard’ kommen!

Temporary Post Used For Theme Detection (f1be597c-8977-4197-b482-2e8da871ff03 - 3bfe001a-32de-4114-a6b4-4005b770f6d7)

01.05.2010 15:17:52 | Thomas Freudenberg

This is a temporary post that was not deleted. Please delete this manually. (6bc7c795-e9a2-4ef5-aaa1-1954f27b1834 - 3bfe001a-32de-4114-a6b4-4005b770f6d7)

Infos zur Anmeldung für die Grillfete des dotnet-forums.de im Rahmen der dotnet Cologne 2010

01.05.2010 10:50:14 | Jan Welker

Im Rahmen der dotnet Cologne 2010 findet am 28.5.2010 auch die Grillfete des dotnet-forums.de statt.
Das Forum hatte diese Grillfete im Wert von 3000€ beim EYSA Wettbewerb gewonnen, bei dem Webslices und Schnellinfos für den Internet Explorer 8 gesucht wurden.

Ab sofort kann man sich unter http://event.dotnet-cologne.de/ für diese Grillfete registrieren.

Registrierte User des Forums finden unter dem folgenden Link Informationen wie sie sich einen Platz bei der Fete sichern können:

http://dotnet-forum.de/forums/t/2521.aspx

WPF Forum | ASP.NET Forum | ASP.NET MVC Forum | Silverlight Forum | Windows Phone 7 Forum | SharePoint Forum | Dotnet Jobs | Dotnet Termine | Developer Blogs | Dotnet News

Das Team | Regeln | Impressum